From 3d3368ed9988a2acb9d247eb120ae82c6c64f673 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Fri, 9 Dec 2022 12:02:09 -0500 Subject: [PATCH 01/47] Update Packages_details.rst --- doc/src/Packages_details.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index ecbc54233a..4d230af51a 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -2548,11 +2548,12 @@ Topology changes are defined in pre- and post-reaction molecule templates and can include creation and deletion of bonds, angles, dihedrals, impropers, atom types, bond types, angle types, dihedral types, improper types, and/or atomic charges. Other options currently -available include reaction constraints (e.g. angle and Arrhenius +available include reaction constraints (e.g., angle and Arrhenius constraints), deletion of reaction byproducts or other small -molecules, and chiral-sensitive reactions. +molecules, creation of new atoms or molecules bonded to existing +atoms, and using LAMMPS variables for input parameters. -**Author:** Jacob R. Gissinger (CU Boulder) while at NASA Langley Research Center. +**Author:** Jacob R. Gissinger (NASA Langley Research Center). **Supporting info:** @@ -2562,7 +2563,8 @@ molecules, and chiral-sensitive reactions. * examples/PACKAGES/reaction * `2017 LAMMPS Workshop `_ * `2019 LAMMPS Workshop `_ -* reacter.org +* `2021 LAMMPS Workshop `_ +* `reacter.org `_ ---------- From 72789904c399e55f632d7fe27cc1808ea921fc57 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Fri, 9 Dec 2022 15:35:14 -0500 Subject: [PATCH 02/47] Update packages_details.rst take 2 --- doc/src/Packages_details.rst | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index 4d230af51a..55eb918a49 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -2542,15 +2542,15 @@ REACTION package **Contents:** -This package allows for complex bond topology changes (reactions) -during a running MD simulation, when using classical force fields. -Topology changes are defined in pre- and post-reaction molecule -templates and can include creation and deletion of bonds, angles, -dihedrals, impropers, atom types, bond types, angle types, dihedral -types, improper types, and/or atomic charges. Other options currently -available include reaction constraints (e.g., angle and Arrhenius -constraints), deletion of reaction byproducts or other small -molecules, creation of new atoms or molecules bonded to existing +This package implements the REACTER protocol, which allows for complex +bond topology changes (reactions) during a running MD simulation when +using classical force fields. Topology changes are defined in pre- and +post-reaction molecule templates and can include creation and deletion +of bonds, angles, dihedrals, impropers, atom types, bond types, angle +types, dihedral types, improper types, and/or atomic charges. Other +options currently available include reaction constraints (e.g., angle +and Arrhenius constraints), deletion of reaction byproducts or other +small molecules, creation of new atoms or molecules bonded to existing atoms, and using LAMMPS variables for input parameters. **Author:** Jacob R. Gissinger (NASA Langley Research Center). @@ -2564,7 +2564,7 @@ atoms, and using LAMMPS variables for input parameters. * `2017 LAMMPS Workshop `_ * `2019 LAMMPS Workshop `_ * `2021 LAMMPS Workshop `_ -* `reacter.org `_ +* `REACTER website (reacter.org) `_ ---------- From db13738056299fca4da202ead726fe8b992b761b Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Fri, 9 Dec 2022 17:52:05 -0500 Subject: [PATCH 03/47] Update bond/react readme --- src/REACTION/README | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/REACTION/README b/src/REACTION/README index f5fc929c9d..99a5d604ec 100644 --- a/src/REACTION/README +++ b/src/REACTION/README @@ -13,12 +13,16 @@ crosslinked materials. Any number of competing or reversible reaction pathways can be specified, and reacting sites can be stabilized. Other advanced options currently available include reaction constraints (e.g. angle and Arrhenius constraints), deletion of reaction -byproducts or other small molecules, and chiral-sensitive reactions. +byproducts or other small molecules, creation of new atoms or +molecules bonded to existing atoms, and using LAMMPS variables for +input parameters. The REACTER methodology is detailed in: Gissinger et al., Polymer 128, 211-217 (2017) https://doi.org/10.1016/j.polymer.2017.09.038 + Gissinger et al., Macromolecules 53, 22, 9953-9961 (2020). + https://doi.org/10.1021/acs.macromol.0c02012 + This package was created by Jacob Gissinger -(jacob.r.gissinger@gmail.com), while at the NASA Langley Research -Center. +(jacob.r.gissinger@gmail.com) at the NASA Langley Research Center. From 0375a7569ecbf706f34400b34fd428a6ff933a52 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Mon, 12 Dec 2022 17:08:42 -0500 Subject: [PATCH 04/47] type labels for tiny_epoxy example --- .../tiny_epoxy/in.tiny_epoxy.stabilized | 16 +- .../log.20Nov19.tiny_epoxy.stabilized.g++.1 | 172 - .../log.20Nov19.tiny_epoxy.stabilized.g++.4 | 172 - .../log.4Nov2022.tiny_epoxy.stabilized.g++.1 | 189 + .../log.4Nov2022.tiny_epoxy.stabilized.g++.4 | 190 + .../tiny_epoxy/rxn1_stp1_post.data_template | 315 -- .../rxn1_stp1_post.molecule_template | 317 ++ .../tiny_epoxy/rxn1_stp1_pre.data_template | 301 -- .../rxn1_stp1_pre.molecule_template | 307 ++ .../tiny_epoxy/rxn1_stp2_post.data_template | 307 -- .../rxn1_stp2_post.molecule_template | 313 ++ .../tiny_epoxy/rxn2_stp1_post.data_template | 424 --- .../rxn2_stp1_post.molecule_template | 425 +++ .../tiny_epoxy/rxn2_stp1_pre.data_template | 407 -- .../rxn2_stp1_pre.molecule_template | 412 +++ .../tiny_epoxy/rxn2_stp2_post.data_template | 413 --- .../rxn2_stp2_post.molecule_template | 418 +++ .../reaction/tiny_epoxy/tiny_epoxy.data | 3261 +++++++++-------- 18 files changed, 4301 insertions(+), 4058 deletions(-) delete mode 100644 examples/PACKAGES/reaction/tiny_epoxy/log.20Nov19.tiny_epoxy.stabilized.g++.1 delete mode 100644 examples/PACKAGES/reaction/tiny_epoxy/log.20Nov19.tiny_epoxy.stabilized.g++.4 create mode 100644 examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.1 create mode 100644 examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.4 delete mode 100644 examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_post.data_template create mode 100644 examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_post.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_pre.data_template create mode 100644 examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_pre.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp2_post.data_template create mode 100644 examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp2_post.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_post.data_template create mode 100644 examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_post.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_pre.data_template create mode 100644 examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_pre.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp2_post.data_template create mode 100644 examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp2_post.molecule_template diff --git a/examples/PACKAGES/reaction/tiny_epoxy/in.tiny_epoxy.stabilized b/examples/PACKAGES/reaction/tiny_epoxy/in.tiny_epoxy.stabilized index 0e6e97cd46..1309eff3a3 100644 --- a/examples/PACKAGES/reaction/tiny_epoxy/in.tiny_epoxy.stabilized +++ b/examples/PACKAGES/reaction/tiny_epoxy/in.tiny_epoxy.stabilized @@ -9,9 +9,9 @@ atom_style full pair_style lj/class2 8 -angle_style class2 +angle_style class2 -bond_style class2 +bond_style class2 dihedral_style class2 @@ -21,12 +21,12 @@ read_data tiny_epoxy.data velocity all create 300.0 4928459 dist gaussian -molecule mol1 rxn1_stp1_pre.data_template -molecule mol2 rxn1_stp1_post.data_template -molecule mol3 rxn1_stp2_post.data_template -molecule mol4 rxn2_stp1_pre.data_template -molecule mol5 rxn2_stp1_post.data_template -molecule mol6 rxn2_stp2_post.data_template +molecule mol1 rxn1_stp1_pre.molecule_template +molecule mol2 rxn1_stp1_post.molecule_template +molecule mol3 rxn1_stp2_post.molecule_template +molecule mol4 rxn2_stp1_pre.molecule_template +molecule mol5 rxn2_stp1_post.molecule_template +molecule mol6 rxn2_stp2_post.molecule_template thermo 50 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/log.20Nov19.tiny_epoxy.stabilized.g++.1 b/examples/PACKAGES/reaction/tiny_epoxy/log.20Nov19.tiny_epoxy.stabilized.g++.1 deleted file mode 100644 index 6ca0361513..0000000000 --- a/examples/PACKAGES/reaction/tiny_epoxy/log.20Nov19.tiny_epoxy.stabilized.g++.1 +++ /dev/null @@ -1,172 +0,0 @@ -LAMMPS (20 Nov 2019) - -WARNING-WARNING-WARNING-WARNING-WARNING -This LAMMPS executable was compiled using C++98 compatibility. -Please report the compiler info below at https://github.com/lammps/lammps/issues/1659 -GNU C++ 4.8.5 -WARNING-WARNING-WARNING-WARNING-WARNING - -Reading data file ... - orthogonal box = (10 -10 -15) to (30 20 10) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 118 atoms - scanning bonds ... - 4 = max bonds/atom - scanning angles ... - 6 = max angles/atom - scanning dihedrals ... - 18 = max dihedrals/atom - scanning impropers ... - 4 = max impropers/atom - reading bonds ... - 123 bonds - reading angles ... - 221 angles - reading dihedrals ... - 302 dihedrals - reading impropers ... - 115 impropers -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 4 = max # of 1-2 neighbors - 10 = max # of 1-3 neighbors - 19 = max # of 1-4 neighbors - 22 = max # of special neighbors - special bonds CPU = 0.000286808 secs - read_data CPU = 0.00724107 secs -Read molecule mol1: - 31 atoms with max type 10 - 30 bonds with max type 15 - 53 angles with max type 29 - 66 dihedrals with max type 39 - 31 impropers with max type 5 -Read molecule mol2: - 31 atoms with max type 10 - 30 bonds with max type 17 - 55 angles with max type 36 - 75 dihedrals with max type 51 - 34 impropers with max type 5 -Read molecule mol3: - 31 atoms with max type 11 - 30 bonds with max type 18 - 53 angles with max type 37 - 72 dihedrals with max type 53 - 31 impropers with max type 5 -Read molecule mol4: - 42 atoms with max type 11 - 41 bonds with max type 18 - 73 angles with max type 41 - 96 dihedrals with max type 54 - 43 impropers with max type 5 -Read molecule mol5: - 42 atoms with max type 11 - 41 bonds with max type 18 - 75 angles with max type 37 - 108 dihedrals with max type 53 - 46 impropers with max type 5 -Read molecule mol6: - 42 atoms with max type 11 - 41 bonds with max type 19 - 73 angles with max type 50 - 102 dihedrals with max type 66 - 43 impropers with max type 22 -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp_REACT defined -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10 - ghost atom cutoff = 10 - binsize = 5, bins = 4 6 5 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 -Per MPI rank memory allocation (min/avg/max) = 17.28 | 17.28 | 17.28 Mbytes -Step Temp f_rxns[1] f_rxns[2] f_rxns[3] f_rxns[4] - 0 300 0 0 0 0 - 50 391.52956 1 0 0 0 - 100 475.26826 1 1 0 0 - 150 605.26215 1 1 1 0 - 200 545.7485 1 1 1 0 - 250 461.64929 1 1 1 1 - 300 452.10611 1 1 1 1 - 350 379.61671 1 1 1 1 - 400 331.22444 1 1 1 1 - 450 275.63969 1 1 1 1 - 500 316.63407 1 1 1 1 - 550 261.39841 1 1 1 1 - 600 313.70928 1 1 1 1 - 650 294.24011 1 1 1 1 - 700 285.81736 1 1 1 1 - 750 340.37496 1 1 1 1 - 800 333.2496 1 1 1 1 - 850 307.40826 1 1 1 1 - 900 304.68718 1 1 1 1 - 950 328.0289 1 1 1 1 - 1000 290.22808 1 1 1 1 - 1050 272.78518 1 1 1 1 - 1100 291.30546 1 1 1 1 - 1150 320.33992 1 1 1 1 - 1200 330.57057 1 1 1 1 - 1250 300.51008 1 1 1 1 - 1300 293.6209 1 1 1 1 - 1350 324.36604 1 1 1 1 - 1400 331.15408 1 1 1 1 - 1450 302.23396 1 1 1 1 - 1500 297.55562 1 1 1 1 - 1550 277.3187 1 1 1 1 - 1600 289.66052 1 1 1 1 - 1650 281.85404 1 1 1 1 - 1700 293.4999 1 1 1 1 - 1750 306.21866 1 1 1 1 - 1800 283.22696 1 1 1 1 - 1850 295.10473 1 1 1 1 - 1900 317.3843 1 1 1 1 - 1950 305.14825 1 1 1 1 - 2000 289.00911 1 1 1 1 -Loop time of 1.87066 on 1 procs for 2000 steps with 118 atoms - -Performance: 92.374 ns/day, 0.260 hours/ns, 1069.141 timesteps/s -98.4% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.12832 | 0.12832 | 0.12832 | 0.0 | 6.86 -Bond | 0.77458 | 0.77458 | 0.77458 | 0.0 | 41.41 -Neigh | 0.45068 | 0.45068 | 0.45068 | 0.0 | 24.09 -Comm | 0.029785 | 0.029785 | 0.029785 | 0.0 | 1.59 -Output | 0.31635 | 0.31635 | 0.31635 | 0.0 | 16.91 -Modify | 0.16657 | 0.16657 | 0.16657 | 0.0 | 8.90 -Other | | 0.004368 | | | 0.23 - -Nlocal: 118 ave 118 max 118 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 332 ave 332 max 332 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 4338 ave 4338 max 4338 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 4338 -Ave neighs/atom = 36.7627 -Ave special neighs/atom = 10.5763 -Neighbor list builds = 2000 -Dangerous builds = 0 - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:02 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/log.20Nov19.tiny_epoxy.stabilized.g++.4 b/examples/PACKAGES/reaction/tiny_epoxy/log.20Nov19.tiny_epoxy.stabilized.g++.4 deleted file mode 100644 index 4673ba3980..0000000000 --- a/examples/PACKAGES/reaction/tiny_epoxy/log.20Nov19.tiny_epoxy.stabilized.g++.4 +++ /dev/null @@ -1,172 +0,0 @@ -LAMMPS (20 Nov 2019) - -WARNING-WARNING-WARNING-WARNING-WARNING -This LAMMPS executable was compiled using C++98 compatibility. -Please report the compiler info below at https://github.com/lammps/lammps/issues/1659 -GNU C++ 4.8.5 -WARNING-WARNING-WARNING-WARNING-WARNING - -Reading data file ... - orthogonal box = (10 -10 -15) to (30 20 10) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 118 atoms - scanning bonds ... - 4 = max bonds/atom - scanning angles ... - 6 = max angles/atom - scanning dihedrals ... - 18 = max dihedrals/atom - scanning impropers ... - 4 = max impropers/atom - reading bonds ... - 123 bonds - reading angles ... - 221 angles - reading dihedrals ... - 302 dihedrals - reading impropers ... - 115 impropers -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 4 = max # of 1-2 neighbors - 10 = max # of 1-3 neighbors - 19 = max # of 1-4 neighbors - 22 = max # of special neighbors - special bonds CPU = 0.000239905 secs - read_data CPU = 0.0080783 secs -Read molecule mol1: - 31 atoms with max type 10 - 30 bonds with max type 15 - 53 angles with max type 29 - 66 dihedrals with max type 39 - 31 impropers with max type 5 -Read molecule mol2: - 31 atoms with max type 10 - 30 bonds with max type 17 - 55 angles with max type 36 - 75 dihedrals with max type 51 - 34 impropers with max type 5 -Read molecule mol3: - 31 atoms with max type 11 - 30 bonds with max type 18 - 53 angles with max type 37 - 72 dihedrals with max type 53 - 31 impropers with max type 5 -Read molecule mol4: - 42 atoms with max type 11 - 41 bonds with max type 18 - 73 angles with max type 41 - 96 dihedrals with max type 54 - 43 impropers with max type 5 -Read molecule mol5: - 42 atoms with max type 11 - 41 bonds with max type 18 - 75 angles with max type 37 - 108 dihedrals with max type 53 - 46 impropers with max type 5 -Read molecule mol6: - 42 atoms with max type 11 - 41 bonds with max type 19 - 73 angles with max type 50 - 102 dihedrals with max type 66 - 43 impropers with max type 22 -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp_REACT defined -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10 - ghost atom cutoff = 10 - binsize = 5, bins = 4 6 5 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 -Per MPI rank memory allocation (min/avg/max) = 16.26 | 16.45 | 16.63 Mbytes -Step Temp f_rxns[1] f_rxns[2] f_rxns[3] f_rxns[4] - 0 300 0 0 0 0 - 50 391.52956 1 0 0 0 - 100 475.26826 1 1 0 0 - 150 605.26215 1 1 1 0 - 200 545.7485 1 1 1 0 - 250 461.64929 1 1 1 1 - 300 452.10611 1 1 1 1 - 350 379.61671 1 1 1 1 - 400 331.22444 1 1 1 1 - 450 275.63969 1 1 1 1 - 500 316.63407 1 1 1 1 - 550 261.39841 1 1 1 1 - 600 313.70928 1 1 1 1 - 650 294.24011 1 1 1 1 - 700 285.81736 1 1 1 1 - 750 340.37496 1 1 1 1 - 800 333.2496 1 1 1 1 - 850 307.40826 1 1 1 1 - 900 304.68718 1 1 1 1 - 950 328.0289 1 1 1 1 - 1000 290.22808 1 1 1 1 - 1050 272.78518 1 1 1 1 - 1100 291.30546 1 1 1 1 - 1150 320.33992 1 1 1 1 - 1200 330.57057 1 1 1 1 - 1250 300.51008 1 1 1 1 - 1300 293.6209 1 1 1 1 - 1350 324.36604 1 1 1 1 - 1400 331.15408 1 1 1 1 - 1450 302.23396 1 1 1 1 - 1500 297.55562 1 1 1 1 - 1550 277.3187 1 1 1 1 - 1600 289.66052 1 1 1 1 - 1650 281.85404 1 1 1 1 - 1700 293.4999 1 1 1 1 - 1750 306.21866 1 1 1 1 - 1800 283.22695 1 1 1 1 - 1850 295.10472 1 1 1 1 - 1900 317.38431 1 1 1 1 - 1950 305.14824 1 1 1 1 - 2000 289.00909 1 1 1 1 -Loop time of 0.689125 on 4 procs for 2000 steps with 118 atoms - -Performance: 250.753 ns/day, 0.096 hours/ns, 2902.231 timesteps/s -100.0% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.02002 | 0.030617 | 0.053133 | 7.7 | 4.44 -Bond | 0.10356 | 0.18908 | 0.22691 | 11.6 | 27.44 -Neigh | 0.16721 | 0.17002 | 0.17247 | 0.5 | 24.67 -Comm | 0.057286 | 0.12002 | 0.21612 | 17.0 | 17.42 -Output | 0.00028991 | 0.00034121 | 0.00049323 | 0.0 | 0.05 -Modify | 0.17626 | 0.17675 | 0.17721 | 0.1 | 25.65 -Other | | 0.002287 | | | 0.33 - -Nlocal: 29.5 ave 41 max 18 min -Histogram: 1 0 0 1 0 0 1 0 0 1 -Nghost: 306 ave 349 max 269 min -Histogram: 1 1 0 0 0 0 1 0 0 1 -Neighs: 1084.5 ave 2154 max 397 min -Histogram: 1 0 1 1 0 0 0 0 0 1 - -Total # of neighbors = 4338 -Ave neighs/atom = 36.7627 -Ave special neighs/atom = 10.5763 -Neighbor list builds = 2000 -Dangerous builds = 0 - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:01 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.1 b/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.1 new file mode 100644 index 0000000000..b5eb8c4157 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.1 @@ -0,0 +1,189 @@ +LAMMPS (4 Nov 2022) +Reading data file ... + orthogonal box = (10 -10 -15) to (30 20 10) + 1 by 1 by 1 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 118 atoms + scanning bonds ... + 4 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 18 = max dihedrals/atom + scanning impropers ... + 4 = max impropers/atom + reading bonds ... + 123 bonds + reading angles ... + 221 angles + reading dihedrals ... + 302 dihedrals + reading impropers ... + 115 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 10 = max # of 1-3 neighbors + 19 = max # of 1-4 neighbors + 22 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.022 seconds +Read molecule template mol1: + 1 molecules + 0 fragments + 31 atoms with max type 10 + 30 bonds with max type 15 + 53 angles with max type 29 + 66 dihedrals with max type 39 + 3 impropers with max type 5 +Read molecule template mol2: + 1 molecules + 0 fragments + 31 atoms with max type 10 + 30 bonds with max type 17 + 55 angles with max type 36 + 75 dihedrals with max type 51 + 2 impropers with max type 5 +Read molecule template mol3: + 1 molecules + 0 fragments + 31 atoms with max type 11 + 30 bonds with max type 18 + 53 angles with max type 37 + 72 dihedrals with max type 53 + 3 impropers with max type 5 +Read molecule template mol4: + 1 molecules + 0 fragments + 42 atoms with max type 11 + 41 bonds with max type 18 + 73 angles with max type 41 + 96 dihedrals with max type 54 + 3 impropers with max type 5 +Read molecule template mol5: + 1 molecules + 0 fragments + 42 atoms with max type 11 + 41 bonds with max type 18 + 75 angles with max type 37 + 108 dihedrals with max type 53 + 2 impropers with max type 5 +Read molecule template mol6: + 1 molecules + 0 fragments + 42 atoms with max type 11 + 41 bonds with max type 19 + 73 angles with max type 50 + 102 dihedrals with max type 66 + 3 impropers with max type 22 +dynamic group bond_react_MASTER_group defined +dynamic group statted_grp_REACT defined + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 +The log file lists these citations in BibTeX format. + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 55 of 55 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10 + ghost atom cutoff = 10 + binsize = 5, bins = 4 6 5 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Setting up Verlet run ... + Unit style : real + Current step : 0 + Time step : 1 +Per MPI rank memory allocation (min/avg/max) = 16.64 | 16.64 | 16.64 Mbytes + Step Temp f_rxns[1] f_rxns[2] f_rxns[3] f_rxns[4] + 0 300 0 0 0 0 + 50 378.29345 1 0 0 0 + 100 471.04152 1 1 0 0 + 150 583.79755 1 1 1 0 + 200 526.00812 1 1 1 1 + 250 429.56812 1 1 1 1 + 300 512.54655 1 1 1 1 + 350 461.18357 1 1 1 1 + 400 379.38965 1 1 1 1 + 450 424.89528 1 1 1 1 + 500 324.72257 1 1 1 1 + 550 302.91042 1 1 1 1 + 600 253.80911 1 1 1 1 + 650 252.90262 1 1 1 1 + 700 270.62628 1 1 1 1 + 750 311.64391 1 1 1 1 + 800 318.9413 1 1 1 1 + 850 354.20196 1 1 1 1 + 900 302.19641 1 1 1 1 + 950 316.97905 1 1 1 1 + 1000 303.08194 1 1 1 1 + 1050 317.51619 1 1 1 1 + 1100 287.57204 1 1 1 1 + 1150 226.72101 1 1 1 1 + 1200 283.97519 1 1 1 1 + 1250 287.0607 1 1 1 1 + 1300 327.65278 1 1 1 1 + 1350 316.06809 1 1 1 1 + 1400 337.69947 1 1 1 1 + 1450 326.12278 1 1 1 1 + 1500 300.89265 1 1 1 1 + 1550 325.2415 1 1 1 1 + 1600 294.1844 1 1 1 1 + 1650 293.98596 1 1 1 1 + 1700 317.35477 1 1 1 1 + 1750 296.97768 1 1 1 1 + 1800 274.97297 1 1 1 1 + 1850 335.36697 1 1 1 1 + 1900 315.3756 1 1 1 1 + 1950 260.65335 1 1 1 1 + 2000 354.03612 1 1 1 1 +Loop time of 0.909774 on 1 procs for 2000 steps with 118 atoms + +Performance: 189.937 ns/day, 0.126 hours/ns, 2198.347 timesteps/s, 259.405 katom-step/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.10261 | 0.10261 | 0.10261 | 0.0 | 11.28 +Bond | 0.63695 | 0.63695 | 0.63695 | 0.0 | 70.01 +Neigh | 0.013916 | 0.013916 | 0.013916 | 0.0 | 1.53 +Comm | 0.0057214 | 0.0057214 | 0.0057214 | 0.0 | 0.63 +Output | 0.0005856 | 0.0005856 | 0.0005856 | 0.0 | 0.06 +Modify | 0.14641 | 0.14641 | 0.14641 | 0.0 | 16.09 +Other | | 0.003576 | | | 0.39 + +Nlocal: 118 ave 118 max 118 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 372 ave 372 max 372 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 3487 ave 3487 max 3487 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 3487 +Ave neighs/atom = 29.550847 +Ave special neighs/atom = 10.576271 +Neighbor list builds = 68 +Dangerous builds = 0 +Total wall time: 0:00:01 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.4 b/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.4 new file mode 100644 index 0000000000..5d6ac8ab21 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.4 @@ -0,0 +1,190 @@ +LAMMPS (4 Nov 2022) +WARNING: Using I/O redirection is unreliable with parallel runs. Better use -in switch to read input file. (../lammps.cpp:529) +Reading data file ... + orthogonal box = (10 -10 -15) to (30 20 10) + 1 by 2 by 2 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 118 atoms + scanning bonds ... + 4 = max bonds/atom + scanning angles ... + 6 = max angles/atom + scanning dihedrals ... + 18 = max dihedrals/atom + scanning impropers ... + 4 = max impropers/atom + reading bonds ... + 123 bonds + reading angles ... + 221 angles + reading dihedrals ... + 302 dihedrals + reading impropers ... + 115 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 10 = max # of 1-3 neighbors + 19 = max # of 1-4 neighbors + 22 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.009 seconds +Read molecule template mol1: + 1 molecules + 0 fragments + 31 atoms with max type 10 + 30 bonds with max type 15 + 53 angles with max type 29 + 66 dihedrals with max type 39 + 3 impropers with max type 5 +Read molecule template mol2: + 1 molecules + 0 fragments + 31 atoms with max type 10 + 30 bonds with max type 17 + 55 angles with max type 36 + 75 dihedrals with max type 51 + 2 impropers with max type 5 +Read molecule template mol3: + 1 molecules + 0 fragments + 31 atoms with max type 11 + 30 bonds with max type 18 + 53 angles with max type 37 + 72 dihedrals with max type 53 + 3 impropers with max type 5 +Read molecule template mol4: + 1 molecules + 0 fragments + 42 atoms with max type 11 + 41 bonds with max type 18 + 73 angles with max type 41 + 96 dihedrals with max type 54 + 3 impropers with max type 5 +Read molecule template mol5: + 1 molecules + 0 fragments + 42 atoms with max type 11 + 41 bonds with max type 18 + 75 angles with max type 37 + 108 dihedrals with max type 53 + 2 impropers with max type 5 +Read molecule template mol6: + 1 molecules + 0 fragments + 42 atoms with max type 11 + 41 bonds with max type 19 + 73 angles with max type 50 + 102 dihedrals with max type 66 + 3 impropers with max type 22 +dynamic group bond_react_MASTER_group defined +dynamic group statted_grp_REACT defined + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 +The log file lists these citations in BibTeX format. + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 55 of 55 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10 + ghost atom cutoff = 10 + binsize = 5, bins = 4 6 5 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Setting up Verlet run ... + Unit style : real + Current step : 0 + Time step : 1 +Per MPI rank memory allocation (min/avg/max) = 16.63 | 16.63 | 16.64 Mbytes + Step Temp f_rxns[1] f_rxns[2] f_rxns[3] f_rxns[4] + 0 300 0 0 0 0 + 50 378.29345 1 0 0 0 + 100 471.04152 1 1 0 0 + 150 583.79755 1 1 1 0 + 200 526.00812 1 1 1 1 + 250 429.56812 1 1 1 1 + 300 512.54655 1 1 1 1 + 350 461.18357 1 1 1 1 + 400 379.38965 1 1 1 1 + 450 424.89528 1 1 1 1 + 500 324.72257 1 1 1 1 + 550 302.91042 1 1 1 1 + 600 253.80911 1 1 1 1 + 650 252.90262 1 1 1 1 + 700 270.62628 1 1 1 1 + 750 311.64391 1 1 1 1 + 800 318.9413 1 1 1 1 + 850 354.20196 1 1 1 1 + 900 302.19641 1 1 1 1 + 950 316.97905 1 1 1 1 + 1000 303.08194 1 1 1 1 + 1050 317.51619 1 1 1 1 + 1100 287.57204 1 1 1 1 + 1150 226.72101 1 1 1 1 + 1200 283.97519 1 1 1 1 + 1250 287.0607 1 1 1 1 + 1300 327.65278 1 1 1 1 + 1350 316.06809 1 1 1 1 + 1400 337.69947 1 1 1 1 + 1450 326.12278 1 1 1 1 + 1500 300.89265 1 1 1 1 + 1550 325.2415 1 1 1 1 + 1600 294.1844 1 1 1 1 + 1650 293.98596 1 1 1 1 + 1700 317.35477 1 1 1 1 + 1750 296.97768 1 1 1 1 + 1800 274.97297 1 1 1 1 + 1850 335.36698 1 1 1 1 + 1900 315.3756 1 1 1 1 + 1950 260.65334 1 1 1 1 + 2000 354.03612 1 1 1 1 +Loop time of 0.473184 on 4 procs for 2000 steps with 118 atoms + +Performance: 365.186 ns/day, 0.066 hours/ns, 4226.686 timesteps/s, 498.749 katom-step/s +100.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.01651 | 0.024868 | 0.039209 | 5.4 | 5.26 +Bond | 0.072805 | 0.16458 | 0.21783 | 13.9 | 34.78 +Neigh | 0.0056701 | 0.0057265 | 0.0057792 | 0.1 | 1.21 +Comm | 0.028105 | 0.095922 | 0.19546 | 20.3 | 20.27 +Output | 0.00034311 | 0.00041507 | 0.0006278 | 0.0 | 0.09 +Modify | 0.17725 | 0.17761 | 0.17826 | 0.1 | 37.54 +Other | | 0.004064 | | | 0.86 + +Nlocal: 29.5 ave 45 max 7 min +Histogram: 1 0 0 0 0 0 1 1 0 1 +Nghost: 315 ave 343 max 287 min +Histogram: 1 1 0 0 0 0 0 0 1 1 +Neighs: 871.75 ave 1772 max 236 min +Histogram: 1 0 1 1 0 0 0 0 0 1 + +Total # of neighbors = 3487 +Ave neighs/atom = 29.550847 +Ave special neighs/atom = 10.576271 +Neighbor list builds = 68 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_post.data_template b/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_post.data_template deleted file mode 100644 index e510883432..0000000000 --- a/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_post.data_template +++ /dev/null @@ -1,315 +0,0 @@ -rxn1_stp1_post - -31 atoms -30 bonds -55 angles -75 dihedrals -34 impropers - -Types - -1 1 -2 6 -3 1 -4 7 -5 4 -6 7 -7 8 -8 8 -9 8 -10 8 -11 8 -12 9 -13 1 -14 1 -15 9 -16 9 -17 1 -18 1 -19 10 -20 8 -21 8 -22 8 -23 8 -24 10 -25 10 -26 10 -27 10 -28 8 -29 8 -30 8 -31 8 - -Charges - -1 0.000000 -2 0.000000 -3 0.000000 -4 0.100000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.000000 -11 0.000000 -12 0.000000 -13 0.000000 -14 0.000000 -15 -0.025000 -16 -0.025000 -17 0.000000 -18 0.000000 -19 0.000000 -20 0.000000 -21 0.000000 -22 0.000000 -23 0.000000 -24 0.000000 -25 0.000000 -26 0.000000 -27 0.000000 -28 0.000000 -29 0.000000 -30 0.000000 -31 0.000000 - -Coords - -1 22.582573 10.988183 -5.014054 -2 23.904713 10.750493 -4.202215 -3 23.989172 9.487042 -3.323374 -4 24.067001 11.723383 -4.037435 -5 24.627851 7.325302 -3.319944 -6 24.554632 8.418972 -4.080365 -7 22.667763 11.445703 -5.999605 -8 21.787441 10.247643 -4.916974 -9 24.964962 10.712683 -4.449374 -10 24.616703 9.689913 -2.456034 -11 22.989313 9.208153 -2.991455 -12 18.808882 13.758042 -3.958724 -13 19.293213 12.549683 -3.196594 -14 20.810543 12.417832 -3.417504 -15 21.090193 12.251203 -4.891234 -16 17.657042 16.437199 -3.985224 -17 19.126713 16.210239 -4.245154 -18 19.589151 14.957593 -3.479565 -19 19.000433 13.609432 -5.041715 -20 18.761223 11.614392 -3.573184 -21 19.082903 12.688992 -2.085145 -22 21.202852 11.511562 -2.848624 -23 21.328482 13.360252 -3.038924 -24 19.949852 12.199403 -5.680355 -25 21.477343 13.247442 -5.445915 -26 17.080341 15.555528 -4.334374 -27 17.319832 17.341927 -4.532204 -28 19.720472 17.115158 -3.887564 -29 19.298622 16.058659 -5.361685 -30 19.410772 15.105113 -2.363724 -31 20.700163 14.782252 -3.666344 - -Bonds - -1 1 1 8 -2 16 1 2 -3 1 1 7 -4 13 1 15 -5 16 3 2 -6 12 2 9 -7 17 2 4 -8 3 3 6 -9 1 3 10 -10 1 3 11 -11 8 6 5 -12 13 13 12 -13 13 18 12 -14 14 12 19 -15 15 13 14 -16 1 13 20 -17 1 13 21 -18 13 14 15 -19 1 14 22 -20 1 14 23 -21 14 15 24 -22 14 15 25 -23 13 17 16 -24 14 16 26 -25 14 16 27 -26 15 17 18 -27 1 17 28 -28 1 17 29 -29 1 18 30 -30 1 18 31 - -Angles - -1 30 2 1 8 -2 2 8 1 7 -3 26 8 1 15 -4 30 2 1 7 -5 31 2 1 15 -6 26 7 1 15 -7 32 1 2 3 -8 33 1 2 9 -9 34 1 2 4 -10 33 3 2 9 -11 34 3 2 4 -12 35 4 2 9 -13 36 2 3 6 -14 30 2 3 10 -15 30 2 3 11 -16 3 6 3 10 -17 3 6 3 11 -18 2 10 3 11 -19 22 3 6 5 -20 23 13 12 18 -21 24 13 12 19 -22 24 18 12 19 -23 25 14 13 12 -24 26 20 13 12 -25 26 21 13 12 -26 27 14 13 20 -27 27 14 13 21 -28 2 20 13 21 -29 25 13 14 15 -30 27 13 14 22 -31 27 13 14 23 -32 26 22 14 15 -33 26 23 14 15 -34 2 22 14 23 -35 23 1 15 14 -36 24 1 15 24 -37 24 1 15 25 -38 24 14 15 24 -39 24 14 15 25 -40 28 24 15 25 -41 24 17 16 26 -42 24 17 16 27 -43 28 26 16 27 -44 25 18 17 16 -45 26 28 17 16 -46 26 29 17 16 -47 27 18 17 28 -48 27 18 17 29 -49 2 28 17 29 -50 25 17 18 12 -51 26 30 18 12 -52 26 31 18 12 -53 27 17 18 30 -54 27 17 18 31 -55 2 30 18 31 - -Dihedrals - -1 40 8 1 2 3 -2 41 8 1 2 9 -3 42 8 1 2 4 -4 40 7 1 2 3 -5 41 7 1 2 9 -6 42 7 1 2 4 -7 43 15 1 2 3 -8 44 15 1 2 9 -9 45 15 1 2 4 -10 28 8 1 15 14 -11 30 8 1 15 24 -12 30 8 1 15 25 -13 46 2 1 15 14 -14 47 2 1 15 24 -15 47 2 1 15 25 -16 28 7 1 15 14 -17 30 7 1 15 24 -18 30 7 1 15 25 -19 48 6 3 2 1 -20 40 10 3 2 1 -21 40 11 3 2 1 -22 49 6 3 2 9 -23 41 10 3 2 9 -24 41 11 3 2 9 -25 50 6 3 2 4 -26 42 10 3 2 4 -27 42 11 3 2 4 -28 51 2 3 6 5 -29 7 10 3 6 5 -30 7 11 3 6 5 -31 27 14 13 12 18 -32 28 20 13 12 18 -33 28 21 13 12 18 -34 29 14 13 12 19 -35 30 20 13 12 19 -36 30 21 13 12 19 -37 27 17 18 12 13 -38 28 30 18 12 13 -39 28 31 18 12 13 -40 29 17 18 12 19 -41 30 30 18 12 19 -42 30 31 18 12 19 -43 31 12 13 14 15 -44 32 22 14 13 12 -45 32 23 14 13 12 -46 32 20 13 14 15 -47 33 20 13 14 22 -48 33 20 13 14 23 -49 32 21 13 14 15 -50 33 21 13 14 22 -51 33 21 13 14 23 -52 27 13 14 15 1 -53 29 13 14 15 24 -54 29 13 14 15 25 -55 28 22 14 15 1 -56 30 22 14 15 24 -57 30 22 14 15 25 -58 28 23 14 15 1 -59 30 23 14 15 24 -60 30 23 14 15 25 -61 29 18 17 16 26 -62 30 28 17 16 26 -63 30 29 17 16 26 -64 29 18 17 16 27 -65 30 28 17 16 27 -66 30 29 17 16 27 -67 31 16 17 18 12 -68 32 30 18 17 16 -69 32 31 18 17 16 -70 32 28 17 18 12 -71 33 28 17 18 30 -72 33 28 17 18 31 -73 32 29 17 18 12 -74 33 29 17 18 30 -75 33 29 17 18 31 - -Impropers - -1 4 13 12 18 19 -2 5 17 16 26 27 -3 1 2 1 8 7 -4 1 2 1 8 15 -5 1 8 1 7 15 -6 1 2 1 7 15 -7 1 1 2 3 9 -8 1 1 2 3 4 -9 1 1 2 4 9 -10 1 3 2 4 9 -11 1 2 3 6 10 -12 1 2 3 6 11 -13 1 2 3 10 11 -14 1 6 3 10 11 -15 1 14 13 20 12 -16 1 14 13 21 12 -17 1 20 13 21 12 -18 1 14 13 20 21 -19 1 13 14 22 15 -20 1 13 14 23 15 -21 1 13 14 22 23 -22 1 22 14 23 15 -23 1 1 15 14 24 -24 1 1 15 14 25 -25 1 1 15 24 25 -26 1 14 15 24 25 -27 1 18 17 28 16 -28 1 18 17 29 16 -29 1 28 17 29 16 -30 1 18 17 28 29 -31 1 17 18 30 12 -32 1 17 18 31 12 -33 1 30 18 31 12 -34 1 17 18 30 31 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_post.molecule_template b/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_post.molecule_template new file mode 100644 index 0000000000..4db26814c5 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_post.molecule_template @@ -0,0 +1,317 @@ +rxn1_stp1_post + + 31 atoms + 30 bonds + 55 angles + 75 dihedrals + 2 impropers + +Coords + + 1 22.582572937 10.988183022 -5.014054298 + 2 23.904712677 10.750493050 -4.202214718 + 3 23.989171982 9.487042427 -3.323374271 + 4 24.067001343 11.723382950 -4.037434578 + 5 24.627851486 7.325302124 -3.319944382 + 6 24.554632187 8.418972015 -4.080364704 + 7 22.667762756 11.445702553 -5.999605179 + 8 21.787441254 10.247642517 -4.916974068 + 9 24.964962006 10.712682724 -4.449374199 + 10 24.616703033 9.689912796 -2.456034422 + 11 22.989313126 9.208152771 -2.991454601 + 12 18.808881760 13.758042336 -3.958724499 + 13 19.293212891 12.549682617 -3.196594477 + 14 20.810543060 12.417832375 -3.417504311 + 15 21.090192795 12.251202583 -4.891234398 + 16 17.657041550 16.437198639 -3.985224247 + 17 19.126712799 16.210239410 -4.245154381 + 18 19.589151382 14.957592964 -3.479564667 + 19 19.000432968 13.609432220 -5.041714668 + 20 18.761222839 11.614392281 -3.573184490 + 21 19.082902908 12.688992500 -2.085144520 + 22 21.202852249 11.511562347 -2.848624468 + 23 21.328481674 13.360252380 -3.038924456 + 24 19.949851990 12.199402809 -5.680355072 + 25 21.477342606 13.247442245 -5.445915222 + 26 17.080341339 15.555527687 -4.334374428 + 27 17.319831848 17.341926575 -4.532204151 + 28 19.720472336 17.115158081 -3.887564182 + 29 19.298622131 16.058658600 -5.361684799 + 30 19.410772324 15.105113029 -2.363724470 + 31 20.700162888 14.782252312 -3.666344166 + +Types + + 1 c2 + 2 c3 + 3 c2 + 4 oc + 5 cp + 6 oc + 7 hc + 8 hc + 9 hc + 10 hc + 11 hc + 12 na + 13 c2 + 14 c2 + 15 na + 16 na + 17 c2 + 18 c2 + 19 hn + 20 hc + 21 hc + 22 hc + 23 hc + 24 hn + 25 hn + 26 hn + 27 hn + 28 hc + 29 hc + 30 hc + 31 hc + +Charges + + 1 0.000000 + 2 0.000000 + 3 0.000000 + 4 0.100000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.000000 + 11 0.000000 + 12 0.000000 + 13 0.000000 + 14 0.000000 + 15 -0.025000 + 16 -0.025000 + 17 0.000000 + 18 0.000000 + 19 0.000000 + 20 0.000000 + 21 0.000000 + 22 0.000000 + 23 0.000000 + 24 0.000000 + 25 0.000000 + 26 0.000000 + 27 0.000000 + 28 0.000000 + 29 0.000000 + 30 0.000000 + 31 0.000000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + +Bonds + + 1 c2-hc 1 8 + 2 c2-c3 1 2 + 3 c2-hc 1 7 + 4 c2-na 1 15 + 5 c2-c3 3 2 + 6 c3-hc 2 9 + 7 c3-oc 2 4 + 8 c2-oc 3 6 + 9 c2-hc 3 10 + 10 c2-hc 3 11 + 11 cp-oc 6 5 + 12 c2-na 13 12 + 13 c2-na 18 12 + 14 na-hn 12 19 + 15 c2-c2 13 14 + 16 c2-hc 13 20 + 17 c2-hc 13 21 + 18 c2-na 14 15 + 19 c2-hc 14 22 + 20 c2-hc 14 23 + 21 na-hn 15 24 + 22 na-hn 15 25 + 23 c2-na 17 16 + 24 na-hn 16 26 + 25 na-hn 16 27 + 26 c2-c2 17 18 + 27 c2-hc 17 28 + 28 c2-hc 17 29 + 29 c2-hc 18 30 + 30 c2-hc 18 31 + +Angles + + 1 c3-c2-hc 2 1 8 + 2 hc-c2-hc 8 1 7 + 3 hc-c2-na 8 1 15 + 4 c3-c2-hc 2 1 7 + 5 c3-c2-na 2 1 15 + 6 hc-c2-na 7 1 15 + 7 c2-c3-c2 1 2 3 + 8 c2-c3-hc 1 2 9 + 9 c2-c3-oc 1 2 4 + 10 c2-c3-hc 3 2 9 + 11 c2-c3-oc 3 2 4 + 12 oc-c3-hc 4 2 9 + 13 c3-c2-oc 2 3 6 + 14 c3-c2-hc 2 3 10 + 15 c3-c2-hc 2 3 11 + 16 oc-c2-hc 6 3 10 + 17 oc-c2-hc 6 3 11 + 18 hc-c2-hc 10 3 11 + 19 c2-oc-cp 3 6 5 + 20 c2-na-c2 13 12 18 + 21 c2-na-hn 13 12 19 + 22 c2-na-hn 18 12 19 + 23 c2-c2-na 14 13 12 + 24 hc-c2-na 20 13 12 + 25 hc-c2-na 21 13 12 + 26 c2-c2-hc 14 13 20 + 27 c2-c2-hc 14 13 21 + 28 hc-c2-hc 20 13 21 + 29 c2-c2-na 13 14 15 + 30 c2-c2-hc 13 14 22 + 31 c2-c2-hc 13 14 23 + 32 hc-c2-na 22 14 15 + 33 hc-c2-na 23 14 15 + 34 hc-c2-hc 22 14 23 + 35 c2-na-c2 1 15 14 + 36 c2-na-hn 1 15 24 + 37 c2-na-hn 1 15 25 + 38 c2-na-hn 14 15 24 + 39 c2-na-hn 14 15 25 + 40 hn-na-hn 24 15 25 + 41 c2-na-hn 17 16 26 + 42 c2-na-hn 17 16 27 + 43 hn-na-hn 26 16 27 + 44 c2-c2-na 18 17 16 + 45 hc-c2-na 28 17 16 + 46 hc-c2-na 29 17 16 + 47 c2-c2-hc 18 17 28 + 48 c2-c2-hc 18 17 29 + 49 hc-c2-hc 28 17 29 + 50 c2-c2-na 17 18 12 + 51 hc-c2-na 30 18 12 + 52 hc-c2-na 31 18 12 + 53 c2-c2-hc 17 18 30 + 54 c2-c2-hc 17 18 31 + 55 hc-c2-hc 30 18 31 + +Dihedrals + + 1 hc-c2-c3-c2 8 1 2 3 + 2 hc-c2-c3-hc 8 1 2 9 + 3 hc-c2-c3-oc 8 1 2 4 + 4 hc-c2-c3-c2 7 1 2 3 + 5 hc-c2-c3-hc 7 1 2 9 + 6 hc-c2-c3-oc 7 1 2 4 + 7 na-c2-c3-c2 15 1 2 3 + 8 na-c2-c3-hc 15 1 2 9 + 9 na-c2-c3-oc 15 1 2 4 + 10 hc-c2-na-c2 8 1 15 14 + 11 hc-c2-na-hn 8 1 15 24 + 12 hc-c2-na-hn 8 1 15 25 + 13 c3-c2-na-c2 2 1 15 14 + 14 c3-c2-na-hn 2 1 15 24 + 15 c3-c2-na-hn 2 1 15 25 + 16 hc-c2-na-c2 7 1 15 14 + 17 hc-c2-na-hn 7 1 15 24 + 18 hc-c2-na-hn 7 1 15 25 + 19 oc-c2-c3-c2 6 3 2 1 + 20 hc-c2-c3-c2 10 3 2 1 + 21 hc-c2-c3-c2 11 3 2 1 + 22 oc-c2-c3-hc 6 3 2 9 + 23 hc-c2-c3-hc 10 3 2 9 + 24 hc-c2-c3-hc 11 3 2 9 + 25 oc-c2-c3-oc 6 3 2 4 + 26 hc-c2-c3-oc 10 3 2 4 + 27 hc-c2-c3-oc 11 3 2 4 + 28 c3-c2-oc-cp 2 3 6 5 + 29 hc-c2-oc-cp 10 3 6 5 + 30 hc-c2-oc-cp 11 3 6 5 + 31 c2-c2-na-c2 14 13 12 18 + 32 hc-c2-na-c2 20 13 12 18 + 33 hc-c2-na-c2 21 13 12 18 + 34 c2-c2-na-hn 14 13 12 19 + 35 hc-c2-na-hn 20 13 12 19 + 36 hc-c2-na-hn 21 13 12 19 + 37 c2-c2-na-c2 17 18 12 13 + 38 hc-c2-na-c2 30 18 12 13 + 39 hc-c2-na-c2 31 18 12 13 + 40 c2-c2-na-hn 17 18 12 19 + 41 hc-c2-na-hn 30 18 12 19 + 42 hc-c2-na-hn 31 18 12 19 + 43 na-c2-c2-na 12 13 14 15 + 44 hc-c2-c2-na 22 14 13 12 + 45 hc-c2-c2-na 23 14 13 12 + 46 hc-c2-c2-na 20 13 14 15 + 47 hc-c2-c2-hc 20 13 14 22 + 48 hc-c2-c2-hc 20 13 14 23 + 49 hc-c2-c2-na 21 13 14 15 + 50 hc-c2-c2-hc 21 13 14 22 + 51 hc-c2-c2-hc 21 13 14 23 + 52 c2-c2-na-c2 13 14 15 1 + 53 c2-c2-na-hn 13 14 15 24 + 54 c2-c2-na-hn 13 14 15 25 + 55 hc-c2-na-c2 22 14 15 1 + 56 hc-c2-na-hn 22 14 15 24 + 57 hc-c2-na-hn 22 14 15 25 + 58 hc-c2-na-c2 23 14 15 1 + 59 hc-c2-na-hn 23 14 15 24 + 60 hc-c2-na-hn 23 14 15 25 + 61 c2-c2-na-hn 18 17 16 26 + 62 hc-c2-na-hn 28 17 16 26 + 63 hc-c2-na-hn 29 17 16 26 + 64 c2-c2-na-hn 18 17 16 27 + 65 hc-c2-na-hn 28 17 16 27 + 66 hc-c2-na-hn 29 17 16 27 + 67 na-c2-c2-na 16 17 18 12 + 68 hc-c2-c2-na 30 18 17 16 + 69 hc-c2-c2-na 31 18 17 16 + 70 hc-c2-c2-na 28 17 18 12 + 71 hc-c2-c2-hc 28 17 18 30 + 72 hc-c2-c2-hc 28 17 18 31 + 73 hc-c2-c2-na 29 17 18 12 + 74 hc-c2-c2-hc 29 17 18 30 + 75 hc-c2-c2-hc 29 17 18 31 + +Impropers + + 1 c2-na-c2-hn 13 12 18 19 + 2 c2-na-hn-hn 17 16 26 27 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_pre.data_template b/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_pre.data_template deleted file mode 100644 index dd767a4cba..0000000000 --- a/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_pre.data_template +++ /dev/null @@ -1,301 +0,0 @@ -rxn1_stp1_pre - -31 atoms -30 bonds -53 angles -66 dihedrals -31 impropers - -Types - -1 2 -2 2 -3 1 -4 3 -5 4 -6 7 -7 8 -8 8 -9 8 -10 8 -11 8 -12 9 -13 1 -14 1 -15 9 -16 9 -17 1 -18 1 -19 10 -20 8 -21 8 -22 8 -23 8 -24 10 -25 10 -26 10 -27 10 -28 8 -29 8 -30 8 -31 8 - -Charges - -1 0.000000 -2 0.000000 -3 0.000000 -4 0.100000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.000000 -11 0.000000 -12 0.000000 -13 0.000000 -14 0.000000 -15 -0.025000 -16 -0.025000 -17 0.000000 -18 0.000000 -19 0.000000 -20 0.000000 -21 0.000000 -22 0.000000 -23 0.000000 -24 0.000000 -25 0.000000 -26 0.000000 -27 0.000000 -28 0.000000 -29 0.000000 -30 0.000000 -31 0.000000 - -Coords - -1 19.846882 9.569666 -1.229588 -2 21.168802 9.331466 -0.418038 -3 21.253012 8.067936 0.460722 -4 20.170443 10.460656 0.020692 -5 21.891691 5.906196 0.464152 -6 21.818472 6.999866 -0.296268 -7 19.932211 10.027435 -2.215008 -8 19.051722 8.829116 -1.132808 -9 22.229073 9.293536 -0.665088 -10 21.880442 8.270676 1.328162 -11 20.253073 7.789126 0.792482 -12 16.072590 12.338870 -0.174330 -13 16.557261 11.130320 0.587290 -14 18.074570 10.998810 0.366080 -15 18.353970 10.832370 -1.107720 -16 14.920720 15.017820 -0.200530 -17 16.390430 14.791100 -0.460440 -18 16.852980 13.538320 0.304870 -19 16.263750 12.190560 -1.257430 -20 16.025360 10.195070 0.210470 -21 16.347120 11.269210 1.698830 -22 18.467180 10.092570 0.934800 -23 18.592390 11.941300 0.744640 -24 17.843861 9.919930 -1.479780 -25 19.448191 10.736480 -1.267520 -26 14.344120 14.136250 -0.550130 -27 14.583470 15.922760 -0.747140 -28 16.984060 15.696010 -0.102600 -29 16.562420 14.639820 -1.577000 -30 16.674820 13.685670 1.420760 -31 17.963949 13.362980 0.117850 - -Bonds - -1 6 1 8 -2 4 1 4 -3 5 1 2 -4 6 1 7 -5 4 2 4 -6 2 2 3 -7 6 2 9 -8 3 3 6 -9 1 3 10 -10 1 3 11 -11 8 5 6 -12 13 13 12 -13 13 18 12 -14 14 12 19 -15 15 13 14 -16 1 13 20 -17 1 13 21 -18 13 14 15 -19 1 14 22 -20 1 14 23 -21 14 15 24 -22 14 15 25 -23 13 17 16 -24 14 16 26 -25 14 16 27 -26 15 17 18 -27 1 17 28 -28 1 17 29 -29 1 18 30 -30 1 18 31 - -Angles - -1 9 4 1 8 -2 10 2 1 8 -3 11 8 1 7 -4 8 2 1 4 -5 9 4 1 7 -6 10 2 1 7 -7 8 1 2 4 -8 29 1 2 3 -9 10 1 2 9 -10 5 3 2 4 -11 9 4 2 9 -12 7 3 2 9 -13 4 2 3 6 -14 1 2 3 10 -15 1 2 3 11 -16 3 6 3 10 -17 3 6 3 11 -18 2 10 3 11 -19 12 1 4 2 -20 22 3 6 5 -21 23 13 12 18 -22 24 13 12 19 -23 24 18 12 19 -24 25 14 13 12 -25 26 20 13 12 -26 26 21 13 12 -27 27 14 13 20 -28 27 14 13 21 -29 2 20 13 21 -30 25 13 14 15 -31 27 13 14 22 -32 27 13 14 23 -33 26 22 14 15 -34 26 23 14 15 -35 2 22 14 23 -36 24 14 15 24 -37 24 14 15 25 -38 28 24 15 25 -39 24 17 16 26 -40 24 17 16 27 -41 28 26 16 27 -42 25 18 17 16 -43 26 28 17 16 -44 26 29 17 16 -45 27 18 17 28 -46 27 18 17 29 -47 2 28 17 29 -48 25 17 18 12 -49 26 30 18 12 -50 26 31 18 12 -51 27 17 18 30 -52 27 17 18 31 -53 2 30 18 31 - -Dihedrals - -1 10 8 1 4 2 -2 10 7 1 4 2 -3 13 4 2 1 8 -4 12 3 2 1 8 -5 14 8 1 2 9 -6 11 3 2 1 4 -7 13 4 1 2 9 -8 13 4 2 1 7 -9 12 3 2 1 7 -10 14 7 1 2 9 -11 9 3 2 4 1 -12 10 9 2 4 1 -13 34 1 2 3 6 -14 35 1 2 3 10 -15 35 1 2 3 11 -16 36 4 2 3 6 -17 37 4 2 3 10 -18 37 4 2 3 11 -19 38 9 2 3 6 -20 39 9 2 3 10 -21 39 9 2 3 11 -22 8 2 3 6 5 -23 7 10 3 6 5 -24 7 11 3 6 5 -25 27 14 13 12 18 -26 28 20 13 12 18 -27 28 21 13 12 18 -28 29 14 13 12 19 -29 30 20 13 12 19 -30 30 21 13 12 19 -31 27 17 18 12 13 -32 28 30 18 12 13 -33 28 31 18 12 13 -34 29 17 18 12 19 -35 30 30 18 12 19 -36 30 31 18 12 19 -37 31 12 13 14 15 -38 32 22 14 13 12 -39 32 23 14 13 12 -40 32 20 13 14 15 -41 33 20 13 14 22 -42 33 20 13 14 23 -43 32 21 13 14 15 -44 33 21 13 14 22 -45 33 21 13 14 23 -46 29 13 14 15 24 -47 29 13 14 15 25 -48 30 22 14 15 24 -49 30 22 14 15 25 -50 30 23 14 15 24 -51 30 23 14 15 25 -52 29 18 17 16 26 -53 30 28 17 16 26 -54 30 29 17 16 26 -55 29 18 17 16 27 -56 30 28 17 16 27 -57 30 29 17 16 27 -58 31 16 17 18 12 -59 32 30 18 17 16 -60 32 31 18 17 16 -61 32 28 17 18 12 -62 33 28 17 18 30 -63 33 28 17 18 31 -64 32 29 17 18 12 -65 33 29 17 18 30 -66 33 29 17 18 31 - -Impropers - -1 4 13 12 18 19 -2 5 14 15 24 25 -3 5 17 16 26 27 -4 1 2 1 4 8 -5 1 4 1 8 7 -6 1 2 1 8 7 -7 1 2 1 4 7 -8 1 1 2 3 4 -9 1 1 2 4 9 -10 1 1 2 3 9 -11 1 3 2 4 9 -12 1 2 3 6 10 -13 1 2 3 6 11 -14 1 2 3 10 11 -15 1 6 3 10 11 -16 1 14 13 20 12 -17 1 14 13 21 12 -18 1 20 13 21 12 -19 1 14 13 20 21 -20 1 13 14 22 15 -21 1 13 14 23 15 -22 1 13 14 22 23 -23 1 22 14 23 15 -24 1 18 17 28 16 -25 1 18 17 29 16 -26 1 28 17 29 16 -27 1 18 17 28 29 -28 1 17 18 30 12 -29 1 17 18 31 12 -30 1 30 18 31 12 -31 1 17 18 30 31 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_pre.molecule_template b/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_pre.molecule_template new file mode 100644 index 0000000000..35d308c797 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp1_pre.molecule_template @@ -0,0 +1,307 @@ +rxn1_stp1_pre + + 31 atoms + 30 bonds + 53 angles + 66 dihedrals + 3 impropers + +Coords + + 1 19.846881866 9.569665909 -1.229588389 + 2 21.168802261 9.331465721 -0.418038189 + 3 21.253011703 8.067935944 0.460721821 + 4 20.170442581 10.460656166 0.020691812 + 5 21.891691208 5.906195641 0.464151829 + 6 21.818471909 6.999865532 -0.296268165 + 7 19.932210922 10.027435303 -2.215008259 + 8 19.051721573 8.829115868 -1.132808328 + 9 22.229072571 9.293536186 -0.665088177 + 10 21.880441666 8.270675659 1.328161597 + 11 20.253072739 7.789125919 0.792481780 + 12 16.072589874 12.338870049 -0.174329996 + 13 16.557260513 11.130319595 0.587289989 + 14 18.074569702 10.998809814 0.366079986 + 15 18.353969574 10.832369804 -1.107720017 + 16 14.920720100 15.017820358 -0.200529993 + 17 16.390430450 14.791099548 -0.460440010 + 18 16.852979660 13.538319588 0.304870009 + 19 16.263750076 12.190560341 -1.257429957 + 20 16.025360107 10.195070267 0.210470006 + 21 16.347120285 11.269209862 1.698830009 + 22 18.467180252 10.092570305 0.934800029 + 23 18.592390060 11.941300392 0.744639993 + 24 17.843860626 9.919930458 -1.479779959 + 25 19.448190689 10.736479759 -1.267519951 + 26 14.344120026 14.136249542 -0.550130010 + 27 14.583470345 15.922760010 -0.747139990 + 28 16.984060287 15.696009636 -0.102600001 + 29 16.562419891 14.639820099 -1.577000022 + 30 16.674819946 13.685669899 1.420760036 + 31 17.963949203 13.362979889 0.117849998 + +Types + + 1 c3m + 2 c3m + 3 c2 + 4 o3e + 5 cp + 6 oc + 7 hc + 8 hc + 9 hc + 10 hc + 11 hc + 12 na + 13 c2 + 14 c2 + 15 na + 16 na + 17 c2 + 18 c2 + 19 hn + 20 hc + 21 hc + 22 hc + 23 hc + 24 hn + 25 hn + 26 hn + 27 hn + 28 hc + 29 hc + 30 hc + 31 hc + +Charges + + 1 0.000000 + 2 0.000000 + 3 0.000000 + 4 0.100000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.000000 + 11 0.000000 + 12 0.000000 + 13 0.000000 + 14 0.000000 + 15 -0.025000 + 16 -0.025000 + 17 0.000000 + 18 0.000000 + 19 0.000000 + 20 0.000000 + 21 0.000000 + 22 0.000000 + 23 0.000000 + 24 0.000000 + 25 0.000000 + 26 0.000000 + 27 0.000000 + 28 0.000000 + 29 0.000000 + 30 0.000000 + 31 0.000000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + +Bonds + + 1 c3m-hc 1 8 + 2 c3m-o3e 1 4 + 3 c3m-c3m 1 2 + 4 c3m-hc 1 7 + 5 c3m-o3e 2 4 + 6 c3m-c2 2 3 + 7 c3m-hc 2 9 + 8 c2-oc 3 6 + 9 c2-hc 3 10 + 10 c2-hc 3 11 + 11 cp-oc 5 6 + 12 c2-na 13 12 + 13 c2-na 18 12 + 14 na-hn 12 19 + 15 c2-c2 13 14 + 16 c2-hc 13 20 + 17 c2-hc 13 21 + 18 c2-na 14 15 + 19 c2-hc 14 22 + 20 c2-hc 14 23 + 21 na-hn 15 24 + 22 na-hn 15 25 + 23 c2-na 17 16 + 24 na-hn 16 26 + 25 na-hn 16 27 + 26 c2-c2 17 18 + 27 c2-hc 17 28 + 28 c2-hc 17 29 + 29 c2-hc 18 30 + 30 c2-hc 18 31 + +Angles + + 1 o3e-c3m-hc 4 1 8 + 2 c3m-c3m-hc 2 1 8 + 3 hc-c3m-hc 8 1 7 + 4 c3m-c3m-o3e 2 1 4 + 5 o3e-c3m-hc 4 1 7 + 6 c3m-c3m-hc 2 1 7 + 7 c3m-c3m-o3e 1 2 4 + 8 c3m-c3m-c2 1 2 3 + 9 c3m-c3m-hc 1 2 9 + 10 c2-c3m-o3e 3 2 4 + 11 o3e-c3m-hc 4 2 9 + 12 c2-c3m-hc 3 2 9 + 13 c3m-c2-oc 2 3 6 + 14 c3m-c2-hc 2 3 10 + 15 c3m-c2-hc 2 3 11 + 16 oc-c2-hc 6 3 10 + 17 oc-c2-hc 6 3 11 + 18 hc-c2-hc 10 3 11 + 19 c3m-o3e-c3m 1 4 2 + 20 c2-oc-cp 3 6 5 + 21 c2-na-c2 13 12 18 + 22 c2-na-hn 13 12 19 + 23 c2-na-hn 18 12 19 + 24 c2-c2-na 14 13 12 + 25 hc-c2-na 20 13 12 + 26 hc-c2-na 21 13 12 + 27 c2-c2-hc 14 13 20 + 28 c2-c2-hc 14 13 21 + 29 hc-c2-hc 20 13 21 + 30 c2-c2-na 13 14 15 + 31 c2-c2-hc 13 14 22 + 32 c2-c2-hc 13 14 23 + 33 hc-c2-na 22 14 15 + 34 hc-c2-na 23 14 15 + 35 hc-c2-hc 22 14 23 + 36 c2-na-hn 14 15 24 + 37 c2-na-hn 14 15 25 + 38 hn-na-hn 24 15 25 + 39 c2-na-hn 17 16 26 + 40 c2-na-hn 17 16 27 + 41 hn-na-hn 26 16 27 + 42 c2-c2-na 18 17 16 + 43 hc-c2-na 28 17 16 + 44 hc-c2-na 29 17 16 + 45 c2-c2-hc 18 17 28 + 46 c2-c2-hc 18 17 29 + 47 hc-c2-hc 28 17 29 + 48 c2-c2-na 17 18 12 + 49 hc-c2-na 30 18 12 + 50 hc-c2-na 31 18 12 + 51 c2-c2-hc 17 18 30 + 52 c2-c2-hc 17 18 31 + 53 hc-c2-hc 30 18 31 + +Dihedrals + + 1 hc-c3m-o3e-c3m 8 1 4 2 + 2 hc-c3m-o3e-c3m 7 1 4 2 + 3 o3e-c3m-c3m-hc 4 2 1 8 + 4 c2-c3m-c3m-hc 3 2 1 8 + 5 hc-c3m-c3m-hc 8 1 2 9 + 6 c2-c3m-c3m-o3e 3 2 1 4 + 7 o3e-c3m-c3m-hc 4 1 2 9 + 8 o3e-c3m-c3m-hc 4 2 1 7 + 9 c2-c3m-c3m-hc 3 2 1 7 + 10 hc-c3m-c3m-hc 7 1 2 9 + 11 c2-c3m-o3e-c3m 3 2 4 1 + 12 hc-c3m-o3e-c3m 9 2 4 1 + 13 c3m-c3m-c2-oc 1 2 3 6 + 14 c3m-c3m-c2-hc 1 2 3 10 + 15 c3m-c3m-c2-hc 1 2 3 11 + 16 o3e-c3m-c2-oc 4 2 3 6 + 17 o3e-c3m-c2-hc 4 2 3 10 + 18 o3e-c3m-c2-hc 4 2 3 11 + 19 hc-c3m-c2-oc 9 2 3 6 + 20 hc-c3m-c2-hc 9 2 3 10 + 21 hc-c3m-c2-hc 9 2 3 11 + 22 c3m-c2-oc-cp 2 3 6 5 + 23 hc-c2-oc-cp 10 3 6 5 + 24 hc-c2-oc-cp 11 3 6 5 + 25 c2-c2-na-c2 14 13 12 18 + 26 hc-c2-na-c2 20 13 12 18 + 27 hc-c2-na-c2 21 13 12 18 + 28 c2-c2-na-hn 14 13 12 19 + 29 hc-c2-na-hn 20 13 12 19 + 30 hc-c2-na-hn 21 13 12 19 + 31 c2-c2-na-c2 17 18 12 13 + 32 hc-c2-na-c2 30 18 12 13 + 33 hc-c2-na-c2 31 18 12 13 + 34 c2-c2-na-hn 17 18 12 19 + 35 hc-c2-na-hn 30 18 12 19 + 36 hc-c2-na-hn 31 18 12 19 + 37 na-c2-c2-na 12 13 14 15 + 38 hc-c2-c2-na 22 14 13 12 + 39 hc-c2-c2-na 23 14 13 12 + 40 hc-c2-c2-na 20 13 14 15 + 41 hc-c2-c2-hc 20 13 14 22 + 42 hc-c2-c2-hc 20 13 14 23 + 43 hc-c2-c2-na 21 13 14 15 + 44 hc-c2-c2-hc 21 13 14 22 + 45 hc-c2-c2-hc 21 13 14 23 + 46 c2-c2-na-hn 13 14 15 24 + 47 c2-c2-na-hn 13 14 15 25 + 48 hc-c2-na-hn 22 14 15 24 + 49 hc-c2-na-hn 22 14 15 25 + 50 hc-c2-na-hn 23 14 15 24 + 51 hc-c2-na-hn 23 14 15 25 + 52 c2-c2-na-hn 18 17 16 26 + 53 hc-c2-na-hn 28 17 16 26 + 54 hc-c2-na-hn 29 17 16 26 + 55 c2-c2-na-hn 18 17 16 27 + 56 hc-c2-na-hn 28 17 16 27 + 57 hc-c2-na-hn 29 17 16 27 + 58 na-c2-c2-na 16 17 18 12 + 59 hc-c2-c2-na 30 18 17 16 + 60 hc-c2-c2-na 31 18 17 16 + 61 hc-c2-c2-na 28 17 18 12 + 62 hc-c2-c2-hc 28 17 18 30 + 63 hc-c2-c2-hc 28 17 18 31 + 64 hc-c2-c2-na 29 17 18 12 + 65 hc-c2-c2-hc 29 17 18 30 + 66 hc-c2-c2-hc 29 17 18 31 + +Impropers + + 1 c2-na-c2-hn 13 12 18 19 + 2 c2-na-hn-hn 14 15 24 25 + 3 c2-na-hn-hn 17 16 26 27 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp2_post.data_template b/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp2_post.data_template deleted file mode 100644 index cbb66a3151..0000000000 --- a/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp2_post.data_template +++ /dev/null @@ -1,307 +0,0 @@ -rxn1_stp2_post - -31 atoms -30 bonds -53 angles -72 dihedrals -31 impropers - -Types - -1 1 -2 6 -3 1 -4 7 -5 4 -6 7 -7 8 -8 8 -9 8 -10 8 -11 8 -12 9 -13 1 -14 1 -15 9 -16 9 -17 1 -18 1 -19 10 -20 8 -21 8 -22 8 -23 8 -24 10 -25 11 -26 10 -27 10 -28 8 -29 8 -30 8 -31 8 - -Charges - -1 0.000000 -2 0.000000 -3 0.000000 -4 0.100000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.000000 -11 0.000000 -12 0.000000 -13 0.000000 -14 0.000000 -15 -0.025000 -16 -0.025000 -17 0.000000 -18 0.000000 -19 0.000000 -20 0.000000 -21 0.000000 -22 0.000000 -23 0.000000 -24 0.000000 -25 0.000000 -26 0.000000 -27 0.000000 -28 0.000000 -29 0.000000 -30 0.000000 -31 0.000000 - -Coords - -1 19.846411 9.569080 -1.229960 -2 21.168550 9.331390 -0.418120 -3 21.253010 8.067940 0.460720 -4 21.330839 10.304280 -0.253340 -5 21.891689 5.906200 0.464150 -6 21.818470 6.999870 -0.296270 -7 19.931601 10.026600 -2.215510 -8 19.051279 8.828540 -1.132880 -9 22.228800 9.293580 -0.665280 -10 21.880541 8.270810 1.328060 -11 20.253151 7.789050 0.792640 -12 16.072720 12.338940 -0.174630 -13 16.557051 11.130580 0.587500 -14 18.074381 10.998730 0.366590 -15 18.354031 10.832100 -1.107140 -16 14.920880 15.018100 -0.201130 -17 16.390551 14.791140 -0.461060 -18 16.852989 13.538490 0.304530 -19 16.264271 12.190330 -1.257620 -20 16.025061 10.195290 0.210910 -21 16.346741 11.269890 1.698950 -22 18.466690 10.092460 0.935470 -23 18.592319 11.941150 0.745170 -24 17.213690 10.780300 -1.896260 -25 20.881861 11.302060 -0.773030 -26 14.344180 14.136430 -0.550280 -27 14.583670 15.922830 -0.748110 -28 16.984310 15.696060 -0.103470 -29 16.562460 14.639560 -1.577590 -30 16.674610 13.686010 1.420370 -31 17.964001 13.363150 0.117750 - -Bonds - -1 1 1 8 -2 16 1 2 -3 1 1 7 -4 13 1 15 -5 16 3 2 -6 12 2 9 -7 17 2 4 -8 3 3 6 -9 1 3 10 -10 1 3 11 -11 18 4 25 -12 8 6 5 -13 13 13 12 -14 13 18 12 -15 14 12 19 -16 15 13 14 -17 1 13 20 -18 1 13 21 -19 13 14 15 -20 1 14 22 -21 1 14 23 -22 14 15 24 -23 13 17 16 -24 14 16 26 -25 14 16 27 -26 15 17 18 -27 1 17 28 -28 1 17 29 -29 1 18 30 -30 1 18 31 - -Angles - -1 30 2 1 8 -2 2 8 1 7 -3 26 8 1 15 -4 30 2 1 7 -5 31 2 1 15 -6 26 7 1 15 -7 32 1 2 3 -8 33 1 2 9 -9 34 1 2 4 -10 33 3 2 9 -11 34 3 2 4 -12 35 4 2 9 -13 36 2 3 6 -14 30 2 3 10 -15 30 2 3 11 -16 3 6 3 10 -17 3 6 3 11 -18 2 10 3 11 -19 37 2 4 25 -20 22 3 6 5 -21 23 13 12 18 -22 24 13 12 19 -23 24 18 12 19 -24 25 14 13 12 -25 26 20 13 12 -26 26 21 13 12 -27 27 14 13 20 -28 27 14 13 21 -29 2 20 13 21 -30 25 13 14 15 -31 27 13 14 22 -32 27 13 14 23 -33 26 22 14 15 -34 26 23 14 15 -35 2 22 14 23 -36 23 1 15 14 -37 24 1 15 24 -38 24 14 15 24 -39 24 17 16 26 -40 24 17 16 27 -41 28 26 16 27 -42 25 18 17 16 -43 26 28 17 16 -44 26 29 17 16 -45 27 18 17 28 -46 27 18 17 29 -47 2 28 17 29 -48 25 17 18 12 -49 26 30 18 12 -50 26 31 18 12 -51 27 17 18 30 -52 27 17 18 31 -53 2 30 18 31 - -Dihedrals - -1 40 8 1 2 3 -2 41 8 1 2 9 -3 42 8 1 2 4 -4 40 7 1 2 3 -5 41 7 1 2 9 -6 42 7 1 2 4 -7 43 15 1 2 3 -8 44 15 1 2 9 -9 45 15 1 2 4 -10 28 8 1 15 14 -11 30 8 1 15 24 -12 46 2 1 15 14 -13 47 2 1 15 24 -14 28 7 1 15 14 -15 30 7 1 15 24 -16 48 6 3 2 1 -17 40 10 3 2 1 -18 40 11 3 2 1 -19 49 6 3 2 9 -20 41 10 3 2 9 -21 41 11 3 2 9 -22 50 6 3 2 4 -23 42 10 3 2 4 -24 42 11 3 2 4 -25 52 1 2 4 25 -26 52 3 2 4 25 -27 53 9 2 4 25 -28 51 2 3 6 5 -29 7 10 3 6 5 -30 7 11 3 6 5 -31 27 14 13 12 18 -32 28 20 13 12 18 -33 28 21 13 12 18 -34 29 14 13 12 19 -35 30 20 13 12 19 -36 30 21 13 12 19 -37 27 17 18 12 13 -38 28 30 18 12 13 -39 28 31 18 12 13 -40 29 17 18 12 19 -41 30 30 18 12 19 -42 30 31 18 12 19 -43 31 12 13 14 15 -44 32 22 14 13 12 -45 32 23 14 13 12 -46 32 20 13 14 15 -47 33 20 13 14 22 -48 33 20 13 14 23 -49 32 21 13 14 15 -50 33 21 13 14 22 -51 33 21 13 14 23 -52 27 13 14 15 1 -53 29 13 14 15 24 -54 28 22 14 15 1 -55 30 22 14 15 24 -56 28 23 14 15 1 -57 30 23 14 15 24 -58 29 18 17 16 26 -59 30 28 17 16 26 -60 30 29 17 16 26 -61 29 18 17 16 27 -62 30 28 17 16 27 -63 30 29 17 16 27 -64 31 16 17 18 12 -65 32 30 18 17 16 -66 32 31 18 17 16 -67 32 28 17 18 12 -68 33 28 17 18 30 -69 33 28 17 18 31 -70 32 29 17 18 12 -71 33 29 17 18 30 -72 33 29 17 18 31 - -Impropers - -1 4 13 12 18 19 -2 4 1 15 14 24 -3 5 17 16 26 27 -4 1 2 1 8 7 -5 1 2 1 8 15 -6 1 8 1 7 15 -7 1 2 1 7 15 -8 1 1 2 3 9 -9 1 1 2 3 4 -10 1 1 2 4 9 -11 1 3 2 4 9 -12 1 2 3 6 10 -13 1 2 3 6 11 -14 1 2 3 10 11 -15 1 6 3 10 11 -16 1 14 13 20 12 -17 1 14 13 21 12 -18 1 20 13 21 12 -19 1 14 13 20 21 -20 1 13 14 22 15 -21 1 13 14 23 15 -22 1 13 14 22 23 -23 1 22 14 23 15 -24 1 18 17 28 16 -25 1 18 17 29 16 -26 1 28 17 29 16 -27 1 18 17 28 29 -28 1 17 18 30 12 -29 1 17 18 31 12 -30 1 30 18 31 12 -31 1 17 18 30 31 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp2_post.molecule_template b/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp2_post.molecule_template new file mode 100644 index 0000000000..bee46d3a66 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_epoxy/rxn1_stp2_post.molecule_template @@ -0,0 +1,313 @@ +rxn1_stp2_post + + 31 atoms + 30 bonds + 53 angles + 72 dihedrals + 3 impropers + +Coords + + 1 19.846410751 9.569080353 -1.229959965 + 2 21.168550491 9.331390381 -0.418119997 + 3 21.253009796 8.067939758 0.460720003 + 4 21.330839157 10.304280281 -0.253340006 + 5 21.891689301 5.906199932 0.464150012 + 6 21.818470001 6.999869823 -0.296270013 + 7 19.931600571 10.026599884 -2.215509892 + 8 19.051279068 8.828539848 -1.132879972 + 9 22.228799820 9.293580055 -0.665279984 + 10 21.880540848 8.270810127 1.328060031 + 11 20.253150940 7.789050102 0.792639971 + 12 16.072719574 12.338939667 -0.174630001 + 13 16.557050705 11.130579948 0.587499976 + 14 18.074380875 10.998729706 0.366589993 + 15 18.354030609 10.832099915 -1.107139945 + 16 14.920880318 15.018099785 -0.201130003 + 17 16.390550613 14.791139603 -0.461059988 + 18 16.852989197 13.538490295 0.304529995 + 19 16.264270782 12.190329552 -1.257619977 + 20 16.025060654 10.195289612 0.210910007 + 21 16.346740723 11.269889832 1.698950052 + 22 18.466690063 10.092459679 0.935469985 + 23 18.592319489 11.941149712 0.745169997 + 24 17.213689804 10.780300140 -1.896260023 + 25 20.881860733 11.302060127 -0.773029983 + 26 14.344180107 14.136429787 -0.550279975 + 27 14.583669662 15.922829628 -0.748109996 + 28 16.984310150 15.696060181 -0.103469998 + 29 16.562459946 14.639559746 -1.577589989 + 30 16.674610138 13.686010361 1.420369983 + 31 17.964000702 13.363149643 0.117749996 + +Types + + 1 c2 + 2 c3 + 3 c2 + 4 oc + 5 cp + 6 oc + 7 hc + 8 hc + 9 hc + 10 hc + 11 hc + 12 na + 13 c2 + 14 c2 + 15 na + 16 na + 17 c2 + 18 c2 + 19 hn + 20 hc + 21 hc + 22 hc + 23 hc + 24 hn + 25 ho + 26 hn + 27 hn + 28 hc + 29 hc + 30 hc + 31 hc + +Charges + + 1 0.000000 + 2 0.000000 + 3 0.000000 + 4 0.100000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.000000 + 11 0.000000 + 12 0.000000 + 13 0.000000 + 14 0.000000 + 15 -0.025000 + 16 -0.025000 + 17 0.000000 + 18 0.000000 + 19 0.000000 + 20 0.000000 + 21 0.000000 + 22 0.000000 + 23 0.000000 + 24 0.000000 + 25 0.000000 + 26 0.000000 + 27 0.000000 + 28 0.000000 + 29 0.000000 + 30 0.000000 + 31 0.000000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + +Bonds + + 1 c2-hc 1 8 + 2 c2-c3 1 2 + 3 c2-hc 1 7 + 4 c2-na 1 15 + 5 c2-c3 3 2 + 6 c3-hc 2 9 + 7 c3-oc 2 4 + 8 c2-oc 3 6 + 9 c2-hc 3 10 + 10 c2-hc 3 11 + 11 oc-ho 4 25 + 12 cp-oc 6 5 + 13 c2-na 13 12 + 14 c2-na 18 12 + 15 na-hn 12 19 + 16 c2-c2 13 14 + 17 c2-hc 13 20 + 18 c2-hc 13 21 + 19 c2-na 14 15 + 20 c2-hc 14 22 + 21 c2-hc 14 23 + 22 na-hn 15 24 + 23 c2-na 17 16 + 24 na-hn 16 26 + 25 na-hn 16 27 + 26 c2-c2 17 18 + 27 c2-hc 17 28 + 28 c2-hc 17 29 + 29 c2-hc 18 30 + 30 c2-hc 18 31 + +Angles + + 1 c3-c2-hc 2 1 8 + 2 hc-c2-hc 8 1 7 + 3 hc-c2-na 8 1 15 + 4 c3-c2-hc 2 1 7 + 5 c3-c2-na 2 1 15 + 6 hc-c2-na 7 1 15 + 7 c2-c3-c2 1 2 3 + 8 c2-c3-hc 1 2 9 + 9 c2-c3-oc 1 2 4 + 10 c2-c3-hc 3 2 9 + 11 c2-c3-oc 3 2 4 + 12 oc-c3-hc 4 2 9 + 13 c3-c2-oc 2 3 6 + 14 c3-c2-hc 2 3 10 + 15 c3-c2-hc 2 3 11 + 16 oc-c2-hc 6 3 10 + 17 oc-c2-hc 6 3 11 + 18 hc-c2-hc 10 3 11 + 19 c3-oc-ho 2 4 25 + 20 c2-oc-cp 3 6 5 + 21 c2-na-c2 13 12 18 + 22 c2-na-hn 13 12 19 + 23 c2-na-hn 18 12 19 + 24 c2-c2-na 14 13 12 + 25 hc-c2-na 20 13 12 + 26 hc-c2-na 21 13 12 + 27 c2-c2-hc 14 13 20 + 28 c2-c2-hc 14 13 21 + 29 hc-c2-hc 20 13 21 + 30 c2-c2-na 13 14 15 + 31 c2-c2-hc 13 14 22 + 32 c2-c2-hc 13 14 23 + 33 hc-c2-na 22 14 15 + 34 hc-c2-na 23 14 15 + 35 hc-c2-hc 22 14 23 + 36 c2-na-c2 1 15 14 + 37 c2-na-hn 1 15 24 + 38 c2-na-hn 14 15 24 + 39 c2-na-hn 17 16 26 + 40 c2-na-hn 17 16 27 + 41 hn-na-hn 26 16 27 + 42 c2-c2-na 18 17 16 + 43 hc-c2-na 28 17 16 + 44 hc-c2-na 29 17 16 + 45 c2-c2-hc 18 17 28 + 46 c2-c2-hc 18 17 29 + 47 hc-c2-hc 28 17 29 + 48 c2-c2-na 17 18 12 + 49 hc-c2-na 30 18 12 + 50 hc-c2-na 31 18 12 + 51 c2-c2-hc 17 18 30 + 52 c2-c2-hc 17 18 31 + 53 hc-c2-hc 30 18 31 + +Dihedrals + + 1 hc-c2-c3-c2 8 1 2 3 + 2 hc-c2-c3-hc 8 1 2 9 + 3 hc-c2-c3-oc 8 1 2 4 + 4 hc-c2-c3-c2 7 1 2 3 + 5 hc-c2-c3-hc 7 1 2 9 + 6 hc-c2-c3-oc 7 1 2 4 + 7 na-c2-c3-c2 15 1 2 3 + 8 na-c2-c3-hc 15 1 2 9 + 9 na-c2-c3-oc 15 1 2 4 + 10 hc-c2-na-c2 8 1 15 14 + 11 hc-c2-na-hn 8 1 15 24 + 12 c3-c2-na-c2 2 1 15 14 + 13 c3-c2-na-hn 2 1 15 24 + 14 hc-c2-na-c2 7 1 15 14 + 15 hc-c2-na-hn 7 1 15 24 + 16 oc-c2-c3-c2 6 3 2 1 + 17 hc-c2-c3-c2 10 3 2 1 + 18 hc-c2-c3-c2 11 3 2 1 + 19 oc-c2-c3-hc 6 3 2 9 + 20 hc-c2-c3-hc 10 3 2 9 + 21 hc-c2-c3-hc 11 3 2 9 + 22 oc-c2-c3-oc 6 3 2 4 + 23 hc-c2-c3-oc 10 3 2 4 + 24 hc-c2-c3-oc 11 3 2 4 + 25 c2-c3-oc-ho 1 2 4 25 + 26 c2-c3-oc-ho 3 2 4 25 + 27 hc-c3-oc-ho 9 2 4 25 + 28 c3-c2-oc-cp 2 3 6 5 + 29 hc-c2-oc-cp 10 3 6 5 + 30 hc-c2-oc-cp 11 3 6 5 + 31 c2-c2-na-c2 14 13 12 18 + 32 hc-c2-na-c2 20 13 12 18 + 33 hc-c2-na-c2 21 13 12 18 + 34 c2-c2-na-hn 14 13 12 19 + 35 hc-c2-na-hn 20 13 12 19 + 36 hc-c2-na-hn 21 13 12 19 + 37 c2-c2-na-c2 17 18 12 13 + 38 hc-c2-na-c2 30 18 12 13 + 39 hc-c2-na-c2 31 18 12 13 + 40 c2-c2-na-hn 17 18 12 19 + 41 hc-c2-na-hn 30 18 12 19 + 42 hc-c2-na-hn 31 18 12 19 + 43 na-c2-c2-na 12 13 14 15 + 44 hc-c2-c2-na 22 14 13 12 + 45 hc-c2-c2-na 23 14 13 12 + 46 hc-c2-c2-na 20 13 14 15 + 47 hc-c2-c2-hc 20 13 14 22 + 48 hc-c2-c2-hc 20 13 14 23 + 49 hc-c2-c2-na 21 13 14 15 + 50 hc-c2-c2-hc 21 13 14 22 + 51 hc-c2-c2-hc 21 13 14 23 + 52 c2-c2-na-c2 13 14 15 1 + 53 c2-c2-na-hn 13 14 15 24 + 54 hc-c2-na-c2 22 14 15 1 + 55 hc-c2-na-hn 22 14 15 24 + 56 hc-c2-na-c2 23 14 15 1 + 57 hc-c2-na-hn 23 14 15 24 + 58 c2-c2-na-hn 18 17 16 26 + 59 hc-c2-na-hn 28 17 16 26 + 60 hc-c2-na-hn 29 17 16 26 + 61 c2-c2-na-hn 18 17 16 27 + 62 hc-c2-na-hn 28 17 16 27 + 63 hc-c2-na-hn 29 17 16 27 + 64 na-c2-c2-na 16 17 18 12 + 65 hc-c2-c2-na 30 18 17 16 + 66 hc-c2-c2-na 31 18 17 16 + 67 hc-c2-c2-na 28 17 18 12 + 68 hc-c2-c2-hc 28 17 18 30 + 69 hc-c2-c2-hc 28 17 18 31 + 70 hc-c2-c2-na 29 17 18 12 + 71 hc-c2-c2-hc 29 17 18 30 + 72 hc-c2-c2-hc 29 17 18 31 + +Impropers + + 1 c2-na-c2-hn 13 12 18 19 + 2 c2-na-c2-hn 1 15 14 24 + 3 c2-na-hn-hn 17 16 26 27 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_post.data_template b/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_post.data_template deleted file mode 100644 index 0600abdc0c..0000000000 --- a/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_post.data_template +++ /dev/null @@ -1,424 +0,0 @@ -rxn2_stp1_post - -42 atoms -41 bonds -75 angles -108 dihedrals -46 impropers - -Types - -1 1 -2 6 -3 1 -4 7 -5 4 -6 7 -7 8 -8 8 -9 8 -10 8 -11 8 -12 9 -13 1 -14 1 -15 9 -16 9 -17 1 -18 1 -19 10 -20 8 -21 8 -22 8 -23 8 -24 10 -25 11 -26 10 -27 10 -28 8 -29 8 -30 8 -31 8 -32 1 -33 6 -34 1 -35 7 -36 4 -37 7 -38 8 -39 8 -40 8 -41 8 -42 8 - -Charges - -1 0.000000 -2 0.000000 -3 0.000000 -4 0.100000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.000000 -11 0.000000 -12 0.000000 -13 0.000000 -14 0.000000 -15 -0.025000 -16 -0.025000 -17 0.000000 -18 0.000000 -19 0.000000 -20 0.000000 -21 0.000000 -22 0.000000 -23 0.000000 -24 0.000000 -25 0.000000 -26 0.000000 -27 0.000000 -28 0.000000 -29 0.000000 -30 0.000000 -31 0.000000 -32 0.000000 -33 0.000000 -34 0.000000 -35 0.100000 -36 0.000000 -37 0.000000 -38 0.000000 -39 0.000000 -40 0.000000 -41 0.000000 -42 0.000000 - -Coords - -1 19.846411 9.569080 -1.229960 -2 21.168550 9.331390 -0.418120 -3 21.253010 8.067940 0.460720 -4 21.330839 10.304280 -0.253340 -5 21.891689 5.906200 0.464150 -6 21.818470 6.999870 -0.296270 -7 19.931601 10.026600 -2.215510 -8 19.051279 8.828540 -1.132880 -9 22.228800 9.293580 -0.665280 -10 21.880541 8.270810 1.328060 -11 20.253151 7.789050 0.792640 -12 16.072720 12.338940 -0.174630 -13 16.557051 11.130580 0.587500 -14 18.074381 10.998730 0.366590 -15 18.354031 10.832100 -1.107140 -16 14.920880 15.018100 -0.201130 -17 16.390551 14.791140 -0.461060 -18 16.852989 13.538490 0.304530 -19 16.264271 12.190330 -1.257620 -20 16.025061 10.195290 0.210910 -21 16.346741 11.269890 1.698950 -22 18.466690 10.092460 0.935470 -23 18.592319 11.941150 0.745170 -24 17.213690 10.780300 -1.896260 -25 20.881861 11.302060 -0.773030 -26 14.344180 14.136430 -0.550280 -27 14.583670 15.922830 -0.748110 -28 16.984310 15.696060 -0.103470 -29 16.562460 14.639560 -1.577590 -30 16.674610 13.686010 1.420370 -31 17.964001 13.363150 0.117750 -32 18.680189 9.134390 -4.183100 -33 18.099751 8.263650 -5.343000 -34 19.081829 7.609610 -6.334180 -35 17.971729 9.827680 -5.367080 -36 20.263880 5.733600 -6.736780 -37 19.414030 6.299980 -5.878960 -38 18.194740 9.091640 -3.210950 -39 19.788940 9.208560 -4.119640 -40 17.399309 7.432220 -5.407800 -41 18.616249 7.545570 -7.316910 -42 19.987049 8.212500 -6.399400 - -Bonds - -1 1 1 8 -2 16 1 2 -3 1 1 7 -4 13 1 15 -5 16 3 2 -6 12 2 9 -7 17 2 4 -8 3 3 6 -9 1 3 10 -10 1 3 11 -11 18 4 25 -12 8 6 5 -13 13 13 12 -14 13 18 12 -15 14 12 19 -16 15 13 14 -17 1 13 20 -18 1 13 21 -19 13 14 15 -20 1 14 22 -21 1 14 23 -22 14 15 24 -23 13 32 15 -24 13 17 16 -25 14 16 26 -26 14 16 27 -27 15 17 18 -28 1 17 28 -29 1 17 29 -30 1 18 30 -31 1 18 31 -32 1 32 39 -33 16 32 33 -34 1 32 38 -35 17 33 35 -36 16 34 33 -37 12 33 40 -38 3 34 37 -39 1 34 41 -40 1 34 42 -41 8 37 36 - -Angles - -1 30 2 1 8 -2 2 8 1 7 -3 26 8 1 15 -4 30 2 1 7 -5 31 2 1 15 -6 26 7 1 15 -7 32 1 2 3 -8 33 1 2 9 -9 34 1 2 4 -10 33 3 2 9 -11 34 3 2 4 -12 35 4 2 9 -13 36 2 3 6 -14 30 2 3 10 -15 30 2 3 11 -16 3 6 3 10 -17 3 6 3 11 -18 2 10 3 11 -19 37 2 4 25 -20 22 3 6 5 -21 23 13 12 18 -22 24 13 12 19 -23 24 18 12 19 -24 25 14 13 12 -25 26 20 13 12 -26 26 21 13 12 -27 27 14 13 20 -28 27 14 13 21 -29 2 20 13 21 -30 25 13 14 15 -31 27 13 14 22 -32 27 13 14 23 -33 26 22 14 15 -34 26 23 14 15 -35 2 22 14 23 -36 23 1 15 14 -37 24 1 15 24 -38 23 1 15 32 -39 24 14 15 24 -40 23 14 15 32 -41 24 32 15 24 -42 24 17 16 26 -43 24 17 16 27 -44 28 26 16 27 -45 25 18 17 16 -46 26 28 17 16 -47 26 29 17 16 -48 27 18 17 28 -49 27 18 17 29 -50 2 28 17 29 -51 25 17 18 12 -52 26 30 18 12 -53 26 31 18 12 -54 27 17 18 30 -55 27 17 18 31 -56 2 30 18 31 -57 26 39 32 15 -58 31 33 32 15 -59 26 38 32 15 -60 30 33 32 39 -61 2 39 32 38 -62 30 33 32 38 -63 34 32 33 35 -64 32 32 33 34 -65 33 32 33 40 -66 34 34 33 35 -67 35 35 33 40 -68 33 34 33 40 -69 36 33 34 37 -70 30 33 34 41 -71 30 33 34 42 -72 3 37 34 41 -73 3 37 34 42 -74 2 41 34 42 -75 22 34 37 36 - -Dihedrals - -1 40 8 1 2 3 -2 41 8 1 2 9 -3 42 8 1 2 4 -4 40 7 1 2 3 -5 41 7 1 2 9 -6 42 7 1 2 4 -7 43 15 1 2 3 -8 44 15 1 2 9 -9 45 15 1 2 4 -10 28 8 1 15 14 -11 30 8 1 15 24 -12 28 8 1 15 32 -13 46 2 1 15 14 -14 47 2 1 15 24 -15 46 2 1 15 32 -16 28 7 1 15 14 -17 30 7 1 15 24 -18 28 7 1 15 32 -19 48 6 3 2 1 -20 40 10 3 2 1 -21 40 11 3 2 1 -22 49 6 3 2 9 -23 41 10 3 2 9 -24 41 11 3 2 9 -25 50 6 3 2 4 -26 42 10 3 2 4 -27 42 11 3 2 4 -28 52 1 2 4 25 -29 52 3 2 4 25 -30 53 9 2 4 25 -31 51 2 3 6 5 -32 7 10 3 6 5 -33 7 11 3 6 5 -34 27 14 13 12 18 -35 28 20 13 12 18 -36 28 21 13 12 18 -37 29 14 13 12 19 -38 30 20 13 12 19 -39 30 21 13 12 19 -40 27 17 18 12 13 -41 28 30 18 12 13 -42 28 31 18 12 13 -43 29 17 18 12 19 -44 30 30 18 12 19 -45 30 31 18 12 19 -46 31 12 13 14 15 -47 32 22 14 13 12 -48 32 23 14 13 12 -49 32 20 13 14 15 -50 33 20 13 14 22 -51 33 20 13 14 23 -52 32 21 13 14 15 -53 33 21 13 14 22 -54 33 21 13 14 23 -55 27 13 14 15 1 -56 29 13 14 15 24 -57 27 13 14 15 32 -58 28 22 14 15 1 -59 30 22 14 15 24 -60 28 22 14 15 32 -61 28 23 14 15 1 -62 30 23 14 15 24 -63 28 23 14 15 32 -64 28 39 32 15 1 -65 46 33 32 15 1 -66 28 38 32 15 1 -67 28 39 32 15 14 -68 46 33 32 15 14 -69 28 38 32 15 14 -70 30 39 32 15 24 -71 47 33 32 15 24 -72 30 38 32 15 24 -73 29 18 17 16 26 -74 30 28 17 16 26 -75 30 29 17 16 26 -76 29 18 17 16 27 -77 30 28 17 16 27 -78 30 29 17 16 27 -79 31 16 17 18 12 -80 32 30 18 17 16 -81 32 31 18 17 16 -82 32 28 17 18 12 -83 33 28 17 18 30 -84 33 28 17 18 31 -85 32 29 17 18 12 -86 33 29 17 18 30 -87 33 29 17 18 31 -88 45 15 32 33 35 -89 43 15 32 33 34 -90 44 15 32 33 40 -91 42 39 32 33 35 -92 40 39 32 33 34 -93 41 39 32 33 40 -94 42 38 32 33 35 -95 40 38 32 33 34 -96 41 38 32 33 40 -97 48 37 34 33 32 -98 40 41 34 33 32 -99 40 42 34 33 32 -100 50 37 34 33 35 -101 42 41 34 33 35 -102 42 42 34 33 35 -103 49 37 34 33 40 -104 41 41 34 33 40 -105 41 42 34 33 40 -106 51 33 34 37 36 -107 7 41 34 37 36 -108 7 42 34 37 36 - -Impropers - -1 4 13 12 18 19 -2 5 17 16 26 27 -3 1 2 1 8 7 -4 1 2 1 8 15 -5 1 8 1 7 15 -6 1 2 1 7 15 -7 1 1 2 3 9 -8 1 1 2 3 4 -9 1 1 2 4 9 -10 1 3 2 4 9 -11 1 2 3 6 10 -12 1 2 3 6 11 -13 1 2 3 10 11 -14 1 6 3 10 11 -15 1 14 13 20 12 -16 1 14 13 21 12 -17 1 20 13 21 12 -18 1 14 13 20 21 -19 1 13 14 22 15 -20 1 13 14 23 15 -21 1 13 14 22 23 -22 1 22 14 23 15 -23 1 1 15 14 24 -24 1 1 15 14 32 -25 1 1 15 32 24 -26 1 14 15 32 24 -27 1 18 17 28 16 -28 1 18 17 29 16 -29 1 28 17 29 16 -30 1 18 17 28 29 -31 1 17 18 30 12 -32 1 17 18 31 12 -33 1 30 18 31 12 -34 1 17 18 30 31 -35 1 33 32 39 15 -36 1 39 32 38 15 -37 1 33 32 38 15 -38 1 33 32 39 38 -39 1 32 33 34 35 -40 1 32 33 35 40 -41 1 32 33 34 40 -42 1 34 33 35 40 -43 1 33 34 37 41 -44 1 33 34 37 42 -45 1 33 34 41 42 -46 1 37 34 41 42 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_post.molecule_template b/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_post.molecule_template new file mode 100644 index 0000000000..4d5faa82b4 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_post.molecule_template @@ -0,0 +1,425 @@ +rxn2_stp1_post + + 42 atoms + 41 bonds + 75 angles + 108 dihedrals + 2 impropers + +Coords + + 1 19.846410751 9.569080353 -1.229959965 + 2 21.168550491 9.331390381 -0.418119997 + 3 21.253009796 8.067939758 0.460720003 + 4 21.330839157 10.304280281 -0.253340006 + 5 21.891689301 5.906199932 0.464150012 + 6 21.818470001 6.999869823 -0.296270013 + 7 19.931600571 10.026599884 -2.215509892 + 8 19.051279068 8.828539848 -1.132879972 + 9 22.228799820 9.293580055 -0.665279984 + 10 21.880540848 8.270810127 1.328060031 + 11 20.253150940 7.789050102 0.792639971 + 12 16.072719574 12.338939667 -0.174630001 + 13 16.557050705 11.130579948 0.587499976 + 14 18.074380875 10.998729706 0.366589993 + 15 18.354030609 10.832099915 -1.107139945 + 16 14.920880318 15.018099785 -0.201130003 + 17 16.390550613 14.791139603 -0.461059988 + 18 16.852989197 13.538490295 0.304529995 + 19 16.264270782 12.190329552 -1.257619977 + 20 16.025060654 10.195289612 0.210910007 + 21 16.346740723 11.269889832 1.698950052 + 22 18.466690063 10.092459679 0.935469985 + 23 18.592319489 11.941149712 0.745169997 + 24 17.213689804 10.780300140 -1.896260023 + 25 20.881860733 11.302060127 -0.773029983 + 26 14.344180107 14.136429787 -0.550279975 + 27 14.583669662 15.922829628 -0.748109996 + 28 16.984310150 15.696060181 -0.103469998 + 29 16.562459946 14.639559746 -1.577589989 + 30 16.674610138 13.686010361 1.420369983 + 31 17.964000702 13.363149643 0.117749996 + 32 18.680189133 9.134389877 -4.183100224 + 33 18.099750519 8.263649940 -5.342999935 + 34 19.081829071 7.609610081 -6.334179878 + 35 17.971729279 9.827679634 -5.367080212 + 36 20.263879776 5.733600140 -6.736780167 + 37 19.414030075 6.299980164 -5.878960133 + 38 18.194740295 9.091640472 -3.210949898 + 39 19.788940430 9.208559990 -4.119639874 + 40 17.399309158 7.432219982 -5.407800198 + 41 18.616249084 7.545569897 -7.316909790 + 42 19.987049103 8.212499619 -6.399400234 + +Types + + 1 c2 + 2 c3 + 3 c2 + 4 oc + 5 cp + 6 oc + 7 hc + 8 hc + 9 hc + 10 hc + 11 hc + 12 na + 13 c2 + 14 c2 + 15 na + 16 na + 17 c2 + 18 c2 + 19 hn + 20 hc + 21 hc + 22 hc + 23 hc + 24 hn + 25 ho + 26 hn + 27 hn + 28 hc + 29 hc + 30 hc + 31 hc + 32 c2 + 33 c3 + 34 c2 + 35 oc + 36 cp + 37 oc + 38 hc + 39 hc + 40 hc + 41 hc + 42 hc + +Charges + + 1 0.000000 + 2 0.000000 + 3 0.000000 + 4 0.100000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.000000 + 11 0.000000 + 12 0.000000 + 13 0.000000 + 14 0.000000 + 15 -0.025000 + 16 -0.025000 + 17 0.000000 + 18 0.000000 + 19 0.000000 + 20 0.000000 + 21 0.000000 + 22 0.000000 + 23 0.000000 + 24 0.000000 + 25 0.000000 + 26 0.000000 + 27 0.000000 + 28 0.000000 + 29 0.000000 + 30 0.000000 + 31 0.000000 + 32 0.000000 + 33 0.000000 + 34 0.000000 + 35 0.100000 + 36 0.000000 + 37 0.000000 + 38 0.000000 + 39 0.000000 + 40 0.000000 + 41 0.000000 + 42 0.000000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + 32 1 + 33 1 + 34 1 + 35 1 + 36 1 + 37 1 + 38 1 + 39 1 + 40 1 + 41 1 + 42 1 + +Bonds + + 1 c2-hc 1 8 + 2 c2-c3 1 2 + 3 c2-hc 1 7 + 4 c2-na 1 15 + 5 c2-c3 3 2 + 6 c3-hc 2 9 + 7 c3-oc 2 4 + 8 c2-oc 3 6 + 9 c2-hc 3 10 + 10 c2-hc 3 11 + 11 oc-ho 4 25 + 12 cp-oc 6 5 + 13 c2-na 13 12 + 14 c2-na 18 12 + 15 na-hn 12 19 + 16 c2-c2 13 14 + 17 c2-hc 13 20 + 18 c2-hc 13 21 + 19 c2-na 14 15 + 20 c2-hc 14 22 + 21 c2-hc 14 23 + 22 na-hn 15 24 + 23 c2-na 32 15 + 24 c2-na 17 16 + 25 na-hn 16 26 + 26 na-hn 16 27 + 27 c2-c2 17 18 + 28 c2-hc 17 28 + 29 c2-hc 17 29 + 30 c2-hc 18 30 + 31 c2-hc 18 31 + 32 c2-hc 32 39 + 33 c2-c3 32 33 + 34 c2-hc 32 38 + 35 c3-oc 33 35 + 36 c2-c3 34 33 + 37 c3-hc 33 40 + 38 c2-oc 34 37 + 39 c2-hc 34 41 + 40 c2-hc 34 42 + 41 cp-oc 37 36 + +Angles + + 1 c3-c2-hc 2 1 8 + 2 hc-c2-hc 8 1 7 + 3 hc-c2-na 8 1 15 + 4 c3-c2-hc 2 1 7 + 5 c3-c2-na 2 1 15 + 6 hc-c2-na 7 1 15 + 7 c2-c3-c2 1 2 3 + 8 c2-c3-hc 1 2 9 + 9 c2-c3-oc 1 2 4 + 10 c2-c3-hc 3 2 9 + 11 c2-c3-oc 3 2 4 + 12 oc-c3-hc 4 2 9 + 13 c3-c2-oc 2 3 6 + 14 c3-c2-hc 2 3 10 + 15 c3-c2-hc 2 3 11 + 16 oc-c2-hc 6 3 10 + 17 oc-c2-hc 6 3 11 + 18 hc-c2-hc 10 3 11 + 19 c3-oc-ho 2 4 25 + 20 c2-oc-cp 3 6 5 + 21 c2-na-c2 13 12 18 + 22 c2-na-hn 13 12 19 + 23 c2-na-hn 18 12 19 + 24 c2-c2-na 14 13 12 + 25 hc-c2-na 20 13 12 + 26 hc-c2-na 21 13 12 + 27 c2-c2-hc 14 13 20 + 28 c2-c2-hc 14 13 21 + 29 hc-c2-hc 20 13 21 + 30 c2-c2-na 13 14 15 + 31 c2-c2-hc 13 14 22 + 32 c2-c2-hc 13 14 23 + 33 hc-c2-na 22 14 15 + 34 hc-c2-na 23 14 15 + 35 hc-c2-hc 22 14 23 + 36 c2-na-c2 1 15 14 + 37 c2-na-hn 1 15 24 + 38 c2-na-c2 1 15 32 + 39 c2-na-hn 14 15 24 + 40 c2-na-c2 14 15 32 + 41 c2-na-hn 32 15 24 + 42 c2-na-hn 17 16 26 + 43 c2-na-hn 17 16 27 + 44 hn-na-hn 26 16 27 + 45 c2-c2-na 18 17 16 + 46 hc-c2-na 28 17 16 + 47 hc-c2-na 29 17 16 + 48 c2-c2-hc 18 17 28 + 49 c2-c2-hc 18 17 29 + 50 hc-c2-hc 28 17 29 + 51 c2-c2-na 17 18 12 + 52 hc-c2-na 30 18 12 + 53 hc-c2-na 31 18 12 + 54 c2-c2-hc 17 18 30 + 55 c2-c2-hc 17 18 31 + 56 hc-c2-hc 30 18 31 + 57 hc-c2-na 39 32 15 + 58 c3-c2-na 33 32 15 + 59 hc-c2-na 38 32 15 + 60 c3-c2-hc 33 32 39 + 61 hc-c2-hc 39 32 38 + 62 c3-c2-hc 33 32 38 + 63 c2-c3-oc 32 33 35 + 64 c2-c3-c2 32 33 34 + 65 c2-c3-hc 32 33 40 + 66 c2-c3-oc 34 33 35 + 67 oc-c3-hc 35 33 40 + 68 c2-c3-hc 34 33 40 + 69 c3-c2-oc 33 34 37 + 70 c3-c2-hc 33 34 41 + 71 c3-c2-hc 33 34 42 + 72 oc-c2-hc 37 34 41 + 73 oc-c2-hc 37 34 42 + 74 hc-c2-hc 41 34 42 + 75 c2-oc-cp 34 37 36 + +Dihedrals + + 1 hc-c2-c3-c2 8 1 2 3 + 2 hc-c2-c3-hc 8 1 2 9 + 3 hc-c2-c3-oc 8 1 2 4 + 4 hc-c2-c3-c2 7 1 2 3 + 5 hc-c2-c3-hc 7 1 2 9 + 6 hc-c2-c3-oc 7 1 2 4 + 7 na-c2-c3-c2 15 1 2 3 + 8 na-c2-c3-hc 15 1 2 9 + 9 na-c2-c3-oc 15 1 2 4 + 10 hc-c2-na-c2 8 1 15 14 + 11 hc-c2-na-hn 8 1 15 24 + 12 hc-c2-na-c2 8 1 15 32 + 13 c3-c2-na-c2 2 1 15 14 + 14 c3-c2-na-hn 2 1 15 24 + 15 c3-c2-na-c2 2 1 15 32 + 16 hc-c2-na-c2 7 1 15 14 + 17 hc-c2-na-hn 7 1 15 24 + 18 hc-c2-na-c2 7 1 15 32 + 19 oc-c2-c3-c2 6 3 2 1 + 20 hc-c2-c3-c2 10 3 2 1 + 21 hc-c2-c3-c2 11 3 2 1 + 22 oc-c2-c3-hc 6 3 2 9 + 23 hc-c2-c3-hc 10 3 2 9 + 24 hc-c2-c3-hc 11 3 2 9 + 25 oc-c2-c3-oc 6 3 2 4 + 26 hc-c2-c3-oc 10 3 2 4 + 27 hc-c2-c3-oc 11 3 2 4 + 28 c2-c3-oc-ho 1 2 4 25 + 29 c2-c3-oc-ho 3 2 4 25 + 30 hc-c3-oc-ho 9 2 4 25 + 31 c3-c2-oc-cp 2 3 6 5 + 32 hc-c2-oc-cp 10 3 6 5 + 33 hc-c2-oc-cp 11 3 6 5 + 34 c2-c2-na-c2 14 13 12 18 + 35 hc-c2-na-c2 20 13 12 18 + 36 hc-c2-na-c2 21 13 12 18 + 37 c2-c2-na-hn 14 13 12 19 + 38 hc-c2-na-hn 20 13 12 19 + 39 hc-c2-na-hn 21 13 12 19 + 40 c2-c2-na-c2 17 18 12 13 + 41 hc-c2-na-c2 30 18 12 13 + 42 hc-c2-na-c2 31 18 12 13 + 43 c2-c2-na-hn 17 18 12 19 + 44 hc-c2-na-hn 30 18 12 19 + 45 hc-c2-na-hn 31 18 12 19 + 46 na-c2-c2-na 12 13 14 15 + 47 hc-c2-c2-na 22 14 13 12 + 48 hc-c2-c2-na 23 14 13 12 + 49 hc-c2-c2-na 20 13 14 15 + 50 hc-c2-c2-hc 20 13 14 22 + 51 hc-c2-c2-hc 20 13 14 23 + 52 hc-c2-c2-na 21 13 14 15 + 53 hc-c2-c2-hc 21 13 14 22 + 54 hc-c2-c2-hc 21 13 14 23 + 55 c2-c2-na-c2 13 14 15 1 + 56 c2-c2-na-hn 13 14 15 24 + 57 c2-c2-na-c2 13 14 15 32 + 58 hc-c2-na-c2 22 14 15 1 + 59 hc-c2-na-hn 22 14 15 24 + 60 hc-c2-na-c2 22 14 15 32 + 61 hc-c2-na-c2 23 14 15 1 + 62 hc-c2-na-hn 23 14 15 24 + 63 hc-c2-na-c2 23 14 15 32 + 64 hc-c2-na-c2 39 32 15 1 + 65 c3-c2-na-c2 33 32 15 1 + 66 hc-c2-na-c2 38 32 15 1 + 67 hc-c2-na-c2 39 32 15 14 + 68 c3-c2-na-c2 33 32 15 14 + 69 hc-c2-na-c2 38 32 15 14 + 70 hc-c2-na-hn 39 32 15 24 + 71 c3-c2-na-hn 33 32 15 24 + 72 hc-c2-na-hn 38 32 15 24 + 73 c2-c2-na-hn 18 17 16 26 + 74 hc-c2-na-hn 28 17 16 26 + 75 hc-c2-na-hn 29 17 16 26 + 76 c2-c2-na-hn 18 17 16 27 + 77 hc-c2-na-hn 28 17 16 27 + 78 hc-c2-na-hn 29 17 16 27 + 79 na-c2-c2-na 16 17 18 12 + 80 hc-c2-c2-na 30 18 17 16 + 81 hc-c2-c2-na 31 18 17 16 + 82 hc-c2-c2-na 28 17 18 12 + 83 hc-c2-c2-hc 28 17 18 30 + 84 hc-c2-c2-hc 28 17 18 31 + 85 hc-c2-c2-na 29 17 18 12 + 86 hc-c2-c2-hc 29 17 18 30 + 87 hc-c2-c2-hc 29 17 18 31 + 88 na-c2-c3-oc 15 32 33 35 + 89 na-c2-c3-c2 15 32 33 34 + 90 na-c2-c3-hc 15 32 33 40 + 91 hc-c2-c3-oc 39 32 33 35 + 92 hc-c2-c3-c2 39 32 33 34 + 93 hc-c2-c3-hc 39 32 33 40 + 94 hc-c2-c3-oc 38 32 33 35 + 95 hc-c2-c3-c2 38 32 33 34 + 96 hc-c2-c3-hc 38 32 33 40 + 97 oc-c2-c3-c2 37 34 33 32 + 98 hc-c2-c3-c2 41 34 33 32 + 99 hc-c2-c3-c2 42 34 33 32 + 100 oc-c2-c3-oc 37 34 33 35 + 101 hc-c2-c3-oc 41 34 33 35 + 102 hc-c2-c3-oc 42 34 33 35 + 103 oc-c2-c3-hc 37 34 33 40 + 104 hc-c2-c3-hc 41 34 33 40 + 105 hc-c2-c3-hc 42 34 33 40 + 106 c3-c2-oc-cp 33 34 37 36 + 107 hc-c2-oc-cp 41 34 37 36 + 108 hc-c2-oc-cp 42 34 37 36 + +Impropers + + 1 c2-na-c2-hn 13 12 18 19 + 2 c2-na-hn-hn 17 16 26 27 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_pre.data_template b/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_pre.data_template deleted file mode 100644 index 9ee4ffb2de..0000000000 --- a/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_pre.data_template +++ /dev/null @@ -1,407 +0,0 @@ -rxn2_stp1_pre - -42 atoms -41 bonds -73 angles -96 dihedrals -43 impropers - -Types - -1 1 -2 6 -3 1 -4 7 -5 4 -6 7 -7 8 -8 8 -9 8 -10 8 -11 8 -12 9 -13 1 -14 1 -15 9 -16 9 -17 1 -18 1 -19 10 -20 8 -21 8 -22 8 -23 8 -24 10 -25 11 -26 10 -27 10 -28 8 -29 8 -30 8 -31 8 -32 2 -33 2 -34 1 -35 3 -36 4 -37 7 -38 8 -39 8 -40 8 -41 8 -42 8 - -Charges - -1 0.000000 -2 0.000000 -3 0.000000 -4 0.100000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.000000 -11 0.000000 -12 0.000000 -13 0.000000 -14 0.000000 -15 -0.025000 -16 -0.025000 -17 0.000000 -18 0.000000 -19 0.000000 -20 0.000000 -21 0.000000 -22 0.000000 -23 0.000000 -24 0.000000 -25 0.000000 -26 0.000000 -27 0.000000 -28 0.000000 -29 0.000000 -30 0.000000 -31 0.000000 -32 0.000000 -33 0.000000 -34 0.000000 -35 0.100000 -36 0.000000 -37 0.000000 -38 0.000000 -39 0.000000 -40 0.000000 -41 0.000000 -42 0.000000 - -Coords - -1 19.846411 9.569080 -1.229960 -2 21.168550 9.331390 -0.418120 -3 21.253010 8.067940 0.460720 -4 21.330839 10.304280 -0.253340 -5 21.891689 5.906200 0.464150 -6 21.818470 6.999870 -0.296270 -7 19.931601 10.026600 -2.215510 -8 19.051279 8.828540 -1.132880 -9 22.228800 9.293580 -0.665280 -10 21.880541 8.270810 1.328060 -11 20.253151 7.789050 0.792640 -12 16.072720 12.338940 -0.174630 -13 16.557051 11.130580 0.587500 -14 18.074381 10.998730 0.366590 -15 18.354031 10.832100 -1.107140 -16 14.920880 15.018100 -0.201130 -17 16.390551 14.791140 -0.461060 -18 16.852989 13.538490 0.304530 -19 16.264271 12.190330 -1.257620 -20 16.025061 10.195290 0.210910 -21 16.346741 11.269890 1.698950 -22 18.466690 10.092460 0.935470 -23 18.592319 11.941150 0.745170 -24 17.213690 10.780300 -1.896260 -25 20.881861 11.302060 -0.773030 -26 14.344180 14.136430 -0.550280 -27 14.583670 15.922830 -0.748110 -28 16.984310 15.696060 -0.103470 -29 16.562460 14.639560 -1.577590 -30 16.674610 13.686010 1.420370 -31 17.964001 13.363150 0.117750 -32 18.703360 9.118830 -4.174240 -33 18.099751 8.263650 -5.343000 -34 19.081829 7.609610 -6.334180 -35 17.971729 9.827680 -5.367080 -36 20.263880 5.733600 -6.736780 -37 19.414030 6.299980 -5.878960 -38 18.194740 9.091640 -3.210950 -39 19.788940 9.208560 -4.119640 -40 17.399309 7.432220 -5.407800 -41 18.616249 7.545570 -7.316910 -42 19.987049 8.212500 -6.399400 - -Bonds - -1 1 1 8 -2 16 1 2 -3 1 1 7 -4 13 1 15 -5 16 3 2 -6 12 2 9 -7 17 2 4 -8 3 3 6 -9 1 3 10 -10 1 3 11 -11 18 4 25 -12 8 6 5 -13 13 13 12 -14 13 18 12 -15 14 12 19 -16 15 13 14 -17 1 13 20 -18 1 13 21 -19 13 14 15 -20 1 14 22 -21 1 14 23 -22 14 15 24 -23 13 17 16 -24 14 16 26 -25 14 16 27 -26 15 17 18 -27 1 17 28 -28 1 17 29 -29 1 18 30 -30 1 18 31 -31 6 39 32 -32 4 32 35 -33 5 32 33 -34 6 38 32 -35 4 33 35 -36 2 34 33 -37 6 40 33 -38 3 34 37 -39 1 34 41 -40 1 34 42 -41 8 37 36 - -Angles - -1 30 2 1 8 -2 2 8 1 7 -3 26 8 1 15 -4 30 2 1 7 -5 31 2 1 15 -6 26 7 1 15 -7 32 1 2 3 -8 33 1 2 9 -9 34 1 2 4 -10 33 3 2 9 -11 34 3 2 4 -12 35 4 2 9 -13 36 2 3 6 -14 30 2 3 10 -15 30 2 3 11 -16 3 6 3 10 -17 3 6 3 11 -18 2 10 3 11 -19 37 2 4 25 -20 22 3 6 5 -21 23 13 12 18 -22 24 13 12 19 -23 24 18 12 19 -24 25 14 13 12 -25 26 20 13 12 -26 26 21 13 12 -27 27 14 13 20 -28 27 14 13 21 -29 2 20 13 21 -30 25 13 14 15 -31 27 13 14 22 -32 27 13 14 23 -33 26 22 14 15 -34 26 23 14 15 -35 2 22 14 23 -36 23 1 15 14 -37 24 1 15 24 -38 24 14 15 24 -39 24 17 16 26 -40 24 17 16 27 -41 28 26 16 27 -42 25 18 17 16 -43 26 28 17 16 -44 26 29 17 16 -45 27 18 17 28 -46 27 18 17 29 -47 2 28 17 29 -48 25 17 18 12 -49 26 30 18 12 -50 26 31 18 12 -51 27 17 18 30 -52 27 17 18 31 -53 2 30 18 31 -54 38 39 32 35 -55 39 39 32 33 -56 11 39 32 38 -57 8 33 32 35 -58 38 38 32 35 -59 39 38 32 33 -60 8 32 33 35 -61 6 34 33 32 -62 39 40 33 32 -63 5 34 33 35 -64 38 40 33 35 -65 7 34 33 40 -66 40 37 34 33 -67 41 41 34 33 -68 41 42 34 33 -69 3 37 34 41 -70 3 37 34 42 -71 2 41 34 42 -72 12 32 35 33 -73 22 34 37 36 - -Dihedrals - -1 40 8 1 2 3 -2 41 8 1 2 9 -3 42 8 1 2 4 -4 40 7 1 2 3 -5 41 7 1 2 9 -6 42 7 1 2 4 -7 43 15 1 2 3 -8 44 15 1 2 9 -9 45 15 1 2 4 -10 28 8 1 15 14 -11 30 8 1 15 24 -12 46 2 1 15 14 -13 47 2 1 15 24 -14 28 7 1 15 14 -15 30 7 1 15 24 -16 48 6 3 2 1 -17 40 10 3 2 1 -18 40 11 3 2 1 -19 49 6 3 2 9 -20 41 10 3 2 9 -21 41 11 3 2 9 -22 50 6 3 2 4 -23 42 10 3 2 4 -24 42 11 3 2 4 -25 52 1 2 4 25 -26 52 3 2 4 25 -27 53 9 2 4 25 -28 51 2 3 6 5 -29 7 10 3 6 5 -30 7 11 3 6 5 -31 27 14 13 12 18 -32 28 20 13 12 18 -33 28 21 13 12 18 -34 29 14 13 12 19 -35 30 20 13 12 19 -36 30 21 13 12 19 -37 27 17 18 12 13 -38 28 30 18 12 13 -39 28 31 18 12 13 -40 29 17 18 12 19 -41 30 30 18 12 19 -42 30 31 18 12 19 -43 31 12 13 14 15 -44 32 22 14 13 12 -45 32 23 14 13 12 -46 32 20 13 14 15 -47 33 20 13 14 22 -48 33 20 13 14 23 -49 32 21 13 14 15 -50 33 21 13 14 22 -51 33 21 13 14 23 -52 27 13 14 15 1 -53 29 13 14 15 24 -54 28 22 14 15 1 -55 30 22 14 15 24 -56 28 23 14 15 1 -57 30 23 14 15 24 -58 29 18 17 16 26 -59 30 28 17 16 26 -60 30 29 17 16 26 -61 29 18 17 16 27 -62 30 28 17 16 27 -63 30 29 17 16 27 -64 31 16 17 18 12 -65 32 30 18 17 16 -66 32 31 18 17 16 -67 32 28 17 18 12 -68 33 28 17 18 30 -69 33 28 17 18 31 -70 32 29 17 18 12 -71 33 29 17 18 30 -72 33 29 17 18 31 -73 10 39 32 35 33 -74 10 38 32 35 33 -75 54 39 32 33 35 -76 12 34 33 32 39 -77 14 39 32 33 40 -78 11 34 33 32 35 -79 54 40 33 32 35 -80 54 38 32 33 35 -81 12 34 33 32 38 -82 14 38 32 33 40 -83 9 34 33 35 32 -84 10 40 33 35 32 -85 5 37 34 33 32 -86 2 41 34 33 32 -87 2 42 34 33 32 -88 4 37 34 33 35 -89 1 41 34 33 35 -90 1 42 34 33 35 -91 6 37 34 33 40 -92 3 41 34 33 40 -93 3 42 34 33 40 -94 8 33 34 37 36 -95 7 41 34 37 36 -96 7 42 34 37 36 - -Impropers - -1 4 13 12 18 19 -2 4 1 15 14 24 -3 5 17 16 26 27 -4 1 2 1 8 7 -5 1 2 1 8 15 -6 1 8 1 7 15 -7 1 2 1 7 15 -8 1 1 2 3 9 -9 1 1 2 3 4 -10 1 1 2 4 9 -11 1 3 2 4 9 -12 1 2 3 6 10 -13 1 2 3 6 11 -14 1 2 3 10 11 -15 1 6 3 10 11 -16 1 14 13 20 12 -17 1 14 13 21 12 -18 1 20 13 21 12 -19 1 14 13 20 21 -20 1 13 14 22 15 -21 1 13 14 23 15 -22 1 13 14 22 23 -23 1 22 14 23 15 -24 1 18 17 28 16 -25 1 18 17 29 16 -26 1 28 17 29 16 -27 1 18 17 28 29 -28 1 17 18 30 12 -29 1 17 18 31 12 -30 1 30 18 31 12 -31 1 17 18 30 31 -32 1 39 32 33 35 -33 1 39 32 38 35 -34 1 39 32 38 33 -35 1 38 32 33 35 -36 1 34 33 32 35 -37 1 40 33 32 35 -38 1 34 33 40 32 -39 1 34 33 40 35 -40 1 37 34 41 33 -41 1 37 34 42 33 -42 1 41 34 42 33 -43 1 37 34 41 42 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_pre.molecule_template b/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_pre.molecule_template new file mode 100644 index 0000000000..e729db51df --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp1_pre.molecule_template @@ -0,0 +1,412 @@ +rxn2_stp1_pre + + 42 atoms + 41 bonds + 73 angles + 96 dihedrals + 3 impropers + +Coords + + 1 19.846410751 9.569080353 -1.229959965 + 2 21.168550491 9.331390381 -0.418119997 + 3 21.253009796 8.067939758 0.460720003 + 4 21.330839157 10.304280281 -0.253340006 + 5 21.891689301 5.906199932 0.464150012 + 6 21.818470001 6.999869823 -0.296270013 + 7 19.931600571 10.026599884 -2.215509892 + 8 19.051279068 8.828539848 -1.132879972 + 9 22.228799820 9.293580055 -0.665279984 + 10 21.880540848 8.270810127 1.328060031 + 11 20.253150940 7.789050102 0.792639971 + 12 16.072719574 12.338939667 -0.174630001 + 13 16.557050705 11.130579948 0.587499976 + 14 18.074380875 10.998729706 0.366589993 + 15 18.354030609 10.832099915 -1.107139945 + 16 14.920880318 15.018099785 -0.201130003 + 17 16.390550613 14.791139603 -0.461059988 + 18 16.852989197 13.538490295 0.304529995 + 19 16.264270782 12.190329552 -1.257619977 + 20 16.025060654 10.195289612 0.210910007 + 21 16.346740723 11.269889832 1.698950052 + 22 18.466690063 10.092459679 0.935469985 + 23 18.592319489 11.941149712 0.745169997 + 24 17.213689804 10.780300140 -1.896260023 + 25 20.881860733 11.302060127 -0.773029983 + 26 14.344180107 14.136429787 -0.550279975 + 27 14.583669662 15.922829628 -0.748109996 + 28 16.984310150 15.696060181 -0.103469998 + 29 16.562459946 14.639559746 -1.577589989 + 30 16.674610138 13.686010361 1.420369983 + 31 17.964000702 13.363149643 0.117749996 + 32 18.703359604 9.118829727 -4.174240112 + 33 18.099750519 8.263649940 -5.342999935 + 34 19.081829071 7.609610081 -6.334179878 + 35 17.971729279 9.827679634 -5.367080212 + 36 20.263879776 5.733600140 -6.736780167 + 37 19.414030075 6.299980164 -5.878960133 + 38 18.194740295 9.091640472 -3.210949898 + 39 19.788940430 9.208559990 -4.119639874 + 40 17.399309158 7.432219982 -5.407800198 + 41 18.616249084 7.545569897 -7.316909790 + 42 19.987049103 8.212499619 -6.399400234 + +Types + + 1 c2 + 2 c3 + 3 c2 + 4 oc + 5 cp + 6 oc + 7 hc + 8 hc + 9 hc + 10 hc + 11 hc + 12 na + 13 c2 + 14 c2 + 15 na + 16 na + 17 c2 + 18 c2 + 19 hn + 20 hc + 21 hc + 22 hc + 23 hc + 24 hn + 25 ho + 26 hn + 27 hn + 28 hc + 29 hc + 30 hc + 31 hc + 32 c3m + 33 c3m + 34 c2 + 35 o3e + 36 cp + 37 oc + 38 hc + 39 hc + 40 hc + 41 hc + 42 hc + +Charges + + 1 0.000000 + 2 0.000000 + 3 0.000000 + 4 0.100000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.000000 + 11 0.000000 + 12 0.000000 + 13 0.000000 + 14 0.000000 + 15 -0.025000 + 16 -0.025000 + 17 0.000000 + 18 0.000000 + 19 0.000000 + 20 0.000000 + 21 0.000000 + 22 0.000000 + 23 0.000000 + 24 0.000000 + 25 0.000000 + 26 0.000000 + 27 0.000000 + 28 0.000000 + 29 0.000000 + 30 0.000000 + 31 0.000000 + 32 0.000000 + 33 0.000000 + 34 0.000000 + 35 0.100000 + 36 0.000000 + 37 0.000000 + 38 0.000000 + 39 0.000000 + 40 0.000000 + 41 0.000000 + 42 0.000000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + 32 1 + 33 1 + 34 1 + 35 1 + 36 1 + 37 1 + 38 1 + 39 1 + 40 1 + 41 1 + 42 1 + +Bonds + + 1 c2-hc 1 8 + 2 c2-c3 1 2 + 3 c2-hc 1 7 + 4 c2-na 1 15 + 5 c2-c3 3 2 + 6 c3-hc 2 9 + 7 c3-oc 2 4 + 8 c2-oc 3 6 + 9 c2-hc 3 10 + 10 c2-hc 3 11 + 11 oc-ho 4 25 + 12 cp-oc 6 5 + 13 c2-na 13 12 + 14 c2-na 18 12 + 15 na-hn 12 19 + 16 c2-c2 13 14 + 17 c2-hc 13 20 + 18 c2-hc 13 21 + 19 c2-na 14 15 + 20 c2-hc 14 22 + 21 c2-hc 14 23 + 22 na-hn 15 24 + 23 c2-na 17 16 + 24 na-hn 16 26 + 25 na-hn 16 27 + 26 c2-c2 17 18 + 27 c2-hc 17 28 + 28 c2-hc 17 29 + 29 c2-hc 18 30 + 30 c2-hc 18 31 + 31 c3m-hc 39 32 + 32 c3m-o3e 32 35 + 33 c3m-c3m 32 33 + 34 c3m-hc 38 32 + 35 c3m-o3e 33 35 + 36 c3m-c2 34 33 + 37 c3m-hc 40 33 + 38 c2-oc 34 37 + 39 c2-hc 34 41 + 40 c2-hc 34 42 + 41 cp-oc 37 36 + +Angles + + 1 c3-c2-hc 2 1 8 + 2 hc-c2-hc 8 1 7 + 3 hc-c2-na 8 1 15 + 4 c3-c2-hc 2 1 7 + 5 c3-c2-na 2 1 15 + 6 hc-c2-na 7 1 15 + 7 c2-c3-c2 1 2 3 + 8 c2-c3-hc 1 2 9 + 9 c2-c3-oc 1 2 4 + 10 c2-c3-hc 3 2 9 + 11 c2-c3-oc 3 2 4 + 12 oc-c3-hc 4 2 9 + 13 c3-c2-oc 2 3 6 + 14 c3-c2-hc 2 3 10 + 15 c3-c2-hc 2 3 11 + 16 oc-c2-hc 6 3 10 + 17 oc-c2-hc 6 3 11 + 18 hc-c2-hc 10 3 11 + 19 c3-oc-ho 2 4 25 + 20 c2-oc-cp 3 6 5 + 21 c2-na-c2 13 12 18 + 22 c2-na-hn 13 12 19 + 23 c2-na-hn 18 12 19 + 24 c2-c2-na 14 13 12 + 25 hc-c2-na 20 13 12 + 26 hc-c2-na 21 13 12 + 27 c2-c2-hc 14 13 20 + 28 c2-c2-hc 14 13 21 + 29 hc-c2-hc 20 13 21 + 30 c2-c2-na 13 14 15 + 31 c2-c2-hc 13 14 22 + 32 c2-c2-hc 13 14 23 + 33 hc-c2-na 22 14 15 + 34 hc-c2-na 23 14 15 + 35 hc-c2-hc 22 14 23 + 36 c2-na-c2 1 15 14 + 37 c2-na-hn 1 15 24 + 38 c2-na-hn 14 15 24 + 39 c2-na-hn 17 16 26 + 40 c2-na-hn 17 16 27 + 41 hn-na-hn 26 16 27 + 42 c2-c2-na 18 17 16 + 43 hc-c2-na 28 17 16 + 44 hc-c2-na 29 17 16 + 45 c2-c2-hc 18 17 28 + 46 c2-c2-hc 18 17 29 + 47 hc-c2-hc 28 17 29 + 48 c2-c2-na 17 18 12 + 49 hc-c2-na 30 18 12 + 50 hc-c2-na 31 18 12 + 51 c2-c2-hc 17 18 30 + 52 c2-c2-hc 17 18 31 + 53 hc-c2-hc 30 18 31 + 54 hc-c3m-o3e 39 32 35 + 55 hc-c3m-c3m 39 32 33 + 56 hc-c3m-hc 39 32 38 + 57 c3m-c3m-o3e 33 32 35 + 58 hc-c3m-o3e 38 32 35 + 59 hc-c3m-c3m 38 32 33 + 60 c3m-c3m-o3e 32 33 35 + 61 c2-c3m-c3m 34 33 32 + 62 hc-c3m-c3m 40 33 32 + 63 c2-c3m-o3e 34 33 35 + 64 hc-c3m-o3e 40 33 35 + 65 c2-c3m-hc 34 33 40 + 66 oc-c2-c3m 37 34 33 + 67 hc-c2-c3m 41 34 33 + 68 hc-c2-c3m 42 34 33 + 69 oc-c2-hc 37 34 41 + 70 oc-c2-hc 37 34 42 + 71 hc-c2-hc 41 34 42 + 72 c3m-o3e-c3m 32 35 33 + 73 c2-oc-cp 34 37 36 + +Dihedrals + + 1 hc-c2-c3-c2 8 1 2 3 + 2 hc-c2-c3-hc 8 1 2 9 + 3 hc-c2-c3-oc 8 1 2 4 + 4 hc-c2-c3-c2 7 1 2 3 + 5 hc-c2-c3-hc 7 1 2 9 + 6 hc-c2-c3-oc 7 1 2 4 + 7 na-c2-c3-c2 15 1 2 3 + 8 na-c2-c3-hc 15 1 2 9 + 9 na-c2-c3-oc 15 1 2 4 + 10 hc-c2-na-c2 8 1 15 14 + 11 hc-c2-na-hn 8 1 15 24 + 12 c3-c2-na-c2 2 1 15 14 + 13 c3-c2-na-hn 2 1 15 24 + 14 hc-c2-na-c2 7 1 15 14 + 15 hc-c2-na-hn 7 1 15 24 + 16 oc-c2-c3-c2 6 3 2 1 + 17 hc-c2-c3-c2 10 3 2 1 + 18 hc-c2-c3-c2 11 3 2 1 + 19 oc-c2-c3-hc 6 3 2 9 + 20 hc-c2-c3-hc 10 3 2 9 + 21 hc-c2-c3-hc 11 3 2 9 + 22 oc-c2-c3-oc 6 3 2 4 + 23 hc-c2-c3-oc 10 3 2 4 + 24 hc-c2-c3-oc 11 3 2 4 + 25 c2-c3-oc-ho 1 2 4 25 + 26 c2-c3-oc-ho 3 2 4 25 + 27 hc-c3-oc-ho 9 2 4 25 + 28 c3-c2-oc-cp 2 3 6 5 + 29 hc-c2-oc-cp 10 3 6 5 + 30 hc-c2-oc-cp 11 3 6 5 + 31 c2-c2-na-c2 14 13 12 18 + 32 hc-c2-na-c2 20 13 12 18 + 33 hc-c2-na-c2 21 13 12 18 + 34 c2-c2-na-hn 14 13 12 19 + 35 hc-c2-na-hn 20 13 12 19 + 36 hc-c2-na-hn 21 13 12 19 + 37 c2-c2-na-c2 17 18 12 13 + 38 hc-c2-na-c2 30 18 12 13 + 39 hc-c2-na-c2 31 18 12 13 + 40 c2-c2-na-hn 17 18 12 19 + 41 hc-c2-na-hn 30 18 12 19 + 42 hc-c2-na-hn 31 18 12 19 + 43 na-c2-c2-na 12 13 14 15 + 44 hc-c2-c2-na 22 14 13 12 + 45 hc-c2-c2-na 23 14 13 12 + 46 hc-c2-c2-na 20 13 14 15 + 47 hc-c2-c2-hc 20 13 14 22 + 48 hc-c2-c2-hc 20 13 14 23 + 49 hc-c2-c2-na 21 13 14 15 + 50 hc-c2-c2-hc 21 13 14 22 + 51 hc-c2-c2-hc 21 13 14 23 + 52 c2-c2-na-c2 13 14 15 1 + 53 c2-c2-na-hn 13 14 15 24 + 54 hc-c2-na-c2 22 14 15 1 + 55 hc-c2-na-hn 22 14 15 24 + 56 hc-c2-na-c2 23 14 15 1 + 57 hc-c2-na-hn 23 14 15 24 + 58 c2-c2-na-hn 18 17 16 26 + 59 hc-c2-na-hn 28 17 16 26 + 60 hc-c2-na-hn 29 17 16 26 + 61 c2-c2-na-hn 18 17 16 27 + 62 hc-c2-na-hn 28 17 16 27 + 63 hc-c2-na-hn 29 17 16 27 + 64 na-c2-c2-na 16 17 18 12 + 65 hc-c2-c2-na 30 18 17 16 + 66 hc-c2-c2-na 31 18 17 16 + 67 hc-c2-c2-na 28 17 18 12 + 68 hc-c2-c2-hc 28 17 18 30 + 69 hc-c2-c2-hc 28 17 18 31 + 70 hc-c2-c2-na 29 17 18 12 + 71 hc-c2-c2-hc 29 17 18 30 + 72 hc-c2-c2-hc 29 17 18 31 + 73 hc-c3m-o3e-c3m 39 32 35 33 + 74 hc-c3m-o3e-c3m 38 32 35 33 + 75 hc-c3m-c3m-o3e 39 32 33 35 + 76 c2-c3m-c3m-hc 34 33 32 39 + 77 hc-c3m-c3m-hc 39 32 33 40 + 78 c2-c3m-c3m-o3e 34 33 32 35 + 79 hc-c3m-c3m-o3e 40 33 32 35 + 80 hc-c3m-c3m-o3e 38 32 33 35 + 81 c2-c3m-c3m-hc 34 33 32 38 + 82 hc-c3m-c3m-hc 38 32 33 40 + 83 c2-c3m-o3e-c3m 34 33 35 32 + 84 hc-c3m-o3e-c3m 40 33 35 32 + 85 oc-c2-c3m-c3m 37 34 33 32 + 86 hc-c2-c3m-c3m 41 34 33 32 + 87 hc-c2-c3m-c3m 42 34 33 32 + 88 oc-c2-c3m-o3e 37 34 33 35 + 89 hc-c2-c3m-o3e 41 34 33 35 + 90 hc-c2-c3m-o3e 42 34 33 35 + 91 oc-c2-c3m-hc 37 34 33 40 + 92 hc-c2-c3m-hc 41 34 33 40 + 93 hc-c2-c3m-hc 42 34 33 40 + 94 c3m-c2-oc-cp 33 34 37 36 + 95 hc-c2-oc-cp 41 34 37 36 + 96 hc-c2-oc-cp 42 34 37 36 + +Impropers + + 1 c2-na-c2-hn 13 12 18 19 + 2 c2-na-c2-hn 1 15 14 24 + 3 c2-na-hn-hn 17 16 26 27 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp2_post.data_template b/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp2_post.data_template deleted file mode 100644 index 2b37ecff03..0000000000 --- a/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp2_post.data_template +++ /dev/null @@ -1,413 +0,0 @@ -rxn2_stp2_post - -42 atoms -41 bonds -73 angles -102 dihedrals -43 impropers - -Types - -1 1 -2 2 -3 1 -4 7 -5 4 -6 7 -7 8 -8 8 -9 8 -10 8 -11 8 -12 9 -13 1 -14 1 -15 9 -16 9 -17 1 -18 1 -19 10 -20 8 -21 8 -22 8 -23 8 -24 11 -25 11 -26 10 -27 10 -28 8 -29 8 -30 8 -31 8 -32 1 -33 6 -34 1 -35 7 -36 4 -37 7 -38 8 -39 8 -40 8 -41 8 -42 8 - -Charges - -1 0.000000 -2 0.000000 -3 0.000000 -4 0.100000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.000000 -11 0.000000 -12 0.000000 -13 0.000000 -14 0.000000 -15 -0.025000 -16 -0.025000 -17 0.000000 -18 0.000000 -19 0.000000 -20 0.000000 -21 0.000000 -22 0.000000 -23 0.000000 -24 0.000000 -25 0.000000 -26 0.000000 -27 0.000000 -28 0.000000 -29 0.000000 -30 0.000000 -31 0.000000 -32 0.000000 -33 0.000000 -34 0.000000 -35 0.100000 -36 0.000000 -37 0.000000 -38 0.000000 -39 0.000000 -40 0.000000 -41 0.000000 -42 0.000000 - -Coords - -1 19.846411 9.569080 -1.229960 -2 21.168550 9.331390 -0.418120 -3 21.253010 8.067940 0.460720 -4 21.330839 10.304280 -0.253340 -5 21.891689 5.906200 0.464150 -6 21.818470 6.999870 -0.296270 -7 19.931601 10.026600 -2.215510 -8 19.051279 8.828540 -1.132880 -9 22.228800 9.293580 -0.665280 -10 21.880541 8.270810 1.328060 -11 20.253151 7.789050 0.792640 -12 16.072720 12.338940 -0.174630 -13 16.557051 11.130580 0.587500 -14 18.074381 10.998730 0.366590 -15 18.354031 10.832100 -1.107140 -16 14.920880 15.018100 -0.201130 -17 16.390551 14.791140 -0.461060 -18 16.852989 13.538490 0.304530 -19 16.264271 12.190330 -1.257620 -20 16.025061 10.195290 0.210910 -21 16.346741 11.269890 1.698950 -22 18.466690 10.092460 0.935470 -23 18.592319 11.941150 0.745170 -24 16.017490 9.805710 -4.329880 -25 20.881861 11.302060 -0.773030 -26 14.344180 14.136430 -0.550280 -27 14.583670 15.922830 -0.748110 -28 16.984310 15.696060 -0.103470 -29 16.562460 14.639560 -1.577590 -30 16.674610 13.686010 1.420370 -31 17.964001 13.363150 0.117750 -32 18.680189 9.134390 -4.183100 -33 18.099751 8.263650 -5.343000 -34 19.081829 7.609610 -6.334180 -35 17.971729 9.827680 -5.367080 -36 20.263880 5.733600 -6.736780 -37 19.414030 6.299980 -5.878960 -38 18.194740 9.091640 -3.210950 -39 19.788940 9.208560 -4.119640 -40 17.399309 7.432220 -5.407800 -41 18.616249 7.545570 -7.316910 -42 19.987049 8.212500 -6.399400 - -Bonds - -1 1 1 8 -2 2 1 2 -3 1 1 7 -4 13 1 15 -5 2 3 2 -6 6 2 9 -7 19 2 4 -8 3 3 6 -9 1 3 10 -10 1 3 11 -11 18 4 25 -12 8 6 5 -13 13 13 12 -14 13 18 12 -15 14 12 19 -16 15 13 14 -17 1 13 20 -18 1 13 21 -19 13 14 15 -20 1 14 22 -21 1 14 23 -22 13 32 15 -23 13 17 16 -24 14 16 26 -25 14 16 27 -26 15 17 18 -27 1 17 28 -28 1 17 29 -29 1 18 30 -30 1 18 31 -31 18 35 24 -32 1 32 39 -33 16 32 33 -34 1 32 38 -35 17 35 33 -36 16 34 33 -37 12 40 33 -38 3 34 37 -39 1 34 41 -40 1 34 42 -41 8 37 36 - -Angles - -1 1 2 1 8 -2 2 8 1 7 -3 26 8 1 15 -4 1 2 1 7 -5 42 2 1 15 -6 26 7 1 15 -7 43 1 2 3 -8 7 1 2 9 -9 44 1 2 4 -10 7 3 2 9 -11 44 3 2 4 -12 45 4 2 9 -13 4 2 3 6 -14 1 2 3 10 -15 1 2 3 11 -16 3 6 3 10 -17 3 6 3 11 -18 2 10 3 11 -19 46 2 4 25 -20 22 3 6 5 -21 23 13 12 18 -22 24 13 12 19 -23 24 18 12 19 -24 25 14 13 12 -25 26 20 13 12 -26 26 21 13 12 -27 27 14 13 20 -28 27 14 13 21 -29 2 20 13 21 -30 25 13 14 15 -31 27 13 14 22 -32 27 13 14 23 -33 26 22 14 15 -34 26 23 14 15 -35 2 22 14 23 -36 23 1 15 14 -37 23 1 15 32 -38 23 14 15 32 -39 24 17 16 26 -40 24 17 16 27 -41 28 26 16 27 -42 25 18 17 16 -43 26 28 17 16 -44 26 29 17 16 -45 27 18 17 28 -46 27 18 17 29 -47 2 28 17 29 -48 25 17 18 12 -49 26 30 18 12 -50 26 31 18 12 -51 27 17 18 30 -52 27 17 18 31 -53 2 30 18 31 -54 26 39 32 15 -55 47 15 32 33 -56 26 38 32 15 -57 48 39 32 33 -58 2 39 32 38 -59 48 38 32 33 -60 34 32 33 35 -61 32 32 33 34 -62 33 32 33 40 -63 34 34 33 35 -64 35 35 33 40 -65 33 34 33 40 -66 49 37 34 33 -67 48 41 34 33 -68 48 42 34 33 -69 3 37 34 41 -70 3 37 34 42 -71 2 41 34 42 -72 50 24 35 33 -73 22 34 37 36 - -Dihedrals - -1 55 8 1 2 3 -2 3 8 1 2 9 -3 56 8 1 2 4 -4 55 7 1 2 3 -5 3 7 1 2 9 -6 56 7 1 2 4 -7 57 15 1 2 3 -8 58 15 1 2 9 -9 59 15 1 2 4 -10 28 8 1 15 14 -11 28 8 1 15 32 -12 60 2 1 15 14 -13 60 2 1 15 32 -14 28 7 1 15 14 -15 28 7 1 15 32 -16 61 6 3 2 1 -17 55 10 3 2 1 -18 55 11 3 2 1 -19 6 6 3 2 9 -20 3 10 3 2 9 -21 3 11 3 2 9 -22 62 6 3 2 4 -23 56 10 3 2 4 -24 56 11 3 2 4 -25 63 1 2 4 25 -26 63 3 2 4 25 -27 64 9 2 4 25 -28 8 2 3 6 5 -29 7 10 3 6 5 -30 7 11 3 6 5 -31 27 14 13 12 18 -32 28 20 13 12 18 -33 28 21 13 12 18 -34 29 14 13 12 19 -35 30 20 13 12 19 -36 30 21 13 12 19 -37 27 17 18 12 13 -38 28 30 18 12 13 -39 28 31 18 12 13 -40 29 17 18 12 19 -41 30 30 18 12 19 -42 30 31 18 12 19 -43 31 12 13 14 15 -44 32 22 14 13 12 -45 32 23 14 13 12 -46 32 20 13 14 15 -47 33 20 13 14 22 -48 33 20 13 14 23 -49 32 21 13 14 15 -50 33 21 13 14 22 -51 33 21 13 14 23 -52 27 13 14 15 1 -53 27 13 14 15 32 -54 28 22 14 15 1 -55 28 22 14 15 32 -56 28 23 14 15 1 -57 28 23 14 15 32 -58 28 39 32 15 1 -59 46 33 32 15 1 -60 28 38 32 15 1 -61 28 39 32 15 14 -62 46 33 32 15 14 -63 28 38 32 15 14 -64 29 18 17 16 26 -65 30 28 17 16 26 -66 30 29 17 16 26 -67 29 18 17 16 27 -68 30 28 17 16 27 -69 30 29 17 16 27 -70 31 16 17 18 12 -71 32 30 18 17 16 -72 32 31 18 17 16 -73 32 28 17 18 12 -74 33 28 17 18 30 -75 33 28 17 18 31 -76 32 29 17 18 12 -77 33 29 17 18 30 -78 33 29 17 18 31 -79 45 15 32 33 35 -80 43 15 32 33 34 -81 44 15 32 33 40 -82 42 39 32 33 35 -83 40 39 32 33 34 -84 41 39 32 33 40 -85 42 38 32 33 35 -86 40 38 32 33 34 -87 41 38 32 33 40 -88 65 24 35 33 32 -89 65 24 35 33 34 -90 66 24 35 33 40 -91 48 37 34 33 32 -92 40 41 34 33 32 -93 40 42 34 33 32 -94 50 37 34 33 35 -95 42 41 34 33 35 -96 42 42 34 33 35 -97 49 37 34 33 40 -98 41 41 34 33 40 -99 41 42 34 33 40 -100 51 33 34 37 36 -101 7 41 34 37 36 -102 7 42 34 37 36 - -Impropers - -1 4 13 12 18 19 -2 22 1 15 14 32 -3 5 17 16 26 27 -4 1 2 1 8 7 -5 1 2 1 8 15 -6 1 8 1 7 15 -7 1 2 1 7 15 -8 1 1 2 3 9 -9 1 1 2 3 4 -10 1 1 2 4 9 -11 1 3 2 4 9 -12 1 2 3 6 10 -13 1 2 3 6 11 -14 1 2 3 10 11 -15 1 6 3 10 11 -16 1 14 13 20 12 -17 1 14 13 21 12 -18 1 20 13 21 12 -19 1 14 13 20 21 -20 1 13 14 22 15 -21 1 13 14 23 15 -22 1 13 14 22 23 -23 1 22 14 23 15 -24 1 18 17 28 16 -25 1 18 17 29 16 -26 1 28 17 29 16 -27 1 18 17 28 29 -28 1 17 18 30 12 -29 1 17 18 31 12 -30 1 30 18 31 12 -31 1 17 18 30 31 -32 1 39 32 15 33 -33 1 39 32 38 15 -34 1 38 32 15 33 -35 1 39 32 38 33 -36 1 32 33 34 35 -37 1 32 33 35 40 -38 1 32 33 34 40 -39 1 34 33 35 40 -40 1 37 34 41 33 -41 1 37 34 42 33 -42 1 41 34 42 33 -43 1 37 34 41 42 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp2_post.molecule_template b/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp2_post.molecule_template new file mode 100644 index 0000000000..01a9b7dad4 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_epoxy/rxn2_stp2_post.molecule_template @@ -0,0 +1,418 @@ +rxn2_stp2_post + + 42 atoms + 41 bonds + 73 angles + 102 dihedrals + 3 impropers + +Coords + + 1 19.846410751 9.569080353 -1.229959965 + 2 21.168550491 9.331390381 -0.418119997 + 3 21.253009796 8.067939758 0.460720003 + 4 21.330839157 10.304280281 -0.253340006 + 5 21.891689301 5.906199932 0.464150012 + 6 21.818470001 6.999869823 -0.296270013 + 7 19.931600571 10.026599884 -2.215509892 + 8 19.051279068 8.828539848 -1.132879972 + 9 22.228799820 9.293580055 -0.665279984 + 10 21.880540848 8.270810127 1.328060031 + 11 20.253150940 7.789050102 0.792639971 + 12 16.072719574 12.338939667 -0.174630001 + 13 16.557050705 11.130579948 0.587499976 + 14 18.074380875 10.998729706 0.366589993 + 15 18.354030609 10.832099915 -1.107139945 + 16 14.920880318 15.018099785 -0.201130003 + 17 16.390550613 14.791139603 -0.461059988 + 18 16.852989197 13.538490295 0.304529995 + 19 16.264270782 12.190329552 -1.257619977 + 20 16.025060654 10.195289612 0.210910007 + 21 16.346740723 11.269889832 1.698950052 + 22 18.466690063 10.092459679 0.935469985 + 23 18.592319489 11.941149712 0.745169997 + 24 16.017490387 9.805709839 -4.329880238 + 25 20.881860733 11.302060127 -0.773029983 + 26 14.344180107 14.136429787 -0.550279975 + 27 14.583669662 15.922829628 -0.748109996 + 28 16.984310150 15.696060181 -0.103469998 + 29 16.562459946 14.639559746 -1.577589989 + 30 16.674610138 13.686010361 1.420369983 + 31 17.964000702 13.363149643 0.117749996 + 32 18.680189133 9.134389877 -4.183100224 + 33 18.099750519 8.263649940 -5.342999935 + 34 19.081829071 7.609610081 -6.334179878 + 35 17.971729279 9.827679634 -5.367080212 + 36 20.263879776 5.733600140 -6.736780167 + 37 19.414030075 6.299980164 -5.878960133 + 38 18.194740295 9.091640472 -3.210949898 + 39 19.788940430 9.208559990 -4.119639874 + 40 17.399309158 7.432219982 -5.407800198 + 41 18.616249084 7.545569897 -7.316909790 + 42 19.987049103 8.212499619 -6.399400234 + +Types + + 1 c2 + 2 c3m + 3 c2 + 4 oc + 5 cp + 6 oc + 7 hc + 8 hc + 9 hc + 10 hc + 11 hc + 12 na + 13 c2 + 14 c2 + 15 na + 16 na + 17 c2 + 18 c2 + 19 hn + 20 hc + 21 hc + 22 hc + 23 hc + 24 ho + 25 ho + 26 hn + 27 hn + 28 hc + 29 hc + 30 hc + 31 hc + 32 c2 + 33 c3 + 34 c2 + 35 oc + 36 cp + 37 oc + 38 hc + 39 hc + 40 hc + 41 hc + 42 hc + +Charges + + 1 0.000000 + 2 0.000000 + 3 0.000000 + 4 0.100000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.000000 + 11 0.000000 + 12 0.000000 + 13 0.000000 + 14 0.000000 + 15 -0.025000 + 16 -0.025000 + 17 0.000000 + 18 0.000000 + 19 0.000000 + 20 0.000000 + 21 0.000000 + 22 0.000000 + 23 0.000000 + 24 0.000000 + 25 0.000000 + 26 0.000000 + 27 0.000000 + 28 0.000000 + 29 0.000000 + 30 0.000000 + 31 0.000000 + 32 0.000000 + 33 0.000000 + 34 0.000000 + 35 0.100000 + 36 0.000000 + 37 0.000000 + 38 0.000000 + 39 0.000000 + 40 0.000000 + 41 0.000000 + 42 0.000000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + 32 1 + 33 1 + 34 1 + 35 1 + 36 1 + 37 1 + 38 1 + 39 1 + 40 1 + 41 1 + 42 1 + +Bonds + + 1 c2-hc 1 8 + 2 c3m-c2 1 2 + 3 c2-hc 1 7 + 4 c2-na 1 15 + 5 c3m-c2 3 2 + 6 c3m-hc 2 9 + 7 c3m-oc 2 4 + 8 c2-oc 3 6 + 9 c2-hc 3 10 + 10 c2-hc 3 11 + 11 oc-ho 4 25 + 12 cp-oc 6 5 + 13 c2-na 13 12 + 14 c2-na 18 12 + 15 na-hn 12 19 + 16 c2-c2 13 14 + 17 c2-hc 13 20 + 18 c2-hc 13 21 + 19 c2-na 14 15 + 20 c2-hc 14 22 + 21 c2-hc 14 23 + 22 c2-na 32 15 + 23 c2-na 17 16 + 24 na-hn 16 26 + 25 na-hn 16 27 + 26 c2-c2 17 18 + 27 c2-hc 17 28 + 28 c2-hc 17 29 + 29 c2-hc 18 30 + 30 c2-hc 18 31 + 31 oc-ho 35 24 + 32 c2-hc 32 39 + 33 c2-c3 32 33 + 34 c2-hc 32 38 + 35 c3-oc 35 33 + 36 c2-c3 34 33 + 37 c3-hc 40 33 + 38 c2-oc 34 37 + 39 c2-hc 34 41 + 40 c2-hc 34 42 + 41 cp-oc 37 36 + +Angles + + 1 c3m-c2-hc 2 1 8 + 2 hc-c2-hc 8 1 7 + 3 hc-c2-na 8 1 15 + 4 c3m-c2-hc 2 1 7 + 5 c3m-c2-na 2 1 15 + 6 hc-c2-na 7 1 15 + 7 c2-c3m-c2 1 2 3 + 8 c2-c3m-hc 1 2 9 + 9 c2-c3m-oc 1 2 4 + 10 c2-c3m-hc 3 2 9 + 11 c2-c3m-oc 3 2 4 + 12 oc-c3m-hc 4 2 9 + 13 c3m-c2-oc 2 3 6 + 14 c3m-c2-hc 2 3 10 + 15 c3m-c2-hc 2 3 11 + 16 oc-c2-hc 6 3 10 + 17 oc-c2-hc 6 3 11 + 18 hc-c2-hc 10 3 11 + 19 c3m-oc-ho 2 4 25 + 20 c2-oc-cp 3 6 5 + 21 c2-na-c2 13 12 18 + 22 c2-na-hn 13 12 19 + 23 c2-na-hn 18 12 19 + 24 c2-c2-na 14 13 12 + 25 hc-c2-na 20 13 12 + 26 hc-c2-na 21 13 12 + 27 c2-c2-hc 14 13 20 + 28 c2-c2-hc 14 13 21 + 29 hc-c2-hc 20 13 21 + 30 c2-c2-na 13 14 15 + 31 c2-c2-hc 13 14 22 + 32 c2-c2-hc 13 14 23 + 33 hc-c2-na 22 14 15 + 34 hc-c2-na 23 14 15 + 35 hc-c2-hc 22 14 23 + 36 c2-na-c2 1 15 14 + 37 c2-na-c2 1 15 32 + 38 c2-na-c2 14 15 32 + 39 c2-na-hn 17 16 26 + 40 c2-na-hn 17 16 27 + 41 hn-na-hn 26 16 27 + 42 c2-c2-na 18 17 16 + 43 hc-c2-na 28 17 16 + 44 hc-c2-na 29 17 16 + 45 c2-c2-hc 18 17 28 + 46 c2-c2-hc 18 17 29 + 47 hc-c2-hc 28 17 29 + 48 c2-c2-na 17 18 12 + 49 hc-c2-na 30 18 12 + 50 hc-c2-na 31 18 12 + 51 c2-c2-hc 17 18 30 + 52 c2-c2-hc 17 18 31 + 53 hc-c2-hc 30 18 31 + 54 hc-c2-na 39 32 15 + 55 na-c2-c3 15 32 33 + 56 hc-c2-na 38 32 15 + 57 hc-c2-c3 39 32 33 + 58 hc-c2-hc 39 32 38 + 59 hc-c2-c3 38 32 33 + 60 c2-c3-oc 32 33 35 + 61 c2-c3-c2 32 33 34 + 62 c2-c3-hc 32 33 40 + 63 c2-c3-oc 34 33 35 + 64 oc-c3-hc 35 33 40 + 65 c2-c3-hc 34 33 40 + 66 oc-c2-c3 37 34 33 + 67 hc-c2-c3 41 34 33 + 68 hc-c2-c3 42 34 33 + 69 oc-c2-hc 37 34 41 + 70 oc-c2-hc 37 34 42 + 71 hc-c2-hc 41 34 42 + 72 ho-oc-c3 24 35 33 + 73 c2-oc-cp 34 37 36 + +Dihedrals + + 1 hc-c2-c3m-c2 8 1 2 3 + 2 hc-c2-c3m-hc 8 1 2 9 + 3 hc-c2-c3m-oc 8 1 2 4 + 4 hc-c2-c3m-c2 7 1 2 3 + 5 hc-c2-c3m-hc 7 1 2 9 + 6 hc-c2-c3m-oc 7 1 2 4 + 7 na-c2-c3m-c2 15 1 2 3 + 8 na-c2-c3m-hc 15 1 2 9 + 9 na-c2-c3m-oc 15 1 2 4 + 10 hc-c2-na-c2 8 1 15 14 + 11 hc-c2-na-c2 8 1 15 32 + 12 c3m-c2-na-c2 2 1 15 14 + 13 c3m-c2-na-c2 2 1 15 32 + 14 hc-c2-na-c2 7 1 15 14 + 15 hc-c2-na-c2 7 1 15 32 + 16 oc-c2-c3m-c2 6 3 2 1 + 17 hc-c2-c3m-c2 10 3 2 1 + 18 hc-c2-c3m-c2 11 3 2 1 + 19 oc-c2-c3m-hc 6 3 2 9 + 20 hc-c2-c3m-hc 10 3 2 9 + 21 hc-c2-c3m-hc 11 3 2 9 + 22 oc-c2-c3m-oc 6 3 2 4 + 23 hc-c2-c3m-oc 10 3 2 4 + 24 hc-c2-c3m-oc 11 3 2 4 + 25 c2-c3m-oc-ho 1 2 4 25 + 26 c2-c3m-oc-ho 3 2 4 25 + 27 hc-c3m-oc-ho 9 2 4 25 + 28 c3m-c2-oc-cp 2 3 6 5 + 29 hc-c2-oc-cp 10 3 6 5 + 30 hc-c2-oc-cp 11 3 6 5 + 31 c2-c2-na-c2 14 13 12 18 + 32 hc-c2-na-c2 20 13 12 18 + 33 hc-c2-na-c2 21 13 12 18 + 34 c2-c2-na-hn 14 13 12 19 + 35 hc-c2-na-hn 20 13 12 19 + 36 hc-c2-na-hn 21 13 12 19 + 37 c2-c2-na-c2 17 18 12 13 + 38 hc-c2-na-c2 30 18 12 13 + 39 hc-c2-na-c2 31 18 12 13 + 40 c2-c2-na-hn 17 18 12 19 + 41 hc-c2-na-hn 30 18 12 19 + 42 hc-c2-na-hn 31 18 12 19 + 43 na-c2-c2-na 12 13 14 15 + 44 hc-c2-c2-na 22 14 13 12 + 45 hc-c2-c2-na 23 14 13 12 + 46 hc-c2-c2-na 20 13 14 15 + 47 hc-c2-c2-hc 20 13 14 22 + 48 hc-c2-c2-hc 20 13 14 23 + 49 hc-c2-c2-na 21 13 14 15 + 50 hc-c2-c2-hc 21 13 14 22 + 51 hc-c2-c2-hc 21 13 14 23 + 52 c2-c2-na-c2 13 14 15 1 + 53 c2-c2-na-c2 13 14 15 32 + 54 hc-c2-na-c2 22 14 15 1 + 55 hc-c2-na-c2 22 14 15 32 + 56 hc-c2-na-c2 23 14 15 1 + 57 hc-c2-na-c2 23 14 15 32 + 58 hc-c2-na-c2 39 32 15 1 + 59 c3-c2-na-c2 33 32 15 1 + 60 hc-c2-na-c2 38 32 15 1 + 61 hc-c2-na-c2 39 32 15 14 + 62 c3-c2-na-c2 33 32 15 14 + 63 hc-c2-na-c2 38 32 15 14 + 64 c2-c2-na-hn 18 17 16 26 + 65 hc-c2-na-hn 28 17 16 26 + 66 hc-c2-na-hn 29 17 16 26 + 67 c2-c2-na-hn 18 17 16 27 + 68 hc-c2-na-hn 28 17 16 27 + 69 hc-c2-na-hn 29 17 16 27 + 70 na-c2-c2-na 16 17 18 12 + 71 hc-c2-c2-na 30 18 17 16 + 72 hc-c2-c2-na 31 18 17 16 + 73 hc-c2-c2-na 28 17 18 12 + 74 hc-c2-c2-hc 28 17 18 30 + 75 hc-c2-c2-hc 28 17 18 31 + 76 hc-c2-c2-na 29 17 18 12 + 77 hc-c2-c2-hc 29 17 18 30 + 78 hc-c2-c2-hc 29 17 18 31 + 79 na-c2-c3-oc 15 32 33 35 + 80 na-c2-c3-c2 15 32 33 34 + 81 na-c2-c3-hc 15 32 33 40 + 82 hc-c2-c3-oc 39 32 33 35 + 83 hc-c2-c3-c2 39 32 33 34 + 84 hc-c2-c3-hc 39 32 33 40 + 85 hc-c2-c3-oc 38 32 33 35 + 86 hc-c2-c3-c2 38 32 33 34 + 87 hc-c2-c3-hc 38 32 33 40 + 88 ho-oc-c3-c2 24 35 33 32 + 89 ho-oc-c3-c2 24 35 33 34 + 90 ho-oc-c3-hc 24 35 33 40 + 91 oc-c2-c3-c2 37 34 33 32 + 92 hc-c2-c3-c2 41 34 33 32 + 93 hc-c2-c3-c2 42 34 33 32 + 94 oc-c2-c3-oc 37 34 33 35 + 95 hc-c2-c3-oc 41 34 33 35 + 96 hc-c2-c3-oc 42 34 33 35 + 97 oc-c2-c3-hc 37 34 33 40 + 98 hc-c2-c3-hc 41 34 33 40 + 99 hc-c2-c3-hc 42 34 33 40 + 100 c3-c2-oc-cp 33 34 37 36 + 101 hc-c2-oc-cp 41 34 37 36 + 102 hc-c2-oc-cp 42 34 37 36 + +Impropers + + 1 c2-na-c2-hn 13 12 18 19 + 2 c2-na-c2-c2 1 15 14 32 + 3 c2-na-hn-hn 17 16 26 27 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/tiny_epoxy.data b/examples/PACKAGES/reaction/tiny_epoxy/tiny_epoxy.data index d98006b107..90c074fde0 100644 --- a/examples/PACKAGES/reaction/tiny_epoxy/tiny_epoxy.data +++ b/examples/PACKAGES/reaction/tiny_epoxy/tiny_epoxy.data @@ -1,1582 +1,1765 @@ # two molecules DGEBA (diepoxy) and one DETA (linker) -118 atoms -123 bonds -221 angles -302 dihedrals -115 impropers -11 atom types -19 bond types -50 angle types -66 dihedral types -22 improper types +118 atoms +123 bonds +221 angles +302 dihedrals +115 impropers +11 atom types +19 bond types +50 angle types +66 dihedral types +22 improper types 10 30 xlo xhi -10 20 ylo yhi -15 10 zlo zhi -Masses +Atom Type Labels -1 12.011150 # c2 -2 12.011150 # c3m -3 15.999400 # o3e -4 12.011150 # cp -5 12.011150 # c -6 12.011150 # c3 -7 15.999400 # oc -8 1.007970 # hc -9 14.006700 # na -10 1.007970 # hn -11 1.007970 # ho +1 c2 +2 c3m +3 o3e +4 cp +5 c +6 c3 +7 oc +8 hc +9 na +10 hn +11 ho -Pair Coeffs # lj/class2/coul/long +Bond Type Labels -1 0.0540000000 4.0100000000 # c2 -2 0.0540000000 4.0100000000 # c3m -3 0.2400000000 3.5350000000 # o3e -4 0.0640000000 4.0100000000 # cp -5 0.0540000000 4.0100000000 # c -6 0.0540000000 4.0100000000 # c3 -7 0.2400000000 3.5350000000 # oc -8 0.0200000000 2.7000000000 # hc -9 0.0650000000 4.0700000000 # na -10 0.0130000000 1.0980000000 # hn -11 0.0130000000 1.0980000000 # ho +1 c2-hc +2 c3m-c2 +3 c2-oc +4 c3m-o3e +5 c3m-c3m +6 c3m-hc +7 cp-cp +8 cp-oc +9 cp-hc +10 cp-c +11 c-c3 +12 c3-hc +13 c2-na +14 na-hn +15 c2-c2 +16 c2-c3 +17 c3-oc +18 oc-ho +19 c3m-oc -Bond Coeffs # class2 +Angle Type Labels -1 1.1010 345.0000 -691.8900 844.6000 # c2-hc -2 1.5300 299.6700 -501.7700 679.8100 # c2-c3m -3 1.4200 400.3954 -835.1951 1313.0142 # c2-oc -4 1.4200 400.3954 -835.1951 1313.0142 # c3m-o3e -5 1.5300 299.6700 -501.7700 679.8100 # c3m-c3m -6 1.1010 345.0000 -691.8900 844.6000 # c3m-hc -7 1.4170 470.8361 -627.6179 1327.6345 # cp-cp -8 1.3768 428.8798 -738.2351 1114.9655 # cp-oc -9 1.0982 372.8251 -803.4526 894.3173 # cp-hc -10 1.5010 321.9021 -521.8208 572.1628 # cp-c -11 1.5300 299.6700 -501.7700 679.8100 # c-c3 -12 1.1010 345.0000 -691.8900 844.6000 # c3-hc -13 1.4570 365.8052 -699.6368 998.4842 # c2-na -14 1.0060 466.7400 -1073.6018 1251.1056 # na-hn -15 1.5300 299.6700 -501.7700 679.8100 # c2-c2 -16 1.5300 299.6700 -501.7700 679.8100 # c2-c3 -17 1.4200 400.3954 -835.1951 1313.0142 # c3-oc -18 0.9650 532.5062 -1282.9050 2004.7658 # oc-ho -19 1.4200 400.3954 -835.1951 1313.0142 # c3m-oc +1 c3m-c2-hc +2 hc-c2-hc +3 oc-c2-hc +4 c3m-c2-oc +5 c2-c3m-o3e +6 c2-c3m-c3m +7 c2-c3m-hc +8 c3m-c3m-o3e +9 o3e-c3m-hc +10 c3m-c3m-hc +11 hc-c3m-hc +12 c3m-o3e-c3m +13 cp-cp-cp +14 cp-cp-oc +15 cp-cp-hc +16 cp-cp-c +17 cp-c-c3 +18 cp-c-cp +19 c3-c-c3 +20 c-c3-hc +21 hc-c3-hc +22 c2-oc-cp +23 c2-na-c2 +24 c2-na-hn +25 c2-c2-na +26 hc-c2-na +27 c2-c2-hc +28 hn-na-hn +29 c3m-c3m-c2 +30 c3-c2-hc +31 c3-c2-na +32 c2-c3-c2 +33 c2-c3-hc +34 c2-c3-oc +35 oc-c3-hc +36 c3-c2-oc +37 c3-oc-ho +38 hc-c3m-o3e +39 hc-c3m-c3m +40 oc-c2-c3m +41 hc-c2-c3m +42 c3m-c2-na +43 c2-c3m-c2 +44 c2-c3m-oc +45 oc-c3m-hc +46 c3m-oc-ho +47 na-c2-c3 +48 hc-c2-c3 +49 oc-c2-c3 +50 ho-oc-c3 -Angle Coeffs # class2 +Dihedral Type Labels -1 110.7700 41.4530 -10.6040 5.1290 # c3m-c2-hc -2 107.6600 39.6410 -12.9210 -2.4318 # hc-c2-hc -3 108.7280 58.5446 -10.8088 -12.4006 # oc-c2-hc -4 111.2700 54.5381 -8.3642 -13.0838 # c3m-c2-oc -5 111.2700 54.5381 -8.3642 -13.0838 # c2-c3m-o3e -6 112.6700 39.5160 -7.4430 -9.5583 # c2-c3m-c3m -7 110.7700 41.4530 -10.6040 5.1290 # c2-c3m-hc -8 111.2700 54.5381 -8.3642 -13.0838 # c3m-c3m-o3e -9 108.7280 58.5446 -10.8088 -12.4006 # o3e-c3m-hc -10 110.7700 41.4530 -10.6040 5.1290 # c3m-c3m-hc -11 107.6600 39.6410 -12.9210 -2.4318 # hc-c3m-hc -12 104.5000 35.7454 -10.0067 -6.2729 # c3m-o3e-c3m -13 118.9000 61.0226 -34.9931 0.0000 # cp-cp-cp -14 123.4200 73.6781 -21.6787 0.0000 # cp-cp-oc -15 117.9400 35.1558 -12.4682 0.0000 # cp-cp-hc -16 120.0500 44.7148 -22.7352 0.0000 # cp-cp-c -17 108.4000 43.9594 -8.3924 -9.3379 # cp-c-c3 -18 111.0000 44.3234 -9.4454 0.0000 # cp-c-cp -19 112.6700 39.5160 -7.4430 -9.5583 # c3-c-c3 -20 110.7700 41.4530 -10.6040 5.1290 # c-c3-hc -21 107.6600 39.6410 -12.9210 -2.4318 # hc-c3-hc -22 102.9695 38.9739 -6.2595 -8.1710 # c2-oc-cp -23 112.4436 47.2337 -10.6612 -10.2062 # c2-na-c2 -24 110.9538 50.8652 -4.4522 -10.0298 # c2-na-hn -25 111.9100 60.7147 -13.3366 -13.0785 # c2-c2-na -26 110.6204 51.3137 -6.7198 -2.6003 # hc-c2-na -27 110.7700 41.4530 -10.6040 5.1290 # c2-c2-hc -28 107.0671 45.2520 -7.5558 -9.5120 # hn-na-hn -29 112.6700 39.5160 -7.4430 -9.5583 # c3m-c3m-c2 -30 110.7700 41.4530 -10.6040 5.1290 # c3-c2-hc -31 111.9100 60.7147 -13.3366 -13.0785 # c3-c2-na -32 112.6700 39.5160 -7.4430 -9.5583 # c2-c3-c2 -33 110.7700 41.4530 -10.6040 5.1290 # c2-c3-hc -34 111.2700 54.5381 -8.3642 -13.0838 # c2-c3-oc -35 108.7280 58.5446 -10.8088 -12.4006 # oc-c3-hc -36 111.2700 54.5381 -8.3642 -13.0838 # c3-c2-oc -37 105.8000 52.7061 -12.1090 -9.8681 # c3-oc-ho -38 108.7280 58.5446 -10.8088 -12.4006 # hc-c3m-o3e -39 110.7700 41.4530 -10.6040 5.1290 # hc-c3m-c3m -40 111.2700 54.5381 -8.3642 -13.0838 # oc-c2-c3m -41 110.7700 41.4530 -10.6040 5.1290 # hc-c2-c3m -42 111.9100 60.7147 -13.3366 -13.0785 # c3m-c2-na -43 112.6700 39.5160 -7.4430 -9.5583 # c2-c3m-c2 -44 111.2700 54.5381 -8.3642 -13.0838 # c2-c3m-oc -45 108.7280 58.5446 -10.8088 -12.4006 # oc-c3m-hc -46 105.8000 52.7061 -12.1090 -9.8681 # c3m-oc-ho -47 111.9100 60.7147 -13.3366 -13.0785 # na-c2-c3 -48 110.7700 41.4530 -10.6040 5.1290 # hc-c2-c3 -49 111.2700 54.5381 -8.3642 -13.0838 # oc-c2-c3 -50 105.8000 52.7061 -12.1090 -9.8681 # ho-oc-c3 +1 hc-c2-c3m-o3e +2 hc-c2-c3m-c3m +3 hc-c2-c3m-hc +4 oc-c2-c3m-o3e +5 oc-c2-c3m-c3m +6 oc-c2-c3m-hc +7 hc-c2-oc-cp +8 c3m-c2-oc-cp +9 c2-c3m-o3e-c3m +10 hc-c3m-o3e-c3m +11 c2-c3m-c3m-o3e +12 c2-c3m-c3m-hc +13 o3e-c3m-c3m-hc +14 hc-c3m-c3m-hc +15 cp-cp-cp-cp +16 cp-cp-cp-hc +17 cp-cp-cp-oc +18 oc-cp-cp-hc +19 cp-cp-oc-c2 +20 hc-cp-cp-hc +21 cp-cp-cp-c +22 c-cp-cp-hc +23 cp-cp-c-c3 +24 cp-cp-c-cp +25 cp-c-c3-hc +26 c3-c-c3-hc +27 c2-c2-na-c2 +28 hc-c2-na-c2 +29 c2-c2-na-hn +30 hc-c2-na-hn +31 na-c2-c2-na +32 hc-c2-c2-na +33 hc-c2-c2-hc +34 c3m-c3m-c2-oc +35 c3m-c3m-c2-hc +36 o3e-c3m-c2-oc +37 o3e-c3m-c2-hc +38 hc-c3m-c2-oc +39 hc-c3m-c2-hc +40 hc-c2-c3-c2 +41 hc-c2-c3-hc +42 hc-c2-c3-oc +43 na-c2-c3-c2 +44 na-c2-c3-hc +45 na-c2-c3-oc +46 c3-c2-na-c2 +47 c3-c2-na-hn +48 oc-c2-c3-c2 +49 oc-c2-c3-hc +50 oc-c2-c3-oc +51 c3-c2-oc-cp +52 c2-c3-oc-ho +53 hc-c3-oc-ho +54 hc-c3m-c3m-o3e +55 hc-c2-c3m-c2 +56 hc-c2-c3m-oc +57 na-c2-c3m-c2 +58 na-c2-c3m-hc +59 na-c2-c3m-oc +60 c3m-c2-na-c2 +61 oc-c2-c3m-c2 +62 oc-c2-c3m-oc +63 c2-c3m-oc-ho +64 hc-c3m-oc-ho +65 ho-oc-c3-c2 +66 ho-oc-c3-hc -Dihedral Coeffs # class2 +Improper Type Labels -1 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000# hc-c2-c3m-o3e -2 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000# hc-c2-c3m-c3m -3 -0.1432 0.0000 0.0617 0.0000 -0.1083 0.0000# hc-c2-c3m-hc -4 -0.1820 0.0000 -0.1084 0.0000 -0.7047 0.0000# oc-c2-c3m-o3e -5 0.7137 0.0000 0.2660 0.0000 -0.2545 0.0000# oc-c2-c3m-c3m -6 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000# oc-c2-c3m-hc -7 0.9513 0.0000 0.1155 0.0000 0.0720 0.0000# hc-c2-oc-cp -8 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000# c3m-c2-oc-cp -9 -0.5203 0.0000 -0.3028 0.0000 -0.3450 0.0000# c2-c3m-o3e-c3m -10 0.5302 0.0000 0.0000 0.0000 -0.3966 0.0000# hc-c3m-o3e-c3m -11 0.7137 0.0000 0.2660 0.0000 -0.2545 0.0000# c2-c3m-c3m-o3e -12 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000# c2-c3m-c3m-hc -13 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000# o3e-c3m-c3m-hc -14 -0.1432 0.0000 0.0617 0.0000 -0.1083 0.0000# hc-c3m-c3m-hc -15 8.3667 0.0000 1.1932 0.0000 0.0000 0.0000# cp-cp-cp-cp -16 0.0000 0.0000 3.9661 0.0000 0.0000 0.0000# cp-cp-cp-hc -17 0.0000 0.0000 4.8498 0.0000 0.0000 0.0000# cp-cp-cp-oc -18 0.0000 0.0000 1.7234 0.0000 0.0000 0.0000# oc-cp-cp-hc -19 0.0000 0.0000 1.5000 0.0000 0.0000 0.0000# cp-cp-oc-c2 -20 0.0000 0.0000 1.8769 0.0000 0.0000 0.0000# hc-cp-cp-hc -21 0.0000 0.0000 4.4072 0.0000 0.0000 0.0000# cp-cp-cp-c -22 0.0000 0.0000 1.5590 0.0000 0.0000 0.0000# c-cp-cp-hc -23 -0.2802 0.0000 -0.0678 0.0000 -0.0122 0.0000# cp-cp-c-c3 -24 -0.2802 0.0000 -0.0678 0.0000 -0.0122 0.0000# cp-cp-c-cp -25 -0.0228 0.0000 0.0280 0.0000 -0.1863 0.0000# cp-c-c3-hc -26 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000# c3-c-c3-hc -27 -0.1406 0.0000 0.4168 0.0000 0.0150 0.0000# c2-c2-na-c2 -28 0.1904 0.0000 -0.1342 0.0000 -0.2460 0.0000# hc-c2-na-c2 -29 -1.1506 0.0000 -0.6344 0.0000 -0.1845 0.0000# c2-c2-na-hn -30 -0.5187 0.0000 -0.4837 0.0000 -0.1692 0.0000# hc-c2-na-hn -31 0.3805 0.0000 0.3547 0.0000 -0.1102 0.0000# na-c2-c2-na -32 -0.2428 0.0000 0.4065 0.0000 -0.3079 0.0000# hc-c2-c2-na -33 -0.1432 0.0000 0.0617 0.0000 -0.1083 0.0000# hc-c2-c2-hc -34 0.7137 0.0000 0.2660 0.0000 -0.2545 0.0000# c3m-c3m-c2-oc -35 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000# c3m-c3m-c2-hc -36 -0.1820 0.0000 -0.1084 0.0000 -0.7047 0.0000# o3e-c3m-c2-oc -37 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000# o3e-c3m-c2-hc -38 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000# hc-c3m-c2-oc -39 -0.1432 0.0000 0.0617 0.0000 -0.1083 0.0000# hc-c3m-c2-hc -40 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000# hc-c2-c3-c2 -41 -0.1432 0.0000 0.0617 0.0000 -0.1083 0.0000# hc-c2-c3-hc -42 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000# hc-c2-c3-oc -43 0.1764 0.0000 0.1766 0.0000 -0.5206 0.0000# na-c2-c3-c2 -44 -0.2428 0.0000 0.4065 0.0000 -0.3079 0.0000# na-c2-c3-hc -45 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000# na-c2-c3-oc -46 -0.1406 0.0000 0.4168 0.0000 0.0150 0.0000# c3-c2-na-c2 -47 -1.1506 0.0000 -0.6344 0.0000 -0.1845 0.0000# c3-c2-na-hn -48 0.7137 0.0000 0.2660 0.0000 -0.2545 0.0000# oc-c2-c3-c2 -49 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000# oc-c2-c3-hc -50 -0.1820 0.0000 -0.1084 0.0000 -0.7047 0.0000# oc-c2-c3-oc -51 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000# c3-c2-oc-cp -52 -0.6732 0.0000 -0.4778 0.0000 -0.1670 0.0000# c2-c3-oc-ho -53 0.1863 0.0000 -0.4338 0.0000 -0.2121 0.0000# hc-c3-oc-ho -54 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000# hc-c3m-c3m-o3e -55 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000# hc-c2-c3m-c2 -56 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000# hc-c2-c3m-oc -57 0.1764 0.0000 0.1766 0.0000 -0.5206 0.0000# na-c2-c3m-c2 -58 -0.2428 0.0000 0.4065 0.0000 -0.3079 0.0000# na-c2-c3m-hc -59 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000# na-c2-c3m-oc -60 -0.1406 0.0000 0.4168 0.0000 0.0150 0.0000# c3m-c2-na-c2 -61 0.7137 0.0000 0.2660 0.0000 -0.2545 0.0000# oc-c2-c3m-c2 -62 -0.1820 0.0000 -0.1084 0.0000 -0.7047 0.0000# oc-c2-c3m-oc -63 -0.6732 0.0000 -0.4778 0.0000 -0.1670 0.0000# c2-c3m-oc-ho -64 0.1863 0.0000 -0.4338 0.0000 -0.2121 0.0000# hc-c3m-oc-ho -65 -0.6732 0.0000 -0.4778 0.0000 -0.1670 0.0000# ho-oc-c3-c2 -66 0.1863 0.0000 -0.4338 0.0000 -0.2121 0.0000# ho-oc-c3-hc +1 cp-cp-cp-oc +2 cp-cp-cp-hc +3 cp-cp-cp-c +4 c2-na-c2-hn +5 c2-na-hn-hn +6 zero6 +7 zero7 +8 zero8 +9 zero9 +10 zero10 +11 zero11 +12 zero12 +13 zero13 +14 zero14 +15 zero15 +16 zero16 +17 zero17 +18 zero18 +19 zero19 +20 zero20 +21 zero21 +22 c2-na-c2-c2 -Improper Coeffs # class2 +Masses -1 13.0421 0.0000 # cp-cp-cp-oc -2 4.8912 0.0000 # cp-cp-cp-hc -3 7.8153 0.0000 # cp-cp-cp-c -4 0.0000 0.0000 # c2-na-c2-hn -5 0.0000 0.0000 # c2-na-hn-hn -6 0.0000 0.0000 -7 0.0000 0.0000 -8 0.0000 0.0000 -9 0.0000 0.0000 -10 0.0000 0.0000 -11 0.0000 0.0000 -12 0.0000 0.0000 -13 0.0000 0.0000 -14 0.0000 0.0000 -15 0.0000 0.0000 -16 0.0000 0.0000 -17 0.0000 0.0000 -18 0.0000 0.0000 -19 0.0000 0.0000 -20 0.0000 0.0000 -21 0.0000 0.0000 -22 0.0000 0.0000 # c2-na-c2-c2 +1 12.011150 +2 12.011150 +3 15.999400 +4 12.011150 +5 12.011150 +6 12.011150 +7 15.999400 +8 1.007970 +9 14.006700 +10 1.007970 +11 1.007970 -BondBond Coeffs +Pair Coeffs # lj/class2/coul/long -1 3.3872 1.5300 1.1010 -2 5.3316 1.1010 1.1010 -3 23.1979 1.4200 1.1010 -4 11.4318 1.5300 1.4200 -5 11.4318 1.5300 1.4200 -6 0.0000 1.5300 1.5300 -7 3.3872 1.5300 1.1010 -8 11.4318 1.5300 1.4200 -9 23.1979 1.4200 1.1010 -10 3.3872 1.5300 1.1010 -11 5.3316 1.1010 1.1010 -12 -7.1131 1.4200 1.4200 -13 68.2856 1.4170 1.4170 -14 48.4754 1.4170 1.3768 -15 1.0795 1.4170 1.0982 -16 12.0676 1.4170 1.5010 -17 0.0000 1.5010 1.5300 -18 0.0000 1.5010 1.5010 -19 0.0000 1.5300 1.5300 -20 3.3872 1.5300 1.1010 -21 5.3316 1.1010 1.1010 -22 0.0000 1.4200 1.3768 -23 -2.1113 1.4570 1.4570 -24 -6.4168 1.4570 1.0060 -25 4.6217 1.5300 1.4570 -26 12.4260 1.1010 1.4570 -27 3.3872 1.5300 1.1010 -28 -1.8749 1.0060 1.0060 -29 0.0000 1.5300 1.5300 -30 3.3872 1.5300 1.1010 -31 4.6217 1.5300 1.4570 -32 0.0000 1.5300 1.5300 -33 3.3872 1.5300 1.1010 -34 11.4318 1.5300 1.4200 -35 23.1979 1.4200 1.1010 -36 11.4318 1.5300 1.4200 -37 -9.6879 1.4200 0.9650 -38 23.1979 1.1010 1.4200 -39 3.3872 1.1010 1.5300 -40 11.4318 1.4200 1.5300 -41 3.3872 1.1010 1.5300 -42 4.6217 1.5300 1.4570 -43 0.0000 1.5300 1.5300 -44 11.4318 1.5300 1.4200 -45 23.1979 1.4200 1.1010 -46 -9.6879 1.4200 0.9650 -47 4.6217 1.4570 1.5300 -48 3.3872 1.1010 1.5300 -49 11.4318 1.4200 1.5300 -50 -9.6879 0.9650 1.4200 +1 0.0540000000 4.0100000000 +2 0.0540000000 4.0100000000 +3 0.2400000000 3.5350000000 +4 0.0640000000 4.0100000000 +5 0.0540000000 4.0100000000 +6 0.0540000000 4.0100000000 +7 0.2400000000 3.5350000000 +8 0.0200000000 2.7000000000 +9 0.0650000000 4.0700000000 +10 0.0130000000 1.0980000000 +11 0.0130000000 1.0980000000 -BondAngle Coeffs +Bond Coeffs # class2 -1 20.7540 11.4210 1.5300 1.1010 -2 18.1030 18.1030 1.1010 1.1010 -3 55.3270 4.6189 1.4200 1.1010 -4 2.6868 20.4033 1.5300 1.4200 -5 2.6868 20.4033 1.5300 1.4200 -6 8.0160 8.0160 1.5300 1.5300 -7 20.7540 11.4210 1.5300 1.1010 -8 2.6868 20.4033 1.5300 1.4200 -9 55.3270 4.6189 1.4200 1.1010 -10 20.7540 11.4210 1.5300 1.1010 -11 18.1030 18.1030 1.1010 1.1010 -12 -2.8112 -2.8112 1.4200 1.4200 -13 28.8708 28.8708 1.4170 1.4170 -14 58.4790 107.6806 1.4170 1.3768 -15 20.0033 24.2183 1.4170 1.0982 -16 31.0771 47.0579 1.4170 1.5010 -17 0.0000 0.0000 1.5010 1.5300 -18 0.0000 0.0000 1.5010 1.5010 -19 8.0160 8.0160 1.5300 1.5300 -20 20.7540 11.4210 1.5300 1.1010 -21 18.1030 18.1030 1.1010 1.1010 -22 0.0000 0.0000 1.4200 1.3768 -23 -7.2229 -7.2229 1.4570 1.4570 -24 31.8096 20.5799 1.4570 1.0060 -25 6.0876 16.5702 1.5300 1.4570 -26 13.4582 42.4332 1.1010 1.4570 -27 20.7540 11.4210 1.5300 1.1010 -28 28.0322 28.0322 1.0060 1.0060 -29 8.0160 8.0160 1.5300 1.5300 -30 20.7540 11.4210 1.5300 1.1010 -31 6.0876 16.5702 1.5300 1.4570 -32 8.0160 8.0160 1.5300 1.5300 -33 20.7540 11.4210 1.5300 1.1010 -34 2.6868 20.4033 1.5300 1.4200 -35 55.3270 4.6189 1.4200 1.1010 -36 2.6868 20.4033 1.5300 1.4200 -37 28.5800 18.9277 1.4200 0.9650 -38 4.6189 55.3270 1.1010 1.4200 -39 11.4210 20.7540 1.1010 1.5300 -40 20.4033 2.6868 1.4200 1.5300 -41 11.4210 20.7540 1.1010 1.5300 -42 6.0876 16.5702 1.5300 1.4570 -43 8.0160 8.0160 1.5300 1.5300 -44 2.6868 20.4033 1.5300 1.4200 -45 55.3270 4.6189 1.4200 1.1010 -46 28.5800 18.9277 1.4200 0.9650 -47 16.5702 6.0876 1.4570 1.5300 -48 11.4210 20.7540 1.1010 1.5300 -49 20.4033 2.6868 1.4200 1.5300 -50 18.9277 28.5800 0.9650 1.4200 +1 1.1010 345.0000 -691.8900 844.6000 +2 1.5300 299.6700 -501.7700 679.8100 +3 1.4200 400.3954 -835.1951 1313.0142 +4 1.4200 400.3954 -835.1951 1313.0142 +5 1.5300 299.6700 -501.7700 679.8100 +6 1.1010 345.0000 -691.8900 844.6000 +7 1.4170 470.8361 -627.6179 1327.6345 +8 1.3768 428.8798 -738.2351 1114.9655 +9 1.0982 372.8251 -803.4526 894.3173 +10 1.5010 321.9021 -521.8208 572.1628 +11 1.5300 299.6700 -501.7700 679.8100 +12 1.1010 345.0000 -691.8900 844.6000 +13 1.4570 365.8052 -699.6368 998.4842 +14 1.0060 466.7400 -1073.6018 1251.1056 +15 1.5300 299.6700 -501.7700 679.8100 +16 1.5300 299.6700 -501.7700 679.8100 +17 1.4200 400.3954 -835.1951 1313.0142 +18 0.9650 532.5062 -1282.9050 2004.7658 +19 1.4200 400.3954 -835.1951 1313.0142 -AngleAngle Coeffs +Angle Coeffs # class2 -1 0.0000 0.0000 0.0000 118.9000 123.4200 123.4200 -2 0.0000 0.0000 0.0000 118.9000 117.9400 117.9400 -3 0.0000 0.0000 0.0000 118.9000 120.0500 120.0500 -4 0.0000 0.0000 0.0000 112.4436 110.9538 110.9538 -5 0.0000 0.0000 0.0000 110.9538 107.0671 110.9538 -6 0.2738 -0.4825 0.2738 110.7700 107.6600 110.7700 -7 0.1689 2.5926 3.9177 111.2700 108.7280 110.7700 -8 2.4259 2.1283 2.4259 108.7280 107.6600 108.7280 -9 -0.8330 -0.8330 -3.5744 112.6700 111.2700 111.2700 -10 0.1689 2.5926 3.9177 111.2700 108.7280 110.7700 -11 -1.3199 -1.3199 0.1184 112.6700 110.7700 110.7700 -12 0.1689 2.5926 3.9177 111.2700 108.7280 110.7700 -13 0.2738 -0.4825 0.2738 110.7700 107.6600 110.7700 -14 2.4259 2.1283 2.4259 108.7280 107.6600 108.7280 -15 0.0000 0.0000 0.0000 108.4000 112.6700 108.4000 -16 0.0000 0.0000 0.0000 111.0000 108.4000 108.4000 -17 0.2738 -0.4825 0.2738 110.7700 107.6600 110.7700 -18 -0.3157 -0.3157 -0.3157 107.6600 107.6600 107.6600 -19 2.4286 0.5381 -2.5301 110.7700 110.6204 111.9100 -20 2.4321 2.4321 -3.5496 107.6600 110.6204 110.6204 -21 0.2738 -0.4825 0.2738 110.7700 107.6600 110.7700 -22 0.0000 0.0000 0.0000 112.4436 112.4436 112.4436 +1 110.7700 41.4530 -10.6040 5.1290 +2 107.6600 39.6410 -12.9210 -2.4318 +3 108.7280 58.5446 -10.8088 -12.4006 +4 111.2700 54.5381 -8.3642 -13.0838 +5 111.2700 54.5381 -8.3642 -13.0838 +6 112.6700 39.5160 -7.4430 -9.5583 +7 110.7700 41.4530 -10.6040 5.1290 +8 111.2700 54.5381 -8.3642 -13.0838 +9 108.7280 58.5446 -10.8088 -12.4006 +10 110.7700 41.4530 -10.6040 5.1290 +11 107.6600 39.6410 -12.9210 -2.4318 +12 104.5000 35.7454 -10.0067 -6.2729 +13 118.9000 61.0226 -34.9931 0.0000 +14 123.4200 73.6781 -21.6787 0.0000 +15 117.9400 35.1558 -12.4682 0.0000 +16 120.0500 44.7148 -22.7352 0.0000 +17 108.4000 43.9594 -8.3924 -9.3379 +18 111.0000 44.3234 -9.4454 0.0000 +19 112.6700 39.5160 -7.4430 -9.5583 +20 110.7700 41.4530 -10.6040 5.1290 +21 107.6600 39.6410 -12.9210 -2.4318 +22 102.9695 38.9739 -6.2595 -8.1710 +23 112.4436 47.2337 -10.6612 -10.2062 +24 110.9538 50.8652 -4.4522 -10.0298 +25 111.9100 60.7147 -13.3366 -13.0785 +26 110.6204 51.3137 -6.7198 -2.6003 +27 110.7700 41.4530 -10.6040 5.1290 +28 107.0671 45.2520 -7.5558 -9.5120 +29 112.6700 39.5160 -7.4430 -9.5583 +30 110.7700 41.4530 -10.6040 5.1290 +31 111.9100 60.7147 -13.3366 -13.0785 +32 112.6700 39.5160 -7.4430 -9.5583 +33 110.7700 41.4530 -10.6040 5.1290 +34 111.2700 54.5381 -8.3642 -13.0838 +35 108.7280 58.5446 -10.8088 -12.4006 +36 111.2700 54.5381 -8.3642 -13.0838 +37 105.8000 52.7061 -12.1090 -9.8681 +38 108.7280 58.5446 -10.8088 -12.4006 +39 110.7700 41.4530 -10.6040 5.1290 +40 111.2700 54.5381 -8.3642 -13.0838 +41 110.7700 41.4530 -10.6040 5.1290 +42 111.9100 60.7147 -13.3366 -13.0785 +43 112.6700 39.5160 -7.4430 -9.5583 +44 111.2700 54.5381 -8.3642 -13.0838 +45 108.7280 58.5446 -10.8088 -12.4006 +46 105.8000 52.7061 -12.1090 -9.8681 +47 111.9100 60.7147 -13.3366 -13.0785 +48 110.7700 41.4530 -10.6040 5.1290 +49 111.2700 54.5381 -8.3642 -13.0838 +50 105.8000 52.7061 -12.1090 -9.8681 -AngleAngleTorsion Coeffs +Dihedral Coeffs # class2 -1 -20.2006 110.7700 111.2700 -2 -16.1640 110.7700 112.6700 -3 -12.5640 110.7700 110.7700 -4 -14.0484 111.2700 111.2700 -5 -29.0420 111.2700 112.6700 -6 -20.2006 111.2700 110.7700 -7 0.0000 108.7280 102.9695 -8 0.0000 111.2700 102.9695 -9 -19.0059 111.2700 104.5000 -10 -16.4438 108.7280 104.5000 -11 -29.0420 112.6700 111.2700 -12 -16.1640 112.6700 110.7700 -13 -20.2006 111.2700 110.7700 -14 -12.5640 110.7700 110.7700 -15 0.0000 118.9000 118.9000 -16 -4.8141 118.9000 117.9400 -17 -21.0247 118.9000 123.4200 -18 4.2296 123.4200 117.9400 -19 0.0000 123.4200 102.9695 -20 0.3598 117.9400 117.9400 -21 -14.4097 118.9000 120.0500 -22 4.4444 120.0500 117.9400 -23 0.0000 120.0500 108.4000 -24 0.0000 120.0500 111.0000 -25 0.0000 108.4000 110.7700 -26 -16.1640 112.6700 110.7700 -27 -24.3818 111.9100 112.4436 -28 -12.5567 110.6204 112.4436 -29 -7.5499 111.9100 110.9538 -30 -10.4258 110.6204 110.9538 -31 -11.2307 111.9100 111.9100 -32 -15.7572 110.7700 111.9100 -33 -12.5640 110.7700 110.7700 -34 -29.0420 112.6700 111.2700 -35 -16.1640 112.6700 110.7700 -36 -14.0484 111.2700 111.2700 -37 -20.2006 111.2700 110.7700 -38 -20.2006 110.7700 111.2700 -39 -12.5640 110.7700 110.7700 -40 -16.1640 110.7700 112.6700 -41 -12.5640 110.7700 110.7700 -42 -20.2006 110.7700 111.2700 -43 -27.3953 111.9100 112.6700 -44 -15.7572 111.9100 110.7700 -45 0.0000 111.9100 111.2700 -46 -24.3818 111.9100 112.4436 -47 -7.5499 111.9100 110.9538 -48 -29.0420 111.2700 112.6700 -49 -20.2006 111.2700 110.7700 -50 -14.0484 111.2700 111.2700 -51 0.0000 111.2700 102.9695 -52 -12.1038 111.2700 105.8000 -53 -10.5093 108.7280 105.8000 -54 -20.2006 110.7700 111.2700 -55 -16.1640 110.7700 112.6700 -56 -20.2006 110.7700 111.2700 -57 -27.3953 111.9100 112.6700 -58 -15.7572 111.9100 110.7700 -59 0.0000 111.9100 111.2700 -60 -24.3818 111.9100 112.4436 -61 -29.0420 111.2700 112.6700 -62 -14.0484 111.2700 111.2700 -63 -12.1038 111.2700 105.8000 -64 -10.5093 108.7280 105.8000 -65 -12.1038 105.8000 111.2700 -66 -10.5093 105.8000 108.7280 +1 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000 +2 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000 +3 -0.1432 0.0000 0.0617 0.0000 -0.1083 0.0000 +4 -0.1820 0.0000 -0.1084 0.0000 -0.7047 0.0000 +5 0.7137 0.0000 0.2660 0.0000 -0.2545 0.0000 +6 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000 +7 0.9513 0.0000 0.1155 0.0000 0.0720 0.0000 +8 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 +9 -0.5203 0.0000 -0.3028 0.0000 -0.3450 0.0000 +10 0.5302 0.0000 0.0000 0.0000 -0.3966 0.0000 +11 0.7137 0.0000 0.2660 0.0000 -0.2545 0.0000 +12 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000 +13 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000 +14 -0.1432 0.0000 0.0617 0.0000 -0.1083 0.0000 +15 8.3667 0.0000 1.1932 0.0000 0.0000 0.0000 +16 0.0000 0.0000 3.9661 0.0000 0.0000 0.0000 +17 0.0000 0.0000 4.8498 0.0000 0.0000 0.0000 +18 0.0000 0.0000 1.7234 0.0000 0.0000 0.0000 +19 0.0000 0.0000 1.5000 0.0000 0.0000 0.0000 +20 0.0000 0.0000 1.8769 0.0000 0.0000 0.0000 +21 0.0000 0.0000 4.4072 0.0000 0.0000 0.0000 +22 0.0000 0.0000 1.5590 0.0000 0.0000 0.0000 +23 -0.2802 0.0000 -0.0678 0.0000 -0.0122 0.0000 +24 -0.2802 0.0000 -0.0678 0.0000 -0.0122 0.0000 +25 -0.0228 0.0000 0.0280 0.0000 -0.1863 0.0000 +26 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000 +27 -0.1406 0.0000 0.4168 0.0000 0.0150 0.0000 +28 0.1904 0.0000 -0.1342 0.0000 -0.2460 0.0000 +29 -1.1506 0.0000 -0.6344 0.0000 -0.1845 0.0000 +30 -0.5187 0.0000 -0.4837 0.0000 -0.1692 0.0000 +31 0.3805 0.0000 0.3547 0.0000 -0.1102 0.0000 +32 -0.2428 0.0000 0.4065 0.0000 -0.3079 0.0000 +33 -0.1432 0.0000 0.0617 0.0000 -0.1083 0.0000 +34 0.7137 0.0000 0.2660 0.0000 -0.2545 0.0000 +35 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000 +36 -0.1820 0.0000 -0.1084 0.0000 -0.7047 0.0000 +37 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000 +38 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000 +39 -0.1432 0.0000 0.0617 0.0000 -0.1083 0.0000 +40 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000 +41 -0.1432 0.0000 0.0617 0.0000 -0.1083 0.0000 +42 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000 +43 0.1764 0.0000 0.1766 0.0000 -0.5206 0.0000 +44 -0.2428 0.0000 0.4065 0.0000 -0.3079 0.0000 +45 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 +46 -0.1406 0.0000 0.4168 0.0000 0.0150 0.0000 +47 -1.1506 0.0000 -0.6344 0.0000 -0.1845 0.0000 +48 0.7137 0.0000 0.2660 0.0000 -0.2545 0.0000 +49 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000 +50 -0.1820 0.0000 -0.1084 0.0000 -0.7047 0.0000 +51 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 +52 -0.6732 0.0000 -0.4778 0.0000 -0.1670 0.0000 +53 0.1863 0.0000 -0.4338 0.0000 -0.2121 0.0000 +54 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000 +55 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000 +56 -0.1435 0.0000 0.2530 0.0000 -0.0905 0.0000 +57 0.1764 0.0000 0.1766 0.0000 -0.5206 0.0000 +58 -0.2428 0.0000 0.4065 0.0000 -0.3079 0.0000 +59 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 +60 -0.1406 0.0000 0.4168 0.0000 0.0150 0.0000 +61 0.7137 0.0000 0.2660 0.0000 -0.2545 0.0000 +62 -0.1820 0.0000 -0.1084 0.0000 -0.7047 0.0000 +63 -0.6732 0.0000 -0.4778 0.0000 -0.1670 0.0000 +64 0.1863 0.0000 -0.4338 0.0000 -0.2121 0.0000 +65 -0.6732 0.0000 -0.4778 0.0000 -0.1670 0.0000 +66 0.1863 0.0000 -0.4338 0.0000 -0.2121 0.0000 -EndBondTorsion Coeffs +Improper Coeffs # class2 -1 0.9681 0.9551 0.0436 0.5903 0.6669 0.8584 1.1010 1.4200 -2 0.0814 0.0591 0.2219 0.2486 0.2422 -0.0925 1.1010 1.5300 -3 0.2130 0.3120 0.0777 0.2130 0.3120 0.0777 1.1010 1.1010 -4 1.0165 0.7553 -0.4609 1.0165 0.7553 -0.4609 1.4200 1.4200 -5 1.1538 0.8409 -0.9138 -0.3190 0.4411 -0.7174 1.4200 1.5300 -6 0.5903 0.6669 0.8584 0.9681 0.9551 0.0436 1.4200 1.1010 -7 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.1010 1.3768 -8 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.5300 1.3768 -9 -0.2456 1.0517 -0.7795 0.4741 1.2635 0.5576 1.5300 1.4200 -10 -0.6054 1.3339 0.9648 -0.1620 0.1564 -1.1408 1.1010 1.4200 -11 -0.3190 0.4411 -0.7174 1.1538 0.8409 -0.9138 1.5300 1.4200 -12 0.2486 0.2422 -0.0925 0.0814 0.0591 0.2219 1.5300 1.1010 -13 0.5903 0.6669 0.8584 0.9681 0.9551 0.0436 1.4200 1.1010 -14 0.2130 0.3120 0.0777 0.2130 0.3120 0.0777 1.1010 1.1010 -15 -0.1185 6.3204 0.0000 -0.1185 6.3204 0.0000 1.4170 1.4170 -16 0.0000 -6.8958 0.0000 0.0000 -0.4669 0.0000 1.4170 1.0982 -17 0.0000 0.2655 0.0000 0.0000 4.8905 0.0000 1.4170 1.3768 -18 0.0000 4.2641 0.0000 0.0000 -1.5867 0.0000 1.3768 1.0982 -19 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.4170 1.4200 -20 0.0000 -0.6890 0.0000 0.0000 -0.6890 0.0000 1.0982 1.0982 -21 0.0000 -0.6918 0.0000 0.0000 0.2421 0.0000 1.4170 1.5010 -22 0.0000 -1.7970 0.0000 0.0000 -0.4879 0.0000 1.5010 1.0982 -23 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.4170 1.5300 -24 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.4170 1.5010 -25 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.5010 1.1010 -26 0.2486 0.2422 -0.0925 0.0814 0.0591 0.2219 1.5300 1.1010 -27 0.0997 -0.0046 -0.2657 -0.0128 -0.0495 -0.1079 1.5300 1.4570 -28 -0.5892 0.7140 0.3505 0.0628 0.0873 -0.0882 1.1010 1.4570 -29 -0.9466 0.9356 -0.5542 0.0570 0.0625 0.4112 1.5300 1.0060 -30 -1.1685 0.9266 -0.0993 0.0850 0.3061 0.2104 1.1010 1.0060 -31 0.0286 0.0566 -0.0493 0.0286 0.0566 -0.0493 1.4570 1.4570 -32 0.1960 0.7056 0.1120 0.1022 0.2090 0.6433 1.1010 1.4570 -33 0.2130 0.3120 0.0777 0.2130 0.3120 0.0777 1.1010 1.1010 -34 -0.3190 0.4411 -0.7174 1.1538 0.8409 -0.9138 1.5300 1.4200 -35 0.2486 0.2422 -0.0925 0.0814 0.0591 0.2219 1.5300 1.1010 -36 1.0165 0.7553 -0.4609 1.0165 0.7553 -0.4609 1.4200 1.4200 -37 0.5903 0.6669 0.8584 0.9681 0.9551 0.0436 1.4200 1.1010 -38 0.9681 0.9551 0.0436 0.5903 0.6669 0.8584 1.1010 1.4200 -39 0.2130 0.3120 0.0777 0.2130 0.3120 0.0777 1.1010 1.1010 -40 0.0814 0.0591 0.2219 0.2486 0.2422 -0.0925 1.1010 1.5300 -41 0.2130 0.3120 0.0777 0.2130 0.3120 0.0777 1.1010 1.1010 -42 0.9681 0.9551 0.0436 0.5903 0.6669 0.8584 1.1010 1.4200 -43 0.0579 -0.0043 -0.1906 0.1032 0.5896 -0.4836 1.4570 1.5300 -44 0.1022 0.2090 0.6433 0.1960 0.7056 0.1120 1.4570 1.1010 -45 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.4570 1.4200 -46 0.0997 -0.0046 -0.2657 -0.0128 -0.0495 -0.1079 1.5300 1.4570 -47 -0.9466 0.9356 -0.5542 0.0570 0.0625 0.4112 1.5300 1.0060 -48 1.1538 0.8409 -0.9138 -0.3190 0.4411 -0.7174 1.4200 1.5300 -49 0.5903 0.6669 0.8584 0.9681 0.9551 0.0436 1.4200 1.1010 -50 1.0165 0.7553 -0.4609 1.0165 0.7553 -0.4609 1.4200 1.4200 -51 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.5300 1.3768 -52 -0.5800 0.9004 0.0000 0.0000 0.5343 0.9025 1.5300 0.9650 -53 -1.7554 1.3145 0.2263 0.2493 0.6803 0.0000 1.1010 0.9650 -54 0.9681 0.9551 0.0436 0.5903 0.6669 0.8584 1.1010 1.4200 -55 0.0814 0.0591 0.2219 0.2486 0.2422 -0.0925 1.1010 1.5300 -56 0.9681 0.9551 0.0436 0.5903 0.6669 0.8584 1.1010 1.4200 -57 0.0579 -0.0043 -0.1906 0.1032 0.5896 -0.4836 1.4570 1.5300 -58 0.1022 0.2090 0.6433 0.1960 0.7056 0.1120 1.4570 1.1010 -59 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.4570 1.4200 -60 0.0997 -0.0046 -0.2657 -0.0128 -0.0495 -0.1079 1.5300 1.4570 -61 1.1538 0.8409 -0.9138 -0.3190 0.4411 -0.7174 1.4200 1.5300 -62 1.0165 0.7553 -0.4609 1.0165 0.7553 -0.4609 1.4200 1.4200 -63 -0.5800 0.9004 0.0000 0.0000 0.5343 0.9025 1.5300 0.9650 -64 -1.7554 1.3145 0.2263 0.2493 0.6803 0.0000 1.1010 0.9650 -65 0.0000 0.5343 0.9025 -0.5800 0.9004 0.0000 0.9650 1.5300 -66 0.2493 0.6803 0.0000 -1.7554 1.3145 0.2263 0.9650 1.1010 +1 13.0421 0.0000 # cp-cp-cp-oc +2 4.8912 0.0000 # cp-cp-cp-hc +3 7.8153 0.0000 # cp-cp-cp-c +4 0.0000 0.0000 # c2-na-c2-hn +5 0.0000 0.0000 # c2-na-hn-hn +6 0.0000 0.0000 +7 0.0000 0.0000 +8 0.0000 0.0000 +9 0.0000 0.0000 +10 0.0000 0.0000 +11 0.0000 0.0000 +12 0.0000 0.0000 +13 0.0000 0.0000 +14 0.0000 0.0000 +15 0.0000 0.0000 +16 0.0000 0.0000 +17 0.0000 0.0000 +18 0.0000 0.0000 +19 0.0000 0.0000 +20 0.0000 0.0000 +21 0.0000 0.0000 +22 0.0000 0.0000 # c2-na-c2-c2 -MiddleBondTorsion Coeffs +BondBond Coeffs -1 -16.7975 -1.2296 -0.2750 1.5300 -2 -14.8790 -3.6581 -0.3138 1.5300 -3 -14.2610 -0.5322 -0.4864 1.5300 -4 -17.2585 -3.6157 -0.8364 1.5300 -5 -21.8842 -7.6764 -0.6868 1.5300 -6 -16.7975 -1.2296 -0.2750 1.5300 -7 0.0000 0.0000 0.0000 1.4200 -8 0.0000 0.0000 0.0000 1.4200 -9 -5.9288 -2.7007 -0.3175 1.4200 -10 -6.8007 -4.6546 -1.4101 1.4200 -11 -21.8842 -7.6764 -0.6868 1.5300 -12 -14.8790 -3.6581 -0.3138 1.5300 -13 -16.7975 -1.2296 -0.2750 1.5300 -14 -14.2610 -0.5322 -0.4864 1.5300 -15 27.5989 -2.3120 0.0000 1.4170 -16 0.0000 -1.1521 0.0000 1.4170 -17 0.0000 4.8255 0.0000 1.4170 -18 0.0000 5.5432 0.0000 1.4170 -19 0.0000 0.0000 0.0000 1.3768 -20 0.0000 4.8228 0.0000 1.4170 -21 0.0000 9.1792 0.0000 1.4170 -22 0.0000 3.9421 0.0000 1.4170 -23 0.0000 0.0000 0.0000 1.5010 -24 0.0000 0.0000 0.0000 1.5010 -25 0.0000 0.0000 0.0000 1.5300 -26 -14.8790 -3.6581 -0.3138 1.5300 -27 -8.0036 -7.7321 -3.0640 1.4570 -28 -6.4529 -6.8122 -1.1632 1.4570 -29 -2.2208 0.5479 -0.3527 1.4570 -30 -3.4611 1.6996 -0.6007 1.4570 -31 -3.3497 1.0143 -3.0062 1.5300 -32 -10.4959 -0.7647 -0.0545 1.5300 -33 -14.2610 -0.5322 -0.4864 1.5300 -34 -21.8842 -7.6764 -0.6868 1.5300 -35 -14.8790 -3.6581 -0.3138 1.5300 -36 -17.2585 -3.6157 -0.8364 1.5300 -37 -16.7975 -1.2296 -0.2750 1.5300 -38 -16.7975 -1.2296 -0.2750 1.5300 -39 -14.2610 -0.5322 -0.4864 1.5300 -40 -14.8790 -3.6581 -0.3138 1.5300 -41 -14.2610 -0.5322 -0.4864 1.5300 -42 -16.7975 -1.2296 -0.2750 1.5300 -43 -15.4174 -7.3055 -1.0749 1.5300 -44 -10.4959 -0.7647 -0.0545 1.5300 -45 0.0000 0.0000 0.0000 1.5300 -46 -8.0036 -7.7321 -3.0640 1.4570 -47 -2.2208 0.5479 -0.3527 1.4570 -48 -21.8842 -7.6764 -0.6868 1.5300 -49 -16.7975 -1.2296 -0.2750 1.5300 -50 -17.2585 -3.6157 -0.8364 1.5300 -51 0.0000 0.0000 0.0000 1.4200 -52 1.2472 0.0000 0.7485 1.4200 -53 0.0000 0.9241 -0.5889 1.4200 -54 -16.7975 -1.2296 -0.2750 1.5300 -55 -14.8790 -3.6581 -0.3138 1.5300 -56 -16.7975 -1.2296 -0.2750 1.5300 -57 -15.4174 -7.3055 -1.0749 1.5300 -58 -10.4959 -0.7647 -0.0545 1.5300 -59 0.0000 0.0000 0.0000 1.5300 -60 -8.0036 -7.7321 -3.0640 1.4570 -61 -21.8842 -7.6764 -0.6868 1.5300 -62 -17.2585 -3.6157 -0.8364 1.5300 -63 1.2472 0.0000 0.7485 1.4200 -64 0.0000 0.9241 -0.5889 1.4200 -65 1.2472 0.0000 0.7485 1.4200 -66 0.0000 0.9241 -0.5889 1.4200 +1 3.3872 1.5300 1.1010 +2 5.3316 1.1010 1.1010 +3 23.1979 1.4200 1.1010 +4 11.4318 1.5300 1.4200 +5 11.4318 1.5300 1.4200 +6 0.0000 1.5300 1.5300 +7 3.3872 1.5300 1.1010 +8 11.4318 1.5300 1.4200 +9 23.1979 1.4200 1.1010 +10 3.3872 1.5300 1.1010 +11 5.3316 1.1010 1.1010 +12 -7.1131 1.4200 1.4200 +13 68.2856 1.4170 1.4170 +14 48.4754 1.4170 1.3768 +15 1.0795 1.4170 1.0982 +16 12.0676 1.4170 1.5010 +17 0.0000 1.5010 1.5300 +18 0.0000 1.5010 1.5010 +19 0.0000 1.5300 1.5300 +20 3.3872 1.5300 1.1010 +21 5.3316 1.1010 1.1010 +22 0.0000 1.4200 1.3768 +23 -2.1113 1.4570 1.4570 +24 -6.4168 1.4570 1.0060 +25 4.6217 1.5300 1.4570 +26 12.4260 1.1010 1.4570 +27 3.3872 1.5300 1.1010 +28 -1.8749 1.0060 1.0060 +29 0.0000 1.5300 1.5300 +30 3.3872 1.5300 1.1010 +31 4.6217 1.5300 1.4570 +32 0.0000 1.5300 1.5300 +33 3.3872 1.5300 1.1010 +34 11.4318 1.5300 1.4200 +35 23.1979 1.4200 1.1010 +36 11.4318 1.5300 1.4200 +37 -9.6879 1.4200 0.9650 +38 23.1979 1.1010 1.4200 +39 3.3872 1.1010 1.5300 +40 11.4318 1.4200 1.5300 +41 3.3872 1.1010 1.5300 +42 4.6217 1.5300 1.4570 +43 0.0000 1.5300 1.5300 +44 11.4318 1.5300 1.4200 +45 23.1979 1.4200 1.1010 +46 -9.6879 1.4200 0.9650 +47 4.6217 1.4570 1.5300 +48 3.3872 1.1010 1.5300 +49 11.4318 1.4200 1.5300 +50 -9.6879 0.9650 1.4200 -BondBond13 Coeffs +BondAngle Coeffs -1 0.0000 1.1010 1.4200 -2 0.0000 1.1010 1.5300 -3 0.0000 1.1010 1.1010 -4 0.0000 1.4200 1.4200 -5 0.0000 1.4200 1.5300 -6 0.0000 1.4200 1.1010 -7 0.0000 1.1010 1.3768 -8 0.0000 1.5300 1.3768 -9 0.0000 1.5300 1.4200 -10 0.0000 1.1010 1.4200 -11 0.0000 1.5300 1.4200 -12 0.0000 1.5300 1.1010 -13 0.0000 1.4200 1.1010 -14 0.0000 1.1010 1.1010 -15 53.0000 1.4170 1.4170 -16 -6.2741 1.4170 1.0982 -17 -2.2436 1.4170 1.3768 -18 2.0517 1.3768 1.0982 -19 0.0000 1.4170 1.4200 -20 -1.7077 1.0982 1.0982 -21 2.5085 1.4170 1.5010 -22 0.8743 1.5010 1.0982 -23 0.0000 1.4170 1.5300 -24 0.0000 1.4170 1.5010 -25 0.0000 1.5010 1.1010 -26 0.0000 1.5300 1.1010 -27 0.0000 1.5300 1.4570 -28 0.0000 1.1010 1.4570 -29 0.0000 1.5300 1.0060 -30 0.0000 1.1010 1.0060 -31 0.0000 1.4570 1.4570 -32 0.0000 1.1010 1.4570 -33 0.0000 1.1010 1.1010 -34 0.0000 1.5300 1.4200 -35 0.0000 1.5300 1.1010 -36 0.0000 1.4200 1.4200 -37 0.0000 1.4200 1.1010 -38 0.0000 1.1010 1.4200 -39 0.0000 1.1010 1.1010 -40 0.0000 1.1010 1.5300 -41 0.0000 1.1010 1.1010 -42 0.0000 1.1010 1.4200 -43 0.0000 1.4570 1.5300 -44 0.0000 1.4570 1.1010 -45 0.0000 1.4570 1.4200 -46 0.0000 1.5300 1.4570 -47 0.0000 1.5300 1.0060 -48 0.0000 1.4200 1.5300 -49 0.0000 1.4200 1.1010 -50 0.0000 1.4200 1.4200 -51 0.0000 1.5300 1.3768 -52 0.0000 1.5300 0.9650 -53 0.0000 1.1010 0.9650 -54 0.0000 1.1010 1.4200 -55 0.0000 1.1010 1.5300 -56 0.0000 1.1010 1.4200 -57 0.0000 1.4570 1.5300 -58 0.0000 1.4570 1.1010 -59 0.0000 1.4570 1.4200 -60 0.0000 1.5300 1.4570 -61 0.0000 1.4200 1.5300 -62 0.0000 1.4200 1.4200 -63 0.0000 1.5300 0.9650 -64 0.0000 1.1010 0.9650 -65 0.0000 0.9650 1.5300 -66 0.0000 0.9650 1.1010 +1 20.7540 11.4210 1.5300 1.1010 +2 18.1030 18.1030 1.1010 1.1010 +3 55.3270 4.6189 1.4200 1.1010 +4 2.6868 20.4033 1.5300 1.4200 +5 2.6868 20.4033 1.5300 1.4200 +6 8.0160 8.0160 1.5300 1.5300 +7 20.7540 11.4210 1.5300 1.1010 +8 2.6868 20.4033 1.5300 1.4200 +9 55.3270 4.6189 1.4200 1.1010 +10 20.7540 11.4210 1.5300 1.1010 +11 18.1030 18.1030 1.1010 1.1010 +12 -2.8112 -2.8112 1.4200 1.4200 +13 28.8708 28.8708 1.4170 1.4170 +14 58.4790 107.6806 1.4170 1.3768 +15 20.0033 24.2183 1.4170 1.0982 +16 31.0771 47.0579 1.4170 1.5010 +17 0.0000 0.0000 1.5010 1.5300 +18 0.0000 0.0000 1.5010 1.5010 +19 8.0160 8.0160 1.5300 1.5300 +20 20.7540 11.4210 1.5300 1.1010 +21 18.1030 18.1030 1.1010 1.1010 +22 0.0000 0.0000 1.4200 1.3768 +23 -7.2229 -7.2229 1.4570 1.4570 +24 31.8096 20.5799 1.4570 1.0060 +25 6.0876 16.5702 1.5300 1.4570 +26 13.4582 42.4332 1.1010 1.4570 +27 20.7540 11.4210 1.5300 1.1010 +28 28.0322 28.0322 1.0060 1.0060 +29 8.0160 8.0160 1.5300 1.5300 +30 20.7540 11.4210 1.5300 1.1010 +31 6.0876 16.5702 1.5300 1.4570 +32 8.0160 8.0160 1.5300 1.5300 +33 20.7540 11.4210 1.5300 1.1010 +34 2.6868 20.4033 1.5300 1.4200 +35 55.3270 4.6189 1.4200 1.1010 +36 2.6868 20.4033 1.5300 1.4200 +37 28.5800 18.9277 1.4200 0.9650 +38 4.6189 55.3270 1.1010 1.4200 +39 11.4210 20.7540 1.1010 1.5300 +40 20.4033 2.6868 1.4200 1.5300 +41 11.4210 20.7540 1.1010 1.5300 +42 6.0876 16.5702 1.5300 1.4570 +43 8.0160 8.0160 1.5300 1.5300 +44 2.6868 20.4033 1.5300 1.4200 +45 55.3270 4.6189 1.4200 1.1010 +46 28.5800 18.9277 1.4200 0.9650 +47 16.5702 6.0876 1.4570 1.5300 +48 11.4210 20.7540 1.1010 1.5300 +49 20.4033 2.6868 1.4200 1.5300 +50 18.9277 28.5800 0.9650 1.4200 -AngleTorsion Coeffs +AngleAngle Coeffs -1 2.3668 2.4920 -1.0122 -0.1892 0.4918 0.7273 110.7700 111.2700 -2 0.3113 0.4516 -0.1988 -0.2454 0.0000 -0.1136 110.7700 112.6700 -3 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.7700 110.7700 -4 0.5511 0.9737 -0.6673 0.5511 0.9737 -0.6673 111.2700 111.2700 -5 0.9672 -0.7566 -1.2331 0.5623 -0.3041 -0.4015 111.2700 112.6700 -6 -0.1892 0.4918 0.7273 2.3668 2.4920 -1.0122 111.2700 110.7700 -7 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 108.7280 102.9695 -8 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 111.2700 102.9695 -9 -2.7466 1.4877 -0.8955 0.5676 0.9450 0.0703 111.2700 104.5000 -10 -1.8234 1.6393 0.5144 -0.7777 0.4340 -0.6653 108.7280 104.5000 -11 0.5623 -0.3041 -0.4015 0.9672 -0.7566 -1.2331 112.6700 111.2700 -12 -0.2454 0.0000 -0.1136 0.3113 0.4516 -0.1988 112.6700 110.7700 -13 -0.1892 0.4918 0.7273 2.3668 2.4920 -1.0122 111.2700 110.7700 -14 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.7700 110.7700 -15 1.9767 1.0239 0.0000 1.9767 1.0239 0.0000 118.9000 118.9000 -16 0.0000 2.5014 0.0000 0.0000 2.7147 0.0000 118.9000 117.9400 -17 0.0000 10.0155 0.0000 0.0000 1.7404 0.0000 118.9000 123.4200 -18 0.0000 2.5706 0.0000 0.0000 1.8729 0.0000 123.4200 117.9400 -19 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 123.4200 102.9695 -20 0.0000 2.4501 0.0000 0.0000 2.4501 0.0000 117.9400 117.9400 -21 0.0000 3.8987 0.0000 0.0000 -4.4683 0.0000 118.9000 120.0500 -22 0.0000 -0.1242 0.0000 0.0000 3.4601 0.0000 120.0500 117.9400 -23 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 120.0500 108.4000 -24 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 120.0500 111.0000 -25 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 108.4000 110.7700 -26 -0.2454 0.0000 -0.1136 0.3113 0.4516 -0.1988 112.6700 110.7700 -27 -2.7883 1.5193 1.4796 1.2031 1.3645 -0.7071 111.9100 112.4436 -28 -2.6321 0.9353 -0.8398 -1.3582 0.1465 -0.5729 110.6204 112.4436 -29 -3.3430 4.4558 -0.0346 0.2873 -0.8072 -0.0960 111.9100 110.9538 -30 -3.9582 2.0063 0.3213 -0.4294 -0.4442 -0.6141 110.6204 110.9538 -31 1.3673 0.4528 -2.7700 1.3673 0.4528 -2.7700 111.9100 111.9100 -32 0.5111 1.6328 -1.0155 -1.1075 0.2820 0.8318 110.7700 111.9100 -33 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.7700 110.7700 -34 0.5623 -0.3041 -0.4015 0.9672 -0.7566 -1.2331 112.6700 111.2700 -35 -0.2454 0.0000 -0.1136 0.3113 0.4516 -0.1988 112.6700 110.7700 -36 0.5511 0.9737 -0.6673 0.5511 0.9737 -0.6673 111.2700 111.2700 -37 -0.1892 0.4918 0.7273 2.3668 2.4920 -1.0122 111.2700 110.7700 -38 2.3668 2.4920 -1.0122 -0.1892 0.4918 0.7273 110.7700 111.2700 -39 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.7700 110.7700 -40 0.3113 0.4516 -0.1988 -0.2454 0.0000 -0.1136 110.7700 112.6700 -41 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.7700 110.7700 -42 2.3668 2.4920 -1.0122 -0.1892 0.4918 0.7273 110.7700 111.2700 -43 2.0125 0.9440 -2.7612 -1.9225 -1.3450 0.2210 111.9100 112.6700 -44 -1.1075 0.2820 0.8318 0.5111 1.6328 -1.0155 111.9100 110.7700 -45 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 111.9100 111.2700 -46 -2.7883 1.5193 1.4796 1.2031 1.3645 -0.7071 111.9100 112.4436 -47 -3.3430 4.4558 -0.0346 0.2873 -0.8072 -0.0960 111.9100 110.9538 -48 0.9672 -0.7566 -1.2331 0.5623 -0.3041 -0.4015 111.2700 112.6700 -49 -0.1892 0.4918 0.7273 2.3668 2.4920 -1.0122 111.2700 110.7700 -50 0.5511 0.9737 -0.6673 0.5511 0.9737 -0.6673 111.2700 111.2700 -51 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 111.2700 102.9695 -52 -3.5903 2.5225 0.4888 0.8726 -0.3577 0.3888 111.2700 105.8000 -53 -3.4060 1.6396 0.0737 0.0000 -0.2810 -0.5944 108.7280 105.8000 -54 2.3668 2.4920 -1.0122 -0.1892 0.4918 0.7273 110.7700 111.2700 -55 0.3113 0.4516 -0.1988 -0.2454 0.0000 -0.1136 110.7700 112.6700 -56 2.3668 2.4920 -1.0122 -0.1892 0.4918 0.7273 110.7700 111.2700 -57 2.0125 0.9440 -2.7612 -1.9225 -1.3450 0.2210 111.9100 112.6700 -58 -1.1075 0.2820 0.8318 0.5111 1.6328 -1.0155 111.9100 110.7700 -59 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 111.9100 111.2700 -60 -2.7883 1.5193 1.4796 1.2031 1.3645 -0.7071 111.9100 112.4436 -61 0.9672 -0.7566 -1.2331 0.5623 -0.3041 -0.4015 111.2700 112.6700 -62 0.5511 0.9737 -0.6673 0.5511 0.9737 -0.6673 111.2700 111.2700 -63 -3.5903 2.5225 0.4888 0.8726 -0.3577 0.3888 111.2700 105.8000 -64 -3.4060 1.6396 0.0737 0.0000 -0.2810 -0.5944 108.7280 105.8000 -65 0.8726 -0.3577 0.3888 -3.5903 2.5225 0.4888 105.8000 111.2700 -66 0.0000 -0.2810 -0.5944 -3.4060 1.6396 0.0737 105.8000 108.7280 +1 0.0000 0.0000 0.0000 118.9000 123.4200 123.4200 +2 0.0000 0.0000 0.0000 118.9000 117.9400 117.9400 +3 0.0000 0.0000 0.0000 118.9000 120.0500 120.0500 +4 0.0000 0.0000 0.0000 112.4436 110.9538 110.9538 +5 0.0000 0.0000 0.0000 110.9538 107.0671 110.9538 +6 0.2738 -0.4825 0.2738 110.7700 107.6600 110.7700 +7 0.1689 2.5926 3.9177 111.2700 108.7280 110.7700 +8 2.4259 2.1283 2.4259 108.7280 107.6600 108.7280 +9 -0.8330 -0.8330 -3.5744 112.6700 111.2700 111.2700 +10 0.1689 2.5926 3.9177 111.2700 108.7280 110.7700 +11 -1.3199 -1.3199 0.1184 112.6700 110.7700 110.7700 +12 0.1689 2.5926 3.9177 111.2700 108.7280 110.7700 +13 0.2738 -0.4825 0.2738 110.7700 107.6600 110.7700 +14 2.4259 2.1283 2.4259 108.7280 107.6600 108.7280 +15 0.0000 0.0000 0.0000 108.4000 112.6700 108.4000 +16 0.0000 0.0000 0.0000 111.0000 108.4000 108.4000 +17 0.2738 -0.4825 0.2738 110.7700 107.6600 110.7700 +18 -0.3157 -0.3157 -0.3157 107.6600 107.6600 107.6600 +19 2.4286 0.5381 -2.5301 110.7700 110.6204 111.9100 +20 2.4321 2.4321 -3.5496 107.6600 110.6204 110.6204 +21 0.2738 -0.4825 0.2738 110.7700 107.6600 110.7700 +22 0.0000 0.0000 0.0000 112.4436 112.4436 112.4436 -Atoms # full +AngleAngleTorsion Coeffs -1 1 1 0.000000 25.246496201 -1.871744037 -8.651348114 0 0 0 # c2 -2 1 2 0.000000 25.610639572 -3.288228035 -8.165973663 0 0 0 # c3m -3 1 2 0.000000 24.731319427 -4.483242989 -8.675741196 0 0 0 # c3m -4 1 2 0.000000 18.703355789 9.118826866 -4.174236774 0 0 0 # c3m -5 1 2 0.000000 18.099748611 8.263649940 -5.343001842 0 0 0 # c3m -6 1 1 0.000000 19.081827164 7.609607220 -6.334177017 0 0 0 # c2 -7 1 3 0.100000 26.190139771 -4.295329094 -9.220970154 0 0 0 # o3e -8 1 3 0.100000 17.971729279 9.827675819 -5.367077827 0 0 0 # o3e -9 1 4 0.000000 20.263877869 5.733595848 -6.736782074 0 0 0 # cp -10 1 4 0.000000 19.777191162 4.983679771 -7.809411049 0 0 0 # cp -11 1 4 0.000000 20.667026520 4.390971184 -8.707633972 0 0 0 # cp -12 1 4 0.000000 22.043539047 4.548151016 -8.533248901 0 0 0 # cp -13 1 4 0.000000 22.530214310 5.298062801 -7.460619926 0 0 0 # cp -14 1 4 0.000000 21.640394211 5.890783787 -6.562390804 0 0 0 # cp -15 1 5 0.000000 23.005182266 3.906831026 -9.503917694 0 0 0 # c -16 1 6 0.000000 24.286390305 4.758069992 -9.590908051 0 0 0 # c3 -17 1 6 0.000000 22.342786789 3.812531948 -10.891778946 0 0 0 # c3 -18 1 4 0.000000 23.361906052 2.519830942 -9.029184341 0 0 0 # cp -19 1 4 0.000000 24.458705902 2.330889940 -8.185920715 0 0 0 # cp -20 1 4 0.000000 24.788816452 1.047963977 -7.745534897 0 0 0 # cp -21 1 4 0.000000 24.022008896 -0.046867002 -8.149927139 0 0 0 # cp -22 1 4 0.000000 22.925630569 0.140873000 -8.992565155 0 0 0 # cp -23 1 4 0.000000 22.595729828 1.424777985 -9.432847977 0 0 0 # cp -24 1 7 0.000000 19.414030075 6.299984932 -5.878956795 0 0 0 # oc -25 1 7 0.000000 24.338140488 -1.273216963 -7.729548931 0 0 0 # oc -26 1 8 0.000000 26.150024414 -1.266484976 -8.715751648 0 0 0 # hc -27 1 8 0.000000 24.778566360 -1.933199048 -9.633987427 0 0 0 # hc -28 1 8 0.000000 25.929294586 -2.927781105 -7.187973022 0 0 0 # hc -29 1 8 0.000000 24.549385071 -5.308847904 -7.987242222 0 0 0 # hc -30 1 8 0.000000 23.904827118 -4.254271030 -9.348136902 0 0 0 # hc -31 1 8 0.000000 18.194736481 9.091637611 -3.210949898 0 0 0 # hc -32 1 8 0.000000 19.788938522 9.208558083 -4.119643211 0 0 0 # hc -33 1 8 0.000000 17.399309158 7.432216167 -5.407801151 0 0 0 # hc -34 1 8 0.000000 18.616250992 7.545570850 -7.316913128 0 0 0 # hc -35 1 8 0.000000 19.987047195 8.212498665 -6.399401188 0 0 0 # hc -36 1 8 0.000000 18.713207245 4.862418175 -7.944396973 0 0 0 # hc -37 1 8 0.000000 20.290582657 3.811013937 -9.537291527 0 0 0 # hc -38 1 8 0.000000 23.594188690 5.419342995 -7.325634956 0 0 0 # hc -39 1 8 0.000000 22.016828537 6.470753193 -5.732734203 0 0 0 # hc -40 1 8 0.000000 24.982324600 4.297049999 -10.290958405 0 0 0 # hc -41 1 8 0.000000 24.034254074 5.760886192 -9.936174393 0 0 0 # hc -42 1 8 0.000000 24.749143600 4.819462776 -8.606439590 0 0 0 # hc -43 1 8 0.000000 23.034755707 3.349560976 -11.594371796 0 0 0 # hc -44 1 8 0.000000 21.438467026 3.207982063 -10.822364807 0 0 0 # hc -45 1 8 0.000000 22.084871292 4.811752796 -11.239845276 0 0 0 # hc -46 1 8 0.000000 25.050769806 3.177418947 -7.873311996 0 0 0 # hc -47 1 8 0.000000 25.636974335 0.901705027 -7.093626022 0 0 0 # hc -48 1 8 0.000000 22.333581924 -0.705653012 -9.305183411 0 0 0 # hc -49 1 8 0.000000 21.747369766 1.570054054 -10.084861755 0 0 0 # hc -50 1 1 0.000000 25.222612381 -4.200571060 0.463562995 0 0 0 # c2 -51 1 2 0.000000 25.832977295 -5.360119820 -0.347983003 0 0 0 # c3m -52 1 2 0.000000 27.389345169 -5.551681042 -0.290704012 0 0 0 # c3m -53 1 2 0.000000 20.635538101 8.396902084 -1.535487056 0 0 0 # c3m -54 1 2 0.000000 21.957460403 8.158697128 -0.723941982 0 0 0 # c3m -55 1 1 0.000000 22.041673660 6.895174980 0.154822007 0 0 0 # c2 -56 1 3 0.100000 26.447082520 -6.565405846 0.448491007 0 0 0 # o3e -57 1 3 0.100000 20.959102631 9.287891388 -0.285212994 0 0 0 # o3e -58 1 4 0.000000 22.680345535 4.733430862 0.158248007 0 0 0 # cp -59 1 4 0.000000 23.824728012 4.488029957 0.920358002 0 0 0 # cp -60 1 4 0.000000 23.901163101 3.343113899 1.716701984 0 0 0 # cp -61 1 4 0.000000 22.833225250 2.443607092 1.750934958 0 0 0 # cp -62 1 4 0.000000 21.688846588 2.689002037 0.988831997 0 0 0 # cp -63 1 4 0.000000 21.612403870 3.833913088 0.192488998 0 0 0 # cp -64 1 5 0.000000 22.916360855 1.205785036 2.611289978 0 0 0 # c -65 1 6 0.000000 21.501018524 0.810333014 3.075165987 0 0 0 # c3 -66 1 6 0.000000 23.808341980 1.493147969 3.834667921 0 0 0 # c3 -67 1 4 0.000000 23.514062881 0.070205003 1.817157984 0 0 0 # cp -68 1 4 0.000000 22.684833527 -0.782863975 1.085504055 0 0 0 # cp -69 1 4 0.000000 23.237234116 -1.833225965 0.349765003 0 0 0 # cp -70 1 4 0.000000 24.619955063 -2.031138897 0.346872985 0 0 0 # cp -71 1 4 0.000000 25.449554443 -1.179108977 1.077638030 0 0 0 # cp -72 1 4 0.000000 24.896312714 -0.128257006 1.813575983 0 0 0 # cp -73 1 7 0.000000 22.607131958 5.827101231 -0.602173984 0 0 0 # oc -74 1 7 0.000000 25.147769928 -3.035661936 -0.355791986 0 0 0 # oc -75 1 8 0.000000 24.221906662 -4.476489067 0.794990003 0 0 0 # hc -76 1 8 0.000000 25.849754333 -3.994390965 1.331357956 0 0 0 # hc -77 1 8 0.000000 25.097463608 -5.257826805 -1.146129966 0 0 0 # hc -78 1 8 0.000000 27.892013550 -5.893630028 -1.196079969 0 0 0 # hc -79 1 8 0.000000 27.964216232 -4.855231762 0.319745004 0 0 0 # hc -80 1 8 0.000000 20.720872879 8.854673386 -2.520912886 0 0 0 # hc -81 1 8 0.000000 19.840383530 7.656352043 -1.438712001 0 0 0 # hc -82 1 8 0.000000 23.017726898 8.120765686 -0.970986009 0 0 0 # hc -83 1 8 0.000000 22.669095993 7.097908974 1.022259951 0 0 0 # hc -84 1 8 0.000000 21.041725159 6.616360188 0.486577004 0 0 0 # hc -85 1 8 0.000000 24.650087357 5.183434963 0.894133985 0 0 0 # hc -86 1 8 0.000000 24.786277771 3.153367996 2.306194067 0 0 0 # hc -87 1 8 0.000000 20.863473892 1.993592978 1.015051961 0 0 0 # hc -88 1 8 0.000000 20.727291107 4.023673058 -0.397009999 0 0 0 # hc -89 1 8 0.000000 21.558345795 -0.083162002 3.696341038 0 0 0 # hc -90 1 8 0.000000 21.065618515 1.626867056 3.651936054 0 0 0 # hc -91 1 8 0.000000 20.876825333 0.608124971 2.205033064 0 0 0 # hc -92 1 8 0.000000 23.870355606 0.601037025 4.457283974 0 0 0 # hc -93 1 8 0.000000 24.807676315 1.770614982 3.498578072 0 0 0 # hc -94 1 8 0.000000 23.380037308 2.311306953 4.412462234 0 0 0 # hc -95 1 8 0.000000 21.616291046 -0.629218996 1.087699056 0 0 0 # hc -96 1 8 0.000000 22.596149445 -2.493021011 -0.215893999 0 0 0 # hc -97 1 8 0.000000 26.518102646 -1.332759023 1.075448036 0 0 0 # hc -98 1 8 0.000000 25.538236618 0.531040013 2.379035950 0 0 0 # hc -99 1 9 0.000000 16.072591782 12.338866234 -0.174325004 0 0 0 # na -100 1 1 0.000000 16.557256699 11.130316734 0.587288976 0 0 0 # c2 -101 1 1 0.000000 18.074571609 10.998808861 0.366084993 0 0 0 # c2 -102 1 9 -0.025000 18.353967667 10.832372665 -1.107717037 0 0 0 # na -103 1 9 -0.025000 14.920715332 15.017822266 -0.200534001 0 0 0 # na -104 1 1 0.000000 16.390434265 14.791102409 -0.460442007 0 0 0 # c2 -105 1 1 0.000000 16.852983475 13.538317680 0.304865986 0 0 0 # c2 -106 1 10 0.000000 16.263746262 12.190562248 -1.257431984 0 0 0 # hn -107 1 8 0.000000 16.025363922 10.195071220 0.210473999 0 0 0 # hc -108 1 8 0.000000 16.347120285 11.269214630 1.698830962 0 0 0 # hc -109 1 8 0.000000 18.467184067 10.092565536 0.934801996 0 0 0 # hc -110 1 8 0.000000 18.592388153 11.941304207 0.744638979 0 0 0 # hc -111 1 10 0.000000 17.843862534 9.919928551 -1.479779005 0 0 0 # hn -112 1 10 0.000000 19.448190689 10.736482620 -1.267521024 0 0 0 # hn -113 1 10 0.000000 14.344121933 14.136246681 -0.550131977 0 0 0 # hn -114 1 10 0.000000 14.583471298 15.922760963 -0.747138977 0 0 0 # hn -115 1 8 0.000000 16.984062195 15.696007729 -0.102596000 0 0 0 # hc -116 1 8 0.000000 16.562423706 14.639820099 -1.577000022 0 0 0 # hc -117 1 8 0.000000 16.674821854 13.685671806 1.420761943 0 0 0 # hc -118 1 8 0.000000 17.963953018 13.362975121 0.117853999 0 0 0 # hc +1 -20.2006 110.7700 111.2700 +2 -16.1640 110.7700 112.6700 +3 -12.5640 110.7700 110.7700 +4 -14.0484 111.2700 111.2700 +5 -29.0420 111.2700 112.6700 +6 -20.2006 111.2700 110.7700 +7 0.0000 108.7280 102.9695 +8 0.0000 111.2700 102.9695 +9 -19.0059 111.2700 104.5000 +10 -16.4438 108.7280 104.5000 +11 -29.0420 112.6700 111.2700 +12 -16.1640 112.6700 110.7700 +13 -20.2006 111.2700 110.7700 +14 -12.5640 110.7700 110.7700 +15 0.0000 118.9000 118.9000 +16 -4.8141 118.9000 117.9400 +17 -21.0247 118.9000 123.4200 +18 4.2296 123.4200 117.9400 +19 0.0000 123.4200 102.9695 +20 0.3598 117.9400 117.9400 +21 -14.4097 118.9000 120.0500 +22 4.4444 120.0500 117.9400 +23 0.0000 120.0500 108.4000 +24 0.0000 120.0500 111.0000 +25 0.0000 108.4000 110.7700 +26 -16.1640 112.6700 110.7700 +27 -24.3818 111.9100 112.4436 +28 -12.5567 110.6204 112.4436 +29 -7.5499 111.9100 110.9538 +30 -10.4258 110.6204 110.9538 +31 -11.2307 111.9100 111.9100 +32 -15.7572 110.7700 111.9100 +33 -12.5640 110.7700 110.7700 +34 -29.0420 112.6700 111.2700 +35 -16.1640 112.6700 110.7700 +36 -14.0484 111.2700 111.2700 +37 -20.2006 111.2700 110.7700 +38 -20.2006 110.7700 111.2700 +39 -12.5640 110.7700 110.7700 +40 -16.1640 110.7700 112.6700 +41 -12.5640 110.7700 110.7700 +42 -20.2006 110.7700 111.2700 +43 -27.3953 111.9100 112.6700 +44 -15.7572 111.9100 110.7700 +45 0.0000 111.9100 111.2700 +46 -24.3818 111.9100 112.4436 +47 -7.5499 111.9100 110.9538 +48 -29.0420 111.2700 112.6700 +49 -20.2006 111.2700 110.7700 +50 -14.0484 111.2700 111.2700 +51 0.0000 111.2700 102.9695 +52 -12.1038 111.2700 105.8000 +53 -10.5093 108.7280 105.8000 +54 -20.2006 110.7700 111.2700 +55 -16.1640 110.7700 112.6700 +56 -20.2006 110.7700 111.2700 +57 -27.3953 111.9100 112.6700 +58 -15.7572 111.9100 110.7700 +59 0.0000 111.9100 111.2700 +60 -24.3818 111.9100 112.4436 +61 -29.0420 111.2700 112.6700 +62 -14.0484 111.2700 111.2700 +63 -12.1038 111.2700 105.8000 +64 -10.5093 108.7280 105.8000 +65 -12.1038 105.8000 111.2700 +66 -10.5093 105.8000 108.7280 -Bonds +EndBondTorsion Coeffs -1 1 1 26 -2 2 1 2 -3 1 1 27 -4 3 1 25 -5 4 2 7 -6 5 2 3 -7 6 2 28 -8 4 3 7 -9 6 3 29 -10 6 3 30 -11 6 4 32 -12 4 4 8 -13 5 4 5 -14 6 4 31 -15 4 5 8 -16 2 6 5 -17 6 5 33 -18 3 6 24 -19 1 6 34 -20 1 6 35 -21 7 9 14 -22 7 9 10 -23 8 9 24 -24 7 10 11 -25 9 10 36 -26 7 11 12 -27 9 11 37 -28 7 12 13 -29 10 12 15 -30 7 13 14 -31 9 13 38 -32 9 14 39 -33 11 15 16 -34 11 15 17 -35 10 18 15 -36 12 16 40 -37 12 16 41 -38 12 16 42 -39 12 17 43 -40 12 17 44 -41 12 17 45 -42 7 18 23 -43 7 18 19 -44 7 19 20 -45 9 19 46 -46 7 20 21 -47 9 20 47 -48 7 21 22 -49 8 21 25 -50 7 22 23 -51 9 22 48 -52 9 23 49 -53 1 50 75 -54 2 50 51 -55 1 50 76 -56 3 50 74 -57 4 51 56 -58 5 51 52 -59 6 51 77 -60 4 52 56 -61 6 52 78 -62 6 52 79 -63 6 53 81 -64 4 53 57 -65 5 53 54 -66 6 53 80 -67 4 54 57 -68 2 55 54 -69 6 54 82 -70 3 55 73 -71 1 55 83 -72 1 55 84 -73 7 58 63 -74 7 58 59 -75 8 58 73 -76 7 59 60 -77 9 59 85 -78 7 60 61 -79 9 60 86 -80 7 61 62 -81 10 61 64 -82 7 62 63 -83 9 62 87 -84 9 63 88 -85 11 64 65 -86 11 64 66 -87 10 67 64 -88 12 65 89 -89 12 65 90 -90 12 65 91 -91 12 66 92 -92 12 66 93 -93 12 66 94 -94 7 67 72 -95 7 67 68 -96 7 68 69 -97 9 68 95 -98 7 69 70 -99 9 69 96 -100 7 70 71 -101 8 70 74 -102 7 71 72 -103 9 71 97 -104 9 72 98 -105 13 100 99 -106 13 105 99 -107 14 99 106 -108 15 100 101 -109 1 100 107 -110 1 100 108 -111 13 101 102 -112 1 101 109 -113 1 101 110 -114 14 102 111 -115 14 102 112 -116 13 104 103 -117 14 103 113 -118 14 103 114 -119 15 104 105 -120 1 104 115 -121 1 104 116 -122 1 105 117 -123 1 105 118 +1 0.9681 0.9551 0.0436 0.5903 0.6669 0.8584 1.1010 1.4200 +2 0.0814 0.0591 0.2219 0.2486 0.2422 -0.0925 1.1010 1.5300 +3 0.2130 0.3120 0.0777 0.2130 0.3120 0.0777 1.1010 1.1010 +4 1.0165 0.7553 -0.4609 1.0165 0.7553 -0.4609 1.4200 1.4200 +5 1.1538 0.8409 -0.9138 -0.3190 0.4411 -0.7174 1.4200 1.5300 +6 0.5903 0.6669 0.8584 0.9681 0.9551 0.0436 1.4200 1.1010 +7 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.1010 1.3768 +8 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.5300 1.3768 +9 -0.2456 1.0517 -0.7795 0.4741 1.2635 0.5576 1.5300 1.4200 +10 -0.6054 1.3339 0.9648 -0.1620 0.1564 -1.1408 1.1010 1.4200 +11 -0.3190 0.4411 -0.7174 1.1538 0.8409 -0.9138 1.5300 1.4200 +12 0.2486 0.2422 -0.0925 0.0814 0.0591 0.2219 1.5300 1.1010 +13 0.5903 0.6669 0.8584 0.9681 0.9551 0.0436 1.4200 1.1010 +14 0.2130 0.3120 0.0777 0.2130 0.3120 0.0777 1.1010 1.1010 +15 -0.1185 6.3204 0.0000 -0.1185 6.3204 0.0000 1.4170 1.4170 +16 0.0000 -6.8958 0.0000 0.0000 -0.4669 0.0000 1.4170 1.0982 +17 0.0000 0.2655 0.0000 0.0000 4.8905 0.0000 1.4170 1.3768 +18 0.0000 4.2641 0.0000 0.0000 -1.5867 0.0000 1.3768 1.0982 +19 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.4170 1.4200 +20 0.0000 -0.6890 0.0000 0.0000 -0.6890 0.0000 1.0982 1.0982 +21 0.0000 -0.6918 0.0000 0.0000 0.2421 0.0000 1.4170 1.5010 +22 0.0000 -1.7970 0.0000 0.0000 -0.4879 0.0000 1.5010 1.0982 +23 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.4170 1.5300 +24 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.4170 1.5010 +25 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.5010 1.1010 +26 0.2486 0.2422 -0.0925 0.0814 0.0591 0.2219 1.5300 1.1010 +27 0.0997 -0.0046 -0.2657 -0.0128 -0.0495 -0.1079 1.5300 1.4570 +28 -0.5892 0.7140 0.3505 0.0628 0.0873 -0.0882 1.1010 1.4570 +29 -0.9466 0.9356 -0.5542 0.0570 0.0625 0.4112 1.5300 1.0060 +30 -1.1685 0.9266 -0.0993 0.0850 0.3061 0.2104 1.1010 1.0060 +31 0.0286 0.0566 -0.0493 0.0286 0.0566 -0.0493 1.4570 1.4570 +32 0.1960 0.7056 0.1120 0.1022 0.2090 0.6433 1.1010 1.4570 +33 0.2130 0.3120 0.0777 0.2130 0.3120 0.0777 1.1010 1.1010 +34 -0.3190 0.4411 -0.7174 1.1538 0.8409 -0.9138 1.5300 1.4200 +35 0.2486 0.2422 -0.0925 0.0814 0.0591 0.2219 1.5300 1.1010 +36 1.0165 0.7553 -0.4609 1.0165 0.7553 -0.4609 1.4200 1.4200 +37 0.5903 0.6669 0.8584 0.9681 0.9551 0.0436 1.4200 1.1010 +38 0.9681 0.9551 0.0436 0.5903 0.6669 0.8584 1.1010 1.4200 +39 0.2130 0.3120 0.0777 0.2130 0.3120 0.0777 1.1010 1.1010 +40 0.0814 0.0591 0.2219 0.2486 0.2422 -0.0925 1.1010 1.5300 +41 0.2130 0.3120 0.0777 0.2130 0.3120 0.0777 1.1010 1.1010 +42 0.9681 0.9551 0.0436 0.5903 0.6669 0.8584 1.1010 1.4200 +43 0.0579 -0.0043 -0.1906 0.1032 0.5896 -0.4836 1.4570 1.5300 +44 0.1022 0.2090 0.6433 0.1960 0.7056 0.1120 1.4570 1.1010 +45 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.4570 1.4200 +46 0.0997 -0.0046 -0.2657 -0.0128 -0.0495 -0.1079 1.5300 1.4570 +47 -0.9466 0.9356 -0.5542 0.0570 0.0625 0.4112 1.5300 1.0060 +48 1.1538 0.8409 -0.9138 -0.3190 0.4411 -0.7174 1.4200 1.5300 +49 0.5903 0.6669 0.8584 0.9681 0.9551 0.0436 1.4200 1.1010 +50 1.0165 0.7553 -0.4609 1.0165 0.7553 -0.4609 1.4200 1.4200 +51 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.5300 1.3768 +52 -0.5800 0.9004 0.0000 0.0000 0.5343 0.9025 1.5300 0.9650 +53 -1.7554 1.3145 0.2263 0.2493 0.6803 0.0000 1.1010 0.9650 +54 0.9681 0.9551 0.0436 0.5903 0.6669 0.8584 1.1010 1.4200 +55 0.0814 0.0591 0.2219 0.2486 0.2422 -0.0925 1.1010 1.5300 +56 0.9681 0.9551 0.0436 0.5903 0.6669 0.8584 1.1010 1.4200 +57 0.0579 -0.0043 -0.1906 0.1032 0.5896 -0.4836 1.4570 1.5300 +58 0.1022 0.2090 0.6433 0.1960 0.7056 0.1120 1.4570 1.1010 +59 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.4570 1.4200 +60 0.0997 -0.0046 -0.2657 -0.0128 -0.0495 -0.1079 1.5300 1.4570 +61 1.1538 0.8409 -0.9138 -0.3190 0.4411 -0.7174 1.4200 1.5300 +62 1.0165 0.7553 -0.4609 1.0165 0.7553 -0.4609 1.4200 1.4200 +63 -0.5800 0.9004 0.0000 0.0000 0.5343 0.9025 1.5300 0.9650 +64 -1.7554 1.3145 0.2263 0.2493 0.6803 0.0000 1.1010 0.9650 +65 0.0000 0.5343 0.9025 -0.5800 0.9004 0.0000 0.9650 1.5300 +66 0.2493 0.6803 0.0000 -1.7554 1.3145 0.2263 0.9650 1.1010 -Angles +MiddleBondTorsion Coeffs -1 1 2 1 26 -2 2 26 1 27 -3 3 25 1 26 -4 1 2 1 27 -5 4 2 1 25 -6 3 25 1 27 -7 5 1 2 7 -8 6 1 2 3 -9 7 1 2 28 -10 8 3 2 7 -11 9 7 2 28 -12 10 3 2 28 -13 8 2 3 7 -14 10 2 3 29 -15 10 2 3 30 -16 9 7 3 29 -17 9 7 3 30 -18 11 29 3 30 -19 9 8 4 32 -20 10 5 4 32 -21 11 32 4 31 -22 8 5 4 8 -23 9 8 4 31 -24 10 5 4 31 -25 8 4 5 8 -26 6 6 5 4 -27 10 4 5 33 -28 5 6 5 8 -29 9 8 5 33 -30 7 6 5 33 -31 4 5 6 24 -32 1 5 6 34 -33 1 5 6 35 -34 3 24 6 34 -35 3 24 6 35 -36 2 34 6 35 -37 12 2 7 3 -38 12 4 8 5 -39 13 14 9 10 -40 14 14 9 24 -41 14 10 9 24 -42 13 9 10 11 -43 15 9 10 36 -44 15 11 10 36 -45 13 10 11 12 -46 15 10 11 37 -47 15 12 11 37 -48 13 11 12 13 -49 16 11 12 15 -50 16 13 12 15 -51 13 12 13 14 -52 15 12 13 38 -53 15 14 13 38 -54 13 9 14 13 -55 15 9 14 39 -56 15 13 14 39 -57 17 12 15 16 -58 17 12 15 17 -59 18 12 15 18 -60 19 16 15 17 -61 17 18 15 16 -62 17 18 15 17 -63 20 15 16 40 -64 20 15 16 41 -65 20 15 16 42 -66 21 40 16 41 -67 21 40 16 42 -68 21 41 16 42 -69 20 15 17 43 -70 20 15 17 44 -71 20 15 17 45 -72 21 43 17 44 -73 21 43 17 45 -74 21 44 17 45 -75 16 23 18 15 -76 16 19 18 15 -77 13 23 18 19 -78 13 18 19 20 -79 15 18 19 46 -80 15 20 19 46 -81 13 19 20 21 -82 15 19 20 47 -83 15 21 20 47 -84 13 20 21 22 -85 14 20 21 25 -86 14 22 21 25 -87 13 21 22 23 -88 15 21 22 48 -89 15 23 22 48 -90 13 18 23 22 -91 15 18 23 49 -92 15 22 23 49 -93 22 6 24 9 -94 22 1 25 21 -95 1 51 50 75 -96 2 75 50 76 -97 3 74 50 75 -98 1 51 50 76 -99 4 51 50 74 -100 3 74 50 76 -101 5 50 51 56 -102 6 50 51 52 -103 7 50 51 77 -104 8 52 51 56 -105 9 56 51 77 -106 10 52 51 77 -107 8 51 52 56 -108 10 51 52 78 -109 10 51 52 79 -110 9 56 52 78 -111 9 56 52 79 -112 11 78 52 79 -113 9 57 53 81 -114 10 54 53 81 -115 11 81 53 80 -116 8 54 53 57 -117 9 57 53 80 -118 10 54 53 80 -119 8 53 54 57 -120 6 55 54 53 -121 10 53 54 82 -122 5 55 54 57 -123 9 57 54 82 -124 7 55 54 82 -125 4 54 55 73 -126 1 54 55 83 -127 1 54 55 84 -128 3 73 55 83 -129 3 73 55 84 -130 2 83 55 84 -131 12 51 56 52 -132 12 53 57 54 -133 13 63 58 59 -134 14 63 58 73 -135 14 59 58 73 -136 13 58 59 60 -137 15 58 59 85 -138 15 60 59 85 -139 13 59 60 61 -140 15 59 60 86 -141 15 61 60 86 -142 13 60 61 62 -143 16 60 61 64 -144 16 62 61 64 -145 13 61 62 63 -146 15 61 62 87 -147 15 63 62 87 -148 13 58 63 62 -149 15 58 63 88 -150 15 62 63 88 -151 17 61 64 65 -152 17 61 64 66 -153 18 61 64 67 -154 19 65 64 66 -155 17 67 64 65 -156 17 67 64 66 -157 20 64 65 89 -158 20 64 65 90 -159 20 64 65 91 -160 21 89 65 90 -161 21 89 65 91 -162 21 90 65 91 -163 20 64 66 92 -164 20 64 66 93 -165 20 64 66 94 -166 21 92 66 93 -167 21 92 66 94 -168 21 93 66 94 -169 16 72 67 64 -170 16 68 67 64 -171 13 72 67 68 -172 13 67 68 69 -173 15 67 68 95 -174 15 69 68 95 -175 13 68 69 70 -176 15 68 69 96 -177 15 70 69 96 -178 13 69 70 71 -179 14 69 70 74 -180 14 71 70 74 -181 13 70 71 72 -182 15 70 71 97 -183 15 72 71 97 -184 13 67 72 71 -185 15 67 72 98 -186 15 71 72 98 -187 22 55 73 58 -188 22 50 74 70 -189 23 100 99 105 -190 24 100 99 106 -191 24 105 99 106 -192 25 101 100 99 -193 26 107 100 99 -194 26 108 100 99 -195 27 101 100 107 -196 27 101 100 108 -197 2 107 100 108 -198 25 100 101 102 -199 27 100 101 109 -200 27 100 101 110 -201 26 109 101 102 -202 26 110 101 102 -203 2 109 101 110 -204 24 101 102 111 -205 24 101 102 112 -206 28 111 102 112 -207 24 104 103 113 -208 24 104 103 114 -209 28 113 103 114 -210 25 105 104 103 -211 26 115 104 103 -212 26 116 104 103 -213 27 105 104 115 -214 27 105 104 116 -215 2 115 104 116 -216 25 104 105 99 -217 26 117 105 99 -218 26 118 105 99 -219 27 104 105 117 -220 27 104 105 118 -221 2 117 105 118 +1 -16.7975 -1.2296 -0.2750 1.5300 +2 -14.8790 -3.6581 -0.3138 1.5300 +3 -14.2610 -0.5322 -0.4864 1.5300 +4 -17.2585 -3.6157 -0.8364 1.5300 +5 -21.8842 -7.6764 -0.6868 1.5300 +6 -16.7975 -1.2296 -0.2750 1.5300 +7 0.0000 0.0000 0.0000 1.4200 +8 0.0000 0.0000 0.0000 1.4200 +9 -5.9288 -2.7007 -0.3175 1.4200 +10 -6.8007 -4.6546 -1.4101 1.4200 +11 -21.8842 -7.6764 -0.6868 1.5300 +12 -14.8790 -3.6581 -0.3138 1.5300 +13 -16.7975 -1.2296 -0.2750 1.5300 +14 -14.2610 -0.5322 -0.4864 1.5300 +15 27.5989 -2.3120 0.0000 1.4170 +16 0.0000 -1.1521 0.0000 1.4170 +17 0.0000 4.8255 0.0000 1.4170 +18 0.0000 5.5432 0.0000 1.4170 +19 0.0000 0.0000 0.0000 1.3768 +20 0.0000 4.8228 0.0000 1.4170 +21 0.0000 9.1792 0.0000 1.4170 +22 0.0000 3.9421 0.0000 1.4170 +23 0.0000 0.0000 0.0000 1.5010 +24 0.0000 0.0000 0.0000 1.5010 +25 0.0000 0.0000 0.0000 1.5300 +26 -14.8790 -3.6581 -0.3138 1.5300 +27 -8.0036 -7.7321 -3.0640 1.4570 +28 -6.4529 -6.8122 -1.1632 1.4570 +29 -2.2208 0.5479 -0.3527 1.4570 +30 -3.4611 1.6996 -0.6007 1.4570 +31 -3.3497 1.0143 -3.0062 1.5300 +32 -10.4959 -0.7647 -0.0545 1.5300 +33 -14.2610 -0.5322 -0.4864 1.5300 +34 -21.8842 -7.6764 -0.6868 1.5300 +35 -14.8790 -3.6581 -0.3138 1.5300 +36 -17.2585 -3.6157 -0.8364 1.5300 +37 -16.7975 -1.2296 -0.2750 1.5300 +38 -16.7975 -1.2296 -0.2750 1.5300 +39 -14.2610 -0.5322 -0.4864 1.5300 +40 -14.8790 -3.6581 -0.3138 1.5300 +41 -14.2610 -0.5322 -0.4864 1.5300 +42 -16.7975 -1.2296 -0.2750 1.5300 +43 -15.4174 -7.3055 -1.0749 1.5300 +44 -10.4959 -0.7647 -0.0545 1.5300 +45 0.0000 0.0000 0.0000 1.5300 +46 -8.0036 -7.7321 -3.0640 1.4570 +47 -2.2208 0.5479 -0.3527 1.4570 +48 -21.8842 -7.6764 -0.6868 1.5300 +49 -16.7975 -1.2296 -0.2750 1.5300 +50 -17.2585 -3.6157 -0.8364 1.5300 +51 0.0000 0.0000 0.0000 1.4200 +52 1.2472 0.0000 0.7485 1.4200 +53 0.0000 0.9241 -0.5889 1.4200 +54 -16.7975 -1.2296 -0.2750 1.5300 +55 -14.8790 -3.6581 -0.3138 1.5300 +56 -16.7975 -1.2296 -0.2750 1.5300 +57 -15.4174 -7.3055 -1.0749 1.5300 +58 -10.4959 -0.7647 -0.0545 1.5300 +59 0.0000 0.0000 0.0000 1.5300 +60 -8.0036 -7.7321 -3.0640 1.4570 +61 -21.8842 -7.6764 -0.6868 1.5300 +62 -17.2585 -3.6157 -0.8364 1.5300 +63 1.2472 0.0000 0.7485 1.4200 +64 0.0000 0.9241 -0.5889 1.4200 +65 1.2472 0.0000 0.7485 1.4200 +66 0.0000 0.9241 -0.5889 1.4200 -Dihedrals +BondBond13 Coeffs -1 1 26 1 2 7 -2 2 26 1 2 3 -3 3 26 1 2 28 -4 1 27 1 2 7 -5 2 27 1 2 3 -6 3 27 1 2 28 -7 4 25 1 2 7 -8 5 25 1 2 3 -9 6 25 1 2 28 -10 7 26 1 25 21 -11 8 2 1 25 21 -12 7 27 1 25 21 -13 9 1 2 7 3 -14 10 28 2 7 3 -15 11 1 2 3 7 -16 12 1 2 3 29 -17 12 1 2 3 30 -18 13 7 2 3 29 -19 13 7 2 3 30 -20 13 7 3 2 28 -21 14 28 2 3 29 -22 14 28 2 3 30 -23 10 29 3 7 2 -24 10 30 3 7 2 -25 10 32 4 8 5 -26 10 31 4 8 5 -27 13 8 5 4 32 -28 12 6 5 4 32 -29 14 32 4 5 33 -30 11 6 5 4 8 -31 13 8 4 5 33 -32 13 8 5 4 31 -33 12 6 5 4 31 -34 14 31 4 5 33 -35 9 6 5 8 4 -36 10 33 5 8 4 -37 5 24 6 5 4 -38 2 34 6 5 4 -39 2 35 6 5 4 -40 4 24 6 5 8 -41 1 34 6 5 8 -42 1 35 6 5 8 -43 6 24 6 5 33 -44 3 34 6 5 33 -45 3 35 6 5 33 -46 8 5 6 24 9 -47 7 34 6 24 9 -48 7 35 6 24 9 -49 15 10 9 14 13 -50 16 10 9 14 39 -51 17 13 14 9 24 -52 18 24 9 14 39 -53 15 14 9 10 11 -54 16 14 9 10 36 -55 17 11 10 9 24 -56 18 24 9 10 36 -57 19 14 9 24 6 -58 19 10 9 24 6 -59 15 9 10 11 12 -60 16 9 10 11 37 -61 16 12 11 10 36 -62 20 36 10 11 37 -63 15 10 11 12 13 -64 21 10 11 12 15 -65 16 13 12 11 37 -66 22 15 12 11 37 -67 15 11 12 13 14 -68 16 11 12 13 38 -69 21 14 13 12 15 -70 22 15 12 13 38 -71 23 11 12 15 16 -72 23 11 12 15 17 -73 24 11 12 15 18 -74 23 13 12 15 16 -75 23 13 12 15 17 -76 24 13 12 15 18 -77 15 12 13 14 9 -78 16 12 13 14 39 -79 16 9 14 13 38 -80 20 38 13 14 39 -81 25 12 15 16 40 -82 25 12 15 16 41 -83 25 12 15 16 42 -84 26 17 15 16 40 -85 26 17 15 16 41 -86 26 17 15 16 42 -87 25 18 15 16 40 -88 25 18 15 16 41 -89 25 18 15 16 42 -90 25 12 15 17 43 -91 25 12 15 17 44 -92 25 12 15 17 45 -93 26 16 15 17 43 -94 26 16 15 17 44 -95 26 16 15 17 45 -96 25 18 15 17 43 -97 25 18 15 17 44 -98 25 18 15 17 45 -99 24 23 18 15 12 -100 24 19 18 15 12 -101 23 23 18 15 16 -102 23 19 18 15 16 -103 23 23 18 15 17 -104 23 19 18 15 17 -105 21 22 23 18 15 -106 22 15 18 23 49 -107 15 19 18 23 22 -108 16 19 18 23 49 -109 21 20 19 18 15 -110 22 15 18 19 46 -111 15 23 18 19 20 -112 16 23 18 19 46 -113 15 18 19 20 21 -114 16 18 19 20 47 -115 16 21 20 19 46 -116 20 46 19 20 47 -117 15 19 20 21 22 -118 17 19 20 21 25 -119 16 22 21 20 47 -120 18 25 21 20 47 -121 15 20 21 22 23 -122 16 20 21 22 48 -123 17 23 22 21 25 -124 18 25 21 22 48 -125 19 20 21 25 1 -126 19 22 21 25 1 -127 15 21 22 23 18 -128 16 21 22 23 49 -129 16 18 23 22 48 -130 20 48 22 23 49 -131 1 75 50 51 56 -132 2 75 50 51 52 -133 3 75 50 51 77 -134 1 76 50 51 56 -135 2 76 50 51 52 -136 3 76 50 51 77 -137 4 74 50 51 56 -138 5 74 50 51 52 -139 6 74 50 51 77 -140 7 75 50 74 70 -141 8 51 50 74 70 -142 7 76 50 74 70 -143 9 50 51 56 52 -144 10 77 51 56 52 -145 11 50 51 52 56 -146 12 50 51 52 78 -147 12 50 51 52 79 -148 13 56 51 52 78 -149 13 56 51 52 79 -150 13 56 52 51 77 -151 14 77 51 52 78 -152 14 77 51 52 79 -153 10 78 52 56 51 -154 10 79 52 56 51 -155 10 81 53 57 54 -156 10 80 53 57 54 -157 13 57 54 53 81 -158 12 55 54 53 81 -159 14 81 53 54 82 -160 11 55 54 53 57 -161 13 57 53 54 82 -162 13 57 54 53 80 -163 12 55 54 53 80 -164 14 80 53 54 82 -165 9 55 54 57 53 -166 10 82 54 57 53 -167 5 73 55 54 53 -168 2 83 55 54 53 -169 2 84 55 54 53 -170 4 73 55 54 57 -171 1 83 55 54 57 -172 1 84 55 54 57 -173 6 73 55 54 82 -174 3 83 55 54 82 -175 3 84 55 54 82 -176 8 54 55 73 58 -177 7 83 55 73 58 -178 7 84 55 73 58 -179 15 59 58 63 62 -180 16 59 58 63 88 -181 17 62 63 58 73 -182 18 73 58 63 88 -183 15 63 58 59 60 -184 16 63 58 59 85 -185 17 60 59 58 73 -186 18 73 58 59 85 -187 19 63 58 73 55 -188 19 59 58 73 55 -189 15 58 59 60 61 -190 16 58 59 60 86 -191 16 61 60 59 85 -192 20 85 59 60 86 -193 15 59 60 61 62 -194 21 59 60 61 64 -195 16 62 61 60 86 -196 22 64 61 60 86 -197 15 60 61 62 63 -198 16 60 61 62 87 -199 21 63 62 61 64 -200 22 64 61 62 87 -201 23 60 61 64 65 -202 23 60 61 64 66 -203 24 60 61 64 67 -204 23 62 61 64 65 -205 23 62 61 64 66 -206 24 62 61 64 67 -207 15 61 62 63 58 -208 16 61 62 63 88 -209 16 58 63 62 87 -210 20 87 62 63 88 -211 25 61 64 65 89 -212 25 61 64 65 90 -213 25 61 64 65 91 -214 26 66 64 65 89 -215 26 66 64 65 90 -216 26 66 64 65 91 -217 25 67 64 65 89 -218 25 67 64 65 90 -219 25 67 64 65 91 -220 25 61 64 66 92 -221 25 61 64 66 93 -222 25 61 64 66 94 -223 26 65 64 66 92 -224 26 65 64 66 93 -225 26 65 64 66 94 -226 25 67 64 66 92 -227 25 67 64 66 93 -228 25 67 64 66 94 -229 24 72 67 64 61 -230 24 68 67 64 61 -231 23 72 67 64 65 -232 23 68 67 64 65 -233 23 72 67 64 66 -234 23 68 67 64 66 -235 21 71 72 67 64 -236 22 64 67 72 98 -237 15 68 67 72 71 -238 16 68 67 72 98 -239 21 69 68 67 64 -240 22 64 67 68 95 -241 15 72 67 68 69 -242 16 72 67 68 95 -243 15 67 68 69 70 -244 16 67 68 69 96 -245 16 70 69 68 95 -246 20 95 68 69 96 -247 15 68 69 70 71 -248 17 68 69 70 74 -249 16 71 70 69 96 -250 18 74 70 69 96 -251 15 69 70 71 72 -252 16 69 70 71 97 -253 17 72 71 70 74 -254 18 74 70 71 97 -255 19 69 70 74 50 -256 19 71 70 74 50 -257 15 70 71 72 67 -258 16 70 71 72 98 -259 16 67 72 71 97 -260 20 97 71 72 98 -261 27 101 100 99 105 -262 28 107 100 99 105 -263 28 108 100 99 105 -264 29 101 100 99 106 -265 30 107 100 99 106 -266 30 108 100 99 106 -267 27 104 105 99 100 -268 28 117 105 99 100 -269 28 118 105 99 100 -270 29 104 105 99 106 -271 30 117 105 99 106 -272 30 118 105 99 106 -273 31 99 100 101 102 -274 32 109 101 100 99 -275 32 110 101 100 99 -276 32 107 100 101 102 -277 33 107 100 101 109 -278 33 107 100 101 110 -279 32 108 100 101 102 -280 33 108 100 101 109 -281 33 108 100 101 110 -282 29 100 101 102 111 -283 29 100 101 102 112 -284 30 109 101 102 111 -285 30 109 101 102 112 -286 30 110 101 102 111 -287 30 110 101 102 112 -288 29 105 104 103 113 -289 30 115 104 103 113 -290 30 116 104 103 113 -291 29 105 104 103 114 -292 30 115 104 103 114 -293 30 116 104 103 114 -294 31 103 104 105 99 -295 32 117 105 104 103 -296 32 118 105 104 103 -297 32 115 104 105 99 -298 33 115 104 105 117 -299 33 115 104 105 118 -300 32 116 104 105 99 -301 33 116 104 105 117 -302 33 116 104 105 118 +1 0.0000 1.1010 1.4200 +2 0.0000 1.1010 1.5300 +3 0.0000 1.1010 1.1010 +4 0.0000 1.4200 1.4200 +5 0.0000 1.4200 1.5300 +6 0.0000 1.4200 1.1010 +7 0.0000 1.1010 1.3768 +8 0.0000 1.5300 1.3768 +9 0.0000 1.5300 1.4200 +10 0.0000 1.1010 1.4200 +11 0.0000 1.5300 1.4200 +12 0.0000 1.5300 1.1010 +13 0.0000 1.4200 1.1010 +14 0.0000 1.1010 1.1010 +15 53.0000 1.4170 1.4170 +16 -6.2741 1.4170 1.0982 +17 -2.2436 1.4170 1.3768 +18 2.0517 1.3768 1.0982 +19 0.0000 1.4170 1.4200 +20 -1.7077 1.0982 1.0982 +21 2.5085 1.4170 1.5010 +22 0.8743 1.5010 1.0982 +23 0.0000 1.4170 1.5300 +24 0.0000 1.4170 1.5010 +25 0.0000 1.5010 1.1010 +26 0.0000 1.5300 1.1010 +27 0.0000 1.5300 1.4570 +28 0.0000 1.1010 1.4570 +29 0.0000 1.5300 1.0060 +30 0.0000 1.1010 1.0060 +31 0.0000 1.4570 1.4570 +32 0.0000 1.1010 1.4570 +33 0.0000 1.1010 1.1010 +34 0.0000 1.5300 1.4200 +35 0.0000 1.5300 1.1010 +36 0.0000 1.4200 1.4200 +37 0.0000 1.4200 1.1010 +38 0.0000 1.1010 1.4200 +39 0.0000 1.1010 1.1010 +40 0.0000 1.1010 1.5300 +41 0.0000 1.1010 1.1010 +42 0.0000 1.1010 1.4200 +43 0.0000 1.4570 1.5300 +44 0.0000 1.4570 1.1010 +45 0.0000 1.4570 1.4200 +46 0.0000 1.5300 1.4570 +47 0.0000 1.5300 1.0060 +48 0.0000 1.4200 1.5300 +49 0.0000 1.4200 1.1010 +50 0.0000 1.4200 1.4200 +51 0.0000 1.5300 1.3768 +52 0.0000 1.5300 0.9650 +53 0.0000 1.1010 0.9650 +54 0.0000 1.1010 1.4200 +55 0.0000 1.1010 1.5300 +56 0.0000 1.1010 1.4200 +57 0.0000 1.4570 1.5300 +58 0.0000 1.4570 1.1010 +59 0.0000 1.4570 1.4200 +60 0.0000 1.5300 1.4570 +61 0.0000 1.4200 1.5300 +62 0.0000 1.4200 1.4200 +63 0.0000 1.5300 0.9650 +64 0.0000 1.1010 0.9650 +65 0.0000 0.9650 1.5300 +66 0.0000 0.9650 1.1010 -Impropers +AngleTorsion Coeffs -1 1 14 9 10 24 -2 2 9 10 11 36 -3 2 10 11 12 37 -4 3 11 12 13 15 -5 2 12 13 14 38 -6 2 9 14 13 39 -7 3 23 18 19 15 -8 2 18 19 20 46 -9 2 19 20 21 47 -10 1 20 21 22 25 -11 2 21 22 23 48 -12 2 18 23 22 49 -13 1 63 58 59 73 -14 2 58 59 60 85 -15 2 59 60 61 86 -16 3 60 61 62 64 -17 2 61 62 63 87 -18 2 58 63 62 88 -19 3 72 67 68 64 -20 2 67 68 69 95 -21 2 68 69 70 96 -22 1 69 70 71 74 -23 2 70 71 72 97 -24 2 67 72 71 98 -25 4 100 99 105 106 -26 5 101 102 111 112 -27 5 104 103 113 114 -28 6 2 1 26 27 -29 7 2 1 25 26 -30 8 25 1 27 26 -31 7 2 1 25 27 -32 9 1 2 3 7 -33 10 1 2 7 28 -34 11 1 2 3 28 -35 12 3 2 7 28 -36 12 2 3 7 29 -37 12 2 3 7 30 -38 13 2 3 29 30 -39 14 7 3 29 30 -40 12 5 4 8 32 -41 14 8 4 32 31 -42 13 5 4 32 31 -43 12 5 4 8 31 -44 9 6 5 4 8 -45 12 4 5 8 33 -46 11 6 5 4 33 -47 10 6 5 8 33 -48 7 5 6 24 34 -49 7 5 6 24 35 -50 6 5 6 34 35 -51 8 24 6 34 35 -52 15 12 15 16 17 -53 16 12 15 18 16 -54 16 12 15 18 17 -55 15 18 15 17 16 -56 17 15 16 40 41 -57 17 15 16 40 42 -58 17 15 16 41 42 -59 18 40 16 41 42 -60 17 15 17 43 44 -61 17 15 17 43 45 -62 17 15 17 44 45 -63 18 43 17 44 45 -64 6 51 50 75 76 -65 7 51 50 74 75 -66 8 74 50 76 75 -67 7 51 50 74 76 -68 9 50 51 52 56 -69 10 50 51 56 77 -70 11 50 51 52 77 -71 12 52 51 56 77 -72 12 51 52 56 78 -73 12 51 52 56 79 -74 13 51 52 78 79 -75 14 56 52 78 79 -76 12 54 53 57 81 -77 14 57 53 81 80 -78 13 54 53 81 80 -79 12 54 53 57 80 -80 9 55 54 53 57 -81 12 53 54 57 82 -82 11 55 54 53 82 -83 10 55 54 57 82 -84 7 54 55 73 83 -85 7 54 55 73 84 -86 6 54 55 83 84 -87 8 73 55 83 84 -88 15 61 64 65 66 -89 16 61 64 67 65 -90 16 61 64 67 66 -91 15 67 64 66 65 -92 17 64 65 89 90 -93 17 64 65 89 91 -94 17 64 65 90 91 -95 18 89 65 90 91 -96 17 64 66 92 93 -97 17 64 66 92 94 -98 17 64 66 93 94 -99 18 92 66 93 94 -100 19 101 100 107 99 -101 19 101 100 108 99 -102 20 107 100 108 99 -103 21 101 100 107 108 -104 19 100 101 109 102 -105 19 100 101 110 102 -106 21 100 101 109 110 -107 20 109 101 110 102 -108 19 105 104 115 103 -109 19 105 104 116 103 -110 20 115 104 116 103 -111 21 105 104 115 116 -112 19 104 105 117 99 -113 19 104 105 118 99 -114 20 117 105 118 99 -115 21 104 105 117 118 +1 2.3668 2.4920 -1.0122 -0.1892 0.4918 0.7273 110.7700 111.2700 +2 0.3113 0.4516 -0.1988 -0.2454 0.0000 -0.1136 110.7700 112.6700 +3 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.7700 110.7700 +4 0.5511 0.9737 -0.6673 0.5511 0.9737 -0.6673 111.2700 111.2700 +5 0.9672 -0.7566 -1.2331 0.5623 -0.3041 -0.4015 111.2700 112.6700 +6 -0.1892 0.4918 0.7273 2.3668 2.4920 -1.0122 111.2700 110.7700 +7 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 108.7280 102.9695 +8 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 111.2700 102.9695 +9 -2.7466 1.4877 -0.8955 0.5676 0.9450 0.0703 111.2700 104.5000 +10 -1.8234 1.6393 0.5144 -0.7777 0.4340 -0.6653 108.7280 104.5000 +11 0.5623 -0.3041 -0.4015 0.9672 -0.7566 -1.2331 112.6700 111.2700 +12 -0.2454 0.0000 -0.1136 0.3113 0.4516 -0.1988 112.6700 110.7700 +13 -0.1892 0.4918 0.7273 2.3668 2.4920 -1.0122 111.2700 110.7700 +14 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.7700 110.7700 +15 1.9767 1.0239 0.0000 1.9767 1.0239 0.0000 118.9000 118.9000 +16 0.0000 2.5014 0.0000 0.0000 2.7147 0.0000 118.9000 117.9400 +17 0.0000 10.0155 0.0000 0.0000 1.7404 0.0000 118.9000 123.4200 +18 0.0000 2.5706 0.0000 0.0000 1.8729 0.0000 123.4200 117.9400 +19 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 123.4200 102.9695 +20 0.0000 2.4501 0.0000 0.0000 2.4501 0.0000 117.9400 117.9400 +21 0.0000 3.8987 0.0000 0.0000 -4.4683 0.0000 118.9000 120.0500 +22 0.0000 -0.1242 0.0000 0.0000 3.4601 0.0000 120.0500 117.9400 +23 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 120.0500 108.4000 +24 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 120.0500 111.0000 +25 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 108.4000 110.7700 +26 -0.2454 0.0000 -0.1136 0.3113 0.4516 -0.1988 112.6700 110.7700 +27 -2.7883 1.5193 1.4796 1.2031 1.3645 -0.7071 111.9100 112.4436 +28 -2.6321 0.9353 -0.8398 -1.3582 0.1465 -0.5729 110.6204 112.4436 +29 -3.3430 4.4558 -0.0346 0.2873 -0.8072 -0.0960 111.9100 110.9538 +30 -3.9582 2.0063 0.3213 -0.4294 -0.4442 -0.6141 110.6204 110.9538 +31 1.3673 0.4528 -2.7700 1.3673 0.4528 -2.7700 111.9100 111.9100 +32 0.5111 1.6328 -1.0155 -1.1075 0.2820 0.8318 110.7700 111.9100 +33 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.7700 110.7700 +34 0.5623 -0.3041 -0.4015 0.9672 -0.7566 -1.2331 112.6700 111.2700 +35 -0.2454 0.0000 -0.1136 0.3113 0.4516 -0.1988 112.6700 110.7700 +36 0.5511 0.9737 -0.6673 0.5511 0.9737 -0.6673 111.2700 111.2700 +37 -0.1892 0.4918 0.7273 2.3668 2.4920 -1.0122 111.2700 110.7700 +38 2.3668 2.4920 -1.0122 -0.1892 0.4918 0.7273 110.7700 111.2700 +39 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.7700 110.7700 +40 0.3113 0.4516 -0.1988 -0.2454 0.0000 -0.1136 110.7700 112.6700 +41 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.7700 110.7700 +42 2.3668 2.4920 -1.0122 -0.1892 0.4918 0.7273 110.7700 111.2700 +43 2.0125 0.9440 -2.7612 -1.9225 -1.3450 0.2210 111.9100 112.6700 +44 -1.1075 0.2820 0.8318 0.5111 1.6328 -1.0155 111.9100 110.7700 +45 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 111.9100 111.2700 +46 -2.7883 1.5193 1.4796 1.2031 1.3645 -0.7071 111.9100 112.4436 +47 -3.3430 4.4558 -0.0346 0.2873 -0.8072 -0.0960 111.9100 110.9538 +48 0.9672 -0.7566 -1.2331 0.5623 -0.3041 -0.4015 111.2700 112.6700 +49 -0.1892 0.4918 0.7273 2.3668 2.4920 -1.0122 111.2700 110.7700 +50 0.5511 0.9737 -0.6673 0.5511 0.9737 -0.6673 111.2700 111.2700 +51 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 111.2700 102.9695 +52 -3.5903 2.5225 0.4888 0.8726 -0.3577 0.3888 111.2700 105.8000 +53 -3.4060 1.6396 0.0737 0.0000 -0.2810 -0.5944 108.7280 105.8000 +54 2.3668 2.4920 -1.0122 -0.1892 0.4918 0.7273 110.7700 111.2700 +55 0.3113 0.4516 -0.1988 -0.2454 0.0000 -0.1136 110.7700 112.6700 +56 2.3668 2.4920 -1.0122 -0.1892 0.4918 0.7273 110.7700 111.2700 +57 2.0125 0.9440 -2.7612 -1.9225 -1.3450 0.2210 111.9100 112.6700 +58 -1.1075 0.2820 0.8318 0.5111 1.6328 -1.0155 111.9100 110.7700 +59 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 111.9100 111.2700 +60 -2.7883 1.5193 1.4796 1.2031 1.3645 -0.7071 111.9100 112.4436 +61 0.9672 -0.7566 -1.2331 0.5623 -0.3041 -0.4015 111.2700 112.6700 +62 0.5511 0.9737 -0.6673 0.5511 0.9737 -0.6673 111.2700 111.2700 +63 -3.5903 2.5225 0.4888 0.8726 -0.3577 0.3888 111.2700 105.8000 +64 -3.4060 1.6396 0.0737 0.0000 -0.2810 -0.5944 108.7280 105.8000 +65 0.8726 -0.3577 0.3888 -3.5903 2.5225 0.4888 105.8000 111.2700 +66 0.0000 -0.2810 -0.5944 -3.4060 1.6396 0.0737 105.8000 108.7280 + +Atoms # full + +1 1 1 0.000000 25.246496201 -1.871744037 -8.651348114 0 0 0 # c2 +2 1 2 0.000000 25.610639572 -3.288228035 -8.165973663 0 0 0 # c3m +3 1 2 0.000000 24.731319427 -4.483242989 -8.675741196 0 0 0 # c3m +4 1 2 0.000000 18.703355789 9.118826866 -4.174236774 0 0 0 # c3m +5 1 2 0.000000 18.099748611 8.263649940 -5.343001842 0 0 0 # c3m +6 1 1 0.000000 19.081827164 7.609607220 -6.334177017 0 0 0 # c2 +7 1 3 0.100000 26.190139771 -4.295329094 -9.220970154 0 0 0 # o3e +8 1 3 0.100000 17.971729279 9.827675819 -5.367077827 0 0 0 # o3e +9 1 4 0.000000 20.263877869 5.733595848 -6.736782074 0 0 0 # cp +10 1 4 0.000000 19.777191162 4.983679771 -7.809411049 0 0 0 # cp +11 1 4 0.000000 20.667026520 4.390971184 -8.707633972 0 0 0 # cp +12 1 4 0.000000 22.043539047 4.548151016 -8.533248901 0 0 0 # cp +13 1 4 0.000000 22.530214310 5.298062801 -7.460619926 0 0 0 # cp +14 1 4 0.000000 21.640394211 5.890783787 -6.562390804 0 0 0 # cp +15 1 5 0.000000 23.005182266 3.906831026 -9.503917694 0 0 0 # c +16 1 6 0.000000 24.286390305 4.758069992 -9.590908051 0 0 0 # c3 +17 1 6 0.000000 22.342786789 3.812531948 -10.891778946 0 0 0 # c3 +18 1 4 0.000000 23.361906052 2.519830942 -9.029184341 0 0 0 # cp +19 1 4 0.000000 24.458705902 2.330889940 -8.185920715 0 0 0 # cp +20 1 4 0.000000 24.788816452 1.047963977 -7.745534897 0 0 0 # cp +21 1 4 0.000000 24.022008896 -0.046867002 -8.149927139 0 0 0 # cp +22 1 4 0.000000 22.925630569 0.140873000 -8.992565155 0 0 0 # cp +23 1 4 0.000000 22.595729828 1.424777985 -9.432847977 0 0 0 # cp +24 1 7 0.000000 19.414030075 6.299984932 -5.878956795 0 0 0 # oc +25 1 7 0.000000 24.338140488 -1.273216963 -7.729548931 0 0 0 # oc +26 1 8 0.000000 26.150024414 -1.266484976 -8.715751648 0 0 0 # hc +27 1 8 0.000000 24.778566360 -1.933199048 -9.633987427 0 0 0 # hc +28 1 8 0.000000 25.929294586 -2.927781105 -7.187973022 0 0 0 # hc +29 1 8 0.000000 24.549385071 -5.308847904 -7.987242222 0 0 0 # hc +30 1 8 0.000000 23.904827118 -4.254271030 -9.348136902 0 0 0 # hc +31 1 8 0.000000 18.194736481 9.091637611 -3.210949898 0 0 0 # hc +32 1 8 0.000000 19.788938522 9.208558083 -4.119643211 0 0 0 # hc +33 1 8 0.000000 17.399309158 7.432216167 -5.407801151 0 0 0 # hc +34 1 8 0.000000 18.616250992 7.545570850 -7.316913128 0 0 0 # hc +35 1 8 0.000000 19.987047195 8.212498665 -6.399401188 0 0 0 # hc +36 1 8 0.000000 18.713207245 4.862418175 -7.944396973 0 0 0 # hc +37 1 8 0.000000 20.290582657 3.811013937 -9.537291527 0 0 0 # hc +38 1 8 0.000000 23.594188690 5.419342995 -7.325634956 0 0 0 # hc +39 1 8 0.000000 22.016828537 6.470753193 -5.732734203 0 0 0 # hc +40 1 8 0.000000 24.982324600 4.297049999 -10.290958405 0 0 0 # hc +41 1 8 0.000000 24.034254074 5.760886192 -9.936174393 0 0 0 # hc +42 1 8 0.000000 24.749143600 4.819462776 -8.606439590 0 0 0 # hc +43 1 8 0.000000 23.034755707 3.349560976 -11.594371796 0 0 0 # hc +44 1 8 0.000000 21.438467026 3.207982063 -10.822364807 0 0 0 # hc +45 1 8 0.000000 22.084871292 4.811752796 -11.239845276 0 0 0 # hc +46 1 8 0.000000 25.050769806 3.177418947 -7.873311996 0 0 0 # hc +47 1 8 0.000000 25.636974335 0.901705027 -7.093626022 0 0 0 # hc +48 1 8 0.000000 22.333581924 -0.705653012 -9.305183411 0 0 0 # hc +49 1 8 0.000000 21.747369766 1.570054054 -10.084861755 0 0 0 # hc +50 1 1 0.000000 25.222612381 -4.200571060 0.463562995 0 0 0 # c2 +51 1 2 0.000000 25.832977295 -5.360119820 -0.347983003 0 0 0 # c3m +52 1 2 0.000000 27.389345169 -5.551681042 -0.290704012 0 0 0 # c3m +53 1 2 0.000000 20.635538101 8.396902084 -1.535487056 0 0 0 # c3m +54 1 2 0.000000 21.957460403 8.158697128 -0.723941982 0 0 0 # c3m +55 1 1 0.000000 22.041673660 6.895174980 0.154822007 0 0 0 # c2 +56 1 3 0.100000 26.447082520 -6.565405846 0.448491007 0 0 0 # o3e +57 1 3 0.100000 20.959102631 9.287891388 -0.285212994 0 0 0 # o3e +58 1 4 0.000000 22.680345535 4.733430862 0.158248007 0 0 0 # cp +59 1 4 0.000000 23.824728012 4.488029957 0.920358002 0 0 0 # cp +60 1 4 0.000000 23.901163101 3.343113899 1.716701984 0 0 0 # cp +61 1 4 0.000000 22.833225250 2.443607092 1.750934958 0 0 0 # cp +62 1 4 0.000000 21.688846588 2.689002037 0.988831997 0 0 0 # cp +63 1 4 0.000000 21.612403870 3.833913088 0.192488998 0 0 0 # cp +64 1 5 0.000000 22.916360855 1.205785036 2.611289978 0 0 0 # c +65 1 6 0.000000 21.501018524 0.810333014 3.075165987 0 0 0 # c3 +66 1 6 0.000000 23.808341980 1.493147969 3.834667921 0 0 0 # c3 +67 1 4 0.000000 23.514062881 0.070205003 1.817157984 0 0 0 # cp +68 1 4 0.000000 22.684833527 -0.782863975 1.085504055 0 0 0 # cp +69 1 4 0.000000 23.237234116 -1.833225965 0.349765003 0 0 0 # cp +70 1 4 0.000000 24.619955063 -2.031138897 0.346872985 0 0 0 # cp +71 1 4 0.000000 25.449554443 -1.179108977 1.077638030 0 0 0 # cp +72 1 4 0.000000 24.896312714 -0.128257006 1.813575983 0 0 0 # cp +73 1 7 0.000000 22.607131958 5.827101231 -0.602173984 0 0 0 # oc +74 1 7 0.000000 25.147769928 -3.035661936 -0.355791986 0 0 0 # oc +75 1 8 0.000000 24.221906662 -4.476489067 0.794990003 0 0 0 # hc +76 1 8 0.000000 25.849754333 -3.994390965 1.331357956 0 0 0 # hc +77 1 8 0.000000 25.097463608 -5.257826805 -1.146129966 0 0 0 # hc +78 1 8 0.000000 27.892013550 -5.893630028 -1.196079969 0 0 0 # hc +79 1 8 0.000000 27.964216232 -4.855231762 0.319745004 0 0 0 # hc +80 1 8 0.000000 20.720872879 8.854673386 -2.520912886 0 0 0 # hc +81 1 8 0.000000 19.840383530 7.656352043 -1.438712001 0 0 0 # hc +82 1 8 0.000000 23.017726898 8.120765686 -0.970986009 0 0 0 # hc +83 1 8 0.000000 22.669095993 7.097908974 1.022259951 0 0 0 # hc +84 1 8 0.000000 21.041725159 6.616360188 0.486577004 0 0 0 # hc +85 1 8 0.000000 24.650087357 5.183434963 0.894133985 0 0 0 # hc +86 1 8 0.000000 24.786277771 3.153367996 2.306194067 0 0 0 # hc +87 1 8 0.000000 20.863473892 1.993592978 1.015051961 0 0 0 # hc +88 1 8 0.000000 20.727291107 4.023673058 -0.397009999 0 0 0 # hc +89 1 8 0.000000 21.558345795 -0.083162002 3.696341038 0 0 0 # hc +90 1 8 0.000000 21.065618515 1.626867056 3.651936054 0 0 0 # hc +91 1 8 0.000000 20.876825333 0.608124971 2.205033064 0 0 0 # hc +92 1 8 0.000000 23.870355606 0.601037025 4.457283974 0 0 0 # hc +93 1 8 0.000000 24.807676315 1.770614982 3.498578072 0 0 0 # hc +94 1 8 0.000000 23.380037308 2.311306953 4.412462234 0 0 0 # hc +95 1 8 0.000000 21.616291046 -0.629218996 1.087699056 0 0 0 # hc +96 1 8 0.000000 22.596149445 -2.493021011 -0.215893999 0 0 0 # hc +97 1 8 0.000000 26.518102646 -1.332759023 1.075448036 0 0 0 # hc +98 1 8 0.000000 25.538236618 0.531040013 2.379035950 0 0 0 # hc +99 1 9 0.000000 16.072591782 12.338866234 -0.174325004 0 0 0 # na +100 1 1 0.000000 16.557256699 11.130316734 0.587288976 0 0 0 # c2 +101 1 1 0.000000 18.074571609 10.998808861 0.366084993 0 0 0 # c2 +102 1 9 -0.025000 18.353967667 10.832372665 -1.107717037 0 0 0 # na +103 1 9 -0.025000 14.920715332 15.017822266 -0.200534001 0 0 0 # na +104 1 1 0.000000 16.390434265 14.791102409 -0.460442007 0 0 0 # c2 +105 1 1 0.000000 16.852983475 13.538317680 0.304865986 0 0 0 # c2 +106 1 10 0.000000 16.263746262 12.190562248 -1.257431984 0 0 0 # hn +107 1 8 0.000000 16.025363922 10.195071220 0.210473999 0 0 0 # hc +108 1 8 0.000000 16.347120285 11.269214630 1.698830962 0 0 0 # hc +109 1 8 0.000000 18.467184067 10.092565536 0.934801996 0 0 0 # hc +110 1 8 0.000000 18.592388153 11.941304207 0.744638979 0 0 0 # hc +111 1 10 0.000000 17.843862534 9.919928551 -1.479779005 0 0 0 # hn +112 1 10 0.000000 19.448190689 10.736482620 -1.267521024 0 0 0 # hn +113 1 10 0.000000 14.344121933 14.136246681 -0.550131977 0 0 0 # hn +114 1 10 0.000000 14.583471298 15.922760963 -0.747138977 0 0 0 # hn +115 1 8 0.000000 16.984062195 15.696007729 -0.102596000 0 0 0 # hc +116 1 8 0.000000 16.562423706 14.639820099 -1.577000022 0 0 0 # hc +117 1 8 0.000000 16.674821854 13.685671806 1.420761943 0 0 0 # hc +118 1 8 0.000000 17.963953018 13.362975121 0.117853999 0 0 0 # hc + +Bonds + +1 1 1 26 +2 2 1 2 +3 1 1 27 +4 3 1 25 +5 4 2 7 +6 5 2 3 +7 6 2 28 +8 4 3 7 +9 6 3 29 +10 6 3 30 +11 6 4 32 +12 4 4 8 +13 5 4 5 +14 6 4 31 +15 4 5 8 +16 2 6 5 +17 6 5 33 +18 3 6 24 +19 1 6 34 +20 1 6 35 +21 7 9 14 +22 7 9 10 +23 8 9 24 +24 7 10 11 +25 9 10 36 +26 7 11 12 +27 9 11 37 +28 7 12 13 +29 10 12 15 +30 7 13 14 +31 9 13 38 +32 9 14 39 +33 11 15 16 +34 11 15 17 +35 10 18 15 +36 12 16 40 +37 12 16 41 +38 12 16 42 +39 12 17 43 +40 12 17 44 +41 12 17 45 +42 7 18 23 +43 7 18 19 +44 7 19 20 +45 9 19 46 +46 7 20 21 +47 9 20 47 +48 7 21 22 +49 8 21 25 +50 7 22 23 +51 9 22 48 +52 9 23 49 +53 1 50 75 +54 2 50 51 +55 1 50 76 +56 3 50 74 +57 4 51 56 +58 5 51 52 +59 6 51 77 +60 4 52 56 +61 6 52 78 +62 6 52 79 +63 6 53 81 +64 4 53 57 +65 5 53 54 +66 6 53 80 +67 4 54 57 +68 2 55 54 +69 6 54 82 +70 3 55 73 +71 1 55 83 +72 1 55 84 +73 7 58 63 +74 7 58 59 +75 8 58 73 +76 7 59 60 +77 9 59 85 +78 7 60 61 +79 9 60 86 +80 7 61 62 +81 10 61 64 +82 7 62 63 +83 9 62 87 +84 9 63 88 +85 11 64 65 +86 11 64 66 +87 10 67 64 +88 12 65 89 +89 12 65 90 +90 12 65 91 +91 12 66 92 +92 12 66 93 +93 12 66 94 +94 7 67 72 +95 7 67 68 +96 7 68 69 +97 9 68 95 +98 7 69 70 +99 9 69 96 +100 7 70 71 +101 8 70 74 +102 7 71 72 +103 9 71 97 +104 9 72 98 +105 13 100 99 +106 13 105 99 +107 14 99 106 +108 15 100 101 +109 1 100 107 +110 1 100 108 +111 13 101 102 +112 1 101 109 +113 1 101 110 +114 14 102 111 +115 14 102 112 +116 13 104 103 +117 14 103 113 +118 14 103 114 +119 15 104 105 +120 1 104 115 +121 1 104 116 +122 1 105 117 +123 1 105 118 + +Angles + +1 1 2 1 26 +2 2 26 1 27 +3 3 25 1 26 +4 1 2 1 27 +5 4 2 1 25 +6 3 25 1 27 +7 5 1 2 7 +8 6 1 2 3 +9 7 1 2 28 +10 8 3 2 7 +11 9 7 2 28 +12 10 3 2 28 +13 8 2 3 7 +14 10 2 3 29 +15 10 2 3 30 +16 9 7 3 29 +17 9 7 3 30 +18 11 29 3 30 +19 9 8 4 32 +20 10 5 4 32 +21 11 32 4 31 +22 8 5 4 8 +23 9 8 4 31 +24 10 5 4 31 +25 8 4 5 8 +26 6 6 5 4 +27 10 4 5 33 +28 5 6 5 8 +29 9 8 5 33 +30 7 6 5 33 +31 4 5 6 24 +32 1 5 6 34 +33 1 5 6 35 +34 3 24 6 34 +35 3 24 6 35 +36 2 34 6 35 +37 12 2 7 3 +38 12 4 8 5 +39 13 14 9 10 +40 14 14 9 24 +41 14 10 9 24 +42 13 9 10 11 +43 15 9 10 36 +44 15 11 10 36 +45 13 10 11 12 +46 15 10 11 37 +47 15 12 11 37 +48 13 11 12 13 +49 16 11 12 15 +50 16 13 12 15 +51 13 12 13 14 +52 15 12 13 38 +53 15 14 13 38 +54 13 9 14 13 +55 15 9 14 39 +56 15 13 14 39 +57 17 12 15 16 +58 17 12 15 17 +59 18 12 15 18 +60 19 16 15 17 +61 17 18 15 16 +62 17 18 15 17 +63 20 15 16 40 +64 20 15 16 41 +65 20 15 16 42 +66 21 40 16 41 +67 21 40 16 42 +68 21 41 16 42 +69 20 15 17 43 +70 20 15 17 44 +71 20 15 17 45 +72 21 43 17 44 +73 21 43 17 45 +74 21 44 17 45 +75 16 23 18 15 +76 16 19 18 15 +77 13 23 18 19 +78 13 18 19 20 +79 15 18 19 46 +80 15 20 19 46 +81 13 19 20 21 +82 15 19 20 47 +83 15 21 20 47 +84 13 20 21 22 +85 14 20 21 25 +86 14 22 21 25 +87 13 21 22 23 +88 15 21 22 48 +89 15 23 22 48 +90 13 18 23 22 +91 15 18 23 49 +92 15 22 23 49 +93 22 6 24 9 +94 22 1 25 21 +95 1 51 50 75 +96 2 75 50 76 +97 3 74 50 75 +98 1 51 50 76 +99 4 51 50 74 +100 3 74 50 76 +101 5 50 51 56 +102 6 50 51 52 +103 7 50 51 77 +104 8 52 51 56 +105 9 56 51 77 +106 10 52 51 77 +107 8 51 52 56 +108 10 51 52 78 +109 10 51 52 79 +110 9 56 52 78 +111 9 56 52 79 +112 11 78 52 79 +113 9 57 53 81 +114 10 54 53 81 +115 11 81 53 80 +116 8 54 53 57 +117 9 57 53 80 +118 10 54 53 80 +119 8 53 54 57 +120 6 55 54 53 +121 10 53 54 82 +122 5 55 54 57 +123 9 57 54 82 +124 7 55 54 82 +125 4 54 55 73 +126 1 54 55 83 +127 1 54 55 84 +128 3 73 55 83 +129 3 73 55 84 +130 2 83 55 84 +131 12 51 56 52 +132 12 53 57 54 +133 13 63 58 59 +134 14 63 58 73 +135 14 59 58 73 +136 13 58 59 60 +137 15 58 59 85 +138 15 60 59 85 +139 13 59 60 61 +140 15 59 60 86 +141 15 61 60 86 +142 13 60 61 62 +143 16 60 61 64 +144 16 62 61 64 +145 13 61 62 63 +146 15 61 62 87 +147 15 63 62 87 +148 13 58 63 62 +149 15 58 63 88 +150 15 62 63 88 +151 17 61 64 65 +152 17 61 64 66 +153 18 61 64 67 +154 19 65 64 66 +155 17 67 64 65 +156 17 67 64 66 +157 20 64 65 89 +158 20 64 65 90 +159 20 64 65 91 +160 21 89 65 90 +161 21 89 65 91 +162 21 90 65 91 +163 20 64 66 92 +164 20 64 66 93 +165 20 64 66 94 +166 21 92 66 93 +167 21 92 66 94 +168 21 93 66 94 +169 16 72 67 64 +170 16 68 67 64 +171 13 72 67 68 +172 13 67 68 69 +173 15 67 68 95 +174 15 69 68 95 +175 13 68 69 70 +176 15 68 69 96 +177 15 70 69 96 +178 13 69 70 71 +179 14 69 70 74 +180 14 71 70 74 +181 13 70 71 72 +182 15 70 71 97 +183 15 72 71 97 +184 13 67 72 71 +185 15 67 72 98 +186 15 71 72 98 +187 22 55 73 58 +188 22 50 74 70 +189 23 100 99 105 +190 24 100 99 106 +191 24 105 99 106 +192 25 101 100 99 +193 26 107 100 99 +194 26 108 100 99 +195 27 101 100 107 +196 27 101 100 108 +197 2 107 100 108 +198 25 100 101 102 +199 27 100 101 109 +200 27 100 101 110 +201 26 109 101 102 +202 26 110 101 102 +203 2 109 101 110 +204 24 101 102 111 +205 24 101 102 112 +206 28 111 102 112 +207 24 104 103 113 +208 24 104 103 114 +209 28 113 103 114 +210 25 105 104 103 +211 26 115 104 103 +212 26 116 104 103 +213 27 105 104 115 +214 27 105 104 116 +215 2 115 104 116 +216 25 104 105 99 +217 26 117 105 99 +218 26 118 105 99 +219 27 104 105 117 +220 27 104 105 118 +221 2 117 105 118 + +Dihedrals + +1 1 26 1 2 7 +2 2 26 1 2 3 +3 3 26 1 2 28 +4 1 27 1 2 7 +5 2 27 1 2 3 +6 3 27 1 2 28 +7 4 25 1 2 7 +8 5 25 1 2 3 +9 6 25 1 2 28 +10 7 26 1 25 21 +11 8 2 1 25 21 +12 7 27 1 25 21 +13 9 1 2 7 3 +14 10 28 2 7 3 +15 11 1 2 3 7 +16 12 1 2 3 29 +17 12 1 2 3 30 +18 13 7 2 3 29 +19 13 7 2 3 30 +20 13 7 3 2 28 +21 14 28 2 3 29 +22 14 28 2 3 30 +23 10 29 3 7 2 +24 10 30 3 7 2 +25 10 32 4 8 5 +26 10 31 4 8 5 +27 13 8 5 4 32 +28 12 6 5 4 32 +29 14 32 4 5 33 +30 11 6 5 4 8 +31 13 8 4 5 33 +32 13 8 5 4 31 +33 12 6 5 4 31 +34 14 31 4 5 33 +35 9 6 5 8 4 +36 10 33 5 8 4 +37 5 24 6 5 4 +38 2 34 6 5 4 +39 2 35 6 5 4 +40 4 24 6 5 8 +41 1 34 6 5 8 +42 1 35 6 5 8 +43 6 24 6 5 33 +44 3 34 6 5 33 +45 3 35 6 5 33 +46 8 5 6 24 9 +47 7 34 6 24 9 +48 7 35 6 24 9 +49 15 10 9 14 13 +50 16 10 9 14 39 +51 17 13 14 9 24 +52 18 24 9 14 39 +53 15 14 9 10 11 +54 16 14 9 10 36 +55 17 11 10 9 24 +56 18 24 9 10 36 +57 19 14 9 24 6 +58 19 10 9 24 6 +59 15 9 10 11 12 +60 16 9 10 11 37 +61 16 12 11 10 36 +62 20 36 10 11 37 +63 15 10 11 12 13 +64 21 10 11 12 15 +65 16 13 12 11 37 +66 22 15 12 11 37 +67 15 11 12 13 14 +68 16 11 12 13 38 +69 21 14 13 12 15 +70 22 15 12 13 38 +71 23 11 12 15 16 +72 23 11 12 15 17 +73 24 11 12 15 18 +74 23 13 12 15 16 +75 23 13 12 15 17 +76 24 13 12 15 18 +77 15 12 13 14 9 +78 16 12 13 14 39 +79 16 9 14 13 38 +80 20 38 13 14 39 +81 25 12 15 16 40 +82 25 12 15 16 41 +83 25 12 15 16 42 +84 26 17 15 16 40 +85 26 17 15 16 41 +86 26 17 15 16 42 +87 25 18 15 16 40 +88 25 18 15 16 41 +89 25 18 15 16 42 +90 25 12 15 17 43 +91 25 12 15 17 44 +92 25 12 15 17 45 +93 26 16 15 17 43 +94 26 16 15 17 44 +95 26 16 15 17 45 +96 25 18 15 17 43 +97 25 18 15 17 44 +98 25 18 15 17 45 +99 24 23 18 15 12 +100 24 19 18 15 12 +101 23 23 18 15 16 +102 23 19 18 15 16 +103 23 23 18 15 17 +104 23 19 18 15 17 +105 21 22 23 18 15 +106 22 15 18 23 49 +107 15 19 18 23 22 +108 16 19 18 23 49 +109 21 20 19 18 15 +110 22 15 18 19 46 +111 15 23 18 19 20 +112 16 23 18 19 46 +113 15 18 19 20 21 +114 16 18 19 20 47 +115 16 21 20 19 46 +116 20 46 19 20 47 +117 15 19 20 21 22 +118 17 19 20 21 25 +119 16 22 21 20 47 +120 18 25 21 20 47 +121 15 20 21 22 23 +122 16 20 21 22 48 +123 17 23 22 21 25 +124 18 25 21 22 48 +125 19 20 21 25 1 +126 19 22 21 25 1 +127 15 21 22 23 18 +128 16 21 22 23 49 +129 16 18 23 22 48 +130 20 48 22 23 49 +131 1 75 50 51 56 +132 2 75 50 51 52 +133 3 75 50 51 77 +134 1 76 50 51 56 +135 2 76 50 51 52 +136 3 76 50 51 77 +137 4 74 50 51 56 +138 5 74 50 51 52 +139 6 74 50 51 77 +140 7 75 50 74 70 +141 8 51 50 74 70 +142 7 76 50 74 70 +143 9 50 51 56 52 +144 10 77 51 56 52 +145 11 50 51 52 56 +146 12 50 51 52 78 +147 12 50 51 52 79 +148 13 56 51 52 78 +149 13 56 51 52 79 +150 13 56 52 51 77 +151 14 77 51 52 78 +152 14 77 51 52 79 +153 10 78 52 56 51 +154 10 79 52 56 51 +155 10 81 53 57 54 +156 10 80 53 57 54 +157 13 57 54 53 81 +158 12 55 54 53 81 +159 14 81 53 54 82 +160 11 55 54 53 57 +161 13 57 53 54 82 +162 13 57 54 53 80 +163 12 55 54 53 80 +164 14 80 53 54 82 +165 9 55 54 57 53 +166 10 82 54 57 53 +167 5 73 55 54 53 +168 2 83 55 54 53 +169 2 84 55 54 53 +170 4 73 55 54 57 +171 1 83 55 54 57 +172 1 84 55 54 57 +173 6 73 55 54 82 +174 3 83 55 54 82 +175 3 84 55 54 82 +176 8 54 55 73 58 +177 7 83 55 73 58 +178 7 84 55 73 58 +179 15 59 58 63 62 +180 16 59 58 63 88 +181 17 62 63 58 73 +182 18 73 58 63 88 +183 15 63 58 59 60 +184 16 63 58 59 85 +185 17 60 59 58 73 +186 18 73 58 59 85 +187 19 63 58 73 55 +188 19 59 58 73 55 +189 15 58 59 60 61 +190 16 58 59 60 86 +191 16 61 60 59 85 +192 20 85 59 60 86 +193 15 59 60 61 62 +194 21 59 60 61 64 +195 16 62 61 60 86 +196 22 64 61 60 86 +197 15 60 61 62 63 +198 16 60 61 62 87 +199 21 63 62 61 64 +200 22 64 61 62 87 +201 23 60 61 64 65 +202 23 60 61 64 66 +203 24 60 61 64 67 +204 23 62 61 64 65 +205 23 62 61 64 66 +206 24 62 61 64 67 +207 15 61 62 63 58 +208 16 61 62 63 88 +209 16 58 63 62 87 +210 20 87 62 63 88 +211 25 61 64 65 89 +212 25 61 64 65 90 +213 25 61 64 65 91 +214 26 66 64 65 89 +215 26 66 64 65 90 +216 26 66 64 65 91 +217 25 67 64 65 89 +218 25 67 64 65 90 +219 25 67 64 65 91 +220 25 61 64 66 92 +221 25 61 64 66 93 +222 25 61 64 66 94 +223 26 65 64 66 92 +224 26 65 64 66 93 +225 26 65 64 66 94 +226 25 67 64 66 92 +227 25 67 64 66 93 +228 25 67 64 66 94 +229 24 72 67 64 61 +230 24 68 67 64 61 +231 23 72 67 64 65 +232 23 68 67 64 65 +233 23 72 67 64 66 +234 23 68 67 64 66 +235 21 71 72 67 64 +236 22 64 67 72 98 +237 15 68 67 72 71 +238 16 68 67 72 98 +239 21 69 68 67 64 +240 22 64 67 68 95 +241 15 72 67 68 69 +242 16 72 67 68 95 +243 15 67 68 69 70 +244 16 67 68 69 96 +245 16 70 69 68 95 +246 20 95 68 69 96 +247 15 68 69 70 71 +248 17 68 69 70 74 +249 16 71 70 69 96 +250 18 74 70 69 96 +251 15 69 70 71 72 +252 16 69 70 71 97 +253 17 72 71 70 74 +254 18 74 70 71 97 +255 19 69 70 74 50 +256 19 71 70 74 50 +257 15 70 71 72 67 +258 16 70 71 72 98 +259 16 67 72 71 97 +260 20 97 71 72 98 +261 27 101 100 99 105 +262 28 107 100 99 105 +263 28 108 100 99 105 +264 29 101 100 99 106 +265 30 107 100 99 106 +266 30 108 100 99 106 +267 27 104 105 99 100 +268 28 117 105 99 100 +269 28 118 105 99 100 +270 29 104 105 99 106 +271 30 117 105 99 106 +272 30 118 105 99 106 +273 31 99 100 101 102 +274 32 109 101 100 99 +275 32 110 101 100 99 +276 32 107 100 101 102 +277 33 107 100 101 109 +278 33 107 100 101 110 +279 32 108 100 101 102 +280 33 108 100 101 109 +281 33 108 100 101 110 +282 29 100 101 102 111 +283 29 100 101 102 112 +284 30 109 101 102 111 +285 30 109 101 102 112 +286 30 110 101 102 111 +287 30 110 101 102 112 +288 29 105 104 103 113 +289 30 115 104 103 113 +290 30 116 104 103 113 +291 29 105 104 103 114 +292 30 115 104 103 114 +293 30 116 104 103 114 +294 31 103 104 105 99 +295 32 117 105 104 103 +296 32 118 105 104 103 +297 32 115 104 105 99 +298 33 115 104 105 117 +299 33 115 104 105 118 +300 32 116 104 105 99 +301 33 116 104 105 117 +302 33 116 104 105 118 + +Impropers + +1 1 14 9 10 24 +2 2 9 10 11 36 +3 2 10 11 12 37 +4 3 11 12 13 15 +5 2 12 13 14 38 +6 2 9 14 13 39 +7 3 23 18 19 15 +8 2 18 19 20 46 +9 2 19 20 21 47 +10 1 20 21 22 25 +11 2 21 22 23 48 +12 2 18 23 22 49 +13 1 63 58 59 73 +14 2 58 59 60 85 +15 2 59 60 61 86 +16 3 60 61 62 64 +17 2 61 62 63 87 +18 2 58 63 62 88 +19 3 72 67 68 64 +20 2 67 68 69 95 +21 2 68 69 70 96 +22 1 69 70 71 74 +23 2 70 71 72 97 +24 2 67 72 71 98 +25 4 100 99 105 106 +26 5 101 102 111 112 +27 5 104 103 113 114 +28 6 2 1 26 27 +29 7 2 1 25 26 +30 8 25 1 27 26 +31 7 2 1 25 27 +32 9 1 2 3 7 +33 10 1 2 7 28 +34 11 1 2 3 28 +35 12 3 2 7 28 +36 12 2 3 7 29 +37 12 2 3 7 30 +38 13 2 3 29 30 +39 14 7 3 29 30 +40 12 5 4 8 32 +41 14 8 4 32 31 +42 13 5 4 32 31 +43 12 5 4 8 31 +44 9 6 5 4 8 +45 12 4 5 8 33 +46 11 6 5 4 33 +47 10 6 5 8 33 +48 7 5 6 24 34 +49 7 5 6 24 35 +50 6 5 6 34 35 +51 8 24 6 34 35 +52 15 12 15 16 17 +53 16 12 15 18 16 +54 16 12 15 18 17 +55 15 18 15 17 16 +56 17 15 16 40 41 +57 17 15 16 40 42 +58 17 15 16 41 42 +59 18 40 16 41 42 +60 17 15 17 43 44 +61 17 15 17 43 45 +62 17 15 17 44 45 +63 18 43 17 44 45 +64 6 51 50 75 76 +65 7 51 50 74 75 +66 8 74 50 76 75 +67 7 51 50 74 76 +68 9 50 51 52 56 +69 10 50 51 56 77 +70 11 50 51 52 77 +71 12 52 51 56 77 +72 12 51 52 56 78 +73 12 51 52 56 79 +74 13 51 52 78 79 +75 14 56 52 78 79 +76 12 54 53 57 81 +77 14 57 53 81 80 +78 13 54 53 81 80 +79 12 54 53 57 80 +80 9 55 54 53 57 +81 12 53 54 57 82 +82 11 55 54 53 82 +83 10 55 54 57 82 +84 7 54 55 73 83 +85 7 54 55 73 84 +86 6 54 55 83 84 +87 8 73 55 83 84 +88 15 61 64 65 66 +89 16 61 64 67 65 +90 16 61 64 67 66 +91 15 67 64 66 65 +92 17 64 65 89 90 +93 17 64 65 89 91 +94 17 64 65 90 91 +95 18 89 65 90 91 +96 17 64 66 92 93 +97 17 64 66 92 94 +98 17 64 66 93 94 +99 18 92 66 93 94 +100 19 101 100 107 99 +101 19 101 100 108 99 +102 20 107 100 108 99 +103 21 101 100 107 108 +104 19 100 101 109 102 +105 19 100 101 110 102 +106 21 100 101 109 110 +107 20 109 101 110 102 +108 19 105 104 115 103 +109 19 105 104 116 103 +110 20 115 104 116 103 +111 21 105 104 115 116 +112 19 104 105 117 99 +113 19 104 105 118 99 +114 20 117 105 118 99 +115 21 104 105 117 118 From 983401b015abb5447e2c790ff72db61135cb6705 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Tue, 13 Dec 2022 00:37:09 -0500 Subject: [PATCH 05/47] type labels for nylon_melt example --- .../nylon,6-6_melt/in.large_nylon_melt | 15 +- .../nylon,6-6_melt/large_nylon_melt.data.gz | Bin 3745227 -> 3777723 bytes .../log.20Apr18.large_nylon_melt.g++.1 | 175 ---------------- .../log.20Apr18.large_nylon_melt.g++.4 | 175 ---------------- .../log.4Nov2022.large_nylon_melt.g++.1 | 150 ++++++++++++++ .../log.4Nov2022.large_nylon_melt.g++.4 | 151 ++++++++++++++ .../rxn1_stp1_reacted.data_template | 189 ------------------ .../rxn1_stp1_reacted.molecule_template | 187 +++++++++++++++++ .../rxn1_stp1_unreacted.data_template | 160 --------------- .../rxn1_stp1_unreacted.molecule_template | 169 ++++++++++++++++ .../rxn1_stp2_reacted.data_template | 131 ------------ .../rxn1_stp2_reacted.molecule_template | 141 +++++++++++++ .../rxn1_stp2_unreacted.data_template | 158 --------------- .../rxn1_stp2_unreacted.molecule_template | 157 +++++++++++++++ 14 files changed, 965 insertions(+), 993 deletions(-) delete mode 100644 examples/PACKAGES/reaction/nylon,6-6_melt/log.20Apr18.large_nylon_melt.g++.1 delete mode 100644 examples/PACKAGES/reaction/nylon,6-6_melt/log.20Apr18.large_nylon_melt.g++.4 create mode 100644 examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.1 create mode 100644 examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.4 delete mode 100644 examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_reacted.data_template create mode 100644 examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_reacted.molecule_template delete mode 100644 examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_unreacted.data_template create mode 100644 examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_unreacted.molecule_template delete mode 100644 examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_reacted.data_template create mode 100644 examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_reacted.molecule_template delete mode 100644 examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_unreacted.data_template create mode 100644 examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_unreacted.molecule_template diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/in.large_nylon_melt b/examples/PACKAGES/reaction/nylon,6-6_melt/in.large_nylon_melt index 3982da799d..6fbf46f844 100644 --- a/examples/PACKAGES/reaction/nylon,6-6_melt/in.large_nylon_melt +++ b/examples/PACKAGES/reaction/nylon,6-6_melt/in.large_nylon_melt @@ -18,14 +18,19 @@ dihedral_style class2 improper_style class2 -read_data large_nylon_melt.data.gz +read_data large_nylon_melt.data.gz & + extra/bond/per/atom 5 & + extra/angle/per/atom 15 & + extra/dihedral/per/atom 15 & + extra/improper/per/atom 25 & + extra/special/per/atom 25 velocity all create 800.0 4928459 dist gaussian -molecule mol1 rxn1_stp1_unreacted.data_template -molecule mol2 rxn1_stp1_reacted.data_template -molecule mol3 rxn1_stp2_unreacted.data_template -molecule mol4 rxn1_stp2_reacted.data_template +molecule mol1 rxn1_stp1_unreacted.molecule_template +molecule mol2 rxn1_stp1_reacted.molecule_template +molecule mol3 rxn1_stp2_unreacted.molecule_template +molecule mol4 rxn1_stp2_reacted.molecule_template thermo 50 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/large_nylon_melt.data.gz b/examples/PACKAGES/reaction/nylon,6-6_melt/large_nylon_melt.data.gz index c620b879a883817b8eb7abe4495e585ecacfaf02..e1ec3079f7409c8256f105ad922a97a5ec4304ed 100644 GIT binary patch literal 3777723 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

7$PMY(^W^w)}~`t(hTdaahB<^{Kx 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%0DuGdKB{8XC-jy} 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%0A|+DT2)DZ~kY&ddE&t)WJ+wQtwp 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

jr0O1J(~DXcnp=Vv&J3*{yYsu!;qL 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

+W1LXP&PrN~(XB6xX$tBI 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%0AY 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

@b)I(OJ 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

  • EI1NVOnsuJ@gTZPUtrv1v%T*qYAF<=mSosoQ z1A3EAjg{tZFOae=THtSiJh}T^gXN-OM`bV`#3-I^d#;f>0rhL4oH*tD%`7uUgq&Jk zycEv09o{Z@k);>Cyq_)eY~K?+nF8^dECq2E4S4kmjt>KmzS94h5MGy!F*J?$v+b3$ ziyYDj7(}j>x&jEW6HFe&zh8X?S$%QbAWFsyzHz2NznJl!+W3eATm1HP5+FWuA9P`B zT4Hcf8q~t5TZJCN`&IVMHkp#t$C#wpW_O=94B|$g;%%fEmQ*04E{G>2Lg5-_tOnZt z2n>XT=0Ql0PDkgmiE>JY#c(yyI>QVQ@wk<=CkczW!JePNFoR}aLMPij%Hi*UWbLJ$ zP0n!q7NA0DKv8Tza*|T^!dHk03{WNm<&(Sw14;Em4rr0Kn7YltS4T$V2%J}kpSxQOL#^Fr0BqILVznb9fR5{A5 zcTq2WwN$qw(TF#)T_RQ3!T*jzo)TQ$TgZ?#E#-Jd-X#hZ!$B*<83#!aPBh{cq26@S zB>6LVk6$vkFrDb%<6#jT!=2#D0ceHsQIfY_!TSz4-Kcxq5aT*#d8bl|G6kA%a+q6y zD6VGP;t?w)HpR(g7SmFOo-oiMNZogct+w0!8Ezxm8*=Npq#T8r#=ArgKz+r1%lFYL z7wNOR9K_PR+94eT2sq|VSU(q+v;eJwCTF1mK2B+Py03^7WEt;*pSs0;R57<#s5&or zabxj&x#1G`2h8u)fjb8~=QI*LNiPthx}dX}ZB~MU|GJ zC-xo9!Jf$2M+U4@ z3%xS_3C42=ECO)J zTg(lUM`-p;=-pBk%!SC}U4YEjv-P%lHroN*z~D(^TBZVjQPN_Z4hV?;LT#rGg2+Oc zM8Id55215bt2=ZN7{{qBfw*_xqDYnw(Z&k6geHIW^yd(QgE`qWze=wI(6@lF#I?b$ zrpFXkjlrBZaOlycoF4qacGGEyq&@k0t)a)jVxRi6v?ZW4$=Wu1$T+#9wod}+gmv7| zZmlW{^Z6q0k5+cLx**5~l2G<~=CX^Dxmnafq??^i*d=6>D4?4xWyb5Ped9@y-x(Sg zVz&%q<$N-7w18}qu;6Fkb_h6$rg4I8k{?1K9JcR|h6WoweE{%5F7c}{JjDD_NYxzl zd@`nEBz)3#sHMLai#uf96kLxfEZrkF9ipxR4TFYaFTrayCf<`-ca&N6Ym0n;v?gJz zE}5O8p~!i%El9{>Ze%iowxT~i5s2V|F`P@U>iTHk$V)yNdU4a<7=pRondSD|Hz@k( zUoNLB+ab*gJHR+}&BuF(Y#^ml2-(`PM>36|f_tD+mH6mYQ)O(4qS(-a*~gjHCC$eV z3UVT$gCSjH9WHHBcRK{BU$m6~ zVo1vKe38{YIhLxC6~mQlp<9MRA_nDmbqCq1_DwSj*T{wq4ujF+lEW}#k*=mpjo#dc z&k$swM%xDsf$Kf04^y|rVcp+~Y^+ zKB8hK*YW1P{Z=KJ-SLN8(tm;{fYQa8t>+f*frQt-CmAAshm;MY!+H69agl>x1sYtv z(r5zmg1xu@8$I842&L$jb1rprg$6SHxX@n}1UWsP0&LrLBN1^?^t9&&t@#X+X^VCi zao1kkL=ZfbRc2dq!wdjcCh|B-NQl1qI4H+6h9`(s{oh?xAIRrHB+A9IyJsvJN=hp3 z(RW@CXYW^Sj398#;|9QiapwmeWfn;b1WeH-J~+Y37n=J#$hp&hm~3Z^M+1sEkHIL< zwneL0G(;5{u3<#n?9A*A@4mwqq%Q**6{MC<*8>EVdVX%oy|r+{j9%9^=1|#rYe=o1 zvOjqZ$tgDEky{dAg8ocNY>#aZH#*$#-UiM;i??QJRsonVPpD8=l3>@MGzyUx4JBOo z3hj}-B4$0bQNS)E1+seMRnlV<7d!+6RvCpuMFyUBj%uFAZLjZEsWEG6vMCFWF`_RM zB`#{!PH^!GbfKU&NLeH1*WupZZTvR{UDzh2?j<>bG$a}0JQO6>9^n=R3tIG7dVH?7 z*Lyx7w*UfhgpMl%%Eycx?;pg%U4j<*{D5zXOamWb(%#PAm93E^4{7V#<+3hPWDLpf zh>0_M3mI)ngy&F^s|ip#@B04)Snqb5{qq!GkOLB|xu&#~|o z@mOo@GCR7*bINYcA7K8-t)U=1qtwrp{-fOcki0JFK0MF$UhGy-PBuN zq=^0FTD#`5-iFT`$vVkO({Cp{PDhev%wy=fN|eJH47fK#Ba)75n|E^t6iYf+=qC#h zl@bW?P~zP;HOix2Lu}w+Yeop}l;Hpn8u=aFuFyory7Bgfn%53qS}Sc~5mjF#$&t5w z3s>|lVSpgo8uGn)%qQEuMK+w!+@MIk4HNO_WHN+%cq*%;vB(A90#O;sD?HXpyS30q zXH-UEHz+TGZ|U<1xV-M7GGYO<{ky zH*KOtAhv}N4NE5;-4d(>NQzT+^*Bhj7VU9hLFoT!wYcw5M^t3Hq-kkHE)i)uz?cNW zdpYOm+95;aL&mb;isEC3Y~~m`WniZ#mMZl^*wYJVVj0jouYRHt4~uYi>`KQh=lRuk z6=;_caui{P0n|C>wf%Tl19o!Y(LIq%oPH)qz%c4_`h?`|wnI%Dn8iA&*;r)kS-F$J zSxBgBr8@|a(3`Ll8^-E$_t(Db2qJ87u;Nqhc_jr@)HMDJBGxfDw-+`NN5Vp68{yrg z+cvU-*YqdyWgg+|^19@D~L>Winp3!)YRdWnv*r*->xyAN= zy6s#UY%~s)1ii9463iB4w9AMOpqtMPDIGbSQNz*aa#)3IkT*zE0k#6F-JEYe5mX_i z;|j`G+zRqa30YE4@eT)IpKR$1bhxGXhu-z#QdVq?NKK}?a+tQR?2*E)F!Cy(N1l%s z`wk2PZ2)L)U=Tj9?*pS8Dw))(9Ey)j#-J}VF$2GYihx0G>)k9?Ee-c{)yorHB8K+? zD)oH;@4Nmq97w45KoNV`!_2a{N99`4Bi~XiDNv2H1G&7R0KW*Uf!fAVGI|hJgl9R|LsdKNtb{+r$+Mko;57v+S|yRD)1GP~1Wi<^1cG zsDSr`U<K& zQCHgX*BD!kCbv&IAm_1U`1Yb!)gYB0^W3NlZklwe9iFsGd)LkTOqECRy zMaSXzVfoO1W5zk4d1KA09^J}FP}s@PLIdrO6$yVPNjp|i;QVWToHXF{TeUc}Lzqtv z3evUvW7YS<=so6|FYh!||G?uYOMh0O7C<%?FBWgmq$?DVzF1sJ`$42vuyd{tqo#Yq zEga<7ysrgDdfV$qJ6Qz`KJiP&6Ei377nJCV6gkd=2Ha2bDh;RR^3vQJo406**2D!Z z@`0{f233|x;n1M5x0N&q&xCMB5?`s@cB2)jW2Z(_B{5Q_yb!!si`}86QOIYMg^VanTBrM@t>nCKDoRPx4Zn1)ko@Vn;bwy zwati5A{YLu4mELAeuBN@SWwvt6QgF%CjFO(i*IeW31J2jb(T}fTUS7pyNVI*R?6e@zX%?p3t z;9Nk{pag4Qr|%Cv9H;A5)CA@l$W-?! z@wdl)O*?Owh`?Mx;1a~didl#B2kCK>oNK%iJ^NzdMVPSn_889)%eKc2Y;n*>>T{_e zRAz0|Idrt}Nh&L&1I=J@7z`7{>|4yDfZ7{q1HS@5YCF9zhl0vOU`S>;{;W6LnTU{4 zV!pxU*lxB^VQWwWz6CjB38&?Ym_g4akQ_`D7}occb|VTaT=0*a4y5UBJd;7}1ZKJi zZ*twD#NFD3m^%3vdN!KYNLkwho;~XG+5T$yTF1U~OjgI#$NsRo%vuGZh15Kw`+C^g zVXRGum+*t|R&Mt%SAL;KBk|8B&z9j9ru^8Z?lATRu>Ix=Tr^X_>7(@;<30Pa)ag(9 za( zVsMWj7@|VC0QY!X;1~nuVD_+x)8|ml_I>(r8Eq0+wL9`uq&YtrZ!4pqoTDOVT5XXD z@c_3Prh4;PJXxW&Z7|V$KrxY#;8?cc8Hyj2-VUX`#OzmSs>;@}-N|9xBM8ce6XTIj zX_HP2!KK=MuA5}j$m-yHu&<0hnjBnm_&G-HocpL8phfvJK1XT^)mFgS2pKmoY#aYc zRmTJpeK>yyXaz9K_>PX4KMpiv-CM{3>x3qc;F8>Z6*Z^^SP)*XPwLW7rY{3hi)w3O z{m!J$l87y-*V1X!Pz5gL`8JDd5O`*5>CDx3s-Tney>$6mMI|0sP=X_(6%{LY?7RgJ39X?PXbj16H@X zu8>jC9lYUkIcj}#)S3!&F?V>9ORojz7P7P`Y3;T7+o)1efo`=pC^yyN4VnVXWrl{& z?3NzWI@vfO71XZf>f`txsz{tyIHcUzJ+yg12KE?rB7Fa5}3h!Jq+SMKxdRRqn}ByYi+oX=M|%P*D#I%G-D0F&)N zFj5;p&kgh2>0_vl;Ju7MFvhv_4UebWB1%zq2ujpw$UA^_;=hfq5O{={7Fv9W3nnfu zWZZsV&a#HhJ=zr$I=W}}fNtj-4>eviHW|+5b&rzIk?~B%9O;!Gw9R?zmSJJ^4YsYcZ^pRrm^Cm_jUIO$|o})v)+MXrHK&CRnB8wag;l@z8)3V@z*=2gZMzlDX zLepzXiCab* z#R91+yx0=&72gN;ze=N71pxbXs z!UIk<0B>A5GHpoP)@Bz$9*O%kj5=jKD z)wb~e*vC~~di)>BL zJJ2C?O(wI#;b|)bZA5aAfG$ssNDJqm)gfxm$e<(=9hEj~Ei74Kx4`s^eF+dJxTIuY zL4${fI7TYJiXmC}V&FX`tx;hA0leMp!4Q(G_1yS~Z4xoLx{UCa)3mj-=}(udSC{Q{Zj1;8fl&CBFL2GVj>WiHO@wf z0Ft8m^J6>$GCcqB2M?Uj203?)^pyJ&0S3)ab6;MnsQoN$6+DsA*|gw-JIw_dJQCM^ z%evEIZ@kTRBWBZ3cdan2bF9~%hE)aUZv%A zmNVjHTy8~hJQmwyET-})REz9@x$}<90nxvVYF{h{gZ+bjN|0#wx9)^uEw*jzGQpzj z4%FB+yDGdm87=~3h|?FFc&y9#k#w1Fd@bD`FxFAViJ&4q=Ab3fyeSiqG2A?48+Q4c<(b& zB{M{Y@;RPQwl6gp-ma`n?6Qc2BzPA3pi^eD${q-t= zpyW>m^o(dZaOPf(_y`DLqO==`!>7?khI9sz)bVe|cm&WQ=5(p1YcXuR5mrQstUaG>FIWwyd|EkgMT>30 zd_Gyi*jDy*k~;IPFZb*q3}{#~s;lm`TW7mN@NT6Ml7JONXKqq&jM&6&?3aT!=$VLv zQKFl0Zz9{HZ5wtpP8&P<7!~#Y>&sp0}kDFsx`2+742^C_Z?!1*W6q(j4C6z zf`j_JOcBx#D7`Mth%6BA*+Q#&UOQ}7*@aTCarR#<7%b)e(?9uEAhQ~-(m}P+N~a=v zopi4-SSxkaAC@?>r|67|#&CO)c0264y6i=o!CV|m&ZZ!sMac^@qm4M$K|_d{4!!ca z@l;W1ZSK~Bx^>)AObu6i6GaKM-hzbp(pA%tEd=U=(wCvNCy#sRy}hT*7$L};*y&bK z0VfPVbc{k=eF{4bg=$2ieRbY?b^2zEYudN$A9LL-dB0khaozag^(CR;&=nc0U)=?t zshMWV%;g@7EnnKaNBUS3I6qUn;&%+hX`DwO8ruJ^X`a1mGP@v^o%9r$YCZ1O0trL! z4+c_kSqH8{I{ea_4B2C2K@}bdAxT|{&$V__O2Ev3>4!+BW9c<>?>Er89g*m?o{JG0 zYM(@aQcHO5#a(xG$R-_*9gyX)h#7cuz+bb=L`GNVT6Pma+_r31N|-NVM%t~_KuVFU zSq-|NQJ9^{m5~StYt!E$24a=Ng0^ZM8$1h5ud37=0ldDf+T!B+E!CP$@!}yiixA&0&o<3*wlW334S%q zY;oJRmT>8FJ|E4Z)xH5EQC}n$T0(yNe3KD;0Je&-%Wp}l)!X8NAnPCIcrCZ*E=1XL z(Vm6?-8{cy0)^KZrA&&ejyY8Nfa~C8mg;-Cy=4GH8jBYgf*@dj=KBpgEy{HjIMvmn zh5_FMn-|;du^jcyZcZ<)83`7FX!E{)Kvq9P!QgZUpA;!nq4Ck7g4}DF1TcL=%)pfl zZZb&!Rh%^P5cIzhKh~t)<36ob;PU7&wR;txIgBI*pH6@@>8ixHU}CSt05uV?vOwS$ zgvoX`3e41K40QTsN)0P0&_{76IW z0PMF&1)5Sw{ZJ=d=Z%J^bhg#NDIWYIc{wIP&^p_z*VBKYL_j36oI9b5+LCM5T78HN zj0IX6bz#{Y!tvzB$P`+O?zW-{H{%~}oKFd2s&dL$xg)Ir@dFaF^I%gj&~?C@P|8Tr z3f%qtbbI0z919G_?cK5AU9h~D7Y4Z>ULn8|U8i-zzBZnIKU0?T!T43?A@&Hgtu^ z-&oZm^SV#*bg+L_rR`gCel2I0J)np0F(sk0OSh{!^taj93ifOqjWRBYN+cDFyy#k- z{f-DmerKzSZNECz6Q=K6bL$2`;Q+hQDXa4}a!X=@U`S-2xwmJtVlSc6(5dMBwsfV3 zBVz{k&8X`!F}id`3;J&io-w^k_vx~owGlUG4Z!S>!gYopv;>RT=kgRsgLL{}$WD8; zKSyBob!o80w_Pix0?q~>&5uvFr zM`stZ6KNbTi)sJzF*yN(ux~O=PAg!#EGO}`NyvR@Oh7m&?#h7M5I85UJ>b!|O~UQA z?~ahtV=g}>sp)?7v~9)0uBfs*Q~*K&^?XNC=~>nzFlsq#A;u6DcoV)f~}kdlXSsnZ5C#=mhqvfUV4orJcET|6Jqu`;gOYPypM%= zXu;6lN^UBHWTXJ>v@h~Q-3N^ii(H?9nY0m_1cA{q!u2VD0hgIb*x>*>s+B7MN&{>h z`t^^8gBH9i1tPFW*br#nd;S`bLzn`)!q;3U95_VgfDR#;9```Xb4v_?4?@_$ZY`$a zDq(maAX?4f^a8$NJ_U4;Bq^@mtTXwouGorOA!kDT0*e^^!-*t2P>qYkv32I~wBdiC zCCpdHMEdBQ@K4@q9+d$2skuQ~2o8w(ArdRqmFFuyG3bBD z0&uQBhU{oTxk|5o%*Q21>vy|YXOvql5JBm7o+`s^~aYe(aKqOsnH@BCYFANgbIT1d&j|73*A2(VX|++B!VmzmLG_( z8J7c~>f)$xN~Sngt%xEY4j=TvW_U&t#{S!*4c`|$DU?ok&PKHwt(-&St*y+&b`hNV zf|_Hj|EyN^*}m>>LOiBOBaBmxLx~BfRV;N2(v%L+%&5~avs9*;--$^rpR3VSL&Y}g~nVjS*jayar$UEieRn>x@v2+26-C6c38MAzb}9uHg6K27`X$| z#=8cWTwoS763`pOeb%$tCj$mmN$0{7*oVWo{nhw&0bt2s38R!*Y*kkrpLmzTe#Lyy z6$P+ix4mEF4S1sl#xn`p4xACBu#^;2zLJ(o0D5RaBt5WIWwD7PS2wm0MFQ?&K9V3Z z7B06htOf4dV)VoDS-?P0ZgfYnwoa-~|2rBc8Q&7KX1-2m1kW#;_Q1uH-CO zz@VUYyU-op3KI5-VHiWw5#9}x!7S{%gE2+%Vs_5=Z~o!zu_kmI8J;evrac>lK@zTD zRjnsG))I}jsq-TOHB&APr6k$~1{ts@pKjZ)N$Xe|$n`WONmMu# z%~+}lUjBNrxmgTH${`J6gu)zYiYO10b(xEG#|O`(c_tdWKw6&qjT7SI_iG%u3R3b4 zO|qhvOm`<#TZT>E%yottqUE)%Nn?cMrt8*$M}PR^b2e2aF>(&sUw z0=B(~xCGvS#SQe3!9Wxl_i8(3tMP@WUn34+9#vjlpsn0VsHWekF+8shj)#W$LN7V7ox#A~@C{gGzmDKKC;s{d7!xYt~4Qq?~3#*#VBA++rZqFd#|Sz!VBID*wQE$D*Lw zx1xW8))-*+$E^+CZ*v9&t88c_Aq}{IJwQ#QLo1yOTCL}%6pJ>>Q-fB@v#E?+$3{)P zBdmOA|3WJ`x1<2weQ11QyVe_A=*m>yVN!K}do;va_V{2xKv-ac&+RV2#-&;%w?D{K z7jlbX5i&tkl+x3?RcqhV2-FE)3~0S`9npgxkM=xeSKM=Zn6gEYpDv67Won9Cp47-L zt${HqsS4nboZ}-`7{CTLTpOwDfTf*6eXfntdAaywqD$uaEPoNQDFQig@9rr%J^sC< zS0xY?Ioiguek`Ip_AYamcdX0fNWTNo8Kr|UKK6-i%WW6bPG!M#IjT{xAWR)04FKcB z<{=NAGf)PEUKq511auU1IIq*RMdeefGgd(ZB6PQtl#VvDda!b9+`@I5gn1f(4B|5} zCmq{mLPA4;4oJaAv9dy$Q6@a7$Xw56Yg^TWXorRe??VuGi4Zj#Ne1oxx}>%$L>IXf zkN}X{t>x?(lRPqxA8%t$cJsIGuSYW)PeajE%F9P z6GTC%6oBTe8vs2(!oSthzB1)z3$Edz*NUdjZURlwH}J=6=+66%%2$Y}8310XZXV8~ zT3HE30f*Xq1DnCa7UyjdssUNygrU%|YSXOk5OftRH~|1FDFAT-5MO$Z0!XB`suNI= zsCEZ{mg)@*=vTCspoOf-^ufAB_W~$-ThrT>E;Q1GuSm)GfB_W8B~2na+ww~L#>iZx_i}p%Q4_-Q zH5mPn_}ck&>X-m7$`V-jok=*L6F~A*pZx`1=AOm}!6nqA)wyPwwlf8D0qQj*!M~Q{ ze4q~pm@?e-rq8F_JEBu|Dk*P}6&LxEVn@R&v5ty&PY!k8AXU<(rgM9`E!VRNfzun#B6A}*iXMDzT1`#A(A2Y5U}Zc24AjiBAok`bCWrL`Q4WV=)g zoKG&H_i|gpGc_W2X8{qBoR7onMa*>qAiePWuuT&x901tHcprqm#{fdpLv4ckpt!a$ z;*lZ9kP#fsikYapinc&MDbB~YYb|dyFHmkoxewR!yy#^G(Yu+BA+EHW)`x>}0auQS zXTcb5O}%{vMqh?$N|&DH%0_xsw<%0<@SGyXAeji=#fB=6t2{?}4}3@&BYYv_3q;~I zM>+!-#5dg4&?kyDE*!XBi45lP>0*|fU#sEB_^D71es^G9KY`Pp4OYAAil~ryouc!% zK3ipq%;VCz%<=tfId4`2H^tS%D8uT-a7Igk?(l;nUZvt`dJ2+!RZn83_p{}=d6O_M zt61F?jig2S=Z-!M?gpsJ^(GtEOw5iMl+QHZt9|PW!&Je*+cpHF?p0fNwUqH)w@QIL zeg!WyHWHJ@2-fqNqp;fUyQw*92^K+)rJjgDj9|iJ`#KNS<)T0ntnKw}!cn zw`ejgiHjUUd4D(ThCg>npfyjO%Ybd62*!{6$G~Mv3~5F`ZvbBC2Uh?@|Ln=KTP-V> z1-Wqvh49EDXeerjzGUZc5dmm$upb#YzE|5hR7@P63a3gY*sf`Y<@+&xx6HuR8lWx^ z2EhB%5PZMM@9(DW5bB$hgz~3bS-RYsEn|Vg-MWWms$|(2ky^%ozFYr%lQM*n_gI6Z zUY+7mXfKCItmJrm)=YOwWbc42*!u*ezI&6Fks|O?Q(v@dPB#RTiK!HoL1=52pkM;! z6j)0u&(y?T!e09k&<0~Gfv2i2|{~s&lfGThw2DSe#On#3{@Tdqv8ymYbYIUJV0*O4{ zfxBd@9w?DM10SLEJ@xc{mF;si@Wgg{Wkv|DY3UV03ll^Rs;xf-udwRyN ztyZ&b$wsncg*81^2lz6p%7>S6L;u3}2?=y%y`-%9{cvNmPtdlL+#u>e&W5vU2T|7u z*97Z?tCoX=k%67JGGl-4N`y3bW2+*1GEjYdgcqhB3mwsfy3mE^tK<@}I~xC9q^R%h z6BetR#V`y9@__qcD+`l{s1sT@V0Uurj!8w~4{K5sXTkE{7L&}vR=EM>Jo4POQK~m{ zyMj5ou z)?bV5C{>UW;mYJpZMBBBA)==$K}hCjYYs2FMx4>)e*7M6_8osKks4Y#W&s6uf56s%qnRCDe0#a_A11}WmD%*wu5BnN;ybR0eR`Mv4^AZdAAsmP*Q=o-OUA&mcVd>ftf7bbSOOr77TMU#&xcZbuHGmyi>r#C{#+j{&I5& z(xIk%7{kJvV9+EJKaqQZ*a&22RVEHW|A>OR-fHF%X{m` z-C_uQg07I3? zAw>QeNW4m;{SiXg`eS>}0wcpA-2}&uplFOKhODZ<87_DzZEX;OaEPy#s4uo7CQB3q z^e+U{ny;;oz!QQg5jTW|4o!moB9qNC*VhKoZv48_?8K7CGfNa=Ykf2{8tRny<6PX` zLhFtx4-DnmUI(rB%}0Z4Kvs~*Ey8*<(zY%?BKo=u91374P2eQbO}Q@yackd4z%~V% z5(10Ym=r()WNd6s@>mRSMp0e=i?MoqKv4lfZfpCAl$?DF6y|$bQvaef%Fqv7tb4d+ z1o^-d0WLtUYONQK+3R8;N z+va4g2L$1`zSeQWg%=1eSoi6z8nNXou4)u0c|1^SthViMbtH@N7p4(Z>pB7%&mEa# z$3<60{Rm%sJUIpf!Y5UDY|H@|vRfI(i_8eur1fY3z9bHSeo>r1X=Y4JX?q`+)!v9y|%egey$iKIhG{ zCg#p-2nVf%1_yQmVY~*6`*}d4grRK#@H5p#m9%}J2{b*QxTwMdqcHoi7-VoYJXhP# zRwN+HzhAMNTr^NRpHkq~)UA5xl0ggFOkF_A{#tE279$u^DrIpc^Mb5p#HmsA2*}_0 z2^jjGg>MOk?6Dg2@f~T!mXSQ1t(n7`okG1tU^_FEjm=-A7z03;;B&S3i?p&6h7JG% zkarr8@Z2TR&g$sS%Wa(}q9x-!5UZR;&fSHuoL5TN8VJkvp= zJxoeQwS)7#zeomkTSZH}l0j%5P_Bg@;0|CY1O4I#$0jt=;f?rT-#b9ZXPXAp<J)D^hY>x#ILFwH~|B+^kX%wL_Z}=Xi7#vF<7G5uRB~o7Lpq29;eRAg3{Z+NmLSs5r83Vr1 zhFM-+8{%$3`Y{6xt6^Sy5?*MfG+-L$qQ+?N6?{&pyTax9=L~U|g4Oa^ zf=fFX0XfO8`;AF8n!Sn0oNIl)%CRZ!rE1K85OiT#IAm_qj>sZP1PR`XAAt^MGNYR- z2=?Pu;-R+-T~VgW)LnMX&F&|T1JBq)WTRMpsza@6fm%v-H9c<}w3zoACeZ97b1xZ8 z`orOHLoddDwp~VEmSSc^$B3>IMhuUKv*or5(doEY&}C-4wK_mm=tCN^;v20C&MpPP zl&A-uL`jz0>*_?T@nToEDXi?AtQE$lEtoM7Td~rPfo9c!U|$43R0g-#w*_GEc*sQC z_g@Mk6T@TaGr|$Qw54z}M)Q={k0*2v4EQ|ns**s+ zBIw13v)YiJ8anD03{FY?Bj} z!|*SI4(P&xXPPeoII$&p$z^;{fdPU@tIw|cMF!yYL5O!H1TZmK zyvZ*WNq}3`(QT(*@RG=4dnOQ~kAbA5qrK(bECMiUxKuM~E`S1vC;W_P^xc&7&&9S| zq^NOb`76_UN8XSWAX^F{lRjwl4H;x3nuDswIO1cm-8@CtshtsIvE<9-f}zqd9=tB} zCr3FI2Ozlz#`<6a(_=Aq$hO4E0F4r0Jo?{DnSv8xKNYYxCj@xn4xt^Jv$zm0+{D55N`sw1GGN?iTb?) zJ)qMwKrgGGg4?$F<+mmQcML=F^Q-OEy}N9}P_~9n?Sx>DsRMC@?s+s+GZOu?#zorXH#MNaMNr_v+q5_88IfIT=HE zXhKYcCmm#!(Gz70xp-Fc3x+l2S&QxK`v5B5zKTUi;6(mpRN9iPgAhEt1}Fkl*}m_< z-e-Bf#=QhK4f!A}1w80g$AeM;d?RtU?5r(mRNx&tVOQq)e6szF2*+W)9VR9#%ON-) zH9TKvUazqN`XG4IOL#7px4V(n9eynmoN?W9M2B&Aw$qNIcwes(k7xvFWY*Wb@o=8A zyxkyC<-~xr3I^X1PN~4#$Ut-Kw4Hw&&^Pct7K1|Um5?9my&^jTV2oqwDdx7)9t0HW z+$m#SJ{&MVn7813TwSF2c#TrV*`z%X3o_^-WLwKBHE5pGwxfA+9_oV~Q>A_cam~uF z7maEoHPc0YhH;#P^Bj&}r1-Fx3+$tGx6ZXEgD?+)KrTjM_3h5`Hx+u!-;u`ZXU_pG=a*jA%SpwU??sInB4$o>r`&ALh5b z89YJy6;_Jb*^X$k%GAfx3S8Er^~KY@ouUjBTKjNWL6 z2YgjR4W1fIfoU-KvuAv2ZgVQPT?8cVEIX2TU^{zF19$)-Qw4Rbmobc;JiK@`wHfio zL_3*w^^=B!sIpaji2frh5SDEB54;o2nj1XLC36hK2q|$oLl#>fr8fF@|KN~O1fc_g zQCW1g*To{g3fGc?R};f$Xjj=?tlAS5je*>wUr;lvn&CUyiKC?J>MmOxr*}~HF$`x zXgn=eP@j*hEHSnd*25Y>e0 zPgX$Z+PS8fr7FXPBJrDNSIRfH74#y-3JW%5RnK>cDg=B?C^JORm_2^sxegYZ*Lf4u zImd22Y{qUH@!{{BH9uKekW`E%QcfYSxvW}o2Aq;w!&>-GH)UA*y_g7f6SJ&r@2rIL zJ}y`rb_w9|J?kaSXnR#CDzdbGV;>xS`LUY<1Yv(@#Yi{bvt*p6;F#O>m*Pq>NmQ(2 z1kF#kd%WIblakI?IH7p5K*B8o%)+lYiq4_3hrxxvM{KNtgtyRWh~?XRv>n!WHfxqA z;6|hVic?fjxJ1u^Im&QY{Lz)iV*>aLL*O?^tZxw>s9G}~K~pndQoyR{5$YOqW$Kjm zhdU}wqI{v(&)alUXv?y<%hXdCpzHwe0oDOfLKn>GvKp7>fj~KyT;F2y-(w8Cr^!$3 zmFVZ&59v#B1`fR4mx3TOx$L5^hjJm)&#;l(X!scdt(fp9rrR$RiNO`gH?-rOsrQ3MF;XrJ@V&|H znKGhW+a3urSy+OQe0I;wg_kLo1a;>1cA>5^0Nxh;dgcZ9Ix+muevd)+`eh{wuO9cw zDs)lu`=-N~A}5C$YBinPUj}%C2{?9`bKcuOjM?{X3v|WA0|w5qWa(f;MXE$9-m)+| zohGYgyBTwucq^yWYMtBGRwwZVtA+6Ajj-D!*jr>{KJsGF1}m~UvYD0%)zMzNByQTs zL#o48+t`ho@ zQQ;lBF9#-#JDabJuiRrf+!}W61ej}8k~2wQ;q$(kQdhz&DPaP%`c3KJF9i^7?vv+5 zciLC@_;f)owPLrqYdd(&3XC3G9ILaMH%d?$2sq77rmMbrj?2wnWZJw)(fA<~b@W|^ zTh}py1}fhfY~@qFDyuxk{8F1`g!%q%Qi1sv_|s3$Xr4AlN!1^K7&t1^W42sqHImsm zSiE5CT&^5wEf+VMdmS^d12;~W(b*~Z!@;=+Y1l8NAdGTw(LA2jNQ>gqby{r6~ z;Lzdd=Bx_jWtcvp#)XKEKVH|kwo6^{rgOa3OPj~D1Aq%ykZ-Qb#Oitg42Q@nfb6v` zDP#v{Kf?TbHZi0bu(Ova;QCO(mFDph10F!ds<^t*0XlL34{Ffb^^;?KAggkbtn7FG z+DC*=M!C(j#*-5@3_&HKm%9cWnIQmzYrsNl81Hup0quJZhW9HZDX2c)EC5GeutOcR zcwWZnssYAknyWQ1*B4_u|in>_LP#R+=|6k_=)qjp&Hn*{|hxcilw!2qtHrc*8nU zhtdAXQUU^)usXgI1+tDK3+%VwTcvM;ibTfnp0dChQ}vr1l52sRX({eJ)bNkiIdh*F zMI1}NW2VHaH!h3B2|$g|Me2F(^bV{d*vZx1Z)W} z50?9K-^ZMbrUJUN9CTdY2*Y%sbUcu_oN`A9fIR123w!bvg$Ad2(c$9)&GlvOP& zkPNWz6{NWXMRDm92%?u+h+YycRb|b4_m^|CBx3$> z@f0Uqnw3#k4H+fiUU+U=jiaGN@+9+i*eKL2Rn&N0@{308w+gNNQ0#3UN`|r@cJ) z<&*=&NBF{D5mD&S8A_~Sdqn8X5-k*qdRt)aN!VuYbJImc0|75lpm0{u zdoaP6bJ8e8)WqfXEoZQNg=E3<3Dn82L!fSKQ#bb8!7qp$7&4M-!+$J&4x~_(ghGidd6z6(<@1hiE9&-^SQi!j%AU>W1|aJ6GAV_THQnR~8wY(wot5G#a}U$WJ$ z?gY8%31(6{nIE`BDyNSbKotjJSu%)^%roOr;6}%5mfHJgH;P$mIiyyaq-4CQ!2wIS zRnk){+12B)?@VOT9MX9cN?|(=_Tr~^6A3WL3tIlcO>+MBAEsdmDsQS{`kjv!VUJ;W zl<4_AeB{yW{YIO&gX)8W3ktVw8C(63@@0u)($vWH97b5Mnp0V?1-v@?WB0dBwbL*L zn21|8MrC=8^bn4R_t?>>&ZBs_!&}E}1(&@XA9pE1xqJp?nN5g;o6v=b?l@cdKr~_t z-O=h=lrWCCdo7MwUDM*cjc$)2xJ(|uwj}s(WVR8H%NP9_qhIm?ne8piJ7X6nKB#Qv zd{e%RV!>_QjcDf4EF73Rl)m65O!aA7ppHt~e>@wfApohE>M%SV8KBh@BfpCNgaTIt zE*Znkzf4mHON}!G(YD|O+B$7?33!Fa<;|PyJB8FF-Jgi^b?%GaWE)0Qu>`WQEf^<@ zgVSuNEw}y{S=n*l;-9d`!vGCJ!qWW(OEXbJ;bARqbiWpmWI>))XrY+yeQlh^wy^!6 z-WjF~V|r?j%PC|(x!Frd+CLixtDr(EP=o%2k?n>p^fIV7sJ?Bh_q;G55pB9IQZ+pe zKW!6WRz*pU=K39q3SN2J`5hn^nZYK}R#%Qt(Hv$gG|M%EmjSdqU^QyU)gO!m+W49H z{}GaL%(Ls-Qtd#4=@KL!(qyctO4((!gvSzkB?!vGM}6Rx84&CNd1!?o92&Z2j{YVQ zwghf%XFFfMu7FgtL?h|D)kjPQ`nkDC`Revi5b5SAz@>{6Mfwhe3cO#vBqFj*1@WdM zWw||?-H>@RX{5CaZl{sfwBS8$K_@#x#7vixm))AY<0M1M)%xS3(T@HzKJ`44_8fXO z;nLFM!N3zER65l~KeLp8W;?|Ou%h%BYf=I1skA_c;e%jLRxXlQlgI#ZY0$M>AqzP* zae1L5JyUXUs=FK+><9HT;lfgzwIjPMBZo$t!`+}W68sX>=EhlY!80P;?#&zE8b+$H zMTSy}i^|O`8k+||lXaA}81qkLZDJqcq1%A+$<|mtQ*yQmlG>hR4Z;qv~9D|P{>{rK~rb&7`goVkoPYI>tP%3(eZK%Px z6_6gxzXvLR0HN3Q+=DK12u!EqW+1jhky40$P(;2^34`ZTJYt#0nue<+A?N;E%y&Pp7vu^{x;xY z;S3v1*aGC6RYm6W%hA1&wIjlL?U^UrYFpqk(ud$lCezrm5Ce$BRaA4L(uCxz1xjPa zEOHsh&(-z@STH|<&~(il>nfVyQ*><0C)iMbHfp#iefYo>{I%LYjK7&QqMR_m#Vx-7 z#Kyp4B^a+XRs(O+5QYkkfo3mv)DEE1&FKbfh#VDiY?P+wSIb3ioN`NsMSrd(=Rh)K zdC5NO4STY^a4sSqnot&qo2?|d>_jR6(?{jtQVGdi#6 z6>9?%nIBne+zOL2E$4G%6C2&+`Y(!mor@vi$BVw$8MgqQ95!i^jd`W5d&OKxZ(R8e z71@h;DT6>hjhwg~ABXNGN)Z?u*Sp|e{2w~4f5tbk5ttRM*2v&|O|l`8K#?D!^&e8K z;fPu2XJf%lKj!J9K^XWmzFnso|M2t3>~88`EraNyRnDn*WOzwZi=+=lpXN3g1|Vk{ z<{vu&U#j;}7MWHp*&BD)nu<=XXuJ5;TGHre4GY(agEz!8cez|+XnWXgB}MF@O9-eW z_9fq=U%xWw18H({KMTzOHKx$24t?A!sZ_R3N+^?B!~(C2dre)Ay*~&zk0Ap6JPG(L zCkdAU8Zt}J@%}RDl7KW)h8HGYuT?z*ji3rk=PR7HCMR`e^g2-9=3e)SJa^c6c zyGv>L3HXVA)x0zZl4fz}Od-bVg2c#{1R?4xl35Qqg)IEj_e3Q_%C@b^2ql!8cMV!h zP@NM4rPXA!+CFQdYf-sA6?HJ*-p)7<91eYbU>RrZL;0SGH&>~}Fdr@2ha;N?JWUcB zpBmL5NVeT;kO^qAAo+rSo_{&^-30js61#TaC?n`@MF1I{wZ}#Q9QCJtnm5fuwF6!3 zNw;w2%6P3bJjg9jrYkMUs2vueeEWlMhyN>UeWC{@2pSCw?NhCbyU+~@SbV8X>cI;q z7%KoGjO!BXbFKdQT;N|VWB@aQb>!ZC8Q6TGQKRf5pFpw#p(}H+4-t!-?6B4vo3#W| zXy8K|w4)_t)4(EFb%6BiMQ;)h4Y^dt4yE3o3pxvHeRTW%QqdVU#=);aVRKT$zstf&nSahz6%#4-=d zv*<$sT=D2Q4!+gkSLmU(=k^Gj*9b!iJ_BMiJuS~ldjv378JGwBe%~IJR}SHr8DPCw zrfD0jIy7WZVgYThrJvAo37%jo@kq{|97`=lrhRY}h`Td}e-Dj+B!Ap>VWQe*Pl~FH1V&eFI9OhOqzE6k$8(MO z8K-3Dh0z&c8BiOGUJaH7rB3aU*947+Ggw-kh_qWIFffCvx832VdV!xQR`hL!{DH5}>gQBhp%Kk;)b%3dcpXb$U^7EOp%T(2$(1lGnnnWrYt)(+VemxI6vXB77D( zz~T2k?`;_Lw|AOHh|@%P6_6{|4nZZYOXS${xnsJlv>0j{wJEx0tv^(8u|gpS|3s@4 zF|yErrXRnIaHv4}JQ^Y{*cRsTeCH_V>hjccV!h0IU!7`xt`Math=(iZ4S2oL4 zq5{)3(ioSkB1P;%su51YSj*x30YMIZx7D`1zs$0GnYb80uLu|&M&Bt#m`0q-;#e&v z?oeE_p`=3ne51sW7TVNnqRe4bBGN%|xFoKW9k&nW3@xwFMQ%4>rQ*l@LWvQ6c70Z? z7A&nNMYCIaK~Jp=pazT@tF7vgDOtn=H6aD{fRI%C@0%lsu8f5}NihZ&1F7U*m8%u_ zSWatKb`m1`K4?~i+Mh?RhRs*2GNk7_WB^Cyd@uoq0}LkwTI!0Ez!~*&2Lf^N{ncvP z?n%TDkjDX-mK-rmFPAn!pgkE@=7VopvzoQB{l@sUNow3IXI1pHv>3w)SqymeLX{J# zd#Zt+*VECyD3(h@N}VrEEoJtW|14;M1kX!Z!uE7Xq_N$g9H3O~9g+d%8*U?s%lh)L^SZ+9UkPmzp*NY;LdGioB5Zr z-`pJUj9v?duaWlu`R~^sCVKPRl8-?2+3;+Q4G?wnJEz1vSRo)DNEV z^eQ1|yQaa%N3TRPp_;Z(l49F^(!h7yy~sui#h@;bR-W@!j4{bqFxO!)f0`eVx>_~Q zG-@(+ui^dO(%i%oPD!8vjK!x9ZH8@=z%Uk)7}Slnz8i?9%0wfyU)&hT_Pg-K71^e$ zLBJAgn@pj0;r5Mj^{k8JFEXaTmS+FHbmsPDTFKlH?g0&Z)*M5{rzEL*7W%-KBTpcW zz`^p-k~|N=?#x*Xq1igQS}2vyvIBf>kUf;$d+wZ9P^``bOmqPA1H5}a-Pk>yEUOTV z)k}4fB=(LL*ic|^7+3nYqkgr*$I^=u!<)_labkB4_z6q_&|Vm66$HS<4i9SBlfjXT zQxG2fuY@gr;4&=;?L~>u#{qGlR0q1D%3x4CYLP3|1-ZaX88!(6_3{KkNXK_Ww@!fm z?INJ3l-<9GAd09T*2&Db`wCxErEEkE!FJHI-HL+U7M5dyk6t9oZ_%}>$B%r4ftj!= z!;)qh%G@C{qF|WY^VuwZ)h_`PL>X=G0#dYiYqw=M_X#a=%l%P<$u*tYECt0$QZ!4x zP~^JD=HubE=&b;-ldpk5?^vfGT2TYw2^orV!FTBa(TYs6zkLX_v)Xo`f^yZs8G!V{ zUGt{6QWn#)oN)STl%uql4l5@HOZBzd_9{T{g{A^|X?1zC@q50^LEya-p73Zih*Lh}sWN-K$ffpJAw-0vNvm;e?;sf9j)$!IjO+9y<4h7zEH zG01bZT-e?cpQ9o^jQ_Mt@TJM3IH8yL?33F${8K;mOXQs>3?>uqykI~8WwNBanF1HT zY3-y7ga=IHWw}nlyA!2@HJUYtA!LL#yQyeAQLaJy8Q%3B;n1UxvcR2>13=*0j?>n`DpF@n&lC`f$hjwlc1MN-u%%LmLov*n95~^|Udhx!+vW z#NuRCs({aDh2HTFCOa)`S_mP^s0+aGYKs=qB4N6jMEPg4$1IW{0r%Ky|L+w{_SV+6 zA5}NlH%1T1gNgnA6>t|?&8`o_oZHf5Ja92*s!uSSt+q|N=+DaqH3O`=B!`T z1xW2TKohtr(ZcR$Zg79Jj4&b@EtV_M>n#h)@I(ev5t6c7;7W|{wh;CR+yNjOib|J3 z0lrNF2~DOB-UXv?gKFZGmq3q?UBX0vd%-0T8gL&`Zt@N@S1J5b^#by>Ne~Z0*T3Nc zG}>!5%+S7}5LR^B84#VUr9}q7tp&qI?30*0tWBcQ8}Miv<2iChQ)LsCk+xyFML@?Q z*rO!92FtWD+3acU5sTBRrR!Sw`rMOWaE~UPE&2q7a>{0bvC5f+i&Bgay*@)smj=Yfy#w zFBxT*T*10;!0Ixx;aYKtq#}n7aG+C2;u_zpbyoYD4Gex>(*L1^U$3$kOpahRAY!+) z-KNGq;6BKb^7~cR&4(iZ;g$hjCbgwr1uBUWFqGvT%1e)AnGm;CmI_F>YLW>?c!{&qEhK#a$(y`+ zlT{)k_J&+~^R~$Y#;+8!zJcTm`Syw%M|M z^#*kcvO&A-7jy^MAqbKHyj-pse$wy)IyO^$t+q|NFeDZ!2_n2xXXPzQsE2w`(p<8+ z2&7m@0X2pw&AT|=OW9WD-Gp1j*~an&5nrmKzl{rnv$@el>yi@@$F;nkZ7)1e1sw`F z5vG71mm^g;x)U?Yi`?TfVzbB#Hc$-@cOh2W!cPa%IVkyHQr z9nhw;H!wgsp|qC7PUt=YV_pkJA0Z>DL%btb$)8~v4OV)PL7?^SWg)j|7fUN)UhF=K zTms}~$fjd{n%`l$d|v{}OKd9_kbCG2uQ(Z~6M;I>Fu5u!P*oTOqPF8ezk89hEj!S5 zL?@gXK)u)%@Hg!A7PU+I0$gDnf&_@5o$X2a$3c9nh=+opT_qrZ&@MlI-;R_gNt|4u z@Njhy5)Q@^+9_!ftVKXqy+9pUQPs{=Iwn?c|If1`s+H4yVW8@q5w2q`epuX^b;h*O`YHU z*$ChmsTW$@Jv=iLg2^^e+RdT<5-=;!PiHVeZ;8;^;6H}C(7ZLPU4o=xop0H=mUnJO zu(a%EL-TW7&cQ%a`L^h3v~7A;g@2ASBi!@&%WW#$D5UISQceBE0=cO~Xuxl+g#gi_jbwY^~<-sYHrRa`IUGF=8#1z-#_`_t7<&&Fh~ z%Lk>_{(iQ-1rLopfM8Z@ALSNDs{wnt#8c;`q@Z}6@{L57Uj!4Jb z!Hd_dU9NzjRV~d*;c@HOA)K2?Nl3T%#k30Ir(ZfSWDx@DFvubJAIGiX3j)?wBc0Ii zFA^#Pi+#0UJ0gKq(ulcT&gWD&c9Y?0RAco$()cS7nwX&74fJd=lobEuZ;33v01}TS zFf~6G>!_x&OCZToMja{}6|n`PB)ahw>W?Vd5Xc%|3ge7Ur4$8d@iGCdXr`dtkCC-~ z%uqdS5mBRD<*9|s^F5ZtYM-+e%c$vw!o)A$E4D+7wRu-7ax(L`)e@^&wc7P;g{J0v zwYXW0p(5a}iswOHU5TH}JWMSnwSb&s#0VTdXeIA+fvdGz3!4pT*9w;v@|hGXs*_jn-#xiliT|OptNx8A?c* z?7E}=Dxp8N3CZ&gn9T^?0wJ{%+UVzXV>JbK_I3s`G6tUDp;d2*HO%4GT^x2%1j?3P zgmM8wpy*gEm1rn_Rp!X-h=mTKH;INYrQ&V6ey){wl%Ehm2QUrmBQG0da0ATANS*EX z@DQ2Nc2{NugTLh4TI493wU9QlNCE7iVzBI$1tu57t2yND>$?$1J5xxSTw$c!TGShR z?l?^uH0SVBcicYuY3Nfl==ie9Te}g|s1*T;zDAz)xj*JNC5&c?eFu5|K%WiXVFdt( zrZ?^tb!LxQS${21fYj(xJBw;jH+wN+T0z>{!9XlO0=kbF*yA@FbMXXOZbS(K;6U57 zKfl@cUgVq6azf(=(D__uUZN>LOrA_=7nTe7GPe}aiF%uJYpuL_t`x=L0osdZjqiJk zcvJ__Jc>u0IB0c2<5hZ?fOBtaQI2F%y04^%a|uWn!MVDe4zm!xSvv9kXe=Fr;E1 z>ts(Z7_eq2pWn+G5jOa8Uqgq6Ngg??AXBbqBkW!Pu#6gAUnBgER4n!(sCAYH(1YrC z`{jm44y3DM4>^++xg&aqDDNhB1++H|6bSk>HQo^?bIF<`3am z>Vb5((1bre9C#+ED{{se^>u}|U0#RTA?}QDFyW)DD^xPW_Q(te%8JPRR$xlRIBo5D z2q^jgq;JhHF?HV5>GcVs<#e^ZaTh zYk0)=V8=cc2FezEBwinpav&3k7KIm4e9a;zBbkc7NYrftRNGF5Tb^@nScm%-Nt9r- z-8K>#J(sh9SOFw;w9?v|24jK?t_2C%bZ^{+|FPG0kt+uc7}O*Nk$o;kF2~8nP#9&X zb1^X3mSG`Z9^1S-dYyYRuqVH;7h-A*d=+Z&j0Q6c4b)|rNlV!yS5%M04h!-=>Djfg z-P_TI_{!{%7=ywQfqGt}sUYve22d1_>T^?C9AM~xeh+c? zvAYdYTFQ5DA(wssGwUZK4M9MdSv0HWTrd_UUQF3RggeUJf=S~W(-LBeS$-kn!Uhq? zgYnCExJ6EWP}bW+VBLZPke_4F^H!u`3tXMtXAdV|Nv_x_@r(Cr zbMq<>xwZ!2I`+H_Pm%_22MQV%(775laa0aOXieq4T4%MdUNS#(Xhc%aO!X+MQ4OK_ z!d_eASeQ5wJPR|Qk>Y(dCfE5-{ZuWF{Fd}cDy-`@pT!t(ieC;aF1Wj76y6rm6w&$G#zi=;p1hh}x2|~N0 z=MfoeP}r@WK>E^`i(+@P(F6b!^BMHWi;sWikIc7(jFDAaT+1O(I&4b> z3^rbqb^AGKQ&>R=!6J$ZfA|TnKY=MeIRw~?naWjIq0B*cLR;X`mVs;3cg#$CTMhn+ z0BONJB_>EAyKNz*=CY1lA<45OCZU!Z-pot}AX@>vEdMNUlC{*OOQDV#vats+*{$p| zx*Vcuqii-FhJ+Yx?h-xp8H#jHF-5v;#4N0#NC)4pjb($tPQ{K0rlegy>DQ-=e7dih zN*%D8QJEgW&CsNX2w)2YaauOv_HdC8WE%w$*7*E%aErGPdU}&IXpjmG=M4iZt%_ZR zx5{)gRZA;r2{Is(J1-}X~4g_IeFwG@sM0!S;*V~{^&$m`)lUS%Lb4J$uso7??+qUWu|Ct;F1DH@;Z9CI%OSF&~lLbF%xZ%xg#tR0E|epH6@$~f-Q8ozKdtFscue{J9`7=3*l2oPXt^@; z3e9y6uuMs!a}?+aD~@2;1c4bgTANRn14YM3SFe|T5f0ZW2Ye0Bta!E95-Add1P$ZM4APxwl<0- zAJkctz8>Xn`*IKYL-3j*X2<7bb)YO~N06x#f9*>4B#+_%4k%JF#Y@K9a$DvuJuUlX zVOTTX_9U=ZeM1vWYOl-pw6S~n)$nZ^;Tj#CZ27PgpurW5CPb5fxA)fqa#q;n ziD$U3bcXl@6sChHc0Do^WQ_nteDQziGZj)c3mq3K_@@dpZKVRtDLWn~Dgw#&EdC-Q zc~6ff#w>eoKALR>svbhrp{|WG;0Slgcg}@bX5t4@O(kZ#sbL>eow2Rt62&MGDz5)} zbFqL|fsK8ad#&e3R@O1#vY- zlUv54!*>ckbTHWf3B`FQmLKnOKWnF}jhiHyeoa@MYFpF73DQ-=rz+GR8MzoR_%+P% z*eTWiKB_mLQnuKM&=UtQ?1%^4H*HI{Lsl*3CGLh)a6s>n2}UmW@`GpF>$KCfpxrbf z0;Q$r3_}IVhZU6w?f9Vs*v=tHwXTlkZCh?@D~q>?CRdpnT^3tet}BO(?R3@~xJG94 zBQgnR4E?$da@B)oeBEiePpKnsi&qW7;iQ|EsI@ABuk2 zsK6c0wA7cwJQLf|br!LESdV7~1C-(dDm^^NIk*Jvt^-84v1vws#nN>@1~eS#88OhT zDXgbMkbla*0lNNswe3h^zzgmWXt5?(2-pm?QrJ-wOJF}8|~tv;O(?FFLXHdN0{pUGi^WiOCWB~Z|rT%yd0<*zt; z#{Eqg5J}Bb`)jiqW zNcs<53luQz@e*oCX?Icu-+jTpXey`CFujbLQFXeRL2bZP*Ar& zFZ3g72(`@Da(gugBq=ic9HGsy#F&W7Q4|*O_}6F}^>HleGhMdvtV4)jbCb-aKqf%Uz8ZxdX(v~6TzZ`L#tUO*W@R^sqX)~)zC`+FHlal|nO&j>T3mST&`(na zJsZDO$8xWfB^Yo$+g2Z5O;>0)<>1I%xh10qIXT*4UvUk*68bG1^cvr9a{p`yIdsgX z>=@OR$;u0vNe8fvX}7akFwgHr;KJT*h!FvZC!GlLIxdt(NULdE591R z0$Kn$y?066?n#~uQxzJ4Co=T7Qsa~YF0s3=3X4u=1Hgb8WPM+$VG~ZI#-tf`#K$f# zaTpBCNi2mhce1rT8$yF9zER(%r-l&SNA!?CyQJ7TgBe8vb-F86k(B3%>eH5!oCAWN zK0eg>-WN~KyXYuR?%C{s=`HC9sD8)wCZWQ~WE(JQU#Ac`B z15DrR(@PTk6yNQ0lb~`+uesU_I)AGADu{{nhDg~A3lOLg9^Chu<{Xdj1~g{-XdvT2 zX0zkN(#VsScaWzm(%?RE1gPC8`|b0!9G`7V2BmF-b_|GX(i{W}I?n8o8VG4wMy2&Eb(=$^9ZV;ufP~~eAoLh)?O4d%X zx~t6iUT;5^15}{t=m61w{KCTW%clhK^HvupXrQ}b8<@&3T^RJW+_rBigYwCEJxk~9 zzoQICz#5VqvA6)0K9_@K26QPxw2Z$#-nO-eFCfH8dNaeNgfK_eh`(tblFo5){Q*8w znaU^4MbqmbKxWyn2Lgfw6(%&bDpAUybh{Q|L6r1_i&fI3{K(AZv2MHl2kC*}D2WnqjlQBae+zwn$@3QXu%j%`Ei5 z%7v~$C8N=Gw&RuEu*4E}Tq0tpw|bMX^QYUlhxkMaSJ2uQyin4?WDK^~ktuU*KPE@S zar=ba#O=K?+h$`*_|OAeO5jUIW)k30pyUfF;V<^2q2 zlLPKv&q;#l91K9fIW2e~`-GWz21eKWOM5WxcS<~*J|~*~NOXI^g!l(i*S0&<`7@`s ztWdlR)RN;%(le^RS1X&<7!zc{-0iEm%{=|kh`$H2DIm@2dbWc7Md$-X)hFkKzqZAq(6~e8 zDls-I$upu{HKSs($?Vmm<)Ar@3LTO>H9qsbveiB3>QN^Yt(FRA&bMVi_B><9juPj> zk>bmW#ng~4(66@aw)Bt4rsHu97e8OKDqyz&UnDh^FS!`HC`ph+8a?;r(7#|#{V5I( zkG|o@*YmQ7i$EW#^M;6Vsrj}f2ZSG3BKo3X-aj2K>l>+nq$ox2Qn%0Y0ArNIOSWV^ z9BM^JqanbKqDjR0c$QgU@OO!N(EL|Soysr%-_euBLJ+J_;8q$JBDYAFbCCa*nV-<@ zvekX&RR*%k0-74-kK+dnsngKIM(G(pnN^2WByuE=JW}Ydjk4=-OZOJ&%mBug$|_oM z&MiQhNv!9BcA~nI5C_dx7xkxk3A!a4rWdjcbSz;pBuCQyW$psvMahr7?1jhzFN=nq z#P33VNFjj8-DQ`kT6OuC!>Cz2&dlY4_b&!gqq^=0{&h|6g^~?_R{!juP5hEO2-sAl zz?fl^EGr}wh1Do!4AGM_a50;; zG!R?V(8m%vIr-UX=QvNcjj$s2O{v#4)@R}e--%&bxn{-?PK2_?Fh1Rz+vk&Z!Kwi;g{`F{Ohe#iiv$U|q z%dE@F5-XpQwfiZt){P47rqdGZ3!vq6Sj>CIMlOj{CYe_x9!a8U6C6hU>U>F@=ruu_ak;Y*u4#NGer8zlP|mk)UQN0niam z9!U@@&qI9Ji-vMzXirA(A8%52A!xS<^>_KjVeCPdCNLFSIB|wcgm7_c`c>z|%8MjpTk8@}T4hw*#D>p^iqr=k1((_%zq`Wl=qGbqN-+p?_uE1b1 zrpm9=ieb6(EjlbD9uQ`H&2}%o4=~6Eq0})|wZj&fv5CxeE+={L%siEQU@^j_UWsQp zQWW9EUI4T45AD22Z^R-B1&@=i7>QV6Xg9UAjtjrwxqaIez zY{v>m@1~G!(@v<%at4zTsElaKl(uksc#cUq0~M^NH!zCD`%j0L9+0nYFElQ`FsU*3 zi=^3bdOBYw6kuj`hot_KU~lod?a;AIwrOHnu0?O?d^pQ=@VB+>Jjo51^*(c6mRk$I%ybHaZHtLy#*4#s7_?GdE*3nP>V z>M)GeL~nw20e=b0-4%Tt#;QmL2Cex_zO2aIF||RGB*@sdSK@`^8E9!!($GtY&eWDk z1-4KegxX&3vc$-0U+EC8MxfU03*NNdrLsWhnxZ4)(HSw6E2y9^S0RZH?n^75{G`H0XmNmufG#Idhc( zr`eLv;j1W-r;3X6z>|SZ0(0yvV34L(q!0Q?MBFpfgC)6xPWKY1EeIx11P!E{uCdM;DZ|+8Nphi1C4hu*TOK#K zz)Y!p(#LO}BnjC%;I*N9RA0NqiXfitYZMVM)MRRkG+w$eO8COjQh`fZR}+koB|WF3 zgZ?T%EYlm`IAc1G^c|CQlonY?TK&v967e#wx{;QxWS)@azgW}0T>boT5^ZW!N-Bw4 z_Zu~<_>sp!SYlB0vr%)5sD7cw@JnfEY*s_YZd6HQ+u_dZ*+{a`((RJhT3+r@DX`TX zlH!c-)xze(;jx0?9L`Pj5LYEfQNmagc=gS}YTzxAAkl(Sf7gv^r=mnHAy6Z@v1O(Z zrY;7g3s7BN*Y`w-IpeiSYxdWacnj;NX-$6|RoZ#w_&;4*{pcK`(Ucc#h-Nm$I_>Uu z!}XsByzky65^x!I0O+~8f)}kz@EO9;MF%Ga%;Z3IdJ$!ktjmiL5#t-2_jJV!)HzSSKh^_ zm6mOX<@pMg_D?2-)hFW$RZqls&^(x!^e3b{x9>RISUceQgvALOu!(rP# zQd+|SlFvrp)}F1u{lM(Q#oYxy@hX72PyfY*OcW}`+NU*zUY}obC_hRPp1QxhuhhA_ z~<-3b%%T?X4JFka2OE-8wK%0?Xc*n z2PH|!g$*JQHWP%(mNPyre#=2(4)m01MU6#mp>+t>je+~h+?V!lteXow)2)O+K&sbP z;*V*0mo4&-__K zc%FALU*W_)>!#Mh+#7k2s=H*JIG~Tv+|lR(F1tb{Jy8@~QFFR$1q#WzV~cj_wqpc` zUHWR-|JC>d2oZ#LIZvMZB;W#2!E+*;xj?w_aA(2fV?zT(PM-1>iMep~^CZkcUmp0_ zO_JRn3S;RaOPA**H+SOeUEqr$(Fla{lGkQ-oux|7gZ4;w+99s2<16GukiK{ zY%NW{n9?d@~7f4m7mEa zkG>yEG@MZxc@F@~7f6qqpA!aTr+G?*%%4Qt1%P>82UG=lLvf+{hSSS1CHRb!xet(W zI}Ess_l1^Fd$Yn+1P~A(kQ#J2_6)W{f;H7Y1em%4CN6eKtP|+3o}>WHV0=c4r{8E2 z;eSkK_TVIjU&zlU3%tSEzTjv8&D5sH8!KDu$US9QYK1!r7X-uHOLm~E-;}fe#iExL=J4ZZQRx@;|r~4eC)iwKW$PSLLG32;~OZAonv_3uy0x znPaoKN16vPOAtTjscaIu+0-;3qVo#F1vBi4dNYZg+w0Il?V8^Ky}V!I$BW!DBw)XR zDl7Je+U2*LkOLhZ$wPTZJ7XRD?vBJ4O~*%Y2H~;mFjNrXA<8^1&!x?3VFo;qysIso z#Fb!>b7823xK!(})wXO5Y+4e4u7T)Cb`LV9!~wuE_&r!2{@Id11ru&qT^#0PvAygG zSEi*O2)UxW?r8|3G&mK-Br{0gBT=@F_95+$NS1Dk+3U56_)`*LNQp0@f&;vFxe?_=p(tAgJK}VHv?kLjyYT=-_30QdMxa@k&x9t*V?JgT+7`c7Kw>5- zwxX)C9t|cXd}2kI=CC%~zHqI$YwK(eE7cly!kjSWHu#Vd29Qwb60 zt0YhbLmlv5kM9;aD4R%v%3c)AEr_D68f|P7;G-`67eAC zd8UU0GtSz~DNA~<2f_Y(Jxm)lyAZQ7x`1qvcSg&MJTRa-m%|`6AR`SB=3$j|E>|~S z53$;)^TySf))B|tr%Pwi!gg4BtS$m9N@BW;ziT<{5&u{%{)w>{5EE52+Xo9Y1W1*C z0jWHg%ECGH?!3&^~peb*n28e-DU zYXNY6m2O1BD%ew56mXc`f)hBUIC(ZW{AlCCTmwG${&fFfN073Hr06{Mi$s93I|ii? zNx?MZm1grScjsPIz0tNptDKHyO1^`UccozI8j?Ll z(rmw3nVP-{$^YqO6Hx!LtKi=^j;!5Kxlu8;&xZ` zIyV0ZZ2oV7Q$T;6yqpi=B^({5imI=?#yn&Z)X*wJ;+yaI+Wd5SznrVN+{ke)9j%As zxX1sBkr!m_!Z>4uGl~$xgq_GDnS|$eLwNW5umz}YbR|Z`0Kv1@F6(0vdndg+ulA={ zOT{i=%zvKH1(?oTf0$}N(avkbC%UE;kx9hha>5_$BdpDD@pMS*0`}g$f@3PkqkZKh zG+Jqf1W`egmpK%0cmvXZD(Nh9IF}QQul-**zwK9)>~phGXvpB>Hsm@RT`LS`-DDEM zwJ@UhX;A%+_ypTahcflpDCHki*sWGUUKjl^ROB3cC|(WvjsUX#kI75Wqh`PJa8HpM z?A-TVD9G_r38u5OI=)B`aO;3|#4G$f`gEl#2oT8;y(lyp6Vpu@zy;DLgT*qh5e>zb z2(cBxlfwu=odv-%AjvTYeN{QAgKSld>Dk#`EY{&j?mtVHsLp+WY{UFtx`0= z7i>=~RQm_rK47nyUjj)3{qEmxNbpluWTP#VDtBH<9ldQtavvyFF1T$gqYHIF6*x)$ z7oY$If84a7&AXQhc~FJHKr_}3%F9)bUtm)ZBiWr05sL_1Ep{ZLcUFDazOd`19OG&& zhejI+H_O&=Dtgy&gBtGB{Gb4@r+`CNaMf_R(&DSqwdiSCFa!=jmv`p8TL-IsSUc^* zFS)s?iK3nE3e0s4Qf1ehu{qV)be$QR-?(%`@wpX@M3nXqx||eM==7mL2-wOi9jG&s z9;EYHR(;BTLL?K<>Gl+PpolAwRqF;m9M&q5~5 zwS1ra^-cDQY;|VZzz97oj|IG7==f4DIzWLNiZLXU9Gph(gb#_}+P>wRePyp8^Kil- zCg!ESen>Mjg=b1|>IzYR!H{732+Zcy@r~bk5O|;=v0V(VmRl<08nibVO$U!6tdz2R zeR07`;hDHn#BS$epcNTnPh>f&1O6hu%cw9?iN+N&H%wzLzo7^Oxh>V30_(9o~0ug1o#21xvsz**?o&7}x4n|EbYS~Hf`+1T?R@eFcsdY5i@O;W9Ibh}PA_r3ba1Q!_)59Jnxv?? zQIL=OijTm{RQgBh``%i^l|VwTBi2`aQ~p706r%b-WC!w}yDSOAj8UqkNF+Cl%xpzh zt?JZr1B6GSkl|+hnIAQGm-g()y}-rkp1;bC6N_;XiEGZD;aQZS8;aynL%rgD+E^`Z zR1PT+(@naoFC+RMNs+o%hwSR^JZUhwywHa)8j$C$kJyGX!Z%-MPZg<$&vjcQ?ZxsD@*07QwQzMs#WR{yqwOHRvSt z2;$1P$}Y%NgFG#uZ`zPoU$%zbgLGPao``Z90N|O&pSb{i}S!V;3&x9n@*K&KEUyx2r z71gqIzJrBFhTrfm5?r>n$^qSX6YVc(73sa)9>0T19qEJcr_Gb&iH-*TYDnoFx!L*c zvdl*sjGgo-cBq!)rs#*&P1-=`tJJIL2k|~Z4AEIRHIo|;7ho-;om5(U7X6^>zd}kv z5&-U}{n$~KUp)$vRXz1UFSz4N&zr1f*^6?04?bUiH_QdkSzPNDI^cGy}{dn zuuG-Ewe15I9uzy;ACG*7caU&6B3parU-S#M0_AEylCGmv)~f_ES_CI#GKNYTPK+g*mm(&)&J>mqAq$n|#s4n1C{HOwrI34`k zlOacEOMOi~Xv$OM;?a_qksJbRKvE;%u9n>d!7>zFi~zU5wSOFL=vZ5fZ^J5wzE(g6 z@OUefTnHi4Zau`d9g8uej77;Sk$HUPc$?u7!zqa6MZ!D&xdPx<_?IXWxPq&&1{N(~ zawc>uURp7hM{Oa#fYp!(h;nzk+y)UIFY>9+u`G9{0^$bH*@VPX9vKjtAcX&~h7e}a zvP)-tzXXKo^D-R0H7aL*#s^nc^6->%AhM zEy+E6_ZE#lbWI#BSWpOrtCB40u>g*s8*qD*Is8Kh%8F80#PUFm?v(x)hU=ky#`HBI zKzKqUn3qB_Ps$~I@TUPg`O|JtD~e}9AJ1Nyck||tRK3VqNsLNeXv4{s-9c`GVScha zpdjsl7&z%7`NY;vmjFTn7?{OsYTbpy#r_}x<5$4C{3U-r^7oh#); zE$FR;jC;u0pRVCjIi}Pjxt$&-9K6z@uZ*sUYD7iWgt9ruPiz5vWW{aYMdc<9p)im~0 zAqn-75okjnq^^U&PT`=#aeFBPVv@eaBvJ0tTVe;)wmhwfk@j*X!kcN$j~Z&G#O5Ts z%JEt*Zt?E01MCn8UN!R#a8;yjL}O+;F-g@o#0(l#)l&BMe!Bf-P#MwKhDUd>EapIw z^(5{WM9x0$FO&KU@tiW=%k2Rf0nZD0j!zXf{xS=?jTuOY#qX6aAU@R~vDiP!tvyp_ zP+z-Dh{DYB9jmsPt}jbb;Kq~~4EaZ0EH5DK^n|FyYUuC#;2%u#m{qDB14(OHgrTg3 zMp=L(5Uvm%xCIFa6&mDI5a-YLbAh0T>SPH5HP3%XSK&Z7RW#AzXgaW-*n%ubf@?6# zbE;z>b34<75+C}2LCY`fXg|BHsWy2mG?o`)8hSKRY2nc7eDBG>MBcupo>!^Fi?A623rG%r0O){w~9*fl6Zi=lhF)D$7Qa32qVWMS5kxQ zzDelZY*|R;$^6@P%}mEKCRp#bXHe2ovf>>YSoh2wKtN?@0xo{l_QP?k;rNgu1BpB9 zoX7|ohyrb`e9E7zuh7(EZU`zrrdDJ~dvSM-ve7A$d&4zsVeSTyI!J=Qc#07y9!LT^ z_GS0wh%$TsUgkQZ!G@4|^ZDJnj9*atq-eY&f?JW$m{g?NbG5#W%V^eRl+O!DyoJk~ z0ugK?*JAx`+ro(Ca$}V6 zqA1W>*h1J46(Sq2px|7ai<^%cAB+d8#%*|a48%XZ6qKh!OYiltF!{!d(nOZ_o;=BX zR2&BP=0LWU+_Ly`O~mxT#;LZ@mmY2gr5mwt}yp8+~9ij+8IY2mITw0(yp1 zX*Q{0{Ppp6I4?`E@YDqoAv>q@qO;8pi>)(HLJh2X3`|hXbEb7t zuvj|K-jLgy(FOPgEMb+`fFDNzd9G#&3vy0O zk?WZ8{ps50MvPNdb2{nG8BaGtvqNHk&icAugwl(=p$6kd= z$M~qV_S%)CzJJP>0xres0HL8DUEL^a{@A;vFV+}crQAGT;&z<~;}}DSb_ZT1a(!0& znny&54XP;ukotT$P&z>#GXq^dk0%3$4fY>kAoGH-`C?_W809G4Rju zBy#P73-~QEPPT1g_u|b`RJfY9`D!%72}CHyVR?DJ#ZXaSO!!s9&TvhFpnZ?HIBL=D z87Lci)0@n)GRm)X5#cGWz>dZo#4GaSS;n$Uoj^|p#t|L*(nFvojJOHQ0~c^wo)GWL z!ixPIoKf2{kRQVOY6X%Rj(`xoQhT;*)TP?bh{M5iMNF%$*@xY0Fmmih&8Zx^563RS z1u+ycqUyLm9I53Vpo+3A1IsLh%JcV4OjiRmX6kR4ey&W~)mBuQTEkQ92L-C{Sb}?} zZ7}v&Y_5;=7lGm!54}N+IsCX4?2u)6jqquB1ryt_yVe)Cv%SPvrL;VJIWn(Ga7Npu zgq3_n9M)7l#--JKgFDu-fv5`WgL(vy(dxRvp=RK*oG{iL*8#OlKo-RrLCy;gdpum+ zWhY!LO>#xZYpuRlk_{eEx+I~N^HmPDATs{pv9@2Yvg}?ZfK3!0ICptfSLyI8q2~V)gGU!lA zz+_m3Vz=n|6qwu5&d*32mEr)&Tf1i8^@`}LBgrWV9ycGb+MK2~Dxe{@>F-irzwj6^ zOlr^miNvY403Iu=?HMM5vY}jJWtO`RG!6+=VQJc7=Z;{41!qKu9_?Q`S{q>%T0b4| zIM9Vut_i>FoN8W505_Q=$YE)?Sgi#IsNqs+h0R^Vg(2W} zk62br=a@cFg@kin;50WN>Oxj%p?TU>p#j^ur^$>T`}H1$U6^HqT@VUr1kxLJ;8M@S zr*RNQ=s;BOD>jsA8d8zKlKKM>2mx~2Wkv!Uj4CpDqlC*2gK_Ghh677bu7``z)j%eW z{_NXd^kEu#o5MuZIaHL{6s;)@PnMjIINHLa0p!vaHFUhFZ2%Tu!90s zL)Lx=FL02ybLl`=UurSXUY8nLJz8u6<;AfA51`vAK^{==kBH2uXM5d98dFAmz%3jr zhrEvfP|U{;`uefjK;{JlW4`A@D!**?01t`e4o3^d{-~Eka>cWa4KFH{-=&tT;Q7Sg zto11oKzD7&#%3o-u7@A*?6WLa2)+(2SM+~;OQG)CXl$ak8-6$QD$9NPvsg5VV74Tx z)*YQnPK+oGDklA^;j*SmxPui*q`%i2Wz&j<-dZwj;)w$IWgj9x^>C<#*Q*sv+(C{x zl8ZijG@Q9DVy=it$(;nO)oU66nYS_{T${Y@OcNH&C zWJpt>j~?bq&5>K2Q2537itV*ptvdz{Yy`D^u7@rVM@T@z&PGCA>X)E>(bJ=kP zbn;Q@LUb@)Z43(n1(qY@<51skvh>}X3`0MH0cLZIZKmj$m}0i7H|f-U`xStyBcK5v z^%py+Z`eV$rQ<+fBOZqF=LzUizacfJ*y(Gv$xSMPv(;bqy(eqiy~%QTiNUtTMecl) zUFVFB9V+f^!9{7ETe5;EwWUbUH%UUe9k)lky_i>4QQY+d61JX}lV>{y5(ZocCK7lk z$Z^LD<^6DZyG8X%d| z_(qWV(Wg8DbKX20C_v2hus)u3th!L{b#g#Msl^`-XdULo5Q!|SpYK<>W5^*JJ*nwI zhdQ;S;>W5qjMk_n($|MW-z7|`gr@mxo9x(sm|LPghLr87OY1;5!-xcJQ|s5C4X{#B z30Y2=z(+Kho7GT(f=JH{bEye+d4Jifv}DNk(1iy?Vz^)`anON(JzMx(O)_|r>;(XY z-p2VRfg+KX+k?|V_ed$GIid*@>Rfn#w>);SOU~sPh5&35-z64?qGnW<_SH~)mt?32 zlYgNAtbE3Iy5+Ly|Gi?8EVE!#P0&LF<`7Q9XtvvvN^4{RV z*$*4%J%Flu=Z<9dHrK_)FQGoA;$Tj&9$T+OE- zV`L&Iwx$n+7v$wFZ&M=h;TV(-Y2Iyh~S{a)&$lLCaC?t`>ce=KGqmAjusBUn|n8 z@NXxRUkD;#%U--jUizQUz6qe|B7+U)&uPh8&%+Ovx97@;T;yd zF;*CpsYpTo1ZC6L3oQBj1-3&Anb*XYT7(jo&Tv#H`&ah_p-g#dF<1`^igzwmzn_Zx z3f%}k7w(9@R2L$<(&H+g0-&m{z8w-La0SwHTR?{X>LK9SA-6}Wl(@VEndV1{XhX5MtXcfAP`;po?7%-9*Xbp;g^TY# zYnH>Q>_}y1bgspI1Zvfod-t&JHv~_FtHnX5+`pFEP8*F)G&|YBz$C4DzUXKj+}I$e zson)7<)WL#*d86d$Jt6yw6`7?jOm)L4!TXg8diTHsQVGdjoJYYH>joqf)yXH(L&*O zSELLL{h7+}x|T^UBCw!6?3}?HF;O6i4!CexCOiOkHH{5MZ#X?1>hm zo4D(akErp*2uE{z#b5PA(CV>LVhtZq0RR*vcbk~Y5<@#JJ*G(^r0dIm@Q5n%K0~=C8Xnqlw`Mf~jRdgBKl7&7{d)}61 ze22wBYD&Z>zbRJ^z;FSW1(uI-*`6{Mi1LG@)OZK`&26dP3LLV)TxNMwQMzQI*ef!( z>k5PFoWp>#Q|dbh2;WPQ1j;qVf&|v?{sJ+V3tRw2h-JT5qLqq;<~7r&{>*I3CbMDw zQEa7&NOE7drTqn%MMyX#AUP`sK*0zfBtQ@kVkw2s<_b%Yi5l(9-hBhx3yc-))h9tUZDId>Bx03@ztjywp5)m#bKsxzrFX#0yI+wCIg|3^t{1J z_zON(-a6QyZ z47G+wdCK@Gfi60?>6P&IuX~xfw=n+E#q>+9AVx8V!8tnpJx)4$L6VU*a4~<(eJ(jlcmp7FE2MT z1m6|_5*cwz0IfbZdm5iflwgUNC1FWVTv)nkwZkm1gtzM>`WuweO`ye;F_gHiMd3Af z_ZGP&P$8L`4tG?c$xJ5)BvBkoo`)831)I;L{^1ULB6ITwnQKRf%sVSB=< zSYEeH_M8XiJArxrMWCbEF@$;}vCr3P^jq{!Q6;{wrgOPh*`{}&G&7EuE9wuV%0484 zh1k5y6iUkqU4-ypKo1tBBjfp}>j6x3JtjS_@m zlxZcx$K`bf>gM6-3RtAK%B%tyaWp)0L+C`R1#@!pqx}U-tH5}OW&Jn<%oX<03)2!Q z&?3ZhVz|=}jCA>QHwgV93uw9PyUdA5>9ROdA$r>n4=!5BDzy>roY?Medegr7~Sd>EZ>-=m$SJfFn zh=~GHHf$gw9?5gjBsf}Fgq7}t*mDQy(pC@ ze+{m*dNiStaj0VNBKY`$x0&o8$pqf0~%%i5k_673m%eArl za+DF&5>!jBF3oBPP>h7NYI0#$d1^=oU`U0dKBceisoS41K8IQ;T&p+*bKbA+ew0ZD z$gt_1!Y&jTpe4$ZIv&Vl2v`%A(kJ2uQKnkOs2a(y928ay9}Wv@`~M5+MD;C^Xe$fy zz2$>*%udB7LrG7h3vySudAHDknOw6iEal8L3sTBbzwEI-hoAOrJ#U_ko+_h23RGCY z#}DXOE--PNAk1nyIgdy=0cq`Bu52~l-z1wP?2k7tWK+ec3Z8D@OxNL9<_ON00vveW~#N;#zjq_WBAJWGWyJ{l!Z+2Za+ z78)1`b)y;STvf^4Bk)3(IHESZDhI|ZflL9xnb&Hy>>f?hv2f8d7$zUH4zc$oq{)F> zc?o)F5QMQzi~U6jta-PXl={G`r5fG+V2b&aket9*C7vE{l#6)l_8|}NQSWUu`Ah6< zGAval<3bjbE63lX#r_1WAPB_M++a6i-cll3;Gz%t0XX6o|H4*)3%VDL2@?L4my&?R z$VAOZ2IXP?@;$ zwo&h~g!^raY#0DXLG{CVbi56fKIIz_Xc=y;swx7>XY9)WKZO4?b|%Jp@6oi_h)l}=_KNEKGJ9$eyR+ENf>;d!R| zG|?tiINhfdUV=!I=`L2m{OOe!p}V;Q*H@dVPxOtUjV}@EO&dB}E_Av$2%X3Vc}au> z`? z&Oh;Oc)uLV4zx?B_*MiiZwve8?zqoxx2}J@Jtj zN(m`0%go{7(hl0UFFm6yD|kdK-m9Iu%Yf4b#sj#yG9fga(VE6to?YZnVAjuFF{Uw4 zc(2wDRBg<^1hI@*Gr8_NkT6>H?8+WoJe=_*mtLcHIsVf*Fa2bFj%EZg7{S|I)5>@N z@+BHu?Cjy&gi;ub6C7N@)4U(99v*HmMX|~qV6Rp5t3?wx+x&=vSI<0nRFU!z)f))(UiayvxR4thnMP6Uy_K3=~E*~ z-yTMEE7*JbRC$F;$nb#Q@FxSC@r)C*=_(ox{ zBm@GqPC*|0f1nv-U9wwppGYQTeEFehb&T*PU*Z%*GxukB}s%1!0LK93nm$-(<<`ZOS3@6YNwdOT!VH@sh45! zItUohjG$=>7HGexhW|+BZ|SrGDqZOJ%E&r)PCEs3PxASE*dSG3xdj`9RPB ztu|PYCeT|0)yGg2zg_36NFo7r>ZlJB1kT)fgw$mh)a2NZH&B8G8v5W+1iK@U#9+;u zA=ztw0`Msb&W^rxX;2KHw>x)xHvzp&^3X0(dNS#P>#OgFoMhkl>T7Cy3SSr9q>9}S zn0PLyN+$Omr5==rE+OwL`?9Dtxr?m8b2r(2e!9b~grA($Xm%K61S!|l@eAqMB;^)qiUW61tONW=8 zHZkn1D30E6r60@Y|D`|k?`2-ve!bqfhVGbURCyKJ{#nXMH`kFotB`WU=y~a0OG_M0pDD2 zl%*fX*>13-)C<)(eHjjLa5bQTnJ_<8b^5x;?fuHW1Ljm;h}0X{>$|a`Njho*)V%h; zeeN#bZpL(onlEuX;cA$QpzxPNeDSe{)zJ*fz7+N_9$^m(_vA{^+}sr!5l$*w=@OL- z3#9``xxTnX8@>4rd7id(^dhUeCs<{DK09EK^J|{F&!vv0+oP7JSDY+_+mZOpD zlsQ47jklU#j3iLQ0s_+(U=x$M3IJI^roR)0Sr#_D!Qb z5bf}Cjv0zoQ2_0!R4cbkBI$r|0r?rqS3@d6NPiZr8`6J?i5 zCl{-d>0}P*JCcHqesjmIbI!+(wDWRupaL#8$nhJ1Z)f{3Ckyn_;jcPYdbG;CABG3A zwT~?#BIsfN!@%h{`4$;ht_^92T(JyTR^F&l_**dJF$zdwJoY~voI^3k#1c<}hJY8s zG#hq8zbFEztDe;1oEhkq(FjEC;ErQPDCWok?~@UMB@{M#s<=avpr$3wna|r zeJN?%XS$qRDQk;NCJhMh*zR8*C0xM{EC?L;M3!bmBvR5;$jd_h56<$N}7NE2|Cxnjyav6jIVN&q8+o zm?BG%PqW&IKK`O)Mdroe_3d7p%>j-`SY-{aE0zTJT}fx{tcc5P4S*jFwmMh60a%AH z1|)?1dF_)-`9(O6;$P+bxN!eFJpAHaMlsf8TS8}nP z2ns-3P{1VZ=GtFTlH4STg@iKy8rg!sw*5ml8ezTvbkEPGG({gQN*Z_1{`4Kt>C2$2 zoLq`Ho4T5!ftCY$GG8_V(bQXRBX866eTm?Er5bSZaks|j~ zLUMUDC_$*x?cNZU2W<$HH?A-x$;?8UED_7}w6(U~Jx-JM!YqZl59J1z_+pDt&Lucp z3l&1b%HyJfGD}{++Ao^?`8?QwmAlk1E|>G)8|-vnP|`=}y3~ykr6*iT$7TKc*p2iu z=b!PZeZp?Wni`G%n%y3w0ww{*NPe7xI|eIA2O?SN+voGgy09GdxEnRo#{}xqiTb@o zx}4hljXw5fe8PL3V5(^y%@;zh&La(?LbpL6C%6g?ZHp{3>j-lsJ7x`04+}S#-;T8W z`5XXi@$(;yga*0`NH@imb<;-Rj-?xtC5F3RrG-nWgv=6s<_DP# zyGNQewuhf`nT5o^elyg>Y907-y9Bamtr*>Hmu>;8W)}vdx#t$4rafFVUBrC^sU(oJ>NN;RsDf8o;>m4&8fI%?D{&DU@zor` zpK^SSyxIO!qbX!YVcgu7W163(KDsp%(r9ADThT_-?QzlAYdCU_X!X&s2u)sAD_9wsi5_&QflxQWF~2NNss9#=fH6%#8mn+&@j@QS3P~;nYz=!X6Kg>dhRi zm$-vS))_5Uhc-}BPFZt=@We(~rg9wNAn?6X@Pzr;l3=tL%Ic({-{diw@WC?dpX_mqG8H*tJBZ|cM9{1G}bIw2UQ+t4(HYSr;#g$kW*#hP)^>@U>uzCeT#>!<1Lj&Wm zN8Xy-_{>P?t}|xEb-v46aJ{feZ!OE#9pH@q7>^7n(w3~G!0WuensU4AMV|fQEfI(U z1V?)ROMZZofF^F^8R|Y3G>Znw0~#zpnSkp>_J3$31eNJbo;1l@&j!yNr9!T~Se&0F zOfHC%j3^xX9OSdtY8EBS$t{9@B>E78USM3@-6RYSOfI+;Yd~2n$}!Wx(2c&>4-f7) zX*f^zkeHECmt-6q=0VkoJ~7XWGV?kY;JzWS(FAS3OK2ScJDcA@k_j998q_I)&Hp|R zGXKmF$*Sx+TCI}|wNPwS=D7W;3%nZ--R?V(h%tdt7aw9_ouaM_1jJ~1fmHq7ZH-1s zf~Z!Qq1*!r;qxpTg_(|Ii0FgHb-Tf-Y67Hz*y=au$S4{MBH`&bWZx0_3}K-K!gL(m zclGuzdSemr8~N#o(_iqEJdxeBmBi_`8Zr=n`uEZ9jJ*IxEAjQKEh%JLG#TWKYs?T) zbm;O+LG&d(L*&_RSpplp8N`93bJtODh3q#ZsPHSR@u1aQW+EeO@gTk4@iv)wAsqwM=LmAW~;@+T2b#EKuJxLyEF-xLj_p8l5hQj|> zJ|bTw5K@dur+Y0UX%flcEc&L!0U(<#Ls$>7clT;5Mvl`a!A1skF%6LWdXWs$DpVr8 zj>oTpDSzc(+K_obB5`DW4>~4-XRXarRB0{c`>1e+W z?CK?u+m(Y#ICz(qC5JfYGQuF60{aSwDkS$L3u!hrp%{I{a4WZUwN;CfpY8u5FED`5 z;@tcevzP)78IQ2Zy?y=E`4?ob#qBO#39Is7cU$eB-whwuz_=BsJ3B!RVI8YFq&md=5cvh-;I4A0c^5aHy;RF^DZ_A1;e9} zhK33!;8RT%5<&u*BBPuYk_$%-;v&fGMP<}f3f2O1d!&ON2~e_>?W~4GM;{drUF^A;!h;{XG9xqr62%F| zt$FNNVn+b%{SoLYBPBK-Xp*@M4r1z56g-=qM+esZMe;F1Wk+T{|Fk$fn#i;I`{^w0 zuoz5(I!m?0)1avN6T@u!zw6@5f>9;9UWoJF6B8htr~4G99?Y{*q@=k*WvGnUCx|=r z;}$sqXCM1`Fr@L+4*umJn_753TB9NchmFsa@br?3K(2pq-l*$>7p4t}cal~3Aeq12 z0+fo!^R3XOjX5B?xfqh2DD)RET(=*MCN!FK`LV3Lr^*0zEL0wJ>#3@YkI4o;Y$ z+ST=h#rLb;aBqM-Kk8+fGVUjiU2^QY=AU>85bT!;% z=VcKp$6;5%)?8_zzZ%#>{k7VWx-O7X^6r8eib?6 z+`bd`5gk(7Qqg}b^3BpI3GyS@Du+{(ta9W|BN^Tl;FMd5Saz_4PVQG)T+8sh6xbH zF(X9$cLx#_@5d=@bp(Y;c?3)MvqozIR0OlX=y=AaH;a&Z$US+_b;U@1v@ZqrhGJ`{ zBWI~bSg+B3|6T-CC;oc761IB7iHzFdaD)83Z!e2){Ey zO@}XRrHwP*PsW7f`>5f|*#Q?b-rJjhpa+LPU1DtR+Z3u@68HK7?Yvfthm(foYLOj; z^siR%mtZ$HIa>TPti>#*6r>=)Bw(2RS}dK8H3IfX^Jnn>X}w3#pkM|uW$o2yL6j(Z>3z)bfvQ!qx~AyWFtXf)>H+MdyN4(2q#4SQ>^Ywc{fg#4#0@1_JA z*J{YW;^TwOWm}`mjBc)cwdgyiP#>K;Mz-gR2GS0#gqGa9IN@C_{6E6fVHv8=zXOk1 zlo0g${TOgp@?#ZO`SUs4Ym$z)@6D>T9q03*K2cawppOQJ_ZnAjfD`uTdjwh!EYWI|4%5W%G`Pn~Z?M{Q zK|{1>NdQsb#O(MLMe6B2P8hS;bmH>vKw+wGl31vwB|4^#E-bojgWL{C{_DQZht;ey zVO#=Ez$z6#*MJhyuL-iM3rkppU5bi?R1PhHe{PX-ipH28je=Pv1ez^}ZC7`MmkXjQ z^_A&ail;XYOF7^Z`dq9WYZ^?Q2DdOH`E{u=L7DNoM1yNf+3v@5nE9x^=Ll~7zFO;l z=Eu1fx_gqKQTMhb#6kWtg%L>KCwTXz#gL?Z7}tCz zS*g@y+F%zt!{*<5iQzPrIjlX)ee$EO=LDSULo|zN%#%3HTx9ZcBfMi=*5FG zNxA;EzkM`&;Y_?Il}?R6ty1?$Oy_b9jY$jh1^p2?62FJD`#WL`C?Dc+i~mhRLiTXT z@wa}vw3*wF&$+#B(gq1iZIYb*6q5iWevD4@Zq?J4V#tC7MO)4D)r?8=T+~$5#q6R& zFt>Si2uKX$dB%Ho(B01h7hrqiXv{FK@*R1-$#V-KGzo>H9{{~(B~=jl5(5BuvD+P3 zq;!;DFb0YB(P&El&_wHWPVIe;CUd`a0OZt&;V-n$b>ED?O=iD<2~qv~33^`3^>(IX zWnnUrT|kJzvjm1}aa?r#v>v(q9dOI3{b!(4|GI9{Jf+B%s0mepE_vu)*YqJt4U{eO zQrxio$F}E$st$VVN-1th>o|@{`7{M06x8sZJ-L%R9g?w>h?-7>b!ER zk^#@$9?U}QJgp_dc^;xqF6-1Rx*i+}@&h}DtAbLtiJ%Tp%KM;A&vjZ0?_?5LH(6 zU0OCJ5JoA+FQO`hkZD5V@lWOlO6TugwyGeVwpo$A7c;t5Sq-|Uhx4XzAzEW7L@+ z^eGvuoLG!nI)Z7G6&wrx6%$whP$2hy5~K1$R*$rH;}6L}AL=M53E~NPcPWDOT{tmr z2D-%j#$mbxT}RZn=-4e|A%BlYsV2q}=!t-#PK%MvNolCoV-N|(?b?pRt{I7$+ZM*h zqTd@nVE@j@K`t%HbmcsJvOsSb1O+f0tEPQwiR)z4e8Eo3Gv99~1SZP8s543FFy-kv z2bCMG2tW=DP5$rKInaD6Tnb=lP(L5-AK*8%3>e2;=(6=_6eyO_^*WWoccNW<@}cU7^4Nm(VK z?|!={vB5<_0F9beaVNPAR2s&gjkfko-a#;;GLYQsKyadqx z3Pf8o@}MY!JcduCyobpG9=HLA7D=pcnv&qT%#YEg{UvnuFZy{*lhF#T(IeK?5x2lU zzcMUgOB=TnqP<8;`)dqPD6x3&s2QzCgHQuxL*5Xz_v^wQUg@-+I zOWg;92&}PZWcM0xlD}41Snk;Q)xvLv{%dveVCkD$f9WnX)W33C+CdSxHgtCyGJR&( zW19ffWiM}$AcuB;iT11Y)0GBU6IflK)8Zg*D0l#YkuF9L{kJ`sg<->Pe~v&@zlRW| zg(Uo+7*-9gDWVaN@Z6CZlYLCI0djC?Yoza!rVu*4J#4+%i-*_PG+_b*!^ZPgIHe#H z`@|4!wSN$IvD{UR6p6dE=Uxm4H3XXV;=IC5>kcsH+fY~&EmC)}3^NlF!cX&u`;1Zrlf zM?l1M;Wi}V)J5frQhj-?75d>k>yu0wxwquJ4D65s*k&!0wev5;z=p5-FP@q@O4^3eZ-oFBGxLIY@Bs)wjM)KAjp#XJxY!0VI0vkKgBoNsyADiq6z?ce>0(s}+DMcl$cJ6m_-{*s=Z37` zB~Rb)3^|S(oBwO5D>RLr$Puwjcboxp*HP^sS=zm(xAQM(W4uNL<8Uu)c z`!x0;PNBqb$#Me7sAFu73Dgq$$+mx?-M^C^67Nr$g$Yp-3?i|_32U-Tuxq0T<)0Rw z4Icqyxm%E!MtW?Iv)z%-qCLc@H!~+_`FN>b8Wv+XUQjnq#<;9tL+~mDkJ=b??h%im zF=sEx>z9ESUSPV4@ZJ)K!Mq1jGgdUAy6Qo^78~KHdO%7e`~(EDmGyS{2@9JdFQ@6Js+y17@Rjx&kNusDP9QTMXx}xg zBLzPQhb%VETqc=zp<$N>V>+N*pB_9G>i<(Z2VN%+;p8kcUBMBKXHnmnj=PJ?GH!rG zjj|#W=X*LwgXeogg62#BeNpc02;Hos7HE|!HX?_-Rx@c{WgddCUvsmd62@EedOEkl}J_{uP%~Wtj z)2j{&Ch>5AGsK7Fr4r@iJcg@`!6HM0;GMEcze5vBdydWdCVPy0Vw5(kTmG&BW1RK~ z`F_R1aU!Fa_hOZ_66_kdqThyupWh&E+XqggmHQrHN)W%m%nFc~-7h4j*?l^WxCx>( zmP9&H|9^$7Wn8`}Xs`A0&%>&de1(=+J}oCowmv+GfH$g?c2e+ zdOTdBvN{s*CZh6Ko^!9&;pYv>F#e(RIJ|>pfgiLul7MaA6sE4#j^sj1rljl??X;Cm zX{RJ(n_W)SzXWo^yJg}G7PtRIgTrmLBi*lEK4?^&)JYB?B^e2rSD~hcX)kK{+QBb430?sOk@)d7EAe9B=B?Nj`@oidW7+8@&#Pya)n|_?neMqtC3}JE!_6+ zO3m_^panad`|<2+r=Oaw8PONO*?@q(*$NT|rNU0XwWXyU%sI(|4#HFl&vXGr*ng4Z z4w6Ly@!q#Q9X_@s$76!$Sr@qc9+_7`Ug-CJ0txdVVg9PR85<0BduCh)%IPoV6np`D zjf}xoPm*_lunI6!U>C2&>LEKHG^udgf?Tz#C;G?*6^;oD(Sq7S$l&9KJ1`@+ULL)z z%&TFsPxKxlsK{JuzxOR9gz`7898}j1ycrnoAYW`pQ7nSzqlMFZyaW%d)WOZtIj87n zwM&`;6SdX7kZp|Z9x4TTT(3vdNBge3;jE!nOGCkR2yD+O=OU@APFA)9R+~gysJ~lz zJ=r`wnH5R4L;xE?4d@vj2-%5JMPWeizQeT9(Fddbb;*F<7OSV%D6SY>Jjjy6(b=@B zJ9q?2)Zj3%jFU?RM z(>xZdr^ReHXU5C06SC7@34dW~i=rvMq?QBD0njv<=EwZnAaIdBH;9OXl7_V1SNxkH zd}ce8vxnWv`ew)miMRxY_sRwDyYYL2P?s`_3@BG2(CfmN%*9heWYE%A_jG9;eQpNU zI4bA&28pL9vxGMz(123nbYU3uwVmiTmlBiCe-)KHfhu68ge zhZ_vVFc-XS{6)`(Cnn2-+<99Jd7nep&)A)fXypXa*ip?~k__S#d=lp?pxO(Q7+I#) z=NxV+J2FC<&H7^*9-DVvG1m+BhXmg)3*ozGZ0(L}m3`r-j zP|XopxHu}DAd0jVx#&d7oEk*oB)qhfLNVkX(9E@B4bpyc@2W;wb= zDJbaiH%-5%`$yI!xOU4z8*Sk@oT)^p=32|*Y2mZf)T%i-Nf@1EYtz@B~z`u!^M!I0P(_ypKE)7MEVXUCqCnb=VK7{1KC9)CV8X5tz=0 z0~ZBl8&J<6hOS;k66P7iXGbf-2{gz?cXkLl!=qsbV(hS1Vo)Kpu|z^0PKRTRv~AJq zor`|jg!98^Z_3u`wiZLZc^K+Nu4SAPAiQlAt`3wNjtQiTg$mY#SzVfj#1LY<&rqf$ ze7?i+gl`ljDsN@sf{e=gFHwH-!@&v zk%Ba0_3047i%vD&h!I>7pkam;F%JZ06`t0c6pVmLKQ|=2GsvYhIi30uK@)@P7yM|h zS)XlBHAW|dx$VvRTZ}o|=VAeWCJ8i(f8ovJEWj5e4-k)zzX3R7F;0ZF7VnGEP5WcH z@uzDBW&_gj(S`YYFoh~S=Rn0QnQSbQFCVzE+NmDJh8P>Ii#9&AGO8^JA8;u%p&_977R3Ct2NvfTkCE!yBM!YbH zJ&Zu=PWaXU!wh|yub~&#;SG^cr1VaI@=*#BkhXn1R9;fq(0+KZ$X0`YxBb4HZsjP= zL^?yMFaH^69BHq;t7-^|@zT=%%?MJ09OoD;4vYHY4OKLC(S?h6Ki!c=CiPn!$gQ$x z9O`MZ?FZUHwmZpHS4;+iMk&lJe2D_wmOBDFI{0I|AW=K0(<=aV&MZ<**T%DN0(eG}<3CI?2b)MV`=6hJ465sni;TS0w z`=4QfCA+f0lgt*hCi-g!j z$i5+iNTZqCtZgwXv^i|80W6Om_Jgl)SO3xSjl$1955*1Y(W_*#@1tP=O8;xvjZ6!U zei&@AQy+{}`Zj+)m9wlgMAEWV;ZW*Uj0P83nEHZobt7o>2@nPgI8QGdtlz=59QXVp zGxJY99)Q>zPMr{qC=v4{0BCzI0hrc{Nt=Our|uBxNmE8Oy14EXG2r_mt3 z)y$$C{4*|!2{GP&k-TcDO63g#h@NhY^|?pdw<09jF}92lYg*s%YQ|j_3LA9u=_E7E z76T?}(!mK2_gVR69iYKXn4q~x@}l$=A~7wx;nL=UYw;rK^F6gwIN8Sp$O0pc zBlIW1xveu5Y8NgS!!_U+>oxNKG#IcP>lp8{A8>L%2Zs`?NCNqEnY6Ea4Q-tuJYAH# z$-391#0eS+`QQf^iqYx!H$wwxs)(oK;n0z56vGRHoa8)_B5FTbI?}5>z7E>CjRvI8 zu1loHM08r`n&6sHJdMh&))t9&XVZIXH%ZoAw$ZWpOvx=a;U0%m9ILI9mIXSZVB>1= zwpK>CD1?zP9C1HHA=JdAPa>uqcz&$o|{0%oe*%HN(&5xDoj*%#w zaUXE7pZ6%t`@`85)QtWX!)1?FbXe`q9r4*fwkI2hlZI;wC#~Z}<0DumQ?Ya*j>?YF zMW`{-lO)lkcQ7u8V2mmqJxFlWadGiTR_!`P)3y>?+}0(bNli;@pa9q&Jv7T)j?zIH zl!nA{$vomszC6g1r$Iw+E2Co!1)CU&@3aWqeuW-{u%RtmZcLAs`L2_%;6B=|6Qm!Q z_XeTfjzYJ()tqa}=95kh$DRXe`05682~D?%-VH`rPYa=pxncQKyP?8F zM*pYRvpN(>1GFhMEtu3E7Yp2j2^4;0*S)+}o9W~vtuRc52bqfP?8+FNFTz(wuP3>r zAfp&exjVeh@SqH#XK>cY9kk%=CrGAwZHI}1NTO*63evjS)e&JTp{|piPd_=UlqXb<5(^(Skgk~8zHi?VZ7;pV) z(HxJJHCd6pF8DtwCGVN3gva^GE+OPqSIDZ6yaxCs+aeKGut}`^*E{a(KY#N)7_^e|r3pvi#ie_`j$|O0Q ztmV-9W%OBqB6>9i#K-c!5aFEFo4n3NyE=Zhj$(gM0$y5gH-INhRQrLQ_vy(&i|QCK z^ePL{>Z`@$j;xvv#x@kByeHCVzf_bRGIjLkId=FASPeF(?d@kfPx8PyFi$`tIqrrP z)?fA$CDNJwYQv6(O#)|QE*;ao+F4K*c}}}A%XOJTWJ?cZROVG0M#4ziLB%ZP z^(K#3n}%7rNkAwTHzdFW0G>TP8PuQFYWNN#0tLsbx7T+IXWMF!XF)0zM0;lyOEtZM zsIGkh(5Nu5(zaxel(VJuTJ2cLW0yh?6OU&O`r4C)fXl87(u4HxMvEUyD$>Xto~xxZ zU5?&;04*NS0rplumLl}y2O6b&P>(!Ul;1g&pZ9k=PbleDCHPMR{S@b9*gYP>lw$Rf z;?5FkRYzgsk5|TRHLi+d-;A2J3b%pZfpIA5j2(GLUh@ViIwKT` zKlq9yqBvHiTPfVrpKGr#=Aio_z%hAj2f63X zr9kU3+k*q#4fk@MiTyEY4VO}u1tR))J{D1b@>$cjhg1IT0#HV-;= z{6gqqbe!=vwF_`@Aya{TF@v{7z)Q(z6Ov7RL5s$B4+dds6zZA|E9Yw+H8^*~^8{mT zpKJ1PX!U3khTfiwwR-wy+@Vp{Aq*XzCW;~qo{R&v<#umBCdBJd!CJVuuo9ARY*Ay) z0*nv1Ew;pKJ6@KBL*16>!>7=s0S`hF;7EII{$tF-21!a;P+e2=)!>cNxudPwTzeII z3wRNYX-d3ress+~TY@UtP+9|zf!vyRM#OAKQgL<{2qPVtV!$$S2G#N^G>+=L8i51` zS{1XbYqdi-hHynQiDOBD=;bJlC3yj0);HR=4`nVa zw`rJekJWIjI$_;9+C@0YW6c|U8p;fS-yd0*nD>j6hL7#BM?WSo_wK-aLc5A#-=d4R}hiEKw+O4TKx9H z_={l}uIg}l$LI^ebb0^589YsTX+{V584SUblWIVt$t6QVvR*{Vk%JNn@LPUtNJ{b( zJiQ7?Nt;Ox$=^>!V7p^V2fTH-2%A06q#%KTVz2%#-9;&RN+B~h$zW)hVz@P9xF?(Z z0#HqIb0qtZfnRJUJbIp~_$g$eM-T=;b2`FI_}5}~z1XWHdDOdHM-5T-ju48>wfbYR zQ#6Jz#9R}Cv}D&dr2tg~Dgod)4*j9G*-%7@0>aGalbwxGvC_FjzvyPVG&|XT9clr> z`|uz_+{QfAf@ykO*u2$$l6A0K80cJHG#y%6T;#%Z!%|(l5epY&b`#0!e9-j?kNsfi zW}CiA<9Hx58&{jjViLriIZ1uOZo{Lg)5U+EuYiR}%rWt?e+&_O${cU(8bh6~K)_~?hDXN&Zbb5~5|s72kY;&edJRY9 zUGaV=kJuf{vJ=EypEptxwt~Q4*ywHd&9GsxSBVP(T+c^zY|Q4rRjSKn4r)JuJLUI7 zyX991!3N2_&jqB8C^1WeJ4&9wzuEO*#}ph*jZ9ev=hLz83$5CeQ$kh9-!p_`~g|re)ES>1$y>1$wA{u23nxa ze+R8l+=Cg72t{lJCOV76MHEuQQ_-zMkI0`x8mpl#O-E;VNXlo$M)pR~%$_LXV-qe1 zpo?T0#~l4TM)M{5zmI$zGaJyUp!e%iD~0q86v*m$X(+A`5-%5(qa6)r z3?dL@%D9|~lBWJa%{aI;ZmX`AJx?T-e?ugy7;TB22ZIq&9>l z7^-i_7Tl%8MJ>OU#@Zpk`j4PyO+Nxd<;<<`r#dl-g;U&;)7FqdZnT<^+dz8X)~ zzE5=k@Q45K)emsQo~0y`Ig}~38?P30QXyeU^e^0T#t^hm7AhIDBJ~+jt8=~rM!gg! zC_MC4Ohv0zvBjhx4h-^+sSq`&o~S_$5eM3;RC>c1``FeojKYDwtX*3FBCcf>(-gcY zKal8jkdMRpj5fga63dvLr&87c{~e$ey(Y!bj&3#6!dY*EALLh|lV5#38N$@^f@9#j zsee@%UHX!o?BTcr3-?uY8w(_BsJ3{G09LjJwsK*m|B8DjNl%9&K%$+PGZ0 zG(YN+2U(+6%S}!e=D11J%PY2SBSSha<8s2mQ2nu)&+-eH!)A`{*n%SE)-BuPSLGVJPpCk0v}X3<+D1f zne2os4sEHP?vRR$Wu6XYdRdWju}e z)3hW=ILa=X27lNQFB5hW+q5#o9_|EBBPPOdsdPf;(|Mts4BdeK7BQK?{f4-)S=?Pz z_CT7mcf(a2Oo3JdYLSm?4W8Cr6!=a&$;rRkoNHnqZ6<^#})!o z#zQ|A33i7#TeT@17Hr#8y@deBpEfV8a?;AjF~Gk1*o%?2AKB}`CwliGXIBivU$kxg zDMT?7lXDTF!t)&b15D9USF3UxV$?j%`g8$vmmy!0IemhILM&~QiM&-xk4%~7z?rv( zFB1HOB9m>`$v|t;&KxXDAn(8B8llx*t{uiymO06OxbrX@)nr5*(8I_+Zbj0qD2+za zt?jrL(5f8t82X&gc$szTzQZLF@b>jEnwkq&267hlXj~R4AKS`mrAJ$-zYyDvehQ*) zRb*o7XHJO~x-=JTInv;@A1*FImwWK=u8@W7LCylP(}hSDyFDJqUSf)(sMAoFY{UDv zKnj_%VGx$1YxKb?LYpcIOH=P74fLVsAKaQg3e#L<^H3qO1gF!`GgMOu3UhHOYbNA0 zZ%_w;n)FD$P)Imn?C>9;mxB+zZEDvVw?D$XLQ~haZ$JDlst_4DzF1dOu=5YJ!;dk8 zJeNRw(j^<74S^*u2;c`$lk1nT%aGxpy-#|u?J*l7pE=aQiKzucR{>!1y3P_DQH;)U z+{~MYTTphxOgGZIe!>UaiMWjCW~1LtL151iR^b7a2Fhcng*Y9(jzI&hZ5Y8wJ=`9R zd(ZabXW@aB8$RkS$jI66vPwj3s6pDx^r@FUEi_hv337RKN+MNG`)-s_r!g>Y+L6C9Fxp4kl73{ z%l*;Nw?Ok4z~rITqfJ=$%4epEzubpUtwDWkq!Z@2gYynwOBkoS!6?FiiB5bc5Z>4av2~B z-|P}lfM_Xr0{gc=sWt4!z<&Hn5Q4;LP;p?MyxF}7?nen1*$?-R7H|j_Sh72t$)V%6 zwU0@;R3XT9F8l5E*;4(PYcL6N;NZ~Y!7@zjGDi#dJ;HKlF9!QqL|>4pxw?)h-q`~X zLeaMH91J4CLM|U_)7Q{dE;Q63V$|&&h_n(C*D*=R?)@^)oQ(kEDFGja4d}~7 z8WurTjP@*^3URS#k?Z+2%KPb#Z5q1LXfjGDqSm!lpi9{inetlN#xH;)K%1hDlym*h zw>$SuDBd_*(n$5xKwiH9LO{L0Rc?F1S&m7Pr%Z@7;VkL#bo}WtX40V1{F7^PI&c@u z#SR=Jpj2F4ptz6`^61pU@hQ_mIeV=2BVGOhJ5}D`>*;`5TYWbMTxS<`Pvq^)&no6= z;Xg6+oPH&;ZG`Z0{JFDVa6&;f!NS3m+G~-cZ!fIEgtN=9tSx}+rIG@>vjoV=k2NB$2VM51h zc=0XYMN)M9Ji61=fikce?cZroI$o>Q@71KdkA{yWthVK+KU+uGf%>#tJX)qh62hf{ zgvhRlRL|9FI%Tr95^Y=x8+PAH_Rxs!x>eC{*>{|UPDV&f#$F8?TdbaP^rVR_GvG## z#xqM`>zJ)#80!)wl;Z`P;ea;ut9Ncm$7wP9kyA7cB(Ge^P8+o2FiIm}8M7nOqGgfN&Ds&Tl` zAs8dg9Z~77+hdzv7-mkeW?FlHv-r6fcrlpe_$)BW^Ba@tW~1Uo%-|L_r<}Ru$mr0c zz4!a!$xyL_j|lX%gkAKab!hn^fK7}3-nZvVkqV-nv5fZilZC?unE@SZI933H-2SI% zhHiNunMra`W0a;S4Sj&1@wGwnIDIqbcDS5h$R!7o1Cf$kJG65Tj%bod15wFYdzYu* zg*Pn)R11O5Qf_YVKA69-#4UO=3h@%4{;yqJI)f!ek`ti>kp_eQ9hNqxhfC#pd_6ZIO)hf7Qw?680y25J84 zVZ@_3t?KTHR);$LExQ;#?-u6nxHG2#yVNlf)rk*+1NHY#{JYi{9#D=*hN1c*geg9W$9x;ytfs_Xc(eLOr?s ziS332DGaa$Y6UBpplC+7kSO{Z^g#o#sQi^_CBeAt#Z?l84QBy|fd8-f##@wD$~_GO zdj`AD!p1`A8HE8TA3$wS%o={HMP&1!x+7_`+#n)O6@c})@4#i>#~exW0G3Jk#Ywj{)NN$c=#oASk84ur7%K+kj%~{tO=g_p?Dj(vLXnI zifShA7)w3e7duX#kusSQW~2bk+W@qq?8XlS!QkD{s0+X{R^X>Mg%H%5N}7MhC%!67 z%Fuxe54*(g6}%ShUPgQ);~-H?W&OMrdj)+y^3FdFq+{y}{{*_pOvdoaU{ zMs<8~gJ2RBiGW}l?`&sE!^-PJDx0$4wHwds^rBQ!gW~_WjZmgU#Tv*pl!4c7wAafO zFBI$jMSOr|G5XLcplU*fjomMHdjR>T}=`AUD>qRtyFfN%O?7pl7=eKVf21 zh;h(Wd>~3t`a8=NAg+TS4!5E=jfGc3u^V5d1t_7Xg+lY|s| zi`(KQN<0R=DJw*q>xy!PBHM$WMT`&IAvjLQy+05v>a=sU(LM12Wea;qqJb;RlH_<| z+yYGb2@)HyZt`cX7LrCzSYK}1Ji`+l!4XU-fYbeVK!6G}bSQQ0i5Dgjr7-;3A$SF3 z%>U2_xgmfU=_?AOALCQ#s+`3xcNKBZ-iUq0aVSG+U)m*#8Eu`-V+eXfFk=8vhT%}? zTqKJbAScK4>UcuhJUyG(PuT2;QSV9&mTfbeM@%JTmtG+gQ-@mYv8OaQtMyZfP1}K+ zL!<`R{IRWF5MZN@voPX4JgDJ>T|oM=KOt%M{r}9*5}Ot=oh$SK-Q<=qBJi+9iojX+ z;b;}y-D-K2JI@w;JSs7$SVQc)C`Fz=<3$iaS$L7tolk^?e*lGqRctJe{g3kU_uxbx z>NJujH>RWQAj3lOol0?Tpfu2VaB_LF=VHLh&YEvhKf_WWvjQ8hO2W zeh@J}#bUZ35;%9T-Gd_YN9z zX4uzadDa%?Y1O@Ujt+|-?vp;va;WDz3B)YbC(zaC9G#rW#Qyd}nwbL@aOY^x)G z<+T-2zVO!3QG0NJaT+-!$M#~T-L{O9l`E|B1*X*GHvlo_d4J-?Le_zx*&lE_PSIHv zFlvWkidl;Tl52u=K9Dnotg(Hu3ThS^5ybgw4Duc)@A0d921A>B4R{LV<@J4%%)v9- zhG}Wr%2=MxnN(^%BOOL@nbW1yWOg@2nNXvw(00zK!L2Vyakm-`T)<} zZ&B-e_ZLQ5vSVWO?&x$3$Kll3KbSuJ6jT7YnI82ol<-=t9`<8F767qvOge(A0tTrP zSb)cDAbFR!VeWPPMGEclTrBs~=C^b^pok{zA_u1rd!;b2AOrV3RcWX>6#$v`GUl@p zV?m@GUL%Y``pyiN={l|}1wdv7n;6>NjQ|O5!Qy+c!3GR~w z1&)77yXdt$8|f18GVx_7V4va`LuiM|ZJn#pC;#Y4M%pHlx%2S?TxV1!k&FuIz1Tdx zMh375MB0eLw<}i9()!Q4C12Zs!axxgDebPp&MnXA`H<<0iRN)`rF6DjYApgbi$!| z+QC>B_$sEL!?U_P$;R1MXxrERS}dLdGD>|^)mBL5=IzEzi-zyhGTF{%O%1x&7(9x^ z@{0b7kzad+11UHSJ^rmzS!9}k?Lc-nPBJ2BhRwqhFEOexq>Hs5O#+YO3OxOt`J8T1 zU^_)#v?2TiE3U*e0raQ;B!8^6m|RS9f*HUscV7(5@>v-TPE{ivvFgyf?O4>Jj}vIo zY@}OON3YWhqQH9M69Gt`60MRzK-nFLCE+Hu(ZXPkfb34*ype!ePGEq-jq}+3?447$ zu3tKM%y!Y)acU||Ht23}Im*2WZ#gSk6zI;ycZzVzw5X68nx6KC+VtWDkb!+QY)b^{ zT&DuLHaa%~jLrCbv@^e-ae*l2n0a(h22c`0XC(u}*(ZAdu4OvLgucGBpAwH5YoO~B z5$nj?{~RrnslsPq zF8H>=DAf50h26_#Xm{~YXQQkE@E^x(`=47{_EU!>$b_Nt0VoC(fK`X+_8XTE`;*rT zI_)`Lwi4m|Yyl)Eax#277hs-QwrrFkO#9Z+mMRg-IsOqowVVQ+4LZtKkP=qlir=Af|B0rYb;tl~-k0fil5QzA14 z+=>UHvnv=f4G0{R#QApf622}SYpYD`e?NP=wgHapD6&Q1xZNU0X)gHOq~~AclFXr7 z&y3_RX3SM(&+ELEe_*`WS73BbIaa;JiEa%N28f|s66AF~e)Uz98w45Ns~snLbcB&T zq-|Zca+$8YRG~~mI^O&L2p6vJd~j$7S+jZxRkCm9)d}GoEc!_n>6A13Q3TtQ45;FX+Wy?fBh5$pwy)j8&X4 zO|KW7wnQ5(_#?L};adKL^!feWjyNqmmB=*UH<#{vQfP6;%yJfW056jd;ExSR{9;k< z)y}f`c2{v&fq5~q@LZ<@%|WUG@XU5e9ynxPW;?aLpY6c4r1{ywAETK?|JHLIXpa?x z4O%bmQ(ome&?h7N5z717jyDc$kSxZ4{3D%=Xs^%S7LHpJh4Zx<(+EL^u}W@Fa*9%dHK9?nj~Wi=&+1Nq|-XN5-Ni)QrkU$Mv)C-R=3Nx zEl~(xEbGZW#UvR=5A?S~*rq^387*vpiKd-np}F)rb-x7K+H0|RSS${V$1BJJrs$rc zX8u8CvH-BcwWkZ-ctYJ#z`i5NS^FfT=wqR`GFWhafvmwXTQ3tcYyTx^If&{dZL$2? z|HsCK#N4%+3-^`x(&XEN`Usfnv?tI|W6;#*qN9BCU#Jkco3j| zKNL6#^cJgSi2i=r!1%>{iyfKb6ZBTdNe-=K3|$aPn}kAlTI5-Y(BO^QHo2kJW_Cq{ ztm8@5ppY)7Rx%JTtZdlk-3`}q=V5@(E#3D3j;ml0kC~G#qO4zS?bu2d4+7&%0)vbG zi-_F?!U%KA@JjHf(Y%kjy;|~M^ABUa!4MI0CD8ieC}bu$bzIt~mh!l82$o#-TQNRO z{h4gpi}?pu2;vB(Ui3L{ zH`CN8&0e;rMd%cE*=@(R(BCUZK<6wUl#S%eX z&Nqr`aqYnhsD}dpot7CM;;=2b^1nqUT9ou~X?uAdX(0#4 z)&ym@JxS95xsEMR$!Jd+Y6Dfa6?ox%i5evYx2t_&FMw*lJr-nvNAw5vc(!Si$0xuh z@Hl%=gpFVY2n>d4g@0ZE^yVg=h%_Htl2~#qZ^U9jXNbA-;!j*GZOWyNd~x&vAAal% zvT6gc)}BWoa&H|3;3B?!2*sfh-@J1msVjM9CRmEQz6qGxMg{EjwDRWZ&bUQ{2O4Ek zf}QHya@K1I7DT7?j=gccy?!M;9cZ$GB#@IEm0nL*WjQK&d}>1X&Fn5XfIYyi$PG6 zQ!lhbS`a=UfZstkIU_CnxCaO);{eK$?+b`U?2`LU=$hQMfn&F|Jf*b_ z8tn2eNL5)BdV(Ov*@rQT!iBz&Q2C3UL1L8fRfZqFFeaFOU?dWlt=blPW?YuL&JzL@ zZ9%CctLwAQ8<<_%G7utjbq=3B7A+1vTn(+h55Td)$EyG#nJ~q|Ud!1DL=hH2ab%-> zhKgX^47`O-9Dj$Cvl2-|A`t7x4)|fSK{{ZP$&am!R@OG*?k#lo@O9b*7!O}(6f`q1 zL`OsbaH1*#wnhi zTlz`6xuJdJJmmZPJooV+w@vzWQ<>IUuU=@-2qR=m3BsRhw8!X9EfJ0TdgtDnMUG56 zoIX$J+e_T;c4`bng2J8yUW$?ua-9q4dhePjgncrq%LQU&yaAPX{a~Cdlj>H;xtl`B z#11tnshmHs-kjc}j-{xAbzGii(^+m8YS}(hR~Kr%O%NccY@@ax@_%;ANnGrbmz1)% zD5O3aU_y%yop5Qv=SL`turtAdqwD#)TxaPgy!RxXP3Vxsyy0&XDQawH;5`<P=Jwe_xTISVFH*zNKN6CRW-dXypYfji;In?A!!9_p9a)s@G7v3ca`;Z%{V&UVyCddY-zeMZ z&IdJ!irOONGyA<__Sig=ejw;HpE3eEpZL(^CW-&26)=L7yvfh1A0!pOEXE8sZGM^# zte7q1^FSGerO(14+5df!s;%hxUQ8Tc%nO4+NF%WiqHXFlH4I%J7Q&_I6LN5#5{1O9!n;hiQ^_WQhD371VXkL{=dg zY)u%w*K6#D*Qm~I!W&jbf?HSHE;IUW4U2`1+sDEPPQ<`$u)n@p8i(B|>uVbC3^k&U zPy#j^Na*uHw-Hnp0vweA#B#=agGdA7Q;@CTTPef}$TUaj52@tjAcDN3f*|%o6u>WZ zyrdEU2A=LTaQ(>n4&vU{L_mLB6MJIbX6(Z34?uTlEWA&3o`)ThG^vM91FgF6#eyX7 z7y#Ba9D-~Ce+obk436;V;t?{B6#qIfP#tP>HYaZ*D@5}N-eTF{60q$ce|aA>Z^_Xs zUq$%qM06XHSIZ5qc<@mN>COn;iAf46E0Rszo2RfPvAnc9X!fSh91Gt#tED6Mf*@}^ zIS6#p5w(FKd}Fp+946c2TDon2Dalyf{k0gBdjdYmT!!)MSr#UF40VQ}B;Jm)k~A@p z2yL6R`eOaG7;T*h~fbDV+hI28~xyVvU++lxfTdPg(IW; z=tL%_5X|7!IoOFVEgmfqg_%XE+fO!F>?;Y+YGy%{2&HYsq`dIGF!fx9B}opn(M;zK zdcDS04o`;Xmu0lT?j=#V;v=kCu*C z0@0Ktdg?BbfOQh>(JA%!=VEoT*mtH1XujKCj5uESb_Ac?Nrwi8biPBN#`9#MZ`s)W zX!>ZM;5%-^EH8mE9m9@Fm6T2jyg={iAyp>vMZ8kh#Aol2dfFivwpA3~D>~#()?k`~ zW{urnCG224@vcjnRKwwZy~opbjHG8(YeCs}*4ZRXF`=St*||Z#ARi>mCI082^}}lv z`Ud!m>@{5}91mTpu?8A*?+^>5H8SprXv*K_H`kN((`y`{J~QoA;(`l7S%w*5~P+rsY9a|X=;|znq}GM`RyZzs3NKR6{ z+(x=xGeHU)aGqY|e&O|xw6o3x77Q@sis+h6q$f12=!0)u8uFH01}y0!xt`FS!HbAZ zFoea0D|zOIZ54J3;gSsWAPqsQamL2i>Zde<9^A0NgTDz&ZX-e_|2EZa@!fd-^ z+v%4Y(`KqwL`CP5lg{XcA?c^&v%L*+F?3ug>UXJzJO=tch!VI za}9V?cA$U-(MkF^)u(vC(pan=o~#nw0og>ph&T2@mPF*)#J6{{)BxN^RtZ^T#Qa>W z_JhqOQ%P`4;Qaw^tS5trkfcS+5Mcwi#6}|-2W9)>!Bjojr(-TtK~l#M(e8Dy8}XH) z7pSi3TST%Dl#Iyy)$!W>Rv3PNG;#||M*shG4VonxzKOCUoa6zAoR%nEW~q+178jTBF}lQlRzk!)kz5&(+CCo5cYFhm z&=uRs73c6Ow&N~&JCHjyQc;C)TZqY}U4c$E5c>C^#bt9g?isLvYZXF$V;{J*yJWu* zcK6Y5l)3kSSu*ES00I=!k>NvRh0fDZ2XJ(&D1A`mLBnibI-*_#9m<7e9lS9>XIL7N zJ6&d334Q$)A%)H=_|*m$SU1oVk+d|lfnJFn=!bf607FFygI7!c?F8@5$G~n@Oq6jF z@Xf>2$&R64*rc@7f1KN6s%y zTZ%!x-RbWCfY_;gH>ETRJng<5m(~&e)7fA2$yAd1ManE?0>XpzwNC&oX2|ujNetlu zf~IqG;s6w>rU!aTw!immSth7Bl}8GT_2H^kL5u~5v6oF^KH4Oba#xvsaqj%m7MLRm z)tH^RK|c-Yv@X2RGiyaw`Isc*1wsDL?6GZ0kfJLSO&gq9$_5a_-UdR_)lYoyk|V<( zX^e>gVnxGi%i~)Dl!SllGKg5qVHd0kH1&6_@8$l11|!3=YhK;=IKDtBwcu3?kbnPh zD9IvefOtf>U8dJ^=djH5AKrb_yL421MFAhlkgKWdI3#Y}gc>wlWdwg$|lZ_Myp^~wIaz!j^JC;-|F?!T^W=n%2n}ua)t&(bZKi%;Hx9m>pB-Hma zIw77j1Z>tWB^=j0e$ifwnAkGveuhhm*?5R3c>46q;h27{tJ&E#N0$yNb=2@d%(h~?OjjKd({87OiwN(&La6FzRPCC}XY`q~}z(F(3 z3tl|&7~*$0HqnKWX&NTdF$=>n_Sb4hP#V+QsHRMTYw5d>B7pFWcI(Cq6#2v1V&#>LaQM3eGwq$06A_M~e`HM+6E9CEZ!Z6@mW-lqrqHR?UJVMFG1Qb-h6B z7WPhdGt#W18_!+lnl4T1YoLirN1tsyTGnh9ohe-KUOldSO3sl21yPKv25tSY^_n1g z(tf!VGgoDYRxW%ltj^Zn*{Gip4zvm+oIrDOy7Sz#C#G#fk_^iB*8a!yfcA{lQ%u}m zTe6(?f05ey)LphdJNHUcpB^I}5+&cMyx-U_j8S>k-T5p8T2bh+xDREhY#Wg-YdLhM zQDxX*1beHKEjpkcJn?+Im`}bej&1PyrK4_f&rchPo&B<)cBMP8{uuHI`L6DKHrZhf+_EJ_s-%^Az8GThkEI{X|Ucv6XcqR`UB&(Hk&|P5H;UC z_;0Q(AYEP}Eq(Ix?KDG+4W3279pg4+VeW#8CY-wXI%(xw=7o8iM8ToMt5fdp%d%jk zl8a?2ef#+EzOCr8T#p&nV=;t}j^>&6(UTq{cX6C_G--h(6`5JHh|p9*cfD{Q)`7+>F@=J{Oz`Y*l^UEI~^MDwq$q|1?3{ zp$R%@KO!2BK-=_VWeFuf0C|GhA8$Vvdm?-TU<^L(4H$^jPq05|9K>rt&f!VBQ%Ea1 z!KBm5MYC!Bag=TiT7T$RK2BRXG8ynUsN(T+)7(NNAP-1`vYXr*7gg?p3{}zQna?Id z!matc!5b}-Q;?7le$jV^|6rkt;@hJAkw2m+tvht2#GOb7U3TH-b(74jN2`W zbz~WC=bG)9j;Iw2PO&LnL~m-3LkI5)QziHfj-jFym;s0=f;ss)0<-!RuP20cLZmrDg1a`z4wu9S2H z9rN)(*(3-*J#1y{ zq5-F}ey&wAP)Ql^L7Mh$0woLevVa@Hi}`33>O3fuz@r~Z5kSS}+j8(P0bR=4&+oPd zauUD?X=Z-C%frKAwJLoM93_ce4io?kW*Y&D5Hi62E;FiNa&sv0^)87pCxaW(dAq7Q zqI|hHy;;Brl(u2PZ}4Xn?nl_rDqg`7PZC)I3AaRgYLAIvQe@v zu}R!&Mfw4;B^Nu=*og!r4VdifkLzDi5(9Qg^i*8Il?X{4befWAavLt$oz|&El@I7gHauj*Bm*o*^tAX4ts3?rBq4^C{}d378IKxNJbQX6?|qk?w%4*j;oKzd!jJ$Bb$C%94Q*uyZ5e;_(!V z!h`tKZNgB`{)<5!b&S_i=vE|QBAQ#VSNMrdhMPm?uFsAPe6T;|+XD<;Fi1SO+RTl= zEQq2o)TTZ9E3qm898D_BcaYZcnsi0Uc8HR+93^%O8m@R+1;w+;o68<=d5UC&PZOt8 zf|or#q9j^cM;r<751CDrtrz%Fq0y^=HDhEAL_sen!JctMt(h7IL$}9983@m zYn2qvds`ZdTD*V(M#btEH?o{Tg1qCU7DzAR*a6CrGcwdkdu7!p8)!Yyj;En*SHS!| zoctO!zqRL!&ygkS(MJeSq!$m4x-r4nS3oBV;}~avBYt(mcgK(vZb^R#%iD)LV^+i> z=FXH^$Y#4_nah#@_085sh#kNYES<9C$JU37;ZOZ!86$dWKM*!(YO(E38Ud2sZ?ADl zpK<_n-P%2ipWVxNru>UI&IDDIK_{~}_i`gjyqhX!Yb@bIIb<=*!MGs=tV$$apT%k* zc1D^J78&DCCNadV+?t?}{CcB_#@y=v8GExVxN#-R_CH6V3EWudn*r7Qr|@haI*d+g zJvZe?Ri+|BaFT$*n$uwJcBBl`Ic_m*s|X%mrNckB6To0&Q%BkU!T0oR5joQrR3a$d zUW>(`El6#MVPFGskA$p29wT2=km!|`-u(jJi04yooK79-yQi)V7OXmx5G@8 za4P0jq>i3#Aw);6f?@kUu#9wN$xxA^Et2HwVwX!nE!Z1()K3##TKM-XoeIEW3fmUA z3T5ddN#F>@9>Bt$K>R=%-w9D$wr)&w8005Ulb2|?G@0Gz*}qzxNM_Ba!6MXrm`|b^ zGg9Vgz}TK=F`fuR5nNh}gAqQ9g(ImgNIXcrZehp;Ch+bCQYAFPo!jwp z4WrIHm#D?G6`GP1ks z^M4i-y0lZaA^7N!j?ZHM(2Tj#DTan%%Kg5klm#@7i`DQLvat|qbO7uQTlu+IEOdop zt6hr_G%OVPj91gCdEruy>S@FNdSX+NpxW&6{bU)^Pl)=lZ!k2&u9@5N^Jt9M1X5ty zeRPuBe~dt6Q2>nh_|Kor$2LyPe=J~-#hJr%!W};NtyY~`bb)Js_6WgoNx=vf)e{=I zYOL%CTw-EN%7AH&8)lL5yUQO{#go=$`47O=V$A=ND6=c{r%p0Q28u9lzBxPh7bz-C z=+U%C;^?y!Q~3rExq+GaRxbV@g+?qiiWUrQcw|q$oQ>fqT5f{+C{=ttPllx`gB0+m zXSV)T9yZFuUnkpk9YV4ASoY*JN6qB%(jj}$gtrbM%~PMDDK``6zf8yMPlFfP zB!h7&X3g#MD3rV9oim^;I_wP#1j^*=t3HHHXE^+VNQBtOyaHvtF?Lwr(I=48(>yJN z#62f<>ISm?JMZT`s?GGPJF)A@Be zaRyaIYSD4q4J^ILhR(!3vT_~qa7+ad_67gCURz|fpo7*gy;i_e$Z$C39{@1kz&K0Z zP<3tlpY*F03rBPLl=Cl#>yg$t(CQKCgdb^2n1JYvchxH`lxUyH?%XAB^b zXJJm7z9!1l!F5;?44>(2$4ej0j+%Yva-ZwZVlls9VNL~X4=kGJba2I`K%#53Zr_eb z>Vtx^f8O%De-LAk@zq005W&y85GBjQ{1h!A%eZ}uK%A0)E=t1b(LaEU6!krciygHo z%kXc%NfAgb(?$@6t?nO<$-ac_)tkB(%e=@ih3sH&K~Oh38@JaNR#F;|+M%DGAi&K{ zvZfhG@{h+?i{);6Rf(}A=yb~<4-r;Ls_2e8x*Ac6#J&YAa>Uksu`q?a#OIY*L+ro3 zW)h}m1Y#hQ#h;7{$8w%at?)Zy@%My6%vgfhH(v`*iMK`I1zIpe>y38SxzrG;-RygN zzkRmv*C;3Rkb!~;7PAW`L&;%MP3B{?Fc6~5Cm18}LW+{dh*g{ogX=}m4p+cm{ zy)7U~egr==bl=K$wF39*v5p)C%q6UxO%6Kd3oKDEp>JFy}x92bHhmBhs+; z1}K5s46a=5^=$v3;md@a7Aw@~yXjLdaYsOIb)WBP&nC{n!sifu-v=~+p?K-JQ5ct>M_YIX zQg#EbP4}KGSwmmEincd>J_AGx1FZH-)dJyCyQ`4iZgo1F?KH6wvTn(##_0Z`A`UXK z9Qm@ZTV+9vW$hT4K=fV=xO@gN%sDid>$TO0^US^$IE<*}N*$=_p!DdT3?h3c8s z8!6J!BB@B{fI&L>IO5D!ht8_8{g*H4|K#r-+bvD?_(@8V44%#zpf4`b0H*c%%t!eX zA__qf80tIyUqSlcNV2XDG~_QQq+32t+hW_@vW6FJ*iA0U*st2!lm5%DtU<#LRtS96 z1z`5}lLhS$2^lex{1qutykHhUf;7FUbsBbI2GoceLkKwZ!khvq=nppz^r+ov0J(N#fei9!+ zoBoE8WVtRPP9wHN@+VvT3hrtoHoUl>q~(BCGJv56K+G<`67~LZKwb0+aX@lGh9Q~* zz0SfE`!oqNH7Q&~UU|!pP{L|CSk2-E=9nlENK5SONMuT6OlLR2Q5Yqk%;IZvowpnN z@2jOClpwGQYHedgksa6FF@0)F7WehIgVB>DaBhM7=B?3v&_BBepDhub=#3KwhAW`R z5eZ--l0Vt8!*fbWenP;fAb)(e!e96^3Bvo7LPpAv#iJztdzZy_2K?{M{|S~wJ%{2V zX}%$?-u}H9^b7E8@;+JKNQQ8Rr3AbUMldR*d`QM5ZV58 zYXswol*FPJ8u_&2fd|+DY{=%!JRjXp>w1_d~E~EJd2^3 zhS{~{XZUhGa|HZ>0xSZqVqm91mwi#OGk7$VeJVdv)~FQI&9ZQLTZE_u<91|IiRC%*h*| zvC>~hZASpYB+t&ekm<;`3xi}*;du)a;YSUbXKWSm2`kT%G}rul&VUeJRx8{R$oyrz zXz}Rdndu(%R%qb5ho!EC4_DbZa|XLnYxH0pW0J+Jl}?j4{+U@<6d2f$)loQ9jXbWj zVfT8z#gU@)QTVP&>k(JgQ{%qA;Dt-t`W5?RevqkcMu&l-?HMVY6#@^ z5)iK-?y~&mCXt|qy`wBAy?yD5#%lc`_OG2IM^^9Mn@I{ zwUz4Yll2nZF-75^TMz;eUuzA+kkQ!-mV7!?&g;aH1)_!G)k>Yv}PkNiGx=rReZ z*`=O=$m~Mk*X-eJMsz^|!6i7=^}QK;v_E+9XeT8N<~>*e4kzN`px3vHt1BJ!^Cygyf5(eqIf ztw%6gyWM0?N@&P>K+;{u0%BQ}$0}r{C*iS2jTlLSTh&J-0$Ovc!*_X&OjKvV)OtoI z$z2(FG7x^BfT+O6)dWpeKmfDd;TTm0BrcFD?p|S_xJd0^L15;WuuzZu%H=DdDJZH? zt2+LjtB0-&187QjKW`NCj8M=q{$35DYVR@L4J2s;(v6Aotq27{0(rJ935N5A(U%t4 zT84@FhJkjr zXo=r8q(#~vIU`Z)uEq;Qp@wk$mRVklm0&TZ4dvQ@$j*m_{@?@{d1`4;ei8dSa*B+>8V ze8Wcff(_Oju6p>eRRFy($CNN9A0b3}=LUirU;J=dHi8%GYJAn{fGXd`Jh zE^>E!2*~Tv@_?znt+XHV$@{pEx5lsRCF>$8m8= zUzzUWNlVC$(3@M*M=p2mOB6st&@Qs~cz*Tvv?O_eno6`I2AC<&Hc2 zyICcf#)f{A>z4)(FR~$z{QC&d`JWVF=v_89SY&38P9PQJK3FIC4Cu7lL+~cjONqb1 zjQ!0XDlmOf2`Cs{HTU`|z-APAd4`iH;B3~hmjV4V%M;ayOz5BXb0SNlk%2vsA~al1 z=pwbOh`^#~G0rrq!VW;ZX=Cf1^L+v?>|2O5!cYm@3~tWW_C1cuz^L$+VRGcdFZ7_9 z1U9RI`*)&np?@Nh4MPn}62RbUobHzZqUUsW8Q|wLAVNt$(-8%}GxCG>LZqz0Ho-6e zN;JBMyZc}dz7@8X4bA$UPm9DN4uVkd%VcKqI&V7%SR)4U#O936XYpw>{M;_O8@bMK zs422asbV9DAItOVwpSkkn;80T*!hj^ck6N>M^FbQw6l0lE7>o|TMHAYhhQ<0Bw7rl zg)K-gWX;>JfsQW7_aVwVoH@HqJUB+k>P zpEg_!F_daDAA6te9YvCaY&$+0mH*Yj$k?wluYs=pwc3!GAuI#D8UKnTBU(*;t%fYw zw8wBBVxxeWUF5n$&uX-A00R{$tY}@oSL;FC!Z83y_|)|7%Zi;JF_5uIH1^K30e~g; z%5l6tt6+P*L5omMKa+_WdIfi1hEZQ9A6G;^5U~Mp)1DUPFbiPsPDxa7fLI4U0%U9Q zLT^St=rFh?Ns|=6O63!S+%-6*^?H+iM*LBD9$oGQkYBw2$y_5f`R|e(pYI0gje#05 zWX zl*Od#PTy&G`(nVHlW!4Gerp<`ZH2W5W$%}SJb4doTy(u|tf^3#5Oe`{kNwJBfmH@M5W0+-R-!G{T-1eZ zPul^S&=JU|n~X9$oNdXh++p%!w1t2>035QgnTT{b@!jHM(VRAmf_ZveRKE~q4J{s7#Q67LhD_ufB4)jGTZsdyQjoPL5 zWI$Ua_dC9l$yzRYD*)H>+L7&FjO;h#9(gf*IngmlL@ZPNG@qn2Q2!{GPCJid_xEx! zz7OFz+IKh%4YvXUIgbh;kfVLeF)%~vkiLj#JHMZ<$J}37^Gvnjgx1?81*;H{Fxs#V z?VzL_T(mGB(@SX%DcKmBN%WJron4$x-N4xivbJpu%iH`OXxFDkVjX?QcQk1sHq%bj zg`iWT*o&O3ZdQ}vQN4j_R{9fAK?PNZ34ARV(}^&7lraK$t>uLWc#DO<7|q$_j2lM$ zBF`ewILCXrn3qMlf$~0>sv~|&_jO6!lzw_D_q~IkI7t1i^6~&RK+3cTO2C1`ER88dOJeRY&HNrs8hh7;pMw zbpd0TdrN@*VU+^l=pUSk(5vIi0S0opi6QL=xU81_+(i{?O$^VSP}HWdZ)b!66 z7sgGvn$%o3Mg&Zx&T1K>RI1j|aysR#Q#iuR%Qo50s;%HU+@y5m5fV^#Ufn(i&T2R~ zEELMTiEqd}=dDNQjaf3oNtbM(C|w( zrA~gaMgB$GcPl3@q6=oniFKi-ltS2H^Vhgp2K`LS#r}G-uzZ`)vOo+LSZ3}eHRTeH zq8vh8UcSlah}pV0o)3N-+C<@@216*un&c#Jl%$Ti_%-PK`!{2G4O_$)c`o)3wpC=` zSZ%8W^I~uImQ$DPKNOjX33r>1x{X#xC`ZdY5q3?LJhqb!7O|c54eew<)tFmb zl6QGtrk7UF%66=yo*(kbu(U$A|;qUzoAVoPNO)MOx9dKO4QMiQE=63+JTc zYsOS+E-WWssz$Tyh)RLcP#4uI_3o)Z%DeOehbXGcHzi0HwiRaA+s!SVP1FNyH~o<+ z=|hnuZZ=WN8c8KNN8HiBVfKotI-su?+S;BuqQE3L)D&P?0J}oCxSg`aM%6N%P(sxT zmIwGPlAP~ni;(1a72{HG@thf*`~U7u9hy1$rMlD{7*O!u8ZFJgaO*WkG%(An(Mlco zJ=%|O;5v$0v=Z=Rsr%g8=ow*60&-{d{nv6cWE07uCd)yp-X|^*`(eZam-20bFklfR z4@~~w54QtG9pK9ejRC&NbU+;EjW!f-VH6*9gG)sRhEcA==X^EH27)>RXb3P1AR%qI zwjFRhOkXECxyy)QGS(2durR}Cecd?G#mzL7rZixccC<}l9Ygpm!gH^E_kid!@1$0g zo$lAHXy!;Kftlfe97krCoZVAJAWCSg%9+|On{koc7JTV;6m(3+lc6O<{oJ_2<{@%s%D2$#_WcYRQ6wpdlZCDFb85Ox&K z!!q|^M<#mE8i3|K?z#pK2Vq(p3SPVTvsJLdOrD9>e+8}?ky60SSwd0uXs*iu(;g$& zt-sdqH#8MwR%-vC&nLf))mB8ffptQ+m20#3^#&^`p;WMuJ8^U}vSuJPFJ#8UKmvo<{DLznQe=Qe@H`%*{XDeaf4F1iT_nQ;AQFI{?-=eeyUwce(nbXbp z(}l}Hzugjv*=Tg%rJJQA%xaRfb_<&HYN3`nJ zgXkd>GD$24b-Z*N0rUp>8NC{KD&wGL*segynC92Vr@Oevv48Et^n{R`3Hok%kq5Ya z)b{O7d%3u|?5PpbQaASTY{`yzKtL#B?Xy+T+;PM!tRIVE9j4mj|Be@{7qQc&hW4v2wP4ip`$s`LeW%4v4dR9j)p|1}E)+N^|2`-)D#4}7z;1E{8etAEetw8=G>0-2iXv&f@7sr`WYv3}8 z<|){P6G@;B!RfXwx*h_*TFr`_->cbDy}~C2i*w7JXJRLU0+5c%eF@-rV~GjUDM&28 zpKV9zJ0?;nwkDJwk^`$yCmy;S(C~JI0y4ux=G#4g$)JBeTLdn*|Dy4UMrSnY?#3=bUBiUb_o`B2Nijkn;w;_!AymmGb!NmrmUq z#Aul!5UyW2(7<+79i}pG_g{MgD8JCq5q0rsOo3zNhD0G(ejqeS24mGZBCg#jKpXne znWcHRG4QLB<*)Z18RDmP7&K}1=WrHPypZoOm^x(yT)1{z!-*6b+k`0+^{w5_3=1$B zf@5Vpw zzKzD(-F3Z`c9%SWPiLh6$JJ~}ErS5*K%Uk9_xW~l4?{los4OooP4CP@8LWs9*&p@e zmB_SIZikk%pt}C@ivV;L_jyVB?Y|~}JgF-AGBz-vnl$J?MU}l-@?F3ZjI3VHdzJ+S zcqin4i{_Q{YoqiM!J-LJ8{agFCwKBj2q;M{ znLNk|!PEr=8LK`jG||VQV-6ocPz$FGDU>A{I@jIJa z7Y`@ON+v#A83useCr80vdWg6TKwNEX&2ybDr(Xy zjBfo1dyoU|1~t>b38)`HcjI*l^x*Ecgs!8G$y#-LqQE&F`b8gFI3w|W{F+l#|E{2c;n*HF`vb1wYxMj zM-L>z1hloAw+sh(J+?90#^tpqdkq+^OMDh~Bo=%5)BqO5ra0UaJn}sem@v2!8iQoY zuhZ5>Z~$nX@pWXCJ8se&RIyDHosH>`Xmng@mvhUG2LMk`7TMegQ3AF|me79MpyO8x zQ>-w~P(pw>hDI6}wehS0*djSnaRuRqLSd2;R5~BcN;X(hTmY#$Gx*9S?fwQwcR=9x zqqXRx;b2P#hUnWpAd~I^wb-&B^P7!gvRpMYF658>I3ZUAX~IH?6K@u!16~5lp1~e$ zQ9CBjUBRxvRU0ysd#FKMPWn4_ZK&kgeNS=Lj-nUp%yt1^#Dmoj0gcp^X%#9JcwqE* zTP9KqN1_c~X6#a^PF%q_)6!#XpXgD}JBnbV$iN>y-wO}QhYv}S+}W4&=lYUAfY~Aon8!Z0-0JODO6pMHm$ifK1e*IN$tb7GH$VJfT#F;VEwjl51;%A zCM5_aozWfNJOt3(WTU^9r_Pk0q zsnuv`QOqxua=hdUj^kOTBageAG9VnBmP3!XJOQnoPdpiP8pvp2R1^=Dl@mSyIU%mF zpDv|HT7-~LyQ}D6BWOya=Cd3KKTy7yh+_u(dFmn0>UxQL&M$!(p3c&l6ur!aE5iU+ zTHWl1jl%tqFhE1*{+_VIqz3_L$#S|2#{6Nvjfg?g<&lfEB@OH1=y~KvR2|SY8Fx9n zx~wE>NB#IwpRO8LRCEqdjq2F8b>Eld;9RHD&T0G5wFsVc?d96}S2f&A4cbBYyYp@2 zQq;Xc)36u=LI}p|z{BhmWG;c3)yOVyw5t{HkvM1m6sa(cNNy|~(~ zF8#TBzGpi1TaAR#X$7T>t`R1z4rf7=hkjZj(A43TcaiUQhP=FwK%4Y(oPCUvmMnOItpaa+(d1Oj)qi%!B8 zCs?*6_erdo*5MK)Uo94y%=W%JBqh$RGmRLi3>t>?(Z6iLUW7Dg`SPr3~udsz-^6h6^LkE-N~Kix5V9 zpP=lfdmT6OXI9Cp3@0lvUGOQPnr~w{zTDy`mA>FeM-7O!0^kh9vGOgZo;)ze1!}^q z1*KKyz+adyXuAn58r$xkl?`M_hXw_>{=I~abBnJX{1PyVLp1*YbFvbjiT@~0(TAo< zwg(cB9t$tO=Es+7H4@0OSRv!+qKVB(WF>+nsHr5+PB*A`8E$r{i~UWqpxYnX11wNM z%tY-WPC1MPJR=4GU(7YC8zTXVE;y5nTY@;9f!J?mHz+FxHJMhV90JaDnwD(4vc#2L zVL_FFl>+wlaw*@{>Gjn@=rHhrp}*5IyD|K$?aMF&{}PM(Cpp=&>6&bRv;m&yEw|WW z@Zx_0&fIDFi=>&$?SMNT1lM!AyOpt|^gQ8PL@mdpMJzLE9Proldb_zz%g&)eRQWn= z|7?6SS~PHk->XH6GaPQ|(b5T_D|tqXw$T$j7^&QyUQ8F*01hCNWTdK}k!uFtagv|{ z!3q;MJ874`1v5AZp^W{`SEF#oc%fARIG+38uD4(@7@o4Zo41UUEhay$2I3pH>Qm@5 zgNMkT?e4}j;Y#9%9*{bCMmeZ7AeAcoYf|@AgoQXNPeon!}(&hpF>k- zTUo{|=^JAUPu5NpGHu%%PqZ2?3OQyRFP@5BH^E{ZpLRN~19KV2mq1!U!UhmIcIlqo zK^UVcOIrJ?I_#yh*ssYV8AidsnE%hA%Gi3NQ$El^?O)m#u)4qxk&o5+da@Bb*^uEb zbRo!%^9+rcqcY95lXhE2H#~?pD(3ifjk(|3u?LGmq(R#Zfhs1wXR)N~pcg8O8-$G> zlZ9isBFrPxa=*qEyhiw7nJS{nr}T_)Xs$vDR|Y-rOATcvupv35e4{TzP-|i4%f3AjUXQK7gA%&$M3^@iE@+6rJoI}s>nIH^tn*soe@X1E( zh-3aRAgb*B7>0o^jPOp-H?S8(vp=sdf#F(!nqW%_z}v5E1YxjPY&g3=_4@5i=HS`v zc1aqHN@@P?1;I+^V52>k++Q3CD09`SZOAcff%^thh2IQUsId$ldlpC$-#{Hsbkqn{1&Sv)A`HWs?dbaaBux z0Wfx-(TT%g7v2;V%W;6jW(sVH1y5A_Z{su2RLEHIre}VQ6`4s#1pp>N3vuZsvj(Rk zBlCi0!y06mH(8e?ws6rei07|&8LK;?HHkn9#9pVHkxG(jf$>6^;!a9*Y0M^NoA&gN z<~7CrS9+UNQ}_o?$C(2VmhLa`zUtlOt){*GCo&IsiJ)fof&6RxS;{LI08=$Ae>ZfB1-Noz5xrZiAc^18rUIefCI zi9AU({avCKinAiJDu~YfO<51~ayT*^bNeVD-rR0vp?R|`8Tt}MB%&lV)-v4BUSBmn z1nii$vH|E)>Dvd~cWU04zNjnjE<-$Bl{gt(s(jj^H<6^303mI^d?CLD^t#;Q1{Rnr zMTg}q@JP8B_qXQ@kNRuyA&E1WiHLtmUhM1F?m9FA9LnxojK>;y{xtr8)fXz2J*OHb~FG%0gaOYvUN!had2I33G8B08Rgk{U2*m3_+v;=4@mKe5VX- z6B}02se5m^qY_kjZltPPd%w#_53Km6 zKPnLN_Ao)QYZ|UNCvH_wP!QxM%|mR*0?K{HQTrzKB>}s?oWj?}y8V~U753%|PMr%p z9i1qQ-Yj9JPyi`!M- zSs>hHul6efL^vASfp;msW6)U;4wd-{ijpoXt6$zPZ1FxLDhpc_$3+qq#L)LNAnci-om8+( zA8`HM-xeDp+XEyE?begxu48B*2Zg>~S7}O7R}GUXny6WP;huau3aEo>fQk=3o zo59ZO9(aG^ai)0(=042kKTk)a4dgujp9qVcQVNup3So(T@Avi(Qy-oKpGf88^R}H$QdwFP zOVTqJWj19mcp{6zFKLh2RB3@32rSja%w)L^S zY5iTz;c7SIrN+5|E_-O&oL?ssa*8PR#Md~gN!r{h8M91e%e&l|=A z;OQ$25|3LF*0BRun{vrVcFb{$2l$d}MUkXnOzj=6jsth25rwyrZxk+4AXt?%w_lMf zMYL81D*%r#8-+CwO{bAk)vlCcfBr#vw4joKnF71QNAm~ zXbCaBq^F&f9^`&HXAUWG21gAs>FmPWq=5ySQAh%1KT^p$OU!DOqTL+wL7Of(fUfh9 zE^h-M=Jx<ED%n%pO-@K;uqr23Js ztrC7Z&1fZaUErZP;z`p@i*21&k&7H`vJxB^?Xb??-xpmADbTza*#sb3S?iezpiPvh zOSANZZdYBJANA)P&R+fw6oD%eo%Y7CM(a0g<<8F%#4g$@s|fy-peR4d>h0 zVaxD#?FL1-(Ono4M&S#z0d2}7h~&NAP%@$t*DJt(+b%iZWC21N@O_+g9YJux0YQ&J zVJVO6fMHd5>=-dIlA20WJx#ALa>Rgzt?LpkxT^|!3#qaFCBi);tAdQo21-4=qt+dW z1h%9>!^1Vi5esD5upumif!&zitL135q!!bp58~EW_9`J*0YJnfxcdkdVMClBD@5<| z>fzz=7^tVqHi@&@WJcwk^G@P}GAM2VUKLa@zED>r72KcQpdR{k16sIdvS6O~&0*)3 zruW0#%zIMME|6tP=&j=g`tZpvBE#;Sx5C(GCuRyBYl?>y52 zk6#$N1#t5!dkIvez-Bn3s&cOme9sGN08Vm(gvvi?5RdMb(8aqeQGo@GJ>h&M6F#Q) zpXD->5JXNOtmOL@54nnUnQNSX`z9vr9a^7|2!qu`sLf5w)B=-P7~~@-CN!zdp+r^C zqfL*8TVWl7Xv8I#!dz+$=P=4Xbupc@%;;1A9a&cVzT{@v)=Pc>dxppw8G*RDrEo#u zJlD8gbIeI0-C>__e#C-0*RetDj^I9B%JG|3WyjTa7-UPB&$n1R{JP%3X=BQL()5ns z^OTCNRY&<*&ymW8WibqgJ})W|t_7bb+gxG^`ajsaby8WB@_I(31?}$goG_vk@()!w z^l^NqCU*V*WIFZ|CXs1m`Z9M6ITIEl9^2uZou4K52@IB|{joeRh z_BBN-$3jcIXxE1`B`-Y>4w0-o@UjCi_$^Lx=z+n$W|1N5n+q#fyQjEgXJx-q;8e(FOEH?8)7GAnw z4NcGavkg1MMgjIP`w@EQt1Z0ShZt4od0}TT=79G>#*m&G)th(tt1sG_A=1fMfVc1a zW~0oz4r+ zK(Hq}Gmn3er?9SWMh?n2N!9t}yyD8XaMJW*S* z{|6)86DF4!Ru=d0ME~p&TMj8z%6-X;JYgTm3B-wlj5Dy@L0UZBjx|>DX89*0L+?}J zA@gQ1xR!{e$3UNgEAq5ZpOX8;;zd51PV}MR_M<`!cVM1}!y%1Z0XePNUs9|Cf1F5x zej!bT6S;hRZ-0;tj>qD(nh9q#KrOuJ^j&R-XOFGb;C6#%JfNV^Ty=r~Y`=sz{iKQR zw+$sg0}T$*`_ah|d(q;}pPx7@JSfRgc|&{N*E8DAq$&$ztxt`k1O|H?q!tjteRZ@; zU{`}D_Zp(x%{m>}hc(BGjEl3d#Ag3L~P?591)?Y_RnNNn8I?B=L81~mE zEBSZOYQ!qkH4|ovHwuqoI$C&k)(F176EDruhQ7>riPM2P3|>~^ zOO)x8cVH=bR+ID9rXl@(staxBpZ5$tqqd8e8Zd1w_n{hU-itb%+6gTdvJk0eKVoBX z{KJyxB5^zhs?1JCENwb+jJ_V?h82sd;W32ahb+DZ|J}20W58;O!LRHX_!M-Ijay~D zd%dJ|1PTlHN3%=(C%C7mIp_7tA;C`m-XRcA?EVD8TWRSvToNu(26>d8G;s zW@5E7Zbx6zA>v|{S>C6l!5Szl?FX0ZCGmG~?7xE};vEYpn1!EqpoNx+cRCpGM{@T} ze2S`XNi32qc5%N~Yr$7TD~!8Ec6#_iBl2;LVBOAU#~`5;b^D!j94-m=Uo39_mLVf5yPjk=iBIqBT?(s znm7u|=&aK{w{rnc;vj@R2ODZ{5cm_EPDoymZf*`ax}Zz$i|vD0g@^>Z;$jFYxl2EYOF{yZ6T zMvF>daqI}>&te%*4%$MnhEsb#*$9$;#>iM0B28`Sv4=;@+ZysKs5dNM49_rV<)p}~ zKX}L!b>80_WK+^x!qY)jty_`{jd)zv@Z>oiJ4OcfV#P?ZI z86xnVXT!FazYwqK^5M+L))I$6yMUOsm)DE5C=%RimJ}y3)f19mH=!Fl%!Eial+V+L z*#ZI+D||WbF9}7=0GAUl#Tv z@pfhI)?|iymo&5}F%xCZR(;fM7aUUtkWT1u-qs_ZF!Fmxs>L+uRZBH`-&}R*@7N#? zylB0|SeFe|g^i!nLY<9k9~4mc(~D_5T<8fyZeaW7^VvG(g#{8`KWX>7Tnm>2 zjRm9%BPhgVJR6}q2|;{`KXM)p)hA#EO)l5Zp0y~}?Z<2b@+>G1te`Oaab}E#BsAKH zUW_8VIHbHr>}N^udHaXE%BOImSQ%(bBYz>wagG}{KUPt}XRYM`)Pz#)7!5M-t}mfP z61&(94K*3YZknjv%y_^H087wBJi1XJu@H)(6={{^e#x6z?E3>Q=vP9{b+ay)tKmF5 zOpiA*095>k4@#2IG)toCyw|HiUdX2TaK9pDW5fr@ba6{I*C%bv@^+q=;;iqJB$0Jd z-0|!F`f{u`gKYx&mS(tZ5wuTTa|x$qfQ5}Qu|vI4$v`?@rXFRz7fUSm>rH|jmk4`- ztA57W_AlTHhU_1}t#fZriClp#uhKYsF2?Bc=VFL1AnhwH?BUD`h;&#YgXTi>;k-s7 zjJ-#|^;i|Wo@@oLvC9(HLerM^Z@(7<1u7@pGCY(_qzo|H!u)qU%*h0;3!V&mCn+yJ ziTj}XiuAWQyjC47@96eRL>-NKkci0*c+O%wiX+5Ez|iO|9t9q_MX6ru0vMd<;@_-7 zn^F31k?RphGN7^j^KL_21{-$?ljbivAAkfzHYa$glSO6->Hy5(>6}VAod{X=WIs}5 za^cR{AIAML5QVKfbqA?!(z~~gv4h=M(bNe);I%*Y*^V^s%miln7v#%a&EFqX6 zkJkcuuep3P9|kl)m2XG-#K(kK1k4~(h=*+3wI8FCW_!MpXkn_AififH{-D5xyNb%v zi6JXX@TE|&0iOKcj~Lg4fH9CwaGb%*-=1=CMQLF3B2#yo51JozMLHVwWxPPV>0exm zjy3u!_ z*&1%iAXs*OaRCNApTK(u>PBJ&k5bL~a<_2H;D1Xk#aM{k=)D}r;J5pTcst4V{FWH@S7%yO3+PjejyO%OwHcS$%v-vc9*<3|=O*0}Gh8DF-|5W`tQh#JJH; zSE{Zm4!5++gQ`e2{jYDAf|tpZ3uSAFqn0td!Is_VQV?O&-#E>gC@islZ1;HGm&*tM z?BBI1+^&T@DQ>9yB$P`ZvqQjcbKFI~70r0%(74I_;bw%yS`MyMM7-!b6%b0jJC_fT zFGFowle74hikt*OfMm3}&(~rlSWJGf0KJ+Rh+cHy0Rv=LP8!}((Bv6B)Ud)~K6)h_ zfgNoU+u=>TtBPd4lZ$LAJ9NMVC`A1Tl&MKnL0%!v*8xYnB|HL1S+-1bQ{Ee=#<6&T z%~Tb?(;Ik%@-E@Qgu#4&AA!u%{ZiIPd=&u&m=l(UxJrc8yoiQK)F;)mDUr)qNS$E) zQ&)LEUSx_)c{=60gp$)ZB9}DPuo{O;su{aqb@)F_t`53EPcuS#PbuhP0D%~AARBFy zd5>mAzo5L6-N}KjBKIT#JQyUxoIu>m4}mr$;tj&+`{ zQsr5C+rJv(a!}5Ldr-N|Yjr*Bf-Qo5PAjAGftgdxP9a;s@yzy2V>z6E*3VAw0Q-+Z z$rNV)PQNl5inJ?`Av=*7vZmzJKnL#hJm4#aw9~e=EyhpX_4I>;O)FC^*`^}g!wDQi z+bj0Kt{V9Tm5JRfsHJVI5A0FT#l@Rk*r>xNi?AjdZ2T80 zjz4D%40nfQ1;7Ihz4e5b+q1J78UDbIE~+D*#xu??|L1uvpAM0PAbDnDT%Udm%Gu==0vV`7P`dbVz%r z=V*_v(G(5em2W%Rvs!Sy;j<`(A-Ui1QO;_Bi_q0Cnjam=0DXmSzlmW|I@%ZaY9Wjr znsxzeP-WKP&QRRW8yB>MV3D6~#+VD+%|Q*(Ub`e*jd?IIriMMmY4TsDSEN7cgWc3; z+q#;uCNkyqJZ%kf9e-=B!5ClWbAGa zSFF@*pjHPC*XLChctnZoMg|Gz!(sMl+i6QGXy^Bb3*it;^7<32Y0ESGz+JLcDEBaM zs3!}8OiZ5?__dqYp4EEn=~z%rMw21q^?4sSAl{ab=y{LA1-}jF9S;5_-tMb?YN|=- z`t3ndBy8Gg()WHlo^aezhwF@n&#Oc-2=YE?o>k^!bcAkoROc{IKxTJbC^x^}crF=z z>gb=e1k3GRIzxeRGxU#u}=B)Kg$H5lHtG!5$t!GBmU~pXdw7iuJes4ua1BxH3Wt>lRCIz*#|> zCuAq*Nq`DeE?|bZWIbJ)P-YCnNI_~5%UR12S8)TL3ab@V6WzAr^RPnsxTF-o#rJrP z;IRLcKusCv8w9&$(s4SX_)$vVxJvr0d;Vkj0Z2|T?B&tQM!EU-H`~%$1RlS_L4!5$fApX0s6Yf{9*keS0L7 z$Wzz`XHp4B+j0r}dl7@dE$y)%3mOW)F!|h}aFLQ!>sP*wmKZb5eP1xAfTWN^r9oV=T|7((SBImk-7AeW|tY> za*uV=^8)>{U^?r2pJuR~^D5N9^ucrfWLmLB8FFl0I+hT(9hh&2uOsA!erMhu`js63 zcL9Xbzi&`Jag-nr)V4rC(+aKL1BH0fGT`bY@9EF8Ay*^=L_`|XF5l0_JSlvW_@Dwm zE*3UcJ)f-z%StAR_-HzBl0kq*S@{3v@m?)7C1}|C*_Z29a)7ow&xU;wZSpA=%=Xm~ zk;Q2bIoXt+tF2ItQLd0ABq-;9=~A-^>{iyJ-)CDHAQ;Wmm_WabenQ@*WioJkQT>8~ z?6vkB%shlyvBK$8h~RcCOas(Iq2kG?fS?wCHxSqMU&B=$KIzU~lu~X5s|%b=lwdN> zPV>3q`u2D>gp0zPjhd}dgwc+0p$&T4)Mu1w)#Z z-rBA4T`uJ3rNML*4TfNdNlmn=;mT{9gp#C?i5P@t>Wu?%DE~>r8)gUW>h7Bohdm3{ zNJv|0njfptED!GhyJk?hC{Xy?7uPw7vY0R`TKm4YFBJ*K{<0Q+=Op1qL0`lEFI8FAFfOklQ2 zfI(e?bDLtW%bf=qr@K%t1sekR8c&U<)fJkZzu9yhB|!V;wjVmC5+`r9g)v^oRTd4= z&$B_zVj7*XUwL_saLtFKeEijzbd%>LhjAfAua?uIPv}fRoQ`Oc6JXkxMAqlHg$*DW z#O!{y*glsu(F;wMcR*K0SG~ z2CF936;<*1K5PFVg1z{wac?0iCf}0q+(7Ms;rdLVNVs5GCx&!m)`tm*?3$yZjRV}F zhoHG~Sb1ua(}hKwosW60fJNKhs(NM_JC8?9rU8_LnIf05{BsfwGnXQ*lrQ4g*dZ+I zyh@o_W>w6Ex#|7cF2ReqPhNmjprB8%yc-D^#ZNK2u@;(Ml462}7)!sD<<5Hl`(!2| z%gr`d!s)mRMGf z9KC%&RA$mimeFLlT9pcnfmnN;xDZ~8wjwkN8k6%DBQ0_y;VQ!k*`08<=HBZHy zPGdZTtU#7PY7@})xlRGuSyssr=tr8ptJN(sF9OGFzMgG|5UU}{Kt#nGcrMTJ#*(WW z{YhGP=evnaLUUb)*8TM+<31q{MVl%#Nv7c(0*f2ee@VU3+ z-49;FIXR8bVX$v41MoHC~%aD!$u zu*~hGFfe;5X&XEE_YNqzMIGg|P~((&drF?**4 z9&mGX2Xkl!REtjBL$%6|D3{zX>~Kb^2aFhmD0gdx*$0?wlSZ8BH+bAEYXKCs80S6{ zlNDX48gXo zgg_t%2CKWx!iA1o=Gyxjf$6BVs4tH&LdQ3W%s#vF%3d1j zXAsl4$esOYi9SG(MlkD7UoE7}eupgHJn+oU87S^%m_~{8{zad>F$aKOI`3PJ2@3c@QMi@|WBUm_7)lA)KRkCx+5sw|Gq6lUJ|^=p-&qXA zIn(ALuG4uml)^}ZI#(6SO z3%J2a#Ncfg+*aVXLqrwO4PmC~Dqr?5aQCCIu`xLL&NGYW(dzqsm2}Hn(VkXH9fTttU z6d%Fgw^;;Lh>IKR`T<2#s9dU5~Qu?e$qcm+>lph2pY;#h6i} zZ6rCudGjF|Pckd%q&dCZI|Q$x$sIm&e@#+woBEBH-%wS#*X(~e&YC1WRXmv`kt`>c z?kzVtl)nh7UpwT&2b2if1R)Ck0rZ1$*P>I?UBDL7C_T@{iA249X4!#$pKIHX>Gyu5 zeWvh1@w2nDDiZoRvfw6bK6lK(Toh%7j^xk&D-_q@!AOc31kva3$Lb7XQKC|7SBkSe zc?9Lu7ywhe_Ws-w8r-K{sEd=NO#hZ@5f41a}cIR7}v<;=J6I+`_q1n z^*9`Aykls5yATxJrV|^4!ae#~%BorkKrqxO`RRZO@5fg91q`5c?Q;5_?Y_>a&~%;) zeqi2-N18`gYe6fVj_Mn+Xsfc^uJksp9 zC`tYO5~cZMM}{D>=G~>hGLlIG8XMg)IEaxToVo4I)cL+|EXDZBDQTSUoAp_wR-MFOU~CKF`%)oZ$8e z0XpaRSzgiis=%d@*oVaFQtMF126?U&&^-8}sezC4kfYjrZv=rp%dM@cXTNU!#*rJ= z3}8YK#6ML#zE;p8nN;IP`@L3?UHWgHHouRfEO)K!tdptvR-qr*=b51+Q)9P^AVo;R zdV4H?P&e@il!g_(dP}+Mu`WRqfvfCpC)GQ|!uubp&rK*!{qeQLpB+ zlst$QB92zKe@Ph$rHFVzqdotGN@2+OyJKbL|Df&yeK_hp09qU*G@&TKJiSL*Z^Iwo znv%RsQ2zmyZWS#_AHFiYxKl`@hae;@7~1WX3+GvFYTG3E0iNalce>xPM+C{e#a#H| zGz`v`9CQQsRlaxkHNa^}wq_uy*7J&vaG=c%cp#_B8=wbgm5`vE8BD6%GnK)C6_;47X&oL<0s(y!6Nx(HCM){$rPH3B=IF zfhnENXJdT3Gz~$haUKjLSVHg=_VPt3eQZg)a&|;HQ6n4lJoLjG;WOmI!$27g$#GT# zgpHhcCZR*Wa5<3{UiYW|bFvk&;E0~P5o#k|JFp`ywS z77?(gNt`Vgwg9_?HW~Fu2=XQr4Ea{8g;4!&!=1^hS!prWmkiHrHR#IG2p+(}E#_P9 z;n3}cf?`=PEzyJU{98)a6($|H(C1n$T8nUlvZ5Tsw?9{JQ;s<(gAC6dAsQz9i7)xq z7jmOVYoP_$B^?PV{ALos&Y9}PaPrPwgXlT8IHUEsUNL$711QC|KN$(Gv*e{``=f#^ zH3^GP=WsIv8#2OJ*jA+8pW7cT4Ey*^brZx z;dBPrd0YaY#SrB$wA$qf^U!eL+9dloEJZqe+4ec`HYcX$jjlsVm*a)wL~6ncV!(3j zWjvuv%q@c|ZG)puOLWZP%pL5z<*Knz>+`I?sXi2~pGxah5zZM@y1Pphpsi z@gOQLXl!{k(@<+2KyxsHZSSmq{I1{?gYi7yQp7)NAy+VlZH?VUQ}!#n!y2XKiN5bU zIL3+~V~T)Hc--sYlkB94-kv3Z+3)su0lR1gnq3x5Q`&2}Sb>e0khsMl+npHCa)2Nw z?#y)jT`vIE(m;C(MC;3p)RqfDSr`HVaz@g2?wh$lDa@=3iHq~lgnmrB7`o9ucn(SE zokV>ecmzY(SJGsk{@8ZdlFyrxK0IGe**Qx1Y{~Z5wHCV?OS@fp4OB*F&M4a|?IxlOZR_{lHp5I3 z=|7yV(4gGMs*EE5J#NeU!2w40-7MEDNsKR=Auq<&3`N|Lnqth4d*_}`U4!!Vp%{Wk!~b5KAi)}YbQnKFFe+Hm)GAeJ#PxSo{MNhsKJ zlhWX!TZkrBnttI>Tj792s(kcm9B~=l0SJ#|td1-gS)o`RatxodBlZRfu+I~esa>fN z>Bx^f9&nV6Io$6gVFD~h#|wOM_clN1Qp5)rtodVYU_Xti8%L!BImpje0-%pDx1#|_ zy@Cnk{>sSZIL&~!z>2=>MEmQgVu39k$*Xjh%Q2J=fdHyLs?E6^-2gd!Y9uc|DZjoY zd1ME}PPpCguM&8y04mO9SvIn3+2;}!D`i{;sHGNEY=4z9ae`fqmB~v70mp>E6APA~ z-C3ZV>uvv7ud+%o{B;BXIh!~ZPLfX84KLd$0LigOkG-djX)%)n4_pApN0+D^c7iTX zLoH<$Ddvx@y}XVrtq+k)cHLm_0~(wCe$F=v^*Ewn;Acse6J5GEZJ_yP>b<;{%dw_} zMIbPHjP1rP>dUkfvNqLYpT18tEToIW1bTcsCrB_O(pb;9WFS$4I^S?GQ6vArkcW9> z_r#oGQ6dStwo!X+l#y8N7Yv5x^b#Bbs89C+3N1QVoHPfQvuYq@qsrR_W}0I*Dq?P?d7U$KW&A+ zcc^`L$Vd|f(eo~=US{vWeT!EEBJ`m2mFW+?&iMQnTV<5urL8;!={a|S=mbavCKPwi z#j{Y5f%=B{%iA9j=3ZcHfQBKPdPC+pSG6cZ$T~7SLcht?cbKBkLPzN7EB{1Df?2%bM66&uiH*W=kQeN{@sxG3ax<{?n?#(AD(_PSTfgv zayOb=w`e^e5z775x`z?2e2QDc8i*nag)sawoSN2fWDJcTs62$Lc8&pMCe}w8 z%n$y&&zla>{TRgEL1;|ONct@|jjs*<+vsNW6W5SRY)tx)1Hymvp(l_2aCnVV07gK$ zzY&0BXH0)MB`6~R{*@fKG$B0y+8`?Iw{$M~mk4_2_tyYKg611T0C5^l;tZanNO4Cn znR6KwcnAzxX``-}CAOWTh!-eKwtNma*Pf;$U_f(lbse;`FToQo8lreuIDPc9D|0wq znH*(7o{5&X35M+t)TWup?&?Q;1HwTG1xvJ7GXu`!jEL_S{jVT>n942ki<2I3U^K3d zDFm)W3>QVb#CrJoY&qt;Xza@Y7$OV#3D-z$f?k5(=m=yWvr8U;c0M1FPc}*Uxk)Y? zj7FcbGnl>mlveL13G*lE?s&$Kpq+v1753zLys70v{t0~_Y))6FP4aoRETzbXA!LR> z{&|y_K{4^MfPyXQ1J23>E%LXa$OUe%Ci7{W1J7&u0z&W8&cnun*=@b_(QtAs1*#r0eW4)*LqgA33i|hZDWUXZH|&kKni^Z95BO*i3eJ?L@6C zGpdmu^t~m^s>re100)f@MdHhB4_kl=P{Q`h@}wC-{4CXJMx{>*3PUJX`_(%kjl)Wi zu~5IQV5B^RFs=aA-G}UO7|@zPX=#_&fU)Gb#lQ@ai5j%Ay_}{bj=OaD7jm`dii5FY z;h)5zuQ%nZmVj3IyMA<->{3YEA zI#*<{jpT}J5>oGTK)Q0aG2bsUlu1CH!|G$ZIw$$}31M4EL%LL&-5zlx)W#^Gk%vcz z{d+lk!69cOsa=5EF|?i&ozvx0F43Xx@P9DE$e@BCZgu_DV+aM=P?uu#2OT3Fq<_Xk zjjEinw`99Nk5*u?Kv1Cv3^7XOP>DZ4*woJ+&sGZ5r?Mre9 znkRoeFKEbZQU_6nViH^M`h?<*NS6nlkOYj6Sjho*#sTv7g~R}pQkTk+V)~TBZ7ydd zaz9(FflFhOHaft!<`7hpk`4EPu~zYHXd}7`)kpFC{U&3y6#=U;K9Nkh&!gdeVIN%? z!`xs^t3+sQf>%KBIK5W;2bGX2*gHaiB(!HWOju~I31aP2BogM&$REXn*J^QR2#hrp z0DvE81b6ha=lyjBadA(4qh970xOp5skpy~;fk_}U$n8O_+gc)7aI_nwSBN(UV!duvpj z-SPPo3XqiF}Q~_UtZ)kY!1U+0#};1Ibbxjo7{$pn?*idtPT)D8gvO0 zZFf(8ft5!r%87&q#uG3Pkt9CPmh9b1(Zep!)A%KSeL6jJzgLU-kHxNNQSE7^ z-(cICaR7tuPp8DMH`I-!GuDUem-+P;$&xVIK#3Bb@yzZUiqSVV0~QPcYle}<&xsX+T=--O!A(cZpLv|fk;Y*#DIf0 z3)fB8Oe@zHQo>GVn7?v4GJ>{B0?mKlm@qwf;6WJeCoUsQ1>zhYMeT_e)sYDS9==@zFl@dSVkQHQW?>t!5i z@+2_<6O&$dP6Q@Eot&x>qfI*I&Bs=Yku>Q^!h*&pj_LZslr&{LpUpOQ2;96Rv#HAf zrg`i_`Hs#!9aq0`wx*9eGX!sKKaRJB*03CAdJgxLW)1QSpUfQ1m#)znnpI!&oOUr_ zcV!0z-IPZ#!Eq-zZY8T9gAg;V3nx$E#ArD}6I;D{3zpOe&HOg*E=%&vJZ@8N5J6kx zd{ll<=z@i@REz3a&YJ|efxmLbf33CG9*HY`bO_lByD(cg&(`tyu%O81U+0p(+RLD= z5L4<8`)ENWBEdi+*Ty^vhO}*NA8j(^mcDzUA$T_y=#4SDh4Hk$M5jMtIaKHrWS7Yf zc3G)9#24cO0>19L?OzT_24>yJ&ZV!`;q~RhR(%(Y5uFZnGn~+OUDH;r&C0C#O@xdK5lE!yPJClZCw|Z=w+rr<$dQY9fF_sI!MqU z&QJ0`U4XRG9PjcpN8EAT?-Frw1U+FNrT3=`6?pBX(fh~C65Eo~(UyYQMvMYyEeB_0 zF%4n1a6#qySk97&cq-kgthgxI<8If5w6_Xn`z5Q~Gxsigoqn;bpChZuT;O+|1Am3p z=yx49DGF_Hg|Qu5Ql;?gn~5Ztj7g{E#bDWyd`)K?VEN1EuMW*-XiHWgvrq?B68s^0 zag;3ry(BeqBu}W}U_y8rmXQx3#33uPnZe!m^IVK1p;N)|&h1J36bveOu2rSShvI8? zbc=<@Of6DDye^N)cv8T~!3-Is?kiW0l}RjnMWUOLw7rMzen@z^$@v23mgcEBo(F(0 zdxJ~e|q`tc#Mn~Fb8|1NAdw1x2&LuFZDVKr$l0l&=WX|R6@VWO?}xy z&WcB(uhOfH&=SK8+UqM6gN`7nPxuD@D;iS#lW4 zy|-_GZ;mZ>#7e`wN0=@oWIn4&rBJSMuuPqo+0g{08p5S9wC>JEiSBd79x2`17Sv;l`mI;PR5cFJgPX+69%)5ua*{_QK6# z=PJ91J)s}o(U5%J4b;JEeM)w zxp&&n=mVr@PC_62PY-BE0L7&|-2erovl^lz1?^vWPW^~#S5#RvB}S?7L0;SvLEJy* zV3v|X5#9~QC7-K9go7y1vaa;6i6YD(@t(?lIqzX={!?>c!?9odg>&wcjRSY$X1+>B z&iA?8@U#Wg4<}@m7ibxRVTjx(RuQoVym*};>BH%cZT{Z2@p%(p2;r(JaUSs!v~ zM93LIq?s&lAjwWSwlg; z4~M)1ktPmI^j#$~)#rhmKb`*D;WeNxz@SQSR9%rXxPy}4S-lNq$ zL;bDfmp8c45FZM{!ZHGkj`kV2Hiq^2!U~ZAo@<(HOruB1x}iUs;1V$`J>iXTfZW68#UtxWJG?ojKW%x=8Dd2HNKbr&~O{48= z2|Hs6{qg<}1Tl4K!2)(z{_wRNvRUD3L;f>UV)o~HtpCZ&jFLDH6pPQ^VFC{bO2GFk z8k|>&5^t~}Wdp_?3=}8(_Ge^HOGY7OJH!h!*@~K~ZJ~CU#Mg%8E{#)HE02-}Z-6kJ z;x|#jBS;Odfz!w>lKq2?2R5l*x~}KZYW)XC7-{%c~)9 zz|i$kLHk}V+9WhT5eZ< z^5W84$NSsG<5H-z1wmZ6Qf>=o!KEMyf%5viJIvg9$X+!yP1T%vEcXxJj)iEH$F=Jw@ZMXwSvOmm`q0cUk4$)Q+18NFK1|eJ6_7t zL+mtoi;e_LxX>~!1#MPVe=KKdT5S0`J2;(*??*lvRz;6U5{Y=g*utM~%!VtP*j%)t zEpPa`R7n}E{D~5jvGuwJ(B9JTu!5B4P=-6dWFVQd6BBsEd{upqw;2xCg-t<}g<1LO zsW$q$R!=O=?Z-jx+m%E&wjc(Nm~Kw*y%G`ylIW5fRRDxs&t4JDnJF3F^W!Db5PT)i zV^cx6e8y-DRia)7?H0>@kgWx!l|O$krt>Hx;R|C?>zo9p>J9uaH|w}17OpFZ|32og zq{~9u3Jj~#if@)hK?z^Ixifx+FuTvLynKEJV`yoVpT+DdviA$weR6ox_o1W1y8g7^5{hVDpeP9*W{(pv znF)+$B~}7=?X6J+fw>2@C;NBiV2_rgN2^?D+0JUl0kEC(oiP6+Kj#wM^H60nDn)oU zg6y?B(4MTEwP@@7?k`M@o)-;+!65N`GkZ@+JfITPj}*=SB-h*bMVJE%TpxMtKM1~nP|GBLj>VgY6 zM5iDdUoR3#sL6Kx`68z{F>reF!5UGcTFMDHnc;6uXECvjEd3IXt<3Sg9f=|_Prow` zVq|Jp_1((I$ci)J?_aZS7*1HoAmm3krN~m6H@JZmcuXOTC z@|q=6a1yY68gCOZHnd+=J?2MEAf>YC;TYqi3rr`rxEv*t85u)ju)=5Z((z&5DE}3a zGuQj!A_@?CeCT%J9*x#sKMw~Btt3spp*ehIu_)*+M9|RXcwBCF2I^0xO}WF6_Ty+( z@(Gk<%bBZ49N<_?Z+JRI$lQfCl0Dkj5kMQM{`Rb}ADQvjv6s1zz*rN#)Jk7GO83fM zlCU_V3dDlo#6H%Vi?x1H^yR0N#r^`~alQ?$vk%h`SkntI!Ae+%-6jB%>WD+4>J!J%w=5Kd?*pu|Ha{7l+7g@}1xFkO;|- zNkWba-6fJ1v zcRw^nj7^#W$m=aE0nT&So+sW;tlZ}ICPu@?uyf;1mYdI4nWI;UcW9vt(j<#?-Wgz5 zs#Th8&B34l*(Eyh1K*%SY-_!rEq2*NgcTVzq=ybS(axG}ZRqos86hp?Q-1oH8(d8V z4g2Vr6mbLE?-3kC9_;KBM1)ejZ=SOvNJjEzyVESlT0lwgZujN3c&ErK+Let2j&z3d zVJDA}Qv~mVQR6;pno1EW{5!xI<4TJjQ7bHgnVZ6|r1@G7Lsy3zYat2QF)%n$3zOSv z5l2Tn|8)q$d#zk~B<~Af!*d8~0o7zVRkLjLAb|dd6e~~=_49G?eryyxJ!|mY76Pb9 zccS~4&$}!FFshM^+S_MaR_0fTXaT-zWUAkll*J=f`L;>eh+^$W*{Y6IaZ^Y`R&@*WFc zunM^nz=}FQv$8LMYIGWIkNy^Vp1<=0-I2;g7|w4G$jDK%Wyp_{GvNS~ud9bm?)_S; z2Wt)b5nypLLlobMa)$)}lrIj;XD#$M5Z{B$hsoe$tyIH}h{-D5%*7S#U9Ewj8huzh zP{X;FR&aI3aNw2lr@HgqVVO*3rt(`ibZwobg6O4BD((Mn0uV2Hm8Tg5V-bfqz{bH8TYLOX+fbBUf;JeRS7>7fQ#^i9#$CJ?sj-@r(-4=M@R<`Cl zA2>XaD|ep3 zBDnDE`t%W$*%+iV+CuJy?&Eo7^m-UbqgZ&_7|UV+HX5*BTl#oTq&r$EGX8opm?Z?il3HG6VQXP4j&t!0zcV3UA%+fWR)Jn%eS#XqG&=&{3goV*wmSna{{qR@_C z)Yms-6vssUS8m)TE`%1#F3ksgQzUsR>!l3m^IQZ>sR!fycgBq8`Ycguj0hu+Uo!70 zXQ_oj8QQ&2B9Dlty}~L7dV8xhtH+}X#cb;LS~LVFXjU{%52LyLCn_cwCj>CN8x0j9 zNhWWWO7wZ7t*9!bBfg~Ui?@~E)C+DvN2e1%IcE?iE?PS8J5Q(=RYsBqs6k)pNq{X0cSo6>K$Xvo|ef zhM)lR3EPyW89aMJ^}NAN3&1O(o6b}FI?;AogB?N(Yh&j<0q>TR`KF9>Gs(iHGk6Xe zW&Vxf^?x%s&;F>|81wlbG%bPDaDI)wTp!~aEmVym}TxXRs z6BSZBNeI12(nE-B{V;W@<6%8lj3*$2zIs?Q$Qx1g<$jqG*!I>tBprrZbUCphIQg&u zzTiadpRWFVuDOHfk_ccD-Kmd5`|8LP(*0>7Vh*=!lH(a&WxT{mAYS`ECJ`YQCf8<$ z%#PWWtR|GQ3dw)EfCwn$L6fs!Bk;&TECNM!1>j&x*RFbU9FVgJ#+Kh3NZ|)Gq8B5Uf7uW%C!oy_u{%)iaS3{5@5ZVv>Ce)R9vfCpsd_k)S+cPIkT; zBMctcLT9@0cHh9aO63-G-Kh!eCfUMX+Fe#&aDkl{c@+^dBml_rX%}pashKOvIJ;mE@|}W@*7xsW5FW=BDJ0+(r-#Kb z$Pz2s#c(;cvor9MkShnWHg?6Y?>C8jYN%3}q=RX>HekejPC(@}p%#UyR(9vNO2LgN zlA3z?Wq}aoJWbYV6UYYmERV)R7VqliU1Qo)wj0qJezfNpK*aL)1N9m-sGxm# z+$xl%Gy-k+PxpNzVBuhjT$*fIzZ)+pmPioZ7-PaA9_oq6AYp)Z;E$D;%ZxQOa4ihb zHLm$)S`xJ)*$&1)ic1}Z`#H*8$byZVx&NN}4U?9n z-2k@KZ*9EfCg>AN76Gm#iLv4dc-Y6*Rw=`v>;dM=BB_ndJN!3YCZAB2J#`nW9phUds7y4$R7*mm0T?o9L z>&Eh93Ph6q-af7O^&j#t^n4Mf-T7u6?SWO{h8Z{b&`;~Zop zHy|$}bN+9~Q+u?Q zQmi*8MQ%I0mD}bJqzK3W5fGT9>*_I5P^pfH)uo>ESS*%z~CrE>Ipk*|Dj-pnUPSC1y18Muq zC{I-sNky31txG|^iV~iDq$~jhiV!>U%WnkmT2?(-G6B|kJ$YX-RH}*03Hqb2-CVWc zvY@3NwO>;lj)u3KMKGiv$(`pTWTg=W<3ziH(K9{MI~%vRo9NULH?t!XspN3uv1Bs0 zlYlwGGerzin456P7+K_V(6DQqh*^wuPeCmdSFrl(IS~i?cP)y%$NIB=%1l_?;L|L7 z{n@*X3jA1wLK)-(ofwj^vj8^J&}Mh7ChbT2WHG{lR34V4oEv?AOsPuJkHPQ2u{ct9 zvDbhGz`AJFU%bG7u)G1OgDU=%pzzs@Pz@|BFsE>H5esDMR92PVR(X9hz9_R}$1b{p z_`7B_YrLqzD3s_546naI443_~b|vkBNp(nV4JMS!#D2f)6u_ zp$5!RRQowKXSqup!2(Hm*f5zdxTB*-wcX4FrnA~w++yjg?FlNtc8YxS)=P{5=2#R- zI_Osf64=*A4TR^D*N;U*lwaz(0q6k$J(cd=yhTEMz1ZCuj(x8%7Vm~Du-i5uVd^L<+QjLUm4sSsEB#fSfH_kcR%05xEoIIa$>4}1F)+%DQiU(cug zGGfyr26wb|KzZGE(lqCn6o48hEPZXyg18qJ*6D?s<+O$e9p`A^?}!R)*9?cd+|e%p z%CypLg`5z9fWtA7N%!y&u$>)m%-v~+o*NbPHEartKfqK@wxIWD`*j7GGGoY$B_lpN zbDV5}(K2RI+z9;$caSYGPsdez%G~Gc+QB6!tfbgST{f&^HAgXtE{@o8#!J=Js4-0H z<^N;sO^hwak!)L4LV=ftc@U`dSK<5GJaCYV{zO=}WmQIHUR;uZ!-qYHh=Ug0qmr^O ztm@`#1OUB}1~J6uSiN;UQPBX<7SLt)JP0?|E_8xzk8rPUa`^|#E;P1e7l~?DE`H0E zf|W$RxFEl@eEtVU43jAQRQe@n@SsE;8(iQQgafyvAuW+6;P)`T29UDSs_W#~*QHHq zHBn%!^d@%BW6udM9bz+DhV6;UKWITm`2^d+r955naDpQOZ&^ji@R4j5 zb`}{ySk}*4fGhP_#91^(ck~Pls5Mno-DL-P>MLJ~&Po?Way^T_Mzh)0@$M z15P6|n6Ua@cJENQH>^mZNv%(J-9LyB)lV%C(P@xkM?j@HO(TPhx%@!7d)_uFML_dT z9LOu_4ENQ>pZe{HDMgD;Aj`B#f2%Ro#yU>$%;NK-)-h>=&ot29dn69jUMB$}%*K;! zq-gJLNfdC=18G7TO|Q=e5wL8zh>g6~M&P4V_&lf>1i zuTy@CLBsqURy+IR2;y4FYM(pOa=(Gz7ldPvlyo~lYt2jBBCg1cB3%)a8^U{dt(H`Q zeCoaM8K9&Hn(yKaw(!N~i7hWHqX|Y$WC#>D>qP~9JlkZoFOUhoyktc|tgPl-(i-h; z%BH5o#Y!3fVZw`6XaZ^8M}9xtI6PcKADs3@0Sf87N_2$bf!o%x>dNbIAs8~5FS^P7 z@!?4Kblkok4%Kn#Eu>4EcAWqUO2WgGy#A_F6L{3lZsFv`zp~4I$}TgaA%tYy#(YzMn0&)3XVv6Xc}}RAoJz zIO%u)}mO2{55YlkFyXgfS$gIinr?!GFgaFE0!% z=(ms^zE?|!)qvL8?!pk6uCqTIaURKX%OmX8SuT!gajsAyu$^8_8@m&^4U!%NsTwvMUya=XCu7 zD~2gkYy)-_eC`j&(LJ@dDXnl=?>LJ_f3_ac$%JQ$P_&QPVLLWRixPrO4-^ds9%tPN zjuONdM5xICoIC@e4&NqtIv3ou zqJ*$KTLwgdi)6*b?lExTIyz(~w1%?1#-Z6&-6Xdl(wEd~*MP|~6FkD;5M+J3zjB3g zSPiZ%luPdDut5HWq?n07Lp&8C?Jt%{fdvbwB306IUyXL%*+m89AUs2yxRxh4v;b^o zDP6@qT9%>-J^K#oH=xn8M=sO>XEQ}w%Nj`oT8mCiA9CDa4#M=->wSc?7y;VZ@>6hpfk&YH4%IYr@eNl%^v9?Xc2Ry)A3v6~#2f_si< z=|0bjmS?2wT@@96SN#V_AL*%xmBYzRQLSHUKYTQ4WN+rNE=;5f!07mS4xi2`bJ&T?8{fJh-)!2_fb|%#MF!F1)d3dx$qYLr) zrpc-2li~*2zn-pidA&$r)8JugK`kHHb>3P$cbO+_GC3(1W{>N1Csd9rAkhjn+rK7| zC`RB?%(;gWdkM#WiTD+2<_3De-ELoPQA}uP@X%5i#oHwqU?$wZ#TH)0 zsmd=2KGC%4{kccl{Jcu#9VPWyey9V+3Py$+!NK;dTcn*FlQtDnku^PV#OiZ=J{g)! zYT}3|jz7zISl_*kq?f!8}5)yVINFvj4bkJs_k4C6K=5o$G zAdZ$O=OA0+k>Yc)GEd(O2&KACIBBN6Lx9lm6(QGqtCv|Oh!-X#Jl}0GiJ2cSQo7O! za#>IAT@8-R@(wy@a4v@HLy(OFB10-Zgc%-3?O$ZJ+0P8m6--=*a8mXcd|t_29n40> zlVK)<n>Y-XWE~O z8$W@p$B_d!J+KnbOZy*`spMaaOfp0BJ+Vb_1#%nk;UY+NFCcE~7Stf2dMJ0r<1 z8x||ZByzoaBGdz@pu-??ZCri{2_hkgL1*o?OHO9-atM&>p;atWI$FB~q*KH)w81`e zVZS7EQJ@BF;m0l^4joO_3b}q#0a3fVgK6+!aSOZ7R@|v(5H}eP1KUscZKC6SmX%?u zVsV6xxt&NWn36iLN{S|>GZj$EL?(z+KHKYfpOGJoNYn-brn4Nl?ZW|4Wz@l}w0Tb% zuR3TtyvcE4`0lG6pRG{P!luIAd1Sw#gVe4N8RnYyf&>4Zq{|-0=xeoboM%cK#0|X^rW^(E^XedG@ zj=mw}^jhsW%|zXY?Oy(Vyua8U( z=}vdL5xjvUVEI53>vx$piMoOn1@=21^C_ zL}Jrk=0jJ~_V0IoM=}Yx-L?nN+a2t~rJ>z%kcU*Vb_qmejAPKajO|t3^mxi#XAmcW zs{mcmwHT5H32E342WQ=;llx8d1v1(P0~AuifRyklhO5zMvuY!!=5S)(RheqQR8U<1 z^Enblc|bHa_m>}P99)s&LuMG@G75lq=%0{B^|=P!@~6b$QCPVVo|~kn!zRIX4@?z2 zrm`DOmKA{;X8pu{^9v-Hur&>&v&4X(<O=bUcYQL-q{ zxT(1lDLi?kY~-f}<=Ro3fTZEZ!MklE`)LabTk*u)>d1-WA24Mlv|d<7hPjEOf)@NP zd+eHEk_C#mJQ4M_+B}71Oa>8G!qjg;)@?(Qz<~*%EFEqD4mQU&Wd$-06ZF0seUg0G zk#=Ju(t|M^;AAgvEEt2M>LMD>)s&HsyhVX3Yt?pdU5s`jfXdMoB!UGYizsWci~#n; z?bfarj7FTeYo8WjG0ODTo;JDwm=2ueOpYz=zbwpMI12p`+yHDNlvQm^3|^3WwO5YZ zRCu6>5y`bgGJYkJ>Nub%j74y8iB2Rf=_(Nty-yBpu`mwmc2k5Be;MEJtXW=G{?za6 z2S|=u@ATR80yH-2R2Y8IXEaNaLMZw!DXsWiESAHQ0pLbr0uyEE4(rKit~L5;)Qavq zfJpnW6b$RSy!@d2sC6B+F9TS~B`~xGZ|t&1lQ;pJ5uQoy-psa4tI+Tz$xP!>kb4CjW>Y2 ziG7P;@2<%(GlK`n77+dsL{Gsvh2-FTZ3Q|s1*RBPs0aSSNS0Yw053{@*56_q2Rib^ z+@@m49uO#TSbO93p_tQg_5DFjQ3ACz3t<9ALP;VKXd4Kk2b`m#84j#Yrg-Vtu)26{NiN!R=IWYkCnO0qpd zb=WWflf->^>=Xp|DMr%d$1noOL!CZuNSZ;=#X@Z?tqA~SJ?d^~-L(7y%2cM7 z{V=tp11Ao5V4M9`17xe(%%Z2IVJp52NsAX<+%-O}!Km5N_t=uzo<%5i;($I+?==w( zL3tzknA^hT*c*gpPFoA&!-JV=@A4mT^E3t+TV~Fk^Mt{d0QaE@S{)~l5U*e?jV#yd zs^4+?XVa8~Ra6t{p-#7CCFkgt&mym2i>w1qlEv^61Y=nYvHN;wg`0wsAb@p?#G48V zs0eIa2Q!?V+DE}30TmP}ANTiq<;ZkJPmN;X;vyvXGNJ8@l)^;Y%~>lEw{AKQ9O#x` zya&h-M`o?O4J01Uz-E2FEP&m zvLNAr+@*|JiPKK-1AmwVe7BULIa6{q@Zza~2P|x&LW}NtTlE|3up`(@D5&{r5TqyG z>xrOxUk%pDanON^CJ+&>l9b)5h#H?B-cJC{w-8Ra3GjraPCf1^ri2xa4Q!d-12Ha` z;%#20`Zb7z4&2t=Xc`R++LMR|)yGYzUg4QA++<`p1?Tc=kt#%BQ+hK?J%nzz;Eq_y zfS0?4=URgVOg@G8n2~UWW0YFm6h2CmR)Pxv7G3_dNp}n&ik-w?+3~x0`gwi>^Mr`6 ziAHgY1u$~73sVwfYU6l;m|_WLSN?pMvH}G<0{x^yjn`%k(9Qhffz!}PUa>{>iVF2O zkOg-2!LxmC|9rH3qJM#%6&B!y2U-sY*V?u^a;ug~4?k@|<6zJqBQBw)+j3{<1$T~x zV5Ddn0sWSvqlZ{*lM>Wi$1O4;Ze;CjmNs9@okUZF^nm#|Df3Zx`YmTQJa4nGRZ{Xz znQ+H|j)5iL;xyitJ8B^Xl*>AmcVU?3;FuWf@9hHQx?cJyL}vTjE^!f1?(e5N5pjeG z?c{Cpc&^FY)!5~cP6PYfxn#&o`qO`^iOjU$fs&O+wN zu_a5Gm!xl5(yn_4akX(2S3@R^EFZJbvFUb@App`KSe;gOiN>tG3|N0+2Rw3FN!XtH z*qzaoeJAjYd$b7RB&c8pfWC;QjDsusngub;c|YX+c*Y?NSM-t55|}>$?JJed5(lN( z%%E+hvQ64Pm%GFYp=%&!Mc9dBfe#gfO0tf&u#8otG0;cYgSG0ZEaOcQ2pV9|7kL5j zP6L5~FFT;uIKcIJXALGAhIZ~m=Z$8nCFm;OqN&&`cE*MRi$Au50K~PHT0DyRD>OtA5 z$>X(JN=F((mt;QE?L3`kXQ7@1uhY($JFUck0nP7HJ5^qMKii40Wseo{lw#6F|9?Fj ze6fh2vPF;FJai3pfKf_^-a6l_#gm9bi}Iw-#OLmM^WYNe&r!YYOOCJDIBeO=m!|}= zKsBfDhWkp^uiN8v&-ki=X{S|B?&8Tw7NRDJiL-one{T|k;K5g&s{@2g!j+)8aBkDb z$s7aAl&g=ZaIUPOtZ(&1JS3?Cj(H6QZEFvu-$npisGmgv2wYVKq1HBCXeGaepZp+0};Ia!?9yi=sa~}ZwxvKC-Saf)!CS`i3h-Kp^ zk>9T}o#5p%SPhV$nV>qK!|rB4;Lt*&^H;H+E>r@5dEf zpiI@4eB;VVjzg-6s3pIsML*)~3M4Y{3=ll+hV#o!rwt2@DXRPZ-tI@f1C4X0RD!-) zlHu;{BV5ES7)~vEjgRLh?EsMIc|4%(!e5_sDbOYbC(O3aKFNWxgvlm=(;VDxBu}+g zu9Sp$J(xu8E=|IzqtaTN!U`c|E4c5#9*WVi>YJ-W3@xBziCM(sohoFv!>( zr8D(=E@qYD_hK~21Dz{d^T#Q>hWK6Z;3jb1FE*hVG~nQ&Pl;>YeL&lfY#(-r{d*+4 z($Ne)#Ajq0U`%!hKDSvP8hpUvm_grn2vy=)*F!`=hUL6PAL27pv9QRW!w^|ljoo~h zr{juA|Mah-^xU3|3{apjgV*1|A1ef~T4=$9U2Gr$(xk^p&pEu8JNpJCL~!{IsH}TR zPQyn1yd;@hml+T)5JD>w?&+_F!nqj=gd4UQ4fNoIR{2pj*o3%sb-!##^)PEna!^R` zr#ll>8sHyY$1qL3e_<<6RQ!XyLOe>+9)h@nG3|K0Oq#eyyc62`++k7Rrp^6FuLMRP zq8P)Kdg%mEHtUz`4~H5`*m6RJcI3cLdfEE9 zAOR~1`wUQ5$_2U@gkaaeHgBZD6}{rg+k8OIhN2B>f9suD%52+i&{8g`Ei)HxoCv!; z61X4Hi!*TKMoKmyh)#qRulIpOT|^ZFG}kYx&HrdFGM~m^0@0wycgz1^-$flyQY_?R zm^*$!E)^e0CbMff{2CL|DTQI$d@pxIsxgSBN6*oVdHcLUDZ%9;U|5-U^_Eb^3m0oK zKN_NFJRC$)P{C^0#MwE*S8*jKh@|7>24AInf09y8QznruR@%2d+-b;2Xuh7!>Ta;u zuGFqH4vR8~tzLBCZaSs$R51O0L=*1sa)9#=JU$pOwj$^2-=>8B%WqI9jv@FjrtGQ2~dG%^A#gpJKsPPBlGpj<#7JN3IG6cEMJM*~{R zAPBh5dX2;_#NUyW5oy4!YFZVfej*>STuy%<4ZPAx)4&c5kT_U3CAbTT#YkXrq{Wsa zrFGZ{+fgEd6Mn*j_0#`h^Vb6I2S^5t+m|caQgb!ONhEdT^_6P!_(`DQTH}06cVaA?RZ2 zT)E&D-U+B2gChA*%%}Z=1(tu%kCv`VV37Y4sks18ct4PqN8$K(K4NDYpGAB#A4MWL zVEzVIRoqpmNvq}#o(Dh$18IwP?`m7)(v&MY&(IXx)g$pc)T+2+ys|5D(($$wPO><^ z_h@ggN-x49MPJq6V8{nYtYAVOT6w%ja5~`tcFlk#>A;~BRoynpvMJ@vQn6hl8d(aX zdx!10RMqdR@gm#7G=us9Q(1XNcqm4%3F-vMj=J>z5(9CDoKbj|o*u~vyX?=mt@D8L z%jvO*+ovPBWH-nF%pPxPLXa6^Kx9wUfn>#}6L%E+^boO-G=hJCK@l~tuLr&YjbKJJ z)!l1ADk!4bZISN|$QR%#9u8YBYIjqhN$O;+HZXz%wUGFDix5*0OW{Q@F39tdu@a8Y zm0Ol(CK!KwpsIhkh`X+&w#(voMA^$p@mX^1Pbw4L^rLzX{W{!48OskZZDjOH&SS5+ zE{{7DW?(Adt3HuzzuPe2pLsTY;MGW?Gt5#pyp~S})nQ_eFqYVHM%~?#&MY^DZH#ao z?|G&>6edgziU0(Su$L3J0;yU0yvr64wpvGsNFo6(-8gr2^heG5!~$?cwu)+ zuM%9&c~zgu-mv)ct)k#R$72qRKf~c3ZJKjw)_@kG%gRPvk}Q0QpHP-Pt8IU7Yb-EO z^mqaWBE!Vb-maxAcHWeF;6mtO(w=>g1Hggoz8Lo(t8;b!0MX6P3}qH}veN zS=f{|5(KSyN0f+Lam+}#7gM`<1^mM6;UZ>~csX`aW`0o%XXZ(uhO0TAFnvIBe?UQe zHRKCLy#)LDBy0EMKS=sT^1UFad^Y=A{uHNyyWx*s~EOd%0FQdaH>M3Q)rgg{9`_vz;+j zfT@~A1UOeSxWEP(ToZ_^k-ctDX_agMM?kp0h@u2Pn=6i>yj?zf@}dq|j$b%hZFkA# zN^2X!PDNbENQ;n`Dgm0ripm)T`yM?ulPi>QI=oZAwW9=Zbm3-8BhQv)Xe6X>eE#Yh$!oWZz))*d}-%jNr`VW*Ypyv{{g5wT?-fn`D6D(wT zdLRImMBEupysny~vmC@M8APxt);tQ<2vQx$8kMEQpba@-^@04cJFv&`TI@6)B~67~ z8SOiOH(n77FDsP*1Ed1KAKdHshK2UN%`5yZjE*{PrNqinm zK4I2H$48aZ7{L_=+!}Rr(nx_6MWW%O?xO}ktYB=FYne-L?9JS7QAHJZ13luP#MU~2;TJ* zz*_FmuXGhjngJ8i5{2o>u@tN9Mgxr2c1joMg2Lk{vhTQ`>vCCGf6|Vlx>HoqU38-T<2)%A(8Xn`prq|tBdgAiw=1vi#6xONB% zb*Les&d{9MAPV0&T2-Jt%3H)|hK{5gldegXbhS0n(!qgmtPhcZT`a z<%_X$1CsBAuBBj@e_hv8k@!x3?X-)R=r2aWcMO76<}+of`56&pN(`KSvm zY-Sew9Ayuo?Ez*1Q1O1F0ux^Aoo2yG4rtV~J=B+pb-q^XhhrTShw1gr+P1GxN1h{K zL9Y~L?GUmDnY{r?E%~0TBCtwo@O7clGqBLXbYbj-jyQ&aJGqG6Z5|!zozQ-?LcFet zvtKe+y|EoXwn#+*Uj{u;W?d)>jT2P*5)_8&mrP-1NE!slbSd6n+mTi`PxeK*$1{3j z)=Xbzr~J0r8h!x9qDJwKAW7;3C`Crz~K48GkFI!{wFKlsB|dpq5T?RpL%rk zl_nH=#R&)dW4(mrSGZcPe#gM_M$wG3zV`05R=JdhKHJk3OCTj61gPkueLW)gJ11!8 z>iUPsf2ND>3_1D1q^5U%Y-3G`G<&E%QU8Q6JMIwOQYt>dpD6Bt%PTXOhH9@LYdd1C0K&A3a_+VPT}i92CRni0 z?@5ovqV(NZLT?0D7T8T`t2`IlAv7g3gS56XM-)5pq8V~e>fyE&eW6pf-(;=|ZIbe0 z1!Amng+Kuh9Ht*LL?4)GOO`J5{lOHjj)gUFlBfYf$8p2e$cIKR5)y`{w>}u?M3mG> zRquO0D7^}Y`>bIHlsPq|9X>7xhCozeV3^m|&;N-_fZqnAu5}w+_Zjxg#~D|aup8nP z5P_0om+0KeTN$u+^6oTKP)4CG9;b$A_G6PuTyR5B-@cs1g!5K`E5rYvG5H%6h2Z6vfDn^?0#f_aID+9 z79Ej-DKmLc`FC|Ftc?i$9~+W!Rh7|8Xs!YasyfOdI~Cbft;$+5YJ>78(RO;O^;twe zWyLh|D?>;?tR*hRwITyX&|eLu&Q)Ci%~c{)@U47iJv6pX5Fh)I@#56b=l2aFH%Q!F zJ1yJQ4nadCF|5R`J}ubiZ=jGT1BI_pjN)^t+6!|;2aKaUH06;Jg;4kS2(=McgHF5f z$-K2Y?QAv$Wg_NcMNpj2 zhDfs=c?28}x-3IjS*x^s?nJTyB%MafQUuBW$uthYmi(>LW2PX)*jcZ;*qzp!OlpcZ zV0bEl9BKyU<8h=_*_u$d=XC-7mIEX4o%z55za+=efpP=lEF35Ed1yn)!BP=%6f2uL z48`SxK{ejKe)ohJQRoaG7ta1{kEMD#h|19}CBkOCDPIbh4`VX6V)N=Ohz?~JYNiCq z&mGv~0U4MjQdBOyM&IQ$qd^J>(cnCV%fu{LS4eEv`?j!Z((3k)`MBkBd)^Qg(Tq|_ExPY4Yf{`8<%0g?YhOB7UVED~mYv_UM5Kg{dsXi8cc zips1Dsw90I!N33rM$d%@zg9-_1BJ;)_K{>PdD8s|0(*&^(y}Y6Yj}n)CTBP~>ZRjM zKh+n9F!abik_hc5L{FiI4>*Z?(3J=hUL|Bw_Kk4$`Yi|88gyc)S6}A79B=(tG@*iQ zVGhGl^r}}zj8!FeQ)tW%&%S9>M>adH$n}*yBcA!tl$PW;4D(Kh!wFVd^Y4PXvV5xi zB9jt+5j{G@cQ@5m`>sA&1-=E!=_v2t>OnF*t9WHLx3**jCId7|CUWc1RDCk(I;$>E z`fN}HtHoE}los44g7?@2#kvjvUTt(U0Q?}y_PC_4qUp1ap<_Gg@S_~)_-Uj?_;Zr0 zP<=uORRUxOewrl8_uML-IT%Iqn(b;SMb`?}cy)^VW?_Erc50`w93dCSU3y-e(0uBAj6zzG*-4Q#(+cv z6UIIa?dG-j?V(ylA<&Zb&~9Y*sD{BAVTRE=y-@na)yqMdFb~{S0z4xh>(X?k*a*^Z zf9!ty^7U}t@@{t*77tVO)btu~5=YRI6HR2i&PX_qi2?z2V@9aA_buZo_8RTR~3GRXu{SzIs}AaJB)TaR<|SMok(!4hTIuq-OP_jrc$+YM!L55p5Xu`Bn$cMc;6JL_^^*--5vuXj|> zxcipVk%radgM#I3_K(Y1oJNq+KZx{PuLjoRmmQlcZfFJb3b zcEM;;&Ge(LZAeh=*egvS@4;`Fc;Sjqy5^+{W6n=Sebl!hvvCf>l<}!2#VDv&D|PMF z*7Q(J!8-ZaO|qba^JZ$8E4VQSI;-{}@uMXZ@IFWdgc*wnC-pXLQg>$_9*o8_!#Bj) zJ&31`YBx;g$Lh+3=FgVA6~v2l?tPeA+;6vDa_|V zuBVuRUOL$LAkP8M-YCl?oeZkmhk`$_BNZ+=Yj_5?P#+j5+#W$Jf7KFpaoE`$ps&a34pD6;%4n(~1XFyBtE&=u4PoFPShDml zWs>R${IkFZdvb#p2(oIHaieGJL<_W|tYEhjO?Uk-X5_I^#xL1=()mR!XCKhC@Luj%N(gs{(KB$yQufo~hm3SICAKHrB}$7-g27O$?#q$*Qv`m( zh1d!f?_nbkmkudV?hEr5sC(V*!tA&Q{D#=K2L^`@3g6SpckD z2`kNYw1=JaEI}K_BYhnHE`&;jrS%wQjyV!Lc$+L-;92` z+5OlckOW&I>GMuNW-#yUyVgGXV>!s8Czv$EFx!$C+c3>(Q7uVfzl|!Lo^WEIGR`S9N&cob{ON zmhML-HUes6_T=?Mp=m@}D6^_JY3tkt0r5<|EUZ`FlmttpdP6;@;u5^F1Dsjuixd)- zrLDY4TP+^gn07Dn%cJFJAIg0ttRO_~k8c6e!LQONsS;bSQS_w8ce5(=kLEJ}|LOOX zKnK^h#eIjBS(#b0OzZK;_Dw>QZqU50;ELiCPi*xGi+y4l1m#60TJW6TV(9`yb3dQ} zw&3j+TO!w;_==;&*OQgQljVUvCJ=VPvNz2X)o7Zl`1pDq*mVmcpib%i0B`~+JcKQv zXhEHJD9z4%Yb4)j!4!cXHy{c}Q^*RI1eF&f0ZE#}YviS%b#$Q*fBc0Xy%WRA^!#P!ffv=av)*@f*BYHGaA z)NcKD@DAXC?VNC%{ zfe8ltv+w0pm|99AQBtS2VxEEN1D#jo>z-lDUeTeSMEy6Ilwg6{yaR{Y7*e=1Xr{1| zlBA=i7a~>Q`{A}Ta3byEhlQLNXtohnh(ukRUI+)}JX@odMwR$FU>@O|Pn15Q$#lAF31av(g>+ zBfzXk94qLbsXlFf*d=GpT4r#U`8VtlCyEtvDyD>3*!v9t481A(Q-9UJ&cLDHgE0rH zU$n&#eDnT+ROnca`E~cMNa>J@LA27~ACJ78+%+9?SG!pTSOzs<+RnIW!$pBqt9u6P zdV}Ic=|v=89iRAXO^bE(g)Sy*jc}YKR<=rxPSy}1wJ>yz-o8a9Ac`-FlvKPe#&S zN1BaoF%;}YA|;D&HV!-0lM=m1L@^JUtEl%0Jjj%R(EqN&G>dl`Bv(vR-mh+O|8@(} zq?z?eC$v`(PkRKlPgH=gG|1jOi$pUD5&5pWOnVTtq$0-!SLi-ZX0dj7kEDh0FYyqu zr?|<;MtNqFaZSGhtcU{$23i%V=k{8xAD+y9Pf8;xuas@S1}&Dk9eU<**>7ebH`L`> zO_lJd+*mB1o~+XU!3IijW>4fu&^A#Dvv~|+x`_L1~G+Db_NwS>~u%Ois zP2#o~waqan5iP~;P~e$8Iz5LJVI%>?x!2bYv0#dVp`_D+l0R;3Fky!*8AWn_TRUFd&#E>D4oTM1_T}MvEh~2uP}odbi{qGkbXXy zsGi37S1x&kEkJf;fFmv?Y9e{I zRi!*5BraFC=OoDWV9qee@E#YNz1Xw#3w|`Q&4PjR)^nv}M=ww}PW04{mMj*}_JP~0 zPl8k()y)UIhaGK!w;*X@D>x$p5CtN9FwLvy>L}t_avUy2vzPQWB)KC21C9ACxM*~f zWfUp!+(4O)$l*mem`JD(o!Fi0UzmeqzJ&k^g9}Qu)E&Tw$4^(E1V@nSGd!f^4RHi=+`0&**6~cS@VGSJUimZ4<8TAs>3F!C(nO)i}qv3#n8{MCmSsG*oBQG zpF}rmc|DmH`!pToOw%!|II%d~xT9Ew(Fr>A)geV7;Vr&cG#RO-`F^y1cr<|5a8#f_ z*g0}_T*4!$XSq~NANS%^G*S6SC9B?>TV$jEAT`zjl^3un4s5|su~P9{ia?6$YJZ6a ze#IORS-p5?#W9sS8nosFt-_LpdD&^Mv=tw2#NmKWYNj##gjnXiy#-U^q%u4- z>B0=Sc*0m{5&~3@XvoIx$1%{;3IqWV70VIlHZd~haCq>6_>3V2Y#KjDj#r6GAz>#?SUq; zD|VdnNIW&C{B6(>b_{Tq09+O+E=N!8K#*n>kmy*JdwodkKaLylMG9EsHKLQ-Oi387 zs6pNG?jvI_0>9g$ce4`U5&J2%k0UUydm1d6l5J0#EmGmCg^E1bgtZ^X<4mEjR1DraUQyf``NjM zIgBxQcK`{f$w~PG>~uW4GAwtTmfCU%{SM^{dw`i`#4P%JOuNQGs+y9BR(@GB+_&Y< z&NPfZGpKtIO-|K^pOIkmMEVDgKDN-Kbx153%-xq0Nrf5ySE@kg0uf^nRGT|*KZ}VM zTx>cfTXD4^0}^Pz&Gw*7pv6iZ@O7QiKe8lYqT|=xA_F2mqW>97krGxTG^1C9$7o=b z`$Vwfg-B@rssliUkdt5~xG7Lgh^2*K^@$1qMnI)aY8~aCmgEplThdmuKsktCprsd1 zs;HT3zd{xma-DC6MKGFS;m`nkn2EC5KWq{3d(>`>Puv4jKNPP`LQ40+bLi6MLKoE{ zLN2$}BJ$4%oM(pn+^59tO7{GNjzLxX1e*3-g^&8BRxAd2_C0n;X;O+i2u>ndp1={) zuvmBZgdPlgosPnm@JUz$&~HKxcIMZEmBWKkf{g+aJ|P^j$2SoTWq1SN!X21^H4XeC zINSL#-~+UKlKbFdgOw0aL!YkyZaEI1CS-)H8ukV#DxtWP<6nbY+3m@M$2y9Z0|$(n zk{8&1ztzwYWIj`Wisf+v|t`Kh?aa_8Ya@s(Z# zx?9B=?ch8I0n@%FnkF7b5G+VYAvEXY-j+MgH;~(6LlkZJt&$7v6vxtwXX1VG7H~_L z6zHz7e_QUD9WA39W}lM2)!+LOeyPS$w7G`-qCtG!8^Gy>1ah42#{tLxvn&@ z|I*?(_S6c!0lIjXj=UR6YiXm+>s^2RQhuez_&XNOpCHA5bF4hY_$Ib zW*3o0!a&87t`4n0ZpQR5-cJ|KisI0@Mf>MtdFP1pX22Sne!^4I5|M52;BKcpPXy(sQ0HbhJMzZCO-nUBwm-7%EJYhDUkQRPE<{ zu4SnLU|iIBg^}zo^h(JsW9)|NF*UJAME1jp(zBU>QmT+F>r@W z1$2107!xfg8s&h~%Vva6V9T~4`;f!TJtuFF&%dW`qOJ46enu9b&B zOOvct6=3hR@#iPAM#eNK1m&)dm8%sYTMh~yzD*sjPKrs!ltCv7EAh4Q`(Z7ypW8rJ z31Lvr6NDX`nF?YqJ!Rl4Ma53Ts-r$MrV{1-fiXk}7kGb-Fhtze&>qOn(y(7eG7g@$ zg3Bbn(F}Wl;N)<6Hc^a2QtJidnXv}W$V1|k0v!s0h2Lrd1lwW3kUqBuc7@fBQm7hu zp{{1XHF(M2Y9LK%Cr}%Y>eA(Dh_^hT@gQmXT&*1v5`l#+V~ki}a+3X6gV9p^1QezN zF5v4~Kw+dqFnR0{1m=Z37OgVtmw2)sk8s4Hs)9Z+QWV?QMN+y?ay zpnTF@36BkFMa1d3P^Usx7AVxRup+4ozykn3q|mm=1OFfsZp-(W2|m}V-~Cn=3n-U^ z`o}+Z6^Qi58R<*LB>LV58IV!CwbTIH>1PBQ?iOLa z?o#~K`vWCx52kDS!{RuMd__Yti7q zV>F37=^qTI_A0*IV9M@m!6-vttMk0iD4gSAEwS)%@XI(1`u74?8|8CoLGac)L$s*E z1ST1Oy~Es2->VP}ZHse1#?8Qz9+R|OBPvBJ3gc9fZ4sVp*4N%RMtrnd+GQ&rg4=io z%mRQ|^Jvkvd|(Yh|AxIiQZCQuI_?dyQA3`pW$uO`er;f8(h!mBbdo3;{>0N3 zp|H$O7fKE8&cH5Z;hI}XqH1f#t$_ComQaMQ$OFRe<5%Q-CSt^ipHob(; z3@Mw+ccSHMYS<1{AT*7rQB0**I(;=Y?U}~69*m4@WdGQp17L)Scjt`kzL6@qXF3v5yhIX*4J`px~j-S^xHXN z-91rp?kbjxwu*L4ba{->;HMyM1V^~Mmph9wNtY`!t3@1QZxzTJba5#~yEBO3uc`-% za8XR}<&Fc`M6rqQhPuA4@-da@*``H0bfZ zh%BfYjKi5lVOQ^ueJn*inp0G6)Ni=HMlEXgsrpG(H)ZDJ0rnb9s0 z)ybWQPOiX7N%rD$%UY=yV*{LTrnL9Gk<}okJ`PrhCi(@3z%6(mjVfKH7oiB0HSno) z+vP=}$U`{0FH|2!aD%3;g^5}Ab;|4vCkL2O*(>ge6K3u}nNYNAuhr&>tOV>|TwH$V zvH};)>55RfomacP*99;U7{bb#=jtgv7n^#tull~?Y#?lKDVyFkG20u6>`;w*-vZ+% zJZUgnrxE#DtbZ;>TbztONEd({(t}n(WR?q^CX^$CrEHs-ePx)l_r*|XI8w|6-Gfm> z)7D3Lb~(@4q+tts&uz3Adrag>5Z%4C#pT%*@=4eY;v8cI=C9KcI5;cVPX_Y|^=ci8 z$c!FTB)q=iRkxs+2<)6BBI%WOHd#QP-Q843hB7^wDF+(;G0Hem00fC?O}|Kg<0r^- z2Utuev12%CS8Bf5XsOd<*BH4~-61O>4FX-e(x18o5h#;K>3K=}(KP6cdmXKdcRR{H zT$!%q%f%*^7}!jv5w9}fU+@)^;?K?+s#dA5oP?@wR`)z5@~FDUq3Q+>j>6-hJ9GcO)YhGB!Gx8z~7-yZ%>KFC6|%?N;y2iZrrse=0ufU2_O*YlHVZv0#MSsx4Wt^DUiX*MXP?6J~ z@0#JfdO)e43buOnWiVR8QrVvjWl^YQ2(4sK4iMQac()7A^lkx#!+xZ80y2dfSl*;q zT;h_nF2HVk-8VpERS&n&LW>7idjTZbhW7|SanR-o)-x!}7Jhs?Lge22@z&aqvCv00U zus7h+Ar<3b;3;TW0eL2&@mC-&r$9_~0v8-y>;eID(1hrK!H1!ocSpzog1#g6A&-wV?630j{04q<^5u0Z6E+!}j+N#b!ckbxK!0HO~zO z>K}r8B3jg34p97kJChw%jr6FV0REhO%nQ9a3-U$!v@3nY#DXzIyX1|WHI#9&z%d#( z)@R$tE~zt#0SSyCZ=ZlemhXN^PQcrPDdO!4)b3GP9O}>2$BTp`djgEp>&Y~Sa|teG zRCTX{MP}@459B>9+lbA6LF8xSvMhE^tVQF4P#Lb55$6%O&|B+4!!+CYgQ@Y{NN0|F z=cHlX_>?Fh$39Ydn6la7W=4JEGUMpdghN4o)zx`2b1L#%yYJvU-ftRO(#HdUXn;j? zpjN%jb=+idMe_%#k#S=L(x>MHHsLg%tDTuO18^w$cI6M95?Dm!AF?GygLSP2+e{tn z%cB7|+5Ll$lXsUyGZ>+I+|&sCPCH;JmrouJ3m2SWhN|l#x_t!BKVc zaRi6}GN<|o7;8>?qC`)-!XK_eO-4{(*A2x2h)w1UbusVie^90eJRKZXs(a`PWP5@KQtDU){Xh@(%j8Rf_{25Al`Z-_$ko6uRltu`*s z(DyV7pVV&YX_G=!@Ix%-4hz-kASfhb zv;*zF6>o-S9KUqCGBJ88%+X~UCn__ZT-5SSVmFQo15|}`K)2t&ZIv=CW>KmE{$JW7 zM4}jfSZr|T^KZ(ks5%55A$>Z^kxquEeB==$ql(6F=ez$}Ox5VOEe`WFtUY1)Efd@N z-vw4D&rxg3`v;K8P_Ha@tM~a>4Bgh#4v8}5v%eJTfUuJ-jQVhJqSS9`e>IG};N+6p z-Agt~-+E$HN)Qd%0gYfhAF+pGUXC>mNueHGx z)B!o`qx}Q(s%lm)*Ssyj1I&SaA0#~OgV9M07KxrL=mG5Dp-+xKU^yjC3J%;Mkr@>P zW;aX`i!0Q0n5ys*_3j^9`#jmdOzTDY1A=0S_d3=Q2|f^*wtGhNI3~%Mf|CJqRe#A! z9P?v2sATvHRgjH!t}Dho0G$C=2lp0c5x*2U#b*@zv(6Exb15G4Z$S3w0;h77z>kX!BGsg#cWquwuXE zXYAH?^#4U%MI@j%d0_xx6-HKRKIUhekvC zUN=D9D*R{(gT>=fwj^_wMlFa+SY~;=KHD*;i!v3`6-HBLeKzuM2;!)hxs@(+p$ll6 znCy(_d?6lvq{Y6#uYd;9xQ!PoqO6i1UuPGe^v>XB;&*+%xe7b;JHN9Mh?p3mQ<5mp$U^>+GrSb6$1RK9ruZ2R(gO| z!_1*RZ52TRo*LtHIgtFb+d4-#SQ(@}sKMlGmbTt5`Ck{K16RWSTC5xvBQ>z!aY)3W zIUpB58FX_i{iJ+DoRYC5=6gtgw)b{Cljy-_GX%8Sp$v~r==V^QAumqea4V{Sqm9e( zvp+xDI6WFtC6-vzlxDE%+Y$Bc&PYXK68;`>{siwji>tWqV||Ln=vZZ#I!OkcTSkRR zY1VIoko@}N##|jq)Isw2B(%q)5I&)50(~OXCqHO|MuO15)S*r+2I_1tv8x+Z$14^e z=QI`!fIZ=009wzn&eFXB0+ghH>JMytkQAf{NB``JU=4oCLztQhMm99lbVGrLV~nV$ zz4x2A5Vy~S3r^yGAFmzFlyFMIu!C`og$&PlENg?bWcw2|%BIxQWwHPX1>glK%?L#Q z!z9mMKEaOGg9|z&WV7u$fR=Kzjps~G`CXuU^3`>Yr--d+aV;Mf@3FogiMTw2<=gjjt-Fu5Rt>W5l6yaw;>zWTYA68^F*`~ z+Tj&Q)kz9UjTX!2fS+QCksq4e5$5vY4o%|RjYN4n zJy#_hvpXY`v!JZ#=QIPzI;9(MqOBe7s0R-cD`0CYGZzR_-?M_*A-$6P;PK1DpUX;D@Br zP`i4SH04NMfc6Z^9G*z|7B!pC$ztw?L5h-s>eW0HT}lF)#Qsf+T}}MoMs?L)lA}=CQOyr zvmF5e=mXJUWy+6V!rCT;TuMVG&NF%$2Y?1G5ahw?c)!Wxh!SE9HpG;eRv@|5TDt7X zNHOQEyXh0AOf4+|imM5~-{ikYo5L0o1;ZVL%73bbxrO9L=WTJ~G1x6Zk9&JPTRro4 z001j56e`PC)5*3CnKNRPYnMQQ!lW3>!cg+7iaPf^+oe21GEm1F)Sws;5YB>dncU5W zA{Cnywm&ACf1S5uW3XW?%Vm6-BW+b5G@wXi(dKA7So1Y8ZMM%BLVc}v9MU&l0JGiB z_i+jv8Yb|xxjcbdt~Y5rBglR-gMNO0x3j+y9vx^1NnU&_(re;{3_J|q9jkR+(5y>H zkv;Ej^fvyKZ&#|67(LPtgPG}OdJ@Dg$oq%12D`N9r~1CgAJ|*nL;C+0d6VbP57T{6 zm|XsGnYoi20^|{2IYdKJMwmV)l|byFlZ2z=#f(7ea23mW-w7_P@J6{5hQ~T4(XD&IAktC&U!nIe+<**vl7xb`EBSI{3r3uPS8!FZepS`;VnQUNr3U=_tKc5Ja z*=k>OISf05D#Ed)?WECC%s@}nzGX@N-Oxsrt;hsg+g_`sc~}i=5i8kX3_set$Z#?hHyKcUN$>bUX*vzJgmPb{;qeY#xt&()D9poX2mIswlcG!# z-&0Hs_Fxe`U!)K^#O){KnK#)_dlFv?4nT(i;szHG7#fmAmKD|2WgxvH3=G*7*6~y} zhsk#?0@4-yCe*)eC=U}uO3XnCxL*Ry0M$Eey}XNnc9z?xR_@3nF>2ebengTuSUFKQ zxyJy~!3f*fa}?yU?l-snb0;~aIgx>;CXCtD^14|aAXPsra*atlHlb)t*C>qIg}xeHJmEF%`+VkF7p%UOQ;)Sx22 zJe!xvGS5n!hAzU^pu#T_3zsxYbkD6JbF7YaCP>WwT~;}bsli|YQtB2`%uF&- z1Ie_`*3ky>4aWg&a(}!>R2lw3tBD^Lkrqea!0QdXXK4m9o=@9lM&S&NH)cwA#;7Ib z5i;DL@y!Wjsv0JC#dcrZhL#xaLhQATS={*!pfcJ7Np42lnC<_?UsgU&3{_fZ@+W}t z|{j3EQYz|7MDRwSBIiGKBjRN5ITp#`n~|pU`5;X2&F?LV*tCtAv)QNPAmSg%`Z~B z)tG8qQjXHkyHj`uD*|ta{tr+O@vFTWgA_P*=umm*0x<*JV=HbR^ZnWW0Y2M@{EDh_ zWmi0uh9uIdoeIEXGTDeUTtNZGN4iB?e=4}`*#abFyFE(wtBvV3?Mk@~H5ch7=_uIL zg0D{LfoQF#9w^1lfZPb52aWCFI}cx7s2|#oe&9RAZL8h_%(wfz*&;Hx+nLNjo-8J# zG*s4c!xm*C2E_{XBFpYFhB`|lt-6)|C`41^QgQqT*huiyNeoNRCPa+pr1V>xZ zUWNS?%IPB|LFDE*DpLOwJ{7=N=g5(Z1H(+Hwuk8ry^NGA&1A&O?k=FZxc@=xfmtF$ zFbMiN`Yr(|ulbnd#2lTbMZKa&M-=thLoX_{=DPL(34sML1P|v?wqm&@l@qOh+4MuXfuR@l|~+$k-yQ@*<; z*dEBeE~F)G&sG5{Mk$lj$^N}e+H2^^0;sZ0KOS3!of$uOCJ$F>l;@7T$r7RG7$Cq# zt!A${J8*%}HPrsF{7BC&eB@zRI?NFCo?zc=hjq`71xQlTcbXWy@7CS1JAFzOqChYD{O#C3`r0(1C6$YIgRF zctF1TPG?%b)Qmbk!?;OOAcAI69;T7K3)oWzaAcA&qK`PD9>cNjKX5-rZM%zqMSk155gzy{yezl&`dzTzL zPZ~n0i;57!zQ?43fM?SPZR;i^nY9Vdz@+c--Rf!3jrs{qkqb5%qT?7<#N?c8#+OiIQd1W2r@hmG%0)Zp8v!f5xRD$_9orBc`&E5RT{MXcGr=KRHsMO zBos$brtp?5FIi{Xip5k!Pv>mp9nJ>jWhU<$tJmz=vR%9BPx|bs(GJ8CGf2*1?-8gU zGB7}x)g9nrXd!V0{lf0rXA6T-$w{;+(#)eOKO=pj#qF}Aq-jSGxpbO zwO_qxi^apE(X#5Y9wH8H2o=#+5>*U5+KQ4LVIoPNGLLv7bXYAPRui5B_fx8W~lHSyN9kISv3zgNrQ7l}T8OP1pT`HTOM$#%?NN@#;AwPhYetfO~ zZ9tO0{9dgcR;%jFcaaTa^^S=>8!~={K6u~Aa?BDdewf9rON~fwyfPaYc-4+mHn3}SCdDIXVu8rm#_$<418X;Z|jl< z02`!R!^qo*64X6NkD>pwI3}Jh+l%^~1~8(!i^WxBV57 zg{@mYUP?BtYo;-_W381?rQ^;fyYJ^L0Lac!M~ukI#c2DBJIkL<0vA&#v76wLP?M2S z`*1+$>N%BvXwXYt<*iBEzE7{ zLQ%Kg>(a^w`P9V+h6Ze@AvwFHUC@!oh#gn8Jw(L^b!aNcseX1!M#NUHejYV~KDw-! zcPx>sYS}F9kkl^>iyw6`h<24{Aiu962a5$3`|Mm4SPPJu>2mE6zR;*slDKh8=UC2x zfC9={jVi`csgpthRY}w=B~-!aVZK zXevrbDJ9plPS}DqBxf53#M6If)cB8qGOI6>EMQOPSs1X~`hzt2W6)K|u)^#)`c^U< zhzvpSM~*+fBquO&IA^WordQLz?J+r6IQ%x?TBYWVHVNQ!xCEy#ukYo~?kKvYEIQ!q zSet*lft(G@*+$dG$Bl^P2Z1q$k9NE>2?3#fGw-F`YTw~fe{=am2DYJsn&JMw?^otX zmQmQfzFCpiOohig%eve3NRPMT?_9-$S#+TU=Rc!qPMY+4k4lJU3=+KTkj`sSD^pud3k7VSd1gS%`>=v?4yKNic0;tdNj!3s&y{yOC6o^n@*46KM; zH2l;-+wK5r`mI~YWDLqO(mn1Dd|U2#c}MjJaK#EzP4<|AX$1DCnnw8y5Sbft@{Y>& zcprn@IR;G9z8;E7m4idEn9}%ry?S^)c&!MON4QGs78ivoD%OOojLI*BOW_pz zl5#`P@AbxMJ#K7r@CLNke{d&f5FLncRz2F-uQWyR4Z4f|UaueCr!d|?HF4&g-j0Ni zJZ)nVH&I*kR1Y@3-9j>C-_*Vx#?F`>5Z;M7ij;IbUNJ%h*OHK(a~fU}qX~}*ONvVU zD~$a^7Z&MKsQp^gi$;h>h-ovwncm9)lMV@R;E4QojSHZy+Gl1YM^%CgBjD`2Wy-UH zvf%n{)*pBLuH?m85fpm8P0&M!v=3i396b?+f=#;8AbIpcWwk3VY=;LcyQO1Mgd2ZQ zyzN~c$5j}sGP?vwW%<8j>1DWpO*6_RPJ;$5ix4(Usv7?0<{u_VbeZY;3Xi6-(At9_ z#gJ%dgAuWJP6E@dEG3?u>7IP z!hrlN!wzd4d3Q9j{BG@1dnECsp}iYy1w=SyUxr8X?$Vr1gSs?{vc|z<8v}qLhI7O_ z-V*+()e9}$h|U}l#(oT7t)m{0IHnF zRhZTiwye-aLvtN~j4Nx1bn|kYac8tV6ymi(@Y36X(=ItA&`9HA>o;i@TDaZ0B#;k~ zWZ3NO9s{a|-3|-do;^P$6(B7g2K%|ls0UqKH5vZ*>owWEiep!mCb0KU5E~4Zp9EdF zyDz$Kf^xc92@MUJxZN^to2-O3$=^V!;5Klf7N4lE;wijOx8FRaA7W+4ixwS+aaA7c zIRJMwI*UP%;}sY>NF-9UWB-rLAm�W=H7+& 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 z%0A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

    4} z%sXnZoZG{Vy+=HrV94vLuLZ<))2(Mg)zVx|CssD2khGKg%-nK*jJM5m)SV&}qiwB< zoAu0fhO_CZxv91yM#mG(*i~mYvU^&j8MQvRy8W))V8hmEyj^9sNTdFaegV}mm0Y5? zkEg((xf*F|bKJw)bz`6Ff7Z!vPYr!x)yIajV9Y zOZR})#gHwdw_l3_eLB35=gj3=?Ub?l5vXn>bhT8n-)p^*bW?o^G~N*he^K7Lg5Rd6 ztGEr^<3JIT9#O%fY|gash=Ie0a)g2Wi%a_!#%dswtea6EO3j+-bC120EL;A3I?MB7 zeMX6%0gT}lx3)-SbQTyDpcK6tlK902r>tcz4!;+>z>VSD?s#8D?9tyP1wY0(myv2) z9D3Iu*p9F4v19$z=2>M7pp^Rt?oR=O6Y8fwu2*{=zmS#(B=AC%No-JCuf-DddI3?n zLD%-xn_yeu2sh?x$G(Q1bPPK`79``S2gYytge+~l&>sVa|?F?felk} zy_IR~BaRRPvZphIKnUXDvmwbE-E)ym1gLZ02Sek*r0_gOHq!YA!E+l@izX+S*HIIs zV!Q8Q8$A;4TLnjKV#GDic7+_Z&l|JBc=#=+T^@++QAPe8?ZQJ@u3eI+f0Am~;Ee}% zE5{sR)-9h;S}PGw9r`Uzs=%AwSLX(f`X(aQ<_)p)P(sOdpuD_xU#D@Y3<6v8_H8~tRd1*ip z&$Ez@BEs|vQl8!CT6ShLx@+K#YmRs(=@P^;EFjI7HkESdPvHi{^FWDSZwv9plvn}U zpZE8+Qt4kk_nCXZn(MVB6K*50gko_ys|@kJ2M)Rs{c1i!U*USkcSq$dlEx|ZtlsUn z+`gAOn3sWKac$UdULh;iv zxQf^RYWRI`de_uFZMXYeFVTpdLyvZFShTJBeW5*Rd_=lAlL+_B*d8?i$4xw8-_Q1w zjy_^{?xey~XU(6njiGkXPhe8BoNi;PpN{Ht=g{jj1KVe8i6lU4Gof3M#vWS_XKZf& zv&_fUiQvtIyd61Gmscuxv+Q4OnAIz=>Ij0f$9Lb#xoOYIlihi?5tCHGd)Y{?#1LU| zy-5a~e=MA@MakidoLiyldfeD$QSn zjLwO#afDf{{=z|dli(Q%Db0+mL=&PDpGCI%))18W1#2Wspo%Y% z*k=f&Dxy{3fB!qiV9yBwZ16iJ10;150|b3!zB|A8&44tr|g0@E5;CNg=F3RbZaTOEb^gb(?E<4V*acb2N`RMypfp66tWvS*Svi%rV%8@RK zK-KPT?Os+yveN24FbX3QlqcIp)p?U?a9*1!8FZXON4D4qZI4hY308VxF-Jhw3 z>WAF#KAMy-jmjH3<}=|&WJx@edouFAr~4O9rRb0>=L9SWGauO<=X=j_isM41__rG7 zJcdLrY(3TG#(9?J&W()5y-!u;_a&T!M)WDlEGZh-+CaZ`OOZ6x-RH3;JgnI2X!^@O zf%$**Q}_s=37kMuX7`m+5spWLrbVmSYJx|YsBg%~_uLik{{7@5Y3C5fXEHI^EPvNE zO_mtHi9Xb^O5f`U2b_V6cdRzB{TWZOdN{rR=cx23EGV5WQ99-?`%3bpY$CsX?cdXx z>g&qyMez20HfoS(f&)|H#t*S+9zcoyC^lOnwI~ZA%Cb>>uN8n(0<-00=+d@D0678= z-OwZxJhiHOg$a(}Fn5d@3SqtnGWJBDMmp%zYvSsG4_i8$OIs%}SCN%}nDOlOY+uJ1 zZUGma=rR|L);+7}Tjs6F3Mpu7vkCb9RAPwlo}d*|mbtI)gY)LIHdOvCsNH&45@f>) z58!jI&;DLX$t7-c5#83$c%{T1;ey~4>>$-r1Bj=x6#PmDyw1n>JW}DkdtVKaI=%c=P=WV40T0!$u0ymf2UbM2>L{K6}9FJ=j^j`?mitOa)8pt zCJ70AI)IM4Att7i?)+LY=BXB5AvXMmfUd1FF9_Zk^3GU7T-$Xbs_oA0d8h07)dW`+ z1@Rl7JpOJ2+cuY}Yb4MEQgerH@{RW2O-MfcbGYNOp{&NTAU^kXWLVst`o4B@6}QSm z$a)msD+xq(;|%Op+`Y;;ar3r;IKNtv_pf0^bpn{rIMSbI3M#QIGBrFBo42nd8S}YI zDZ!?yVA<#U;^NZG5V{n@*45wN8HjI15JUKOmhXue!Sr4WQ&>~QCw$+zbOR^6wquU; zU(}pH)o;6}?(o*jLf6r3F9Xsmm%948`b1|MAK1U)$H$VqX->{udX$`3uL)$x%6d*d zV`at|1dk-#V5tqJIXzapSJV^Vnm0Uqi)n}`p|+ttXf@)#Q>fB{FhSZ`cqe*^X#>>< z5CSYZ-lclbZ`uR6I3=jhq>yuf&wQ<>9L9Fe+FD*up3kW5wy3l&2Z!d|zjLQeg1v-ppK9vc&g$Ih$J~$-3tY zy2p(~HOE~yPfXLHClQa0v`cN1r~jO*$U{yj8)QJmdm9R$$rElScGK%RMx$4xU8I{g z5TzEuyiuP>@iI~*)kB6Zu>#z24$Fq5&_?rxQB;NXgzg^r$a$}xLDOVTj-2GSdlp_q zH32-To{iC~u5aUcB%*kt`V~|=hyMyyrxKoPf9ooikD(mj6XdhjMBDd!?niGj4RH0( zDLISSN3J+5cW$BUF3%hXLu6e3R=ZdCcYyts1t(F_v-cXYw>V0AI!tQmb6K49Dx}PH zARA{qO!{3S$Z(EIzCy&Az7l+dP@c?1L_(L%IlL8k`%J-;wM45v2&F8bX3 zC5?T;29m$Dt$FSD6D8g_Aur|!8y`-2<~?OBdQ^ThAA49w(w297cdh%aic1O!|JCi{ zj+k7yP2A({Ojs#e#?fmFBRY+pM8M$;FwXlLleA>`gw}#g@w*7$q;K{Y((t;t%QFAg zJ#frB%DnX{pE$5OJxKbJQ!3KOO%P|QF;jh2=>)2_jNS)`My+1O{r6gD4#UgJi(&UX zesD#Vjx@o+Ua13wYx-gpSLdB=lx*W;dSDFPqw7jc)*vz}Gx_I&F#y?qYw{}-P`PL{ z`HVP|vGkvzYNMbaq$TBl*MNc?{Y?&fd`pYC1DDJDh7mubFS8|HBPGF4=B$z*SX57y z%ZtMbll8bt{fN0p@GJymR8tw84fct1JfjxekbTZ5h7b>wt&1VaFnf(lV|L?AR-C@& zM%{De{tD;sentXl@N=z-OaA0Z$Zky~%l7XWISc{kx3gSil`}WdxAy*T(RX1FgXF)G{ogLvvh_ZxlYWq6(T@)gcBaS}a>SiW$6}wbK z(0#3M?7Bw0xO~e&6jqbfLjzoNZBMlSi{7uz<K#s{MJ31*LuG=n+iIX$WOeRA_FaNRA>P z>lL&T64Q=J8M??ZwU&SA88fr?g;5>=_8cov@(t3BASmIPbs*7l-fx^;6c@8ev5jo* zlj9?uGd9)*zT_6u%ruvLw&g$*9h(c2djFhJGC1~W_aw4siKGu&wvXh;%CQ$Z3|O#5xp4A>cx;ytw9^5CQGv{#P5?ADq|eE14{5c zF54R&a8;Y^ z-k{=ryp-_pA*`|+p^H+|Z)I5wbKJR!-7^IoK}bZq@RcNvk!N<@O=%M()FnQmPG%)7 z2mF!4R?Gc%@~o}M5bCRpZEEef>iE8dwNjk$H<;oWwO`AjPN-mcQEF^cEqy7dncQB^ zRLZpVQdi7SZle)Ef=AU$ef!`z2#5@3T2kVBg@`6yi>7pFAidO_f`PvYSQi~w@h2eG z9HB51`kSj8k6NT-`v&~p3N+TD#CHzGX%5GKt$si!wXzrjX4p!M@qkm9HAr}ERiRun zCYN99f$Kcqs4V6Jm#T58+ENMjwRvnt?xLAfUesh^YtNXZgZJ}nWs0%dRvG-pIklzH zU8NHi#1q40sD$fKJBRd}lvN9kl7BfDw)i0pxgQPMHHsm683d?%!al~CmSI7Un~c0y zEYqkdpWN;Bu{ykF!TQWc9Hd&y`!i+zXQ1PrA!(sWGhpC&+Uk@Oz7aSDNxlLb`#59o zJNWbCSVe%@$r0VxX^O0s;U^BZRew=CQV42$*P^%gn<5A4H51wMZAEJo#vKvb6YWqP zj;Ad0W*^2AK9|JrNe)s5D^g3=8;iMhXQekfm4|#SQ~AxT$k1@81-BL6>&|I}E|;x9 zAYSSkg$@z7-M(u~?DMq*QoR8qQMy%t4B$H+Ay5Hs`c-{8Um&~pC|;TN!46(~mO0-+;LdME5;*nBnx>^{8K1QD#Mg@@ zh)?*o0e?6^&s!o}Q;+~%`7)2TW@;RSj433U_YBO4gnl12t=r5Y>>&%YmN+kqN%El? zxb!3ajURHCD7)a-rV9$Nc7`$I(7rJtf2E<-d&b6a-pgZjhuGuBs89I*KIAZLa#e>? za8k^T6Z#c?VkdeTXRx&L$Bf+v+ijXy`@OB7^4lt$EpVWygux9gwn-?0iIWXWqc+JF zU3G$TFmU$zz79G{ft|((8eH#~K@P3#9#HoiFaC3^;zW#zg8dGZtY7PmQRDA0H_4LI zn);oqKrjsmQh)f|RxP~^AB}b%BFpjsP4ZuJo!wd((RY2z-v#bGlgObiKi2@m|1xnn zLrGY{dEZYviu^qyY5`(L-7}P|3h6|R&@8NT1^@{d;pRw_7v1b;BVqrd%<|KYDH-vAyTxC#H3}P^lmZrobgwzb= z4jICNe2GEpY9PH^6PkTFK?xN)e71iKK>UG}|3_EQP&M!clSh(-KOrcp}AtJhS z--(WnN3EWt*Sy9oU*g3i52kral(B_h*!l#S@5BuQbG~c8 zME_83N8oW}AF=u^q(j;f={sR;6|VjJ#zuwcZXm6OE~)=o9H1}k^RTP5yYn6EOp=i_ zw8$0t#ct1$p_uoKo1Y%P$WD8`<86n4X}|GL5)cVfbgBB^{;lzFXvd;{?y5;nRMEZ~(Oq9=qu z8nwN?eO0^C^;>Ce9U?@hcZ{SmX^!mF<_D|2;JW%EKk&Cylxt+0bcW=f^Z3=d3v>b!c)3ZRU}FvxJAxFkM%60%-T}>Hc2=5@AB})N{6%K= z{gLFRYC_Hf-7?66V-U?AVD$ZGJM@@NbpX))QM*T-p~y$-#SI~ ztKQhfF^H#%Q-P+?aqHgOYsg^W&5RB#yNdQ>d|L@+9*_R`%192SWfqP zU!$>~<+_ci`{ze%R3JQ3(lnn+t`7Imr9tSIo`83=>e(ijNVmk}G{6|+CyT`W(A%X> zJ$p5aZqb-qY%peleFBpxt32b~@I-sH`^K+ANa)uqibauA79%AfDdNb$M));5__wNy_-B2I`hE?)!O(~RZJCVs5 zdft-YUKzb9!}bEa$MP|l!idU=uohXgE+S%v_F+@#cYkZdE9gj@+TPsz1jk4)8uc4~ zDd|@dI_tMjx~A|Q@kiIXf2#tw!08;McikL@apyuA9~K!o3-wXVANfgPevYfH)~!18 ziXHh9VlWCGQt*i=a0Azg^jj|!+sVL=GQ%(OPS6cJ?YES4=s^XmxhBpzwUfFTkx6b- zQ4!JSHPOhU-f$DwSwymVi^@&3$6WTuc1DgTFzEXi5;ZvISz~7QEoDaznBse^KvwrV zhrsap&XN3^%r$tvN5g!}6#ZTdt*9p(aVoNH;iY7HxD-OHC-bCU>&Zer6CbDM5E%Wg zF^sP2cR;*JnmLZOwIk*Ht?I+w!Kq@{J7=E$#&qEj`)sz`8tU9 zE}XQ|zEfHar#R>}psgQ!ZH3alkAYu`VSFu$9l@XSjTUrv8QgDDzBKlAfaVx2>j}#I z$H(R}s*T9z@tUd|efRw>DL3lTIP;Ktj4k%NP|pMB@g%M5)h&9KmCj^69f8~RYcHPQ zck%dN`tw)1RLSJ(YbC|lt?RqTN>jIAT|3xOnc{ui%SMG#?T@d3ap8zFb9NK%kxJS) zqBY5{r8{Uz+6KxeHmTn+DNiIN(3>Yo&UvoVZBw`GTcRI(FZ;f`v`(C%RcHTOrt`LE zRVo4`1mn>Cas)!R(t7C$qFu-qAuO)^Z}?^fv^^6_`hDN3lgor|UtpHgDQu1BrvHpO zJdhh~b)HoDvzKjR07ba@BH;4;;5r+GT-hydJhS7 z)+vbW|2~fOwzm6!BXJqmKbd-qA5`R{!{@b2zNa&<_?&TE_7{r1O;oY8X zVe)m0zZG$&X|8{DE7D3FEy8-o>w6gnehzKtBiD!996!KZ65sn6!JJxN{5j6Qn)EY@${{@CJ z2IWZ2v(i?1(62C765Y2|Z;jmc8E^rNE(8bghG!{?g@k<%80PDK-%Gp`+wc<;);>e) zvoiLc|ER@pYiRc#@2^p(Pt!-ysY~5mH^)RuSHVocU&W<~T z86#?n*`&O#kekO{7_r8Q_vibd#yR27k#mJ)pZtP50Fy?P3c~0|OCOv-tIRj}{K~;(ZNK zY`Kb(jqZqKWNZrXI#P~+$$;aLT-HVT&1U%ht2%h!Ms9~+nn->{iRMVT?N}N=KBo(x zf(vbE*3K+0k``!c`W)RI-QZfNb`*+ntds4jv?5WREe~}vMcR6)a9SS>L{*9Mv+n#^ zsKO_ZF5L`PyGOt@&>S<=(qMbBpm&b=RGgN!i?!#BN?kaOqaW z%yMuJdaXuj{YSEJk$eEL)Wvl z9$SsQ^0x9?)DazqUP#U-*C(wXU9&c5`#ry6me-ZGsrv$<`- zjl<+(NWJC6Ww8^(b;Wyc^{w}XB7t#7e4eB5_^C`{=LOfaPhG3{dewGEl5kFU)mmNe zXx)9kc*i*Lk+xry29U4$ifhMtZ~yT2tyIhY+h9g4_mNF!4{5ratAF((A4949;qdo} zL>;X6z0{zx)del4r&g&)ekk97G1{FzpN3OuE1!`_664stU6ntWOs{6tFW{nzRT)fC zy5H%pZ^6fxmS&HitXWBh+kJj?EEEM9%>+?Lkrx>YgX45bBBe`tbd=2uYRNx1hkIm! zRial&hLP;Hd7%07$%xXQrZ=YBJdbsBg)YHAHt6}kI~Nbbt!j0_s87kjnL7T`G!Ee@ zsr9QShpNWO0#JNPW|Q82AB@;ah0O1`jm8llt2O4#uM`1Ld;o&RXpzXQ_tX)tEWx}K!q48E;f@C#ZSdcr5!*^@{`REY=(;hF zUN@|Mp_+Ee@kDsgnXN1rg6lIY*;V%}|5_W65t{zE6hWExbB*lCEuM5i?+PD226(dt zgnI?Zy6(&0FPxUA0&0u?uocH9s2ooPy|1(PMRoUJD-3h`rF~hN` zDVvehpsg#06eZo%d_CvLMj{!7sBQg6Vc(ObOIX4i-qvWcjqoWhIvIX}ZT^E2j#FL& zqZ?{H8jor;SS9uyliPZ4hdX$LXgZZJkOSg18Z4eMwA_e}?ltF%fxgA@v0cNYF$Tlo zdW7u2HO?Vd`cI8zJ074*N5QXQo(}Y()_oWWsta%W6^-j1gEu$Sb{$JnDF)IYnZSq8 zb}nVo975`N#;+fzB3TxYx$bKk8pmB17^dQ6EYXlV*_J=pEXN?7_I30Ua+E)_zn4_u z1KhHmbuv*EpBd?J$DLPwkFd{LnNp$eN?kbzCU4xT9MO9+JL+iE&v&bU7k+14n1?tp z7x+nqJzW>>|n}xbX8?dC%FjaTH+BgEMCTQ;%qMx)*+MeP{7G`w9 zbh@kVUE+0r2g-{NV#c~H``JAVQiMf#s~*;+k=pJk8ZM*9tHAm04w8VAUt$C`hlq;l zk;mm(94YNZ$0Lu2zq)hiRm#DTot}0F-P5)$@aqg612+Qy9hiuvTS#Y8j`8&G3Z&LQ&GsLE?uN(fI zR%GNB?)Y=5emnWVu$_Jy4h3@H#pOwUHJ;`*E)aibLo9Hc$8gy^XaBX7LtB5W}~(=j=1&?apioMPJBE1)Y~1IzVW-C zcl8k8W9TPxau!NdCBPISoYY&Ku{zFVi-@lb4XFKv(;C~)c-b)Kv2=(!WIJ1W*oG?bHs!R-47TXmx_N4cfbbgVGm^tT6oC&7hi z=TBP~Q06i{ZG-Kja$;>?F9Z&r_w`P=j}RW1sziH-SL4Z7y!<=gqk1N)xF?=_4l{ZH zRqYA0e%cUDT*4zBH~m}foc(@R!$fw=p+V+vdRJtl5!K$4$`-QlcxMh~pVBnS4aZRM zeb@72{sR8chgIws@9++U-w{mOWN4BbIUvLT{`NK7^j?r$d`T^gO}iqh=f9I0a~N%q z;!|dkY`b zAXu#gt=^s>zWg`&HuJfr>Dl5_ z0!_R6`hps>DsqYG;Ns(0MaL(B^zEyUYM-_ZFS1)#F!>X@jyRUu8 zVU1M5Y}_dqRjxZOH$v=A~qK=QC0*f zwM(d(`WX4D7|0HZs8_Iq&Z)prZRV>j&Ns7PQsbE*_sQn|mccg2o+O!ItgbkFS>vCW z2GVx}3j7EELdA8N)hivvMWWK^wwKhtB+R;5MD3ioFG|4oU-1CkB zXr(r_WCZ8Ad#)t3kAlK|iDBzW-pn<&>0aH)lhR+NM+@ohm^F(KmCHcLL4IuIqI%NL zH+it*U&%6feywPfCL+g>D1O)Xx2O2q+@IfTCg(gYIT89m32mZ&E%~q?<*RXZZWUT< zFG|Rj(Xvp5w|JQL!anAaBpcSY~vz%3|aFQps=IdbOEPL!6ur z0?^byoo&PlVjil8eEf4zWqC?bK0>ys7mJ5&bM4`@_DF86o);#)ldjf%f2-7}@3GfA zg)b$FdkR2K6b-XL+!b$I@;Al>R=R`#=yIyKHT-}~Y!L#5zt6Mx^|r2Ud;{N(AXX8b z{VXPk$gUPwl;O{N>_5>VN0f+r(!F!GBE7LUxGE@%>@Tz%B`g1G!mnC$AMuj!_*IO) zXfm+!gJ7yv@r){0sl?W7xLcxPi`a)Dr`X>@sOnAaT;Y1z92Z5)rwdNERq;jbp&xkG z6=)eyIim7W+t4wK{p^;J|1D5msjb2&lV&{lfvJ$S^Tl~oZg#ZK;VM$f*; z@86@K!K^s7akcfvwvmmi8H3f~Kc7gJ7Z{ra_9CKe$GdJs&M2es`_@sOQZ6r+rVpKu zQLcA4#@;>MaRBZlf+f@aH?@%+oesEYmD%+$3Wz8#wXrIh1F|&5_g7Tmz(C`LZ(T@neLbsNP#4Ei9b9QpebtyC@_U*iyx2R^>N+-~ zHlR-B+7sV|UYLuM%x*uI*XYo2dKf(~Axg~ghQ&>a%aK5!qdq4^^N974UHhZ8ou10? zX&Ml;y&k18HPs!w^cgSuhF%5KrcGmjsY$)9HXzACs>2qdc&p_<;E5&%a!=k2@77k9 z7&CM*LZR{vBx{KnAih5mlG?0O>YL-Z3hhC&Zna?jV*=017XgXETzlt!(R?JDG++k|b(IQJ#CzJIrdAP(Lk3C(1_NIkJLAP56AIrJCQ zk$%ug*$_USd)4Rf9TCTO;(UuHCG5RdIYPopUqr2YywyKB(>w~H&~>tsV4iLE!Zf#R`i~+b=s+TgMG*e3Y{N}? z*yGYZ%3zbv_>8ANa8A{2da<95ZQZe350r}5;CdcS=N0k6UthiZ^ zBw+j*j14OBvmPQtpGMW%!+_n_JA3_P;?N@3yu$e}vXt^ud?R5I$5t(T2Ou?{r+@Zt z@>=7jcjs^w8{DUa8Cho2^04rr^xt)a6Gor5;n!GiKJsP*d|Y4PiU732bQKEn=YcH*!p@Kc`CEa-lyI@M+?Z;u46_tST~vx z>hmbgu28RNYwNp@64q?XV|*6NO{QjIR%rDM2Bxk0+Znegh4n#2${q@_r)1?ulr6c9 z_WUYej=|S&5f~VN)~M+FZG&c|Bgob#i)Ab&flB(%@04)wG2;kb0f~U*xj4cLwB~D!6;X1^b>B5ZkIf>2MXk##_*6FTRo6-P5{(SC z_7oBL5LFfVzvJ@xt$aso_>hW)IOd+G3a%DIy!diy&+jA7u?)K%m6A>QS(>^QmzbQs&ZA!-Ww{f! zd(Zfc4(+M+MS0^D62W^eR_10REYVW9IdTijAG0yNBl0BhyD^{tBSh*-@t925q`CE8 z_>1po-Sk_veW>Ewx;CKT_`!icXf@aOHB^W_8;?p+Cc_*EigdX+kT0pH$AjhJaIca`QG_hsE&ZmSR9r*-+UwWjqnvwH>{Ot$=$ zR^?S-^R5b^aM+Jv3`X|!A07MzStOO4KF5<(3!f3-+lSNQj0=1j<^1nG(sta8bvIS% zk4Zp0l@`C|zWM41df8wrsMY?xF+g(mR`0o#H4qQ;{-GJW_Z_N> zE6L1~Nv@S-i5rKm8Ea(nhU?YZ5TQU6NKPz;(%yrbcvFu&<7#zms|iCodWgm*lW7%T z^sQ!kUXJs0Oz$$P?)@6zDY?`%%KCG^RZDuqqON;D_gd{XM6GZ;Yjn#hpLRk9@f_TUr?7jioP1R3x!c zAZrqaOA46_1uCETl;bY4nJ!0UmO78`1Z1l^hptTp^B8}8f8X1eEPf9FZ)|{t%(06? zTH(K3sb$8ydW?lz05D>xw8oFOS4Cj%Z_I}z+s~!1(EI4Yg`Nl|vw+p}jjHpe8;DT! zZa=fVmpC%VO>W*2ZW6n@VZhgOhExVBxskS-PwHGD!x+uV1 zZ@DY@wD)p8@SJqToms$qG1{bjIS{K&znp))^-)+S3d}CLMfR{)4?;SecPt;|Rxb7R zF_RNUX`XfO4mpEcMqH%Qk{nAqP#tkbFwZ^6a&0mFzKthoxEgf=f8V6j9rcaf2}DmW z<#jC!9`uFlZ;$PMdslVQ0{lCjf5Oi6$5wK;6hWr*D|n~cjQ|aID^+JN6VLS-?;$na zGV+{0XEM(7?1n75*Bxirt zK8eQD?lA1QHVb*TC1HVOR1V)GI<2CVj`UePNZJ=qKkByA;+osEeYc`q{!t3VNrEN$ zon+Z#j`BT2g&{a+x>f*uh?CrQ0yu5;rkqx(Qi;SIi2^73wJ3G%GTafuEK2AH+>WqY z1um=fK7PZM;cGvJXT&VJPh&hr7uzY&->{Uh3mJM94?n=dT{t{4Ho6gZ-TPid(PU)oL!tW z(Rl0nopawGmwMGRNPOqySR8&cR~in6jVm!g>#gmPEYrh98N8N-`ff|Fi$N=L=jE-E zu!Cxx3DeTvif|uG;u6|2ee!b2LYw@4#cePz_iD|ZuoaOLkholf$LFSc6WYv=10!=?Lb!nV~nMrG#a&;ov~GsJcq>(vp!kKfGB^>?OX zeI=-Z)*@=vr3dIvV7$Jgie|wR#+MwHDo;ny;Rd8zgO+gDX3J7r73x(C3p0ZvJ1zPZ3=9}|-Le>6UBhvV= zr{+w9{5<9YJEFz^{tC{veXm->%eX)(wy!qRk-evw(L0bI%eOsdyVg08jJ9tph_3DV z(U`8mdVt4j?W{Dm6V^JlD}}A5hDA`0Ws`!h)*z}gQryncWj9%o4zDx#n{og9YW97s zR;RZJEM2vg(F?Z3#Exls@8!V=Y}>_HyRuIZnYVR?!7tB94>_c|woaVHZMl**p3k#p zBw9s1R(z%APkb}7H(uBZ7tdxMbFQx$9anabA!AXs;9nF$FNvaS-0U;3^^U0vGRf{j zu^rRDsK=*m@VG6mFGk5!-o>^aGI_QEp`8w zv`$?oN#4Ko2kk!7Cd1$Bno<(q*YwnB{3IQLYN?pw8b02_%Lw+az+IgZF#))y}7)(W8Uhy8z++QVT4KE zn17s5d%c|qtoQX&^Q_&H+;@{+UFW$hdjy?KKrea1SrJT8o4+xs@)yi~^}fd@jj=|V zu^pNA{@8S)gSL#r_w6}XFWf4HoXWzxW~{LfIYzKsPlB3j=~)IW-4G&IpuZTpm)(W& zPJS)?<5{9?Dz7nbOtOme&gE~O-D-zq3!Hl-c|ZH32w9rZ#5zsRTwZLzii~tLb}WJw zrAEbd<%a~c+lpd5Lf(G$%aso~J|I+*uZ#I!6m3|o++HL4nJjv*YGx4PuD6EGn4sWA<5>I^Vor50sDJD8rfUUbMtqos)06M+@ zv;=(rGxWeoX@&z^)Hz77(G$vdV7ZFz{axfCfHp|aW!>QbKS030Nc8(wFhRt@k~Mz{ zdk^P$Qx9B_c=`Rm%}oT0d7>Hb_V6#w<2Blm5mI%&tkG%A_zsd1`8zgbd*7TRiiQg) zXTs?_sqez&8|4a7e_k_~D2E&m$wrx8T>p97G=d#aiBbdUmOrZ3pl(pH1%S}pkYBI1 z$;%jt%a-u(&!Ob0j9B_3nQ1NAxyM1znC6g4PlF_zinCMvO_dX*to|X1L$ea)3*AZ<5g@cILuo5E_ ziQ{~u8liQ^{iFIh11%j1pn$iTafWrOgxf?4Lps((X8#Ptii+`}*saf^5eobu=ME05 zn`R1~sOGLH%)Kfo@RWd)=+?-w%*MH#ZDRDqAm9-yT*ij^6Rzz!gG~56jH( z|2={0`9eL8Y^q1Z;$RpvrqJS>o5mV?2&+hP)cKt&Af6a~Vy*dQq0)s^qLK-bchTxU zb${mGg9{UPCK{wqch#rHmlAx`{=?I&IR9e3ysQf~ZmXlh_~I^R0-Hg89?xj1B#9#Q zVMh^lL^GHJuwFuGKY|ngS2~(YKwMPgyqIZ~txaiKlveB^O#{4-CDY8_I zG>^o7M0MHd5MVmNDcL6rC}In+7?Xia3+RzX#`uu%oTx{45|h~T5FMyq3xb2NO2D<1 z$`Yxkrg5n#ISLPXCp$LDRFTCI6)>(gCGy4!yxz}GbZH32vB#J^3?a<66)HULiD-b( zOvS^8JdQ^{3B4VDUWp4*mZ_5nPKpe7exbUo|6}AX_R-svY`6O38PQS%!a(R$tmq;>83@izL{`$F zx1cF&?4dRSU|K(q&+3R~rqnMIJIEs$-bZcphXhfvMOr7hLTd`CzRL$5GC_9(}7% zGgIttXZw}EP)|wd(s1))2fH)ZLYOc|l~gTIsq={)!I_7+GE9u|N=gh4&#ObqDRiFm zi8~9PLewEr41QhTmEPsxVWBIA0d?FLUG!|=M4IlA!xbV%I?N3yekE1t=a_NxmQyH- z*p}heOlp8WnL2_deq&N7SlC2R9XHQT)G*RGz6jthS0C9$JyEbDnFjH@(0uz3IJ&U6 z)G5L;wEGe#U&@-$TTvqxD#juaMe^08fU|Pqft;$f)M4Vk@UynrnV^>)k=e(AQ1+?4VXkGPx)bn zB@d!T@qMAs44@Z1og#SXH(KdG^##quQVUD`ThB7RC~s(pVW~W?ow0^ME_9K+lzp>_ zzv_9pbYThg{HS595mZGANtYR29HUz&4?G(YH2mADY^F*?!fkqId-gtc!d4WW#-YB9 z>rF|p)MBS=#21Z7N5sifT(aJ@uXTur;mtr-;DRF#aDKj8%%_$X`5ErG)+`+f-n=5d z!DIa5#ZO-J!*}+g#gQr8tog#GP?Cbd`43r@Q5WzCGsoeG04($(Ck>p+k-1$0ZD(A& zO!gLdLDhIUq!ULb8aQ$-q5rwSjC;Jr)a0eLzDHE!z-a;zm;;U(G@H4VfkN-J0}TU>4nUk(+);=pPp1VcKo*T`{Np^J5*54lh?sG{Wmgo&M1NFq?RNZE*W@6B zM-l;y3xJjfYVH)6l#Q_Qp0HbcEzJ1R; zir`6gSfZ_j4bMN-kosDfXi=Y$x_Gm1t29h@Eh`Kd`bIZ><)0uv z>JV0@IPmjP1Bz6)L-O5gWWs11_`ydv08`x_G%>*Yimka2TTgrEqcrtESAZosUOvau zat*F-QkXK}!9dkt36fpjI<|$~wVrgEc%_B8F(`C8Za2=rvg-h}!G4RM`LOqljm9O_bB^EbVWD91ciK_R1B(+mH;%>T64d8>6 zgHog+gAy9cOXxo8Ve=W>@wGPp+Z8)^N{n+X!k5072_OtE2%P)#cVwutMG{-GrHYR- ziSVpgEa0tQ>W*{>A~68Hsmxkf(=dL;BAa@Fqr>?aCa9*I;!~Eu$@@iEy|3J`0h}5v z?f59oH_6Y%=V-Xav-yN537gvqr+d6gYaH|q`r#6PhzdWvl%TF0j7XNu3zGp^j6#DX zTW0X2+{AeB!q(@qz>sZz>U+v1+{a}Gzr9(L;|LsBPIBlcRgpLGTi8)k&Ymdn9lgKr zBnOgw%_akk;f(dEyNpawSc!*e4DPL2`H_(ecZe~YIz4vwZB1E(>Qw7Bs%@>Q8jHMVv5Bdf%Mj;U8an zEqN)9h}QW;z9@W|+TyEuLa4Mwo#QWIIRx4--yLsZ@D7rtFYAl-pRpuhTvo(T*@VB^ z77Y)fEp;?V$(l*R?8?N@fRGIyN60374mazfJm?W0wIwmZ#2h)j#-LFyDVz(ZO+{{( ztPAeJ2JKy)U<5nVsb!nm6iFqS+SJdVIu^S~`D!iEkwPa!pqv~}s6IykbcaVT2WB!9 z#mFa6*uNHEa=>n`a40@Jg*2a`5`#JZiMP1q+Kl1%#V`^#&lu`4m?YUx`tnobVC|yV z>D+*oJR-sca|3agnk3U3|4%^AXQyGIup-<04 zf*Ap#`^`+K1(=0HJlh26B{LB(dhxLL88ex(8w#X{*$ISM3_U~!z+N+R7vH&gnRkod z-6HsLn@)ew${`~M9m$Yjl9}IKR~cX3>Z344OA>z!C| zn6t1ekg2IFe?@{-aWv{?!3gfoAO|0oFYAfOF2KTfwxFaBTPX0x1|JaUXQz~uG)f7w zn`ncK`A??!flOib1Cfs7VkE?~EZv0Jo>&)u(S$BD4g^U>01er#rE4YYod`vE0-lVf z=-8nu9jEBw`&8e|Xx~)Vh}9RBqpSX@B)eW2QRbfXrF#JLRzen3`?X*!GBxGhFljto z|64{D@oOkahw3OO8XiJXZ^^ig-!K2GI6vM$ zHvq+qZtvoHVaN8AmHrG*9!M?gi470N{L>)|#TzabLx3vipi9@+Iz^8jIshk*LUO}D zfXOkACa6Cd2pNt!U3t7Ta3M5zmgFI|;!x@?qVT+uEIJi=dk9mby^}M9`Y*FrahBMxHpyK*ADjBHYuNo1=i?u!m6POH348Rx^4fq1kXkX0)7g zb7Ypo_2H;N(gD9Nsw){b0i!KSlAZFG)c_=4Hy?cv#yA!@}1|9~}AVQ^w zOGyb|V6Y4Ik69I&lcjv~4V>=CZeBtRKe5eFfXO=~l~C*-)vv|1kaMr}B+&no&jmoZ z3$T|1obMtz#G!E@Z>pvX= zsy%rp$N=jHdn3gVD?XG~31ULvP@w7(1J%#4cg#Q)CJ{&HQHAhuW49blFmXpH3X1)6 zoP)DfhaD63;-w*)0j*V1qY4Sc7hiw`M}{(ln9?B!sF^9n_zJH9oU9lw$B)#=31!k! zbuhRpl1WJq>)B4ND1W`d(cozf$E9*Y3rLI9*uOV}qfWI)}d6mzd``KV$@3x=ti_}B?7=UW(H zm$9mHu*_dop>Pe@XLPB-S8@MXn4*KsYJA5O(R6$6AnfJ6Pi6L%CCc%%yuz9p|cw^oz<2L82MO4jBACbfoRn-L}dgu zf2tN(;h2je(C9NyFT1y8cSb1gQKrt0V*+Stp!C7|>L-%{!W^igxIEYK&{y-?um|y+ zWjc99VGi%i5ul4e#2DEt48dgB8sVWeTYQ!|=q~v!!#&)qhn9oAzL|0hhhLE%Gk6;B+WqS&l$|zK2>j6X}rQiko$n_ z9-J7Nk2Y?^rHEO@%g2c`rO|3o;JZhq=%RbSP*OwgjZ>T=edO0J12@<`=zM6Hf`o6R zxhjwN5+{yP_MrEG&a6FR{P=$3@L~?DU|Ii{nlbZxE_1Js7%Zs41F`` zpW>t9RAnxHao#7Xh})yY1jKXR-{o0oyHa6uEZUyVmi8LvpVMIH{5(v z)KgKU&8r6vkw!pxqd}#aSO28{M%CWrgfiYvT<+aY=#$~WGaK4Bb>ZbIX$(Fg!vhtq z0bmzJs+)#tjG!|jEo=U4$yUAZ6fb=Ez|_R}=3ylN4mF?_UI-*;6s?~50B+KR z-?AnE7BimbwMXEhUw5v7a zI$4c#MY=oO0+5A$V`v7>)h&z?+;;d~i|J%lV@od{f)Us*|5K`bQ<^E$^byW@@XEya zVi+@Bq1W6@Q*l~Ij8Ng&_kyU&iLlfpUuMc=&G{1>Xg?bsh-BdHZ%&O@p5`Bf^X>1m zwi@Iie9hq=l9o)*g%i*%(k}x4Ad3pzXjsp!X5AcW%6UGK5LSs0iNQJ>z>%Ec; zpMzwD^&9s}$#fK49YoW^rio{N)UNsUQ8m{Xu*Xh{DY$HCL>A3971hn(STqBqb*E?@ zDlX!bMjAOuD~4>=eM~^audYshvvWO+wd$`d*Mx9Hd)r#F4I*_#xD7flk{YZUH?l?I z<^q)!WHzNy2+}U^TOIji7>Jwt+kz`k7+j;Oe2RH!VI9-N%GR~cVr~w^@L@g^QNY8& z#N!o+Y2v({$Kj{BX=&bvgwQlG6O9J0PuSpqO#ICy{}+xWSP( zi@)rNtnBxNjLVII5emV#YFiJ27GxZfCm=rqANR;A+Y}a<>N2Xa5EP+0(=<^y!x26u z#5dtlW-$aW~|sKW8FK~d1_H$23{Rvgr=l-xXCnT7zu zY1DhX;=!9$QfoHY6yFsi27mwR#_33rETusgbt^1tY?6RcB4e2;vmu9|eI(a2ISN8E zKz9RW8&vi_*peqiRUWvoGh9Y}U2H?*U{uTY39$WqzXmB0Zu&U*K)CY@bjSv1Vu>Py z9p9Bpww#B70PwiL-pthHMM=`M!3Vto0PCWpoXkfVJJ$SO3Q%Qk{az3H&ECGWNclu4 znCCKq_zRo@Hq6ixlg=qWE5h0V3m9e~WXT=Vw;Tf~qF^XzPG3>vBPbOH;$ekdZG^Xl zH_;%nPx@K&s4j3nQ*1-%cE;`7@<4x|;s|yM`+=p{`R3t?B=g(%9&_AQq`*+kZaK zN1;mK7^I&w(u{@VbA+n0#l&BhjyZ-2aBsM{fitUBS+*IlH12%6AV^`Q9eoYWy| zl^!1B<`E7mVsXPv#rJ}WUf~U&7-=zgY8okAI?ecVxVtPNtVzyttBeKAeGMPIuu~3U zf%y$8+7_|9@%V3_1`g$2Ga)&qlK#j<@W<6?$lF;VYkS51?u@LlYH1?6CS3-J8%64heK=rDrFL(EpCWqcJ%8^dT z#=Qqx5Svxr;R`?9B19(2lx7_Bck`ezfqz5r&qw~1_EGj|1mdh8Oc_g%f!`fw1WCl3 zY%_dZU-=?kU->xJ=&c5fCEQxa%!7X-P(knix~`F7Pp=}BHR)?NK}$gKPWf2Tv>Fhf z5jMAkZXtEhHgoY-OaCygfi)srq2LeA@b<6j;s`_D%JDuDoqzwID*hU2P;CWdaf);Y zTb8fT`p)_|`RbNdmoprHH~tMG1u;Ox{DH|>p0C5SG84xhuKYGvOgcC`O$ZDNLXEjR zL5WfxYLalCxuMW=gRBK57fe>YL%ML`J$HdAHOxt4ZGbp}RdA|-mZs0zrj?Z!43w!W zN8+?QqiKP0j#}sLnlhE5q&{@^I7$vb5r+V3-4z{u9x*dt(@v<7>Li9``*TJ>34soQ zMtivA3wW(+YC%#9APzMC^OL;>2LtjcTkqbUV*|bgwlbK6tuQ{utN?5i{SH1!GGvbZ z!UMw(wl<~yc4rR|AOxu&rJHP(ayqayE1gPy16*7yQxxgGx2VcYW#ew+p2S;lljV+q zOUrw5S+^-a4D}(gUu8={2$fQIrA7a<_6YVb5t)n4cXJ}y^o}XQ(dToP&A8gws2oBp zZ@F8C4G}E^1ZS?#K7BAlfw;`02l6rC8|DQcHJ2z=vlzrqb;kOFcn|rNu?UkU-`sN9 zPdBZ*CA(Q|)0bLJ# zI#v=|EbpnxNEHKo#T@1_aS_fnA5ES7^Q!BV8&U)3Agdh1yGEWFwidH`6+B6r z;-*Jx2T?H$_&LI4Hw|oya|61Bq_`Jyl`%s?#B@&NUE(nh?5+WNDG_5KpNp-74`JRB z@b~2mbNq91b7V0|{d1rcOFw+4j`*nID~y4LCiSp}l$F#GD*BJawQcJ_fU{o%Ujakm zP-l|pHM720FBbR;RNGDO5@v4uKWT-xvZw1TG2Wg3X-;|wETg&%vf%qLbC1P;?cn!R zL8L=w3+oAnE?R`!Z^Uq((PK}Unk{!i(h5~&>1S|Y2C?%DN zVA=V-Si~IFKubr?-KDnAAGZ;?E)O62z<7*<=pV+a3OWB4SZ~%hF`$M3wBy3pU|*sd zP)f`?d(LsOxTd|NFgAuCxE$-O#n_5j_BRN*g402S zXQ*^EMBZ}Y));et%c2#%8%E7{idSPSbd|sqS)`6PA<4(@g14^m(c|#MBkKF8DY^6% z5Kg65&-$6XW2kn0TOPQ7@i3VW>4mL ztm70+$)Wh@nJv>*pcm&SG#&dalv?j`9>8FtS_vU+-@$`n6QrP`DR631St}~$QBb*i zq@I}NGs*3U7-Jgr`?D%;Q`{E$VI`AF6@beI!(qwHJfj0t)c7EFJ(W(~{} zPs}Va<0I|>kL4S*?sZ^TN-NGxrBDj>`AafnK!IZ8u&2IsmmQ%x4O177_QBrSGI~1< zPvj}xCYtW_jFT`PVPwqCn44A6d7y4JDhRU@B#PUu@pxrjQHFbjTT@qH1jH74;a1&6 zQLqfYHB`iJ6Neg0K?Cq5Kwl?>a2oy41WQSZi~}e>h6m`O5n6y4(M9|A;-gHC-FYxT za_{jZeP?Q3$M0D+CEwKA%;=EHk{9aGCT3tBjesxm6!B(fD@#kibYfvhvhwwcvVy-P z_PFzWhpUBcwWg&-U0*$IOn4+O0!<;dkmk)ioI=7O$(!c`Lnz+-;9=ClxuZDhZ>Dtx z-qM;ZBz)f$4z*Vi3>(G-L9gV>gXnpg2m6}h{5n9@CshXkO>fNIVl(Y%&6+gAqdYr zm7yItWgHjvyEd4UGd|3Ojnw zm!TPYoOM_JL@B?K^;JUQXsyFOVkuJ!*l|GE$Vlg4&{V1{>37xhkU)AY)*aZ<>CDuaKWXg3xst3cDC-M5oCj6l8g6LFFdxGwdV*bqbB~ z$4uFdjj6`zD{lifB3@@)FVJ=4=`Sm)Id?XH^_>Ib#3thVzzv}~?lbY`3F=F3lY+i~ z-sIKWXAHv01KS{&tk^KnXAh-E^>Gt;5`BVc%6rbpI`Vnx3V{=Xsn4A-Pk!Jko)dH{ z=JxAmmF3cJoDVJ7?* z!K6ooAsj1CPC}?d7>1IMRx+7}bZX0sDmrG$$gj(?V$iCQ{3n;0a%$Vu2=B^VD>WCr=Y-|XiL8Ce*4 z;qG^E6e&rDW5WQxP~WvYlIZjA5l@TUx}G6;puuMM$VBC>qcVSHNBA3cT%8G;TroEV zFM-X={e`M6#<{d19PiLSDP?gt^HDn*Wmts+^%)>)iDQ>?V|!f3tX}OiM-oa+hsgNx z9pW1^EdNVeJOQSf4IM#3KTT=z?5##Y7Ia>X`DLw)Y>pqwE6pV)1{<9*RO6GyYm?Er zn3y;#=W$_`FoP(p%O@P*ph!wh#<-!&(q*r(dRfZufS1g5k;abF^b9mm4e9!35^A;W z5CU?s+JJaO`a~R+%x$2|iZ9}A{<|mJ=;l`|HbKYmJn8+Gg~Y}>Jpa9CPFwK*M9761 zY)@}4iZj`nQ79=8RHuNyN}@G8<1Rp^NI{pD>)`A6N=|(I;#XoH2q-K?RTrTczXm7u_pt7TR>#^G0bgX@%fZV-^t(l2|Sxf>EmZ z_^<|GduY=bfW1SZiJB4)XhUXZ3`a@1S14A+^Qv{m7|-eW2qneeX z0=r%e=K42UlbLv-nPpfIRDK*yppEo;!d~ z>S{Efvd86Q%t$M{tEQa%k)4YbroV(?)CB-zd`K2^%_|QA;khaTndHS6Q|F4uBZ=a8 z<=n8uqpE^8TNF%C%s&z`H>WmK5@9cQdK~e)>Sf%ECkIRsUh>GbiXixyb!@YyNhbj^ zuPL?!!suA_W!v18oVtOKu{kvIKZORV$zlfQV{|caDc3{*EfQGz&tpJyU^I6P9HHFZ zuq?j+acN*at#Z3~LG|9bLP+QWh4&+jIgI7 z`d}81PtIoYj`xnH$ewivQ-HxF3t9>91VjZb8|yo;aT*E=?Re_2{$V;0D}qXQggqn+ zOT7wCH&E&_@J~+p(Eb5x+ZUClG)i36uouP~;Y9KqcGyT5MD*eYh`>^<$bK&z+Eilx%$gbq+;oC!s3pbCfnr4K8*Sd{z zffWoEuasC>F2iEG;&$S0`UQBs9}QE0?VM>rJgqA-9V$@N3tQoKzTUx1CP(~KhF?B+ z1==Avp!{^gf72#Z%MDW!8?xy5b(A_~pIwv&@}dUc7j+5}ND4#sbTw ztt2-EU#b~3oXo2sF;U+p`3*-+wN{LXaohzD>NTvw2slCd&rMT9;f8>b;8%9rAy?k{ z>l91F5^ZsqWtIu<;^-_RDIR%Y=uau1uB(v5arwh`W!t~q)bz>0R}Cy$u5#U2TXP}V zTL36kxjgvO2R;LY&*WlGd@(5Zb_v%OAEO=DPFF=Hw;RaFJ!aHfBq{7 z<+VfTRa1%&WpwiBXf8k|CH%bKhsp0?$;3=~N%mogu4M;JEFg7OlebEIn96Cytnb0p zIKqrK!_3UO#O){}6wIs!u_`O! zEGEFh*|3)ObfbUj3gsk*TCJlTknT0}G%>yc0c`M8w#OMRW}(p2(Rd+iI&pt&Tlxld zf&TZm4dd5b{dOSw&A}Vuc;F1Cxa4=ejv+k0-hXOv%apyWY!O;MdmK+Gd*ogpQC%BN z!x5PO&fGRL?(XdxLmbd4ZUrWzugMdcl6sgU11lh|VFeojjaN){cRu}yxp?1;88V3T z=ie;O8Y8!+E5^U^1Ouu71VGRX#PgA6kz1E6l73gK!Gi;;>(5l#VfvVtL6P>V$tJ?Ei&6eDtDPriPDGC%fll?@Js3&-8( z0}(I2dN>PsVYR zx!YSapDvPL4F_idQ3c`3me3eVb z?!`xu4H{XZyBiU0aTyYZ$QF+{8xtfBMzUz@Ro)N=fMvi9mZzVFafA#k+xLxz91Qc+rc~nGH;Q?m{=AI zMXoi!S+$4?EF5VIWfPb6Ac!GTJ#M+?Iv5m|6jr!BaWVzqft7>8240~Hq=dTgL}al{ zm+)dPi`=w*K3Q(laG%yl-c7kQWW$dUBm90wv#optB5+&KY8uw}fYLaP>HufycPexj zy4lX$Qf*c_cmeJLjCfJ8WE5J5N+L{mS6NnO*xp75)*)!S^ zhzu$E`;DYe#%x4dCnX_aqtwD%lLEtT`L{grm%@FoB<+XT;xToMD8e8DDyT?s1yn)- ziv5uf?RuECd=Eh%ZY0*3%S~4W&v2x>zop!w6~f9$-nshiAAVJ~a}OOpJ}*k8`t!jR zq8ixx$^z{nZa^E^^&i4jc`L{L!=V32-*FVtio+LTiGcjrukbgt748mQ6LrUANzV6n zs^8@dx-lV!ldy}pUppMM{!a-R?<%KkMwsi7S6nfwZpl+$a~r8_FwdG?zZ|b}Q9ue+ z*SE|H6QiYKv6V3Bhb+N{DRRa3pdFo!B6>H`rbr;7sgGQCmGI;<0O&I7FHzi5@sU47 zj%O(mHuL&5SsKg9^A(Jgwf7r>4BnqK88y;o8JQsjK}c|6_w29dGMBU}7cXg`F~*8h z3$ZAYzp6N!Z~%*J%5E3PrmoQU=MgP|c}MKHQ6F9&#(* zD(I=9&}~iYT%<>W?;Pv3Pj5&tM`D}~^YU9|7^!Q2BPa&pGIZ2d94BF@oi`5M5^Wx#qfIv~Ao_tCtXTS!pEXfi(k zxqpuiOPJYMIQzm_;~Gf*ULb@_NbUVgW>jtrQZNvb<0K2rF);>xCn-017;PSNO9xHB zlH={AdeTH}(kKsO#$zP@$sJ+P!we-Z&L_r0j~_=21;1m8K)t$JV5_6qFo_U?+dk`@ zBC-o*)X~WuKXOi++Tqk*1PRZyFd4F*k}TnP6=_Wm1&j3JSk*_Vl|gOxqLd_0rq$Rl z!snRZx+um7guSIBt9XZ{+!E9mm~bO~31cd~7KkO=tV3-8KK^k6Ta|;0K@+S!c1`(M z#fb!XQ+Wa5hH`ihyqXM)maT{i4A;ZfM`OFm>5Er1fnjQkHDyN1yBn9dhGK@>zeGWYCLA%WtjBa6OyV@)VJ z52$HiQ2E^;OVrIRW;Dv=CY&q}S8&OLy@L{+VySY0&{Kk!4|`w;I=5y8TWUl6OWsdB z^XCFlVmmgo5yLDN$pynifX@qaog6s0PF}zcI0sF!gGp;;cY<>w8Cl_nC-NQ>4ZP>* zV7(T5H>aiR5uhO#MyxSLo)m~?QLRoUbat;()WB7y+ieWQHIsCvOu&`{`ecp{v}Y zz)`2uwHZWF!cV3MoFF^Cm0Mmc;ncvm<%9z~8e^JvtoZ@koL2(U!`m*+{Epo)6}vBU zA~`hZ^e8k}c}GvUT<|d%amGM`N8fdDaK8ei$4|6O5weDPwVS_n-MaGsWT-S`@of1e zVUt{%a&@WWS3M5Tyw5tCwrw0qA^#JfQu6LXi;sgc*KqJ!WGZvf0yQR@J-EEg(7?;p z%=HnH zazrh!OhDr0!Hx`0p2L7zS>nH)In^{W~N`foI{3AFuudF*Rw?r&e zl4l@XEc3xnw7Q}Bq`KwA8$nyESH1$ef-w2QDriTScm9(tKJo?AdfH2Ynl*@}6m6xJ zq(Z34>{!bY&_&g=9Adlwp?-li1y1l5TEy$>+Cu?`q_4*Sr2Db`ZBxG_nX0ip9;(99i(mc+1)u#qBY2E23O+v(v3 zDlv!omUhv54+E@zLmYXe5&#f^gX(4Mz~^#cGENf3bs?iZYl>OFwe(4<@2$l=xq)wr zeP2|#hWwkx9VpBq*y024l) zhQ_D)#{0qPgx$E76n5HnMhSxXix0>eC+cVCuhiqmf&^b8Dvh;f4(4$rnOc^32&N`o zkTX9^YEG9fiSDgoiO_QB1Ehg})d`U?kmHa)b1V330l!kALu9J^Kmdu zx45{d!9UC=FDUnQwIMnD0;Z4J0w7$Lfo~;Q(4%ohKv0_tRn%ZDV@8fmJIsgI zIQWS-+4y%&M5P2U=2hGX)+BwPP$l_iEr$f4m!k8-s<+;ns2@Nb(G+hfD;hliyt&rx zD6n?Kr>VhZmEwCbVS7dtA8_!*5J2=|Qf3k>fDNcx1A2X{@iTE6y6hR$!eH`j#qdi* z7%HRVp=&YBx0;fs5a|p0i`0N>u{w~LG3Av%&nR)kA{sj~j=!=3j_-@B2C{RxBSkz_ z6R}H`yN*3sL9NdxWWwTY1l|#L`1$z=>ehl4k=&<&*X?<6((Q_&hA9vrrb?Bmeq24% zNK9r(Eex7~b(T9SPk%}{AiumQ%07$Jt zj5r!pOiW_Hh8HSk6hJ;)^E*t4G0qS(lBt**nd!5NG;dHqo8H}uVrBe?!B&+Uzcfj{ z$Y5cRM}l9YMku*1OoB`qW|T(dTKKz^|1g9ZMD)uE5^M`VKia85Fn3@Tbk9b%z!Cz9 zHPlr5OI!9^8j@g88<4jNu4wMW9ylwkvFedd2>CTB!Z=C1jwY$+=;MGKxBCCDMCRI& zRraRf?K>BlWS9%%w}E~4PzPdNNG1vK%9syYI;h8a(9hPPglSt#90_nT8BUAC zU&H6@eVDMK4oja92DJ7&PJdF)P(7_Fr?t3~fbUwDy&z>-c)1k|8-r%bU53P?w_M@` ziW1F6qeZd$XOjrXqHL_GlHZF?a1>jXU>?LPE4?DMj`XthpjUc~k;H%O(4ie-2jS^h zI(jHoi741|nE=I3(F;xjIDB*G&Efevn>Y2|Bp}1Vh3#7tBDx^9g8T&2XOFNtB9gW# zQiANIFl>7NGRLFl01&;-cOu%6fPGIPSsBdriwD*0f{$T#6-hZ1qXZnIX~Mg>hL!hG zZ_0AisFxz{lvrQzDU|lm#YK&XNY2704;-5EnrN71C1QukpcWW@`GoqN9~I^=?-+@5 z3!(+S?weMcCVwP)SWI|7n~!*Xpj?(>|`PGG=_ z$22Z+w*>EO;Vg$6#A__@>n-A}#Yw!lQ$RYU9Q-2IE-#uemZJGc?4S3a3rN7X0w|8M zZ5W~%d!?+`IEv6Z&=$Xw7_Cjb%J&B{8JqZ+E1>FCanbEj(30md;a<*6rNtalrcO}O ztkoGJKXKW@dgh`~O!>KCN-n$Xtqcyz_ViW2%C<1(gvgMp?{SPUBObxKZKl3PT#yHI zAdNa86YMxuH#-}N#zBmK!;9fPSTif9(F3A}DdwUUXRIWg==XJ$=;|knzM7v=>MrSh2 zlI%UjUT>m@Skuc?5Rpyz#4~cU0RY_rURKzaee(S&=i#;m2c{amvZ{(%TJ#kyTO|jI zDc4cYKq)N&Ph1^UQD>Hcb@%$3OlE>)xpqeSBhFP~%WycSGVf5I7Lfmrk^&23$qSZ3 zd()$Dbj<`A`35*Y^=Y~yD|5_oWJ6QJDo=&W#jO1p;WsmTxoGhWQjF8=N&M^DvPz-` zA_d4g)v1S^Z_KMuyV%7Sf6lA{$dRC0@ELs?G=OdDt)}@mDdH3wQB+XjElnY@HynY1 zKpt*gRu{{S0wn91hEFhD?f8k1ko=-D#M-5;$RofZ(Af{r`6xAOk5Dzu#2I)13h!-zv_ZR! zP&>8I`!Z`J!EqE71Ke#)y2&tJ86I3kQ$fF?_9?y?E+-B110cETd@*z`s&)h`p=l?6W~?BF^Q@lf0%&X?VZVx>XqQk6@x&IG zEil7UgYuT(jbeo^cA_R$&ejbTpdfkzHJ9WpE87Mpxyw+NB~HlRxh_Z~g6|LEz0{I8 z4?{5`)S1v-C-BCYPMA=&ME z(|93QRyo@X=E_T z;H@_RJ3z$0@qMX7Hsg4J=Pdzfwm}o-06I9vaHA)Ry>OzuCQce2O|FwiH6+>RkUNfo zfzynHvIzF_LdKPRFC+kMin%Ap;&@(mD80u~F?E3dlF*+>jZ-vnoQ3)h44Vw|s))At z^M8oFO{We_Y_8QRQ-wf<29D{H>Aphrw4LRnDo)0~uP}I3X9`Uwp-FVhoi>z{uiaFq zT)IV2;sH4GD{nqZ5W^~T`QeJx-zd)miU>XMrCNxGFE?;bX)<+Z%MJxEp{AfAIgjeu zPjM}mjwB3Y;ez$+l?8wph!=DuYND1L6{PL_^akO5j38USsv1XrIZ;q0&Cx$sI>gwV zXcNc(sJ79ai8o2+$a|9|C!J>5%y*)n+1TNfv?Ap_%RUs)FnStzn+&RjEudjb8oKn3 zM$Xs7p7tuG&oF#(D3A?E;tLFF!4_tvrEzbd3F3+u1-2?qDw z`MoS#Wrvt%8dP-gA!XnyS$0kT&@1O0{!f`cJ`zI*J6m2Od!ok_7Ee??1X`ANdP`1h zF~!tW1LNzhULPYA`>aFNwp7zjS=*)Tu^lyNgRGHD@iON(z8W&#Ls(yKW_nP96E;m4 zDf{)4!M=3>%R!oc;60KLS8_546gi0GHTV2+GlDRO|1+agPyW&!>2d=^K3I$BUFSwZ z&VWY|bYd2@m&bs!4KEm!m;R6FjyxI?zCpqygt*1Sq9t%Vz_1PUq-W>WhEl^j`yUIVzvyTb z;lR8cs2(I{&5uq$WM)D=HrHmVZ?mZ4tMEZ*=|oll-_?1IiRmF3fMA52iAMnD;>hO{D+;s zjgdDF3n$H3nFc_ogr!NYhL7nmmDvnkdC1ILJ)x7~pHeDi_0nfljkVR;~=Ym?vVV(^|Amn38Y(Jk_8#KZ}j=z9$~A zB=R*Z2D5U7aliSKfr)P1xgxi3E`)+x!siY&>?~)n%D@%doc&F&(9cylSCeWUA4c=9 zI}Z%am!yvCE0}L%+|tNH@2(lq7oZ7*ZigQHN2m$#2N&pA;z=Go(~H_y*;S>AVHfKk z26jw&Is{Ag@Ta+|W${;&v2%;-ts0jf4_wx44fUZBR`AWJBJ;jqy274VW{v>BjKJnM zB2YIe%^`OMlIRmy8st9|As5D1%|vm&k?8t>BcX5OHR|Za^Ngy7a6_&$FPz0sTjvQmZ&V0We_Wbl2l?=OUF`Fyi6g!wENRop04G$q7?Fn0@Cj zz%puenrjd(cO(M|s;bSq&PZAvo>q7=6lCt?x-AiTf)g^NCI!8uaH`?0KMlnyl*Lm~ zRnuWq52k4fYm=i*y_qLUlxbBaF|BH93r97(O=|PE>q)N zl3u~T9>o&^0QvFb9SHD(`@Z*ID&8QikUYUl>_Lh^AcS;Qj-jXLi8GAB4lV$nPfCWF zlR1)7D#Jq7;rzVfg`RS_QPGx`ZZh!U7tzazj%2c2$4@{ygAgU=R)F^y0Zj#N54mcB z{^pIVN}n%gskqGl!y%Ql6SJ%6_&K&2nuqu0f#UI=c}2o*c}X(g-mNsB35BoYj%IjW5z*aa-uoP;?ku6PIJ zd|`%FrMQoBi)KNARE#A{`nzLpWC`={Dzv4dLubko3hPh7TR=$Bufc;S?dz~7f|yDP z2A_YRea3X`WbdcH164wv6H`TH))V{;MU_qVU(h#THNdJWj5S;v^AG8}{QmhBM7krE zu3;U+vskFciblWbY(hjAV=ruL$IU#CC0;#U+}RdAmi@NSQ-a+y0uYf@Rr3 zn%l9~jvK9;y*lI1B9Gm;g}Bg=Ng|9Sy3=n|VL(j>F(-A&po?anog&#nz9uCy^0VI4 z!e0V?AJp`gA)BvM#~z%Dk^K`A5Pb6%;uuYrsiS}Wg((kU$8<4KTh4!q!nv3L=uv)( zJq@aT{zf5ap*S>S2vOR}4-5ZWE?hah&#}K~F`#d-WG+!Nj+{2OSTbZ* zYktC)p_$#FcpEUZU{IY50Gh~xXqkCGE+)kSa%zkKta#Zs`TV;ZK@wU66$T1tqODEL zU-DdOa96ZNFjEwOaV3B(`S_RY#iqP8@no2p_=aSQfeP7xkdJEE#4vJ2!VZn=e!`h4 z0oqdY!ML8j{N}_QFqOiY8f|2ii52z|m^&l``g4p4j>p;u6B zn{4pLx9*VyRY6FE1$h$#0E{WtJ6jIagArCR?|Lzx82TJ}bT~08tj$_IAqQ#tNR zB8VR&uFf${B7+$(n`n>UZfCNEIa8h#T`z_KGel0tk0a}7On%54S`?<`oA_6%;VHvk z6&zX3?MTukA%k#ETK2z0fazY2%#cDSthqO}iF#}D>HoY-#&DY_NN_rJ{OOvM(-iP$BF-*SsNloH6+Tg)9i-5Zd6vZod&N z4p$*=TCbR6JKdUDf_4J~!x7IAHD<@&4B&z+(bwO(RVs&wE${^)V2iGWCO#e)(tdJ< zK@fiAlVVgYTo!a?V?DyI_5{P4!ei%tQd^DrPrV*!1! zWgWU;q-6%DTHq@D80-W0WLOVJq^Oe!MMze%)rv2kUF?_P)h?)R%O|>&g&|?^MWeSJ z2MAHv#6sdYeP`xxRO4&QFOH;pTs*$&fujqmG)T-lXCfHnh?hg5Ma1OKjq5Ro{Jtr- z&ezJtmW0Yz6cWabbfOAkLeJ@pUFk8eHce$l(UwGAFwHy;42bXMq9pox5B*Zg^9 z=+Bk&f<^yFfKyh;5VfToZ~d4x|4+kRP(a}DQ(_iR5IPt;_Jj!3KVxOQ4?8>=jmm4% zE0=HBK{LTn19J_pnUUU43*-j%Nh%%oZqp;L+KM09-x5*jgh+rQ35rHq=aag4mE%2R zIu`YbmKTFa#d8FnIZOwwU=gT2`13|4tFn4Pr~m}e-o}g)3k;5gyJY3*|MowOSXG+S z?V)a#fBHu)mTnk}^!_uyT~?gwSi}4(=wVn7dG)x45^kI1baC|IsSE=M2fE<>$^a7r zfaLasW<;$6%{E*jq20yWu!$?_c0Wctp}q#;6dK_*VQ zfh!?rm*q2{+VH|jq4IEL1t(D*IS~th$+9sf2|^o#PGFlqcfkOz8_*IK^UYZN1O5?I zSwzhDOCeb1Pa%&l))}b+$<@MAYxVI%Tp}CQ)CCKQCjPa++DThZ3k9kyHJqQ; zd{|}CP>MzImwmet3K|Zs^x;2bu39a@Cdx4|56sO2?Bf-8Rtv5gv2`KHWE7UAw z*M+cUaq&0_PySO~({TAIv}6(=t2M8suRI#7xy)Dn8z;m`2wYzI0ir4}CeE*| zQ09YR8l1+x^t;R#tZ))9<;woV*;lyE4aL0C5oZ{U@|iZidd$<{DEK?nnTy>nF*Qed z=ObXCqd|KYwp>e|_nap9FVR|Iq!6ogZape#x5=cyIzOK~tcc6cWa3_HUcv$usEnHY zp#n$tv?cmn&ic2XQns!MBEoE}`rivNT8{3mj=l$I)0$ictUwBAY?u_6Ha<9@ zQLM@jlQJj^&4F5f!P#XaeIK@MAjfZnu?u#+MzC1nfIxpinYd;qy-~~V&9my#_U3`3 zYn|CGmN)2{oiL`02yGvW4p;XT#;|&}Tr>kp#ZK@0X}Wpnm(1K4OPTmjFq_DO+XAP1 zumcR6YgcFp)Wpx3e49}h$OeGNW{gw9SCLJ@`X>7#eC~}ExgiK37ed}V^TV`@IdKvD zSop{Z?!2Wv0oh|s|5`ewTbKPvS?_YXRHUw1AuY*7FMu|N76B)2jU%u^K^q#LUySY5_Urh7EeI~~+0!cg zg$V;gG1FxUo5bZ6c=uh;WAD5?Cg9E%ER3GTsP%uLK!J&je}+DBh8s|Uz$znVQkZXg zoz5c~1|_8cRg5pJc(^oXq+Q?(Ks97$aHyLUFJHC2LMO}vE28Gm8Z;(F@E(r2YKwU{ zq-h?)noGjmEJw9#!W&EG8hIiJ#+YPR;g1|sC$>1|P(Ymwm&a$j(-{e1`G$_y8g^(O0Sbg`|H`@kUA7r&+mL~>{Y zrbZnPe~xinxNl4S`G&im}UJM*nl zw28Q|`nUb6K)p_mW{nQupzZ_7hA+gc|IRT>P=*&%sQ}BZQ!iaY9KxA@fEAPXlf5O!eb+hp`N3L-jAF07maD(o; z=?=H<)b@vnM^Y~mp$`ZiR6q-}L21&zwgJ&C^AZRu^+Z7?y1Gnhe-g8hEnLKgc1CUcuay{rH8Rx*j+vf|lzS8ngoXc_R<~Q4# z6+;wUGX11r_%m1)TL1fEQ{2zUv@1GuftpC2s=2D>B4&z{khJrsP z&;$7OdrLhK$-{I=K4?vCc~ruTkT=n@=5`jMG1i$y^5D9J;Sy%Sf%!^uLKn`Vpb*x` z5b9jU@Or^YTnnKe3L_Y4hs+)^`-p^u`yW7!nCX1K6~jupkjt&{>IhJ%1cP52!(M9Y zbFT>5C1jCi&$6&*dELSa92~1pux*?G5u&Bd`1@~dWzdx3k<72n)Te{nf#4mv)W)`8 z^eSWt0@d`4Px2zJ5Nym&Dz$jYrHMl9%6*fwZ?_MV+UnOi!uNEE!mHAayG|n1k~>NX zV8rlSxVUiC=vzOg?2$BWD=KEBYjeAv)hpKEh^k1tD>%hN3aP{Y=BsoNJf?yPG5WGgFo=E%-bI0Mj?nX4Hj`2y&MLR zafG~G&*8~dSxSyKNPrd1Q32Do$lPCY(3o=|v5_3LQG=!o8N%0S8jInYZB?C20?qM? zE4@hT*Q^y7BJGRH(Xc8X0h2D=4~d^ZWe3YDJIQL(KMa78)dGIih{CZPBCM*B!?%4R zYC=YCTl)d~u9Y9AF9r)(?mEP#?(if6TZLJ~jvQos-q`X-c8r>vZ1Ci~a<4dMTNGAh zN$yXCBE^{a=}`Jw$S9==!~2LKy*uyzW9TM|0MU$v9=F!+w(|?+9VtwM5Wm&VM~LH- z3G%>d!V(7UM+zu90LUN@xJs;%y-Sn$pSj5)MKy=<3?-!JpCaIe#cy*mMpsHPDn(M= z5{+h0uc7XDWwYJka%th5ufVjZ_Yv^YXlEE4W-RS*wzWk)Ohfi9-?=C&Zl! z?d5tkz|dU9;20{li2gaDLJ8BOl`all&9-@Rt_XeNqC|Qn(8@zG@i^Mh7h$zZ0xLo)n zo|mem3*D(7`K^6C@jaEOf^MRLzS$j#*|jutQUfnB_eyQq2MyVd0Z=OcHd{&@dA8X# z*0j?=n6M3G>#|?P3Gd#di$c}VxP_t52-^_Fg*IUcPo{%0Yz7Ai~E}s(3^psifV*qR0JY1z<;_ z*i@FD;hs-lS%Nl-}%_I}%h z^kgpbaP~GQD`vt zUa80{Bq44#K-hf$+(Np1I+f~Yhzu5|IGrZ$Q9k~qcZO!HED7ajjU^^L6>%$`te>ub z3MPUI&Sa&3C(ps>1K3f{`i#*6eHWBI>>&G_c^sK%A3N&bUNO8O)^nrK*~#d_B}SJTjdbQQj;+HN-<|CpmOb_@ z&LFD7qR5GTGoD0xay&gKQChesQ3ohRT-w=I-KB`*`O*1NJr(?0J#%N$#jYGnuub~3@gNsh6#;$dH$FHF6|3LzbkYr(5i0_goP8 zHA8kngmB%f|9!Db?gMC~R6jUi2NQxrn7|@x{`c!|QaIbizktcP;4wF{9&1~@j@K2@ ziXZ|rsxJ};I5aOVXKn&)*L!WU(4g>fzAc>|x^tPz%fo<^BNjZjF>_{`kGJ?Dm=3xn zNCIw7$0p6p=}lp@#fZ5En%_?^A;zCx8L>MRmW=NN7HRqq)Q zF9^-0#nW1bbXs03yJZI_O*+Vn7yW`6GL09me?ryR;nD!PT9G%?#HV;)2|2t`SNF;E z1TGv6P541KE0QS#1SPY<9*Jh?sz(OMECi$D@X{k1PL9@F;T0%Gl6Tg{N}v?LjebSD zy|?x}ymXA`H!9rXbsEVB>Z>*m3n%W}rC9{EHWQ;8oBD1wn^znPEDBzS5Q7o{I~Yk3 zYaUx#v=_tm2huv_8L%nFvr7fYt9?u!!r#Ig$9SaH*}=+MY=$u;i~f&%u}!xLw*!39S{D0t-03`Ygx&Zv z{W*5eyqF|ayr}DU^viV@p46*C%LsKod@Yj}$a4i3CB;Xj8M})=EoqF>M^%VmXy5(TTB5}bown}o1EL53gadKhq0}Tsf$QEL*PDCBvIhXj; zwoB5jrfyhd2vAyO0yvTtg11K}6l;UA{)C7SXSpPRqA&HwPY=$%Ck}-o0^7o%CeRk) zK!@&(KW<;|uL-_n`|mDvz6dKyml=WKxH(M4;=~N#%3ZUveMN@!Kh_;WhR9Y9x90-X z#i1~v8 z$bp+1l&A^ppo+M;HGW{#LdIVfIVNh%6H`$(by3jC-Lm9N57`D_uVsNDjDV8KgLemO zocfqOC@cELr6JeZQYChs)6MZNTMNJGg4!X>;h1Ei!d@JcNNvTSpL-|d*{(n>29wR} zB>R={GL=F^+J2aS1LKvtrhLp`6VsRK()G<20d7EjDSo0nsC%)m-X%f43lYO+;h zQB&SR;$HWIudBH=%Grq!;#jO$mqPp3l&!do@hxfjZgat7w=<|)W1@gK90Ne$*18kZ z7HjAb=fqi;cIyPslNwOv*eDTerZY{kOgHRb)<&Y*)U*>l2P8=1b3*A{?r}a8{ubyP zC~f0T{!0`&fYPbhWYjGMXM+qCX zA;YQfG`yCsK?SnVyzCQF!TTR~A`Fkq0A%*?RfF4A%l=5m!8@JHD6+uRAr$9$WB9}oX17o)aS^wcbbdRJUpybZ) zC%ZwF!}~WN##5Qjh}0rAkzCeSufXHEcV_L&I2!jV!nM0QT8a9wjIe>X3|cc3i|0Gv z`RALG1o^vPa49}~?`To3`Ptu$RZtbWH5?VLd}D)XJ^sVvV7@7_kPU`K&P=o7>BNAxiW?)%*8vw_QW!X?C{Y~Q zjH_1>Ad)z&DRX|AIhtZ7$i|-xuZ)0$0u%W$tr5tpZjS$FMfuzf&7Lq>D!m7ykL6^uVEv`|e-(vI% zr#GV0YBO_?s`O9b4YVg}QH&GR74X@WP8)SCNGbJ@CZ{rc3FC}2m!LT~UdRlK*mr&b z9WYNII5NK1%p=YauJ=i>emxI~-H8z$33)IgxlC%>EyA9Kh}G2P(+2xLfn1n&S;@5B zJ1ss-T|5eT7zpU{TUsYV6DyPc1jDErto8K8T9*oE!C+Ss4ua8-Wil5{l}tlWm6(#XZE$47}7fX7WiRB(9*-#CCVG}jc>>}sDW5Y$9evzQg& zv}}bs5oE%!hDN$aj%dMpgt}~w$(I^(+ys9JnHGpnF+MzJkq_%;AxGW#RubCQA73!M z)y7fM3&lbGo+M=RqLcb&GBnL8o;^frz(indZ?;fueUL~dy&wWGMdKASKcQ5i8j7E< zw(AvU=|cY68~UKgm!kAm4Kv!s;_qt+YK`!|8gK8 z<4c5D7kOw!{#}b3|Aa>i3Mn=w{qE2Ni8Ca*eb5ex9XpB=?*aWO`ICG7vM+o1C73Tk zmjx^TOOp#(eldn~m~#{vHYLx7oFf`B@+4-AHMu+iWT}zFpHk_Q0P=e#O^iJ{qBPKe z35csO~Do9ZYOWJfwmDsttGx7a+rDXUJR!wwLw>cq^dbPog|P0nL^)2 z!iooySHnqzkzEiC_AB{0BySf1#WZ9S_<~vswG$ffx$`#;v7sgIXZlrzQu)~@IyD^x z5c3LH1=={E0iTaP#%;7%718$)|8tZbu|FzV(>~(ec9vfxN@DcV$&5i7a9fMtI4m}l z_7oaA`OLxcfCtSP4S5?0ZB18TvXpQ|R$m+Re2mA9euf4G)^o>vBTC+(Ty3z9doy_X zy~k?`SgaDyX<1whH<#?Z6Pgqx=NZ~W6Ns2rS!SV`=t>GlXgMfId;1Q4EegFBMooP4 z8onp;zXU}lCh&YQ?b3}8M%t&j8KXUYORDbM3KcY9vxj2?GZSRa@J(a7V8(Jp9rAw* zvH!jpHih)LRc7Rx+y|S2xEkm`6xFpQv9#M=hwU?L;G1WK_~E*uK?xa>h3SlaU8q8g zic2s_1archgamvs*v{){`cMKwe*u}sH|vX}mH=c)1fLT|u26WsQ1EFJc5k^ZtmM~t zoZ+?%V{#yaiLRWX@jYpY9v$vGehSUTjog%XriB0sI|-oB5oQjsYhTr;z-maGVft~E zK4-DZ64H5N!+4BGgG(Kja0Dse4A{e!nDl@qXZK|PFk~$dgvq~aP6}g=EAwOi2}%yq zID=4*TyLnR)Lsr-)7OTG0Zge|>85>#p{X~^?_vjzRUXa>)&Guca~N~M#$BHoIHvbq z2XU+J^2DV2n$+MDa)L1c2Ja<-25I#Qw(cz==bgk=Wva(vF^{WU5NVjh8`(6=u%&23 z06OuC!$#WBwt%t`7a|L{&SgdDL!B1cgG~p-!$Fi}G(yr(QPtz*oQ!VzHiQK4qTnR< ztXf9<`d&pTvl?4sJQ8O+tuNV`?!LPK~bnPR#HDX9)6BKLjyE3ccGwKjz#_VuJL zFc`Nl)|WZT9#p-OV9BdJCsNEREE+_4DCu4(Yb>ak4AwI7{e3lMQt=s02xVJoGBLrj zp%!#T>38**xq+ZuswNns?US)hg&Xop2z6nQ&IR{p@W5tVEe(fGdB3K%1i8xGR3cS)|;Nrnw>zT$i1{H}#s!M{Z0djSIOI znZhcAQIPW@@u-%%Aa-vuR4zJx0=u?ytpBXfH7PDz0m@ww`LBmvoTPiyC;A%IgOLut z4_Mkz|LzzYtIrjywOMxAk$t}l=Q)t43}nvL8}WkrsAz8rSvVrY>$5a6*13aNzu*!B z1Qnji2gm!j4-o4>a~o0bfHp!#*#MYhM4g-%IGDI+lgcyRfYlrY{{Gf%;~OsE$)7Ih!Zl=7nPj(omK;dFHoV=<1B z?*_q)qfUlOWC^d54JM5(dI7U(G-oQ7my@=Do+O}S^cljNJ*D<#7R+Gshtj&bvJd10 zbCL*Ir$^lokGh2@>>77u#q49C3Bgy@Df^h!!iuaSWniNo%U*Bma1++9=6?nxBlx^< zuQC%t`xb}9R**0HG2qy*#lpt{E5<8RHZ<>R`}=}RjWPo$9$LiumN2$~(0RGR?Y_D-2${wf*c2$wW*isg#_Tob2iQp2#F#C>?5{|bPuu!D2g0utJbE%TB{5VG#QLWH4W z=viUn8+qQ^VwK$Z7rL@K5bxk^MO;0?meP}wTog;jn^NLSst@J1*5J}1@jqcUNxB9p z**MdX(@cBOvq|of$zu;gLGh&|zvnjPDL9Fr@NN`qb=@h{(1>2HO;h5@(@~>OcsEC> z*(M!%lS8*Tx}5{naZT6z1~_#bPQDen@fS7WaMQ|OX8_84F_nq$88OjW*}+(>n4Fpr ztB?yaa<%gN;At{R>i!~AFwnzM6T_sXV+|n)j+;@(F%&={58JKwmLGOu=Yft5 zG$OcZeU9b?L*Sq`M31f?Y!1zx`5bh9n08?6KaBBG_EyGF$g(_l~KXjCcazh8;%9=ej!Eh*`?mScIu;wXB^(4-2_!jpnzC>Ueb6k9@hkYHENuV6w< zLxN3C{u?~iDj{0Bi9$vpbpRa<08W0dX|l2{=ec+E;Z+kl`YEwNVX1EzIdLL_%+Ypo zy8M2aae+m5qi<_6`v{>3q&mt^1`6Gn%dBG@Af@O8Tpcx7gYPGpU)TnjruW-nltTNC za80GmIwMt+K)@YoBFqHNreyJ~W1Sqo19VHIr0mKl92S77vfpk{F9@}HUB>Gn#FDmS zj1Q}pO?l*Bq`q_14>iB+RFN;SCCoo(CXAvD?EiSzsZWy?CLUr`roh>^2NVZs3~zey zdy=-}*US8tEsoSOOwry)HJfp2dQJs?dffO>6o*C8;;G>Faypb6P}n6Ti~cr>R%m!e z&s-K$#kz@@?Dv^yiPt&xFE$X3U`?yXy)Q04yB4WzdX0{9|zg}PYz(%vLS}ZPeOc(zcSB&vXpvDZhtw|7m!*)lPh2BYFk;B4T<-_-iz1DC)veNc`UO{Q^}kPNEQV7G zL3DwHp=;u>LN|e&IyXg=02LjrW(V=S)ci?%ir^9|+YKkCgCQgu#0{9g+>QQ!5@Nv# z!i)w*K+NQ;LSeAsQ63CrA}`H5G$M%%;XT}wdQyA>5&d!+UNbN>b)F{g)KxgzV0csf zqcmZ=sNbmB!Iu1^0Ah*+2pH9Uo@jPcVmVl_V#kEFRl_OM`@uOoX!9@XoO`<`~2U(s+{qUgAp_$8J%LTOU;G&M1O1? z8Ea*ZMyTX@Kx6+Lrl)x^yi!kA5`Wg+N?cSVMSu_IZTEX%7&^V`WDEtN(TA19sIW~{ zjNPtc3&ueqCx*`I*)V&1e%P|73<597CbOKpEUFq_NV`yxM?8IunUI7+m4gTsKl4n} z&SA0!T)+@|W&4Mem9B+>0fmac6@pZ8_`~(u?bz*`ZHb>6o=ptkNO4O`KgEH~M8r~*r#~=EIw^xB z@f6QIAJ{ZI(0kPKh~t<3z?Y2*ca@Rg^kD{iK4zFW;d6bv6Q&-w?n&{ME1O>kfIpZ) z+?2c>Abrjsngq=ujW;)+n?v!%EcZtAE@nnti#5G_aFE!zoH0!O|MD!bC&jE_!=%j* zvsbB#4l9Gg-b?{jL#N6}6;HE|@q{DR(LRw=%J(x1Fdgj<&CxslGI&Q-ZB@b^vJ9u} zn+CKq;G|YB*V}BPZ!Q5NK=7ij!SpswQMa?Ro4rW$8X|uLUg-%jB$?v$xOP=b!JQ!!_>)9d+sh_^^Z>>o*jXOR{4vv`+aF}l$bpVuu zwF5u3$?)L5Yv$Z?BzcbIFpxfKvqKWoqL+*X7!td>OY$N5TZAQVrCMuH#f zs2lGcVN*qtO{BmlbwGS2;w{;|b`8eVK%~KerV2m|Fbck-KVhIv4*^QUifw-#p%oKs z&MJl@H9ksV8@Tzl0?Bz~cchb%*+^>?V{N{VRE@Ay6;i7-*cnfS@xnM55zjn3&f1;_ zs!q|!RJST7H+SNKWr|*r$oDfluIHMfawyM{b5Q?7_=2s7Y9FCSsopb?+Ds)%$ADee z_rSU{p-6b$X&#r){0YiO!N0ut-{o)8_u~1e%Jz*~jCbt47+Ue*Hr3{$GTczuED9MT zBZVLc-82ZLq#Ek==l9YD#f&^uZbEo;)$XB0Tk7nA>76|roCJ097Afb=?~6VR^q7v! zTM$3aRKaDYOG>-_A|W{b=uO6Pq)kkPaYs zqYz1!FESE(-bO~EXi26FVwHu@f5{{qdgFLThIZzcwmdWhrAJEZseA$%s!iY#Q$zyV z%Qts?_7dbK4SDLg*)CwFelcAk9~dXPbxr*$mMBJPZ(C;wmm(4BB1Vhv3L~3}y|LP~ztwW!)EaURve*ja1h z$0FSjb=rH-g8s$B%ZM8>$O(|OP^N5PxYLz*08#9VbkoIxCDSCnkKd@|GN78|4y_hO z+IKXf+EO$)z8B;rBR)#;?o2Mkm5lO)Q7oN?VPiuNNj?dav6DR^%tK75$aOp8#3L)HL zTf^TvrQsri9=2z`MAEO*^sPLmR#V4sp=3iZNO5$+AhHQ`JD67*2h;vtEuFx&?l7+^ z+RdDkHd&hJwgE2;aqC;wh;GxtP!XR!3qul;mra5}QPTDJY6=Eo^f!nnDc!A52=4Ji z%fU<}`HBzgAdc?UB8^;=aSlxzg-y=f zsc-=}kr3;u4fkPe)pJb*(eiD#+aNpW84z$RLN4?EGj{^cNPqrB^!#Q5h~N@q+i;zU zRRS7rZ_zv6Dgw^ky?dJ~`|XUpK-4KN;cV0(Ot|Jg2okbIK2Y~YK{Y~c4}+mJ^ox9JkHfSfr%p0ckOV~$ zfHufKRRD4TBt(3Zw4^DiW>cUp5ozuFG`6*&a~}vPI4Uh3){dcsxfms_gGS9S+oeRu zH`l&uZfbB+Xu=@V)~dAq$b$Ty`lr$Js$aWJrZ==7WLdP_xP{|Fvw`azdE7ZcPHc+W zhVBIm4>54A(rAX|^df05rB{2IN&@2_`ubX2p5fIbdIKdt0jc>T_Eu@6gKtlBd!1IY z7F91ejR3ZJ6*lnz$jJmf1NvTWkwai*)bRu|d=qA~5-!mufNju+&bjo)G)C`2IhHr- zf1u_>6| z`L-Ldg=|p(C)u4hRS{kE!e&666Fv|URya%^35cisHg~6OmeW1<@5Pt?G*~^*nlRX79y;gdw85IeD2jw}B$6Sgxec59fiHkaYv&;ov3+HdM@Pyouss&m z_aY{k^_(*3e9S|(9?7aH?ANzfB5g%?$FBEwfSOOn)QNi2mf-=QQybdfjX;={6sdH{ zV7vDi(@#b+4M#8%|ElY;-}}r|1+d0xY1w8~pk;s!v-Z!qgrXg{>RSNN(}t(&z53df zmOhvEBTCg=m!Ync#7+kJO!hQo8$g-&-QIs4M=hceYy?XVh!}d9Zo&w%rVLwzQ&FqN zk7ROFc%(>hm_fILN~l~HAPVprNb$(2`L#R}a3pf{&1hb;6_GT`XTiqEEe>U5lN7%w zKd%OL&*TRPCO~Vn4?M3l0AyR7uxTUh{4gDAkP@6J!g(3_YY?JRL^FjhzQ^*t1QqNG zT_nF1bsmPtB7=~8OH7TgaHs@`5+prx48NYqIISr{}in(kJzyn zW+KM#U8n=xFeAIVkQ)(b4XlURipMiai;2Qj0*lVL`Agu09zxJJ70yoeCHvljEz#)J z5vIF!QFp-QuG`_vd%UCoxH-8$?3) zj>-4^XI4oPOV11|(+?G{>C~AfuIPOL$@)*} zphy)UsB9;#YClADpy3p)wbbr|zFC@U)3yqi{A}8E_%68XNw8$KwnyT<^YqiiN2y9m zj7Q>9qF?$oRh(IU7^8|}B`3+KtRkQYrwQwaY*U4X2z?C`)=$yM6q=4+meZ^rmH9*K zStlyeH(_>Bk*|G%8zOl){Scy*0j-sB#2) zQzvtzxijdy@3kSsX7S|g`G;-By&?sG>G}#;*ZV9FEs{Q6o#1ma@%7VMy(ABI=Q8ax2~*)Pk7;dplhnL3RITn#f>jckjB*#Lo-#}%N|D^nP=3c^~k zT&PfgeJEL#ufstQ$mEv-sep5$eww(f0jS}4q_fjv@(c=v8D~^s@~Gl_6MWmpyPI?^ zYyXyNQ|92ZUGdG#+4RvPhj z#l=TH50h8S0frD6@5O3kPJ|u_#y@o9;g$8K8%#NaL^6INyEZ9^^odXk=2_yH+(FLn z>$3XFxP;A?BKIxCw~Ltl74+zi7ffn;ZYyS$w<>TLrTY%eBA<1qI7D={H_<&1coMR! z5f%*tG@$+C(y}=)&JlVo7>|Db5Tg`fCkOqE9@+%lQXeqJ6~pe=k6D`ilIb}ysmzt1 zCLI)hY8F*`EbC-J3F`m=26LP;*dz z%ko@ijz!Vyp$H}TKJ&9pO(!Wa=Wirs_DVwg)cL;@L`ukgm|Vr}$8(8+87vmhOcv8f znV1`a__|)S(iJTR6+y#aXqzG_PILhE=Q_+g7#)@@TX$D?n9C+qpRGJ(&@<)(K1K=5 zD7TKUZbnK<01i%=^Q}mlXm*XsX@-q_Vz;W1riAi?thR^eqwB!{XTvKo_D518NnZ37 ziKEZR#d^yErqHLsg4s*-j2IpOD?rr0NX}do%MHsLpg#HWpO2(Zm?tco3vz^Ci1IZurFk>s;oi;~Hy6%?0e z;L^>a3`au-ac8EU`c9orhTb*{uY(SV?f4( z&Ou;DMgm=&tJraI%#Y*2^;tFrR>~n+xl`RizsNL%rnnKX*>?UN?~9qWNF%fspEab6 z-y(ezONTRhfAd@s9hycZ(=(N{U|_puF;Tq8$)Z!8toJ@#`k#W$wwXBr2rV&kQumh< zUyKa#4MC2~BV|rTbzWEj{{Ej#cV6_G|>bDQn%7 zn@7NI#37%kO@inO1Fqi;ws>`zjy!k?Iz!BI0z>4_9)Wb|R2F8q7{o2S6%|qQmd!Um zj6v+cE?S|I(JsuApFX90DNEzi<%`=gukgD9V3R|kM=zT9wNeRluz0V`NE;RUM;g%L zL}Xs{_@_`F8h^MDXX3!?-a(9F6Jgt}f28!IGfU*!FjuZ2$YTEWb`h9(RJb#10!gTd z6+simV09GF(J;1+Wno7fmRUyM5)+DbPdiw zB>*;?QJ>Wn zO79u|PEJEmFh=$e^YK7+m8^o-(#^;RK>N!_7dk&`|=k&`4qc5iL~-G3Y5kJQja2 z>8TGA>^NDJKL7Nk7NrjW*weDO#&+G&BSCiDC&3C(LmdD8WQQ5qt_!~eqJc4Ob$c%U`qduzQr^Z#!-V{Nc0;|{{BZ-4n8=ip%gJKf@=tRR(!&75b6)PSAx?p z^JPw=rufVxm;#7n6H%=tGjF6q?4TaVM^xfr_2vxv*JdGm?_}_$R)cNk1W#FaXD&TZ zg~1+HtPb8V)2E5|ftBLj;ax==vqy|~59=7cZw}EV5BpT@DqpZYu86@|g5iqu4n9Hw zRnvU&9E7{NHfE%!u#Tm2z=T?uD370m?X$Wg-nz2ckO>bvT4T9lK!FBlRVk`|y*o1j z0~1Gqs@0zhUZZLX%84owk7{!Rr>u?W;8=1g5zE)|N3m<85MqvIe%RXXvH*a^1_*6F zi$sz=i{fPz$MfqD5M{f;#UVK-!hTTRx)4HHPdH4jx7YtuF~FZH!k4rj`Us_|0!cUv zb!W@ZG9yPJ`3$I3Ln@dqRhIfC1~cQJFASn68$=z5I%i(|Y9|NIp*mCEn&KxGG^!WL zRc?!X7x>bLz9jtWG<>~}n%cjK+J(c%VRyv%WU9wy`^4(s@pOqoR=I*qfMal1hnXj} zP!-UnlUnYpY!Il@T7G3^CLjajL;ealTf}jP;IhX^GBb2YCN1K8-40kPIAcK;o%=zV zM6!Scff;zl27>X=Ey9w^AzFXu!90gb#r!sR7RLE;`~mZFF6&hzy-+q5iVO8Q}`-jm~T|>G~JTbO~fZ8(|9sVN5J>bsc$p?Il;+CfA4y7DDJIP#y z)H)Vz2e?*D6Aq!wU}gBbDa{vWdI%aInQ{Mf!8ieKIjn|pTbhoOh;WMrw1fY}JFvXs zl85812nTR^Y2Ta~K{^+Ua`Kd{Do(NKbXjJ>XVEM{>7YwYi)Zm1r_QlNY9(s3c! zQEm91k|9Q8m!=`KzI(nU@tUNch7&Zy3N~VXe+n!E5IaFIazh{_9tXljpk?YW`)YE9 z4W`hf>Fop$78CRtTD~H}eF!W?~XC{LpWlKxNbT_vBO|dVT%ez`FlR|b8 z&tO-H`bYjmrF$HR?3{Ozq`MT{c%O7MLES>v{WuSrOfLdIic5d&d*O##irQr2*ytN& z_#6`9ZJZpQ*wk>spXVwL62xpqXWwkg4+nxl2YSUEa#LjulPj#pcS>$oow#T;n~u^3O0~M}{9nV<3RimNJrIIt<(P`$IH; zDH17?R_GhW9l2E^Xm~Bn8|B|Rg=?5qihbz2XWjYU** zGN$*Lcvx(}m}HnP!MSLz>;*Z1XNL{H9XaA=grBe-b1p+vO}$-nKiV=j9ayUUlz1p! z0Vsx_-n}cQ;1^7VnfXB6BX;vR7l1<(;xaXUF3o%|s%O)e(m3G4R)k=k`?u9b@5c+4 zlD;yUYwy!>-#aZpA9ZzT1%5?+u6&<-Bsm%l@T6iF=Tdkm;}?2)dQ|5 z#)mPdL8izQ3}4Y8(mJDoNd3LEA9y1oP8A=)|5(@GzvY1hC4M~AjfJ}~$>sDxhcU@h zm<|d7r0=m>wZ-pS=CeiqK<*CU%+GRz*yLipD{F zS*=F|j%~CZg!m0X-2>Su>hFOVNp#MMLEn!jE|QW{CD^73+!9;JGp^Vr#$o{r8%2Hu(mZw*yQNfx8`Pru-cWl**MJ zA{JB!bb>u9Mj|TFUK4&q*iP7(X^{$FhJTk74!Gx;HuGLINN^V*RlD)(Y_SI!T~K$I zSZbE6Mmlt8Z+h!wrp9muaaY+65i_%_@ZuJ48Z&*J)+bhiUu}N&b}&{2-e>4v*XAsJC&%w$Y-7Si%D+N{Dtqm_A<}#Im+D=7=qiJr)qzyf;6pdLx;nU9_RXMaInnPxdY)Ew!7HxW+X6 zJw`yh2ndTZiE74FR?H&bfdjvpGbdl2#`y@|P?H$`o5v9Ohf)aUY1`iyyQWH1sNy00 z;gkI;6>VVuSMbnx&~3_-lqR@`37zMIU0)C4Qes34sG0V?!&&1k!W{s^H;x3sK(WJ# zYk#{1k39Y|noy9_?w|EZnWS)W8;|QuNeg-d5GqW(N+cS$Yowy3LJS2`XIo5f5Qnfu z_W8B z$k~*WaphZAuWcw}B!07gLP3>0VomRWmT^vlioBoQ;r^4_lD4#<3oD@TRr^NeaKzR@ z2dMqsmsJlkr}8YcBa+a0+C-H$4uz#c;@Mh zaqjoNt9k(HBI6x^nZW3?kCEFf#{%hn4xw_%6{F$H5ut0i=!+q3KSkNn4d5(rspn=M z5s(0hT&?WIKT!cp8qd)$KhC5;N@pcemph2eS~8SVaMDnn4X}c%`xrqwHu?mW9K81g z1Y{e6JK&d2(Z#Xu=_C zK`di6KhiIh>?&04R^ES5wlIe9V0cz@7jkM5P0hvSJQs}fx2CB3O@uvD5%2&rypk~U zu)*{zvt~|X5EM>5lx;+7fD^*;nFpc7a5QO&ek&grf$orc$={)!^$xBqUG_W3ZFnw;2aEj^@@Lhbg zm9znf&hRR_7w^i`MT9)P1t^F%6Y9w#Hz@7pIMf^pC-xkqc!TKI*xD$)NsH9_KC%0+ zAa-}uIxM4*ZBMvg_$vSy5OLgbwbiJ>%mQ{4EZD{6_G8L>CYO+ii$uNN+@h=aR$Me) z``YSxdXbV)|MGICUnB+iW5oJM0s>R;ZNgG%B{-}vX^V)Z&rf2gpmy`FdVsenVl3D7 z81oyR$PE-f(n|Yb;>)*@%AX@0Ft3k5-bk8zgi9;)l;9bKi`|snP?U0!$zCQ~WVLJ;6SS}|o|D~Lkdk-8UNvV;Sgfft=*aFKeQkmgs{qdmal>UE#iYDws68kQ`NAvq z06kG}O(7FzE)N$&>Sv(>%=c;7FjYAr;3C6_1I>Gk0XLOcQ*o8PdyWS4m9r7FaV!Aj zJy=)~3m-WH2?@QO|Mp#bxM=hPfBnb~TU)`M&&jCI*vokhR@B9#@@Ssnm*6Xe-2O zzxjL^r(H7IY|V}3QF@x2m$cu1?2u zMm{21bZZbZ{AHg7?Rw(o%X!>Y0E+tK|Ck|oMb%57&kRK$+q=CihXY(=&bgwW0bl_4 zD7jbaxYB;hiecU;ND_Pz@>pjlz?^lJ<$+Sffw9EquTnmLR z!eEGHpG*Pa4ybi>xyK~KcIho%2DAY`upt}xkkJJf!Gb4@+ObCve6#o>iY&xsHJ>k` zSV+yINsZ*Ae6n5o-#P~~H;Ntmip7X3?!63zvXuOh!aReQLVr$xd?|qz#IS~w7LQQ1 zo`Sd@tlM<0p$g4n(ezJfNMfrFq0FWE2}N2It_Nk1AU_Eqict`0&a;VLV`kUn1X<@%l;ACJ~QU zCEPiV;y}?fE$HBw@ph7mS2E&MQp$IU33-kt8dEeR-~jkhGg|}N91+_T^Fvv|4X;ZJ z{_)a6g?kEDHl8!TCkpanEri!}6ZuxOr=f5cg%->3ZdnrIf?=;a$lpdb%n{zvibcuV zNA#eJL`VaM1xzy5D|B5YYCm?s&eA0pe+|{zP<#vOa3FE6r00^!u}Q$glCA^U*72JU zNs&qp#xqGCQ8ZnSS&T3c8_;{-f1Et&6@vZdMIsrp8#`9vIp zSaXD82LjdB;+!xLf-_NA*mQzHBON0VFnUjV#Bp<`<@ZmmxAY9m1{q%r{3sguX^8~e z9|@Ue`VgFto@x9@x=d7;6ZRK+-K2cN#YOEt*v~1>!U_V*VbKe}gq7@`U(1>e)M`SN zUPsWQQEcfkR<%+J zH5e$#_d8nr#_7AKVq}rZ4|9fkE*LN{{@MFMv!&hsiVu1?Qt~#f_?5yM$e1^EV1R#? z3z&jaj_~~z^J463!pT$G>P;yTZ46nS1IGJ(DA_7@{E<3Z%o#(mU1&%nJz#?nFI85o zh1lRTX;hh~2G0b3f2^4Kyn+&-Q@^z5XHQz(7}>q_P?q>&M;i!AheIEtDo)Cdoy^4= zS`Pf%bS*#JVO8^*V(UH3`RPeu*6vv!_G38OpEGJYbar6xQz;tK8?M|%vAt9)2qce((-r%iC9sM;Oe6}#3N=h zEG$4Y2AkL_pAtbF7KWwRibhHd)hZuW-|nbT__Sh*IYKcl?5um#o~X zT+(I~r5hhZ$4_0cYrZl}I6B)S?1)_wzRuf%LA0P@&#G}qy1fKKs57J!_}uAry(LLL z3^a!`^eKdaE4I9-3Z3D}K3MRiNaYwwg10aG+aK6zS*>s|R~gx-ATe#}fkhmd#N0vI z25CcorUef0y@~H|FtKJyKQQSC{K%ft_pBRwrz)_W&a5{#7vVW23~?q>B-hpb0C zK!THqn!{^}9Ye@uGtc$DGs2cs1;pmW&NEAje~yN8Gk)LI+~uw{LJFW)DBRNTgt(1zNT-#OA%d4-=r>85Sm zOBKuzB-4>TsOiJWPm?r_^EAFAN~8Iw^@1r6?->s8REooldR3LOA-JFZGuu_|QRqQm zRU2jHk%|)tNt%FLkeU2?XBx2G6i-#w@i+l??`Ja-*#atZgvb(Vg0cZDZXvp#HIBPW zfat_I5xjuYzo{d^ZOvDW`8(2 z##>Vj$@c#ksZb2xO<^bP!@IZ4$2d5nD$+h9%kk%TL#6pX8xbnWZBg4YCBpk(i4pA) zpG_c#<@YVtH{wKrrKCxXSsW7%wA3Zk13YI~F|eDFYk0Gr@*Yv$9ArP75lNBDrA#(n zdZd6E+P9Jnc6D|IPT^ymyqAVj$B$50`W7mtB;12^hn7Hc*2&B_hVxq^(Md#9+PZ47 z4MWDzx2vmZ78NsZrMX;2OPp9e5%lpRdwNj+m0Gs>TZj8gT|;sAL| z@t^d=EA2a>J!mShYxv3wxCuxKJO$@v>j~Qqg+R{%;~cwIsH|yAsmp*VrJYZlSF}*k zlS0=Lgb6f^80V44D99Jl^C!&|)C$}x&v=U1i7=Qn$7O*orQ};#u8-rXWeS7Aw_azh zh#3S^@=`i$a$eHahz?q(2Br-#CEyBeBxzm^5Ey$=uRZ)2n z1jC{z>jwo!*c-MOqTH?nfh`KMw-c!FDzH51#q>|3xM>+;oLWZ|)fOcI5;Cp{OXG4= z6JM;GM&>H7tw@tULf>E25Z0I-EO_~K5D>XIXx^&?)hqo%9pjB?)BWRT4C zf>lGUfQXQ#I+3dvK{3+-3i(ww$ii9)+x3-1-^N1+3AjFUumCEH-GfDhvnFD?k*{P| z`v6oXjcv5nEy_V&80wGWu|9vSi7@JQImm;I33^wWYL`&qofC#l4Rhzw*^1*6;o57) z!-BS(SYKJD=lx!AiK+lKLhP6IeSaf-8@La&FxN>2Olpf9PepuOm-p&|+3ZXmuniKm zww0kGP~-}eV*VC??GLWZB}42H{eIb+f4wmV50Y#^CNZoFzdmsgGxrd0jY;W7Sv_dm zBQgU}K4UxL52_7<0*e=jfk)y?sjU)izi-3~N z#9=ZDG%}i21K2f4^4KP8$qW`iUx=nB;~?=c)*lQuf-r*5-aCXU(YE6ExDF|KIn=`y zvBv@mXR*t?L9BuA!uOQivIZS$fYoi_jaw|>bBTkBD`Mp#iH&m0hj%rA<%jlA*Af-5 zmA^~W5ib_jjnU(0OC zcOy0kwff#x#j|H7jYu!wV9VYS0P)jg*4g4pawumB13lj@qLe}NRv%(Bd&YI}o}>~) zig&7F--Kz7IX0l>%%X~7eV_}tI@>Bl4f#3k90!3x!x4Rk0R1R>D)Q?$SzjWTV* zBH++puQIhL-FPr8@5`r7wwZ>dTwz1Iyagu)SY&k33MSO9#c-0t5)-Sk_{`}T;U5mC zY9k=}9jwv-y*~TblIv7``ul}|a50Ydv?C>yS2}OER1zaX6l{DjOQKVU1z^d7g;=tk zk<}C!{wrJ^b)E++a3$oB0u@a^^ooF;2o(OQ!t4nY4fOCqK0E2SVzGm3l5aPtRn`b5 z?|kFZzBf{{49=-2%kJm@;An9rzQe2YZQEDo3=WS7TgX+rkrt#>ULjivNl9rdN=!Vr z06kz2`D-+dM~>iAlZ&@1>=9JWN&1f1e|F6AU(SD|wmpXk_jw7&#ZuVub3nsc@FRDU z7I4Y1GV@o=6cHZA!h^;N;JcV-fxxF#u%#u!K+DfbCXx&pSo)FZj99nz_0f_s-aZaI z#7e6JVmq5#O(pf_=#ewL{LZxk_R>rz zHzm?_)ao1(Ws6_uiJ8<{mNtPc43IM{u7I~6)(K@L(No{%YgBo)z)K*4rVA30Dc7^O z$?Cydh}3q~FJoq_Y@BM1eV8i3Vu*YqX`)O=0aE2!9odu;O;54kmR&d$ZFTEN%A1vD z^S5r0I1DALwa@{f7nB>bplGB!#^LIQi-<-enK`tx*V>u-19^di*L#O35p0b<@-UK} ztD0yVeJGxYqv$!kC^@cywZ$(ON;hS88+Y-TAdwi0&a;G~d8`Kx~D-1Qr zL=KVdWNnWj5Jo$7~9Wa^Q{RAiZn5JqWfDSDo+r@ zH5AgtSLY!PcgH`J@zq)3teH%fY3WF#Mhe?RVC75+w{yA-c_-MvOV%oE;)kVI}X zh`AXTHpF6L%2>__jT)zJZQG4}F~HD18k)o~Af98GO_%CjF#GMYOKTCENcV{{PSC=j zyyvw68(gAqKf5;S$;-!xkCtl9ju-752Cs~tX2SO1jw3{x%8GJ<@8q*Mm9a}f{h$i$ z(V=8wwK+m_2;u~r9XfhiMUhxK_2xpOq3C71z#T!usN{<)I37S*a$%Nh-WdRp5H}1Q z7`iGx%M{)U@w!KLhrY9P+)db6rpyCFVEo1^gfuIS(z4R_Hf3P!TK%rBepu*ajb3V8 z7D2uP^l*{a7&BnXX5))I@Jl-eKmb*DjntwTjH}Pc1)#>-J>@kx5a{!FpmOd@Qlh${ zK|xni?jvbU^blVas~mH*n#OYlC%nB1J0!k}nyn2*Py)$g-awD){7D94+l3oAHM+k! znCXcON!)uqM?SJZQ(A4Gh(r&aoAXU&C6-;=$@PT=%I>bm` zDz0AE+klx=r4T^f|tFaoyBrt+xMXRuO2#DxM&?%7>>DI5T8!-K)eqBA1Z-tl^GqnS?BR{#{ z8IJ_(#8RV^nc*?D8R5~)Fs>%S#7g_)Wq%F6a2^O+uJ@+6LBUpC5EJ${t59X!fZomZ zdv#Fcle56v$be)FJLQjYvOByb%TsnD6a0XBRqhD~f4T^xTdsrYXWeLPVGHk33QqGvxm7r`+Hy9;mDr<`7JeW7!=0#vkfd)(-Ts zczR>WpPK5C1`XIc@_iv|+sFjnA%LGkI!M&d*4%&xCIIS}X*j9qffsF*>`u`J24Ic4 zw_DSv+Qj-LBtxn2SWyuZ&+nQonZ>TKnB|5>j4-)Bk3+piGrC)`2e zFkigcbTzAQk!NZiio_6n6`3(DsBW-3hK5y4=GrV#K4WA@FwJxV(rT1Ti+@ScjzX74 z^jTjh?9|YIDh8a%SS;ThN_d;`P4ycZR3>ybr)S8ucr8x9GtN60`N`^n##ExeM7}QX zJ;W6zJYL6fhW=0R&n;mM7~?-QbV_~F>7jUz5y-^1eNX^EALS6=0{wv5QR6*)IpVg$ zC&&Tz`$9}t;Kqrpmm4uTfb`hKu5){``Vh7kaoU*DAN!W?+C3!kz*Ep%gej79RbK)F zD#GZL*mJE_1*e!ym3kEE^6N)!0?lB`T*V&u?7!nl$JBM9c>9=~XFvle)CQ`J>6V@4 zp3J|ymzgi zypvj_uxqkjM*PbV%nvCbM5i;_j?Xfm8K*;F8Yrz8_WfFC^)hW{N;~!aGCEKl0R&^D zW}Fk{;XX&&K`guM7wj)RYa}FwJg8I=wI&vUr?+DvA>zpV-;F11n|TOF!o=U zT6IM=AUpiazt6q=c3%zUX z+C@)nf)O>?#Cg!}Xd#Q`(o6iyyFkmWDHJ$PF&yRJWV`#mmSh!3 zPO;&_8{6&X(cmI|ctszvK%Ngzp-BV-*kV#c?#$AhbUIG%inGV~AO~+aw}}r1>C9_a z4UH(Y6b(6sJXbP=n$PO-FF^W>B>O9jrxO|$ZY7QktV!v@5}X=N0$jTuf!T9vz^7e|oZ#eXnAv71GnwiH5He%@MlLgS;LuMExI= z(m1qoGSLYo+50RN^Bfp}%qy)i``r-8)OLd)U%V{2a_xh>(qDz>SS)7oGi}96=na;^;;d z(v>QMJfbSOJl= zs2k25p~}a*F2Z9C%x!1>arN-GA{3V>G{j6~=-DCbG_gtmhRt{-5%SVYv?P&{RoEag zQq77(=fyi<%-Ai00%I#jC+rc~`^2~{+4>TlV_mjX}KL`3`4Y{x!Pri z_h+BBH#|1{D|3DmHtZBtDk}&%B|7e};OdnB{da8A3E@O)x#pYhu!+Nxx)UKxDPNZr8l0v? zG}CfSagPk_u;Jh71NjDM^>o&gS42}EkJMa23&jbyG>U+vzaz1Tucqc2-f!S8(~j@? zKEsUL@}rlal_*Gr#*Z5N@UY{-sKqd!cnIG~1UBl8G)u&?=+}vL2kvvDU(J@cl`$>f zZeB8+Egdu7B!K9O`561|kUoZV3dBAwP7cCgb*0+TufdIHm+VzS)=MJJlgaf|L~S(E z=({6}#Zs9tBGj_{I@f0Wq;7)AHPJTV_c~ z&)IvCi{*(b#poU076sN9pokrW!tOnZhAnHC4*bs+&|08r02BGnC`VTk&N${)Z++yHsG!D@qS znV+eadAttVq7$#w1{7)3Mo~7@b^k$l;AxLsvZ2OQ*2=GRwj3QV_L-(-?Mw^YWCzx{ zhXw%eniTG<1VV$uEC}tX6)ecpG_m1GqGhIc5%`jO+&@hC`w@LBViKffI6ANpDOy)# z&#MQ)#;GA{*^$L?tz9ZB5VEg|t~!Lt^dNW(ndbxYbW8{CY$T?KV-jhRzH8pC%So~% zuIxke`;I?{XI*D9YAG6zm;K#{dI}*rJ5D3_7Q=xcwbUq!bM0Ta`ch;SVaYrGj)_s| zGSSAM?xG`2RE9b|&06fj?{-JDwtuoVD6NYnzlO+S9~Ia~!gG`IGIO{#kkk$X;+@wi zZkRGHDuD`kByNd$*()+#5BohA-@103_f%3KB66R<#wXOK?}m_D^_g*yQQ%?O zU_@82m+v+k2eTpm3>KF*K24`0B}up4B5?iMQIMW8ew2oSYe%c+9{)4^)k|q6rGJ7Q z3Mnv0RrgA_XDCe*DW~AylTV~d3yEp-Qqng!{zn# z90)Iict8?lkyH3l9Ac1}i0FeGsr6jHNmAKRa$tU?W)!m>GylW!jQVa%`{vJ)q|>NH zE1{2J#F~1(Fw9;sLo?JY7!9;lE87cdD)botQ*UP{-G@3INPdlQZ?*_@$wZoRhzY+R z$|8>Zz=rv+8IzUd^b#b*F^yaa_dS@Vpl}}9G-kobM9j@w&g8{p_q`gM-u_wOiS~v8 zwItNo5ojT-3EgedDBVr_BYZh4*pi!^)9zc5Yy1{k3`j>d`7Dv@DUB)g9qF}Wc%s^R zp&FIFdCF1WZYtZTo2F8sVfda9iIIuXm2QP(b;bE@G4*ChU4)5y|6kuhFJUCCgpxv# z_X&Rt6MF#pz>Mb&SqyU#;kw}AVl!9VU#bl#oK0EOZ>X+y)?qwf2#?(HZ1GXY(?p;4CB&Y0a4SDEHPUL@EiHuD?JjE=(!mvB)s!d#(?k(L$K5j*LC z^IuAIzqStaMd_1S<)JNB_d^?#ADXy_+p}60qjg2MF=dHm_|o-Nkm(jD_&3xUIK(CN zsOye+9`-iP`KXfRK-0OY0Yqp>Nx}wjZdiMZl9d6-LJx5D31yGu$W417fnROjRD3Zj zC!(gZczt=GWTTUWt*DA{5_J>wFAhv^U&FD#B8D9CHgYy5uRLO5Rw5qi=tKlti=`>9 zy80!E$EaXY_m-7$EP8VLXT+`b)083a^W)gfrO)#wiaskkae}3y;wIjW2yjqPW zf1|MlWCIZ#t6hE=;>&4~X@c;(vdJ~H2jd4R@Ycexe$`QsYg^KzZgt zLXA(SJ>DL+K=sf@*fl4Tx>syvR^voB-@0^oCpX&w%|5?q9qB5vam&)4=wtg?hS5aYqg69SB{0$cj6G(6`12v6cq70!Yf z%3mP1*W>mcjIQK5zQ;Kwlla;|_#n8Ted@IZd4{wgP*kvT+ie79`#(83UIod6Ke{89 z^-NgGhZ5*%P-dWtBJYVepqOxMDpl7}d?zahy@Q6;+LoxJt_DN|*$hHV!l6ydY$%0D z%fe=Gj3dYyQ*Z)EnikJ%buA3LQOtc*TV8y~U!u2Eip}tiHesBnqK-vc!y*0IAi2E6 z<&gPaP3dFAP3Z`MEMPBkR<&@)?Bx^%i^gH6MHE=V_X~-N0KxX2y&CbPhjl}`MKF>h zXvxQHEJ~*aSx4Kxe1=-GY8l1CW8B#V=G`C!;3D2QGe7IFf?+LMxN87$wH+Eyv@}ZJ zQfO_BZ9`@=g3OsAdjnQY6O@L;JZ@Y&5Y7Wi$iNfvqtcpqW71?nM5qFbs487z!?!|X zgLqy6oKrKa50W&s2y>KV%n(a7tvb#g3K8%Vzzn)mic#&!Vifs%J4)l(M5| zv5$ircQgqoc(3)vuJ)jJEUQq)R^< z+9(y{AtI|JJ;6Ebe1sAXR2<+jKj#)~iNyv22-sk1gEwLz}?|SlmC==>!B?-XlY|?|rg%MPPC57CW;4YGdRhU~J zpkX&eF^b}{lRq&ybUztyj#wnLWN@!p?!U?aU_6L$s*Phw29vYwvJ)6h#SU&3^gxt; z1o$#~0g%&8Vk>Y)#}G|d3#Nbv6M(qD!-D0Cvp-8QN2<6i9IOFx$SggZ_q^Yw2dyVn z9qsE_36IAUHtbI7E^;_bdIWz%2Qx-FdGBZYc?(KaK@V|rhmEC75j2(MSrswCY4FDW z$RS)%DY~9Ly6(t_izLtIeyjcaVsp*3IH(J02KvEZ6U>AY zDIg})e!h{*pI?;)K8wOrH$U}pIi!RW1us!;=p-2XXv8(nN#5WNN6#Riy zz{QZVy;li#$a=ymTW*HPysyaYWRULDx@SD_1T|~z!NuvGMb5V}05fimq7y0RfT)ku z_24Gb)%+6#&Qm@001Y@nHGbl`{C>ibkcm;bj`Pt)S;6EI!OMKUCIC-;VVoyrV_q)M zbIixPdLvEKc)wrxIB9}2iz9|Cz85MjHdYiS?+Hy%`z`AK&WhqsL?xx+208ezirxoBRZDHBf8td5@M6XGGTwm2iSFhxBSGk4_-|L8t+c z>Knctk^@Lef`syJ(28nWx9}?9beLFP^G8d+n4pqu1{dX?^+I8lD{1m%KVN~{EFN!> zeki8G0bJ4VcXPx)dBLt4M1?fyf*|t!q8hc6An8;}h)10`!LknimF=n0 z)QOCO{$49{H#S+)Q9|@j8L-r4M>eBYaQ0%@HV94>DF8`X|zS z<+IiulEV)fHkjQ3yL0IS#4R zEUyVg1O}I7fCoLW1kTV;!e8HfpU{UXTf2+j1v02_k6Rn^IdE*5>fqs(jUr*V(w7Qw zdlsZV>=1QEDdU);d> zUb69&2qO@s5L8!n#n^BuLcB2}x`>>Bd6hV!O+}7X2IfQe^9zANc)u0Ag!-W5H@h~g znDRzk4d`d+f0UcPk%x&S+G2&HLdWWkm#fX-QqWpZFs?*kcm&9+NJpG9K*0YKQW(+? z**SovVOdysGpw@-K3;7OU1e%gMF&Tva&&JAO*t7yg_CsZn?k)T^J^fQJRjf*opANR zM+;CQGuC2a!gfD?BJGID=8D#-hUc#sC$wuKeMHhP;m#)*mvfO)&vCV9tSD{JS8*x+ zU_|Id={DnL<>SJLpp&IVQwI~UU)Of=DS~+E7~!z*&ElFExaS7GBUzeIC{FsHB8ISX z)QXredjg8lRA8=x8vP!N5x?=s20+{CEg5jtZ|u8T_SKFptEJmWFLA~;N zU57j3=pI6WyH`&1C8dcKioJev4@VD4ZyFJk6QH}kmok|ujd1!)8{zLKNJ1$HYZ|s& zw{p;QXK#UhB??YzY!fX%4Is}@>rf5ru4C&!!$R{GrJ-ATl>vw*1OFfwI>ysLMyat- zAJ9D@-7G?H@jn+%;BTuXJvUS8n=+G#=TYZkfA7*kNV=J3kmdu5>egs2Gh|kW36)vv zxhWO#SJBDft^cl=x0VYw40gX(!Y+7ZiAR>q@U(^L(LgO2&;~`a=R)agO~*PgZl0nM zdzb{>KemHH;x{?+H_K5;yP3%8AQ&OKg>Z9ed?7k)fSDlIa~~gaIx*;net5qZR^3nr z8t-Y|=UaW6;l2?Va2g_9U}Ubc`pc+nG%RQ-*2ct$PoFVrUn8$sF{5;~vnYNa1H}$i znCSWuJ<&(b0I-F)x>HerbqzoOIY7q0J$gI!hrr!KHG4}6*e74EB?BN|oEj*UpEx3s zk)UhD^?M`f;k~UY7@FA1Z#833{s|u^D6J|%-i`3Ur6^MrUqscldb1&ajW>OCbi?}# zwmVW}XpG@3ct5d!ersl_%KWX$5I(c!1w*V%S^_OA-eza5H%rFgeOU-PNKVUQg^sIE zuM);=&?+qo~w@tTtq}{MYqJsu4%B)!HEI+ zE_pAT4QT0NY~@VP?)*Q(u9)MLqG+p8V@)Convn?Y;#q^2h^$>^C#L%9=y959EtYu{ zVxX~(IHUKQV{oi`J1lE9aW(nPE<7%3RFZ1YGL({rS^qjK7=AfW;mLJdITXCTA*dno~J<8~- z%IgvDlj=9lS}?Yf?M%Lgon?)GoS(s_y4|!tBHs7RC1}@wl8BJkMpDEY4K?*T=Vb^1`8^ zfox*m`u(4qn3P_CSo9Ur(C8tAd>S|*VOZzk)s9@ws9~{66P|E_;KNM$Kdr&cqWMIu z6!t9Le~^gP7pF2k@m?y=j{}iH|HkmAzrizh8VJJw1`B1o0iKD!|J@iP-m(y9G{?3{xsXW8B9IY7!#^9t|uP>ko&i zkQbBe#dU+TbYHv17MH77pz)nHbM1WvH@`8 zAnD0D$DnQZYGg*m&HwwKacsEHgDNDm;lvM; z-6p|)Z)L^XrtxSl`=py(;1#^X=abeE^Kb}EKDzMNf1vQXl^(5>Z`)@-Iwu)wgO-wl z^3qen9wcHTh^lDLzmpCX6zJv+D-M3iiUfe7XHm%v=TFIxJ)Cf9l=~wZy5m|qS5gL^ zyoKT^Q?fBDC$jENFXjT*t~kT>^97&a zBcPFjyn6UHtkI&3E--&-9+7)gBSlAqZnAQkYO2ubA;|)Xvsl~cf<`HJBv-m>K5`CK z5tCY7{JyL?fV#Jj_BbJ36gIFy@p0QTieknNHOR1NHq(Z$E7d=wGFFK%u}EaP1!%V- zdmO{0^L6c%6H54TH8f}vYL+sR%e)rMGr)AFc$?RbQf2Xivusop;pF^xBgkLWd>4A-f|rXY|+rEAhB zwb?MY&vyx?&Pu2<+x|0t*a~QV1+o-F*`FC2wKF_t=9qWVGPi(j5a>qHHKM1YEKj_y zb1ED5>t&0wd8Bs5+@BvN{VlyI(qe^GYc)Ht_}x4CzFkROxk8H=GP&V-U z1QNU#UawjMN6-|gOCwmjLHEmF*4v0C&0A>d0a`)G!uyJ!q3YX#{7H{prw2vnjL61* z;uJEZK%mV9h-{|1dz)Vzu}6c~gtX-Ii*Kc$cMY>(PRFu}D2Gf#KuIS?8C-r-sIc(h z7zIK;f=;v9@DJ`TZc|w&RRth<-=f^~s7mdLDo{g8e4K!Rdr1lm zI}I~>I2;iw$q&6I6k+FOSz@0Uk&}i00^cx>m+RkvB80cgn6!W%dp>2_(@;;ypui&* zxEBU#+v#)lL=vm{PEQ2} zP!CC<)>!(JY~hkkBX(atkEb%m4OnTV(jQLKFam_FzA)O>yYg2`bil9%;1QhGGV+Vj zuEA(2e1!*@{Aal*)c8Z$O5w|uGhI9GnDQqx;jYopT`06)eT-h8EhFV@c*Rgd!_;@X zoP9CeE*RO6+Ne($IWCkGGP5x}CiwXagTmoX$AXBD8OHSY3Ug{Bjt3QjxDav2UP%LH z3O>yhH#ye}01|0Y}zg@)E7{-rXNqP9gza9W)1!i9pTz4oQ&Oce@s9wyo=iHoXrf8zu z(Mn!suzMxlP64PAln*F&U)N~E25!XSB87^hIB$q{hImiQmQ(u1uT{Vu8m1Is4IJ(_e5zq7oAlgo&(6 z0V&}aTneGOim2+rk9S&?7i%v6yQE=Tk(@v3H<&G7t`g7(oL^GdP1+!VG~5G@g8q6nB`!_q&n-BY`eGt7R0IYlJI6hd zHR{q~!oXB%3*j8kuSfXJY=4HA<4S^t0FmLZ$|4U+SMAKMk7f||wKbnv!HGH$UfU8I zqD(Xi0SV2d|5BHtWsX%;5jg-f=ysQ{V+{rceBGAK#H@TjyzJ~R@Aq>rDd1bp{sN%{ zL|6?>@8g?clPJctPvH-)lIEjSCTdFnp~8x?S2QIysdCDjFN#u*;+Y7t(YOmfc`$Jnxq1T zz`@MY`Rn3zPz%z3f`0TX<1SvMO~d}@^b_RBR;)v+pdC7FTG{f<26y}_XMNUStNka! z6ABM>g5!8#0(X%kJaRzvIY87}OD1=xQXhb!IT_A~VF5o$m!OcU;u4P^`dilP)Hn(> zBl5ru;(p(m5Iqbd=v{+Pca=#&B4|-;yuQ_y5sLgelu>dew)^#(sCRj-uOiL!OoDuX ziisxM+l^{G@`lYDsF@j&Hf)zQDu7O05OaAJwROKV!YczR6B?2X^221ErN>9?9Gc=Y zvjAu){6UtyIv}C)|5E_ahE#&^q6e*lJ;=}tONmnN%tAkCrQ1#b&t`q&7MyZXkpz0? z(0M{FBKeJ-iy3GrEO7J8eQFlcQ@Rk)94K?A<1`3(ffE5MOO(>J>J4M(>`ZTaJD;z& zfw#ith~hurp$VHB>vrz=i2gCG|7m*np#I`v#!kF(mLPRaHWi zCaY?wgkD3c#05LXKa1uNDmna_r_A&w=#{7P;LKyuR4OyCrG8={1x$=tux6Rtl?;Gp z24Km|ZTqMr&)N;N)rohq-|8qyq!-$V!Hi;uFzhJumx}3KUHMjjC0^G)ojTW(L^bJ=BCpOPiv(d_buxUBh#e$(v!)dP#^QI5p3{%nC6L_ z#gkW`Q$;D+o>nFsiagq&=QEmEd?O1b?Yfj-394&>g3v+cw@Z^@lQIWO~*>a%E zSse^0B7;UJ>EuPT2y2ijfGb($ll?|*-ZjZ!ZJBjtkCcAqqBqPr&v~BuwC(W`3JaVp z13MM>OAU2KbktSpdLwMPLSMi~*CLY=GmhFX!V-uxgI^$ObCzi!i2_QDM4{92qkBna z5S={xUc7}uxg2m}4ws(Gp^c?y&XO(f4UK!~<@p|n2y({weU z=96K-0hGB?fREl2s|6kbDD~^N!)(-hlx`yL%&)y^&}}C3TX_iRpyFi)?lP2t*a@8o zVFcTe{QDO>uMau*P}(>;MNvJ6WQpVKPaK-y@nciid z^j*SoDdrQa@lubVPq?%>t|<6XDwA<*c|O?|qP}Qp!7Plfn;=&uRu$>xlRtMyN~p3RGZ9sRp% z+8DOliC|i>pssvuIkqv*JIu%1h_r7C71~}DT_u2^>dfkG0~2Nv&~ra8I=yv7xyJzF%h{EOE4BbIw%I*OkfEu%~K8)F4~@7AAaZ zUJmJ3YQG*r@&hI0B%2buMzdyf-xTcRGLrXBT;;xU5JHn0tIu1AOh-+B4PW4^48H36 zNIZOL%Fg)>7Fl|!c(JW5Gtiq^+Rj}^)b^%q$+~jI;7yTbjg;Dx)e47tmPU~I(~Kf= zO!S#2R1b7lw`Bqi`%&>uTKHy=L&1Y0MQIADk|@che;+J`HMANFD~ zFEGNW0%wd&3{WAc>3*%r%;cI@6$h$YS}Ky20Yn!- z48g20sxA#pUZqtxWg`aahE^*1gUZ96X;)|DgyIm*A(OpWe1r>7;-%Ieq1LkU=K%Ls zPNXdersK5)8bd84g2Reh<<)xv+>xOSijd8}-9(3$<(+D-HB)=G|Xrj z?B5D9Z)3�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

    c>d5+n_NVn>Wnn0N8X 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ʆ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

    NA&-u=E=c$Knlb|j+dHuZ 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%0A$pWmM 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�?WqYvzj3 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

    T#^aBQX2%ESrF`!KAMAas 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%0ANDlB` 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 z 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"e8Epbcpso>e)y9gml*Bjvwk(ncgj1~_v#r> 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�*dyZkjw)D4=T7P67hURdt zrN9L-!@$voJv-8^?;|Kkx`XdOtUd8N#zIJ-<%SF(kMU*Q*(N91fCWFRZ#nD=lI@;*Y7~3gsoe$LW z!`~?CS<8u8wyM#F#Y)MZP{U=8cl%STp+H#iINTACTM=GTjr+2aABIhQy zx&nUx9$dMu6pCU8?{nz+)u#UvT^-zXYUZ_-OadK@q%zQW)J)o!wb z_p%%Bk`e8*AlCP3L2GBg{dJ$i`IhF1akG49@wD5JXz12J?b^AQ8GFfaKj&TNq$>Or zqd+;lknb^R=p^h?og*XGfS`0wMfv-`G4@wkU)g#0sVHne$qZDK+#wbZhtvDKWyx5T zC~L;3P6c1kx|yqU{Sk|I)r*msf|E9sm9h8wu9ikWUE#fvGue&`+?+Ij~_cA$PN z?Gw@XzY>U^-0#_ zl!NV@-VXsh@5OyLzCF5!-_gG~9{~<*VoqgXaNAK^$r9SV{ydlVUagQWvC|h-V$WCU z{a4c`5jC|l$hO&PeG=^}s>N{h9%6wIX|A`Z6@0O%{6@em6MJOSLLJpcDVn}hs@Jra z67Kvsi>Cp}x{BWe;J(a~to6s$K^p&g52WgMG>@pk#Z%~;Ur(D%wZobdUdmR^{jB>D zxwq&Q9LkzTd4Ye_JnUOqr`HEXexIKkX7P@td~Cgj3YM$$>MD98=(Ua=??>HwKUP!H zn0uCrWXx``p+u`I_Wu8KNCj_B^fY5yO&>5AjIes*`_lthV^s<@Jz^8}_%he(uoJ=s zxL9oJFp@RweW|%|IaJO;ISK#Z&ccDX^b9k(PjcWgky!G`IDeKl?=tRj;m=l{sNW3N7UE6&EDt@*Xh1e6w}Xir#<2)|)Jw zNxIAc1Gg*D_SFc%`H<6`EcRGf>js3Iue!Y*;d5l1ezYcbDeQ0N_!+CH&I%4O5QeA5 zHKq?Tk*=_%PrcRksSP~x^1bH|P`}RSBD@x2kd^jj6i);inV+)v)Ts zjGg$4AVbL;7HEKBA4Pyqi-wAtAxmg%h1Mk5dqnf>J*L6(}}`dHFN>w4;l>fbyy=7jd6l<{SR5d%1rf zb|tkgNcgra-;3G**2&qPR3yfs3A7-q5W&${guY};^+7^x=s}*Rf==GQucd7umaiq< z>@0P~k)+)%!m6vke`X)BvaJuSxF5>EC~IbcyxNdY|Cb! zx%zjEpwvs^_Lk8E4%v!=w=?~=y^N^u=97T|o&oN&m;4yYBEq@N$jf;heQCZ%mo|lF zGTGYk83MWz4-Z6ni-~drp1RvaFWosZs>7j%>kUVEucGP`Az)1d=;fXBvSs`eN*RTR(obe5-g`TNH&XmwefCAnfgSX!o+b zH~1?C7U3riWAl0@WKwTc1q13&03a3fXw`#ar~=`20@%AMyUWuwh75a?BQ!c~*U_!c zrYIN3nK+x{J2VqaMNh_TRs!dsa)o7r2{gUAvAC+6dc@`xh8h6DcDK@Vq7uked-wl) z)`)Srn=MHy@FMq@NOheZnPO{w0@2!+DRty_Ahp;&+q>R^QyPMRo?*V;uoJ1C>b;8P2otu2}}+jRkTE;joN81O%I|=uOY=iDj>)v z=ZkDh%W#=)dAmwO|0s=O#!}mCAKCfverL3}8LyyUPwK7-Iy_&`EZIs_!U2K={w^%< zSr!O_O+Y?ZXb;XOs zQZ>dHy8fXj>!8rl;}NA2J$p8T^YU9a*jbM0jSVc`JaeHlt57$_$UvQ&878{8mv9P= zlKY~3c;cp;km4m6CIm94&oUG5XKYBk>`Ov0oe<7ag)Xt4H^+Ig9aU<`9yRQ`1O%R+ zOW~;FEEVG!bM$r0rq~LM`M%mg>0E<8aOCKTj1E@NItII+zLSxq41GeoYekCc{SaJV z{V8Ex$9x|g=V1PyW0_e{SuF0Jp!>ez_*(B0R|p$T&nxHEhn;WeQ1X4*=#PY12o9SH z$8I!~qyejYb=OTbzihK~S#krA&FaH2A+(EgsM{x@@Lf?;irne$6Er@@XC4Z**#u0I z&>R;C#62WkLrtcvne|~G2U9GmA)L9kaygU5#hb;@*GVlcaK(MCxDsUwLM za?t5NHX>EChCed`GhB&Xw$ z6smR-39`qt$DdoRQlp^W{O_!gJB@&?=6)7@ITm*B{WUukEcPs6hwRdrcP$g!F1k;#9fK^K?dNRB2R@z3^;nS+3gMRq>Qj`l&#a6|r?hT)xEzi)B&3VB*{RNxoN8sGMb^ zcyFDrjW?7yNdoLo19*9gbEwo^-sipa5HpQ+%}pr^-#^R|=?Ualb`Pb_S!_Mqbjx;i zCR1lt)|r}XKk;&}_xxseG~U9$o+v2RXP2+g;3&ZPyXe_{HMX}q z5;$_Gne=Mi6+cO=%*&e``6kH2wsc zb2S<&#$U3HM^+C@VY z@N&CuTcKoIx+#Q zL6Y_`8)&_%QiMH-x}w zAaV^V%9%OM6I0Aq9YY7YBjFVO%0644GKn^cUy9ogtk%xfxABba^e7k^rW@(H;tS>w zmxA;S9-Q)|w9^3Ypb}|d&wCl$e9^SXLu~8xYrlR7F)h$V24BCU+UlNT1Vi( z9jYk1;+>-xSgBDF)_2~~2}_gZtjps~b!vI7oPUH&}MiuWBh_}nG} zmN)zX2*S*W3%Qs5SNCY*tVTj1rs14f2$mNU-#xm_KLwGYgQek!hG?9`??fiA5rN*} z*zA+I+4ti+ZMmF029YWrr6=Mc@~o@d>LQRktcW+Gn2?sa%0E4Se&4mmXp@_kUR92E|Xg*9C2b*9NCv6Pz}R^zCZnq=r-U*4@f02a$S za!^?qOtM=7a<8H3$|iAm?XOJKu8Ir7?Cj&Bn<)K^+j_YQC%a0+mI%K>Ep&{$E^45S z+TNPzqhaT>?#|}CXbsTDC@y|SuljLIa^P789x|P=2M6LYx>Tf{BOin06HFlaPERJ< zU+$3M2G7gc8}&y;zTGCCjJr>0ixqEA{L($>{@eD8*zro3dnd{Jw6rg2(0zPy1M6gQ zI7kdEf=}x{o?{4ZqPA+!cSVnv&r;3Sf6jI$r$WF!W>3SV^hj^KV|8<1o(g0m z*0L!C81H_CfIU@%tgFVRyqW74luq(4mYZJf92}T@uO5l+*)qL7xCmydh0!!En*^5a zPjgH(s99q;BG;&1eOOnHy^qb>ontoN`H&yMYD>P;IGV)($mg9qMb7=b-+P?9*%igc(N_r-N1?j>3tzj=0Nc&8I~-w2ivP^zdd15g-Lqi3IHOynXOG^*6#gC z+s>V2l2YC5vrsuggH|`&%SZ2sT(4KJ1Y-t`@3D8=zASBCQuFy8RJSzSi6O-uU&)Zx zqc(BW@xH`*D-5_(!p~#cTXNh)uu1$~w?BvRBat7P#JscfZ5n^;%*yQBwdbgjumG{8 zFY=z{dM~7~%StR2U%5T&J-b@V5u)j)wX}~29^b3w`X`f7vA<~EpXKZHfXN)d z9Ng+$*%Rz9u@9ZHJPHDb`u`;dC)hq`gtZ46^(umEkY9R#{s`&y8js$I;OrZ2AXR7A zRtRszxt5CA29xKldN#4DL@?0BcL8aL?sfVPxT3q<#P3@ja9>&-M~Fb{Jp~^I^cP#D z)oqEY7aT~vk&R%68%VYhQ0oM?J?0Z7S#1BQO5~Wr2B!f%p6hineWTq zmtU9_QGw~xR-ap+J|c2MoM*3oZZpY8Adj22j5=vsNN+)z(1Wtf4ej~yL$#szX>Y&B zbJQcjI3yaT74tzo68q78;fpv`HTqHDG{7UN=CI9a!5MlJh>Py^s9ue9vh7oK z=;A9zueDHr$>a^fDRzxwtny{;Qm>Fk_P!VY$D}^e*nliH^OEQI)Os?(-N40zUjT2i zyAX+^@7zls@qSjaHV!^ktQ@OLanf&|KK7M8CX?@@U|TlL4a1FnlwxcnN)87UkW<#s zZ3bHIkyb4&Qi~e1Z@W!@aO(IBX+NO!G52OMAuORsax>(v#MfS7sc&DTD5ezzWr zxaJ}2qs^}HAZ@o-y!Fn=UrC@`=7(E+xm>FTbM@Gp9`Qr7AdkL4_XJZx}Fzy{0{3 z!9E|d3kpWpKSZhbv%_BTZlwu2mIMh_`w>nCTX?+?I$JI)Z|abg_p)gX-x4|F?h=su zk37H|8V-+ZxXs$Er)q&_J^Hn0?T-P}Z+t$?ghsJPJzyIMfjcHIX(@6N1(#_tj1^P# zQjbJW7egoAJmH(s{a%iA9HecH!z}jb@j`CN?vZ`QOuZkq-uGvZy=y@zR)*j6VC4A_ zFy``JWdLYDB&GrVJC_{aUF>}BxMOS}TROA9qrvg8WL`la(~W$hzpJ~ex5&5l`C%CZ zqGs}wiILwX?bu;l3yHFkO{bnN=SrBkz{{_-%A9rwQ<2O9`uTnO_j45y`grQu*{T=F zq#vrE4mrZXeCV@&8BjRXEUJ(Rm^*?YkS~OH{(+X9hMvg%z@+#2wUGKaH4|H@_0sma z7_|8P%@(3$nu~|Y3oE?iFiUnV5^Q|Li<`*ZW*jkbcy_#?Icv3D1gzf#*lZC6 zD?{54YMG*S59a*Y*R8gjEl_0p$Ehd&;bOcsIoxRnjuxrL&XNg08AM64cJC(a)SL+=i zSvVHPJ2?>Z+H9$DF6R~M=?}ji;vmBsrp#UC+{s|58Fosc+A_ZV>{_SX3qs7p#Ibas zoUQaVNPuk+rhHV-VRs{u@jC>2_Un0Pl5~9871^xFMU4N2L(HcReKe^GGNtU;ni~W&BtZ zE_0e$$p)A~F$sKWQN?V<@ppjq9wmO%uvAB~5+-_?d4xagN{+caxA|Kwq7^Lxi=6YL z^0w$Fv31&Ao^j@Ut8ZGc4X4xJnO5P|%+&x%Wluu!Us zFCK{Ht{uv_0H)v6v@aBnm=O~vk7DKHFg&OSmC%Sl#ax1cf7Cd{4NHz~Vr`zUab*D$ z80}~4cdZkrz}mv`5m|H7Kd3(^l@%0vW#c|dF}wF@jYS;g+MgEo;#oJWEKhLRTyIZl zR$FYYK$s2Pxu4M^L>oAUHqiH+dWVh zLz{SxQs~L)vC-{0*Um~RCNF7HNlQHEJb2B*s{gSiA>}^j0rtIMtlp@*Zs+yc@G^~! zbJ5s!NQ-n@mrm?WHk!=Fk88LayOMG{z*!hdHrbvo-66zUD(K7u7PO<|=@~<(WApT= z9(O3tH~XRlul)J*V-T(Nt7HOlsn2R8bpg5g*7BpDQbU{)b>2;TjR)5HF_yw7xfSnI zY$Ur3NuBNK>0CuX&J!F|d-}^lA%<}x!2j5%pK`UOU@Y|fjdDckZf>1^}|&X6Rw$M9(Q zsH1~lqCd1!TxVHUojF*P{JEpm>{xAb1-C1@0W-AvfmvBX;f~)+V{m#SAMFa73dLs$ z>m3C$A%ZBoYZ8|W-y&;D>CpR|9;h8vf|quQyn$nhhn zs6|Gp`Ll2HH>Oz_UadGKRr`9Bm)hJ4`*hiMs>Zpj-N|%aoz+Z2hfw_ekr8BrE|Cs^ z|151z1T;g1Mrf~HcS-BzqNB*4X{DXTscu8fxY7HQcxK(bYOb8TYIA$joz`ac$(;4X zF}OR@*YkDuRvsMY?iqNHe5+>51o+0?$@QPIHMx<8J8L93AY54rTbJDnguapuzYq78 z3ZF=MBby4{W=?l>bkI=N6gh2~o0^iTxtLVUw`S%Sv1W2h$Nny#@>P>yK*`CwaUFkT60`g}NcmP-l8A*a-Ns+xpPx;Tc@ z32Mh(8KEx760on-y=&?}_cK$B1gStx>X)~wjffWBmrG{WY(U|7is}Vdp&1=|q5o7O zjxi2`n(JZ?_UZTFI5&vkH+il$kKs!&`vgEwimdq)?+#Vh8<4inu={+j)XUgNCjfQk zn=Cv%LEg$rATfX#^qpQ9V8(T%nu?855ChI1pl zh~^Mi^_`_Os$psjf3JaRfy*?EBwAUOJohqR@%{w108T)$zg|T@cY<2idSy`mG?on* z4C_X@BNsppF2P5IJY;~f2I6xM-74+>m&>I)2J8eqFhtp@WfSlX0UCTw>2Kd3(>_~d^YnZ1`y4YVX1 z2kWC&(nV4Tpq2oIbDMf$Ss01#y*Rb&6#xDpErICVuB6C1)IH<%!w%R}ZW7vkVh{22 zw82k$-_NKIO*^{^$a?JEhr=7KzAMp(Z;fx*&viA-iErIzD?@tIEU5_YWS#aSt6m)X zf~M^2yACBuSJil-F)ODUiVVgImV7MGmx=yFHzc zD_K@c&YjO#$`s^58Tgg1mbAz}A};#k80`ZT z!#b~6H{vZJ_&mO9>iE_sp%FKS&hxI2vspJ-aFw2Qf+cm7kSfr%=R!R&S9)g>pbQ@)&GrcO2 zPeC`tp8uSa-f$!bNX#^h(WiPoa_o(qW3YgIt2QPHvbRit-qmogJ|u?Z){<<9($U5{ zpJ0tODLI1h>Ib%tfFUmxs;$9MJhyj`(t8h1WQ78*y+|(gTh{7DgrA&ukx9CLD=v`; zHQBVLfYchHMtIaI&*!*c8!~ymjRTi^UaSO)Zg~vfyk4@N1+vUiD&LcfqzI{EuZ zw%-%sJIaaFSoY@R#|*@fB$rg?Po4*>8W!)=gt%gqt(c%&r7UiluuEgVBOA(ZJTf31 z77(MZE)8gFtAo+fL8x&>9pyiQcwaJCI+8+Hc9LU12Z$g-Nx&e{VpB2EqAVj%H+h^6 zklXy~J@#svFI%C(SGr0Xd@jjoH}RIgtZuF3v>N?W=bss!1zlm%@Xw$5VN2h*Bp*0W za*x$P9yUblTMJSM>RE>gJE%3?JnDVXxB9TiAyY5EJ0MQzv3xV_MjR{hj*YWy-c zJ~KXI(Kx>k>m>jS$Qd8Vn#sY~>v16YfA*LIzA1xY=mV}5t5U1z z)9er-XQqM*UU`4nawk#g=>~)dTSFlZn4V4Bkz#3+c*-q7T7(R;6rSLT;*u%FLH_Qg zRIdHL^w|f595f(J^fOg4B9!@W3}IV=?-DSf$xWsS&v$)S|4B<*r-0=?IrqJyv9oC6 zobdsy=ZEA=w72XCHQqpB=Ch(|2*y@7W(&HdzSyd}NC+XU>shA?8;?Srt-;Zba)q{Y z5Y6$i&8pPY-`nSi6-cFh{j4bxyn$k=4!NOiO@_v(P3&m769v^YK;B6if>@~Crb7D>O^%B^?v*y;`#K#^caCqr;~Z}Az3{r)qlTc)XZ3bdL{EGa z#tf7C;#lf3Q6_KW^q^W))jK@GksS2{gXL|?+sKF1Zd(CNn9IXGw@aN*%|d90lEtVv z+Qz}r+8czqci~-APw=dv?9ok2xZxA@VyEx5Ovj$YiErUw9CZk?ncX}ZYr?vsonB`* z?R*lxbT5$$FBKb#P^!tIl}lPSeqUGDDxWj5mfBKblR3M%+l!Whgx7m4jcEldJFNg^ zWq-d{sHnF-5{`#v>NCf1X3N?Sj&1{#p)X{uYP~N_3zSb%o=52B{Nn{xc@1(@(%U$k z=>+c3gX&r6iwpQ(>bQQj1l~r}AB?GRqt>noPM10L#Ize0%rTyY69q1OuQU_;UhRF% zvk=K#l=9m;Z~CRz6>n(HBP4K|G=3Ls_YyH4G0q&0wH1&waW98Hc(YIk(;gSF|_;-}9sFg+QAO{2Y|^z4}3q45I#Yi>!b^d^e2wPZh2Oy4q)wTJ2Y-t`O9SI*v-(F;wy17QM0ctB#3AI2-MoW(TXMzw2jZ& zGjzwVktWGRw%2oHu@U_TN9L6HabBcKppKi2-s1@PABAZ*HshOLu{STpa56AVQ`LgE z@6SN7y61Zk4o<~p&Z#etPI+; zk>D>v6!}txI8_g;^)d|!(a>BO)#H(SOdGTitVv; zi}1kbxmKW}Mm-N2?LXkr&m$JmoZ>f&m8Rq5t+n3UrO56Sy z*s%uD10^{UTlxtqS+f+kYl_i&9q#Zxj{JAofb(GymG{bka_s$e@7;KgWj5E3=#Fn$ z7tpISG~<0e%_-hzW2+2 zR-EoZfUC)QT|NgCaV<6#OXR+M)h4S-NJMg;u1tM3Zg6>UFvG)hOHcxU@a*LvPhcU_(5bds&i@cWghGm6VT(oqa1 zS?dmTJkglPJ!O*#1tm{(j9UMsAL!Q*L+d*aTf2|y^mh$4Svd*aYjb|!6%(#a(Yx1U z7Z5D>nA3r|>X4&r*(-OiXl#@o_sEaRDU~eLA)V;soF){K{@uO~eD>V4M(r5+BMs>% z2^hsFcw(UxRcTG*V;_%$(F+qeTiCmW)JoV@7Qv;EFHugMvjrlvhBw5UdOgp#*phu% z0X7MOmV|SaW&+G~Q*&~i}@vGxaF!)8$0U)^sT+6rW&vuh|+2WzJgr|3MN;pC*E-BlC;4_ta}X;SsfgC?=(7&j&yvVAU#3G%k@c=-&v1W zS1~g{Sr9k@?in+81nH1?U-j(_qeb<(FnAV?v7>%u>(gRn;`inCa&M!ZV*kg0S0bJ! z22;$5ey_b#j2-H>yM~Vz z!c)w=|0Ij%*J*86oH$VL}T>jqih`5YY|;7ap%rsi$C3bd z3&%w1QXOc|K;%^q&az87rGbba&*xQ>7qK|9 zMdY&-JTSHu;|S=!oLn7U_ffznoLG>hq~4>P=EUHgT=*^sik&H&yjz#5t;Gp;$? z(6)M#nnK&MK1*pZ-+NA@NMMBpdDZ1#&EBsBLh|Pu%T&`$r=2+d(DFZ)az`7uu;+^J zJkIfiJ&}V*o7glmApiHX4tk0PfN?!hP{Ct{u!sh7U>Qv9KWgFU1Hs6&6z`;@Rsin0i0qBuJ2EYNX`!$z6P0MC9nEuEND)_;s!pc?%np)<}0PX ze#`Tdw`%WpW-9kujH33}rfSKZ%hw`G=(=yR8f)?U3byk*!Q_ZayXG#or9KSS;Yva! zcy*ZpOkNC>SF#8?s1^tOxb(bLfD88#QpHu-;9KVWXpMC|Orb5r9(t?U$GSTu|aC^uXn{KJ7g?DY*=Ngt+^0#gm zFn11Ws-@-qB;7Hy*6Y0I^>69_IY{itrSAh$t3G&@5x$PT7FaoSqyuEWpbXsFvVGsH z7u1{A=n8A$EnoWxT(QZsWcHGOMRt7-UZ;(30-a=*g;1uMnwuhgPRd1ci1}b* zBIZ;9sXATSwuI0(zuA@Oog+QQCLVo1YZB1NdrS{RJ8sA99c3H?E*LVy_x!iLD^6AQPQd0d8gn7#Z*z zKww1%OS;S(c_&>hUJ%OJm9@V{Ln#{<3U6BVQvQ+GQFNCD5a9!peb z&8FV|t@HiuG2X#C?`KPVXdYLm*oe%N}K8NV<|G9_VZ%TV~56FmfRRt$_B!}bs5*m{{ypGPsY*X0kG z(nCoYjk$lf4|O15n{~+loaZyo_==M)%R8t+!RFT9V~`=Qbt#T*f9~4D4X)jIGPPEg zfYh|XFRdYibk}V@D~@-)dLmzs%-&P1dIRfyUP9gFwY%y(dHu9d?bigY9L0S1VF}cr zgpTUbySdllSj37$fD?>q*x25fgcN9DZvWAcwSj@7U5VF^+)w%O6;u^T*?vbC?4876|OV-uN|f2E~QsPV;FwEf8{(j|+6fV}3~z6%z|sLji> zcQYRB*W^)?++)JfQ@3;KU9oE{_O@ia{6Z*leH7m%Zf|6)7 zdF)$OrLs5kvSwtV1Q8Y!8r`-W^9JBNu9}juFU}7OelW?=jEzgJV(V}l9v$=<=RzGq zi9rO_!CKMq{tiV_ima7@i|lIaOEsTDSVd&vCPSbl=NDJSU=8ad)MMYb^}8=R2Dfww zldioE59b>0w+u6z+o6p;8*Ds-(U9>ltlQi{pHcBxFotuF8LWFMmoSy+=>Z$>3J!t3 zJgBJ*`JZi$Hg)rjc)NY z*?ry#=A*iz_epe~^NYCOHdm{bhd2V@XRBxRfg?t`re5RI8v@bvs4*1?*O$Qi zuL%kg@D2QDcyd!(&(J5uj^$n{zK)_!6F;UZOwLq+%bczXIKe~RLFv|e1c~<@mBx5Y zC-xbJn$74bw*I5#oXa#<-j!HdS_ZT&UV_R>QAyrC;`AP%Mo;Q(HPBumLJifZ&qi88 z9#(`a8}8%C{yTcgLM2)Du1Ahm@x<=9@18`3uVz*>c@v&`_j9p|b*ZS74H-D`1s1k@ z5bSh`g0goe$)0kNEf>pOpcO|JCpsa+tQZ#t?TnPO3sh-x^wRKH(m}BVGJ$_=xq_7L>Yrz9VaCr12=4~&!ivA?Kj-LLN zrd)kp6IQ``Yw)03tzGxpEwSK*Hxuu=mRfmddRD(?#J4@AzmngYQ<4A-0)cT}ppzbs z*>_KEIV3IDTA&A#A>Brgku7rkG0midH;X)BT(6{!y*)^cq`{Kv!aZefFjAC@$JD>w zdrgN8>ROaK90bG6iCrO8r%6F7sh$<2CR-)IAjyu?N!WZnlhV_ULXc1g;3?E+W`p>ozhD z;=Bpwi;$|=HMH13&7!pS$SzK5$4rbI5mb91hyL)xSeo$&Zvqjrx`#7~=1&LZoC4F= zq1*X3I=V;7T>1l_AUS=b_F+KXk~Ls;?;zrF&A`rAVp@1n8i8@N;x-Gl{tl{H=&pbk zCuxmQTX!j@@UF8IxebFeo9Y7ao~&JLnJf1{F+WKb6cn~5G@yVASmI)qK!^y(N`I0r zD@8Intz(B>i{bt&7r?~5H*4m-MW%pZm)^(@IuMd@Q;9R9;I|(nRH1b(nwrXv7ea8; zvjV1CN{*dga_~4TwK^d#V_$1h!u!hHBsf|imH_niTpyUTk|j=4)31kCu4`Z}EW@06 zDn)s!_1H~a8_zW=Iuf+gUE|v9-6|Wos z6W>O6g*u|gW{nf}y~Ff_7u?T#9Fl5xHS>jw@Ad0ug_RCl>^iZ%* zPF^wXHWvpp7Hvicv!u{YKB3}@q#fV)?dn5GHcND_IEPL>l?pN?1r4i;w5FiXG;e$J_j4HSb!d)Hlf4C(fM!?2~e}fzv|9m zARzRVjbf)a9nbY!@D+c3lhG(Zn?}*P&)(7DbmV9dCHEHT=5Oq2q^&5~kkPh{FnvtQ z@5C6;6?~VgST&3@xFKl@sM_)!m(XpKrdzNMe+{yBZfesE9*n)$)nqeY!G)WhlvgM>WTglIiI?zD!adz01e4pqmfR zv`Q~5%$YCl2$e+gqGYz516?p&JMuCNNf7LUk#we=RZfMs5==>%4D`I z`_!+dS;|^0GomY58KwDVq)s;OQT_XCJa-yZklxWzuhH{p!+Sl2F$J79-H2RWK3D0Z zBd)$WG~}Yse@u5u;^3J=HH?vD`!K6HCDQ1&g7SEjnr2I+FTbxJNti;QaMMr@yDCbE zLcpx}&q-;&AAIea+P}$u0)2U()bB0$t|(~=!HzRdebo0I>Nbk6?Xo`X>DEbO;=y%) z`$5Y~v&dYe9Xg1oXd^1Ii3wi(bKYMMULQJosBLsW9l7+~t!O;VaUeu{%yyU~M_fe9K01qW6i%NI zG*me!3&eV?n}={1**K%57Vwi&1F!AS0Q&B$XxKfD5cpk{ZE79xEutV+W4vIV0VO|!$_+`&h2hFD(d;d z$wlU#_OiF&Y?7p!Mw>Ht_KxU`GXoO$QPZg*1rP^XIBVG6+Fc>!dJ7NuKZ!e$OZaSpP4w|7s3C9jEGcAO5insm*C2RORShLnuG+GZ%=2KqCQQ}+!+}Z^hVBRf6zg8L zywI9Z_AL_}l+W0x_5x5_y#+bjQBb{TB(tDL>#wo)()p-`bD_@#h9ZTX{Ue&AN>C_-6{N@}^Vb^dd*!9C~ z4C!|{96)vD(OBD!ZVNpPgnkmdnU5lc)1s*R{o0`(>qu^TfRq3?=FZ$k6I-F8rq3q2GZ5YgcqT6*}!mW zI(nvhx07hv4tF#IarB5WLwN5T=Tj6kC9ey!Zk}TzXx0fMp%_IV8(3q}i!MDNWBu<0l6aw)p)rr2=#Mh-UgG~D}An^6`J|4XeSSxZY8M&Yi~{H+Z8d=9QTMSfwjd`jjgAqA~cI&k`o8GN_P)y(_x zt|XBrCs;K_rYE}Fj5PeC&W{jHAW0Rwa;{<y3Esns*Z8sbK4kRuvNi(ul~q=%>cJ zHTBHBRd9iQ^}Pt$JFg>UA^%6f{9Snf-2#YIHIMtrY6r?u7d?JJ$PbUDRXbgS1_t`H zYECW(c;>_uW!N!OJWEj`1;|Z$1fn;?>SI2^I!5daX06y)35MV=FwUM4s3p5R!xWx4 z9vByCMoqzFUlSTSHXy^Ipe`l&Y_JY!4t<)^71HgHuG;quls^? zJk}X%5|EP$0d?l_A96X_>d3BZ0G%mNxRVMgCeY0vd$0u*P6G@Q_whb#oksQ zgYZJM0s8SffJ#0ocU47;X{SH1StxrDW4%8P%jUF9`M0{#B1b5||4$xELiQBT6CY3KYXtSqX?84*~t;UZwb5Nee%gO+P? zbEb-42w0!=NHmAN`R%lkSRI$QUN$vw7bDfxAD2XNOMJg7y z34E?prtxkY&$noIM9WXAS@tdgY|3xX!F1);kRrKcjxEw`=0eJ!{1j-eQF>;ii~gXoSD)-tOeHmNA2A9v`G~VClb{CIS198*}($+S809}4=C$b3#?`y3p*j3qp5kuAQS8|6Bq42n_qilL> z1-y9dbCs(si@*w#M~8qblC~n(WKyQy89Mk@ zb7{r+d`~xDa^yiG8q;!kFeW#-=RCtxltISLU70`Y zil$rCzfeL1fO3%_EDkO%8X6&K3rpcP5g;t@THO8spFsgx;x@->NQn+}aY@x5=We)E z{C{X^MsoCI3ueoy)zn33nm=A)WqIUGR23x?ZEJ$*54TIn?Im3G@2K<7IuA?q#jEzl zuXpJX&gcZiZV}NOptpHT?nGM_1LXf?qtpo=_X3JLu4Yd)GsQ9Mkc8Rc7sjg1sp2Re zeEKm_ulKRUTLeAGBXD_Vv;rAmf-Hzd^F{a^dPHQJp{B72ilHCLKv+poil?KKk!&QU zU5$e`DaZ-F1^~2aDOAmQZqIdRnFPj;ucFh&!u!t#VlW>$`jv4q4Sw8^m;K;wO(h62}_eZzvG`a#S#Xrg~xYk@6D^*-u7af-l z%Wi(HRc)lfux25YLQ0l#i8{qJvZmf^USf}8ZGr_u8}@AwR)Y1T`hGNd0a%t8#?M#} z(CI*@Q+=JWbQ_!zE>>m_EvCvW^J-`p_2%^?t@fe6q`fRCf+kM+*gS>}ihwdx7ll0V zDu)Y%29rYm#aTz5xUm$$yymQ29AYiYV{7nin`9<#)Gp2An#Kck<{+NK0mRk{;mi;59?~*l`6J2t)BxwPeg$#M! zh=4&bMW`xlb<&i4sUU*pzDh_TvFe1llxvuvR@5d^%Y-J2bq70@%y$JU#ElQ5)k+pa z(V2il>s(>lt%6#iz2hKVA_s!A_$wTZdz=}kYmAKKO*9Z# z_d7Cl^iM*_OCf-uaE>M<7yaK|f^X(qDZe(E%)-~lp>!4YmIwW!zCsED+?}Ru&ay_-vh+QI;nSs%b|76iJsEXR;+ zd@%$BL`D+vAJ{HpQ=8MEKj;RQj-@B2RaE~RyJQK!5D&6!+DmC%M4N(yw`GTS!=C&i zR}(RD=;LF>hb@Qo6VrdQKgS32mPgtqN~B+w{$by&nz06Ko+3RHP&9N7aPfEQAvD6eZbEmn!t)*PAz#3E(^60N0&sE)V{@fwa9(ac%v7bf6TY zDd+(FKDrS;mr$gw%&WH!fxi8pz$`l7n@{1?XJ$5#tBNk>faIYgO*leaWDqv!B$*g` zTBOO*IVOrw#eg?W#;<4*w+s{*o-HwNO^BfpW)U_7uhofT1bo7VDvxk*_OL8Z$}y)Q zdT~01^&ppjq9M8Hc@C3Fq%;)Mr}4q(GE&g&xQqF;SBbcKsj()fO(%1K#pbjl$q zRj~o{;7xWa)f@1;v@ThgF#rX%M`^6t<)>qX^bolwnIy`by?I)f%9ou0cy2Vm=@YQu z9svi3HMNF5%jh9WnbvuNvwXbZFcZ2Gm$y=M);z$4oYE3vG0ONKB%~iC`9dyMi6d(Zk7=sdv(Txrvv+9O2)Skz17uLX;ux z|NLGYzst9<*4YQV)}7{YJZuC6B{PXVMdAQnEZ~2Qgd5X)XJb@2yOj zkRzf|fabfM+K19;$`C@AnHf+1$Sdc6)qadM1i?gHnbI`*p+=h}>{$x*!)QVb6f(Dn zO=QL(xhnrDcA~QXL~n^~O=D>Z3_jy=AuxjM8=;0vfY9ED>1!8bywHU_QEuy=34bVG z4;yM60eBUW5i*c}hpX>aP91>GDhgfXB`raeiNW-IIaUfR8x z#bDH7?6;zP6MUQP9n}%Vv39zETMp#^8#VTeC{Ln^{Y<5Mn#;U$5G?U6h^ zQVrS;{L)4>MRE$`gd(1A+i}Mj(~@w%X}{%Rz;8giGiZ3ia$aTEE9(44=q@h*f0o42RGnLw`qyXFG{Bo; zN{}V@T-yd2o+!0huKS4An&xXmWGJQXs=obfmS_nJO?6I>r^GE*W?0Ac9)U9MXXf2AK&sSETNDy9YW|D^X%F(hFo$)_FgJ3Ut{d3~ zDS5%(t)Q-_AqrtOwY@YPNNyVzZ3{!)HvjG{vo|GjV;$YMfT`uDmb1B|# z>H0x$7gwB%_+}5lw!S`M?UBS0W~~Y@!8{Sc?VP1IHcq8|lAYqqn7l5B)Gas}BrU<7 z+kdW26GT7&h#4u(O=Jx4(3IsK1&B+XgOkU+%7VXYEQwe!@PjSMyiPVLIbUB3{ly!d zBA}zn0%8x+5K@D7NlVz0zV%%w=Jb1I|Bj#){ByLI>*;X{Swrz1O9Ebruh%yhTPz+N zn)y+6#q15hr_MA8Q4INRulLqMf*ukCKVbRwWo6+NQn(l8eyE<&FDc4qabEV`2OlMg zA3zuSU~CCB60TUOJ1s(L3gTWovS?wiuL!zy01sF2TfJ=tgA^KQ4M)2#>97Mi!sx&; zx}`WD`=2^eMN!eAV-%+N?UJB2@B}k6oik~Kz{cq<4MlW^vwbV~QRjwNU947%!0f!UMK4f&C50GNjfs83Remy)cgj5bJeYnO8phj*%!axFAzu*Wq>|LMlDNozgnOL*gTqwYZb?wyeJ9CO{3JBb z19`mHhKd)a0%m{0K)2Ah+ok81i*!AR7Mfv)rbR`uPU*CH9%D41F(SR1$**8xS$BsY z9FaP-Uk-#iYh+P@X`GZl^wHh3-1Q?X32s1p8$)zUzl^e(sbW#{2rX390ZQG%!m=5C zt%%E|I`mffVKC2u87W4hzG?ZOUfzne&I#w#WqYTrX5CfPeN|Dnz=;Wp{llfqPgc=bnaobDk(_xxkV#7i=@CD5r?t?wVzjZ{JbJ||ph2~=;dxCGkR zB$kYPh(<;_0|HKK@K?Set|qCPVo}Oji!%yJjZHw`VwMdh=){T#D_33Qhzn~2m?SF_6o@aB zQEtMiOsGRAivle@1l8uH)1}RA17TbmY#Dh1RE+p*|(n>?L z&t!g}HJ-|wwh6Ax27X=G4n)%@btB3Ewi+-71O1mbL#^SqWH~}l--a(>T@3+UeApC2 zr}(n6nkUVOYG=uJIwPGCFB*TyQ@@G_q`!671R84SP0g-`YqQijue@?ohR#yIS;moN zdZDDFqVYi@`ix6e&YOQYV$XTAl9t4&AjqN?%1}9Zh%R_=g2hXgtV6Lw$fQu>7W&hP zBw8{rHDur0OL=jc=pQpLq0;o2zyI2?6dB+g3~AAa)_YP>^L`hkVtgFfl;fWupFxn@ z4voXZru(ru1FjRPhe3Ca+`5>;4#EHw1RdSsrS3r$N0w8DH(Q5W4u`D4TNa*J)fbB@ zCsEMCfVQ%0+KY_~D(t)+*WETQCWVYmDh849WfK#HK!LAi=Y+x@X#hwe5aaa4?FTv| z2^0{z0gA1ijb6Zfh1L|ng_#GdO@=8>kc#-E^(epOOjS-Rr!-{zyJWZHEirGSJm{lO zw8n+nvexTW%AxD$IHVbaq#a}iQ%Q3*+`p)qk%j_QVyQYGw!5=uLo-LP98B##ibL3i zrN3$;jI6!emU56|Vk_|~=pYEmnWa}!Q(QeMN#~>c;IOAPJv3pdAxtLS zn&pv}!|pNKoILd4ZK*+N>Y}MB8Pi748Y}U8XK_vk-Ui8YnNkPPz1{g)I;R!0@E>yM z?o2f?k0<@yNsqP%>wEu*SUf)GSc209WvJ zHAT4j#iTcA(sD~qwmBxpa?iJd|BsC;ZL61RnbJ;J-R0Lr(+{mVCP=Jy^12R6lKdWn zTG1Khl}IVdBi{Ob)Djye)-OH{a$LcRNI41Ky{~BMlxrb7Kxd==AlMPfcV zmQi>zsk3mk2tTSVvsM@tla>QT%B>G3A*APQ!IL$YLQsVKk2qjyH>0~MJL^?q@2`}; zLW_SL6{Oz;TY;8#2ZyGcL%ea!hGyPnJBnqei@&cZE*)up{m9F(1&zRaz}`OK;K|qMW_9_R|g@GrwyqTQS88QEQ3v^nVBaR$B zHNQTGM;a;S1!MyGktm0ykRfyaN*>scp`9)rKwLGldIWNo3wl|;G--EGpvVoFC^f5|*AA9VN#nmw@5qk;Yge_K6h z0)Sx9Ukas`HAO>ILr?Lo0JBEAEv$1yK}13zp1+=}y=57ISjiGVLz4qu&11a6dvUBx zNXMDS{GNEV(b*M>qjmMwRB+*UTlCyA;u^AS6f&pVvlKq&(uQGT##qkygc@1avD|>SJM&@3c1KgE9yW;eZ=?~q(g4+$wVqe1t!dMunX{G<- zw6oRqh`)nHt#VFpnlc1H<`MwPbhQaBqDSSw_rO;%0Oe|hc5>GWCaOZ{Sw|6B(M1Y` z1-M4Fd_Zjit(B{S+GUP2iT9gCE%+w1*Y*E_J3Q2us#15sWtJFq#eDQYp zHhC>a0oFD#h*2YU)8I}~qpUjBvAY$MVraO8s-yJs1^W=mM1us1ZJ9mJw_6jO1woW% zSHRZyF}XeAF$|2*rX^!cXB^A7Y=SxlosgWR0igx6b&Gy7x@$Fv-@&kS^$Yrn8#y$| zA#sM@OEKZ4XH|eA0coR4yu5sRx6dX|R}UWQmRr8Uj+oh@)7KTDCQ5fIcfhCA4tE%8 zii42WVJ0n!uBDNg9YrE~iz;^=Vl{DeV;(jLq ziX>PxLk5`R?}XBp;qDFfJpGy}=wU1W3}GZDr)rrcg6LM-!k1suF@pNC0|#`{AVKxq zqJCmiH!K0D)~+|a_wU(9QG-vHrgHPp3N$4}uU(U6+mU7ZFx3_`#wkfrZ#gemTUaOT zms~PHT(N;HS-BBE5^7!@d@50qd3iVjLf4^$a2z6>w@L)ALaD2JvnBN@Vqb_iC~dvc;ifIxzn- zf~T&9kp%}7_*_WmeEqr7Lu`SM-~P5yIL{bSAdCUMc0d~Mk|Ew(q2FLC!84rvs9{dN z&ZwuO6FCvG&BTz_I4Uv7Uj4J@E@(fZCy9X(Q}nxrsUQ*7W1S^hWjef+?*R9A$~(ct zH2xLE5i1|!)tZj5(RZ_o5G1v{60_yFX;Y=WT9NUU(BiT2DI66K(3RZtYw}Ei9C1A& z$Y5FDLAIxQ=R~Bj$M$Xm&~McZtYXJSDk@-2M-4LKokxacSF||0@#-_46a9CsOgtMJ zNg#fv3pMi@TcVx8?h*J2CU{h-470YR!fc@NPMjZZA59~1YCLH{pQXn7fkRFnG2OCg zJ}ov3BCOGE@mG`VM9Wxmzbb279xAV@h$fwx7!AjqZZ?J?#t6F!mn;aW>LSYahGS|3 zGfmUPW=UB?6R>wsSByZ-WVwrv=p0TCeP4qD6R-3MK_DZR1z*?|_ zmc&wC)#x;jnQ&JdKu&!a%5yt6@-7LroH%-Pxh90eEt>#$4j4SvoX>aNpA<{ZCFBT- zGkGs<$@Uy=xdH$VUtZr|d~KK8Vyi+uk+jj2mbtXYP?Jv7mRWQTDHbu$9i^xHjZ_e~ zfY%@eYI+D1Hb7A?pDcG^w+x7b(u#i)aM(3(gNg15Wl$>`OJp1Igl(p|oTIkvD?p=n zjMPY~K7!risc&D?4#5-vQ$Vc0Yth!wIE#yA{veo>$`#|%r|z9Ync%}T#nYpG$`M?f zQW^79{Kjb&JZ(R8*J}KyhF+^Q-AeRZJ<9}+{!4NYnvsr5g2n{foLMr;pYr+{Mx}^%Sjve2K(zl=dxQ zS28??%k<^M+ghK8mN-Sc*r52o0D5#Z^ld;85TKV^ZqbB_T&MS3aC`(l5(^^K&vydVIOQnCXw- zl~kgi+S2Q@OO|&E;Yp?TtTnoSRl{nOr$-=YyZrDSSd*CFUvgVml1nbFgtnI|O(Vyv zwEwB~EWrz%t7D*rOl)!Q>0YyU=i-;(|5KDMPWpdN34N}fNmJa}0 zatd#S+$@S-iV^4lo&L<8k&j1z2ZTByMSXe6NjFPMOECCM4GE(gpy z?T%@OBM_ph(p)tNW9lu3xF3l;Tgu1Td8)yzc3_skPZ%X?#8=^oH-8l^XY%TI-om>i zKAs3t*qh!rOC|4NWnt=6O~>rZBu5FI74&pxJR+zTP2WK+^RFR5sG-86>yFm*9WDF$ z<55SSGQ>!cOsd9@JXQ!J`(L86N=D`vOgS=yE}<9rBf9`%g6?wBH(Oz8+s9TOLMCXI zGu1B9|E)io5Fu%7@;2wH&)P~!c%WleUwSlLWUfZtKrW_C`U!l7#8c(q;h9Mo5XXqQ z#PpJuB0oxfN$BF@2Pl8Orv{QD|H7bS{M~b8O^lWBUWALa`St6n8O3Q4$nkW}osnBX zSC5@8M0Bh6hD^L_wI*z7bOV<6+fXS0FmGS&sh0`AW zj$Zs-8a8{N23|s#$gY;^Wc(#dFj00!yZ9(mChIX-eC&R%OnL9BjO+syEalT0sU*_q zV+qv7pkQWz1}zD>qlr8@E-HN+`my(dxZaD3h%nv|f>xPr6fH8mXP{@eN|bCN+AWBR zs4r~vw@s_e1m=7~XI3!U^fF<34Tk^(86sRMQZI^o66oY-X6%s-r~;gzikkTZTnR1;Rvd-z+C>yn!vZ+pCR~)n zf?FmE2(_x02!pRs>18C&jl4O^$)au7i~Uzj&3~464)LFy+*UH)nCARK%}Ulx3k4OL zAcYtyub@~}VcoT9vnY|XDU*3!a=oK61GaI+0ZQ9-6N7|Z;5}bHK4NWeMwjK}g5{7) zoIBxFU?g3JQj&dygP&Pjv(BQM!S!a#c8>men@_9k#B<;-Zqhh&Y@bO&U_x;uvnDZf z#3JD^WZneKdYe~f$LcKbKHC-moZFMaJq0ltfM?Xiw1>V_gCx)nMwU!8Zs?j_QY$BW`r5@A3ytHTmSJw4juJXMJVSJMwsc&sE+P$gZG{ZtbM4*= zJ8EETYkBXy#<;Ik}MTYOfMEeK&tah~$kDEtnu$OkiS*xV^A)DAlSQL78*L~B6d5;PCvx$4wtfLds) z9B=etzoi(tO?dq&ddP~yFrh1$FF4%nnx@XF;KCz{91B-G4LYQ~>S;3!gOHiMOr0rV z;d2fm^0fFP%4xY`Zt9|8toTybvQgf_k2WUqf?4y7A{K9f6tR^7=kNL3HtAe(+`tFz zeoKbH2xLHvl6^s1Y`M|vlA@g60p&>jZfz&OUTtp#&FNYun@k{CX1)L=-vd}v8_20m z9C-4HzkE_0HG4>bBkpt-+>^m;Il?P^Mdm=p?5#VA^Zm>?ql z#Td0QAQRzhdY=i&jS~Y@PNL`-J9>tg87?K26fmu13IPixxqXc>x5wr3cpaOGOv#V% z|BU`IlxaFLE8!C3&GMCl5hyJt`bc+#1ce+}se`abE5#4OWs>qvq2tW~k#Ah$vF8-C zWR+mya6r+K1f`><0g+t9ioH8$3$zG0m!Lr>{^!?nL5NXc$Os_Ev)oiw)?o37X|4d` z+cMFWFjE-$M~Js%3c*x?tjnrdlVA-}#16qz5h&m=Z##L?=@>EuQ2=Ik!j;mLMuQ-e zGh6MMp@(<%#Lsb*4+4!ddxFhHv)M?QKn8@>l|@iR22fm-+Bi&0&&e7V0vrY1 zi5*^4Z>eY{)uJyO4X|s3PNoM0v9Wi&1@%+Ep=B@V8aT-BbW!Qdd+-<>ZcD6)S6q3x z3s*#h8i-|8euyYJ<2S{*hb*g0mVj0k6LNOu?y-mfI5-*yF`4-sMuxe4k1W+!bvHZq zdyIoq0r&gV=*+z{1_Cq-*akfl_Eeb-u$AHUr6YfLw(-%EzzBuvz9QzAhiqAL#nnh= zX;jp5Ooy&s`C4>C+Q_XNF_q#0sAT&$JTJ1GG7nlJtiLU5#Vbxm0k@a)&~9lVWaz>9 zyYLR5+475No8-8|7o$R2bAH}R?2{0C)wJ?giEcFy)DrfwjAWR+SCx8P1)&I<=qkL& zaS5iLG=ES%>>6+^5S3^K80|r@2_YjHcM9jl=x{{9^2{w6HF@gL$y27>l`T#z)N<8d zj!xIx(gRL9s?^Onk3;C5an{!niM}<2KNLQnJOCXBR0w7F?vhum3Lvz|hGVRFX3ER) z2M-BaV4c4IAc!2uD>x%fg@T>$v-GVGed@}|gN4gaFw82X8F-uCJ45(YruW!&u0UK( zOSb0YYO1*-R5UIS>4M|sd#8N%eGxd`9S(IE$A8P-g*N8qS-zMloscK7hZ24@M;?%g z^C3ETcJ&nesi4^-y_S$|Js&a6ZW$WVnOw@vEqO}g7)*-mrenB1`rTB;%8o~K$eBAx zu$557J7rjeK}+phZ;e z?P>q#piyaz3RAD+&CsV!3CS5Gy|q{QbvwyIjBxZ9$gDj(k4l8N5FIHRYP4YRL7KuB z(L1JbE?#5}BW8eug>&eZI7+}zuVTAlXhGy?FD1PXG_eOsA#`XwaNntj-3bDnOz0^A z!PcvEN|Fnre&Q!;CFwMUkU-0q7fPQ&TFpEA6zQ91in++rV}6FJ*;J&uT9X6Tg1g9o zw_{fem*o9X9uIpf38TG7c?_%{QREVLwYp%ZSTG3<7_>U{U(#8L9Q=J7$jqduh4_uw z01V!=@YrT!Y2}D(R8!1%=+Qd_?wsgDg6Ys0u!Nq37-Hu*Kx?{rt@Fc{YEc?IoD2ru zsC33}TC-rJ)vB)9C0D+(Fo_m4{p+n&%WZ_)ih%`oRZQWH6RNBtBnmS+!Lk6M?G!Zw zmYaJ)Q6&gwH-*Yu3KR*=&Zc<0%8+8P=izxAdk3GtWcVFE@6w%Is!~}j$vE0teWU*d zLEMi`PRVK;0NWIn5nZ=; zqlGwTM$JHuboDJxZ>*wnnj%LnP1+p)W1f7`VFvc?m{Cy6(Y+Cd!XPZ)}odik)ll`977pqBV5od9HNpBbDv>BTq}vb?<(^CRe}@O zAJmhQ-f(D8yLxjQofTStST{$R&eXLvP?hw883Y}nU*j})ei$+cF-Ig(BzdZTr_zej z1<^H=`?Etf(gCHb^edvkMZH726Pzwf%`HLpFIQ|6#@xuEX({XoD?$m0G9F6_hDG1j zknvZgKW?!=eq#pjSzzz(GM$^KnRm{buzo8KMnL!-TW8TEpcLh>SwGfJT7`C(LPSMM zd{@8ZjN*a^W+1`D>pRJF#uO%lZpbYu(_E$;C^FYpG>jpiX7ge$k1W72baCl9{17U& zpcVXOFzGK{i3l;pD=#hfXoGIEH)3YbVJ?_LfxN{OUf!?m81h3hhpx6nHFUP?B@6{v}39%yf`3m(=#XRT2{?eOZ)$ zrG&u{&Cez%mf-B=cd{Knv!TABDbEgbcJB8`KJZ;Lvs)2qK_8h0y;K`>wiBw>LE7B< zp*A7F3)MR9U8+tb7s!UUx-+&Hl_dg{LdE1Q9mU6a(kE+|xKQEx z9a(>pH;juLOO^*+$YFFZ10wvdM|ugeqP{^Nr*(Eaw8ORMjeHBvWmEv~H_XFY4SkcO zXdys{za6b!B}XjT^LSN5?T>O9VRahpdVK^wV2AFZpagtUcHZ~0ZTg64B zAvrQv9EAV7F+@uvUkz1;`~|3f-eG3U8Tc{ckQh11cSW|ZaOzQ1)GK9^Hr^RIi@aV; z?4aOqmK!m@qSdQL8bUE5nq&`ZQ6n(|)s-yb2Y&&#Q=X8rEZ5@;e7NR41M|mQ!^7iF zr}r!o>fUr}e#={n0I7|_f9R|(OP+n!l`e?4m65dc2GNp(Jb{!N$?SX1cT&OaU`@MI zeKc3KqN#K0C9B2&xwONBVyIudDfBU!RK;`0Ad`xM4)t;eA)jS^1e#YQISmoRJ{Ao+ zS0pFc1EN`>x2}u9qTI9|=lJ&kUDKR`bx;n<2;kA=8`!yD#FEfyBI{Hx-H;o9q)zai zt^SEgD8w9gf?AT13Zh1dQuI%^FOx@vH9mcy1F^{ZAt2+Hw-`6DW@Uuih5w1u1l=3@ zE6TzPJ;pU31+-a&%87oH%K~nt^494Umlg*zrutotI%r!bPs@zsVN2+Y*8bc{vAGyo zdB{-h#sBTRd6RG`=J}^BB@sG%t-DS%%>ssb|NqcOJWa0ClmT)w024% z2P{K_d6~yz7zlQfHNHjcTL1%n`xsl@jUjT@-uXIkwu5#c-(jAXDGOL&x^lme=*mr@ z&qBsB(X`T@m#8l8$i(phw|DV+%@`aNOSV9+F$LZsVQqxiTEIN0msIq(B%79z?BUoX}bjCLY8vcsv&o{101lSgGXS_6R#U72hhEkh{qV&{}EMZ)62jfHA-$xyx zxlr9GlDUVKL+$iV!%mqsy(NJa7ZjgFo7uD8OwFeQE^rkdc37x^x0$q@$ljRNfsb=s zrGEj(TTGi@gXyyJ!JJ1Ba3in0$?#SrOGSWM*<0s|%STAh^)ZxqL#x zNIaNA6AvP~UCY9GM(tjn2*vTAXGxjnV$Si0ez2! zuu~@BI?Gp&s!YRW`nRj+3!$MmWvK>)U)^elAVLA?`(ee;e3*;;nf`x~EpNs!Q6h#V z7dY^}8Q{q&!!bu@NG`~w-c2hx17rBD-UE4|F2m$ty2Kr)Bt*XGHu&~fR0GIQySAl!1I&!l9a5u6z-(Ywtfjg;i)%)%;Y2W>eIqfuv<@j9U~ zI4-jgLXeJBe+w7o9Dw&cZOt3lKhYc!KiG2@X~ZTI6#YJmnTnq%XkDU*yh`c0{)pkW zF+3lE^9?%UX({1>Ub2c@H6YtfJUUd;$(8kvAk)H2-sO6QpIQc0l_~N@A9t8YQ)M*7 zh&93|N3#IT9rXa1R1dVLyaj9q42?NC77U`v{2^)(UE@%8Mk|*@!e*nw?P$A2EH2PcngOQJJ#-}MT_8w(h8W3(_-$AUK^z^?OCeuQS;><{;X0xDy(7N6qe~w!Zk+j90lz` zJI3lg1>Y&&kmN-abf-vbx@6}cpHqPLlDa#DynU`xib;C#lun2b^t~W3S;xOC#f|>J z4ACGVoJ@${8GsDRCWPqikIH`0w9^t2GX_NtZNsOtSWYX4oD-(2--FfebBKCKbDyLI`(qqotSM)KIfvQSWs#udf72z zCD;yKJ~1pDF*9%vJSe6gYLy#(6ksd%r7?6>LMk~0F+v_K)&`^PF=gX8QX~k)Kl-ir%lkV#;aBa6(c?Z6Lm>_J zl3^ph?_iuE(jRW>K%$%@YBAg%5oX_g?xxJ-k5wddT7<5?ztLM|63FR`23M3jN97LB zQ4vOh-r{>#;@*Q?SNiz-8jRGU)T7hMx(Yzy-Dsbn%j=4BR0*^EKX8FEj}4-eAjey{ ztMu;B2ogn_e${8|dPVC$_1guhhrfIy@IiaTHh~=Qtolvt4$U26=CFfCM}Q;^NhOf) z4zi$WicP;@OsVNR=>cmi8m@x(ECsl>7A9{lnEG^Njl*Xf%BzkhIYlUgIZQDGrJipJ za%BBN_Nu|8FNd=kaSo$uCv$;;N(>;UYUhDemnp~}!T?#&Wyv0lzj4M=Q6vda6BKP| z-5FsZ=u(!W^pwUtMH*0W>I_q?J!BziUSC@UVZLHuQj`Ze4-GLRn+AlTwgl8+|JP8Q6HVkd0v^<`rz*gmMRAuH5xlDA zy+_l+)!AOFzm)t7x>urBd-NIJdx`fB?$NW}q7c#WgA1Nn;2F_lW();Er&D4k> zU25!iVH7hIyDIyl1yS&}?YOs{$%vB6@lghA`28nCIt5E~$3f&nUjBFsq7F+_s>R$0 z7AX)o2gnMa-uGbYbET``n28``Gl|MD22c=;&hdMBB$-%SEN4{LXb(O9rR##(nH7Z) zK(%*;#)rXz204Xd-N*YOL(fFFs6CwWHk+}}a+9|%O%n*Rt)v`M(kebsO*0?njUTlI zIv8rOH37AGOO5@?0fcNZ2qhaXsx5*^SSa{3{*$<5%63~vGq{tB7@MhDMen^ST3D4& z`n4v|wgXHl3hLgm>`X#Axwu`Ccs3g2)5HluCBZ~(s3ysnpJSQvG*?<5fv|v`fVdRQ zXZ3epm+Y9jA5*N-rx~2@d}HwAa3pWS9L9keUFk$lMW<{A%96_OpWK`%2~`je3Tt6!DN<9lIDBA-KIQ z4h^hSS2>92|7f|c3|_08-{dn!$2~vr!jwjx&J+m7sHck=%XnHD9WV+=Iv4c1)j2LA zXj{QLk{!6qbAP%uYH(0>p?xXL==4LW0$J*77`@rI=CP2#qm8o+4j7ae!O06UqycCb)|gpbw@&YFn9FnB1c%knfFJa88Afj-^Mqr784S6Bdv;& z2quO?(+qtq*D>3F+oHr_O<|?jD#DXX;l|=cxZ0RXQnr8Mpv~d9(hw!i76^Uza{U&x zeY`3CYMf~AiZbuIBIww~$~O{*$pig}W+@X^|7P76D?-b-##3}-uQY)yQ6DbJrjli* z@{jc%lVu5QJ;p!1tP-G&OGeHfNpN85%^j5TXna`FCcamLe6ET=-yw}Ggp)>K%c4J9 zJgY-NrSkFyLd_P>v1QK&3@mLeY)iFl(oMuNk$;?jtd+!apc5?3p|!1 z$t!B$G2guWf<%J=pNc#K+8Olsg3{%J>{}9z#sw3Ja44uO54e=m*Izt|tcp}JX+@FM z0v84+z=+j@QNXi0xXyqlWrIZnFAZ0j}y!heiIKrEqEY2?0u0xCEoJ{Tm0_x$#WK1G@xV!VEby} zQQ7mg)}y>e3DG5 zF;vXV6qwbd`ha2hE<}y5cI!XG6_SR&2tG7D4D)qmNO5})g10rY4kgv1vXHU9pYNL) zz8M=Mu6JpiS6qF@dlRoS<;easgJKK?j8(mc_$VHK-eq=AYTd?~5tNvz06odA6lnD8 zJW?KgkgS>p)$i&nt4y50#erJUj{$rr%GT!Zv5U44ebdq;Sx@a7mo~74SYp%Gq=l)S zTG(;z8+8=fdxm%ucZParVHpk*b#N*BWIQl~d0C$Kg8TxMgo_Mkq z`Ck1I)4@dRD8X)=y%{v#)PyrQ2YW!g#QxMX;zn}#!@bnP&<0z^!O>89*xbk;O5-&9 zP7^;E?n~;?xr+ER#5y+2dixKtsO4@zvwCm;<$s)6TCh+7E(W7m>K8y;r5i*W%(~|> zoM_$uNsz(0ZHd8MOZ)zg<}BE(Z!fu4gIqv*2)p3DX5Bxki$O!yDG>pds7vTE`! zQn7_OM-wR2!du#n>3x2>x63N`OUIn%6LQStfAbF@3niD+qHJwFq!yw}^eXgi)M{Gr z)f69y1TKC)RE@zPI)s0r_5eMHlpvl~3|6E^bJa*O_utsI^;i%}L#A7MWQ020W@gw( zKEO@nQR33?sI-etU?s#O(Aol*=wO6UoOiA{JiC{sB4V&GSt;0@_}M)rf{B<{$ZyDa zAvdn32HOcfGqsyA30tYOb%tFL@Qm2=*jzj$jqhbN6>u<3y^ZToV<|KyTxv9===!6g z>-2x8VCkBr#q%(v-=hDisiX2c4RVrThtD83gmkPD zm~2p|IO&reR9pbeYqa_Rk%pD%{4A6*#Mg1%`v+t{n*S50_U^7{IPqvL)p{r-t{_s# zz~XrzIelsB4yzyB1f^0qPk)7O}=s&*sqL{b`1qJK#dEY)oZZyI$^lLSxBnAUQsfkCa%Oa0(7@pwus3_6tkOHCDz=ZKFTvdC&bd#ik-s_!Y&ET(S-!MfK z>fo=!m~thM-0_|`S3uC*Q5$3-QN^Op{KWpsC8iWLJ$F?n}TCBu2D z`|N#TR@K;+eEGoL66D>K>55wecy&BkrUhdPLaxzUZ;|xHx~Zr>rp&Y_b_;bNy&`T3 zE!P_H8oWGa77)CV{yAsvgi=aj=z}F}Cb85YVgz@?yX&2@|K8p2@WrMKxyZf9yggqU zDXHWNWNf2-L|^uE==;dRZ(Mmi!YB=K{?d8H()lO&1uybil9j#s=F|Ub#>`0udTuSz zu4>H=Z*Q+;LIXT0q>hsvu5iX`GkEpg+|vw~BX4PD~e*Z+pc}aayK!04}p;aYglO_T53!;Qj))ar_c1 z$WR~lzVaAUW9WpxeBO;1PohT&B2wH1O$2c;977L+)eoJ*glsgk7*eK!3Zm{)!s5hr zUlfm>7jtS$S{ODW*Hr?2T^ukL6=N4gh*#YUiYnoEQ%v67v-1v4N&(4J$a^pBF7G`CDYgS}5>O4*h_4k_JTFMr70NeVkk2S){}qUmnsx^hnA=RlsVV5vG*q1b6{?@iW3Z2u*NX`zY1w zy;|dh;BjsN$l0Ii=5?>oC2wYQxTM~R%+2>e{nPrQI%H2;>F8h7?CE-1(BQqxE$I2x%@7OXSYn<{0V}m}Mcmhzyw2#qA%ZX}u6|EM2 z{^$KL)iO?X{NGF5V_(G-$woztz9a%3#AiHo7ty8gisv^|@(0Zy%eZEu8SY!&R8keN zCM%CGD}IU(<%r0SQZ3F90J6-EgmN&XfMNXsFEBKrI02?tlHNPi^(Jl-k7up!CcUb^ zUPS>`fqZpcqL?5Y?Vh}}8xP`2k&+>Ms;I$zMqB~xAvqd(Bbf9-37L6ih8iD$GKe`o z-=VoxiIW-9jFNzyT9+?ki*lU?JTdL@GnJN%zZV92UpaC@j(O-7KvkOQ>}om{41vq1 z(6X=m{bT0U0Dh96L`OZYKcx<&AptaoLqd;)sGITS6o82tYAM-G#WITznQh~gnq6t8 zaI`BsRZVj@9PK3)+Ddj{N{G}Z3UF%qxrO%PhKBP-c3$cF&@E8SdOLG^>TFRTn4=`;rHzE}hs`?t8r9&7BrNKYr2$!Ugf_91FIu^+jEnVq?-M` zg74;BkpvQV!y*iTllITJ^ArDItmA}5;{%EckJNAUd5Kmbb(kllq9DRENruHZU)<~^jtQ0pzqEV2cT;wSPQHMqsxel z7Gj;(_qB#7b;7kcHFVzpVW2EJ`)E?p&`mQ$iPu}I96D=o+1kxzmv!y{{Ny(Jd!i2$ z)dTzKR9Fad*!)ZA1uOiB)fM9r&k4;s0)iIaHh&?hGAWz^(rZ$BrIEJp1yP5zcgR^A zE#%iIXE351AZuI2Q(s+bDxD$+ScVhd6q?>W3{8curRWEnwmf_~chYPsqHxz=P zY6cs<%8-1ws~00U$vcBx##NbDDibMY4IB$Q)Di=V=7P1qcT}%{` zKaR*7inmcb4`UjJ2X;uN#czc~P=vxIissxk^HLMaoFXKgMV1H3)-;V*g=i_)D)5O2 zU%&>wW#MDKau$bUj^xPlGbCQrON{%Qz=O+zF!BImi9wS|3Bbo_(iGg=ThTl~*CI)M znOS{fzo%t=fnVjj%{3<9@zp=^TO^-p++U+kjFb9~Wp7Hy5JQN?TnSthn?xF}BT}Uo z6I>-k60l$1s*}ZpEk|2u1eCd;hO(A;pEBi(g-jGh9vxx2u?ohaGO&G!W}P&vkV;V| z5aKrCrGptu45gx|^W5DT%;7C&#Esc2t4vq+a9ydU3$T1&44{)RNCtq>)XUBjDarxH z+%&H;aF&Wm%l*MIczB9v_x9K$APw?62&8E%C4Jc4Ce166K-}PZt35?nW5AWu-8$>* zQ-L4mx4gaR3wxCcik7E>o5z@uQF^VG#%C<=God>7dsN@s^e*GHJhoc0Sq(=YayyB9 z^cdp#((D8y01^Xb2-pGtpQOy#;C1;kYxljp;yhN;>(IQov7SsUstxo(^mXuBwwik? zl{ZH$%vrROe(ijV4u{6F2>G5Uq6$+zPy%2n8t5h@aIs z9szF(Ddg*hbZ`){g$0ZQ3)r(3S6}}lZJ$Mouz#zh#70fcg+Oy_&|G3LGx?`q-NdN@+hWwfUFkHaGBD@j zuW>`8MggF(7Uoy5YwbH=c1Y@nx4#efqi`?v>=R`ss4n~ihbT~Ps^CEhisBts+I6@l-I)H_0JNTl{9*?ILOjTupV+AtGLlXl~~3V8<@# zub2dLGAh>eSB>9<*efkvUC2%79#6zM^=lL?giT!era^fgXR78#3Sywa!BTNklXm!l zMV~?Wr)%v!-}hQ# zQLtPsUQ8B;58%P!b8oG?)90(&k?HlLBS0V?`A_;Z+sBRPG^s18$m3mB93`nqD4kDK zwcyf}DNIuWPf8HZp;nasE+C*WdQM}lJUHMU;!wsBHx36hBk7;xYC5>)hS;8; zGJLb?@YrD>b2iaoq*dwj(u3O$scgj8>gT;vUrIyLULuW5h8H9 zGQ(;>RxxSdJt>24y+SyA6_r*cBFxPQrrZ{+1wvxTr(PwdSCP30*4W6`vUFH_ z%$J_Qno1(|cNqOXQ@pWyq|5nFCs>%QBf4uVPk&%`N;7NZVm~Y=#F^9u#IiG3VxZ+^ z@FhZbnK&{MrukBuN&*dG@N5&38Y>I2PO$5dRP6ON&ACr+Wkup%qd4YUE&Ux}GM(`N z?Tx_1k!?Y!7g4X(2Yg!4S?k``hdiM7JTegRfYW44;{nF48j&W-cB02IrD$t;wYC-0tXo%a0$W!M z(g+%4)l|@?lb zIb2FXhB4{2dv#v5^ z3Ss&ajL`3JwwPk?lPB+Y>;s&}$rCJZzSokHkibgY&W{V|GOdXL<)RWk%@8!(Ckx2X zP);&uf2#m4N^z`oTP%^`qhPx5<~=3r5<@rEvJ%}5tVZNfyh(d8^lW^lydpW4?2Io5dreT7v1QKn2hqdh|W^k9s;JLTy>$ zLrnx38tWANNzj7!VF2KQH+Y+3IO~XTJp56e^M(F}MT^gOM?$UM9q6j)wnq)I^Rd&4 z_baZRNeF&9c#j{NL^!42v&jLweD`uz{pxyG9LU(ThwEHbM-E{JYd)_`HgWIbK4|`H zut~g&dPyimVHX~1?qv0Foi1=f=R}u6%*Lk>Mh~*&{_S7^x!2@wArQ+a)*7UPL=M0` z^u}vw_z>iZR&z;<9+|_|h5}K?((P&S#f-to>Zu4FoEam>p`^hOD7P$uIz*t#O`{kV zOvp8;RNCq;F$CpV;vKhV#!{G6`rv3_R_WWCaNE4aRWI_`UzhH>b&4t#1t%~Ye_Ej3UFixya0K~pf>~W;0TNoVFr{Rn8&CLM+6z8nKYLrS-D;DAUNmj8_)trLODB< zrgsWR_zx*Pz=JWhwJ^B?f0WuwZY$*ZFq@+?f(c((7TgH;85ZtC zCdj%5DJ-!h()8%~NEa5vw?RbvP>dL{)5&g(hXRwH_MJuh%2t4O&v%L?I*1rNWGHsN z;0fE5)<>-kyed0?qE5<$tu>Ye!F*G_sy6<6i;zdtbcp*42l~}?P1yVqzDQ>45^}%m zy|9iz<&9R@BqopEI1Ae(mEt#!w*%=Us(Ne}F2LeF5;xJ{{9R7RGw&ZECFZk^f^-G+ z`QSunZt;32AW{@6t;c@iQUmRWQc*6I;YQOrZ`@4Q}M@+RJt@{mG=GuS45cu=K28 zik_`%dQk6O(>>P$y9$$JhJ~1Pa*zqbhxwlD?Tvs(*CSl#{?fDfb8H|m`0;#rqk_38%AKRV5E;C- zAAgaN{d2M=qk2VBwm?D>|4$*!bvm3qzDN|2o4ccXfLUY?iOhPGxQE^JY8POnsF8?;b1X;O_TrL& zBJ>$l@DIvhxdqGd_lIsKd&m2aD`8704r;O~sIyt~5u4YtLPV$+4U6!*wr!589zwffXcTtB1kh4vwdBjvT)Z3Kv@1JG?k@zTnI@3;q z(KkngHmpJig(}h zB%&KpI0&UCwMH6|F2-OR2h++(p*^EUJk+v6hku$5jD+a8cbG+rcM^o;Lx=@U_rcpz z*N5Jtm_8coapOy_t6Lm0+NF$O2mYmSixAHXw#$-VcB+k8(n$U=`)wmV<>2gof1z?E?$LW>2qiolo>9-CH4;t_N3_PVy@1T(a4!* z#9OMf%3ONg7J6GueaS?<%f$2VxF{1ZaKgB0WH0x^Y1rP};))x=wRC1OG#+dHUL3LKShO^+VO zTUzs3qtc>*XfRoQ&q_5Y(oG_jd1_X)u+ZbE5zoT}X`cnX0Q@Kb=@5!aBE6 zNd^o%>BrD!$Y~_qDw4lBCSKnWw24nMBr-iDQbNq+uesK2sEjeH?hlSqEcA0o0A^`w z_RY4{wnJkftnb_U!Z^JGX%rV`Bq&V;WfM3(at5!w*xB68(=->ErfN($fB9Eo=ULxsSt?VVwRe zD6zMj-iQO@2!wCqsp&!J4T&G2O|BK%P`6rA50PP3_~m`7hQNVYZXI*)63no-d2k_6H6#y3AQ>Yef=iQktF-A)n1tsN&(Wgx{-^5^18Z8!914Ht&w#N@ zY=xXA2I2Gc<>pRfsW1mTKtS(@p&FV04=B#C1l`fvE{_plklF!jEz)XX(EFEI zhr?TFJ$_K4;foAOxMr4Icm7l~VZAyo45VU+OjF7uBQ!@FQeBsOC+RK>c_YZ9qu-1W|IWZt zEwg~Uy0viNET1&)eTho%{wmQd@->!hY*IsDLqX&@QPKFz2i*#n=Foc?!0#oT(d;_Y zZdbv}_cx7s4D>|Hi_#PP5w94A$UR_4IK3N7GgesP#iKGkgh}7)c(al{Y<7i5?;t}V z6=ZJF%x{~m#ijU80wj3st~vH;K)nqGwdXQ5>;}%f1Vklro|;QCYBZSpbTIWge?d@4ca5r zimiHYVU=T}M52G7Dgi_4d1@j24AB;GFwAx0v8(JJOl8>+cA~Tz#W|2A!uXUCHiEMF z-uk(Pxxu>N?oE?T0a=zKPXOC6xwPV4BFunT@pn-0{oE^Gsm^+_vf_JF**@r7PJhCwc?&ERk>*5Xt*M~bps;_12Sw>TGadu>ff77RbBdl z$Y3z$Wer3zeHDz%SlXJi@7iN~fN2Jw|NThOtC=NAOmjN`(VuN9>Q1(3zW`s)Mpo_V*7LMN6X zM$34XCegnfqFwLIdtky-Ry-CF=7{lG??ZqqAX{L@`X>lO=EPSPt*prz%dphLFb8zr zHE0T9F{dsP=ib2%k=@Km3QR1pPw0ck{DfS?bh>m5-#ueN|Ks*s^lp$R(U1MIpoCY890z2u;fGV<-gKR){1M`P5)A8i_x1BIgte{Nw z+P9_`rN=9ft7W}Xl+Z<)QDrBJ;&&fKs|mVRG%8vxQM>5eFY7jP`VS05-*j6VW&Ffq28#x0~0QMl}`a)F5u9s$OH#X{__>dJDeU+@dtTwcwpr z8JDaO7t9~T0E#xmqx#V_m+Ya0WP&5HDgA%+u>Xm0uQqGfez=;~-uUg|+lg4+zd;=v zFFiH@2H+jy7xLtH#e6dPw$QA&TAkVmkPi*mNT*@jRM;J}sIE+CD+{md1d03N7h=(4 zXZMF6|41R{Xn#Uc8~aS*g5)bI5vqtu+4@a~jTo{ox`1CFV!k&4E~z!OuAYn7&-gmsRFVEU2to?#0IUs!K;p^%Z_C!sVMt|H@mE#vs}#|PyY9mW=o zY0*gs?M}k0Vit%gTy_=8{`Z>Q9an4%dV!J*_YH6`G-~n9fJW2FW*`|ctbewjg0R`49_)i&%j;8jCN{d8{@tA zUTJrb#F*PDs-bs1Vl4A5H0z;?EV04rF?B?s7dB3*xfZpCMJ3rIzi|OB5M{ z3*>CPGcB1A2fOG6>LUf>h!0afkgOjQ7~y-=R%8o`CQCRex}sUfmqB#lSz~=HLRHrM zW|qi-k01Uy%%wK6=>d2DZN^uGlO2|Zj^_?*SCgaa_+!RbE9SLU=ZpP?8n^%T|C?`qoLz0fJup3am;QM#CDE?Queu7~u+5AxP_3ek^S5c!SkggUB z`iUZx&OQQhG*zWKU*i4hVx%oV0<1CRI+b4Eiv!8U_1_djoon^0v6v%lQ2Hg}HMo;( zNN5laqjWlvD-#T%NC~q}UAtraFwu0;7)K+5+2qE3oWuF=om?>7BgI6yG%8S>vb+uA zHD}3}0+&82OCHzlkDjKRHa|xIPQRR7-@Q|9qY|G+BsTP$YMTL2TGl6>=5ry_azQV& z(^)|8-&W4Q$oFDt6BS{^rdK5^E0?%Y=T0N(8n%itbK1<6yP8k&^3j6T)cqo2SXpg@ ze`2&Rthr}T|Hqx!4rY6s#HM$Cw@DqRG%X4$??Sxn&yG2yi34SZYN%)Zq#k@fn1X4n zE9|(&g~1ah&DfY8M`OxFlq7}nfgYiMF?L|7s?c*AD;#ceu6=wKN)$ZSfySB?yRYV8 zu(xGsiQib&BQ913&uZF|SoY_YCxS~0tQ-5`|PsjUz zT-|9B966Gt(f@ghzCclY0em?S?|+5yr+^_S(=9Sxla&m{0tXCcs-KEMWPipSCGq~} zq15wv&Tu#LbM>l& z;k@&!aoDMqu|cinr_$6MR*vZ33#T)Ow{HgkJ@6hm4`26F!gdV?;gFiY z5dGU#b+$6jj9&C0u+QHbqc}UxP|fKd;z_RgVT6M$+d_NVl6|Vx4G^gvdnLn~RSf#5 z?vZYyiF6@#lCb2|q!XoBtQ>YuKX4Ft77|B z-ji=h|LomYs2>-%@mvO%{Wn%is`$ky!0QBq`d%fTlpLqLp=H?i>Z>rcN%HxQB(uYP z?hmw6IkVrm1HLo(qzzg36|SB$f{Ll#yK zq{%`AK%0T~Y{sbXZO|JP8V<;r;!xM?a(U00i7U?|B^+A^aOpLYF&>lFYI8r>Zw^x~qPhU;y( z*FSJ@qs*)2H$bmgw*7%&~oA3t_q_HN^@0b4Yk+W><& zIo6Pn;{yOFD{X}51on*<2^;suF|=MR0n(Y(P|e@ry02JL`g}(!!P#378q+gzLSQ@c z#Q8_Y&H;kQ=k51+l+ zyaDjj0}^=kTyJJ_=DLwdoU^b^wWYL?h<*i_%NNsw-+mNq6?s@HQZ3I zf2=tvr$$1XFwK$%eBaoXBR|nar*o2+Zyc@PVv2=j6Ek39xTIGGVVe8tOzx$nXkm2g z^rz23aBQ$!jVpPuDg++>Rsx75znZK__`uVf0y<(Ni)MIj??ErTe@Z#_Om(AgqistO z)LHHfLD`;W$bC+bXPB04my!j!N2eB*|N0>5JgvL$_x!~_D3l`L({L-No^vj84zt_v zG0DQ#vUs&qZ~me0%RLtU6K4E$bZB$FMSBS#y{B{8ogGLL?=P$QOt4*Go+zMo8Px(H zHtgd}U6X73B9kkx_#PaiBHo1j)HmomXPg3N@)6Unfd@+uCvt=y(t3 zi+$gQ>u;ior9Z*f7HL=kgE4yUqlT$lw4vaU7~ThtZ|JqOudYd$6R+cHikdc##g~XJ zp0fy8`?a1iX&N{{R`^^0i6@gx`kGda5x^^wn)-6}bY-rbs*sTjW5HX$e(ujj6=A z9$n^1rawnmpZPFz=i$)tD_Lac`)d_oDrn|W7M#`RKDOKdTjm>n_OD)ed)0{C{eold z;szJ%3~9NK-!P04oU>bafc>R~u?tK1xgmkAYo*|A-9s9-sND%8!X<9wh=NMF_;Wdlk;X%AZepR7p ze~*>bzvY;Sxd1)~*0WQT?0~;I}qz~7}7LDd}tr4b{Kc?d|gox|5s=-Q1 z8Wl)IA&C!tMm(DSDtjZu>`{*WCmQJFVXOG-ojnQI0T016TwM7x@Kt0lnyk!t`cfzy z<9j!u%-Jy4{D?UvOp-!X3V)2A@H;Fz`#ov+zRa0#@@Vr#CwJ!W|02K$>{VzbZcioD zr~}3&kG|`Uye^!UI=-%N2bV6Jmfn4?oqJEe|Bi#`m@qu2$B@0LUxXy}m_7^r@V#1( zb*{Tm8okdG>cEILtoZ6bt?6~Dg%&0!7uG+sy*eY_>L?A&)(<+=-m5dC5EJc@YFG-A_* zykMtxx-5ytw}nvmA;+R3fS-^o_)Aoz;~f^&o;dvm-z2 z0mBuK@Q}Can1UjmnEwk_{d6flHF)lV*L)=sc?hkXj^;lxi-uZ~Vh9&1K{*G}KFl2F z5DJBBlu9J!>E|_3ukG1h2$(}IDH!Ht9 z$Nnw|zeCH-Y}Xk$S5D0{`n-GW9`jm|ml}R$O*%(5Gt*OFSCSqcb<3Tr#81igm_`Xz z7hpRBw|!mX4{eE<+cSQ^&X+9YON6M9is>PX z<*4&CnnnjxIR7yj%=so2@Wec?&2`X%yHNtazKv+nEp)kIg#G({CQnm~DdN7Jz!mm* zr|n~^D4>&PN}cOKOrKpy)>WU8 z$ow_Rp*KABZCaoCsZJ>D1SQL*$+vhfQdHc;f?0j9nxwSk9ALA5--3(ZcbRUhyAxH? zek5+_TyAtl5Xl|HKbvv;`OU7ehimFN?v-_|Fhl`zUGbXS`@$wcE&BhTZ}M3B-13Q9 z#vys$F~T;O#Ji~Z=lJJfOUHZezkxnI?c?D(LH6eiQ7%|l3}V&;eL)-TUX8hu#leXhWnj)Z#-|51bZ(8 z{v8_nb|g(8-(U3#ymi07 z2#O}i#T=dJr<^=Tu*FX(;_}ujm_+b6|9@=TiEX6@T-FqE&TpprflEy+xdMu(*L9hl ztop7l!}eB6Z44r>)+hq9`YIBmE9#4Lip#<*Gf_La$H>J5)AYd&S?R_ z<*CH?U3Pj4cidR@}wFF0flQ>EvZZcJMNi7({U^H(2n zo=eZ0j?EiQ(Y3b4TbANiE=IIE(mZFMJlq8M$?qht2_=l~tYJ^P0!d6eesFTW3CVuj za93Bz4(OG(b2zzeTG@PM`w%F8Rz#9!Q=HajWNrt%*zrLW0<=cuKAfJPKi2Fr=$*hV-O6nb| z^t<1`2Wh-%Rn{i1K`_#~*m45htgxWIbCY);ky0BK@9X57Q3lG9(N%%(Nw)U|TeJ2a z-2ja0?^e0pYas`+@PzF29CxAH01h-sd{u`+y+@WbAIltvPD*$C3Z(PkM}9#>Pf=Tj zwqvv#L~HA1F(h+w&owUV@SzO<_NrFY8#T21tj$H;-wNwQ@H@P+TQXB(YFpDakSNI} zM}nLBnjs~S4hl866l^63oD^%kF@I9AUV>V+=JoEs0cw~ zr)*x10nPF_&yyoQZ!7QjBe(3>w!M4N?g*5l68v5j%17qqb6o2Yx4jw2B|>+bk9d%V zf=~EJx9Ew+s~P?V1)y7Q@kGHeo@KyTgs9Das&!VuRQ^U$DSPrV=F!X1j}ky{Mwx{& zbiM1U3fk*gNpLC=eY7i2I9uu-_3E{la$T}#Ps)(wj$<;6UHWi! zazoc%7@yEsIu(iT{}D$r*y0b3>fg7TB#hn#oic7pJ4qTU9o-UvM1B1REu|n0iLXkf zV`%#kc7$Kdf1F?u2diN1W6JA+M`uzXn|j*Pkbi#%I&9aP^mlibnXO9x5&Nr;*~5aJ zFSW%$p!JD1O}e-&Vx$(Z84_>EZ}t+oM3MbQ4fXV?iSe$s(fvK%N$2a64Kk*Kxrqex z_iZ7qs3>=MlEyIJ>>%w^XSIihtH)xmTN+tTU#(Y({6S06oq8cSZZo5ci$ z>xy<~2hCsp4onWkwePH$TC}|c8)zW{$|j6gA)m1^vh4RGCEV;@xlc$8j$eEf8r7v=Y zS^8K0qB@|<#ZABxUpO9Q-DT>Lm*>O|Iu0U*LJ;df#$a-RrfI_CWoncM&qec`W5` z_^1PFbd;w#vzEhYX-ePrZ4OK65_~Q2#O!PK;HRzHTZ89*$As#vzF+JYF5R+)TsMB} zVMtsh$&MyR+a?2yGXYrJo%gU(;jE>Pqr?#x3LNjsqA+TPxKr z{*_sb$nu+icbGsDA8JL{F;n)%nA(M8QOu8|iJE|r5+z_Kq0d_dxm^7kDMlR~smGDJ z%@`dezo{$MWKWFKJge~)o%j8bj8Q!&7#|;Tk5vh7lE-B+xj0yLxe4)0g(W8I`<=FJ zq-fr=6O6{{nKO9lJ>B-_T6Mj?o^wwT`;`J~Uu;n*?}P1kFJ=B1OuP|p>wItfFVQ%G z7_tz9HhfB|2{vw3tKp70|IgG<8NJ+Vhe^0JI#wT~z9#qdqDk)Q4kHt{KR$MGlX&2Fxb z2Y>t$JPZn&N;r+vl90BXVhN1Baz~4+dY%kVxbYF*C@d=c0X&M)Ql69P`nn$^9}RX_ zLMRdScY7TtpQl=w5lsG_wCmrI@!Cl4sNAnQ$G$t1CR9vNu!COlTK6V*Wl2mP^!7eW zx8Pdz#H$ZkHSq@0)$&+tG;C@M9mAz05|u_&n!N3Ht=)0Y5hKm0!7-L+_Ivt+a}hCP z&oTeJN(mtJ@4eEnr;QmqsytD%FpYnMiEUjD?kUnn0sJbCX5_d3$o+e=;m-K~&((kQ zGbQQLG~l1x?676K9+|%FZk$`qWfG?f=@nq8uF`ylJegk!`o^X+As`u2cW+xB0}^_R zFt_gijAXa+@l8#zJd;nv0i3ZXJmGB2*%EWrw3KWT3YojD4uC5g;Vtm5Ad~q-%2V)E z3$s3s;>riR5G<1_JBTf;wndt`wT!o5MMR3Px{fx0KS{!BD^l*aT@6%%&{VCjXzGt; z+DN)R_Zr!EK|{^FAFY3h7MyeU`j~mKZw>jFEv~4i)doZ1^3G}HwariOD|@xXJ($Ux z`a7Gf+dbtjs`I35OrugdgL~YXM8X6CKT{A-%J-{e>N*Fjd9fVC@zT(O_)oKrbKrah z$+!8biuSgmk>xq)N|~h{Fe!D`?%5V1$4y7+N#gF`d2s>zbKE5|exIsibFs_DPSZmh zwAZKH_soj@9X`#I!gTJUDnH-+9{=&P!ZP8XPhy)r!td3}oRh(uv2KjM@UvqA;+Gr+VhM2uVghwN7`wvWWj$HerO zD4jUKdd54aUCOqTZ|w)3_>O&*z=;Ytod_Pwc^M;KC+pEUd44neGZq8`SXq2?y|_}} zQQ_c)%-S$9)dN*SN9YM`|Aqn)Holga9OCO;i{H)a2ytNm$EAA7MeAJyopfFE5Ee*}(hL59sv zN2z&pk0b=M)MTf1kl!(;8vQoe(1zK7rY$8?-9nzhkj>VnvOBt#(&N zLwvw1J=Q6&^ip?PAS_1vw`0U3Qzy??s3#eJ9;mUd^51SB4Ri$z&TFt*mKa(*LT%jq(AYs%U!c!Q?sszv5Q zjtno(P&7b;>DDVBfKhZO)a1vi?1B&Q`Jd}x7ebv2h;6SuzeRD6v73jB z#Qu^%yP6(u8YJo-rQ-)SA(p&OgW$ozS}&F;Lo*E)w8w$*E{gb9PlD%baOOf#ze!gp z+Ss)j=YyXYYuPR(M7O|0-y-i_e}(}D6dGyxu2goHSbo^=>3&P#nSJL@I3EuEk<`$q z`evf1K$bM4%_Q3T$HVzx)^?s-b+%<8sq2XY{Om0e=>%cA_uD~S>b{Pe=%|+vw%xP6+C#w7yd6~W`8YbL zvr&00snjEI{)MNt*qQA@9^`VI<_?g&w}Wkbra$f zh(~UKjM@%D#As8WG1bl;%QH!jJ9u^I2qy$2>+1Mom!y6Veq|e1<8v>T%6D5HB_E%W0FCbrShr zC04wW?WZ5DIdN1+jsM(OI3b7kOyZ$~$bv}lU^HuQdwTJ`dPd)3nZN4rtlw~?ThPnz zqdfUZJldG%v-M+nRqXaJ{NOfuNu*ANV|bB+{qP9PnFr&EJ4`qwFopCH&&F?LhmfE^#)*lC);KZ zMT`9FXWKX_Tfc3EkY~Sp#f$C^K>mb{s`&lQMbi{IlXb-ds4ullf1Xqju|4XGUrx=Q zaVUdgcFTPgCz~6~?j+W)0&n^GWOWA}ho+m~Z&`&-9E5uUg2^*}$ev-)h`##`-f%zv z$ykvIA|qHYt^XjA_z_!#8T9eTB0ENR>mF?#y8s;v+)9yf4zhKdO#fKBSlqt)|B=Bk zlh-qo?qiU=jXn+b^%yg^VV_L!O9GSIO7?MEy3%u%*?5#zO?xfwt~ZI~#{BFvV_h=U z;`OwI`W60Rc+_r&Lsz2ov&J{ZU6I2``|8_e&h*uRb%hc_{4Rot);$6JFk9a!>!j?_|5fbz1XdkNdWM&7Sq&B=s2bQ8WJ#P~i68mL9gw4>Tc<*4apB zb4@*t^}pv_AYvv@IYOyFt3uq8fMIa&i(4Z$)J!xZYOcQRtJ)laHM>XX9r5V>e%DhT z6`4S{$Ho1qQ8!4cXFP$I$DB#-W{N_AyQAlgO~&3Z-&pevZ|P*23KY3k1RlrznWwd~ zDS_Vepb=~6hO-v0TMObH%2s2zzkYT8x9=UU9)aPW1s6181|-alBD!c{BbCi}!tAs1 z-EnCDPy?IP>XsPuZIZ7!|E`g70uPLl;N)3i)IC<$lY~~#$ov&A5N;!t+$HKM`W_iI z9W7SOeSWQT97o9!+-4Kro0>iZ;LL+(1V@B;cIiFea|i%l+V&Um^cqXGjZn@rBsh@F zr;vwiG4YYRG~GomN;51q&-Zv>z|$;9yD0xp4-eVB^fptkab0U?Ja2ksZE1dJ@Tm;G zf51U0tA??+zTzV-@*BC-`ML~NgR^vPfe{^rYS~99C>gjfjG64&_O-q}xm!x1BR+w= z*!?G|$(zgE<-wSG!+oGyjwB&rgfd4xtK#yx)wxLgZ#C(<89-za>NZ>Z{E*KPe~P`h zDH8~f?_UV@vXgOyGI8efPr%Pl81Gwh;f$vkHqHCI;u?P5^7= zJQ$~R%@J{dLwGXY*OM$gI)EhYahO%{Jkq%o1IGL7WHY0@MouU1W9>NKjl}Nd7dBB5 zKKs@tVe|Q?SyAg=`Q|fDHLWDFMJ>O zvVP27Z)~4NNf5Qi7H&Zm$Xf6pSpmlPR>)!wJ_?X;Yq>l*eOhrnMyZ~Fc{Q94r(3U( z>@zmD{Y|nCP4#L;>043klQeuw3(~QY?}FOanTL1T}SvuJjV_dDqLvV^wCqg-NX<@zqn6HKkPtVY$`SA=;6X7Ci3JU*MsB zPpTc0<+&;v(=ikNL860^!iRI-zs=R;(}_7okBV5p~q#CW&xg~k>}mZZ>=lbHY}4d+R`o^x*K@LZ)o70xVVGo#2EP=;l9;YZoa&gAvY_Q8jbI*(Bv*c2e(0b-vur zA52*4_A8vyD$uU9SdMfy+w-n9wnrFtYvC|PC}FQPZ7>7YJ;oqE3n}}*B#;FCOQf@1 z{}d^CF|^Oupa7AfEusIJxf~UNHs@Mnk@IW=8h%fjaNbz%&6X0blyx&3rAIKlo>tqa zE^#X+Q#RfZV$H$!-x}MK?4HnHO{V>*2450kX}<^B@;VpBr-jL${c3+It<+V?v1|A* zK%xib@!LvSHIg5;$Imd|?VeoCUDQ`1PHT>AJrl>z2@n+{bjklzH zU%Z;%{h)HC4;X!l#4QO~zL#s7b$$1g=g>y-0NPczeEI^rgwfS} z*;)xzQs<{9C~?-@Si|gjDuabwM3``QOw#NB(v|2u(cg?MxtTzEho$M zM`#B{i2m(+_rhyF!TcE~>ZARfulqg5@BTYw!c9=OZlQi*+X3oRn@y7(El(!d%IT+9 zCM#86IB-PtPBF`SuR559{lbclW#cHRElZ)h9}QJI3MoLOooHd5ZNhl}*0mPWEkjk; zJKTk%ya#&lEjQ06NWui-HP z%fH!`qg0#UFb|*$5DsT0i0#2M5nYEHAJF9U5+r5&vke|!`qutDHWCJ(fS=G1?Tt#~`j6->IKC0^L@Q_Q>xR}k-_c>3|EB6~SXn?v#S+o5J zljr!~mH@z3WEnF4ml*_QaDohcTcq6D1i4YTN?v7!^v}ERrCpDD(W5Ql>jjIA>aEu`?o4h`NJuiQt#e1gn47p;lcXOoA)f$AbP42SFXV%o)29` z*30R-LW>3YbFatoj+ZOsYs&SStZ!^qJzLicBD0pnXw(aA+4ng9pF$~y<~N}~!J_QL zy&);|xnpWnX-ucHFaOLJ!=$8Ho2bi*7Y$E~)tOFX(|@dc)^_I*;x|b!P98`vW~O3} zb4G>r1mHhE4G8(;$>QL6TcPx%ukbnQP8}oWB`-DfHZtp)v?}I=y<~%%Doc#~{{9dm zsXo*nM~;X6yjG!^oS7qB5z=e4>-*7h5~B)7FN2A=9qpFRHHeON=jSG4)A#m#*5+CYtVe?zlVkMr10izO=;ZY}CU)l8kT~^DPCUASv*%uZ&0x_Zs7iANRc1GuSgpw(j=&ov#kCjqdp`#*LD1>R%p9L^n`_&KgmL_! zS@d3g<`DDAi`i4>-yGS3{W(;eB(=E0E=$dkdCB)t^c0`@ZeRPL>ky8#*|F5}US1vSV7Z->Y|pa21qi zfAKxd3C^Nj%wWAG{E{n(h-(*xaAL#dXgR4`+F&>xCt&4X-iI zotZ=$d9E}{a;nHU1YA~rJt<_5%ms+VOm)OOk3aPMiK=P~A@OXL_-^KeO+-8Fd)t1G zqtQY$5L8)yMu zGdeFsgQ?oKh1yVILm7JyM|+nGRFlpYZ9+bM9MQ+VQOK)G%=^Wo9d$bPq~?A<_6^Q_ zZ1XDgEh5f0dD!3o?GwrxsDGOpc;AXKJxsJ2C&vtz3$ycA%!} z>o+=uThg$5j*03%k7TG1OWk*Yh^p}37XwEdK{|{1PT!U$=*+3YnBvsgexGpwIG*Gh z973zNcdIQSuO8uzXZ)&3m`$3VnLL>XZ>-kMGx-|p(ZC?pxs=`W&xCnPG%KL0oX-Cn zBMc2i1x4gelnI}+3s2cJ; z+8hwgD##CmwcL{OG%en|tAeX^e4@vBtXCV>NE}fL>=+2^a>bs{RlMVA#%(u0K4%`; zOH0$Pz~4kJd16jo1<7emXa3h5@{{qko^1hB??3todR31^smcpXqF^L2+I7MnKvk!j z1q>b|-fiSMr-^9{&Rg92PB;9_IZ@WP7d!L1usL5&`R0?eA(@O}QhF_M>sgeG;10=X zADLp)I7n=kt)vU;-C|svCYv1iZkyjXcoS+rr9dIxI|Bh6VLWXby7jjHFS&%$%(SfF zhgP)ci+%InBf<8q4u~oDCNpDCtlYg`DnTl0sTX+o$W5YN%3fsPcExyHx9u%?TxM+} zFnYaIkT}-wSL0cI)Ep}jF@zXfI}N~AAu6_VHX1QCzUWy|OuW=xN!(X;U^Vt?X?)M(SLX>!GXmerT!p52jIfU99G9Ey z6iY-P-`)9U4Lxr@slnye+&D7hV1Y1)^U4iuhA8^sw$2>aT?zj&kf~-|MmQ%MB0+x>g1oL zEPX8EtP>;=!M5pcfz;#r&y-FvCcHjdZn9^x7twufb zmATa7^Tr*n!O+@LLmi5M@0H4v0n8B74TsYcXJhpEpV4czF-O`B%gI8%3RcbDTa`Co558dSc&;-w!|=r0^SoVTP5{Nvo2gRq&^P1dl^Ut z7vb6qBD=4?t`mWICb=O@vEPc#Ud@{OeLZx!k!i2Bc|>8JK&bCwTjP)cI~n}d>#k?% z`%7a#cr{=*utL7Kl76`%pMg4Vn%`AaeW%o|bc*Ss-M=L}&`LXs@X4Cc+jaf4YD8(w z6i29=l~YAF{S}EOyF&hER1?9oi%asV?ct&<_ZkR&TZgN+jt_#@f~3QAaD8|NX1^sz zNZQ{oK21h@-riGhD>0P@qs;k3G|+~KOUTKY((0=5g40c_&uxuA%oFRbwGI*53H@Jq zvELOyhXPdTAUmAGguK?+7&h_@f;p<#xB9<#`oivnbZL9FGZS^l7qI66J=d4NkLA~n zdn!&Jv4d>*A{zgn%ZGhZ^<2uj)kd;YGQo)2=R&i{V1vnXWI zh$ojkYP+B73EuqD`Eikodia>tqm=}Mc186YBjDfJh79M)bYA0oP#4A*wxvJ}0?H%# zt>zUmqzad{5+?a})Ya(9kmBtlxOCPP&bBd0kXVP)z`R~UlP2BCHG9MSyNfo(Nq->0Fb9_&{SbqDI1r5I}kx^$z!8ED311T}i5$lYzUzx&LHU+F0>fDO^l z_qw>y`e&O2-&lCI{M%Ol)2O(nr;!UNIEXaw@KG6PpYs2M`2%>%7jt{559x2@E;-XA zpVj$!#AWd!%Az;O^gxKKuX(@{IY_k~s~T_t5=?w20q843li`?JY@ahc0#CS1?9P7y%>O+d20sf<++Kieb&pPlQ)WQTRRB&c?{eRk;`t43U0{w0>kl`zCtXEg z%qc7R_hKUo0X@&*Mi_HlYgPy8@g#)mKIcU!edS%2WJ_+xR1>tkSbof8sei=}GAu2*LdO>(5$ax#)gZxv%WIcwNEei7bSr}~rR=!o}OnhjG^is6b7GGsxM}lU07qT^7T4EK#6!?#QeacL{ z&k-)hA>LNB!}I4J=5UtU?b@GuExN)$p>g3xyKdBCSGv>*4Ees`htsQ^{$H^TA&S1a zwYR$GjmJrAk4Z4*sQJFW5|A{A%fMmnQM%vCyxjo2?cjId9}E4QIJ1`d?RM5R5DlV7 zc6it$&~kOdt4JqhaU0TIwvW}KAmgWgQCSS$4i)wrbWa*dnoJz+Z}8v}LY4j;~+abxZW>9qU9=&PxIR)hO}aKFO|Y{al0iGfVVwUkws=yq1wca<0iR zV&?z$%imUIVf6@ssUnvQ+H@AVANc+I?-CC3pIK+58K-esb0On7Y4gt{P~%Og68&PK zBEWp8q!bS`g*ecAYA~LNI{_iQZsUo_gbP13wzGE;A!4~Z<=nQ6aJR}cY(pKeMPEbQ z=^5W@Hk33Yj1qQ{w&0%l$6?VRk}k3^iCwNIssnngBi^$GSlkJLp<5cgSWy?EGk$V_ zU|d$9;rA6n!70vAE25vftEO}SUthbQ<@*p^(#5?EZJF_SI}$hW>^~F{ zEFe5oE}-wPf4lXO`Q5_ru4421*dx$F56{ejc4qN7o5d74rKRF1n)?^@)*h<_dQ7X? zatn;U0CzX^MlZNCo`jY4HMICLMGwi=+{thWpNvPqKP4tm}51%Mj>Y zMwyh{1D@iy zA!+UR)vnNj6?=)GaxJA&z9n-6K%q+a`KtP78v`(V%^eARe-9c zh!g7tiN3h`-%lQb#2Eq;r`ldleWy0rps}{H{%0Qi-mE&>U0i14I?$dlRb=PBs^~qs z{ngxq{%wf{KLQu1;~YkqyoQ13-e!c9G}JrS-(ZhLK)rJyo|XiQ2SrkkPxHr3>RU2C zH$=`kefduxEe01jhLbs&FYlgF1EZeER2o+DoonR|CGT5%5h}F-8*F)B(Lo$0sJVgY zEVnA=7{*Cp0u?$6j@?7&6+zKBdsfV!rK^~ezlc~Mn{li3J1g7(LUuBD*U!F$bt)7F zyr@74NtPVaRlSgS->>~xh2i&exDdWlJFfj+zvb@BcOk}nofN{n*oX@1X7_?Cp8Z-a z>Ng48%xGK$%k9`>#elW(SX4sU_fl6#5h|r@NCxlARcSbowo7J%zsY(-obUE0Ov!VS zB{WCIWDKGFyTmv}pJVat9ougBCZEepekF*R`X1U*#Am&;7OS!Do^2J=>Dp(b^yR}0 z2ZJuDk{L5$bkgT9Zn%)EqzHlu8B9o7K)CN31c0gWksDjw(}_Cz%7>v>i#Gh6LX@zL z9j$JkX6g)6=eCA(M>vm)c4yUHTPv4Hv_g-O*=p`=eOlgh;eA(hTx03)3I9XBGg{h4 zO+$R-2)Iy_PuJ$jkNuWyo+8Q(p2nC_|8Y=hED2F!mJoLIh)+r6S3emb|< z9*HK=j;Y%j;>q7?-bTv}%LVUu>qYItr0 z{;1z(DY^XaN#U~mCZ-}PUwPWMD7vFka#Q|>3k7ragx!-6l3HJ)*<_Wx?iU02n_D*# zLM$J`yUVWcv?{sUw@O{3jQZBqM|alONd55rE!$ixiq&wpNO!OIH~i~y5`3Qn1jMmA z6;;#)UvZeXmSoFg)f&7Y-#+Y8Dz%{1$###6vaIP>0*VX!FC1P3A9%_gCFQ=R5auhf zS{)KNdUZYe!u>L`cYbCCtnikrtuG_rsqd zjtupv6Xd?mL30n_TyC6>k=5x%6m7qQdXL;MiVtgKeWfN|5VQI!+U`8>k{(1N1}k(NVnx4%Lt0$PyxPG%a4=E zc>gjT9cr*`i0RuDv!66S9I8)=fq*A;^jSE>+Rmp^S2=5+J5%w z0dsUrGDBKncfKgH?lxQcJ=rl*RAKKN_{Uyb;@HM8e2pSdFOTY832^%kqT5(Z}n5v_yNsemt^^1*tJz9US#fN?oloAoiD$L$#E z#mU#g_*$O@37PZPafmd6lf#y81WEt}GH)=ld-8zYGyw7E>%i za%%KyxL<$38^iu1qiyA#H2+N8P|u~MwHo%|(HM@w7g4YQ+7*xXNTX04_$DX)UV|I8 zlPYk#(ui0U!8SU+IYe>w`FPeyi!K)dy9KiI1I!W7y+#Dog%dRW9|6TapeP`RcMlr$ z{;5;bIIWx6yH^+wA+r55DT`h1!(MPRVg}Ix5!y}h+F@uh{l}Zjlz2`CBe7$u!S@?UoexYUJF_#`U5KcH_2c`12rBE z!RI`p<<$%Sl`1qM{1#V~Om$TDfq;N;&_mS$-Ips2q(oJC2P$?gyDJ^BB z2I%$We>)WbQGz4cugkYDsehWpNGA)xEqaA*_0M&}vCsC`r_-E364J^e>f?>Jv1M<(zzvBHf?riFB z3WizhlTNVqp$_Z`J|(y<35An`F1JwvwqGdNSIZd~Wgh$veQiq#JSME)p*0di<3^0= zD>a>l8zv%H|8dMG=-~#4M&K0xv`<~|6KnAMCrsBn5I6|0bwQwQj=`&GiMJBWlIxve z(GcF09YMWrESEBYvWT2`TajJqkTxcLN>$*N$d>h;{VirLopYDK-YUr}2y*XBZB35t6u|@3>-gxy8w^ zT8@_emjulbb=q^TMgJEAj;_NwBMELL#?FW9yq&M%xDg9QHykP}d|K zgQf-6B-(u;5#+c>-u0l4&7d}!!xZb=^2_vWb@aCI)IHkq_6xw!$Rg&JsQ0cxjbDLv-ZszVQ7<)9 z!TU(`bkMbb-19frs6F_6CUZBUq)t6W!>>}m)+gNah&psbpbLa&ZFHVzy}x*ydreNQ zO|$3;f^#?xa7`7iu(RIRx z@6IlfiF@(cf_HfnT*(x-6|}vNt>B2zo5aVgVojZ{jL2H14!_8#Z&8@$Hb3N%=E&c= zRE09C0~aroeQRB+>BCbhXqzJlR-cuxgFq}kt?Mi&?^kV_BdPDcy^-FZ*<&?oM4C^dmkv}xNsfM7;V)*%{2Y97b=dt;IkN|!X#8C`}bn+ zm?}$5*72~gm$^=DgVX}mT=8E=syJHmATxVqPkf6Y1!)Wh$%VH5mNH~FOty&Rd>p^5 za(?;@Wzqm_OAhu%)2*&0k=sV={GR&-e+NDLwAhI>y=QC_US0Ywk|Zy0jVyXv^ZuGHd$HD~&{HdGQJ zWw}A^=Xz&*22T`WXoJEAe-)Fi*P9J(+S3g-}>ZkC=@ZDP%1#XfI2o5%2+ zw_;TX@U`5zE#sPcBy-W0^<*jnO4X~GMykZv6k9ZjXz2!C*K?VBdI?YMJ7jU`&af(T zVe)7kzeK>eE3Q4995ax4e5-@iDlA2yb*7I#tRcCm{_m$ z{-c(9Mv?2B7V~C#)#}2$5p8p`CR}~(tgf7zOJ|0W6~$v)h?eE-f~L&Y$W;DLOas}& z_kH9@YNaOq_M$|)B{i`D46WCCX_8Pv&ycf%_o|ci4MmWGOQOS7DnueQa5`b?bI?DQ z>XoIMFkGv6pAxUU7LYvVXNXhJKRV~#Vj!?m54=mN))Ucu5+d2i(TMsoWxQ!JghO(# zqqCFf#iwK*rk-Bg*YvC(#5F0-W$D#B$TbnDS$x^KLR??-0YW|n-&t`(;yfw%xG3nA zq<}qjP5Y`kF{3@QWlO3!qV80QtkM*FtJu`2n6BwyHCVK33r|Zy3*BkhBQjgXUOd*C zYylHp^~R{U7*>uTfBc2_s<>j4+d@SEF*_G>>ifDPqU9HYX<45#8i>>Z`!l*KKdSv5 zmG}2+-o*1W$?&1RcznBb3D3YmwQQ}C*>H~@5h0x%_{Av8plwT0e-sQPvH=9{Cn~RP zh!OKzN!QTC8PagdoV!4(IH#o1TATe@yN=j9fZ3LcV~QaaxoMjSCqK3^q<*(`NmrC= zlD>m=zeZ%i4j9{L5A?~!A^)3I?UNK??f?B)RM^*B5;OD$i1q{)GrgVA$8>`Of=H8nkQ6qV=4`gSeq$wmrxtKL`dW4qKoy^T)H z6Mv0zm&rYqWmZPLntM(JP6+{?%n|hE2)0P+wU)!}sZ1rw04|_!BISNR3Wlq00Kaw{ zSmS0{AbTlUf}c0lDeq>URGnKZNfornM*@epRJj+lM|q3B$Hv<_Gqk17jm-b=Y*NsC zKOq)f(Z<(C8SIjW)Wx@wdDTN!KEK)3AXIJT3swn%7R}e=O1tuTjQ$>BupX2?8SwEE zrSBkL-B9)Xhf>^v+CMa%AKO=Qqe>N6{>bLBN@whhRyS=&u5Gk^CWwJ z6FV|RHe&EPIK8<=S)IK71JY)v?oJyTUy(IsdcSxL(Ni4@p{-PzW?BN zmm6U-`3)A%knEo)`O7O3abst@NmmXlaH|D&j`R3RE(l{yzm5rMf!Yh-{na$26s@OT z!_KpnJlLspR)$55`C$Kjf7@+Myz8aDSK30TJ40!oFU3RYZqtn`pZfB(^pmcst=@v2 z?eC1m>ficGJBTz1^P=**!?K7WmbTD8)893ahsA1xeq>&~XV;RH^KEcz**^&uRp>aS&p=g< zGS6wIDb0@j^$Yc#FmXNbjp(usvjB}?^#2Y`13(6ZV&iq+JfHF#G32rA+K3@LcOZ(WkX!cryV& zLKi^1tp-X@N73AG3jp!%>&1pU3}c{+A~`ersSS+sL#hrj82MybWF=%nReYj65TfFf&%Ht5r2tYCb%K3kBrpNleLMm|3 z^J_z@aM$+ida9Sc1XS3K>~pIx)NJ99>{Mg?15-r!T3Kh4PU<@L)tym z?}JNG&(@W9V@i|bs2X(r8GY~u_u%L{!E@HegXE3IfFHZp7pVz+CPq)FK)VZNu8)=h z7Gz&wqQ~#@nboS?i6($pZf>puC!fUUFpZXQQ7(#`zab9%q%qQhKnt@4?UZTyXdo{w z3eg&sHErZ|o;A_z8IBU`?78)yB!LSu29dDkhjCohU_?L2O4 zBue5ZZQB8TwnPbMuKIV*-+O|LaaFcukIS!l$6;fnna#SN6*tA_`6kawR73jnb938F zv4}-Xx~C2>?<{p#u8TYa;d|_>4g((7Yz`A+-|EL4@j!`RmudV{?v7m3LnEQb3TXmW z-*ht81(fefq5Iz$oDDtly9NRUEnCV^>b&XBkbj6sc*^gWM&$7fbmU!b?dMNAff=R4 z#-D4Qjh&yAp9NLo)Kf`R{|gpDfC<6sw>Q*V%MI}ReBU1O-8G!Bf5+YEO{x`Ymi#bO zz++oz#}|3d_0xL#$K=3W8#INEUFD3UDG#7(W~f4y4H4=&r&2_4+e48!ir({`gkru7 zo7sr(+A&%#jk06DD{gY9&f4KOBbW#e4j!^?7LIpxsNXiphgrGc&~ed^QPw><`s4vG zezSn%tEb-GmPpD~-4;oQx+M{&j)7d0?F7R z>;n(B8mph;xz$D_Ps4nxXWE611eU>p0Mn z_yxvX9>}~{NK;z^-e59^Xj7 z>u=#5Bg25G-QHO5jI1-^e5pv^_0FC&@mwL*FN{M!MeTei5_ya|eVKw{=*Rv zSwak-k){haza&PXb!#socIc7%V z%g=++ZM)kRVc4@0K@EjBF{PaGl;frH*7IxF35jH>Bb*&-+)-W~=gbqYV;yZTSv7^3 z7Vg%T#7X?^I}lX&%m&N1|74VDmj=7-)VZ}$Q=_>#e7l5z@N3=6u*lpV-f3oP zWFTtQ_n2V9H>oR_Eo3A9*xz{#)V=P}h~N_6wZFcxo(Z+l%G*O;UDjpi&ar1=7xYg3 z##x9AAXe^@F?`QyzJF2~v(KAg=~>I4_P0Am--w8Qozm|*NBoA|y!{IG?Ha`22!P#u zG(z^d{lO^ln?|ubJx-a-@lHA;w|KtC7q;EQVdQ#@kK?M<-`cQ(M1M`!2T$+!&(Em7 z`L^}uW^Y;dDb7C+#+k|S_dQSjY~X`TVqcMTIxBl^WDg19E&8%+Ys{{gUe^$#CWp)< z^uDU(Y$o|((eFUdMKeoOiC~{i!DF~LPm!~Yj3)aC%(t=5G&~zlK5;*s@{rDJ9qb~K zds=u$`iQl}zFPRU%f*Mjv+=%b#B9v+#2lf+SwC?9!+Y=*E>9-O`_jnvA*>yMH|`(K zyJ{^<#gc4!lL@Vy@jxVAwm$(mZSIxnfZXGYA*^|+Zl1jekM|!}J(Hd6C9ULUD!c8N z?D+S&{uwxopPy6dTmMHSi$9v*$x;g)O%JxWC4#;aL4ay&>^}YRcsv<@(|dZ-0N37a z%?=H}4z=r+e(w65Ir4UG)m&khyrt){1apf^UD1ADKkwU)^LRfaO7thxVlEB*{tVxA zlF7Fbx_oD-@o0_)L@>WJ3pD{~aMMFZG+bOs<3SkI5j)m9yU3@5@wC(F^PKlTXKW-| zauA-a4uzY=fVvWd+9OzM;092{-?p**-zUpz^`v8;p@*~aZ3{8zO(h52jQDEHV-Y=y z+ldNFaoLY!RVoqb-r;O<*_9`S4>(B+1g&phV7kF3hkX+)((!GMyA)hNi{>HB#{He2 z++Ax+bea>bjbIXMzYV`NbHT+)fkn30-9c%=+sYh%SJD|xs_6{MBZI|c)g#5F|MW^% z+@h(R;QPRd$RVyhbI7;sJItfClmGjgzs@N{hdL<7&2dd@qx85T8MpGQx!0S zruAeDd(j3x&ctC19dX9{G zk|x=wZPeSkgOUghm-H_bf_hh{S3-VEn{{m;MguL*WQFKi(){)sEObUkcNZv93*~E^)z{-w;+_h0l2&nw|n$NN|%F!jFxXYpHK5pZ9F3kAnJQZU?D zUJwTZnljYs`2&^3xcvMKpm@3vgha;ocGd3OuR_bqDHZL?RX(@DNDuF9!Lba~^#gEB zhtl2PSRSk%J%T$~<9hynf*L;lFBq+zI*6nMn!XNzmIqGbtW_T>=j^zbMJF317M9gg z>!NkD@@nDT=Rd$`2l6fvnwGf2vB)rz2}kBZl^oGcA-*48Q_>+P`uk&mey`NASC5eT ze}ch2rW#1jO!2vFuJ#qij*PYy?lM!P&|);*9Cq70ZU|5JNTWI>=lKr>XpeATF0{1GbG_CZb{}(P=FT(# zHJ$N=D+{T;e|hYHcd;Ifs#LLtl4^{r$Webro5 z0`}Z%%BjLPl46kKCM`GCHBx3gBL+I*+n+!0tK3Dqu@|TBdsO74bG?}29F=8+omJLoXk)*@y#y2+3 zPW>Uw5aeJuHBCj6yNYvvrtwA|t?Rd}oSTz3lZI ze(PurSzMRyITym)$CMYG$osp3_rBA6bewEdQC2YW{R2}w#<0kNi;wvOU~Sfr`{0%z z?(b|WUz1_5Wnu7r|6}gwa6~L+C_PJf?ACQSVSAVs?>(Vt6e+SFc1H_ww*nh^gUkM?`LcTdi8a62)8_=0*kj&kTmnl7;{_FX2xo5 zj9Kr{Uuv$vQjd9kI`Bv{hXockaUl|PG}7rgGPYO)=CK(P11ga;N1v+PURiqj}%r&2DIC+;Z+^A@w0f3A9w2hc5A~cV2e} z>U8LYZ=0OAcL@w*oaD%d#lGXOsLumDb$xr15o@o8K24~>t1OlL-4($ir1VI8S|2QJ z^H%LfG%qI(wK9HfTm3Nx|*{xz{Nf z)a3V;Qqn#(Uk1$XgQ|;+HF0~RrxL_uC9C2g+CAAx*DY3cmv7cJ? zT6KZHOA!4^ZppV_wAX4v-906(M``hk+C@z;jor>1JgeS(GB$!;;>-bgJJ&&Z|Ix<^ zen&BQwN;_>E9tGA$66PlU}(-1EcuPO09fOb9PB!~e; zB1^U~Oxv@Z;m@BDZ=|;)>v3NbUbJ}zC^PqcU)ZE;m_i@-wljH(cMZ6qHC-rWA_c4W z8(bKIG~It02JaMD&=U;jHoZI2b@(Rb6i9Yd{(hmE+d5mw5nO`ITe$aXD;uDC^f4Rx zqxPB{lr%59zPtuQJC{m+hqiK?jY91%5yNq8qaCA12 zTu#GdDEMo+PR_5dUK*fU#jg`Ir3h<-vOEjG#Mw(e01Z`PK%(bU}D%ek7 zcR)rtbXw}3y>C??Z;?c|?erJ&;bcCB_lrLEV1O{)FDy*?-3-_8$Y(*x-JZb8#xCx34n9aYYWuXeZ) z^^PjUH%jo0NI>vxUn8R!E`8EBbr!Uprq*8WSMr0bF#|7NTr2ETH!B_U5+#)k-E-fMtm6vWsf+ zEY-TI>eYRxpGhV9U z-B#_)V!+b)e)WxhVJXy3u^+?u_w;=csZ-GqMJ5udggb-=shoNU2j5n$0r1PpYLZ+; ztP01e)`w%ovv4ULw;x&JJGbJK^vfn4K)Wj%>SziYzz7&XxNw+WEw$o*#(pSE^L1TPW9E>On5+C}oC@zgHDI1gg z6osi&Ma-W&hgV*Ug-QnDcZp{+(%fs?FGnfV9TBavwa#Ag#PQcjaeIV@6hiB}A?E5& z!7PU^)34vC1TRA5?Pf03_tmA-NHB%9f%mJh%#=S_$2v7Yw4VP3mZXRdq46Ei@MUTS z)%*59C!jQp!fIaRpQMpYzmUFYxSU)aWM4mc&x8ct`)>w|C=h`y$ zOO{PxrZdK(Sv|D(xNi&1D+D>hoHM~3OUe5LLlf9R%jUZGe=k928jCcF&-&KxKUcV> zW|7}ld|xv(MIkX#BhK8Gp~M}SRaRpY=dYkg?8j=b$OJKUPT=t@1SlqjgX@>+x5f}# zo5EKhX!;Q8Yx;~Hb>1&zD^#_6$1^}myZ_(449wWPmy1U7?xx}1qD?8FvPp`t!C))B zxLLVQt#2CMu#oJY7e*&DTsUdGI`K+vYcUe?t$w8$PdjC$1$l8t6<*DhFZAu zKG0Swl{4*jCJO+&V=+4QQ0zWNCy)1=4W-6Btk~z7e67CH9;C8Ri|UMc$pt9bj(o|P zhsP_BWnOmdBOXydmRrR;hBh%FnVny#qVM8;!cON|zOuo$OsonS9Z=%iQ|x+h_M-Z* z4wHf6P#nUtE=bWhYayb2F+eqn(vYy=U9JcCV}35m13Umm&4`4pzlkD26568*GrBv z#y#J98+w~d3@DK~h0{+;zjG|&lTr^Z{rR_vzoAq-X5_NDX1RIAzJG+WBc{;cxP(m) z|0M}luqH?UU7L9r&47s-zZ=@Nmfj z;Leb)+5Ijt@4?Uw1#y-*aeTx!7`ayv?|V+sr!Jw|x27OkOjND& zAMZ!P1HLogu~&JQMC*yiiU0T8cK3{f>O3TPXp+hzW6d-rq=INct>m@b#1C>@yei0ip?UH7B zPg{EJJXT$wsKsurFsPF3>xnKId zVw}y?YZB7GOTOIKjR?zZWvOQ@U22*K0=0l9nBD|h<}!LF>eQzoJ0l*_5RM}HA5y=a z(%9VKkJPT`(2OU;b8d+0QsVwQgYIMMu&&|6Vd(4P*yL$n?;20Osm^w)yv!WyweEY2 zhLd|a`@sY>IVUc##IgeSa!0-PYkbh6wp^i!AfH@qLiCk_>9$yCH=^7qfZk< zoONn-y(loqpb^W#zK1 zvuG%P+*sncK?M9oN;=GKt=_B>s4o6#b^GeWAa z5fbShsmi6RQp39|)SQt4B!$@5y}o^K`}KrrJwFR;$WdbU%kT01^ff)Y_Ykh!CR+Fb zNAY|ka3QAbaUi#CxsoBQyG>H-`JH_+_TcfnzDGi?J5R{+ppli+0+9LcH1b#+JE;pG%39AahbsJuQ4Ez;CaQpAsy)ICDU^A-u6%+ zaT7-!CLP@8Psbn_x@Qu71LY2O<&2c{cz@uK?x8&Zw31x%Yojo4VRAOy(yuZ&uB&7j zLRTZ}k$Jb(0@Fe>>23P@^cv?{6tQb356u|tC|1~nFJW0SZR(iKU&J%?g3Sv>H5gyb zx@#XfeZEWG{wFfn+H|bp#4qcy9NT*2WdJlDRztqB(h`LFn_ik1+0q+F?Pzk4bDHDg z1LxCJd*{fcc1sAzGxLB`ISmNnJCa_c0v;6;7~LjE+W|nmD5GSa?nQL3g9JR*J-vrM z(tu`f8l_vMd6I1�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 %CWCwPaFCZJ*9>mws8OXj!f$niI7da8 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

    >Dc&+rClZ!iW`#5`R6K^Sg*8lLR+H!n{@w zklPdOr$eF9UX?Bfjt$TE_f}3dn%e^Qc!EM7p}cvi)RT84#`@oH5xQ4pZla)?f~o>~ zt;#S-mrr;C&%T|rHTQH0i(n`FcZ=Mjv}(Y?pMo zUveU^T6lO#NuC`7YG0R#SlZZ>YbMhC9%50KHgCbw+xjSqxI{A?K^e9bQf_H~CmWD!>Q0OdIZ#L)4eT?D|1^KkR^fD8 z%V_03lkf#oTypm$Sy>=7na@3U`1>a|b7sd|(Czs_ZI7-tc|RRJjT38|ZJ33Db=!I? z>CZQ2g7`k>Hrib6=JLungVJ(n3GTs^R`)ABNzv(V(GSox{y2?OO}86AbDtYmmn)ti zWi8Ahqwe(~ zxj->s2y!_@>X+P}-fg-CbBX>1X8H`Nc&Bg8LsGOq_pE$VL6EXRitc4nUZbrQw1>q> z*nAM3Rjf|hQ^EwH_0P#KJH=FB0YVp@V=xUeN}I@SU_|6oJ!9JF{{IMUsC&CD909gei!)e+svhqoT6mMwS3w{T&$6<;%f^yJ!<^Bui1}wp1wsa z#}Empr_Y!Yi@h?w-c>^(QkT&c`#Nf1yY)^80QZ{E`emCBkvYtg^osYR6KVAE>&3yi zY12}hFC(-jYc-M%=SG4a2r!GL48X4NE&xwC{2b4iw{OgA!P6i(d#J#86|H^6T!X^63sW%3TNr&1ciZifq20i2Oet&KUVa(&t;L+rz z)Ni-4w$C!p;xoDKbMZFy?t@t>iPD1A zqHYs0W8>M3d-1bpx+xh8LoMf%_H*S#(tRYZ)CNtom?Y8KMRl?dvr8xIh=lkrUIR_j zo$h>Xr6$|mi+u2?ojK1G7r86M0Mib6n57 z07N|m3M}$|@aq31iLbLTSJ4+{xW`$2puE@~(!rj>WUu3x5E?H1j8JY$%f_knKK1XZ z#6P|d>0n<0>5lo23gB736{DzlA1~JMs{%x~tEV3!!3B-o$C8ySpWN=)`kQ4o`^+wW ztcQr65MsY$FcuP;3iD&!@>BUPzfJvXNxZA(OI%l0SlevQ`cPOj;;d?tNo)!pqF z<8;?gYke5YkAyFCsEq2~O>y-;sBtWvLth;&i&nm;0r$J~P2h?Cj^U#6Fw5(k$`E@c zhMF$@*lX!;ngIqfdMEpc2J%{gGE>K|iD+pvhkOq$#+@mln}t$gx46^(xRPsMMy{qu z;dg;w-%TOjdhmK`TyY1i3^LNfQK*AmuLhbeXVEe2mE_uK0?~b(dmP03IrlwM$}JKE zrk?68y!D=1Lq7{Spi-!_DuXyQEYco(?vZ<#I6FFdl7(KURP^4djSu*E#nmw?fg|CW zn^0)DTvNgA>zLiW@2HpE&Qb1I);qv!6i3^=)CB7a8=;5X_j!;6yZW&}Z|$J^6zfbf zQoYkoF;KUqUTW+5Xcf(S@R|bmxPvWW^)eU{qCIn8)`Q_6!@OWC(Np#C^l+5-gjY=L zphxTdh3u+IlfScSQPt>fi5G26#k^N=#Ts7Rlg8;=O0Dmvb!~Hvwj2SgxZLA8>M>ly z7SS~ke^+|y_oYZFjR9rw+MAdCsTwnsDt$uN^z9tREAwQFicW`8dgub~_s*85P?XG> zSdewOKOL>2>+X?Pt}WluL>IRuR8)7R>zUIp>l{NU>m* zHF!vT0H#6Rbxy__S_*Fw<_YZihTQ0e@=RcFus`% z=ael0cA6I_>*Ng5cz@I`%Oo*o2-YkUGJ?1oY<5`7OKUkCMGtCu3x8w zHvUT!vCUrp9`m<-d)fYg-!*VA_&9g;Wdc=?@F?PJqBjiHvTDLaR|;?<@dZXGwq6t* zm{9hduU0+o#QPMpj%-DtbPB)8-V7OzZM-;dLj1Ztyo|B~QP1vaBEw~KuS2AWJLaij#F zWoh;GFCp`)q}b7(>+HhFT*Zkm1z}$76l<+M4ga^apxUQWI!73$g%RJ+laq-jXxCcp zhR^e-Lw~U_H}l@wjV@Fd@qG;5%fz!D-TJPTtnj)RMb84LY#}e}kUTNo)Nd?8icEOV zIvT{6_tg{xnX!9k8s19W?-t`@Gaof7x#yTXLc>FDu!{|GLKly&;?6+F(b};aW81%e zGQo5O<9fNC+1imqxhu)Iohz$Iq;WnDZ3i!g`fsg1k$4FQ)FJEqTN%#hE$6w=)Tc9r zdMVc*b28729*kHAM5MEUsd$z1cZZQT5-O8$Hq={IOeF$EeQL*ie^ceZ68age`wZ<# zG)xgUEtCm1_sQCx2GY@?{3#1hXD*ejSRr>ikil9^6gliUf(zH}p3IYuS8ILr(!MK9 zUl+y{QL;DvvDsL2Zx;c)5X|oP6zM_Y(V{KsX^!@lsnw`gpR{7x;y$!`gy2j55~ERd zwPd|T)(bk*wOxlVtdlYnEkPOcELDn7QXCRd57*#T>-}zLZb2IS;4d0!Opa z-DIM(N%S5$OpjaoH)H&t$PKV5T0lLQQsk2}2HbmeOUT8z|9#C@?gKyyijf&Nm*jfjfqar%jn&d$$ntf;D)_`+Kn- zc?7Gm2Nf!|d|u%F7YN^!X<|L+w~rd@)`b{z6eG#*tXHsyu~LJ;!JjJlJ~BgcT>7*G`4K{TfIS&ey~8)O4r#lWN|m5 zZ#&8;aiy$F3L)jef zLwA`b4a|I=%FH9p)ZbEP-~3#@3X90$ZI zT-R-xiuEl*b^>tP{4Z|^v+HJ2Nq|>LV%j)(6`-Jg3@OVDzGt4jBQFHfzh>F3s74hQ z`n8U@H;2-b;1CQE!v;}M*HV#pryT)E&usc0R$x-l1V@`45Ms}J)ddrJf_BLMe`ms^Qsl^ z>?t&WjqF{3?PnJe72(}`HZ7mglSYuC4)A&_y}6zuUFZ?{^wx844zJa*;VYKGon*1A z-IKB(6^Q0F)5J5WEP0c<;HbV!37*$de4dHsO%{d-%Q{68a^761!TzS{Ci&S+x=*Mc zZ7vJJ$f#_-fV21M%W>v18JYrx(_Pbn8-yxBvW@?K8_8kHv4RRDJ0r%siUAEtqlxp~ zTEzR?yu1Q=bQ|#*h1FaaYxvD_k=<-V1E|7FJ|{cHoxa7Nqw;<9V%?KKu-6TOS|oiT z^%!4W3bW4`+?I4aS08`*v-7_dBC!yv;QOG;0mGXTy6V_ek;;d$0 zCYja7+?^g~(cW8k%=n4N*kk=N$KGSne**-Q$-ATscjUf_4kZ8?h0oeUtb|`*PdxL_ zF(UsGQTCoB?pONAOTih>AJ_VYBMHIbS%=jH^a7hFDU1fe@Aq}ph8;!Tqy5OwycKY) zk#SfU`lnbk$2@tL3_8~(kuO{Hk~2GpXY?U34E|-ECka#x>r5~@>-Xj7Hf~SAW-^0o zWh+g*)*3m;yJjRf%!mIN{ZHvgs><^pS`OAE1ni<}SSa{3UyET1B(?Kvk6yx?l)r@UO178FXw=g4}gN8DP` z5k@82W)Q2pg=`;FYqH6jX+<@#V_<^O(Rs9YXPKMn`;B8-Ey_Us!`d%l9U%2dLR*!@ zS^exzpn`HCaFx%`2|_q*5^50o?p)QIO|$)q)REtHpKpvJ6?%a?Ti(L;=NzXmGd=R4 zKX;oTxGNq5v69Qz&s~omF!RJXyXr^2&%r%qR7tvWeU$ohm9&l3m($#auym5@k#GM@ zexA7F*z@aB(0@uAg2kK_V(gmp|I^@I=FfW$?fW$gjNC2HxC4%@hms7e2=O2ae1@jF zJfEZLPF5P&2G2q5W7%Neb)hrt86s-Sw^72k6BIyEGheMIy3%>7 z?JlG3YXS|9#4|F~1+6y+NO?w<>?ZF@uLzKLn>>2yX$wyT&o0<(JeSdCf>odDj}Kt7 zJ6#j}$8~X+e?UHUaIysY@5aORGsEF;m&ZGnN#mlL>G47;V>I%&t0bi=VrDtWpEYmQ9w`Zm8^6KFbjVBoWJGmN^&|E3E!P$ zNAY{de_GZ_ip{Z4Y^Q@C;(6=;r-^)hCL+@pgr- z{>dVl1|FWT=DA8?Vis-Yh8k?T*FWLYBaE6!5xJs&ZmD|s77a|b5#Hr~wA#e{icq2o z+xt07jo9vvv{dk}VcA~$*=90|KrIi)-Kr6h0PYp6$%S@-{~n9A8^`&)uOz7}h-!af z3ye%6T)XWLWtBOSAPZxZFl@Z9Q1WCMKsHOX*p6$?PK6Mq%bZE~Rof&4zK_B5xt>Sq zH8Oz!kU5hfq)Z!*_N+*G4ew3YNcEiA^Rhe+lhY^f?kHmGd!_Tem_)J!0i5vRjx+bv zNeAn6==8YQvwJ)kc{HV)PF&essHxkJhOI5bX-S`5Z@{DJQb|1PS*lHkj9Jx|_WLAG z5)Erm@QqjzxR>oNX+W&F8FYaHe@1tW_vo2zuLH^Y500cSBqOPnmF8W|`z!`}Ma%a{ zxmw@Yot`1;NAh0=UL;?CkN44SY^?JwmhIosPT$?%-ueVV{Aph{g&yD%d!hW{fl6oC z?{hwFNu<>vu)c|~-t?1b_O!f4&4~r#nOL|=uJ5(FU;}%E@)Kivo$KOV;6!X9aBU(J z{(3EuP|0s%96Rc@(&-E;mUmrezF|* zzgxw5)dBuq_Km3$&?dI`oPdorDF9&5W?z$wa^)iKeuk-FO#WU$2jyw1}j%on!A#^*H}7rvaOpGDk%RBwKp z4+?#AeITn_v0IxbZqjuK>pK1St~a(u9RY3=gS1C>#PGSjKd~4n>_-4h2V&biZ%q!5 z(oruJiivyqO%0Vyxph``xTrgl8GmV^f^Uwr0}M}-%Qo{{4T8N>=kS8xgKyXN`ig29 zcP(=N%l=!{CaSJ0vgpo8zi#6I!JwyTV)@bJKsG zKH$CBi8fowoMMBiMFwVjQS{6`1VZLY=B(##7$)9D*Ih5pmk{|dNB=P2BNPZ=*#Kq= z2*Jd3Z4&)?)O;OIC#6#y#A{DpJ^x(X%}H*vapu#xTyHl#s`MTSHcs3 z^_gWj(W3N2g#7hW(x?u#@xpHJrBT*I|Gk`gN|(28-}i4rMkYMNiaR6WoliGqgyqe8 zdQMTvozlIr@11tX{I&7h-)XPd-~no%`A^tSXf4UC*JV_#r2jEtrNRwt^t?;I5Q9v7 zb$s93CniT2JbJT`G`T;HfaqEF2q*8FF=60i9K|UU0eNhLp6|xuvr~kPB3BJC)Q)o& z)5d}Do9OVnR^}83ufc4X-`w4LQ^VLUn0Wt{wB@VEhI-mlM006SbZmp4K5XEO;7hWq z4T|ToO9Yd6l3Y-$W*vP2nIXy$&_j89bK8@1B9YR&9wNc;Zjdl)@jVOJOullK%>NS$7hr74C+dd5@WJVU=fSRIBfbjaYdQB@q=|se_qmUpi}9_rSS3#` z_O&85^t#-L$nox0$pAtSllP=-ZMk61c+2!qSoRL|Pkp`#PG95gc*gAh`o;ufsfyEG zx6F~xB3(Shiw9OT!nJL`s#(mrTfhWi%$#bym0$)HX}Uc!rOQe&F5Y`a8*2}LorlWV zViA&1bktWyR=h+`zHs2XGSTv{h2}baW;(Myx~j>1w52*tVVdf$`VTYzQZM zJrRog6%8LZ)PBz_B=$V08uq;RQQUIWT>l0}M*Bd@ck~TsIZ}+mVvFp&$>W|HK1Z`F zlqL2-X)v?9IHjAv-DJ1&0*6XMVzJr%w)L4Tc*dPg1Qzh*wO6`N&jZ!D1nW^DJj?8N zp9zEAjzE}317FftJkjpTu5n{JFQcxf&aX+0HWAscb(WJ@eg35Bq3m__3TEpHZrLW% z&77+ICpSDnEMi%h_xg|`;@FgUfX@#_>s7W)4uK~X-G(wd!jR%^cn^XlP@y~5xw(1v zq=e z4sGxm^0wtT6_C{kAm{RmKz4H*dJsW~b7t#Op)8nrC0m+m-t6&w?_v@ANoR3|?)yHQ zvFr17FE!#$L$xJcoJ@X-jv&i#b`PT-Fwk@Sh%J4a9^D!)*ECrM;BcfR>|W^>U3-UF zS@;cC@*>arwtCu-ewxvofSYHT`P0~{TVUE6%LR@;euCXS(+0TOkd9_enAz=#GUgL* ziShXA37;(_=4${Hx)ziiMmT^3gnpv+HL(OzrTq{7utdmRwf7cl{QIp1yjB%)fa&jN z+|!yLayTC{wMk3%)E4~yIU@VaSV+whw1flm%=g=pKDD?j(Ra-CwdFLR$^l*3vm0(x z#d8Mf$(+w5Q#0`-wWYD*aNZ{eE7ZLRn1bEJkUOiHNj?EPEQjG-z8t%5aT1LCeg*r8 zcbCbPhnQKjMUo(gcizW{8&KBo0G~#c(?a2a+5qI(DuP%y-YD;muGJhubn@3$Xm>vQ zuAKW5i4enX8CkPCtT^h3wpV`2)r`R!g4i|jQg@aVK*fv zkq>b*7rfdLV*3>B-Z-abhyo~S)NDYU%YZ{^?ey}?N{A2^#bka&hwS^EFDg6}{&7MY zgsyzp#!l-qm%}<7mcIEj6p($N4V@zp%3XDEA7u$V-`4_Bp@U$``o8+!v{JJ1WF*t+ z`BP_UTcMa(6s>Tkz##D?oOXgf)AlI#T`zDN7N`S-rXY$$gCZ0pi4UA=_o*71YVx#X z8O+yOEo~5CcW3~h=N!e6ikxGVZ1gf%nF0-PZ2qxaZnm?&`)3;=q15GDs{8d5=Hp)I zfYCFwV^$|en5=D$G-usgefLj>2wR}%XVe%a|0GQG*)^whN+zA z>>cJ&y7p6^pnBe7Kg$Gta?Q$6>QPI5VjA@s4_Yim3KRFB@jZJ zFTZ}P6YYzEMwrP~Q!qUDi&I+jWh(|{ls^IM8L@U`gv666qm*4HvL?gf>aYb^AvzlC zjOTJ3*ODc>{|t1ha|^eUcnI;5iUSnfLl9~KUrTQc?J@l9#gn~;PT3F!YCw}@FR9e2 z!9|q3Wh0y$&bzFnKgJ=V3L6E^-Bsd-xn@>Od#$#-D>HW5mYBWo^3%$xW=RIJpd}i+ zmv3z8WM@R2Bl#Q8^7Uj-nJqjw+JYUld31a5(GL~v?d2#LBd)eGFM+Llz=mtlZITSD zYeN}$FhWnwHyQ+l8G`gO3%U1$_;upkU{&yRw9>C{0rVNC8g+jQ2Hp1#sl&KsNQ>XX z{=eZ`e}McC(5iJjFt~U!j&WSheJWyFzQ#kW-uuN2SK<|7>lN9N2!I4)eZ!XbQvuQ+ z3h&YaU&)o;^AW??95>ND;?eA<2D9q%{lm4d(CeGF#d9t5f_jB%LoI^xS0s5v>Y=RL z!V6zwXsOR<3c-Mk+y2zkAXb`%?cIf2ZfnD6VSt`+VFm!eH;T|oPEQtGtgC{L?MELd zWEG5fhM=-M$DC!}TJEP8LP1I&wM1%~Zw}uxER5wGEUo)TA6&4BrYx=BJdl9HT$v1lcWzLil#fEsYvDJ6DF0N5MJ?@4Y;qSi> zi+|N)ZK$BvK`?49r_WSbtuoCwoDd?=0+GBA`vpeFH%rsIRzKmbsth}FVyb47u~08X zpraw3Y1K#MC&T~{4kP9&{RHJtk6gaD7&Dl=mI8%x4w_*h)EyNZM#~mOLFR}Ctanv7 z2?Wp{&=un*njo{cB6Q8wemg`=?DGU>cQS&Bnlp##nYR^VLU7CPL!_g!j}8FreZ&Z` znpv^Gqd$FG)I7al*UM6i{vH6iVEYi!nBNMPPp}?UMG749yz$vv+I~uCx6^CB*ruPb zAXxHPxaTiN?RU(J><2hI?0QuJ?4TtgQ#Q)Taw?sDyfh57#=*l(3R6w%<;k%GXR^)s& zK{wa8kfd?iB+W-E5Ww)qP6RX2_>aZ{^IEBAtnaAfXwA1ewfT35xI$3a&w0)DbL3S> zB<`MM^zS_tI>-MIR3H<=3~Xo-q}C+fbbG%s*M!;Qu@v!#S6R!gOsbpSqcH?C1~I!G z^PJLmLZdTSocI2H)JF7f8a_{u(HPMErQX%?1R7;mhpjj4*b6ti#Ur(Xym?~ko{dkp z=4O!;i_#6f6_KBXE!?^gmwD}VOOYclKo)mlgwvEDISq-Wg{L$!%?5c)sp9eVyuKUX zl>PcOk_eQPkyPluRH(u?9oH+)fGIZ?#M>=aCSLMt!+MJ#5Nsn!@qDWC~ zv%t(K&1H58@Ph7OF9z)mJOY}$Xx?t~(1db6Om=mU_9E`l&L!mTJu=~M6l-;!QH}J3 zJF^eh;5q|Ds=n)OQA7YmK)SzQR|$2u;b#vW+m}oeI+nN9&BEW}L{pH}>RRFhA?R%h z_?ml;9U5;!+xSRfeplUf^k@l*u3@^>W*<1ik&K1+R~%Ld7MK2HC!`nD5chEwxTXoo zJx{-6%DNY~bq>RDmbZGcw{A{d^3+qjJ3;yYM*Hl})y#iwy=RrvVhp^u_&o1pTpZt@ zBVTcgoF5|nm{IAJckRqqocYfv?+#JFu1wr)ECOr2lnMtao{;APsVtvc`knGA$Px|e z_R;|_SzSUJnthEiRzsU^+ECt!9RGe*afd?ry%OQu+vy+ zk-yq_=KBwS5yKF!@;kL}Y+v=#Ps+Srv3flkBI5Tr27U+p34dh zl<7QQpK$`I=5lq4?U3Z0!M@_E0YT4bV|gi;`Ftie-3*$|@u}gfqC=?G&Ap+!^Id2Y*O)R?u%di6x#dwHD|ON9Rob%Q^3?E>8MT0z0;STArD(H?2tqgW3ftd^+w|Dz~`= z_F#QT8hc&$h(K~r8_WJ-(7v4+Bm>K|U9C^5SWcnzMTphP#pj+Aj3@)@^2`#FMmUDi=X<_elWWrY-LGJau~@hw_r`9Bl$);flRopQNiB6bqi zo(})v4;B@{x>e`njY1;!s^^#~3H`(N)7eXOu+=}K)$vg2RBwohha zK(|9E`7C2E?z2^Htatrec|%c|@4uTRg-6Atzy3*uz6^fCJXXk;JXC(YP&8*Ry~8tH zvPM_=Ej2+slg5I3y)!*7i!j+`=hND3DRbf>1(M4@Bdj;&MBHTyLJg{bfpx{)>=Eo} zgcEJtrOeUrW%{!v;OGtUVm@XX9eU%t+g0>hrC54@D>q@FnSBt8Mvrt+si#4`u4}Eb ztG@%a5psdBL&%GIl(amdsBOR7e$~PDZX(vQL9wv0y2CILg*fnBUA_Lit9`WYAC?SN zB&yB1t|NfZBSzjqWun-bRDDjR-N0D=}|-#>mTj zv5pARdbOrKG*2~79Ec(6Jg)fbT>o2EQaT4_Q|D-;rHDzZ`mN=ys57Y1vm4cEs^cB@ z%gK7G#;cilyf}8oQbu{LrMGBuxq7#G{N1m`M*$)*489ngzW+IV0BJ_T7w-X9?wjlr z^q6<13q;MfmhqA4d7&g%4XiU4%PLmScw>9%$-UG$RH~*bYmiQ7NiTQB(_?DFG<59u zBqqM4KMXbIGcf)(KW6u_TQ+}b*@t(qGS@tJyIwA-KfaW-pzoQm zCXQ{5K+EKJe)msu7UXWLLAP1;=-V;sfFfd;xAxI(DP%-^O0{SunisruC5(mA_-;e% zBV4=RestaK%ou00e-Q7qn4f`x&17 zwoJU4jq*-Vl?IUwW(Ygm)%w+1ORnpR2Q4)U5gdb4|KvS+#*(|;JRn}*I8rf3JqRdMa}CG0LnpG9 zx#g@$@nL@5c$G$z&1-exO5k2%<=Bpk8X>I5j!&m*EPj@z)eq4aBv;XXLrJcjq(ayv zcLio1u0d6sOD3qovvjX&nYw>d!-p0>_B5|_rr{36Mta<%?Wzn|v}k?82luo7cuS65 zQ@hfmwR%s9jP{gyr@pS#@2xA!CQ3l!b1k3&Xuc&Q@=8gQ=Oo5tf8 zYt)hwBa<8V>6jneMayaXNVe#AUEg|-rbcCi!%!!D!(-RFV8IFQj%yB&1>FH?bI(-& zh2$rCX*C2#BF*YY9oRgy)VJKv?Te&#*~I}>fL^7vQp8{r6P7-I&oXhBtorAE zP2VAs%6mnky?E~7_{SQJ==*&Va?GNrf5z7cMfs&PD7vxOX8j&4{=sxF@9U{Fr>om4 zFa+g2JyJAhI1X?}iXsBw^QgdM_MaD|UpBNwLswb78I zU&}~q=~JGTuq27Hu+(#0l`Q3!RG8MmP3ONT=2Dd>=PcnJL|;c0xh_8GwA?DA&(Flw z{BC9fxbAa^fpV6~3s12FW+IqZ*P>i|}8O{Ie4UOwk`qfPsO|Gpc% z?$>!1t{G~U1b_2|nm+bDJJLmJbWi(IAP%b)a$o-z2;auMjP%DGmO_;6zlTJa&lQ-X z=rAqQ$r^%{)&(m{i*6wR248Dxaxm0y$|%E>Hv4-~9_rogX$u}>m*})tnxI7@i*Dg_ zO)MdKiz13U=sKpfNsr+)fq|PD;jsUt9-2;EkEXz)O|lnb>|MoFDa=~IP7KPGJT|kE z(?MdOGw1DVW;r)|k<>p8sC}PP!P9{D-OkODY6?I>^j?j*@80*iwjv`rU$PBrRr(@b zzRIIuIFaN6>9{KBW$dY;p+p0C<%_BH&=;gY`^5yE3#)V?_HE(alq4wPpI#)YbL>FOhjaV!##t%igZ(R1~_0@W6&cNI(8K$%&5FJ+Ag?Qs{vpq)kNe;l#GOq`i;n zl3*hwwfz`ha-?>*E3KPrBjujYc8lTpYSHC#`t)99+{;^^&N($7ci!1P&e)@l^QZ&$-SFz z`{-4N_vD}13v0GOnAGw}krU;KAeC@alQ}YciCat@PCM%$jIUBO`k-(fi4N!b-b2Ig-IcM!alq zI0AM*;lLf;26qPAWpqVFZ>0<)?X_K9dZ0$Q1H!qUi9gIK*qn46vme11`5g04tef}U zzbclGJnQe0RibLdiAkxmk09WQKt9nmpYw!qMPK`%VXe8IDR+1XctR##Av4bpc?Zx< znPc`cQ5%wY;S+`F+}($@|KkPd_7ly>PB&fuq>3zw4p!UBQTyJQzLC*CW#UR~Ek~<@)H!0T?=W482)YL^YHOt3)hOyGtgNrjW;@JT zlI?qx;q0L?c#;OWM0imF73^W}DfTW#xvw8cuZy$XgvTrLIrV#;oX@gG-FWH*5ywKun3(wUvtU&J(dGzweo}wulpxtlBGky-NVL z@5n;9$Cz4m#LGu)(2(arBXC`wqr&O0C3ZWV@+w8w0hnSGg=3iJ(VE zZ@teKTZe4}x8^;ZgBqPU0RHOtJdw(|pZg@ktVzU^H=>H0M!=_Et8U8m^iYL6SD)l& z2zxA8Oz?LXn5*v~f`9)H9N3oe7_(NqJHLa<0=2Pk z7`wU@Z_WtzERRLLeq0VG-YtcU5) zJND@lC8%5fthN3*&M$m{0~dU+xiY%n8eMFHnunT0JLvtz&djCWdMU*5>4KGsO${zL zh>db=J@T#*{4&lN@@Y~uXF9dlLPoXqIMMMWquolG+3YD(z8$>^Sg;6Lnx)d^61AB^ zXQu*|zh>eqY`3z~lwLGpJ>EQUM(57%rvh@5WSbEL4?Wl#6&G01gw6j{v+pJ+f^nAe?k;b|WQ*SA6>3`gG+BN6Pyw zCa`DTGy_%OJSMV%?Wiokoek10C&3AbWqq9@2jp*^1Sz+EckZFHBy3_(R%9Gz>aiak zEJTmcRh8s>Bi!bzWf?8;gd}GCn8Hb#KI*ug^@t*_wrUbMVd94UXW!Z1<#nb6OF(b# zvitEIAFXQ70EI^CJkLs=aH`S-zQ4@-hsS_ky>-RaJMi?&Yp~Ax&s8=VxjoTdzHhGh zY2mEI^LVWxjP?pzR7AF;^dDUM=p^pyif3#~Hn=8AZ1z%iqB)U&d(=7S{I<59lG!2& z)5$xpr80LFc-me|oMvC_ZS=U5+H|I8O$*&mqI@PEpgbVS-)mUh5<-Xhw3*n|)}e+0 ze$p9$p~(7@x0Bkzbt7lTQ$v|tnr(!8;+Ao8Kbnb48`QT^`Pwf+81nv^J;)AgVQDk) z&}PuYXYVFF?<-E*{du?UyU(y{H011pXWD4y*W?JqyltL@IuZdr%Z9sJ#oKDQFNq0c zS05K4U*I`vM;)Q)>b7l}*G+Vra28u)-e;}(#ET6GuWK-xFGNNCTA&coZaVM#_?}3& zQjyN@bDLiN-0b~tY)tI$BVOsBc5NQl^qD#AMbgcjYht_DR*=>w&4hI^v0!N07;&R3 zcO`8nOiQ80rKa4r8C5g4hz5}xBd}p<-&lX?b^SL z7L0Zdq8{{t9>m?v@<}Gn0kZO2Zh^3D_lHWr8(Ub?t}w8^R7F1#ufdX>t=cV?=j`Bx zToj#o?P{N?I?55^D8%9VE-5kJhuE}DQdarye9r4XQ(vxS;0t@*Q7uN9-Ub>m96Z;& zGpP;k1QCIwuFL$G{o3YPrEZX;S<>I^P=gsca!e0&N`o?iI0j&1r8$ zLM}nu!r+hp!^i8QruTs0TMO2Izov{|0;~u@0FAcZbHfOpRN7PA^955vf$EJYYPacQzkZhQQJn=$elFj0`J@gvr3G`$|$YgSa!D5_neDEil3bQiR z>@~XEJVSe*TJZ}ehC*^!Z45^;(iSG9^SR47eE#@1TF@@0S8YC-PsFfBpF|N94(+=% z%cS?LlE3fA2hr0qyc6E816h#?PKquFp-4Sb6g}%FVaXMUKVQ7(HDr`&J)epw9aHSg zA$9LJn$&fmEctpq3c&8+b}WY5_7RwA4q1InqnB!0+@qq`F;mr>p;cmc@>R@`GuRs0 zq5HT@oshXy(CBufN_?MsOVF&;I4oq#HcxAEFNZqO!BGjRRH}PUbu8TF8C|t^u_t3= zWz3U!`yN}PGkZq@&gR50>aI8HW22+@My4)-zvw06`+<%wo;hRKdmsKl6tol7SF}Q1O$)^3Z541DeQrD6rrjbLMr*QKjbhDLr?eZ3lO4B3UYYU|`dPw-? z8=YUaL_#9&h(Ls6&)@L4`s2v6&0DNu`t(5nUbIPZf;03T5s-921g`wI_d&}$SQ!G0s*`{|+iMtvg1$&nuFsd& z#H}>hQEQD~r5~R$pwXPtRS++4RoG=WJc58Eh2Ez(U5i4q)?7_e{BIA*d7qZhYl6*t zFuCdA#_x!=-_lC}zFo>Hn$gXc^mo#z`o8e+b4Iep*$rTh=1`o3UIzP;(BPUAIBs_O zd%AJF&29dWXD%~P*@su$uF5!$W+XW72d}v;v);j3z{FL-vf0e)Jl!1&_*r{{XIvLK(Lg>39vf?+hOJ)?4Cwb+11hid@DG5c6lSJW1nk2eNa=z zJ)>lVyNT#<6*6^GVqec^3P@jyP}cw7(Yl$jb`QsyEDT=r_Tk>1v`lGk7Y3rK1U4yj zPX*vy28QB&sR30+A28Mue>h2D(#Q20WXQI&fJJwZOn9A8f4YO?dq4WLb~%$Lg8{!! zmZOF^mFjb^7@=*VA8Z8= z zzx>!7Iz#2o_~qbB81U(qc%7EmCxjJB+-2LV9-(~E-tK&fVo|*}0SU@3!NxJudZ$a8 zoUC`xJZV^+niG6^p`jS+8@^s2moN826Kp!y?jU@R>qleGIrXrH`w7b_!C==SSiUUr zvt&e&2k-Z7?v9GrH7Lhha2@&HJ1~BW1#2c6nte$&U!wm#XMG-hLlWlw&#m6m6M}e1 z?KCzxa5byMz=tK4j&q)0rN0Il;&ed(9v!Cp>f<4SALPsL`rN-S;OMuv#oOI+P}1cOLuCb86+oL<;4|*R?3uMrz`&gxlvf4f^~H~4l07iI-H|Dn zIXEyEj(?;>%a=v6vpV6|Cf9LvjF$unOFDF*BWCZUG9gJoM$dmd_gn1oust@h*S*pbK?Gva6f;0XLeosm2zF9a}{O3l|1RV zqUCah<476qA%VOot&2-Dm0?wW@hjS?G_o~wkEdc05nw3>7W#na^WxBlyLpONUPqMS zod;S}8lpC`$yxI^!y)4(eMh5*ttb)vU)Gf2(|`p!Pg{@nb(mhbQwG*`jm8u5JII~d zt|IuX9o2JYFv+J|452&kDQU*~-RDSL&FJ&SPo%(jLX@ff-a-q1jv%6y%=J!1bmn1x zx^#1$a@IsyGuis%FWt-l59hm?^%Mq*$E$VbkS*g(81G%`TXqV)y!1zCIH&6#CXIG2 z(HFf&vaSCY29P;9h^`2 z(`a0^Ch!=aWx83l|6P2j*|+pg=XnYPq+QNp|Mv_&o1yf&uz^3&lLdZ6tfU|- zeHcC31540Z^+OxpNjP+GHnBY_^TG`t?8W@XbVro)6&d&zZrKaPsdfYz1x`V%I%C9H|Qgo&h@AdNAo<-VJS+;8<7mTqc^O!$uB^7t^SI?+OO z6{s3xzhhAK{y?-Zl5Xvb{m4-v4cT07>PLilvpiq=ucztV&gC0}a)v1*E}gSuxYq-F z>!5K}fp@JLvQ~X3BsDP^s<^JrI3t3yYUTM+CYJgJkfLu|Nq@s(2y6bg-=LGkyTy#8 z7u`Q3j3`dU5@kAyZ(hszJZfN6GwfMbg7c^(GakK4$jUb56bYkXtFyWrMsL-aOrljQb->{f-tnPvbeuEukW}3Av|Q?@fn|jh?PZYd zz+zS?lI!BJByo{VP{#0wjjbuDVYRSWK8;%ojZPnvlTt$g?Y4p{-V(*c+iXc}e)Xt~G zG6!{})+)8kCFbdO+%gFtT)Pv%yH|)JnnFjDZ9PCcVdS5{XvuW`j{jHK;CR5V%pt|B z67!Vm@4Znv;8l5|uk^1ze+%;tNRam8a?VyYrL|zCs`yfz; zbswKK(J&@)GGac|QgT6-jC4O#n@wj48G7MY981`Xbz|m|IIOrl$7#^FV=uoh!cr2o zQ-6;A{;owga@>f)NZ?M_ERPUBS@-L<4?(FkA4+5ppf&N;)8&x)XU{=6>w4;)UHxI< zienu<=yuAOOb5K|A#+~$a3uA)G2!qLX30~I_;&Q>zLl~Ew;2ub6 zmi_MiVyR-?u(r|3wcm{q4X$j4L`z$z=1jvmabm%#k1(ZEPGQ1Z9}JR$B-vYYSKRl6 z#|2l=%1askiggb{zMo^$51;DD?<uX|Mps-J=jl0FaAkhyR~Q z4x`cA{cc)6jc4&~n15rL}Nxnl3@3?KPUq4k^wwS^gK z*z#Kj&CG*Ih^g--%Bmxy;jIvvozO@_kRZHPW8RcbJUdqaMr<%g8x=D+=dwl%54-_z zG54KZ;}YB~Y5AI}pcq!UZFM}6wMy;hn0S)qM6@iYuYBTrr1g@9bjRmFfzdpU3#90=rYb<=W9^)DyHcq^tL#OP0}hJ`YEuFyTcU1SiTgrrdZ) zOjkD=Pp>msqwL^LI|Xa3_v@$p2{!mS!uYRCRZKaTR#pda5Bk^pE556oPY;*v{pc}Q zF9Us(Jg~@o1*C)1RaI^?H!*#(Q;*my_t&m{pgdM*?%^cWFMq@_nKYYg-|7+yQY2Ol z6DQ8wsf3Gr8ZYKZ0{3y<$9G#W9#U%EpbldNOR!H?ZI@(Rh1h>9R)~E*2>KDlW9v-m z?(L$Za3vAmdz@3J648Yl{Fxhjq1oXnGdWDRFo!$%@b73VQG{MO>_bACfICz5z)9Bl zDC)&>swsZD3RX=uP=WS)2F)jvICkl-E=gRy8$*i*buE9Fp-N<~lJN|-&O~s3^PLr) zBcMR%=M*0Yl!{Dxdabt2S2OF}oSz1YF4h$$oahjS@ICF1wKNPi1B%W?=9))o%wY8b zyH4-Ya~3-CRH=3T5RU8sq%kV2a|3&~j)aAFQshyrq$>y~qr2sZ!Y`D?`u5q8LJgH) zQ(&oJ6GTh!+OMoHYdzj)pTOwnck9spd}4a17VsV_<8|({^9+85CIPo$hE)qzMMtD$ z<-M=7jO@O?_|1~>kp1Q3saz<-;(!>BL_H7ZnPcF;AdxkG*5qT|Uwh&PnLYT)PIliRpcgKSl7ZA|ZLNuHi$#5d4b4&HfL>H{nR;jlbC_(0jzs}sI5 zkA}wP{ROe;VPdCH+-#$Ah!Ak^_&_AvF%Hw!OOPswD^Vv=`}T(-*zW^pLQD6~w#vY9 z(TZ2lD#}MUj-Akk=njI2!x{Gc--mgt7Z+|ZoXb7$MEreQ&r?kDN?)w+JwKQDaHo?( z6l`k+o@76?Q_IVw}j?n+*i#?=;&@>0}=Hn3wn89eZK!VaGiX zR~v`#PD8dY_47xKjxI?jwA>?)PUlSB3!~^XuC|&>U02N?kpTzAx~y}&yqlZJG*T_J zx?&zI=r)NpH~IaThsYT;k2pl(SMJ46`|`Cf?@hk-fm~e*Q7r_cjQ5dr1KZ9|SJxR5 zr(-hxsI%=gr-v@IQ}d3SALie=LPk*E{k4{Ic@Mk1QU1rnroPGeik-Q2`kc4daJtxAX%_O8hJJwmxU+uUwb zAo|z0nJuVao=3wR0O|mHu8_tiBnGqEL5<$M;7f@GP19Uq_0)ByH(bMbk|huXz*?ZZ zgVB!1fNFf7)^Q=N>^d9ov`e!YYuy(!JNW+^1jSZS#elNqQbz z4^s#cv`DbXV^2lw`1M^`5<|%`F&L1!v4mx8{{#pa4>)n>sNWDR-ANO#U59?qLn37O z$_KzUQ{5ZJa`gs=n;?g7GQ(7Kdm>DbF)B8T=&iXe83U|s?ykl$ZcV)?9MUyUl}>XdU@3F&fDb5fkt>diOS}Cpx`$(xN0m4mvva;ySlWpn;*Jb!c}^#Y z9ywBY6nVI3<+>!DhGTmBlSWQF<7cMT@?GAEcCE!~8fTQCQL(hIta3R4a$?GHPK>3G z455o+ptkeb=6SBkB|n)Kisk>Vnwp2Pak%=*VtS4uhLe})7V_SY!oG0(9&pl*Yc<@Z zTXrPQfeKxYr*exvXDD&J*n)w5gnFkH+Gb}{y!R0pR1}HJWXOx!N$3Rw{g`!TiTUJLuLu?_)P z6yc$vTwA#Q_n5rp)w;NmpBpE|TyyVG-lTCZF8WDfJI?VFyXiu=u^qMiwfS28wxORe z1SETHVr)#eK+|_I5gDDcd;)8{kc)`0_KI{c&F9*5nK;tPaRaDqqqv*MC*Et=IK4an zG)-Q0MZ2b31(d0a%67*1?qF;8*YA$DMv`4n@BNrmZS7*TB&p#u)Tkjq2OySA3LD4s zr$^wVGp>DS}|w&5NZ--I6CG>qS?v&9BT&FUro9n&PaKrj>RD>9O6R z|Nr(&pe2S%K#lf(Ab{gzD~BYLhW?~*vE!;6#ho+n{TyUr`1^wky!1ge+(Py*BZFhi z^v{$*l&WyTYj;RyR0|^x_U00PJyU=ri@|mzS)6D5{&Hh8h+Oii?=ot1_}8W#b*3fP zW;pF~t;3LohGxLZO*bWgx&C=Azvq|K=vWgG>Q-@{0~@Lg%Ts(wqtw>k5@|eMi%HHV zsUNbI4bx)f?aAEF6Smf3ZQYQO$aQ#dVJz4t} zto;IkqktIyqw3zSCC8N|UB53WwgO#)SAY~K^;hBWGr$q^^d9}NswyKRcmW*lX1{qQ zz8@VK4;je4Ld{rd6`CWi{9KRzG=IpczvERoCLum02hEzAORo1(9>Fa*kH@|P6TcR* zGeCf*roCe4eFm}a`^UBkfYX=Qe5+nR>VqPsMSS~CkgB#!sC0>y?~XM4weJ;R73IB| zpx$r$5l+3nS&CRMwmG(NBf0IUWtBOyzpp~jYodvP&x$}(^9N$>+4AP)K>vFv#^jaT z)bdN4+Lw!?-5J&pc7AtciCM{f9=x(fOuYS`3F?^0MuJcR6z*%or7KX?oa2}`PhZb> zCXSZwJ4eQMQ`P48pnq3}@ZZ4+Z{)0tEabsqqFuO4c+vETl&@0DNCGhL?p z#5CFOphqSx8+7QUnSF9)O$Kkm=P}!6J2{vOWTwKobKQi z0On9|Ttf$PMtV#b$cbGNta=~Q7(#>Bfi6{BhM$CWkDPi|ql0j0g=? zaU2U+5UM?*TbTdv`ew2DYmCCLgMwp!Id zs!RT-w8X&bufW-{?-FD(slKpXF<*gI;>WAAS$h| zkJ@v;XrFgJ0GY(ANF72+Cz_UEqgm>c{&@kTFDdaSp~f?mI({2H@SW;@J`>iJ_f2g^ zKv=SVgQM>F%bxMpB;@<7prU!40Pg^zj-TiUI+X^`j=TR3zotw&ihRs_zt{S@2O6b| zCuKwGk|4+0k$^9_&uLhC?II4c1mV0FI?E;CAz8_XHPZf#^;w)*HLPA!alIGvu^9)L zN61p7WIUY^p88_PsDs6MeMe2BJw4rd$E?xji;OJiyZxD7(B;LA$a;3Impd(?hmEw7YV@2`tA z;)cS!=iOZ2Ykzcw((8xM^?3hscVkJmt=am^5JWNX)nJiXUj~Qk%-l!5E*T2qQUup^ z0BvJFA!9|r&bVG*Rd*&=?hO-TX71#2-7`KJfRh#OS&il7V32td)ft8T2qI!8oS3qN z_u6xhdmh=d;L#IM`qrW&(l5f-%ffrDE)wxH-<*tkzSjImQl1oQN;K^n@}aY)9qkFj z8U;G&l~p1Jp_(DDyV=$oxu=2<$0Hc^d&5>a!j7-?mFdy5O!U?$jZ=Jpop=?Vaq(G{V0HUnaKU&VL6i-IjS>?S9)PyWen_S_>< zaZ^6i_aTlWMRIWcjvN}YHBLJ%tzoND1z%@hg;@S4!%fSyV^%vdUz}XhL2H3`Zb2aQjIJxU2_nh^%XdIrz&(A28sti^hpL;qs(lL7d$eH&IUMpoPJNsS-d0OlP zX(^}qV>NIsb)p1#A^SV2w;&Y%7w90i$VKFE&DOdR{}tZ{5tFIqx{kME0%81cpnNCt z&P^W$og#q^M5x@plE4Tr(yxJqKTGuA&~b>HzD2x+t6k4UR3z9WBW_I#=2`Egkx8fa z`xZYR_iy$@JivMn>3>v7=ef8?%C5NjZ$IDwz86FCdxgTQh)3fs0U0uQK<88u@)0Um z>^inly{lj7hOb=fS)iUKt!6+fi&mu|469LI;^%m&gNcGiqTx zlJhDjmL8SfPd5s=rzXYc4j>3=reMpQV3+BzKNmrOwKdc%(=jinm~daEmTZ-dlf2Ka4!NG6UPC8hZ8?|$R~?>JaBh6uu6 zPL_bwX|PHmHd>FYI84^bro4(=^~SiuU6PJb)j@WmXu&SSn>sZ(LS-HG51|3#%xERm z-_hjneHC4Qr?X}iu9(d`{6sWf1`XDY#W6+GRJBw=w&6mDV0;A!0DuND$f z_p=DSBP;Wi3w1i`iL3ZGr}9MkM_e^*DtEErn(d}%aTCG$lOn#EjrTWRz&!}v5(a!v zrlluPRa%xxCWi6D`Qq1miHqkoGvOMC;N+}qR4~^z_k9uzI)%s+lS{TXxNdCMV{&6F zAN4*v&Xzc9q8p5pjL3YoduXzP)bsX}VLkO;P@7oa55ICA=W=cvS#kIcbQJ|`9~iLjwd~1}GN5dwP##*6hh^TAQ1i~L|J|Tkwkxe# zrEeTh)(koZT}b-mI&XzV)B@xT$>mt;n=3O6gV+RrjT@R{VERTRliyxWQ8hCd;(NN{ zzGDK>ZK?NP|BnXC-(Rf+dgIJio+Fm7GrX@qEl4r3w1A^1e%kLxe)kX;FbuS_l)aY66?xYFXj<$e&>3B!ZuKTEO?p7EX5AsMts z>bT>D*;*h97QVYSC7*SV%Zzt*0VqP;{D$hXGBgHgT%NQ1NILQf`?+G#{i$z;9=PeG zhy|02TwGFbw8V_(yE+PtrxrP6ussHVhQm-XBOCze;YK14XTUGY1J6(^mvY1JU(^KP zR<)8w-wH|gQGMVH50QA^V@N&u&fj9xym5t6gT6oO`FENZEt!zyXW%5qZ;ZKW;H-|U zW)mklZoeua*~-p`MI!G1-QRw!(Q<(v6fxccGiTWRjXf#@zTtNO2N1~&($?dfPJ!W$$Eai(G~*vEvoD;6jsh78sI`o_Xwq* zC@j}`L@lh5OUie=D_@6bAZsiw&5WM`Jj~QbZ-!Jc&-gkIxmV7@kl!Y+b^V`s+;gkc zHZ`EX-&`>k_BXyH62NDru!{+E1>$>~a{EWu2(?DC^3%swJ_amFw z#Gj2n!?VsnoaK5vrL`(11LcLVx5rnv<_=wBSX|ZdlS~NwthRJ z5Iaz#chUyl2rCmtsLT57t#0J`28Tm&x%2+Csl*>*gGU{~9P5lzgef`}&J4f{_Rjo7 ze4*@zOr~4Z@mF~hOg@@9AG@fCOyc=<8%M}Nb9l8QFlya>IagK4;Rk#N z)xNJ^PF4CKfNSDj`|md9#G5d{cTYyUc=1`QURzR?0t;?6DA8U`td>Z5x~v&A)4OrjC4#}&J5tr zNsy+x*OEV)so}RiDbyvnRAKF@rf=hR*n4#}k_@c}bC1$u_Su4L^oC($yVHuwv!;|n z!OV_Zpn^~BD&Myiy@{1%cwPSEmcrFhTcFDok=Z;q=i7$$W$JLQsTQ%&og#sk`>f`G zyBPL}X@{4%IiVkW0m75=c7$N?R)$m(`3z?s5DJ#=)kAO3$b&jU;5uS7Yo)ysV#6=C zCjx$r^e#H3@AZO+dbYM&!gpw8o(DS)m*)FJqJ*Wx{cVJ^)*MA`wI~WpMoE6QPYBKQ=9KU@8(8kia=eKz5(iN=q$S6TQrejW{b}r!& zhvAjfZOo$QComekVab&Q-5QFmkR`&AsKyhlcx}}vzQVYs2~g8a{Ev@%M=vd4RnPZB zURn3v>H7%HgfaFf`EtUy1(^fAvoy=61ww)-%=|(L{l{W*p+{o{v^cny_@C+JG;FjG zlxpF(#hE4+p1`$jrjJ~4YQUGa4NKn@2y}DWD>3=lfR}A!ti@`FCI}_FVG5v)`zC0hjnyu2%bFr)3ze55tI+ zvig|*@i*y9Ufb`Hh3z+3iQ1`vo784RVckGcYF4~YTh=LaN~6x{0a?t?}>h0fhfs9 zb-P?f4W?h-+7Y<@mIMpDi(2oWak>%|$SknKtgdeK_j7e)w>XNcv2zN$2T>Bi11UL2 zN7uQZ18ilrIXTaSrH?=4_7d!V+hF6>+h*!y(wx+aZ_?n~j2q`F(D8P9Frfv|D04|9 z)`>hM3udfZhi)&T{!Nz8eG2QaXEJELb9h3FqO(}v%jk_2hbmjwu)5{>4>-beudvv+mT@QX(jb@4LHVr`H-)sh)eK;gLlp?Uj{@d3~>o>6_ zR~p6DJ$kIHS9Y{--`mTwtzsEfxp&{#G6T}5cAWea5iH49SU{{6ZDIV}wo=|EC>x4Q%QNX` z>$W5}BqLa}rhAQZ!y@BGI9lZ7+c~SMGy=8m_b2D@UTJBzK{>yC6;CqE*RLG4w4t^0 zxKr^T)fJkWrvg1-TdUZc_!xqGp!(J)MIlP~sQC6Io}PyGY-aT;QMKB`u>am)*t%LB zMdBf9?~{bOXA1lO(k*c6IPHo1A7Sf}uwkO3^iS)Mwd;rN6s%liQ^aFRW7Px93Y@ncKNYO~{OxHH zy|cFf-B}KJ2q=8D{jLa=F1!BX*SJHvYb8;Q>b=F4uIp6h`*(Xs<_kZPp(%M`5u_h| zszF)Dx~dODyYocA(1{7Da`W4V9|cT2nBNsiOiLec(jHDo4-Ao+?)^1RzgJ0*210rt zl)>wN2q>Av(e>ORFnwQZ4er!g&lu$qZib(X+O0oE&d$-}jsI@TN<8w$*Ri16lX#^5)K=#XBB} zmV6osEwM9{-i-m2P%7urR*}&m&Y62`BpYX2>*2c%bua}(3st@Qyn4W&Wa`qN1eUSB z7u}lRHNJ^q{BK^OD_gGK+Q9^g2K3Y#>Rd^LZ~ZVFn2lwR?3UVWl+>(%Ou)_`2MAt4-yK; z#E37gl_J`3-<4jY3m{kn{>(yR{Xn3egKQZzpoV6EHl%I6+F^@q2nu|VPVw7Q!jJDh zT&Zgy!vE5bz6%xVmzBLw#na1oFO7owjW{vlnwm=oYT~TUcJ(Z3qsJh&VoUTrxj+u* z5mCUrbIF?uY+K1sw==~YfHB$RSZo{crGL>$_uffV{-6JH@Bvx(wP=v2d$DI*^bs<# z;Mlgsl24LjzUey&ET*_`r?#><;gabaw_g2qV{)Y2J^1N+6`!(hLLnfynruK%LlzrK zVJn0`b1gX^G>M9o$5gI#TNBTKOrF$u$9>lK`bBB;=P==20fW{}#BsbG?tl%Rqm$adVw+%qGv{9XM6-gLE#54@jG8xBd~Wjyz+Zm z9KodKI{fVex}dzLmHOWQgN*2*(8mH@fQGPVF`{?y&tqPErSSM-07pQ$zh4zYqJ?*I z{W`PiDAG76fL@STa+{0L+R+6asZZY+dd~F22hIB=g=LvsbIP!^r`B3omMsIV43?$C z&Vye>gPvsve$sA;&SzO~`*27&UiD`Qm}Q=Sf2)*;-P1V=!x3bjgu<{Vd!}_Of3s(5 zl|*I?-?NHOHY&-khMjF@Z2m7!y?n7TRHR1BE&n%;ewTm5v6slweRhb*du^+($;*T{ zN5PsrR5}EG`)KR6u{~bnSj14SI8VG*75TE0_DFvZ$!n{e7^zE5)A;n&^do8>lvGF# zEy+u5W&b4lTkU(q>olH<6KXzv677l}F8w}%CgXMa{-?d(Y36su4k5;-8VQOKWM5xw zoJl3ifzq(DmvZ5ZR$0HVVdx)a<{J^1o@A1?>GkqT9@9T^_qfpBOvC4ov0sb6lW}WU zU9XY!UIRT9W-qZ5KJAEM+3aLj$p81To^T5SMWfdA_b-=lDO!e$os4jP4*c|AT9Q~~ zGf)B=`L=bzlJG)bj!d$xL&P;Ckv#&cB9d7UqZyUqo{*5<*1{J&y94pJt7WB}xiQpq zXG~Cxy8W01zJ_45OB7{xoIr(E#{-BMeJlu~H9FLi(hPTg+3y-1YH*B^_P0#m$%{%v z=fBam)U9$5vKZ;L{~KppPnNqKJmy&darlvtm|5!_ppIjyVspA?A)6RHZ zRwGNrV8_ciC2^-6shM_<_frNlV@eYVbvZ}IKbz3`< zk3m$E#lOBXYW&Whk0A34gTJpykXAD9Cckfyfx>>mX%dK__px%-;M@pg^i6xkw_9i4 z=q7v2D`G>Q`&s!C!UetqwDy@1buEbK#Z)=pX7u!{zE&GAvRFiF^fPq10x`HIEkXd$ z>U$}**&M%TSx0j#x-YS}UqVI@UR9>_wd3>Je%l)GS=s^h8p&k?h6o9KuT%2jFF!-^ zmv16?`C3K!IT}>Sp?LS-k1oPL2}|s%)Hj&$kUu;D7l0OO{Fp_qGmP~sSb0@4f{IWnU_1l-9}PHlnx~A@D!2* zRmRf)2z||0zJ(T}$q9O8^(qcv6S@-`81nkICJTz7>&Ogzori{RV}x98L>BK>sZGj| zluOoVT+%4 zTub%~js50`Rg1*^X1Di1NW%N2`kaqkfn-=sb-JTRh@_H(!~c6jgR4K%G|(@aKIvCK zTKtI_O{|b@6j%IQeh|Ub{wmy&cr#}&N zb}|_Y=g)G=dt}o43LcT9k*mL&-KeW0_o{? zpToqdg<||mswQ*LPzZn8MU$I7s-hu(_&3He7xjRLHR_qY)SjcMfHRJj$v!^01%0w9 z_Gs(_`mZuzPs)yl?03rGF?;J~4mA{WA2fq1s^IrGefCQ{sYcTK{#O&3hfC~g!>V>v z(e!X(>^E_)t&K5gDRRC;f9zl_ zNyBaC_UJE4nI%ZlQQ2oN;Cr`|0D@1&OQgV@MA#4;66T9d5drY}x&Wn=mloEoO%N6_ z!suD;30=kNd9HJzN46{aF^ZhCPJORD>F-b_SSV*FdLi$lT) zuM-nJwXxr-rhd8gz%-!x?B|G2oHRR1UxLE>S$^Uxy0=>q4fC?5M?P3klM%^V=}r&k zD%p$9ksPcm(5>Zk-Xl}FG)$kxt2=TSeIQ(}EA_f^8|~swX}EXxg;@h1E8ARb870tt|%;2i_{mV-t&**_nlSzI-Sz*jaiQu zRRdRcTqp08&0W_JKH%WWb~yRu+7FjNSuMgUF(Acg8Clw!Lx!Ua@=5KrvCrd`1zR{jtsX^T7yBh>xIc zj=Ve;*EN*tsxZp9i&bW=_Ic+G*&&z$j9A+(iPW(LlH1!;SFGC#$bHF97+{`1G%c!Y zM@Z5xu-1RG55QQX3x-Gf%;0UGl@QZzy-NUPe~%x!=aq=9EKVHjS%pSK=vo&?_;Rz$ z_kG##Z6OK(jGV?-up~LB9TovaifCjS=AW^=JIvs z4616P6}=V=Wf;J8M$Gu9bC5jSS0+3)t7itd-(Mw129-qN*Z#ZeFZm-+Kpp<^vz0&)DUr}GmS-H=(PFT%?&TRr|t~q-Qbx(Lh&W!LBoO8=XANduOuWtIE z%yGSb*CXowS*so;)a~bBW)Y$7$86Jo9~Kn9`UmymT(9ZglcIAZLcNsDGTRcsXG;-s zqA_2~0X}BB3~?MG^vop^^fneqwuW|=DI2pm#g~JiD8I+_YChdfH^soxxyFHIMa*;) z`YU zGED&TSCMF>qDH*U`Ph-A4lq_g)a z_6DetDC>&X(cKI=?#LYdDKL~k-8eS&f5ID4v#r^N?xMdSExD&O-Or0lGu+z%`{TlY zmoC~kLh>hi(*3xO;?JV)^u%nCDgP?#@L;$oO;Gw6H+&0D!;+=&NBPj*Ju4)hL_qeu z>0e9W@Y2?veH=STN(yf7Zf~=Ff99~KX<5D1JN#LN*1c)q{-|#OpPC_R9=m29aAmt2(g z+@#J$n@3%PxjyE;#)4NS;#Vccig`7lCRi0d`%9G2fwc@`(@Y;%9{N7c?dC0tC8gxj zmB{%OiHU{3ozr=h%st4$43o~8%3;csTb&hro@C!kMcwW|<*aBIAGcV#aWnX?*JgE^V*2ti_%caf@cge@vL&j;p_5{qwGpd8={AMB7w-IE+k7+(|zQ^$+BS~aSL>rpmb*$G@fCkEFfo-UP$RQD%ZvFScJw z(eVtq9xUj04{H2`0jzgvw0RDLhbQ8CN5DzKQq-xLCymF;9J_CNXm2oN|GxkN>;dJB zdBa(E@fjE9kpx9n;q1Q6$(p{h`%NKTyON)97v?5Xt$~ z-uJf7Do%7pKUd;Q-X+pF21aC$MZeE+txxMgTDBOv??jMH=GOl+Xw+cUcqHgrlqk4$ zXLobMcZN9Tvw|)Q0RmD!DYd_7da@w+2T>AlZNs;jmI2!fF*gS%L~E-`uWsTtL*=#jf~SYD$lT0?y)U@Z zo<V_3ADZx`>dvJn#ebiTbcqWc3vrv8qX50B^*@u zDtBJQbB*2ea-(NyLm&yB%gmY~?fwL2cMKWm6-8hqBEqi0Iu(f5Y8A(>Y@ztR1cOn5 zOjTyOk`(=Wn|WH_r#Vcg(xmvjl1BT?u1dNML~JxuZ{k(T1=%^lUN3;`<}#NVq=a`y z(Gxs5$=*-8)SJCjU@ZHZzuc=z)sxa$bcQ1jlAcyVWTHNN!hsMepF;GbKYcpuyVaT-yD zR1x;Fq%&rKiB(&&bE|W2eQ&QMuA{VR!)3%;j${h|^j?MVxbW}81Pv6REC`C}q*YUh zpeV1VPRwQ4)jsBlkf8SIE{)0Tlb+sWXKjp4zX3!5nkR_Zxex z*_M2kmbVB1wU0sel_9?HJ=x|>hk4d3U?Gub?eyev&%OaTK{aDFS-`~BPt88_85mS3bz`gyz7J8@2 z1GT$N>${7eyA0DSuHi%`yjFXV04wQR*^jQhZpxLf7G0B&ySAPR_6Jx(uuLfrZp|v4 zBF#CIZMiR~7UMml!ubX?KVpc-o;w&C2@IssHf5;R?DrOS%FBUJdVcSHPs_-x$s~ z)#KUMZSnS;tQmqqCkk80X=EyLbA%<@%C5B=?bHT35F=~r*PheGYZz)lV$X}k%zy;zw2x51Trn`3KGkAeO8}bGeiw5FAz?( zgPwG|;zgG%SIOh5(eLO*P-kGUuLo>&DE+!D_aC5K$H=cBFrgIp?SZh!YAQy7>K*1PhwRz z$s~1vRg%i~7!SoEpEwWOvoTt_z5yuFKy5TW=iN6a0eS`Tad z9aM?9feeu^LlgvrX$|l;dQQ36o3;NnjNFz?cT3z8d!!E|(N2J}jOE z*WDrAys=L()Azl&h*SOUaoyI&t&@`|P9Y6*fqB&r{GnL5+C(Uftj*ftzuDT#A@B@`0FA80 zU-&`We)%49ZYWiB3CZu~Bg~(d>4ob1nZjnh`bUJZgTRwua#Ga zxAvqz8=BY(bCc25dBToFPu}Z`rGwQIXP~otrdFCuKBqGY1zX8=U8|pq)x+iQSvd;u z=8HYUh7LRMgo&{I3AYiU+>%;`U$U((EJ-yH*3S1<*}(`+&WxKv4}g$f{4Is4b#Fv( zKbbPEFZKY1QrqdzuWZ-vcEsi1xF6JgED0rS1F4NljiTZHL8v3kJCpsVtGwEp!_rN; ztwBo8fj3y&G;N+>*$^WuVgpecs%Z=0^J?3o%_MWSN##_~K*AksWO8XaJ5cOLsFL*~ zP3f4^jpATbX1PQ1{t!CIox%A5KB-ZTSO}4f4~I#m;>8M?$U3zFKFyTs?t2@dkh=W_ z8nW@;wM{2mKgKxAfA^=^i8I?-c!+7G$g)9SOaOJx$eK&d5c@Gk-=fL^g8QIHj)|q5d(aAlg7D$ zHjJ!V#XVCIzY|1U0yJv60wfKC>wFC#Oh%`20sB>aGY<2=cMQ9NI-|I+YqvWtZG;ptVi;czZ z*uOd4?)Amq?4+cdCj04PF2opN5%$2DaMi1j4KZB$ye^;XSWm?}-y;quz&hZo<(og_ zs$sQdZ{Lf`FZY{|`c0nJgzNdN+%mf{`-JZ8_0$s%#0L zX_`D+n_SV6bqp8be64jpdjk7_ToHL5M;du&6Zx0KmYsvby0BX+s zJ`r0E;yp~6{hV5ss|~S1%X)`*#3DbmPku_LexxS#To#;_fa|u^&^sKzEI0RcxP6U# z9n1~m*XWPlKgrSTDaSgH2V4O^6h`W^TDQY9g3kCD#=rN18U_qy(;>x@bWs2JrJugT z*#S6cRcmfpS5=srE_VEV>T4p!7y7NW!^*Y59#k(!nA`?)#lex>G0O8EZQYif+&W;- z;3}tEQt9m{Jdf*LN}$eVO^ke6I`<)JlChL82P^`equz&6b}WZPBvZbN?Baevg22 zaE2GNBcly!x$%l=;GXNE?Ky`~=IR9+Gi_tT&Efwsfw<_%a2uA43aU&`M(OqrWZ3v- z*}<+r)4nSCjB>e>98}akuHzK$%g>Wj1cZuY=z-rK*T2uWjINo`LlW87>Hmz**}MGS z{YO+a)OG?-P|8_;dgm9HK*YTQQTebP>&eJG@Ovx_g^zn%rVBs~-cPsf`dzW@Mm*vl zj&xOm(ZZG<<8N>cGWaqdKMwuflBd|~%Hym7v=CY_4%njG+mxpk^MuIj`J&DO{O5hD}=v$`t$gPzWYXGGcdbv+* zE%)L#?sAt6n1Usrvl;ENoHGqzgzy4ZstkT3&@K>1F9$g+*-}B5Uw|*?QxqZ&! ziGy*i3RnfJd)w`J*I5s1;7HQyGde)&xz1`kvALc>1v-8#388RaXTF`bb2hDg(j5VK z5C9fjTXz{`Jtz8VPzlHJ(?M)4I3{`B=Qi2huGKuNbEq;55=!iA9_$i=i$zPf{gNPW zLp~~J4zyZS_bA+yw=e@~Wfb_XJ18BVp(cI(?$xo5xawQB{X_Pp`K|V$TGnL39m^(F z4>x+BL51*@`z~|3=9Q4-sDNqc*NZ(E)dxwz2|${u$#}9_Vn|s6zePA)vU=b3_X&** zWxm&{bb_E%x2x5{cJN!T-zAo#

    =Baf_^|4c7YD;J1wgIMv!_tsbp&c9i@SB{quKzH0Iie?jEGqEZXK z{`r}16?5tOKM9#wZNuH{XdiOZb7A(sM?49`vgs|G zwz|rakUZ@eMlsvH>OcO!@prP=8D-v~Td)e=$rw)4iqyi!y4*?HBhm>O5{_*)`5yw= zi#t(+cdxt(pA|)gDUA-L6Z%s*#ug!zI{kDq`m?CcJyIF%BqQ765r3;j23WrH;mK+% zk;~2~`UNwm2|G zK1ydI`ls#dVTDo-W$;id7vAc-9)>PP=-u9&x(fYX*ZX_wrp`O2G^6$t{ z52)|W7~3nw)!UoVy;=`rOeDki;yI9SM=9Tgu0^x(tqEFF$NFmVeOQhuKr;P#k5xzqAl=Lby=zA)xwPKk zin$!FQ7~Tltf8%Jfh~oB!~`(!W#(?=YlO{buZep4${_}*f+}9+`z$sYubEn{O(#?^@kN3TH31k-;{0JZ3K{)F*~uDy42cqYuoBJDG~5Hl{EgaX1gx++D#ZZ~k$# zOP$o_DWeJs+*bfeI8E|aebzB1l6L8F<_sQgUVL8q=gAeg_rBh*^#4KJzADHVeLZ2a z*v*OUl-3tn@BijVRIaRw`4F3WFB?bPL2^>KQYIN77k`X6lufD);Q(*6nw z2bcLe_P>u3%lIBc#d&OXBMF4@yI%ydKDXTOsS*We#{r?lAKSKaVk4}IT|lY+)|dsG z(JyCyd&KPs{QIq93AX;qgiN=%RVp7cE42p9ku0M9UEygQI!H1Hw90Y(7O`XG$Cx|K zu*+w)-U;h^^r*(c*BaE}?leGLQshaQh;%y2`9P;N4e4Y08ewWF^_bwuQGcmE^c3HM zgI)g|rCpF~mNjg6MQFnwW68O`kar~+XJM@;sW4|_wbm8>0LpDg)xg#5mZy`2PXTd+PC%nZY)d6}jN#jhL^Wx|{uEH^d$ zs$DlBJy7_GN#E-kQ|a_fFf#Jo)`#_p0D(8$)T4LB*QWzc)!Z_Ny{8$^TiHi-dS?<} zY9i+F5rc{xd56N;uU~jNRgx~GOTFSk!nP6p5uJ+c!k<;_oYh*3`{#(&XMO|i{2WL{ zWtDi~R@Pwb#%Z909R;W7VVGmT`spG8ypxGAi--fy)l-*N^N;x>ee>Hn!H&#e3R-q% zBt|pg0lVl?o~sUe8a=1>g^Y-MMTcEutA$<_(YD5sBZAeApZ2L@V*5?~SfkG%^AypG zW`!{QcwZu}YP+pk?nYX{Q5oUvGaY9Dh z%ZBpI1n)_NhWa$g(b!q^ITRR&Us1BpbTQ?#vMBQ?dJ#IQ!1E(3gz(1h|BNiI`IpeF zfJ)&jUu$!F@>XW;!DT}ba8{dZ3|b5GGtS0ie6hyCZA z6d|mH>iFI8A~;V83OLrSeAKo&0%x#)Y==vFcxZUNz9?1wFqqLt2t4M0eYJ*NS8DbP*`O4>6pG>U@g6;TS5!xD5V(-YsJm`1rJbC=e;FU<4q%>1+yzgWuWPTb|v{E?K$@Lo@0=*JWY!noX zRR4zJncXt911sCRFT)C@{h7I5a+H2Q@=3yq70Fa85w#`saR##BXf-ZgjKPB_R8CmZ zm3JwV4gyl`L@qrN>b{DkZ_A}5LzJ-R^t;AxN1Sl(yr_>+9OvbZdfP!pJFD5xmlLsN zC#2ZQ$bB6qkYb2B6HWEZH^_rJXxw@tcpBgNb4J4r?co_6K%CLN*Bt&zMj~RDk>ER9 z45!rR{@rz>>b#TlEjI3G?{NM!;1e2T(2_m(`qK)m|QgJJ#%mWK4^aiX$@*T`vrUXO&q0@1fJ z3Y|@>+Tl;f>5ph34d95T_i(4LpR1DVq2UhrBW;Fc8VU6D3Y@<7cXs{rSx?*qdpwAu z<`1I`3vY{9wS<-I=QZGmywDU7PIrQ{(?iKy+GmVaMtbORl{lpD9-IT0K! zIMtggA*o@rEN+P<>rqp5i2NykmnRhNADUNB!qai|vX_5r7Uy;Tl6`!wYph)oKq0?V z{cP)dUEyFVrkO{r;rE}Yb5A!Wnak`SNT#g*Z_!p~o3C z$UU;4Mx4ME9Klpa>tnPz1~yEAuIEkmM;sZpw`yiWFu|ng&u{xh)fuG{94SK1bN?Ov z?jbom5*BlZ$Jz><0f$W{CGqwsPSW=)cIHq}7z@>gja zO6t`?M@wki4+RRhg@wt^a7-ZOBxDgejnecQ|2;^>FhDE+zQ@Ll zbnEXb@l_FV{c}pL{7CH%18W-b)pFuM8o6mKgP~}4fok>le|1stE*75ccuHm?hXNC3 zLx&q{+m%y{eOnb5>p_>gb=45dBoTP-4L4+^7i~lVqL99|pw~p%N5vHJM!**n%UesB zGMZ$;D`X2^fu_mRvdfT*?DGU~rMTiN{JyMCJD2usc#hFTKqtszx)miYQ!LOrYT(@O ztmH_5`ORc^zFW?>CL*;;H;pbSPv+_OS@I^MsfJ{0fjrCFq7ELN0**PNx6Ytm1F`+c zm)f)@_x3C9k#uMrL1Vw;PpyXg7U&|3%9FG8qX=7j&bK}Urk9>jDajlqVJf`flz2HmR|`RrL3e zuF0kEx&Ae@K+I^G6gngCUokh~j)^B1!twiw$&Z1wNK5a`jhkOUMxuQ~bSD~rtmOao(O7?G` zZqx9FoAM?$JK*DWOjg5ZjHj=2mQy{C*qtdR;mMh-xwlTRR_~}sVt_tTW#>kmndWfa zn6>>L*L_sKxHa!sNZV2qoFE1qE?~ERMCKGdaKc!{(|D2B`yPv-)VDiF8Tiy+Da{!B zecOb+{gR7rhY?cRJ6x}I$*z&OL){qnm{RSm0$kh;ZAkFv6M+}+hxRlX-I;#&x|P?= z-_!0?aYGNB^Jf}MXdFE~SrE(AraNFnpQ~_Jq|@8B;Y|3pjhn8F#r%h<_>Q{*3;3L4 z!1*^hoiC5)TE#+5w z_)Wj8tD>OT^{RGy4TC+C-EgX+CeqW=P1e08Xs#6ZWE9Cuptv%Nr?INF&-gyN#wXI^ z#a)2yfEb3{dux)ok01a?0Jj-PbZgblPutp&6d%v8ueD7ygKEc=(VAJGm4f;m@e{lh zQIgefIa0M=@auOmE{E0u#VvzsJj;3P-qQ^DN?ed9)EI2N+PekqCSR{>B^@QjBTLyl zU|-3pNjksQQ10&Um<(N3uw$_w_0{cO(#)DnIN}*D=9omrpzB-J%@Y8$IQo-j69M5z5NnrQ_@p zos8rA(!+mGgD%H4Iu0e;C4n@H-UxWU8>7nlskivA6vgz9z@GJe>AT-y{C=jyMw9Qm zcWI>>(Mq)u3RrvUqy3545?R;%?0*Iy92#CyxXtywGTVXv7rsJ`H=4C~1W!_@6Bpu3 zEHUL~mfVf)8RpKn9<3g0H%*YJy6ClkDS4{VZ-I7%Y;CpUPvh(-hAMiBtG-p*dmxba zu&Qro34e@-b2tw^pieaa)JwCzij~yVd*(X$-NxZmzoUNa2>^H&700>}5k?z0qgoy* zMN%5=I1zK-HU#;<;YZi+AeqMPuKV>OplAz1@ZP@-#ga+P*TV2V*Rz@(jr!ae;7l4# z?PyLz)H0UnUbJL>Nj^UEx379XuC)dxQxlOZlS}cP<9wsU6qv~haGPCLVFHgu6d<;U zlj64q4x}7KgX}nb>#K~|$@O(`xY+gnP}aW9pR)K)2mqx7m&{RcS{RE1)Nu_k423;&WR( zhVjs*w+$?-!g;A!b#HqFg9*l6)-!W7t{}x-8@l?eTvsGSmTaSOKef*7-&WdfhZ!_e zX4b1{6=HpX^Lz%CHjmbjcJq(OuI@p2%|GI;Vd$pRINl#v(&fmrW<4!XqTl!qzRfM& zi~3_$glU>=nV3GYGhMw-NWT6Nc#~Fbu^<5nIo+AG0PPbLvW64QqDZy*oiyi(cHk3R zB4d0MyJkIF8RB1IG{W)Xs@LLd1k)*Ddn^Ypy|XEnpV(pp5NmP96Gb#! ze~4rG2;?hDk!wD{iC5ygJ~?vM5$zcC0ovB+YC5Ivn#%EdC@=~5eE0=!FF)4#GRk~*XB!Y~oG9EmeARo&;d>{o`sD-4%%bJNx8H5lCY7*B9@ zAT$@?P8&=|@GD0g5Z5}Gqjpd%idVCqt=MGAVdVjjcKwez*vm$oLnu+?CeK%1;kyUI z`iTAj+x<6BJm($z$(=!RpLUA=pKLF(i=K0-eQ4NG2#%WYTGntY^-ZplVFl@wlmuYY$av=7c&Q`; zCn0}qQN66jfrmZ5_;U{-ZeGZ!8q7nR8#*fqoIq8lcOjGRxPDh)3VHJ)kNm0bE>&%ERxO_Y|@i+g=m)*E9)ZK{5n0sT?N zA4xj&5^v|v^`lJ?iu@TN%vry1KxKsX9YT)2_jnyz!q|Uz$S^fVyZ>}iSfalLDu%+R zKI_T5=&1Fo=wOA)jD)0=L~lCE_R~ls44DgPTaP(i?qF(q?aByc_QE)4TLwG1p*OCHSUQ< zNz$NP{XfberlN1pL0D~ceo0`LucZs(1-F_udRQ#DSJ_lv(=N; zG)NdxobM*HGA+W{WoHNoJmGt^u3w*jSA{C;oNuOF z{Qz9a`(34yj!Rrc-@j{bL8)GpP1OZa(sLYjJ|M^+s`8$rZ#?$TQS-8%ga|h)F(qqu z3|IXG5)hbFsbTjFX|FAnz9h8o+WbOxLb*tGFyGa<jsT;xdMup2v{?#8lYoBTiUW=6ET-=LqFh^*5cwB$OD% z`xF{nzt4IKE5k`m&-Bj3dd~WH7Rt)~<62u&6b1s}{mp|*3Wpb~fnb1khxwqtcGqyi zV@9xca__(i|B|7}gn8SC2Bq`~gA_oNX46E@@7Go7o5AlW#=U=&o63BGB8(OG9dfVd zZR=Jhdfb5>^bB-y0(V$5ucSy{8oTVdwP#8yG*qWHdAHJbP8zg5P*!&!&VK~t9y!Ch zhp7MkMZj1O9D+6u)>d(qtqm;=dHUn*=pmc4k&vMDH*wpKRbut^D`LDIKNv{IVGcD_bk<#_{dn~eI z01b0C(XE}&{;To7m0N<`9b@`z?EwhxeyF$X`DMSqqoZJ1*!5W2k&R)l%ip4S*y&oh z@_)n=iLc#ylru+Z@6K>o3{g4!4+pGv6div{(;nIJdou2oA*)SEW7F=q-)Hk!3}~LQ zhg^+>5|Z#Jwu1qiYfSw&sXf;eh~F`z-y#a9@k(u#y7&QbTr4aq)&#Ye+U3sCtEv-?e2`b6F*CO%&u}Q;&{MmmWj?EiYm|2kgGq)I zwb*YY`aM5q4ll}`rvhbUBG8~a@rc!)d)qxbO#V}zdSTF6{Rx;3iX_M1G4anNG0jqa7;`h6HV-9B)8eH?=?A9gA-?J33(tShbf zx1^}bQR{&s_bu$0Y1r9=f>4RgV!%u(%`E3`Mon#%nW0ODEyewg%kk{L+`dHAZ7iNt zd(+^wZ+&#_Iq(jX`0ozP#D?)qW``z#CsMCiwUZa$K|pQxPRXNUKn(`QfW)}T3Y{oM zi%Y;~D!}jTR?@cbpkU<6q^~nHOSAv+3iv3d&2TXIX3CfAG(=-0R36~=zJFy9#La{6 z8dBVBd~I#8bRHvgdY9egu2Orrl@+sM$~11y68f-A5(5U6uwS!5L8q+%zRzf58vFH8 zp|7tR8+t}C`QB>tHbRE@_?FiZ&b8Gl@eF`BfGss8TONmRF$`i zVq@`o>lbb_mqEcG8uA=i@zLi=u9-1uJQY(=lL-ShsoL0?k13oWFt(>?sNM$4m+M*5N#@#|$TY_GtLzF!gih{k@W)$O zj`wW?GT2isJ6fMVhwbT+gGqMt`(8Gkq>V_g|F(@eml#XeGmV}^{29=*@K=?4hY0)X zW}VCMo@(uNT+snzi5l|~Q|{0#paKrB1-ryq*|=h|lW{;5x7FE$ibt23((k)le+rY~ zRY3whz8&HX(Y+ ztFK<&YbDGR;q*6k-WE8%^C)7i?C*7=0}xrlnO^Nv`-MpmYsY2DatP*zYVS*X@d%W$N{b+91M-fpJA zM@+NU-+i7r4ORPuhdZs9-@!91GZZ+tzRBj9ZN1Lhmd87)lq+U|b-kYa76dfGwixWs zn%O+hNNJ~1dkg;|(9KLQ6T+*A+W+(BZ<<*e(Ys?kq~-)FB0fDyT@PI8KC9g>%7)7* zX43`R@?NG<9f^w^ME&qzQYiwMnHQG2!|%L|Plh!uNiX-5{O32mX=WvkBfN8S=Q*Ke zl7cjgR4r(Oe|3caKFj1bu(4+uDB6&ivtwDlEgbLmJN8k=7%Sh=1}*m%k%7tPh)log z!}=b^sQv|86BcG)tsDKgY(bqW{o2+O7EaRT$p#8r73LPHJhCz6Wvi(8p~YmUAeb-+ z9PQv#m?-8xNvvo)CZ6H@O_nfCa(L?G^c>|?@Ah-L8$LYV>1!=J=0#`lV5-J9&nSnHGA^Rs^8 zGqk4qJyN9RaY$BFmbaEjADydfFAIPFFOlX{`qtKWtAx51_qf<iGt7avX0sXp!-~FeweZnr? zu}4f5s!#j9Y#~^&=w%x10-sfwXhk}=BI>OplF3_goFE1{1D3WzvKRW zuRXQa6Dlgj{50u|$NYI?Me?L?B`+kh(&dC56Ls*+wwf7Uz#2rPk|)UD-uYq9YJOj! z8qZ#^*g!##v}O;m-t+exUwDZg2j~%x)KeZE13HFMvqS~(zFx3*OLKw@tuhg;JMphr zrWi74p^MVxmw#`C&aEJ#r{v^#i56q0vv@6_tU zXd3FN?XmYxy0Npzog+8d6HKq>@m2S6Q`3@#F`jQzYx4h;6{svXuvMEKf|Q3XCy(8^ zzJHsj!Rb+NvOM+(%yfs|8cp8Dd8ruOdoYYV_64HznH!v#t42X`G)OUcKJMyvMqV2W}a89nTm?OF zSHJ0bhWJoj(Mi@2OM2Z*s#d+}n2GlGJ9_i>I^uI|&+YJkJB+)>=DY3=ty2#Bi{8`k zVgNZ3H2j+me?`@6toZFDef7Gzmgb?2<1Y2VeU%B~{mE8z|2jh6PWZ*b?uemZ6AXyK5TnTltORj>GC6t&A?Vhui!8?f!czmur1g zkAUeu!!1fi!1*JkHH~IlKXTDFb`dXLGhyJFysFWh-#Dmxo+eU!mfnI0d&7|ayw5CY zea-N6@mrYVd%*{kuOmJwnY73N-@j~aTRsn=2l5)Ww5`{g`2(}*TY^G&2^y2;q7DOq3aRMKn!!hvHgY12Ly21iCAQExJv zs$GI2bEcta^m?qb;SS1ltDCLY)z!RW5P(O5S$)HGTpR^~1&Xt{i7HIajE#nd3pAtH z=UKn;9riX24I>-o&SM?5!Su}VTxnX9`jy8OpA_vQ)%#ClGt{E4ieaX`>{)KLJEO8E zfmyoEt9;kcI^yRQ>NSdOWDmd+2SUVGPIfQ7vc%|w^aH$uC2aV z(ps?lI4QKrkF%{M`OI1@b=Ah(s@W{~4qsZfz+UQkd56PqK{_3;I_7*|uO(Z!Le)uW zRs_c&`RbQBRtrw354(m9r6-ey;=$A3e?NzTPcN94=(<-c_HHBK`TL8_?yj{X^=UX( zb*2e+6r?KZ<}1<|1C_UiTnPdQ&J#!8m?WE*#9;K#yeZH~!X4 z*OLkp`Y6$^Wa25Wj}V7_;`}KBrC}eT8~S%spF;DlPWd*rgz(LirOz5cwNXnPRCzgK z&I1gEn_dT*bsG>eOF#M=3$y|7b{4f)V|Fl~ysJiFA&AynW9I}K40xfJ1So%Xq9fHc^cQ4yI9KU?^<6E#=DIXiVhLpWsfy^ezPrDn=NWHi{so%244Flfzr{P zONN&&>=W)G$z~uQX9-Dggv}BoF*vVvQ%EEPJi)rXZ^dltqK*zU44!xrjJw}fa-Qj# zGE%qcy*!4qnLEL}o)_q;FLo!<^7}{MY1B@+oyRW*Qz?QT_j+&Jww7$`-nY1ePS_#t z_03S1u-+tUJETK_uT562v5X8kAioCa9T|hGy|47-e3t&$hEFj1c{+D>?s&~C_2}#w z&yVIuJ%WxkGDx@e?1#j+jgac?HE!{<9DxV@;OqRUN$p6YOL{fE3a7npjxSHu1xQKGk!J!Kn{L!tJl9dsp(XY z!OGkS1;6cg`t9VOAi^o`7yabUlLMi}rL+CijDe%Zp{5i1tRJeeh2|L9>A_I`V-KBy zbD>2C-MEfQUx}=fA4=Uh)vBpiz_jD#ds_y}dvB||z%;`-mXxXfCqEm)1l5qjV3Mu= zr>t?SgOMg?HOG6_6F~F8Q;9&-_vLb+H`SpS=htyF1wxEaMLTSBj(zsN#;sx>wh?dK z<_PQml9wda@EYU)a{TjKE0^e7fFry$_o||{D7%`f|NaHxJw%R@nqEb}?ogc{hW5en zk?$Gh^!%Yb$oW_X2RE?Qa@0xD;M55M&RN^pI!1X14-^h%V3VsH7F4Fq3aFR_IT`RN1fEO}x0&Lu|Az;&Ka}d?w zxZC1Po(u*}o}vcan$700L7>>9-G0|w)W*c32dz(zfAk+}IZEj_K0g|sQgM76)&Vt- zt8`V|pbzUqGJqh)sEo38{!(V0Qqod(dcA8A)34IZj*0o20X&xdHyT$t!pZ((sVy<9 zqa=`N5AL&~w{Ax?Y7Mj5{4MK?dG2?Hg1sdI$ct3h-yD)!d5ipYExM9S(}9F;JAY%O zwE6jwjG|=YwpPM^WCb}lj&3`oV&R5wXYfqyPXO9!5&M2)jN--=_}BE6Wsm5g9ShJ5 zytiD59NCtM?F|X|KKAt!#}TT>4b}tcsR2(K5U>jGpf2xgN$E21!)=Pb(@B=1IF!lb(tNr#afP5)_+iL$pH6Cf1DqfzI zzv7guS8ld4y7ITr8kLC6J5}=a?tifzn|PEXcdUlJwh!to!;N>KuE$F8{b`q;qV!B2 zG5d9OCP|!0(k*!cgZo~)MTI#rvS9L0P5(@?=?Z&V=>+%zBvaz`1)U+D%A%4GQhMt zZ7a&v;n>hP@xR-z2ho*mXW)4j>wk3)AN%+2dTw$A$#0eoBs+)5Ryl^{lJiT{v+@8l zOPUfFpB7qf#0Grg=nYRXKIOoPY0&;6C#hfA;|_WA^KId^yt@2pG@c>izrXLb$Acp^ z5PIepKG6Aw4t;}}62x!NjF94_@(%_ShS>Wks<1N0w6XRQQmlnlB3 z@@#_+Aq#3%ZYCmG!Eboqr|`f1m%JA1{Uyq6+8X!V$#m2lni{>|Ta1pt&LR%g0W&A7 ze(Co#bjasD;GBCkK?WHT@aq5vb$C9XRl6PL2ZR95p)*Awy=OZbohhx_RwoDeI#gEF zh)t9Cgbe-Jlinb_xPVB*emoOj-y~Iu*v{X*yb`;3L=a|haqK@CNLugTUSMt^KIZp= zi8bFdn*FZL?{^N@hsL-ivjy}}>%~L7aj=KF-p6V~@rxPY(v=F6TpyOOY|UoI+ADyK z9}L}I2#SiIIAJhX9EIrm9XR* z*o93$D}R+RtfTryZ<-jFynuK6xyI=VEg`H4v!OC>6Z=tZsc@ws|!J~gU$bKJZNf?m=x9FlQbSGI_{I7zImbR29kP?Z8?wC$X zhNQ1@VcolbGr7^4Z?nL#Hc8{$WGm&vAQotYEEbuUubr=jx$Y9NeI2t(=Q@by277Eb zYGOHie?=MQykV+#-d+=kZ|M_vF9#C3t-nh;meB~ay;H>oaDFbinN$}g*7vY#Qm#db zM3g9A3k84V--Ix=IZLB}?*U#O^;~>kxX0Y-Vb`1c`M0kK(~o2qtfkEEGFXszWb3zA zsh1u^tU^~;sWA7x1hL=Rcf@ynj~!f=N>6R(KfdAUMhUt`5lw8 zL(f&U@GIjKsuZ;aTocXY}=S z3S@XMF-x}iT1y_7v>u_eXotSQN8j$}{b){XI#PVw)06NOQ`v&9BzQdU+U01QEN}+w zax_+57B}CMP={oUJ_S-RfjC3-^SFN3`VZJbx&;wYQZ~oUyr=&z?mDHH6189J=#_&q zU*z|35CK)kYeSiqCvovAPSmj{MT46Y|6hbp|Dgf((H#f4_GaIFzDqfB$=W0ETgT{U z*lPMnALP5<+Cui2i)-`ejXHi|&`wY{H$A}UjK*a58P7#_9{-O5c%5**XWz>lIrq_i zmhLz05$qBnNp*95Nagqf6dm z(l+u|*GXc_#0)D$Exnq7MwxI|caDZt4M_TCBC`daqg-Sx{c?t`!m;DDE%V{D~zmbxRJ(|3|TGBTmN5Q zWQsyuuVHJ_3w0pUlzV1{M-8he;eB|L={fiDBZf<1K-wPjf<5PO#X|q+1~R04H+89p zk>E`X;9U)S=EaX+F?QrmjlD$R&ldg$Dl7*LxmK^knh?M%;{nUjoXYMA)4GAUNWDvR zM~6JToZmu0I-D)@`OPw*a{?wrVY`26FNWnUoT{hKs~h!jLX8aOU7TCWX~A-tqFV^M zWYtgM*3$5b$e0Xyn-C3dk+D_kdBM8%RI@8xy~&B)z&;GyR*Lr?l1 zjbQaF2PTv8R*dL_V&jRd`22zRTqe+lzQPi4DttXl-=$3N*V%CxJ3Bc zDxrr?s%Nd-_T*}K*Dtzk!U&DS)Rc+*pxX0Wq+IW?q5i(uk(MjR%Qm+P9 z9}>(hC(u%|qICI^@N!=V^7C58CNrD(HB-TthX{5q75S?LZRdBAUEZ>mv_Z&Tq<>EjTcqjdPWqNnprm6ZUK?SIm{1645Ot!cgwp zb=R^_7Tnd4JdZOvN@Yv6W`rq-XzqFWVmXZCHew)>CH0k)aT13|P@N#>_g9Y5U3~v7 zxWXkMb$ziB6BAaB+UFM`@#@5m-$?Y^o;5?poawPR8^ioQDp~JuTAFA0AIB=854P-1 zN~OF!3zAIBra!r%BE0V^5?f+jzIVu*6!=*CsX8_K_+MM5(dT;Y9nfV83;6CU6i;_5 z*Pc02%5oHn>y*m3e-5ftqPqXhw#uD_^oqk_*4z1wEyhjCRw|`?YlZA==1=bygbbP9 zTLMK7p-!*=lQOkFD)2E`t>5eOX4q4cL|mV^AKqkho##66Mob-h9<|i3M(=zqh8D@O zyRuuXjM+19w{gM~2=3gYbWGfqm?>tnD;FQtn(f07NlYU1Y~A}9&2N%v%%v)}L+v5| z#XNs!FqLllIMh6{$0P`vLl)-o{V$__nY0PKIHz3z+Qvca=HH?1`>6`s^vQealOnS3 z3l3>*u@otHuJ+UtawTh6rK45wKI`><#^J@B$28^0aj|}-^|@`ySUg96Y=G^)0@vSZ z$n(7{zsGgYDN(HXLq}&X8@u!cZM=m})!B^NnuUM+oTK>zo=Ebs?qrYsLQ5p7S;pO04!t*57_`55 zo5GPWtrUp-gPLRUhAiAeFg^*zij`yA{#^T|mF|kxg#X2#@vr&=@5qrzVw2;fUi@MrrS`wlb8Ta#9+T$~TS8dndi^yUwvo`( z+90_y=FIf?E6p}qXHxX1vj6NXc25TuYO`e??Pun1SGbDaag)QJ7{#ySjDn4Q_L{%3 zh3r=XH$&7PN(I%xJ=Em338>0Yx#q&)U9uC)19Whz_I&$qq*CoMo>|VulX0Ent#vAT zoL{UKSFg8*$do+HqfO87uLerI5`^2Sw@SXGG7mZEyT?%*;ymoD58R`J`93~7(_P0C zb`fGaxrluQH<4u~BPbRJJ>{%GYp;IZ%!beimSSI#UwNsc|=>&o}ClF z)KgJ-KOX)UN>Y0+xtAo|bGd-c(Z${`Yw=ZD39{GFVVJr48h2d zkXoVfY)PAEa$uo>YwYwV|mTO*@($pQe-LB0+d@Db-giy{PG@;)Q z_cK?2_uHdbJgz+=xBITo+H;c$1n6-hoS#W*Rz1k?bIUtg^hL^FH%Kac{s|Tc+dp&OM%#J^Fz!SaJ(5=;=)jT z>#yL;Z_y<-ReD{ncVvV%sQ}-a>KVCb{)Em4(%&$1pOsSy@zd24ByQ(X0M&2vo1hz1 zns?UwRo0l=oq7)OvtLUyhC4u{OboMa^#ez?o1uBaVKrUvl|FG}1kg)aJ+@yj(EJ~m zx5XEJEtMUfE^U_s(N|mn(vBibc4wFA*k#yE)#+%39RN36ezv-a6wkEZkivnJN<_NK zRZk;tC6v1X{aI(YN6r$$B0OH?ko8HJZd+ajhne@D@6KpMhgiC2`uzR76>*%j$Yh*S z)$Dbx#*hDg2l1Oghj%oPuDO>zYDJ>J^QstME)aA+(@w(geNvkCfkpI>JdG$f`}^za z2{$mgP72{qFXluGeg8c;*W9u5#jdP&tW+kTMhkbXr^rE&ljeU)jH+?qv|fNH8rapk zdWMzn+w-NwtN$>xRwLbEUnsLtJZWe!yqg|9Nzv@nZSi_i5!4DT>Pjj z^^XglBqfx(tp+_UX2LytZNebe=`zqj!$LUWt3rv}=!X!X;9fI~w#nm8cltRdhArLJ zTD4!!U!!SW<42EwlOb|59^P;9=S-_~GS&Vlnv>V;bd}79&D6=6 zfS92$!>??{L*535)AR0C^e3=MD={_9v^f}#r-R|id%|{jucH=cNJPLA9khNgA03;{ z(?U{mB$%gncE(5|_@(d=wd}9Aq;-H@vN{3M`aTUFv@nR!x{pUVg7sM~0|qB!*3~$o zpL-pxJqikj76SDgV~A7{Q#~xt->q!xi@ig6AW7-Q6f|fkCz%Qb2#F-Dn(P7ZV950N zsJ=4&s!RWD102$0CNKh;EsDwVxs+p3SS*(V2dU$9R(rh2w(etC#GYv?y|H-I!;-jhr{JbyD}eN z;7Rn+Iosth^4Qm6wKFe%Pfb)glYbORkV0h-68pN2g;_pEFQ#XRn{=CEXr&cGlVR%p zwrS!YXYP}~Evd`Tz_X2lyp02la7^|qr^pg3B)8>>vKBq2YBFGYio!kc!BVu-lgz1< zruePKceUr&!Vr2SPuR28NSNj;1Y5Y{*86mFz^)C`yI|p6JN?}k!#jt`rV9i`cNMzf zA&tKUaqmgsnV)o^-wd6<`ZI&uYz%@i2OEqtfd>b0IwX*f^Qi2>*rT9@WMklDLza!tQje1;;XAqJBoZwD#I~ETHIIjVTdm&h_@hhxsi987RBUvS;RIbD1Z`G)W%3 z+>RFWaK%|r=S<0u9I!wFwG2;Dv>KE>dBiyB5Yhv4<(UmalYEvBsp^=%$V>S(D@3?hkmTir;de@n z*~W(v%>x@zMkIm&sw<%R5k~wyGBgYKRufW-De=uk#6Qf*;Tc~&a0G%CNx&xO72C;d zyrXMTNSI`-L8Sk&vEQ?d)CeUWz}qzKdr>({p6ln%-tmH+B|Wu$TThtqUr~-&Ht(2P zjxO4u2Iokt@e0j(R&{c1QOm(U1SGWTpNla!iN43|b0jw)#*08r@0{x(%w`RsQxGVj zh~n+4bKrNS1XW3YOuFv)TH63TY=LLWypyP~m6QL)z;~q64{L3)mz@dY>tWfPVyR&z z)VVwojLb+~SOVLB%SkBIgi+)~sFEWo>wiK&ibOdD$h-%EKUBF;~KVxxchkBI)gwci#eb;WRJuWX)( zHBHZ`-ear+;aE8$8cVw09L{ZB$Dpmrl+NgHieG;xqD+pCph?Qp{g~U}`(Lui_ozN; z99Fq_qQ0uRuMFE3s{H$2Mm|o8o4<>h^`@Y9UE%WBvE+np(%B#gH<-F*MM1|POebDY#uTsBszZ)GNX<|n+S zVj>bPKrv3i%wM*h{s{T4~R^|D4jT7j~0UYLiKnRq2g>AM+pT<^YE*>|6k z0m~SaRG-4vfuv+LvG4ftZ^_rm({(zd%&02BwI8OQoOg8`uaLv$k9mT&rqnz|mK7H9 zP1Kr#+}>3iBqZrbd7^g2Thjwu{Q3)N!xTtn?Y(C5Nh%dt>8!Nh>zNqFMAAl8UbCgW zTU{@l+4THcdZeqlh9|G~y~Em?WD`q39(*drJv!u;_>F(_T&+`Pi+rPRs&5?E-gh?T zd!pGn7j*v0h$M+`SaL#BEfpSs4rOdM;vf+(!L%m}{SVEyri#do&E)oOb=@Mv`Ng9L=hL zlk>%(r_zlkt(6r^&9<$zB6^UP#Oah{YhSr#cU-xY?VTn-5A2=o({M0r)Bi`+n;prP zBg>Zmhl*sNLNE^m1^+BuEVW_Bm6q<7m#>b8`yK#;nd(wnknw^G!%JaCr}nl#cZI@U zUHbRFIJB7`NlDRp_X(Xr7#aAS@nf-T;PDUMmY58)KgzR$gshy}YewAqG!?P`r3BkXtXFiV$64HD5BYGClA{<{()H8n%$A z&9hqhsAksoLeKP~^hAr7T3CgEsF+3-^aX>WE=5Fxm}E!U#09(hl``{Hh4Qp{1MDCt zsbbg3z0Uj|gjI}x1l4O^o4@_Tq6lynpvb^|Z>3KUqH(1u0zVgLu8GZB*4%)?tnz!5OF zO62e*5kL5q1^$q;yYsW`c!CCjlEM*8tCng=9pKZ5PfEh^=Tx*0i57A(RUG zm^+h5y`I+GMi+f*rpt%=d-)FPOgM0D(pHpI-MxNY=_p8tL4?ec&@x1y?zukjm0IVai;89)C6-xl|qDy$S|lKx|4|cuqHzj zlPTs=<0RXF)tx~T&_&wi(VSE+JdPyDK&11{d?d8%STY3^SJ9ZFs++_>DpMPvdx(ex zX)WT5H9~t*&HXO9fEVwOCvY*Mkdfn^MYyuOlJLy-R|gl+=bVWa^6wOQytjy|13Nyj zRFZdVBtDq_7j|mxBaxsTL8ta^Bo@9y+ZP+s&%LsN_R^Ztq2{GQV0)y?R{&FfVU`dS z9~F7W3VqW%Y#V3@-Pr&_uJ=3My{e%eCnTNQVi6nimeFaG!^7F^MG4**`G_Q-KVKq$ z@Gv`E%J+GD!dfTyNy59Z3@s81y$8%Vi}oP(I`?;oX_hH$Vr`Os#b_vmuJE+yP+$~_ z2&lL5tu#<2PXhy0AJGAAraIEh4azCA-gt%qXHKd3dCp=g(7Fa0&Fr;s=@l3J8|P0P zM;)biWTD8vYO{Pl+FXR#6$2NOp#37O&n;{*=_ zxZ_s1H7^;vzDAyeHPx^YGWJ(<57g$Rq~>53^+T0|!7{STs4+nt;@lAf$E&;piuG=x zE&<*LEdE;}pj4rPbfy8&H9FS`fft3Xi9K!b277hHQz0oHi-BRmX))%8ua>|&QGvzT zeZ|C0n?u8;MxvchuuyFp@)mj(Pt8`6Qr4{-WDH(;a3UdUg7k?TMktj}H@Yn=i77Ql zGkzt_$oNOda~euBu6?MjI2Y0?r_yO+ll%2r(og-QiOXgjz-%<$2bxX=Cd@JdW7Tx z`G4P&z6=j$+6V@c4RpsxJm-49PXkUv3hvfkf#knMsW}9hVYUQxug2U0>XULWXq(Q! zO>AYDz6(Ys2A8rTIq-t|9YAGZgf)zP{(jDbDJ>>P&pww&(C{Luk+)smH4R)! zF`#aJ%NUr)xRZ>3PyuXQggs~<7$>C!n1W7DwZ{H1#FY4bF{-Tf7XnNhof>F?ZWu8k zU`_c?fel2_;JAHD{P;?-qw_uPVcaoka4^b@kV*WOeE1h7&ym-WUKKN_*5l&vj?!ns zbhQF@!fVNGr=P+W?_hd;*i{FaB8ey`9EJV_>>n$Pc>qu=e3@9RU&3k%t>`O1;Vt%R zuv%YRY-@fbWX-eY$E{t&s@OvnkEzAXrLR7OGJy00+Hw=(7p3Ljz+4(%irQ zPC)Vo(?~Ljdn$P?4F(FQlNs_PygYq%ZwI-wY1g=#$lCWh*d-*f?NXEn2m>JrOAoh_ zjYN~ao|PD(xtU^h{gw8;1k;jN_}KC0DBQIM2(c; zlyw}!Ui9!;@^zz3=|t5*&pu&$+CNx$=$8*BB#CXe_$LnU@=lkQ@3@D_B9LT;i-US4 zlCBG7iQ!btFz(GHK66J9?>cj|$?k$W?5EOgIPz74GNx+Ik)(q#!7xXVc zi}Wrfk10*d;96~`D*^Z}?2tp(~*hld2P&oErtpGP8UPC;@IzKoGS`NAn{EO%e zu(n-yCorLbRbCsG4@km7Z?0&pc zh{UsSXQ#~jr{+^Bjwb&&(werKoT? zy`d~&nmK$JMe|T9Qk72^wf(s%xZ)xdq*+h^`WI7#=wqn{x6KE`B4Lxw(QU~6T+*2 zWBSy+A~c9>_$~r4h7Dbq0J9HCKet3876`LzOmt}^3A;w;NuW7@z`*o2Xs+D)o7%(o zBeamPvrZN!0A$|=!kdL&Nz$PYJ4ct40-Q4f(TnkX4ee}nWGS3@GP^S)1m2n=e;wJr zZUE3XfG5Nb+?eY<3w)%<+*)*5koOPzc3D`!dxT}yWRmV%0mCl11Nukqurbn%nv3TL$MM>;K$!j54>n^}!eCBdRJeF1N*B%<7k2ma8!x!3zxt*kHQ>XP8@F7R!&hg&S`5* zfFfjx%@0x6)Sy$G()%s?pHJ%FYx0q8&`4`>4Y8K1{Ro6t6vH zlmEc~%ekh8hS?k`a`H~sk}O#`)urc86i{I*R#eKQiwx5DdeMSms=RRU)kw;HR5j}dh7h;W$e#mr3He=MCoEJ$RL+gCJ44R0L5U#bd z&}YE$uAwe42x0Sz|2&Gc^=MuJ{kR+D{Ree{k-bT)wLa>GAIEZL_7QQGd z5dU}Ls#+LmP-rO2x(n!W0#pk;O{2G|mk5AJX)6N|-p(+m)}ePa_*0RAXjE#Z>QVn@ zjUI=`KQuAv5J?2blJ$eWWffnpoNU2EaN=OE7~$$xO@$7aCxT4?mOj?BY?9#0f+L2Z zVz*C?Oa3!PjE*k7hjxdvgSu*!$aWmRP(-sAfO(l#Kbvf60ZU~X3sn@~HRYuP@cEUN zv4d>sm1moSOm?ZT1j#2328ylfI}c7}pVK$MoM)dVBw!O+6BWMlNwUbgSE*;}hGCPB zzd)ATdxKFFoaTWEl0sT`@(0C8enLvwPL_Z1M3(TSaS4>-f&^_n?M!HhD64Vl!3 zxveOSnMDk5zcIOZD+i_&tQVMN8d#a&yAhvBt_p@kf!=1en-qKl=>Ug^e_?$wFl&e-jshRjdu(Ai zF0CG5s7QFqLo&Ov-XqlX1ywZ^xo=Sbr}MTc%cJjEtD`He z%Kz0wHr`2Vn`41s&*uf%;r5?&bJ4+fENaKon$(BjoFsO_LF^Q`i&2(M8W;(|i;|D~ zGe`{igrF$0!vymVs2l)oLAqPW!x$?&*qUBC-JL>%H$P0J4yrvi=C}d;_bamIB9LeJ zh*Kg7iAVGqoIKU>oK&O(&u?yK=C-@*JIZ`5}ngsYBxX3%Q5=aNF8DIwJaaM#x3p@(e=cRD?N!1+7KD4}qvG-mK${ zKWUxEdNF^*8U)&L)j19c0WA$ktFV@rVHIsv6j7ysDhGN!D1T1Ot4Z>Z>R#%H^_8{k zf>jWDrdBh*7*8vnRgM+7XIanlL3+2A>H($9E2aaeQI%kVKZZ%?Soy_lFbV8~w+=P` z3O|*w4g%;7QV^C`Lx8u0EwzsuHLqB+cx3As4z51teN_D!ST z@53Smf(G%HAZYeDCdk=|&x>Vye1vjfNb1*5X3VK)Y~A#Xv=R82OYIT=NYPX1J8*G+ z>Q{M67tjpFMBn^g$~xxn0J^0Mx=*OGhuqw389FItkjhd#f{AS*QXflElT~f~uIuFcfeE!Jl$UTe&k=?6`sN57ap3kcRnx~Czs9?+Aq}!t& zJX3>KBQKk7BQi?n(xiQC!+^8!sJ7!st;l%J?l%!{i+!@`I8uX~t<~tQtc!EyPBIQ% z&1qAs+)Mz0dBu**S)mr_&a2=jZfn;y8Wx1TPE3gTy(HCOAw$mT+ri-& zhMW{k3w?)_=+&zY3HhG@L;Ve%; z+CmlfMOlZKa(s_6mqCVN1?!g8f#$Iliy5RXj7aNPQ#><1{{qa4yh zc5wViHEU^*(}%_y@Lo7utw4-31+T@FP%FRqnrpMgiifB1ZPA)!EfQsz0m?u zSFVcuM_(%h%kW;%my!+<`#lYBTgLHliq(efsixbU2o*nnLq3UxT3BA*75HN-uh%Xb z*3m#kYKv3m#uS;WahPl&FN*X@t|Gc^Wk|gf+VqHLtRCtZb=B4k63+?K9%WElipArw zVSJpaR|v4ht1M8JkLeb)BX%VLb??bX&V`R5eCux;oEnu%RkTuTQ)q$0P2`ewFX^~? z(&EE#!cW5HcTzinQj~%Mul?$|LXyWjl<$g_bEXbr6g5#Hbb%dz%i-}C_u_Bs%u%zoujD>Z?ys)vpAFWZ7bZ8bA9gJMJzPr z7QzzH#Tv1zaVX{Kg8o6EXFOaq;mD6bq~h9;e-KCL)B$b7WXSpzVTtPdU}?rR$0gyjN3+^KjAgG2$G7h)mAY9t5o`{3g>3 zcwB3gK#+EI5XrP_;$-kuRt^Ga+#WbDD7bgA(TwQb7B)+LyCXjq#-=AYpuoc0(Og4q z4k)ZD8~~=oDT(eu<41Hl1#mUj`p~Bx^YISii%E5O4{q`Dq^n0iB(-81U9%s^jMIQ!p{jV7n7U&|*722!( zrXhewFH{uPv4Z+?i4;GKFqz0Z=@ZTnma+2+hE)AM zLL!Z{9U%e)yL=kqv!_Tyve@EQ=8WBRnEEqJxThDvoV*kk|W(N5y(w=Ru3KOK&9QG2qPS^C( zRgy6<97t#_C^Q)K4V|a$!(dhXC$2r^3@~Zt;CV2EIE`8fe9OG~Mr_Pa0C3=ltmwKT z{a|rdObKTU4ja*OSJ2xl!3oYF(WivPiWw?xb9Cw@+>-19LIDlwrO1!rm@z|X#bU%p z51bHtxcx{-Q}2k2E$3a)#9Qg>LG9q1*^X@Lm?1recUmD^WmE<#)oM!P#iQ?>p7`p*eNLQ&ilcGwP3l z(F!W%Ayqg@d?BECmjq5T9Y?_8(RNTDmVTFlOd>aY?^$FoCnT8jIK8B#Eh+a%Nj{8n zch-iA*+x1C`rLyKsLRdy$%m0&3mv4lJgm`f-vrn29lr6*A-WJHO+mfkp|8A>mO)O; z2Q8tgSm99Z90>JWD{=v693LjOFz!aw!Ylh8uN+rHU|zA7Fpx(APp1k3$6eGvNoDUK z4wR@&h)(czdh8$u-l1`h!5FjX_EFykXDJ7#7!^V0_@Agw-EBa*sTn7{!!0480bmJ^)em8>#t&tq4^0^n_iY7OhyZgr$MaC}$*iF-+exeD?biqN!(59@}ZY1naZG2_V zhNXFnfJ}l59kCfdQF8%}mt~MH)bn3{DpS5!6O$$L4y-e(LxPyFWYJgZGZw;W#UT|i zPYQyffD|gir!aSt=3;(uv!m2h>P>*axu!1b=+J4ZdK%6Mjta@l)auj)B%P0dwOon! zDhZKD72;y;X_8B_nK;G4rx;nxA05?X<~bQ1_g-BJ8Jt?L44IBf;U{hzuOk?h7#WyO z&UY{wOlU*}0!Dk9Z+|HwSPeSx1>59u3NA?pk=x(IFI4-!h!1d9$sL%rKO` zZR`M;Y0+RZbes|J%^GNsd+`=Y0jny5b89Z<@F)4BC4O9%@pp60WHF7_Z=ypkK9U7^ zk|gl;FB%!uJvdboY$)aZf{8oDakwb8G%BWH!?4K%gHcu`fBkk;#@5U>5zzGPaH7jp zT;ouru_+i8ilTb8fHs2I%6L7hFKWM~v~A2f-(yEo8X6dKQJy z+VWvIQZN9kn*-%FFBnib(ABC{@7&*f0qs5%W&jI2+O>SxHrn>kW_OO>=hz#eO#zyw z`J1!^vI6jJ;gv-m?#n&5vP#B@y-yu4vf)0%090-y;4~}FNn^T262AhWfZWL++30U? zMoous_jm06lgaV+ao{PhU}F<2A>3uaTjkq@uVIA@EE*eCC>d>%dxKN!6Di=5rEx-= zs@?n>N;#to_uk9lp%;7@wZsv{Rv8PU#7>VZfV1hV{qfZn&*kNTlm?SdH7>14*FZ30 z2D(YeGqCm9lCr+&$AbkGP5s`_{tpR>oNg}kx{(m{Zmba#AhvNDVgPV=TpDt2AVDHS zI)5^6F1j#s!^lZ#p9^}~a1GrC9cixSM>K^t^KLwDwYArWi$Kl7-*^imx5v-$#15OV z!^8KgV&0?As5zuGjIo~@SE@a`c0?8o*(-z;|Uir3A|3~0wd#B~XMf32-rHPtdtFx|3WC$TGN2fzYx zmCeHKA)fV=)L#SnU+-$$ zmZ#@WoZw&YI#Fyjk=VKjk@3}RV!^_%DHo)fkpF5(Pv@K^h%Z-Afgdb1p?PFwyAlGZggi+jM3%uuje=_kXW?RT%Rq3V6zwa!{XO8y(8~`t`16QSdd* zBRYFjy(OhKhpq?s2TtI~@cd2M1jQ4+Df~$@H`vfI{>aR-VMnpM>1gq5rz{e#VI>hu zSgmzy@lk`O0`pFKHOCvlbS-U$Oz9`}3Usj#`!krO7%sohlHDk9Pl(WJksz^@>^efNA|w?-Yr zp?!*3!F!qC4XF&S4^;SKrkxuiI+79rMeTzi0w}#)eg>dD`}*voJRU$eiXA`4zqQ4h zkS1K5{D$T$Mcz!JufZ9XC-^A0fkr$XC*yJb8cwmRTmt2ne$#;#QYH3q1zAW95qih8K1fZ!>_=X`w<5E=Rga@F==*)I zE*w2XG2if9w0O5gS)=b2}%JC^qSWD8*d`cJ4>g@pcQBC#5HZx$l`o z7ePY=Xx?%+kr6|9-_)yBIIPzeYaAP9p$k-R;v!OwUjuE3c&H^3M=W6nTVWNYl%g-} zu5-!o!AR~s6B1MRd>@fK^HNn{cQ-;6c)LmKFrw6Sp0j4uDCw9)!>3{Zkh=HHYK+Yr z^FMZg6FVC!Mh0n&Gn&gDc_@|(m#zjNAXcInFnA@W^YvEEOY+YljOy*oI7w&4`nsE@UNO<@YB$VW*xRnY{BKCTclu%*disJ z1bp#!wKJn4B*NlrCm9& z=(gfh@N#fqG~wTxQcuZ;=vuqdSN*3W+vPDtOtZcFt>0*I1PF@@xriy(GRPad5Rb632Mae56Nbxo*_^+oVZs#6;JaF3t zdKd((3}u6YjGEuh#s^8>MKL&X%_B*}g0^9Kv@EAEEr5XM@YZ6L;E14x1vpBai`ch= ziLidut5+K7s}oWqAWFkvCkN(@uP1AYVHdw3Tu=hy@&k%qV!@)T$dUe0yKq;(4X3U^X4LMzrnUINH8q)EdWYq}kgbC1>EAc(jnNZa%5jjZXtER&el^+!5;NkWB#K`PL3bq3GGbOIR* z7=)^F=E{y7X*imA;T;JR06m$a=xqfXxra}W1jh+d4XJ0qSN4`k1+3VlBBPDJ`+O~a z(eRPOt@2IJr^#(m4I_);SJEVne^gP}2?pB{Af+~*IngVy2capfN53Jcr+KYHk7*^p zv*(W_+=m^1Vu0y!BehZtWk4xd7vF z`L4B_M-TDRnLKQAtOZfM`C~xIZpmh_F|KTGA{tg26|?VkT=ll%SO>77{#fI3N zGz1VW%D7?j%Ah49SJ9{GwhTF3?K-{{56^ByCh#AvQm=0RHTnWllxY;zJy zMOC{2NQ43BeK8Rt2z^wF=g0I_bQJ2!_c#Thb`QBYSq+#ml6=H$&T2q5@3%@dfL&-r zqfg3XtRD@JujGuHRd^Xyr_lCL{`a=&u3kzgsAh2>J1@GFl~qTT|E=yK)YZ3s7{JfY zh=Nw(y+NGmKmq}{(#7hZ_eFLbat|(BXvqTjl}_gez=NPS))3%>_pa!BO!kDhX3a&I@g<*uN_r5KQ(>1DtroHuOY< zDHlUkWV%v_yOpv?(GFH>-Q0MXrdI%bh=k7Pa{!Mzjdm+mLteAtV195bYTM9j`L$zK zSJJDVTJV!8k0*u!1lxq2U3a$Xxsk(d zdWDClyf^%1{JnrPXoQZ-4@&EW`j)94Y6U3+NcC7qicEtAtsJD@#P;5kRl&n5VtAwK z&YVmfq9E%R1dVg@kk#e3A6*_*(YC{Twti$HB}$xQmWdhwtka!*RTXWZ*@nwAm>jvL zM)l+nEH)~{calZPz}^lZ;kcK>pnM($2D2=|TwU>LQr}7CHI)w(MGABj;YDOm_zrAr z>{rg5c3gj?53?7Xq5c4a1$H7FAb>0&i;!dwC1qv54XeF{CU4Oa`j{3{1J7gh!SAw-Gc;M)f#$`<?A$^;3r2h()6yT3baB z__uY&=2{Q(1p#LT9X5Kny<+H~S=(YR{Yvh?Ukrj3{w9>qaOugn~nAVFdi^=_zf9)WQ-;vk^DZ zjty5G0lFvX1=lxAymU(lP(yjKg2=yNiEH-GDH$XmJMSlmow^=;DFp!e7RABj3T2^8 zau*8{B&T%ZanxjO@`3t~oIebUmfk~799}o-ct4o!;x{ff794!9?%qDAM2(3h6PQ?y z3nKy5;D%j{>Kru<$(KSTI*|PzeG9DP;2{U+V(DaOKzfh}$RKpFJv9@x{7+x3s(aFe zr3<0#ws5yA;`?5P{mi&bg$W9bj`BFOXd5%mtNfI=-M7%2Z;L9Q%62Wy$h+e^&!_;B z^W@ZV!g*6^bQ50#S8oNx4`~BWGWMzqDUlQVryLSR`RxV*t;DogLu8x@yeN0>5{;>2)_#f@9iyBJ2*j*v{hxc=II{IHIYp;0qzaaElne~Vq7ycP)S7bk+EJ=oC!=8 z5g5o^LCh)l7}}R*kl!rM#~<7a`*i&N*77;mW{<2^xyM*aBAOH z-nSZ4zFLX&OpXDRtd>FM1jKZrv$tmWGZzb4QNhBY`O&N7NkHPr9dR!kZH9icy+u$I zlI}}`ZSCAcn)PoHr-N%_TdILnd(ScUKxu|#EwI5i{S5{~Rmqax5YqBGNs|*Rr&>Hu zO+6BfFueMBXS9{_0GP64(PjXxPdhL^45}aJS$ars|2#^btT8TpkBV?W%sz>6jGIDa zQx(Clh_ew_e-x`N-WNDbPL@*OeX&+ww-FTg-tyb>l5zM%RL4nV?454!UF`Z3DMDl{ zj+T)HqCsF`h(QF*>{;sjtpWO>c=s*?h-ak&7EAcx(Axc8UZ&FI@rnR9Rvu`Meso1* z3O_h;0^62E1`!o>CRpEZBn;i1o}d=%Kz+`}v8=-^qoG>B@@_~5-Xa)C0d zU_~6Ik>Fg+CUq6|gcdrLZOnR_ZAo^}fOE5m8O$|Vidax+IK#%y!-Rs$!KFa-G|$d^ z{NL@6)#<8F%kv~Fe~*=nf&?$FkkWPK=DsyBLxa~b5%@k*nF;d(zKRQLIoy~VNoSN1 zoXo{;tBybPa}Iv$PE!a&YRSi}8<TOmuo%ssi};23QIu? zM+wFAq;1J=GTLMaaby~lFDYhM_3>zopk>I{youa>@nF#jde0e6c>SwQmV;dV=ur?1 zMb$4TI5J}d9u8O2n`yCqSY4*_0U%^VY#gDN>X&XtWj#7G@6g7U#6{t$&LzXt=bf)a z9I?E|GolGucedixu-)|Bm(X1=II0JQ`^QFECK{&!K#ZplYk}WkfV6Z3Wa6~Ej#hM; zT-BQajzgi|+eA+W-$!L32L(VpXp}4GRqzzT)Oc4ZPI1XJAc09Q+pKL^{}6y~QENcW zAUs0+IWq2QN!)H}8fRsgV`W&5F_o$H^?HS~q$x;I?jm{J=Wjln4$jzI2^!d+X%#Uq zyArT0PhQvcH`hxctB0%&nJi8|0pu4U4PX!089sAq_K2Nsn6n!Vf_E7qhw!(EyrtcD zlDu0KWQyQx!uJTV%zGCY?MzEr>)(N7o9+{z5I=;6tR-VjIDg`MWh>o&?wTf`l|qr+ zspXlwRIiF{RALAYXn8KMIr+ z`Nx;WWj&rve=Xp@O2c{l1pSUQIxTKs2(ZLhw=#)&p&H?^gh`Jx?B@aCkVxf2Ww=~M z#ZzVrI@5#;<(NZtZN4=jL`3nl6<9l?sR8F0%r_k6p3X^o`iGTK$^vA}7#9o;#1fVU z+hU29B{g^@>!J2;FLh%Itp z?RYbE$q?h8(xZ^2EQCG<+j9qv7)3o`hRPS9lW9p7|Dc#tdn)IWIuoB%{aQq{tmsK9 z1Er_S2~CnSDOPXEY_8SO9r>5{-(e}y;Kjj45L(YF-f|qF#$JN(dR%-ZL|235 z5gI%^TA4DIX#wYAb<=wm{$nVtw(=6c-8tW*%^JtR3CdJQhO-l$A$}mBdz>q+d|g>P z*#i^FcA=IYo+FlBm4tNEO35<>UYw>*->G-xDV4xH1gM>o!h;dGTGdvoLadb#Eyo^k zRYb(S;Ta~}!#$XO8hhtMiYOMW8-iD|hQP_-K83)8z_I)ZMJl4h!-|s&CiVkdM_0WF znQ2CR*c8d?NB|4k%WIgV1V(fSEpM{SJg| z;(GHdzL*dU$zt0AWiw?r?{+Yy$4v}p9}fxUh=1TEE2N?G%v6u5FpYf+Q}3vWjy2dLi=;5dHL*-_r0YP3gH09!gS>`7q=J95NePm&0r2g(J zoV6S}Gge`MP7?eH^%?$9rlByH4H@<84GguvrO#)|fHQ38--oY1IPo$xzw4VK5T;o1 zpaR^kA%NO4Y%K*&qskmTU=>`h0yI#@E7E84_A-H|lgi>hoe98Uk9C?u0R0qvP+!emxAFX@e%wW;bT{E zBshWArYXh-I)vJ<(-)p=uQ5Ax7ykUSh8!x3f>BB^LjSCzf`_8&X!JwdH0_9hY>rZ@ z^$I0dk3F5Df=XcA5dK}ZH9UGtSZr9Vfr(Jmo&pMqjqed=z?x52Z7B1ohW?xtf$hV% zg43X1Ubr$XxKqk}se|GWf{jId3RHanB10s3RO*xDB`)x$xs$R1D7x@k2~wDG7vJl{ z=%x^N3MJ0k?tIjh!2vGvK)AwV8B5fp!@Gsp=RwJ?B!iAB#R8nw8Y`DA1Uy(>g9E(x zIZ!N+5C*HW!rT8SN|oM<=2GpWsOFZKKuBw_-?Brbwv4{x(y{r(G{odR6~i~G1bBy@ zD*{}`^Q3f~9*}{2v?LG}l9c!QzHjxuMtYdhw@74c^^gC=U2Pt~1jy~x&t7K@lYt;m^k z^_Czxuip;Cp|zz%(^fkg(%{KDI>F4YL4qVGEFIy17{8Kr?Tlk;YgR-W5MRyPJSrIK4r^=p`E; z5vjwehXdQ-9^`Ju;YPu+q%GXomx5uFUGkg<}|!gwAOjI-Y%WqIijLLoU+wXqUB?;OxXCASH^K(bf&WDM44ifLfszDViA=*cLI zQ(_^W+moj<$d_GxdBB=C8$A4<;T29SIF6LihuJ)8YNSQ>3fPCE^kW2}An) zufNQ0^Y#KIOP>*Z4tx~=Sa>XMuV1h9s8wBojMQO?yRpRZdpV0ERC{+g5;GRZ4pfrw z@nBXMhmRtU5SBrL)SCF)0TG~tCn*P#V>XecE^3sL$Rf}#$-7lg7Wf={NFOWk(=2<=nlZ;9M^nioN-|Ga*ZEOA zkOC2pNM`=z(_cc4#Gs6MXneE6$}^xYF>9+DduC?`8NIwdU73uzf-g~Wt1xui{FGW> z?f6AKyp&Uk95JT1Tccr~eO|7V)C!Gg~(WraF-VfV-LD&#y&F;r$ojn3z{A|F{)TjKJ5>_Ol~;t zrCM_kw{#jAPzLUbF%8lj4JqFPV+i}E1CW1#N=l5v5ZH(6UY0yWZmD~7LA z&9fwcNo%`dtPq8?X~e*k((Ynw?=k2Gipd~Jj+apaheS^el?vLXE>TpAb#;jq^-6i` zCwEyz^P~={MfwYwglhZ|I#*~rx=4W$Joo-b-8O2-koXe`_xxHoy04PriG!Kp6qGrL zy40h$L&@OTw}Zhv%Ak@|@GI-I2@*TY^tO$t@-Yap{sDNHu6|HgO#xif;$)j4m$cs zotrx&VEhnP^U6GxsD6Cb7ZZ(l!$o5KtTKoOQeIwKrl1U`Y{N4ZBx6>^F5+Bsq4&{n zhE_L(!cIymGQ~Vi@zAsJAgj!bD9M#7f0ZC8n)4%WWwp7r-c#vDri+>QIU)#1HHjLz z=Gb6J83-VfyPSvRV=Hx4;uQj`>5xe41!0*r9Ks$gD>RN71O3*4U*cGCuD@L38@$3DvPk-J#mc2fF<79jL_5D0joGCcy3IFmpaQn)B#*oUM%173H2G(+I&-cpV9cq;5Q!dMNVxw0vI8aCw;P+EXC?{SJgQh|}=!4xeF zOh_4+vSL}}w5jautdX?QQ#KMi8?AIv51_?W;Y1x0rmtntCdtT#GO%08(uohyPb3kw zWzCBAoXi)hDbs6I}tjgy` zM&+Pu#2!E`v-~W1)MQoKSrHzRK7Kfi(U5dSrL3h6PH<=GVgk3t2IOjSeJ!4N>3W!W zRpG)v&eKB#So&*0_G(duH>aKu@ewS6TMk<)^HLJ5xaIY`Os>TF@;V5885i^XQ@ zY)`9zZ<~fmWfKTkM^MPkdpJ>inXRdjdN{*GONEEfKw57((~`Z7;S{uO1=v3Go%Umw zYH@^BOi<#sYtv$Qq&@gX87B|GyCIlBdYw6p5g=_dPKPq57ycXFQr2D!Lhyt}3cfY| zgrLn+TuQ1vj($sJTBMZ#%h&M?D3;l7L_P*gJsA2M54W1i*pZ2}eTz`-BY|_Auw^4aULmZp$2>5_Hj5f)Q&w z*AaRYb19y|Sz}C7g@0&lo3x#J4W;GXoYpvBPEwR*x%}{^7|G!1;8HIoZUA~+rm6-1 z0u!$l*Gz~fl@0IKEIm{s?;2^14UH)dLPL5CQw9sx0tMtP7dsveiW3CjY8)V8fOT(2 z4>?GN+z!Cv?+S?$)>=hXk{)R-y&+83MV0#(0d6mhFbDg8VRv&16~vVWr&BV{_5b1UF*+%Ga%nJSYW)n$1Nea7WDK(yszP&6|L2dtkE zL%j+2&NmpDXT%Of@!0|Y_H4dWD5J|@qb;}OZ>$;~(+U&BxV9C8y+H`jR07kHEc;{C zV9G+Rg>lE*E&8yn9x?3|sOpD$FGs!_Yjzbmi0QLtL3B&s3TILYaTsK9?Q060=n|aN z9{GdALg!iK3TBNFxh_{NFhwT5N6gPLbbY72{vZvyqCIzNybCf8I;tEOZeo-u3z(#e zQ{}}BN1`dA=O#j9<2B4v^7x@?S9E}C$Z5V871JAXsw*g$8<)rrlrq*RQMfh2R>PN_ zwD*zg9svn|eS9Q9o*n3PQiJdynRbXxa9Qj$I z@`LH5pu^IX6GF}-2wa%r=;Fk%Pab?~K3ecMx9(vHjz#bwo*Bjen1XA^2f*u6!>%YzHm0$~I6d;9Y5H4=0#*Dn zBHaka%ETl>Gn=MPuu}Ed5%JQi_yJ57Ykb-qb|A$Lz^q6Cl&M#H+m1rjDdkHJC@Usl z0>;R;bh42?%XZiIQ1i$mPMIZ6#P4SUT!QvM)bIHw;LM6?=U^nD`;ecuT!B->kYk|p z=@yh-Dw7{oMu|ZZ-6n#Z!BJla+y3K}Pu&5ytqC<*M+qe0im?8a$>VC^)IJv>n~Y3B*S7A2u9?5d2y*zzusyD2AK`GzxD% zX^3Z8PL|55&!u!e*Lt+wodE*^ea&!D@*uXzjG216n6BxB62V*?@WDL*=J0B?O zZTzy`;MydIf%>ZDknJkIkWg@>i8D%JjLLM4=*C^QZt+={#Ruml!9DL=GgHiw5u*yJ zl^e_N4db<98k>$&yOxoqn1ccjnLIx_L~Y(-7m9evo@qyEf7U z(EpqwVa2Z><1c~^pv%1X*Bx@}2QM%}Jp`2fj=YnSg&|AeCKtMn?TfrQoEIf!61^mw z)AYH}Ur{9WKaakarAhewWb}mjIa8w+!#HWQ;p|%FYOx=n->(8eopzzm61fvU(Zaii z;c{gyFql=-Ji~rEvpQZ%&3rpSm%{V=jYDB_#X5aBsLBn|EuCH1gi3^r{=4{H*lLsq zA)8kIMoYczipyh)Cdh=BZv~gWC_`I`-~N3CT_&cM#>)QQ$Zf6<3LVt=!uNeq#MHq! zg%~`t&O{Z;)rWjJIxj(%!N;%YAw z8lQy9hQ&JNs3_-g=_r_RdcI3XXtIReruKDufXcch{m&)E1YQafxo;v#f*h?o@NJ)o z7%UHIG&Bd0*V^T0(5Ue~Eg@9@a?0ng;eogu9f=3ue|!>5ujy}eabSW5(58UkRih&I z>Jx-~Q#oixEt~3hQrj-yDw{qF;ZM=2=1Tk;OXB;5q>@q5ULxIpeZ0(R zkr^j5k}zw()nd?aRDn#Zm88x{8lWHn{)@tb!%2-g<#34J%pSlpTlMyjSglYRfx{C~ zbbh1ErPhl;fAdCD5t1;9H&$saNYgJqvQG(BD5`J`c7SG|M&?Qj1E_glxP_egQa7f;M28VjUK*k__d27{r3}&2 zGNy)b(6`@HA4_(VZz*{JinJj?@-jO;!-Ctr-;+sW_4NFJm)8gR@xVR4ae{%bP& zBaR~Fn6i1Wcn*gF16L)Bp($N@o}1m1i|vx*4Une&ty{V!M77eGZ}g$<)UPhO4kGZ& z`1)a-hlxlrs?5gYxqWusW#VBr^xk$JL_8+hSb`qJ3ZRUNV2|+Mx#v~xO8#MsPm{Bk zx|`u5uEo|re;1nxS=kj2UzmG@Rc!{?;DBLAFI_Tw6`AV2Vq!7Igs$O>J+nrH^&By; zA$AawGZ-d_a0zSY#!JD{jUq!BoN?&h7jeW6y6mB@3SJqyX8t#9L^L?wA-HT&fOX4K zV3j8)gV%B=DT=LG=Ty4KEB^CUy^rwjv-G{ko?g&fzFBm2vh-y|DOp;8-*Q_& zK0zO1X}_BpoH;!fMvlf4_#QIK7Fs=DPg`q0FkWDPCzoeH%gBhBBU~T1q6fCKkIvlq zUw8pxh{E?*nbD@AR`cD$;|)%_k?!tG7u`OUGi94%4u#YHLMV}I(4U;_fwhM=fMOhQ z^D9>A_@=&T7NI&By9@z$#{Fvs+L}aSZ|gogB*_wDiA+tn@jgkukx$TuD@*iM`74#z z#96-Oe1S6v-jkf}O0uMtOQ3M^C*oE2Om*oh;zq<1`|(gvw#cDFR$aN#O+4x|Xx2z_ zdz@{JGJm8MK@V7W&2Bc^7uDr^D=`s-ltHJxh3JFo(+^h21W5H3es^l9dUv|8i2k9Q zcSWOgJ-7`9GyszyV0z;QC8UT6cs<6JHi35Publ4~*UV2VYUIDe7AK@3cwY%92=hWHQ{u6& z5|0T>FH5kdE~$7&MQF28IFN5=lS68z?uC{PvCao;$@uD5IqbH%xv1sh;w#*hgEGe_ z8hU?%V%aocN>yb>Wz$YUidZdWtf@DzSW$yYaP2{#6Ah=oKpR|O;b6ycKBdW&iJj9a zyd%~r4^icc9l5{=H(c^*Y3lmR^ks46q(g|t1%PiJ1e@p`P|e8b3qTQ5D?3;Z;xb{$ z(d#U-}N{A#1Vm_<@Zw1FpfTwQ~i;l+gio7VqnNg>g}Sv_b)7s z&K%DLfw~c1O?EUsq*tn-2F|DwwoH|i4JRfGZ2KMz1Ga!4ob*ghAUtd+g4Z3calLNL zrwge8=YWH2ZzYyHe=1lYX@BvGt@{UKPrxLJv6GRJ2kcVfOoR0xz(>B#bqKjN(wg^n zO|HbvQxY&eIuuiG@99l`{X|>+nwHB+y)wS}Ueo%EsB3W=U{3y%^?VQLBULcR!_uww)4DEU_ozN^9Oht_1#cM6m&lG%- zaOorY=9dFRM}>*&+jwCM`=O!R8K^0PY}<6^#`^-s15z+Jlal_+BmBCOwg`wUfuy1K z)uf)40#&oHo%5T1K+ZnORiAtPp>=eH%23&q;*D83{R~P#uU~~7=?6WaeVhIZr%aj= zJ3?EDjRk#A7*L1ebFvJ!a~Ru{QU?*2r7p9XUvM;MNhaX!A75ElL^>!3hlzus^vQcX4Wr1`()RQb_Iu@h_=&eRI<#gh2U zuEP{f+8%=jws0evkoXR%3}s8!UR^CZcz08Ns^z$j0o@w=B?kz4O9`yNPvVinDE&F_ zodD%&&{yy}v)r}&<bmGGF5K4(?@vJ=VAW#Ad@V*rq zyF6_bWpZC-1~$Q3ZX6%rT8WWERXY=bkNQ{srS~`^go|&bvYPRNa>kfWILMPzHmX+| zzn}ujNOU$81Fz_-wAc_l%(hrg24_P8<>0@T;($D9%Ej`=nGX;)_uRpphAcax`=VDt z4+U2YG1k;NIBJq=4bm7cKFX*)zlVhP5QB-_tS36jL!NX}Dmn`yQ9CJJB{);@ONYM8 zjDyaAj8xVB#Ml*ga4bh8afYUk%Vrq@#t9V=Q3s2pJ5QvJ*!V%3AcxK^;-jWuc1wFSILK2+e2LxW=zp)tlsrUxdaR3h4Rccw|H zD<1@XG7&fNI1EiGPgUYP^2{9vP<8NW;B&Dio$T@({T@~!`ZNf`bU`K`h0qpBI3EUM z-s4;pr7E>Rl?I$ijbC>}_k0K`-95mE2#3T+U5JsnA#9=_(EuaD7B?22&-L>NeFY+a z81c7qvSylcBTFL4FpTv%{ama)&`RWcp2-ncQCP`OL;xIYe-;*FIxrXFHnZc**yy_& z&+nxjO8P#&m+USOX75Uo89r>PmT3WjiA9+mZJZHf!-18KER-qE@CQn$2$}E^AC78~tki_hvTu%I~J~t%FK=U@*Eo9D#a2I!x09}s4 zSc*L7+ma&=OD^_HC4uMln(n~|u+GGS;PT_2MQ>q>MDQcRUBS4;Zl%9h+CVr%HIy8=Gny+Jt!1|n4p8;peaFeyq%eh7vaBg5UOI%V(I3bEksvHWHkFVXi>y-dhhPU4AgAAk+kNnVZwBf5c~Y)OgS} zbQA@;3e*`y9)N+3$uu?Rz(7V!3N7juHMB&wOgj;U)a#bb_hH3+{8z_r_T09EhIWxK zVlciSo<{Zdg@Ug-6(nQx?ei_&PZd-QEirhoT=+C$xF??U9r-10DaqoiMXpo@Hf_)O z;jCaaBXCJ=N1!Rc5c+qCtAtVvocD*D#bv4v%@&m?hNKh3K6@bmLk5|gc79`KLUIEY zMB%oz(00*pL3)9Sc8>P39c@o!`9h9|*Pxep)L~7N$6V;chgY9X2lXZ{01g;;`x&#Ty=#Rm?9gUA|NRC(m1{dURIPA3skk+r~|?|lQT@h^gF2U^R>MH zNx#|<4g(f(@3pIPl%dRAWc$pQbr&;F!$yF1d461pNoBz?>oQFml0JnukKL#<9*~C7 zm+*~`@;&(Y0bup){HWy`S*Fm`vV8X&Etd<QbvOHA$b<6t6olKK_O^&0VF{ZH}IumhML zgR}97Q5qkDcigQ2TUy-B zzlZTOHFi@bDS0wA);o|XjOCcSjP*fDArrllp;19y(_aor)UE{g~Bm@0V2i$sOTqj3gM8;e>i`Nn56HG6GY^ezry0DJo<_qk z3t*_9oX?>sZ(BGu4ja14V7sRH)v%3P%t|^(bJ`OJJ;2Fk+ADs#`ax9YZiL}=6nJzA zB61Yo*IFE5n>;1x)ldkYJfrpITUjAROG z9I(@}1fN-BvDava2@=KjhM^pwXmK|e@20|1&qr;j>bF-l-(ThKin3}>6htmE)rgw+ z87vFJ1KPLZj)d%eo5PZ0FYUnX&z3@B5iYTQQ$OC795)ooOuC!wS%2+GIKUOkT-_j| zE$9@h+K5g7FM?>U#bIqsr7DlNfFS<;lv}X;uee93<##+?%3?)#$4nCd;;PY)s{(n* zABBP`oCu6UPTZ;T7sR{-z!&JxOeG}hzC&^X`KL0UOB8KxP3Q$M%3@oF!`dH zs01SxS|V{;QG;tAMVPjcJwJ9AN)iNnW!(@EmmyW4UR*%4xQC{bQY4cdN62VP8vpoX zg~`=Lu{Z+Z0bR71>Qs(yfn~30f`^Sk7#gv2FmPKrepPsEm0^+dh5I!**U&&H{69+N zpr>R1=={)DmGACgXK#^J0-c6z+P9vfU2pMGo)*6?L7frt{$O{~dx84DripvxB}EK*oh%S=Jq ztzqL`b}MBUxs-XD*hed9E3*w;4JfRY-KL{7jExu`bMQBsUTOv5&7yYMC_@r)0)?}4 zfg1sUGh1y_kqvab6}J>V#&^=C<5874`d%ZjlAnG{`c;0PdPqA}} z99t}C!z}gO=#u5wUOA!{!#j)qu)_kPO6=onaTN9hEE5@sV8erqU;`yyEA9-W&``vr z(Kpupj%hHHlrE^SwUHkt7Sz@(pIi=jdwEb^$oD!aQ5Ul7ic0n(20B-3vbUvqG27J+ zc7UJrSa6gzNxVkz2zKG`F>N^Y1}CT6#IU}<020k#Ci43@<0yduGxdMkc zX^8w0EEU93_%lWj!1ZCK@;LnGB7fR@2=cX|I3&?pm28Y+K+yuND>_(rQyL7dKjtL9 z+-X{P*d9xq{5F(b4kT07f7>cIWG9vqc3wiCztu+@IEmmzy)s6gUw0bH;G}?}R{qmG zRI3p~2zfT4&EWh=y~F>UrXEv)+5?4(L!>D62pnO|)6BGmwrtRcwq@-Y;U|s1arX5eLFQ(vOB+_!B_rcsp_TSIH20k;qKnWd??~C(zQ}UC|#~Fc_8*- z?WrZqBRcwN71ro+kG+ZRhQc4%lqu6=Jus)JMoujBBfb~@1o2ak0v?=fRP{& z1YKKYOjPCk*etr2yw;>=Dg9lcV$^Cqv{HAPRthTuy}ZYGOz{zm@%S@WC_=?Gpsq_=wIZ!ZLX3Yk; zBQT~q83EV99`e>Boj81%xKN8&($H({o0?u)_0&gA{-+V2w5%^mbO+a5=A7gbvH)U^ zf}OEKR>$UXhzG!T%u zB-j$EDb%e7u1MuOFhuouQE`npb`z__n*;C);Di_;v}5 zTqOiI00?k$O&!1MD2qN(b|ZYx{N>!rGw{EjJ$US=K(H0O*np zNsScWi)<4r2|ld`B^}rmfMV<;%-E`R4f&Unn7>P3x?}@Y(Nb}d>521>VG5XE)36Dx zE++_%%z(v=-i=5kl|KUsqWZq@hKj-Npzx5lCJRGs2TZ$`90MyJ3V9E@-aQD5B9r@` zrtU8u4ra|G)gmCJ0GD$5o)HJSX_iyw>3ByE9G{>MH>9+}(!@}|dH`9>z!|l|#poVX z$(K?kN5A9Xp`o$1Mu=$8UE$qDu5m3chmi*^9}&h;CbaL}-sbY>r3BRJdKA_T5mhOsTzGU!RV{&dBSG%!d;(QyTN>cdhYhoF6ebC%D7Pp5n)aJi zN6v&0MRTUhLY>F@Qlk5?I4OPLD z{-2eKpqNBtwr=MJ-e5w$!vaP1vmGrYR3C#!F4wE~S5%8{<;IcC$esg9^?nnwJrSBv zHfn-HdoXGAh}#-YY9iSpaE{PBK3Wnc=DgATVkxHC?R)|r z;sY2Dv2>QK?dVX%LI zqPjOGjdGZ8R_+Gc-tAG0lu)2j;<5h^mm>4Tip+blm~iINbL7t>bRv+^%<1n*^zVcN z09};xeDHa&uCX)2v@Ucp1!c`~oxmq+NseTZZz;k`B_4Z^NTVgMyW*z8;%3S~JbA$MS)v`D z&DScHv@i@FEx}^@_EG@{rqr<`bLI!+Z(as&S9E?WY3d56+DGls_e6~IKT}EIZ5TiMO-JE4l!D6?7O$xjAa-lTxClR7{p3%vW4sG)lsaM=7zG`r3R4$s&A$?$fx2G!bhU!WUmBw7f*bZ&{&i* zYC*1XD6BcmLHB^;%9Q-q8z`J$r$z>9kJh|cwk6UFD^TbdTA$P`RW1LRU_m3s0h>>g zvS=$7>jYDeUbUSna39O;%d_{9kf+KRS@Y`63Z3zJ!>0rJt%Zj5ZnF@fCSZg;1)jY* zZ~^;-td3$CPDgwg^X#Q)6HX92@1&UVbQC3sBwJ4Fz&ZeM>~rtA2d4uzom!fY-%$ z)<$aZ>d_X>*^#~r$KKXjv_`H}b{K9coIWKC%Aj2oQcbqFPw8Opo4{f#L#N50Frp1X z70-wWJ^k7(E4d~CBos)7-9BvXXyWy~kGj4?$&fYn`-S+{vaOF~+c6Bl1=Z+8!Y&U* z1_$n=$wHaZc93F|G$p>mmREv+07F2$zt#3PaUP$)m~>nIs}(N+>82Qoj)_chsP~hN z)b~H%$^ZuT5WWFb0!^axrmUMXbLrn;E70Ddcf-4J({^3;*D$yr?p1b;@al1H1zcQn z8~_eX?P?q$w3&ILoKIj)P7#aV>6YRmN5MdOhs-!&-cIgGRpV}4-||cLjW=le+6-W; zDvq3*q~%Hn+^}1p0y47~Pw$~ea8;?hml8N$@ez9>>)6{Y;8L@Ve*=9~H&nl}gU|S0 z4O7y^F(w%TJ%n0nPO3OKqhTtRC=-AERC6 zBpm#3)5SIK=Uu#2Jnqmspkl4e8@;LyI?x$}>M8pqZWGX6r#wF`a3JUm=oN!*!6JY} zV5H4l(ie5%d#L<0Bw#o}oUd?fJ|xh~Xt+xxT9B?^N$ajJE5$IUGJoYCtq+4r8|fWJ zj^3j)a?PpTu%0wun1oUnr96R}gc&TmaX%jIqik*(j7ZTDC!d}lrchfo5Z*hYh`1B= z`KvYCk~;}kS~x2J+Yy|J6_$-TfXPfU48%(RN5l4dW;QK5iK4dh(G2**Dia@38D3|E z;gj~J`3EN&Efq35NRYBj;mIfAhSS~$|EA=6`5rgjDvv@UJxaL}>dm(QdJ+ zF#DgHL4s`shWZ=x%p;%_+DlX>?_@kOkmkMCd?&m?*rGF-kAn}#VX##$3XwgD@h{h$ ztNix-v)wvNKcHZmgfUPs{O3`Q3!e^fUZbQGPi^*K@a zmNG`lePYY7>`6=cO(ZN5T8;oA;)paMME2IFu=QH)KQ=BHr9;Wv zwJsBLE5+SR~{on zZ+1@}-$B^1zsN#AgL=JOw`d+hvsGKG;srf{Tf_%iEZ7T*y&7xp)hw}9n!kP_RqTC@ zY^^a}IEt`GDe00tO1fz%s%x5@DSdYQN^R6Uubr{^&1y#n3GjqN^SbpL!;huT7qW9? z+=PdJflzPFdAkY-Z1%mLttXaGX3E8mK)xTfDkspD89`APsK07HP5@`{hrQRCht1#d zYY1^Q*+=*0G)G`?Vxwu0|+4W+F#T4K&;)5reC(2wTqt3&nsYmbMF z{ySUFU|!ZDE_GQB90qCD@@-(g25BUZH z0LQ%&ClFdPXn0U94C7h~=?U$l9>sWqK(`-BOCIknr*rYG82S4NaLG9X^B?x!Hd=`! zXUxSJ{T0q@)q9%_3!x4TM~R&bx=1~XVxTc80)&j?V#KS@a?IjdBuMSc5tsL2D) zSOzCcjs6UIxWcMXoTGfo$Cd4tSSPCe?n>ad*=TwzQa*N~t_F8LNlco_?c?gVptv_t zA8B!+e5^P6@BlEiDIBq7M11qXvR=w9CO$70VNL0@L^Vs|k6Ie*7)FH;YeIe&RMiL@ zN{zAK|19BBJXPF-Cq|_JcxgIPB|_3~CZKcSG=g$C-mG%H1o=eg58OHUB|~wD?w^!Q z)=H&kx!|o;Gy1DYd0!0n_NnEMco#~;9coMNFr4EQx>(E_SpE{bBze3_jsgFw2?>Mu zJR-o}R!RW~`9E+S4$m-U*sJ}RqX%D_ktG5LZg?a$CosR4GYI|%fLFdEu-%K6Ot>Vx zDW?*mk-ciX(s-FP4#R$D=m%`y8`%mQd>l{2_S{0Rf(eaUK;Rt5o(R@RXC&58w6LU; zU5Mp+#^M3vt3%-7R8>~c-k@^`2?;=m)fmW5sC6K+zyCmC-iVcHHBVb8n}FI4H2AH2 zf?MlzPAp&IHZar4>=I_%RlHEV!8?wb2vQnZz!>Uw=!yaD$W7VkX)RPxjLm%81#`Vg zlOSf~9;ROxpqrsVxvIp5KV4p*Th8VL>7BSsO|MAT*A304&=59s#!LVg4ov zW-)eXpdIC{GMnpfNHn^+d8g77L>2Zf^ndc3#-6yWUg*D4A zPt4%a{IbNlu!yE(zCljY`bJUUp=cx_f_~q?JEj2YIagJdzs6vcK;L+s-)l4lGd>(p zKlCf1LZn_y(%#%h^G`Wd2AyEBRW3+bC(dZG!rJ(x)heX&+^*=1Lw`9QMF4Mh<@5$!sn`9;o6)qExUexNE@#gOBXb^jY@ zCn_D;8Qb(>h1O~bbij5L!PvNw`RwE6RF-5jSkJGfxd_IlfDqD+84{d@f0>B!R*h{Y z6y1AMZBD0w7q2KqU}b*|bNdkpgQHVmFmaFDzFT#4)j{~SoZ};&*j@04TD$wwrRY~> zapb>FQqsH<)8V$@v-_yZP68ukQ7{`y#YKlWG0CU?Ai0GgL{0{XauK;ea5imq}E# z@Kkd&z+}gxP^Ap<@(G}?JjO?xVo(pTp5RH9lYOV3q!jr!I2$8#roA`McRrQONuP)d zwr91C0-3`mhm9Vf$+y^DqYNMw<$>M`+l=jE3!0+t%PAvdgqX@C`ox0JJr=9$qm285 zMj1pp%=H{P;IdIlA%emz6O@l|6mO%<6XiG(*Xx%No%`Yr){u?Iz#(F7k( zSS3RWKbdK78`L`kotkW^gn(ux$f`l5{nn!6Z4oQ>I4r$)YneJfBA-pqjhnJ<>3Sia z<}ivf2b}~@Uz_nqFcRRhB)lEvXN_KPvqK;$AUG$7HY5L6>}>DG(vnjLIc8ByuEr^T zJPnW=-KV$k$gRe4wkcb^#GsB?RIFuf5L`AZ{A;e#*&Lckfs(HYDdjqWh>b=s7} z$L#trwLdT_qL?B~_I!ls#+2#R<-qcH<_rx5Z9+A;5@E&3fmh8j=+CSD8gxA{>ld#gKXM!L1D z@6C+j;Eti6@;BK*5EkS!Y8(A}A6E_opw{~;e>Yb#+&6UQY7+`gqe}kG-(3e%@_RCq?~p@jxmMVZn%}WTUtPKGehae*K%^U zLrD!AR8T25lCmsPP*p*?nbVZ~Fgx)foFnJAvOW8Gd%z8CavxDV)|L7(HY(1HNIAEI zuk~T(Ue?5sBu!T5&#`yK7QvTvWAS~rxCtFW5DX@_*hSv06NK|L)8?SBXyKz`IEli# zqWFx&Q`HWylwH6c2bZF=WqMN}VrBMs+u+4e%Ygw)i z(kbAL~B>)2n}n zowxSu)LLazyLstNDvrq;@xoBH-Unos!+%4^IzH&N=XmM+avWY~hw%L9jCvGnBudHc z0^PkAq`S4NK2z4Jtx48_uJKk|4(8HX1A~89qV5|!rWYH$o8_D`+M}q++U>Of*e{2La zz8B&cJnA!|HCCvN5RzlvStif?cfApC1&L8yUA&R6>Uib9;HC_sYqaDg`X>X0s2{YI zp@)A5QkK`QUQr_i;O?xS8uSJWuoYe~s(m?=m1)H7a!CC!I3r4Y%nk5~;$?(weDsV? z>G9)7gJq!tgX~vJ0J`bxn)j(|W5KH1;_~uCOI6_nLdbN2&P$7x^?fmkKWKi)WJ9XvonhNQAW+2Asfr1W z=Yhy;sVLgc8>MfyY)4)cLJGX4qvapQpq?Wx(SOBz6T+>4(V}a@IQ5jcV%KxTpfNWw zILGZ#@)Q-VGT2?tXz@A%0U)yrFJQ0%^ee4pbm2eYx}`$@21OK(oR%&&jPqGUmHkeY zO~azO7n)D2CQrjA%*dU)xkAQH6UAz)w_hKZ-a%a1V6TRNZv9%jj?dc4nK}xdpq*qC{IgI{^I^qnsV?cxdonU&4S>Vl zOie7TgY;>*1ITWrxxvNaMNNR(dB)eGcUXkP1E}%2aMVaL;!aR{?N+LSL3$4%2^rOD zjy-0#Bgu(&puy{7Tci0Q&%M$KZr)3i*LMYmH@(R{bGA_);WHI8@jK2FRtL+05qtr5 z`E^T8c{5ekk$%E)B!zK@sj-sdX|a~5Yx(!&cW+8svTJq)7o;bNw6qQdU&f=v*!*pq z@cn?ECPj?mpi3USyR&Fa-*rvP2uh1IE6obL6r@$H0|E$RhE8Er1YuTylQJo(F3A#s zpG4_WMYz)r68}6iS<-#DiV$i1gA{&&eO7RU7*E136Y`qbE41H2Ycx|6Vfb~I0Z!XJ2>N3j zntHOHtAwmG)Tk(L9GHq~7hj7O@P*h{pS5i`iTIM|9X;gwytbR72@57|%K32_2!Ivt zyC{|-`U|ZTH4LuOmuced72O>UXOI}nR-$p6VGmJIw5Z)w)S(bV{>4^55tcIVAl5H< zRrLIrOrdH*{ayp#g6FB}p)X3;_A9USde&xc3bNQ0Wg%zsqKXFB#EsC>rE(Q3=EnBl zoND*(X!Xmo$W*K*I?MqqZHh^VyL?oxsY2_cw3 z4hH4iExx|F2$5z`Lw;aov_wiqa3kHMP!XaB-5HFfx|$KBIHXao(rP-`vT*pM6`?B_ zlgI_C5|l#i&HyB`%qmF_i;9OO*wBFYO$kwZtkgR}38N@$UG(wkT@pK5A!X!H$q{e= z1ga z?-DscJ_$86Hg+Opl9?wkz!a{D9P}2yP)`s!7`w~eMAIwZU547bGz&l~p+_H_b%-0) z!MVlPYEwEGaj995PxF>Fz8Lm*=1!dXo#~>Q1dKE}RR_X%z{^)RT6I%C8mNyJEHWhC zTcaX1nr;XrHkc^1)yB&9us)Q6JPZuaka`gxy8}2bT=ZLg6`X->H{B{lO%jH%aw|u? z)7obL>-3qqc@wUo7tRJ{9|HKcTb|A4Nt&UgrG^(7Y)Kf2%#u^=&0zsNah&CSF$l(# z`;K2OjYBEza8YQ^&B0a6WivptE;P5%GwoyW?v?nga*+w`MLZN{JmU zQ2S6QSwdMuHC4_hGg2Q<2lr4H>U&uc%h7@64;N-+@Z|e}U2NM* zHdD(@4l*C$AKce<=LBo(s7DYSjF+v9+LmjciX?z)TNc7BBqWmT%79oWq8WKEj&_xX zE{3i&F@iVMpHKzhw?b8ErR2n$GJCVfbtZ2ue`j@HBjck@J`o|+sRl>!iFg~0!u{|d z3=sIPniH3qG9Yt6YgDcn0GvRdNSx;piVsnFZG9CBCM!S{MC-^dv!iTXhNgb;hSz7nq6-+6|5EZM|#L!YJ&8corOAU#S7w6Cnn~ zYACb{To-EM+r9||Xg8V)G(fAT z-LN3D{%ZySC6oTdD4z|D(6os^4N-57B#A8Tny&D?t%y4xqqus9UMh!D6dMWsZX#`N z=OTa2VH_?^`I&EX4{beaKYKJ9;#`GA^LT%OT0Hr3Q3@BCxLO8AI0X4Bn-BiZ>M7nj!l44Wo1eYVeE_*l+6aUu8wxIrl$CoDfd0JC-p!` zEF}07jj@*geKkOlkcW{SAjk9wHmfn-TLvDAJfOF$_jqEg=1`6#jGH+8S%|kBrdM71 zo?~IQV7c}R!er(n@yAF3P`%&|U53)t_tG&7;UvBXRZU+M6GK0QACv3YGKh%4k4jNQ z^CyBVP}&WXq(BwYksb9*sOhQqnENYZd?Xk`K?ekvQJb@VSuF^ss5e z%cFvn;bg?~|4ya6i!}Sp!BFzUbXZ0DUC6K3+??%++#LP%xs7U(HtYqZ_1@Lqdmy_GQUNsKC{j@3eNTmZ3yJ2V4@(rVPqZe*6!UG1 zp=e*0BM0C2RCW>0BNmwtV+zH(fK3Gu-H!08P1X%6{zVtzM$-*r89otS^DfRwzLv!X znp4G!__61MSVNXnbOJH8xh$Q3JaTx*&??m!kMU{MWMb^UI2=f|8gYKX|8liE+Uzu+ zy<(bP<^%o2i&T|21f&2eiwNAymwEZ0_pNHnPvGl2T1fQN=#qhI@+4=<;wGLixYf>4 zn1jlXvrFeGytzw>V!2%bB_z(5e*4&;xJ9R6gXJKe$2n|zYK*8Po^b9#Q5-8jAZw-1 zVdX(I;B6X>KzBg&wy}`S~gk&RQ ziduH64@?=!l2rq5ssIRHu*sDfDO0k#n9yPhX2Il~Vy|iL1l?MNW1S;nZ6UGZp=KZ1 zEes~_afNWBP)2Cs#N4e9!Au7LhhA6l6jw~=?5UW}t0g9X-6Oj(f=t_hSdk^@7 zCYvhvzzxld<>0c9b2MJ|v`$?w`Fl(jee~|vuag5Ip6>-|az?E@NDPCyDLLyt_j@Ik z0)lwws4!}6$7+QdWLj#nAi+1OG(#!F9MEYKto$s)ykRpSE?v01@J|5=;PIkMcjtqZ1%qk zjCt@9SuOmeSBk7Di0V-7AP1b{MY>gq9Nnen2gBoCQWy_sidGc+;OX=GW>(>DJXb0R z3p>)EpCgfJfJ{;5d;gJ=Bk;ZWlnz|hXh^QLOl`{<9es}=&B;)j!WW?cX-bBVmjX{6 zC@$hY7%JBLgs@NWGDC@= zk`B!IIM)Z-^k&BWVQD@`1SJ?m)fZ8nBbf1bWsO09#Y^yEkL8e>^o}qk)r>7;REK$< ziNc6Q@ovK(ir7l@2t(C&qVYg35`d{AzRAd*8G<7m7R*jfR68{0G(9~BUs~yWy>qha zr=H?*CRt-Ro`78hzz|MP<{h<1U;o-zh3ak4^Cv;(hgVCK`8_f)ynkn!b4-ku}yraeyWs*RXH;Z7+%y8?3(5vA_z zi1mc(X3B=KY4Vl$w0iA-eQS&YRVDKKNbv7}2b(X{)9F!n7fEfge?X>-WLz}TZmh-Y z&S<`yhI-l}bdfjU4FiIL}S$)Az(&C z#87@1>}kfY?4}|_<+9aON1An_ls=Ml!j+nsd!k?*8lXz_2&y7b|4Y*v9N0&r4=mCv zUvwr3c>9?`qfLxgyQ~_5cFInJRmEQdGa^2|d9I`Ygm?b>=}W z^%;PywS#pglAyFWlbC(8$ecBP_JAWvA`>K({qi{8*v-X5 z=6nhMZ)G^!fr(A8kluN~T=}eRB(ANS4_}P)f4tF09a_o)Ao?Zy4)hL+^l$W#6AOOq zE3jw-^&*Vy9VI>q^%g-7)n;*Tk{yVN5o73wpk$VvpH?lRlMoxS>^Xi%FOQ(aPLG8X z3oGYGtX7z5MajBPzD@m@&IoBBbjOQyt3_rXQ?5?Ee9?u*tVe~z`~Rkm1M3|BQSRwV z;pEg!;3qM00mQl}2zb3fYcU4<&gx9}I#rF5h@)gbl1PvWV&&wkog$@y;_RTO+M0pw zll&6!t3~l$NBsM|W>@27+K7beayDq+6iCR(W2w!tX{iL`nlUG6GJoffG)2i&xChVA zPuhj>VQj&aH22e7RK;_$z)yt*{dt4ScMfWQ`nv=sI4Wxz&hIKzO|zJ&jn;dMHZPH4 zeY2B&q~(0;VK-(mwuhSgMi+e>9X=5Mn>8p4FFDQ%*bFfOP+mhDFq=bh@GAXT^U5f= zlqhhD6N@_~Lx^#opDb6y7lZ^O(Ir|2s5WR zawQ8LV$gq7M=48PuUcTjbhbRGp}9wO*l^sVO1&i#+TN1IqmO5hhVahBYAYlpLQ>ZQ zd~-sW~ybl{;IsflVoLipY%;(5COZkqA>*&r0DbVj~*&^|>#Kyq6n zYiA(VK=-KN%=^8Ri$|-81hO51X!UiqD}bt+);c1D8;PwJJ4=O4G>TiA2)Jcigys>uC$cAFUpvE_9z-nBMmQv%F|PC%14;5b z$}vVKj6LJeIUg|BM7^@zD=vG~GNS^gAK*KOw=GSpms1hr5p)GU3d4TdH1(oA_Z=bL ze{(Icn>ZzQ2AcSxLBJ4(NPJYxkUjZZjA;4s5&_l3d6R{}n2TIY`i*9Zm&=Zs!Ne-x zw6|p;zBGN$~Pq_lceg=gg4E4tjLB>Js)e@O1r#4j{ zX-(_kS7g#& zh_$KTn2}cVRjk|AgcxsD{GHuQ0RTGt?6{A>)~V;1$_)3D(4f(Cq)bpwVjO{-X|gbk zRlUA4#KtW7QXI%Ewot4Z0>$iwRykI=N1z!g7c37Ux`FSzF;Lh)vpgUu$`3_%6!S93 zm>3)xKvK|Q{&(VnO>(ef4qFf7*n~ccfNf*|2eZxhOcehH@BfhYVUW^4KY}wc;5@5f zs1&+^4e9XkMc1k`LQIj(sHUWcG{s9K`t>tT6pdY(SfG9UR-Hy5`IG{~5r%fv?2M@R zC6%H+F{Yv(>gG-P15WQ>Lxaix+o73R-EeWEz|b3e6*rEYXYnM)g_dmtu?x`)E#+}$ z0O1@$M`w89dJT+EF;_H1lx{M~-OMDW2!BIN4}T|g_?A@@kYvfd+d@4C{!e;g1%-9b z7BP=J!~AU!*pr(&qGra`Y_h4wdmlrcGBq!?3G$ zf|@vT%1OCi&%+2k7oiK5Rp(+Y3+k{)h$7JCckD+?Z*g&QsYQ?RRTY;@ZZ z$}^q&SarC5D@XgP@bGvxP)34}>mrx76x?m&p3^-+3P_7D15GizRoMbTSv!vHa#Y2k zLib~>vXU;=Y`FD)HAl89;(&`G-fxsJW{@ZVUNTY~*qcznAW!3}_?>)39A&K(jfAD3 ze2w53!=AIaODn$;69zJ|axcm2Iu1-`H*y^;OL1XXKSO4&j$0#eVpG$V{WW*!Kz6BJ znGy}J1c0VluHj&ag@l9B`_B*Sq{4zAm{Lf#ASW_N5<{p8*XB-q6k7r}asnp=g=uN+ z@l>+2ZdDF)h3BHX)jMSx)vNu}gU_1P9AoS|mwo4EY{07!(B={7xYa<(ZokoD&`r|z zc8+sHFU@VP7HG?^c4pEc*0%B!X%G_A?{ zxJp`IIi$xsiK+q}VB3z-=Ciis?7NDiA^r5qwPF&h0dN4t$GEv5;gDuCME%1f9v?Qv z24#OBLx;2aO2QMt&e(#Q%7+!36cslT98C56_qvY@8nMV~{6iZRp(^-zSTO<+94oAz zukSoxkhqnj%fc6=OFSE#{-^{5ej!pINte9nqMa#ZGtl|_pW!-bMIw)`U;GlOp_&Zy z+NwzF#i3_0 zN3T8I56CKC^;QtD4kldFp-7XbVC7Y%E#Jex%5c8oRGdN(nv!VzhjQPDt+Z1i^UCV~ zXI+;%ByB}T{+=zrUP6)z@`l^C-C(M}QgN9T7w0!3PL{m%8Ly($#G(<)7ignE!41Ai zA>1cEOZmdkD&MgaM-#C=`Inl+6z1AT6_s!4RP%-sdjb}+`}nFNi)rCF*oA@{J@aBa zNoiX~HSL}0jOH}3i=Nc7y)XM8LStiWP}9(yrJNtR;Y_H2MHQFEXkE| zF@pg}FJZ0fLS78UGUy8;;tSd*6I#02ZI|5Erq+C*U9{GgJe)WB#>f;28NHgk-2`Tm z!MAx>F=P&J_;D3@k%{&@aKLoV&OUb)2)Jy`~002;nBveQ-7b@Kyi= zUI^OQKv7HlxpYrgykO2CwkUFfl8>~>QV4pwj++;Z^E=j8txUnO-uN*x{agwY3e>nBeO`Be!`W<|I z<6mq?C=xN@D*4TGN!i=_u*HNkz8KR$@@=PFoTQm|!lif{{K^+!^Z6$3N1bkMg1#ue z4#+tigvf~EDl0HyDu;Ydh4%hghng7%q6VR-N2H>0fRIjxhF3ui$yh0jx}3#@_#eDx zq3vwqfD7Nn;K%Y32zD-dkEmR_hO!+2YPcO?bYS*w;I+x(7r>-1GHsQJIR29 z4VpRhW+qj9$=4CG6WvYMWg+kLh}A243=Mrcm$e7nkUTcwP77|pX-PGMlGRoT22z(s zKIMovR0-5R=n~1xA*U~@b?PG}Ky^XcYOWE(v`cdc5=)p*lwfa-ARh%QBd+lewt}=q zQ@yT^s;^#*hpbV9Yz~$fTli0$D&Q~x?95Q_3JA_tN2kexcFdb@a$_Zi@;Mx}5TF|z zYuK};q7+h6a92&5i6$K_80y?!^NZQbh%26hGJnaaj|_aV-wC*(P>{@u;Mi6bIYAHjX$bp zWkRBSGj+fX)ZRd*B9T|0#_wSdG*=K>%Ya}(0@{k3W;43=1Qw5Lp|(Fy*y=sMnbOe! z>vrk$pcBLb$}vhhk|vT%Zg)gB9hn=EZrtxzP6c}v*#ZvMnMhRQ%z#${y>%gBIxasw zGV4mj*@0}H$a_X8&j`L+x}eD%VoC6xh2O7A^unSg%4up71{ zG_^aw$aYriCEn@V_ji7lD2+%L6u9KZ@-8m{!%7a1w@WbDQkpIE!{M||i@)7a=F&Zw zmzs_htVNrf>s5`+C2jIu%3TSD2~*DwGWl)P6X0_8h>oiBYx%Ff6Tx9OfdGUBW1slarzsTE>(sS=v?ip=Seg(h50}1Js{p8=xP;bRYGvFHAqt!V zV-5#|azEoK)Q|hN2=;lpEBUzEbmVG7$CL!@%O8EnR*a8X-r#Wg9}l!KC_wcZ1?CAJ z2?vU$;WlSfWS}4FeA858C%Tdz`)5IqL;S=O3DDusPgzsiH--saCz;k_sZeey$z;^) zavk`_34WAREWCcLMQ;Heq}ucJ!ARQJ+Dl>;W!jAJ1X3ucNB=AqwpSUcuQGDg=XhWa zPKH?9_*?7in=hVbtRc)~#)^>?7C|O*Ak)@#5jBHUjqiE&w}2XVj@Vc62GSl>>_+eL z6R!@`6r=;qU3Q3usDrX7Vb)5y^6#)tMDao;jH`7=H-Px!CQPIV|4{`fhg`WiI8#~gdP25XhJpSgV%(oatLwBs zX>Upp@0V)Ygcz3+Zv#yffFwWfrQ!@BB7b!lzbDXBeNh`tC?R6U^dLR z-sNT_Uv34CP!6+uFdS6#pQTdn-KT0`l5$Rx>5FLC8ZGzthKfP+a(HI@qcKO_Ki_SoSlWJ-u{ zUzj5l1uNQ3n%$yQx?0zSbvjY9UId63oQZK5En8RQvqLM8Il13#T`6pYIUisw#b2)I z=}1+>#Ni51m9GPm5=dQ;IbCEy>wQQM25_@g2^7nyd4-9+A85G=IUY$0c&`~fcj2N& z*o@wvSRvhn@aM5+QnR9M2#TPxc5$Gy1Ot_^l3s9IK_>U_v&5eghpkHuc76~mTd|Qe z-Q@tx&79^kxyNq-oZBUhEYmY~`lBGH1w%bvI_6!k{^0luGdF&_v=9JrITw~2b92E& ztF&KwB#s1VaYkQUK12*WXM04n87(}bEUL)6PD&#v!)Q62pzwgQ5hhsxH{yP`Tv^o9 zp9o%Dh>*(Lqg2j=t$a@i!odj^BG{Xqt*%8%00)N{YUy4>3{yt@V6;i8aE9310+@m^ z8N+1(36CMLJwq_8D{xt^A<1g?QOIJ2c!ViX9O`Dpy;WYcT^7;{DEVL11tTUVuU+lR znS44LMsmE;4OxS!tKsJgA7yXbC!v8jP6g;YE?kC;4f+v$2fsv%9fqAg| z+^U53K(`=m;4Fl*s)@y1GAhV|f$2C>I$T_g{={+q1VTJ%uw6eRykB^X4qv6X!3uB! zTA`(Y;XlFbbbvh($8zp0&rTFb#b-B4gKRlT+yxlP-_|!C5c&g z-y^S1=>9Kf1CChw;F!4=7d}S!To!Oa|@qFJFQ*ZH? z4>5ZQpM zqW-6~_%!#RhSgv}a8Y_rQ7`Gn zN1dWrV;sw`HbEKKQU=woOGqIYD*k>L*9E!L%VEC!}*JD^V|2K)Ex@>K-4xh#5gGr#e9X5PuLOJ z%r$>QtFc#<@bpL-VUcIZ5Uj*tMhtE2wUw$X!ikZ+aC9Odg4r8R#CnpDisM^-oh@M2 zhp}XDrQYvyZMxh94mihCP>D-34zx30DL%-c2dgy7x(UQ0I2@B4$&;A+^;w)aEQgzH zS0$Xm>$yMDB@|OQ;@MPsIN9Of9EAx{6Zu1dzNKg=kF%8}7Z5=(cP3Pbs(=9*%~~Wn zsT!ieM_0GHd_wM7zBOGv=`49`*SDWx;$2G8yvU;C$FCyP30hEk*xtCuTx2IZ1u4>6 zd>@zwTWS*V?%p?}w{8E3ASU3G8cbdOgFkDLZ<#F=D5OL+7NrpNY$8ROrT{PwBnD=Q6;XEY{-ZlwTK_ojhU&U6S+0+2y%L6l_r;32ma9GhA-^{LK6%hk=)8N~|S_?5g!g~K^Yf2aqUpdvmKYLkIY zI^DoxV;d757$zBkt<0Dtt1_~zyqhkKCb|P@*&MX-0A_h#lzb}S(BX_z;snE$1j`MH zY#{qf(P$$w>6KSFftK~~bh2s=exTpTJdtYPqsl>PI0`g`NfY2Mgt@e`V1Cq++3)Ys z@-rMuKAr!5BO^$FrVT<@ao*V7;?YC;1_}m)O1mp>W&NLpIv>S;DjL?`mrLM~q!+{# zjZdpU+Art%%VfBgPpdH8SWbVc({(-pDWd7FU_%~zdZ{s@*}|z|RZxVFX<6-OI+GV8 zev|ZhMiUO9kU>+K*lHJwYe@rOn7aRBpzSCMelp8g z4vz+^+mlF`OVcN>X3Y__trZyaz zatH{DFjplw%#1=N!Hw}R4f@$!Oi8EDk1}r|yYeH@j>`aN+=Qw(s8>d4^Qz7e7*`fF z`A@1KX_FXmMX`x*r>%MIQ5^zu=fs#)E%pQJe$pQ#mNH)?cCk&XQ@acW_sV*J;TXpp z+7Y#ubV}k5Q%PC4o35c}-mC<+N=htkCuTw^iykDZKvsbJFupcOp_f7{89+wp-r;zF zDWal>Ys$eXNf5*;LCxV=rfqa`)1!u$_40B#qh*MS)O3@e42q2#$H)dSI~@mG3WH1Rjk)8?+8asokQs9FC*@8+#T~UJizHhk4{Zf?Rn>*>HPQs->Ba z&)1DdgXqQ%RF1$Wa3n(1aa^FT*4CRZ?n4FGR!`(9Ayn3>QMp;bqx^<6?X@%{fL6rU z!e+~v?UFUYSeAr~umx&pi!zfbPGth*SFv5;?^*Rl5A#Z3Y?0HXRwW=*a4LU=d2Zpt zusvaR^FKC{1hHjPxTCy>$6UfRS8zpjD7zyri?q{MQ%l(Ju|YAAReN*rU-;$X-}|3< zw6rP#kWJ?+bF-LIC`E%h#IP{Kl2*v!qzVB3wfvLz(pOf-C7TL7z*IRlr05&JqL z3hBYhMh%J8Y0!KtB>hYom~1N#tbXVl(!kldhN669-ymaSbommnDmMS5R{<>Iz|>7d z`?c?9Z)-G#hJsn%Bbse^(4@3N36-j?#h2Q)16}IBg6vVL_3;Z4#fxmn?U+Avla3Z} zN#ih9cB7k|F%=0E0Yf5^_eh0C98L@Az1OTR)>(LmPP8-}Y*F3ZaO2@(w|tPTd~b;h zPR@$KRu(~;o3^39aI(N#;61O35a|9Rj|nj*z#)`$WQxW-94{8>H|hq}(2=3yQ(y|Q zD6HqXX$*BTQ6u9aLs!vvi0u(qf*>WPjACcFr571c0iv-nkfybd)keiHj(mD!63NdM zYXpogijtVybTR2dFdXguTj`}GgI-Nt&PsXWR+6R)S^=H!1r^hKZoGwN5=X#UF`dk`NZr7E;>cg*vUxq68S%~n>}iJybxb7=mC z7N+%?ZxOXR_lhJJj}p~eG$nXPpCGd&?zr%DH}qxi)q-|<9Rx3*Z-FTxpJ`gJ-otCh z6?7Fsk#flS0D?pgUNRTx*`Ay6Hx&5j_zsZx5w$O`fh1xG0***|JcjXMOsCi)hymZb zQsc0Y+AGU42@#p7msmSTi@N*rV!)s}RSboX7#LJMr_LufQkvIuu2G1~Bj_2^@ zgY~--5b0@|yp=|`WVBB#19$RclS4RVp}01@@>*{HW0J0X2fC5tM?xX}Jg(>~nLg(I z89hH#6SQ#zK!`v=u&<@r%A=_~ z(F|}$m?DJ{`27Lp)HT|srIe05!qbok6+z|F`Zr&u`$MQ)#~>4fWc^%|2oZNDq~EUb z>X{TDs!?Z<-Dk}02r-A!gKTZDa`UtFVt^H5O2qME%~%pK$`J*>NEtgV*B#_tEQd`A zK=u2Pngo)fQzf0Gt(t!cC=uEO8X>EGT=uS{MKnkSkyd_Kw~|J~O9IZ&!zY>hEfhEo zVZ-)svc<87Azwuxh5;?FSeMqX12kNa8XG;qln{5_LZXks=C6QUkT=Gaudgyh`D2gR z`yD zpoQ9r&5)W6aw5LR712oVL7<0&T!RdRfvU@Vm+}bk=~M9i9X@;7Y7{JDl5m>b@ln%M zG;(mEbd~7xTVOUTtYF&C&eTZ>hy)V|q1vza==dK_$v=o=8FpqWgC13g9R<-t5_Wc~>(9qQe|5q>$#j*q(5c0f&u z6ii94*$9TyfXR?IV(y^qk(Yv2m2^ECsMDec__S^9nBKHk4gtwxxe~|wEf^f>s1g4J zvm6AEvx)PB_b~kGlJSbG3yxr!R^&SQDzUcem$Jmo9h0}ksFmmqFuf58Mvb5)k<1E- z5EV*)vd~u!w(<;?-fCYHnFA|)N{Q;uB4VJg(vJTgsl4Q`aU_+>dKhYpUAd<^;NtQ* zD4a$s*>%FQ&P_u@d{sXpi%Q3V(vg^*AQ6aeGfr@%rzDp!SN`A##Z1a?06{>$zn|s- z?8@xOdr7|uGb)Qs8{y76k}$o>33n1mv5;TCUB#$Jq~)-~;RX3XlW+Iy5LU%P%`b+r zb)f`;+g0xOR$djIg_t-{?<}X^Qp%IcxgIs?OrctBnr2Cdw`(Y-p-7r+frZ;J_rVUs7Rg(?@Hw95qchq_9{_^%DX7duxY^ zQ9lwbz)>0rn!G%3O;!VyDI|NQX-w8Ar7T;cIzLRLHcnE;%)uY}?bM;^=e(&idzXiA}t6;b6 zwsBP<%x+XJ)5V^&<8&6oRUpqh(E!l}eyivdS(DK-V23bZ!AYkHR?JueIP)6 zH<9dZz!D#&N~#-XBkYVHuaXHq+{bo=Vjl4`r^PoC6%Ap0;dx8^^flwQ;Ga8_!rDKc zEm}Jq1h|2JVY6IT#$2(`h;&bX!T(d-+k{~%kWlr`H4NKJUtc+$E+W?>HjU*thk1RV zU6x37Wz%73$vV2{iji5BKn(+uV%ASQVs&buqWxe29vU8|%*b|tg62!StK-spwj*Sy zIMe6{<%pSVRr8?1Sh*rXak%rpWX@^k?zCLbj<=rrqgUC0Ix@z5^aWKTsNmfzc9#r6 zow%Eadf*M9*@zLy(req*=kb)Vp^vhT2C-{zyD$?=j|lUjSk!|k3;JW)N~)4~nYgPz zn;%wXJD4OuDP2o}i629G0)}DnP)2ZkGejLrQ7uTDAAO!8nGWzKVZp3CVjhkvJoL;6IluX90c|FYso=Ybt>~hDlrsfB}~Ei8fk1E zX@jL6n&y^e;DJJhF~8?aD{AunLyFf%igHkJo;+7o33>&~5qU1YFAs0k08E5O`>?m$ zO!=f}tKt{X4i;VI!GH-{D*F4VI8~x;2DZR5^|aZ;kI>r~+Omo(K@;3X?vq!cCuLX( z(V|Sbs9Z^o+ql8K7AAg72fKp0gGvM(R|4D*gF42`EVIq!S-ePQBD^vs-}If&qq8nP zTHK7C5mb_KnoVo??`Nd*T8Z3j2Nfu_wXEw*W{3mM*nMxc-zl5xh^nTtYy4EH1C`FQ zg|ieukzMjtGMWpF49rt}y&lvOjEkT(-(x|r^Nx`v5du71!s|m7Of%^gkDNRj#odzR zP-4)AY@K~V63Dvqwp_)u7dsD*nJZb-2B%`%yys%6WoZZhq)QnAGsKjpn#B zH7h#{>na@yvJ=7~B~}UyPM6 zObcF9BV=uF`_g1IOru&XNXNu&K$k@QG&*TQq|z}Y45hd}4_T?SdyDfRNkG>p3*9p) zX-Em1zGMD3sl?tp33r7NxM$IFwfJ|4Q>K0Z(+KY7&rf@N9c7lGZ7AOwf=>S(5Q{qa zZRe#gjI&rNIpkwVTBbaZ*OFj{En`OgFfR)?B|kthYuC8x{Kl^Neg~z<85!Qi&(nnf zk)JmuV#+ml!R!Y(vX0z_{#ir)<%+qcAPHmk@1{D1CNZ#)4(~()lv={XD3i}}6@C5} zgCjkvSjE_ki0p#-?H{I`Zp4XH`B;FyqwS$S5CUNwAcXdb3oExA%);#SY(-2Gb!Thny`U~fA{7@qe7 z7@gqMF$F622OO))GF1teI$lT7pilwAhfBOsw}4w>FJaBIjP*6s43FAc--pD5)w9iT z-ZuFvkPULb#Y4d`aoEMLyhuzJ4!M%?X*$IZ{0WHeTQo*!#*)8EWbK}gb7X9z`51Ws z2o@+%f3hTz+z|dLZ+W5)yX0X4=iTbT?!1s{GSFh8{X-3X!tbV+n~4^Da8isS>qn+K z>0pSCnKQb$tWUf}Q+E7U1n~NKTaM0~e4&)omlJ&`o-~Q>;=m2&ov~8LDbrw(Ys%aq zQ2DEOsq2t7D+1`Q&rS-PgYlWxL??jo8tF92NCCqm);E^|N^&)YAXG8fYFK$`6~C{g z+rc2xIS|Y*hs|T?y%|)z#bU*=iAgv`C6UZ=C95=bcnMT?^hiGDRkN(-t8fRUCa>hS zZ;{hL6*G;B>J=X|y5=hP@eJYuT|)T~(CQ*zWzT6lVc+zT0QvK_+;ek9To`_2KqgbE z2Wax0lnrc$gn)Jm(w-DGvd?0^A->kUmX^v6kBh+cW$xs^I38KiH>vE{K!gy953|UM zS8mae4fnY)cmQ~4eW)qw0v@KpIvy{?k?b#Ism0+1B<|Zf3VN$PM*4Eu9hkZoH4U>8 zs4DBQGByQBVggUMCCv}seh|`g`dy)-(I^>%5eS7(g}7{~p5XI}j9~KT9nmDTGk7^FzXuKAs4c36nb|HXtOW-yOI;t_n@bx34ZJQ&w$)LqP8_1w}e8USSqx8gQggU>ekJ zsh>b^fw{O0w}8Q?`H7?TQd$DO{JfKLf`I6t|EYa(%xKn~YUDbanRA8WmVbXk#r^fyCYt`*OpSEt_#wj1~Cmd>@w$ zW2!1EG+fB9yH~&}=V?ju-tLt%MXo%)y+%%IpJ_xiCpF{Qi6cPT_{^!?iiE(<4O;z1 zDFEaV@Mjg|sW>*2YU6*(Btw@hy%$)3*l`hlc17_JzLJn=)((bnMNdlrRk|2?+Xklw z){#*XrJ3s0LA3Bd82BmH-2lS!m_y zA9toM7?%kXb`3GU+{H@-z48jU?-2({nWH;aB%!VXZjVqu-+vZ2r*sDfZ`mnjID8mr z)8Pz6H#LjiG3-W#*Q1gw9sW1rJYKN@B4xyMm~(6c^}}=uAbX~_*RAc4-U^vAoSB=Q z&8K54uRCgl z{hvS>T9g5qf+D1&lA$D<={aajFzF~u1D?)7{rxFCGb-|sTH_XqgR<`3>B3d0&&Q9ve<#7Z2%xaF2RVaE18L7*~YKv|H?M24q)I^yCTa|%5xWDZ> z&y>$Hw|h}`k_eGL*)$L)(-HIpGARetr$cU0P9}R##Gz8^nPU^vDE%pb?4ON8NfSgM zDs8-GD+L+Brf{d5>!dn;vuP&Yca-IBfq1hsrHTs?n2d@O3n6`{_rE-9w6rw+&E1(Q33I~*%yi2<>P zkM+xmV}rxtyOgl^aayKzQ&BC^cjsU7GwQ3jFCHCgGE%}nU^7St45R#%y*+(}Yi8E7 zBUFe$iaSQJ>z^hVQzP};+82;5N10KlIC1%gc^yiQ#fypxB7WQM%Hm`Le2sqX!CM-A z9t3LkY%w|nB4HI}gtKy?M~JdyNb*Q}Qx%fRSJe7ANkJrawzJY=_K>ry4{vM|0((f ziX|3@$gE+*R8Fe^tt1YJI*=I=&{wDWV{lV)ywT-EA<+XuPXx}P3fAJIabu??j!gJ7 zUr2x5Wo93vCvQOKR^EoD)1y9&7fE$Gbo-yKCnu3DJV42M7?Op~TTmca_$lOj4h1Mw$hDB`rL+KH5f~>6(<{oR31ac8 zNX)*}c4ze;RKA~Bb!@v~7%grHgF2I0@>~wWp~!OSYS>NSQB|Hp-pmzeH~JP!khQIl z+7>pBPLxe&vH)|y8$G;!3R*|occI*oJQf@i?Ndd_=0WLyvdP9s?cG_$FFDhdOMjGx z#Sfc9{>FKt12*&yz1u;TiPKx=E4_UN?ZFX}rmXxdolmO@Z~E>C_m{6!T`5p_t`N6= zfx?4R8iLnN#?y!=;^>5Q$=)H3YNL$*2`;?XWXFmK{2F6RZ4yYG?3FV=tUH1k2OSm8 zO))gn=0^Nx69cc^&$8W#IrADrurYUV?jtBjj@R8w&{PvCGhf2X>GAtSXO(k}HUGCKD_F z&O#YMfLNs%$mp9(ixabW#p*CDnUWV$V#&#LoPBR8Dbk-L>OWkwO4G^g)6T7=pzR7+ z4J(>hFnaUIOX8oB(__byzm?Woc~)u8NG$c>3 zQYcDAm+?4qdD$2nbNTYJM^gaL2E!!aQ0DPSX5HdZ&bJ~ zda-X50(L-RK?;PCkHpXtT|9XnC$>^xuHg-X9AX|Nxp{K zof)`7*NptyPB*KxMVrwY_%u{(M6%2BowvAg{z#G)WI1!J#yiU!%d6 zI1wD{bOrd0Nj>6x&_v~95OgvDMQ`wd*(T|_dmvS|Zl@B8WIzyK8M(M>=EDs9y_Gfa zKE{1S<^gwr^M=o&-iJZ*Q?w8P8Ojs)N%Q^3n0tfF>qJ$%gzPd5;dpP1fk+A9qqt;n z>P5o`k#nN;N0q(Ah!^Um1{>ypiX1{hAk+{+j#m78iQ+tr7;#= zXrxSe0cDX15Sh3%Hw>w>mFYIIgSPJ!ifjMSpim;f54L6;5WvK5&J&nz>)=T9=!U&rr|`v_hI=7f!;PM$k#E^-8OhsA}a#eW8XBM2gbYiB?D`#=DLp z5TRIZpS*4=cMI|X3;+t56CSHYG9`;AUV8XWVE{jp|MCl|scyHc088nUpjn6Ab9 zXYm58l2nxWS(^1WMHtAQd0l%Z)TH_h5{VP-N%(vSEeKI~-<-_=E5bLMhcwG`(RDBg z(Ey5dwd-kQLCf8F2{gY!lU10_gJR2}kCKY$)dHcg=8Om%oadFa$yzaRPmFTE)w&`U zz@kl&zC+f|CQYZsoYePIMkuF2LODt$vJU)~-G5C&4v~GPXRZ&A`=gCAsZo|wjTw`< zH=atfsgIAr$ED4FJNc`LiMg|Q04{K9eGW;QLvzMvvQUS0#y zE1MJcud4dUsN6$!iZCuq9TJv#L2U8~P*7S`-%1{>KR<%W3_{}DE|QsLb+L^n0q3Ht zo4qofiL@7%=7mh0-eU-07;hGc*V-~lmScBm$;Rr%>rd|_8E!(Q)uu?9b#MMLJH>*T zj*R!G%PfVXHRp7!x_&cF5DX`m{CZ%Mb>@314=kQ};!NFW#fRBy0(<{z4ZiRTqP7!G z4^QCXW>c(JmWdh@bN+z$M}ur;Yq%=2R-FE#;M{Z+)1+-skTF^~IFj#W zFeI`?5JB-fN6R@Sj_}RRmzZa!DD*8==#9}%qlL+{rjmKLfOhuF?#AsQzq1Y&`BqbaElyWzObgtQ$>{q#mNE)Vw zSTtPY?{G3#8-{Xb~@2b2H@v#QrD=j!xbnai;=};QuF8UdaOlswDQ%f*OHL-nLNjpsFoD2P7$P38dVF1`&?u|_)wG@qLDIXS)^J(vp7JzpCg^_6VX~!(lZZG zhNpxmI>>l9`BYrb@Zl)TkX0OtSS{%Bs8c@?`3=90lMp%f|4+8&_En$2J zO5U8(GREGMUPvsmAX2{{U#ntnm@7smwuCbpdZNwe%m<4R>9D_ipa@_TupIUb zzkcT(`8QyD+YnpND>bm5F-oLnUE>o?F!VI2a0g$E`XZ|r&W1!wLr2@khf$o7l)^=< zZc_-`qWz=4L<@*SMCdBYbxVyK^Aw)AV)-Vq8+D`LzXNwy3dzakkR{};+XZPBcENs7$dN{xmZDL+FAA6VORN(-b2pZ|oTET=#Enxtk$rrb>dNIi%PNN zfOr9hD7Vf*iUFz&24NhHND$;@#K>}XXml0Jyrf)j;tlv+WM<^(5~vLv&Jh`YJpdyg z4jJ{&%`V%qzB;u|PxL9`Eggu(9Vwv(qV)!*@NEv^`U6v>CDE@!{Z- z_B+|~s*=I@$EMS%EB}D0*{a01=C^W%3>Y~4RRq`oZoDy&uyUp}?&S7)_S@Pl9J(;M zoeD;-G0-3XgwJG;evd(jc>kxM0m5wv&?}MO@}FT&khE6efZtOQVP5~wH5(ESqpCX@OrX59ICfy|&!lotYFdMT%5-yQokCsiV6cCha_UdZFG zAq9T55zlJyVuT)% zW+22_p(-KKMup8-sA1K45Abg7+iESzV?lpb3rBfO{wiXnZX!&e>P)z$fPAzAksB6I zSwNW5H8rk;ezJ@TQ0c#gS09jyB9^IwcT&-%VM|!)EE|>z&y!Mjf zZN;>Z4Us}`vR-giO`gjV3o8NIIK2Itx+?b zZKqonp0^b&;RjO>$p%QjU#Ydr9RM3t5Wss#s0wPd?}aZ@yDcN4x7Jr$U$bU!3CO`( z0?o1E;QoaZSaVHZh z<;D};MYTzAG90x+QDS9%R3u%a0$(yO#uuZCJ4Sy%*O(Q6wH6el0T+YDVg^4Vgo2%d z_Y1lD4RAB+7WNO^B3`rLcPy4k$bL$=%PS{eNu4@4;?c2c=@~0&7D27LG~;I6xPsQP zbiP724nCeU%MIn`yTLTaXpd3s?DRMw^qazb%Xc^8qZ&vz`tw(EXCCeuNSo}0XaQ0IjtI7weUbw&<3dcc_q&(d*h)v*Rm%DnJ-Q(>Hy%k;Qm2Lnnvp$i z0As-Vxx|is%co$7cvvpworw(`3CVjT@0Kwn*GbCQX>GM$V=~M)69*ZF|Caq<$FLNE zE=AixsVBQPlyFT!&HKvx)9cO8Qf~=0BdanU$D8ptMaR*iGx@zI-bte%vA_%wvVH$9 z-3>k!V=d}zgPqVVtA1W6_8 z9pZ!Ll>!i)pilVU-{b(&g=pc_eLwJrL>WyO&rO{WIeyGT@g^gg1!5Z-Zy35XSEy-F z|44oG1$#0V;@mgj7ECYOp@q^CKxd4Gp!Iz2rF~|Q173AX`nGeO=8%DK3>#0&#vK(a zLLeXl&4sku*{q`PwB?uBAQ>W{84p5zK-S1LN<1sHW4W$xdk_^SznGN?bo!*fpqVj( zs&%OUXcM6r7@u5x2!?`Mhl&0DUPv3v$RbK33I9+HUm*>pE7RY>Y>~BIlN0cY{d#>M zst;382$zyvEkNTd!dTdkuHNh|)o_m%_}c@eccFQ+14+WK6o14`0$j0g_a(yp_ zGRQdD5y^0F&a53eJyiN6OcG(@zfs!SPDg5qOqwf&5nDGncIJObJW>bAlSeo0$`j<@ zYtgvd>?jquhsCqmwYNqnYa1G4%Xql4i4n7_95m$$f68+Op_3TJ59wd9%C^W=$mDIB ze{Y9|q*MMJCP`%X_B=Ba6r|orRX}jho$~k|Mzfz9l|fs|E3|brvxL_DfhW`pLBb=- za6bHI2P7xrP7@H`?FdM~bQ}5=a}=ox=DEGa%-O@7n6DhYh&MoDEbm*Ph!XB5$nzXMaTpA};a)X9=wH86rOFtD27m^vFGmRDUjCVma zSZ1`yAoM*)5Mx6HgH(fyOZhhUmtzh4oPU9K{TMD6XC=J$zw#b-89v_@_O)plo}sTq zgL1#QhKn${u}}axm^V?9NSf1e_xzBtnvxbM3% z0j4P`oIC?yoRI*8WzOg4Tz9oKN)XA)Iqi#7atrAu>@>Ry^im*MEs>|NkKuJVksV7jXDa&%+OHi{5Vc< z*IuUJj3Z_MRFQKSTeJ^NKsX-s`jz@j-{3J8mXq)yLGBd&jhN@w;zq(>!wp2%3Ik56 zr<+%wdWj~-r8Mp*71Sy@Q4(uXq1=GlNs|)HcZhz=1bTZ^g2PG!Fq(bRuyP zKsgaixZL{1lD-x53ao%*KZ29xfU(2Orb)dR^t62g2TD?0mp?_Axf5j`Pbh*(BvCFS zRNLvO?KPBRjf#GmZo~z4BGQpr0I~C{Kjl(H@V~@*`ipt+v>IGsE@-69c;1GkQ=_1R zs8!ALXPC?;Kg&cV%HYB?is7}&7A&;odn(x6lh1^cmrnndhoG&Q1t=k9?BJX;1ATxC zW9k$@k`W~jd)w)G!!S~FYEuW?3l|!AI3jV;Y8L-JtjoAMSeKw8=nU?stU+LfPWY_x zw|%l1ea~$Mit0me#^yS)F}!1@#1-gap+V`wrnWe2VS30P&pDC;h2OQ#P1?|w8i5n* z)p7~cJukm3O(1~4OYYXb+cG)$b&jhy&RNP7HY+dX*1(XCqB{($lf;isD#j>z`Gv+N zaY}_|tvf>(*si%HO?uVt9W1LWt{EaYXui#l1u=dk z@)TJ9oR=71WV|r3a#FFs^V(>R#;2`pfC+5s5`&0kln?*p&=0ar@t*P1=@4RT=G?u! ztE!#t&=(O$@DKsqJWdE^7CI+XJ3Pa%-t_1*d|{I!L1b~z^d*c)Zi9PL&Hx*m99i-t zqn18>S=vW#k9;3S;ZNNUyyl!>o-(|&$B+5Dkm+S-h*~q9Aorg8_=N$YRH*>q#`X;5 z_r(x4>cIY%#jyo1D%iFDqDhV*6Ahc%tBJ0GLvRs8P`=EPPrj|wB+D?eWPCHeFarV( z3i6RkklrVofqaY#8AHguE`K`+!#2h)e3Y_w)fr_HYO;5;7-bbP#q6PA!mLvw)>N4) z<6)iCqHXl8npEE$iLLLmkbM^)*|Ch- zjDU;Y)!2ln_Q9TT%>Yuz2r#~=6!v>I1h|q+hyQ#)W7LU?6CWwiA-2YQ2|D2`kZuFU zYwdm!dT><`Cg_aP;?YpT2T{Xp%jmSqOxm>?xa^eBd#`5!S5-%n({!~Ai&7mt_bYZrG7s_l7BY+expcVietpQM(pVq zRJX+8<@kW7ES`+_Hw!%`Vl>z%FMa&^J+cE40E$)s@!jl(?*K{%52p*#(~!ecoLsxg zEO4(-Z@80x04|)&=m=}{ACsuJx1z4)RK=%xUBdu&+ToReFV4Gc@g-MyR{V*L_-JAB zKNh?ISC3#gL6zo$|4;cYip4I3S|)z%6d}v8%7KX%PVz=eO#`+!GZ}Pu3?VyHFoM3ZU7> z0UHx)NJ$x`QCiXtgAh-+PU#^x!?!6?h#YS>3S`2G;55*wJ3Zjw^mQ3Qqsmn%9y;n2 zo^X|zD=67LZkG`uQ1pye_4;JW_laxKj6((6o1UGng0_Z{`8^@EdWLG%kS9C$ca(S3sx&ReG+#TKUD6HXn7{ z81>8TsRIT`>1jdE&%WvG39c zoFTrx#NB~qWD-P&HlaS)_Qz0a83+3y?Y{?G(7-OAeWO2Ff(kKFgke}mv5a9NI%Y_B zh$n!J?$rLF&yw_NBZ}=tb_z(!_{Y&)2zrLYA=JWavz0KVEbrxA3*HXvG+=0=iLc<3 zB&6{Sq2QR<0?v;;>fIk?f*=>h@HDKYrU?>uglMdB!PiuC0*I&tZ*83~AdMz0@>3wf z1OwzFQPp|AGJuj_wRU*M-!j&9+yhR?yL$YW!`@kV%YlTh8yv}Fqjb@%2-POscHGY? zz^f>}C$fnT*|%#GQ~FhXz>=-~$E(FRqtVWV?&Of&mf$2}u%Ha#-M?8^i6ti7?K_>; z_8r}93b?t=K+sUJ{TNFiOf&Jp?`Ym^bx~izj{vkl5y=x0o-aj zPI<&X^tL=e*0F+-Yr|}Ab=0&!4+R4oCKTrz!SdL{-9+2~AcQ${O?vRqyNz6fR$@ zl18GSa83c|O5B_G(o8A@^A)9I(|4O(jTdY;uOxmLOL59VCwGTeRM?vXp{iK zWw9(C?o%#_4Li@3#OQiLZ#UxfmQt_cO31_t3N5oIzL$Iu!$9`d%&Be{@a3x8oh}{y z_iQ(XuKAAO8>tX%wz`zX3ttc2YnokUH03xzS$un5H-=qs`GLHQ#hgDSGl370xAUqisB8w@TG={KHw*s) zMd9$F8=q#@Xto1TRUG7Ed!u3h{(-v{UM%28yqxUD>LoHCEJ2K5f@A*V1MvY5$c`?* zh_w`=TNrX6kpBBQX3N$lHich)K5I(^0xy@?ZiY|m zX1|9*P%iwVK3%S;GAELeZCnSh?-bprUK(ViNOY$+MT1g#u}C!VMa1H0!5Gr)NXS|8 zn8GjTpjXk-xp-P1X50Yf@Euc&tr)#w0j4vig=u9T7O)XEY39oBidd{ z+FIG{5HL?tuJGyfqW-8fuq7*-}R?SMq`hO&D-XP zn2LKwA4XxZ>>F)FgG619w_J&m9#biyQ`0A>c{RzA-(t!i7Lf#TYmM*xgbk~xeeoV8 z3vJb>#iDtZLRy)>wlKodus-NdFZ$6QN?qzBWyih$`>Y`LQV9T4fyf~|1rcL2C-Pj- zrYsqj=I>rE#7rEkE}k$4>4@a1RG=Xtyle!nz+Vn$#`_}_2l`HNa`-{goXS4 zd1wdirA2oJH|TT)j^Ij$(K?dDlKj`4S4-RSUBGvsrQbzoH_w%aphtEBXsN|df`UFN z*zVn^gRW!k`K^atf(!vp$u!>IvjShV!PHacqg}8jjXYgeh!#~mvK~oQOr082^*W{M z@f8IB14)`1?r-NVi>t(B-HzMJ+(JX)PZ1*=YJ2$c#}Hxe`ohVL)R}wdXG)A%re7v) zRyY2RQ$y}wi%|DQdfX#;@0?pyq|ooVuEb^7qmyG}e$TI43ZwXo;Rn>}cNic}gdDv1 z^MeMql2y)3)csmy4=KA|+A{RMBHsDey5wJC=RsTHSzO|js@x|nfFBOg4tY1v~9BFnV<+BK>bR#=5#ty5T*U}r-!K}ZeZ<<2j6c!+2K znBeW<>jdoSy)K%Q@o#WwdkgN|pUj1}Ck}KD745T;3rm9Alc0hMAH@ieJgKzyWjxSyQ)aw$CH?}jk;%4s5zc{gGi`BH zbX<4M)9DRIs~9Z}t$21x<}xP-i%TpF{zpjAsC{ZlKQH!*&Jj^{+sbHVbj+~nXjyu^ zh3=$4rJI@VR=%j<1ApF1fhs_UnN*rJMxMgpYQDAo;QDHb)ujung{q+6pNgQV0YX=k zvoW6~8)DY4ElH~v+)z=>ufs!l7Oj~HsB{RULYpGntU6U58NvY_grtB&F{OMR;_dIa z{!1879^+{lul2`l456J9&0G9{0|aLgwTeJ`h{WuyIWze7v+Bn(&1&6!1)BJg5O9uBSOSY3p+ZA?|BhOPBw4Y<=)C- z&HA28#7IbPjBnOhi*VQu2;p+#-X{G_}6NELHikFDZ88(69roC zZgt8EelfOhjH$@{Feqveju-ru9Y(h@aV=lYRdwB8j*ly0&32Gl~b=M@V@j z)zA1WCgGRBo`$CdGTKL;SZ0`l)Xe{yo}HqD0gm58qjSc!SNJD8(vX}FX+g}7-hpg1 zHByLFxk05=e;jQ*`r&JXNJ`G*$uKa)1nukngLa8&y)?m^EtonSO^7b0EqpYMbkP`I z9BtLyu%_}A>r6QM-#ZFgneH%xD%)Hz+Jm1$Qp8ClFrM$<<~FGQK0N1ppL|JG2h{rj`souCVR2(r;LP%Q8P-MTGl6Ce9C zl4{JoJL%_+a%FyM@d};$OoX2g>0gDbdxpaWaXad{8xyH3t0(%Pw?+LlJ?SoE=0TQz zRuFM%+#BZ*0vPnTw^7dehkQqf4gqYk$Mg?{Egv)~X<~>+!O6riS9fP?j8P@eO+q~8SL2?g}D(BrqH1l8ZVPZR>I`ji#@2k25HmQvwy(HkDw-<1lm{jcQ|29$Ky%u+!nPii>dRZKM1d zR=%3_0!|L1q;ms&uLSgOAwFBlU^H|h)WX(_Bf<=?tvA!$^-My#svcA#;XSRxEQ@c? zD-6(vwx5qM3s7Tk1rY>yUgrnHXCW4+om=xkQ$0>Y8pXKaje8_5_?3nOia&}6(@X2; zaWcRP=^5`3|Y5BZDlC*+RFm7%A0Q9B2n_HQt|i&E7S+O7*6FFj~#KDJ?ThaJ~{lwle~4&na|he}m)YvORnnAaYr( zQHFbJ2rttTcfB8_G*I)d8A4N>46GvL8}$CAZE|YHr>-FFC<%!6QSeR^1_6qB`&r8% zR9h69eB$5EOOfyv>vvU7qI$Vp#dI1<1iy;GYyJ&DAt112SO+B_7gsySiVtf7^q^U0$alu zPh`&d%4ofi1!X_Fkd=!Py#Rt!Ig9QRBBALSVlYmb8B7sUgVL^MvnX{#e2*{Ok4Sbp zU8qO)zBj*Hw{k^JeMp~cmiqG*rfhhqcFK;1_7Z&S!t7)LOquVnMN^9}hZ4}tC#Q=Q zniS2$#xOp_063;0N3%-tLZ`!Kn>3n1C0u6O9%p)zl|~$FO2`xyWf+AwPcjJtbs~Rn zshl)TAqwZWlwc)5^`9gKI+yGKX#7vNqovq=Jb)1X=-}jRSMCQ6mE;@&Cob(9doBo# zaDHn$?qeCk(&9$PKGjH2xcOPfn))!v;LW^)*9~3OR$ls|@ON%7d;8Eq(3p*G-x&&aF3q<@Mf-VzV_ zTUsLhu|Srnxw44cfzD*rlR^-|h3WY5wFWi{YqB7f1il97s0)ILep*R9mMvYZ*q+Er$cn!MYQH`u=~I>@trd=v;iz&-sq2ekr&dCd3!V zRv@uAg)r9TT5>*1dp~+JeQgBu?K?x`0)xasp+RhUl-RiaI9}7#a>gu%g(;{JBg$r^ za60Po!gMWgOXIQDT!zQgks40;YgF?+A2CDgqxE4I2mJjL*hSzlAZ&D*J04?9dP}Vf zE;N?4sC<-y#QgBR9D;2&d-jL45Zf|6NeEwG8XtQqr??{$$>#!=tN|@ghuy?cV8wJ~ z5}XW zNvP^EBEQAFD+fqt=#O^_xF7ni!aQ1R?=o-6FMy@o)sD+_GiW9exXE5~!iagvm=-4< zC`=OanR_m^=BAvs@e3>6CPh!mZhREB{^t{C3Vuqg_po#rSn=mL&zsWdA)gqDQXgjR zaZayQ5zJDy`Uyg0U9|ok@8gI;nz4VN9)Q%CoYZM;<@^`*Oz;|#ZG--Bw zwyZDA5}G;ygd9}O_cGhh6^#>>H}ePomG2spWsQ;Sw4hD4fw$!;25 zRD3Zls`Oeh@@n;p0USz_$hboi<|98ft3VB8Bq^tP# z1_@+A%YgYmdC*1UaHU0(5Y6HJe1ri6Kp4jNR9pBjr;8VzG+Mrap6AbclglI>@)U6f z>N~4CPT>T+zbB4>&~~E9h=z)p!d>E#IY*5{xhaq!4s3);hqMuYg8`tz%^3`)c7Xai zzVEAfmBc67sy?6?9G)h;*gTk`CbaRO^6_#)TOU zeyH(9qAB;F(#d~o$TwO?_=rV<^V#a5qOH}nPi(0Y*^?-n>KOJyj2^6_rKYU~4l;>f zm>bTHSQLtUc7q9Fil9gw!an(c1xdG-bD;7Aa!4f;txoC_%VEhcw(T;jM+}dJxP_1z zv7#4=yp*f?c@62-m#J9KHc})}gi*s?&qC=Df64cw!61ttOguwg(n`mJiiB{1d7H6y ze)bpL?=8Yu4_LJvjna;2rcjpv0CtQ6qzzBP0#m|CmhDz1RHWI$;{E?rolBDSAaiZ|HHvQpHzeM4J(l}- z?S|(cVbL8k)@oTWfj4BrbabZEqK$N#K$%XZFN=?M0TnKJSr3i)d!d8dnJu7x$*3Bs)0K zP%(X$_JJd=0!&(!>D0sF`pcadPJNv3RO`F-%*BZ-j{Zaa8?w-#z_h|VheAawaCs{SW-30Tuc$vtWO zIghlQQOp>w+yCXsu zi?d;MN}=zpMd=!B+6SgZE&WtUJkKed0l~bTETsM?=J1R`IAgo|19WpFfevPH6urJI zXiqf!+)8sYJO<%|rELavoQF8QGUZye$A@lWk22in z-QDUQS1Df<)N%I^xcIZ@Rz61g+7UZ5VvMrV7|f#1_6=znucDibafiKhOh2SCex9<{ z%xq=!b`-f(Lr^=ZoDFIr zu?Y<{D^RpRSSu*c$srvVQ>d&3P0scGbc-tLd+0YXk;;34hI2p6uXI1x#Msdpn7=YE z$1sk=vW)*i&!AIPAKi?_o_6=eS=zE<-vPC8+5FnZ*s_%Vx(TS>L(MsY3nvjc!}J%$=*2^wuX4&z{RepRS*pE|3^?8u^; z-(tZ7{Y$k|MP{nCH-eT^^vy3SHE6Vo^Dm*#~I{IWVk|%hE`!zq2?O(*-sJ zPTOCR6+ zw<0~h^}_xwf5nt&ZTYV%qML(XbL#>ZR!)_i*90Hf8od6ffl z{lNH3?*-;xT4TX~SaZc`f1F(Z$EpL)3ci}0?OjEXkZpU{v+d`l(2*^nOeA;p#^VAU zjsN$4K>yj*fIT;)xQ3~eE-$}Xw?qRk>jqiE>yZ77=LV7eZc%%Bh2D#NzxTZ zy#S5L0xx$9;jYZB_TURv6ERfgtGQogzG9dkZ~Ci`-j}`YZ}l%#1?$(qrI#xg2jrLQ zi72+!_RB4@K>GnJj;i7fu!^R(3#<@bxoAV~T&au;tVm}((ggZndoD1zZ|Oatvml)m zqCa-I-TDGt%I7#%D+hR3!~TL-77spPMXJ)QjOtbk_t(b9i_P2>ocA^S);MOIejqo7 z<6qFZaca0|<*pDpD$*;r{`GQ!^2bFgAF$$R7Z`uN>z%OefV(0c%EtyPgv&EP>3`$7 z!1!B{Eg8#dYPh%IZ=^`WAIAI}TTX%X5=Xhfin3C7UR4z~i2l~A=|8aQ&QSZvwMTN( z-%t~|K`(z}UZDQXkdqbf zKHm8^d%P{b)s@(|K>3^djoV#~@AF(_wZGVt_=mL;99nvP=Jv00d!PLA69XR*$HFDa zAIp+y`!nI&$4~f9hG{|Ma+~ZR&xdH0n#O01lOMSp(0pj04&n6Y{(|fhCdEf)LbsGJ zvU2y9?^AQh%O#MGK`t@x58f_e`j^ZHyGB$F`W(5WP7C@YtlO)TeBNRg@?HeNZZfv<>O!SM1RzVYQXB`UUf)6!f2(h_e$|-)bPjU z5`Fvi#H9D7PU5a%!K+S*lT|n?m8w?M{=RZu)5p&MC^L#-eBiEXkrD$5k&HRtdXZH& z>XvA0Ub&Ed5uO_V-VY(Ic@f52bo8`VkKC0yXX8F(<+-JJYRFxAYB|ypAy?|2eq^P! z`X{%S)3GhGWi}!8ei33GF?gA3n0abOQ*E-IQb+Y83=a2c*FpQ;?Yh2#u>aNt((X%}G=~I=4o>?`ZkBgA@)c0AYUD;69_qoYRX}BjasmzZ@ zx(H$NikX?`a!6^EkDpj+2L@GdsFfVF0^85?ly3MndLAD?zfb##l$Hsqk7BMvfMQRd{l1_$$y-be)W{3TD?l?z1WX1VM#8-q%vGXtTp&>zLI0(-stkL|HvAeq?kn| zY5)sli?oXnb7%1OP}{jyVdcxysgf9Qq5HJR{1U>r7b~fmqwDitL>7k_ZXGhv2V$tn zErD{Gca<+;a;07j;%6Z(;)&Q6>5-Pm8pEbEE<%{8DdTLzz2slYPxP2>nVIIj7wIU) zx!u-ics9c1=!-S>AoaX^UXMmrPIJA;ddsUGSBH0Oe^_GdKZ4AjZei41E>F#iaFFte zT-aR_s(1SlW~WJW`J|CR67k$R2&Gyq^Cqh_O8pYvsi$4UpfIG>FG9?gIcda|R_l|> zya+32mU)v^hE=n~H8{{9_AfSz? zczOk*B0TFR?c-nNqnQ?~HX36mV$j%ilS~@(A{85I9)Txwtg5~L`j5~~PEBC>Rqje_ z(o$i0;vXtyf1IKD`B}oLD*Gi8M!)`~d4K$?Y*+8~Za?p04)@XOIQf14{OjApWSLsM zsus3RHpktfnKaJFr;D^dol+6$=6_lJ)*-A5Y3B7KQfc}=)rq;g73K@UeET1I_FqEG z`p!|J$4&2F_Hy4LTGAxuLzaZE+9uBF$XzjO_I1dMmSVXG_d->#_bj;}mHRm^Ld@N1 zJ=M?tW%pZ~yhu1N!aCaXeQMPP7TsRGb=QDZ@+n0f5?P}GEo^+q%7tcM5I?&l)T-c* ztXz2ZbqG)Oi>y*jA#+kG>8W`U)c-=}AWI(iTl_C~#hlYc25Z&o*EKU=E>A_>VC`kO zka`i~iMkPlcqH@Fn??z%AI<8w4pBVwA}gNNZw;@Q$X#KyQm7adX4QEu75>OdOEa?{ zS!or9kB%i<|2k zwRg&064n&;XS$v*vg@INrb5$V>OMj_;M@tnG;O^n$zwdKZ~~`>ibZvt3>O( z$dbi#w4xOfENA^?&(RK9@wQ#Yeut|zwS1A4Rx9y_?XI-cll=&3wRn3`LVsDk*&&^H z#zjbLuh0#R>Q~wH=S%7;oBqbKp2>=b>v_F`p%sZ04|jWi$SS`xN7Ec@5T;&)FfHbK zB9pWiiwj%av>^X3?s;0rKNSnA6fYx zD&tL%WoSOZwW@Mg%0vC}CYkm4ei5Y6su)ukj0ODBnfL9dR!_AR>~zXqvCdds3bNj= z=4(H)Eln!kBrz-5M2J^-{mL1`tvV&i+Z{6SK?DUhGKzSVo-fOggEAx zthq3Q=!x)*PA~6{8wJfY5z(^y_=qu%M*8H!z3Y`D&&m#25+-&BRZ4P+CuBBZ(?;7~Kf+VU ztUIhRA+Y@8XZ##1}OH ze_82iU2*&Qy?X^Nskca^7HwN+X`WJR&GN4=H(Xg0iV zBk47gYIuv5HONZ2<%=|w1-?(Mc?t%WvIbL6gukv@V^$-r1ILbxXclF3%lO>B* z7k^~Q;&~bu=F%TM`+f0bO-8Y9PNfpz)&$KRHJD7^d%Pd#W1s!)&mtMBvkuUcAP zjl#LyPwtY)`(vA|UZi?|?2wh}TeK2^mc(TL{PpbDeo|>aeS^L(*9R1_x`QdV92XM{l zYK?M~f5q3HkAKD2{Jt|Qb=2;bKK@l^tR5f#%D+|$G3W?f>9zXt6Tepqz6vCO}!xz+Zsaz*)L`&a*uM%Q|?E3%He z#-UYvUq7;Pq}?xUn(*L~Osk07zvNo|Q^qd`e^(mzFDcbGg`Y2E%#R8AAYuT+^w{o@i2!R2=!Z~w}R`lIb% z>1mxX{Db(qzBbi7E@}N^Hc~%iy`v-ew9_rS_YAUn&!&D!zsg-{ zOIL&0A!{g2eUg3rrdAZ+B!0dlb_tooHqE8%Tkp&L5WYdW^Z3wDdt!7wy)yNOmDltk ztHesW$oxZverODmfC6J;uUFHQ+ZS5`wvax^dlL0#zj`HsfZ#| z1Qog`!k8=xt*vp$lF)ltS~J02@pu>Okd>DDr5{=ERz1^?5Ho#eArnP;h?&%z{H920 zOYGdPvQYo@BP(971tPs%?m2p0AA+p+(vo`i_4#pf^N+Hv$ItI-_Zbzs0! zK{wXD)FCL?b`!=5%Y}@Kke1&6AuBEIZ4pm*Y=7OWf19kfxqENxkd-U-R)?%nTKC>o z*O&t%Pk%kt523eVpGkYo6b9GT{q+>P$0n3l8W$nv*g<}zM!H7kT{EdeUQ~zQi>#dH z&^3Mh?20Gni>$P?7WgAPRWGtiL$j&GAzWPQTJDjHsk9(lW)q&87g;iEMG#{qIO`d$ z2X6l=3H4^-Uo$9~Y&w2^S5HQr!$l6-i+`+dva;QabYtZswZ46YkYk6e#LR4;PmwPZ z1Bly)g0*M*gSi%$vH$hznf@j#Z#7?JrB`b6zO!=^dfFeH(3(4dJ$r2 z-=`Y!bhV44YJ5$(X{YK(2s1B&`ngyBrQd>q&Ofcrf5=L`r;DuAd;UH}>Rs!ptNvuU zgz;KBQwZE8Pj44lrPsCY%a`S67a9Nhk5I3)=BFIVT_vhDzeA{5(QAz=zIvM;z1Ak^ z)kis-(3-l}Dy&{%>1d_yUh9xmzuapbvPw+rew^{^a#t>f%Q*;jd(4Y0d8XIUm`>oX zr>4$p9I{fMYH6`TA$R3e`Wc6iQ?L7B-%u{c1L{S1N^6yy@J^@KD)qh|z2#W<+k|-L zMdshIwnnBU(a7g-NI(8Z%HP=im`TG}dAmdqPz8#qx8s;AtM=4vlbE&oHd1 zF<77)nG+A=;~#%ReHg}f70usJ9~S;q{^NZ={`xnhSD3g{MD9vqpUX;G!CT+y*hjNW zGGXdPmK<->PB{(y5@z|Wogx1k6^zi$u%9^R&tEv15pt@5SaPNJ<6m-1mvH-6dg`^d zf2HRgD=e+cU1gWz?FZqRb`hS^+n@AH%SFyOthEVY=0!L(BHf0mUTAit&#&thVTgZ` z11BK;1|*8XuT=!Yn+9%b*hM9kwNtF-crcW8IT9D0PC ztb7$|K~43*%UyLvD}g_<>SM{CLyY8FxJdCl!(^^oY$5$Bvs<%QE@WP0J>{P6kX44($v9+5sC7f7D|bn# zb;Cm{2ca~s;a9oq?MQE)H?DQ?vC6sAP81fnu+zKzv=iG;I+{Jm-yS5HAOHGYD~1Hc zzuu(!xA3p=+t3lO?O%D*dLc;>e&t@Ph1GzV!WW8cGeijY!@L; zYc~YpoG!Nwc;w=Ka*-KNne@N;JQo>@#2AN~lv$&lPrAtbn@@~!OjcS`D~8l)*K0_P zIvzEBkrv;9zs`4&ei6cWm0Q1HwQUivatC?2D&n~ahv#0s5ys`XOG3@e4q3hW^!g#D zZ{!lDL_8wvT~E)<4q4^nnc1sSSuSbyi|Fc#h}kYr&5I1~@Q8d(#k}P4%C&G zlfJN5ImUd^A4?$hL%1EJy8nLFeExO0R!{yVi+VWwnVnCqGKPQ6 z6lT?K4I=@$OOCon5h9s5$3>7sGdS)hl)L0;K5xm2x8(cd6hi-z)lYH0Axcf|il;^S znl!?ci!6DXG=62T6hh4HB1=NAG;;Zu+?8)1UEYN6s_E>1RoldsY=6_cVw+F{JdZnM zN!WcLTqBOjc%H*h^+T3C?%goAA$OIA=5dqF@a5odAOEW7>f5$|)pGT1{ENfE-1+nK z<*ILE2?4lLRNuD!OK$aT+rQ#tR`744sKBL!%TKA=&zXs-zHR%Le4{x}#r2I8`oI1o zeD%^V)HqHqVRY(t6Kb_}44Y1cXy0ynopBSsAg?nXvPxrGhg$pn+`G3(xyUN@DeaO& zh^J`>lYM?%i1x;c+NR}GOC}$3%iBcM5a*vYRpT>A z{v<$JbKGcsXWTSJ^(*?!Sy}|C^*u;&jSF!+T6!BAIaT73+J?Oxg_hQa%37sKwC^rp zBOTGs7b0363DYBT6<75e4n#)w0_5-_pHROL<>Zd;Af@ON+3Y>x5`Bs$A`o#U&FA?V zy&eS82e(lt%kJ%(P8D!1C`e^~kRDV!oOJq$i`+r&LWn9o`yb+!N~Pn6ke>Dbe>%yp zll|}G17ZOvKI_>VWJ*0JcfgOkYCROaw2^87OJw>c`S3_w^STX4I`0N~x~xFEMK)5X zaUn_M^DSCSXsmp4#r%aR5^E?P#CiLoC6p%R01Q2X@`V(tL|jd-4)WIvAy@Ii1}zFT zHY46gGrWU11^Se6Azo;ip9hDEuS&g=SS$+YjR%EP9ldmU5ZSI-ErWJV*rEazPcAgV zCx>3Y6lf1Jc?mNB64f5P?<-dijSDF)TWr|~A=`5yibXqa$l~gV+}d(GNcFts=+~P1 zHBxNlLNbqF-B9fxVW|()E`(gIhY;?Ws32`i@1<_VH7_J<3qEednzXu4&>QP{v8o61 z-cq)^_7f3)rXyo$bFh{BOF{y|9(TFZfU6qgLy#>YWOZz~@gy_A>jd>lk5 zpPNoP)5T3vpmZUkA3378D=QOQdLyJC^+HHL+V{bif{r~p+CZXz;wq^RqP$|4ZX;6k z^l)+5pt!WbKkt)j?K{->8AC z9Uq8K{S9UQjTCA+dQ^0o3}PMRu@HeU;^AGrjd&feEL9yu5lZ1uUDYF(486tOS|Ax8 z(OOtn|I_uhZ8qefEFt=Zkp9)Mi$~-tF7>S&WrRp9JnDD3*`&bINv__N`4xR*UhW^nQs$;OQjXJ>8fV{r5D4Lc+UQB7)mwSjmYwa15S zS7?8=MiO;i2vObFZY1+OEzY$(c4eO@U5Ju6rv;i^qPM-QgA~2iP^RkHL`AYHD}&V41fS$ZRK3HJ~{QU_L8uA zSG*cMygu?K;{nPns7B6(un+TU!S#m}Z4czf$){dBqL4Poo%x#6g_JoMPDzZ=-c-}y-M}0ibXEvsGjwQ6l#8vEIheq9Xj@aB~;M+ zK^ms%q@TMpxfK*Ws}ZAzFkf;I*KOGX7iSn8Pdi>cpmlh86qCe`d6h&rqP*}WDY=p-78jg zaV&DA-75xC)YV;JAY>|0;<7lVsQU*fgb!~RkpD72fY<0Fa-2}bwmaZGK-Qel9(Qja z!xPZ%$At>ntmQ(w)Gj2>@i?eOC?loUzo;n1@qMr=`WZts5Bhk}+lw2irnL7$WVodm zhE9K0pd6u$Cr4{t^(WgZ=rjDi> zyn4jC6Pgb&Dgt>d8c3DjGsuIm-lt;#^+BM^G-Cb$ zQh7ttilY$Kc@e(mXwUE8KdXVgKrVCNZHS9~XM>bsf!zkBA6oh)agY?G2 zESHq!hPGj{*H{nY^?2TQ5U#H)w0E#Mk4jLM-<^T^c5qsF4gTveu)Il;pv++jXj#iuW+_b*b0`>?@xZO%xh z&=C_Lo)OmD0cyIeI~qVCyrPPtF>^*l+?GxPQQF(oNgzE~Z8n?<+Hw`D*|c~dN?>$b zEN3>h<`_u5k3BR^awYee7m__#AAH-06zA&>4M&kng>(br@yT&6V3w9+YK5H5RyvUh9zuVc_=JZMY{P6+64ng~*UCfE^@j zyy-&76&9E^fFA0N!%WIS4HT`55v@y+8L-uNWZLM5HAF0>e368(a-r5GC#vRedG|QP zD?LPSV<`tADyOor@@7+S0MAC^1e~-xSux5$eQKX%JfO;MQP3B83A3!QPDG`7#vZ8}swb55}@_Yj#mDx%X5CvpMiqXGEag-0B zuuE7GmuYc5(mp_uY8@j0#q0wU0c7l%8Ej!$y=bAm$m~}Dn%$xvl5F6Rtop|d^oVTy z1R&WO=3-^96~SyXC4fT67*zlS^Etl&2<8J6lLJD_wP^D~#M2&|A}%sTOtWRXDQ|sb zYx+^eQNQ>@yfV)KH&W%1>6C+P=-PJqn+)J+x)w`ZPfOLGCqDqUE8#ex4n@~AO-Ccr(jauv#R?m)_{52zm` zv)=RbU{l2%nq|ojB`%@7+qjWR+yObu15bWk@K z0I8r3nHw0=MyNU+_(O_E#sS#%L?A#&3!ojfX_XBy099C zNIX3klEL}+`yj0)>gL(8$VGs#eYufBl?##Gr1@6U`I5#dIjjbM5gX*#S*dC_+i5%^45!gR&aK-Ix{_ zMFc3WzXFI>>kp_>czv`=_oF`g%tJdhkUn&;j~=AU57awaYeqL6wC4lJ zK$FI@Oq+Mz!64<-$zto&OsT3@4B$A*2Ph8dZn5$@HR-L=!wJw8X^#$Ks`(Qd(asxD zGS3~x2SOvUO=TMqhcG7XBIC2vMY>uC@mi_be*2#z}}l0z}`MUA-c}f zuU2~j-4HQ8K#_(`IT?l{#CSe{5VC^F018JyCXbSiz$YziRq3bl%DP;kJ>oDz8lNoO zh@o*E?LrErHd-ppSvtL>}(HJ-Wg}31CgOQF2viP(*xp;!`&HAjF<#;DaY$E z6&A61w>IapfkI#dyrVJLrB>K9E8IXK>IZPMhL6g7kA{sIkS&k|Vj_%D7nwnPyq~X_ z!v3TY^|ifWfHDx#zwZ|%g_0o(R7AU!Mw{+3*Z=`E8=UC9PAL@Gw#x6ejzl5+IwYY_RGI z$!iuEfQ}S1FMb?Hk#;}ANA)Pg_y7qvJ!is#I$vtb&j*krY0wZKk5Dc-eE^bX>l;dq zz9~fc0EMW&PRg?&K+LKDSt0rdNRHvlFnr$xV0yj-(Cbj2w*ikxTZX9)4kc!zF9xr! zipd{9?Jhn9*R)2YCC{c+(jOu}Hu}OCEo(g^Y`z4bqT1w303|)+?hFn4xRWNX4FTw7 zRoTvAoR_5{fVr1?fF6|#h(PB9IPhX_Rd_G6Jhp$%RbXT*`BUhoiKfyqX-bbOd z9QtY<)mC4Ah@ANbxr4}?t!Qc+R6l@Hgt91Aw6j8HuT516rt~*JBY#=zTs^n;+oHeh-=E)xsPS3l2`{dfI?W`K%gm> z@&O7V4M^@i_MjfL*AM(HBhTy?LTc;C_zaesTx-Y#Xx#4P)kdBF(p64A%MpNkn|zWZ z0M|D89ET5NRe_LKfD590JAwgUXZPg@27J_5j`8DaGXa)Vpee-s00fJ5QJpz!x`yig z0mg?t)+8njV=dR*?a5t-HuaiS_PrE6wGG8+)JPAhIe#5T&wyh>jfZ#UNq@qV>F z`a_D^78|A4f|3eom$~1Mgq#;5!#bG%LrCS*8wVkm_Y=_@nQHjMri?+;on_?%6mk7M z!Uxq$iz?RTl994&iqNaa#)b6Y)TF7sn)PrS+M}oqh{yUf2Ks1f`T&K{dAcIy%%UA> zOwIHkdi7Y1L8do4D2y6r#*JP**e|5}*<4511W4W&=$ak=5TV)=jnniH0<>$m5k>2@ z(}Vb;WQm3mp$C*gB?gH?s$OyP>PAQ(dx~1g8(ISFv8T9^G^MF9?saJOV1_%Ba1FAo5?Q1lnP^4U%3GVtYiHfP)gHw z%9E(#@SMg#7Y266A+!0Ek9x@s6hgWQoVuIR5F64W4Zs9&xR=DPoZJpd7aE}KHLxqP{7Fn2Me} z#(v^P3RNyd(ZqhDY`hFD){S>dFT}Rsc>9GU#PDLa*Rla_$E5&WbP~q~Y<`IBB=lJd z+uB7+AS%fXblIb3ksDAbnnf0N-iy@QY{g~+JwhGX0O54jaRYKL{To?Wk`boY7Hk6O z1=;9Y08(*J$-(I98zbFQ1|WOxDFY}DUlX7OnMVsUBl|`Z4PqY+bw_S77Bxb=+%Lpi z$TDs9XxRK{Bt4{O`a_7|!~J>6MAvM(`0~9F52~m9A>Nj(*zgK)6caT&z*IcU()bZa zk3=bpB4Su!6POAyK7jY28(;P9$R$kOW9;D!gWkx!3s0fag@{XcziOl|S9f}r2<4LE z6~w&^8}TA{Z)qFffc^nWO}mVpeuAc(+hW3qKP0Sc|znrt8yTeCS?E%ZJ9 zGMa8um&%Xyk%zBm2*CSyFKM9G$bDo0h3Kw)1&2&%HFX0;I=$)6X|Y#Yzcym?Lxl1@ zNTIYtAoU3lS?%RQiryB3RILiuKe>ngLKK_zZn7@)Xi9HIt%&RqYs`>l=p-;%3?>YDpk2mG#Z$(!0SG+O@=}|Jgp;2Mtj9 zKFDNjs(+;Tr;gBY)2+?k9Ha;Ph4i3z!F1JI!hE9az|;@Qe=_?bqw74FbRd0tW_b|N z+cLmGMDPC5BQC~DpmHHD({=xN5ZU(Z@*qXu0}Z)~enebCQ&$Af3lUd(Y(!p0taToI z+A_dF_Ug@P2$bD|}j`MnSi$`B4HegOI8T%e(Qk;{b;QhKTgj0g(TK0qO?XDuB|Pq${? zV^*Oq0p^7ez$X@qO!6#O7cu*c_eMPE6N?+ESbR3)AcgY2O;2uPDDSvGHV{LnFo|;z zFTMEGoUE{TY=Kdn`aw!DEK^Mt3_V$x#W{%Rt+|?|<8E#H87CGuBCZfS#9nPm$gfFJSxbYkaNji0ZN2tcx$ zQEou8GMN*AB~;tY;c*+H~csx5p$ z}3jb6z$E~HS>K$AMA1m?c_Eq#|}6hCqJVrVcO%}APd9G#@*aJ<@gRkoft)S{ z?OEqRl$U$agAk%@=~chD!u%=uixP6_DkXi1auuq6(NHK!Pm}La9H_^TPAF42zKH!G z3P<-?fHaike(a|{5z3=Wq_6LVs1r3V1xo&bY}dFI$cQ_#A6*Qn-{m5N)@x}Lrke&( zTxMWY$&j^q4kAM~Hn&kzs2OrO^T^en3n9IAT@NDLHm7j~S^Dtt`lQh0&WSU6AJ* z8}Vv=bKpjkH{`1W4^pTe$cgZ3`?wIL>YLpULeybB<1F=;BDs9??a(}KOruzf(`lHY z!Wpp^7f5lH3z2P|2+<>Q5!L4D4nkDVO$QTFJr0VML?e~`m=~h#ed+s@eKBp2q{p|u zZ`3KTumm6@vdg8K%zPmVN9(pfr0DB~$m5K0yGA((I{Ob43TE0Eq|`oU)8`qdBLney zzCIChPzAldmnHd!46?z(KzyFBR&Z&o-MlN5^d~lQD4!pa{>sF*WI_=(|C@|;Cl_j^ zSH0{81K{-+0s7%rJ?sXAus$q9=&AnvwLWYBBGsxbi)mUV0L0p-fZ`}0Fab6C5)F0M z%qP9EUK^-WV6k4ikrE#s3N`;gQOKIkLA?Dp#b}qU7Dhjy7>@-auCS)F5m^aqI)SJV zSkv)$pi0g6`KH(nGU79PQ@fC&?;hJpNy#N8ivg;&a)n|)W%zM2lw&`|h|gbD%{{nZ zIw(bNFQf{V^Mw#1M?I0vK1_iptm)JbQi{zleegS+{Gg?9WY!|Vv?7&x*sBXU8KQ!6L(`EK=D|BqlyX%(&&AoMmf1RJxJ*d zYcJ~PS$AABww=3npNOkI7vjxS@72m4O?efU=cEUbX`iM%h)mb=eUP!hYh9rsOYsAx z-GnM@cEr{z0`-W?t{xm;q*qa=kA`bKz~7E_g*MXru@#+z$fMSDWo;3cVascabp`FY zSNG4R*B0vzB12x+of?}*BhcD~l%jXwHd0*ULW;}vMq{U<;gs#@93;7HrF?2;5mnN= zpBw3G?fF8asM+b{HBPqI(`#!20ThpR;tXD;W!tly_vcs^)u@jPQN-#;Cp*WpsgbkZ zYygVHHeCZCo{hQ+u;HCv^`Gd4y>j(Xxe(Z>#SKXM&m+c)|PZO z%E)c4*`$k5mrE$mRX1V`YD+plgb*`p45}Mb7gAhXdLx9eC7pv5eY3%PEq7M6LDQ!N zHlp&&s5$j+xb}fuR{~L9$(lk3HPGv9Ga2a^DZv`wg%T)x9>+AXXfkO_IvZ&+X-hgk zr08W&MMoFV9eO}&WeyskaUn%7D{nsF@G9F_*QpFqUV*_>=w}7$pnf4rI*n-lrdJw4Guiq+8^R|XWJgt`$&Et)~X#cF*!I(my*_Ye~5C*z9xlnvwi^iT-rtwVtmn5^gfry z7+gR6aaU!8GNL5BA9@gZ^nU0@s?yu;D`tH0mg6OFCGPywEg(%bve+8hMo3+JW*B`~ zT!r$P;f)l^wvI5hflK0hMruSKn)Zw|5E=2c9#aSBmrL}vzjF}LSFZ+aMD_5^9+T}e z`gWz*zDRXJXD@$94~`f*bh(miMkpgn(=*bI=)S`K&Or*bM=wo?LT>p&L?72JYDgNN zV%)bFNMA(@>AN1+3v2yCic5WH(JExoyw!Gi4x+EIC7vHbdfgBV%5oJdMJUHeita-X zqP%*E6zwXmdLc@pH(#T1%UxfWW}_O2$`qYY zNY0F{YT}%{Q(CmrS~UMn-YGo@0WbkT4Sl9-D=6BTKuGRY--9U85xW5zm}{(VD?Riv za`k15c_GTmz3D+jZ(ZA>`*;es%%+w1uu-r@9(HXAKbvDc%{C#mzHH_ft3CyO!IV*#WOD1dC++Eo0JFJsT)Q_q>1w&7zf1+w9p$E1~(B7b30q`8=qV&}_Q|g;OFL7=TiY5`>sA z+j`FrDX#K;P=fmQt0Kdkx~(?ZhR;FNPh0Uxvhb2*qbk{s&krej+v?nCy#m|v`5{D= zT>^%bIPYJwHJ=UiQ2qctQleAzyFV5B8diTs@dCgj}{__elNg;Rq-zl^0U<8VekRT)LN-&N|B# zlJo~r5}ua^VxKow?Y}JamGW9tN`L1E> z@DUq|C^?^CTYe;EVdI-RUQ9dn*$=j9DIUw^>|Vt# z0yD33U?ZQx?y;;eouk7qSDC!|K-cd%FthyW*_vX>uT3P1+hl#R$TvC2Rms%640Rs2 zvpoQ|NBW%zC8wUg5=*c&&T4Sqv!*r8BWRa{d&aoFOt&{%TUth2xIZQaMx0?=K>2@p zY1~gKBCVOZxmsxE02Sb>aKfVa-P0D;I(P2LhNiG#Ue&b#Kx1^2?n}O|vV2)dTQU+L z&@0EiJ+)zreN-H;x0awUn|jDl8a&jAhL~ymCp^aBq*1=Q4SkL(eVIBqjZx!hH37~W{njtT8?7_eF>;X88r z0p41g6-B^K^!!hbzn4tBF{*~+vWFk8G;I8&iVH=WQqqQ!(zFHQf$DbGDqBK|y7^p^ zZt~-eh5TK{kg&;0i1l&)B&$@3H-O`uT3XDTOjUT#=dc9c?R5Y|6Pwv4Uq55Mv-==K zpL%-t7qDmbT$gqvTnAfnM6JZ@w3C4T7`=Ti*vvV|8l)#Z+6hULQ7#;YFjl$9@DHE^ z9sLpL#4-8p9H)V5{ZKH2QIcvbQ>eCf#kQMCe*KSm)UKVR-Ncr?{5s*25MDrfxDMM6 zs7Lw)p!^&TSfp(t5a}`INX>B8KQmD$CrZKX*WKpcO&Be^jlu(&&+yO^Un(0`1kY7> z+_74phAUtGy^<}paKbDgFN{~3yPlAty3`oDo`@hGw>u-RYuZtc<+^jSaKMIhkWBG} zLdSPZ-~!d0Ne_gSt4Ud{PhSao*MB)sy5SStc3UJn^Fx~#r?myG7f85C`e#GZPV{h?d8 z1T4OZeYp(f^(k~bZv2bfBV)vmQD8~2(4?kAXs=-$_P0WMJ&cbMcotWzyN^y6ZJS7` zrPihCfl99zI{Gh`97Y{&yP#BsFbIYUbE2}c0*<;WgxA9e-7S`F?p^foJ@~E8L;&zE z9trzW8xAS-xyaGcG%I&K)S+W1I>9hUo|fvocMwgSallJ?*_IOM z&1EEMJY?Ci6`>*!5o-JN76VSF%aY>ATI$pj4bOiAs~g9; z>;|LdReA2H*0WtFXrmt`3;xTZF&%2+YEU;IgB`R}Dkopcs$akZWKyQ&Ql|*s>zfH9 zIwxcoaJPl`l75rm%MxwEx!x;6@oxK=qJGd%k*d2@!#VL63tQ(!M2YPVL83IP>p4s; zC~}#_rHm=4G)j{e72P+;6ifPXI+m>dgjDdsQLCsls!Zk5olopgAr&DDVO55!=&Wy^ z(h=Op+h!D= zew4XsE>1*0N&3>ToaDrK#>@CHDLN(O3g4@KIem&~6IKl@6(IbX6z6c$o` zG|U+?2wXbC4czl!a#A6sFD-fLtqJ_p)RoDMn?HTzvW;$^F!mk46I6UYW2I!EJVV`3ta&a`9Sych~+dxEEIB)`!Ra z=p$7X@jQ_5Ad@qbO9hVN>CwiW%KmG+JRLpPeKaZa6mC zg#lj_>$G}dIzOFxKlJLV%Vq~sGZNIeP_VKM`2#@?!%B@~$6|5``#-Z0q>%T!YuR|r zY<=zK?UGXn=t;)9dl6gvxDB(LV27F$`6wXTF#~7pY6D++{-`5f_ZESufm&gGRT}RP zo0tk{K~NGnC7T>P?QB`$a3gU6Uu#~e581;>(i=6l4$>fD?eO3;(?2KEAs8f}&%U=!(|s?TYSl{^x#mAThcx1i`F zL@)nR;{aBw($sgF>0Ce2wPO@si;A?EohFiN!D>c##`Eb$$XCYcNeJVZI9rlZ!u-Tl@<9tSoWi z8OjSn&%f0(F&{%DuTxOWH zEB-3n3%{T$!QD!}+;LvhMgCFqWJn9XQ_65pUi{raqKjVuZg$1CZ|aI$x(iG)npyMV zG1tLZYpj7@R_mL`*oi93+zs(fP`W@&_` zn+$mG$1@m57T9z08_VYX6=|d4r!|=;!d?2~hJ?ign9~C{9mxy-owcl_V>KS}l^uzH&qg(AW!nB>=tq@l#+n$Cw_6I6Jm3o#MIDhC*48sloYd0 zZXHbXz@>z^c8-LVt(9z&heGA-~nvKzU#sZ{JI=u#RcI8TK*O+vpF0<;(! zDyKb<|L*#&K}KiS7!utLQ0)FEl3y7ZsJb!@!wA+Zd!3u39r|De+s7)GN3TZ(YCo?qQwjBLqFMd2< z_Y>I_i@6uE4nokK0UikB%nfg~rI71KVdpVgkN%V{Y6Wms!W$LxF;942S0yHa>LrZ6 z)Q#fiRW7%`7ONNEQDfpPz}{3Tv5>!-9hiZ>P!Fe5iO^6F@{5sU(LCMrpHg;s!__hU zZMnLl1?BsE`~rB5AUR_}at+XApsk&4wvX`6>F+Zyrk{TY#WZY z&Aq!KY}JS}Fxi%CRu8ivdXK+JHp@tUm`opHtEKDIWYlsep@!2Mm7xl-YLKP{ra zE5_ykeajqdu*lw=kx(iG1tugU7m41h%|I~HYQ`v`t~OQCj3lM1q(VFK`wCd^;FNP} z)4Dt*T3mbryE-E0Kw%w%;~-@_;eJnapKRkHT$vo{1!>ps)id>d;lOc3yw(>t898z9 zsz_RQ*7Y7HpR0iXFR1eV=tc1!slws|)T+^}jX?ypOsdEnlzc+v34K<)N@!EC(F0|a zKT>V2bjUjFpJ?UKkCe+(QEzOlSSo7Yyw`YN6~@{BMvLkNl^FdDz0jT2Y{h9S%(5b} zA9lXR3~lS1qpkohQMM1CD6n(p(~Ck$KUi%vI2@>N`PPzx$|z2v6rPY~xR{QwZuZX2 z-@_s^=Ym(?wsxe@13Zi->=*=bp7H8su+nI*sI$~ zta1NXEc2A<9SiQC&@(+IvgySowGKAiYP~=HTU?7qU1IA}f}I33!mFZUsjWA!X$ci7 zAf8u5n-Q6&zTX!PHd5`Y1xKAK@hk5SA{{FSv-T-A32}v zXER7~3(HQ)oMo=EjnK5JOU*q|AqCXG-I20VYYTA4E!s-y#-S3uVfUznbe*iURFF|_ zv~WCx+KRLqk>()Ps|maNC>-!k)3;eda2W}w{Rc{{UC4LSU$_o>$0!&0INP)4%vLdE z+F=suc=KboCfvHRb@(Tx2B|Ao*KPP(#%69NGFRhp&KdsC=NjhE*PKkc0@ls7$Sz?5 zM+qesos79~2tZ468((|8(iDS0(5{B+d)WD6~Jx=_|w?hqwt8SCipjt5hlrH#OfH2g6aJaNyo$k zw(YTkt`pn$-!8&r6ZJ3SckGmvj3NT@zymjK>Ba;Z>Iyqp>mP%(OEv8OT}4ADgs^Bd zka#~RaOYP^V04z;dcwpi8^9CvnB1U9rqu*i%&k+V?&*$z&!$kU_bwI=#Y{^lMx~tn z+ZwZ!DNk!uC0_I)>>3W;Zh(9RW&cgW zSQ@~5Bugx!&$gAWe#aSX$~FyV>W;kXI+4ZrG$D`ievpAD@2#^V+(`0Fm6jy1OSR`nW{&P~^eLRGT4 zuO!BiYK(0a7TXizdv6ud<{aC@I5>}7232uY11OV#8-5^9t=`c#*o+|!xUwsB1By4> z78;^d7{n*HFX)ZyHhiavz#cNtTx`(O8{f$6a7R=DUQij60$I~(DnfUsyPDCH#P4g+ zle$SxhH9MKDzg`o4bo7P@_Yn1o>TNtAqKrCXt7-sbRFXrt@s5ZEh(MIkV0}>n~SV( zNM)XH3#?jl^Kk*{o)btowB|FMluqx*Nm&({U)TuUZ^|f>!VlG3zqFXXiQn{M;46Io z9)gg5v6JqlivL*c1s67|u0m8z^NeV~vB&CGura9@^` ziPz_aMCUCPLg!bq<8FOdxZqW^R5?Mr{okVsZ<hGik?1kYGQi4NCdI6^LTRdQw%mE8Cx}m-1H7cVaGj~XDegxJi19Dq~z!PdI85V`Q z)+>EL8?pWd>Kq}<+GMpcq|Tmsw?v#DeVlY638O~wO+|o`ukoz)PkL0ZVtFK*x$&A+ z+f{|{CvoCsUywN)|3livr$enTRp%?>`K29)0Cz={=0*6mkh;?lEO>o4xaKp}NLW?`+cc0MP;CNb$7ZtiOzkv4DYR)p*97CQca! z1dcR7Pmdlf2pOpk>&A8VV=ppuud-{_cqI_U9wbXlhD(Nik?NOQH+|%=^ znPKSm)_r4Md@(GcbY#-+#V}+=je8pb?SozLttib!`iv&pof+B4rq=F+8{{YO z-mHP}Z29D;$^$w?wx=GxK0+Vf=A*ypm5&ACye3~fi6Nkki}2FeJ*79ba%2^e^VqI3 zoY~s!pN77`;Jc4NN#--2GjSFddC$f#yXh3y_Eo9_9&V9HeRI|fBt*%AmiRiXxy0YY zMm!k5Xkd|5paduq2GUFbtJ`L;4+)Q>*Qz}Y4-uFtq34*4BdSZ`0Ue|YQH@)u+=PZ3 zepP8!yip*IdzM})^Yi|srolhGK>;)f$;0-Bjg)0COJ$Odt$2<_+!T0yqU=RIfAgpt zR8XUJ3yL*gEzuj7ey0chR*T)8R7^_>kKl*VDspd;2WuhsB5)|0`GhQK0hyKiI(&x? zUXjs7$cFv@9gfmNclIjcT>ZJW03j_2nsN%*yS2nxI07h3w?4f=fE@+GjM=Zqsr3E~ zyKQ&Vvc%?a?&;#^k$lCWge6ATTf zrL1(KFGN4Yiq_ybCh%0-dl-@n6j|XqNg_BhFTcZX_nXW$`EUdLTl`suuJ(B9pQbl_ zwcS<)21nwhsDGgQiQh=~)!f^HX#y+xjycXsmj&&1zlo!7%?YlWM@cO2uz8LCYrz3M zxAsD}`O`SBNaO_*Gb-kV$5s37*TkusYFaqkx~+J$kC@fom6>kJ-$F&TmgE*7{{?@q zQq0D84Z}IdMpcTHgdZM**l0ISZ{>Ql&m=vBau_yN7JW|lkk3R{tH1lB+tOHzBcQG> zQx76xFgn~MwmF58%{YJk$GSQ<$`0xc>=flK9oNdrO4#43e>f#c%q9N>6Cx&taHBZ^G?VU))$RG;SNZ8 zP_0%|vZX%tREg^Dr5a5iU%zkEG3*{czBny~IjbYN>HK){yRGKL{46f7^X1x4c~bw) zAHLSnRXK2bOz+Qcg3ZktUIQUvYV5zbMpViDmjLy}j!!U*!iuL$_9_uQX!?&T86}eT zIOmoUj=qfQLm!ubl%iLT@4C<%WNKJ3@99@;Yf4W_T&;v*t%}3{e1MSS%|Y^(M=X8> zNn@P^fRx4?%W*fs$De(cGG*bdn^2EZvM%#W2I26M+dvr2JXVFls?quzBk@p%*g^iz zgtAB|fBCB0T#;^)d4i=jD<&^bBw)-p<0Q`mb<5N>3`we2yEWj~#&|=1bJAvPs|J42 zVe;K}Y4i!PhR{M4~DgDqkZv+mFva-ww>l6MF zByBfJmYO#JnJOjTt*i=u{GSISMC`)^gw^ui=X`Q~Yo%%$pKT}vC@)=eCSAH( zpKV&+`huDSy!BUW`|PLIYmU_QwJ5|5l@WeU@4KScnHoOr`4>jhETm6|CdG8Vv#M0+ zEN(jW;dj(nykstq&dr>Grx}K#63H>5BeI!5Rw_As$8M%nC~;8sZ+0BJVvsK$cKpQ+ zAPW6)a(4Z(5wLN+Tj}4#?vp6$OQ+H@gRf(uKYZ=~o>#^yx;x;IF5}Rp*_&ak^aFLx zal>c1tglzd*0%YFWOewl<(>&>mZEc<~KK^}(lH0Io_U~2B8*?c7LEV{8 zr69cX5y)Qa<=PaVwL{}R^JhxF{x}lthcx*++&UNvb?iI#E>CKJ4Kd_Xgo!H z0W;5q$ApMwqN-#0=HbLiP^7}(-cjTKufBYJ3=LRWRs1%Z^(a-BpL}kcK6t#UpHiF7 zVJYQdTegvzIh96593hm|nQ2A={MB~i$POlU|DpqXeTi%sXflXWSKM?2!srhMRL$7bO>@P(2Iea5UB z?nnVK{7SLR)^rQO44eY^Pwt|s4~t?EE*EdKAeW+}NU0ZE31uX9wT}k3=>oeH^%ViD z>EC5zMI6y69fGS8;sUu4<<>?nh)zR%0vYY!3^< zb1TMFu^22$I{QO47>}+2 z;DD>C2bK<#=v%edOGwYdPD&!a{W~O!bis%w13sxoI}E!*j$L%phEoU4@yxW1Av7z+ z@@jk?H3a;kde71ef3*751hdOSCm6p+6yypXvFL&rMdm^?62e8~j(PqxkrjFVeO;z7 zvVScy$sy1rH^V(qjHBi=n?v{jDRn>q0e(mJz?E&R+ZG;}e=g`ke}VnO0%sxQ-IB}) zge^9zwT|XeVgy>=*A9fJM*YbCu3#-*gXtW3^GW?9gNoiunM55U_JWz!dJaRCFD*WO zo#O<^`vHBos*RIai9Fe-I{6;IfUCD!q-fCx$fx@P(Vz0G9%R?wHr<<-)UT-+yEi7}A&%Q@#vzWg zDYP$UwLM$E5fpaXLqMsu-XuzHtf%>IVAiz&J>h*7OVxVh(I$P{w68QEkNZk=;P*fF zs-!G^>uhO_Gbv1+W-9;P`QyPOB%3%(R2-fq(AiQa%t$ktsB`QQF2LMcRc_tE54{R6 zAS783Jt}_)x46XwwF2ZQ?SZ=4I1@~Eh^uLmW0xkbCtpQ9k7RABVN`Q~sw(kCo`z}d zv)C{15+s@Blj6CnO_G^U>dH5o!%(|6uI@3cGqs-hh z0=c1ts=msLu&t*V`HQlfH|p*mmo&aoBXZdC{xsTXp(hNX8n{MWb9$>eaC;wB(+Ipv z^r5iu7Um)C**(u4j_{jZoVK{-sxQM>UUR6*36MCFy_X0lJMyhxrU7pjZRyhf^@uP& zpL269LEmt51&b>5cM>p>zm(Oi0{?&zFM}%%g@v;Vh}|DKh*sg^<;0)3NkJGJx|KN3 z*Kb-wU!uvr-#cgR9&6|Ia>4T&InXRbQ(}w&)AfCk}~S zg+By!yP+k$RlW7vxc@>nd$ocxgO(a@myMF$=aZYT>paI`Fy}aQO;=K<`3>I!Z=lkA z3%`KTsVUZp^zE)zYYHCq_W&G}r@Vo?&T!CZESBkxP+^xtBkYZ3g-wn)0s*0!IA(3E zaogMMX`@nVWpzF;z=%~f{p4xK5IL){hp+7=X@=NAjRpW-a%mV92vqsWv{xYzrh~Iq ztW!4Mvy|=|f^ighb7mGSzSFyT0P&k`mmtMc+SVZ);J4P$vRgp}0k%tAci+d~6d?Q{ z%klYOlwCUTEhg*-P|LIsaU!Kc`!|9KMXX$4|FNjB?sp#^k*u@(Sd7{W)DjXJyLQA;i-yovjx`D@(Gf~@*v(5On*LOq zv!`7I8f-WW`K?``I3?>F3znsf*Pj~@e5c#$R#d6*yAVHXCh$q2v6&%IsQ0V_hEx#(-xC z@vW9x$}@YpWj3u$-?oqnswHN%SiRb_618uM7f|K>kh2uP<}fhV0+-L6tttMH3$+(( zfg9{&6`I1&e@YDN7TD&m-c$c`lgC#0X$&kcQfu@ zbJ=yQQ~&36cc(d;C@cS{yhtfoIaiBicRZb--DXx}sblgY9Jk)&L|07iq3tyg9(}4C z4ua!u?SGW(smqpwvKiRVe1#k?DlQW(LnQ*tga8H=)-}fh}pdSik-kvF{k z^9r7Dyj$qwo^>WD1RH9-iik&@vFerrwts`y~lhk>Jed1eT*g!M-Q za&>oK1~wLD1HyX8i8XuQ2j z;DWfx2IhA^J+TCIEuwihy!q;=7Wq=E4rEkn2M!vUA3uG%v-246rdWmP-kmujn&)wJ zx}zJewx0J3;?yq6 zs1cU$r(LApMvuKzkavsI3fvYLr^d))ydYgkx>GX2T)N+8$A*|gwcz;My}zx$Ki9i` z|Lh#4P(AHqkl^p)c|g}!NKR2p=?yzA9#d0H4o;L<@O+&`y2WM-m=dxn<`^SZ&Z`%c z69#FmsAZsM{P(CPg&FxHdl>XjaUsiE8SjVIXN&Sf2EXqgxBgk?5?H{F|f30SS_e3v9i`@CXaD(s8=PY0P$#u@k%ojn>Y|7l+<+Cgtsak|PnXq6E#j=-eCWgA-dYUx<<|WUtkl;#ysx&JZ`)+O*W6Zy2)P1IK;lXd!bkfs@6zm zgpqar5c*vk-RBC6*Btt^aogMZ0i(%@zX?YB`k-}RWC9{wq&WjK201R8AcmPNcX#xy zU#TZtEKQ|ZIaBA`-DL;isxMnW(?8eWDHQ+XCUCw*!2)cBb*En~e{7xFFg7pm(WSJn z7p~dlpVhu7Jmhz7eK>xkx7u5z|61ly*(R^b`ipmtDxYuLtl$!a>$L>U{2Z1?+9hpY zPt&|&CB)u5;vw5FvE-wbB`KEbsv88dlD|%$_VsI)8E~3;D8kmhHw-);k(d65+b>D} znSvg$*OH)@63?p$xP|9VeFz+UzVLKiR@~z9vRltZ zVNGV2-2B}9sI31rgNp7pr%FWs>AH~pYs#Z?Z!^o9FLn9p-9`;RDWAUcAd61P0R(`J z@AKFVOk}az1>cp#Ct+(BSuq|UV6V0HfXaMe$m(Bei+EF zd_sf8D;`;X%aPtnvj33&`Jt-#gpBYcuUFnnyYSf$$nM1iydMv%x;0|$) z(tSQxHXMyC?mA784m)S(g*qy-*aN}A+y1FP!!-{vu6GfqAqsD2kNfOg_71mg89MAKXReBK_pCuS_P>aH#1=l()Dl`cU2>Xtn7 zrQ__J!RKV5; zG0US4Cx>U6tq%~5l-w+alpx=D8T_LsS>}1q?tvbzo{@SdWTGL92)e6v>F;DAnn6eo zQC80=Iln7b2$k_A;@TfJj1C1Bjk-g9)eBbhT1#nZ(s5i8d6rOyS^eL(SU59TnTvBC zy?$Bq*f#lc#CZsqkr%len$0oOQ|Tuj(J!Dkdk@4wxm>vYBVqqTHz?KwvJFaeV7U*4RKCcWql zS8b4n)_+izEtfpen3RxDj_nYn{DQF9r?j#>_v-7;n`4C1RV(!UYkh(5B z_P*=DCf;{3OrvZ?mFpwTSZzxZ<7BJX=${WqLPvA@YN~2{SJs{f#uqfO93rn77 z`BHMJY#!FtvFe#^31z(3F6Y+lQ!Z#uuahMXX(ui6^HqCXmJB&n%UoFlGgI+c{}8uO zexd!HUVN4(973SUVO(d%^iLCdb2-!n5RA_VgV>KfSehYV3iq$H1aH0c%-xsORV7{^ zlTNzSC(U?W9QwxvfEnyya6-m6IfLy;Vf#?Tq1RSN;3^G|s7TeYCDrw;Pse7?uQ!9j zNwEqEwedcw?VT}VtYW5+DM0slSzmviajwoqNTAXNfZ{tAn_BoBGb4QHUNI z>vJU}*&q-I_8uB3|GhPJXC>}2G7=@r0-Pem-zTCTj>XLoE(r!N%g$f}K@yo4)8taX zrUL;FU`Z_cbuL?0j$=Wyk4l97_tt!NoxAt|Z1QTm#A6SlzdF!M5LS{&Idc^cc34o?Fh zVS;>UnYW{Ki%xVB9%y57H^8hze_-;EP|2+8LFMJ;dl|4n6cOFWVZ~!&yQhLH3fe(~ zW7ck1jD0f4(>2XM>)bECxjY^oR2O1>HBmQV51A$yyn#L;7m|geBo-Lj{FWNl-h8&) z);0PSF)%5oK?tnxe%yR8`W2eSG(?H5ZG{-E@3B`BW#t31v`OdyG%5@;p0VQl(5-1p znf7j#xb^87F>r$+3d%Ef_rLWceBw_a_J`VVbhejFc)9U#S7=hNDQ#U>#Dbl3Tzf7G zr#jwJG|}vwqjyIq=I`k>_k133^%i*oGvDu9knSG0bo%&5jUDvN8ERzQ$-PJ9-OCPC z4}mE^3a2mzt3%MRm^rkn%c`nc+Vl*0ezZ6HoQS)-+E`o)d&WUNWP*n$xu5DZu?Cyv zO7(u1*$pvnUQg$7#pv)u)>U)!EbeOciJQM}!OBd8nqMCb)3YmbJRuZGPm|3n{0ZB8 z_Ceh*vp4;^d-|h~fQa$qN*0t&7V+26Q%@o#-|MPwT=(-&yWnKx6uyLy#`($wB333Me~?~0XgCa{=Klq`6+8Vl$m}cL8?rzZyIuc+WDCqcDkD8+5Q~;`S9w4 z@(`I{`bZ&jrh1Xq{&DNg0sebs0X|gwf%Qbau;^Ov(y!6(f;do3n{czf4e9R^H#4!C zLULGN|6Rw3-HuHkgXRy#bmXa6pQg>2>X96_a|@8*rWx6$Iqb=Gn%i;F!VbbM50{{M z31JQH$n{2CBk0wW{-IFG;5Ts%Ym3QFL^GY%c&*@&3IOu?a9jU4z4W(I9gzhMNYC6x z9Ab46R6F%=zN8MzCDOddRe$IKU@CHgSc+DU&x5YIxH264ByKrx$WDTQB|M3>WKo2% zb)u)lLIRG-=x^RlF@p!^DpUjP3uw9ULs?IufymEAbd8{bMq9zCL#oiQd;=BQZl5<2BnyL52F4#6-w0P0be0*j5(yp-1H1WAF+ui@b&Z(6m z*FNlyv`hBM-QUYjY3<8;@3%t%o|)iVSe&}HlXqbAFJ6Uz$mkzy7#~*cT{warrphRO zJtF5!{mpDKaSL#_ zORlygI9l$*)s^UwRd zF-Dr;D?Z5>>})tX(BQ_L6vTZdhu2>7S#sXEIt0g$v-Tg-YJt4nyg}3RcDiDIjK=@# z`atu}@O7(boPBl5B%UIpx^MAa^+m0$?w#hYv&L2sw*H028R=!g4dN~HyyC6x!_xN+kK2hKf$TS_H;~D`RkIVb zx(w$fDoSk0f@M?UZR|vJ+Wp`5XqG{%f3`fiKBE|$C0R+BA3AkAwh>r6cxuoWg)9k~ zj~d>(()6Lm{C|166Ri?Q{n!!5lg|T!+V^Q#+o%YSxQM2w6&%J9Tf#qge(3I&@3c$2 z@~G)q&hN#mCbFnQj(%L1E|+v=ri67F|OsGIsWc zCU-qPL(%gwS)ZUS$V!2ej~{46(j?AFx5sGazIZTP646^e{>L%c!@U{U2UR3?dy}!2 zKnvCz$KM2FXovh^=6mKi{uI5#NB1KBoool&hySb3Wg$DS!hkuw=L_A{nBN#aXj4s6 zWR|rp{+AL*X(f`~D#7=79;rY?t>@h6lD?zz?XXP)?3wC%0-l#F-YZ?Z)f`QkvhM`U zaJ^oT(AO_VbArt;r3)6nVJpC1(U~n%yKkgFavyCJRI8|=8e4_}ce|p_2G=h>I#AS0 zzCBGjpVE-YKnyMVEhoLM-4W2oNTjW=pF#9^m39yw6Q3qDvbiYwGwoR#YnD;6S3C@D z?*5TQlJ<3=H{)uh8K7fVVhXJ(o)JqrGb=8g`SUsFu#yeLc zvz-87w$0?`ww8l5*$yQ2q;A-0>olLji~(!KZrv1m>UQCybuzb!30IctR}cVuDDzt?pxBm*&yQFZls{ zLi>>J2w2yRH&!EFEPg%@pZ-SC@ATg;PL51J5*b2~5;{upu09P#oDQj8VWzxXgYr+i zt(X-azItA6rQ}EC*LnZ-zvkCBS<>qab2Q+B;=4bd866@m$$JNs&HH@6F5d}gG}Z^uTm^wj+@7(?CxpF#CI5d1tZ%4kf#I7b z)U)nEfB#i5&Q3^K(-ZDTjmKmfdd-M* z{#ok3mfS^8`@BAA)Bbq>^xHx~@1ilNIZFqP{KOx4Oi1f{TtpOWi%;8%v9VC5% z{SV5@d#}w6j=5B5fUVd`>rcg<+Y&eby_BD%=(5Y2OvF&T3qoda`g(b%CF(>krg}D@QG#)g%{G|Q)tI}8 z59w%ckpV__G{@BlVT2-4>sbQ)7o<+X0u#B<4_YtZk)fFNgxeaXv#C<<{w1aF1PI_; zd00goP32L(0`aIysou6o1K#z`lSoz#9uETPZq*^^55Fyp^%`je?b|$!q4fE$p#2{b z4WCSYu8*A@|07lsoxy)dg%nBWrkKSI%LtA4cZInfu>LznCZ&@sR@Ibw7H0m4gh=*N zSk`bCE)BZ=*b09i=(Lwp{vGKM@qp|1##y^V-KftWzzJs;TPKn2O<7#Q7#WiJlhWeu;0ib1u2i|J)|mWU!J9{;v98 zS50roUZV0PHP(?f4Zi05X&n4rbI=S}d-0#i??GqSoG+I8X)2%YmKT#bgC}U(4<&*2 zmgMdKQFQ!qP0IB9rY|(3`=`+KG80bFde9ZNBVyM4U(H(AEHFkpZUq; zBTnel18Y17N%@@kNg~dkik6!~_0Jr~PEW0gk_~*!^pF@3ZM7LER6ikj7wp^+|Im;F z_5XLcGFI}lgPS(^FOq8a&X%PT@?|gScLr*keDpt4wR+ZJygiQ|cF~(vVLgqW^fu(@ zpA~Itsbjo*0eTB=8w6(U`-^b0g-zM1o^#ToUeBD}Y1h8J5UpuumZn~-=SIMao!TIz zr|>WcNc3dO4HmanGliy)x+MR7zbm`2F$p>4@)o`Z@862dd|Zfg2&SC5d#lzPC9K@U z{0A`FSk!aXF!SFV+Ohm=NPMZ;kNqGgPY2N(!3G#A!SoE9Tf5fx&rpm4L8nOK2aN>` z@;@=*ntA&_zLfsJTMiB5m55t6YrpWzaQ2<1X9-YSOm5uCbFV{qSdu@e1<^J=Q>|O} z`9s|9-;k2*o!#9LU<>|jne3gpHK0hhUUA5^Cp+;gL>3E$Y>Lr#Bxv+E4LLVr#?E4s!dx&zD_9sTuYgW7Qi+$-jLnnZK5VfWq z^AUYkuW@@WR|q50tH9=^+o2v0`GdJ;})7>Hw(!92qow(6=l4oPMVyd+Ap(T{_4y;Llm z65~qPcKEh@#D;mtE#!sOE?o@~B@T(Op_%bmH(kM|_vf?lvU?X}f`pqiOh-@i^CLI% z%4owGUMsx`*K~DW=`A<}KlMY?buvawapcbs#?Y!t2tkqUw|G(~Q|SnV%zLa?Yd#ve z(m5YL@XWe)HS_^GeB>D5-&_+%DRCKuYFuA{)$Yb4LJ=W`=_q{pI})3_ILHPGDW?nj2uSefyF zdlhE1Msyqv_z!3V$B9An?)|V8X$Ju*)f(u9pAXk})GjBfA797nNPeE3(WhJ4*YKl; z0F8m|T+O6i-QoduiLFQp+h_FgzRX>dc8vKT=7|@ofo}6o#j=e~2gFibwmE&CysWn+ zxfG8=n0DtBrabLNXnW_o_%$9*fUN6cHfsF>Q4?{D<-3xR^;Pfvq9$U1MbC^g)7Crt zvb3EL9i5u@`K8rw=dtJx@#{g{WOXmh-$v1#h_}9Ki1If!btu=SUth()qjS!eu>()a z6E@)0A%W!!0#}ZI|*vL)%Hw2QmlCNK5$d70&nYWQuCo zd!6q7C>Ve1?S&EA+=&qo+UQlbTmC>#rS1nMHhv{7iorLK5W|za;abhR`YT3IYu6#s3Fa*Dyym`L*`6uQHFIcBPqow1l|v#I@upuL ztu^SNvAeBE{NAgb#n)SXF!ms3Ar>`_8b&80uC zr@x(cS-W8M+8aLw2@?1bB~72g{r;ZVfRkrbBB%K&^Oeh}!yX7)MJk>G1?chkSVWrs zocKOliu5cpbHk@KdRiPli4{E?>6_7!TzzM4 zhMt2*X)gkH{G%cBDC??9-#=U`Wex4fT=Q7Ct0g;6*nLge1< z$6AlaTE+cHm+PSHERW8-oOqt8_(}5Fs-0@{)M;ETW2^I( z{Q<&eRaAGZqZ3}ZUfhS!3?|Yp=SnFn$+a~V@{~v*Y8~yzhBd+N^)acCpDbddo9;wQ z_L|8Nd=t4C+V$5E`-g|{+(Q}Y$v7_3shQ;IyI)$2!bopcE_>_-`zf3jI@Ie|WGbEpaO+~-z&o0Qou{|ONYXA^%p<<;efn7c%SnyPJ-r+0H8jgD z`eqV=@*M=E{}L5?j&q)cI~Ob95Br)oD^%VjNoIu=z7e7x0m{fdy=KLRS_w6cV^a+>`{9?B`Ida?}Lt$BBd4MI~5iW^;N)4n?o@mc>W zQ2^opE$0HFtfv8?F?R|sj4YWh{(ogel}d>+q1QyUrMtWs!h+_LX4~az#7S^fHpG4Hn&oSYAq(3(hfC_giuGChMQbodn4^U-~GT7lHBj*k)1-Ty#po%ioF?iW^8i^ouEr2LIzQ;yFbc1Fr@+hyt&B3Q zF)@soHk$xWgDsha^?2%HI>!(XapArG5on3b8E+S97F%25Muoe|>f89OHPex(=gv_B z^|rxe4z7QkBKfVnAS%!L=CVfQbN6?}64>&hV?o1@?XTsUCQ^>C%uGev zgm(L6f~kEe8u7IE%q_3W5NKPcyL~UQnR|7+?Wk3Y9g*aXqEIEdg2{vj){*(z$lL=Y zISR(;BgbWr2>k&Z+~@vr5F5W9o`UIP8iU?2AHO;bJiWMsD)ZNN1l1a{?%5%7E2 zOrSeMq>?DLQ;W5WO;)DQ!1tIh7{$Ow>T|9s_%Pwgf?65ipBq)^FQ((G_xFf? zP(UHz)?T%J44;~GYDgjG=w+y9=G6Pl2;Vg$1rT@MEn|!1B3(%%kCYp=vr~b=PfV@+ zm<9&0VmVic?h?%*9GA=$u{8*~RMfm3P4)*-ottm7sV$PqAE!XpEyEgcE8Z1X5lzs8 ze(DQ;^>u<;ap@~S7sz;8tuW<{(`}dTZ|DYx7s_Unb}vr{61_7Uu6mC7fK560ken1O z-DBh}f8Jb?Z{B~OnA;V4(5ITY)g}Bhzmr9%MlnAtzxy)>VyZE~0*e8~_uT45@-nA+8w!0N5=b{ZJa?L2Nu3>`AO3`2Efo!9Unh5}o` zf}6KKChB6mFkYOek)!xHTu*YmW0jj}#IOA8Dlo^L7D&dhf&yz-=S6`L3-t1JE7NK^ z)AgO>uLVYeLZJn*kvXp@ismK|$$IDI5Ewq-g8Q()#~wef^Dr#fn2XM+{I!`;gx}oM zvyqTLW0yjW#%M!T1*xqcOBI;l-|q!FDC4__hkj1ROT}58A_M93?-nyq!Vr%IYKQii z=oczPRDa$i(_=LR=_FxV!EW$np2fZGeRb**lUu|#NwUK{`b|gZVXEiem-{^@y&9)q zRo{gfuKz2=L~T*$lz?tkOc`JK(KlR`?N7SD{zstvPrOJu`icB-)&$P8y*~P@iQWI6 zW78o;6ZH+qSPkoT$o>n@qXGZ|(ev%FJ_RpQKn4=pHO97SBK@&=nVnQU?}e{e>BX!F zL)D9o#wR24iT0```EtfvSx;&*^noy-u2V#}=a0rJ>5l1v{?Jr1d!`?+^n7Z3;>{w$ z2e1G-BZX&gjOSVl?UG&&*I69fdR&HRy0toI2YV`)`P`UiTPWBr2v!uJxw(5m>|sz+P0qqDqX^RJnojh5Ra^ghx+!5h3S7godNzc4&Eqmg zQ1aTJ?XCfj4aAtv$F56JZAqZ0$(^d$gn`0S3xS(%URv&o%Y@zK&-Q@;T??QbL`wG` za?9`Mwg3M&rrn`i5&i;fu(;p&LtxD2pl8m({TF`#$bUU$Uq4^DX3w*oJ#OvR%oQ(Bb9LG!qlHtk>sen5L8T2xtn zQkXS7N|8pCTHPto+m4tEo3fNn~k;u4s8k4e`uZJ$J%)v;a%OQ#!$-vP1|_ zl3sK()LKMit~pv27_^{y2(9K+&b$bFR`ZQS1G$R_?Rw&@f%HrM-Zq|_cQZrDH_*9| z(JhnjTClRxf}qMbKNK&+WO$RwFmF>;f6KR_Enl#|3>CgsAd6TmO+NX1f%#pw{rtTb zNn*RnTZ5iAMI`osd@w5_OS6RaY;2Mt&pPd_ixY$XX7XqS$24|@pkWO=tM~l;jM!kl zHn-*PRb}LdIPL<-7cj=P-pw2ep>h2Y$t(;fb9~e_NQt_zy8kDC0^OE*kEGW(5HM57 z%HFenf6ju(=>}uayJLj+)vp`s=2!6n?W(eOjR2lMU379MAZ&0|dFL_8`>edzd_7)-IP}be5w{g|(j) zy;qY`lYN0HR3yH6zWHq|B?MJ&n2OfHZuv1b_H}pD0XlGuzx!#Tp0tEKd zGz@4s%gA&8_t4)?&~Uqvr}OQIQ10ki$neby1*3>*U*~!->7OrzxcYm~mv}b;_~4Sm z!p|kp3z6(3p?xjc5^=X@_33D|25*A}#b#HcQsj%3PS1Bxew2K#qq1fHOm@i0iNyh7 z9pO>ii0hn*-O&%(a&BS|`{CYO{^;<6SkJ##iLmP56hE~vMr*eDdgI&|#%LUn6Navi z&CcnK-(i8bM%crvuqw$X)&DIi4b+BW4i7a-HFI0XjX53t|GVT`*BY%R@7e1sMo`xcXsv0YDpuQI?u&@{G*c@**)P= zMQ^8bZswfzFon|C!R$3u)QWY>F8m)+Ay;5df7GC=HGfopB(KxFWu>oZn`+erzXyla zQ3e|wg8T9kogmuJk{2CMz41*`z><5c*V&z8-|ao&Fi;#38ZozqprE>0r%y%waZP%~?Jm-3LnMwh`s1S(-t!|uYxft+{B3BcDAaG(4 zq@B(s{=b{4x1755uUUNXnFuT|>sZ**erVeqRh>@xWU^AyJi^8K;tEZZH{LuHmg4QP zd%CpyjdV&?45)7!k`9%kq4;xPWiYPO4pxwf1k9#g)& zhvf}3)*R2!`_;#?K_@vP{;?5HUa_5nh6Bi*7Aj26Zjd}KjCF$0wVmj-+2WnQ$NJLJ zffrawYGu#v!Q0+h(JaP#9P{RW)*>JR?Rt35k$Mu|X)n=7l-++sJV|<qKRjt4XQMlg)oU!uZz@|I*}I~Uh^w_aE+|D42_o?o8>SS*c?SO5 zzZMC76{^>EFnfBfDp0Dy0OgqZR{xdGw)TslHwPA(VGKg~JTc5?6o0!t z&ROb8RNz$UINNRqK0b`FgTWirado5?k02e??vLdTBRd=2P1*Mhz~=G!zdkj-lTJ+5Aw#FRxwOSFW$cj~l}qYa!a- z{i*@or9{egvFN^adW9RzxX?m4R2)y^v8?#s<(3AMuo5VBZ=mZ#z>sV+uYw)VzDlfM z55j}eAU`Jo9vu6DYpK988fd?VP_2|~Rjtg{uQ6TWBM_2&8a-{!__j(MTkt4n8mprf z4M$$f!HMe%bx@#HC-hYPFho)0hFqd7CptLNZEffA?6=6aALYI*-Frd}q+`dvqD zF21?04QA6&?Wa_CTUYvcsISEn_^xF`cTx6HI%qDZ*>cKrGO@mHnY=zKz@h3--D-Ai z@kD9I+6}6Iksr2PLX(qeFhdWgd|;5yp?ScL=ERV#WHGAb5AOH>mJ7{R0zO~3 z>ED?fL^TVcP2?xH?Gt7UlP4{@cT{6S>tIeVB!lnzMFUGrFqghGkxH4iNTm@R!kMo9 z`+hnskJazOkU~eE{HTkkZ^V_X2nkRX`2k?9vwOk?V7$La@wKh5kvu4+eaivzfJ)&cz&HtSIUa-vzG~5rU%ayrE1r&sspkB)D z$d1P)z!#keQ?HOF5%FCKz>|EKrHKIrZuN!-Y=v>S&vt#}Ck5ac;Al1d;x9|X6?>*h z2r{0vI7Y#PAIDncnrKngjq4t72wRWm-%JU;rQHBrgNdH@rbq1ipKG9^<}2F&KCpde zGACid{NbjQSQbSeW-W@Sx1pTvW%NhC!oS&$U7%rxbsyu152KNVH>FIn-eg8-BJ<@c z5=MnApOJsy>OoK>Bmp3oBz;zTID5Lo(FxSJTg&%>95gR{Yv$d@49sU8Pgs_Ei4OhQ zeY9wikVi=6VBY8GXN{peb-E)zZ?g>^ zYzSlC72+06ruH3!%&NDQAA~$o_IzQqtR@=$`;6@EBI~axzY$z7IA*p}ictY3*iQS_ zjfcsXU$-A=l=DyMO6qA9fb$vcCZ*Ka1d_shzP}%*n>)zPvhV5|LQqxnoU^ywS+zpJ ztTK&Goy$0}kh6Pd9988nJmTY)0nVmGXG+%g;e=nFMK$xCk0ow%f@BQ{LkQ1)KfhFeWlul?ssbx15!ba9r6N^~*NXf*SbnzCHb zy_B8JX&h5_>wh8;7CM{(Mdz4oenIT`5qg%la!wU_)<=62pIorC=!P?cuBa}W1%~Uod z){$hOudURYmYSEb3R}ZNI~;QmB73RE z5gTY(Z47{hSYAKYK$1Q=OdeU`LZZtPA~!hDuy4Jm*=YZTZ-2XWB$puFb`S71>U+`_ ziR}EjW3;gKz$1?U4U1s&xIWrv_ppchxv^xf=UB9-M0{02HVM+jmuJ7+4Zb4n%$A|U z*nB~{*B1khl5&@WuitY9-{-mfS9g5S#C_}Ej*MlNsQ?OQ<3cn|O_aj$P})jWir9ZO z(>$aeV3SHh9%?lY^DDU%!uqcM%xdj+pws;1DCARif=Gd^YMc(`9!AU-E4eNUMQkQkKKuDqe zT%|OPZ-+a!bLf;Z;Fn#%`N@uXXMIZ!Q+`46^JDi5BALxpVb5R{_~w(}LiWR}KWm5V z438e2S+rMm2k;nDu2Bay%Ta20a4McwWKz&fAEob!oM(kw>AcCCE^ojAhrc+TizbIN zef+%bz&9TA!8EPX0XZ`LI!!rJ-p#b)+KkA^0jQ`^u~=1Tx4W5esN84Pc%0d_sDGu_ zpwQ^1l##noL5k7&hTuQjs@l)gxnZaVpCuED`lZO-ao^vWk)fS2UKwYW-+33KbtpOwkLS53Rq~UW9LUiUSzropIa3Lad$c_e7H{q} zOMW?zIVJh`2u*C=P~|-^@X0dRIEh<^uT*YY(^@l&vthPVn&-tp|0_BtwcoS4Zo{u5 z0a)6%X|H~b2N^NxCxkSSS2f%GzPkACFAkCl(ALI_uG|sEViM$1b^I@Hw+a)t)W&8) z?r~PRc+fv2-dxq?{U;W(?eFCZx~(`ar!Miv>HFIO=(N)6bJd%jSVpMHgeS2om=eTtc1x6*-A2seR0BLo9-x1=$_+g(aqkCsp*zZyH1|AJjxW|6HsjMdahT2OyAbT1S242cI zdql}6V#T!v;lVvW544qt6Vq>cd^`skpzQl%x8YL|ydg!lr)Ty=Q;{n#z+bkbfJ%Xv z5up?(mLt!I0O|Pb=-pwN2{Jc*8b!b&K21ym#*>y11y1(HdD5yW)&(WdX-;JiJ7slDH4~K4!mCu&trtn_$p4^ zQ*%?w^17>LZ&qHb_=j_!*0eQ}{M=18EhewU?$D$=FB_USU^5kId&ffezEJN#q?%!J zrqb!O?TtQG@ntGrnMp|M9xwxlzF9xr6G6hr^*N&A>jjZuf$15j4Hq?jPSn*(()agx zGH-T^B><7tCB{X~v5k40$i5IhnfJiD1dY|RKV$FR7PcmEW@A}j#oVR(icqfqWV)WN zu-+QWmV;MO3v%?A|NZo8qL+FI*<`g!iOL17%()hpWunSl4NNt9d%Cief%~sy zO{MchgDa`Lf7485+j^E~XJ!vZ_sQLF2}6GW$LdH-=cHaoG9lfZpd-CYs*yl#0wPCxyi(Woc!vtRp+X!p_LrgQ**roRX% zKF;AcWnmP38fKcW<;>>-7=&sLa%*Lp7QCwRW>j2=?aHPEE7YlN_Z5ha>6#OZdX~tJ z6+L#%?^+(bA?IQc3WzDJiMRDb!LNAQ~yPMq&$^c5*se!H!V-@<$CeQUNwX!Y6o z)ZnDe^Ph&vbnMH;j`u_~ExQ&|2%kx;GLCZ9)M_U#_-~}{_`x8Ah0vz~_2mO8*c8WK z=V9t6qXRRU9oOVX^-(;PcE^ATqFCbNlSz z>u3Tg?;~>?Y8E=QITzy*P8gX#|Fn3)nw%tlU$fnKG2-qYMEAv~F#J~sGI;Hm-(m?B zqWc=5D`@=HtIsilCh%FoeytT>x8AmO9?0jDqd!{LML{e5HOsZ#g;8KHsRS6isB$}rFL2Pgu>gOn1)qjdb zb}|YVh~u9Q^mUgpFUXT^^x)^jh?iKhX8rDFvK;j}7aI2wuwwqX#D~}uT)nhUgH9_B z(~FK@BJ|iX;Ti##;d#&C?)E>xNm6!kU=cByDyD|`iVFqt z>-J3g90J0Y&4l@mCb;Ti7C&;M;^!hJAs@8#;T01h!Uty*@y^Pk9{j?|pS40mL!~#r zA-H_Uh;@tM!XC5TK-m{kbKQ?;qb7aBr2NnS-v?)sl{YE|Z8zWa zal(Ozed)pKbLUOcsK#ND&GoTBqJW-&K}xW?0JTf=a-MYC35iAec5KL9r*=tO$O*PS z5F9gCXFThr+}_*ZoYxL?DKuh#spM6tCKgxg?O^RYJKtyfNS%cyRvZsFf8DTUVI#E< z3PK#zTXg>weXJFlf_JV1W2L<6zSfJ12e`BcE)>6l!$_>l-8p2hQNp1Vcqi|3`BrKs zVV+PBtWoBXg|)e{HI~)HSAzZNlW1m8LUVDmaNZXj(CJHfv@4g53>l&~o!88d7Y(Lr z%-{Cj1MnPZ3v+wz6fvjB4e|8+xf`~|bqp16@svujo*<*=a?L_WBZlqj%kA-I90O&} znrE+CaJ}im{c#yqa~E#TP;vW1d-~^D=g_(2qYLhp#_3u^=1PqV$`ArnMp0UMIH~zF z_*j2E1VW|lpUdQN$!*<)iVb-mNdF_Ww5~FFwkG889>(byRMVQ$dBNT@19-UPTo`go zMRuAt7EiE?<}!~TNZw9&Xrxph4J6{|th72{c0VYr!dC1*Xm@`N*bBLyPqJiNC?ZXK6xViQb^vVi#=y`>n7@_)$lR3b`wuq9+44Ml5qMDem(RHbgb*c04HuZe`yx$nr*j!wH4__ChDd94-@a?!J_m0;{XvoNwWtIAY>N198abXGX(f?sac#b~e@lbxYT zZO`;5Fti(YXB`-7qRBGL>NzeU7UO--&D2a|gCVm-$F`|ixB*nTAdfW38u_XXri~P3 zF%*-Kj(#}k?nlz2p%7*mYf&-!QnXoiuEi3g^AEU2O7@@buFvGu3s(0cbVptV(ccEb za>!!j^NZ~jp65Ssy@Q>D(Ra`47W6vn?F$4B?>RILk-3dw+>NqmJ?HIODGGj7zYwHLcImOygBY@?9#+)RNs%y@Z-70N* z4?Q9jYvJXZo6sLDV6<=O^skRm==K~1n7rp>~dT%3#}X@{LoyoNPlm~zNH)8)CiGH6fFp%0Yf z#IQl7=f zF!Zuty;-6)< z#J-+Dsr#A4KJdm~WRg|}k=P6Ol=BFu){OJhM19x31B}^0ALW;;C4BRZp1v$!j12op z8{qftPL}u<2>T&+^OMUF@{`_~AY?e2Vb^(=?uRRUW|??Bs?dGA-ZTvsGeF5$GXt?E z9D`CXmkH+Xa7v|`kGySljJuLG6^R|ZsFp|$i$%a1H_iTtHpL%2O zlfrdT;z0ycBxPY}OW&9yPxa}!{%(S+{Ey9gmF*p>ND1N}m@33S6t_{LYK_Sn z;%cO&jsW4+dLV{APog>UGzu(g7c{du5T(1GHPRaPpS1ZR@@C&RlIzW3BlH5A27x5C zg@txsegssje#*Ka$%4Ci#A3tF=9gg)bgmg2g>1Yhu6=%;svL&<`vs5w$-U&adkZ-= z>Nfg^_+-e*{q$C7gfZtDvKkqa5|-lbF?fRpQO*);kp&W3Ir*Y-4K-TAYHvr*;OGtH z7SY41XBAGu9w7w#v6($$mN9dVuYvh;m73P(O_=_~H|ksGd#q~*L+?Q@`@FKZh!LIS z12>@m2%Rr?Rq*3k3e|F^5g+zQRDO)aS3VW^Bmp(=_q$k7S2U6qc%Z0qd@?q!ZgoHu zu;VGI4zoIf=1CL&ju4#roS`_wD?t0qV_A^;>M|?0uzYGuV);W>hM2*wV?*Ni5610f zsn(oS)%gLj$MnJ5&&%M1KaNHZJDl+qLU)79Q!%^cuW3Gm7{(NMl-; z4(tqAT#y#FFh3Jn0McG}L9}@0_q+5Y`n_9|wg$ZoyH0tl?_%L~D2TFiONNecty;Tx)ePJGgji{yJiFZE@$Ph}=1 zJ<8I*X#t%;>AogPLn*K0=+lp?Gy8q{monPb`Y!3q1JvOG`MvzrhY&w@_twDRRKoqY zm8Ejb!aV@gO>E*ss3z79dD`BOg4uP4dG1@BbX8wT60KCKL{kM8a<$^H5J9+sTl z*w-8@PaS_Nd3_8)IR8tBZN4H(!yKo=M!?IyFn+)F$2WMG`j{27Sls?Zp0;ln!8h-h zaU3M_H@IwR$yz?%W;Uh)&4aXJPh8-T1#I=))0Gna!-d$<4-7_`7$z*Y`F|$-Y%SRfe#$Zv|zJ zZZdT`3Dujx#5Zc_&x4YW3@F*O*ZzhHJ=+o%SKQhY&sNt}U74?J+^ur3kDRTj$&N5M z9+=i93*+>k_8t!hB|J3OtC*F2^LcW&GL#~x(unDfV?9MeljBVgpRfLVP%1=5{$ld> z-L?up7@3c~+6&^hn-gaAG+`&VXFb#Rk<}XsCd7vh*HW0+>oj2we^og2#{&>CpbfgI zwvsf}7+<01wLZnXiJNtiu;G3fw@x1a-dL2(v7_Yn434UM;B3$2APO~Ia)(LgBy?>Q zSTSWCfaliBvH$#Iy1&|Loh^sHl=q3I-=&&!R*O0Rdg6V?vnc(#QT09;6P;oJ?-fkcr z=pZ#bNtGZ#50u``RtwPKqIynX$h2f1Mi-{#cQO8;{g5xv0pLdSn!_vUU}pFp%6+8X zxnJe9bk@aU$k`_a3fS2df?_!CDGGM`wYM*qaJ%)9Q27dEm=Ciw(9qH)%Z%$e3-?IqW(WrlFbPyF+}N|7MecqzkKsUOz7rA%!h?EN|dD* z?Xa8l<$Qg4T6VW=rSLoco4L{(PH`GlWqyCKX|5#3JoC>%@$E;J#OD$DxlAgKRK(NN zihDlKsP-adxEnwdb5RXuT=Y`WKlyu08*x{Y*lsD}4uu)&9K&PXfWvU{;5sFt_7##{ z@y#F7OZktrqG%_Q<1m!vLCaBe?D+)^+Mx>X zGV3opU^8LyZ6c8TJS9~h{i|~O=D#yyNh0j`ua-4-OmQ*=WGUHl73D4i$g~eZT8?Bq zme*TTKzC3Q@HAtEBBf>#5s@;sh~Rb<4o&gLhB|sDhvw8P&|!fDo9-sugPXcMZHbRa z9xnQ?ZD|L`cV!s``v)_nlUVW&YTve(@FRyEyEcQ}*xaKB(QUL{AigoP zgRoFNuH+D4yRWz59{R{!U->*E!li4uIerarY7g*>xPzX`&46GAQ&Zl~Nz3Q>PniM1 zB&ad^mxJ;(_P>AaOkv-}CPDV%jpgzv99_Ep0NV+LGwIe!+13r~qJi6F@$LWhU61dx zoXEU#W-b?l4Dk!H5|e=EWMO8bD!Ip6K}lUuKGV4o5t>rBjscnuF;#4J8vFAd;Vf9@FOScDO&+}8Q`x1Q9nqYCtmPKBIy;?v0H4>Ol%WOcqK7n z-{@tK;Vt=TS{X@EI+!g!XxP352II-?sDz7|~#k{!Ty>?iU|xzZ}0LXP=jEd17d-fXkKXct|JT z+AXY)Q+GZ~bP>v6bBQ$V?mA%BdFRNlG+nKQj@r<-afffE=3B!KiZZ#!t0yl)&Vau? zHkaP-lSAxB2A$WRd>|Humob9#?Z72vmtoG@7Xs4hkNfH9uAhb}80sgN1e z&e;!@&)J5~b#5i?iHe^CrG7~AP|IFaVeO-E(46=y{mzfT?pCchhBv+kYOnb^X%mk=dM&3MlQa z10PrcT+4fWc{t-ye@qWq-`N?l9ECyZ&guAoaG}@PJH{GWAlb^x4ttoHbP?NS{#y)Xs#na>$)7dboAj&g}X$zQgB2GnC^t87-W9D`@dk<)|T5s z#RsmH1dA+Rb&tOu@~p2#lDLo&xR&-Wq{UHMbCZ^-!2j8rt{LqwCc1`xL8Ul#T_VznYEa$hU~6JKTF1SkWTaa)t=#;LvCpeL*dJ>j?XhU!iH-aLR7 zEsr_DvJL`Tz<>Q8`O10pYx(G?s*VB{;UL(SkKM#jx|7Ml@Ottc;~s6DBfTHs=0zP$ z^YEwaA@A+Tz#nN!$E!JeKo?3lV_Xj>#XWeac~0D^nAp{8-?ZV~F4=zrs2~SO%wFTz zUf%Y9R{cp^{fucuwjW8|Jugbbg7SXQp%oEJevg76Shq&!=cV2IE}5$3ktW3aXy@I7 ziq?3p*d}|Kpf#_wiovmUS0154{cNRmj1Hmx?18u<{(7nT;qN%j(_$ka|DjQ2*y$Gm z(fNVR>;cJe65IJaU<2Hu3P2P4G@J*v#*=I;hSVG_Q$WfkAmT($3d9UumeJ1XJ~xHq%8PN^ZkOEr=}u) zzC&cRc8e*F*IVW0PIpEl2WaSBy#TFXg_dFkU|M1~#(jA3@*|!Um7Z85&&7ZH-xF36 zODS{B;Fp5lIg&iz`lqXX2GS$WMp2QE*kN~3{W_**@OeXRP1alT+yL<}k@wRtXOlpg z>VT_Qworpr5PKFIVc9hNA2&{$Cz>eJ$S*_G$&8mMhP31j{My zvEv&Nde5(2?E1{(Ka+s*;Xpryd3%79{;>R*a9-LmR)zRX(U$f`CAE6{1CO}1enfT4 zID>i+?Z=0buOEbh2Tu{=eItR8X>sYdv(#o-w)a!V(B}~+8`;2E2P%4w(f;}-dneB6 zX?E^cKulxI;e;rabN|~fdi!?zC`41cnBcch4%nMFZXQ8_tG@!32QMIA2MxeZC_RU8 zB95uo>K0v%D7`{hx306=-^HGg^7<)kt>>5mxyQnPB+6KA2!9xBmPerP`H1; z=3aq#`iP0T*S}J;iJi>9E7O1F3%d``r!Kn71wm*NB0&}UQa$f14thJkbT3C>JAqU^ z+aP}q)@|QraNHPvkS%;vWVkh1?J zqm)bOHLk2n1Wm7%`hi|552Km!Ben5iGbZ$TI&S=bsFl-%^8W!y1EX~MIFrYdA)QMx zid0b!&CvvbEDavZ{Cv4-#}pTEZ|EhI3KIL&M_8x)^s5(yf9n8IUCObRUhPb9kh+xYm;(Ms=vFtc>5Z&n-rMkF1;Ef2?@R%5t^uI-Q*aYquQSIl1eOc{{4pTFn*Ld;nD%9Fy zUV}&U)y1K@HKO#Di+>M74~Msb z{k2JCSr2roXW*MLY-iRD7(j+&MBNl{g9^+Cu|B^~ISS&AmJt-WHP--j#S06E#XZu$ zhD^D;$z2SeHHF*_XCHG4MNaUcb10zg_n|~7x+!aEV1*@ok zA1H1GSm*Vcc!w(81&nnz;#2W-3z%}53C+>swaRA)WDRC9IjLz%X7uU~Aa5_*&4ulh zwqe9Nt8fS*4<>1fnYugoh!GL zt#f(eFY5sINkDL`55AiE$EMh98JS|1ji>t#z7%L7VTH2a&{wDxgzX7LcEx^?;d@Ekjx%0v#>-+Wcp4z`s9>5D8eiXw-5bNkY> zc{p+Df(H-MK1QKuEDh@8D@5s82KeM;CpON>0VuGzL-mrFt}z+mDBJmY06P58;Nsi& zTN_N&xt%%_uQ2a#m39tC`hX>3=`DAnv@*l)^_l4BT|6vkVpQeHlac;u+D$9={wHn9 z5Um*PT}%Cip6ywr+&HTPZ;N&I(BQ90AaI0PwI;P|fceb@k(H06C2?>s}CYCNXwLo1=R6x;+KAYmoDk@daPc2%J545l9LYc{oPwn3tTF;>O( zC$-SqsY+4WnVPx1Hm%#mx9El+Wev$vS7MQ($alQMuM$3j+0z%H%rR0nwv|C{pVY}NW z;?3;(2doz3dd8ELPqbAFWq0Tr4vvcKSe24_E0Q8&Za8Y;Ty1e?C-{;Nhc!1|_1?xw z$q;+GF=qy^FV@=3ureeTEnulaTMh!O=;$qTJ$XXK{*7wW_ zo$O$KUs|YZm?RqXIe+7Z_!lcwFsP}QMsJXJj#3qUK=*R=M;XwQWt_q7nLO5^6P{N@ zD-kx7=`X^ogC0ENep+&cpf9ue^QSTx9BE}#8Bbdu&bbT-7?wtr;8IBM$1rdn+oogx zz&JS1e`bB){u}@=l+6Mk$-rUf$XW@Wz&WeEURQULG?n6yln(?Be$ITO=ZZNIqd95n zWX3k%8V~Osz#{b@$<_hP$y{eHrKHy=`|){p?q>*&^qzsHGBnRu_2TxX!o74)ZRhvA z)#(q9Np2?zy-)fx;PiVmU3;bM6d@P7^G~y#@~PZ0I-x?Y3hu$?ULYZ6F9b{w1Rksy zy2b$_$%2B}z~T_q-UU(7h5Da#*l9ZuU{&bf5dyg7_WF9N*9mvCG`-&NShD)6eD;DB zF`G?$9o?^M$0PKnbccmS7lD1O_E!isk6K_T{MEJY@X~%)0{mk2;bqk1?iV)OfoZG> z6yPC!fdM#hF>!N)Nj#$Ov@~M(@n9Ja(fM4s(oFTnRkeZeWi~=x$lnOS%gtBok7SDO z1m%C;9Y-)<9qrG{(A@2b>Gn`%ODhDr2AK&r`WidSF&2?lAm*Y+!IQllmS7 z5ujap_DQJJmz96}FggW<4~^XdXysY~tpNU|Ht<9Gwn*H@nX`Noc1W0MPX-6#PIXmjjHP27H6>;}r+!bk` zRmpv*mGC?|!{4!1?%$IN5=&D+IjTL|cMV84f^HOYm3Bk-WGo_nmFxf3f2<93n?SIS zU(9#PyRVw!5u=m7Jkr!!%~N3|(O0-WF5m+C3bA|U^ssYIaw$WvRc zd8y^y@jQ?j4U1zPXx$*fO7JT9TIb|<=CiMuFI$7(b>m1C{Df?~w09QkAnOy)=E)&m-2McvqnX1&uD7QWLC05UeuJ z9E(uPb{|rWlZorR$9Yx*#D$<}1%X=Ixg_$0Ky8pqxT$>5AV$RxSljsmBw@uy`VC>=UyvbrdkPe5a9*8u z_Z5^SFYLjvd^@ke?HAfT+k*&k*QRAbB;ku{D1i({W!QlHPyLOp19Qy-+qXi%*X`eb z%`$0reSluXWfe()dwNjUKBQ7H(xtOBzdNXC5nA{~tKc}t>x}S8K?eq(#0L#|sEumE zx2IYIMx_I0*ZBXlIXsjPAo=@D0VU6d>U3oxSb ze>0969IA(i%zzP;U#{L2aZHauRqGufB%mp4)?lHjJj;7y-fm_$y!%D*Fwp9Z^MVo# zP7x^-^_7gxEWe!X9^sh|Rcy1FOu3&^NL-gKdd_H4EJ*?uI-hrW0>%-({-;z8p8i3N zuXO@L=$9yMBpSe6wx57#wYxF^V3?b~Mp3w+qpKYRt16d9z^bxcO0&Z$L>8vef~X94 ze;A`G+qOCdt8%E+_A|D2ut+n729lgt7!l_9OH2~)d(^i17;GLINaL0n`#%6XLBzgO z8y`SIW7+Q)qH*S}TZNFTIm3Bae-iS9;zej7P|LLdfOL zE-0aBeshA5tBn^@uKPFPr4U+5UP^zt>4z7g>jxqIwMYMSSO1jB1zv=5-lzN5COUH^ zmYyx1pnNeWGW*zx6ta#vBVEW?@ocGy@1bq&tyRkx87p_YPDKC8D0?}yenNUqPDvM{ zf8~^PA=)ceE(_6K`k-~%!K?y+zRLtOOpm^Zll0r8Ej$SAU&JoMofFc9X!lrpPGpOE zLTWC?LZ-355ZTAl6PXQ>DmE_@`I(Kb?n1Oe#@Wk3|8j~IKSB%nY0NmgkV4#5;*(wh zdMZ{Ba^2etk$uidFK2L<^E@ou#uxcY-E|+@>HXh!-MhVz*?|la#K7E zd1z0syhOWsjTf@S%q;aFtIPC(pP}(Z?1aV7knfl8&k5RJsDX}p7lUrl{N5NQVS6DH zUh3C)$uxF7Af+#KYzi@6=m2>}9aEs_j6T}Jd=c62?l7_cZ%D%2#yrt!tmB0cVm}M* zhNAXDCd@2hq5=!)Hhm)ZH&kJoBg{Xaz(3m_b!{=)6()h zG?D%5JnAzv{0!01xzTbV^J?|sy9`A&#|cVa{e`IZIerr=y=SN9l0yFc7#v@O*2PnP z6ei+nx4nkmE1mc+{rv|aS1X_YL2P9|t-X-3T#LuvjeZT9{XU4cZ{r6Y?DfPa(Lz?c z#kw5zZbGEj!}~%$p*hZOjOz(n zZ|SES6|R`#mFSD;U-4GE5OwrS^^*%{Hstt08D|$FVaC~oNT^otXFYY{N24*$K5F%T zkqMg!uOFvwn8%~v+AlIzS(a=Xi10x!uS5&+gnC()6f&>pg~-dZ)rNt8<0`{}XQFEX z+G<1}8HJ}$$O!t3^M!a6o~$@y3|EZH5N=rLhV$WR+1q$(L@ z7ea(P_kvG^2)B0|>MionTjY4k*SjiRc;^5`Bc>1o?~`5Pg=mHQ`c0_xx85~Rb-~U& z!Q6^6(JG7y^Acp*!S1;j*jkY~2N75Xge?k%J2LN};JS**%w1G0fOg2DLCh1={z(Hs$#TEBf|a zNQL)F(t{Mx>%Rx7n5{(rMJLHy<@Mi6Us4mFjDS&i4n%2R#nDcFNCiaXo6JHy?+t!j%TL_DXZP* zU{P#;2F*ZU7gDj&@>Aow+${^GXm6M2;6gcCWg}%`lrO6Is=gUW*Z%0IS0Pc_*3W)^ zk}&nHs-^n9i^@+`y?0Rgsj^t(Js~;%b5)_9h3cvM4?M%NLoez= zDOz2S3M8$eUyG{U9L{0P#MSGA)@=r4WpJy&1Mq=DVnJP| z=%B{5#?V0vU*kfmT-I{+O)o3&2zhN~Bh_T=m~NyBDSVSk3s<=+e3KhdA#o21YAGf0 zg6;b<)rJ<`P%zWJFEbFnc*{3Z!<1Od&D^Pyxp`%x1ph%QW89Y+h}zosWd@S3eP5;u zrc0QF@`V&VYq_LFKz!8;;VW{l+ATDzp+0nw>I<8rgD8;Ka*MQH5*P9i;l|J)#HkMt3Ve zp$wlVjY^*vBA{A#w#l{S{ZEJc-0o=sxhm)EnFeUe5q;$bigpxMmn&4o7+!w{G`&Fd zlx*2+uU(*j0Fk1u6+q7erG*Vt&%^f7+8>astXcDRBQiJBg_IVvO1A3NSPMi;F3?ow zSwBFDPu4w`)@9|AmQS|^;sM%D_aM^p`$5-LG-aQmV04f&usjcV6Q_Sa=f)n#lo8Co4cYMf9A@QWpfl`e)` zY>Q2u#?@ItCOegnUMFZjNFO~XXcbA3Qw8b=Gy$ys0}yeyk1l5jj1QOsj8*h_aElOY z%p0jO&aBe@+H#tIi9605^T$AXlv}ZABjre!Z2vWxe>WY1nHh_t4Ty)c6$VbLe*iv4 zGz82+?I%_o0;yzaT}WliPweXXt5&t5RJ4(-WM|H{xprCm)(QE3Nb+zz0dQAi6 z$$ATmdlA;;A!g0Qq)4DuvzfOlpRBX>bDp1gW-VDq=r!oc^pgD4nn5mJLl)8lDf#?V zH5c2O6F@(?9jtO3SU!#!S6N|gT|ejfNn+MsmZ^qZ z1+XIRK}r;RpsIDbpQB{4tKC2)^y+D*4akh=Lscl#OJ@4gP!-x}5wKrKS#-~q>9aCD zTXxTOkaF&x?I1<()zeHbndx40+#{8!1KaQXZt}%I9+Ig><1|pSlA(ef^IYRD_9<-7B3}+zun$Lxlfqg?J!<2^yF!P1< z0QL=;fs_f`03Ag1jjq0H0;73|6@@my$M^t}pWbeIc-g7^&_CEn!F(^+K?;bjJ2qK^ zg)V6cwFC5^mroN+^t&f{UiCsm?b8GkE%4d(T)iW?(a=Ni-0&dMo8N$ZhRb6gnS04X zWfm(RWSYh-<)Udlp%*ow?3e;|p~yQ*;8RNxRuy_t7K*$FA|NWG+O<|K3q*~RF?`Gq z7y`_#)GBw`aL@a(`@~WK(@X#Yc-4f=`s}r`?YDt5xm9 z-O(GVc6>WnX4I9LA{DHB4pJ{zvK7#|$w=c-p{Qviy%M1*bdXZav3L5gd8y%W$@N0` zioMf7MBgu@YVj$}I$7CR`rM1v4l4WVsEE#Dy@P|4ud;K$a21!=M>o>fRLai1k*c|r zFXElE@=+d7@U2!e-z*Ssr zuT6tAs<5WeixgM$YGk+4xIk!8A(^76Tm1kPn0?30#&c#bdP+@byhy_-sR?O+PbZds zZXvCCAtGP#vQ0OGKh$@d2vUb+HK7+N6Ijs}jQ9(7{Zp2Z!;LMj>Y!JzDg{zj`+jE< zuJYCUg;Z1SI}akoc_BULz5@AiDEC%#--y>}qzfso;W3LUWKrwBJJWz~0v&`6l%vsn zGa?87w6{M?oabcgLO;j(NdQLuTq!EkoGJC7v4I+YX$PTM-joaZnCSx)2fDVjPPj^R z7E1|DB#!tDw{B1%)l4YcZloe^-5{!0Tz7_A&_T+( zcNPy)dR7cNNa?xfTntiIChui`pZ+9?t6zu|x#L!4!&L=(HhGZpUe*_>^{UpfU5vO_ zrsl2azL7e>x)t3YuO8#e_Z0<7_^PoMHyItMjNXMjNM#JWola+_yoc3}fyx&)I|jtE zK0tAx!beVU^%z=0H$w+9R5oQ1{eu@N>K0lmtQ6=V^{hU}si(`#Rh8m%oCm3FKF4{G zo{alV)i!^?*SrwE7;7cOBXr@@4{?jwL0SordJqz`l|>6JN^JF@hxKCFs?4n(6lmeA zUP!g&e)B=$?5Q*-?l%uoO}O7Yh=B7#s_4EfF;LLg(PE2?584N*KqJNGL%b0}IZ^~^ zMZa2w?;z!CMBU4FH!)_hhR}gMBR`5zBfN$q5Z8IsdC1C-$67O^SO|GStVZU zuYLkT`ER_4C*B3sV2}vm@?e| zjUN@0ETRrjpv9hb)~=CUWng(Gw-LTPLJ#Da>V@#tA_LAWzWRlTenesHDx02#9;63m z1-{JIRn`f$*@Pk&r+`SE?#8>yjd$tzn~eW7Z-rThU+pwL?ybb;z;H}&jPAt)eh zpz27r2t=|$sR`}(1e8c=UWl|b3aGLJ{yB=;_iq|#ByF{z4HOHC@Tz)VAI$zKhP6(y-A9Kn>=&xj`z&6oR$Z08V^;fC^Bo>!s5UauvwC zk_Raz_n@6-q|2^tHqSi|T0-@U)S5S+uEWpA3a1`f(wmpSEDoP%SZ;mTnN% zD-)vyHAPkqI!GO~wS!)yGSY(*1Xn52gC0b_d?!k$UF@=SoXxwE8%=!m3z3Pzd_b2V zEb5dM+YR*Owhhn36i369wrzL%A@1CvO&TAt@KAsDygu~}gIUI?K z_Y6g$gOqolFF8ngw+`P%mFTS~#0m~~K+LTu6o@u+aJRWmGnG#D+3ppg?u3^2Y-3$W zG1=~QBdr-Xui&E0ozUu@p(k{Zst;B8oM>SZT~nK$Wjr{l&)GgeFJ#!fE=(Soc(ky2 z-ADzFJ<5%g^SPpLbho3(*Y1PtsxY?k*@#+SSjlLgf4JA6{|unXlC^|3&{K&OTuzEB zE}cW*}c6H!N!G_klIAG{c^g1>UrwmpgOZ3z@{gFD%83`8z>HX%K#N01@QYC zen3TJ_PK%b%j|OlCCltn|CggO(^qalKBn{08(H^E>4^sdu0wt_ZT(dRu z3Q)A6WWaii+Mpgf1_t=x`~gGj#usP>+5n2Q#i(P^Bdf!=7SM~7mlpY@;QA1-Uk%Xk zF+V^>^ere0G5=qatHk?rAtm2abUJoH*{yUS6{APrVZ>wU^+NcfmbJPk9dH45&1; zB#=7qKKh05#k)~BaaCBA4Hck{`m9u>gw_{nG}32$cY#z#({Hm*4JCDLI_%vJP{q>M zagm%Zc@seQFLSijn|x9NnjYQCwJ-J3GU{o@Q9|9|8Vq*F}>J=oWGC zG2L+j$jABs<%8ZWfQF%iok@0!ynke^pAGO)UZ6K>#9b%Y^lSVo)T~Bpq!x0ZhsP{{ zw-aCELMpX2*o!1>er_fDWd&8~nRdm*>gon6CjA`uquDy$3O@lfTd=;*2C9gxl}YYU z;XtWW66`}j(>fFh4p9AbR>SwcvF$O~i42g)*m4juqaduMZlFj@3N69tf7H z+)UzA4kKJ!$ypuoR;G(%~1fnv6^|9>2H1Uu?j?c0Z^XUdE7t|_k@&%Z}ik{4s&?scM!qKg$Rhf76%gL64152kzRJ+ z1GW+Gu5U3p2wyXhD@V_!uM6qfV6*cgK9FX zc?Kmt%BAtA6?`@zHS4cSZ-NyTA?vSigs*iWrN%C#`VTpP^a36fx0k4U9k{BL8J1{9 z8iidy zK^9wEn4?;!=S5SfTxbc^5cg`hRmkVnHtIs5X=bDq66^H52w$8`T8s6A<>=QJ zsq2~OtSfn@_(pu03CR~p5)1KV9;Dp+F3p1!ePS;xX&L};rNV5M5snwM#@*5 za15l6by`1QqeUiIqb`UA6l^x8^#e94_zHW52TKLD7}n`INDcff=|V#&`|OxDQ1Zj0 zwFT=zs?`!FdW|Ll+lBDeeK34*$d}3~<3g$l&UOenUC@fSjFkKOd=ZsX(>EZMQ+Mto zk$=p*^NVKoLz*SZ~m)xk3V!se^p%9*!`XyWIi*6DeXQuJxagH%Q=U|*y%vXaUVH%3A`_ih?Uv0sR|Ja1SmV=h{`?)Aux$k)1% z;u_C4pcV!uc06id)r6`ZY{e5mg+ZBp1Lb?{cLtFI^=@;tFQNhRPUJzvG;Bfk_?;lN zu(&g#Q6D~WNGn}2W1FbU=ECXuvUnS&Pcwn)qooF{&^}0SL+nJ-O4n&r15qmV2g+NJo212%|{%M1UDZ0M#_TDbu!zN!p}04WK5_dORBp0qc5b zZQAfeqK*)K8G3lUcf_&<{v}HF^^r?OWs-Ilk`$a6cMBgKzU3`r%(pRuN=d2Y$Lupz} zsqr*^WdGrZvhQOLq_#(DJRKB&5TZ@oNWH@fd)SRstL{w~r||WhLyN~igX2)*2|z4X zHs$cW+STQ|H3O(haHsC##O6lw{>Q21<-1w0sdm3j%4AFN z>_L2YEni46wf%-TxRSRO&q2y$YZ1L&0`?1$37r_nzJFrIw@{GXKo7yUm?(o}Ko21- zUpG=bJzYqJ@jaT-_DH(HbXspGKqel~nzam`ybiv65^^=J{%91W_Y0}G(OYgrK=zUn zmL!SQ%;gg!8}Sv`>h&O13OkSLVxl_|+P#jE; zAb@giRl5M>Xud%*`HA;LRi(km@|lqU3Su301C11xcN=vkH*s(`GAL&F*5P}d2dmkOm=J}5tKq5L;q)CgAm4dD>Xxi(OK zyasEKiKTx4KBB!=Pgt>gU7;bc5h;28uu=ZEtf|8f+#-}NRE2yJQfF@z9AD)^_^Q!q zbkGoL7n(vn`lSA5VnmiY&}luP5WA6l`G&79xeU3A-Zy+5q}-?C ztA?-+(Zplvy_$?L{*caGQq&=smXx~g4PVc`-^=LNyRFBovlZLID!a+`pu+wlvOsHs zWxZqrmNj((6cyN-bpcd1&O{dNJ^mb(EEnvUGTxM%T>r)fMG4bC7Hw!2sk5)g_O1a) zg}F`uJs{h<2GHZd(v^c()74%)(&jp=C1Kw66z}{8YD&7~3#o{ud;?N{oRd`BF>r~i zMRQ`LEZEZ3sH&4*PZ<}&7qwjY7OFbxC2gHAQuH-$R#Bs;cFyu;T=i2YB zGSKpcR8Kw~(xq!7m$>SMlwym!-vSY^Ur3e08g1paIxPUNhkeQbS>=m;N{%$pbi^*D zfl}%zo=D?~;3r=QUw%`p_5z5JA3#Y*|7ZaiCEfcDlGO(-)t-ZszCg?)^}HT@tPjw$ z7;%$;Oc)a&eSq>hnEeJ&#!yseVG5T(?CTsvu*P6Qr!zFdUQ*N<8_-11A94s%rxyk0 z2auB5>J9XS*pb{o&xihylZ-mMD3Be80N)n<;ReK^aULffHPjJk_5mQ${sBZ9Ee357 zV7g5aD5SDJK&har!j3V7{RW_PS% z3&jlAsF7BT>;f&J@kJe9Ggj3X>wh3>`XEK0o(m~1_kao6mn56cmD~d!RD?oHYYQ8gtgFID78kSbmzeoirPb_hER*DoC z^TZb^E_y-TJ}F08z*cnwJ)F4L5}@A5>NzX}jW z!8g*nm*4{taQFh*$_26-`lJ@Ce2GJ}yc#Xe)do_){vc+m&3~!4OGw?La78Wwy%HZtBeUc?Mh;R2 zLR~J9#wCgUNy$XYQF`o72A~~fMYYN5uIVDZWyPEgRB~2RH&Fdyql3W&I_xVA>&#cS z6SN$#(pVQ#b*dH22v_CzYU)8Mf6Nj$Qi_Y) zAs=mg@qr0N?v41g*0>PSNA7i{l>Q*J!WT&2Q4YPijjB-k22}3zvvW`MY6YyCbC4!i z(#@G%p5q&HK#dpU!N~%s&;%F);{&F^e1jxX@~X9Lesr8><@9`jg0PkvK+nXAIZ`^+ zE39JDGj5D=y#9b&yi@j^sfEtQS)5v%koUqXOst0mQ?OyDW^GPQxrK=WL){=k)@8_qo{G z=utTJp_$%s1JzK$O5jmrFKH73v7&d7GUq+WgOnDxSE?d7cfhMsdOQFQ1~{%=+eXAS zFGO5kZ)fW+>Cnl_)$8pWskl~QMHMA^1TUqXFH$X4#wAFp@CPBrB^yoEgV#|HB1Psd zNV4z;p%K1}lvS^!ZlooOY%A7{)Q{vAdYhHXQ5TibFjv1L2Y|JMwlE5VknELIgMp9w z0eWrRKWYG17{F!sjsa95w%~a%Q2x!=$jiJC!N~DJN~=eGS3euY)vb6RNb3pN`T^L2 zcFG>BsG4RdK4r4k3+a*5M`l@%{2Ue4dyWQtT)u@X0I^I1!s#J;{WO3cj`el|D2Ufi z11MSU1j*<&G|KIDQv(_U`o#^D3UkEFY0yR`Fh>kP6);DnYr|D(PR|IUUVQg6C%6(v z|CZHu)Qj7%BDb2{LCO(oaxYRbCbw;87RsYhW(D;{D%)%km%CqOb@mJ4OSxZKqy5d` z$-?{qGN5;310|3Bs`>;j#pL7k3hF_Mhm#t*hi&-}|9sm2gNUnMNR_wZjTT6w@Hh znmaGTS16AKQk9f?AyrAtCv`IKp z|KkMO*g)eEY3opGQ-SPM1T@UEvd#v|2d5jkL`QWY5IGgl+Cgdk1C+65jTaf1%7%`d z%nOl{PEU1hLUdNLq^Xk*kPr41189s^m@jUC549Q!E}#O^8*V_Po(*U=PA4g3%dipSpsDP)#oEp9frCgO#1+0?XEbSAuv8*3e31EW^(lfe%6KL3&T|vPEHqK zAyUhiKS#NX$ss^%6Ozp745Jwg3&hYFK&0&hh=WT+w1|{hL#j4aRribw;t~$6RX5&^ z%CykHmEa}Q01Co!j;0mw#`{(2<_vgVmdV*b^~Pi{08hhHL9OyOUN{TnY@k|W!*Byq zQOzooiWDE~1LUJ1RGSw=ucf!Nmfcwx;VWNAWwzXSUaSd7e`r-U441b4mkixkWxH?# zy>fJK0W_SdWqbfWlw$>#LptjP`cx%{Gn`jk1*#r+Zlvnu@S>!Y3a+ZlLUJ9AIsHM1 z#m0@)@JS9wbEnR0fuGLo3NY|7{8pI?c#{R7E~EM&M*uxKZxI%*fAkh|^%mhlDyp{# zH&VOIipz`0VDq-Dj)`XPK3fdupo*`4A!U>9jvyeFt<4LOFB_y_SdiGMtzmq+k$iEC z|3!MW!uWI}y*9pzqi|fabRLzj;y6f|@HFrsqPJP0bUjugn9T|e2;?q=`){6yuf4Ae zsTOQ_dXQp52!~T+TsOHagR_Bh&2(@BJ(tt**(H|U@foT7r{gmsrtuBvxWdf+v0oJ> zI=_wNYj=M}WOIg@`$KTG=#s$sBIV15r+Ol|pc+pPL_=@G(}VPkXJ??7G|;0q*-GR= z;*zTw!9X-Yb6rUFupV1$bgVVhIUyeHA*CA;q1~dm5y4lv5OGz@dS(x=Ra>k5jTdQu zKq5Hwx#}6n`x^9pk|<473l~FfKrCD^$CYAzX`~$S za{%--1{BmwrU8hfzCpB#-fVW7^@7PIki`-+jgH*=6joFR#JTliP z7R^uO5*J2T8bKP&=57jWBHPW{bQaA@G`kG@@Ku@dQqt*R&y7R?X zy^yksnT?d|<)~^fvkAZ}QoZQGJ(F4YuW@{Ayhxp#M#MT>Cp(_vsk*GrzepKqiIagc z?kS#~TMFkzdaQ92G7#AeLAj0a)mVzar1@d(%u+Z94Wb_xA}&m=A55(u2IGxQMq=?F z{>e(0}DxjKx+3x3g;lz={C4A%J^y#u=z>;NO7&m zeYZABDp zN-^XfxC)qZ49t!26}dO6#8oeZuRRW!d_DN;7s6LuqoZL`mZs3^X4hPVCW;s?;XNTBgIRP}$vRKXrDs2g~ zqJs69)0tmHCB+5G*pW@9=shk_-bj(#Jhf_hSgy)#^VEY>au!x!q@wx|N0)YpT;<%G zj~gwb?-x?;>o%IhxR#eC4nPLVWOZFgam4}1K-5HwYjm`JQ6C<3%NJ7g4T%?}>q5$x=b&9{#BxYz>O z90JrIgm&(YR1;(89>fbU>V@#t0(Fqe81gzBsf=Sp^!;R&*(f!IOIB9|w5ytMKe~}d zaebyJ5WzKB>N8(R(bJD+Ux%n05QXZ62uR%@M8NKm1iCwPPWl8u6-47br(ev>d!6y+ zLlYY*E=$U7q%lX2Ya=(p*B&?81?^FQk!p4Kqk&Ybt9=7%Iv~j%^=lGyp_7*2&I^dz zD~JsTfXQWm-@7m#uOI@{g%1{IH^2vSm1;XY<`P1#aw9#J@%X4RC%Y2sd&B+bK~tz- zXbE}#&l$1AoZZqp2dQtd_|A)dbu`iwYf7CyuL-3KDWH!;rd6E?zRHDEMjwehi0Ipe zlzYpvChnF`%vOfyrW;YCXgYXrXu^4H9Z&9AiHL3atR7Uru2dRu~RBpsaA}eCqAaJh611On8whvP7 ziv@@|;+y#_Ezt8KRnER51Vr;{k)9Xft667P(LdcOcB}CQBH-|ws#jhkY>V`4pjs&L zwhL%oe%SE!VF>kLia1!)&5TtreBxfe4fGXDpoh_i+8gyZqxzZ$t+cqdYe-cJB!cu0 zQ1y>@;sv7+=zhlLIhmjfHXor^idd}{TdEX`XU;%vB%11nIQT4&Yne_vRlocV)h07(Dej#PwM?VfCrgtW588%22mO3miswa3 zD7iogQ?u(ZcV8K(2$e|DqY47<+oI+aZv>Kq8>_XzpvY09C*(HJa|3V*??>bC5FWqaX(3| za7hvQpo3KJC0fI77ql*7^0%4*$X6C>gp7gDk7{05}hT%pAbj~Sd&w3OXJ3TP>TgA~y7Pi;EzuIj~Y{FLF(e?=|_ze zeP{Muc#R8(YG&+#2I8Bx0M9{s+7`4^YgQ(2z2)oz;Dh!(01>YbP(fq?tQ#zKV)*Ck zF~mWUjZ`V@fF7i=)g0wQ_==SlR%djf-}c^* zo|$X%Q>!r3G6GyqBNrdk@kUxNm^S)3NL4X?%_q`B+{L&wVQwF!YM){4F){a;#N|s$ zsY|ZZTbA2-kqTisfrFHcf*DD{S=$EfPr=csH)R6ej z7b&akdls2IY4b>6=bfT!ra9NnyK93itPA}jmjsUjJ`{%``Ffo9jiyk(&=M+P!tH7V zh4HkJnk0+xylDJmv#C1>h!nT6w-G7M3lV)7d{3vV+`AV&s0xMAcOa$c72AUpeJZx% z)}w2*EX%^L2Nj{_DUKS}hcVN#w7^ChGf9L8x%L`=5Q>XHj2ih`7gFw{N9D$uMk}?V zM-8Noctwx85dpa*Hp|Ak=!RFJdLiPX?g!oeU~sV9qaH*+X8Q*baJnX@(^au!#u-SB z^RjttrG2b?pdrb#5ie6={H3WKuHq`JRcthf%g2m3VV;>OhAfX}hPW!WO=J&J<@mtm zL3-NkhQ3Ho+p;_rm9)zDAF@0LDK5+M9HfA8F^Ei)HJj+?XMQ3#?j(DFH+^$s));5X{v>4 zwA-Fi6R=%~fb3Lgpqw~6xokokK-JgcAPf#Z)(6N(cb~*yBr_sf-F?zV_;R0Qgw)CE z;0*Xx&DMCN|!Bp&CyH#M?L8g;XG43sSYasu-0oUru=taaly44Ojg^$TIpH zDf$_?H{zR~=|cF*fk=cV);;V&sxO<>ZbTU^*rOk~%Bl}!9;AF(u%~LDS-}bD_kAN$ zTo+P`h}s=QqmE_Kuict<6}^pY55iZukRBQbG7q9>SzJsl1BJo4APe^dp!Mds$p*@# zWz%IrF*uI2ESnyn{=-W4FC8-eg*DhA^Iw>G@k7q~XOphH$!{Wx3HFCL9v@cI6iq`r zTR6WYL8$8>8G=%QCZpvy{e&!!DSpB0Yq*Cww)zd* z9AAvZxAUIFCrJh9f@gd9{18I{oy`3%We zX60JRhWTvXW;`QX?H)#bS^q9rd8jYXTJ;N;yoPS4I&K;NI8y}`wyx5G+^zmO{QI25b*=l%)k!Q>OAU}{%BoNDA=5MRBdY}cfB3V=s zpHpU4EOkHS9s-JHZnJv7m~%2>)t+Vh>J;dD(Vo{=&eL$;dl>OColOYR^A}i(FW-!k z`BtvY{AKxCuEXrl=HD4}0$CrW$8ta~}{>&(cH&qXF8ZDSpr%q?T7_E@)d=GQF^I}e8 zMP8^0_a$qW!?iydjelGPwudMqD2Cmb!3Sh8E zcU;WrPFjabGvZX&-`J!n%^#z^(12bCK13`8s3RKOmH@L7V6ftl%-aVy5dYi-tC0&> zaeVD!1JjuY@PbXJyDo-56lwJZp{Gk5uk(`a!^n&E6beJa zvS{~`t%DD9SSDp?>TAtRggIFd@@wN@lSIw=m}n6DnK71F^qUVXM8<=W|E=&IjCaB- z%o_Q~rB$%@(96ibFPlD${JXy%j4y`A92OyZ8Ko-w4nDgM%X2u){-*25Y&yPmG5noA zyOSfHS4|hAyqqFE%z0*Rtih!m6He;}AQL@qcp&n0+zhC9*i*2^ea}6U>-RI^IPa?^I^O-Tr;LAEADb$=EWR#d4}gH zg2;;b9G@kAY)Kr1*jJ8svhhw5yM_J^bIAQI_$x8n-+~!6zWSFjKTY1{-ORlxrclJ> zlwd2u!kEd1p3z|$hHcB>Jd^4GmSbXX)?s`84`Z~Sy-a937v=4I{{bEjI_+4a&J~5KaXwJWk=SH8+ zFYT@~BhNjK4&Ki*4a(t8=&7buil2 zkWWH!F?Y`a^Xa?IcphPSwHfJJN9i!q^_8F*TWK?g^@;~;y8UqrGpFUsv0Z=M3e07_ax>P3@(M-l zC;kHCZQ6_;ID66iF!JI{(z2|4$PuhY{$PG{R=b$v>))`h-(`s_S-Hri9BW>THwRnh zmnq%i<3Jr-oc_@AmM2}T!fXP+*?^UcIX(`-_XcZxdF8PU|7IEHw<#EPTD;GEnElN- zBV)M$$46_cMm%R$4~k8jgOK0k>r%8OAeXq3Tc}{o{>sHDKXYu&TpBYMr_e6uuzQXj ze}RpdJHu$<%b8=FIWH^b;t_+G6$=kru=Hj0@a%2Aj2_uiO!`F{^t8oCa1ZOS7K|8Z zK|_t{Fv^=_tst25x63ifi}Sa>jMltZ>;5ppGS`+t!1A-E-}Z0vfE^cYoZCuRjn>6& zmg8v`qnw^&b6lbO$#{kxgmQa+ZQ|PT>^ca3s&C!VoI);nz}op`)J@z;s+CZ=y!X4u zHe(&4)P1PN7j|7b z%h?%AlrZZuAs&n1Lxx)#&#iSTKX&Fk|+sON6EtPCdR zVZAH}J$(o|ag1cRHS`*I5c_eSO-OxM-76#dKz)zKg%ZE6W0r^~YCADLrspeTd|9?X z_s5)5$vY3WquY!$qfZXzuheVbhuL2ahU=#s{qkni*Q}9-8BfP+-6s6sw=OpM%3Qqt z^GCY2`8v#LuyUNav0HzEjYxyCxp%da{$Z4D#R!RMoI+XyDhMq?ePZqdsgUe<9VbI< z`E4>F^+P74y`h%ViuMza1u`58$A0EZmh%%|tb)=9)%1J_`SI>_$7;Agj7u#Bbr{dK zdj5PEIrkl=on7$$Fn+Zv)XON31uzbC8p9*D#9cMXd5Mu-Fv{t3MhL?FT;9FvgSr~K z;1XX>U*^1Ix1QQPkZXS)O$1{kR&%`=Wpgjwuqg%5Msc`@pM-D!T| zk{92|wi!DBp&)e_@u4V8?6}kwbLhhuomAh=b{KhPhni5h)TwW0+l)0st4T5D#C87W zmoc)dzTC8`zU7ieeJ(~`e7)&ml%wX0Q7_fj;i@0iJ!#baJk0E`U5xzIJwnCx`%=fn zoR=A+TQkS!`KR6oxzv5L{0<|vUV>RWh&p|uPFud1{n0LQ=gz}ew%RN#2<5j`SP*hy zGiwt@3!yZ{2L8iJNC-^@am>;t$!z;SjIKjwDhTm--fZI5$pRUV?4{+B>mGvTW_}ag z8y`lBKC85uTOc3u)k4G1v9IwV_Cw7F;aPOoyNnEeF6-KrBfcn>OC}tWUgB?l!02mV5fcr*OX zZ7-hBY%YYSv^*`Bxptl9V$>zGW@Oz}4G_IOn~-1n`C?g2vvQ9=2%D$|6 zni*g@KapoHF4J?Soj+tiXgL!XOs2$Bw&c{yGR*RvIwZh14BPKKjGdw8745?+EDl$5 z^rL6z1c^@WoJrieAvT?EFsHFDruu2V1GVd9Cb7ce43?SWOW6mya{L7rXUNQW<65d0 zYcRfDu1+U)nD-p`!$N4eNM|R%A5TiQG{^I;wF!Jag_%Q0)J#a@wy?5R#3sN2CGP?&pjQ9%j zJdG=%o7+xlQdO1hZ!t&EF30{&d6@_6IKpC7X(=lIcKAVkRL!yZ9f$TZ$MO7}Vg|e! z<*3iaC`TNfby!pV`^TTh0;R-&(ISE(-HcSw0a60eIbt*jNS9J0Mk5SIJV?vv9H|UO zZ8VHVYQzX>NB;Kx{d2DK&#r6NIp?m|{r=qdF|WsDY^-aE3C@xr{zH4bD&&Klx??@Y zOb8NGH5?<7f9Y6niM@(ioakJ7)j{QbmQ9PPo&WYhw@{TX{~Oo4$FQ3EDh}|n;iW}g z6^DqI#SFW|AD*+oDc^!`q(FxqYdH$O3%<1TP`F`vI0@mrPvceo_Q&92GvIi8MH4ZC zf0x^DqXuG}z%B|0yloQ@3q>Q6qs|x6S$7&zVv;=$9E_jp@1S2$Fj$YX3hrfYohHsI ze4?Pd_4@3|_`{;<*JfPUSgGn>`YFemQ>B?$iekb$d%Za=Exf%oH3nde3ku1X5;r+*JV z_HMX;+R8H?S@|#J@;HH|zdS{#KRM-|pvU>f7{raquogIzA9t zMyulSYpMb~{EYmDj|*h4_Bj(`PD6#uE>S1-f<<#aixeNHJ{QJm!hJ_RRC_)|n(?EZ zj#6PUMnXi7$0P{bYOH10OxxfqRQ2grs|tbU-^Z#CZuz)xSDfU!3-lp`(Hs83 zlp#im2J&1ld(Z9PmZ4c|R^xy!q$qE;r^Ol?Apuow6;v!Icp=a#B_WYTja{v$w_cIY?9O4!cFP7W zSI=$+l?{$8{Xaq5NI$dL7{M!{y*+Y$-Im9fSxYy4UgiSJ5Su~t<7g5W;TMl&pzsD^H{7% zaH@pf-el8qEmql*Ab^3LI z3atQP7w3{WXg^bXayFYO7%sXnzdJL@7mYTiMt9{!sZhj>y!IJ1($C7ugDW_Xv{|+? zd3C$(uf?#<)X{jHO593KJs-38Z8j{Fve8Ee7z*VddDQadKRmvyIc^ehi zKGn6qN5b-M9?ZDeCzUtZz5Pfj(ECb4)Z?bdj|EtkuWkSJNi5U`C)2K@i)=)L#Rt8OHkqs#4I9 z`|l{_X3Z=+6ITB`-jE3c7&tMYXSy~$0-i_fAvl)n3<~yqbI1D!WnuGOVD)WubbP8_ ztZITX!}@DmpxNbp=z+JuO*`K`AGLdY!2pS!xLrw`1$!VeV|wvGZo@-+;2}8ouQ2p@ z)7JKp>zHg13sTLu>40+_T<-n?6Jdby>`>RHA~Jeyw?8ltV<1pe`HPp#H?_b?r8 z1zB!-f3x#^R;W&(f^0og@W#fb^~w5#c|DjHBf}-wNreHZi<;zg32%MM2|V2JyNqNb zZ0vKtdeL#L7$)trI_c=%AClT!Uo6GdxXtJ#{B-cG>f16lYsI;x;{2Lpj~wK`2g7-& za+YJ|7h=H&JaU?|78IO|Xp;sBEF^2D6}}QXHd!P8BY8PU5F;xd>^OyXex+p(d;X*V zH~@WbNE!CxGwaqr@=2P#6R=k8FeT(Ejha?)2qpLAF)>u1ho)XQ6mU*35*$6)cHb_u z3D;S^e{&i(r9@*Z_6}YC>PO^K^Jj_K-8;1%Rr`<2_T}d2I3S@O_uj~R#-~&q+l>>C zkbkT0c`0IIes6utvdB|F{+#1*CsavX=+E78W+YZg<7&QVKzBTUC$@Vk99jEd1hKAPTTGa3-VZm#S^m`sl(dn&CXLPud9hc? z95VNganZ#|z%3h#5oT`>4ml(8>1aDu0sfJT#Nr~bb+C7*Z`QLQYeN;(ljkm_WlV#B0P2CU?MVl`;w zm|Xd*354G~44ev8?6^Dy*Spn^bc>xaO^zdgiVb(@FmpkZ>(+nE0xwzt68A0VSM0@{ zex%3g81}ksGOl>67fL41PAF>SJ{}>Jo`A z?uk^sEjvU@@VNJsesF=yy zGFZCK$%{7?k(W(1c?-c;l#hWlm=N>|#<4nyT#c`z5h(5h*k9pus%%Bc;$3tpna&14&Tl|LsX)6F?`E@{O8f3Jjaa;ez(D=o{Xh_Fgw)T|u{(K#_H*KT z*5d!fT_CDk*Bd@Ib&eFqsN{`!!!HE1Ue>a7|GfILW19DI(;uHIM5vl- zQz-c%#}1Bqj|V@T6l}1PH|lh)BA39gSpug%m&YZ80?3H#mO4ELOwx8bj3~UU-okoQ z3he{53R>i=k4v^c?Pvb5?}mtv1I{yfecsX!1{~H>IA--Y&&AdDLq~W7a`gwZ;&379 zaL0D!G>3CxNv8c9!|tu_7p892_&y(Q+dZrPJgtMj_nqLi+NBzU-qQ>A{%rwb{Fn^i z1Ujzn&P#^}Pf0XOFJyy{c)EtD{U7F7s`_$QO#WHG)J!lCWO-eJ(#snpy-;!WaCRh| zT`~NDGkIi8zjVBjht#2L&1rJD4#yE5R%}kJV$F94>@3Ez#7pL<^T+Xezd{|Ulz~{B zYt=x8>H9LsY0J9mUs-p88+dMw7DgiJINh^?W+HSwcw2e6HJmu7y}K;7SKK>12AdV8 z_~g1hrac|Rwpy!o3r;^5yG#m!EOgQht|%(JMDsNua+eIn|Ki~F{IhOsQ60Or^mLPM z`+~-kMB#Hj#{3Y0?MS82rLeozJ|YJ$j+N-F4Dw?a2`6cKG4m~Z;dB@F&0v39UCCbrw~{+J4P!ct}Ve_Wc5eG zs>y=(?wJbHM&%_Uz=p8BxEd2eMmK88b9^=#y#ia-Yt{vARa@B(MBJL>PaiV`>Aa2` z4^9|5)pX=geHpPDNcxTqn~wIXvG~5H!{(-1#pzu{dJ|yX&^rBjjhvqi#%c#I9L7v7 ze;ev@Gx2n3aG1tcAIAY3=)H6epyU02qc9ncACiFU2Vw1;W}1)@5vjBzc+VFE_iH6XTva<7b!JMJOVbscs~y^tkUIKCp7PPfni zdHFb^snyMO`BC}#n)?#i*R)4}#oVNo>!fj!TdZeMi15fkPwiW}T;!JF{T!G!H{#LO zq%;2YAH5WH)sCa4akGR1Et7=cO|xU3@lU0B*{~MuOt;^|cZn<9HQr()gH8+vTh;-y87|h!*20O#u=gc7uswk zN9EdNU@c%a_#pQU`*9%Z`dCgz9-H5iK;x~&$jukxsx*VmlgfLBG$KM-4>~V^(O#qC z--x0L#HsQ=Sl_<1Xzxdpr&ps>5s~1Lp<%bREZEpKK9}K=W ztDUOXu6vsKD6kFScyft(Zk7|Y$CwX6GI|2E7Z}E&I+hEvS~3}030+YWpHkS~?j2x`S*zr)fA6$w{E6dF>rV6bBT`5V}ifx4?SS9@O&t&w!>8s`+FxBMLxdYrN> z(hpnqS$IE%%qp5}$P}wxnobOKsG(0^jMR%nebqTs7w?=*c@3lZ8z#27?MxY-Y!GYO zhoW6WIPy~5^lE;Cnp36os+6`WuJd{Fx0Rsl!x4Kf0~w{ z{>^k*2C$z|<(8W>pj+|(J*I9Ke1+Z)qgV5!Z*k8-4E#~71$3HR;|+z)+bS)ktZz-k z;(EQXX&fiH>>b4-dgQHMf!ZYD1D7@;x>tSYSCQAzkO78dS7%;27zb>BycRDJ9;$FV z*%B0pXxQ==K7e(5H*imlnJ*Y1SJ`0)-*+as-G*y(1)b-3Hfo;{1ISj>b65YOy#|4N zvHHHBL5ij1x>#H7l63#we6aKQvgED)xkG3Yhg*_^8OQv^rMKmjt5V2DcKC1x&ly2; z8)~}oiTbz7--eO-xh@g+;Ijzzir~9r;4ZtzmFQknC0GX5N|zWLf__lE;SB$)8L-W9 zE_E!j>~b$~1({eZ-l-5etsj3!1&R%OF7%IqMrLnlH3Z>ie6Gm|@T;d^mYFsbQS zQ=wW#1BQF|V7K)#X|9~X@Uj2okJt>IXL8pYpvj8cH5Q=eoLP2I^H=s>Mq7a+U-2sg z?fT5c@*gA56h8K;$9q2V+?2x0Z-P&t2Bj(p=CP|om!};tdL6f+?&!)wtGjr9ODq`3 z8w6N$J+@9`JV$Qp)M3!VLk-L)TjjFbO>nYtmSo0k;IH~DT{&>aP)~nEt2((}yS3>e zfe%0YS2@>73^EP$iIEVh$@K}*TXrKVT>6|Hy)$;NH*-Rb@v#y7rk2ummWF=e{}?}f zxZDr`jWJaz^SxEgQCXfBk@8+iZ8`uBO|GPO*IL4X1w>3cz7dC3Wf;-!*22XyEAhuI zD%lB_x1|koev^ZyMUbA}>)C2?eCB#1ls*?}y zP)&Uv4gs&P82BRfWnOw_3m&H8;EJ}+eyl~U4$~^nX?2E}*=rdV!_3J&gzOg=L3b3WxfL94QiA3HE$m$EN<&Ih`IhHx|#fYDRH|_yU_o1 ze<<4vJUyMRdND`xaiXPfxDV;RI_rKR<~3s}_GZ@Tn_=JeoLzduiFW^#{DaHGs=SY1 zQdjL+1l6i00^ycB7J{J1CucOoo@oIIA>$jQ|L;+u;}E^*!@!)yN2P%}wQq~fT~Z3a zaA)iELb#(UFB0U4BJl*gOjTNLT+7w#T1uu3?_TW0$s^DkD(JNF^{SiHSCb*N)T`0Lv=nwp#Fm*HvmCw@fN zUS26#=%S1wCwkRG28eD=2ej8_#UmXq!1$%Xr+tn|B+dlOMGVilu-=NMDxDtk`!P0* z)8Gfd`ZgF2<`lqXJ`^lPoy)_Hf*iZRTGf_V$C~|$V_evh&X4Jvl&W54L}k@#xe&ey znMnN-Zdk>x4{~~?Y zQqXYhIo$g_jieAEiJCd!Z7W4z<+CMzx-+MiURB#HLv>4 zJ?hZsoOX`OO)_x^)t+PK{qtV?s_0M)?EZO`*aI&%wU!U_V(yqHg;6DIkX98{hsUc$ zaoi=T+;y}z>ZP9bW5a!kzqp^3(rVjilz6H8eG+WnoUptGFy>RI|B=R$j2KtSGqsPb zcH>mhcs_Peh`hi8mQ)`!sdQw^c|XH=CFH%b5t*3eDL4n zKp~L7JxnxAXOH#i@!jWc2wG*W}KJc4L>Te$p6uT*$v=G8Su>sXFfmFQ;qy7O%7!uhsRe-vaAXT0vBN7{5#1Kk^I%Y z?lI*V-bOSSeZLSTlsPP*FI{92yLl$_N`NiNYf2ExG=#o9f>bD~2f1J}Af*D;F^Zk( z7k1s?6`7w_12ITq=?aL4HaHKtXz8_?WMzhVXJ|CUijmv6Ck5mgx4c#)3#Dbm28 z9741!pjXMMs|(K)`(Nl3IIPY@dk&8h)_nuAIrU?krGR{;zN7K_M>|@Zn}r zxh1L#pBtw`k)ucM00xr{Xf>0_#KhHaC-{UU5E?#UqiPfTa<>E)@UBwNN8Ppt)-$j9fx!mhfMIU-kD(3BCUN z@WM#dW5{3}je_*BWoy%9>(5|-T`d3)(L&!b%VZbhdY#LUITk(GzP*d?J**QE8oklY z1*Gz9g9T*j(29j}c$s0ZToRD_CL;Z^c(Rzl^9fu2f4dU2cfB+{G5QsW#tA5DDqT19 zWDbjea%_O{v9+961nLu|Jqb9PdN><=tF0+iR-1p2@3H&Wp9WpdMFHFGe>SU*hvcO; zFZ`z~y~g`G_&WLy`OP*6K5_+3lKHesvCa&F4W2EtE8mN8m<~ThMJ(yt$>~(%A(_Nj zNE41kJ9${<$cshHi7SEV6Q01O$5 zd$yM%t0dLuX(p7fd{W{x&q9dDOwoVt-FB!GD;35ewf3n&Xmc(*8syF-AlQ&zlAXy@20x}O9Eew(< zUVSZ*;knRRXnNx>Ho5^I5ZB=Q?VqU0!tR5MiasV}n*MSvqxvPjk<(CkYmOr2d5Xb9P^`nEqRN{u1;MWS_o16Y&kO&t0;gm(d`O=ShpAS=Xdo)8BhC&aRRadim&t zJpTgo-Au@9d&hd!>BOBpsnHPVp;SAQQ7JU;<9zUysdP5&OgIPH_)W?tWKrO*C;ZYs zF8=1EV#XZl^B6cSWO~Y4%yV727pim9Y_;pV|G|vQV%U?(&d*ro*1-WbPDB!Z3Eg85 zudZMu()5BPRq-li;rvZ_Tnb%WRd@b|7dD~Jf3oiJLYLe;#ok*p0`p#E>QL-v(s9KvE04z! z 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�BD~JT%7Ckv9n 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νk1Jv75jRU>EZRwL)?xlx~q5aOmt*RKl% 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

    ivmwRO)G^Pe5STqvP`0R%CapMy(Z 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 z%0D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%0D0=oV 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

    r{AVB;$^{cns$STb5HKVRm59z)DjA{4W?IXi!5@ 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ⅈ5(o~wJ0caM>tWm(@ zP13>8wVJtpcvJWDh2w<5NZQB~EQCR^5K6j9mAir;?-+r63Olr1r|JtX^)tbBH0m$U zrXQ$^Nx$5r=o=T4tKOwlx&CePpWdibzEbqcWmyn!A%FAl>SkVgvg&5(8%1eT3ipcn zYy0`e*6lC0Mt9U+KEHbOvFVzQN$Te*=slwD-woNJu=vuB{x@b0j?cTr-#dkHJ{`g} zWYsX{-$d|Xo)O3$V6INKUexy#bT}KqkmW6;q10iqPTb7*mXI-CB zfpp0D*B+K~B}QD7xPGpTVO-|aOV=eUV7UQDTEEs@!5wZyJjD!G?5({Ycz}~Q{}Zh$ z`1#kP4DInALcMiazlm6D43>|J^hIojqpDnvDpxWP}9NyrG#NdEjGdzWC zVgTiCs)KcdbOoN%``CGXiqphN>u}Km{f7iuESJq7Ma6?Mrgj!nhW8}U;e1p)ee}c0zo%L&8(V>@}B{^-T4g$8}QH{bIkCNqFx% zwHRuuulK02EpZajee{#B)qGN^-@m~UhcqZZI1%b#W%OxLZ zQFM%`efkj(V$VAu=Z)D)i5b?re&`69TzIL1ytr4?ERKEZxU&8-yz$RV+qxjAn5nX$a08{jtvuLLopP62hADgtZFT#(V)z1^Xrg>N4uj1S( z@A&v+_v@c-KULHDbpq!-?z#-?v)_NdNoQzaWAn?w6j?K|u7r@W}TzsBZG zfiy-N&EnF_WlZ>)hm(IRLbn(WfW(#S;l3K3_jjOnLuw=sSRHp36Ya=3|Kj9}6}(N% z-eZ|slLA~oWpWE{GWqazhg*tu1c%JG8!j;u(x0>NchUdKUOV_Xo9Peo?EBTSmOoPH z_gcQbMOszqQ_P1`J4rPGHP^06Z%UY;J3iP=b*{KrY~)W z7amYqWi~jA6~y4(A5a^a3BHHvSWB(;6HSNhtHChWjKb!lZ`LZ}LGdy0z;2W1eJzaD zZ}@5yqJSO)X+WlU!|A;^n=tpIFEY0u3sf2!*~^L7Sn+548%HJC0DiGd}-Om2e_PG zG3Ch^Jy^;N0y-hDBLV9PQeiP&dy0#4Wv77S&+U zUk}1GAaw_f2i5|=OkWA&62N|PE-=Abz>nPP5!tkyBfwqx%vaLwHQ-$jEvH8$3H2o$ zHXV3%mgaqHN|Q`tb1qJg6FwScMm5y_0fC7L#U;XWr*n27A(C-T8|CCA`sq*(u}zH8 zhZ!@OZ|cJa=W9^JX-t2gIAf%yxnw(0>Fl^-Z~IGsHWVsw2&pTO55pG^qH1aWZkAM_ zo+M(0-XF&PW{RCo{XezTllp&PW&Ifn#YW&tcz!8H8lNRo-*XV}4HghTHZbdPQ&6c> z?m7zZRNn6a)_8mH5qgJ_IL8rVM*~0kCul{EG|tV%WJ!%6h|Boqq3P+;)R*--Js!Z7 z%mspjn>sJ^ik=-DmK6W$T*IB?j8f!itlQY>F53Hhb0q9^JBDm~jc}J@&cLf~`(JHl zW*@=I8`waifSgh5zTC2c436Dl$GAcb(4(RB`|}99cBZK>Biy_4H7n@Z0k{;W4yrs!swbbN}g3`&iv=IykLu^o?cmNJehbb1V(O<+5EkZuhmdQ7rXi z0az3_oiF}+Z&AKvBp;aP_K(bS^yzyIy|@FO-I($0{)5L9rqXI!`B?6N%wL~ny7j~8 zt;6NU%9l?u`m;etR!C5ijbIb5u2g{Y06OTuGL*>jiAl1d>xYbaR&dz`g_At85oGYf z{4HAfuos+K!L+KNm$^GBp_&_3))BrSzp&eIr;ac4<^bf`NPlkB-7)7Bp7MTACFw3Q zJ5ozAW|IpxB(=c|5GJewHsSD}|99$lDzAP}CEc*ys20XK{$=ZpwDb33PahtYCF~os zVE^~O-5Y^f67Z>$L7N1)a>=VTR&F&hj5GMk#QDa(ecZubwZqMgQIul~Mhwg~yOpc=Z6!st+4N_T(RVUKI{tR}X&< z=j`tgnjS#OLCajNQZdL~7+HHiQ}uRG8T87EhhAADh_ULECAB|;oW$Iauh{G=IHPB~ zyGB&XK2*J@3_FK0n&}*%ktr1ds8CS@6Js^5AV`W1D!2kc3kP^dONzJZ4(a+P1!R=t z1PQ2kt}Ly@BGIMxHu3ofu1jX0Zv%_XGeipKD}}`@P@V$;7w7gOS@|`>wDVybN;pVO z1nXuq?gOAEhDV9FeE}VFprT|;-xcA_)Q@rPm{nW}Mow~UY3{pV)H*f4I=4kF_%(W>$s_v4hat00sd{$sJ%r%DKIA=SJ3r(`_`v^kY7M_mUi_>8hW6R zW6CL0dG|z*LeAXt0fd`hG(*nGDR{22b{U1G-{s{VDW#JIL#wUSW0Cd&FG!zt$D*`Y zL_$EZ*7CW>)V&{a$73zCU+O?T=My{*(jK>G1Zf*1?r`i1%A{R@RhI7Kp_$+py24`m zxJsJ3E~#Dq^asDjI}AkM7&pc{M-yHTSNkn8r|il4G+r0DWcw!eT>=ilFge7q(7EDs zji=sl_oFK#Y(sF)dTI=H`^d3QT%R19zdd25UA9_kGqLPXq`a)}!r%*vz1kWnB8B?&~!Hs3hR(i5o0>I6>rZI zmaoerBbZ$moX~y0w&cQxosPFV!m5L?IA2a6MemlS_k~oY>oiSG>pVa;_CypLp^6jl zgkuTkeiZNTrjz}GD(31HBSd78>i6wKdhDb-pE&mPB{UH7-_kCwdjgSILZIBIR1aMl5&4m$y zd@ypw!3QyV9Z?}Qi!&apgA$Ai3Ia2pDh6&BVAER4{pgC;i-4C4`1=Z@Tn`?TRzQzB zWc`C;Z|UnA4oN-hJk7E=4MYnntX>#4t&vtFy76}1wHAP+jaEVN{OA6?MGw-!m87~O zP1;idIX@$^z+E2-tXSa47Lm3IbST%1b#K3Si^GK7x_5WeMW~aPP@>nJc6Y|~WY`au z>{1+52W)ge3AoSHKFRC4C5_qCN~-}>TvudusQ)M0k}k7!lNNEN~Rh6F#p*L$Kwq^@hOD_gu)2 z!Fu90@3gF`#kg3uY3iei(|Ky!?x4^!?Jl-z9|W zE^^>}zn335j;in-<$=H07P7?8nvonm5gZXcZS~8tYz-V6tKSFq+;miX4v&5R{l-B# z&ls+I?%LScx=1MeQ?FPBH#??`A-Uzt$NrnS1{sZoV#W0ymeL~_fSpO(J`g8T|S!t5&(_CoZ<^c9>xlP(5Rdljw zOUCgXT*p||ymHti9$k%-pxoN6i9^|cdr@}9gjNfMH?lXdTT4BI`Zzw~t0+p}u}4*< z7UVx}q7Ci}xrU$-VJ-4n5?L+*W-e253i?z2n9Gdk{2RG%musRkUsu1ks)n|06BTdE zUtMai{x*I)I@8zma}npD=4XYGbpVNmFe;-!HFYD#XhF(rZl;C4jhRY!N!(qW({B2< zcV|@Vi)wPJoxa{K?{XxVea*O$k5;~lm+rU-rZtmF(~3RYHp`0?1>sXqb|k^-M`|uX z*JigurOJ}GabcL3$-}S6)#!WSg_dDeuK=hD--L%e<4%Q>XV-fhj+YTypirICvkJ-ZXj( z`5b+cTh|MNUdT(EEc$*s*nj;-yt)WEce% zJbN&iq9*Y1jv-JpE+45GVc*As(AP5ZQ!MxB<_)-ZvY(dWXjBcO zOrhs#zkIt&zWcFy*fDVM`%O~hkd%;ah@>L7!^|exr(sg$^Cw% zCs8hrk+S0Y20jOok%xQ{@*0F;Y6=Q(Ry7zEh!nA0x_mZygD4L_a5y&_FcViDv@989 zD!a2x*=jegPa0bkwJe}$lo+A34wuFZgqHTnFE7oc?g*(U8XFcKYhF)v6O8!zr&8W( z;{k)u&W3)fB4jOYDAc}Im7AxlRi)cqRYGlE>Rm^QIhPM?o)6V`SsF+=g5!}%=2e`P z>3rqStpDhy7`8?RifLh88hVdZp65qC=&E?L(yV(LH2&jko?;_a18C%p4`MCKAvwD zyzJANE+#NVyIpydXUzGv?pxvo{^nk0T($by@aM+o&PwyVm*&e(d)y=`gU4lC2T)QW zB56Gt4FUt5J@sDMIh#{l-GcD7rDyvnpRJ`LOS@>+FP{ITS`pmHAJKt6L#wob_A*bu zL!wRtHUQ?O7@bvnIdmJ%E~OKb3g(H)6v>@5^%nx0f#b-y?J^-0t{{00>+MCGlBpr& zq+9v)DZ}0|Q7(CJgG5&8ng|8ja6JhV7Z!YGEH|zdd z;l8BXAOSDop-(RNe<_83D%z^6ptD0a2klhg<|g-EN#9jRi6u2PJBzw+Q(lEm9Q8EH zhEPobrrK|V)AI56vE_x$et+pFq7GeV2VKQPKJ6lQUN^CLUAdA^j)74cteN( zy&d^Pu_-g%*~hpF?bO6xL^RmT=?T^71f0J#lVa>nTakQ_bMN=G6s@edLNz=uz;K{;8yA3`TQev*wJSucN%cuGv`!EQgUvJT8kGkb!V&RZ<8smShZ`G4j8O6lbpW`)$o2|U()AA}|vgeerjHk=aY4yB3SL0mi5q6hLr zZKpPPC+Go&05Aqiia_7vD6FTGY10s*ExLw}X zh@RwA`4}2=FAenc=5Sx6O$md)1qWW>7=PFQV*;V9pip6l4snSaDZGFXEpNT>c#N$z zTrN<$%}f5B8N&V7b;YsJd+7c*L(@_r&B)D?_T-j&9$?|Mgz!Jbg+$f^U24)G(Vu|V;K5v zsoW9FWyDL%Pg}5A7wacJQc-hp#&}0~=z0<3BRt(z_R*>a_M3xu`Pd~lu|F%uZq}yZ zK>QuN_3R+1rLHu6HRrak2g)IUdoe^c1OMgw^I}CWe8g?1AKtLF4AYA}WM^pU(4Tjd z2ci34)}vClEkllvT$=ZD&0aIA1jq;eAeep)kp5GTIry8-zlGPk)H{DaH%5I~YB75c zCs(EsrLY*KTR(dnr`>8_ZmLLp;&*FwOC%o*)EX!mP*gq$y&G0ZImes^ESBv82_IcY$EyQnaFn!S>qbIN>JtlO)oLob zN%!YqtMM;&3#gil+}HFKBe|`o8nm!fHn94@`+AS@!ktQ=hQ7a$48}b zEg_BtiQ(rj@H3`|eX=js*L0uI?zG01|HRX@*m5YJ2kt{qG11xh{_s3I#r(=);Oux^ zgi-^|2Y}Tahy2LU?TB)JzS|I8nmx9{Ez6Md%E_A%raHE2fx=nyYd2@ryEL_$&v25zJb@oJAQ^uN*R|cF*!Q zR-`z>f&}6|(VkQr`B8lzE@LTcDppjUohC+96Ph_Q=u^t09_jCfHK&+95%Nw(N$slh zY6^IK8-cbacBESC8YQ{4OSN%lusW!`$43=c8o$p=eWVmXEbf~f(ptfC*5+Mm6~y_5 zcj>MaGYqIj(R W@+D@`e+jN$yA#O{>S*HQEwh@TS#%Vs$zG)8yvM5z8~|s{-f%C zzj3T=Z)MS#x*#rk_#SNtyK#=-i>M@XYn9C&%u~m>+{!C$(V6>n_@b3yQ%C8};1aud z(~6dZRIGD=d-?oJsWxTd7vkWTA4Lz;>ybU9Fv-rO;Y-VJI6@?lfegQCzXj3;6a0C0 z+qVx__60arzD8)BJ>slR`z+`f-RPUqaoMgp6>dbc61*o{P0-);X?ILWY9WwD1A{WE z-l2r`df!u^cnZ#5O2}uDXW*`9%}_QF0w;&`b^7hfoA;r)~f>K^?O z6X+m4y(!+;h+JEe=cGxmaN^ULNtI`dINWMJJh7(a)4VR}x)?q~Rc_s0JgQ*lqr832 zcl;=&f81y%D3f*9!Dp*~&8}B+p#xXzGW=^COBp^1Sl&_SjhWo;+*c%e*h*-``S;nl zZV>O!`Puhd=9Bo~K-g{fbD_t_`@q3@rJ=uJDu;o&grJ~*T1Chj@|Kkl3||Hqy&_EK zt9gQ)8&|w>K-Wp>=cnY0PJ|o1Y<;ohl3KK|``8u^`NCVFjTxw|P^lQ1M4#L$h3mNd zt@Qyhwq0!=>xb6izGIG%n+(|6nF_ao@}{C@X-rkTP-Fybev1cN7t>IH&5m@aA@h2) z#ldzDxHJ~IFnr$oKqA~G&TC|D*MX+&qbn~&pO+`o9f@;zesBxl4|jZje@&WsQsv&`KFrU=6RW6v>-)wBd?m%;C$4buM&>fX zU(~1P^6K;CieTZdl4o*0n%y&ZHsWcf8BypvSE{ylypQxcesMR8TbC#!is5{+MwfPX zx@i`ra0Y#M9E?P1rT3{noxcn{QzHEC*%xzvs&+DzScpThpV-Y6M~u8VYj(_zfs9%4 z@@as{iLa6^@#q@wrqIof#^C*W6zFv!JW2QcC=`L^apJI3amY#bH^W^vJBBJojhk^P zxmIgH^fiDvK~XIdYQHhlF6oh822g^JKvqvLwVraxd~CB|>AxOY3S|lf#DMc75a#Pz zPCO>v`Jibx@zmLkFZIfF7N9?8R!32R&@_rcd`lFF$9a^X{wSuRn6d9Cvaf{%G^ z-YRHnukBs`El+V@X@xIqmNlTEn#SxZG#dGCf6qF?6r@Z!ly5S{jhbS!-}b2{*M*Ev zJr`G;y*+aG+RPLeKGRd|z4Z6GTm_x1tKCaL4EUc!lE4IYXBWM!C08gn%QPFBI$Enf z3fX-YqRRUaMS2r1ljjaZn!}Ktc@gpok|7E^y9Yy)MX{Y)9kaYur!TcTY5v8r|JN+V z=+o0*XK#FX8P_DPsNqu4E2zwWGlV=SRpR#PCY1&hmh1=nqKks$o%675@f#U`7rUX@ zyLxdh2B$8-x@r}mXgJU^R!ZBkAeG7G(A^pP?Jsohl!{?NnUjirs9cHoI%v@B2>sdR zPO)s!m8)$r+;GFz8Xm0E)W?{sZLQFuWv+PF??BHuUZYS0syQ7II*?WAvnzdFGTq?M zAL8<8&WjWRU5z;R5C9?%o-V}ed0al%Cx0=cly#97>&Viw;>WEqtz;^v9||uHFb|Oa zK%nr`YS?!rve1$6xP|s zE~+-x8#m~8nx0Upe^p0LOKWD@J0(kHqtIN-P<-){#r>I1+gU!83TO6%ldQh;=5)+A z!}RnNL%Hz{GE`VPjb@=~=kt6yG}+5+h3TTzpp&n5GiPC-pEk2?Br$Wl_M4XTs3-`o zoB7N;}9VUj8g{V&1p9h&s^^3W0vz87dds)O2w!J+}K{UCjH<5jurLbDNXi=8U* zcb6_SlD@&#*`4G?#^1?b5J?6_isPV2QLW;z{C(PZsXQU(5i6(6+?nFv;|358r43!= z(J|Zm4ihTp`Y)Rp#QH%jW4ECMlo(qCBW258C(p&1GNP8m6f1NDjBNT#QQ?5duUJ7`$EY2;9Q(?Qv$(JX@4Q z_~^E@&x*_!7%m1pFc9-%mt?^eRkcnJ#fCAHC_-CQoMiam-Ed}mXCsdl17T>qi(m~Q zdDsxW0J7lF=at5+Hr|+m-1~$!vc=c#llS(6W~A&himMfn3egCu5KRWT_YWRxYM3^> zmt}eASUdKKx*s<=uh8sNt+;ng17vjH=<4C@hV~P>`Tzfg{=CQTmqZoeZTn&lBKp9t z?&1CVSKvO6)rlW>(lgoLu}vzfh+juz?xW)YvBq8D$i#@}`TXYvp9SFrGksrng`-aD z-^kKRfKGhL^x{84=`2^l$@s_77TJ82><~zVKa#QJT2HD`m?Ju&0x92Y1a=zhT7)`W zxjK<1y(4vt9UY$&@r1yJbAkGp539nQD+zv%@Rv6xOfdIQo4j{r2QQwCkI`fic@v{lZk&UD-S8FTPT{<(?6U74 z6)1qMEFHycdc@hh2sg$BE*zXJ*->(vHX;~p@<8R9h+Di9jfQ+7^87UDq56i~sI(nSSn!a-CNq)Ul36$L9rrFTIA4 zD`s@-fiyzy?FT_~;oEjTtoq$1`}5!J4FiaBmfDNrUBu}vd?lxw79M=I)A)|8LmTBR z{uAvtKL9f^;*y_(3u0w%!4;(0%uBN9!wVhQ_G1&2gAsn@EsP^lhMt_@BxFzEaLo)m z=~Z-D(yYi{h^dkJlEmx<`@DAnDU4psOgpQpcHXAEvmMhFu5;sF#_JXXQ%_Bqu2qY1 zZr$hHa^&0!;Dqa%TFykB@Z8GG^X`h{Lq+lps!lTs*Ge=JQ%m=&KCprafE}E9#CyYm{p#?E(hzji_{{vaYy5^S9xaHqww)1nI*^QGls!$pR@!*HSg@$^O_k z7LrNy-<+*M6(d;K=NN+e*UxjZVW=`low1;5D3oz^KO+EMoIr~Mw)qv#5rb3u!l4x|~ zSx6f<+-9in(0|NRPoQPLG0A_o|0zGya!45U<)v<1{gY>f9x#ets8h(41n%U=TChpV zGi+U`Hh~}5vYBLki(yw- z){80lt@s)CN%$?4x7+R8K)SOlnp^3X+x}{%e!V%a2Jjc48@j6&UMRz<1udzM9~qZcY@w%_NG<%BkNw02J#K>>xUjrIflt zk$$dC(*wtsFR&W}@|FF45mPljG$C%+822Lo`q2u*n|%BN8rBPa$*is&_Lv>eO>#|~ z`WQdb`stXzvxDnPuQAr6o^>iatKDFy15%qhv$)DbPre_HvD^l37FMkA+x`s83;xF$ zf;>;x{}ZcMpLR`+|GM`3&?^8+VcRnYX0NuVv|~frSeG8Tp17*UC#(o>k%j1{<9n4K z4!gG5j9dX1F{rR=53cFA57SMlGto~rv`GFJtecNUzdzfA7np5gA&o?{LnjjH#7i-z zKDVIt(m!o#Sjx?PYl*tSFPmnCr$vF|UE7vm{+DFILI7HY@KQ&&fvroU^)B8HBT#9g zxq4J-r^D*Qaow2lX@!cu&B=be7;e)$Ccm?!Z~r_^-u$$`zvcXfkaxe<^KiKa_!uBr z{a=2+6bU?ME`1SyX+zuOI8LOuhhg?V7F0-`uP4VC*gP#wJfj;G^h)M;UsuLAI(j$< z7tDe|HF}t_wfZ zI%whfTc;^b>c-j;=M2#KY*}F980hWc=?hw0R7DYe6kwkY2{-kEg%AF33`jJ zFbE{ryr$1mkQSHXh$QJ=ttfIHgzQZK9nIVw&t1_O@ps}d+n_^LMx!|(SVq52WJzX! z)VRvzLsNZe)(ZS(%LEp+PX78r7=vlS(3jX7a%&3)@B&1ffzIia=hWf&2yhrVa~@y5 zbOvJ1$hTMJu8gQYfD?hf7N>a@Bm(2E4vlHHkN9(>qh2E>z`oZ5oFjGEhf74@`A`FW z0oyzbnZQ)=sndDMl^3)irO4^Zy25z_VLZ;__AiJOI$Lw52`D7~FE2S{HQVFym~?3* zZl^C$g&TNJC-DVYR%$gTQ-{@wstv={-&8kPX71dElkD>zFTLTUL&(_loPAp+kSC6; zb7sl4dhZoh-)D@!JU7ER+EiAG8hkZV!Jl`+YS6tPyG$wP(v|5K{U+t_S&usCy*6T< z3@*PGYsSEYF!^}Y;Dhu_fpc5Ht>pdBwKMvJ_L$JV!Lz&vNpnS#{v?ImoC}LF<+ZAV z+Pq99K<+Z)9Bh;BthmudfqSttdE6C)aZuMYYZYah; z6yjqEEPnyTn1y|k5g3G6;~=EP3k%qRNMuWz9q5ut+u7D(^pmBE5FYczsUx=~CD=~4 zMs(FNSJn7OB0YF#C~{F>5r}e8_fjnbzNy~oO%;cSB>YTbcD&$B5`eGV4f;&4AADy7 z|1Qw%08LCeV}8xX+-Cjc-||U+Br_KcMB_Mnv0JxwEEA)5RehPUCq{(c%}~5F2QIO! zJ~qUDOGli6Odz)V&$2T(ikcQk8aWBC6#mWKMu90bhu0Tu%10P zxL-sT5suf2;(L#z*XBIW8jLjjri8XQ2O?x1vs=@rl<0d071EBef+arxJ1#ePTOFC4 zHtE-5c&q<3D49UpsA1eg&irGT6kcc(2f~g)>df%cPfPcP9EIuoW-_|eFJnyThq909 zwDJnu_Ik+3Us^f6dU9=S+Ty(J3Ouw?YYe>z2)zFs66letPS!`|T zi-((qVWbMba|D66*(xJ%*rwJL%+9^|e7H+Q$xOD2VsI$8oD zG+Y8-rU}^)9X$nTnt?C6KN#s7TcK6nJ^IlRxbx$ zr;82`?)qdNwj=i6yfG=SXY@S!kn5Y{u8U`R)tkTmFWsRjyGaq=rg)rXWeED|fQ~#b z`rH?E1IQ!LACxsm=JSAv>VYWWl3dKUikksqp4Uu&b71IPk6~}~VIhzb`(MTDz)uP& zUiq8chB|Kn09!?>^8>QC?GyLlR1`;iNI=mc);9Wy>JxkpeWqJH!g-i3UftT)%JEa* zI$76S%<@OgwlM8&SZ=M!qIlQlni9CzfE|8zx)xQBf%4PxAK+-;@)d6b#fR15u7VVL zaEG+YC&A_4HLst7OHA=9J}IAFlXY|$1{Q|;fNb26FCx#IhW~D}=g?aKY9uUr(z2wk zdBOaTm@ZXv<~}355QK)U5RG;{2EhSJhtwl$@oei)-b_ac<<&`Dn=?H9g>)gTb|7|* zX@Jk`ZR2m<9;DJMj9|8h&x>?@ITQ3mRwJvfC9tLPUcVEn-o5&}_{8~7zpMDqlYcPp zr1xxF&9es)y*VQLqhEeKw`FCi}Q5!iBj~>!)Ko=x%dkP15 z(7pFqP3GAD91{p0*I}<}n_4GZN}YmaqWnbf=4nxd0uG64n(xjFce(@vkGJ!KuZP+= z+%RRQ;`=lq+y#i*f{QsCw|<5Nr!YHeXc&(w=kWqBw5h?FQ6OJ^6wKyw{WMON=@j*5 zm${-zHutjEr{yY1E9i)~5wTuIr&sg(*vfEWs2Q){707+L&1~Cf=D12mI1ag8lHm<6 z< zT#$42Nj(?|yQ}bIhdvUPM_w9gUvy}Rd{jp_Pq7B%-DWnOP#JjW*O7QB#RXVlR5@CY z;eUuZPHvfNbJ2E%&%Z(Ef=QUisQHvR710`$5_);E-@~Nk14d~ULENbOSzZB_h<$-r zvT&VS4lR@T?_&o%@3_DPwC1>*S&lw`B*Ff@5#o6Baw*GeCHB{4CtoYc)zN+~IkO*s z@Jc_aKBBb!-m&b%i!{JrB))S{{ zoX`W$l_^@XD+}gX0rDr6xm=m!=rj?_vhVcC1AdCrHIL4zoSv)jqtg~BG(_r8wx&rw z@M{K*lK968%3zu15&`&$Z3nh~#aj#)usA4WUNMxbje*ySJbL~ENNTUxo4lwzG;$>B zA7fB?H<;2Z@8_-fZ66=u{L2l;%hLXY9}=cjjH@HmnEbRdg-hhrzgNui)>PK59rE{~ z2jA}}kdYaDDN}p9lXQ2VU?kIakS1mi93X1`M}aUEfH#>lw53!L8}VHt{O=eF-X&)GUbo5q{_}<@ep{(MLb#zIS=lHwOB(PccjY6V4Q`pq5kEK!3dUfF0D7x74@F z&CVtAN#uscQ|sOVsS~8VBY6ootHqS!P`z*8+3v*yVa#YMT^O@#^^0rkIj3B^K4Qs@ z9^7Q~{qyoWFy$ubu(NOOeSK&UQsh1c6Q?NMwl@XcJ|tVIg2>NN zUBwJ~+7HS`vkZ&@aR>-E>#XqzYXBNcS{Qadj^QrvQu zm*{rGUTHBBbk}1Kmr3?-iU{sQ9c=~ScIrO1>5~rUphey*nY?jq(l?rCHTjLtarRU7 zf!fr)ENSZHN#Ac80xL&{4d`CDW;B~p>(^mI8g(T$IOQpKVx zf)!@PbNkttk#?dZ?m~VU?@WV(6`UW^h5?8p0j!Twf%Vb88GLYjIdqjUwC-0SgAO#P zEY|P!t^3W|EukoV_}fVqpg~wuf3~d@Nl+s??t2*|8IM7Yz0^2DiAYi*IS;(?knuoHKIelzGbCa5>AECI00nVbdu~n_i(b}j)`Gm57*7enHC)z!| zEmge7GTsU2ymDu27+9}|Ym)ZIV6Y)DmK<8QQz2xPJ9uXe_{7t9RJs+!Y$@J4?U_Fp zU#Y0|=+}eDE=E$&OJZe69Z)VEUrcZ+yeneuNNqne+X4&N!~3_pgEEWsZ|WC%Ii_0K zb*QIEDw1=1gonwXVVN`IfQU>=tsPB=Ev5FuF#|DKP?W!=7v&6#=UIp%YDs;k4ioM+ zfPpi_D~F+(lcSbK?!hnLXVpX=J)I(TN(M}db+Ta9buZdkAq#5utC}wOXU<6 zjYc%V36N?y>L8>qR2Sho0rS)vn5FNm|pTrLN!PCXKm?cmE& zo8}DKlikmy!*n4kmg&i}SQJ*{gbaxf6n|twOX?D-bx`T5W&;j)*ZBPNC2xI+RwyM+ ziehtyvG8zLB2_|{+A)}+omrnu)3K#@GxK1Z0L=^wfw$P;CO+ik*_1JpYiC-L{;?Y4 z{q>ybCKH#!!l4H@=xW)3eYLD=pB`DShx_+hQgKPby#Jf8!SlYWP$clA(uZ57=(NPK zYv@%p*~b$_ax9<=f$8o|ACL*aOhgL|ztUaagLm=Y2O0>@V)il}WNPLgpy%$#&#LRL zJ`RA1&$cuPWaW+jH1QkFE3sHx#vepFHyn1Uh`G&FYAAfaOLe2mpV`knCN6ZQi#iMF`xCF= zp7?_pI=dtbAR$Ueep$ex;&kZ#*aAfi%odta6&)*PTeMcdQ7~Mg21X8$wJYW8VX_GM zYTmzPE-vT9IyoOC&A5zHXqAfPsSRkHzXEPIWCVz03vEPUg85i5{Q{;Qxc|+!&7>XL zr^0JzN89sigZ|JrB9eVZU=nh&?{;(e3GxQirwlm2yTVK%Li@Lc8e$(qxRpsXy!8`i zX_fEaOqyDJ0)`m0=y^`#w2hkN_-0%g%`1br2?uEM58_^XG3`73|2c7 z$EWioUcAwdV)byEtO$${4mfKCd?ta3%VXpbd~fDTt8AV3>M^O^Uhq+9&REHGQf~)h zXMw~&eO-n((gV0T=1}R5j+zug5r$s47)wM{O!z$xzO^^cA357XiZX}#i=+e6+dt%5 ze*Ng*XomEPeeja0+J|d2)@!Iap|Sjx@X!kti|$pt$|cu>g`qnxlM&@hbt_AI8vmGx znG;$k=c>f_h%4AmZX2+n}DV9=(m`R-&Q0k-P@tS zD@P@84ch|2SD_WM1KK+s_+9G3Vy1D{sVexm!m^M-($KTj7p20$v~BKb`}qq!B1K>Q z5nls4SW`$(6=oUoeEs$2OHh*s^PZ{>a~jKO+R018Jvh=SsONrfUjtnS$_S(-24PAs zXate3tX+Y1fI2yd-0(2;#y&Zi+b2w#tL^Wwwysm> zhba2Jrq=63#aZ9rH~Cgz${c@`uJ;zE77vZ^$WE@Jpp={?%VQ2kcK_5QT0gI`qY0(m zG+HqJO0Jwx3;`JrZnHcLG(j(-3a)28u;mYCXR{Z*(pKdZhKZUnk+*5z>!*Tg0*c$k zIi7%LljK_373do9>=%05sW4-UcNee?utB|odRRm{)fqyg#g#DsG%PYmlje7@ zP=C*qkE6i~j`PcLH$1volCL2^D~H$RP8}QWZ8Se$dts?exf13Pyu`e#(&qV946SHd z6ERH!1{qF6+VDWj2pIRo+kBfXSo>xgL9i<$i#uk?-388X65UFAqS?iuzPFblj5${) zcv_e9#geWVcWc6ooo zr(<(TDTH%bWIG@^GNg{cZP>`*(rKmR_P-ha1SkDT^-S&KmmMGUGOIEuN)99A7@B7v zGfKYAFJgH4gIAAH@?s!c{<@S!u2cEv9vWvx)#`G>I!WAKuc`G&D%{n&pfrCs5xHlz z?ilnju5a5x^+bsNd+5{_sB#KpedfS)ji};XX$y|tX4o`#z^(k2?)qFh+h{5yqfA}7 zYgKCn7k9%`YVQGgk&cJ8t_|0}%B6PM2wt}POn(D4^f&PKWMr7MKEKRDTUk??2G@DH z$uTyI-+kqOWSG0Ec%Q4hJ&UyXpgJ+*4XWC$WRhq)u_NU)WQzt18(fh&NnCINVexb$ znx^fBa5oBo+>`Oh3+HPeika+Jy~B7G21OW$O~pz(vgO)lMv7r_>)DQ zn!VVpwa|$WBsh%NYhdIj48aHxV2A{h|6Y_2+X=~94IeO7C*rlW<|u*z$M0%J$ekkz z6oy?HXO@<8CK>q(e>}s#MahJ4O)=XG2}gQ{x7rQzH;l{OskXbYLsM?Fg)USm)Zg^_ zl|T_V=lLr^`Tf-iHYtO17E>4BU!99WPPos&Ri8yN#E3uBgB!QU2ez!|%}x=Ox{<5k zm;zZDnj4jM=!fH5Rpl?H`*9;jLDYHF(x$xWBv^#WZ_jqoRsrk-E42tN{39>J5rp7Z zt6T!M2q?f>I}`TQ(&D@sc(mrBMm7J0bj(OXrcK@~4PM6LAfU6h05jiOI1WrTHB;gl zJ&-wvdUOz{s1~D$$eoSyxJ|!^kl8I+q;K_SwCnw~MciK#YfYDqorLvV!4lf{QZWG^ z375Kxwhc6?_LfEbR1gF+T`|gROir8jPq&B433Jb+RpOvmZNC)O@Vj&{&Aii#_}&2F z9iYgNe>iLjIc)gfS0F;Srd9l40VRLM4kt%^c`H0K76>5^7zzy5J471%znEvn2EH&K7YeA7EcecACX+*!|jKaJ8 zgkD$qL>lKUk!R9e5yq(JX2&FE8sg2*{O=t z;i7f?@3M)PDBX%s1>)4ogCgZ_?*iraaY?Zpn2$9hjn9kd=Wwv13<|HBp6uwAt^{77 zAZ~L`bH1>TkB}*4<)T?%JpE(#nB_102ia*bR<$0u`({^z9Cv;7Dq%WtjanRHFdC1D z-6ZF1itGY;Fjg>VMb_nF$oe5T;Tr(Nl2{q0C z+Ta>(e&JUUWg?!+y2l0mK~byQg`DYdelsF#@*^o|iaIN}!7<@aRn9abf=v!Pqmng) z0h=9V0!2f`b@ELSvH$qC6g`tGeLBoG=!QSIsiJB+Pa?GPDNCP)Qo z(zkl~d2nj|gGuE_b0{Xi{@`71+bcbt15fO$)Rf}lwJ$YYM={BTY424hHtWhuHSUgp z0CVa|f!BtgCJY(S(PF?k5DdsVs)md~My5&6U2eO;ckMJ(TKAMq|L54Ef2va$AGNjR znvbCy)jBPPAwBG#mIA6FT1ja9tiOIKfYX@u)oGfHG+{4dAo&?RnU6TSFptB1shtx_ ziPZtYLYC?xj^KK?qS8BC5Us#&IP1GbNL>NC0B51V+vfXiB zn@g{&urmQ;XP5$yq+QhRS{lR57)lyWSkzsGd$*ekcSkgS@)qXgNWnM`nUpA>8-35j z%>Pi5JB)bI__aInhRtH+~8&Hde1=uMx>@8hBDb0d05hSF2#^*3!LW7zHOm;dc)ApTvu`i|mXs z3%vK?W53EC@!dRl`HEqPnF4WdDEu4wo5Pm2tnT+S7u_t1nx1@%zPloZ_VH?Z;UMMu zgeKrc^j@*DP}^t~GEZ__!AVvv0Z44YoA+hmJl<3zE;%;qhW(0Dr_`M=vpz?a zR!sx5coN3^MC-n+6AVEFgm5}h5%A~A-({_mkd5UhEnFbgu_qe_Lg1>?YWW2_<2d1R z=fa{gq=uoIKDfJo7LcBqb&sV}fA z0|Ug%xijFn8lJ=ZzaFPAxN7osG?31q(1o9{W*dG7R$?vjX5KYg-7cZdk6}SjXFb|7 zK6zul#iMs=h9a>=ClK%`lE)^6Vgk-zYVJ%Q!$iY%vIy~1h#%$bv>(9(tWKE2{P&CM z7-ny|dE zWN!|rl#TfOUh}&{)b`{PKIJCD7I-~Es{Kwtjf?;#$hyHLmBH0eZl{Lf(PbZ`NoZ-` zEjx^q0kgr-CfkMcF~%+Xb;hv79=}7BH0Pr6m#{0NpmJGIGeC>&N-3l3Ue6qHm)l>u z_57tX3qv0bqze=scft-5qvB$_PKenlXvl5xpakmVNs{qXtTu`7j22e&g7S<*~|<4!slh;g^7?VYBv#5P5X;D z6zoLGf5+y2l6F5b=wu*_!dc!o^BzO0TcVhWeH4K1O3ikoYeESbs6QmZ_UHFevj8y! z<&_$jwKhDb=pvNrM-%ZPid(c1-ic%%2_o)+h$1@BK6bszPQkqKt)j*629EAoHIVk< zJ70f*=R*0>*KTevKII$R)0&S(3!>&L8NaO4b~@9f3l1oSbOta5qnbrjL@hGwhwv$a z{2gxH4B=%q*=VuuMMb$j9Z|41%KikONo;_qwJw^^&iN&wp*hMWyse`{Ii;^$*@~G_ zkyhb<+}z&L@lj~|uP?4-f%6>mM#jt!Qs~#s1zb0Sh4h@~nV(-$^IuwLz1-$$TS#{j zQw{m8ixER_j?wEs)DIf)czl^or2oSUUoioa&*@os+sT!hL*I4kmv!T39t+$|r;Tex zrc={%z8C&!HnR};jiK#Ru)$je4;S-0F`de9RGc~vSIm)JC#X+e%jeX`hunU0YJxxG z>67>~UvD<2`weM38n=83DF@P0-kEgY1r84kT0{mch)3R&Kk+3 zwwE97nmzVPK&RK%ihjDV%8K|L-uh|3vhkUFiun<}xMq|x8jlz9X}{brP3fnh{CCd^ ztR8I^S<%>Zc^My-`65B=BYW;QQIj{)87Fj>?Iw~HQuuwIo+!8TWyN+M+l1>IH@Kdz zz*pHEH4VeQ`GE7aHY$p?aV{8gP0lC(upRY?ZJoK>P%b(Gi+?0pv{ITM^Mp)ODL}fM zy8-7vz0->i-gJC3q!1Z5%Q%*aau2}#c%&2fYeFaeaPy2gJ`*pdn0vERX82GE;a)}m zqn{qPbWqm^UfR@wYH}lWgh@m1@LrWf9gAK><&;IejPagP>w;6N>gx61`iJvqnRVL0 znxM0FgILRilJNc*Lvx6_U8Q+f?pJorj91?UeC3!D7FtEBo$(^Lkfe*(B(%4**Ho)nF5 z+dUhS|7t{GhlpT7?VCPfD1BS8^U`4rBU*@@gA*t6hG#;}KV(xj`OgQzD8}y%%6~q- z%+&Eu(XyuUXn*{-5x!QaX|(E_dT{T*SL`awK=nIlD+(wQpfq&VE61H5^DCFhFRW`5f70Ebj_x4p<@!inh78A;4*55OfY zW|{2f?y2!}1FE~p-2w_l>li=M_`IBD;)U%enJT`xPbh{7R%yhOR{5KfE zBs+b<%oG}6RZW5ih_lM&A^6dt=dx?UP=`E=WHcU1uBP|&_ze|Cnh2C2N(~xRyfwLL ztckBVMHrd>a;h~yNCqzX?BsC!CI5|$fDJHF4Bx!179zD)NI%46t-?Uw28AVXNp1>i z$2R}dp`9kpc{XrK(kt~mqsPb6Pxkl$%fP0gtKH6LjhLC3C$2qyTv7U*@cZ0<_W7lw zfmCb38ew1+n$)PSxgE8J*Qnm$fFLl-O#`71E!y9_R(}D>O7u+xd!no*1w)AIa<0np3dMgVlwlk=;GsBus@|T$;U>X zT|o_Sj1D=edTkUubK%~T@6a||uu>KHXvJQ~^!2Gr^FjN-mb4GYf1l+al`-DliTy~9 zupPyWYJc0XcwU7Jwh20V$t7P!#mvt`Feta|v_L`a@Qpw$*h_*&ZC}1fn9{WMd2vw= zwXo&_PSXUVIhE5{qRsa|i0}Gd4H~I59%;yHF00fNBt~*;6~y_<5$(vSi8W3K>g9Hp zJLw~ncWV;eD-IZ^=G~5{w9O7r5R;*tOs<|+lTqnhhqrfnfCWder`;=?kOP_Y?B%Lr zU00~IlI;3=1wzha?>p2AWldjmQmva|Jfz|>v~o262=P6+D@ zpbj2KtH_yHmj_=bDf-1uuOc%B>rvOnC`%NgP{B4W*rohjSjkIazY|ijFhU&O^f@;X zIfn7j0gt^szZFzLR3B_*mkDhHnO?Oa6Gcs$)fm9Jw0i-8Ety@5ZUD84?`7qCV=*>w z*$~e+A`>webL!BA#&b4>phIBMrv{a&RKyXsuPWaI!KWa*Mnr3{2FtX;w{ftp9os5V z8HLpby$0w`{RsM?)PZ&A>y%D7J;s>S%ITVIvcYXS{bqq5i#B{oe|NjInr9y>Q^kkT zI3SeZUp8o!YiNn9;D^(}7R_mH``GM*j{X+xekE?g*q=l;Ujvk{?;FzB(jk#jPG5DyNSxXcw+kD zD~jG-C!@!gT##79ki-X;NT2hEBbKDBweGfoy;Z9a={Oa+cR(UsbbcskLn#*3bLq94 z%l!xmcAX|y1v&=xDMJ2bz=8w+gP^iojG3Y!lnEJk6|ItU@%_&sfWoBEt0RU@+e_<; zO+NZHsiVAJzly~Wg#DoK5)x8aKSWAQSHO*b#?Q>7asXWkHZoAcQl^OFbbQ8Z5dbYn z`{y#zh+XS5ZqRVmvp1kg_u;JZ!h}frA9uzQf77cBI?;jL?80uNbDpdMh_v5knn;EV z;Zpu-U2j*22aN!X3qp}UyAXI6aqqA-h5YYpNXc$fICfg|bLQHt(BWT<)bDfkwqErb zp9wWjL2)?!9`-2IDah*uc2U|OWr3xi`9TZ426(hzI}J%ngnTAT>q1hbXV2*-*!S(! zp#z?C6SN?ieGqLpNj+6x#QXKzxpD|PdRmo%P#-4Qg%7^C}<4d zdxV1$D75Z{*YL*aa*&bZDiG1?>RlcZrEJ=9PDPF-#FI`CHQmOQt{&gGidgZGChv=f;k&$lp=A0xS+%)NUZpPRS7sc`i>>9{ z<|+7b0kW8D8L(GTD1t5&!>y-bQE9(z%jMN=ek)FA1Wju^&~1^Zbo%Api8c!jWL9i2 z3>o3|O1Ie*KH<$oht>$u{!4$~>gpivTvH`1AE<(n%Icbk_*T%K!DAChd-BI9123wPSJQ4H+L2LC2T%u?hc_uDOPNILGa^H zO{9G?if0!9<)~y7dT*QpY*IwA;z`53p9@Wsqut!h+aDgBB}A=sgdMzP`+ZorJY(pr zE0kp@Sqw5!)aO`B+37^CglcY{z6qBI4TwLjd+2j8&!~+?x9*`cIdnlq^%CMTtP&L5 zS^(N8eK~QhxJ;y=L8yKhQ?AIuoYL=^E^K8R8~2Z);G{`tf}m$x7=w8 z7rHrR#q1q{HOLE_{@UMJn?>-JiP(6KkW`Hcvy-wCtqaLo+djk{S<66~_^FX9zUTNo zW{E6yXi#s1L6R3uea^LLsM23%=ERcd?Mk$8!j_{zan~DyT`kv>=u|itI7|jMTRmk` zSna|LLar+ijlSoR-vOXPuSWOAvOaOIB`%x)iGcDI>!LGC(3)pA?|uid%L=-q9Zr)5 z)=%O%=CT!JP&4Bc@S3IQ;cRk*!&X{L&*NP32ww@(mD)&il5V?h1-7K-#a3)^m)$7O zXwp@#zb(1~Cjom8o4--U8)4)0>c{;Z;jgb}GX6mBxgC7Cf&!X?5HXf~ zjB20`tNOT8MFzk%0H7{Us`N$;dnkF!gwIBamI&U2@A~}DjXy;{AVdRqux=9*wPZLL zm$9+1oU2jjVmX9eS5sY#2nonl&-WpM88$s!gQ8YrtFHxf_NrmINi&oc$J~AFf z>YG}m)_yxLccZ%RV#X!8mTKJ+W>D3a*1unckIo!%4lm;QG?DuZfI~!ORe+{dG*{0UXQeN3Ke5|3&m@&ML)7(~W$mTRx*o26MiNN@k=_Bq%H5T>1$)|iCXh5m1O z|0cD`8o{il+F@(map5z^`}({*e_IBopg6Gc{0H|%b4Sgk{c%3uz%O6$`@-Jk^Ysho zIs+IIu-OHBEq57L&7gkQxZqzRB(HC9;RR zA&Pphlz0Oh5VMt0fuW=jBo6rvFkfe?d5%|3J-!PNe(Y$e2+nU4og6j4hFQ3KO(X)n z(jK~SQ(Y`^Z=!_b(9Z;X4P$Rf74BZ#T2r9#|9z>^Zvb zgezbE?A;!7Upnya^;21|44+vR?%DD;nDuxR6UcdoW{?S8@OFx)zP8by-9BK-s#7$K?HY-xC6hi zWLn;FFHAaKKTxCbj|`K`?vPFIF`i3e8fk$tbHn4_=k=F@b-WUs4mYg*sugHPK)2@; zh6}&sd$DyA+z#H}%DtL^JXEq$We~kejPVduCxIREkttX=CT!(Q#)OCVH8`!w&*zRF#vG}p$9DE?< zwOQ}GEcJ&;Tl$JLS9zUku7MB7aeMhuS$vlAw?}q(R}f~s@zpS2Kq4K55-PkN$p*9+ zIHmGRJgb(PS5_xv<=Giuq?S{fdv3QGrHYc+5n5PMfQ=k!_~=gUvb@t&F>>cij0Lr> zA~*!^7igiqDD`o!$?-)`2~ifMhFTo30jMC`JQ4A)7s%)u2^zY&dwUHiHo>- zV{j63x9KdV{h3k_H-BC?yiZPR($*iT68#Gz(A6Utwt~o`<9)e+&bzBXGz-KLI@}ap zwSC{TBc@2tr9_d@gR4-1w1BPXM~L<}Q|jLF9JqLaWSZ{nUEbCO9JJ~!9T(c+?RLFn zRswNCDA@UoBoyCq$V*xo@Ui&7HYDe?>u|0lMRCk^e(+Buq){Tv=4^Xg;SC)WagXm0 z_UELlmr_M8Xw2avj>A&OM zFg6XlI?R@HkT=h0#Yl~Uo!oxYy31N-#$-rADt~kznQVJ(FC~GtHrH)K^|1!rc|gmF zSw5cGQW<>JUje&N%9D{J;T@A1o7u9qF-Ak#@!%E@e$ILi3N@iwRX2{Q(y12-;uoqO zt~ab1wf}ytAAvjW{XB;===i&Y5F-GYz8`k$--PepKISt963%?a5)4af3LElvWtwWR z2~$=hqa<~Y5G!ywDQ?KU=?xaoG zt`c3>t^NJo0kyIOZY<92+MQ9P|5)9UmTU%eIfrX0chlHuj_R|lYgYdy2^aF~p+*5A zr(~lTc?q#pJ3MHwwNhMpW6?j$ujZth^+bloa3}hk->hyt;KNJn4`}Ib9NG2#UKV`6 zFETVtdUc7JPW&`$I^K!vNV%CRKcz65e$|sS*Oe}IE&wXBH)wzguP{K?fcbgj_Ptea zuF;x$r(bT{eIxSLlwfk2me<-1J=)uJOuZJUGul^g+;Y-qDL=FT!m+)E@_p`XhDn6=&UeE8` zB~sK!nnRX*Si_k@43FJlI~87EYV?#=;hQYc_G_8{{_i;0eQ%|^pCgcoeSUO z-BP(n`CK2@3-ftBdq%79MZK$8t;z6Q=NGP}w=`%CxgM^l%WXZ(&TX zcIA~}`jtCS<(xG4O%=}ACCu@b@K#8n!0%BlE6u@O+R>gp|RTeGX%EZaIuv!FrNpdNXD20t@qwrm*ss z?a*!{UjIZ&)0!QW&&4AbZ(t+n=zS<**d4pMqa%_Z zMo%h}vOxtS26WblKzs{?CY2~we2K%JK$+%*Q#`QAPA9f+M-JdF{fyTZwVwhxc3u6L zl^Vq4OCZ{$bzV-Zov+lYs;WCD0hkYf41oAgOyhQnfK-$#j|Re; zseN@dKBhn2rnYk6cn^=0SdZE({o}Prf3x8?TVHY7l{jJq4exH_OSW;i0pw401b>5_6~2i_Ux1s#mxT}D`BUiSs0#PY#5r>vujix*&)6%HYvs?J+LVUG*x&Nx0&-G6EkM$H62>Q=3a`%>^U1t zrb_!WNB@A1mPR2nqv_--V(&XTk_s0-e$Vf3KraRD2ej2U=Q~4ooWOA_nE^3j#XNvVOouk zYYUGBWHlFdeg9pB7f)|p(R2pBbsoy_Ap{5n8K$sDasMTp0y?lR2}WFt89jU z4+hj=6*v|Pt|9?FfF-(p>h|NkbdR5o6?)UL!prQfzb+j-mdko453)u(Xq(+^%nDcK zik17}g7@aKs5yDUvG~bEL(k8P>l3kmxqO%Xi!^nN>`t-gf5e~~eAe2?6XMEXp48xH zA`(%2;4G42!rQ@>_WWh7d7(RqxG0D>Dr(NGw_p)$b`0Ov=XHI~*}CRByJzQ@*6VK={ryQ4`nLzPZom5Cqa#fqUg@Hwqi5?5 zz11QeJ)Hyd&D>vOgQRWT2KCG$H~=H2`TY-}cuM2>RII z-Lf7ejlgbpdaHo}A_T(ly6fw5-s^7fW@r(4w{^zX&9EAqgDITKe+Uo#tz(Dh9ccIw zUokYb=w^^dr|(qYq{Fcbw{<$Nc7C`hMTzKj1(7I>OUP%=#ViiLw?mnZC>>FY*r5M% zZMH~Ejd3b99`tyxR8oFFfD1AgFmL*v5sf-Jzxwg)vE7QOYAy2;LM6qClO<>jclarQs8U>Ch%~5ATR^?m&?@J zkcAcg>2a~ES)slSzmLiWWPu{jM9I@4mO;$=jrjXW)Q38}ruey;ik~Pk&?5Skn#63U zSYvX81ibVjNUxzclznXIZEIu=1>wMxZq1z(Qi8+2OVJ2Yc*56}3CoW72Snnnz=bIi z+EvT{62vZbfV>Js&&@~vuFNCss<~YBhF#j3Ax8w4VI9k;c-;WOxgms?oSeICMPuDb z(qn8fN_1ytNI$T&#Qb4u;LP?X41h$-Ul4PL#|1w?F;4Lu#p%wla%<%&6QBiTDq;PR zL+{oGT;>BXc?iCfRV5$C^xm-k5MfGl==HdHSAB2^47Y)}`C;Pux=2@Ckhb8l2EmX& z@>#o3AON`ELAf;iAVgc9FjH|`zasVZD-V^o0tG*%suG24UJg2{-=aOuj_nhjxolG+ z(RyrmrdEnB(LrIW2NBqb_CJeaHj|o>o3p!`HZG02R=8)?v58u=fS&pTl z>buK{jsq1#-QQ$P8D0AGZk6;EN_L6~DB*D1ul)PA@U`bJ8Y%*}O7CYjj9Q!x-yO~= zR@GoO=YggfNzq$TLzCS3Dek?R0li2ThIgHDT>?R-o zQ$qeYA-$cEd;<&7xe|m(4MG1*&d$#if{tOIYc33~?`x5fK>tL?U!Sd0ybF6ipub7H z?R>ZDU4s|iW+=$ag>1h;X|an@a!1CBP60gbvSVRKq2xQ(8hsCA8GD!|BCrI_gbct=L;;RYq0K|3k+UO{CP?t zcGrj7H#|mA>kiwzUe_iz`{_Ce_F&BYLe(x|B|=0O%bSprBjru@-2ImMQ&vT{{vTIo z9uIZfzW*eYHD%9oONH!&6sA;ElGL4jjk0G;_8F2TMA@@Vk~aHJmLbcKUG~AqzK?y( zjG6geAKlOM+~40HGmOkD#x>XHyw2l&9OpT5O8*Su`PW-YAJ6eRY>xrq7S5tA-_L)s zZw_9A6xt-GMZw?YN}x{jlGo2U4wlH9xZP#r^2$!Z@8XNKxzjcrhNjF z*(HDCOlG^ucQ4a9gi~xg&z0|9(DVldcfrR|`CYI4TtEAp)=fnnNB>P!cORYd6D3vp zH?xzY)Fp~X!kA4rl1~Q z@(uFy+3_S9SHwN6otC^-PpZ3&t**$0HA8FVSWX0b^{SoCbAg_wdd} z?atmW_-97+G>TW#h$9+ZF-P+|iPHo1;?j8Dmxj{70gDmXh15s+i=HL>lFw|e6(3PD zsdup zFv+uF;&i-f7jQIG_lz3y;4}LvD`TC(aGFG&N=;f$-;0@js2!P*}gpL zs`q;c>~|FtrU#NbHP$~s8YAN=o&?~d4Ve{8m^fUoexHfdd^`y-;YJ$d33cm)bErZv z#vIVyte~@`vZx$C7t5T&nb7lD5dMHhZioC*%(-LG9(^w(c@wVTtB*JRdC+S%xA-<~ zCZQ1!<=6(Q$D`L4DP1wpK+-O)S6gS*Ir~0_pI+9&~ zHQsZWUx`krOxrx{^<@%D{d&&pHzLNJj!9$qDDg_I<(a+liUezsXcKZ?I%o`mMN<8o z_kh`1oi1bU7vw5G>9>CO`dvYiBc1;nd@CZ9DCQgxLY$li+-Y2la2l-3+S8QU3M@e- z&nc>uMrdtTn|snh_-O^9sRD#~k!@ZD0&ii1LWqfx zfP|J_+P_rbXC>sf?4malHasbpijxkz${=1$Q)c-#y0$PI5)gFOBatIH#S#aT>?s<=Yel#SH)Q7DXN*1;Bx_O zrU}oOHi*qTJ*hAwM)!ENWkpL%s{G=W+ULPU`@p{jTpYbV)?1vg2jkK>0hLw(QE5+_ z;3Ak!t8X3Q&M$&!mM(N}aJKH>HyT|M%yx72#}0y3rfv7-m%pNrwOl=3>~-9SZrz3fQ@K;KaP&uqxqVl71{qF>Z^x5ZbZJR1kRp;)TR zYtMs|FYHT(pO#xwj|WaHnsiCln3ieME?{m#4>B|MyX36Nkuv5eN?hJJW%r@t8A;%k=oW@KV*%kFRXycfn=(!L zI0ZaU|EgfTDEY8`iok(piE7#*2q;IF9ljtm`5!2iCx}%0NlW}l0i5y=SPy5b(Fk)6 zYOwS~eEbKj-MKZj*4XTDR=?mQ&gZD|P0ZxQm#2mwjCJN?*55v@DD!Z-a}CwpAp0#g z=MYW}CK1o?Z=J@R^tV$B!E6ncOm;c$=5NB!yi*>Ei-`MuOG-)0Q(~OeftjGL8+sx_ zgI*;EY}R@ALHqd#c-i2y`|CJJ5=? zmVf=&e9x2hs_#mE?Ns63hAs8*c-aZEX*>cSf1b-`w;Y8jj0! zoiDVP|KS3(m0S7;c*M!A7UxlhIf~_rH=U;sH&!gBW&RY`;3}b-c zYwHNsP}_8H-{R3w@l^-O4qZfb00EI`vu;hfo4WQ4rDw-J>(D5AZIv!3(26g9T>{{H zo9gif4Tr2v%{vqUAkL4(O1WUZ#p$%&Gnah$)l%P_xD(y3TVjE$+`m8qpN``Isb@hp z!xj`~>J(Y%6f?I}jzwZ|-q+*>T_`_yWWKyc10S0A;-iky<(Kt){IxtkEp?3m>`}RW z;2LoR8Wj*#UU!oeEfIa)SQ%}(I*ad{?I5#y!)YzI=S=(kxDIT!M~TV1Lb^b@Mzx<& z?Kp2Q6yWXm$?oD1t~N*+g!k7MH8=j953V?eX=hf{zk{B&L7o)B5gR->!ppNVQDuTM zx{Bb?+}pi>E!vh&!Xp5$Mq010^;(mW`{uV%f|j_ zyXvGjSL%O(KKwdlH}l$!KAo^UEooGTIjZv0D|KZ&KoeM|C1xt&HsiYdN}u-q7*)u% zUX{D`pjAMz^OEABTjwDd$uS)LS1;d|T?t^|{h z$!X?TUh-`CxcK60Z}|-xGqJ$YL(R5UQTh!tkFqV9XfZU|SHYzT5P=7NiNmA&${Pwg z!%84nf5}wTt~zZeSoq!?9%nZX0<222_F#=vY+NMTumYV-TAfKh%xpW>Wo_e z+XnMeaam()gy$|88nD98v2wl~U3_U(m+VoIfrnjSB{PPxq$yTRF)x2(U%(zc*H zvYaF+xnVk3khGDf0_0Ma8hrlK-Q^&D5pB>im3bW}{B-&cwtLVvg@bCD{IoWuBC_eS zyJYh{6aM6)b=81v@fSX(8Br)E1?^CIm605y;!WV8>Go5c-GB_Jxe}evbBc;4f-5t% zuDIKLnZ4bRGCjQPPX4w-$a{Zr#{dkdX`jz+p4jm+!ynim$kO@Ujs*Zc^Jd5w2bd#D z<0+;5zH7DFFA)2ZvA@s88j#PC3!X)J?{fe;en%-eSoV}(Wnv~$zFcArimHgq32M7m z*)Rr4dX}qv1Yo>5&1|Z`vl|pNpqLRXyrSY_soz~Fd_00ve$gQNT+GnNb4E!iHiH`T ze(-DO?jcJ|TVMQ6^?k(OGwlt7MbUs3vn*xaOpn)Rd~1aTw7K4Nx=2q9J~@Fd1Ex56vgRef zSD??U^DXw;0r^2+{~3l0DvV#yTaFXN5nl*iuBjgWP>H!fyF2``K2YQxh*Qx!QLhqf z3P78?+yXuT-gSQWef84Q-~|OI zdg^W!%p}I0c>?y(<6!CA6#SMjN_CcNZsarg?lxmTRq$DZdUo*#QEelT*h=wD>{5-7Kmy7#V_h5ziU zfRnLVXIP`YQrG;_M7@b%moaOoJJzOmpT4DErlTj0DE11JF#o?``GGRfH9}`*j>WG5XWe>~1s%o5%!|*1voY&CYCpv$XAxinE z>-!j^vx)1cd%QA0SYvWENo_9Rt_e+naKWTsxiRCvLjWSZdQOy)T^K0NjeJ@yACsC3 zm;o6b{0vF%>c~hQir-+)jlVY0z+{W|z$&zhRd(0GR9e_frrw6zx(+^hll98N^rkc&z~%CIgqoE0Wm)IKcOo}!U&7tTTwK@7BbJ{z)sa=?plk}I0vG5PddbL zD54Fxhs5B`^Z6E_QAfN18g;-Cy+>bPigt6%9?ZYa0ae!zofaMFwc_TO|_Z@`i@6$DN?{8xW7{T%3O$UJ;F%b-F1 z{KPI{SeNvpfayZB^o2@kNBuG>=^6vL8L(Y=2+n9&fBbt=^(Hu@6oE5}?7P~5~ zcf7DFcbd=pi^hDFjB-C6Cc%&h%4}nCahE)E^xJf>+HQ>PTqcmKJ~#vRPHR!Hb>ghb zVO8jLd(ec-he5k0=y+3KD3g{d%Xki#%HEr&cImy}lo-*(+tJQ>*S*R8tzrI(sVZKk zG*KE31FW8gn(A@S{w>Xb;ptsZwTHV5WAG|H%`qYmHUkRi91Z_h%fPWi6_&3M} zz@06e&q|w8tJDOISMABH6)U!hNJpPz>Xo%9qNf>HXXc0Xstpd}0lKoLhX8X{65<~m zo%c{p+VSX;VJXk!teJXC@5{Q)wr0)quGdaRkdJsuny1myW=wDDr*MgVR8!UCxgz|( z6R_no!?GA2%w4CGRJtuq-LfLXyh%kgPJrndOqae*vichF97|9&#)(V zbe>UbE>3mhPW)q3_uL7XDP5i1VpN%sIjQi8W4>U6W5aI&T)m;g3A7ForQZyJXQU0k z%nxF>ksasvBUH=#E!gLAjgR!LYJ?JC`c{c!QoL-q-jyq`f-yGYn!QFMTYx>UqA1)%yPMgN4>N34LoOx1sX+~2b+c)*fapK zS+T(@j@i?~oO1%qEv#eyTjgu&vT2!-N0X3+NO=K0v7O9zH^Be39V^*M zK?9oi=^GVJ!o#;A2~rH@#wBHerJoE%;^1Zuo8H$PVs*aW3iXx2zj?>GB$@d4l_D?^ zicI!aMoIFL8I26!59Nu9GN}0n(erU0f1N>lmjA|uq2q!#W89lnj>m58Nz8~X55gKg z>nv}PuDCBicT3zuLP2#XB*>})bbTH?^5y$(1}^4z+7nTzWuDb%@--fp<-d;!v6S#t zS|l^M$)_=CUKC(!s>uy?JU`9MZF|e3YCNsXQcW?Z3QNvMck~mbE#%( zkL5?}M?BC^z#_It+WJNYJ{9s-LGI{>0j0D-cfMfGw)Hhb!;u8P`kK;U;Zr@SMS!vF z1NT;Sv?ul$QD2iu1YGh(!J!B0Jo}r?wo7m#$t!AE9GUwsZ}3XYLeb(UEUqBNVJ-)J@PYfXtwr903Bm>(iPq-R`?Uoo}thG$*$Qm z{>YL;7#@0DMDV4WY@ZnZ$u&HrRUaVLCrH5G6Vki$XK50qjI+job^pus$nAC-tpF)o zi`50l7Z_bhA~|S5@981%<``{u(7+*n9JMA%l}r7!UjvY^9XDyM9cHpm89ACCo)u_Q z8u^eU6;GK3#kltA3YW)=NKh-O*?fQW*W>2*KYyx;z0Y2Q=kxKb2>;51V7PgKFgsOr z5ot8~Kjr2j5&F-0zH-j?(e}$O`!4scOK39PHF=|PWjUJ|laLT>W$~(9VED9pN7F~| z22#ws-t{uVTo}1ZeuziXAT< z<%|vgl8J)KWjtUyF2b@}myyC+`=gtCur6kzH_Ek48DvM*-)2ggCOY|_C^*-H-veW% zz%fo4T8tok2g>se=r~oydD}^DIEBs9g1_BSin-6y@>P76>n~>d1>qa7SeZ8gEk_dy zZ@b1(V?pnGa~3#=oFVM52QMrr+``4S#6yzTrOlWb3k&BMtn0X9Wo}|+A3}IN1Fp^; z>g0*1B22?DT^d{oOvN#B;VeiH!Z_ty(1JD`=q<6kFLif=xQ=|3`a_Q;YaQFp%x zg5@neE)XN+eJbytk`-ZdnqdCRdWK<7P{IA+yjF+EG!jRO37wp^CSv;ij&W2}+}JQb zT=V)R0(@v*j4>zL=NY+V)K{G=p8|nYpVj@0{DoAUC4ATjhlLhG*vB+wcHLhcY_@Ae zAaAY#ol}r9f~x;TlH73YE_<(to80l3;2ph>y1_3}eS2y&bFU2S^HXau&jESKfMdve9JU|LG+GXSXHESyS07j# zVAl|!#v;bBBK3xU_Pr}hufZ`}KgNqg$2s|TJoAO}eCTB+?kj+8^}mr_F@)iE`I93` zR+kIU&huYtI8^{HcpG_1%LaKCaZqs6-ud1%BAv(4w}hKZ9<1sAIZd&ZFT9pcdo86h z(dhY)nMY{3mYl!XLdbAz1E%wSFlD8`0{_0#x4s6ihR(DuYZ`*rc*$LQg|Kx`EE$X; zhr={Qj4VhPxFE^i1qXr|){C_=hCro;Z|c3Yn^HfjeoW%fh@ffMyjR(_dWr(dvHdLq zSh(2oQGe~U`F+t<_b=_+cN3J@`fl6mL*5ez5Tvek8y$~rM3(%OF^`9Qz_2G*T?f*< z;_KgGjn`jpwi_Lf$l9tOeDf6j)+&-M<%jgqHaF_U(VOlWNVJUTDhvQeh_$`hgARRj z0X6*eG|aJ;ow~T;r%7*8gMGrLGT~wuUmkY8mM`Iu9E0uXQr2PVFr6!@4q)8tpjp+E zZQ*6v%TA1sS}t6Q?PJ)O<+sNMhflTtwfanO|0c z&G@s-ZzNnH~N~7oU8f1G|LkEGw@qRqgCn6hErz}XgG<0dgI0Dll_zhjA_jd}202~vi*Td>=FB=7$lBNUB;3k{V4+OK;F2z^?K1Dg2p;kh9#frV1 zte%1E+Thg#BM8=DXcB10gE|QvDaemKUS=wcCM2kt7yPltZG131X+!{(C2AbikFTKH zoum+cc1BD?_jNdmKrkQ1yvoRJ47MxAZ{a;Wb!g>by|R(z8}$lD3|??3>geA>a--Vy z0Zn!>`;K2?j=Fz*(+`brBCNAl5X|oG9U0(tH>V298J8le!O^B%ds6T2LEb@#^9_7) z5n3{Eh@`xho`w15tN*Zh<4F0Mvs#7Qk!t=R=-}Ev?wBe(Pgw0`)gj@*)d}ZUdW~%# zk~V9iJ5qL?#}FF+!zF*IOf|CKFeE%6;Xw<{Ti|;QA!KjYr+}6bIylF)FV|Q2uvA<+ zJ@kB#f3`bx2lPl>!v7RkAbSMr{Dx5{RqyySEBbFUBdv0I3_Rf_zE?er`^$G`^$kyaFz6@hhE{iSj)Jc2@4Z~=(x>%h zkRW31M9KLG1r)$iwbz+nk&nSTL<+Bng(hU@ev>pzOt~mH$C{R6^UxvI=rtBUb~x-a zwuPNBR1|3)^Auf8(rH^j7ipn92n0nTKVX9EXm8IdbcU)AL-V!fRwd5d+k^F^lqT;B zQC23FJziuKJw2A~B^OTz`JD&7r5dMq)^Z*n8OAG8L+^mVjea<@^QYH} zlwds%|BT>FwKdBvkVR!sd8V<7L$f7RRRDhWmL^OnT`d9X>?Z_BC>R3iYkVxZt znm49qO3e0kz$rhh2!gh9o`E9`4Ya|nK~>mUW9j(1`Oh36GiatCzaQ^xM_wav(uKiw zfyx3NmyPH5X>|no!GFeO;Xd#1xsM?yOf8}oY5&zv1TqVbpr?B`Ab%VjskA`+n-{-o z82_x_e=y>T?f{PIERGj`@b0*3NRkq@1@zG0o!u5YMQ5&6O|8&k<0?3p`4n!2k{XN{ z^pAuh@>MemxfdIO3u%vjb;sn$AVH>x_|p+V=SaU$$uOqci>5(F?osj!1}r|bF8{ugD}3JjsnBD4 z*RA1exB8*B%x)D_!E&&arq#19LV|xF_doD7__n%Fr_jTgjPJm={0E`Cs*Lh^znsjD;?L)fLIgz1MPFgi{yXqUP{1gy5@}w`$FF7vr$EdU65I6 zmyjTANi46f<;7$50b-nP@FXOmsiU_IM+S)l$R`b%7GSszPR)0J49_3GSBGXEszYxB z+p_)~Czdoq z=wY>WaDYT$EhdxlM~FEr zs)Fmpj2_<0*W&*pd)DCRcrQ8WUD+)2uoo*&*^jbO5pOL~({|W5)Z|8rXp12*_d7dYk7)W3V;l9{|RCa1b z1#-Q!60r;IRN+x7dc>j00uZp@Z9Mv0<9>7H8ZEDaMyYMbdHre9n7v$wN$}wwM5g^) z6<)<8o1Qdo#ju_xgNC;EuQo`cS?A8xtL-=iCtd0rIu?!`fAz}cIrHqRuHPs7JSu^W z@)xjCnwl#;B~g`m4m}>YoA^4{Qe(yGTO?MNOGdV3zF9VmM@06>wRgt7Zy`_x`SHAYto5{F9`pl*Y&@sdMGxfz=&< z(Yv;1DO2YW2H5PZ&nsqjY7U7dUmSJ?ybdZU)qQ=&uP^jG1@ zsdJBN4o7FI_VOV#eD4CB$D?ZgL`H~+t|0h*_i`)fqKkMQwlkiV2+lJubK&_Abd3xA z$~_O%<>;w4Vh^&xKHhm3_3c8KO@A8FfW6i}UssJ+@hyf5+-Nz(X+FaXfWGu5I{E-R zP64P%Yz)^GP-^^^6jhdNC|GU#gLmXB=X;V%(h3jjpQ|`Ao|B>I8f_O^_rotg7T^lg zxw`*y{v};`td!AXleOP&BiIC|JW=PK3Lv>8kLn1#aA|CLd2i`IR_Z;6rehCY$LWZb z=cPaVeQh>}T{Kl9m*tIi=4gZ-$Uhi;C3E4lrTMjby>BXE&jA6Cd3C=RblB#m`9~d= z)$FMt`bKwNZ5?dIu=yVST*DnzZGW}9U72A1z!C5TNxQRTV2tkrl+prp zY;$te54$3f48~TcsQ;(fXl;!vA)AjpA01p`qEcJLa{=BL(n=s;lwHchKXm6k#PZcL*{<)gG>R3w5}y zRKPy4#-k{+l=xMNMii4biw_-sk5FgAq4#rW06;}ysIyOhp2PuHekz{iF)wDZY%E+s zvess=NS&LOtdB!t+t^{b*CqF&EjB-UC)A@HC_64)-D15cN6L;Zyxm}?FdIdU$mMXQ zavB98>P`ogHjLOsUpb(WNCkyLTY`_{QKr|THuxH``DbP@Gn&c#PQ!!>minGd$QXv+gbXw1&eYqrz=Nl&wcQd;N^8Mr zhSQ@H&d4u9fuO7YXMi!LV(u|7wN$+h&Ea(b=ePwF&f-pJZa7AZ7KlQ{2MF}U`~u3* zsd+z6=dIX3Q5RbZ5tS5m4S;5GP~D#NpyNXH_EV-;gQ0t(CUI}Tj{JM$lj6LSUH%Xv-K8g{JV1#^`YMb`j7V9Zbw1l2Cu;v&p3 z;{>HqUp(5I-gZBiPMZXtE!16Lw(6G1RHHdI8jlXqyArNB2?b&A?vGk5N1Xr>sAoP? zA};R8F)nz{+hM?fX@E#=tte{k$NqopgY|{y#n{ZObT5fzNVqzEvS(|9f8(ecUIu#jrv0(#k~(A@=dmT zjX$6NOVc__`@xlMyZ17Ci>%>-EYD0b-l*{{RB#+u;|p{8aVi9S$Zebgv?LBUWkz4f zaP}(*_&lR1V?X94!e75V2V?lW%IIE4+3;tjF>Inih@vFIL?gyKywwO`i#+S za=J^rD_?SD+B?F%QN8FfVAc5*k{%&C1``))SKEDJ7Nai^?M;VHD}utVfSYC+ohDa( zY7`q?3A-7?6io_vM(o|O~ezB?f9 zn}+vt?Bg31Qkrzb@0Y1kN0KA|b^~^9P*+aWmq2aQN{G(}Sbj2r@OtBG%x6Ql1A&`k zh{2>E77M;F`u^VsDse0*3is_R9KXByJBoIxg8UBPf&hr3UeitzsBH_FW2n;|hCl1) z=PTvsy(8AMGgb0q6k=8#O5rcc_&FTW79gI3t@HJFpvloBscY?M@ z>sv-=qx${3;VS5xim&{WOb$nFm02)bU|)H>W(%!u^J%&1;$!Eo*^pWVP31|$OnmN} zsoCZB=#=JFL__Hc;9FI~Sws8A21%+2I2m|G_9BKsx`G|c&2$f{MTcS}$opKTvY#BY zy3(C0`|ZWJ)q^+F=!s&bO~>JgrkghFv7VLuN;L0`!Ux7MQVru*%6sB|OGkH9BbfM> zepm{ob2oYf696vO#Nd%?I6&>UF^^NuntKzK;-AuTFGW((g}&1VxZ$_$P}@$yA7XBp z(KYF$HM@jt=fX+ZwjSNts$LC7KToPW_{{maN`wHXwW~WweUr*`X zpRR1Ti2x4ek?!VNC2e+dIdj<0zL_pgw2dq;TI_?MnhdE+e=_*Okk~9yCjPf(zsM%_ zNgk^%j@(*APSp_Nj7q<#3>*<{F4Jxs6yOCHsqXh;DQyjpkYBeH)C{_#wKTwf@1$je?| zj*3;<$2=)2?e_`l!1d)O=CQo_dxT>yGg#yPTfQr&Cizbln~orZG^UA&zCaN2ntLVF zDdblmWQ#Z%Z>w;VPcDX83t#5U(0Wn)ggh0qzjlD|oE%*3qGoodv?}PKL=fJ7` ztq!nC6K<^*{420bsRH)BOG@wlarzI`l8ApMOr(D6$-7Umn)8j-V0V6bXgFBL`g5IW z56W0p-sLi%7XK_}WPT2v*2py-QPmCUwDX}8tg|riCqkS76&~pNA~voT6B_=$ap%^G z(awD0VZgzr0#Zu4XRV_urjcthvpxhKYyBQ$$+gz@hA)3* z2uDezG2^{PTgmF~)jWm7uP-u9X67TP!uQdrA|>p&=t#b06l8r|>9WyG z#8uudpSd%qmR_%cao;>D&pPU48uQ~?K1D2TiDfznk6;B)ffbl|{W3-R%G-@nenco1 zZr9OI$QMeE9Fl<2PM~a2sZo%=dz*F;wqpYY6o0C%PD)=Zb~oHTzJJz6TR!I`T?xm2 zxSX-hOjsf{m2>|ScPZ!=7Hb~qEk4bCAR@}YgHrlv=iOleq?1F@iothV94%@>;WBA2 zloD1Mat#k_SJ(a!;!~1b{}p|R-HEPa_ckN*N~-(s5Nnr@=y3TASs@ zsyWg|^d)xdk7ZbYE1%869yUo@mjHqA60cA*W#gkK%?&5tq54J9m503u1N^#9U!m5` z93;X3Z%Rz}NXz$STw)*S$AD3*JD^wPECKv1{clsCV=E}QU9zT8j=rV%dN1uQpe+DG zvM3c3^I_WhP;eFI$Db^6+T26=C0EkyKtv`wMsjQtV+kvErL94)*b+AkGhfOw{kCMn zv36W3)Y2z-Hjj0m))FePQ`fgd;fKFgab!KgMY@K^0f9&Y{U|fY zyIVCzo|tvVpSo<$0u0Jjp`%)<&oVBXOEJ(#mDhW0I3cIoBdRG5(ZsHF8u=F9Y$*1R z>BHH33KLj{$+3io2mUSfEGa>(Wa;eI&vY6fzFnFF=p5?uwRo%TLw>(U!aJ{4 z1a`K?-+7APTBlwjQ2c2ZiyLnx(}f_ zMkcE~y?QXb(&kFK9a1k)WK839+m_eUO#{MrRGrIT30LB9-$5?&iYU^i&A9^!Fn zxhQqrCo7p$w9?8h_^lX;|1&mao=CTi zWA{QVGvp}!Fm|@97)^G|iyL}kadJTE9*5Igag_V5PS!*K(?X`=wRSK%pTj&h zlr4RCzD`h(Fuwo&(VBAWr_EFlhyN&dqU7A^5SJapn%Ki@Mc!vOyWhgEQWmgD#4g8= zxG`&9wQj$><}G~?#5tIIIZ=rYI-p>SN{vVWYg>02W^DQt^U-7C7<1ufY3D`Yei#An zhx!-R@=Vv?3}^iKx+n=n9f~k1TiUfZ{h%qpUa3js`($oMn{nov>A7^Gy?<{ zH>+zrU+Z0t{vYP4RE60`^0ML^Sn2h)DPM1J_8hSK*8|#ij{v_)w?|z zb?(HUvZ@v56xg*WHjru0 zAp?Uwm$)&31V}jPLCO#=b+hTz)x(RSNHu72$sEF^is+0K==h=ftzmR1i#BiyGUU!EWqEHtZa#Pc#j$b znkl*>bgswcn4d|%N*R25g7rl;FvRcVKndS)ch56zdN31iU)~mQ@@_fb7dN<| z(GPD!PB9Cyt=C=s7_O#qYU25&{1j-ofkUq)TmN7O%p?k?)OG6(znA??c$QF)*QG8V z;kZAJ8(;(kK|XRBMHuviIod#PZU(n4fJlSSvRi@E3F6Vj#N*4l z4gvAV8AvXNdjMk13nJDart~WkvwGe>lGr@b9+9OLLK1e2CIt(ea8)iyR+aq z2UI2oqB21{M(BXb?0z#XRi1c}iiF{HKum{q%K+$nmK|3mK~eA8tzW5R4mgKE-{IhL z)B{J$bu!1(poU@Ov=-OG;|jHSvI(K}2g{(+#p3rt&2)8_uI73i8nLDngNeq8Z67V( zrT`^Orx>I)ToQo`nw^cZC{B;%Otp-w70`i<-AT1x*-WT3;HuUf`}MfDA7S4}Jr!!a zZrl>xYM4+kTmPQ8r$#yU6BJnG~h0V^Vl3ORL446;U=EI%E! z+$m*WwV&Qa+@ej5{axiS_zj~4`mv_Z&|b}LZ-l1a-wpj9p>ph3OMJ+ugkK;8;%wHF zthswB>F{d@m5&P1TCRaNPDSC9%@bs(y@`PJwifT?SAns40Vc=WAq|~!+5e9B@~7_z zS!ics58<97dE>R1R2=Hpd1c{F6epwajkfhiqfZC|pV{nh1gu^J? zyt4L3h=N1n2P3AjUl3)OhkabicD|-7ZR|I&8{_X)*4XM!xhfwf&r%pZQ@(4k21J?H z;P!QdvbaI#=FhtgH4PGfyi4-_3B;wgRhptcX-OTyS5C!ULs%vT&(W&-n68y9yy4=p zVXM|rlpT&6zR$$`4LzG-WLa0aT6_nqz@)r@nFI?h6pe*>X#ISYEQsj-o5yu^-(u)g z-wO`i`<OB~$ z0fItdfE@z91m`PleNm-<-JqF`^y^Ui^y9D9h)wTK;ZDF(7iZ9mS+A8vC0V?`=k@qC zN1dk|9b*6#8L~In%uvkHU{gL)Jk-q3V?$R?@LQa09J+G9CdhV(J0Ru1 zNc244{qVlGL{r*Zf6NTff!ANktpX%x$1R`jqRv?W!m(TN<1W~W=57zywE^-QyvfzI z`Y&m6~Qr$0GN=3Msx zgnEvq{Q)ge5ngN1hO0ihHtXenkO6?-L=8B}&~382_sjSv*hLe|t`oozG11aFTGM!J zqXoF3WS^YS##$J@rxrinlghsGxZ`7j!vxKr<-Q3_wD!0yhU}@=BT!ufyD6zz1cel;JI^`?f9G@_^#NdoUAFwaTkM)q z2E|UsOez`OwH|3geo-t~*_0vpx#B5*@m0Nc+}4Dd$?EqY84Qq@0vIP+%& zsapUX-C)w%+ck0-J&?s!1+6PlFZyjq-+m2OtPc(t4xkw&o=Hx7MHrsn(^WIywOv|# z!*F2%Gqxe}^WU`@8cA=LrN>#Rnw6I%Az8Hkd5j_-s7jJBYxj908iG>08_<^)JK6&Qd5lKm~$< z#}PEdhFY^c?v$Cf;i}`JdZ9 zR9_D@V@Gnv;j4tySM%{Clz10@ALOhN^8Y_mu+;l%%2V_|>Uh(RPy4(@>X2uMf8c+l z6O*V7T#8_x-1<1H>Ve`Sq5TjDPu*V~vi!X>s-88yFIn|e(LH}+GU6`~PB9J7rB0)}4TIbkgj1CB@L(g@WPYP~H zTz4O%frs3T9(|{RSoyIppWRKcj(7mXB;qg7rUg|yn08_iKGP#JcKJ&!SKyTh6T{<| zKLOgHGVIN33O(bP*8hnZp&@$?$_G@4U0xEeyK%vmK9Zkwoe6=pHFn!GS#G58EjsnS z@W5Mub~E@N#?%PCKR-z^h39nKj^6xA_9*R3pBDf60Zh62b6cb6#AC;?gRhIF#h#@E z_|Y3(+YoRsj2Lwh@U>X}o_Ag`$EI>(@FIO&Jk%3Xe;${BjgNva3mO!PsIMdTb|DH* z&|nHZ=V6L)_p;nx$5@y0ODHHPW zn)!Z!&X~_#HuxI zMH{73iiD)%!$kf_8>YVuz)?WsV*P$iORsWZg^m=v?w92O?cRyo zeZas(b{1;#B5%~uxE6%GcmP^JJ4r(yOc1ZI+UsB%^6anJp{clOIfwr(K0yljoHFj` znY?LgbXp8m?q_CP|9Ptw5kmB4ByujreZGfO^()Y?1^Iqj(r%B9+cpvx&EYX%LMasb z2oOFgHoJX)~leL@1?@t>~xsxCbhEw?`wU5hesTCuv*2-9F#t?aHs+lXY?wKm^ zJX!aRZ#1MNwi-kxvL3F{h zvv|pOSidMo*sW+{)vkZDhrY;KHy^lI=_1+Qbv@_YBl0V-q+xwj;R=^m8n&XU2=7`UQ0{eV4$wu|Dwi zTPCyI`@$ZC^N;_PlMzyGo2U9Fd*NK^>%4%$+pNqjbsbtmjQ5|&;Z*>k1||M%mPHa< z4+j{kAhb8Zt`8D_id}UkrkbH1N z>ACbyAhPgTu6tk61S9r5Z}sem#o5U=pBdz}fWIs51I>_cDNfmOe8sxUDw17d#a&>X zHF~g30t`b0Q)M8Jhf1W0``*w@oN{3}n|^BpvXZJul8pRj={C%ft8O(T9_e;H^4DBP z^fybdVGe%3yUW)1TJJwgx4h=qW#1Xp@Pkjoz%M;bE(#Ni@iFob#2{4>by)CLBFfP+n7WM&ifhDtQ!64)u>JaPy zBkRoLq1@xQeZwsHHA$ zc&pX)_D8dpO$Hi(#vl*EPehf%rsyr0&$$uFy~b=gQ4n)xE^n<(4CnK4d{FJ0E5ITQ zAd2zEPtaDKw_+;~e_mKB1g3DN)yx2F#~HKPX|o|-LA%Xz^4M6PgYesM<5PJXi66Q9 zSUpOp4~>WlpR(;i zFLgyGy`=7nW}dm<1!G5@vn(8+{s&UC*S+`b4VOWDZjh7`sr+Trl@_X|)UP;* z)5#EeSerSxok+SK5hoEm_cp#2c+EE_qzOxU~`8)eS&B~u3_)m38 z$AQYvE&3)DABIQZe_wXyGYtmt){phyTKnM)BKZGutZ+ajnH6DwLn7t3gHy(z$RUT$t{ZO>t7kD(tH z>&k}w>Ng_v7&&|w+9NG^nweYtT2(QR-xYJ#0dxt3OI`y-&z75G?kCLva-j_!;vcws z5@l#x-lNL!3XC=&T?|!o%i)Ybp=)jF^l!~QR;5pJ{uGo4bdCVWc0kAb;|2w~Vdyzf zDspdtMF`j^#AUuH_1&$RWYskiOuMHHkKr`e{~W5G>UXJjUbsUgh`Vm^PkF~q zu!mJ(+S?Y^1S>YEx+8{)aj{gD4OYo}N4%#*l?{xl=*v4rF87L#r~mr993E>O=})T% zw8FTg>_h|ig`P`XfIngsfOyfCE2g7UG}+bc7SK+li&%5KCqeLq-+TlW%M3b&n&i=p zcD>kAiFg*t$%sV0Vp&^N*nq_-5fE1_L9Np!G_Ff;i(_2S9-JBpJL>JjV!T|70mJ41N1-4o{tgV6?Z9xky!^D(B^LeWP!*$8q`-*STXhHwVKy^BU55OjAu5oWrxfFM-6r7v4Ow|UB zC1AV*LH*y*x_J@Qcq84f&GWSzTTn+SbOBI)9# zevLw(Z`cZ^aOce=-2KJ1_k?tI9w^qb+xt=%viCE$RE+35W(M9? zQa!5siEN8;ASFCPxQ&K%y>)`kuk|;cj9L0*8D##%B>?FN?Op;jOsHKdtek$rjymFqs&t$zCUz)A5pUVF;2B?%(4Y9c&F&3%8SAPYODKggAQu z|8f8jNjrDOy@my2{i;g){-V$184eD?FnSXY@z5b9%hNgEBe!ov=~y+N(eT=y1&hEn9kbg<6i8 zl_(KzgJvs6x$R`=)CE<^g0m$leBX#uQdna4s!iMTws+hCqCYOCvz99sHkYE?Z_saP zD?6o`yvJAHCUh*#rP&f@LiPfj0(sWxR;yB!zt{Kd(kb&Pv%ifi{xYG_vYr6PGH%0)o46Pg{|B63!)}Ni_pv}b-Sx<<8|NB- ztHA@(2LT49H}|P!%j(XroNwi&-_jjK4W6U$wK}R;1&^H>&M%jQxgok~QE7kUB#k|K zb|g&TCNz6b4ug+M0+zPrkS|>bPY;toTlEO|fkk$Jp&?S50b6J?6#fKdl|}i>kbgXU zoY=qjXGCj)TMjQZcZFZO(6|k%xZl8A!SgSTETeag)B|%bGZ0++`}Z83{G{vy64EDo zz*>s@1gv+U_0JX&grz+3w2}9(e+<_m@0|rH!p42hSGSL{hsLeKgJDgl+mECAO2B9c z9(M_?YS390SMWN+KeX}7Jyf3_>?6P@fDQUBNcV(3V7$|VeKh4yE?Wq7W zSX%G~ulB(tm6Z5d1vKbs!<7^~CgwN>wEgM>Ao8QX6^!ZNbqx3(K+5SyyYrMX%*d<$ zT1O;rdXD%Gebmg=EI{(l;bFCRuVL_*4MM-|csjUU7a$c|AScmV#>g7ELc7l_gJZYk&@g;C_*nNhg1<2S#Ln44 z0%Pud&|!PINlBudb!?PUQd~p2KGcf74Z&Q<7xudZ7aVt!SzMPt__B?KxloKQGx&kK z?H4(vgs$28jWQKdquGrGB>is!Gf6776t0}ZsS7Z1`8cm_Zu^dYPrt0^ugD=KZssoG zkgzMYmJs-;ncBb)GG(jZRd##{khqV|7Vbl*VepVv#2c6G`ZFvK?veLu&!21f2IE^W zJXnuU>jjr)r`5_gw!1Q&D|;B}Zxr0*%Pn*tUr9Nw24>PO+-Py?Y|`PzyRH76C%35b zFdts3gy8{(*fSoByb&$~Bh-1((m|6)2968)C(HI;agE5Uc=Tj^hi=56qjArYDibF) z>T`$G6c#+44+rng2(|33RC2u7W@PTYP;c1Kj-eZUaf-8DW)c}^XQ<7`U?&YB{Z zCE(}ZKZBT-VHJt9Zr1XuG4C6W{IK$qCmY|7=m$gJk&^=rIXOP#vWlfM&V9_wms?z~ zIFR${IW=Nyf>le;2$jQBzTyTi5CK@hqd5{S0`3xo|l|& z43;Rm`e87u?k`c&6yGgL4lz0lb5!g#0m#$+_MS*_9s9(%lf%0Z2;L9gh0;u^#d!i& z_IHe4e@s~xGTdmx(RaMsBlHwF-~F{*N61aeNb_*HUB((%0=Y*bH@Ww~!4SP-o~U|) zT8D0nCtQazxCp8d^R8=;p~89kd6oV;MqRdFa&&2EV7M|I(A^c@Q>!^3XD@jTY>4P> zwD!U6xO8-|DERhIejg%aA%ME=|E!3RQMZPBYq4jh%-?dt)|k=&x>Xqr4pfRVeV%@A z&d6HGvK}?tZ?+QM=j`Nvss7SNgu}-oG7e$|&{YV)EAPib!#(t2t;(pBcJ32Pw!DKF z74_cERcnhqbBnz?E0Ii!TJ#}VSWv9a08w_QK=@&S%)~TZUeM-4*-DiqC2Eb~7X?3> z2Zw@ee;#|#(U-tIhha4;7Fo)Kj6d*HRS1v<6Ds)}^hhfYODPyV&i8}W=#X3jWfUTPwG9N*m;|QVD_{CV;?T8)D&+8U9 zLPZ+5ITY?D`{D~5teUhImVv?GLJh(NleT?g#BrdRzTmxT^~S-DohR@Sg1bSqG|j%G z(LHy9q*3$zDer{v{+IG?c6`n5FDuz!#Oob(ip_Q&Uuid#S4At=s~qWzt;loUfnZOo zxmSHaPUn{L`PWJWt#$vg6V>0(h%UAwr72El;|Ay_1$^DWVQ7<}ICNPCl+l8QMci4h zaxhSM5Q^hB$TKPt$4s0u2V5VT|2}ZEyU3#^KXfYlu}QPwFyUj;Ne~`m*nW3NxBW`A zN$6g{#xy*b)WpAc40{?gLbdvg1aY3gNHTWUHw8BeSpZ&^cMq1?B(uQprusjVKN#nr z_?BA0>*8uRy#Ial+9sCmG#&l={iLab(*>90^e!2N^Zvbax#zzo0*o1I<}_VoNuBv> zsg8qrVcE@Y>RO|mmSec@t@@6Sz|C!pT9wVEZebZ0XvE~baRM7ythsUJA2wE)X`&%Z z8l^?QHJgjrk)xrIW+_!(MEn>79oG0fXKNT+#p}R=* z*#!N%z_Q|3ji3gf$Va!l0F-rgK2~+DUiTM`4;ye=h=P%+lm^+q6?Ww>+&a@ASKCR1 zB>E%awT}5la%Cb5hnsa;e=>_;N1^F*Ij7)}Y{DCGJ0(}|V!)hKm-m>`t^(fGRH3O) zp2w}{e3Vl)AUT6+3P&`B3g7VH?2Kd1`c?he<$NQr`2-{jF@@+_<^C`c+EX|Obf7XY zb^@#o;H45D)ov$@44)g{O-q!=8o(VN3*Yv1EEoAHQZr0B7D-v_XQqML{i{jk8fO31 z=vNTZ06TndY%427wuPZv3@kSXizve2R>D+*;~oRYQ}+0jtPE|K(G9?m4)DEUrEE@? zb=Fl}SBD$c@R~M;e78(hpLBg=qzr-NW4)>b=NI0#^ZI6QVeVr6Cb2h}W7LelIOp6; zxb!2{q)ex;*^Rxw3M#|!sC2Atomt(znplM!2v*;m->&mq%4xVy`Q~-B@xbe39fQOI zI-!3uc@5qSE7#r!wUf(-_XYGE^9tyTVH$TI=h|&#pK3a5keD0%_zv@Mg3ca@Fqi-O zx>l^kSU>(UhIZ>Fj*zjw46kT<1L}?+5J#WBlFQ+b`o1xwNRm=*pEkleG^HP{RBq|l z7PTTawM|H|G{T84KJ8_3Cw?^3-;OEjJmO*D;0M}d5rFqpE6Omm`NDPHh~ZUbo%vYW znjaTKfW*>Qp-Eb@b9AKQkTse=7aVt)%KTySHM?yL8)rO5CT1;*v14Zw`$K_v5A<_O>LhS3Jnc==SXElE zm2X!4#Vo5=8lw;#2~3;(+6ZqFu#`;zOW6c`U?r-sCaT$aP-RWHk@oV{SV2auhVauN zoZ5~$f$MI-8EpwE7cP);VNh^(X$dA`JjJP*JK5)2b!Jx3Zmhn@Y`eHrZ8*s2MQQw{ z0$Grh0{CU;zJD6Jffxp~)P52{#3H@QZUDv7)XKU+n^x`L6^;LP9E%{)%u^RZ2we8H{}dQ?GhN2cvlH#h*eKC{rC#>A6OxHdsN>@0$a`6e?HLQ zD|-7RskfoIv;8S9lrvU$H+MJ-}zQ1gZTawS&-r%a(U;^$a*BD$lAw*E(>Q zN6Ui(a>z-sEBD4*WP;dUd-@m?a+%$|$A83n1Q(-%BD^GBT)XzC&|_@Q<4;48!8%Kx zZV8;(sA30sKz?=FqZ;kpj2(vbvN^xp=luS`gZW*Qn9!Yc!SP{b`E*bTySG!|H$BWR z!`oOV4KvS?;NI^D3~aypr7YL9)Kn(N*=9fS{gd@q?uDWJH1c;+7&4XErE-4%M0C+) zT(%KOXGm(*bILA@`~15EJ{VkS6Cahd62NHFt0gIB<|d)=$Pp@=05<6K?e{B^hZ4zo zWfhuR_3z&mX)HBUa}3oV=soMz-8i#BYnGb6odWGS%Hh9X;6tY5C@|hHj+8K^i_GV+ zSDm}5((+$tm@wPWUO_39r*v%iEvC=x_9(aF7odw0dXumsj)+&G1U$LXI{(nAmO7yd z;9S&gAT{g%l9a9eu~w7y2g|Se2e`3_*==zH~n3a`Ujphh#qKThCG7yq0elf-WjgzubLW z(U~kyu&BUru*-5TA}xsxq0|}=$*5XRsVu7=E8<7S4}*iXK9Y7jmpHF=MsIf&AK%Vk zN0UUuk_U2dbPIzAJL=d~U=~@8D1I|n;)UA;Gfe(pCH?eIj$1{d-_Lz8IDC;gsN>%` zQ_u5#ZAQe`>)d{#7A&!m4S3gGKPbt0&u@U`Ml0bJ8+vw6vCe7U8wg}zZ1G$ke~OSn zc070u9H{cY2NMs019jwrhFh(K|4Z4%b%sN!yxrNE6VX4~WoEO|P#aH^pcPuw;BhMwHkzhXcd6|38qgpiq zf6eIG`{<20NT2@fI;^gXR3ins)3o#Z0II2Y@l?T}D=&Yd2+`TTs01vMmJ7j&Va<2i z&t2iFIEEJ}U(q8rpB#_IiSf-}ci8q81ro8m?1sP3n;tED&dg2JdZ-RPel2&he|E)@ za);+}W}wb*wK^jKswGC@NcJcnYK)68@vY~;+OgnvRQ*bvP0fm8&Tc*>+iO>beLxhvwAKW>oB(| zu^xmKJ231HETYV_ksQW8)83m9zdH8OO#daYpiq?IDlUcug#~$V35pW zRa8e2!|g7%ueXMUU4-<6{O~JskhK&JaoXD z$dd3q)COiGD1A0VnMxtx>+C%36%*Tg;L1Iqcuxd+mXMyn>I`|*_N5%<6ku9nLRB(C z!ZK}7l{i}%HdFA?L58de>|Vk099Y&EH2^GsfRs)?0^p{%=R=(OAMCfjnIYBryI!zh zMQqsYIwT5H*%838z!vi~MEhQB#+YS7;B5BpfNwo{F;J;V?f=)t0{oY7X4Gntnem+C zemEu@doA%Yw*%^_Lt2Fpgzz{F4dtZv-Gc}_U3ml|21CkPdwE27@DlQ^PbTk#yTXaFrqIe!?1ZN z-NJG$obvU9;@W4%YiYWgk2oEho~z_1{Ww20o)p49gnaPoS|a%O^8?M7!VCxqBu5Yw z3E&4ok>%S||AUu37)cXZ!il`q{=0B;`l~O}U8Fq{>Aqc;E?<9-M4NUiVB^eU9A30< ze`zw~cS?5E+%aY9=Ty__IRm-Pad&R-sA8s7%zos+K%^lPaa&1)*kRU6D4WZ7 z-kowuFCzTfHBug!u^VLSoF7#}73&|AxVomQkjQ=OQ&V|Um`bmir$Y2SYE3kXsHumF z)rmXK%3ba$JM)hYW{Jh3822G0zTlPS5MJYRfIO_io-@men(}=|l11^qaeOm$U!m+W zwqT?}dSOa-yXf*4(yJ-y;*-}+BDdVRH7g2k4lxn^xw91exmR8WD5AR4Hmh1ej&)eS zECzEoNtPe`eGI|E0qE1BoISYy|0AeoQq z6z|fH&zI>8K;cM{8U8|Kxu2yK>Cev9qc=5lMIsp>4+W#e;Q8OXozQok|4f;SC@^JG zwCj&*|Id^up5VQz=3Z6V#J@~Q8C5h*|3izt?0l^-T-}#7g~xMnwPwg1YH&1Ni_TxEfvqg@g^XaS+FUW?pmk0oq?`^SeI=e;W5O*qqi)MXVdzT55h#+<-eclh^pI(yt@gQ*u zmux(Gr|5!G*nO|tRgXNY`Gz3_E>7pyLbRa-4kS)Xx+=VjfV2iF=f;luLY?{x@ zO{M+Zbwoo`Tt4ttRN=r_2hbkfhRNC|F{~avQ!z*4n$pVnzGsivoNT$a3Tl&Ud#d!x zZ`WMRpC~(2A%Vw!IO5-stCdKeQHt-eJWsJ1GtR3SvxC0VaFu}Smrju>U`qt@n0{q9 z5z)HlPjcG9L67E?{3eha0Kgdev!fb|pGAXT6w6mwd&`7dVDj|ADUoXnxw{qApos*S z8a}}Etm|(I~o{|z8m>#>Cu2W1r3u}n0dfeq@XA>_+D0pj-fEO({+CO z10|(&0(0LRZR!Q68fCo1J)WxIVo^~pI9`=8@5>3*fhYUf z`ze&5eG2%U0+uCr&T&>P%qiABbz7VRd>5d{D_x}iuO5$?L(HAacrxzi54M}&F{DX! z3xh$;~@#_y>Sh;~#Xk zc`LC^$+LOge@8v#upONR-|}|fKr|Qxc(9tV+A~d-j11h5 z$=&*0va-mFocg?StJt-8iNX_^YpUthvrzi}0QyssHsVA|`TRkYJy&ISIY54G4Q`&` z$Ti>}bUn23*BkVPKJSM-j{8ePd1nI6Ng9ZDjiY=4*J~ru;qppH$JYEcC$E3rjY{Db z{|HjRD$y`uB5}6DuC)e>FUiE znTJ#bySu>2SEHEE=CSCFbS;J9@Um+)$9~tZk8$)f$YHVif1SNW#Irs>{_@a_!mjN| zy`AwirdTke^T9{|eM_mn<{*u4(=^cT)47e~E=ARt)L>RDY<(AqeYGhx%{@dJEBrQ8_w#6vRB8=?9*UTVrD%8W@hhs2>?s%%V_#ypo@A!dIREP^&PRD_i}U<;TwQi{O4m2eBJZRtg+H%7j9Rh*EwjrmS2+SlpiQv z$FR=(giY{j5xgpS@mihYqP_R&J9NI@x_9Vs8lPDOdX8G%c)!thYm8-5P@;G*w?)4` zDmj17`|S#S+pnS!M|akX^k<_SA*G!{)u(Tpd-kTEg;lfLNt&HV1j9JT41CFg;20ALTl$? zXzhI6HfGvury?Zf+9WuWz?PNhgR# zKS}U6JLz*$4iVG;Z#ku2Cusk+%2Q7i%l59(*L(irdu;p-q$Y$8lYLv`Um z>~P0wtJTUBGMDRf-Xx`di)N{+yYRfH?A%?J(hwzk$|%A^;{yAkk9yrrzWj;7KWcw8 zGg(vZ%bAn>%Pgw+_L!;QVqN-9EUPcboaVf4$2_Jo%Y|D%PO`7RehQrd{+o73DM%5!fW8a!)0^D#bpmdc32ZbhVn@YZf3odJ7F zZ)%;_yrhAo@^@$RTUe9kFDFkn$Mmbq7fStYA3GY+_BDUPy-xDkDb$$za?7ll_bIKl4>e=VCp~7BU<-;XtqL+LICi*cP9rZ6M1XkJZI&F?SEQ>-CQcqhb(tjAtj_Fl5O@R_mNR=TH(EZJBCMde3}0zgIe=T z;0O&RaQcJlwgph#R%!eVR;A46gB)-{pH?0GL?VNjB#^0hH@y`yS0SHNy7%klxU9i% z;|UvTfq_{0x`?5!Ba`D!HDwG{ZTOB0`U<_wucKjB3_niPGSm^S=kw^eS!ym$QAwVd zdUvpQqixb8I3m+aQx?1)z@Hg=tvf+q5?*`KGa0^oOEa8Xj_nHUL0SF0ceNwfdH*bh zDClK6yO>e(JEP!;E{l@YQ7!|Xa^s&y8%dTAhZ}th3l3b#CUUCo1kah2eqe$3{5cBa zO>FOLQoK*g&FdOu$=*FvwSQl!Ufg59<=wf8!?&6sZw4c7@j>wh;~}&uh&OC*{J3b@ z0ntcB zco>Fj_4SNotJ1-(zQ!wasJ7u^c+jl|uu4kU;z7^(o)SoJ@SW|QpYwN;v=y`n-f?7;i z0ej$48%eC8@Aq&Z^OXwf5&06LW~h#8GLBAVAISGFS#wK0WPaoRo;_zQKoo_3tnAK&WX&Q$aj`dlXNR9%Sq*(Cr!bvzKJITEVrizimO=sY|plZoh{DSpekBTyrXd~ z^0yt^ugydTz->5QEN-BDj5_B*I~|%mN8qn5Ogh6ZxA^t;$r~?lucHug4`#uI6E_x} zV;P-@s9Q`azlS|HA3L`7Jqdu>&hE^XV28>{3aIWeLj4MH$2yvfpK~AJN68Pq zFUkxXFP)phA6C@9xdkGht0mFx$<8zd7gXgkX9+SA9Mx^066W3E-Uvz&d&VEzD<`{X ze_v>vr?hjYVCJ3oO1f@cInwLgG`6xJ$Q9|=KZZQJoM}kY!nQIQ{P2zAYU~H5iyGEK zqlg=I2QqVwX9r>#=7MBdiQ3GFFkLxLlEhm@?V}DnrLs4)#7dPz!mVc}IBy%t6WM z2X?B$qfMu#beT+!=C3K1@{v#bf<{ecUvMG~jbvmg8l$79N>m-iU<4=9tS)-BPZ+xn zp89e znRL0_hCH~DCtul8GnpL{c1=5lL?5o$Zcu7MEPw9$C#y9+j2tU~Rap$R?Ab&TuLENq zlHHqj&2qX*xV}>T`M3hem#)s0N2DW99yr#OA6`X+ob}p@@&N&+-z0xb=~lh@xZ)M;S87eyQXfw&`UhmxbI#_;{3TOd!5pP5VAt-1k7 zo*Vb7$f^E8|E#f&a^OdX0b-Cn+ofLNh_8lk9~pB{6xLY0Bx$p7feP^Z?F`^J!{Oy~ zU8=dzlK~~0)8uwi z9l5V_6oj5pa75mHrN(q8_B6Ev92U;c*m_GSTa!7sLdk>;94qiF`503`zN+T~# z8Bkpb{4ct32l?p}R%cprG2VFjCv*J}HKmaOO8INJDRa7$@L z-gGI&v#07s_mUE9K2ZrW{w^l&&fO2BxLCf7eX>~hSEuo3Ez00h#w2Nju*q1%ar$O2 zw}%gHC#Zd)K_+mUW1z@umeK_sA6xv{9hEhm?VM9pTfww80g-vYh&%jM-plDesX;C+ z;uhKs`~aguB!DVA*x%$b+oUjqo(RBAbX`wGgP~pFCY7@fkZJ(|t##iJa1Eb;Ku}_A zB4C-lM+VMe-K{%7hp1fsNg<6%2Y@mJ9T4CkN1A|y2LeCnWBc_XeLcrqk}I8gqE1$s z*k~YHdDvC&rs?rv*3W~-AQS#5>7j&!R~uEjuDyrMF90kPGL_~ec%I%5UpRgk&alFl%}c6s0E1J!Kofo-;CtxAB~@-Kqo zT|}hEm4Wz2o;?BnwACBPqx)+t4vU`vzT-o(++@Mdqo9+~UDthX)nF2zPxIi*ZDLN~ zQxx@DeRc)J>)j8Z(E&7{-~KiW^ibdiWjf+eddp+si)wkjQk~&;#--2XMQNxv*>jdI zbjr6h?b<7Hq#e}n!O!heo5)nVS12#lyWQcH{JbYL_xLWzL7_>Oj8gW0gMo{BYSlIH zMjK01QLby~(A4^*Xj76T$DyNfQaVCiobWK(>uZB6CQ^SUG2pr!d~qkVtTa!I<@wbH z;q$9!^q&bzpA}KqJ@8ss5XvsdR5;>cReBIeds%J*BNxvVIS^WofvELncKI*wOwxq= z+4FdKhO&+T@dvL?w((;sI%jCeuXr`Y`@Z$7%N_I+!&^noIqBS;q6JzKVz5%AM2S=d zei6h)R9E!%5QY+j{p^}HK#4_DOZV-5d)0otkFV7{xRWYzBRRIyHJ~1B`5#o16b_)8KLCsm1pz(N{RY z=T}4UJN67oeMBLSd@LKworx>xE1aaWhI$Cl9O|xE;Q%V&A)t;1en?34#ZvtvV{cO~ zH}L25KhRILsza9Q?@^|}CmswAsegJd?(6)Y02UP&O_k{0gu3PP$MMNBQ^ne$Rz9JT zH7{2q_4mG=H#eA>ZTCSh@^N-hc`6pYPg-jQU4{A+Z(ATP?%nwSjD?b7XBKZzJ`d*f zheQpc@4Ob0=eq1z{;ii7=8LqhmQrCdg*@swpnQ8CeCFBNmeue>;kJI%!Z7yHwOLNZ zPlX?<`5xcpJS`l{O9+vFJ5=q%XZ3 z0(PB{b_o+a_-KT8SDVvHc_nWKlzsfDj z`wgu)9D`sye)}^5&>mB>t)haF@q&n&dmwZ1Rj0o%QBiYN?N+~hYe!94a!EX&g`)?A zk12EA_=`CzTAhMhfj`{|@~6Lj`}Apgwl(r2>U`*|RW|Hx{emi@yKb+wGS=!Bb_fSc zrY2NsVtz&mJBnQiC6-q7)dyVsBAznm5WB7*2hWtAIfA|}wYc81L6rS)#Pz3%pJcjY zP?xLxbx@@>$Qo2FezKv;(TU5w_fTS~YLnLrM|7z|UujyJiu!JhkU{ft9*7BTx?fdR z{`oy63NcVbtpHm5lqfC0Tn8`XYlPpL?g&DoPG06m|=cmoQypGD`(G9Ka_U#l!tJ>p|1&I~o<} zN-6&hN#1j|QJH$6(X73Df8!k$zbZ-Sf9IG|{eBu6)Qf+n53Uy(cWN`{YJ;9g|M_3S zYh3l=zSrqxKm#(^t@+mw<~Ac)O5c05KU?M&@O^r2zg!K*`{H#?Vs77xwl%cEO0pSe^YXj&>)fp#6B zO1rP9j@$`6#V4Wl`~(#(gVv9`W6?gJw00aX|L0OMkBGN5tuwWXuAa`O>O1Y0AnHkh z%k=R$U=y1)^BBo|r-aZfQPO`JbHu~l&GLx?9VK9K01OD^ftXv-AIsmo%9Hb+)?#8P z9Qx_$POq+Yk6kahFhr1L`q|{B)Nd3q!hjezk(S?3v_Je>x{0yQ--Otx#g=m~)Wh5a zMdH0yxk^aZ_Pl@hVZJ`P>C2!fY8O2Su-zh{rQ#uj?1L!v2MqAG$?D@Np2vUZJORhu z;Rq$RtrJw$K~uvHLmWXnkkjS~FhhX1Lk5TmN2^xbP-=o@?v7fgDg$5bD{ZBb%6lFo zT&p9Oj-9A+B(KsU|VfbM%{GjSOUB9reg_+y@Dv|rxq z12;saw2nEylVwsd<-mAf0e&W%Y8%+$$cCU2xEPp!SAbCtsZRDvQ={o(Itda0IIYa>-C?%u_SrTW~;dS&;XBKWL{nbh> z$q|@g`_cO|(L}6l0O;N!uFcKaZi`s2E$pLx8&5pP?_QBZ@HEYABU5ZCKryQZiXiC$ z5XU3<-upsF%X3~${Uf%tdlh-k`1r1C+jGAq+NB&^?wOs1Mg0c!~H^VvND9m7R`m5!Wo1SlAyD#FocQI^_8{no( zo|*=Kh$T=S#T7~z?Sh2Sp3&3;S0ULoaxN$6Hi{Ss9V*V=(n7>dmPk{xZwSVmrASSMN!OC zW7C-I&D0Ey=oHWdx|{7Ok3HreeI3S~QOjEn*46$!a<7h9z)FiLHsj!pdiX6dEe)F& zCvl!Iu5n@}h+J;3Zb^%sY&BKKE&}I_G(f}`f+eU}$JrdlhsLmGGV(&B zF6PmbOBm?$Wj)?l2)=;1a+^74rCJty68#BOAp{8fg{{oPAe-;dv3{~=N=V*(*K?vs@zC3Uv%*TP(^}|s7*_@qmvAp0lE2~ z{}h)&S1*DSwMG0jRnj7~gF*rx&0!q}$hf$0=cu`3^nv{syfInj2W+bYiY^B^Vq}L5m$N%^E=+bZTsQ%_=FGNN5Y~+}?a11J3r?=4dke2m_0tGm zb&KawPdOIcBJZT#jD7Y-J17U-M$9PFpVAACJvUiV^)S1zn_d3Ml&nMim_M*RC3=T( zCTS}+nOt2>Z4tB4jWh$67_9#>UyYM#b*&^q2o!*-Iq-=(&{Nu61kF!GS|!=O&g8^D zKE5i%nHle0O~}*#PULyh_hz^ycRllUPO41VXT|&(?*U<@9a-NR-OYB|HBMVA!V=MI z#qtK^fI#y?G}FG0$Z?>dzERb>@va#0wK38@_&dljJU4jw zj%vwg)?Y9_ge&SOA7N11ouuA7bgeh340&j|qb@OG`t!yL@1|pKeXLc*5+9OKRm+kf z*+E0p{eb$XS2Maw?-{800@?EgwEDiOOlNRNyA37k+n1_7))fdlm7WU2hC;bW7`&=? z@(Oro58VM2gpu6{-zD6UuWCM=^yM1Hm^R1T0adQk_|~hG%69B1kEkv!+O8^go7j5XQP41VWr7B|x=HKCA{??_6<0)n|T`zw-#hRUB=o1TpgcOy>OvD?1H3F*@%bhw ztZ40DF>!%<9+#@ZH+ASUVS0h$*OI$q$&xka6$hCkD&BQ_x^`Srtbz!-BY>d0aN50m3Q7BY*je8A?oVq9 zW*dRW2WKy6v9WHi*Lyly5$6nJxKFu1X06gwMBA^86`DHnY9JN7@%U?>=&SFHV7amB z0aaB0t-s^QRAc19?b7f><)~M45bX6jVjmVZm^LG#Sss8Qr$isgH&0z+*G(#_xTW7J z9)tp_<>HwEznwLx7huoj#e#c`k85r$%MU+G)`V8lH{j3_y(7^RfNT6ZbT|8Gn$`@f zGI%unt-g4srm9Dv(8Sol&<@r-9N|r$Lzl{+AIut(#5k3LkODjA^qQxF z=!=}B-;&{sTF!S?--s=pvgEHNE+>mPcr|B-*D~n04AY4}s-0S{*P;}QShE?)YxGWf zI6wD{=$<&pK8$#mdj)-QU?+#ew&d(qqQy1m#}8cA1zou3m{Xo+Y`@Mxyq_U=rzjhb z6*sx-G-{)q0ibWLIC;hX4cV^JQRDD|S^m*U&Y*rER1(I@GlQz6qnU~utHhe6wYUn* z0s-Y?dEQ@!o%JroYPh5+9nd^t8-swY;2654zFAdx|Ja53iz{$V{ePoWt@&pv9c3A> zVxB(;$j3hLV8iwO#@ZtO zAI0+hL_iZ?0yOc~+PgdNkes!*D_ocBj}QtiyH0-9PU6>V_2L+28ps69QvVr1QLseB z@iH2$ezu@U18bVEGAn(PYPYNj(rWB|g!S3km9lGvmkg;|b1BM$ZY8s{sn0iFHi&l$ zEIk=%Xzw-B{0~z6W0zJ^t{gy$KLJSbHv9bn6EsLg&j6cRes@={b?y=RGLTVuUO3lP z=CSL*XK<&gg&Z2sg~m##d!9QjR%B+Mr7iX*ldY~Wu(f_LUFZ=HZZnVSbBk>Ov=lau z>1g6P!?i0C!Qy|jxo90lOy28%eJuU#hyS*#iw~X0Nx8Ha3Q9{}5Sg%5mea69v#=q8#Lkbq^ip0*=GBlzmn9EzAOEE0nD( zYqR;A289X$yAYV*9LXu5=?i{9=J`WA{kgr*LxaBn8^4uuI0^;~vO(zv2;3UkrF7ni z&`s~W0q&>)unE;(knwS{M&H$-tUf-pdm6kgByQ?31!ByP5_vDom7%(sw<`=;t665Wm1Jg{#tWY{TJ*e+B(&nm5^Jc7L;j zj2INrB!h_N4_wpb#8<{w=_yRu1ojf&hn^%(nz8j=HsFgxJhYdtmQvME>Im(6Vq^JQ z9xM|`XA`Uh;QkZ}8{n)4Hi!~nMhE$L!vG^`LX{Ku-U8&!1oWYp{nCbHE2ic(wsol+ zInMeUiP8sX!+y%G#26Es3 zS-^uROPkKUw@a~NQv&PGtx^%6SIoc4&HWx?`kYjtg+r`3{}@qAhp6x=!ONIm?-K7s zWlej&X2p)DWN!RAgj647#|DT!{eU9xeV&g`$FlJ`#*}1id@q!rAyu>wsnL3(fZdJD z`Q_-W7ki~her!eY>gHbEx(Byv?ORUs)0wVBFYc@W%)0+TG}u@a@!FzIJ%QN&lv{P* z$^?&3QZkU2;M>Yjj+Wsr-`&U)R`wrb?mH||8{T#IgBibAA^ONaaU&aSZhrYOHT8SK z-S2P`?`k;pEYFhkl)FFD7Y!$+D;mvUr%JE_b4!Jg8_+L(Pblbw{ma1JaGB2y@2B*q z@GqYl`jfs19E2FQ3VzT$u&S_}XWr$tvU#LEG|#NedH+_=+T_Mw=1vyD#9I`e6FWL--Y3L8zFM*u}l=0Q_ZPd&ZBxw)07NRc{)@ zOwfJ_|EkpH}f`Db%TtO4mG+nFw>@ce|8%A$u$Tdo zz__S`w}E7S5b{%D5cm^*cR813CPV5?0Wd#-zZa(WzOZSCbkWeJSUr>|V|aBJXh;+9 zX6ce?eiR(nAE@Rb`+Xqu{fZWHI>)g8p|m*Fe&GUutbYqDv#RR2l29*p*YTm-gg$ur>kX9Lty*&g zwU0A8n9Ub#16mC5sCPn6L#mN$#u1&^Bv$O#2Igbx=)wsQ;sT=$>M;|50vm-;V89=SIZNGoQM*)$Kw!;M(yQ+0 zCM@S5OkqwmEzzf^W2eUY|83`OBkq}Xzw)l;I%RvYaw+Vq)7^-*GWJ4a#Z*y_cpUwo<}cB77+8U7!l=Wa zRXu$ee0ZNNcjfeNJTQ3S$t=;Q=lw)LFC%2VA+jlbikTE&3eeB!{ww}{bO1eXNM(-p zr^2#^F1jh>)0&h5duNi`RTxBg)O=r1bKD^lncY2F-XB>*SqyEowRCCpsdS-KKNMaZ z&-hg!?)1rL`epP*(a#O$MT}m=+(MX@NnQ1TnL`Ah#6n``<+OZ5fH;p&vU=s*Hiw}Z zA`Fb{iS^7jOW${FfjU3Sv|Z*lHgB1z7qF$p~hvfvNLIOz4Fjj-9EM`4_|q3%+Ni0phKBsReMLa_tPIsj3H!+d8wTq z!Wq#zD{d6Q>ytn?ywz$mZ?BYkn6)(W?b7kb=fB7Q(*kkt(Y)T512>!MdmqBes#T`Z zDgiy49^e8k2+9Vsu}ZVtWp=tlF2xk8Ro}+Jvg>dZVwhEd&id%Es>7|$-De4B_BJ}V zgENpH$E(adtCMpXpG_}MZI2JC;xti2eZW{mJWa$M^+Vxj`ty&bWdXE9F$Y<9_(bMV zHM_btS}xJVebJIB0#LaH&;>S!gBzw`jCUF?>Wgepb()| zk5{TX?B)Hwmzf6?6~eaMMaJdq)8pY}evH1^V+H@_^{O84+pjr~0^oAd8$jVY^u9V} zIf=^TJn44WVciy3j|l1}%FS?Dn4F&D3hETWVOPBo_c;L#iXvkKcPiTOdK>y~wZ!49 z>uZlRzP&WGr<>B_C>KFFhu>@a@*+p>^mHX;7S%o$%qtoCE2Pyr$>5D2`if)h6a`?n z#UD-DGDbN~!EgvQ0u%WG7k1KK4o3$;dX@ zX6)-MzxzF%^Esc-_woDV%xSZXdC&X4@7Hx*&r4Xk)NWkKtdL*t$QlHitlxj`1Ur?D z*q3#JUDX`SC>dEshc>E6(_*zIU@lfLJ|yO%X@AY@z||#Ti#Z4u5gZDNi9fKd^}r?R z^lwsJSNpy-O~u!sS`nIxDNVY)WKGd^aMryQ>nm`FxGye=?NL|&Kh5yvV*RS^0ajA# zx0Uqd=O@|SWk6HaLi1nJYv%$%AkTlYs5B&x*vW;c**170; z*_e6CYyz;gcTWa-Koj}hmZ-a~_CrPmc6DFYVYeHPIG!m7PP-XwNQ_LO_FMZZtu$uN zjVET{r!kILCT8k9x6ccf%QKTbbNcscQ+#J+^XoSqGHyL5IhMluS-y0(^NE?~yR z2h5{?lY@8*?<(DuS@!`ip|Gfusaj=XqeXFg49viEWxMTHh9U}uQOt}f@+vA!6!djUVJ<>Cec_X#@11o{VnIzOf9f= zfm)!_^~gpM;S6VrKkI+`gq~w~wvx33=LXG50KnD-njnvVZPx;9H1NHoqv;>kWH4=U zDslXF%bv5(wd;u>WGr8!lZb0-G8;QS?+J5d1jL>LR(SXQM3#*g=LCrp?bW*#+Ks=5kP+-3}Bpj3Rmw^PwN|}@2RNX`MGkGth zZ-`1;)>qyz@?5*IJysI0x-_?AKP}^rfaX#_IIjGTuvYp;&^P?kfHKVk2-<5C%C@r~ zw)WsA018ojYOMghd+XOxtp53tpz=SMdp%L(qA}O`m5L8S0*>2;ZBDJrBGQ8w93hH! zZQRkIAwI$n6Ugv)Ca8s4#rUVs6-0>vRx#)^O)TP7_V27xH>Z%#C@v1yZYnnebDYlg z#)XjfT#4k7Pl-l`jOp4TqYMkjv)9`Uat+<{$)uv7(uBw(_i8MYGiiW_TnkLj(2ewg z7MOT@?Mw!Z`HqkG3kzC$+m*zGABjf#b{RD;TZ25bpXJ9rigc_{k`FOh`R*6P5 zyo`cBB~uo}raDnXU!t}HKgwbC>olWF1)@Y{Da~m_`{LIeE}LSEvr-O2x*|TH+~T@K z{!*F>uVgPot}Exe#w0bE>?gLE8p70l&pPaI_5Q&TIaqpQk(F&HQK5UxxA_BZ%(pEA zUi4$SBGNEKclqy9h^F;={>cxut9etoSVRPP79eUbia7~+&$S5iJ2$&NfFwZ%<_iq`kNShTY>3^{f_-alA*F!WDp99N1oy|iR@*PMV115*woip~8)S@Rn6aVKTr{74r|&w>gvGQo*6?YTz)is>D1`0-D0{N# z^7h#Dz}}d`Lw8#(*!qu9g+cvab+)VFNJM6$U4M+QCH?AW-=>Y2LOFI(hw@#QlO=9- zq@$x@4X+Mnmp=T%gjnX6lI~^2>YL{qcE37_?A#`~borJ>sS)w+F&cj|@c0q2nANJ? zP4HRNpKD>nHci6d!wA3Vf`{D}@c5B}yv2J#soT_@Xi+Z z9=Tq#;uLHr{8;5Y=TU*45|kKo#g^w!WT2^kJ}x;^zUNK<25TQf~;e05^`>X=^VLnEs6I1yI~_Z=vs z=`-M|{s)MR8($ytGz$dj0en#cuDGWNU!-?+52P??NI*+C4i)U#`SBBAhF!S^3@Se= z(%e44v#8_lH{$^T&3i7B{9T*S(r{Df#h{BbQvtXF7fakh@UI_-%T#6WUOfsfouMyr zlmRA6^BY2#4jjzbYnfkRQ9APyXjyqRdW6x7Rya{MLi7Pn89^aT~e(p!)gC-8Rlg-+r%typxM|eR?@$1rX8v)^6=8 zc+Z3<84vQSj^~Po*L;s5i_$}Rk#bZuARAo;^4gg3i!Cf`|jMZPEM!)dX9dk2s+Hv1G2kWAV&u}mX76y&_MsvGW_8a>m5!d?4~723NZ;;q3tDq-fGV5|OzGNOY4&f_JL)3zoBrp}<8 zmElzVOHOs;o?*)bcxR=i6$1CC?B|%0QV6}57mB&2k~J#8B|q1FB*_&o?e=he>-DAk z#lknveSebR6d_^ZRl0V{OvfNvTEIMp*0%t+44yUo{KPahMgjWM)ydXY$GE~$2p35| z5&;X+3VAs2HRG-42;d%m?F}#y1}vyaDgcI7KRVdat5zU?e40B!e&UV(7yw0>{SAs( ze@a+e(%bgBco9GrBdP!je>cl-8+Z&(qs!*;ZOaBV7ykzfuSwpeYzHJT&H+lY9>wBE z0m;iTPXR#wxuSP!K1)yWX)Kd>>7BFqjsiNkKy?1Cd@#4ohV}i~^U3u?FOT_W(Dnr| zp&{EIRMDa}aKV6!LaQJ(6n$7%fE#$z^%Fj@jp|ITOSfeZ9k+(&phLdtXm-d-Ecsx~2l zWF__6PBU1!!FG+iEyJUvU|urn5MQaM;VI{b5&{fNZ*IT+HaK0tkqc-%Y=>H)1n0Qs zj{F^GM}>fx+Oq1b3(c;pnME%S5w63Gt{)i}S~&c^Xur_uEmKtcLpC3%IMEG~R>;al z0eccBJa+F_50XmfBDU-$mj?Vrt43D#nzqKlGnHxx&yc&;`~>GKT$Gs-6Uw05HK`e= zJX7uH3I<>@7U zR{Re%rbWf@BBYdoU;Q?#ay5<59IEzNozNdh4mahYNW4xu< za~*Wio7&`xYI97D@;kLTRo{L6LhFdX*H9>$MUQ3Sf+!&gjOnzZ6Vd%|7ez+9r5&sp z072cezu=8d^bX)fcF^M;HDuESh%(qCA9A~PbXBf6SRmz!m%M1?i)xosYV9a%aJh_s zX>ESv{wEp{zy<9KVgeFzsw83!D`~TDk6-u7ZI_E)i3cpj3PgNR29M-zIXzcsn;tVF zP05B!KMT2Q<-z@lV;G3Ga`X+6YMionAX4RU>!7 zlAM6a=i5HC@Y<>{-@BgJL32I@N)y&^djKt+P}uc_7QyuiHYfkCaTp~F#qDU`V`cDn zjrX}|4JHNU#-8=aT3tnI%lc~}Z!6TVj{_mDW3EOReNK=8oDZMX zpaWtSw<+mAR^04c_hk_^88xoN)w*yhRyabSLAw-oUl#r$1Q@t-GvA@6wjZBWUj zfS(JGIN@U@=)$ojhk0~(6m5FKW*J#mEn{_+4u-Koinr4nrqX!&pV(L1gGC{1rIF~e zf&VU~UO4m{6gwN|#_Zg#(q-A167Q9$*u-xNz*gGJKWdJQHF0Ap^FOgJrgZao&G0(C z0TurF=ast9ATHGEKB?cAtC($>9#sRC_`0uNbKIo{ShR2 zKf#D6HW0faLAq*t2*$xH%?7Dvt;>fTy3U6wh!_=(e0DE-)iNm2gN=*;^NdtN9R}zpRK7;r*+_Yj z6fZLRU9c&^?BW%M&4MJJZQNzd+u(ucYxR{S&|(buT|eaIgPTt-xaI{g%TxIc{{)r_ zE^`5g{w$m<4K9hY0-oS8)FslWy{8k=Gq19S*)3<%cWMFCI!@&iqa)M`tn{nM`gEvs z6}j8v(#|G0UoG`LUrp6vt2J{G3Cc4D@Ski-)32k0f*YJJOCU!7K zTepa-?XRFFIedw+%Q&8?mXaSc@v@59r2^`+Q0F)mIA7I#V}K>%{1ZoUbD=QI;)5zD zBf0MCdJZ$^Sgi#$6t&^RC4QAN@mnbZ0(Q{_Q3$b`DEX0Aw-#g<1A5%Ngesy`QJRsM zAmZK2^VtGZ$ep|fU9%@VUT+YRecFEEE|&`)mr-OgIhJ~{{4M(#yZt9v!c|UN$=|Rw9zz-xjtly=k3-JXR;)~}J$JHG?4cAp0LjunMPtu)N zuMPN-t3cWmC@XwfYn%0&&>5ehQIt#$7)l%;N;6T^s2F4q9OM^o+<*y|8!e!;`^7Wg zUwSnP+R-LdC1$RqMGjP)Y^<>^zu`9M`#$H?FazXo-6N5CHv`n8y#n=UkX1ax*>ZR% zypC-%G|m$ri7z&P=B1dheycYx=kDE;qrf9n8-IsW24z!0d~e||`u=+!ung4{gjR6m z8K~5?K=dqQprCb@K;^Lx9Af(b&Zu_8kmYJhcL?QqW4!%-VYh}4Z%#2Q+@+-oyI}Ze zv&=+!_1$u=)Do|Xkn^0wAX{@@*(1N!=9_I>Q!9lK-G_+F4 ztSz8N@nyUbE#nsFh!7Mr-OslGVpB}N-r|ezG1zau_iaCC#g+1KdWYIS{>s_lr_{)$ z%9DT!M}uQiL<6ex>bKI7id4C&8{#Q;Q5Zp!ZJ)N^1dOdBqyqK3m6KJU<174nHiHv| z9IsbObZPZ_l>1|Qg}i$o>;_g87sedh75@6Vrc0A2a=RS2xld3lGj~Y5@ugeQheh-| zGI+5q@0e_rfjLy!TEOekiWot%$cyFrW#I(OC*d)TNz2xTlCn(vfPr9efv*~DuEnpc z5o9FQ`5pdrngr#PY>)tuFJ|bH>2VR&Lt?K5m0nzX68O~OlBq?4?W;&+6#monYTkJ} zP%q|tpWf(;`M4akuPyOTu35y=1I6A?%TlkaW?JKoR!!s%&>hHTcDWxN={86T4Tyy9e$0Hi`of_s0zCN8PRxeV zBEIYzf=H?K1gMuwD=H-&y*1O{{Q7q6m+I?+hXn4(E$UQc-L$)N4}k5zLaaeL;y&8; z6T8cZ>(mmwERlvfS6{?p?v=pf_b_qP!1>p}{aq{g$TKo8M&*#`xa5=?JTIf1b_4R; z(dNMU1R6w9LjzqxZ-srYxGGotuzH2EE~WVzbx0Z)TuIbV?bf5DhI{hp!7r< zD`c}A5a%m!HX1f)mZkDrYjcm1kh}B^?lyHXm3wsoELy6QmF@i1p#`yGv_Mdt@{Z!R zn(^=l3fGlO{|wwp6F;@}o^Kjm>Wp|&)*bH$_?Ho&SjOp|!sQTx^mhr5!C#aVLXC2a zM6Yi$r#~}(agA>0|A)lBnHT0jyr4^Q0p(|?-%;=x-ecKRa717=1t4i(hOiB*edCDZ zr}?#BvY*>pw0+-D*V6nte8Gl)Ajo2g)YtRVE;H!)ug#ft;%+`s$Em?7yrhQl+NcD@HU zpZ2E;E(}R8=0%MMZM4^0G_110^aF@P(t2)wP{x=vBux()V-e>HpE%gPr`7$n+p}%Z zq`WUaGk7Li7N8VCFD_PSNwZ+9y9aI2@4&VCXL7b7G_x~V0qYJ|uou^()JOAy?WfKE zwKZ3f-IdDx_I^Nhr)7v^{UrUK^aqDIVW>ejCFH%JU8={p@{|T#9#aV_cOaj6zBC<1 zpqnCdwykhWywSdlEU`5GyS`p3X`O9B3}HDWMYB?vB-}Y|mT;(f0BT-mT$)r1+)Vuye}MfXR8D5A+4rN5mHpj~puoLJ;cP;OfJjIFQ*YYsTIP?4yc9QV2GFIAv8U zK~IA}19FS~R8owga)V=DwfggzOZ%hG-TZS7`nmoISnN@J;H;-7?KAihX~23zs9x31 z@#t+kld7q{fGNCoNV@HT^)|g+!)VhvNX8QQS!$ib6x}o5?ynCej3aZhzU(>yJxQM1 zk2ZJUL12x{o=qi7`kl7X_JpBD=c>K6hNCc`sntbSGV@E!OL9I@SW|V`60b9FXuGZx zm@%{apk9jd@w+QnB~Ui-%c@<=5CQs6sAfy&PGpd&D2L(TWvF!A5tNRHeBJHzfQQ?y z8yn6*Nt_7-%%H{>+8TyP%L&)>j3R%3ojUw773v@ojDBUi6F*s9sru7V!JBHF=ZrRg z6RpXEm>zoo&hrkU797Hh;68xTWiMn|OvywV>aqjM189J9DrJTPCa_N&F194NP&IAh z-jzO|M7$0v4cJL+p_4HV1av3e9DDM3AzR_nn1!ng*NCAhpezGVe0Aj={v<;?_1ig+ zi>C~@c8B{Qm=*d~ zM!w>cOtn@J+mRE;oVDs-u8M3CKy-HSez;lN%Sp0v4JP|Bk{z~Ak!^L@thx?}kcYRX zC~(*?hwL-Jgmi-7WitO943x2^w@84#JCp3tW`wDn*|J`_`~fc(-NzH<620iYm#Q>D z#H1Q7;*_z^e_*n9)rOjqEU~QuGcjfH;BaL7JSG#MKOEf0`><_X(Nspfw59hb=6lH0 zyFYzzV22A9Be22ER|zwAOL{+St}iQ7{k+_{?AKui?&hEgKfB?A@NAk#KaKymK7T&* zZo%H_b1~3uRK1a#`EP-5cgZ2e%u_?~p6tD738wsTKhQc*%6~QoC|25mSotghOzZpJEW?s9xp@~@Y_~i!~^#wrlWur z(k?c+f5#zlPK1|HE3>lT1Y+yv>f&2QXFcNfoc4&mClXb4{xs03z&hs;Grl=V(E%N` zJE|KgByi9C8}I%fr?03HegWbB3&Djt9BjD49DbZjsB^e(C&FTkG(Y9>DE}?H+Wl{9 z06kH|gca=O@lF^AzcHc!Dx|?2&gLB2e}lZSvpMzIn7yOS4Ee z{NY+B1UZKSq#*-w>_JslvswcCiB-|5LaXh=bI0|ZZ*RiXO_@NEI&fw}^VgcfB5a#- zw$^3?C|Dk4w?sgsp2Ftp5@cWOfu+A^O<$FeXHu!p-s0A+SW^S(?R~KO`yGT#n!de; z2B8%uvm59xKY#C1)^lcup=KPp#MGVeQDu(+6IEHh-?7_;eQzQWf9YXfdG3e}UT$DiY zLiJDO=A6AT`j&L+LBk%u)_&L$cjTctBqxX(JoW#(Ot#LWt>MVDqf0jMKuA8s^E6v@ zRIWY(1udhY?zf{#zY{KpPxOL^sb0O&sc_|QH$=;>d(mr74?_}|rQhf9SRo9v8${D7 zh;77-1k(T?UM=vdtKPy#fMQ>LG}9}O)(dL8b!_9pI-aY39YJ6PwI72U4GJqB>YS-= z6)#H`C)Mo%sqg7JR`-v|y=Vlq){B7~wrf?!i>;vPYOMrOzotYX4{qICX}>Qd(sw4V z>Tvz^R03|rICVz}00Z3c^C5@7Rg6`V!1s?*3K-cP5ANtLA*b(vo6%a z?&OHXchBWIKYwHK$I2twA`9QQ=Ra89+XdN= zz#hoR^Rkso`bvfVcQ5js+sQ7Zo?GuTy(9kY0jwmgcvB2nD}H*{-k`S5&(JPV6A^4V zQai}4N1feCB?%5|!?Pc%=E;*d^XDPk;R8nj0xETCez_u;uS9f2-d-Hf2`H%-XzVcbn|?DlO}rtEBr zB^!(aV;{MD)0r-lE;Lc4U{jY-#8P*qhO;DKhv1%5q6yBuEVwQ@YHC1^{%P=Ly&xx| zgz6)Y(F4=eBwX-duj&Rfe7SWkq3Ex`&jUvd?ofcXMU zCh+U>^yUZ~q~lM07NMFuqrYw;s^MqKL%;tyW@uF?RUy_UqPG2MX*){b4Tr$cx~tCH zfLIDX4@qmb-uuU43Arpcm!SV_sbpcNHZVesC_xrXkz(}P9_fgxTe(EfW3O?2Ir?WH zu?xtAPzOM&2?E_`=DC;ifaRtYn7~2zu|1B9@3)gKFcV8YUW>-d?_FU71twZ9ALztv ze96baKbabucF-U5r`^Y*a_bs!;AZ^{1?^040?G%HH{GG8 zlp(sOio#gIznkv#;+FZXRwH%;nh?U)kHqk0lU*p)!KW5iHg($ZGq&#X<26Dc2N+ze z3*4KzM~CZ_z8v#om1L{aJ;&3bbmrb>PjyfbFaFs}^>)c zAI+ouhCY@}I;(UGe0-kiQE<2aw@(G8>vmiK$y2^8_P1Z+$x|4AxgfD8j(0x;p+ zM5NLOjbc3BfI8d@)pR#=mOr^%j4}fNxzj_`t2ta8XYRSPDW9SDN%)TV@c(wJ2>ERM z;~&GA-K3juUfTA<$)M|AwfoPEWx&SHPI`xU36Hl?K<7}o-pQQWsEVN?!QT#vC7^Tz zlxfHT-746)Sn~vI?pG3YY6PnXw%Z#@Z?Extqg~oQ;5H&aQ+7A*M$=2NiR z`8H;A-{yl@A>48Bm^z>eM=FPcA^-R{?5zV`88q61Am@9O>2)w52jUEEcON_}?p@fh zxgHnC5|24vPwj@lt}>5gC#2bz0nOgHQ24?PE!NVw?++b>Rh|p~X}jq@cEjSWW09Pw zG7or$BhbtDaL_+h1lty%a_OkF%;8~iiBEQ`CAE6)#;bMw6r0Yu7H!KZP?0icT{f-; zMkdF=v;@G)UnPTK$qr{WGPzkI zbF96IM+1?)lh^an4gnA_2a9z0^AEVH{{+1*KW-Zzv~|QS$kaRbcMO0SEbqiP88s-M z^1IaaTrVn2G1o$|mvZYM>r>$BoY;M5+IBtXV43sK1F>HNz)m_zAfwXRp;^b7`1{f_ zaNMgX*B)72=Xg-Bc_x0xCjZ%?^-t3e54U60w=o|tqE~=4bW#7032%A?QCHtM`rpac10Rw z3cP} zvSFfE$OCzD&TntI^2&nEFEe#^OI*{wy5)PE_NvrxKbgn{yOUq*-XYvDCXGs3{RdkF zz!7T^N)Q7D=#Q22P^jR={Hha6@M9s5x^oc00jicLq)k9|WeWauQOpuzNc);Aq#Ng} zVs9MfY{@k&vd$8VUU4%&40Rj0X>XT_0RDH2&3uEs>NHTqY17sBQ68bEK_V&tvT%`} zx_yT40@o(`I~;Ta=44VsV!F_ab*s%~eDRZ<1D3#(q`twquoa)UlZ%QshJw%?>reZg z*e`-QD7WybZ=y*<$jf4vn2&@nFTY|K^AfpKF4mcMbLsa6(8&HR|Fil@(M`O@&uiwF z@>V5@47+eF^zro8{tHYpm-q*d^-;^_UjfubY2BWh8pRi(P65RyP59lv(MhbHa{23} zwdu1>#sbH&KN|dtH;DV_4Rv2^dIL|z__3)uz1s&Y4KH5-;q?XCAJ>zJcNopr_O6!Y zA9x`ZUD3ru&o}(D`ueRJMoPFit;#W1FaCI?onBvJiw8J%c`(Lc)eAaitvtn>suYmt zX91aC@E!7c+rV;!3gL1LT9O`qB%Te#Qc?8&vY4Ox+?!9UuDAds`_>J4#}p5vBHyg6 zo1{%bcRnWLB+)R(zlCz;CkcNJL^-!8Fj#xc?vE?otE)S&Uv3bn58@lqyFVqHgnl|X~J*-AlvK!W0&Z6$aknN^dC0C)_E9@W7Gbk)O+ zmb8j^BFd~0#%8)h&CU<4-^}^K%wm4$REdBFwhXlxBXjS10bK`whQC+?Rv{42C@-dCdJW z#IZVfjrDH~rS3H_LPjc!t16 zyJ2HUdNrbzf_^~WyFSa^QWEz2RgrK7p(sT?i&f$(n2c%qYSd%m7@=QFB|xjvSI9}` zpHSlztVNDmIjT9;S?4zrNPJo5VD#!NsNoCdN_fZl{c0Awj=#XH4(5iv!^NZHY^U^l zs8NU14j3M}p5Y3D)pU+z#$rz!YjNqj;?7z<34~qUy*F~>1MP8tCHzPQ&?Z`iZvW!o zq<&OE2gNYjcJ&q5%=MyN_F@mp8qXrELnnF*K<*C#>d~P3`gJe|hWjb&6HY5~^w(ld zjtq7WxC2*h>8F)AX5D>?13>_xFmA~m17Nbn3Et|f41_t3`kqHgAwEwgID@}HD3`y_ zsK0aO5&ifS@|deHGX2JdMs?<-{UDNPmW^qpAJk=Jij9#X2E~a(IP8xMCNro zH)`$ai2Q2sx>TZD{y=vz%hi{Qj|-;nDhAMOIB2-=`b;j{v6N*lJIpQTWuzXnCJH1Vr6yl zKm69wQ?WN7@}_IH<$Jr}Xq(7&Ua>=fjQ&>KjyZ$;5o7=nz3*4%0ZhcxcR2rYX97~| zWu9b9+F`|*xIC{o)cT6pHk_uuE?SkDfsJWGd~;^iw4m2^DaLwTlE zSCL1hEUZZK)2k~7&%j*S?63cdway(OBjI<1O+kY}j2zV}^uDt=DUxVyP^bCTKMIgz zVk)}LGqkpK&k;Xw9@AG$$0)RX0Lr3+xTxA> z-u`ZR!S1{9LfZu$>&^NXmZl)jgOkz~aD)0VqL2*zk9Tz4vh@SLdA&Z-_MFROA;Y=k zKRdh`TRHHLfazh2M>a~a+Omt+A>kWAB!`aqh7~rB?<)5~8J=dE@NaPz&XOXMr2z-|E1iS9ZIbT8 z;HR(|o5?@*tL(Q??Ke!FpJaM)SV8Qh+^hM?&5QH9wZ4ErGzC!C=m}-U5U6_`@?}MA z_>Ed;<=$0!9P1BfWRkAGYn|9N6LvP`E&dc*fqg?(fc&wB<_|8}mpD0lwHm=)1NI3} zJ44zV$#?eXH*Pwv3eX5aZIJ_fPt4Ir2`mWs;~WN&jISF^2TzxhjE|fyEd^>vEWKH& zvnsv(Q*n0l4e2C0E#QorR(34M24g^8?LGD%YA@i7-p8-?w z6Cq;^3qi8$X$6NKCRe|010}wblIVvp@R<_AE$W zDU!w&^KI)%hE7^u@)`g+1?n*j9yZLi0-8AS+Ed5d^2svqI*qhcLtfnBUSrI&>X1-=}R;znhb0#*$v|w=FDGA~CNl7HtvE=fL#k$Rhf4#1DADcGNLi0;uDe zwt;WF`sI;e_z@hVPs+pLzS5V*(7m9%%S8iOApc%Ns zDQ;x*`3hDbY-Xv#CmRgcP9VM4RLzJ_bN##(I+qymy4_^-XT#@xU&#B z=iAV+*pg7OEoKsRFFMuZ8<;5Uw1q4e!c#YZx{mS_nTCU1E_$2x@j>EU{)afSVX!_J zxx`$J;D5E0pLS4IYWZlTJ!i$tmkRSnin@wNxtdPiuYMs+oO$C<*^>bk0u#av6Ra}` zZ$0A6Um1-u*&$h|eE(}YiV44y#=Jk=Grf71?Z^@4sD=(pxrROBD{g+J=YNe553<~B zg=Srj(5!3RMc%@A1e);Qt22>kyA?S6)&rdL3#D}(>kD|->V5+wryGC=9kHu<-24)~ z&obui(ngmRc^1nd-o^_$Z;T?@s}zySpkD4%fs~%cN$g0tn8@?hAq$aJtyguBeCn*V=M3+js6ESlHW;hS3Mzv| zGTX}4`q+Y;4%|K;UQ?oH846x3KyUt1Ab(fIEG5%zwkeLKR@bmJx7L*$J67oFb9N7G}=uJ%IXffU0>P%x1s1W8XC=(02l*mV;)VqQ8${B zXwWL{Pbpn(uQLi=0gjwW>37p2Ucr~nmg_740uwN5ZmzgopiTplikqye%a2{)n{t)( zt25FH5BgMl9~h@Fy&yS$h?xKU4UOIn-v}~0kZGKV!`7B;9UTDF#>pLNzs;Xm_p*rf zk{K`$cGa!7tbEs`@Uo&WumJ5BO{JPzf{Bca6U7H&2OofAUS?8z1-<&wU*~OmsEgo> zr@%3bGU7Xgh$?u$=Iv`Y8}dFp4lrrED-i1Nlb67GWh@oig6eI1^HtC{p|F0+^{0PNIS19-M~|RoPTk9#_bJ_l;nQYlR|s3$#d7r$5qs)cyD61 zZDO+jz^#Kk8IXnKP4n=Im>tG9b+IO2V2-Q*4jvfV0kpQF4oUD{ZT!;GHvV)Ug5Z>u z9c+=m;8kbI#qsUa0`Fco;_Ze`q?6 z!L5SW6cizs#YvBihRlxr0pA^oon4m_9SKsO5UyTvBVs?NEHZik7gbSBh1WH=y$}_F zgkf=G0n+`Np$#%$*a=o=+$!;fcBFJwY8EULsK}2s_tVkh{tgswy2iG-0;; zoyL@!(+s1NL^L4?c4aYE5E7VgAwws$B zX_=Exs@z>{>R-M_!EgXW5lxENUA2VR&o>`83jAkSkhwm?TFfm&UrvrWu-&*Y!epSw z|J$;ZnMrF70V-JWw=*Ezm}vCrGSGya@NObv?ik^y3^%kIgj#{X% zS4LZV(wDS@K#ORqT?wfW#|C|r_oAxOfKWwcBGm)G_f~k$gDJzlQMzY-Ibn#Zljxh( zbt7+KA>!I6Si9d_lPYjxmYo^#yO`6LN_a|2dY1nv3wjPcUkhm;K`9xavjn-$Ew3HV zzA)rqEO{o^rol;bO0YCGlZ9HL-XGur<6_a$();NdZF`?sB@4UXdgp=S3rn%}*8}J4 zGjQ7`@j9Z?g+^%5P#eZfueZ*(9alFT1a_YLqPLEFwCv*%mW>5)$$=)BJ5oPqq#oVg zSV{Ti20OSrdq+^ltHslp4&Pgt{tWGrS6|7wp4e$+9e(_~fFLrQY_?SYN(H%~Kx6>D z6jQvx;iJS9WhbxBos?I|l~>vzJunSs3SX%E);{f`>20~#VZ)<=HYyD@u3=3L?(ZDm z`gj#{Jy9;wU}TXFR^sSCy2^ zLwC@;=Wf)6T>BkCcFKzBf3=t+{QKo=>F;!>9Z3nx28ynT#zTm9;3om|2hAKA`dAy= zbY~&0JF3m=wcdNByDOf?BwnC^pWjXRoFjvrbz^mV?1*YR*9q)M{yas?J32=qd(gHV zF6+8(@xS(eN=qjFU_QF`NgqOhSz12n8a3={IXxt=+m(3o(J4JXB0zO+m5-+nN*uLY z4@petr|6cb*A>-eWVah}*em74wNS69cj zK5L`$+Rm>l(pM8Z08!XLx9b9+*;?3+MJ5|4-s9@L-`XeDhZAo*1RW_9Nf`>!b`0uxro(wg@`Fn%B&!Z1uT4{%FZtsp@2) z*ekr?R1?!#z&9tg5v?vb_c2OCV~T2PN!zb~Nd1Zs2jv-)?W{!OC41Iq`42h{<*i!T zaQN)8onf8)Ii0(Qh0hR^EkIF|vU?PjBU;;ZU66n; zp`~7?x2kagg9LAlEe^Cpc}!~KUeBg}+sGgmSbDTEHr|W(+1i)bmSt;{9JOtdJ(~wa zBY~?cR!F|Ahn#IvNdqZa}j!{c?22i2iOWBBay|EgfkZ-5YF6&Y4OzIi}VjPl#1rn%Gf> zcp9FNs#v=&LPm;R3+Zk@NI%V! z#d+jp(80yFJnC9h0*zyzhvl0er_wwOLK*lkj9_MaLm5(}x=fE4Fv*3ffSt{;;HzItH7w^MDS3KP9I?&^1kJ1?1t8YoufXfOEA)r1p8`|EdQ~({KydhJ9sn0Wloq%87kDo>f zA}bcYVys1pUh7_U0nwuM7+Uh)om8JsYS8%+V}%0Z0Hz>J2bCSGgL3Rn4(VpSq;I44 zsVw`U86gh!VvRx$$|40{-03C|(g`8N(@4gCw#vR3pGAwzD?1K-7wcv*PEj*|2!)Y> zL%X;ek-sgc>RyoW&8@l5K`(s(lPHt~_-EFkq&Vl7){}t)e`$=4Gy40dQjI<=mZ`7x zpDKH9!S$f4svvP7AZX%6A5Cra$rqFvTs|Hfvd;d_`7%@Qd6yXB#nY+Bcecd!Y`5&$ zGc$7xb}GRBWBCiBpBo%Vg(d(lWxVb{pr8&ljt8s9fiHpl0!k)gZ{0zQz{1mEGI`=_vR9$Tv@ zbYUCFmkEaJE0aY*k}F`_>e{dcE=MpK@vQ?S77ifIF z1v0YnB(R9j;|1tvgQp<&4h*ZhOJ+Wax-q(ui`kx?k)Bi$bS#-~+}#Htmh;O>xY(>gQFz zLq+Fqbh?6G-p7HjTv^rnO(A7vLJVl2q4Ld&*^BrUCGK<^XOT2e#DKAZhi~_BhhIVT zu2hM2Bqjt!L>sYCX&I7lWmw}eZ4^gu?cKyrc#+?I zfzGa!iY+gsAC${S1u=_OwA?uQt*lm8b=O1U5<3DzxWt`y_0fk=qAM3 zy)7JO{cZKJr)o(5x0H;|;Qs6L?FFDO#j;{KX|0KuQRgJ(5wsFq?S8-WlhNF#SW>WE zT)wk3uqf1967UzC6Cq|v2Vj;UAsT}h>!CdRrd#bJ+8UnKcs@c(##(IV=fq#&Hiw38 zbI^=+n(K7A{*5^^;zRHfx`1i^i!WM(TpAwt#P3D#7^kSwzGbA=AN zmo_(rU%mQR*tTp^qE{YwtVRaWZn|hDS6vgDBE5j7NG@P5b$wG-rLrH}?$G?7iZb3g ze#<@anG0B`qKsZR0blgJs@jbQKb#x%kBZS6_j47>>cyHJ-eFS~1(%TE>?*AO2*U@% zXb;o}l8~)6UgL*s^i>AjaV!O!et-mScwmU;(T#wVYSfdW5KMX8jXg@b%b&S8`c>`? z+gXq5{B=iRDOxAh6WnH}=(pK>kA06S1nj-tDE8%`{@h~?*jcTrD87A$k7Lgr*Q9fg zeP;ZLaqDA zOOIQnsk%(zbwbi<`_|i>0603>x`*sFW8xJu%ND>=;Ws8tqbK9ow<&J`-)Gp}IZuN+?1NuBsho$t3_MbKsC^AOG1Kdm z&iB5Fv{{M#Vms7wQ)Y2IQbbCvR+=YM@VTPneS! z{}+lSijb6B_~t)U8w;YTUoHqeyI%b^7{+rPMm#Wl+&Axj2ytJA+IpqfV?b<4>R8Qh z%+b>IKIBI^;ytGdTv^jqVTg>A*s9V4UQo&r6l|i}Ny+XSlT;>NB(>UetG7O?d&7TaD!t+q!2>y8@76QyQ3A{9ef=@P?yRgR~zU7~arB zSUC5E`*zj#XNLLaa5CVk9CA2V!a{cxiDZ1LfuTv2Vx9oj1y)89_ZKUKM&_C+Uiuc8 zmgz?>iL14H{NGBeAj&7Kah*rEGLQ<`{lfeQ03!xdc=bf(E7aYTsVhhqip$-Uiz^)I zl zJv!y0dOupm9E+5V24|{2MLXXt%SKL&so1;cPT%vo7k#7k_aeyVlt$L=0%f#puPj%W zk#TWXQW*_&*N$nmWyJ75o%tr;2Bbf|7di;YJ%G6ZuUORzQ{6!e*}~q42?9`}=gCH* z?pydjrFhYIs)^*QXfZ*swu8Ti5X7tMTsAt<71!PV+3#F#0cvL1!Qj8QI~3o=)|*;g zypoKDCi_ZD#f-D->^5t%@FVGQX5YHo^FjU1+W@>l8(mDULOCU>;;I|4q`Ysy3tCI- z9?SeSihPOyu=pd7DI#a}wtfCjnFXy@_3&jU&4&#AzV^``c4we+t^TobKs#}0i+I)l zfZsiqt~qW+rqK#k22_7FNk#%&;`ec4NCC;pv-bq?fh=sSWOR18HiQZCxa>ye4AI4J z!_U_Z%lCeR>>-zwQ>-%53v~^T9BX((Nx3F0;8}aESf103-sN@h*I#$*ZFk$0TR`iP z038N>DlpzHV~;8CVEm)U0vGyxt4ujIQ3|!`!d`b%zFVK(eRWc&QogCLnyT#@4BkY3NV=-X}a z#;ww7$SVp=7ofBv=3LAQG_@q0j^h*^HdWdhVSH%jDq`%Gc|Ve8=$x!u;qG7VK|DW^ z&0mbmX4D>ehqz@b`MhS`N4kF!RCK*rS4CS|gAGF{+GQ?B&%2WOZyHqc8XK^TS4^RDDUyhE)(4OBO)kgH9f31_Y?<_}$5x{h>h01pg zbL)Y^VGVR95Z|fNsor#J*Dn%!Wo9c-CZgwL;%PzE9t zq`T{vgg+j5^0lb2YNdY3#=O8g;NG>i+-<4XDfqFdoh}xE7Tc%INSYzH3T~ozB#tp1 zbl<#K6@o4k{E03q&8#EE3D^&4pr3==drpZ3-|q?^(Far4O}y_rcLu$oQ;-Au z&-Gma_0p!C?SkCB>Z^4k{SADk2N^PlA-p`!JJ4ziy0g zE0|j&%YviTF_^@<|Mlx?k_FdEsvq`!SU<4wjO~`-w!Fp7Am@iB{Coz*MZ}}^Ok1za zd!DNajzyX~{?eoV&MG7cE6>QA5i05KfvG{ux?lf zsJ`T^2jna}rd-+~W;KnQDT;M3)%nec!{t|Q+z!lDaoiLB25P@ufwI%rwaA;#WTtT` zoGK^TSXjm^oigTYDX|)1-gnh6EbG#K1+zc~dXKnMW0bdRb$p+($)U!m>6Qgc#4o+TCPL~5(eY<>ito%|W2_H>z z$i|t6J~syG(VZ?(Zi@$FvtD3hrEV&>vS$g#91_T*M1LGUhO&Jmd*<@4N${P}+U~?v zq@l<^w#A3cOp+FMd>|Df@(XtC{VEN^-={+dYB7=Dw#u;JZrhJQ+~hp4d%f_;d%JbO ze^Y2#$^dvOUd6*J9I8|~gm7%WDgD)t%tVKz>C4(?s{<$fT(wyogC%g?7-ho$uCMhf zy-))Is>~0Y@XI*h*Dm}6#|x#51-Cn1H8haTi&7SoZFVdEkOVt3e#Q6N>iJ0nsV%ER zj_1QGfienccR*e&C)A)zXkPNbMmtvJR&dn6GnZh_vt^^|>0MoMixW0xnI96&k9#Y5J#gXGyn^CQ>!g&nTRX%T;Tu^l# zI48BcS0}&njhwfbFCibwfduB)^9S-ti@ePl^al^6jL%i4Zv?59wsElOsTJv!oy`q4 zslFC1cjjKOwIq{W3%j)s2S4#nA zFaor4fW*)#psfGCG;fZ|*#3WPy$3keZ~XsX31t;!c94;gWMyTXN>LP|Y#rIzBilJA zlm;Cck&Kfh$=+lfd(V=cW0Q5P<8Y4S{O+UAZ~VX4|GGM_Mgto`w5rHV+-Se=ht0jX-mHLaPm~(+(?JD>{N`}H4ifKiM*mvh zPzPsn9+rBEK*4!%dT1f{DcHQ@+)bx}SqTr?-4dU-5cz-my^o|)l|WKJ=F+Si`t2Nt zT5o8{m$}ho`J@=@@p|byfNtO4YE`Anc*qHqFL6*y*bcsI7Q;kHa25w<-Twy@IHasN zMe--Uc($P&EK{<5b?7dH$*1CR{DPW^?DMwBS6TGt4y@XlzB5+n}-#0Z{_fVfzp0 zIzKw)_Wi8jd}Y!g6B7|k80v@LMhZpLd+(PWp^{||2a>xVU-_-w-uSU0&&oOa;OBYo zdrd4q>-6bWL$imS1#_B8uKxjf(ChN7f{Yjj*ckz!gD5<7cvM{+u8t=J$J_vB#?fb` ztgR4k57pl${AtSCtj@yH?jlr8HPQ$8aX`yr%zUkCx}MGa%JNE?{dB8zLto)BlC6Kk z&~)IN!o>U^yAC$_iT;Ij@xsei7IKeg>JL-gYVD^D5cgz>c&z!pN_V8QU5mUh5Y_&A zbf#^cg?7fNlC$xg-xnR3YR^h&3H;baYFy*q7;N5{-5cX>Y|AgUoiP%6Ct;o37CHqd z0BZ92arEV>Dx;;KyI*4ucQ3!Y+1!h`4@QT^pG9w%NstV73q4_VSEPM|W6>0JkTIYu z{UKT$cm$+;_E-$1+vI1 z!MYx~hh+m?*W)d~KfH&q@*qzf$NW0=K7hczCSdIo&w6I(K*k4>z&C71q|Lp_AK>nK5THQ*(YFUGB(v0B&PjiyQ&=$ zddG;B*cI1^#M7R$y|?o*F#i4Tpvh7_foxx^Uf(xslIYDRN&O*ikh4#$VZMZ>r_OVG zrD8W>pTCfm+0HBPbN}@*i7MUc1*>Pn^v8mQ{ebJ5t)%jj`4e?Uq6~C5OulyK( zU%dfXp$l57+)AOukp82p%pc1ms==urcpK318t_fFrC4L!R#L0s^G%Zbotu!k*7znl z%F9Cs929CymDx}btEo|~$1m&bh5mg)2%fF0Yk9eKbN}ZP&&f-!@zdsic7C9gdXH2Y zQfKC!u>6S|DA+U#&L(2bc$<1=)LW20Y(-dg`7F1W!!u)Db;;<-zdUzjx>$BJ z+$5SZ3&P$^z2@OdR~M(wuC4;6wuUURkd!-m`55j4q$0#d=Gtf3XGB|qc`3fg;IRnZ z?Fav_Dx-k+!vW5;nOrPtWv%cB`DWpRikUs}mdkdJH$bbqS1?!HH0vQANj5ovIPanEcn_OQ&KrqCCSN+o;Bi=&a&pxNZeM zejhd)I~3JF4+nt050aHi^PhH|fb*OeVsomo1(1$FO`g4VXi4$gj@XH0ekmCmbm~dEcQQ5&npDT;zrBF&`EeHMI1Q! z@Cy!qP~B+Bc~w&0V9bp8yqQz`M!c1?&|^`ZjNZX;Ak_qWr4NvVDuObT+K`6^i#%%G zE(pQUi;Ql_8)x=5ol}-JsU7&%t3luESQT6uD}9aEJ*a#B)!Cho_oy-zlP7>GOEoK=85L{>=MsNVgvF6FyvNK#vRiC zxK~FpG~}wYtTU$#k$4_23n-xsw045uhf;;ATl@lAYO9gHuCQBX{55E5bu$L2MA2aM z1CN9`{(CIt?RA;BzMc!<4E+F093OItKkET2HWj3>{@rqBzW*qrc8mRQtR8G@Dc~#Y z(SAz9gzv|6gw_5u71|4)slNg2#~i%l`H61$Z{~J?jf4))RP$C8{yCWyng7A*!#bX}@(xDd1I%j&S8z4z&7b6xxLvH_shrsrD6 z;2pcH(uLgEHiOjj^GuH5#_8fN093#(?moH)CgzWy(B3U%V)|6a(I$fUdQx1QHJ$sT zv4{C7g36AP-ulvksFt`8Dt2CM&UV>x1;e+P&Y`VKOR7z9o# z&(c&=xt8F>%uiB+=l{LWSYLI>I0KI`6LUCFW~x53FnpoL@6BE^`gYi zD7ykLJUS`AhTC#k5f&u$4-n~1K@D#b7dp*M%$}oRjnP~xPszH;6 z_c$6+iTF*d%`clAXdM^t&Vm(4`PSNh>V>D#`cco_e&A$z?;G00I9EA!M*Tn20`&Ab z5*XkirVifDE+9RYq5%0Ys7bK8Z=*PNZ^jyWRC@i@E&mzqu$D)3U5GI_?}|(vFV{qb z$7YC%v}T(peall&<4X|$1q>Kd7AfWGJqPHdgRY4P?|<_ZD=^-0Ou3XS3ja4D&_ zVZ`X_M?U!d$tup}$pIMP5l6k!n_zk@BxV}wtOd+SV&!&vYwBLk$3h;0x#EPQBQlw3 zDD?NQKRnepes%n{9RQiN-uJzeKb~}b8+)%nc;r|kL(0sH7XVr);JObLlr`_PEUr;{^qD0J&@apd-{lk?^5d9SsI5uBLpRnY8w#V52s(xN|3E*yGN zT=RM2;M=Z^k-b{t zU^?$rEuf8G4zl1zJ*9dba23!DK+-yuis`-@O+CI4HkYseI{*;zISMs6!Om9HambvZ zjMR*!Tr_6~digsbL`;r4WrN}eOr_|l$8FG-_Z~vMh^n?jd&P6;h+Z_A$>Z&;{aJFf zc8yCH4=uN5d<2$1xnQQLU4N4q){L+{I93!&z3AGIs=LWddMdsxm&>>`9H%9At^T{} zC+_9^P~yHa;-tiNMa39X6fsA(WTeSM*qwv%3{c?#mr3_c*AsHR@!0?t*`lCSQHnrSGVxSFJ=!ZlJOn{lWp{-C?rxC14a6HF|`Lk`3ONgf-09{C-HK7b{iI zki}K>Z`crWjcGw3`+4h2Bce+>JdrS0sc8*g>A8v;Q&F<2fX8wH&1^b5s zntyL}Y$&lgD2N}Xgc!ET-OzBj&hH$_e-)vM@!7BFuKVit13EOwd2kiwl~+CSbeI4_ zHawA-y@Qnn@a>)bj{BDj@T_whjO+Il_S5OlL(Y*D4ce;Y1P#QfgEs71B-lim^_Hu# z0uWr)&f1K`)UFarPH35#^!~Jy8fr$|AEK3eZ3Rv8%=g(ncI!%A0vy4M-3ew`dJKcL zmaEzC`mQ)U9`iMEat}puF-Usf%b%_2L2>^iflY}KFA8iSWv26p<1sU?&HiX!l8+d& zg%n4{tiOW}ZEFK!#=EuQ!6I|T>I`7cY0U4TAiE9z^@cRx8JSM1$Zjz{u%DuH21EG1 zIvaAeDB7%JX|)h>wL^!;HnO0mmtP#gBJz1kpcPEH4Y6mAM}NL}ujSr*InPgxcdolwp6&WnCR9QLUBuu!KI_z-6EAMQ* z!kL(IeSY~sygoYkIdS$(Hf*0udF$gh=kdgAUJ}y{0dl>d7cj19>P>V2p)P7vYTzIuE&zA<|kdG!gej; z_WfhO7w$xz^+1cN2~ybp+FU7=9)0)IZ$c2hpx!&aRXucOJOmsZRP-~kQ)hwhvk|k( z^Pv=}0|;kBbts-d^eU=<_9xI%Qcmj)9Ay8SPGOFYCZ#)6mU!mZ9|njX9LE|T8FyA1 z<@uN%PS}2OwDnxx|Fk+1qD*kFg=T|X*BL7Ene(D440uoSE9iH8yCIlK4;l6HQ*wW} zl)dz7+6d%Sr}qL-2V*icK}4>SfWSzdB{{YWWq@ z>s%)==!e^EaVjM2aN>g(ZgCwE*hr*-*yrvGbrsy)YagR_?LDHB)sokr!~^jdU9Jfg}~l@W~{RP#aAa>6z2&{b&Va_>703T~(O_V7Jm zZ}at9!ivuh^iChB9^6A-l#P=_2IEc z{>ZZn(ziQ5(a{Cm3sjA{rqf{5zsdbti_J|xp+5Tgxss^fuHY{yp`!ZfLS?xv7N&|* zaz-pVWwjr8SDB2CeJ^`05P5mD& zNYc<>0IUpBGL`s4D3MBJ3Svg?K*Hg2h<8R#Y!u_%F!;jYXWsnt4jtRqPEKpzikaE- z%n)o3fJ;#952X>kP>B{$??MhD$I7b$=0X>cH9|f6`F{;r>_(?mI>>#(tvZjCx6(#D zl6lXdxV0XgcTm4_PVW~TpXICG7v081LP8g!X-dKS*BEdTh{>nib8oho)hZKpw6{_o zfr>94EVHPdr`-p|-Lrr?Ih8AW^?^s+y2vIjP3qrkN@~-cfKxvu<6bN-=R7#;*XBv) z5-6mYO;S5I4TE(y;lMY){)iBOx_bp@VFuXk^vF z>AmvhQ_;v%Na~A3+g_gQX5HF}Qjj3E@QD5PbwVk1v=$7mLS#vD`#!P=8# zZ&2m-FOO%LdX>a2&0#U)CD0ZP;Y=t&w;+>uHxtOp5FtZ-S@}ZG3k|kg9!9=&MD5r6 zx8cTZ*ag<-K{m)%z5lEEYDAa0lR{4p{(e|Aga`=B+cJFCRIl;x2;eoQI(Hims;+ON|m>CvU>$LcSz?;j}993dgJ;XTIyBP#jic|e71 z7`?%9G6!Gj8$C(QJtSXTJ5}cR(x`_&9KPy&I4iZi!OkVYsfQ{*Atdy1M*Q*4k<>e%U?vR54<*-R$=aY#xD0)840&hBFQjuu zX5mcG=Dnm5D|0ge3OHX>zc?eLgFq#hDOx*8j0uL?I5e7#a706fqR5;pARyz=!xQxr z2QDj-?UEwGPu(BsPpc#gbRN*Pj>z$tgYoxZc)^d_?IYz?=2b2n z3t$YO#i4oD=@9c+LrNFs)e+*Y^J?InyLGFg*iVQ>5a6|syZQ+56aIXE>}i2O(k`&%%sn1ATVLXI3M z+G(ksIE%26dBg27>pp+EDZiW_vX|i8767k3x6yT2`NNH;O{t~-E+?w%-X-oWKB4fV zTJv9TeR~pC!sKLC7p?sMxLIsj3SD(u;YF3`1`GDQ zYiW;k9y`4Vl%h60u(&Cjk!b#GBAM@N-I3Lp=P57QcJ#D|FNnWo+-vfEJzL!*Ukg}v zR4j^mtuMyk;mK^OM`#tI3aDLuNxS-coACW_rDwfnJ#xR(oz0JOE;6D#R@spw~+k(Aa4|kmJe<2)1D*I5q zb|3L36$(EdJlDIuv7yy|TI0wI+1OB72P=%i0|OXY(6s6oEG&$%iKM~UkDt-? zQbm^Cc3TO(M7`YZDo;mDG@-2~k?FTSD{mKmkDl+-ikMYi(-=cUgHivU&HIP#{esS0 z;HNxD1T3&FS zvV2z51RT8Kpqs2geZ!NMBY(w=cNk-&JjqEEIM@No(kF1K3aC;0g+=Nd3oOT_{jOW% zls`96`&Cs7l$nl-j+48)5Wo50XT9%c4u0Y{s``oTTY4Ug-cJED++hd@cp^|xnt@ib zreh5!U4f1DvBi=_1myKK40F&H!z*uG&md* zw=&(wy{N5sZcBXD8wTI0o_Xc9I3x5X9RkAha$W}IEFA0c*QuB3_@k^2pt6;%G($5F zi4gw#<9I3`;WX~a@~RVj7X2S41w2f+nsMO23Bg9oHsk*rVC``2P5f#p>~V8Qj-Sp0 zdlY=9vsz2k^UF0$IS*Xjr?fwjukxRGKK3m^d_v-omqcxBVzQUPQ%(3+vR?kGONGLQUYamNPwj)P_4?LI-n_rM*z7e#x-RI{3TERpbCsNYYtPBspLYUEHA3qv5hHDX z(o8CALI$vqH(8l1RT6cCR?&F1CKioa?K7K*RX=+65nX%`NU1wM)0#cM0Fk zZZ~11Rk_a?z8N|qfC%r(=|j4a^d!PR9+@s+6Um1lUe#aaCbO9yx<($WQ{WCOA6;XO z4p0he2e?=C(lTh+x$~SNEn_R#+ef$dsDeR*4tBiAHN3jdC5g9Q zYb`tSRVoE>r(o`7X(7%nY}@y)l078a^Q5y4g*=9bu)MGlT4ek-vA{c z-A6d&fM?8f6e9-8zIC!A@12UHR|i-7#~0*Y9Q7^|vcAsKWv5>n!hHX1%JD!7z0t+r zcPg%%(Sgr?cE9Lxf3t6wiB7t;B=aVlm+DIBw>=+J@a_-c$+uwtmpbM5VGx29Eup9G z7`@=YK)fg{berG1O+FJTh$G-Gp2MAr`UdQKRWCeG&KezVtJx_vUa8d^L^X=;VXhuJ zm9py3Fv*qB2f-MB(8yD+HMs{gs<3~rM)0u_Ifpipps&Ww1ug97x(Q92WLTenv{Z8t ziIHd_bzov=_R{P=Dd*(}9XvL4oC6C1*$dn#)SI}xcf;N_dp&YO1BKHd><7(v;r8&{ zUaHVFynP1QvSSxM{m4B=h&+`ot%ikoEG+;eEeq^L)<4#^Gy7MzT>@ycCJ8-0K{FO|b^6S{W=TZu#jI^n7M4@J8r$LzMsA#`iYSr43dd{49fVeh2YI9 z#NOHN!&2$qI2!7?&bP^;-h`*l?AP^%GTjKYF_SX zB-Y4lLeST-50Y^y2o_sj6pP~V1oT#$jFP*SFUP0K9>KM(He64-^feaW zF~fFLId3k(e*QI>8ZQ7EXmn5eZSiK-JM!G(7nJi($tkU1&hBPXWl~W; zrNB_`LiyzZ_nv3zEvnQ{KxA==|1RwPunjabm|Neg(M;YcUYEZ?nKPwc+vv zi}Sq#S|?YV(HQ?XlY$gJ;(xCL@bLhE(jLlAg>0(jy|QtuhomAAdDXx8#R1RlQ-ZWZ zQnzF4bDI`cT9>nVDvsXFrPuLn1sOJ#Ke@9Xlk_;d`$dw|Uqaj$P24@8IGW&^dQq*D zfGY0^|An2Dp`n1ZynMx7hQrLe$|b|*S}}#Wc9hZeX~C(o3-U(rX%`W@zPlWjlj{WnXhA%E;GOznsz_c3pcXa^FfwU| z{Hx0Uce`EXE{j-YZLiuOu?=DNuzq022cH!*S^>W>+FUaYbj{R#I+Nd-#`=kRPM2bz znOhk*9!3=HdiL$s7|-*LGw`3HUlyMBimU#bOEvT_!WX_F%_L4eDZ~pXr}}n0GUMB8 zQ=|!=8*HcdXI4(tbmH$NUBhfWVbrB+>qui)s|I@?jUIoAsMTPB=M)e+2))8)+(tco%3dzda*mKP2x%6yVV};oCyp4Y26S-_CHpA|O?bdx zy)5!JCE3(g%&wu66Y8K^<7C%(MmHM58>T&#h@eJdWp`O5M^5w|%w_ov%Q`-fOp%ee zk5&rwHYoyf*`Yxte>p|7E1)H!e1BaLrZNNxTaCSk&ExrdT#gO;52(MyOs3zS*WJKj zgX!r$Jn3h>`^)vMiHZ?qLvmv$Y?8MUw@Tlf7RCA&ZBH8U9p`m06H{N8bWsL3x;xbB zw%I=`J^x`j+AoB;sHh-x>2dG|u5CY2;3cxWvJ>NNlP?y61yM}F%YBGG$ljQw!Qg>& zh`JLWkRl%{zJmUb;!Ay}^{+yD##qUFH*doOmR$>$yH`~NQpf8Y-O4K=4QFhoMZY-s z_GYO@1nJJ1k`pqe54eOGng@V(*~%N^Xi8e*o?R9BMuNl^Mo#6xt2az zCGJgLIWgUERkTsks={kc$5G=I+kr~}5t17 zeCEv4j_OqRsreXPha7DU|xT0^*nma2ij!h{~w~>-mnnulB zN2#razk=mEUpMu@JsTCcxFxaaSD@)$yqe;gub!kWYPBKKNhS^-F>*IQOPkdA-HKrU z(@}O=xzZA?@Wk>pPMr+e+NG!B`t7~6ZyZ)T*;%FwnCXFr~H1hZ-w#)l503CCA zs_fBZ)$z%54?!j+dvuG+KR*0H@q1veX)xvvwL8@N@m_cc%ss)Ip;kKD77G+L*W zJ3`>+eq|rn(?8nXR=CdU@rWfmv|Q0WwTSnLtij?tp9&uFhxOC)5t7O(pT3jaN=zD z@|xWYhVWZ+R!F^WuWIKml7I$_aP#V~8KMH^DL8kS#4hh$F!eim@Qrf?B6LywJ+ON| zl-kYMCoetA$Nf&)@*7ziW?jJN?k`hgQTB~f;4G_{rIpZMXo(Y68Lyu#Te>`!owT@q z%_E+_W#=|(zcie#=lwMd0H+v&F;gB6g zh1$HUCl%W|CvP_}=e#^t$cN)%+`cwaJ9Jb_MeXs<2CL$+9`i*3E%AmGo2D25hz68K z@TZTC$S(E4ceNIZTlc)2a`Nu zNM|!~l@HDw?cYqX1S=y)36UI+r?PS1`>{ind(40yzS`z92a8|NxCYy=|Mt3eH}?7& z3GO|8yl-p;Ch>wsZCAto_+^@z5r7vz-gqu7@u=vG+V&|avnR4tbF`uCuM&7}KyjuB zp+tS;h)&G?GtPo%yRQx>?`afQ_lp?yZXPSPVx;{)w`Et`zl% zP3KTa3@Rn8FW&>u0SfposBH387Dr9)b}#7u{+PaP+x2$W$*pX0qs!vtL(h4nE@+Au zmLD`|fBpGS=fHTVbBH%=74vR=wdJQN-ElN%`GUj2@T+Cq`0j}H6}j~JeC1k;SAT~f zy|w4#3v8M!mxL()n>0wE-oJo>49=%rZ`wGT-%CD_Fvn`z`=z@Yxb~NEg!(iD20VQL zZ@rzSCp@Gw>n|%0@2LDuFZ2y30_k=sr2sdrqMwZY3Ou1nB`^7KR zl(|BQwhmL|&z#IYOgIGBUtkGGEb#SmS0lCSqA@nlA+WX(%ZEj)e8PCq&sQ$IR2L-5 zzf_<0qlz#br~(^MhrzPYOQtl(-M0bJ-DNz>%v+Ve2|xMdIPn+x6bsqQ5(Fv|K>ZIT zhZfSdTS7r&5@0%Ip~{G1;?P(q1XXi6KEy9e@Shdf^C~tvI2DQ_HXQ2 zG2R4uduKs|X2Id|^nuPv<<0yDy_DAX*ZJpSvmtlX>w?+>kTWxWXBLAFPO`xByo8mv zmsg3F%f?b5#*lhp>?Boo#6Bub)8_c(o&@Wy46L`lp`Q*~Y>SCyyXSy%i{(VETAa@ChTdi_ikTpt$v21hv%&kgCLAwt8;;}c0CrY0uFB9s0R6&iR6 z^5M^0tAXDlDj>0GW}ZY!zg}sFQz?&Ysgt`MKlk7eD-+?*>d;W{yTsqNA0Ntob-?`i zeKDaS9}p+58^vMcm=KP3!^~=zPxLd7!-=-L#7{nt6|<>3Zn2SRX$Mx0rf!836ic8y z`U-C^(>jvfkS}b;DymUy^<~PoEn%-C!P0vo=DK(7=G+vulTj7wYJ^SyMgQV;c4F#j z<;M4Si<^s1>g8Am-UwtNBzJiKSWs1yXgODO&$CORS9Z*{Ir4Xfd9#0Gz5YTzm%EZF zZRfxx?c%yE+FV1fVh>J!Dm9y8OC-h_iHe$>Qz% zy6%AfjAf_glTFJYIVU5KOSCUkTI1k*Eqnpbdy#?V<-_{F{4JT6G|OEU>=E^ELdzS! ze~LO)5}0Slur@;@swL%VIYSeg9+$HbVss47&#zRuOaRGx!9CIMEs@0CHqZzJ-Xpa0 zyV|v0tp@;Rvq76>YH^4>L*Cqh*Taae$LrZ{tWhVSRY+8|hOmqLowpa@{;TboU0Ak~Qzlb($V{ z8GATQ*p$3KpNyuXF_ECC9Yf~z*!6Rt+O2dhZjN2^Ym#|mSyk>4cxvCf=?~UiX(#Rr z@@)l45jB81;5((snC>NS&>lch|G5tlYGK8Wt81W^8%Lo=uJ8v@{WqpkyG1pocwU!c zbEln|2+vK@6eV79WOH#Uap$oY-Z1*}kgCh}kxiU<7l{}?x?03Oet^oFGVyFOMyY%f z@A(1oyA})SZTY^G1dcA7ic#PnQCw%nVwI<>)elm2_di|ymoP6xMW#cSipt@v2dMZr zHG@hvdyQ&|^6rzhKW~YLAOT3XIRCf-7P8l=Mx7x5TP#UiAa4X_GxFB;NW04Jq_$w_ zDG%yYO%l}5m|F(`UI1QlGnD?fO%ozdwaE{qWc^PD9L-P0)Oq(j9{Yv`>Q{`)f>g<2 zwgPs6uKX)`XxyrP3hkDc)VEX?NHcWp_T;w=F_f9Uh6+Fo$94FT1HMSqdtCGF* z91EB8ePmduGRnS%{jeeOo;Js%Ut2Uq`860T0EdP9@)CLNZ{ZKRLz^7cm4UUsUeGV* zE7TmHQ6?qI71(qMVp(wK>%NO%bYBxb&fF>HLe`z|)ElV+auWLp8_Znnl;3cfnQrg4 z0_N)nl21|Eez^78OJB#rJMVoVN)t+g?p)@=%D|!iVVywTXKS5oT%u?F(cIu)^J+#( zj+D}C{FqE|&Z7<^@j=wkG7yR&@KQZ+i%}uG#4{pPQbdKwE*;Q+@b}FH*}n-HA|1Se zIK6vC7vvAO8kb7SVw%^bS1FL%B z4p%-%DT`x-xyiDLcd3rfj@LIhc$~G8bfRS*3d+rB&e&eCdp6$K!LX}nz?Gcyh3T7g zLc;*VmKoIslfxdA(uO*La5mYG2@N^A)%!z4m-ojrL_$3=HU zO@|AHEXcQJCU?na+I}68k}}S3xaF%8U(eRLQKcXHKkED{Glt$18Ih{s(UY^?Kx& zohursqW9E^1+o_OE7!tn)}G9K8}iB9%KwM-+uR~|T!m~j%(b{Xr(BR;q)zd}paOy? zw~a@1n|5m>gdO$s4rhad=1RGr^j3OZ^E+(sWu=F!uU==QqHUr-wmr-#4{(Z+&$?q@ zDhAcCH~LmNjA#r^n{TKI=l@IIKkex)O-zGQJSCH023_O|=%kv=LR}d{LAnp6M>DM9 z;PDvkwQ~=o{1(PukLOCx`b#+z2*mr-8%iG8(uuVpPhJp@Uc@tuS{zWTlwyNGU)_cvC0qK z5t9kOPRRx6X<}{~#lhku5q9t^e5Nmj+`b^87MVxYRcdmhG{3BqJ#I1BfaWS_eg8Vb zFw@|2eA#UGlZp2oMCvuWJa1M6G|Ze|VH?KULb@)LUc8m!!1iLi#zj zp;&oO;crq<%v&c4+i~4q=b2q%VaERZkm+G752+U_(shDr91mYei#3(VyZ8*zasE{{ zIo2qshWHB4WiWZ46Z+V*;9gHH-HOMYFNVJH8h1HKZP@Cvm8W$11e<*LwY^xM0&`gl z#;dKY86wm@Ujm$%AA%iF9e1e^`FCjVXwsX>uI9G>`b?yGoF){#WId>K7P?PE$jSw-NGYyItSc z^`VuD;d7Cz#i!;!n#wwj3La_Zd2-_n_>{v$r5%FW2liSbO~|sSMnL-(JOzsJx%{E5{&NZ!Os7>228vKHP`pzM4I2F% z;qI|~v3=t>U77kjh@RE|9AXvkEs@(N@NZdcYg5K6w1IUz;kNk#A1`+D7nQag^LeeX3bZ=AYf-v3YYziJ50I&H*SAHLXy5mL7vFI&RFo>z#|M4fM5>16cwkm@>% zQF=eV(|>FByKI~E`fYDAlP4MH}` z!GwYfQ3&+mEmPVw7rQc~OB>*l)CEQ8h9z?r2_f`FzPj9(mYzIa$hce6K%+4*{=j(a z*dwU73ZcS~D*oV~RGU2m`IXmMce?oJ!s){4J}t#6FzRiKAP<$Q-*|N8Q2W7c5coJM zY{-1gkc0dwDh$&%F_*;$hw$Tsn4J=LyT7D*f&6_D zmakz3#@{PYosva{3>1rmj4@F>~sxq%+#JX4i#rn8JIavLvEeg7E{yh*nN^ zK{6s$b8LDrk0`lZa5aZPA^ujJu(=@H@?F7a{tEF~oEl?xWocX(&+g6v3nn8+xn27* zdX13<%`*DN(t-=m-i#lPCKI$Y6xXJVL1`cV5N`XLtOG4clJ%`rA6}ok%ARC!=I>h_ zrx>t>F}dDN9g$_}^|fu+k2EdD{(CBHF?UNH;-eE*0?#_DOlrtg*d}yCl%{M|_AOV7 zg^*mLV^f^*E-`c`F{8hY-WS+3$jr0}7qIqVF?%db9R?qy8?oGUsW&YdfQ0Q+p~LeN z*o+bOnW`)FG{a@X95((5^KmOUl`+>U)BW4nm$33&d-ilR{jUpi)YAxEpD~@OPKGsW z4912Q9M3WLG|4IFg6zY9ZDa2UzW{pj#N;; z;^!qVX{%?6SL%MvC=}n8)~EjY6PV{3N_cddx*mD)G(V!cm%vK*L_DtUyi^zuSKRyi zT5LuVs|u81+%)KMjmj#4@m7yR%2FcB?qsoQfTpQ~bmXkRv2+%@dpH;`aOmm6x96O7 z$@|LK21{g3Cy*b2jZD!Kd9V{g0EsdJKyd^LEhtCk-k)DH5l0ZnH}eBpXw3XTs{w7< z!tGKugYT;^41T>R3PDg}1z_9-ZlvfF)av0&` zCnuz~Nob~g~ zI9+BlB*;DSp61TJBNH>J$y&fbxEg{}Ja&KWM^ecuID|R&`6d;nq;>DVJ!3Pxcdp>4 zl-pS!=~+XJa<~PIX2J?0ge(k^STvQj&><8~em*2F%IGCN0&6L3<{RP1`I}WwRTa#` zuSu)&UiuaK+ff&KJQN*?cx|({SI?8@?NUhdlA3Z7$-CQp20p_;d@->eJEc~ZcrkP; z=n7ak&eTq+;$we3GDayS--j2dpWeCdv5E)eFHXEl7h@$>}a%|-N!))4k~Hm(Vwh~hKU zqsoZ;G3yRr`=kndQlSXgzQBc*9c+4EyOgpLe<^Ily`i0982kX;|7|sgYuaZ5yDYL1 zxt3$QaT z@J)#~l`!&Pk*iKsCd?3on=JT!RduRSY$($UUog(pf-^x_Lp*1guwHI$&&AJu!~&kx z*`=Av639|4wdWl;pfjfA(tow8QXqCZIO2W;A``eyK>YJl^%Ce;bD;fR{$l&QIZp`PSS!_(kBx2b7v!l;F{PzB686)_%GBvU0xr9F~dd_s8ueNUcKi-Zdh} zmxTh*>50<2h-nL3F2{CA{J6=tOA{rh2V5mEE({*(L}gafjX>Q&ZCx@F#-F`eFa* zEwMnh<+L!_g-^6NQ zIRk~M-4c?u5)>!;2 z_WF@Cq=pMxtWr^UBg)K?R**45{X=3s*s!=n4^zJ)E z4dAMe32=n$L_H&%!{yy0o@Lr|zRWG(O5*EcfJFG5t0=>TGi`FaA6TMzB~Eysq1!qffk4-SgzFuyR?2_SZeZR#+!z`H z4I88GH=Z)oQEhbomct?cz$p%N;pL?la}-|-n=G3~|NsHGfs^(oV3+ zb7Fzg4yN&VG2gq#Q-h(@)AoCjiIYhtB3DuXV6-bx#poizKua$Q9?mXdwc{H2r5t28 zOuh^x&zK<)uRN8x$u2o7`P*Y3CJXFnSB5=ZCcn{(p*Bh)+q}E!l@uZWg%--}X#%pJP%-@Czjd~6jar=Ie z?6{!m?;`&Fnc~+dZXXzWv)B~`g0z~ylSy~88e#kkdis+x>&@nC4Z6 zeJZaEI`&>oht+>CSj zCtOsau;CS17{qTS?y=wOv!Tsy%>P8|DND@2c74D;kSxiq$X#w{GnvXsbY zXgDH`)*?@2(boIv(AqQN+cvz7^;-jAhz;A1w0V(8qnRNN|7i0{8x~x_>pFI_XDT`?EZ~`#JuS8nVI0vi4aPuNbON zNBEn5LGw;^CVqc2GnC~~_IfEd+ zVrF-Jf9qIK=BbJy{?$yX6d037t5fn{YI)?+KF4WBPlr=FS*x5iyEbnDktjI!{sK(f zJdMWY%3_j0{@4ZXJX(Bk-gAHA1(5rGKPq8UBBnoolK}5z(+Neq#WY(M>WYxV2W$fk zokH={;yVXZqSdky6w+;Qss(q;q1FY+LvG0sw!}u#_CH#$l}{9Jx!#)a_`}n_k-7u6 z#2IEQ_h`>Nb0Osp;UT{`$dLNJik*y=0TyEzdT8?h4XOyhIhq~7fi+>05)h?#9<|%& zEqny4<~r$I3L{v8SWh1@zB}uLRH37?|9hA#&9-ha#O!Q)^mBRPCmX`^?#B;L*HB*O zWWG+NXbet0HPLe%%kz>scGtYj?0y;d4Wrj>pvlSTzZs~DRdU&Qo4ZIJ3VtTECSxP= zZW}B|q&Kh=0CgAXZoyDo{z(N|oiaLya#z!3XIai0diB8~!(kWpIgD@aCg+66#P8@H zaz%TNSJ?%E0&S0}a+Bc(9civJDuXc~P_Nws*S?j3Ip$ff3VXyflo$il1+y|OhI{Pb zD(`t60s(@blH{-Gf@a&qiz~_>YngA1y^`%<6!KyTSJfcz+lqxHrXQ4j8O>_HPf`3Y zY|j#e?fD#r?U|@S7R4HV^3g_IdapTE8K@MaAZF4ttZ+tc?EB;{-Z0tys*Rg)>+gg} z=5X{XH1N~YqJ&3YssSzIw|kbICpwb<`9CY)zPLkGfeZb>mgy8pzIPeR2%p$`W0JHG zFe;jJMkRm`qQ@qq5VaMo{=0UdETw;}wzjuQ&FO;?JaB|S2q<6BzUSAl^NC~4x;0Wr z>Vt&*pOcK|8ECeP$HMPnvbEZ+YDk`Z7eam3Mp;O~$(c2|*9HnuyNZ4ue5-$21C~l= zRDJr^O!OL+bi@MN(F@TwCfxI$sW>O(I8HAU+ZwRA-AZ=b*;CRB8nAUqL*%r$lNiU# zf@68_D=&WQ9-iL6AnizPA0|V-#8^#uB|ZhVf-cZHydE}XLr<$#JvUMHxV{EQnq`OK z0f3p{ygPhdJft>?H~Akbb(ru-^HcBdnd66aGd)ja!JMDMiW64uKW8n7VTVf|c+~Pew%g5TZWB36o zCH%Z>@M_}Yv4CJ~A_L&6)v=mV)D(BfignAG$Ah1hzti(b@^qngx})*bWHtzqFb4*D zLJV5oi#B$C-C5`?*wUW-F)1({ohS;wS~2gh?&l5PD5b$s>9bVM)qb)b;#aGSMSE7% zkIMNzy*r1)QOG9CBkFJz&{$eIIDl~k3`Y;dKOTD6M>73fF+&x&VBUqagi5a_0$~@Y zx+&xR`_-zdQ-b8ejA|<5(%-W7|3%h!z*GJG|7T}Jl1f%msbnW)RVtNA>XVUit;ou_ z+2a<4GOkgS87j)oUiaD;;UaroTwGb#zSo`qbM^WD*8lP77LUA(`+lEuUa!}4O^+eO za1L) zJ{~Qt0)0wVxPO2|ID4a+^3950uc{sQI5IU^XNaxd6;OUD zpm-0!SrN>K(ui}~5*lO%QEz7qTwGcho<4tLBx*fTOkqW;X()TFkaD@i{E+ciOhm?E z$!}C!;!iK~Q}H9$PhaHM_m_9P-~RdS<=vwC+(!c2>wse6xgKwzq*Kz5kE-YT6m^-{ zKy0~5CEK^h2$-RPxW>P3Eg4|&Ivt+Td0DSra_0&Fc!6ayygd?C1b zF#AZS9xs%}a2+tld3t?iAdy>%ZodT7hqSl5LO|>SDt`YUvS{i^NB)$SAvu zsM@GGm_~abzYDD;2VAF}>ldG5C;&6Ge78jrt#GCMSG8qoIZXOf3t<7@=zHP7r!e4* z#QFUJ!FRbsl*K>`RQ;j!!cCtUPEP>!O7`Nd$KVLGehSWKr);Rg4Uu2Ha2c*}{J9cI z1L7uTGn|WPy67h6IYHG}j7jwb8^D){k<6V&YeAh5Ij<@vmF@9Pxcna`s-gMSy~%qT#G%&xLY9>W>3;7Xw>y5mj~xkx6rb ze0Fc#!@DcjLZ*chb`afN0DRVNRwRFb3C+m+P3H{*Yn-}MA$D`@!_w-@mdce8(c_fk z2et(43N0t)yz6I_8!|0DjRl=8z6W+#AMUuhZ9=}lfLX7i(~TtRq0Wi6KD4f1T?rF8 zgTcO4z6t^2PZD_0Kdj*IL+31b?#o*rgmZ%sYwt)RFj=~|^AvLlZa^xLGxZ>r$dSuWaId6;*phCQpb4Sw z6R=_MMH^v(BSFv6EuBdiX9?8i)$4>PjsTk%+pRuJnBrKQ??Vrt@Dg7XP&wwq9I328 zJIRO>uDCUhSHl(EIPhynJj#bfS8fI{1^{?Rn*fqU&>PbU7nZfji*?X;)xme~MU>T6 z@BQ#)s<_o*)KPk)>$zLtu@(as;g9-180|FVz@930P5dV% zRo=D38=Tz`vnA!StjEm6lGby>EXrP8>j8)6u?5iC(i_*eZIS5O@rhi-EX3NgwUPjOtfg*gB#PDe2zn%6-=U1H-$7*O`sqm9| z7Ny&uk9;$5b_FTTFdsvf)zWFngya&+$s{w6J*T%5-d!^Jw*l5oaXMn24G1D{DP!Bo zZOAYLcp?WJo>}9`OYeyHj<0NruQ+!W~0#;EpJ7EA+T3Lakxx!8MBTfu<#=>R3*j?8|pK{ z|9n^IS>%U5Wp{pOe9DlMXO*FObnOS-<0H#Q*UwC|KNS)I59Ewv-cyfAzIp;Ogff{v?agST`W3KI#v{~aLEDGyt|!?))lHgTq=R(a*&Q*Gj7kte6lo_X|t zq!Qwu4Ue^`fmQCMuEjEIht`>&*U2KG@Cr5%z6uD{yt}LwVjqS5e>w&Be+4-NKweO@ zM7RR01OzR>6AkRXb&uEu3p8lQhufq)Kbgr6S>0nr7pL3&#MELVc%!Q$!QsyDO}&qx zcl4CU!ecN~!*G2Mf9=ZLMQNB9^%TJ9^%^j)h+tl{$Tw1+wey z7SL#a91wg^<>3=iJ7_RwN!O%5i3z$73e5TL!b??jyy|*I*W_(B@e^au1l5t&UWki1 z<5I^362ILm{0XS?Chrxx2?TsC3k#xYP|^t{jEa`*crdSi!3U?=8G{uzmK~CNA`WQk z-{Ez}K2BT_&yH*zU{F% z^j|b1CkD;P@Gs5i^x+l$uJ!0Fa3$U~fbyI<5Ut$+OjrE7GBD4F@K2Dwy8?R(4qV)v ztAmKa71O7Irb1KFeZwV~o~v?#!zFSDa^x90v3Z~q`#fcH%GDP2%6UT}F0}ZdLrg+2 zGDWpYUWF$Xh-9tIWXj)f0pecO>gw0@fGu%7^ z|JJ6p*RjF-BvL0@x5b!_q!-kKX%&slGia=2u0>%~Juu+0`31WDT8G#c4{lB6b z!q$IvKi%Ejs7<&M2TAw?U%CVC-pb1(9x#V# z_oaeZDJ?YeV%Z-1ku#o)Y*K^ed6@Y;QaBSm0d#Tr^g7CXGM(tTJ*E2 zp?DoqEp2^0TX5}<#+trS4xFs-oui)yNPv_o7;Y!KlhWj<7NQ*Qkq;xcScu28uhW1zxS6)$TEmcHk1ItB2r(FpVunVN z9<-mA3QYe<0C2JblcJ2py{Vw`^xA_s&Noti&;rv#`N4jI`%z$5au4m!U+b3UF z`kd?^8s){@MxIv|HjYoSHFt~~c@oE<5Ii84lzm~<>Ec@|*8WZ2&3NoCPtXH8jHf_{ zk;l}H(t9bXNGWiN*}m8&|IF#7(!&L(80Ck@7=th<7=%5zwE($au2m@7YpQiQ`e6OB zu-PMU`O3t?`Lhz|Y5}Vf%<0ChPYHe*NHl=EO(;08Lhi zQSd*J*r;^2;YhEz+hlUrS8}SJ_Sid2m)9GSH+*E~u_~cG8C3k38Pi@+8zs^*6=A=_ zl&L2cf#Mt%HDptep~Ter-dhOOw&hg&vm4|2Y#VYRFYE&$L2L3_r>~aKWc_n&%u=VZ zp-Knu&iZAcG}(ELbe^wAoHlG;X=FHTkH;H8Z{6&=-6eZb;gY-JGix(I*>3)kX10HQ zUA113VzGQP&8mB|J!a?`hueC~qmo`gJY#-%y$i+)sHfWKsC1gW(pA+iu1v-(mn&4OrUce_0T<(v@JG&t|VHx{ol!&0ko9~(C8s$csd!@|Nd{f7k{^Eo|rw@ik+YjX7G)u${VU9qs}tzLYr zX6LK5qWIW9cF;O2GASgOC3%I2pdRA(uC zCr&ov#S8^}h&k$pM&c6j85a_L!ZC5)DJ(TG8b*=Zd=|cK6}I{H3y( zbibHrn-9N~JlkWRtOLAX#9EAZbdw|g`foxr3z>io{8REDhK+9CixE*!n& z%pZnTXV>dqO6J#1RR@2O3_nW^Oskk$MUIM`UPFTs@2V;xNg`Se>2pKTJEi2abyxBx zcuz=YG2;rxi}C0O;DBie6>%yDm?pZv?cm+Lm20%UGjXNim1_4o+4 z=S#;d2dcw2X}$Jk-N4w<8n7yFAu~Zo_!u$=Hw1yC`rwLmaK)C%feV+Fi(W3&XI^K? zeQtFd8ICpjVogBc0qOO|ZlUH(&fJ*CXHlHrl(yu3AZrpI70=?0tATB-lJogSd5Of* zWgT|8@VMT0-WWZ7*A;|>W-<`7Rj~_y+c1;vPhT3xI^<8hV$*e?Izc<3D?SCEc~@&n zxT5=lV>!BF$DF*UMwtU4(-61CAwcQ$<|xqY0fQtDhK&YnW2g^t9D{MDZA?$|(91N{ z{9ab67lDD(xOeB`5pW!iru{7p9Hk|DAY~u^0(4=O+J#7l&w$g#J%@r?@N+K1iFMh! zsaydAJAh-#hKi-SE!Ionb1#3%!@@_8fW*af3MVf}vbYLMrQ%&19?!VM$*bAyxitgrh+!@_J-jqP6wS=F7hkhHcQ!P*tI{qfZW63YI9kEY4$)#EyRw3e*If5TciQ z*KETdUsiUfKT}9avc2sXx1Qf5R3rn*%Rg~!gUzXD_0P&48R4iSGGT%Nl$yHW2tEiE z>pVz6kbdZJS#WtngvlXGLplFbEn)i;)}1jtXeR#KQrNP8CY$mZ8GV}pxA!2{7=`hP7~g8DxRZ9#X}f+u!Y2 ziGK7z1aomrdOKCoh2Pbr(lLG}C&Z{=^pr0%WY_4g)|le7=K!)h@v{Y1eqJZj6@;{; zLYZXeR8D232UbuHjOLzgU0tCDIC;RQL#}S_5H?M3lj>@=yW^e~ZF~zfF(V z@^5t=n*ARHo;Gd~Ca%ma8(ec20Y13`DZB3>pY9qS*3rzjW*fHOnSR9CN~(`|I;o!+ zNoWk{xXr*&6V-61bGJ5Rgs2qJUp}Y{IW@!K!J_IuAdpjutR6bT(gB39v?z?c7Mw$O z1RV(5xdsESqf5e`RHDVD4iI!l_aLjRO+8~90OHL5;Rc1DrW0GWJ($plEnr-7l-{b1 zk96g(#9`WZqwk3bW3KLrx?_%I16goqh34OK=jMZi3=}@*mhMg` z{!p@>?#eL{gxB7ll>5e1kqNN^v5#JUXJf4F;b zoz(4t80vC@zD_zR9M?9H;7}2x6bO-2vT87ed@sR)tOHaM+B(l^<#_iA&|LdyJ3A!7u%%ft-4yS;@>kXhF15+m`~BK+{qpjJh0B#Uh{JZDLAwkpWMz&h z-RshV2$d)!R0SJ2c+dd`>wkA_ zPn`+0c7_FgyUa7;Jk1peuI7IUC#s@mr(a#pzj2NDV}c>FOJKO7y(sW@G{u71`$zZY zU$%156X$kHKd=iN9dQxjP`|JKBn*Y&KRt53_MCjZiyhp#WR9nl8T#;l@+})+k9Hst zE;pb3l9@ewph}539+!qRn-a6~-Dm}+*?Re5xu}&s+8j`aX*T|30|X5K7Ei3+Wco?H z^*n%5$76MLK3)RL?KkNI8k{wCn;Z8PW{s}Gg};&0f*vUnB|;Zk$!0t~SNDM=om$6e0)C{j$!qe~u1&d5oL)m8^ zQJ>X34oa7dR%LD%ABvmZGmwc?3EU+1qkQ83+jz!!3xFnhZt{57mGlnAsHJ^C@Up@Ju&{<93=+-+@Virls=``Nl}{9hJd@{MaU7`Xl0 z>~I72E(5M2vA$SjfKk1XY?=thqg4AM>QSS{GmZEw$l}BM_nJ(ysm5Oys|B?5Y!6C| zzv5m}t&4aZszQXUlfvVQX|9&gU}2Xo)e{~Qac#xiFIVAhb-H2N^o@xd39`c2KLNss zT~MkdC;V3h@_CWzPuA9e=})fnmM^lPUX2asjZJdRG#tHEFCFVI>u3=@CLgvzC4RpS z^Tu^UIk1lv!tz#M0Hx&=!MkdAeT|xZ$oW@B#eC|itTWIBBeh``ji_nq{m=Jw^E+WzkLfG!u@& zr~JO4mge@n0K!aNW!NMElLY~}N}F)x2bT5L{J zK8FE8j$=(v_xc`~l#>Dk%sqdReN+kE&yvw?^FjGV3%~ar9YHGmie)D0lrjl!fPv~Y z6UIO_?;hsDl_C>ghn>pfQgdN)9Ggue){{A4DE~y`Boox}PujUiINqD4DVh;3(EknaJC40<1XtiS^x%ee&djR3PP5aI`+~h00(5 z4u5=+$Pm)a*8?8#CNT72Fcukv!5{_+_;MDLOlQx|Zh4pNVv4Pfq6Ll;fR2%P&>MuS z#B8-6|EPP>ZZ7dumbj5p>Ww`Rn?H(x4el{j(okIJ;yNa2xonWiu($WUZWHwMWij~) z|M%?qKt1+*aGob{OSqw^n9!D8+fg`=pVI6vYG-0L10+EQ_>veL4x{Gzp!l=)uj9^OQ`AgOZw z*VG7HB9**hON=d>kGJ-@`3ZBB`>`tZ9q2Agd7x_y+2*vWzh*~VnVRg9YN~^#U%acQ zMXd%!OsvwUNg!qvG$;^~sd8SaLuN(sQmIkiJvU>Rqse(9?q;}xF0Wu*xa7Pg@%%MS zLOt^4IB<{QClUa|&{(NOY~Y;w&ne@liApVTm!7pXaND>fMm?p7%832JyUtqH=tPS+ zw>2>Of)>$I5qEuYH6N?bS4qGw8V1z@ECqLhF0WmLQ|A%qPcoSs`1)j>)u-IoG$b;& z@eWztUXucNrRRc}>8Z`)YVq-!CjIFg-(L&z0O=t19_;ED~ijoUZK8haD;z?3A_ft%pC&c|N zji;Q-+lHMp5HOBOatsfq)GAPsF&$ah+^PG>7rN0H2!3};y|k$&X}R6sY$3t%|Irv; z&O<)fPV9&16>%bu>bT-(gX}o|+GeO#!AFw+VtSi?FOu!%pvUf%+`idGLvUy*7D{~p6YCXb=oOxSg(_M=JZ53K%0^&iZB&il7q?qM-dVr=U1QsbJbzEx}>Rn_0@9UvVr3OZxaReycBH)lXy%fH)R zzrUR6>@vO$neV^e@o~~x_>5^C;pgd&QYPy^X%N?b{J!2X2XPm+lBORgW^lYFkuSz% z+r2fPie3WPW#F+uVvq^|Ar3$2x?YnVWpi)mZTZXDe*44GKo-@F zHfyF54tdN%3e)ItX>2mnq!ubw4OPfBLs7<2qu>}2a=k01x>fZPKHDQ+vE-evT}uHn zD&QrLEz|t6%k=6hbxrRi&)N*%%|4UhSIm-s0QB@9Lo<*bRVKT!9z1<3#GgTaXB@<{ z4D$Q1T2u8Gsw^O*erC`XRqB)Mx>}Dr|E_+Etrx20F0r|%yaXQ_AG(S>Nf%nAfB4|* zF3$2@pMhI)It}isd3*tSrk4(ZU-|W?j%@}3s2dD7wGnU7Oa2UlEKHW{oe690V^^=P z8XT3XI7@D?i&ZY1s#rRj50heqR)J{*GN9Y%qd79@-FyL9PE^@dG}f~IKU~{vkSd5G z)&sg+vD#F7A>ed@X#lk`=cDVl>F~D_Z=2vfgz%D$wj}gZKG6 z2YBX_9zahS7<6ow+0_70t)Y%#TeVO63*?BEQ(!2YZp!zwxK2!g7#t+w3Xyr~KW0>Fe~k-`W`>f;@)>g{v8uQwuA1 zh1Jt!b@{XDJKZ%M7k$|#RmMH)>s%`VZqknvjRY>!p`MO}coDaV!SFA0HAz=d5cQ{^$FDnX6@;vYE=O zY7}@_1FPwBdbX{_&>S+(;R6LZ3yf+3g)@_O8bUpBfA>fndpJo4iJ76X4^=YjgSfjN zATI2$5r{p^Ls*}vx#V=C@ZZa_QzS1O3(KHIR+hz8gfa2;<{$8(|owW)JuzZ6kV}DfJpY-;9>}xb^KXf zYj#it9bi1WtNJ&r9J!1~TL?Qd2y65o99oXym<@jnP%8xl@NNiCrxP@FqPKo;t4-#4 zewb1LLM*?TF2TrC`ct__l$aTQn1xU7z6Z!CRY81LJ-~ruX|n9E`thxW&MPJ!Z{?RkaUNqjf?~7&}udm8Yh~BhhE2p1Gd2SQD*L zz!3d;Q_6<}y(hz69@YX=p8$}yVgJl^7(iv8t0Wg;fpcmGac88vT zv11^SUvEvO=rUH&cGTY$6pt@Vhw_fS!fE4Uu+;Pb*uRb*a@~52sUm%T2$dE1RAH4! zP}vjqeMAPWjykW?pyN93W84lTTGvP`={;6x2sq1Og*KBTTe%UiJPse1nx+%2 zGM->J5HLgS1VH-#b(5<*jO9)RgNp$1cQ}YP;^bWr@+nDeY}gDv5gf`yVf^B!{V`Q_ zVyS)gCIoljD(k~n5#MjIoZn&?oD>7U$n$r*)h3N@n>pnR;ePyhmxXNb@`_gVsQQL3 z4jO&J!aY9Zp`q3~(U-J&LA9{ZL+kd+U%PiupMhC~c(Ie3&5W5CWh`mM_f+kf1I12W zifrs3Ip2uxTdv47@wvOHI38zvOUS^OQS1b$@W1j@eD8D}lFFl>W%9*Vr>FJ1gPNzJ zBX4_-+V_z+XPyX2g`9bEOe(}qzo&G>JxH?XTCDD`8A}1*(B6o6i9-Lcb_PjNK{p({ zzy(@`x)l!hwZbGWD%=4GQZ#vw9d;XFN0Af;n+Z(agnLbl5Q4{xT9=mZfGGPetMpd; zv|*+~5y`9z(yXOkOqP#(&N!$1%;UTJT0;CMFQXz@{E41jemRzsgG%}y+$Hx+n&5SX zX==w#YBrw-dE!r%$1R^xi;k_7>})o_Ug&xK$aPFt&|zA%AZ+Z4hh9$H*rg6*r#8gm z=u3!`EaaW%!;<`RviJ4-1%dAcadYnCj%kwFE~))EEg{5vWlZRLB(9 z^?`BdD+(`g?)x8R%X`MUd#jDQDJvuhIkj`yo#Sbj0YYHYHPs2fwJGTF1+5&d7z$Bj zH&ME#sVH@&yAyn#`JnVwlo+fsJIN&_RJ5DD{C4_q0+{CLTx9CCNps#-QJ-;jqSC2E z{k0?Rh?;OWQtFsXtcr+xjL1{89e2s)K9P~L5Z|Q=X|p?noACTb=6KQ z(J#T?4ULMI?EY#w`DR|QwhG|`sjp$!K7t{Dwl+?<=#R}7c+a7yAA@m3LfaCpb~XeD zgpVhI@R3paJ@H^ztw&8QX#%TtfQ?`#ZJh5#Qe%tTi&kDc^FU>JLy05724V3M=!cnL z?S2Al7kF_wK(~upihD|{CmYNd>vA2zQF4vq+;IK}P=U|wse%Fk8PVxOKG2spZyt#} zDblG7M37rV4q@FcWAn>4r%90?+U(bRL+CG3O*6loIH*In7p!CTZKA1Ms)+k3e0m$( zxgC>pdbI7)I;U0&;fl7-eN9tHQSeN}7~Xh$kfmiBpU?5G31i9^Ag=nmJfilsh=QImllt##+n$o<7tlWW_{NT{my^XQu zk7KO?KM^lw zf#Xq2YbqXx^gA8H8N0On(SFo6jV?Q6p)6Pf+x@3&uaUZEmOk|0B_T#~2O7SK*;bnE zH`Ol0C~G?2i?q>r4T>?1`$e0P?c@GB!XM;H6Wt!xg9C+Utg|MrVP*y2L zh*$%oe-p#Ckf8PG#l3Xk^taug2_2p7X>3z!;j>1uMe;ukzdmS%f_8DY~ z)R82aa4dCgGoYU}M5<6y%a;YTlDoy|2d!LZAA+JHP_p9Tr+z}rBXqCm4pVB+sNDh4 zk8JkJ<)R{y?$bHEV>+$>v|*f;RFBO(eI%;2oOhcA>XaW!yUKy}bi26K;C5i)=nHih z4mRvUqLf~anX48vsmn)}nAAFz`$*+-8qwcK>=R5;83?BhX zi}{B%4U70RTXVlStBc180W7%PmX5$+3FJR;J%MVk+w7u7^26w-zky~Jo0I<5|8+@Y zdYgdO^W7HW^Bsj>(DUX-ou1E7*Y9IIEBRIkBB^P53VvR&=#8#&`#h=kwaD#G+;q!Y z_bR?}Iqlz9wYQnq1QC?}H)d#7*X!He=%g8C=WMvJv$KzxSZ8{1>?xhex&8Zu*UrAU zp}2Vd6Zj4ztGjU-8qe7a19{rrR*WA{eTwQ7T^G?)95>B7A0sb{$w5%lLe3a)qAA&HIaLR2rwWF!&%GxPHupnZl9_$ zCL4xs*shEv_m)XnFF^}fwCJHMR-~r=J8+t))_kAus>lJj# zkA+OzDA>TCB|B<0fFc+&4r8SaY)fVDWurLt9&$n$XT5RvZY!A}FQnH_`>qc0__9GP zxD6304#K3d7x*kW)jPeKUqJ|cEgbP-y$k`Mp~YGb5}*gHqz*XqPuS_LTr!Oz;B`Yr zC4@Y8x;Hd!6S&Hn%4LhKcVsJ+->&QOSEroHl8t}-RXWZfEDdV7G1v=WThvz_s>~&}Gq+?>`oqUpc>$+jECTc{g3L zAMue``~Hx-g-b(De&IJ--+fX=4A%GDv9b>?Z}jqkq9N!q`V|O6B>DLYlbesMOtASs zkak{Cb!HJ~0%EQ}PHHU1@c^~mbU}Zz4t^D*+Lt-Nm2Z%gHCT}~NC~8vBTwGf?3l-I zj%}Sy*IV`L+%j`6I5GCkNc>&&6KK2i_Kpi-Lbtn=n7?9db=RZxvR9t`H?^6F$(C2DX&e9y5TyV=3T{Pm9psUOKMP<|y%W3~+ z^&YUaTp?O`|E0j&^&laTP(ugwUV~A(@2dML(6I_LFP(T6t#wSDYP6H7{Q#wbxH{&e3noIBR?AX{nO>dtLe1J-AdI91R(nnq~nCl z56`}w1=hwsZ2eGkyBlWhv_ZafXpd)mP6;OB-733q$@Z7QD=yTAap-M!{jCjT>S*eZ zxYO+ig|}9DzQUhNyPYRlDu5c=FYL2`j0??h1AQs(7vqV@cGQ- z^LIT~VxQv;65IRN9l>J$CAT9)CGyxIZX!R$OCUd^BLl6aCt@P2k&y35ZAafguMiV6 z-kbVcv1&pZ3I$&DHQn>`PVYDLLp6GxMJwYa^h?2pgZ}q5p)OnVJZKVYd7Pb~++Q2* z1wV6H^+`Ot(<~d#ETG)NZR{dkL1}74S2$IK@GTLnOk*90{L%FO3Q%XH;;t~}54N-g z_}xbPO1btm9vf;fZbc>Z;{mjheyhEsZM&Q7*^04yM%CwqJUfjZivfAV1hIcex{Vg* zB>qUzLLH+sz8Tn{P}r@fIQ#hhFK=}x56}h$EABR|-Ozj>rhN?YjiY16dvWEnWq>wP zXhyNdRwJ>2VDYf}oRDY41@4LJQz6}bFCzp=KcD;21RDO4=R`8BHB}@y*!)NfF(mf1LO6|?+%-dO+0Jm!t(vFJ{ zw4~9T&)s?%q&9Ffbs(5Na@^54{MpE%#=&_@mRD@EX8b#=vO96IJBBhWkCEl!MWRC% zjm()P_O1Gpy)X{W<;-4aHallW>Ss32^Q~GxbS$-wCo5c54&1NbgJ(raXfO?G&fw?C zs#6OQ*{XKVNeg2IRdr1+bylQ^rG5GZ+NxANhRx+Fe^6qXw%^RTRT?8qWQG)Tq%QXi zxmGXQ9(mWDR>RmY-c^U-m0d)jXb%_b_CIJXeB5uOv2W26zEB(1)2gk}=O%q9N8BSh zlgzT0mCy4#d}^t>|7lhODddqR?l&-e>sG!!`gnVWJ^r}xIiUrRlp!}8C3(d+Ka#DW zZ~!pF%KVq@dAEQGA0HAn*Cma{V7)yE5FkbPMTVev^v2qObswcjDtfjp-MkstFwX!9 z@w)#4*lkF~IE*G&PI77>FzGzH)8`8j+I+X}j>1oMLL}da>^hC_7P6B-y{#DpqLct_ zo(ffUwSnV~N$3WIqVT)3^i{O61d7@~xGJ{r>SCVjZ_Hp?)iho_@4yK)jP~yhjJLSj zZ|hE!EySl~mu3&~0h`pw(V)-v9~fnac8V@4T_St3BgiYLwqwOiNW6RGyDB!s^=&#h z05+)3O^qzky1EJh=!H5xwJN6eP3=np+8u{CW0n2;ql3+Mg>-7BVo4wr>H6mQ;d?!j zlLt1;JGBIQGRAL=w`EMWEVoUYzO#6xgB0y%eR0g9?yo1y<2j58XW!-t5WV*g zD%QW_5?VSme57I+sl%!}f#1L%Y;g}Ow(yvL!qtbYrcJG4z=e_f8$CEj)72ih0mqeW z`k|q)(q}csX6jcqn9`be@gy)A|CQ}BRO%k-U{OZe6(6U9us95Xux!p;pZu04In&vY z(uAuiL|~vPO}Zc*^Z`OmJ>X}u=pnZ%+fOffkEy?V{`nQl4}llVm;1-8*mzgGRKZVA zzN>;Y|EB9OVrUSp$|tWqh9Il6iBzqnwd=Z#&*ATC-B`kZ3SiCFQZIZ3N(R5em|eSj zwnf~gW}gMKpfUUSmn|f0B7C256cEn{^jJ;uO1l|XG=18~%i>#XZHK7q;8}bX;B)PK zEQj>`7xfQqFsUy;t3A#=h0ZhE+`T$VGHpkuS0q(ldx$v7iIktonVoz zA5v&aptCp@MP6-3kQ4O>#u)`Qrg__!&udN0qgDua5Qki{Z~I;$HwEf=zX4&?Gqd(T zaPY4*!7>Pf($8Fwf*$V@a}8s8+)c~xtkl`le)u#T_mm6$xgRAi5;d&Un6(q5c-x;FxGhJ9vAc z=ZBl(LQiIo^YH5)P_{Rz9!_3bP)0p4uaq-9b3k=fuSxYiq4xIh$)JyK9<6&xgnoP@ z06oV>5?V9G=fd2#e>}nzzN|rHqf1J-SYB(4mDu{&XP|mE%S)vCuY9_p&|Ff1R_7i~ zuhg%DQu-e{zkK{Xxle#lA@_&#lI)+`399qXT1w|Oy3{ zF2xym6Ed~P53w}3(E3|4e4r+p)|*n&plZr|7`LeacF2Ic_#1T|pXI=Q8K$My7 zCy-g_>zprTEdE)D>-2!dSWa?2iLspcz=M(?u0n>)S=>N;z!&uf_x<`Y+IRv9D^qr- zjsMLYG)L23AB$(JEM)R^6RvXrP7YNuD@;44hZn%(3F+Qm7Z_tXg`V2kL0z^^e}mj4 z;9ppAgx+)ITqL;a_Y`%A*#iQsY;wizR@X46HD{|2v-ro}>ytX%4iur}tyA@c_i2bO$Y z{A1V@^uEpuYN(-Kfiu}}>za^ZPLTWiv3@cBK$kl`A{?^{ zxk2%wp9cjasBO0fN%AgCza4UO?wh{bat+BA(ZuszS{OT(WuI;TI4z|5heo#TR;gEk z19wJR+JY}k-Y*kJZJ&CpxQ#u2K@dTx%v^1c$$k=;j{D{mXJC&xPWS{9LTI|MP53Di zQsR0AJYxnB?#{_YqQfUIiRk32ZhGrW=tlZ^(T@|44uSn~ulZgaMF9=Uetlf~RtS7#+& zCe`V&u_Dvt%Mhh-zGT{UbvJf*u%j+{8ILw(|4ihZvV63$mP!pWy7XSaj#rKEWzaAl z@J~IM2GIi|2Cbwj;=TQQr!`Kw2MrLy2aPc8eZwcOn4RUW(z+G1$|`d!#-PzC%rdg- zS%SuEsT}WM?7_5`b;TH6)RDxhVd0ugmGZkUg*bn`@qD(j)KJc8`u>t?n&EnblCeZZ zK%83I&eA8C!+M0}(!$_Nxit~@fVXzh*)qi71k!Q$Ar?$MC?}@}l zhoEEl+=8$sUA>sWo4*8eCw^+SY43stC-8$=u6ZBhh>Fk_U+EHFbuS=qb2EH#{VC(n zT5P;-8-IG|<50o$sgpr9F#h#1DtKJ>S__-O0gYalXHRfv#*R2UyfiVQ(=LE2&pU-0 ze!zM6_dD^5c2*zMh@2_cp|ywx7#r2-lY=|F2XhlTI~`nh20<1>wznE^7pko?IZi9< ziv1wo6u*?5w4;l(YX7qbqkvfqo-vC7!c*-(+GAcHf=cRlTTZJk#wwDjdeP)f!q^S^ z59$aW;{MloD8)O7;F|uUip+>a3SZh(=LHCyeU6MfEg1odtTb!@a%ijV&D02*KE)_H zV6`ktt;zPn?X-$A!YU@A7SvI>S(v3dc#6X=`$As+5fQfhar-uR*jkGf%=`&lj<+iV zbu^4BC<2=WqnJ_0WTk2Ex$zJp{P=n>4tf!%#JFE+CHJ)@_1QpiC#6a?YW{;SqgL3# znSHr@nbARX{b-!)yT2VI?PL&N9e6w8m!~7uE~VMGQ#64t0_h@Cp|qjOMHv$GFr!;X zWp|}!Y=g|DqZ=N3r44?RK1e5-F7qJDX z@ooL#qPkPwgHm6F6n_+UE&6Ph%wPgb6pUDp20e z7{#OL?sfp^%H4&UeS*$no?MGw%H75q2@w4$tl5lU^e{5K9E8aY zUl-iEX@2_G9bkP`Ac-1LWFOW^Zlh#6505n24;nE5PG!^1o+qL6%=<`CFYAW1@4uv~6>0_hSab+(y#MT?I z9?!%4F=0=0|Kl-YQ&B%yod_*k6thZto3J>g68xLJ(YI7j!iq}n7CXbUEF zR~_7g7=6L@0-L!qvRb)9?LY^0C+&*GjzNiG!9cAld`o#tm*US&ZTDZ$?>0ao(7QWn zO@3u@o0>yvVf~xLY7W{#ID#=3k$R&wm}o%ZO8rB|LD@`lj9-bnxRF0N``6;{xx?EF+B zA1#rMh{?KU^2e#|yDsus%_#PQJKYYh>IZ>pnqHUeL5J4_1$KZ=cQ{EKb=<))u z4>3k=Lk5 z_@C3=28KT$zsQ|m1?LM)4p)uy%DXzL6HWa3N^ShGE+sA;(*$XDC7{7sr^Tp*KH50Mu>M2oeP zj~xpT+Fh)P+ax8zpZi8SF@+&v+WRNnVX7QCv&6s^Ex)frSHKY&=qV=3aBr_k!%_sV z1_bgxXizVNk?>8}#8+Q^*0%YPBEvI6TWVJXbtjQX@teF`jFSr2yAB=)R~or?V1688 zG6g5Dq^yfe&W58au@$ggpS%Vby0GGGuhJklAvJls>HgHRwX|HTi;hQMP{62v-9W3jbJN3~6s$)HS6%%T~Lx zE_JRl>kSIeU#LM_BR}dcVNDOBg!l&-f*%)H+8u5o9mrxpaq2j0uj-rzGjoIsmBy(LwV7KjNXn?~X}q{AG$ z2|9IH6=rI95$qb7cKLvc5Zz>i_?@LM5RR zl7mF4kd<+)QzB7dm-C3%4Gg8V#`ZAAyrKANuK4Y z44KMJooy5Moi&P<$JQEU!YlAb+v*_HQ69 z>u8Wve(&#a`Hc5D^#0oZ$dwK^k=~dn;<&rXt#WaN;ffPUUTLcNoBr~1QWuS{9ha->Hte_eD?Rum zT3*BS)xPwr2z499u-)^iU<5n*_~uoS6Ft%gAmkRTAPk9_2PZEE|JCm!vmRfgFlfgI z9w`1v4Bf$-hDBneJ!FXFKK3Ivog`O;HkbLuJ7@nN4%(ob?>MxnPi(JaHp&=x^=z_t zFrWCS9d7OjRd0^J;Oc*Sd~4i7>2;&5yhVAJ*pHQ6Nx}0RsKdU6W;Gv3a!n8TuVRb# zxHfrnVE0uE5TwuH4a}}+&tyHyH?y1bnL$36ohwXFZnU*gE59)z6uj|DQRndf-uu+0 z6ig}gi;b0d%L=4WCT>#QTaecQu~93MIVYYCG;g#d3il#%fT|b<8$5O?jM2W1TWqf% z4c&P+Vdm^+UNl(&E2+fzXxCQFb1yMtWKgKJP7=M1M5voZqHh4`>x_FK91B>&m2`{i zsf>J}V;H$rg>mwm1j%3DKI~o=+2lsN-)|Gj1VKlAL<90rs&8YE%)Z@{?DBRB)^t^wawKS2;iK%^UCH+`66@rz443Aef(NU%Gc~Hv)=_Jp z6l=?F{1Y`7S?!sQWxF0-x%g9Obp-m0{jMhQdRmC)+%n?z6zYp^Grj_~Wvhz%8=>Gw zY;XNB!Ky>5eiK(S9nRu#tT<3{*^0>p;DJG?{8hq$2Wk*i6L#Etcfh!N;El)~`TSG4 zP>*Nx<5X|jLFh&@=YqeUpbqIp{wXOajp-{gbEn%5pV(g}WM)<(Kf(Xk@JO`EIKIsh zPlP-XfJJF`r4q5cHxvwwAMStvim6&=|&_&3s&HX+*z zQp+*Sq|ZB#^`OZLOnuWB-bw>BH1Ga@iN-stX;&xb*r2nRcKdzQ^xN?F61QhXg|_T3 z0w9=)+&%`#?Mtq-yFUkC6jWCo-LgKe-$|%}YDJqXB~gqPkssiI&G5iXE?aGTP7{V1 zouQx&W6sca4@`Hh111?hQ!Q}90sLAx$0(p+c14P|;x%lrQa6S%UP=mhX)82McK+Vq zEwUyzaQOS)0zl$MQdcYJs z0;m8mBdow%1cS|dVs_lNFkF_hHFYZJN5?=CzP1d5hUBSAj0+4s^}$e5#iZem&YWZ6 zVqx~Vm_NTwbJopSfX=4`98Bg9Ss0_ujqAI-I~6?!7|y7mqaVp&UPXvL2lF5_V7bQVvoyPvydXoC zj#%$)m*2lbuFh_|h(gynbJ}3@u}cyh>Lf9(Q09=sK)YFb*?@L*e(%+2BA=7!<7h|p zoBwwHRcI!)L6;uXI0ONZk_KTa|D^a9-=b;E$C1Xii6dKZY+S9L$SxS=HsV zolVFG7rQEd72UcV=B}1o3xIydeX3IVPu8!NUH6KX=7>^!D{q);#NLmpI~!7bHpjl> zUZm55i%~aJPUzlxe8sp|Mf~|gxjw~pA%XdC^?z?~uK6hVaWxKk2FrQNtT?o zS|b;FsR${t@%PHjOvUOg7)jeyTGgF3{-wI#e}6fi6BmC*YbGEs7#*K~OWT4)Fll!o zLfMwRt_onKKh_zne7mh{WO}r``n_`~;YGYjbq723nT{&-QL1ONJAC_@&aEI&Q|wet zCa?qo3Hyno8`R&$dIuUFpQF^>?ZSw2G~MLutPV~%c<8i~#_LN3;m$Xy$6n~szT|~F zw}2^k^fQ+CKZ0c&4e(cRw)m}I7fh~k>`%Q?2Cz;?zRl-HtM6j2jzsmf(Q-D)KiXNd zF$MNnDl`s>3{@_d+D+f*XA5xsCJXrqrqr{KQ!FYkD)W1VG*z z>k>MFlQlSKxBif0{+*9o;~Nurnio|M$H&(A%`x)VJoQCjG{C(dq2dDTXf6lnuJ0A> z`7-!S7hD{9lq$S+luX%t`=5wq+>4tma81t5_(>7=13Ch;PSoF0xe2Qj~ z-WA|+Jjj)THk@ZtwV-kZADyu4FMAjMCng*%gx-^QdKr`bMEd$J1&*fkLF03TC8OaN z-#DFedgi*?;QKc5N5>5fq9PcKvY@V_Ie7e1HhPtsZuD9soLlG2jp!}62f-wKX1L{< z^IwjxvUd8e$a+3%6wDp>GBUY$%lMJ0X9GACj7kqK=<#5X#2)lJBpNVFP_sT?QjY{_P z8frIYsJxOm_YW8?O-g&HF!@W&RW1fbCN4DaKE((; zL7(vf=+{r@b3eKJY4T9phY4uD9@rK@`2Y{tR4ZSJ4(QyD1zRR_3vJsLxNeTn71g1d zZf?Ok57T`*`wxjify^>A2GZ9zh%Gp~Ox^;Zth-7%VNJke@>qVd(jBY(b#pmA zj~SiSZeyswXON?ei_j1ah}W%P{@i(+x@s+E%`5Ry^e20<_f@V@LA)EB8*vn40Rzm2 zhT(19Wb;~wJvWp%ul+jwyT#Cf?=T^x?82HWPKH;$BR5WTq~!Nn6&@bem7jKOP>jpa zS3Q2G!VxA~*fOCZpey+psUq+Q>B_10B%|KDspV@MC={9Zc_ptTyBEnN_1d1YDciA| zm&B*59-p_nr~Fw0sr*G^ATGVh`OMUFk|<@G-R!!F?BtsOxr_J}C5yZ5UJ1?@Ebg~^ z(e4YI{E=aGrml7)2X5awzs50U&EqVGqJcH`v6Mx-u1s%j9H^EiK~G^Mo*C_4bb9U^ z;8ntY-cBi;f>%d9w5*Sj3eih%`|?~@er9!J+kq@1se-Gnu^LH->S`MxFxA4A#TQKW zI#nY`VZsYSNyBUZd|8mA+p;7VY$JS+%i8R7(4OJ=^-KTYfzNSYyxT9iT^QINefhu; zAa&09=C@k5Yl~7O?BA+vC5--TlF)h}2b-;NR68SEW>h1Pekn=`L{j*fvDVUOe(^}N zNn|?4Mx`eJysX$_4&a+-G9?Bx(~GDSmzu{Bo97~Hg10O_D7C$D$#%)BRsOAWpycCq z$X!SOT5rNo_qb5)=AM=nF6XZYBoh&l_C3MAL9z))vNnp3K1k$bb0(8lGG!m*TUcpy z&CV;qYEKWI7v9&F@J<4*BYi%c-VAYQiqhh+9hoOK@_h;&1mjIyZG}I!XSjw*to@0s zbWDg!UtIHhpk#pP%vuFNiYJq=J=hN*RX=mm8g*7XE=n~wVcrp~@!5Le%I2db6Y%!o zKXT8`e%*VTB#JEw@0Nf1VOO{X3f4z1;oh9_?x_0@+_y?frJz)kNATVVITr~TQ5|!M z=^i5pA=TV!ixM>tXCU$=%a~w~}Vc>tO$CogFm_-*>y< zNBXRoUKF{IE~fBgTrm51=TA`;(+h_jj>SQwdChhEH#aU5PA}~&sjJcf3L#OM@Dt^I z)QcxnaXoHgJ2z?V`^JpIXXu8K%%J2d*@Bh4mG+O!K%H*Zxp^)I=!FqQuPr?$3jnbR zWHfkMN;o0k6|4(^BL$4k_gk=4Z%Ggl^Gp~6b z$wB_lcp#N&1g?m+CyVKLQ+6hL!i{rTtj_L29(V6^L@%OZ>l1f=mAmWyTT7dK5YSll z);x_Mu9b**BIQ>P7>f2n4BDzEl1kys6g40#18|%M_QE59rl>EX3VcDO(!zZ$MG?jd zcO_~c+ve_hU%51iI}E|_M^FUXW5mKdOXUnv@$?13&nmP5UeI)b{<wMPq43q3fCC>@?S&e$pWy+4TYG;7sQC&S`b+uP6EW}UuUP& zI_e=4IeDWw`g2T7adIXklS#=UDH`)8EM`Nz)FXz`_nVF3h7!hPy$@mBTtTyXA*>Z0 zXNHx}do+7%zk#$ecNJGlb)K%ho}T)-QkRNubvBr)@yrwZf2oOL@n1jMuT_x-yT_l5 z4P`}SCRTbp`||`de-Brw$D55l3rIa8*pK@+&a|I?_9XWkVX&j_yPc1&p(J*TDRf82 zmQ@!&@_F_>!K$nF;`96Rb9^TJyRvArQ{C5eOjB@8fcG7;D!Y6mdfxfO@0DR?#FM*y zEgK1n#1%6@E;?WFqW)z;^yuHzXHsJ_WRMxPc=SWPh|94L^#s#rvKGlSsg4$g=cnFw zmg6Y1D23(-)`fcv&ZFE78qKeTVEiu{PKwVkv5;Ep8@>nEPd8j>V|EU?%+BF#p~So@ zGFsa5_-5CcEbe1I8t0$>Mg92J{4JBI3X%xyjR_W$;Lg8vK?QL%@XMvfl?xk&Z$r;? zCBQ)?JO!#6Fy<)?es+3tq*IMO{r!D|=(6V4gl=)207oxG?ETslCYk{zIE$dxgi0s| zi2INs8t|TDF1iQOpX~+OS+nQ%Oso$4wn+?0QDek=l$^2*v{Rte2ugUDtC8`M^V`QS zEoI@j@zw{yGEI)5L(v4;s##nKqx%zYjRm^6yH4)?)u-gv$H7K!R_~v_W#Ytvo|^yE z=zrBD=e93Qr{*V%m5pl*brEiO#Gk|excY3n&(QQ)iX;6?BPHid=Tff9c#22EUC+NN zZNE$9QN4ZOLxloul+MtGEe76Ba3P2$@~s#sOok&&Q7$6eLb?;q#5<|Pr27rNa42P) zeAx=DMr!ciD`pKANa&}mK$C$N=zl2ksO^BIz|L4cE4#98kA}R@k0ho4w?=@zSHTf z!gX&|ZxScgQRgR@QQma?(h!~6e$1nRoA&*Z4mIna{gSDI+|{K-*36+Sl1x;MlO9P4 zswIcrml-n^@p}e9t~4-%DnyKn!z{OM7@Hmz16d zB_q8`9a5cx&$RF*Z;+*o_ph%vBsJ8{fGyrJlXwU4G8s%>rok^)3A4Y9#cZKY!FK+< zt(C}!>^9$zI;3-pggVa|1Iw!jkDLkWl4o@3*3-rhx*sy>xe`r_zElg4>AEuu_D){+ zIl1pPDN}ZsTW-^Gbt|1qCx$;lmjW+pX12oZP=Rbij&?^OWbTs8r=4q66XpAukdrXR zooxru>20Bor^`tp;pXXe$4X^hccL@_ds$C<+ZhZmOm*cp$PVRk> zeqY`%pRBl?V4G_hCyMJ?*Tm@oHAuAY8%K1_dTlZiFrDB9*UaiQ%4;W6IZ}N;zRaw# z8GztF7!YIOq4aPWyzpn3?;%=Cp7*#nYK@?N=)@;}H+7V;%@~m51C|Zgf?1gFu-WRb zrm3@9kzW64WJY@dG#`WCA`{Ttx@}~^R_cd|t#fNm(E)!~qzonhI3d)LKtIcj4+la^ zm^s2@2M4T~p4-k@{e1ZG%uf>vN7R54QLF;_E|ZmAHrPy}RzbF_HR3)Oq^tEifVPGK zv^BE}ZPn}STlwKANEz1p%etS-M*Pk_H(&mm^*F)QB=VP>LnA_qAA$#}*fd@48a)jO z>PHk@Fa|h53R!Tp%*O2ZGhF@1;*Ruaz3*pK1}q(0c@?qj1)9wkieArKF=;}dBp8*( zVkTgTC2TOo_C$?cKfsU4-ZvLeclYT?z8$CPU6%}*P82*~DqyMOU>cu&KBXSaP_#ydln54 zm_81$D!h$m9$n(LM!`Y~Oy?v}>&9V8?>&8*MkOaV;R4$`&YluWU*G|*Q6%!Ox)pz= zB~mCcX-}B|u!XI(2xHXC)NmT=@JOGr6%EFez>H3V1#CM2=8;a0-e=`cHDGvLPo+X^NdMCx{nsggtCDO~pZo3`JipZGe)jUKc`xrT2O-Ndtn4!} zu3@|?@w;Nkr1BiBdnP=%4pD8bY~9jyetLLtPy zi!uq^dD!Gb9p7-Bj=O5TrfWiZ%Z~%IMxKs#tqLzMsdpp0P+0JhY#*Z4xdb%25_%t@ zR{nH<~! z5B-F_C@4Q$uX=7FsZb06I9CB?zMDZ>p~>K4C4mJM`ybuuy>`+EVM12Z@9tAjnj=s` zInu*@HHyNjw|)jnjwS?X@9^!2F*<~I-hp=*umiFolUa^qA ze*UI*+S}IpbramP-_|pI+YY)j{m<>G`;^L7vvL2kHZF{v+pbPTv+v(n|tf z46k!x##WR}q`EIVv@^+yr}oqRArnrwcP~#AZp?OQ&!11;sz(03 z5MLJCk~7$-%O&Ce#VvOgORjN=Xy(Bwk z^WjyLfD((IckRtz8wTBn8WMK3bHcXwRYaxu7pAZu4kei~hiK_o#Y9;q4eV&sT^9Q$ zNDLoU6)rOmbx}wdZMd(zG@RS;X&0pOCqBhxfWu*+pt%_J9>ZBv^t3l6gI<5@eZ)$# z;rE&}^tU?&*o1WM*QzdpD<4mEvPsHI`QPREACseyVNUr?v#gEhi`7 zQRz8qrDn;r&x_vUKx=K(tcU5(S_ZX!W@p^If-V=MvAY^LC#3?0Zz&9?e|a_)p?TNl zaioHoh>&E&!N;+l85^XsU!#PqAg`7S$!`-X$?b%Uy0cy~N_B~L;rp7ddrKClrk|@q z9Zr8N2i`b`M%Zd@59bt+GD+-*!DvUUF1IUt0O|EzXQ3}S_up)5>mRg7n^(R%mQcIz z-h0}sBOd15baAPCF!dx%uWtH^&)_&My6o+XK~<)rhKDR!o}}3SOT$;LdT&MkY72m_ zJ`pL;>yo{}X2v{9s6N{w-yH?T1mZa)MnZF?6mozhz3S7Egy3>7d=qho0o$D zh56o}uVtoXuClbUA82a? z1IyA;v^Q>|)6IDo%{Xne4yJAj2uT|1r691tJ}da-?ww4>$TQs3hx;s3b#_kfOnh6A zUY8(cz`&{%2&$>;dR^oFds=|UB63}wo<;VJJsvhfyzZAy$j1R}c?*!UQ8n)J_(p!B zSptNNu(tf>Pf$pD={;u@tZ{L>y{y>-tOmruDvk0|C0%>8%6#njTcYyS&b9hAsE*67%kVk4ws9s% z@oeE0L8T`hgx=PrdI!~FX{eF)QFSr+x7Uyr-Ecymr*6toOvA<&tBg9pB-2I4m1TcE zoHJ_9z$LBaZ$LxAkxC)A`i84)Py>a2uvV)g*QM8q0IM+oz9$bldIznMG?;5MVC0Zk zEhytnmo&B7U5}924I5wwSlj;5#Ebu=**h0Qrz5E*rXYHwGXED7(CS9Kf^7FWn&_Rg zQh)kI0>^Y+YqmYTx_xyfF!5pIHzEaxn>CT-vfP~KXO4R!Z!Icr_y+`l$Bv4i>>s*U zlXL!+CIR@Oib*1^Luy&BcA%&adKr(`fae_8fh?O@0fx9>FJ`0HvbeCeVrs*lyMeHu zobTOog#2t#oSYtzJ?;w7c2UdWL7hbVs{6_pTRzsGn6MwXJ5y}eV?sCOYqBTLxd(2& zP!Y)ICUBw;9R8Lp0kjZ>(bQL@(08ITV`erciAR2(5qQ3(ZJhW}UkJ^uuPxM6Yg*L# zz2=ULHYf3*GZx;->67Ie#!aJ))zc=H$KVv{2137Uqu$VgXhz@yR%5hX%ZlOZ*Nca3 zDriuw$zp-fO@+Y5I~*w)8U2?IH%^*qmRV#HklA4BWCP3Tn zkeR$@WUL9$YbRA7W`OI_;QV9{fi(ILt7-YV|CSEryPv>8iaX}Xf5)VDXbqpg1Lr0#>y1MSlpjXB*~SB;4}H`qnM>hzV+|g-&lN`ZJSzlN+qI=1zRKDnj6@*|3uNC~swirC2h ztO+{iM$ilbg?gq}ts$vIPPnWv#KlE*=9h?U*^&NEi1-Qh;DpzxKyTHNm&qLuJSVO5 z9n6cqzwh?+Qf$c}8HbU5NlR$8QD4NbS4^gq#y&z(STwM96~*%OQnJ|~2F3s+{nu#w zf_7vDzoC@4<)_#;_sN*za_e!2ZmJu%_-;!bgax z)>ZJ7p4xjr`J2`#$9^6T<-mhyll#&}0V`4~l{H}K0*z*gE-o79B%SDdbOGvd&QY$T z>}k}dYd)-kDIOOoNv1ER1i|KN08|FZjy1D!AU(pzaBS&`LOo_$0ayk&vyJ4&b*4f< zIRbz6Xr;J+Sr9R-J*B$^xp7(zTFmgTJZt^= z5R&1HO^7#moou3W8Nc?dlSQ!S;S}^tW_HJu(7h_z5=}=$qS8;m0_1(hDdX;(iH9)i z0t7w@t#*(9crq|qz>{Hu4ZMbIimEv0FbolYU`Ah9<``SOuKx` z1$=>T`3IRV3nTY1i;Tm3K}GTMrgJ61bQ%;(k>qnZJm7fbA!NJL@kn6cz@x|$l*6AQ z#5yg*7^e)!CrtUE{zB++b@&unkqJf&VF(7%q?`q>tq8FNDVjlUp*S-Ff)HpPJV6Gu zD0uSQ*V`6gE)uS+Z%i_JYxj=dOo_YTypC|J1aX_JfjG$Ip$HoyeUyu`jCEd*NtC-U zt+nnhCMgW~Uts?-M!RZ!{R|v@aR#~n@!zI>V(C*SiA$lZ2c8e&6Zt0V*x|| z*qW-m8eLU+k#yH%`SnoQHQ>5A^M83fr={t$fr)IcfBu5DYW5_M2gyp)92+DH5JlLl z0{2|!_KKQ+yVii!cuhE_MW-Sflq2$9x=39H0nf1}fDP&xr+8-GM`bW@g`I}$I z0)3XI?euLyVBTuKQ8XsTCic|hif(f7JLr>zoWk-wk1$&#Ic2?&;qOYYCwQ|!|7)9E0S z)Gv}6vWX<5{;EW9nT563+?UO)fxC{E!`#pOxS>?n@4d$#E_CpYU`N6`gQf|u(!Rcx zg;PP{wr7Gu6#a@xwFKDJ^5dDEgTbg_!Tu}zq-go1#ew2SODz@DpRb(zM!wrsY)%JW zusm#V+y5Vl!hd86vp*ZB6tDKqxzWoiFy=g$S6*!eV8?{jC;Ek4XA7p~KJX1;#|}kT zdn4<4Q;A{arEhos!S0Aqrsfx?xOXJBUU;VR?91ztqwm#qc8=|=Z7HrxxPpT2mI)cH z6CVp}0)DF;Fj5D?$N)!nghGRLy7u{F5RE`I&2UNPDw`p69&Sc6$`lT;&kYX;3Tvvf z3ToT!n;aV;EiJ{?S5yt@0HGdW)qet3-OaiN{X<+ty4FYEq@X|rt-&$Bk@p44( zbP<|%?2nLyi&{_g5mvBWnufo1X6%HV1Jko-LQmR$ErFfbQS1Subt~;~JcYR%TUgto}sTP92QW{m9phkt)L7l!Z_ZKp!C1e_WzLvpr{PCpzfn}7-vB^|XU2~i`}V_y$jOc}F8795UG1s+4FF;;TLpGUbu_H;2ip!v zQqEozX1)$(-co7ZY*Z9vQTC&(DY9Vcjph*ZRFb`g5x=Bx_O_#Q-~pFNNQ0(Qqq z13kSJnA|~g8YNgD+?f74Oox{p#bFe;k`w#~VIdlZL2~$5igXu4CMH;pV};EBRU@JU z2Vdw35=nd7b|U^!BLZrun$GJHiORcH-Kh}5U`yA;CO}c6&`FN!|8heBxIuuh^DTcm z4=@H#u3H6M#boslvLxTh0E1-DzL-9B<(KjXW%AsWeYc%5d5(+M9uiTRs@?ksKg0SQ zNZSrUb{5^veq@<=%&FKr`05LaXIj2wkf%kp|8&k(?0a?Y{b{_y?(1nbUd}zRzahiv z*X8{_VUpE24IUmd0XAH(^*{a!lPGFLTfOHkZJd$$3yVq+kf3?=NH~_=qC#g=Q1nE) zXUe&G-dnanCpNZoXs5`GC50JyG2v5?BRL!o2;r3N)E`q9hffx0Dz~-#j+>M`pc@@U zFV7Y_qmPnc9U}4_h4>cqhOa#-@UARpWpbz7OxGZ=?-BXFO<63}k*-YiTeQTIKj5VA zIeq-6k#lm5CS9;nHg+e2W5m!jFn>muM za0#D1|8Y|6`y?;eMEL`1QTKSYvba>jnOhQ-P z^8R6Ili@xtt;)?V&PH=0fo0W4S8gu%>8AH|S)HTW0AG@b7UvxU6M1w0@txbxTQM_1 zq8AU;`+AhomDkqRD~^8=jHv9KxR>zkytV}zJ+-oU`nNuIBNzmOjM;;M=cHA4vOGP7 zQ#RgSq`X#11=n6ICHY_^%6>rHOUw7HCE-DOXX2{3q;dTaa<%GiI7i#o0WI^0J|l5v z)((*{U^4r`uE*wYu*;mR)c)iaW95}cGd~)Byfk=CF{)S+PAg+?ih788x6pD&u-_@} zF!7!M|N0qKCR%oa|G9!HbD7-1uBj<3St7#1_(O_=S)V(qc~{<=tbOqenDrNb3MIaH zJj+yYk3G9TsA@Q{zx>;<%dMMNat+<63;lc|Ps>iY-J%v9I<{U_{>!#k!`V07oosmH zO7N_hbNTOCAqASZu+5_FSMTV-?GeDe257jy%JtXOE)Jm_w5*FwA|0)k&?zv;Kj2Kc z^$`qK4D^OamuADS4Q(t)yu{M};`fm5t&jCV?DwvZ!TgR`b1!jEj~flOv5Emq{Y2X; zugukN1%yNn3qKJx^*g$$K`EUyF4;2HdzI5ND4{cvL2qW9+ebjinyl=qrN&wO1#BDp1>RhWS<$y)@T zVz;E@Xt(5wrN5%(>Wq*b7ZB#8X$2&0-PfEX6Nrwc-9SNq?s4(rkq-W2nkbEmBLb6* zybk}C=ISg?T}6lgU^F3i%yZ?OW?dERieeYYwu7bVFzdB+dv~+TqiE&FHNuvCXp*B} zXU1lSnxSzM-D5$AdT2VLD7afPP;FD8rY}ci77PA7Vj7H8u06J0U<>O+*)I^xCOctL zRoTCZ1rHeS3j`S`!@j$P8jf=RLjsQv`>JCyY-ob= z#oTKjSNad8d3y=BJ#i#}T%0V;Jq8kHb{oW@9mD3EjDJV^ea6kWvj&XXj$>(a+2OGyS_ zl;oF@WGx62YUo$N4YQ7O;}y76Ee2Efa2hpv%sn22 zes;-h)_mQN9?vHMzDDGzw+8(F;!|YFHBI~XRvwZ(dYzajzq|Z8G3P<+%OXr$jXoEY zdHeKkSRSF7tcER30PzVclF66{?xky;r~g&m0O%^efT_Bf-Y%aH-?!>24L;Gl4bN18 zKdZjE!kBjx-p;+k9_s!JVIi8nrZ6pF=_}Zebp>Tj`OnySsT}LbJ;r}E{P$;{3c|U) zz4zva#UMk*IhLhTGikCSBo7J*b|B0SGEI!;@bS=oX_Xi8Pp+Z#b+9TtQSdzk^{~c0 z4m}3>p;q$0Tv51Q#nR*GPcJ1tgYj2%@3P{W{KF7~=H;!lRM$cuJS_hUjjdR zm#Wi|d}1&g$S)ug)%zE+BCzH;ZJu?Vij7b)Epz!XTsQQ6LjlM(2euEdpBc~Bp&m2E z9-BUQoBd%9gsqL&M-fYN#L-?A)!qZNP|Xjtz(v<+%k*~|WZrC;{}L0HPq1?ZNkAzr zK#kpp>eJ9XoVKLYc08iBU&xSu-Tm&rELA{@V;9p zz^vdpotVUo@X_{gYwefv`{GG^Y>qlpJU^cTk*!6TlVwkoS#-|daqm&T2-vYsN#iA} zA27_-z=^JzvjKKXzo%HoR!}3p)T*=({ z<2{YDxZiu?>M_$bQNBshg$Meqm|{@yO?<Xz7K1w!d$wbB(qW^FpQy`BV%MmEChKLsj~vXF%#1v()Gd&QT9Az%Fy|EchY z{oTT~KE8l^k?KVMr@WVH(GM`ti;s{XpW-K<^tkp-Ingc<_+%~Cfl|=yGi6XO+2{H! z@PRnOZmjp**>MMCRF%kYV&8t`JetDoLUFGNp}oPlEQlm-C6Z}`&CJ07Ulbz{mVS{W z@?26`CU}$*w{o&KOhQ_n2Y^S*4StpqA=w(z z6~o3AOg8jB6ITb2~hWg8)mwghmRxdtpO zUY798zyaXZ-?d0m1%43}6gyQ&WU|WwtuE5GGSJla(@UumTm3h$Di@AvkDYA~eoe~D z^&N`^feM*5?a@$~cudj&TQ<1i4FflFs>VAd?HB)ht_=on`M$SspKO})5s6dq1B%JEVt_Pl9 zpJDf|%CF(`CJJQ#1@2ts(#aqFQ`F8qWSP`={Ha!wKm{oYgs_fkvt=V*3 zfc;6TKj2-P$l|;0hENNrAUt(hR^DW|Pdnx8_glou?DgZOQ4zC!MIy6uzc#&xT>aV` z*M@NGy>U+hsbx;}@Z9~yBqD|F%M1~&UT!Qzo_DDp^~JVUAZffSkcocW#Ht@Q7A{1I zg|GS%)o8b|@GM;J->XxC4#?Zd9r8ARQ^zI2@xFN8_Y5u;4YVZ6M$HNINwIYalx2=G zA{E=}^Qpokf70iZirVzrR#m#f^bLIt9cx%8m}CY%M!%|{@MAt}FM>iOCM7mgjMOK5 zt?K7#WHIkvbclhgvI=yG074Gebd#{$Vv`1eKLP22nMh(`09KWX!N?fpYZ<}<1@jw{1E5JHsn}NO3q07;l2^|ixUpQ8nVc?$T4-Z*u%u`6G@fv zz^|Exow~;ip;}8KBKY47qIwb^eVw|I<~|@pNjcyTsQN-;4L^REame2-zvdN$h_B%{ zhwk`29C|l$HQMQyvyxKhl$r2#6Xgt2yC;km@S~Lk@wPZRd`l+2Dx?}=f7w$0tmFyBLqsbZ*J$jpeVM+@$Kf?7B}q> zbUih1+7}KYQ~uu24|L!tke+(#)IGuA5PK>!q|*7=73hOLj&vv>o6dl~<%ROmH1-&* z3F+{^>4y=$?+V`4bE>|&=1I?ZhoWAl3n@g%N)mB7eIX3%vlV$*#t8YQILG0nY+ zt~(Q<&1Brkh!t81)%)4G;d_UFwtrZrnWI(nHT`A#?DYvD&$?Sw1@VdghmL&&Q+x~r zmqdAbnBEGv)8bwSdjk6BN@m8Gi+|H@shGTQWmQ$ROo;uCa`3w9m0yR@Po`g_pI5=y zv+7uA>q93wt1B?!tUmuK1(V-Oc7RP8-gaEzOlF=~j+G*dG6Df_kBTQ%NW zr31w30EM9|@zVxMb^q(!RBdMsdZR5%Waqotc(VBnC16YJe3MCOSda7+beWF~UA9W^ zj9Y!42*YH4#tUIe%bw*u@-f>=B{KoScTuXH+m&f;S->ugbw|#adaUzY+ZXMBt?$_T zk5;?h-3lGA@F2p87y7Zld_SenOzC={DZS<;Sf_#~MpowQzBamwok`TN<}o=MWiXH; zs_g!7P`TdQeY0{Q55JSK=DT3k?iJ9g{qX0f4@LrTKOlU+Ta6(Y|q0j z%g?#WK2u+-Ju)l&k}Q2*XkP3a>q3D?yKRUxk9cB}Liy<{+W7Ch(a})X+5xNE%deb> zs-q?taVwY>+E&MzOpLy-5;P_wQfs4#;d+a zyYM1<@ZI>@oeTPmaoWYfBn0L0OMfITq=cZgVo8cvqgHD?f4dti`W&Qwfvctk{|=>b z%jX(X^uM&&f@?0!KIp^lyRTsDbfIuPwt!1Tmm18S4pMNINLFu9^l>B3|N4ERHjdpf zJ4J(Le;HpVRwn|5UO1?=s>dqj^QJ2hm2ZIA4Ct#%HWtu8ETZ0&@DxPv01k{l_ozwX zGwr&$lWb0I@lDjbcb-X>J$p4h;QLu71GZ%FEd%BYGDy^#9(ocwBvqDB9VlM61}t`1 z6S%%XEl+kY$ALg!%_T$kxiy+#w1_+%<=K+~2FzD%5SAh0U&--aYs*){pH^jesPT*n zJ)~&ZTTG5BKE1G4Xqu_uCN=mw?o%nHByCYObRf`d;I0nr3wq7TwT zIG|-ERZ*s;pQ69xe^c9S2YhT`V%c;z?ZjQ zLd%??DbeeVtG+*0^>%(DJ&O28e4^4AS@-0R#vy~!EJzgda=GZoHTFj4&AU1tt78%& z#M%<5%Sh*wcai!jS3pYI0q@buRHbiOFO$ut(NsOIX3JqEi>#N!z?Hey0x8?lEcyE^ z50A(9j(PO6mQLTcd!3|sVq)zPburaMe)9bMsfgR3)g`?i`YM5d8CZeTPhYO-@^8$f zHFFS2(|f6jzI33TG<}P-HpI*v%2oFV;ug1;+iREN9p6Qzr(r}3zN_FrK|A=qHo6|% znQUSGqtLrK*}p%daYu2VX=3S*C+~}16@MxzdilTsczUD&M`uE-9NJ{KEDKl_Oyleg zk3vRr z3p&VV49IQ@)C3BE{PJ`<6Pn@FFm98{s?P65(kk-hyD~TZaSZAalsx!W=EbEp7Sj5Q z=>pmftATp5YB$jq6ioi=E17$H%K}pKX4+O7pf}u*zA&98WsppHZMk5yN)!9o6E7du zw++?KQPa6rqg*-e<1x6ga&&GG@r1I3@ zxNEqKLvas;oGne}FPRb0`DO&15E~L5W3G_~wuHmfyZ)d4r|f*Kyq}mF3o&>q@^6ci z>^aTklo4sIP)E=k>G<8^Via}E8On0vOWC_;ERNfv1vPW<)dSv%KknV_gUeUX?(aJ{ zQ)U;n>k&+sy`_pkct{=_eY2Q+Jqtf4UuJJQR8({|T21pVVV!9`SV?p6Z0dbE@#X_` zGW=v~$EFcCb*15!{;uy781)!#w3b=Wg(LhQh3TnkI_C})w$w9}DoV~7h#Xd2G3Vd3 ztB~k@_qu=+|MbEFxT@v` z6T~w+9om25sBK;HU9#|X&^R!CRdQSyY7evLt1+1m*vBMAED1ca6W`TMZp@~qsFy)gVAlwgU)lT^!T-oJQ zNu_e@Gva_0|5y4mQkRWc%u9`7Da$LteiB;-eU4#>LP-FAp`VkAJ-#-7w{2(FskEBu3t?{&>ml zELhwwjosd2e3)=FTTv_gYwj_m=d73nA!4^5$<95b5JBG@BgSLC4H{?>1x4euhB=Mi zu3ldYT0c^RHK%bLfp>*SS0_}iQ{YiDU)wVg3p(b4o_E`9P|>tfY%a@0j|>(*Xw+Mr zD>sM9Cq6WE(`;nbk-chjJVADFQu$zx z+MMk-phT@)^~ESH=x}VI30`wWDAmRL@FL)ep@BbmJ}m&g0J`fn_Zo)k;?HOrFGZxU zY9QMdwy0p`P+-Q6Kg@#oX4_D6X?O6a`JTH%`z9`@WEbRURn!^p$BGVF=WD5J3Kso% z6ot8O{qmjNA0^GRETN?r749|b+U!5Xh*jtOYHiQ{=4f;J<%sa9CodISmhmH-_9dH9 z_Mw|mulbhWaTcC`ui@ydXo$CEZx1{BbeuUwsKG$H<90{>B@Wup?%cS$Jkm`{-3{8G z0!Wsf-$N?bgeh_&eA6eMJu|93!13e*7T(Z12#1yR{%R8*kidb@N#%p)546=pqKJ)OV9h>21jp+FVI!r}$UdPu#0Xe(n4<_{r`8dAf>=sLQJRH&A4)U~emzU7_*=|sX!S*1^uB9} zQuoqWuUWN|X@$2IFI(Q%>e#9j!LaHi!wG_}6u*V+n!qdltpa$9Aev8z3ni&jW%K@l zK!f>aid!fZ=3wJH=Z4UDULhjJ6MIjVJTJsNd4y6^T!lB+`nmmkAN08+Hgmse{vWd5 z1RTos{~tdQDqG5KaHOat`!ZovDwRZwEi!fr3CTWVNeUrEmQ1Bm*^@2IkY&g+D*MRT zN5o)^8Do~;J^FmN|NpwqGo8z64(568`+mP)@7J>N6Bb!5Np`3(E>rtnC0}={$NM8V zne=tteAu5?Wt@z?KW-sfe{x>svJ}-xEeN@-9`sg6*ZL+rw|L40hOb!R zy~%f<+|T(Lnvz5%MdALV0b6$j_M;63-!DJmg~9J*e@K3Nsgcs+5mI@yshmpniYwPj zQB>x6TDDe97*^VG06zO*!{D9={9h7zz4ac8>xWhy@%rD4H`d0;2J%>tXgM9Pd}Mf~ zwfqCF#2tNuyhVk7yx+NJ_+PVceiwN$_f~)B$^SWh;bO!Mw4~0{vyqy&Jz(y5m-35l zXFu(+Hnu9~1rTy6fRH)YGEfT7VZ|<}bv^v-`!zFsuT1HsqtIpDQcF5Ujp_6K_=L){ zi^)@MVrFVx0sY$>>`ZmQD}aF&8ha#FSv+ti9BMhrA_z)p%{vNAhlT^D(WNf)o&(za z;0xV4m2Um5NfjHL3fkGHs4k^|RN{ez$J)J$tjSW4`gSH893YzmW|}nr@%_eR`x8s%&GbysIq=V;nyjGfD$gO-Jie#auVwl#&L4uh$y$SiPTdPk*lcye&adMd zIX7iiT89rl^9j3I(j-#zBA?=h&E(DF!LRc{WbFsA$^_WOL z@;8E~-S=b&`1|;&9sL%f2kh`ryMcFPfm= zEbh*X2$l*S4CTSx#CS!bB+lL)!U2`rp!F9Gwe)^sgIr8K$9=xO7B>7Eb&q!VLYo1H z)wanA&@`Q+00WC;!{*6?gFL~U$WV!GKhJH3ZqGDZUkhOs1N`6Jd--TUn&yXK-2RN% zpzRi7M#Mwt8zNm^JL!(BorNIkj-ulEE=0^6{m7~5?MJ`tXkgt6jfq(@9cuOAsp zJKy=sIJBoc?+O>rksMBbX#KWXC+Z-UgtzIrWBh68P;>5(fJHJvc!`)pW>_;kINz8( zxmvHbWV{T@0V&)2HE7bOGi)$flOP^iDFZ80bNEZ+spNVHM9L?jo(1qnGV zyXDzF-ZB#@ThQgZ-6njBRAnAS?&pT~^vlC{S7s z4*AGR;T=gd+l}BRV1-N{9S!!aK3rIL77`htRf&EWO)fW+u>=JRkHU6ax34@e1(FJ2pp{Ocma|ezFSAC-eTVeE3`B8 zZp2Kd*JUJ$zj{yTxvyU5!ruGdnqW3Rv3KrUxnG^smvpJ$T%ZA&Hs{6vg67hfXQK{Q zFB4J6ZvH?Zff_-%f9IdX(~Crl?_(4ow}Q7(nlmx~1YmWrvSao7>}?c-e67ZNRR8va z{dLo6*W?w?>%_y(rJi1T#8nE+kQEUHAq;s>-pH}&0z|S(V6ws8cO9k_t>aa=%{ zQUUY0E=v6%3M}Aw)+HbT^?35fN;_2M>&x<~f#rRY{qC0Bu^V-5zuM~McwanI_ur)_ z*#!o&GMCUq6@pSoq1B)vx?woyZNzP26rop$F2it4? zP-Vab7_PCcgpZA~(Wk-c!`C+E3bRE6=$>VKkSgbJ;jG2u3aE*oMo-3Illa>oKWY+G zLl#KcqLS-Y=drJ1QM+!IMxT1v>=37Id4A~26|OjnhRcQZ8w#qN+B`(wKEL-VJXYVI zb*|0eb<^tmOzeJI4T$w-tEYJ6ZyHU!$DIeiu>V4!;erGz^RdFwa`@knLYAMC}u*JIqNb2930OYE#BXt zb227S=uWf2>)t;gk1)|371xFCdB$3|tG#@gnGHgCy6sv=cdbL?>n2KpVw|Z|DqJla zbiqUKLUM2u1T@@0ZcnZevt0zFHdEQT4d?_O(Vt{ij&BG^P z{CN}H4e@zHdN2eS2xBeo&TG|Q2mmj;RkY2R_%75$KR5^xryOH~tim;SY6|X?oVygE zm0?!e5T?mcdQO!^nVwFE?o*q~xu)smQc5+YV=c5ompk_6099WP1I_y`GD@t|Qt28X zY0m+~7FFd}szumm(Zq|ZROvY)rCmvV<+1*B*{EVr>U!|qUNl|bj^_?z~}Yi z25iF|s-VJG^|(HRNgb)9e0f&ipE^xF@@Kz&PDW(~a%j0mFBw*J!Ap0&7 z1zoFm9`jD9iK#)Rj;jSXQF`n|yM>Bk+KgjRpJYW=6!!Yr#rHT{m6wg*LuR`s_6A&! z@U62UnOj8f@SF*;*)#9L8>zkzJ<(jAGpW4Sx0^WkBYC{n-!C4Nw{rEl z)t7mCw*X!9eRQ*J^a-J65H=kohE?!VFWasn?rcCvzI8=6Wek_H1r3NtdV!c$qcQ|X z8XRmGjchgwoSH!(05=me;Nr;5VVjqUla-ity2W$58LTHOY{7$#zjF^3z~}V8)58R! zH)%hVE4zQBl^z}WXPWlodImfz2?2rU%&fk1TdA+xgY)Kvb~jiz*X{uOv#)aYOJoXMFd0>r+Cpg8vrnHm z<2nldY5ljZGqDg$J6MwlIZQ*wa^eF)^aFI;^decFCc;SMqVi>>s_OSeL&c_M^A zDcJ4EMX`;X%1^U*4aFD@pZPFZY^e4ysE>arrm^BA^>-GJJp!^@b9VKkQx|Tb_UBg( zRn4D>_asb+rnBnsE$96{QHOr(y;ZtsI2dE3(|PB^1&?W|2w}9k%9UG4Q4MdH zA@%TQNeIC|!N==4pP3i=!hWp-=ASbxx?$RC0lo7F_33f@$f*ahvLknf)NY_c&nMI) zfWffF>m@eAh%&94W6=XcCE&{gBD%;MUxI8`QW$3aiuN7Ld5O&JDj6D*ydIPoRx$K+wN-o;!I zY?jGXEzhxJMJDvlDSxU32!%$05Nq2VO>1$5vjG1#aQpWK$Qa!CKKheYVyUEIJ?ZvH zVr$pCC!Xa?PgJQZ5uUBey%OZzBj{Jm5!08oTdsNCpCec`#^c729jZ`@S?f(qT0M^G zXRyg2>hpApkRPupL8oAU>$F@1`V2#t9lfdD!@o*gA%=Tf|~Qa>>K}=nB}| zkP0;^&YWllq>S%pLO+YnH~nkNWxk^4Ih^d|WmF~RvPkCXu_s7c=bVsoc_J5^KIx#2 zd1sWI0nbcA6vw^UZq-frX-ze=P0|_MMM1*FWCzVfcEYrQUM0(Tg?R*s9e(?fFHd4Z zX^P2zPNhQVP(Y^9s@obfwr4%$d|~#etE^AwmC{fD=OD#1yC^ECkl(gh1qAYJrU3Eg zzOFlwjmu4%UBvW?W6usqeY?6EV4VR^PeM52p8@~c@4_Yc>XWy>(L7pB-Okp%&vJRM zFp^NZMEG({<#XJ~?a~A>b+^nLAD^$Nq~D3O?U@<8&?QR)J`uX9K@H{ zwp4K3#r>|;NdF8qH||@PIbDt-3bDjpxYR?`MDNtb`i&J+ zF9c*x-)|>ocZ2_V#!F`~SZC)}+|n;cPAS3k9~J5uDEgV-5VlR~0geK#!HWN&8D|xV~B@J zg|$Y#la&w5@wbH^TJZySQn@B?4=44C{X6jL9pf6`y>0GMee(~mDNo=l$+r1_~{_?VSlTdL1DkPwR+A( z|G|1FY1H=5Q1~MqCmx{cbf*S4{Ne;&qui-i5$2loS9*7BVRPm8x}CKa1TR_LDF0K` zQ+FdhW^0fv>muM}q1bs2Wc4H$QQCEUF%Ri&R;+@edk~eHHXTr8QrG7*ow~F;m&Y=_)ks zt|889(nlgU1RiJqz%5tCxF4_>?0iE=%`qI$$Z>kE%CCui*zG3lnGbQZ%s;n&Y6al zUdUrFqrf6tG}yZNv;BLpjrwcbfFW?#K)D_A1RLP*n`=3JD%)funVH26d%?$g9({gs zn%XRI<_5|zjy@xKYHCZIJ+Ny@DN%naHk(Gk61Ee^USu_KhLJzVRqU&<(vJG=NsBl+ z0UhU3qj1gEH~3)k)zPD-PL8NBjf}UBqAG?GhB%*0|H&cIK+I+941#4h^H06U=z*O- zt<9cSYkzIsLw)-)h~-v``mSm08_hMD1xglo1$z1_mUi63n~_`R@hmCF>q+oidW2G? z4$F!5%F2@RRuUiX8%m{2H)91p+YvX|0Gi*`XYKUOaoj)TMyOM$^5+<^> zub(j88a6uVV|x)DjZi6u_05~IeggvotNWDRT$XrOQ?LH`SKNn%(n($(`1K$EyoJ8v zX=gnVO;vp@_`WaetAJ?xReiztP45TTsDi1ia^*WcS#F2LvaeJo^!x^&B)nZ>%=+J^ zy-N;=L+gE@15Sq{hRG_@#~SO*9{$K>c9A;O9pBCcJLvYT0TVwv@R>3>mnH@Pt-Dt* zf2HBmCodmmtl>>=$=ud$>yxwO$1rZ&AWSr<(^)8U|3KP+nFihe*-$hkuCFV*kt>H%c7(7N;x`C{EC->Ka$_vH6gam6l=hF-sMngm6wO!EggD8d)$Mty$E$bbdl0Y?~>Nj4Po z=`5L1&^sF_^R#m;BZ}}8Mxy0|dJ*~~_)hR|((~}k{19noKMD|p1q^o#OU9kEIMsGnkXfJZ+>|> zhvJ#rVG3-vgxzc}CM)-e0x@YJprit0$iF6$8JNdAQ;2r2ZFU6y;)7Vljll3|vCzBV z$0gIT@$A_qOB~$*Nz!*`3)>^1kJSt0XlhW?%fH zvQ%G{PaxfoD(JEFce|)JgI94(eKM$ikxC3?;>BlLw3GS=Anu|CK|0vYR~vrpU!(Hy ze{y~rLoK3_z(Y0>&NfKk@y(g{5D4M&WH>%;7I&9~^X3#lh!t(9)-Xg*EQo%@u6E60 zEPx!7u|dPsVfhsA>zGD-OCT8R>B4|rWdP`bL249!e)9o!&0jf25q@FyF)gsQbmkF; z;^cy={n_jXlC>yM7n^_ue3Ha&Qe;Vr+Mc$XAcv7|?jY}@oG;ul@*T2T27IWOIndQZ zJ6kqj;B^f8((+UD=-@x*(X%N#wyx%M?0L~4%Uo7aW1;hRc*?z-HNHK5Ix@q!_~tuG zr|EkOSR+guk%v8P+z`}%7BX8Xl4WNHh)1D4V2~^)Ozq#}hCyCP<*WHm*kquP1Jy^60=H2>Y$fR653& zU%2lIclk_QlT-2SZ__j7z_qxi_K13uK?G~al`Af^?BmrpshMD@uW^>TrL{Tm(ZaVU z?0V>bMP1#iL+JA{GO5wC2s&0h7wdavpE9{~Co%nAa_aO29gW;2jK|i1mR>m;pEkc2}bM-m0ZCt@1GI+DGbl| zerH<;6_eLHNtP(XSFxY%+5^pt_{kqUP` z#S`>C=AAC-aMEmvpnmN9g2=ku#nCB=8G+YnieE?O$gHLCb&D8Js`2JOfTO=(slfO1 z>!s@piZN-|0Ln~np@hFQ{>7f@Gfjz`>rMo6W(@3zgm5ig zv(+nKFsVId&zaD@)VgS6l)?>@j7u+|#1$!cCtrQ2wl4#4CDrzIegH2$A5g}go4+VF zM+|Eh0p$RX?~eG@##aaFrBd2}>bA zQALEiL2e~W-jnfW;;Hj~yk%hfGjyg^DL`?uB|KRraqlRrRVq-5CorEVd(t&{HJ#2F z1;s9S0p$Ui_nP3S!-L)X#m6JUZZuB1J;t`((7SUpQ><&oD{YcGA-N-0(~>6GIj`55 zwvwCWwqim$^R@pWe)pu==RoGC*h$vJsJrgcD^BSu>^(gE8HxKR>eaEvZ14M>?;ooT zE-6P@DdncwIq=T$8rkg#$Icc)OF{N=54bR#>l+{>&g}F~c$GJ@&`t@WZ;<{W*BVM` ziePmPRT5Qgv@g>dj2O%InsklhcCw`2wC`mMguQWOJT*64z|MAYahYzhVfP zAD4Te}2yk>MTY%g*WF45}$7pUK%~SM_(?0S;#wft*8BTK?y|Y`zrFP@$rqJ&M z9nIfEZ^|r6{`Cn4c z1DqYkV)?Gj_D9`v`oZh2o_R`8K)>_#iJj;tK7uav{P?@E;Zl(JyWDdUPm1!fJ3J9j zCuk?6^5JjvFFqnlJTY_N3kd|dg&YDZ-&$F_4p-#osl%6<9JeA^0h>&B>eAb@#eEQa zbEpy^u$)cSHV(}Gb(70f;BmJ8LnMVlmhIW@v(d+WM4DhW8peW_=dnmBP+2r4g#Pc1 z=Q$tkbhZ20+t=rI2stLI+xi=t?f=#c{P>{KMGzQ5L5@G-Sxb7sLk$qe6P%y-%==$q zlX(lZ_!uw{%A>b|g$V}>vmaET2soy1`bfO$o}(V=u}oRX?v#$YCOMVP{n_U_DtGA* z{j3ma$tko%MiBuh3+5VPi%T@LDWY9){B(YkhV()xBYs;9Pi4Tjp;RkLW0TbO*^$8gcUZyJHZ&~G*yG$X|pI3(gB z1h`i6w+!~w``Ah2FXKm58Na6f`Lnl=m&UVaymiCxO_W}R?#t75d$cUyn@wuJ{bOl$ZQvV*c_P{p7TbXi)7y#TN z`}dg0;;=dxDds*RFMckXjym!*8 zZJ`M726XkcQ?u*`W zAgNf0A#>y<(?Z75`Br)(dHlNDVdLl1UdH2d z*zVV{-&2aT8NKe*E^sPLtNJQ5dH&OsdSTr|55d>%ey{uiq1NT$GSkxI*~-o-+I;L} z@cV0;dHgmCwW|?fTUB7Q4|Pae18*){q31U{8`?h;Se?1eozhh;xV$uYs3kDENMM*N z=e^0x11n5njp;qye6b$XwX_Ft%%KAK6e%Cj4IFA;H-X0RX;MxS|FZ@1=m_bqxTRPx``v4lz6qvuu1&zeYE zzETCZXC2%gOJ~M%FTtWsPcmFwh<7q{HES60K-d#oGBhKtq1JA&yYgYaK=6uP<}=a*BP^l*>f8EeD^P5LJOw3y4(9hS$`SyVO(kC;TDP+r*xU<_cXs5FppQCUSdJl{RUHa{vB}x zvW+`qS$a+AzerK?s4t+gFX5{mr>=t_2g-Mqm(cZ}%+SjxHY1H9^tg{PZ-^j@r)!U> zczEaa%T%qoH=3L8Znqm4Pa^&R#MFD$ykp<|0H)#>dH$;!Jgph$Ay!rDZgz=&M~l_& z;%J*!bt6;yoVcyWQ{5)U?UA`GobF^~b@mcQhHiP}W?0bn5H( zHog`=yHU=(_P7-DE^;%QT^Xah%~qZ|I_{^sd4|%= zZ?5Up~PcD=NJgDbNWx}e@ zL`StbTkX9jD)&iO&$db@qQql8GiX@Wnn$Co?{i_LuR-;2Y#5;@H13^I)j?vz>7V%y zIfPfRi}FOVH2Ms*Uzyl&9F2qe>_-Ups=NtlFY6AC15TgJ@YY{QeZY52(r04h&@P7O z2v@i~;UyFAS4XDMBBmE)pZ{D9atoWF$~!!}=+8jF%2KBcF=7}g8fZuf)1H2^fF>z~ zoZGt8Fq?nHi9wY0Z%2l4WGLbmNce!6|5#=RRVp(<-G`^xIej@oZ@sFJ(QIpPV$O7{ zog4XJmofJeeg#Z}etxbBFIX7z1n!5+J;mg%1b--^Qf+T!^{166eqViEi&7jmIopx1A~oKOHX{U;_eR@SC8iZMuAAiw}0q| z`qTi?Z>S6$`jyA12|+<`Vdr3nm+8Q>7&QfI6V0Y$$j&RvYpT6Sss%8Rcve9Gx&>Tg zE2UO6mQFFQXK2~Y#LbJe?Ew83>z!1as@WRqDoV638PwIU3kw&c z@Q94$G<-R1WW%%y6Q|~VtNa3JP(2v+8YV&T%b<@49O10QGZYy%zEo@R{eCHQnS6gU zaLS)=5*7s`?nsM>Doiba=puVZm zCR(r5sIY0G-B68`UcfJ~()>oy^27<7_DPeoM<-e?$XEjIrqtojoZaYE<%7{;ZNgG3 zAyf3JfnNvA_M-1)Dc`6K_u|U1K%MKwao*u8t!-Z%bEdPVvZ6?V%hi3vtf-lg14#{~ zFI^LVLTb}_9d{QLtJHFHSI^lVNc1J$6v$JRh$#>@cp?`tR^(cX*u7r3C7(wp13iGU zeW=fz!UyA#*9x_ZKv4`R{jsWa+RtJI)7{TOgvT;y@{ra4lyJ`e$AR=sc?dmQYsZCg z;7eR}p|r9m2E>ezNbi6x@*c?>u@Qh4u;z3ro>c_ z%M0XmS3o7T{Wfx$h(}A4sZLD@ty`(i6Mj~?^A}WTxmHsDdwVWUj~LUAIN9WMJnpsN zk1B!NPIt>r%Ep%;8%yw6{U|)i8@gRAH+ZL)P*#48+IW4<5hWNI#z_ZcxF$M_wMgdP`G#s-!;g7k;dad~8}S7fOch|l5l5}e0{g%Hc511TSAyd`9#48(>4xoN#gGPy<4bv>S!?oep%zmNssu<$;T+L?(iMm+vPZya2Onc^Pt+s5 zWvW12jVUZ2AlabiJOXM?TJPbG&7p=^0;j(QoQne7BByEDXIYz^4JuR6ug!60>m)E+ zZ~4z`oy0o9A7a!m%p=+oYkszAq@f^6t^sg=R^J@iyoOWZHWfLh zg5WbPwYeopPU*Z8ID#s+5 zfDJSJvAJ({dKYidujxbTUR^JFc_WR!C7ZmoY7x&M6T1N<_#BMyb_$MG-9D2-*RI}W zQg8EQUPxe=KZcNqIr^>C*I(ZCLB$+RR(kH>7C{eD?G@P)umU(F3Ez1DyrZV=BxQ zLPf{v;b?!3+6tZu%$HwwUHsk0f;{^d%7AJ%hn?o)+_d*h#t=Z+6RSo@((EuTI-e0vGtSkjN5J$TF@IDfF@ z3Sbl-5*giS&kVQJ945XB0kK&($Ind=0K4JEbitM(W3_8@0c7qX&q3$|HpaFvD(-$N zK>^def9)Sp3y@vEO5t@XNE0Lm!kJn*J5z6liAcE%hXX8yoSJWG&*O9FnMC5bEkU`JmY1H-}*HbF+{2 zJ3*hBUUkwqUTqj7+YJH)`eIz9e9mJI=zoKmZdig&G4uP*bKMjIwAN&vdzh;ffiErPy zqT&4!pr+kta!fE~8|h13RWIKqjC~xHC$J5$^U0%u9U^SUVc0}YN}0o5HcJ9Bg#F%? zpqEdevvAQIc3l~XO;&-hrom?n!oDnGsn;Ih)aEV$cB0-Iu_5qQA|a(f8E_%7-}hVm zSZ$Rz1QgU1f-xRVw2Kj@qw;WB8r;h`iPCRAHU&(g?8+=AAKAR>DMVZI%nUF^-!x^x zO_khDQ!pjQGXAZenqA>bGRF8z%w?9csnJ941Lu3mC|W6Y&)L(Mo84>H5m5v{AL|6b z2#N!YsDaVkjj1KihLU6BVkYxfHt+)nRh(WNJAzS=V!ksflNK+eYb0Hn-P6NYphP?a zN<66iM-{7@+Y)w}#W9m3_W{*9q06Kauz+kFgK*1>zr!{R)(;vSRsDe=1RFMWcW&jN23f0yWpz{2Epfe%8Ra5k-6HP^1@_*qyV^86ZQsV~s=?Tv4 zl!*X^fxNW%iOPVNLD%HI3jWwWS78zp=S{n`O9L`er+qa))ug<&C& zjb;wJw-C7?HrwRd-+?=lCun5w{gyhZk@)2?Hn%=bp1Tv`rQKj8tyaFZ^^p+Wyh63Aw~&>*gp{Sc792kNv~Tl+V1!eS z{?6rV#oZ1Rg)sn|b3i0($jUH@RzF>AY3b|lkz%q(VDv<%|NKG8b+Pw9qq3lb7tR4K zi-72lFjeXYu^)}1m${FIApUubI#S>WunqoNA|DNn4UO3fKfAI6NW$0h42@sboFtIB zcNT&H>Ut%SZ@rWfsa-qONBusLa1B*(N!4QNFmA#}c`szC*a(=EQ9FAmZA`9l&?Ily z37b&lra8s|^%_d)k`0*8I#`NB`maFNgd90L2S=WTV(wl&95=zdrX9?o8R8+4xZTHm zT=>Sq2hdCEVp&dl+3RLk_pg@P-A)q&ETPI(T0TKr;<W?!it<4TvX6Jg= z(7ctW7p<|664ED+OD=JGJ-})jbg2QoUd8=Kj`6Wq_LFs9fR?)GmiiI5`tuHiOKA$n zwY2i_w;~$&8Vlkl-Dk0zTuPahH;{roy53fGL$Y2{cSY!1jlz zwd*pc*VNmH_y1_q)w)KAd}$nXcUHSogpl;~0(+|+=6j5GkDWfvu(TM05N*^ocN33L zvQrNJPw76u>GZ@w!mL~lovkRsP7`cn)JCA+Dlit_N-}+}{vs+$zN?k-rW+Ls^%Ot% zrVHHry{WELlr|}4&8%a)gxu@@3tVx=C%PCQnwj&YkV(e!T?G2_*^%m_o7KXk0*_7P z27xDL`12={w_#=#-{_h^{Y^Zz?ggbKQf=N@ZzJ*!cGZ(~pyNVj&&xnYwsun)9?BA^ zd1Kx5^M;J20_Rc8;5>@W%i=2g1jNUa-#7TXh5RXa;m$YgA}kkykN@6* ziCj55*y|@BaYb#;V(ZY8tu_JZL=B+qq9nrcMe_Fc23+&IHG>i?Wsc)QZa6(^6hT!qcd;Sx#M)Q%hg|U*-Un7cH z|6R{V{pkbj9O7=2Gi|uGlOB5`>=$#V?F`gVBb1pw)R62NFWRGB*7!31V!p|EGrwoA zSVRJ#);w*fZVjp=jJb3fw+ke+neycp%QnLFmCi`N`hM&NdTdaIAe^)HH2p z$spOQ$9WJ;#hC`y=Ez0~Tzu@#%c?yU6CulGR*!hF22LfXeaM;KY=}Qqt+!wr#5@^? z2^D+#I(bLl3TYrju<)9#whL#a{*8I8$nV$S@`fu+=<^QIwJOnf)*V#NsCFVUTFuS= z`hJfM^vPn!e+7%tAg>^-@<(6O_K`Sfw5&*3xIWMQ8x4At@Sq^6gpb8TDw(ap$3=l>#{ zn&)8^G|PNSH?Y%twcii@RgF^TKX4{T_2>yNzkHo|$m~n;A&H?Kj+}jz!){bR{%4Bi>L@NA$sq+iEiW9M-+s{K`NYCj73^Kha_A{-bc#d76*2lPksWQRAbEIoUs-VbHd{H{@Ogbq3m`%nmv z^zQb$kquePU=G4wXxPb8omnR}=s61W(S?8lZiehuFSwNdB}pNL<;MLd(e?0G+Os6fdx>ytw#X;AuNz6J)UH3A3mLqIyB3(2M2@APN* zF%>b-Y&v)1P_OIWid7}nfoQ^-D)e0NEj!O0<1o`(2Wsdp_0P@Jpg6yf?Bc%^7Bj!^ z{jBb{S$VAAfoBG9$H46w2xvUm=#D1|1E*^DyS=@KYEf{0D6VX4Gi95!rGjW)?c$g) zTtc&pm4|ub3Sa)he&pNZ5pUJJR!6XsuAGG`WKE<74Fg%4(T$)j^P@0(sMArF}UgtKG~^dl1}Ogu=f3_Sc&WHVUQ7PChg9W z_u;~%wHA@uwCOucgh)RDd}bc=t~*O-cxHta@9Kb3edJ7KiQenKLbL6JdiK9Hh4d3$ zt&1(LJaB=W>03#L5@*b|T<7F^e*5|1ZDu<6_aZ|WmzU`vZJ|t#eV?&sMiuD1)wyf} z$K*}6MHMxR79yBm$OOQqTw8Zpr0N=o{{5lH);_PrzVDWF~U238|MK+ z9H932ZR{(4#kJ9khTfFYOvLv%a&_{D(7SyJ!|}3F|KTg3Cag`W**9L|#B#+7ITPFX zMe0dlEYbN22{^;B^chrDIR0SMj8(QochpFc*pJE(t8-zcqu&4;X;ip2BQQUXpKbKB zHP}UP&_k{sv0DFC5hFSi~mP@uDze!RdFyq{sq75g+qY1LJHjKk!|x85qDH*00G^ zbo>p6ZJ~dO^CYUgzL5Nh!Yu6wmlvs?cUI{~uA44FbOsDkK>Fpl{A|uGQoW{QgYm_? z4#+yi)3Xlk&8v<;S)jFeEND!9;}jqP5W~pPYQX5P&2J}5 z5y;?a84)9v{`mVob=aLgBd%RBUwppp@V(37wKx?g815Wj{OzKYdE$Xg#U`)ULh6?a7A+2toK;=Uc#rJk)1M#gL=y2#{M6+IY6K$ryNEWLsnx$$LH~ z3{|f2U~R0{iX-fYOtv^OD5CvDzGp@g^y4Z21>B=+7@EBs5WD4ekbp|ez40sv7yrMY zK6Qn(MIn(+kHg&oZKEcHkx#-BRu{!UpdoDhYYKb^w(Q7^KB7mCuw`hrLJ^1QkEeYY zOr74G04V!w3LpKZiyIQ8$7y_Zvu~-dsJZV)36ktr%YoW z*e!6$B`gx1vt6dX~ba_9`<`$K^RDqHPzyfh} zno*?Sj<+BkCo-VaWpOL7MR&5MDjJy)z{m!$=$n$yAG#m( z*<0hgUmzzXaz8IE=o=Pyj%_?A;3 zI@kU5Gn(X|KhegtfHeUlbrq*``7#B)RWQ2Xp+b&ywQw=G1b0li^A+wH-@$lv6>?bB zz%k{Bdblt|V8lvFCG&-V@$HK4FIev8;u8q9V(q({`DQjgD-OIUZM#kLws{+7r}YDP zqgbGEa&V}`1%bXdJFxXm2yWk~Gv%bN(K~&Q?_nOlL6gLt*FKzlyW<<;toaZi^y+J$ z0mJA2W(hXlGaTHsON?&Wy?T4R05j!Q zdoWp|`qlW?GP85W$@1;zhgyI#-#E938W?dU`iLwGMoYmd_Osydy%e-J` z;?a*?MEb}9oK9emMyH5tsqDW{TuR-~=iV2<#Nxksve<8ou$g<4ey#b7|C%M!gmH|u zNPCtfdT{NV!#;?`L674lT+7r07qu6qx*b4z{qrprk}!RFC+BH)1c1;tY||L^=i05e zFs-bE@!Kz~OQi&E<{y^wU;XvM8{G%r=Kejbd!d;cn)u0Eo;yaN^f~?~H8oqTOSIh} zFNvsiCAeC_!VeSUFQhEvqzBmd;ED3}>vWVK!iptZSU1r!TjkV|Suv}sn=T>V{#Mhm zlO=JPQ2fsf!u2FX5vwe@W`VsB;>fO(qCeWS<8)csc*M5a3V5Qg9^Zs1*A9#f7w20!r=f zWp9|tdWTw8HI+T{ZEHhZLZ=>|eT1;oe#ll<|V6~*JDdEAgQ%|s|ds|W<+0w z1>&iar-VQeKXZ7|!QfKBSk_xbt$l$!7b5%R4{k#$C4#%zK_xgS`%pZL$jHj0L%3PT zPgbiM{)3IOuizIb4;yZkWgOofwR)h_+!Q@s|HO^H+v=D|peqJatVh2Ow zrK#v$rV&sKw!EL4?zSCl>LS)^5)V)2Ex`jEl6b@e%;wmu+G_UTPGvNPsg|*4Easm|dfY~(%ig{owW2(FU!YBJAUdczRTKl9f zNWVguaoa}@+lLQdYWKLJJ?EfZYvYZRm3%YsJPdV0y`$)Dk*zamiFVSYmLD)H!A+U19VlM?Z&sVdtxCT=F1L7nsQYE;wn z-5Cg4KusIM;^CMg{{xqr{?^shzwxuscK4svdFw!_b+-Wq_xv5z|ob$J3wdNOnh? z8yj9gjCiYm+-<#5nu8O)ntYYS>CLGAQ-@A~O`HjxD(Gh`C`kH6dy^omt1cZth}Y0>?L)v5+G=+XkH=2j@&ebchkV67UwsX_Fc{S z-NF1#T?X$lGH?($2J{o8h6llN`D?VS9CM9Ke6we`^f$l5bBO(voraUT#tlPrlyC%E zM`LQjsXxzA;(VenZZP{$OQQk*qJ-K*O%0Htsq>#}TWC>z;>Z1`8!}akX+BY*vbPK( z8!k2(9=CXS!mR!ifX#vqh7aT;tT+VOvvQo<(+p!5vX!F02(5Qr0vK`e*y!X(B!%0MS=b;r8&{4X#w@rI1 zIgiVX^HHww{eq&O;d6@SXF}AfavGCQ;MC+-toV$e--tOy=kMkdKE{qmb9N&eS#2JU zy9qo{Y<7#OG9CV<3Sj#%*XpYo@0zxW???<|E~33kr*inOnhK_ccU-ISyHUDa1pNlj zMM>Yyz#N~dSqv7z+{FCX{2#%FnZY*xMf@U$ebbsiuroU_@$|#SkpO|v>gSWsGDfxg zXH9JCEQ6|2hhv_B0(=RSFG%H%=TJf;&yj|-)rNmGd9GXY9&T>&T(2(OUoxQ;row%= z+xy6+5_QrxHfLXK5cb^ncZ&?a_Gl*WxQnmK?%T1Sz^G$Fb#Q8L#C{9E3URPQpaqgm zYIiLDKeFCCp6d4xAFqUx(U5tNWM^luq@2o1vgO!hgd^i*98naqM|Pz`$X*$T%wr~d z9_t`S;h5)e_}<6+{rP=9zwh@C4;?vP=e*8+KgV@l&+7)o*QVS|0q$(n+F0OY?xLA0 zTmi?&RUGK;{u@vq4@3BiWd`5VErQC;(LBvbathAlKKn z0&~dL4P-fjI8#UImW!XwM9G~4IX)9Gh2f!9y6`$n`)zmt?@uoBUk4vg;GD5!*Qo?z zIvNN_a~S{igmMwgkYc?Twf98`sCvLfkw=4nQe{-u_j6{K{&`+QpN(zEVJMw0MCSBH z?Ta$-kOF_&JXUc&x&sS=-&SD;%*)72soF-|((5;yWWJ!oRt!-_NwmQKLl<;miH~u~ z6C_>wfNq;l^4nw1krzixQg60*<1r$EH4njQ$lboXWLKe$L>p&<2E<3lsz}jLKat!> zWi2H2Wgm>i1C}|~=ViWf@5PPT)U)B)my0}mUPdAIJ|o`%Z#{-S`%Jx4?MB5wka59> zq}Ff*FBbvFAH9Z^A^u834^ja|h5@GPWLpz5{)oi7oG?}{nc1I!H@S3e+6V{FbddfO zg7YgF>^VrzPb)j*|MozevmiX~&r!FcHgPU@Ztf&(=>pkPAKy>Y8Bp9Kx#%!NMVgM( z-}SE`eM^5g{4}V{l(>kXl5%Um`?GeU{B))EC}`V*Ui81mASHAQC98K8-xrt9q=c+p z`*xu~zBh)4VORxUe;U33Mmg7wb#FdJRIR@ju*xP}%B7mj3X;cj0a4rXyALXRb+-cW z6Itta^JWK1Yj-_b+=v_pa{qz5D33!b|IA_6s#~!y1nczlz@K`NQ>Se-1w%r zKneaHmWHf;UE2`u-vFZ^n7z<3%|ju|ndrSgkU#$BZ;U<3V(EQ5!-BUMAYoV{V0=0} z0;}4^c8~XA{=wTuvc|eYwXZca6Ep~2%8WBwOs#GAokL2%iVr&QM4VX=w5pjSi+gsD z@yy?4^(TkfFZNl%?Qa`16)(0T7GUb6(_nZ9&$$xM(EGI|V1I&fO>iNY8uIxD?2xm2 zTonUEKhGJs+&p)|ofPWT%ZC?hG4UTk7&0a z(yAz>ILiP)btK#0QgOp3Tgy_E((J?-j6dgO_>(l89;d*TbG^=~SBFQEVAS69c+@_1 z5lACk(~5gWub$4xej=LYY`|_gdQj%_-i|t^EN+7F-YIWjjZ^T^w*${QaG^#$$=w|I zBpAzY{3z&7?m77WSV1n+B7F0AL<4P)UMbWA*u)u;ZQ_8ohD(^=LT0~gxP1V2Z2zVL z6+;0vkH4bFR_Q{uu>HSyGWfMa7??^`am|-v?l~T3Wg!jggCk5&rU%pnO9if?V#r4x zO6kMukd5S#uPy$4v1>Uhi@LvMe6ofeVAcQi;&@$D)O#I4O}4%y=Nin219JW;1a(xm zrVEC>z+VD=NmrpU$B#x?BT4Yw^P2H85WG&LY9Zz;2uJwg%Em_dhCMW_zeu z+HY*}9jxDRm)tXX`Dcc7`GokQPXjC2%xnROJ9JOvs~PgDo6{J64V2o->;`k1|FKhB zGyfzaj)5j$Vh-Gs8#YwGgq-v&0f-p)=JMs`J5eSU3{Z|lqVXtCaOXl4rsCeS@t z@xJiT({x=yC>Oj+;Kp1M-1@m-|q zx+NepZ&!A3clp)w=q~_R8K`abN-$r&a?@woTZ)+DN1Q3rS%mj?+}?|ymvFuLsvJnI zVv@;HtGVs&GMOm2ic^P&m}k;QAG&1d$+fKP&{fE8GgA3zp_*S#Gj=Gv;_&OzIeL;o zA2WoQ{<*_x=taZGCgpK!X{5Ye@aJkn8R$JSrf}$8#BOkOpB{x*?`9hJQ6>y!sLX}a zVG0AuU6dr+bF zUB#zAtT;0$5MlHJ;B=pkaXLw8H0+%Y@yDkrX1*)!r<?iwEX%8=Tw?pdyTRKb{P&M;PdMYI-G~6hOQ!^o4MlZK} z+@Ap03mBF68mvNs+U^uVI&luf{&R=z;$A`FVP_p`70 zSG;gsf8YGCV~c}2%(S52=+zUicGIxGDXBbJAGtn2pz_q$4}{i$J*n*7DDew!`GM~0xX>==paK>a#0rVOI?1T8*hE09`7OQMn<*8!m zAY(s{>{+pIMGmOd$CjL&l7g??kOGkq)Y+G8oRy!tX_v2~j;GDYXGj>b?mDK$%?7TF z>?MYC>jX_mxQJS~_VPCPB~A2Dd&xS{)PB^Q5e+-U?ye)&PeL}x5PPmzT>)`x%OqIy$3gz%;=JT z7T2#9A#w{Rm10`tVtG8hw&^LD*E_l0SJ?Y6*Js_HfnOqq!n_T`qmJ$oKj9NAWAUDn|E6Cwc{iz19~V3 z*Z?T~Hd-@R*P@;?ep=6-Q05jIlzs5_G73T-<-y=Q=JyhRui@ea>5)#Q|fCq)Y4m z2CVs(_e!bku{{FmtnTVrUNcT>p?Vci7}e99}LFSA>E zt6G0oBRej@_?*d4RrL$Ba%v&HT>rbk)(-s4V|uj^`9 zyI{AFV>vb#G=EmX=-?l(yWa)4o(*u zOxqUB%S4l8+$i4qRFlmH{6v~1L2b8c(u8^Da%2qi`tOR@?faMA?)e4V*`K%2pEUrut@H1b%nuHsNwKJ+?}=casbSqShNRwc;wjF%(7gXX!HNPxV! z9~iO}pmOE|XpjQ9mO2CW9S1c)N4RJCd$1HI6X?*d zxQ3&vGGnOq9P5K0V!w*+YiH`lr`kStileKvjBI^xvCh5(jFn&1#BBuD^)SF#__Mjp z+L248`*!GMqfz1!{Rv~cb4T&B5oy9KT(l(d;ZFUmFegV-YMY{_v{@hHdMdF{&%DTp zLNC9)q5qj|J9sV|$c*+K7Gj+Qgw`^fL8MFDQ(tnQsRxDx=4cOL;3e+@$r z7tBv$?!Kl@z#s`2FD?lOJmzxghb76w^1!jF+2kz)nmD)lgusz)8GDTTZhB7MF&?<-X^y$hg-X4NnFoU}5ww`9jU+b`s(jA%U{swu$| zdR}L{_8F@EEeLZydIp^&#cy8NTLOflm1>*sGyC_31`lwmtetdiJ1Vt;ksrFblb0<6 zRn#R^liwV^9)HQ@v`3xI<+N*@d2f%mbu!wuR@P!mc6za@-W@feMp5}^+E-hXBCXwh ze5tS8ZRQOFHnNBqEPt25d$ZuX^_$eB*%GqTbW&q*_fh_7z`yE2d)5xCAX%E- zWqa?qJVWOpt5%p)7-NG!3AqLdZ<_@Co#de$o(8UHix1zKey{-YwxHmOW!RFq_C)E4 zF_sg(@OP&|R&}#BS>NVpig33-Hq2L@T9Y!I`Qxc1n=$W`3!+|_@f1s6=S@u3VX!(1 zAbo+gegZmj=|4viA}{U9LFUWMUC0 zm)`%B=!5_GHTt{llY{IRzFKOPfc^p>8{okh!(np$&3% zbbtQ)$pY!~&eIc2BYi2s*V;Yd)~9!l8cHx)GhpZ{3KLfL_I~eX`TCwC|0K@iF=r?Ty9El0VKjtS&+qA8*l)>1u6w{4`I{O1Is%C>>C8tvtb9b%t%7W$()+sHWl-B`fg!EQ9b$kSG zCRZCm^){B9)ep$4MK(Xz+Qo%YIdWw28f!sfen`ha}G=&)`%>>#LG zk{+@wb24_lCBW;}b9?f{TQ!(?8)hGIl^=WRJnn7AvQzsZyMmg7*7fq`n%n&9XUpw0 zTy^zQ;{)$Fex#nU{aG;VT{*Y&>-O}||B;`X-D$0U5&z-z(2h!951Edv-5gFik}A)5 zv~>bV!C3g+B^}{(WfSm1l-Xd9oByk+4!v&{`9|sEW1zkP>b&Tjp#Yl>04nFdhto*` zTNmIQ-~ucpNe+r=Ae+jHLabeDpPDA?(nbH7&DtYlv-zs$D6tI z4>{L~5<(6HCEK&|XMb|z&iAJpuRB?9e0y{GdxM!do!^OT(DE?~@ew_!dwc5A z9gD_Zho3m^NIw?oo%mUT;?c4~vh5o+_V8Z6%Wh{E88ka?Now&XuA+pNEv#&Kv~!1b5WRH1)DfyK){UXLFYQfQ(uHjQNUl8M)I zSTYZ0dE4`Brb_8YjHnQ2y5{+OF)8)xEre@P)wRpw%bPSzkp;g$&gx^pIhOL+O^hBj z1)y{+_V^%mO;I{F>}g8DHX`~fg*=$YI)o3C@~YrR5d4J_X6hf*4bw&b%!k#a$`JpT}EMIgfB{p_^DaVz*SOGJ!7bUkaL51 z)Gog>pux&zC!xZ)5J>2 z2kK^Qq1hkA=p3k=f<}xHDP?sVCaJH?C3@qR+nLmVU-o^Ay&#ExRdN2!a~Fy7VM+@d zELLiv6fI!X@s-y|TSMMoy49B6+e@62@tjKWQ^{$rhScYuip<|3ze4CBv`Zn%KhY1e zXHULfe43-)N8a3(fG^t7{cx%8(K9V4+>>0p zc21u1N$Uj*jJv#(DJlVKmZ=;VudiZVc^@+9FSkk(UL|RNBbIgLWtGWmIw0_PZL4U^ zg22)AVR*CN;gkR>IWQY+h-LxQ<3JYdZX8sV=R+92;r@<|23%fh)HyS23DIdOnCj?EW(%u?Yps1k17R20~(6>&jr44CMn9Bu6f%f`>g+1 zVlLx>fravAQW5DRk8Q_%V2$6RD|;(qE(#@_7Ex8MOuV|1)5a@dn;LU5|7!eUUxbI@MK^mhdnURdaeo27MGqD$Kb0ry*D-9&Q^o=4>K zfY(g;SRwA>s%>d9b9mof-gFE+d<0dgNyn%3tqmQ<&J(-xnH`slL~{;@&ed@?Y+q!} z9$lpHUk0=J#FaueY!$9ZgYbu#uNNqW$Ud;ZueSOdD)QbD)3au@sSsxjGs0&2dv4E@ za;JuLRm@2!Kf>Am4IGj#XjzPA4Nli#kwqN!n2B-4!j5#wJIHWo9$@>94g4Z1+xoNfYFp3s?Es z-)+h|*ZClwR^f?tdhnm(f?tgLjHw?AXxjyEP-x=)ygvyD5GC#e@`sEvyuo>Xq0EzG zLs7Y%n!XS}s+t1XQOEbiay1P_f2ZB&Hd95wx8ozIU+lkwFSK?WG}GIrWsA~34?<=k zlfffj*;Ao{eTme*esuS0)Y}mWbGUC0^;&*KhElas2+n`qk1|Or zeMW)HAKu;WJ!R$&?`@Z)lCan1AgrwOq83ByH+{my5Ub&T952;&@828uxJ@j19FSyM z7fg*Ei;V`aFx_tY$eCm`ODq@Jym(|WACdykFKwO zUrmkUaip}YxAh#fzAYM$96P>xqQ~C@{t&!u*dMEQ;wy9>mtU%@4(W}#S0%q2*t1ZP zT;B-oDANaT@qWK$JJ&vAz#FUs?^dafeb%Yrb7NICW%9hpOP}od-bTF_<3gwq8`m#Y zs~)QX%Mgc-DLMSmyigG~xo*=ZI=`;l@PkZ1*43^Y7zh;4ezS8)UxHv6qH|=Rq@Z^F zK|`oYZ94uA!fPSFOR$flm$>Mx`BIO$;LrEJ?v-+DS&A(qB}R(Z%zfm{AWK|LSl__c zPx+3%W`q9_(IJgt2Vswpo?AwVs`A^i$@<8gLyO8>tXYJh~xZ!e)X(QCvmSY^!$d6(KxW~q3r|HV_OMB*?D%~*Ix*t$`r-}9kc>$xLH z_aP8iNbg)#!s(yf3f(`Ko>kY!Yy~iQ-ylr%&|9b)hXM==l35PoS3+2u^1^>Qei}rWAi!Bww zuLb#|5>W>b{V}3~hRJBpq(N{yxcXnguDTsh+FiZO{c1Z+UycwL#NT=JKhG)~SD?dv ze^#DlQ-Gt~kKM9A+LLTHTlS0`;pe&FQP{A=US!i@WXI{&@Z3+u_sBm=g6q%omiG_n zkd_7^`+BvR44MgDe9fK@Yct=8WR&9w;zMIv8X2TDo0an45G28Na7;8_jlWm$TPl+FWX$ruT2;eSMp(;n4xoVl8*}0;iN|V9D=of6<~K+*bE?@Peq~1mbTOT z#u)s=BX{{u)+7aM^F2xWmg+b?gf3NmF`BtqT~jnA68`JZuI6Qx#8sA$;mDMg0>12C zs-1W0SDDwi4EOlw>opY-rG&@0k!_J=GY5zAsd(vPx0+Qr1`bxG^&2LB>#Ph*ta5Y= za|H_RMGT5gnG#rDX0DJH&NpyzuNzF>d1w=g?IbIdWLh{|>YPB&Mxm!J;88JM0H*l=_`>KgG6-pLo_1GG&gi4){~Yx)iOcW{YlQcscJ^6 zst(Xj>z|kRC4w_PG{VeU9FF`x&lu|$S8omO8+`22>%0Guq;W6EAyKt@1*EsYJ?DsQ zAE>Is0PQzoZC4(WWjCyj0t<~+=7TEdH&q`#R{5TeUmx+t474dud-jH!nQwzPk2DBO zy80I-lbn4ZepT)pEpdZmX4)b?n`6eM8ts96TlR#a>{aOD7p#N(iY|x(1;n&$7%rI$}4%EAaOVnusV*vg+xK%3VB zK2Q}!e{??Trb|4dE++1W-|(ybwIOUStiInSnG>fweUr4})<5H`GWo|DZhrItnfPIx z7)CU^A-5I14Ej%G;&O}$aR~MqT)sM;$a+tXa&IWkJvff^zMDp3U@rGT7 zt60`&241J*yUdwtM7YkM?H-Jl)mkiqkUHaYV2HzszM3^@t(jIVtG`L&>Elno>+7}S z?7=WX40SFGdBpkim65>9;)dCN^m!v_HrMm3k{#3-bdWPG!s~_-ot>Ar5}gmsUXE@2 zpIq{C@8LbuSf+dZBWKq)Y&_GieB?E6Pv8+VHGR`Iw?Pw?be`9_i$7UkMYu1@-$NcN zyrZN+``vEj6K#o8i{eX;6Rhmsz!q7n#_G3Lu5{_izk_+#jTI7GQA^jYp6L39&Yc{z z%w1Y1Y${;*jI=ar?lXzh*h_Y9PxV?B#>~swg>`Xfd1Y8cyXJ4OSiOXpPd8>iSFay^ zmd%Qqxw82&cnj*5tM!()YdRlU_+9Al73Snk`W2YGNJZmD+k)Mi*Lvu9d~Lf#SkMXc z^4?Nx7uKVbxnkF;m!P>--N|1uP;Z&z*F?J;%qn^=rle&N_Cg6Hy{>KlxE zkCeGP8!R1%c@5*a1qU>!J}o>zTiqSjM7`T1TfUR`rob)%1WFPlE#p>u* zez%+F@|g~pmRdawi)?h-;y{{F+U53sW_+FS7v4Fb@(uQ<`uEhNFOFk>?k&Gk^p|JYW}#@)D0%bXZJ*nSe@V+v3;1=bjUX|(_KSQ_=UaVh zRlOqyLDcmPAvQWU#Jz*i9s%VAvA^I8WnF?Wu#y|VZgNE(8Hu!QvQL3*YuqH~#Mifd zX>&z$?P#XD!Iv`G!MzaqPP%F#zDuwO%Ur(+wi_oGEvvCd?lxO2H^qMAJyRM*br@@S zyw&@Bw~Sjm-?m=Qr0xjbP&a0c(s!iljht3rG+Lu%m6Kw-_&AQ86;G}|?@Xm+<(#Pt z{o2shr|%eADGAB>N&C3)QB~mMms3~9!&wa1)@IJ)H{giV4COx_WfZAgsWz=)^AF;W zb};7}kyY?tNyE3!3!w^b^r;A8)7lLzrtSU&7gJmlbroK7eMh_22r-DZ~mp_KUaR%Lo0=-=M7n87WaA?Q@ylHxq?gbgt*m(yhl6F~Lg_Nm+t&N&>qJ z**RQ1Qg5_ZmyLjdXJ;2Cu(#fRt|D=pCTxCe$si|~+({!U(gPo3_@Xyn_He^~I2l?D zxZK_Nl~nsgQEHv`iL`KLXzdel$||{7TOn_-&@aM%Y1=PXucr!TKGb6mk1xXtHDjw! zv|ROj)^J^!csA@k=@U*t`%dAuH)hLJ_AC;4pHM+y4$=^cWOJb!zK-R#}s;d zThGa3Fm_rFhfFL>rs$Qo387A~;u3A&E;5MdTE6oF_q7!On}wz<>BIp{4QCl{L{6CB z2=tzVu($gIUM%a2c&h2QI1Dzd>yE`$#x+vg$oP5Ry)K!sKn;OPaB|dk^~DBGcK4%d z(J+0~^GJl>hnt7S8RxX6HQNCS%Yz5gt^{{PIv(#=RXFXF5`tPS_lc^(-;Tb+ z2PHI?{q|ehb={QINgVA z6_b;<9|tzJK^v94SxVpVDH|LXey;^zEbT|ZESJGYL~`c$@ZY}093I2ohy>8v1I%&GhrgsRj06xXM*ZgSgK zC<>q4=c!9F@>7I*E(+2(#de!s2E874;c>5beRiq(0b9Y)YDw#UVExfaE`qQ0mOo32*m8}a zg)fSg+Dex57;hLuS2E76oiS9@30+Ix6C$R;Qu4VA@7g_XC?@3$C7=-&dm|>~e6nv; zo+>GyX$n2!y$|8h&otEM%kh7d$w2^(kqs?vR?7v>1Rj50&G6mijUKJ2-6|vO5VyFYOu9MsoRClf3L5L+`ql-VI6QlN7YZ1q&LILQ$Ks{EJ|K#so>eNU6 zde<~;lEu-0^_RM4yPW@I=f)(40ZL({u&`Dv-MHF=zDZ}T4&!ySPdxF};7394Y27nC zF(LP8=X+Vu{P~upwJuM-3McQa{btRM3Nf(IlwvKq^StYfiAx7vyc&Hr?MopQ>`eZ$ zZ9)kD&Cy8Y>SroD5NWd#q0olvbo}LP=-7*Aqs}j6qo#F^Ds13eT#Mb||=Eh36g8vl|oE$!KuyJC&^aF}7<6GAa$ z31;d7{B4*b``qMP9xj0Ld;%zsw>-8Brm{wh(o?DV4#85?<}Ddd;pYgAPdgWVRZKp@ z?ngZ8oi22LeyhUwMd0&W((+r$xx}~AQoaufA^C@^@RekNPTh&X6)3^P{J1%j{mXzD zYqQo3?b$fM*_j{l!9uzO#W=k){lzLZl^fzW8m-~Qov@@rfgci za`Ej4qG{dvOuP!I2w@rCS+pywfFHvqh#@u5vuCjRrsMQsvd>X< zN`${FO9W7C*TKF8;@>BAlLYL_RZHt;-Roch0ji-qS>UaH#QMqOhp-9BLv(}?@hM56 zdRx?|PYb?Ck*LcbBZuhH=1J`@10-sS5!A)-cwP2w*uh{(b>E8IQ8kDSJ&TNe}S%=wPjs36Rqt9U4{Y* zTiO-SWtVJ*>ECpYEIm7gt(*RU*%)Dt%Dy&R{Gt>=%>eqGh;fD#(n&MajymoC+bpAo z3w3#~vNMHH2H!Rk&066`dh~ws!u9-I6D)qAz&ed?`EKx$HyNO$!-dwFMX8Z+*PipJ z(4IKMX3eJE<{qjI7=#etkX7A5w7D(8MLTbncOz$=9pj4aHt3xr`HcIMd+hUV`JHkv~72i*MyE59-ur*(}+;1x|BwF9$MFx|zM2p1~ zSQ}0hivY)FjWC0+E<&=;eh6(_4vuMSWP~WBeYkX(phK0hY?no=V8_3*jkp~*Qvt2+ zRed_8YSlJ0h)2X&7LSlhLw{*x5p8|%XX`Ch!GlU{RkXb5D(dLX!0E;>+c!*$Z78`gp^u7HKR)8LlBZ4Xn$Ry{ zC&)8p)j4_zdGky_ssM)r|F?r(D3x*P1Vv${-;4XM?FJtYbCK6VvhDIpgx8`D*5$C5 z>LU5eahQjvmMpGBs3XHcikyttc@FRHS}H0zbv+6{V0@AZO5g=GF7aOoiWdZJ(Y~p! zvw<+x&q2hrkS;x>=it8I6l>J`w;lNh^z=(mX@}(OjPCLWO*vx;pyIAeg6;N#f{gIu zu+C*{l#1pZCdR-a;)D79897UKg$^;L_>0=1OM13zfBaJPk}&RtuT8H2hb}_ zdEoGxS>tZLck(;}E{5mT`)x0z=pg#$JwJ5arJ8vR$Wi{@X}IQ;Ap&A7Vio*TXd=vE zQg!$0zfCKzQ3e)mhED71ADOkVjn5`Il7Yrra;5O}KS1NJ{UXf6Aj-(L8#40ayB1rA z7Cux_!~r7$NBSQ(H&G~Qf&OF-JAm~ec=fI#1u|xq5RDA8FL|C0A~{bD1S?g3ur+EJ z?yr(v4e5g(u#qm0b?e)<>&CjO@s_S#6@5$Fw%IxUmXkZ)d=(jOC7BmZXAv3h(jdQZ zEwH3jfEiuNo2;cFpW=qlbw*S3y!g<=Y@-}vAgTW?MM26~)+>%qpPxnP^Gd7({v76B z%YckAbwoN!D9K!s6)R~{u@H_H;3rY$T`8iD)VmoXeT4Q!W?VOgH`~TU{8BYYYpcKY z;#IpfK3_@$kX|ApSwbXZ{mOURq0gBZ3U9fR`oG=3 zZWRr6U-cjb_BZCK)9Xi<=+l_Rn z24f=8LIj*+N3nC6)B|;MKq_&IkVz#=SHEuWtl?yjm%19QiP9eVFU3z%ITtj!QAK>C zib#o{?ddIWRc433<5gu{u;k?dT9XLA>~t#c1b3gfPA0~e-@48`n%r26B_3qD5T0pfi8-05L)AtmQD9` z^yIFJ)aJ({3|qDVd-@;ue86ZF;)SF90f%EmFfeO?0W{j7{Mp#;13}6pWHi8NeMC?` z=qs&e(`8-Mz68a)keC@lei!1fZK>I2E&sGbxm$=cfi^kYzfB1Bv}-`4Z2=H48Jp3d zPIJJQPub0pJ{($!VipCE;~jUO$dm8+nm@{dSGO0(ZnLl7vCxmD zQ2M=(aF1lzw*yNY1!xfxxv>QsAKmQf8%Osh4lldI?QxDPy_ymd=}i?$`(PTg-@^V& zLZKKzIU?4vKgQj9Idoy8dlSceO&Z$ZYmUvwgMvLeU&;Qpq<>9V1iw~Uj@g!1R5t~UGWSv5st3&~MZ)VJ z3Cf_JUOBF(JI0G4!b^z8l1o!_FFuQ#N0|oiorQN-GpxVIQ|AN{<)pz`P>C-fxTwI@ zg{ot??9geF3vZosHT&!Yq)_X3+x8lnImnUyxSuH#m4T1sbAhkq$X<=tR}E+hbmn>} z^gh}+PfRDY^u~|mq_$kFWDz?fY&=KvBL)Zd zM6bO?DCGL4E>%r~(>S4FR{M89)^~vTT)&xct!X6fIXppMOtd}i#Ke_BKPajpk1FTz zFMNgTD{71=F;^_V6+HuAW={KnIw4kmvcZW$X*~QA>tInV07p31Sxce>p%&f0?@n4q zZxUI2So^WsghhC#4`>m%M41U5kE0EQm_oC59n70-6C%ou>9TmAh?{;7WU)VgO{ch3 zlEvZIrXAWKUN0)?+n5qemK7_`ex-IFRg3Sh6z41M;pPekEi*J(-@;HczS?6CzADEy z+V2b>0)d6J?S}ac%dCs7tEmg}Y)@+4NDm=LY)5i$$M$b;2dq9ur{8X$=wb>HtG!^- zXI-`Mwe``rCcK~D8I9+88=3KI0|bM!-23i)H8BA-k8t;&6E(!$t~ zE&^&a1>Z0^lg|??ch?2jJ)|%hVq3*jYCft7xrkPAA*IgUz#s=l_Sy)6DWrt!?&1!g*}X5aht8vN>niGn-VZq5#!Z!g}Ub8@EimNPf9%;(2E zCe?+^u28qLG!5%E7#8n0%XYD}7(bJ1U>&XBmp{@xCY3~dM33>ThZM8FmvC0pn-;Gx zVBO2bA2(bH8@cky(W(vW(d`^Q5}~1c>llLL$4K-~ zFsICxNtGvlkYlwxZJBv${y|Hl(2n4>=9t2fR5C?*)4b(sS$R96af8#$d^n3LTXCW; z$YIEBlG;~~+zhS2SD@yot7VOqf!*IgvS&zESJhy|?5kUt1h6n`Fv_^i^pl}%fY$HP zV|L3ue&5aL^b01ln8kTRnzp$uf)Ci~+h0GuyCskY zQttSMp*d+`Xh=8e!jytWLo(M@r3nbOJ>&e^<{EzTtQEY&lfPvj%pvxJlEP?L#5USkE2Y_4;$@m2mCNvJOzWz#`~<# z!j(Szl77qf40CM@ySOh$_hSdM$h<3HY2=UTmd6}5$xfeqd#uee&{7maYODD?OHWwx zrG7i!^)YfEWqWAM)=N7W6kc6_)0a;4(_l=J;+7O3t+C;g13{z%Zz`u;&1Ux-lbj=c zw1Yp5`i{Ipq+IuG?>RdDAwU(?8yuAhdZJJ4LvP~ly}4oK@Ou1fx~mvCq6MgiT7ClHJ<^4kL{Nh zhg-29O&nYt(Ol`Ylpd8W6UCn{=iS!na*?om)jpdW`pTnY3kVsoK6>V2is?%Z5J}&2 zl?x>y&5JQbY6$Oz>@LCR0CC9yOf(^I(y~W*@^{L~H50q*b*F94=u1HQY#uBY+@ju$9^Lbop}=|jof)!F`onXrF76N|Z&J>pP;-e(|X!?KWpUuFU4Re8ACC2q*K7 zfM#f8m%c-i{d>yH;mpLAW$B@+^%98bOlrr2FPb{V8RNrz-%AezIGWjG93%F6M_}#mqAy5V z5b)ayq5kWypC!LkVO3g+knG2@LM%S7*%U3E$}~7!$gNo|NrSjOZBu#>o2X`{y7)p% zhcty9RDFaj+m;e~f&P%C>>aPJnthS+wq5mF9Aaa#CdzUn2ygf3RQx<4;Ulpu8}*eO z>OAGQcaLQW?Jxj;k91*w!a_Wd#FnP)u706mTXO*Pfc->%fWVCE4?$d5gs&_; zG>n^~kL$G5-VwPQeySkEliHA~{H}0s%Dba9Hnt_PZrZ`~$zTcI)ocbg2LHVy2uN-& z*b8W?drJE zOvUp6*isJ&JOGN>r@VSu@sYC-X5S$l+=9b?A5?U#l$iY?5AiRU$5;g^>AjIiK!m@u(fm$5F?YF601%FV%wXTiMcofnzT+-} z0-+!5b%x}mBg3)^#*UCKcHaYG`n8$=8~RmZ|DmZRcP;TfhxJeXC%37nxTOJ>YpL%0 zM&f-Qx8#|;l#^`M#^f$gl-vc*sCaKI3kjND+u)Se9}EU9f;43qGicGaw`}+f_-=BL zI%{)aguRJA)=W>UP@&IVfPbxTZ6fQ5>V|)eZ2vh%CvUX9RD1eD-sFY6(G&k*$?DfS zRGBZzVkj+qwCK`b-H>|F3@%y74FjLmNjCV;%1>E+Y)XG!Nxc$g8P%DVaElWpbX}J& zihYJCA|dC*J#y)KZ{@q}O9=ZY|J~}&BDZ^$$Mj}$W7IGvCrVGz&AR=(=WJlFVcmj=_ z>{XH$e@J&&*QdAiL=P>Z#ID4%;7bLmnKso#nl)>dQr(A$JL^J~Q6GHLEK9Z^^YY^7 z9#{~>caI?ID&4yy#9n5wnZydirdW;7GJvB*_ip{Z+0-4R=;GtLeq+#JR*BB_2}@LH z!;N&-Ts2q1x$KRreC}!sX5I7RI;97i^hRcfD`=>Zs%SAk=!3nt<6U@{G^mCyd%O+Fqg3FQAw`I*#cMZ}YM0I!hElt$2LK^)&Dcu-D+MH$Ej=?MThH-$3 zd2%Q87Tt@y*cXc2<+`5&%7YmDSp4!`qZ}Ya%xF~obH^EVtZtO#oXVN_?8vJ=bB%e~ zpH<=fZ(0F-kxndIaf>?qi098CSCDQ*B&NAWB&R;hX)GyGCD1R zOTVq|b@B*g`6KFP2{v3WK{H7vqnmGixCfgNj>fltf7Nqb6K=AX+Wv^IiU%8=J;v&T zCETCln8LCKZ4Qd8HziY8M?|VJd)0kG=$A0Q_<54xD~uzjAIffqNT(u?iv0}0C;egB zYDIEST7+X?O-E4y;lO>;{n9{b{jtl5wyt^)2a&h+W#mz6EFACBVJrn^N|Gb-$$zMa zMO>nGFY%m7+ax{+yf;kk3WS6m13v`N#1DeH=Xm1vIRlp6$moB6n2zz%4Fq3broYGb z<^ibSra>V$s#_OTf1h<5YQM_?(6Wky9Z<$8lLJ%NE}R^h#2N~3U0PcO9~mf-n^{^G ztB*uCJ^M=b7POT>cJ-S zrmyGokvcqde zwdAP%0<2mSe31!CH9jKLM z=!893^gx{R4Ty7)xd$Mf9%h1DX71zrG-k~AG(!-MK2BAU^%q$_;B!Yw=LN^~D;)hI zsAV5thz8lL?coYmiNV)FFdgDoz}i2ym}|HFkbF0&6Tv}Q%`%;fgIR~Y#9ADzVjUDd zKzft!fi!h%0{E-U&{L3f$$GjcC?E!`*POwLsK{;euz}r>Ws%iT!610~CoUc|WFZMx zAX?4mC?JwQ^$7x_&F+$QFzp7K=cj3FB)z;l0$A)tTI@TleN$QV8aMU?!}?p$075O; zv|{v-?8F*8FIx2Z!ZCrS`ASLdcP|V3N?dD?I{8$1=5RHbG(c^G3#lJ~F&QkK7xwK5 zcp~~2EjpU$E~zB4dRLD18)fYUOMkZx-grIH_&b{4-bKO_cXx##fBnR=Q)t%|uP0Ae zk#Y`cXf!DJ<9F+xGxBwT6K99fX-5G%5tthZFm;`LFi0j{deXCls;DdJy}N!up_$gX1uWU0#ByN0Z@ zo8%TgoMkY3?EW`KTF%>BBDkzauYL0~k8aqz0O4Zqi{G93GNWw-95OwyAJN| z6WnbexVyUzdMD5OeYfgX&9A9CGw1Z_-g~XJ*X}+lBjHrVR)6i=o1T(%$c5+umG3O* zjT4GfS{&7WsR|I|5X1Ai*E08tg?L0m>wkvT=Jh~-Y5xtRCiE}n=m=UHfrrN5cl{aY zc_iepCb2$5Hc)OO{2sZ2@>F>p%>0m}^0rwn1Yv?>B(`0y5<+Tu43OnCRt6-1)GV#b z%!7>``STs{7JwrVfo*h5{Q*+4Y@h^SB|yxw5F;SYo*C`-n*_uKXve|$zK~p3?f(GW znM^8_2qp$j?7dNNHm*mP0d=)}VJW{%Wm5<7?-bj4twM`qpl%yAz?P?8<`)3Cxca^C%SzHpNszBr`NiaEK-0W<) zw#4KSuihOxtay8L60Q(V11WR3?nZP*Bp^%eb?_;h{^T-NgW-?IQpYEqVnm{^ZcO&a z-~LB8EdHY#roG4%w9TwvE8X&hsYL(+TWew>5lGx=n4&DUw~Eq`@}{MIRJ|9S_>u^< zh45(RpM^i0@J>ec^nE*c{KE^^^Wa@M+!d}UdRfQ;>*fl^kgf6Ve?&HK|Fd&;)78Xy zJMrxC2`Kn+mPtnZU~jI4vbCvWS8)$}PZ5|5r_Vbm2z&LSiX9aI?;Z~keZ6n2%I$Tap9>+GUhi- za)ivn32RLVY>$K(!@w{RYdxVm;2E=ch(ZLJO`+XC7ADfU3}EC86}$*v0p07HfqfXl zCuZQTyWG8pdB2nm?KcKsi}%{OpIzuJ_+j6X|9$=LP2XnL6@t;T^yjG`8wCNFb@(CQ zzJ~6+kiTVr3-l-x;^8;gD`4#noP&|*=Jp;@hX`_ZkY1zL3vITGXA-8==hVeni3tq_ zc>dZKlu7K2x)K}Wp2Y5Vh;9cdhCBthA3*TUOTD>~^a_>MPfGhHbD4oH%b65HuzlN; zqAw|AI0`Fr`OC!g*SW8I6GX`rygCCb1m;g(I{tBqzr-gl5JeJF9Qm8WIMio}1o4~k z>>B;_YD}fXpZe5&x`Z5~`Z1c{24c`x@oM(|pHugGY#j{grm4CAeUfvp_2G>UnBAvT zUNW{vliN6I=fzf0+4HYFw~(7K=HMeW#tbP^K#)hpo6CO&O`n#~RT=*~cBIroUz2~e zm&@=#*wn(;nXbw0AIhNXC03A2O~Zi0Yx{!ce`LwK_1D?d6xbIFG1EdWofFO12C~D9h($Z zLPUPG@`0!k|F3jpB7h-rKO`t-oF{ZdpI5Dc_w+BH?nnojf=o$;%ZbqM(V9lj}Y*{*KmsIG}O~`@p2}B79oti|P z{xAl}JWQ^iyK0WwbnIj_w5=!d(xrBP8bg+_DO8|JENn({FYD;f?XJqLNQO8sA+-9U z9LVz&I-09+lJ&;vCA*8LK`-Rkmx(_1E zWs~ZSoy|HRcqBpyL@<*@&rJMPzPQFD7sG=J9naMj!5co%K|P77(b2!6x7 z)$qIC))r8Dg^a^VV45SR1P@iSEzT1{if^+mcIcaT8{w1F&)120g-p6c<$rw>WB9ur zqpz%v_i@AXNLUkw$>T{@#q#{It8&@KeRJ?sPWLCn%B%(#q-d3lAEf>ogNb4%%QW4`jUXz*iU($uBHism1 ze%Eg&3t}}gR3yL+p|`u-_qS)E_m_)zU!f~KECed4O-J0mMPlEyjn!C*Kl*I3q55w! zCnT}3`^;haQ7>ucW!!6zswb_B(gF*8JAp%JXnKH$oxmJslVe$a0T~v|aN?UU3pj|- z$H7gs zbG^*!2V&RF@Nd0^)U3R3vv^1GHQSo3&D;@V%sEfOayR7PhieKchj%=hNV@ks&{}=7{ixjDT5YQjQJ#_6!6q~F<4{1osIg282{~ouXA&vrY#<x>;fcF&y1^^<|mLZywfl}@VTJq`f%TTXQAPX84i3( z@5u)P+b_MXM~vV<#W;=nqu;Gm{Sck4dp&;a{1vYMQHd}_mv8VxBM`dt`eTjvA9|AA zWHY#cq`EFzqY7nl75Jt0KaZbDG_aE{QfQY(V;fdm%3~=uSQtsYr6}OKij?cyYTv{+ z#?%ZnL}kro3HTork1@>NMF76fI-DIx_o+q`D*|$4!03wwP)gEgWPr_CqQ%K(+(`5 zu`9~b)LK~31Z6nI4h4wV%%Ss|4wpxPGkh2`Wk;?^K}1PvP>P$nE`td7bKg#>I~z)4 zH0@{I7ymHUG^n()pEki>-uM$SDAKuICW`~!G+Gns2RMfIWy6D2KKdEYjG4DPc$`R` z=y-g_u`!x>+A;rILz*8xE>I4Us`c!5}j>o;$*i4GbJyKHwc`3pX`->^W zKHyzxB3UG08aa88iCX1CL|S!LT&d2y6l#hm&j}yAM3G~hm=}4o;Qi^46)34GdOS{rhZg4I zWUeSo(}Jr|>s!0zS3K$&Hung)Q8T^iBXw1!W8rln`t!dnam)W zPe*`+>HLpzyp#79*{-)quB@|RZ_hM(y@gPH#{iy)c*(Bo+g%xYzD5e{rl5kHy$SGE z;COw-Bfp(!RJ9bs2seDl;=@mLAVz4Kqt8U%Ua@XyU8r@2iGE$*&HR15*u%p)wRvcO zKq&1>0LWJ99OOH8pGlQEc_2TAh8-MqFCO7E(h~5x8H?#OnP4WdSj0v;tCvlFAABs= z0WtvPcU9|B-;DD@#lGnC+CDK==(^6!o(6Ws64pz>9(oNW>PqD=}Zge)Mp)C|14El2~BD5H;Nt6L;T8(>_456y1AqD?uG2sXZ!CL)1<0 zH5jJCZ!oC0&+@b2*i(hWs3f15lu^B%7I@HcDsN&ZmC7WO`Zt;h1I!*zpWt|0|LdyP z@!J|jf!wIXd*H1oS>`xMW}no5cThL!;VH6~Z)1evSC5eRgh2SPv3Z}LWra-f&;610 zUG+yX_Zl9l7ctSf;}6Js)A{(6tbOTkFbbjKoc^f^I3|j zP0%#tme2~-Zk$Rmet#4hlKWC-`3x$rH<p+qpHJ>l@FxMTNDLe{e=HA)|Ks z!nO2;w%XD+wZF#Iqv)RBMzD}jmv^I(fiIjm+h2*xC;9J>He~i%#A{-^aW@wA)XDbv z%oruk2p2=pe-HK;TK~A_UhSc}$7bGU;hyc5Xmg|c9co=-MV<3#IQQee)6UG}Sg+S;SPZqtO&htp zXU2;}jM))nYq&LUn|QawyKT$OkrTft`kL*cPo1r=a!O1&#oWBB6hGjYO01c2!l+%F zS65~73(u$<>(DOOSn$hjlYS8+s0|@Oo~?B*Aef)wW<)8n^RBjR5x!^->5uGOs)yo`vUv-E#f#RWR!TE0p~VQDCw17^GZT!v6yV--Z$TJvc=l${nUkd zoPCV8z;0pdQ)%Cn!qDVY`eey?R|1Jv`a$aE$xJaBL0P&)(x5iBB1XHrPy(h$f4m}& zJ~`X$?u-ZU6c%V9$tBhwll-0+ZS}~UJ&m!?F0K1*LBj9*+gCS^TVF2xGLLn|ZXI3| zw2$|K1sOYxk#^UwROiJ^H|4eDpyIRCX_U90c+~Wa(xFlnpswW2w*KZlo75Y?D>F&` zYjGdohW3{rSXmkk0NaqRTH`wENm)MwAj`bhDrsD;Pp_|OALVc0U>UNW1s5ktPcSdr zF5e$`O?S5t@cN2q&+K-JY@BC1-hRs!ENEYL9<3*N!82>t#=bj7&t*t(EfP_h-c_23 z^1LhF{w!yq$SWJsb{H$apU%i~P$1;I+E}r#?ArX86{#oDU4L8UNCJ!#UO7Et<+biV zPYZi>L#sm|cim!@uN=N!e$1>FZtB{eHH)Oy-(ylsE;ET0Z!0fgRNBxQbC^}{;w^1d zSCx$^*C14F9YXUW4+<5i4nA9|bU^Z=Wt-Pz|L@aK*+7MB!v8QzJ>Jf;K{_rXq_8QY zp8ao8CqlMMU?)5EAp{cKjHzM;rew~m`>YygX0=#!4HuuX37E%z3^<*|E-?d&#?snJ ze+lBxWju>#q^pnm*bzh1Wvl7l^;{`on62aqb*L@mw3v2qp2mD3Tu1y^45Cls7aH_! zDjQa_+(-MXW49EN7PU<)qO=sfjt1@+b0c_DjDQkkK!2^44C_h{TV;`YHMwokFJeId zo^~TwyH9*oEq>)mZXvO$#PsFR+%QHj`rlo?^Yu70iR1T>+%*NjI^6Wcb%hKJ!v1Y2)1UNzB#0|rl0MV=Gt zBo9V+B}@fle>-lyw;(=kiv|3~4!_l;$U5i@(4;yH%@t)(BtKb}GmeNCecH&l5xL$d zgad}4wgvR^`e4kduwsbiK7Wm~P{@WESxET7m$*62 zS%HnEInE;l#)#dh*G|7wjZ7%gpI?+Xx1PT1|0R1l}Is9O^D&E&RBfs8FIqTv0Ca0fUA@s ztz+L!w=X)x!pP9}sU&+QP{XMTD=eFu?2RtvevIp{*U^JI2MS(y= zhnf}GVCIcj`T0K{z~d|O-cP9XHtIppzmnP+U5l0UpUOED-zMv{2MMp`e_Cu?^KCj@ zQjpDR4vkhZGUKI_XtC{}_#aSguQC_fdHVtHWTu#(ybml29mF)ubCS?bHXuP{1aPCZ zrEc%@6#!(?<*PFp(S2q=^L*k5sfjjX9V=XlEgi&jN_W9)sTlKpy9u+bZecJStlex5 z$S~HSO2?leS(jpnlw2v`5u&J5$af(GVr+zaK#m-K1nd>>-T7MAgUAUM4ZN+MM>&0n zpA&yoB~=_VW!s?~IuVz5t|qX$M(xME4kel%%@yA0XxM5c>j_}<9V2#hhi zB!-Q|YivLFcnGe^tLM!(#r z&y@guXO<;b4R1yARg7ifCE+L%Dsfz`9aQ~O&*iEXG!Q-ZlI#nhN(@6hLm(kDy`s<| zF`ncqyL}GRq;J*wvgnU)dh}vE+bD5>VJHNaW8D!$;G0W+mmxTNHz|xCC*&HL?%zl{ zZF`QZhqKubVlzlFDtr}k=`^Xo&v-y17y{p%Z^0^vF});UKrP*CvSvPXo2{03-(+@6 zT=}LOr#s&};rTgH)7)?aVQtckM{iF&c<1I-i=9aR++o6<|8&i<)VxhB0=}diMH(lL zKOe2a))HYpzp!YF-Ucd=EzCEU_=9R9?MXg3`VMb4_+WmVda%^dXTyeH$rfb0VI+xH zSc{WV;2V-=rk@9?|9QEH+;l-r{|CvYo4c$HM$83hPMQ)wxRXzq@ir2#27ww72U(=v zRhxtc{VY$C$`)gB(1JP1HmyZBx5G5Lu)MCjA&`FqSH|_8lJ0(A00Q|}rE+RDIb7bb zD_oCQRh~Nal(K;iOw;!gWtZlET<@SJ)*zf~b;)9Q^c$?Gcz2VJG3$l)fN||;gf|v@ zEd(zOWL?PbS}~p6Vcm35qopI-yr9?^jYtCh?l~!+#L;7w*^}2!*pnGoLB1-GQi!3E z#z15BsH;=h{Z7!?|H9)+|jUVm(H_;;vUkQ(!^q%70;u}1QN!Cu9or2$nx!a?D)5Z07 zGv8yMMXIG=&+It#lafKWOxg8W54sX6PCE6qjPq{!o2+?ck?+6F6TnQnx1CNDHu2*b z1o8!U`|Z$*U^Aj&Ej!x)Ep=0(;R#5<%zcuwaT$p^!@JC3FZjI+maC+9oQPE02eT3v z%ZYKmok=`)tk&yT$s8_p-;CEYECIHoew<81HfPSCfwP_eX4YB2NggyXSFA^gynEl9 zv^tN@TXk%R?Ia9z*2Jtg8zi{LhEb(2AY^XgSVZQnn@@6WX`sT=(u}TDeonhtgAa*t zqENMB4q4a!Q!=uxY@r-*u@d0)G&RqntSU(WaK28 zJ}GxQ2n1WtrMK?;!}YzKk3K5b(q55%(?7q}L|NHGfe+k(k)LBc3A67M5Tf39OHYma z6mKWg)}Ifjm;U(VWI1^+)HwRBg~nu7d$cIK`U2T+&6NReGCyp-?nnwX@}YT0|AqR*BF^8tI?Re`e&ajgoAIf zkDwR8u?d)R#V$jaE=Fyx@9c!T#&W(%5yJBHmQjJUrn*uPUaxdlS-HHK$a}>YF4XGO z)^VOnf$IbBFE^8MQ~DB}jvoHS-GD?mK;jK*=rv4?5Ep>wI#9s-)z^|ni} zek?}6u&@b|27=Gl*Az@pumsev5G7Ns?6fd$AdOYk=_n+ppES$ zf0ChJ7;tNK8Dy>8wy&-kpW>|ic&rUZLGT;4mm{^)NWo#)d6mXtR3sKbNmG@@6ZIRn zcg+tV0s&!!Fqzq~{ryr!Oy_}6?@TZ6kn>Bo)-**+`U6kW;3SY4Uh5QF@X#B)14B zYebHRONMMBudjsNLp)Iv^(Z=Z30=gy&K6d$>^)-8Wot=rEdOIsKrdjzEsCK0V_O&Z5I4GN(ldpEqV) zPo|H!9R(1wL~pq$Vx}B_<_X#V$g|r7*2F}9$H}H4#6WPNK-D`;m9YYch%5Tp14a5m z3H?k~$u^_s4X=zKY~~-BI7HE`SK6U_5@~6!VVJkJ)7%xcPhldy#6ub=x`Cg+;$@yv z!ci5%&Unu|Rz6z3h&;$xSe>g$$hnf4)fY5=mTQnXn6+z9J$7O4YzAX$eLHNm@Y4Ou z#CIZoqBYsfF#l%4>N)Ir7e{#puFKLNgX9gtOeRk9ClZPvu_ABR^w7MjlsgVEuA~!# zViC)`7fEtmRpWZvvk#G&-eZPv4uu3q&8*5A zv_t5iN#BSc4k5ykLMKCOB&>t@*Hp%hMs~RMNYtgT0V*@$onbxLT_@}w)0F) zytxP3C$Z%2+=*D#NBdq@&OD#FtlR0__Nkf^LH@`H1|Nn)GyphdfLFNJ(k1}fEkUvCC5JM6@lapOcC?<&_`v{0bXqzE}V(kRz^81oL9_(%y`u#en3Z0bUcc?Qq`U_7SwE-72* zpeLddBVbB?c6q+RORY;fVU|SJo?-81O)h=G5dynm%Cz z(&1%UIAGy7AU{1q0B+uZ&!@x3yp499Ri=5u>in|I1405o@IHYXKsO@P*ue=vgW#;| zqud@It?r$rMiNsjyWy&-yV4Y!c!~Acw1tK{ypr((iaad zVwhEJ)7yUPNH2P)kk$YD{?)Lz0BWNh@=ntt^&%*|v(ii#c;-nCtu91u&9*oG5Z?ay z+K1~+y0NRpW;k@;{tN!uhc}COkB!7lDnp3EM4?xmmzqY=~Aa}05-D`WA(~Fy7uFz6F7At$Vss=K3l(13jHGk738x9Z zf~kn-D1EKBYtj`vEnVIf`};bfhhD2pK#$-(1lYtZsGij~%-6+s#dw<>HEav|k_K~n zJS+{pc{^~=XDj4WrcNdplRV3rbW8oyxU`xca)9LC9yqlmQ^k%Gx)MkPj9bM<7hpfy z{hWc}HgX%uiXs<1RTPNIU^m3q8WT6~3W*|iOVOqP$$@RAunS8mvy~{1Bj$ThH}E{zx6C2O8rcUp08 z@PV-G&(gq8y?d^t)(}{AA8=&!7S?HDii@aWt$oIG4rX^;fi_-I=a!oXvc0jL$`4@v zu)DTzq$9W9+xGP@ZzRSes$hhLvDjV_UW0jqDsEj#MZ7Pyb5*2#x}nxqg!NtyRC1`U z`xm8wU&^ThRQjZeQ9d+jOY42t-Cb!_;nNT$p&`Sbx??~>k0yZ5slb)Q!R%v<$hxkr zwYmuYngL~k@uQsoK`hCR7B8=k!&s8lSd_JY%c2$4Wmi-Q|1iZ)(shH0g7bR(S&ZXJ zBU*IdPEg(h{ukI`YDeX5@KoWmc!Q4uw86H7AdYI5zg(6MLo6qdI)U3pg+vDvgfKbx$$+xA}Z!d_m%KN3j*k&<1(c^W;cXXr+NaJ3V)*X&oF) zWk)*2gxelRwZ(!5RjXiy)8IR3}MD|XhR)H>M>d*7l&-=|hv zN7B6#1tugW*7NzUYc4?q_o})FJL2E88Uc*BFEx{xAetsPoK-ZYR`PM2o$o|DQEox% zwqMw7*RuyGl{M-H`L%1bFjU3^n)}kv&UKp@VU0}3I2NjoX9sbSmHpVzdCwN1N55l|7dHSY^DXz45^F7PmRDCk2iyn_kG_God0aFEpfL*?lQ z5zkg!R@79|g%A@58+#?}rE z6Y;PI5mazadhR`cLwQNTNpYp2N?A@guFm2vhIPVOPT;mzx4@S99>JFC%5eBLfKyCm zA@Z4eQH}wWWdKA`^zbVx%<)Q$#8E1#mx^oR7H$R2o3s{ zh&TF$wrIxbb#quYpd*r0pfoEKGgKR2n@FskIDOY+R&SvHx_=t@zL`Uu6{e5Vv{fmm zAUY}zD{*PzKQVe!`KSSo8$@AD5BzLfd4{5LFRzIBi zh{&z$;_S%;-$PB9wu$$4FlHt3huC-EMt@xK8pK-zM|@N&@Zi7x6r3dBMw|sU10(l{PH37)6E_mBTfCiNpUf`5p!0gp>E4sb;KvDjxYnt_inG6LUjJ%e(L;wd z_5Lt!;5x47y2Q>zTb(64V>(f+CdT)os$i2St1`*c$dBZ{O10uaRxNJ~sp-kWFs+gmJe7>c%?H2(QWHP-;M_53CKIF_VB^ zd)5XtFQ+;09(73RTw3{~ra^=R-k0w7bJ#pf+-IQAIquBv6Up(iDo(dtG2;}it+=3L zZk$kT#YJBME>Rd{#ypWzLJ6C zNaKo>ng#-R!Z6e)b?(lzhgH9L7%ujK2X=ZCalXr2lnv7!eF`Iwwlk0WK%cP9mEw@V zP#yk$hmi{F)H4&8q7W@AcM5?q_$#>T`J=yCN9VBpMBSKZW~Bi*_Y-)}7ZwV^230ISYbS)=08+8B7p_<~PFJ zk$`(hn=lF(GGYe6_h`UDH%p%~L-^+t^RhuRNy-~K^3A` zzeySi?!e6TRK(N8_yWVP9DB=OBZmU(=)CCpSxo)g-3d~XfUpP%xIKUiVxi{?ZZe~B zxQhkO6k(g18FU8}6y!_zQgrGV_W{$H$u9{@Spf<-47NFaSF!5L*ABRCW1a){+?A^u zOF(_`AJ-24suRz(Dzdjb3kD7-m7%Og?zy%^A)kd>%Tg-PKHGWUPwPYWJb3*m=w@&B zDj2mY<)SR5-`0T44FiLRqlC;|G)%FYFC8Y_hFJEa%NM0E^kYZb!KFs1!Q=AmLv2(P z3AAIKqjX045F)!VJT0k(I9(0D&94Gc8x~g2n14}r*O1o2MVqlp*})?THBuxC13Egk zwa}3q$`&jQomIoSZpK;Et~ct7hF%~*ZINW5Z@Ud%#bvk(1kiV1(g6&NG7zemX#`V2 zuQ?>6blh#YAn@Jm-cYk(D-AK{VEd%c-eb0Vg`z#Xy@$Qu+5;71-${@;Q*3VyM{gT{ zY%VZgpBL&}Eci(&i`XJs;aSCePN7ZV7NCB(j8ee0Bv-yclR@)dOOy54P0;i+9w$&T;alcFU&9nf?C<%!?U~Q>007K@6YZ_M4|G3s?L62 zY_VJDMnh8Fydk=*Lw+=V{gmWQXEz5^VEPc(dm?*F3kXY1iqbHWZ3rhL0Qr-^T}19| zVr?l~OZqOmpAm@h%Kc=s&-jqtI)U6f0bCOIOR|dPO#?zXY>u>J(jNjoKuZZcMC4TzG11tMdy`4e z0DgE5s9H5PdTY7Yq%sj6OAm8W>*Ld1D-tT872Jv zuL*^LXlH#IsekmH`A5A}?E79KIfw^BSr9*q#%;H{XR-&A4)ld3uej33 zBC6R+S8-SG7BCp;vmP@I_1o!C?R)f-I&5}In|(4zrbou&y@_buxjrP@d{QGW*m`c0gGN6U zb?#v{5eCLkZeJ8(Y;6rc$*98Mnr#vsdkhz0bUsuxZRBF;q9?>|qv2atm$d+zTY5o$ z#tJ(>WdNRfXz$QIapEWS_V|Z8EkSe?(J~WkQp`|H?R61-eTDlcq)2prc?=Kl8{MV5 zkQoUIa|xoXa%(F%_plcoG-8tKkDgG9QlAxLJ0%$ie}R1MGYy@xdiX(-+kX4xY>!?8qaAwZ;B6;yL9M!9ZT zZW@oBl|MoWi~X6E-d@ae`E9*+se?_bQPlE+`fS~3gq~jaP)!=hL07%G|0GF%ENU#p zuomY6r+~b=xwpYk`@mp(4?}rb&3!&OzeLWWvS#vXq%W=yznk@_?)g*Eku*R}OrW75 z%LmSRvpQcFaMHhpv6Ia4%vlVODgNS=24`P)m-BX5w*;m2)}O?5vM_-@rHt>R0k^mn zgev|WQZy!QC|=|AnIEDhKAZS6nJ=>};yVDnXyYU2R31@V2G+04Lz}-cwXNA@)Bn1QS2*Uyhe*rcpCo5&UQG> z0K0osE!0k&uu$?ZYxWsr>L~r<2#YjAMkY8{f*$`>=yXh7`;{jDIuQi?c&6mv!|@_9 zkb`HaB)%0SpJU_;+w*sSC2Tx_YtYg4`dW=?sGt`Vz-cI?zw6s2>f^EtKgqT2?wwfv zxsATp3HtQ%Bn%iQ2tyU_)wQtw{I^j5cPd%xE`7xA_oE1!WYuejJeH!;kNKaKo844? z|0&E2Z$JEg0e~%lF-|Tgau9k5zZ_O<&{-^#2s3feu#k|fyh5AwB%QM(#PD2XaOQLx znm8icd<>?{ep3to$^s~BdPtWq&x;Zc`-tX3DCN~wgZnBo$Ga3#M^d|E+N#UyG7Eoi zjv+fmrSVgah4oaaex3tWpR_wQTpSjKqKrkaCErX^^R>*&m(SnJjN6z+9FR067@Wdh634p_qp9;7+X03lo6 z^WxM{B@L*#)4pksgJhgn)a(uGQX~qQ3p-ll99uhvZAPrtwyxAL--aO8NCiR#v#iju zMZ`3Z){(2R?~ybFqr2b15j0}iMPirg_)5hxbUrSG-6Lgt@_(HnOI-*m+S76hNwJ)< zodPmEGw?}{VTyQ@rzS%RNQ|zza6HyB7N~73sJ9ZXX9P3g^$hIYr5=t`U&}>;c@_t| zX*Ui_AM~Mt251~k`EM%HoFWA4?QuEtW8AX=L~nEGAW8f8oba!P*-#I_Y>1VYRMcYB=Df z9nh8Z`>*BlC8)lU{95L{N@pT*`fKM)H4|=Hf>HWd{8a@Wl=Bg}(F8}x0ZKmQn@}AJ zhIUyMh+e!40fkXsDB0KZmm@AIN#!!V0d9`wn?H|TF77w6=Mp!<)qY!_eCqoX`Wdk_ zkJnxpLgx!CZR9v75+PQAi>=#OgPn4F>T-hLRLiC!mP@naPzri^K}~KN$fm1>GAEQ{ zN^KjOe<0_YS7`QU?t|wqKVMeqZ9aV&+8H_sSsX7=p3;)gTmF9BP&^k9fHd%> zZ*+z&bUV5=wh3pofa#OGz6NM1WZR);F>dXQs)`0#7{;Wg5=Z^8^mVmoh#+$kL#h0 zotQ=yYp;&(J<&p$r>1pg%KsM3+SGwX) zx(i0E?ke@52qymYiDGY)?5ehE*N(Y+da0q-)t9Rg`YzQfjVgp}ga^?LR>0WuAz~=) z#1-fy{;@Q90JOVP0D4ABs`7U&@*^$UQ(>FlylX8zR{G`EV`J!qMy3YGP;K7@aYJ6ThfFp#`zG}{wxbVN|& zVXV$VFrpp`pX~=N>ld+3h2V^|Q@BfxB^x(bt6N_@xu~PW-ASEbsGfhJR}fH4#rH|b zKR8n2FIlt`QFM()9@a&3lw6_2`0?xON&YOf7_Fh1RlfAM&zdL#c74|3Uzg~%@K}i7 z3QYdUilPt|zx3C952m?L-Jn4-UY>`5ufLlt^)be-v{Sx=jWLgVrQsCUc1bV@N>1lW zF%R3w^fLRD$wm8F_>(X(0oy!%7+87rtC3O%{<15}Or=XIQusrm`Nh)12vgX$Ed|_` zs`d~leI4oQCY|4V#h(uuz*eD|#*UX@QI@G-KS?1dVkpsZQX*1uYdc|FRO~^_Z9`pM zqlbGI6?F-Q*&dEMKBn?^%vN1{0*z;(YLNT9WR0=FaZ<5(lmya-#ir_5_b}GZz)09b zOr1c{j&bXn1E)?3hclmw{Mko5Hv#*m%4G7u{xgiirQ!oS=$CAY-|7jg&?Vuo_p6Z{ z%>%!9I+);zK{J@JCzUy@)_eFuP9qrkzB@a&znV>BDBNV(k5+eWb13W}q72psWx$`L z{dS3>W)`JA?0nrX@s^Z4iJeBB(+n5O1cN2bMs|?@-<;pf+3bt^bPB!u^V&rn;14@? z1c9$h=RVRqZ4L5jnsc;rB?&&Ch%V$Ex zo_}6E{fRE8r^KyxV^Ck|aL(rTF>FNVwc_HN9P`GS8W$j=HjFtER6rALEMTM{7+1C= zi>W)n$MEA~l-{~?ih3QiFa%cpWCSfj%w>Z)kjKorpx5S*lp~lSq)s=v;1afqBZ|iY z_#4k^FLcKtdX|jTT@?OeFrV+7mBHlUP+qr#qFs5eGiE}ht?@!qJog$nuQBuz1m(~P z;W4hq6@k2&$nd9AlKv)ph#)6j?pg0er1b$f!psviOUv*9pGWXaYTRgiwM0YT@{~fm z$Wp#=DrL}*awVvwnb6!K(pvJ7m7vEv1&75G2}>74V$K-!x?D#1?7MI*F8~}J+30g6 zP5!w>;l-*T`I%P_xBVt2d&_mGORQ=_euDZVY~NkX&VPyX2t(o*k6!~|$R?WnL#l%8 z(G$*kYjC)U)gT3OrNB}Rt(k#_|Jp|Rymk|kJIjR->w4M-2Svzizk_bSkV8g;o!1)uwkH{26icz(@}nb@X$tAzTU9ojIze5XZ+~!$9TkQNPGN>7ZLE;@e^#@&ccN)GR@%H!>- zRa5}N-3SPW4*^l-fcJr5#&w*=@zr#lwXVE=jVLeSJIz3}7NN8hXJ-xWUPawwjBXnD z3nMypN)=F0N1hPHN<}uydamv~Y)10atJ5gXDixD9Nt<-xjly3TN)piNTIi?HW&HE! zgZl(JSU&Zr;;L72zQMQnm@de0_gt16fX;rlI4&^$<&*cjimS#rP>5pV()N3mlbIM| z!gD&yFj=$c(__X=mU?cg!38Y~feINMgo>K{j8ku9Q7WAGr>}z>m_8vx5@hr9V!S*JrZbF8C0>Bs@evW7lnX5BFDkf& z_osJt9d%njJw)DTxZ|q{Ye?XfFPDq1bbk_r2{JOI;~*qBiX^EQY}|; zDAJwix#V#d9nK2Zp${bBVZYO#J!Zq%1?;#)enpu4>6HT>w(FlglF=fLjlv2rt==Kf zjpX8eDE@e)ukprnqw6tnN0RLu{5dr|u~v$ZyW)pCCtS^jH7X6vjlO1C^AS#Psmwc% z(=TwZg<-ZryQIixYbFMX06UBSL()}-Mb&Om73uB<5$Wy*r5!@Ld!)M?1gW7#q#K6r z?k;JD?vn0C%6s_kA7UPu=P>i0z1Lo`F&Akuw9l4fuoY>ka3_1-q|&F0&g6g2wQsDJ zJm12O*KXy=fck9lIxbY#gBtu@{58y{8En^jSX8?^5>_8CAArKy!BOJsX6gbS(En)ZG*OhB*YVd;bYf2q1-W<+^33-7RO?v>nhDs%-)OQ(j5#^kAI~U1-XC4m_oR1FQe#zY4cL}+sxZ%aaSuz4S%yIi;osF3DvN8tMJ?08sse$JJ+UQpTbD=X%D!# zV<8!^v zUi6)t6-bmvIi3{MVSBCW^kbnOxp@QzxAl=K8y*jm9-_xf2FfIb&uv~2kP(uN9#yRv zzp3JPJBLm-o&&MvW>HGY-K+}oQA4b4CTU_`baJmp0#mQnu-kaXF1xtkn{gidNq=BG zhM$W<5!X1<=SUI^uUH+8GE@u<>Bj9i=Pvr0^1vx+GLK3>mo_0<@Y$8N7X_Enah&>H zr6=RDD7@=6uMs8C?_%ZB10p9rjk8_%VA14p#j=%R3Y?|_&^7{R4FSUrw8i|*7bfh# zG3rQ$k}H&}>Vs9Odj0S5GD+Qg25G2^4Bju)|4QsEcuS1UKY?vziGu$P&hI`brV~WM;)PgaJKt{7e z0ExD}aX`EBJjo}Ut{e)iU6AxTxTv%ZWoMUEztU+zttDGvD{j7`T!~3*R4DxwlFD7( zFTzZH5I;-tRuH_&n6v9d+5I*ReNJe{>Rzr{QBRB`CBQyJ^IIF1Lp!{TUnUV7H~;Wr zps_{HOIzo7sQK|w+; z9I^My2J?3x_95fV)uh-L8dP<*Y3`(3aX9uZDz%sozY#KbcAv6o)**nWWn zy`MDU3+_*T#|@3UZH{yM4>`|9h0wbe*%+y1R(^D5(nY@gKu~HUwZ#h_Z29Fo`n~-q zgVLcj8&8x2h5L8QFDc{!c1N916uMc8HSyDKZ^Ix2YQtpBNXASr%6g-tk%LBJJI%Ch z_d4ad0S-nw*Nhs$e_x{*ExwC(*0PDWkA#SiKI2mF!U{SZQnaY2SsmBQG8UvVs0<)c zYwo4oNtYK82L0nz>x`awJGWEL%P)Lb8MfLtU))OL8NC8G+bi>)yzG0%<7er6zUaRy zxS>DI!A2lp$IP4Td#{c-q#0Cfet)?-c%3?~ojhfQ>4ax$thhv&U%Nlv5_F$wE~~k~ z(kJ?Ud!)+u8^wyhC6Qr=TNRw8@+G;d^rjj)*%i`O`Sg&(h1PCfpQu08zP<@ zW-tZD>q;X?@?)6}j&u6v8VTrM=q{i!u7=#yAI)bF*!MyK#L`+X^D^q5;Fmw5sr!X6 zib?#+q`GU9uc;!0QkkL}G+6@&GS-}Htx^7{l&3`~zvD;wzwZHAuUtvQP0E72M>+n(!+6C$OOY)UjoPzAKRy{nO;zx}xg5b89p)#= zcDxcj+IzPuv`Etm#*>R>>&EYqp6Dd|lH3bVr$e^zlLhS@)X4TEA`eCjNsewmH2%cS zHEka`lJ(;vdh1GPr>!ZbSO&R;oBg(}HBa;CsOiwd>!{AXc4;g9asG6EzX{Iat~Y*% zZ#>6q(-A~Rikx8DSonh`V`=lx(Qin9b~BS09QjVy1h`;XcttPOh5(K zP3Qv*=?Y%IR5#Y6wl9LS?c>&l`Rs5Tpu}lJu=9^gKIlh#vM z9WQGBI9AW3L(A4zMyk)3?i0sn{h;=BZpVd_Hd*IEwPMT2P5tI%PPv8&dxjb%{L!^G z76;ok@m7vYPya6BU>(oEdYJ`~PAY$CDuLp%oUN~y2t0+nAKSn%zr%Axs7rdIkBQpX zsO^Ds7w>*7-k$Qm}3SKkhn)+|kL;>{`r-6Qh6B?0M_3E-2X(nLn2{puzqLJYoy&-!0_9DFq zeu_~t(Et^3%W?etAG!B>CqC5R<%JvIv8GcDS&8#E<$YuBZRaj*@QM{^sje)}JpdS%#D1edRe^bZym>_w*aTBk+}ey%roSPt{)Zp z)MHC9gv^REt%|$C8RcN+Wj1&Pi=8Cx+1&=l<%_YRV-dF%Yd=%i*6be1MgZaoPsVQ$AKYog?B(VFFWaGa_NkF z75aTN(iQb-c7({DIweCcmpF9;DE_jS?-6j(516P{3id}`=AV}ZCl>v5etr| zFg?{9lC4vsV-Y8X1?x!vzWCYV5I}8k1vwL}?upk=dfK461Yl>0eRLl!#EXtNd*l2B z^d-_Q`=oZ>;0QBmT1OM}(DYeV{6)MNE4HUc{<(6llVGZhmMi@q&uvWs=|&LXNLa4i zSU~0&6i#K~nCTAxiks#>hG^s0t~~`W^-k!Iyj^QdasN=BRn=o$)@>h8GM>}!n4;yD z%LY4Q_8@Sj^^lc0u;FCFiY)7@^fL}qDcP|Xt`JZH$uB=fIal1nr*@nx{MV|jilfd2 zRwC2BNRP2l)0M3D-w{Uc=l@;w+2F0xvG{V<*;QR{29k3vEF#-l<6u;kTVhiFy9@Cy zsuSArV@sQ`w4g@c?elw`nQY!o@b*vzeu(eyvhd^=&@-?1TU;Aj{6inS65P#pYQP14)_)cIFXSCQB`xL%%xH$@b_S?(Y9167ZL}I~^A5=iSJ=LQ4 z?7lDP_|V%?OyJ^H*SRvm)_YglnTjTk_s-Y4o&CmUFvwh?fo>vBcV1 zM7!!INvmVy#GStVQBu|#Ch+VWPOMMQAw`|1S`RcI9J?;`#|c5C$I)iP*qc#~KL7e{ zO|+>RKj#WMq>1GyT8{Z4tbh8K)pJiz@OM)!v~R4lYI~ips%4$KN-@zeuj=ZRVVdjb zv)K9tEJUv~B;(~!d$oxsjpGGFek;gW9Yq-OV)SZ&L*R_kj1P-`Y&s)R=vyQ6A1TeT zHu24wl;1+wKe$W8Rjb06Q=oTjzCL3i(jNO~EY2OV%uB?uSV^AN%pnni#vgZmzW)A>#El3&!b?o|!i zyc41K-UGc;bY=+`vzs%mm%aHliM^0R!O`r)kHYBPuSQ^A8-)>mNut81!1V0Tl@rtx zf8%!AUFmc)9d@2k_s?tqgpB(utL>VPdB1jb>5L0nGx~fGhhXlK^kIX0lu(+bXvWOn zb5oD@#CgE0@3_kIFs0Ni!((lJq*k8bN|$tJVrgi1;t--*ybfJ%BK5fjXg&z7b-Xppi7J{I&v-B@r%Z6ROe+c(HNOGu2wbtN2hH7 zd`tST6Ri$Up}oMY_Osy{QM6!@$|%~5W|ueW`mY_D)_JS6FPdce*7LhUTI7U|3BFMf zQqhWC$v>l>8QD4@=bITV z%I`N(xgjv~Nl4N=IS{ra6?(6VP9A}p?JNBO_7qa7_YGcyF?*X}+-1X8EoHU&_BhfRjTk_Ue z&&)r6#HYu^kILr6vYnl;V^gzTZi)8bS@|>*ag0kX^t&{+jQ>#aw+KsT3CeApo^Woy`Tkjbz}*Na>@dWR1QVl(9|y{Fk@LCo-#q@V z*ne7siJs=0Y1rWz zS62(;94x`rbRy@da$c!VNW11B^KB1NY_35vLVymrW;;=F&2p3K@B-P_!<`et2I_tO zqWhvZv**SvW2M-Pw1dm;zpkGFRo-^Jo>lx814~JoZ%FT&0vBB?`9hKB27nT2zeRB0 z_k0lI0UAGvkPmg*due{fNC&DrR6pN0kKqYz+m+Ajz<=X80^A#Zo|dX86^n>7ovC=P zd6l`V>(<#_ibmg$#n?J>tVEeG0ZH$yxDD7|O_g+ZSQvfd@lJ=pdV=Rsd_-U$hn%W9 zr|r7JIE%HVV-zUcmm47FX9wfF z1@C*D(*_ktAvcz*{0cS%-@aJ-=-?br0l>wwz7)}00sEyxP;#=@ZN$ydWX`(S&fDRD@LB8vDU>QvJ#lQij%^g;4mWLGk@2B8EIT^qgLx6~XX zXprr5^8t0j*Smnk==r#>+-(ZdY;jMwbhykII1;jKZ39CC7TjST4*cUQn z5n_TgwY2R7@aT`r>R&09UvQmUS7;PRR-`Mw{`%w-7_M01abmVSjNu#Fzr=^u_c8A2 zhR_bqy7kFR6V=V%F0y=MP$;3ElE^)3_nrDO zN+m5gqq0byk=nN%7;ax7~$Defca+2}t= z=sbg_s$B@NR-*R|>Ei2T@@1wzvFEO2>etCk;Yhm*KlUlO|Dwz>3=`jKzZpa~DQsKz z3QCvxNdF@&#F*?S@9h1E<4p+cV{O+>LiZe2^O#_q=Vx`@6aCai7aE_i{D7ULr>+Qt zE|5b$tB+I)*QVd}_slRAzoXu20A-GKH5cM4s<40r9be~9JB|Iy_c(szNEF`Ux zvwTyDd_IZe>F(L7?#pa}D{?W^Sp@Qd-51Kxb_E88>{2QC=iru-zjh*Dp_5kKSpCJv ziaUj~63budyV3-0_Lse$>0RPj%MqFl#nb;Z0{q@m(x5{cY{sj=)jFEsSex1Quys}I zhSCt`YH|zt!4p+MdT_ZMkkvzM@tVZ2!yz?k>#&47C82)~xPQh-9Ev`c9#IgW3O1^V za#&dvlQ=NEbi)RY$$-n;^Z68JzFu#$C|)XKg>H^N_D5)bjeYdy{#}+PQ5|eBt*_&? z$O5>+d37B$j#DThjFpV1L^w6&Z4R?ioq+pA$ABMirYaLQjd~?-`m|GHG#h7H;A7H@@JGs^(xx_JgsR;{!5jXYs5m8f|4aHPw<=&UR@n=2Q?>dRX%quFxp zHPt^L-9aP7sTs*UZSK9|)!?~lz<3<(t*`TQMye3Pqvw#yZzt6b%7vf(s(vh?1C^Xh z36?=aNgs{xrqBc*6P5$0ik#lZ7*x`53fzXW68l%0RiU*eG1h&GvqL?t$=)zrVcQQL zTe1!gKi1t*%Mtx=^{~gXde#ViaaXaR?{U@M;+9G= zK^0m;UVF#Q8_PmR0fZs=TC?!Hk!|*kNc{dLpyB3k|IJI90!F=|uh*zU0o5CJ+dE1x4o)Ep5Ymu&b8^zk_S-8P4N4N^`#LiKC{8&b_r78YLWKXEsd zLV@(6bNKgH;;EcWD$oI@f`2eTs~AVfd3zXJO~3~~|Lu&{r|tbt<>;=85E{9o{oh$h zxegQK#E~GD&9-CGJOqleBp6ntKD9cFfqOsKSuW1o>&%h)^=atnEtF$P4wcPx>71 z2$qx_&)oPC#IR9fyoWV|q}U}s73yPs$%QXO#Oh8Hx-EvM$O@@Y>F_zF3?b>m2B+H& zBdf}E42Wz4c9nAegX+^tGhT}%8PXo8iPE}Moew=R|6F- z0md^Domla%y2`9Ky{=E^*_$#E-VpLy_A?0()m)$dcZIyyYOD0NEuP?JX6n~G^-qH%&aTh5&@>)!j zlC{iu$~#}Zm9qFP_~6+`4^Dqtc0|IxJTgz@XCL>|$oK_|J)cY0&_t7Y z^qnN_ig!Kw8t?17>4iimjXTI(F)Y7P3Q-xZ6m#wblwAf3VOi`o1N1W z2=xC}M=2|^L^6qj=Pf>$%OF3nbGXYK!I&_HNUpF&zFWLW;&~$j*g}u@&#^7{0nLo* zysp(L71lPLk&K|&B>{P*S2mJ)%fipPnLIA^{CU`ZKdidf8Q5613tO9?b$L_yuNOP% zM$aqW0RwlSPB4w1*noAYRo`sPTVJSH&1`I#F5g9ecp0Fcnv1+sS17%?-W@ce3U=b2 z>ox!?(IftbK)UC8Ek}iP3mH6^(a2BEos7rC4d8xMbrQCihj4CHb*$|%S*SXNuNv`i zCGS|Cy79HV^2rkeTyLCZ$>z(r;9J5PdI&N%8eDona8T)`Xm@$bOWo#e0fl{0IZL@` z?VWihnl-3>X}pqEyN?NI?s^r_W9?EtBGaR%Y<rZ+8B$ye!etx z7`z=ir^VU?2FSOeV8y-YeQJ`Z$0P#|tB3`oHFjYQS3LkLl!pw*h1i7>GCuunJR}_$ zsMd%^!)f^vdGM|yAMVUO_LTwsEkHV^@Y{{I$sz)Ln~TsYw8rv{3+ht>?W;Pe2UV15 zCW)0RrG_i^U42aTwMBZHjN-*ir@q*Pbi#-O$N*KkniT{yLCauS1UkBR=6oM~E-nz_ zZ`^MGLMDP29!_D8_WB4bwH^iDRYX@4i_;MHB>0Nq*mdHBBYRIN7Zs5g;+%pC|`-L)zk!y0 z?|CFR2?DtX-OJK}En%`H;o=3;wMx5<^Y&5J2XxiNil6!~lFi9GRAC1}POV=G>mGoK z#?zqn^Hwmy$-6`40+)>gUwd%WsEh(cpn|u`0*xv3I)wy_ZrW~E4lr(MIP)AL66!qYt?ie56Bw2~b-cZn@ZIzVfoGKuLg zHy>eQ?CD>C_ov%*>#|+%$39di5wMwmEdsC(_ORw)FcEPMc!J;mgP&3KCD2wkuOO34 zPHAg(&uIycZ=`>}S7SpGd8AcGw9>q4(e!o^1RK7cI?#OWmf85`LCSH}F`0i}T&Ho% zqGpBn(BLa+=UJh0#dE**f0%GTrx)K85SSVF6%^n2oZLWuI3F8&Zg5uBc!vtr&zep7 z*XfG#iIVQ@x&Tu-rPrmiS6{s1VH=C181%B(xDt(1WO}6E@tKtAUm;7mp9!d;ZUnu6 zYSfqY6s3YTF<^zRpXt0!ij|0KBHBB`#(m_n4`R@R+s*;JBk?4+zhs)7^R}dkM#E~` zCL1drCF3_&6XA{Jim6Ilm+I_$ueU_g&hAH*k=C#VuAQUHJPWv0JYv^HISvR0t^xb; z374(=fc|YAEt7gDT$=no`00ZLgYTIU)l!a+4vFvAutn_qVgRDQosL!lB)=s?{`)NM zye+V9Uft_E<3bkLpw2YJf05F*)_2k3p;q1a_$+H>+)){*w=XX2#SO=wcAbkG#=r^S zwOr}uh(tSICYg)r#bj9pq4sjRO+V zf=vTGpe)_E+3Wuy@(Ov)ueHgfu~}GTR`V3XkPZll7^*rqWVf4NIlypkT;9(Ey2g+mJAq;;;5~!KTCH&$7$CkRt9tM@=h1>0~i&{li__ z?HGXIe0M}RZr-BlH5Do15CXKkXIZU_VP!$XjKN%VL$o?g+U0#`+|8jg>Vr85F$#4z zw(`^O7@NtPVaNoh<*lhyhhGOZX;VEaqyM2rV#m++TaPDjX~!nFqaos{7<{EyMy4+T}eYN%V~r(K$N?@ zUk=G+i1M>}B}WZ#@AnWUc8vw;cn21^7IT&aAfO-ywh2?}fa_k{V+EcPF(u?&2Q>n^ z+4aZVb%1d_5YZVJfd$JdBpXFlb-X`s1f3JoTKVD5v?BLy4$2(@nt+I+~oWO*W0Lr_dOueV%+q@$eq<5KpMfg0j5RluraB;(Foa|K#nXW-*$j1 zV#Z(1Q{FL1Kw&umoQvHU6e03#?{?Er)tHUdnVr>{gVmF&kuY~((}_>zrn^PFbFzF_ zJEU&)i5|+rqPMRkelc@35i|=o<=lZK1m{P^;U2p#J6>@ChDW7k>h3vzj*R{oRt{{- zkjAX=$0k3rIykIy6Tr^M@VXZv0iu-0T!PmYqSuWpVbQJ4vTw{X$X1bWt70rQ zceG0#9+>>qxSFa6!Km#t_!OWX_(twc$G4cb3KZoUCLNmRS%0CsVbVPT_I%F~7Nr_G zF8(l0m#ptzrIhcd?bTdu&XHnlDje|V95ughDOwNAj2MY3HktVLU36E=%|V9gq**>! zV=le+Cq&LtQvvAHN}G!1Jk*nPQ_6Ze57|RK_3;!xE)fDb3^)7jdTe@;)=e_txcnzQ zr^MEn9!mhyxe)9l`LD7*CTZwolJ@|=v}NPfiv{E~U2Ekj*kT(#!Wjv&-RAr<_lCaA zy*zs_b8pQT1}#Bpq>i^*Y*Jz2%u7rhlX0wLH~++S?mz)rym`E2ZLDv~fg7Tl%2YYQ zgB*78Q?0T(GIpW2@Nc5?G{N7`%_h@4e?K26cXuf;V@9Q3g>Pq1o@uxh%JcYcgbk@( zrZjHwI#y}Mog`^U8|mgx$fL@qJ^FFz9!IIjOxIAVkQu2Atp4=;?0Fp{|EptOEXPNe zjjBO7{36OP?;6Kx;OC|g3`(8stE-ceJ9bKy8WTK=+_F)J8m-MbU z=2eN^ML=^lXY9`@OZQLD({TcJBGBTMzxwowF(~LCC{T4KkgMM79j+Q4!vJh zISZNuQ@)k`;F)DbO+66XVJSl81vDH>qXmW5&;Mv2Uq632j9aHVo}0AT`N-v*D&7w# zuykFu`I6?igD}{(h%$p94KJTnd<=ssAcx+jtVse5j#uFksq;5OrO7f>REiXe!$ zw9}o;+=LR<8*#3i+2B4vr&)&*gut)o{zXOaWU{Z7WuU0^jDJ+ zXs%9+`CJ&PZG}-HibUQsh{Z1)a!9TkaS>OJ`|u^w1i5WGp?cWoBr**k^!GgulOcd> zdcRde3Q&^wO)e4ZxSwVpU#lw%UQhPV3LxRyXWq?0lPRakr_i#D%>hrt%_B{tocz3W z+PWJ@Q@9RE4}LZ~b?K1qTV-^(Y`-!U)FJWj;HL$3VQSxua-;__V^^BNwS6E`;EWxv z6xbvOHDI*f%{TdQ0#!Mk|JNtctVkxxk?~XTGR*WUj0V^k`Aya|I=B5%(u3$=h$XNP z@CgOh$+93lVAt0=n1XpLPffjD?+Dji2SnJADJ*eXU1;w%<@ty3$ZlKGkVF_=H%S@c z;MI}bKUD`#FG2lk(uLHX)40uwz!d#mNTODY!|ge|N|O#dG{NKI%1;W9j`EZxU!j4wq=?Ue5B$T zYxL>6c=Jkm`l7&+yB@q(l7m#^!R3Wb0UkS6zqxQ_-b_{G9o8AImC0jL!wLibVhv}&c6X!8Q3~@&ESpQm z+&2K7$ig+*?c?TFSy$Xg7b)@lhduNAE05UYN#H6vET8+ctE6X$ymIF*Vmz&n!$kW8 zNY59Co!)^KEUF^`KBQZ5K1fvsc{dve1LNrpNXix8*{m0W0foULTCuKWUq&rG<+sJ+ zcBiRHQ2B2#!kcB~w1+O?@UbOWl`_f_@e|WB&Ri92VlW2VZ zt4J-}Gb_$n=XT&!?@YCuEa9r|tb{kbYh=(wLCHy zEA3N1451!G{l`91&cB0-{KcKC-CzeJ8rZUMesMzn?K^#Uz&9mFPY?x_*_20C4c1#Q zFim_6S3cf$wirk5V8xIE0{YzGa`|TX`z^ZdO3_oVjKp@;p>>0ZQWRGge||Z zH=8UI$+7??Vwc0$M6EALTbCKcp8!#x8|_aPVISg@p}9UjtelGl4CfZ%GTdM{cV6*kd1 z+d+4pn01=P6|`1}o~1QQbFK^JM}18|sU6A@fG!3~b(?=W|K1f-9`J|TU)Qo{_?b|S6KchsfSPn4xI2ZKE zo<*&ID+M2-`x~7* zD#R>=#&i0y$dNVHs2`jff{+E+1?9(HYrL)D4q<<8uwDz>s){^5L?XRqIp;e}hBPJ4ru3G=ci z*3DcBDKR#R+BVExfEQZA_`2jkWF>^Pn&g8a;fZrpiM$LC;Iz+JQLbX+9FN52F94@lENjG0DA(%KR37_{7Kv?A|K-1hVu=uql2DJXc>*O zZurW5sRq=Qqr@wpaCfHs{_(zZm-zeof}~(3`mBr{Z>Mr6s!|SaSKeXs?U(4SZ7Qpy zB-a^mS@fdepT08n+jmRWfMBZ)YhSxtywd^{r;;TJA~v*hRkHUb_sgfk})>Jod&b z-Ygq`27+=-b!Dv|l)eF2SOL}5mmRQzzo@F`e^F0`%~vtDj$}pd0p)U9@?i2b31;lO z7BUszPhZ`gkn3Bh@@Ec(zD=1V%sgjR1#;UnSVeakR~(m81o)PDvc2AC>@MdW0QTcE zJ;4F(Dho)g-zTG>JHnhnfqFmV2e)-s)h~X4&Gc}tA5b2f{Yx&+Ka2mP78BPTNz)wu z8|a&)m7#F+Wxcn090q0i*GldptbC(gPDHLEeJY$2q@VI1l*==gxy$RREpZ6PxjU${ zHx~uAlc=!_X!z0`D2T)m- zdy91e_-v{jL>&DXybETdUP~YE362W2rklrqMs*Bhx)|9Z&t1gNz&v@0Mln;e13zA} z!O7N*asnsE+U4VZl4K`FVG{=ttnuuLPdFW;cxg^4HIC2ga0TiCxcH0_BksHSxmtg| zSPZ1a6Dx)+k?(eR{8`|TBrn;<<+65VQR}hXG#fuIPujBP_jW{Mk|2uNAkuvnIwcZF z?8qkX0jUji0sPdBF@$abH>Q}5LidZhwj3}Y2zPaWfskAyk)699dLj+_3Wn)e8|!5` zTUsHtKQQF1&_#C&{}p`Y&xh=>?$8A&*&?^^S3K+&MTh`S3pQeT1-d4?GDt3zZQ{Yc zHp3`1z=kePS0Vppl`_n{gihYefLE*1(Vj(z&&___BF-BE(t?e>1z-rA4BwE@F+aSa zh%9?!6_>}AN;UOe>o4>5l<#6)sK*F^850atd(^ul!4q&K=Cr{f)pAMz7yLLzxBizYQk!eXJH<` z!t3?%h9ICo3+H-+6a?q^_?%$UlSR=AoVxBYi;)i;roGEpcD`>4ge&&KExc?Y7 z$8t}qiFfWSw(DF09>ouDB_Ij9Z97z^oj|*kBA;zJC5p0!xVC-@FC?9dC(Ru#RTEq0_f>OpWBHPu_4?fJv(X%w^U{SClaOn<)RAeSj7 z`>CSBJA96V5hPgk`M*#AT>sMtU1lI;;?b1&N76!ZajWf}7KHl)>PhQOR7(Fg7mHKt z{za=Y=^#stFjUDkd@lBh)^y86>fL%HQJ?kAZ}%C}I$NTW5780XZv&%|81up)YB}gX zMM$drT3~05ox~igH4r?ku_0~fFanUSCc|BZjxJ88O~%)XQSo) z7H$k`{K-8msfo9*U7BB0Y@I33gc1jT6cc_rWN*R9@sKJEsHUlY7b%Qx3czRINTnDw z?71%^yNBQ)VMk_i^K{!~sOC|vx7UGi(?^9M+$^F(;Ft__2J&T~2V?=xemusF-@!~dhJ{^}m>%22*|7jXojgX4*R43w};&Zkq z_Gln28V}Y=L>%cn!A~2#U!0bTwbxGp(XPyPWrB>TdpT>yFUZ) zuv<~n%l1LUc;m81IqQjqNC7GVYrl3WjD(0$mMD#?P030`ZR`Wo2>H-qLNJ-}^x z4#ebEK6I8sQ5A7_kE2*%QMarb%;&87WypI3_hq!-2)cb2PnE?;sYRpCa`zuz)m#vk zP<;^KO&=mFHbViU&}f^m>A6mdDblvHL+jj3l|#1Td6x=oypD>e)utaz_Y*3JekFPH z8Z>T0ULrbX9By(NgxMr8_b1W@NIH!lC^ve_{V7Zk`rU?(B%hhsRI_*I=aOMVKLbNXqO80ytR3DUQgM8F*TLDhRCQqa<%WpFQmMBKXPDn| z#iUP9qxb)k=^+7uDdd5{_K+aK`N?iXz@X#it9_D;L#yE6k!a;->$(ED!jBmYqxPnh z;hIl7NEzA^0>@0rT5W$02hApHiZ>4%tY~Oz>X7)@tgJHWL^ zZBBaHXB-nNW z+cxT^@1-(~UjfhMmLH(vya6a)tm7+=0Fk?Gu08~63g1ommsyqNvVK8`2{^Kzda>sZ zQW949T#1}cGJyoj=`4-^1|DsFGc5$yStH0*8IvYFG;TYQWg72(T@RapwkYKX<`~>( zkO8f$tlGP$}(zDq33wEVS_^LK(zOM&_Um*V^Xd60ahJjS$a1WfhMXK;|6 zbzYd{`kgk=)+ZRagvH%5dVelNY262Ys_Ffj=*uDoU_!^A3EBK;EW4nXA~3n}CwO5H z@KP`iXCyK7nNJNVHh*?R(6=0}-pqD5_`yLG(9O1c`UIBx#6+ysfTUL(YpBTTO*DY( zxDjN);~tM-;_E4A{2-m(@sKeh$GDIu^PQ6ip}(@zseWfGLF0n`t6~I?s5|$2ynq{R zLqKs5e8+tR=*ZeJr3|TLktQ`748FDdYYm;!RVFv^_5i%Iy?Z&Zllet58=WDVlh3iF zX1`cHw#30)Tn~RS-6oSiF04KZ9XNFy#N`PYH94pU-Bq^0vtnM)R-Kj0wYk7 zMA#n~SY1Z|?*RM_zzmuBy8>Y5sK#rWA$@vjbTu|z_sx*_bs)c}A@tzmb+{IqPF0X6 ze^9jXSESE>4;?G9Jo+vS8vtkpSmWE$Tc5A#6~2|^cXgfvB8}xRkV@io`&%&vxPu ztXd_O@P4}xCF~`lpxls*=FWyYPfEQg$cw^O3@@pN zW~2(IWP>|)d5(@WA=VhyH^6WT`~4WJ4P=ER1O)`(Yvs>#@&Zs-iN=Ecj6k70yCK89 z%B=8!h`v8g{+rQyuTe={k8+!_Xp6IG>J9#C(xa2te1k+7=Qn-cAo|NZl_mCsFp;?{ zpllPtw4r7|A*FyV-=fz!vsn zw;iwG8P`NAgg9Bq(u=h-wvQc;ev42tzM6X>;1d8LhXjFD!vt6oK)!aJ!3>^%Q!en4;E=UqPNlJRtlIA>C zaQ`vCl%yCO^+x_n)hEKqGT}?AIR8FKl?Q_-T5TNrMMA)1+zk3xb!Nt9=-w|CBRKZUD<$GBDXT@Fky=|--nUah&D^#i%5oLx}C>XWdr0;v#I!g#?9NvIrIF?sPybbQ6?vfR& zU|^CM2MUW5rC|&XtL0|%>;kScC8f2Y(It`%Jbz=%PM*jHoDkr^tWHP+ESM>~$N%At zNdt@VuWz0)a5_nIFrEP9zW|WFHRc5(Ka+vi-u8Q287BKQg11R(Ro-1jl93tfTCzKu z=0f2EZJZ zW|DGuc{vNf8|?rrgerzRPL?lS1ICjP)LT7tU+L^(aVykm=hoJaUY43=jfkkcj&I1$ zZztb~v@X)WO~ofAl&!2d>;+CoeVZ(wD4q<~i+h$U;VpDGfe%yft^)L`An6)m$CWJ%bYELq6Q7IanTtY1FT4pxbRwTqP+g) zQIu7MDrbH_{WSbvxPH7DwDt2fpAFYRydBqoj|h5`&9-5@*a*71(>r&mc$F39x5~sS zzAR?i+}S0Dgl`-SBeWf-|0{0I6@9(%p$sge>~06|{@B~RcITfa$Sg2;No0;jTvfc5 zzUwTN18De+f;9bjHQ@tcN+bU++s#VXUnMSZ(X*KTvUG=xD?bnnAj3dpaO&4FX%^`= z#G7sPB#CZcr1Zo4NHpTD6-?*MVRE3$#rO^+A-TwV!vU#i5?8BE z!%#nus5HL^ZCCAm9mFgW_Z@#m8o9Q2!J)iANY?5gF_#retaodqmP97TnXBTbW)1M=LM> zjT?yLX`#0KdMWjpFM^_?p9n?eLuW@m#?f)tL9Yv+nU<^dPoT0QQ>#9v$7`#7Sd{hz z_(`@p3BipfOKMXfH&jwCVAZC89JWPD@eJAo-(RAqhEzQ}cmZ!--Kpu^=UHB8+e`v4 z3L-)|)_d#f&v)HAwKCKoz}_#&GWr=hSc?DYlE=ll8u04v6@KM29hew&Uq)+S z8mkBH_!>^RBT)_z%LA0tRgV^9_+SzKwz*z3jx(${X$l~YFK6FsTDG1p9|HSj#8x{V2@1R`7(#G7P8J~3Xn+$23NjHcI(6?MCHUe`LC|5X? z#ExKh9LO>MssCB4};+M!tqRv{u2k>br)a&HZ;uutFdJQ?%IWwjB_h4iClTf0*xWX&?SHaE$IUXFr!ew6CAlp-Cgedp z601VoAz783{cL9vjpMeDPuE6H!0Ug0eAa$chbuaO#3XS=s|AXV_BK3ed^M~x5;Dp1 z-;3@hjCc+L#=_nagrVrA-c=ki=(*r}g|~D%OqiUr6Ic+Cz02*NilIQ94b~#kFgl@J zCm#bW?NATWi`7V%Ae6TVmIgGjhnh_G+rCf=b>B}PJWr*{&a+rnVm zxVemrM1DP!3M1s?`kS4wo~f&=7Ju<C+_<1mVqS8?jm9hIFZf`0F~YkBcosN1~>qGuItukIDhz` zf?j4{m?P+>N}^-_h59KY;ZX#Aj=EQ-y3a7AXY!E;?p;qbA>w5YL?+U4GCjW zd&-5`|1ouzQB`(r*H#e)DQP4XrMp{@?rx-|Te?HKyF+5r-3^jTv*{3|yK|H8;(op# z-x&VVA&OpmUFVwToW~@%G={SSGjNL>p>JD+Ou&Vfq0(!@2UV^IS;x=rY*mC?czzXXJ3}pT6<#0TA(fB(HO*nI-4DUGKX3^x1pG9r!68uT-bjy_ao8!o~ z8(;3XT+(08o)#3qt|mEU)7s@1y4w`=isIV!cSjeRswk@@9K{s{bug-!g9xi?-!((d zimCMYdFNC`=6DLMA9h`coQrncPB=a!aS+1DeF5S|TCDv$1BARDE8qAAUIo?|vwr%C zda;=HR8bODu22WJ{ZRlH zq5C<{7!1$cgjO-s@}s59NBKC`k;~cLkTGCJgMA&gZ8O*%SpIK3JQ0m8^>yl8mU-b) zi3MaALOP2e)&;>>j{3}hAIcQ>G$w5F``PJq(<^v63~JF~tE~pLCzJK1R3xr?hioJm z6i$h3WY>(!)6r+Z1=dyq6&M_Ra>3cTXP2?;Szej7#c& zrt3;mpmf)I8{q3Z?qR8!#k-nKpDjX4rjyJJlM@iL4TE2o9Af4=7tU+dtuZroYzwV+ zRx$}s5%Pd<0_F-ilwr@T5{u;bg6r{sr#jE`R}pfgb6{`Pzd8n&FIdC>NgrGGhzTDc8PJfH zfEYM+BE6P4Iq6|!#_F!OM0JBnAMqV~`UY{dwWF*Fa|+a0(-j|72-C_r3AOFMU*o>z zDlh*P**M%vQ?M-X0Ng~rNH#W9tyyoIj&ZCNO{uVhT4q{#;|Dm_DSNR8u9uSzd;f!olb}3hNDmS%banhILk*8du zjQDWg7W~;F0!AC1+r%ykdRy8>V6H048v9t)R+*5C#N>UBS=DCb@L@CTA%b$s*yQI+ z!=xOWjHac02$vbZf{bI|X&}=jvg<@VK9Hk5oj$qfl^IKo`zM@*1~?2UuGdrx_PXQ@ zU0jM3qbipphzNL|;tVE*H)JkgXP*K{ENSB`dtL@A5d9~kXw72QVx(Mh+2y|yyGpLm zVU-;;q$xk7$%W}gjQW}PFzo}YzN2gThX5}829$8X8#=soDOrHF@CKO++~5i}|O|PE0!hJMuwHtHjyTDY6CFrq{*9i!e=!hxS5g?KV2W zL7?#S03g@&hGU#|xT_v}3a9DtochRd-f< z_@=;KP1QunqOu+vQGDXV? zMCYu$cF&x$IA7SC6p0`j1~~jX#?^rmBs#T?dDZWHGox+!xfX0(Fid=Whj2ka;@l_`a_7ohWr$$*IBTx`8D~S@yf))|zl-&9hqtT71`=kFk<=i( z*lpvc;UD5r8Shi)@Lf95wi+T7C+*Zz3by+y|9Puz(azGW&EoN4DZ+wz6h`c?9}ATlQm zZ#=nlM3e8Jb@&%^R48@r_zD9}&Eyz9UT%oSSY*@XE@GkQS7Hd1NazTzMzzunK29#d z^UcLfdFL~9!DRm*y(IpH*{4DshUZ=Xo8ksZ^MEtOPI4hU;OxD$#n_m)*}Z)AyFr1} z0Ia85l%_GQB>0F}ggBZhMDWbulij9zy47tKC~yPmZ_80)`Dvd^+0RmwE|ZPGX$)c} z3>rJg>q26aDmG_zA+v*5UG-N`^>wh;3Hjbzh%!IXW|&1D$y#p$$Z2FL+J;5se)zxb zZf{#uuL;UNgV&am6yF6B4@Z?Jfy`>e4#7m7q>ydG>pDHUecV$vtg8@(!hq#IVzT}2 z9&WyRi3(199s1K&BB?S{=YN4rJ(g~Urz}t4h0h#e)jenNn++!y;^8Zlk`GL}e{df9 zXkzZWX##8S3=fn07mzKS^^!Pk|NTr2g0jfPZUx=ATEAm@Oh$PV8S_f?XUAJl$Q=J- zrO{iu>P=w!E1RS}VTZUE70F*{;bEt^|7wz;>84c9LcxI9QMkFD%dIC^f)+L1QPrjnGT{ zGou`q?|N=Dy{+eZjHBw3?)9_VC-ioFITS_x^MB4=Ittl+jJxNgJ=wunAx$RCb~xwF zg@DKR)pyRO%{C?3ojj5kIjZ3%*q!Gpgz8|1{ad3nVX2nA^WtrpiG-m&i_BIzcA8)6WDvBz|EIGif@eHE3m4p6&(^P-}YXEOB1*q4nmKA zpYqi9L0@1l<$9nJA>0Stq0s%_@b!~#d4E70u;T0=^TCigl(RrCTrq~|jL3e_M_+UO z5QC!JP2!9znZrTge4#0OI>rN;NO4;ubmF!}!u1xllmyA~#)aUCNGWZR`;=|J>2b*- zBhdM>R`BYmHeN2ABd=|dC;vH9_kTX41vAM<+*3T^m4_w2AIYazuKmALLElF@`LskB z0GAyM{CW?=J>{f*RfTYJQ?ehXU+{~;KlAsm4S2zGYQlz&CrRWfwCJ7!f=J2Gd6{5W zB*BM12j=c573p*SbD%F>u5*}eJ7L_T4Ff8Q9(0e+feMlfR4x4eBcLnXg(zUl$Svod z8^mkWVoXdNJ?%zH%b*>bNiuRa3N|};oP)qR{Tr|daQ{^%Gyw_xzc<269he4QdNlmx zX0&K4r&DL^2ktQ3#By_XvKBFoYM zWUCr)Pnw9mfifYhCOf2g(-WWgFq!jY<~1A6*MDRK-vsCF)dJiMxDV9mwn)@We%tZ@ zQ0UFfqnNY2ORHyU@S{~*uLrw9#MHQ4RXV}GEjO%Pvx zZ;Ns&<{a-Zgt5X<8*cH3hT+92*c!c&LM_0;_x5l91q{^^Tn;UinmCRJ6oP-lRq^5U zrhK zF`ui%OvoBVpHxofJqmsrqNI4eaycFlOV)Y%3JcfF0n)05y!a(apm`2u;+^_v-4a-M zw?Rk8!15S?Qy>cZ-zy^zgz(oKEqH+o7eMShaJ@vI#^p7U$gE+iaDB^1!tkaw=mY2$@52jy z_;ZLxhjc=i*8M^z@!%w;GIqU8eS=MPxe5*3-2T%Z%Ae5RJD0di-!pfrM79?)1_p=*L9AjY&xwgsNJQ;=@6#nw?yZ$&1?DdjPWpYv)a+nA=#Ayv1X|7R#BjE^Jl20yFALco zpAOc{JBS1V2&S=^uu;5H{WF`Q&|1pJZfRBbq93eNG~6xAcp9i=7(N{1yxqnW@S0Si zJqW92ODsEOHhT^d4DT#-!y5|(N`6D47Ywjgooue8At}&Btb@*1+4BSr;7pyxnAApgF?f)jafBv>Rf8Q zS(crkgdJUakMHvm?u`-`I;3$=3~_)FwMd+b_6^fPbsT4pZKT)x$i`ZwWqE?aA&WKz zh_inic9r7_LA!w$xx;)W3riQu7^<<*&^wOkMQnwE63Qn8sb5*l#T_pRiqg*vy3{O+ zQLE$3v?D&xFRru?VVhfO;ZAAa`Wy7Q>zTiT*y85USwfktAXz@h%<1*M0TOhI@d&Rw zl2_0jqxvN>^M7SmRc6POEb1uk zxVcR3riYlb0!==77tm?jjxg2YbWVdy?LE@UPhG1GX`Y)8Upg)^=4EIdEieNL+d{RO zRkidNTqVLW0o@ZrWWCDZtq+m7>Ex>CAz`&^b=aOcCNAPh9Wcr0K_bHA+S*b3FS70x z;EequdCN=Z`)-;(K&7*qe9Wet>6pDpnz7UWSvUmMQ02sDtn+tYc&ECwK**wV%69=qzckr#SyQsqA)}e80~Ho>Hv~zIP@{ zXyyDdUvK74rBDt1oS(}xpGkRjyR>d5d34Xo&~~hYa9oXHmE}bm`A2nKRhZ(OodTae zW3*g1L1JxAwiDviCQII0P2yJyYm}Zfx-% z1ZKiM9%|X~kf1dfziH{aUMlj51yl9U0^!J2r!6#j)k)y zHR}uP4@Zf4M?h}xb0pn+&WkRYt{-59D9nZ|JSrMC>6e2tvzJ_6^{y`d)>P+6U4im{ z$4qPeesI%8q1~Rs+H`JTnON{f3c{)#Msb(rv<+U$RFx&a+761;)lO0K zkA8H*k5P?Gy{G;SDLjb>gFx{FS-~0Ao;cL&7Kvw5in}1WkcNE_9Z2-bzb1lK*+^57 z;5*}mj8DtgbTmH>%gd)v>zOKa2Z)0}?<>1@lr`dc^ZhySuF3=(mSOa=9XWXK@TSUN(_qE=dE7s*i< z#A^UVIGjn<1WH9`Bbu2FcbB`&=yjrAMf$36A^rvNV4Hx%5QOxzsF+7kq%AAXj!8Iy zaZ(8%ulc+EM=F<*?=t;{>nAgLsSZ2umQX6x6Zt_VX4ZT4I_g8dV^qY|^>N{?$auQb z4`;*-Wyf9qKzAOyG)@~bKry2PKdS|$(k@#+{QdFKFgTYXTy)*Nj1DjGh=>PF?OZ&) z4WzGGkowLgj%VsOBFb6o{9ivDJ>gmZ{H@VX4*_L}QHeu|ol0 zoT*4hF@Wq_Da+s{8JRYg5{vf-Opi{B^f;{*{TB#ZyD>}S1Y2ta#p?nOAl))A{{k%U z6lRLGv6#5F4_oaX+DJnUnx{=`zLQE~Yg_QX6Fz06GIQJ6Y_51-gqk~O(R0RYhtDZ7 z;T{v{g>u5X7rXM|04%fpWg!lX;MI3?qW#~qUMze`!!V{U!26>2MY91f?_9-x@~-{U zD7{)rS!mnkm%CPV9IWPRIpiGPV5D~p-*a}?6^}Zw7#r`J0WD>3a{a6i>qoY zAGbClZ^)D;D6H})`BRF`jel`YvAgqrLX7$nyW%WBX;Ok;`Y`~s1;G%HBtSfLn9Iqh z3O^EC3{N|N*6eU;)-IGAk<&|Gg2Jf$6G-0X+x%69%=w%dwsREWlKd&8DM|Sxg3oy+W)RvCF*69GgR-XKOT41BV7cPTp+5A#4OGR>x)<9V1Pd)3LS8ff1aPYA2*79t}oOI>8yQA zpwf^jymKC+a8F+mrNh}AViqt906}wkKeWOXylO2M;ccJ7ottwUJGyalXjeWX$Y>zW zzDMRj4fz4CET`mEz|J#4A(}x$Jch)I^ERR%Xb!LP_JHxw>;392z&@WN2jcXaj;xK|z2b~!1Vx#TTq1=zc?4g~Fc+IzN zOZlIBvJ!$nwyymAnI&P)`)m6pR1Kvdkn@xy@!N9+gq{2= zu*^TaZj!(~-<`x8X*Rh|%)jS+_$R?Aj&$CI`!~**;RCaSH~48 zG3hJx>qINPfgkmIdK?WR>RW||Nyn&983Fjdsb@*&vl_KdsI$VsP5Nt9%mIyF|Arnk zOfMG6{Ikzlzs_}o4JMCcVD^JA=If*5%Yx7DBDQcSDvF9j!{=DWyyi zU7m#meYAV%8ET~EfZC;~C!T|iT6NyhnT-mi$vWX>8tsl+X*z5DpePtY50WgdhVJ7N z$=ZCa;C+6z_R56^Qf6F5Y9(_%g188Mm_tSS?~mNR`${_Mj$%8PA>L5gOR5T!gy!0~ ztlshM^F_ia;#sXt8dX_TPH+q9-67DX|F7fDFA4?WoGmsDWXy>gjc ziQHkcRmnU3`-9q-`DT0FZ901WD`6HaudDMWRWWk_wZWAAMQnG>P>msntlsy16AGnn zJr9V<%Za8=4SmJCVIJfBUS$Eyi7LTu2IMqa?RlanBL8(r>Q0YiLn zFkNDt*Zf9I>`E2RNlz&|$b4y#vwHG=!(v0g1v#{-={?D-Slmw;w}RuUzM7PkloBNZ zIPk>Leg$OJK~1Me2o`^r(PcE9sGOo&wOaLvNqfJg1grJ8bQ)L^2P;}7DuY1_n?!56 z42ghFN&fF*39Qd*wcVNrazcwvYeSv^^{ms13LMFS$c3kc&L!5kuBwwS)lyQ_gF;9t ze)*(dj6@65;>(;DOATP+1z4!PXxT-cRMgAo6DPsb*?bucrOz?DYaLbr(eAtfxe9Pe zM!YSuuUm>Lca0fkke7E5h6a8rgR{{8x`P)UCw)o87zx7nkRJ11;TZ$7_R3v6H2Er4(01nN`4VJdrazwwm%M5pBh7l&)3j!Wd)`zI_%wCXi}OlC2^)wSXdsd3x-Vbsy6&CK*_VqCW?zHVz0+utTCneo*0t$%@SMRci zVV&`069d=@XrZyD=R4F`Y^8`99Q6n9{kZ7Fra=pD44nX)`;yyFqr(DLw|~zPgN(OU zve>UY_2PLg>&Vl)dXno5DKc z&te+Kr}(AJZNItAHuH1=6G7vJWJg`3?nQw&P?%fljMTQWq}Jrb*Q42-OlzQO!c^8Ah!U=AO^=!kaT+ww^@qaj3itAv#HaULuIKDrHAX`L%^#ZPVvO!Sm+|LJCs8~ zxnqA2&3|B`eGL8=_h7UE$MGVEVA;9lv1pIKY6S|+B)6Yz*{^Sa|vFXF*|R` z5Mun_6})yn0e^BGDAz&#;WFzo-rP(FNi}$LKls;tV_e*6-7(MuBty&U#w>+XT~WA`G&bmr9kWW@~2P#M_6RS>!T*1r*X7gx=9&{ zPh5JahEWS&`B8kU3S}?lJtm_TenK)Q-X5m(Q~k9VrgNltE=f^xhP_8mnE~7*gKo>f zLbJKJ_@<8IO)bvwa0OmnV&+B&;)JJW|F)<0s$UxlO{CaEAo0P*UB zuO)XxesZ)W6N1-p?L6*2mrQ8sia#eCOX5#~9H!fQirM;nFVCwaKe`VPldN z5PP8(yf)Ty2U2J^#b#Y@eyvEHxy%qBMNgv*Ot8a1(j*Of6Jn9vI4jM+RJ9+$=jn5d z8y*3ZjhB5;(P{fQrkEGkVQ_x1TA%-OE0f|9Sa4p$IPBUiuib(x!>GhbI&xT}VfJ&7 z7sS5j$BDyI#WQ1yatUlYu2~lh?RM@C7`C@ho#jK~;Ngm{zZMbUAwLOAW1{+VvFulw zZXTcrQUpfmN&~+c(Tcv2X%GIcL#wsU-joa1EY{+|u(n>c8g@1)hi#`1j=xUIZJ;JR z3A7k(Hdi8+AHI)t=}!536IkXGe+f=Meb1MPu4&M(f5S(LmMzmtae68KZgpM%d*ETV z*BG!)p1)m|_-_lajOrfCY@?+4k&godw^YKmXMyw|QNVQ`plVp;sl_syY!g|~HA>p3 z)BNPq>d$>0NzQkM;1Th%RWxVc*a=zJjuVj+1m5@V3-dBvGoe#?YE50ss87J6MLzF- zm5em?yhyuP|>JPgE@^4oeRD zurIrFRTn5VgYzlWD+aLSq@`lJp4-gW>&*&YD1cPgJuPg zx~(_(bvRja;kS{cb(x>QV$w?+kS#65-C{gCqK;e5yzTo<>7aj(IP*ieaQ84MRKNKx zwOqFp&SY!WQd|T~^bFrzeTbOhp)KBxUD49yhP_bHAo1Cb&*|I~7F>j0cj5c|gOc`w z0usm?v*{%`h-5XfN8y=xWxr5hHIZBh)7qtk*^@RolEpG;fO*Z6P)m&Q;%$69QzWqa zwUkAwWV;%GdX=iyBf*sH>Mut+EP+n*9TnmnVfuUpG&#zd+;B#-fmmuno)?W?vV`dG z`KNDCljQ=8w#lq^s~w{J}4@<$WZ7J>b`&B$gaoCzEkF!amgh<&&!ZF3x z4@9NH9!}w!nd7N#SZwbnO1sYwUHLENo<1kd)b?Z=o34@z)O|WgsS_4fC+_&63~v3{ zvvin;V2QMZ!*v)rZ2iSaEX|6EdZL#h9BnF?A=M;yPNpv8%zV;e)vt`-VW?N8Yw->8 zQ8{9jh&QJ3_Ae}Tq%>kuXP!^Z2oa*H)B5%otR6d{s0xo8urIT zXCq_Uv42;;z?WhT~h&)QTBGKe9Zqs}0#-7ZbN=11m= zuZ9I0{=`x6)zyza|BvP}UU;_=TqvihKe9)Z?t5CR>Q#$Zm~Fi*nYI8O$pVf0S)?Ns zIewf+*H@-c@+?N4zQK+)Q?Tx;HmBm6R|(jF>c{2)6%GY81Yz&c#$=L{^J}; zskuxy9-Jk4!wiPmILU9mjjEqMZX2ElGMegrbd!5utpD>ppF`_UN+TB3gPmq0)h`li z{-WLYMKpfQv+^m_yBy4DenPd(vmEBaZkO;oeuXH#_K%&m!aO)@?kH?(U5hp0rR1W}|pb z2J6mCw?Lbne4=GSi>5Cr1pO>A-T(~3O9zU@E5y+Jz{@9eum0IpFsDJ{mkytfkHy*J zxRyTly;l-LVE*Sd-WlgWb`F4J!KejgYW(xKqYa45gp1vgQ^sD40NGGW@<2D`Q;XZa zm{*IYlfc0h7E@mMYy&co;z%scL+yG~U8a z*3q!#@*|`=2wG!dqJ2nnt3HvNgY|C$t|}68M6q6mDq0+$oa0Yb5Z^*!y@fdXQ{lxKFK0ikfHDt;nNloAQuskGUrPZ zU4_^RrR!D{2KZLa*V!)zx1ZjA>)7R(K}df6o}JQB%cX+}BU5RS(?1BVy!tg}IqOAE zo3nK*dixwlID#ebP7qr~J8-S){Ed4W%G;!;kW1lv-oJmOR|~I)xLzQEDm>b`)D}Y# zyx$JJ$zXF4lb9VfRLgheF|zi_EqsXa%P>xuDR4T$G+V`m_L9upKeKp9NsaP_=JNu1 ztPRLx(BDrvmFtl4;aay0Rm+?GuRZ(&BHP z#`lAnYA`7;C2gx7XK$SZiLRh|loik}Got-9TV^~se@Y%bhKy?#(~fZeJ0gFs9Ol8+ z4uC!y16Yfg@y2eJnvy`< zrWa#gbH_Mrs)bv>Z-Ygec^Wm&Xtu0bP8syBC`|cjTFfiKWqkuW+2_@JFU%)}+d^(w z1b+>GH3F;`k{nh(Pc#XR-H;yR`5IBx>K6nEJVON&)v0X}m~hgeW}X>oD7>LXT{-KrscS@P881P^0n+x@SsU=HJ%XI{ zTzPv?IlT;cnRaKzVk_-2O@4lM+fZ{|Ia9M`NIaG;Vex5G7JW(<~GJVZ=(0y0d3`YkU3-Qo>Hw79_o+>39 zTp-`c+mbWVYh2$0k z?at|c4GLD=r7Ebtj$UHn)kXJ2bMp}^AsbtmLfkDE?I=Ouo>4|jkY+(V90m`1?SQJ! zo&TGuOO7)0h8E)U(F{k?w1wWOLNIRi`vClhz3LA0Z=T&jDE7EGH-xEyfpMAY8mgdI zqi))-#90A~A`$8w#eWTS*nVEFah1R}LWr#Bqf`QI$6#Jz)7~QsaL={=i=m@ft9C?| zPFR+4c8RI44AJov2|m-Od{c*1J)d0Hd#6B9Yrm7^nth7vT*NKkM(RMa?eK3>>!ED} z=PP}${*t;`)aUtz<`=C$$!@SZrB~p(o1e#!ok>?mPLiwMwad8mj^i|H!rPy8iVFnC zCKhjQ8s59>!4zkK=(_<*O0>rD{@GAGM|t;LLUW1BhO#wRQ5EO=~g9 zQON}KopvqtPpU)R^x-V)z=CaoU1X!j>YJ}Kugx2!7cGAyt0D87iqU+O?eVm(^TL?+ zM=0xka=%?QO;JSz?%yu%3gO$AEcsp|wY@byO*lI}{z>y*6!9A#--Yw1eD7r3OQ2;v z-94YQENk&W{-N&V=8Cu%;0ABHc8XSGNJ6d}aS)(s%WB3yDAz*yGFm2q`vzB4_PAfY zD7V8G?4(BZ0aPB+jc?H2Y!}Rbdj0Ulp zYEuWIhyYVs6f5pLpo}Y*EAJfKiDqQK zrOZ%iKj3f;{(u#&Utk)t$_{G|D!xd1H8MKiFS}n_2c)UtpHW7hz6T^I7io0QboH^b zYUOg7*!seFj@#%w@BMzJ<)2kkYv21)iV*$4h}S1p?45>b^6oWE!)PVzRvfjL%`+r- z>Lc21XubD==d9|srx4QBxVUHj!duY!Hw5z%j(^eU&Ni!Z4OM^IhRMC%#A?nwyVV-F zN@n+A?Ekq+TAk|9y7mhG^_hf;eOX8b_>;0xc8tP>t&rP>U8jCR*vAYFG48d<^HicH z0__v=r+4>dU($b_%Ztt`c`c~d3lh)d!tHNBQLh@10f$F4-_hxR1DgtlE9Y!{Il&Bj z5ZEoO+ibAd69gQ53*bBqOS-MYC;fF7=}Yx|3i{2gcC9$>f0U>S+CSigt^SoWm=btQ z!D&pa!8)gZpq}zr4EfVBgpI4$ptE3`0f9IbN>4OxB59 z!1qM;)*6S#f^&Y-_2NboDL6&jeV5|0vsM7VVf_X@stYJ-!`K23agvpTIz;2tT>Dt4nTa0MN`XQ9EH|G`;0GzT*xa=l zCSRUsga7$a93!lnGhc0J=tnpioff!h=FV~4@Fb4D;xxJ=8uy1=Iyl2M&Tx10 z*_G(ZmZ6ndA#YpFm;H8-9tADodNk&gaaVLlT9%ar`?%a7bGh9}&s6m~V+@Kuj>GWA z^mj~xEIGcLef_^&3f_GYi75CT=ktW%8EZ!^>LK{Dushe9heg6M=B)G6o|hZ#H*1f@ z39tlo=d{*aCzoF!yMxW~4@usmV0hsWv$Qz$)N^6H7Itv5w38y6Da7CjqFwd9YTBQfOW`?T22=#R9$D{bR{Lp2zTCH>2v*E{YQOeL!wIG`>DY8+y5@PM7?Z?chrr z;GhG)*azuFfbD~`$UM^bLFZK+;`|OrK%Rh%>iiEpf%hQGWK#N3qEXt+bEUI-@TA5k z7j@Z;M`_|gxp=-pJ+%j{qXD<$sO45>bE#!OPz48*h04hcgXC{~+C$z;ps z!?r1nW=FXa`<(of7cB2<{X|(R&u!$d#f(l-6b4w5Nil=Jze6~%NYH$1i~{dtsgkL#eZX*PktYG%1_dd3r2(yz?cJ`Ppb-h{1HNgs$53c8%Z|t$2!^w)2^wgE^1ezC)k_ z2Ml_MS2Ag-4=%8h6|-z?MVk&%_N+;tc@%}v2h!Un-y-eM%d?VaPEJi2K6lHRNt#sF zK3=3CfDG;hUT*`HtGQK>Ok4G*Fr`uezT;~>a8jL#7OTL5SUWgWJ-Yg;PONlYdKv}z znVxNMB95{&%Y{D-xZWVmu-c7b31d)1l53j~tHfbAV8DVF?c!K>wH`iz%SZ{>mQxS7Z{TNH$?mXP&EIxs!5Z#~0H6)9b9|SRv{WO6NS-D!V;6z+fRe9h< z6j>v@58V5aMs27449^;~pzbjpuij@NExDVfSoh5Srr+7&$IuPK0}RYFI@V~*`pv8tDiynv5~fsOt6Xq@y;~9ZX*pUg-1s*PhGgh2|AastZR{I z9bDdMcW^JhtZmQJd;!f=H9Ct`+#eKZNcMf8S%JM1!yyAwzWUO!4e;AnG0^SACtf`l z^JW>@<8YdOTw>`wz*=*$S<1J_!B9x) zV|WIPeln{t*-ToPQ5iyJN<-~FX?zMqDJdVzH)8MxEe~yXdvlFc!z$xKNB(Hq6`vj2 zZVJV|9cbhQb=xUU6+Pnh?Dc^BQhSR;ZjJGQMs1!_sxAw$TcyW_Z=ys8i*tCvrv(^M zHzY?N7O)Reh@g-nh(74y+vnw56*R(9(+$e^c6U9dmt=DSRjB9@+BjEMmmC~Ju}M~+ z)eJbw`g!r| zc}5}mZC82J^-USW{`RYLA}%pFN6!m9rKcA6l9 zF8u#T=e=Tx>w<67qXT}w&E(wRt9woADCUx4p7&ho) z9HpD#o9{_D!Q%eFJr@wiTka#$R5?SaLZE+H=0ZzkUyOjSS{+^U2{hlTXsDC+5E!I)@ z@=JnJ5{NFyZ!7!wm2)VNy$)3qrkV=I2p)(YSX^#Z{t%|=8(P-2NNW*8g-$G63akd! zY1-qY!z0PWT6w)CtOqu{8DV1$2-;ztHR6|{JHi!YeKc|}-T)(iPUJz4~@$XYGoq;a?`J&NwXrwPM-*F;Ib397uqO())M*{J}M66HEqtld6g(B|-3lLFjV- zYcJ2i2=*!wElu04S5@j-n3ehm>`TkxM)zibidx|tSS4tV?!SQHgU;!j2|>BEfJ_dW z1}@e8v>_e#Q-<{a{hiotXvOhCp9uL=pGZfn7V-J1iG&EEf zF?~zaQ#5|nu^YOw065w7_jgN>5*N||wRPV&6bQ}nxt#(D4C7RF@4e=h2?#%z-VqZ^ z?lu|_=QfD;7FVJFuOizfMy2`r#1AhyZU`HVUQyB&KiLF|k>rMJg`m|><^ndGZ*1#< zl%wGSsT6d=4L@|IIPBb{~!16^z~>8!Hi zt37jhdqcVA>v~02pLDCZ9gO~f6Tw02wbmdns@YAh>vF8Dpf{q&@`pls0gud1b#`=J z>KBfO0FY_+I3o4NSa=pmO^ltP=o?F`BYxoyA=z0zgx?nSU&XbT!DK8f#{pSp4^O$D zX%|6e($9cin@N&B?TSdr*&x~ds--8Sn_31QBi@&D6;Y&@ZO(2|;=e8-rtfaCz|*&3 z(?)i0O^ffQSDFa3L%ei><+tifrj@rzz4ZMMf%3sSb2{XIKXj%;emNXOmh)YmuKA{p zf(JN@IqQi&RnSq>j#H{$f)IMmW3YV@+!&0N*y{1`x^g|V&K#pFdD#K{V%oXinUEB> zrE|YRhd#M#m8g8_R0vU2jF@uRzJ&*5Fb3&=8^III+@wy?h^O%UMcu#y(l-TABAC|&9_O@=C6(H*>0%g6k+;j`My zqBpm6Qtyk6-tVI06v0b`y%yntaZkO@XF(uluT^4zUg=&N_R7F> zw1V8RkDWE&RliPQW=BzrPWW*KVaI+}+G>w(x743$5k`mGljsm5fUxLB)2sV{V1uM? zP4Z9Vz33d29}-_aS1F^5>*&DPK2Uf`6~J^iaT6$snohNPFy-5Gkb6wSCErV${p6jlQgZoQnmm zyZLCZMcssX`+XY2I^Yz>zSW|RXpmd~?gy$C*|3tXVxwFZn_Qa&m7-3?^~F0b(50dQ zWv7vEwA--aq%$2&}#BNO+mheMk7AuQr9ZyT^xd6Xo&6kC?&Y^owGg zJ4h8kFm=&IPQG!X@uNdd3D*L;qN$sw-_p5c={*o|UFo2UREb7a{e27J+&bKPmG4xv zeh$sTUEfEsO7!|C=Z}#OVGk}QpfoRzrl*|KVkcoxnhc(+SY~|HIJta`nM5I7%4F*8 z%Ft+*$bIzV;#vGgogmW0T;0hew$zS*i@s3@tqB+Py00Z(}kyZvb$n9UIA*d%4<1Ko1uc|Xh6 zl}e3=o-_Ep8mh~AcFSycQz;IT_C$$hJ}1RIwJN=e%?63QS{V$2lx0TgcX$l;}U>`+1R)i=XRdu^AjY zfy4LdkVtZIF}^Zr$9X;C502*~o;R)vQ?n1ua@j7m(fXoI99LDUhMm|38tjXo7)yhe zk?Qkz+81^IarJ{X1uDpPUmbmS^vLKI5B*q0>&i~sO%T2s8s^p?Pajq!JIX6-Hi@5D zPx$?x5f-LJk5B|l%Gz{A4f&1fa-1Fe)|{b3H?exg0aq7atbi@Td77|RTnsWI?@!^3 z%gmt~B@(n0i9?e$B#zO(egV9OmEIDUeEa$HW6C;|%cprR7wj`hqBn; zh=E+8nUvM;@MzuX|9Cpfs4BZJ+AD}CDcvC5CEX$dN`rKlbax}&2kDgV?(Qz>l0Kw# zcX&7N|K9tBF+Au1&w2LVYp*ruZ{BIg55c^Q1Ix#D#`R0)Hmqf6>`8R!^t3UO8+TW# zPuci~ho`Nc$5bX74+76+@*9-40?NKmylBZN*S2&%G?TDZKYQ&9a12jtiqn&0hvq)G z>l{=!!`YX`(}#Tn!-}~-T4T>aWkGJGLI{yRWtN9JiB=oN-fr% zVH}%&94<`N^lre30IHtz5qbfox-vPXcwbd+9HeI z2cKT+^{58Ak9`N2Z{f49xcK4z#=rj2EX$5l|J|VRO;j(+|?A5h7hS!(IJNAt@Ln9$1|h@D1SLNQ`IW+U-fn zbnb|PY9zNQj|)t#K46o$`m=kMwp0qv7%0wYj{+b5jmCdgLe(?j^cQikHR$by2SUlI zZ87qaSlAv97=yUUvEhxw-0oD_ts_WYcwMt&>)~Q|zr!7_@peD5zt%sR@X*7}gywj& zlRkCDUV+Lg9;jw6kh;hoB@lnVh*d;N6O4gga%3?p)7hm4!ekvY?CkNWmU?O=|||Iz|QGjvaz=p)Ci zgu)Ro*IJX(pVQ_JsT;p?tyw@@gmMlUkKO*@OYZvYfo@=llM`(?dcg>9)t}td->!-D z-nOF~KlsH%R;S8s^yHxA+s*|a)zghf@7U%%l8P-C?BDnO4O#5Dqwi1U`O)o)To?k_LzbK7@u)8Cbyd8*V%7@D>l6=uZ>i}svHP?|!>XUp_I3Ifq z>tI)ejm{QWdzX(x8ddwo^j9411Okf8{1p#$vt_daC|EqjO3H)Tqp#Fhsu1mJxT9zdn7!IIQU z=D{bm90f<9I-R#_F z{R;y2X)UCoS!i-x9%K@=YC)e0B}wBubUuFxcq6`tCI}^8THRr||I6ATz;CD7lRUKU zzZap2OWDGraBV#qA(qdbsWP(P$3yV9As}RGmCSbC0^^B8!_)L*abM6-JHq*i1i1~a z(-xUwGgTZ7vHS(E#=zAgAJ;D)M*%K!P79YT(a+hG-(x=?lDe z3idW=n5h#J={X^JzM}3>WqyLVs4u|YcF9veZpi%uz{N<2z*lZ0)4h1V4Z}{`^|gkt z{S!a9hX36_^pGO|Yg{_WZT}~C?4!|Ql~OsN`WxZmn8ha_4BuMQj(QTt-*77v6F^$H{%C8mN=U3yF(Vm-LSle#V3Lx4 zjc(;2ysRsqw4DmkS5Ia;<|lHW4^6Hop_E);qvW7=Qx}z2jSz3**?7hG-!aZ5SN)B_ z2f5a&lThopH!$ClpQvE6x!}dDQBW;wIbP6h?{x6io&?KlUg7fPiQdEh6193Zv)A1S zd<9bz#>jsV!TUy%E8B}3*(t@Np$(Et$kwSh03_W5b`+1yY03*^%#8gjb_JSbm2x0X zUEs~Zf44Iw;UY=fhA4eQg1;9TC;qxDz2QZ1JZE@iXN5a3fhvDaW%|7;lW^Yg1eDo& z%~xa*P7%9m&jX*BujL8jg|VX`Lke_gz=Z4)W8=2Th^tOHA0bS9Jspe!noCWJ+0$yT zomNREJCzff{JqQ_cYic~I89VsA6Oj^bQ#4$+c*bq4TuJpDb4BWXo+NC5W6L}g-7zR zMh)g_+26TH$qH2^j5wd0!{Jd+($@2g-CH8o*Stj}g!K$Kca$v#v5J*`PDtdnkeCXf z=a|9_LqYt@_`IJP5q@&v-@C13-#)I|`Q;4CIf$x{+y zBj(vu(mofqAZ;@n*0TPG;gt)j87nv$(T4i9P73opl+G`h30SD!nzRT?rr&=4losPJcZyGNjW;~G;GN!HH*!(aX4 zmcHnt-b#ub-WM+%yN35-D}9TEtM4lt;kuLc%|{JsHr4*xQJfzvTwX|_JX-u-zq|O= zo|1RjaReGVmDO-Pq!IP6^-X{*LL`~qe?p2tgWTI7TBT6OYlG8vp=p?I`A4Jr->>-& zw;Fs1-h7Vlu}c9`v*AxIs_DoAnrjskUR&;N`^NHDr5Yr_-%CzFU95G?u;9g2`~bw z3n3fTCNG%glWH_%*2{ENQ|JC3E*uTOwo(KF?MA~&J&2d#VC#`WLw>jXqLz|mSs*F> zqnsqCkamo#(;0kP`-%;8}N(;GDnUAI<$bK@xKO3&3++aGN zVuN1ijK^p(U#E?VB>Saq2q@667DHX*`Zf|u?LbdtV^ww5WWr|#2HPi8r;)Uba6HYt zjZ7l0vEZGA2m*aj@a^aoUYOE&*&C6UmqQ?X4(d5Q=1DplQmS|4h7zlAzE0n_p&UMh zEW*gk((ann181(Rn$SpGt_Cqo(`v3ni1{XK<-Pwf5sl_I$^3W&janv=RO-#}|70pp zulIZ7uT80dmWHFruakoX3{bpEYvfW4^UIoscfqO>r*Xg70UJMSIe5GP4_-z3Psk~g zoAEHFls%T8-Dn;+S5~<_>T<2VTw6uk&rT^dRvN%kcwGFfdBT?Ku2E#4;bExvBig)u z6~ZB>Z!}r6dJJq57C)pVw{0a1xH=vHr*!~TEM#Utt;uo9v>{xR*hAD{z;RdN1pk%ki(*ucY+V(+c|tjd&yy0 z3YEiN^0QqGQG;qlui8ipMc10&T@qrxjYqYHnn-49qp?|3XTF=zAVss}K3L*f2ie29 znkIs`k(F#4QhCCZX)rsT?jOds6a9sfz@tuG2!H8{0ABs<6ja+#tS0{+fNwGE{*3oLH%FQfce#k%6l5ia9Hi)QOSgEE3$V_emCKIY>5gRO zf-}(ge%wQ1qfM`pGe%~Yjt$jIZHGD8wZR*yKPDcvZ~q!$?E$C~rGD2tYc2yZ?eH$d zPw;Pop72LDSbl^Bn+xklX2aPx--n6#|-|!jz++Tst!LNTt-=Qk{ za8;^X5dfK1d55cz_?=^c^V-6Rc1l<>m+7!EuQ|1m^R|_sE(d;_VGW?1P||TD+wDm1 zMcVZYh*WFwU&#Pb+^ouG3j1C|d^>N9j44FThYtbfIvak$9$wv$>s%>f{0CPFF30~w z77fRJkNL1C^)WAqzaoN8GDNvXWZ`sS$(t9{5^U5Uc|4RnFCi*MkGEAG>1zV+{(I7r zmymfZiFEz>s*?a$gV3NFC?*mPx0Wh}Oo{8A5e3}L^6~tS-_d5h(24&$c)R#del)AH zrOg#ixCzef`P&U_on#RTFG4lMs zEz$LkPW8P7F@i;@*Pz`mDyi{Jv3VH77+m`sb^OXW1U7`SyiU;RP%oE2Cvt*roAEM* zE;i`yFzq+f7SBQ?ap5XMs(r^@S8(;oBDvH0@egI%`&}$0y9^i6*s4U7X9mY+=RLF; z3SIkmBKo6L9L|s^p1q5x zTeVkVjwsG}rdDzma_RzJ;nbwE%Codlkv_1VcXbPKuJIn?Gkk zaZ8^BxlQ>A#l-dEYb)9J;L(A{Kx*(#&M5?1eu0Z)vEt8=9~S}!Kmv}(!+L*9uE2(2 zE80%qP+Hq*!AlJZLhbUWQsjj8FnsphXDX1!v04y&zu&e6hDwX%FaqiwT7j>Z7Dcub zW^*g`Mx!B8QRtsG%5#fR+*|4og^w1a<*uA86fR#OBd)@DW1;7}j7i60f5am<^9=iM ztNrT@=f=cLD>8~v1}E_@4gd8E51OX6P@W%Tvgw1{Bz4Nf4o`VMPX4R<(O!X2j3#Ia zo&Xyo7&s{nuN7`H0g^eY zUII6(v#6+5WB8IiUgPcu{kiY97vfyy*CzuHHyxP8wxzZ!YH;fkJ~34NNr4;wUC={B zK<5bSjq8F`N)~PC0~tNLDO-1tI6}enZ=>mHA^wNMf&`ZzcPv z%w#`KvHZpG5;xHzn7!sk&z`dtr@t<>`$y@d0mFKC?z<+=TzzTp1un2yMg#xp&sT&W zs0vVnJkk}4Oi#S)R1l7tL6e(yuZU3?*f9c@o7*u?d^pag%r=XJ$gCvf3B_Je2~QED zb;61B%iacgL4oLH3QQ}Mw*ikJkDY^1%Z>iMq&B#wFRI%?6JN_r+W=(%UrZTW3I<0URQ2q%wV<2a=jv*}LF)iJ zT6l~*IaBHv1ZJA8V(>4AH%P^p3&FD8frDYlS0`PMTjB z9=G`D&L`c9ncf0chBGn7v!XA~1mPi>j}YYrhY@#_c2@gbj6Pjj!OO;5FD0-rp}&kN z9Ueq4USw)rbV+OfSjS@RW=CXJe69aVi|;xhGy;Fm=dM(~`=yFy*qqeXgtd$fA*(y; zqb?tBjMD|d;hN!X&~Eh+#Fi~Iz0JTXkmCU4!Oo6K-C6u)Q#?BGss6eC-T4tf+SDAi zb2168s+x&`D@4>YGrX+}MRc&KfJ>*Ka5b*={N)7mMF`ou?KPrPoU{HSRaW#J>585Q zZB%cZ-W29Y0x`IuKDYiQ4MX8gj!$g6@SS$Xyfqa|QTg6Koy72;cwU4te&+7S%mWinzN>pM@o=N6y`S zDJDW9KLy0X%4(%a+K5d057CC8e)apB@SQY|gTP9{{hjzW{Lwy8vpipMiM<)>eqhX6 zGp>!(V~X1joH{Fb71YiH(Q8Q}BiF8f7NzkF`tf8adlKHwTc7fGXC1<%M=@m5GKvB` zaxG*Mw38IzV<-F4}FH^U8~t*BQqvmmIW=>7=?nRA=hU#6(oGxvBt~5MEV6f$8nGf@@s~EGfeJOo5r}SP*N4e?Y5z{wSofP)9Ls29?crc1 z<5kV7pqyTy-W7Q!r`+_-JEkw%ibjmm@_ z;WebnxAb6Oz2AeuR{S4ZQ{VLB(}}Y@l;5W1SuB<-f-hq4f~k`IANfh`+=Ji6XAR?% z3nqsv8H#EWr4`u8u19>70g_-Vb=qowh)p5NSA~C_;%+PCFPAlPjI25jGaJ3zh@CqA znwX|$JMq3GgIgykq+;6E%H|I?)%Kn_nNQekZo`0FWkw$adJHw_o#ZypAna8Y#^UFu z-1-{^^G(QQN3Cwg7TnZdTxR zCWUVFUZ7iZ@L-aDv`d*?D>$I{O>sjgvt}F#alw^B>{miK%iL5eL7}cqIh>-LMY#5HQNun%Cz(l-QS) zV?BQp!;JA+kvN?a`Ai9LHxD(Z|K|6(mcrb;sj{^7HSliQ8qk);(P?(|+*(I*S6VE^ z*W<2AndBC>$rF6xw6dmkNM#_Xw~NXWiqdnd{6mr%k9+(8k?-dzF(T=D=rc(asFFS-M21UjaDWYpNxH&K1Ps(nHo5UndjyvSI8DGI2jF7&Bf&D!a6!aR`C7|Fv`~j@)i>sz=gnH5jrKjkal6At#I}g zkvg1vy+(?;2G6J~wD6|uA~}^uG>d2mOOlt?o)XV1k6ndt`X6tRD-lNuw?Y%}<|Uq& z7qheNnB`Nq=Av0oFj9^&V4CL|>GrvPLG=rtWT5Ya*>~>w3&ESix#|!ebMBpy9(dWbN&+mq3H>a<=^Sxh zf7UWEWm1FeI{f;l5@O=pVAi=Ek8`dzeQJ8h4OMD`C7s?;KkZ+gp4a(rHlha(g%~k} zgW}fSb4`RW5gk4$<9*x;mBT{eWsrO}nTKl>Pk*j*)YFBPg}+XFI7#7HAsPOH`XE zt$yeVs@Ywre@z`uO`&xUblb*r+BO3i&pKqDxxJ0CStuY`isil*i#vYq8Kqi2lsJd4 zB&eCHmA$HW2GL$L0avw|lW3la7xp>>kG%%C+wX(oRAT={)Ax~&^FKW|&;#w9 z`=^sW!B1xVv`n<-l;I-ZIeErWZH3Z^{wjPHZ)72V%7FL#SdZ{>1=LoY=bs7uUpOOe zP?TWW(t)@Oc2*8fE>mUwEaWc0+!I4(xZzhnL9St8`nY}4s~Q2@=!1oF3!8Q_jnBu9W*h#Wfo`n2>^&OYoW+=FD=p@n+f%I?0WA&QK?7kO%{PVY`} z51o3}4Hb>urpGKSlcFWftCCsGd)#3?2EN^;M;|*>B5%%7(fOV)di8U;Bw)9`zr$6K>mxPNCjyf6qCT?iAsxc7 zlN)>i%2@66;CEO1?}MXmWFTMij9)#37?z~O9^7}Y#59)S<8@&8ihnpJ+-I|5ns(wn zQWk#b#xa9E9YrmC-NUB>-aR|wo(LkedoCL!{wkW(F!mw@ZTlG=SUIE~KBf*&NV6_3 zozruHQ>V03XShb^6PM4;in5Jsu!XRSrrHjZ4_spQ9t~f+1Cc8+o=Ia`mc9EsLs$#T z{_{qZwA(k3T02i0gGpl@)*LK*4+>hKZfuS7XcYk1fdnD+qn1{ENY?+*z6JK_$mJQ8 zcH@MY;@hEWXH7GWblkGfi8v^cyEL)T?raB47m84kr>3H_k9;bGXFz3jTw5oR4NHsS z3d$7>Em^ju6~6+vc5+Tp{$Nw}XpfjzpZ|5B-48buZaMdy$9qTrXdnfo#V?!Lo1yYM zXWyzeK%`@NG{8ueEt7DMyC$qYN4N7P{2qity&f(75-CWUu%%sTaaOywmJ^<}g((5nngZn^lId+kbX#3+^it?rUGE%____U->lM4QeuHYH5MsIEK= z?$h=*AB&x+Yv);P!+*hhV(>$qCkXgqfk8S zz9IvMP3aeXFcFj5)t|fsvTwEX1NuI{SlLb-8Cdg`N4ja>iaRl)Wn&pfS=I0{3e`<#rytiu+bF05=uhb{dYCWG?>N^1UwtR3%Zi>>V=Eq(n z$~xY>pHQm+%lsyJZDk z@#dkw4TBT1soCk=;zG7?r|%JMwPcETFLi{a1~BSF{>+w59+J$xa|Adg3v;9&7o+6= zvXh~RIBSM;+APGf{eQqrUcZ6C^{?G7NiEWT1W|+9#E|?)-9HIBwy%sdHhf!9)oG&7 z#qA!&J>^uRC1tluvKpK}T$g-48j3`fHY85I;7_!WgW7}5ZE;e%>7fTPw~ z=t_h4`RCZ7k)MG0ib{L0e#`Jpr9U9kKz>ih!{EMRP{aDUJTZ=>7;Zt?ZJ0(GzS?(f zhwUTZt5%66w#%>)jSU@eheyUk2?(i0x{{gj$8y{uK2>f(JSzpep{46x4<`-Jg$19re5ogr3%TpkIL=Hj3$= z#ACaFVe7UXlZ3NAB{0#=zUhjEI2|^veaNjfju{;?fyMtTN;hDysC)p7uo&j~`_lO2 z!qEG2aKQh@bp1YY^_4Xko{l6yM94+gSfaj2r#B={D224KO zzDgftV!PY*K1?dydh!h`Z-vtSW=<4%w&n1CrOf@Lc1waC0VX^~+Bwk*(KfaiD#eQ4 z{bzGE-%|>gy3`B#BbD~lf9=sD&wD~8OxuA$D}}pc`Cm_!$j+x44eSgmJ)IY+AY+DM zzcP%yEf0I|#27q`wYQd9HMhytRVIhNiycYlNYC}4dV z2$X7YBD1t(9TO_v&V!>z9W9ig_ow$)pCVtv$6b9A@uf3T z`LMVAj7b zDeAC*uje?;G?IbJnW~A(9XJS0K2@u5@-1Z8e&nsW>na;b3}Rl{?BnX>BB2<_qnGYL z{F;Yke0V0skK1?u2Q+>G5h{0FxoED|N+A?~(Ojr{1u+trskrUdBJpUvK!G9j+#ZBQ zaFIw>jqJw;<_i86HT{{KY4$`!LrYR}F?)o+T+GS4YT<#OI@Qj?rNyBdfqDDAQU43q zt!^z?k}{@OCE6>cYU`b>Ph&*c-Zmt=U!LiuP=j6Udag=%+5bIN`T z&Bsr=y4w~#t=?k1JTd9|&tKo_6z)X|fo0oDafNuX%&V9m`&T_EON$G1TJVrD>ON2L z>w1_cCm?%ycA4AG!!q~jT( znm5t-B|Cv)>TfKnX=zonz*aXo4q=F>0qSo}PeZ!TY_h*=MoK1+by$fDF7EmIqO%PE zW{1_x(&*;o%S-HtC;e@Pd|R08L8LV2?eI$_8ZDUXU(YD_Fs#E^v0S53Z2%5mmTF>f zE)V^r5hE}<@X#?z=LqO4;4FR8`YVd!^c$~k4DV`!N5Ew&0gOw!((ozYb(%Dg*OZHz zi6(YZc@Rk6z{H>M(0qq1FBzNBka5_m;NT-4E~{J=Tbz)rKTTo?hn~Aj$_2W90pTX! z_81Ts-gz>ny+QV`;{?Yor6s#PPONlX``&$Sy|MfiGa)?C`+~_9m>SPWYk3B83W#W= zWrmDtB2FfHi6)`GHM@`?dJLh#VqbkrE+UjOuMAFVCYkZ@f&?Kn$;5wMf%Cfl8TD1b zaA8Kuey*=}GQIVWa(sqc@aFuDWa^8hP1x;FL>3iZzPv+--t*ffei#MqCWn)Am3F%U zZP91 z<^4SsaMsr)RpP`+zRS0a{$MI(a^0fKp9OJ`$mJWIy!_VKJeH-p2S!UZ+$!FBdtS(k zDhNQiv!D{H8PD&)!;jK?OQ<4H;h8%RI@_S5Y^~RKx?_;V;c#|`yd~vJ$te=eB;a2Z zMfV+{NYv@P)!Kskv~P%7j4gb|fzfqcoyuz8;=bby76U`N6r(g5gJb?J-Pyr*WyjSRanEcJn%LMoKJD&b4YfeI34^7DZu5`L!Q4g?efvC3a@&ENs z&Ug&J1}?{z;X4r%-XJEY2NnE55cy{MIEw&_H|2bnYH;p6xkM1@*ER+4Zc8d$LF`ne z5p7f8q-S^E*}&!VL*oKTYUGgC7(soz9CXCf_R8)f=Z@i!${=Nb>HW9vZTN@VvY%=1 zI_h2-0j`y&uKmjjo3VJ%l<4Pg7o= zfMzQ3^>;AxP;w~kFM35F$hI8MF*=3QQ#GljUVIq({`GiLo`Odg5Y4Vz_OqO)b^7my@&dy|F3< z=G2aTeo61B{Fj_{N+NP|2e)6py^qo`Hn+@QNGpW;T<0w9><2j*Ox$@0tmN_#Jj%{B z8V(}B2s=C}Pe}e0I`B3qCnJmdY%@-rVlEdP>=Erh{1&>!-4S_qJpQ8(?UF>F&r|qN zm@u-+T<6OZ!R`s&RK3#n>uo%DsmtMozgC+m(pD6`3xBP9zNoFbOcN`n%WMYzonx5d zn2X6MGkkdsON>!`=%5fuGAo$oJf5da@T-`naRnWvzOn|LW?^oi*0J(l!QcA9%H6eW zzKwB!@^HtsM-k^AN7cZ+V)b&4@!n(~ff;qIE1Lx~?GKs=_z1Nx+BAg^G>S5gwjXIT z9*2E5&#-BT(Uf+NX>C58$}g9G<)~pIo=MKBQpITfJ^I$mXVj$W>dXV06Ub{vRm;p! zE9S*GaKbUuoh;q9`ce3EEh(_BT>o^T-A2)Uds=SpJ;pU_z0qg)(4$D5&faZWbet9z zM$V!^W(5!}I3?ULRt$5@4378b2+OA&GrzjIU2-1@*(bO&+(;FUv<&CW5G?s=_#Jx! zk2Lo*j54lj1j1w*p7vE5?FTnL*xoL(t?FF`!y`$YC=qb$TU|PT?wm;zWhQh)v-#Jf zh$>q4z8fk(H{1lXv(?O=mDqeQ z2ij-$*rUiL^hZCczff6rOW7VfZG|=%oPhX>Gx(Lvy-VP#i7{rI zX2dJ?;%mbe*RDxV+rfP$_y^dx*IB?a{eYNz{ zJljLRh-0!oK89t+xh&wY5sF3lh>@N2Ay5E4sF8@%R+sNd{@{kmTu(4DCq1m=^v7_I z>8)jcUq6idPbVB`-gc2sbJrDljpK_s=5S?$@unFZVvK5{tIrKks5w@w=EJ8U(LfGyhMoVaL}Uq_c26>{QkjcY6<6 zg+c^EK~_83-u8<=mu)VYzIoi`xY*ZBb0HV0ky5s%KTI)*tcb3TKevkYU5=xc~(r1O-h&)i}bq?k8bBO zSI2Zv++&K?KEf-HuLsxr(m%a6s&pSPn_)^U7c~0q{EFwJZb;>3KS_q@#)4_b595%Y5FA4aBaliNx}-x7AHA{-6#gLmn06t6psfa{BOOIQ zV3TTgi)R>AR`E}%A`n@;#Wxw2<{+BLCYpL&Y5Ccd18X1{61Lf(4WUP`G(-Esd7(^R zB-6JC9YxzV;kD9I&%Iw^VeW~uXvG&EBU&-eP|DRisdA8*E(oNx_&S=5|#;- zlY|?dL!CcSe3z+9nut-vQ@QA)3h3IMA{6LU=+6%>HQ*8(YaaG_)HJ(QZECDB=!A1;1_01<<-pA<^_j(8b&RtV~%5LjPjcdktj)R`J z-5fA8bnGrjUWP|8E~K0GE-la5aPW@;u_F`8BVnkY$0mP!6IAc3xdx2ScMGoOihj~PVvx1zMN51F>OJbI=(|5OLtxt2q zBovlO^Qm1d#l>)PlN?D4pd_6q zJ`q(au-m*mJ`RSL(8$mc7#PgzN%HO4{e%)vwE)w4ny7j%Pt6f6rjbEy@=e^;vR`2* zsiVvgrXLhO!{+y2f3L>RIUz30+~7YjeIh5dBS{R_`et*`5jTGaSHMp;qGdzDDO7Y7 z_?nn4lE!>{zm3Hd-oi@}$I;uSNsx8uwp{0gUMBV97CUVon>ReaR9PwVyw^|hL?h#} zlrajOs?*zM`D>9sg@>ts^++QA;)&xVeg1wH$*Z$HO3lVrX(0diu~fnCpJzk(HKo* zGuk05S+x0FR;hE+#j{HWu!)6bvy8G#XWTQ%DP8zc9~b|9#PB9eVmF5}sWNIB4c~yG zK->HE+j{ZRTVH?a=oPr=y_*pEa+9_-;Lns)TePjrb6-LazSgJ{p$-rEshC1y%*s!7 z%ChlZWLCOGnr!sW|_d187AGlF#7y|!udz>Vx9;kck5>mT7CaeQ}v zU)GC<%d5`o&fyu-;$j%w-aySliqsbAk4OBKbhi?P%zge1*;q2c)Rq)RoTm5V~ za8k~6;B>BM82GYNd<~f1$Y|Jz+bC}&bzUG9=tihsJKM~BkPdsXfsfURpV@}d-z;jg z>g#%0(SW7Nka*~zRr?Bl|DKDOK4l#L<$I%2LS7+9bH8XHfHy=~++iMJ&V=f_q}p;U zX%gP?EVa!}34&eB>UkFn>8E~*dym`d+Hw9~_!SDgCKY7ZlaGT$Q)>3bn6aaiAJ6Qv zuq?X9ADD#pQZCFYCYUmCU>a%V9oQuAS?#rH^~6TXhOcK_)_@uU#oIlLu&ux0PWin& zp#|zJMqhKx5o_66O$=CP+TQFg)J-2!qx0}>*c09e%jMf-GiPz^vz|D65@Hx zj3IUAGubm28AHDBI>{5Yv&1Xv%FgooS$r^-vatWGeOPIMA)lTBu%%?a``9C~LxJL* zgu03q7Vn1nT;^wrV!hx};S?>8q5E{2T3y&9#o0=e2r}0*gG~TL?pRhPFv)!X5XD$| z^8;$NmEbk93T5%VQoihTa=dRY?@~E#DnBxkW-$@AIi)d&$+Jjgm3PJ&{P-p+`SCHd zzelgK^Th1IDZaWO#Dl)=U|B$=*?{p)lo-w?E^f%eDEx z9+&H_bfaFE3FJjD`Mi1CiokI5Q3uX&UN4QO9Tk2itye(VH?#0^(3jzicV;OG-AdpX zZ*bJ~YsQ_}hVW9g^EW8o6lyM9i&FP%Sxdqsapbghw0S{!&RT2b7iJ{uVl}e+q0QU> zY{><@^owdYqTtjv9gC{#1;$0^jjo(~q#X~-YITPVrbp{!!HQXaAg>tcSG4yy$FrDi zr~$t!u})&#b%hcFBB-sAA3<%+H+RP8Q^7by?y1jT8TGI36IWMH@6Ih`BDrLqxj>&e zGjxln9TrW@pZ*%@jF5xQQ{m`M1Q|nQ6Kt^l2SpQ|Vva;6k zx~GWYp1o_5>54Ljn$mPMD>FB)h7bAF#{%iDkbJ+~89rhRbL`6;;*N_#NBBcC^}wZ& zJ>H$xwF#WsevJ6~^+eln!tdc&iPgyTVkC$-FF_2UqrxUa)xf^uqKnaqt&JwS=!=;v zoIY4&&a}e!&_pUL@7>a?28|)lWP-6I#tn=OpT2$T<_%0Ll&-va76FDfs}RztdAmb= zHk9zye-M`yb@66>NnLm*@Nn;ugop~}sSC;;+l_vbKK}S}wIBVS+N#6ARq{e&8s1#% zuoQff(M4~ViIo(h7-^Fi+Vdrl5xzC8j(hdpGF$Hnf^0<^#zOVOwPV%Ye!lpH=XxZX zy}Xb7Yd2kFHLngnrT%hN@+OpV5Q;&*#bfp^M7S%psHHN(nD^4xGTd||OfCr;y#8L} z9?JlR-Zm{~VD>4vaCRWo_Xzx#?Xfw!Hr_*2jZvK4xfKMaE#7)xD9A=0+2sBcS+X}1 z-VzpOOjZiG6+b{;OgGUkqWH$tH^i1~mzkwY@FW%<=O(7AxxX9mlP#=BsDKD9O$^%f z@0Cgp_gRZg7+0AJ4zc>FNC#6=`!AH8n7W_`cr)8We0w?pK z>_xJRB76RYGG#rhQIUnCS8bcuqJNndR?5XkV&~cq1rYW0-4{Kw_>c11(k^x~L*d45 zh~b@8S-%^ZwF|ONFWg_EJb&y{<;W$h^cGC?2e0S_s7+Sq;DC_aWi_V(&*!_ z=}vYnFV6%TNiosE-zX5E*{`2`X)6Aa{#a|rLwX*8@UBhk;Y91wv5&`JwJRoH!ea-Lqh`>P}rfOS6<_@il%f^ruJgu4eBQp*EkV15=naB zyOV+GR)F(b@+mGRuv((Bx++9AUi#OCUAhvBnE3sR77o8=Nx;8fqy!C5j^YiZ3$-q> zU4A#pe`=ZiS*1pAvQ0m^m;0`@z^S}4$5B8GBr5ftc-mGnuXuQR^dgKWxbf9($q0Nx z=_}c6<=Q9WXHa#oQfPTKtj~}LlVJF2xQ(eH7~OXYY>zy%!QObO$HlvkZ-o^f(0?4e z=dLDk;PM1(&a}S~EB@5^*!GLVWr=4%h9xqTlVZg2%RsXSMc$@b@DM&7UQ5Q}F?z zg#hLP{sQ#f1sr`L+N%6_e<~s^8pW?-ie^KIS&4J|QdPo_GxbU_TCw=Hzx2_oYxyVm z?|)u(kxFGa(~7u`-T$1Pp`|6Yta;~HJYZak;Yqf7@(W;;sgKfe$Leh;Hoi{xl6ylO z-COTB=MJ7;BfnpZns%qyaJz=ET4|a;H%p^^?eT{io?PW-1^e#Rq*tN!=VQS* zr!_=;RI|^a+W|M*%e82s3VJ8wCLy`fQw^TnK2cQvIbX z^<2eU#ow@VcCf-yO0US{lqBljsC-|v1ud$7i`cHIdrt`~O`|ueHYOXVeG>o5*Gx#J z*_b+@WAM8zQng$7OBI5y{r6&iO8tzrk!`G(OcH(^Mmca4+K`w?=kvg4W;mjwNOX9voy z^0((C6ltiQ1wZvNi2>x0an&tfZ0C)&rZbw=-hE1b`gmiTs|&v7+-+?3_Z)`Djk^=( za68Ow=I$;=>5-XX2ls>b6Rcb^fr72Sh`iSv4n=4GC#1s?FV zd3ge}Lp*C_ve;LfPekt1AE>nVN{H-*mX~-Q-Ki_+lR9pH^!F_6 z9Of7e?dzlqH#eEWD&hZNPtI^qmv=;JSVtUcB{99L)b^iajF1giVbWQ^x0{B)E|z8} z#xK{lsiDqmo@-3QMX+nLXB-LpTl6_jVH6Z(ZT6Pm&WVPd%eJbMH$oyGiO0eY?tU|5PQ>TP4{c+wYz)i(AY>bxxykb)ce_Jouh^+ZwePnGof&b4EGzYvsoKFqp8P z*l<2D;aZ&M*DeW+STF+S{4ll4>CR@|3&nOy*CE5yV$u{O`^*_!=zsLDsHjH>_9Z)& zXiG6ryElS)lz-_hSv}6JUba8cn!!N6x%WKL^EYxpQA z`>N&Hq@YETl2wx@Fisu7oU(jyNM)5}p;N-|>_7WNSQ&tg{Tn)9cmZx@i*2j$9107} zmXQLZW`?z}IFaFz=@6@XFZ(Oq$G7}rX@ab2U+R}91&AHjLFHR{=hwc}=QO_;Iz#wPm9?IpedKB;d!9vH3(dNnd?gb#q^|J!OwD zMQ{U2s+a%~T}CCDyD65$=EH#%YD_WU^MOya*}dlHiPpa^Mfy2R2XXEErU}jJzAB~L zmgA?8B)i#ddYRqMd3IeoCql)Gv}k`g0nMCAzqs<+pL#DEgB(67Z1Kp5znXiIN5{Fl zYb?gm9b)lj#ztu4DuE010=@NDc67~=x=FaPy`pYy`x3H?4_8=R&e~{R1OW|bcH24e zHB05yDJNJ5$TfCISlg*Si#G60r3Yt&Rr<(HU6$Wf79WEPt-KOv$&SA*m!kh4n!Y-$ z>Gym8qlhRe(m4eMLAo0i1w{~%?(XgmrKClqTO_0#Mt3)i(E|pI8e{Z;jql6%@B016 z#Wlv_Ip^HxzVCA$`-(#Kf+(d}J0z}uw}!CE0m28Y+8;cjyp>wR{P^F(?}lq&@jP^K zB$$0+orj^z&*9>xpD2J3S|*~6RX4|)Y0$O|QK$oNnE>*$$q^9rhIaX-?q z1S^egRDEU7Q zi&mvZqb3F}Gy`T2W6-w|T;ag0d_ZnYNRx#7lKOy&d@XM9_p}4b{U7}M= z8SoK&NLF8rR`5OZmPlOoj;{F9ymkt+7zQ(cN_NtF2_1XB;QA~ zi)>xGyaBpyDlpKj095*{p{REpb=gfFh+j>{zmO2&4u2|(j5qD+n(Z=hN7Dx9V?F0L zn*NOgNnBrxFczjev9sk;u=nyKvuyKzwgk$kd_?$PeQl~vi;2TKpB|m(Kk<6;Dl675 zf>V4_jHUS7)epio9k7P}#85vYgTMW1E;-(_2|X{H4WG{((Ve@1V&LNwktM);Hdxf9Q;R6l1U6ZPz<7>wF&=~fqE2}<@yk1}xw=C=O>~^g}?tUgZPg;6DIR{hFV)Y(CBB=>vBW@9X-c|kU zK#{_WSkWh!ukJ&*nCp=(2lVgUcbQnYIXeyPx6f;z4FK+rL)V!T;qK}?OQ+VIM>04Y zWhXN$XL-{yE9l!(ojoq+dBe}O4iqJqA?iwb4(^61U;ko@*RneWCX*j~atA<*h+CUi-8w* zbg__8YT}C@Almy7T#;nA-`IJpoc#(d{o7{GcLsL4hb$x0$`LAfZ8;`^YM*Gqv-OXy zfmer722(Krc?8xzuKh$fyWs|hmfzihh+>K3BT)_h5@w_JLP7}ohIH%s?$#ChA!%QW0_qCeJeU9LlDsxmejTg6AJQR4fp_uWY0q^p1p}2OY1@gT z8&_N-{3!tXh2#@k0pn3>6HfqtC3EN4Vg<;yj$Z74&2^=J8QFj3ZD_aRKQgILdpi5h zaO?B4FE7NTM9rQ~PRbM$0iJZs_hQbNA9n!3RHGy_Sc|1a9M{e&^{iotW|mp#RL@4C z?q$dI(Wt<()*C{z&l{k(0dELxjM`aCrf<04(SkH^AETeJ{?reSV&SqA5d197QnENI z2Z&qhBE_zFln<>L$<=q$Ii4x*zFtRx&trc(WtSjjSmH0+e&HJCaD&Yc01sbDw8z65 zKwmAr600Tai6YIxTT7doi`vnI^>Ebq$TX3{S&s%_Mul z@1Krc0BC+XkQkoe%6wGvYO%|-tXcrw5WmZyTA-tPPdoHXHBZCZD0)=TU!M?Vw<9Mg z`}U^dmBsg#Ac3$WM0=@o z;)%qAo+3t8LXdjZaFQ6682gI35Ci8lu^VLHvdKtR8b6-Ow--$0obSs2x<4RdC!xx7 zc?F?wvwbQra*wY23Op=YDa@1-ee~A$ws#OFQC1CNAK&fLRRfnuTVlS}w%%uVBRSmE zH6^WPI!qRIca?MeR?}Ox zDtXZ#yT6{1DL$1b3DTz4_OTb+h;}wf4d_gB>}7QjJ0gzv$=#-} zBj~qR?90^eD>HI+rCOe>R{|&+3Nqv z&x3$VOqmopf_(p1K=I})S&c04Nj-p-N~Y6nSWC-75|H78Y;SrAsG4+;>k$OPZ=)jc zDi?zAOTmPi{#0d7S4=-lP7S)VsMa(Nb|@I*v*jL7&A~ zHvM(wK|-hf9A{mwKR082yY!DGwJ%4>hJZ3i3C8C*=7(sEK^DF+(T)w|7dUk?tv{Xe z>}8dbm6NkR_>TLZS};2sqsiebt+z+dNy_MK%bWv^LWzILcCyObE>IitFSe46XLcrU z1V{h9rXY|O`U@_SmN620pB20W$U`E}2%A|a)TH%?l?em|njy?x_U|>90fzygna9f9va^Q=6KvWsH%EAy^TY1F7y6H)|!`+ul}wq++dc zj5>oz&I&+8P9iKD{)b_DUDFgl@vT4P=k=3MRIX9i7uubAeGr*Sz0cpi?*pt=#>!yD zHp;brf~l@_z$i`SLG9>Qp0QaZv3`$Fe=$gJ?W5UiU;{oQ77lX}VAQ8m{o1KFby!2y zz!KW{I|(>JXIqQT*|s_!+>P$lJ0_da;ChmKrC*-S5ev6p2J+D3N1U@rzQIB)!uCG< zeV%Rglz39^9+tO|DTGXyz#k`&Vw+QhCejz=+ZB}JBW*W-I`!Zb4=XlEEiOlDIGf-cbXG|$SnN8ZwyjT_hQ*O?`YI&I5wT2^- zX;Egu?RrcY{obgm7(Zc*b*J92Ew;peV1+zW(z8vycUMoKt7@wPI4 zTu#%SqUR$?9UdF@0LI#WA+VYszy`bB{E}7iGaF0n+)MrB#(5&MztK zlATrk%5=KBblxno5IZ{Y$y-i0shFJZ!_X;&THEtKmC0%SDJs>cOI#lT8A2s z+BI9OIu8`?3s00%ubdKKbB{D748m!7$b3&Yeg-NgVvZuaDEGX6_>mh_-1w%$SGnGv z4K@4*;UC6N^C+?WaZA(q{>Gb%=;-Fjis-)qrmcrVnvp(?d%X>cN>L;;LB>(Ef4dX> zo(W694*{>5*V>DL6~f1d4yH@*`b(vOrQ&~GYE%0`dz43!f0=HLvu2Q@CsIqRmCR&) z5mH)`xX^;bAj3SPwnE?efFka%-lkhuy)U9_@Qqx^C}3dCaWS9z$6`&=q-?J@+AhYw z)$-g0$XnYbzkzR|GwPx*xyPtDl4NH8Zt>V*V@;*Q0iD}%0yC^UsZ+x*!F5~IOpYII@}U4aI7k<#)Z7o9=}e%xpbK2G*D?wNzEs&fk`>FC#co#h z@>i#sit*Dg3z(L|7My6YTrX*Z%@ zQgP@5h|d_D|D?yI1k5Y3IvDQNIQ7Nr8K;fjUG_WfbaDv3Wg(Ae3(58m$UZhaC&kjs zik1Kg+}tI~<-|)avjYnF4tnU1NXqjU}E$W{J)LPiFgf^>q|riNRR- z1aEw{?U&WH4K!8{{ou*LE5)`QHP7BnV%40wMx9S5nY#AgD(doWkBG*T(dfyto`PFz zgJwW=Z*^jt-5KbPHU-EhTjb{+Y*SMLt#S{aKypn09;nxYjK=k&2&dDtq`B8FD*So- zs(%N@xVxV9-7O|kVMnlbyN&JHxCQYaKI;#od9!B$E5X+x^Xm@_qo-X{!5kVy=={u3 z6n1^~&j!H*J$984u5DRv+xORWd&k0FjAvDhS5zFbUA*q`3$GL065Y)6U)toM2gwvC zU<+*hoBWF%h_m%NDqWsH5BV?g`te!^)}*&9GP*BlTPY<;Jay9}TDUZ%EscZ5V#`L=xGkoLn1hMMoyh zil4N+x;_+?ch%Kib#I&V*sun~MuCHu6j(;r5BnlHMk~&kk&I>)z&6rO#J7D3Pd;33 z%3>%pqwvgitk3AsD_|<9iN#|kJB0qUt&~qdb#Zo(2`i*v^ZVd2Z-?ml`-B_j`PQ-L z_T`lE5XCO6ZDkH?Ve^%I%(?(%5tBgVWGH9z;<iI$d>Qd9q{YdrM*S~Xyvi^*|)ko*mVQeil5iBqc^Fn(= zk+(_m_vmsT?B~;8aWm%*B(KeDTh1G%k>*i+SGJIE?m3e45!2S6_?E1 zK~@SGJkHQArwUgALsiz zx_@@y>)-!Oo?pl2^ZZ-BZ;PQ(n~d#Iw^D;5S(Z!B_r*;MZye*bE=p}SwsmI-My1sS z?z1~@l94?8UM}sJiiCId%TT{D$LQ)DWp&;MOlpuRt7yQ>A%O)O89e^(TGn4M0-}t6f%iO*Zdk?=e^_BQ zIO-=l*GOi$m@pRaO+an$yTChVqV#0+hsi~ITJBZfN?><*sg|Zk8XsNH8XteSHa&d6 zVXn8xTBkv50rXT`PTO4L_fNR*LPR;qY)JXYAW9fM$?jTR8N!_1t!RZ$pnOrCO(Q91 zsu@Ao-><2EAsA^&3rW}+e%LHk5xd}ei@R#Z+Qw`e!)uS6tm8+R`1_DfS!E$=qHscy*Qqjl)rGAb;B_ZcNzeo-1f}ISC2EYMLDv^M2UhQD4pb1Nc@4-UM~y;iVSBM|Ck#K>o*``&#+wXpV+%(0Y$b{bn2y z{h+)&x)Z!`;S0ElF%+x}zSW#x8l)t&s3Mym|XUTSQvLs{~dE=N)Zcg|n zX3jMH%&>oNnpm#QpF~~>#Sng%l#bw!c3^LHv75qa`??19HTt`A{EHtQTJaQ=30Z4{ zfySHu!RJjkSUk!4@1$aUa-5KwSUtYjqd=NFP@pGK`{x`uQFj|-(o~}^Yv9rjy0pU= z&?&12n>_dTq&zUbl)MqBbS?9Joxu2lkzAv!i|Pp_vqlY<^N>|R--kcG7A*?#E&svI zJzJegCP%d~9Tvg%CR|eiX~XiJH`iBznPLq7y>I^!O5c)lG{V?8&l?U@gm{zWk0tdA zkHWB$Y~h{n-jUR78Mr{-bplqpa`As&z@o+T>&WFv_G3n|={d4%qr)bp(J5@A1UfsS z0k7r(%yuD3KWipQn?4p8_9El8br0%m=9g-v1%S*DtZ`igV$Za^SK#?}*zBJ{HOJLt z96`Ii`nS<^U}ZL-pIqbaQSU|-!#--M$Nk&+f|ObDnBy`)(n&#*?LLaDZWFJahMCxC zj5+!POy@?B-+(QLKDy%hT4RUlLG`rdGV9!9+LN+VuNu}8brp_a@^ihgm3uDZ$cHAc z!gW%k#L?;H*}gwYo|pV1xh$y)A6)0ZsaO`adHXyn$V5R0GIw5_hzDW)9p&JF|6ohu zx!&U@zU~A>mEeO@CH1jn^S-Sv%a5*~dz|yqxrdn63oRFXW?O}37(nUj^?v|U7^e@$ z0Wc;0=k+AHUYeQU-x>pWYurE0!y8x>7-tJ>)p>IHum@he{=Ilw)aiFB^Dj$q0Bgmw z+Ue1n{`W_Y(~jnHm&Qx08O*T+c|6VeK2OV=yXi7chW-YirA zD$|VPW^sS4P+6kyH_v*Egn{CZVLTU^HGUTz#cx_Cjipp*GLOW>4|whZI}y~`MaN^wG&tQcTS3d9{fW6VITX{aozB$pPYAr#Xj;;dcYgqp1*dm7tTLFPw9)T zDH4lV-;OzJ(6g(L!}4ne60~6rRDd%VSWyJIYS8(yE(Y0_gO)tXDqVXtBXJa$xlNl? zo)EPj%6YrG>_L*xK@Mk2VA5FfbCc^Rvp(KOPFDVGReeNHKpD2kYH@@A;^7(Iu%f)) z%p3K%7kE>9D{ovhy)Ew9I;k_yt^`Pzbi;lt1VmeE;Kw!T2zZCT|8cEswv-TFRXN`I zzc?e>unzqFJT5?c4-mB*=$q~8dwR$9g*M2sD~k0_<3DBz%h2OfQqMUWj0!QWQ@M7? z<`)oh#mCLqkxVNy1~eSdf<@MD+&lYrJH;@lV0A#nd7Z^r3`AoRxxl}EXl{{Q@S=m& z7WqBRoiUBFA&q7G2Jy}y~|7o$~=8ydP2YbPl*DdJ|g%8Xky%?zgH(YC}ty3j! z>~Dtu9OdiV8)0SBP)HroSlQT3At=ypML{rb_Wu3(LkCG;YPKtS?+l4 zo%-mD2V_(KEgiW26=T`a{gJXom`fG4q%mZ(^uIRv_?HYJ!#SVz(fM)}|1j#6g^TFP zo6{d#K&D21ztlVZVEx_dJLu)Jj2qXC|5<%a$mQ!+U5OeF`Szu$gl{HHTIiZ$>|@fe z?ldu(hf*F5^^o9lTuSFJ=Se!E_w|D+;+=#ZvYM!-r{KTQsE66L&%VVpYb;O5=sT0g<&TRiM+nU9rX0n*bp8n=#(x+g zP>rcL0{+xBV|xq`OkbUSKQe!lQ7=P&9s8zcYP;UaT=177A;G))-y!cxfvJ-G+}<^( zx2Zjy;gF0rDh3gT+YyWB3Vz_DB8A$Mi}^2;!6N|SXYtPlC<9Rzd{X-GP%3 zv(WP9qIzCuCmO?a^ks@ia%Pu3)5@}Wh}eJDUJvzvL+R8P_2^0`yk=4?_qWXMfn{y& zkohct%4{p3QW~w56^DBtECK|_^cN_ZTVkuC4z>}Sp)UL4mpX#$x@^e4(-Qs(^L`QMXPFIp}XX@0x7f5ics?TSS1#IzUO^*Q<_+B88g$!)#H#~tjKfU%x ziY%^iA@f8GiTECmMeh4s`b@N?%ZB{UK zR7g0_%-=Ge^NOvFi>tTg4KmQCTcuhre^=fBINzUX?F|0#V0u;meDo8#^EQq5Pg6v7 z0ao&^y z`(5nbN^~V>{gqH5DSv%RO?33IOBkkKG?7zAmkR#ugX3QhH)}-(6t+|PW}8Rm|5+|-J^;45~7~LF?i?Y7DV=G zkJ*N0R+@W17MNby9e~HXYWdJ;WfM@Dt+_J+63skO?cXVZp5(-pcTIm2+xT!AbgjjA z5h^iCkU7zp;S3!NTEJ{j21#KkGNca%=%;%oAc+WZE}l#jYE2B@$vY}7R_I3B(8Wc* z^r^q7)MdT1LC`g3%+~(Hs`sqVM*pVz^e^seWOftS?~Nplq$<47n$xvkiCTFk2NX1kKB))1C=Pw5&ld8s<9`-dxwc6t0%);H7#kpt3PnJ)E=;_>> z0+u%(K(pe~_`AN;$4vKu$?J^8h9A8V+*J+4Wj|crcG&|X!h4RoJS`g{)!ZtAec=vw zb~KjX-G~#1#9NNcQkRJxmFWRfhm9R|1z@H6MIC3@iRAB-oV5oJo(|TFwDTob@Ym z0=I#lpiUtVgxv7=>Oa;__VfA=W~mCnme**ZE2v0CwKHbd^4Y2uUMW}!=aXKP7(`>b%*n^7~uhYG9ew-m)o@08{) zd(S`$^0+->3f?{!QlavzFu+&uGb!c7`9E|{x{xGq94yRX=2k+LKKFoU++afEu8PZy zxY^Cw-t2d-+PmPUdBpGQ3Zq1IWG5NU4zILa(<;@QHqnmKAHutwyrQc*=Y&>cOvM?$ zT$0u@c$|v+Ap<^LfCf_sx%=vEn{%iM55wZ8VM&>YlBqvVIr>+JcCX=6yXbyRvBe7K zeuH)Bl~-;u9G-15a|y%0oh1|J-<@yz{Cy)vEkcA=^H`MGWBhqPCt1Vc<4>!f^^O_s zAVCVrqI%xojJ`uN!uDxU&sE;LN2 zgS@V+FN_cdRdP`diCu{+MgcGj6Wrg0pv`HTmY|f80|nTX?Zt!y2{N=ZfFMW#ZFzz4 znbp|DCVrH?!7`Ak<)Cg#moy@!{9R>aeMEG8l;haZ&n>b?X6`Dy<0Os`8t_FAo?1C* zHXaxM_o~`C0>kLYJ~@p&mZtNIik(onkd+aiG2*$!eNWl+zI02+i)UQvr4?x>!KX3@ ztEVKH=f4PG;976dIA%vQ7E?0xpj*WZZ_m+m6UdeNbIK*nBvg32a6^gPmhVK`g)4jD z<}7psO41LX)#4U2O8RoNQjShMS>*CkNv4PmlX;B7j zX(D3V`(gso8R78-tEC$&>)Pan_3+`ViDH#_P3zK|fEjt7gZffR|9zs-rqW28$kau( zmnHXs*Q@pB(bt5nz9^-Z8wrD)GDf-)-0Z0rK9S7Q

    kY6Ld=7jFPcfsy~FJ? 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

    )cWY5Z@KFV>FmGfNd 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%0AYTGGR6LI$mY!`eeERfr8g3_^j8)`Y8L>^4rql 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≧rsDbPK5^Hvw#jh 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%0DYjTZD?KQfN=q!W0;Po|1x zDZyl@k<^MwVt%fQP_!7^=oao=;;3gXJAD!qgWv)eEJkz|H}C7{%dz~cl&f9lKE=#^yrq)Dj7u)KUSE8mDMq>x15nR<%cx$>qF(#m_=ng}* z;fsv|Hq07E+-qGvzVef%0!*QD>70E@m0kSnBJbDHaPZZVXfA%x#;f{4 z9#Rbtc1jjl{r7c_8veUvcK~CITC@T3P$v$}$yozLlF7Kt5pgq?Y2KX47C!51ZPBt( z9VZo?34U1Cx)au7trBB_+)G8yjH!Ooc_zrOv&c3q#raEa{V<2SdS-!7le#;$QI4ElCjN(q9yi@`BCxH|e2k^n8?-uCT@e)TRdXIu4N3Y9ut7S2ky%Q9FF!~OM)CA^kiSssYN_VGT@rF^S0r9>Y`!RTAYT-;I7XFNk z(B4aVmHT_;tf$y~7x8ttyqVSYY{X}QNUQ@`>ppgV2N6jRg?Vq-2h6=U#%0Aw{2z4{ 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�$RX`n2F*Z#J%d7CzV>rw%) z;#l?D*WKBRvFV%t`8A6K@G{vBsWnPB1$L!E_nE5F7Yzv0Ldg*$1LU$H+5EX+VICYl|O1%^jt2cfWI<$shW= zKfp>Jw}1Lum574c9M%-S#BP4uw(52HX!(+rw)c7;t@pZR^w0uNVe@gQR1sSH(o>~n zsNR$OYToSAZwHVwBWBBRr*qhWm}P63@8SG!lF}*o38KL*WtEeI*jtm7W_gX5 zHoaw=&R%uvjlToI9#LLp>?c{_{F||RP%fV;Lg60)0Z_#yZthIS&aO7#b0VcC``qDS zlhXX(uDD+?VKZ$nO?CojTNM~^91HQ?r6q-?!h4S;MvQM8G3VyEDOaanic0NsjH0A` z0IMgSo4wO+U?+ZiDpmb_9b#0B5z6=S+8$mP7EGbj;t^_LetL&A(aD=VDIZ3Wya6q& zAiAWKxpKmjr2;@;%7g|zeXCTyIezc2Ro#DM4DxoFj79Ksp-;J6 zpR>};mRG{1sVe$E5*p^0-Ym3u2^>4vesUSi07mcDI9~l;#>HM*52p|qu}Uz@V@-50 zu4^wqz4Ob2*Y7ZTREorUWX=r9n{VSM0h7Ck<5|eR<*7*yaME0wBd^68+FD9B8F3O6 zRC)NGo}Xm*{NX%rne4Y*AN!x!dDC!_9qRA<$$D-W81%F^SI;1i2W(SZ^(SRt2Syxt zek*iFWe;Ux^B*81+m!yZ0s0kXlJAW0NV&Wa5$sr5fXAw9zbQV9e9o7}1*E)i(^DY& zMSo}f<(8klaahL_Oi1lc%{YDXrtm)CHZs_=Spn{L67l+3v0(ngvRZ>!!N4rE{!F<~ zzYVOm<$`Kzd=j&Opt`a|stY}NBT~|MtNK%@idKtgI?6Ix^LwJebv9!AhhddpUS8vd z1XW&{%w>Nto?8YCg54B_V<+~lUZ?=PKk7YtnmC6q%I*xk=f0d^&3(n^-w!Y8htq)n zGaz@aU}l6>$R$D7r7`+Q9T#+w%Kk?-*KCcDL31t5Loq8F1uzXE{4;f_fi0_3tY3HS zLy1y(QoZ)$*-^|sr<#aeYslx)DDlpeF-u@1wPddPN1B#_HRYP#^CDkEj<9B6sYdSv`-#wHhg=bRDVNT>~j@RWw zoSJyQ2)>p~2lc0K#U|d+GM{UZ&4Kr<_4-rG6X;+Z$NG3XtuWCfU{^s)nSS>gMl&1U zu7mgc!6U>3P{oJWAd|?eK?35NDpA{xyX?>J=ej=v7$>DURgTmfG-M_?#CW(*=;!8P zk+cF+t-OCd-#F=siY-Qdh=$&LKCM*^iyhTe=$t%k`1K~s8=cIzF`E5os9A@1`_hex zV1a#Y zF8=d!ARywiG9BdD^1V4t3%CL+s1!)3K{05x^u&X$oo(Q>nE1${bGhzv>m|s*OaRzOmS^ZaN{d&E zNytn_UsBOHR6`6j#oH!E9$PsNe6ILqJZ&B(xP7a-XndC=ivc$ww{Ukx;3u5*S-CCH z|EZU=Gr<$Sp&H?2AW-)F1mLJ;!CkRE_nuAN#l1o&KhI5w+71gigk!P$c?;`r3>a24 zduL>xCKP2z98f7NA1Ko_1U<+qUz7pb~zuHUwS>0y;)}TOiL^#p)Mf9%zc}uKnXi6Ul}rK6(3!$KIU~Ah>zx` z#EBEh*7`?#gscz9yASY42~vyx5&vW%cX()nfJDhL z*123{oD6X4z^L}N`3e-D-Fb)cL$nKM7O9Kd|B*b1@1bA7Xj;@i*q*;EA@YZP%io*> z7-)NtOTODarz=8g3qToG957$J9^}}wbIm&jXBY@qTz$WD(>5q_XV1K*=Yt_RiC=8p z_REL<+3c^4x2Q(<>#sQa3zzn;?g_!0S{smsJy zfjl+lBv|@FJTy;mpG4qYu_0TJFo36 z%6VJx>|CX%`+!&AemK+in6#BmX~q)PGk7Hw}j6@Je0CuR-82N@`STK!{5990 z)Va7d=GW)Ee;fYH z1{#D{0{3s#Om~GAKoUU9kwAWeOS|DzZkyQAeii3LP3KTK5| zgFy3McM}-3G&mO?UQYQywK>8Grkc4-Mh~+r-RCR)%Zp^DWJ* zF%QKai}8ku3s{{X)=>N+TyGUVJUw4Fv>U$`rJ_pvPwS5_M*F$2cs2L^1>b7@6#Bwc?;Gyt5>c(K0Ed~rqXpnfGrZl)Px zEH-y_6p^cX>Oll6tqDeoD;kqhMM}g#{+(b9ctnk1O7A;e^u8+jzl%osH4Suwi&i=bG)&40-qt1>0OO=M#>@_S#nNsUmxjNt_=A>nQhcQZw6c)GoTFg) z(Kx_1*WVhH#_kYVVL4O%JXs*gOG!tjxi=u2JbvO=&Z14}L5&3n-?pj`;!Ij3K@ zIRJ_Ru1Pll^+$pW#%9iQyUq(ov%cKiEhpt^P4Ik}(~js(VS!#{N*V4^!PnYg#0$rL z6JH#!Snz{&NF!+V00aite~}ycU|oXoF}Fo-0oTEKr+SIOg86`hKgMSMY}GSvVYc=8 zBA6aBb8=x{ncEGHmc;al3*t&3>iwR-xdM5SEEqH3Jy%K&Ex9;X@K4aJ*12Je(EEHu z{68{Q{sQ9ddXmzkmDYv5Bc~OthcktDuzzBE%F?joO^!sQB(g3rbxrQYE3v8PsO3@o zZqRje#mugU%R{CJWE@S+kF`ST<(lfwNVO2EH_uJ4mEKRXO}Y)zfuy?)sufm~6!pY@ z6T7;#u3JB0^pzZ&b-L!ylhp71XY?|V*!YGXSiB%^aiQEC%>AD*SYv( zOfuzwaJ_Qr5vi>BcZ`fnniliWN@w5A@zHOx1Yuc>ux|P`4z|3sY|AVZzOd|3|=J*)y z?2At>uaFq;B)V=8Vu4^PdONHpS1ATQbjl6GApRdl4M`a~)#a48eC=!F?9UH4$Nb5b zYk$tOLAD(Uj*2Yp(=`}-G7uBmSbHdGlEbs*QY1n~wc#DyvQZxk%e|W@7WX83d zV7k9J!>$*yH|#WjDxRU7mU>AG*AyRm?tScOMoZ6*u(=9wD-D}uWI?p8$bZ~sC#m0nH{Jo`8J7;2ONdb39z$`;p1Kgf~&9yP+5j5lo zn2v^1{i}IK-9yM0|A#~bfJe9K&S)>F`&&Z1lN5b|)w~#}poNp`xF;cf5MLl{zC79r z)i5}GZRxx|Lw&wq`}mNcLsmed*cb$mH${JU`ky!_Oa_>{x|X%V-&lsgveih!O<$$9 zGmGq>PGjH7MnS-57-2I!y3RuGSI3Vx%?~ge>~P+;UJM)6(#$%B{o&5$(pt^4s<9{K zU4s_cQ2y}b%fMs3U`P{}~R~b~vBj#0Fpg|e*tLinbSa}1IO2+WK4-JsgTW8e(SonMO z#4d-kkAAsh1xk^HUZd>qKO{oMneMlT-kkp8-OqKqUuw@7PQGKfHxqY;s2W3^_yqcJL)nLbuIjKMAo9~%syU%|v zqS(#1f@Hh$E9IjCL)WYv;0pN8GzZTTWC+{%*bVM_X*C zvNs984ozE;V>l9M+z;Q%zs_aMH@^D@m0dKIVo&=DJ?F5PKZ5Kq^dYGK%)ch5xQ>M!?zvn2!-1 zcM;S~f|ql?-5{se%jJFiSNYRy+QYuTqp%5_A58njZ~v{Ne?yoZI=LVD<}ZtqBS~Kf zQ9c$wH{%fp3}BvTz?M$hLYDt9Tz_|} zx-qiN5&Ww5(md-9;n*&)%Vi|Na0+%-x7qjYnjFTxq`^A!o7m3Lr3@DpU7Y>v5c?oo z$3AtuF|?oOo7Qub$0VJ^3N60;3V8~xLM!B)P_IS~lvCyD4}h6AHTH8tLgy_99$(jU zXEZxb&AbZqcKY{T&=pBx+hRQDnl<`?W7hQJp74fOA8j_e%hq0F zI;L9K0oHg6AZ{`FJurQ&)h}8$_TN_zuP;z-2S6SPQG zv+D2kD81Tt_EPwp%Cm=Uf-(r1d6AK-!&(w#j1xsq&EG(EDinIM89VvR@N6yj)A_Uj zHcoK;dn-q!>90y9M&tOrfX(rK!_tS)jVn^?5BxNnI$nba5RInkB>vTN`BSc{Q~@(T zOmG<`nRwJnHmh3$ZP}8-6!+X8Q(TN@E{6!V2;83DGAVq#5Ha|$yc0hav$>j=7N>h;b!eg) z-zkpf)5KqA;#P-QlS<3tl%OUvoq&!z2{~U6K1J!)t=CP=2XI5>^EC#sLVi9FRm|MD zCE6P10fS8)HprCvq7hw&jUpQwVp_K+e`dq;c{|(XioAAWeJ^Wm?Keo(0M?1%KR>7^ zec#g@oAQQq^=g)Jg1QNTLt1wOG9)!>B)2Oh>E=hXx38f72C`-`@J3~Ci>^*gtMOr{ z;)*)|()xKZs81?kXV7CvX6B&i2s1c*cMhbaT{p?F^3rKDvA-dPJw!pXxEZ-K4p{F@ zMm!p6)N5ZXf71TOJc<$M{wpYj*B8_cGco|osNv6kkg#*uNb4tDdS|<2a{X3J5lBCB z)n&h5^}{Vq(IvFDv0BtS%DL1vXwdnwgB=G&4vH+l%G&tXaT_wp?jMuVf$jd6-1-bF zMb{|yal<52$^BUW?G2pJy7}~f2bJn5QcYJeg(!uNKljW0tD)K=95e!=3TVy@nr6YMS(Lf$oIt z&p|7X50ZVG?UYB_NrsZ2GE}q~FUFos`5o;<@GlBG)lAlD1^I?Oe!cy{xnPRmd1l>F zKZvtJ%sXAcHrhB|nY=E_SlbP)3u6o~FR-JTBVuXH)W0?>US^#+%zt1Y8?Ep3Yumat zvsn~n$Bd>mxE0OjKU=I?0&1^=w4%8>Dfr8rZ4XRqUrIbd z*zOZEeg%_Ya?3t^7Wn8DO|;DV8FgN*x_Rb(aC&(oZvCHyHrLBClsjlE?JVw9 z(0^F-6TybC=(w8nc>~SODOO5Yq;$-N(F^eRgJe;4=J{*Ukfqgj9F{&N2NAH&qImIZ z7QL$!-+a20i;$4-mNj*G^W05R-EE3VYkb4aHn zR_>Uc>M52Ynbh&eId2{^8R#B0PKYhs#py9l(P-O;SAR_nQ!nH0C#pMvC%|7e2oDl~ zTq63DZ)g56a+-M1{R-HuaZj#rtZZj}Ea(B&6Ox^a;MAPVG-;+&Y?Z!@Q(hae&*DHXa_D^t zHH;jgn>!9WlQEEoQmr6D1-HXf)@gU^JIle<8k`i$s7{NAmAcFhZk7!`ME&k%4T<6o zGyMkGQ^&TJ!pF9kUGK+wo({cAru2E~`;)$vd~CcXN%BIs*iWiD&M#cAKqR@05I6&SGX*6~2L zU(8;QLCW<-dbArA9Dh+rlX;Ub*&}v!w1{|)64^O0MVvRY^@jP&E2G!+M<4d1JXKzG<}voDA>dksEB zFtESk zqe}dmhz$unHw%$9BS#RQCLj5}m1^g-T~={1u8i=Ju}Y5;SVcVsqqHEH38`A>gptAIm&`rVmXAcZJ3^Uq>T zhphK>44U;mVe)V*++-NyUDWQ8^0rQ_ZxEzeg{aYqA37(J*;7WS-=(V162kz^+u|8c zq3E&i>mXXk9i06A8FCV1!Pr1P)s3OWb9z-xR|5#}bH!s!1zujaytNW-oOX)?!R)YDq_YQ5aXy;^Vu@aB(TKY1?x@?7Ksn@HaO zBz4%KtQjZi%wx1vY(r)q@B&D1YjUQt115)f1ihm;kmQItNgFj!vpNuxtKoj=rb|d_ zz@aNv1)v`e(VRZF`4e&J_LPDDLmm_JHD?bcEGWrWb}*exbSI_Z`!w=B1t?C3Yg&BJcsJ zM%)*#&z12%5JP^VV>fX=rnxF|2YI+hIu~s%lu4D!7&F<}D+v{g+({}n@JWf*x+~uN zU?k{~mFlg{kuA1e)1QQlJ8@PDzJ`xZL7ucrXkE)*OLV)lI=w1T+y>cpL%o6BxrW(* z1nuW7to#>*(1MNg$HoNqFUGu0y8I1m{p19`_K@Y^BvG6d7hn*sYHmE*)yrtG4NKff z@PPzApXnd@Dqbnl1MdCdwVh`)wvK7M_fK@aB9P&|)b;(==ObR6)#hK6(fC=gp?m!2 z2Oe{1p^)ztGl?gz+3m2dV5;<`F=Z{))lu@r_?X2ijmld@%U6S9WxaCz;4tX0xk~?a z;$qT0knpC&Ekm|4HK3~b6i>wzt+0KW5ama8)JeG9Qw^RG;gVRdR__Dg7SV z$UDBJFoblxNJXqvyy~M4t!IRL7u~B_6Mzjb{1o5~K&umjq1(HH`L=$N0PE7Q&g5Ai z-JN7a6tCvaC-nAV@PI6lEXR|{@+Y6RyppAE%ksGjddH@ZRGU#0M~mK#cGKaTeo^{e zN!{A^$ubH`FI1@3h}O5$a32rLf9qPVEq|XTO!9BZsXPsxwzsIsKz_B}d3ugOQalk! z7lXRZZ0?7E-|39cKW;cfDe};~G=2JPw#U*Owk=AK9pZN-(okTjMi2nYK5i;;>2|ha zr`US?XL36q*BT!`tHGdiFg{Q9HKMi&67WAD{6+5Puw{T*uI&PN6DnM!wupjTvIU={tpDq2U+M`-@4A2f*UW$u=Zy+7Tf`ZqwY}!lzs`@XznkIm& z3}jTJrl8By^zReFsr1#)rI^>N-R3*%Sy!1|m*ZAdv{dJ2;Q1sFN)uY7Dk7%AR)VXi11T;PAupFgIfeKZ*@nkB?Z@WxAT$7Gu9MK?;9qJ z5G9xT{;r@m5%#8ZZ7N16`@7hArS8j&1?p#a37AampS|vYkos*T2JY}zXLV!%N5J8) zM5yNtN1V-kZ@U0l~btg>iyQ!Nv zf4o_f{&i>??kU0-FIdC8J)hf8uNs-0p$V|=&#cF&u(Z}GGUmoVFQ#fDgJ-HuBtYeR zo2H{E44VpdoGaIQoK9NqIw!D?z^#tdfv3=chk*}3h!#3cCk2k6Sf(#sOp_x=SX%hY*@VUgEdN8E)Ove0}BuDszQAR~*=42Qn_*>U6t zA%ia~FLl8sd;Zi3wR@D1&ciy|p|_!3jB$aR`VPU+L;aANx6muStnVA5ho(oAE4L4% zMu?h^UeZ%L`0AsYv$paZn4ZUaXSiw2R7R-it)H^AyE}~-S?SdIv4cq}NhWZnwUxu# z$2y*ULGaj;?WC2c+Ro{`>aA%Jm3AK(>{yZ^dFP*_Cx6t5av9i4Bd))?mM~Y#P>DTt zh-Rex8hrL;KI^#Y>Zxaj4D{NmtCxRQ&1={&K(K(=PJ}Cxa>o00A$XVi2U70t#|zdO zE=5pj@mt~J^N7d9i|ZDM#{`wJI<@a7;=ONPa!i>BbX%Nwz`a+#y3<;bHB&Q? zB`XEPjIY}vldhtgtq~e?mx0SH2Av|&oC3;=QnAm)_>|(Jl;Vn%E-pn*1DK|v+0Bs} zwc68CzF;)6YA!CD-+cyb=_u=?jw^^xh>N4|Txe>MjDGSpTr5kKatZIY$jg9f9Dn|I z(Mo)4udLe26yO^K^7i~crrran>Ff&|-qlrBQQ6fMM1-h_hzJpoCMCPFiim)U^b(O0 zk=}czgd&6<>7CF*qy`co1X8{m|L^zCJChk_EF<|P_nvc}^OOPM zk?lybMRS7KaIHo2{R?};OSz@$`;6h?wTUlVgML9+^;3Vs;G34H-IR+4i1d;DRP2~x z31U&XPP%mmIY1m);9;nMwcfF>>W&_uo?TGn9J_hcfqID@y%R~qqP55#ZA58n+g{c? zlYn&U%RQIPf`;PF1pd*ZQt(fNLZW%ptqC6S%L+yr` zz%haoAKS1{ZPAnF_aR@QuliijQ-{%45AeBRx65dxry8U5t9ubQVXA9pPBdV7pWLuv z2rxb9kTe1Md9CYm~R4MatZ zpqL%#b2ZLM05|b-UZ-g!BwnW_7qL3HBOM?F{R;)tOGtwB524!8jc736BKBp7#((d_ zkRTSO^q2|NXOzwNS4)ZPAV0sq8JQS@FK8=1S$>r^~nni7Rzg>)=A3)_3aB!<;F>*Y3Ycs93rzL8tFG z=@Aq}aXEP4PW%`T5F-D*4Eo8%-<7m-ahD3KGdGp|zHcvqgGg63xWuU`s`iPrSq^UT z-gzxG#y+GTbgQ`I@vlVw!zMhtl(df{TX9*~lYx5g0y^|MVmEC5DgBQTuHT!o81G?y zqcbWkTP92IlOO)yc%fxA-~gLd^vMsB;-a2e@U};ErBt?Lsn0BZ1vVW!`~w267#6YM&Ia-KOc*RxzeuwYt_g!{8jTsG*! zcFF0(zJqzgC8?d&m>#1s@6#|O!nvH`VTEA_DIDR0pAGT3Wb(s}h$zua4*dSL?TFHe zz`FyenPR6dVaXI|g)iYPL}BBj$DIWD?v_V8w)m;R>J#grcFtm`veh9NsFCsLgBCMV z?OjRVu1X#0tV}l0uiZI|Ap+{BaJZ{Kdj2~8o!Zywomrv@Ja2=u2cDU3F(;ND*o8hw zYFaELZmGPMa*u3Ejm~&7CfAv`8Duvso?b9x@;)D4FlVTG2_f}kzwtfWjwMh0RzMOf zAZjb=yuR5v4t$QzkyP-h7HnD7;RRrz@nIj@UNTQgo&4saK)gPXq@z#%bjB1%UVvfK zpblP^&yLNx@mu>3hYwx?Z_mN<6(%WTUApFVtg9Y7T*d!a1+|{$(6OBR> zPF!QA{u9vKZFbNA&+0gZ-A%ncv;BLpnb+t>ju+oFycd-op+~E%Zxfm;#*NRd-AE@4 zn0QT{L|vC$7p1zb+*^GGflv1Sewm&(v996~+?`>mxgp35qaSZ!csI9rHw#pRsdFEO zbc-SQ&xYyZTy~FPp%LyV=dxKv_i7Dx5@iAtH<7sm>X}s){B|5bqP@DmrLt)?-u@Md3sv=x zx<9VBG?Y)Q-GSK9qQq_Z={;9kUb@H{tpB~>&@WR*z8J4p^D^5N&TiVN zUF@M{?*r1pP=1s;-IJcD29k0EGGez0rN?~VMad7I4YmvAe*zFONei8CZxSu^15N+= z_ULQUbc1)oF9vu&R?oKAj_kmEA+5o?{v2 z;2HBAJjNMv^-F>d&G_nsd>EI9;_nD+=${jr7s}=L7)5eu%uZBv)KHF22ItSO z$Ouf}MR7}so)hE5FaO(splKCL9?NfoI|Pck1nJYbG+U(SGKnPc_5gHcOe0;AAt<_ zRyCi=cL8}l zmHlgJMaO)r9wqg3CXRf{pCJhO1uUHnNT`LTUnn8;W2PwgQF5GM1h#%-xxR{m?5gS4|`)ec$PLgIrA6uPykdNhK$C@Y|7X zlK@lfae4JjAFtzyN&XPny_|_*k?m-Od=vGwh(YDTMCfK+rbpjK5X0LFJscY5+(ZNYyO!GfM=-({!yfNj1@0QX_$-rMy( zFj!T)VO*TbJ~A2E!hzJ?ss>VFVjj8rLw%gfvjmsPSQqzA#tR{}s)803`nmTqpLy2x zqPDAcxgo{sV&6tgf-h#4#uIE05$1)}%p5i69AQ67AkW4jKL{44vjfaguMCBd|I;Up zN>zTes`9XR_#?%PdZi#`g}KVbe^d*iI%t$zZaS3S+56*=NUR(On~4isS!HvIRtnwn zd|y?khP-;$a(Pwh67!Rl>HLAwN%@5{xYGKzOkj@c>c}Zl=4L_i>9zsZ)Pwe#IYIzQ8@re}K(|{VsVmG=)TU|Q==YNCz$0H; zU3qH&Mi#aT#KZmU+|26BusG?84*J-4+w-_()`MBr1M<&TV*282$8Y5tMpcCNr%EH1 zsnW+|C_VEXi#<8xt6I@CStS9+``mMZ;)pHcfn~J-o5JzQHumq^LFS{E(v0ARu4enn zd@iULb`i@9t=%OL?7J<`oWiFpq%J$*`tO5j{QGf(@*b9-*)!bmI|?6n872~H_WpN; zkDWG1kHv-Cf#RU>R5xU)^(c?j-7Z5vFH4Ors4LZe^cB~Vb8*|@Y}#+N9_4lRTSi7s zg6}@cAAkN=0gy|K{SF4gD_LI^Be3zd4SVTA8(ldf~wR>U1!XuZA3zjEX?!8+>H#t3o$QRX#2rT7WzCwXzmWf!~A7=$2l; z`Brn^Z{;tvC*(8uciNrK}WySkyqS8+<^W|;%j>jR93i-b(G_5L9PBU-&b{?IWI?suHt09tLz#rQW~Z%Fmr?!0_sd*y?B?o^bZiPuFX(vp>Wxh2 zH{e@N%}Nv11lJ5xyg##&`J6p>ymy@4S&B!}UcoLUkGU@jqZ4!@Dh=pEUz7Teh$tFu zThWFlTKuhsX4m2YpL*@1Rr=WX*6?burpcuvty-P4pJiTz7YZQ14C(D|wpwWhpdKFJ z9%8PNVe8c~Z)PV<1jef2{>Ds%KNwS!@mGP@i*5{Tzy7_~-YMK^P@ySUyzOh6MnFTY zHy)az47-uJGIA*@?;Jy4DsnsXnp3Y|S5#V}OqTk0K3LY8$zuO+P6ozq!!7ExxUM?V z_nPw6g`D2|ioKt2upNw2eGV|6>t$4CxY`=<7oK)pb;Oyku}iB4WfK2|Jh`x~t(j~b z?N$cQLUvL5lXP)cLePeL3hna~pg4Hy?0>tnpQ(!@ut2QPJZv^DfG!pAr$Lw+O(U=0 zz^pd&C8zG`fIU$H$~`4U0lhk=g|S=E`Zi`K%V(3%M25n4vI_2!Al>4+)6OlZ(FIwZ z_7=(2-=BXPCd*xh?EZwrmV#FUhUz-OtP9grU3=?8lT2Aa(+ZjKhA2}>l>17#tTiYW zMM^=P^!@LmQuuLDLp783`2x04-KW-Xz-f9UlVQjDjQ5q-A7=UEyM=brX-*w0sJeiz z7l>jmIaH{aL>_xLgs<4^NaP9*2vN0XG^)_YA=a>MeblS3n7M&27%m|33R{H!mIu!0 zvZH8Q@NP*SIKvS_l%{U_-r5sd`c#ZHu-e81ry)H$l!4~(9_lw{bg`4OWywp)`aeuj z|DjPA*L+TIqnY0_2XNnAYUjS8&(^SNWoi7$8Ssj-!{%l!-mWqW?Bf%*@Yngr{+6;} z`o43XE_mL(7c-wRc63mf9=F2Lh?EI?pTjx^!4pzK?|{}zMAHq~1DU2R=y5W5*elIv zXkM`^Tb)dD?8+0Mk?K4rC|I89vkLC-cT1M6u;J-mQz1rFb1oDP?_kBx9_>&2Ck+u zdvz#63nP8Pyx|Ww53w&}w;UF88Qto$9pObUfwvWNi5~N(Kb~w)ZAfcl(7zsm;Z*8m z^>(I#9Y*H7IxuVKf?PPQ^FXtMV#aTBRd^aqTS37{fJh4TWLa^v?{dm$6nd~uTmEQy z>Gn2M-y)%bAx-81yyWWHl*-kTwPuwzR!}ZZ^>l(nRLD;Hm>xK z+zwbqI+hs@-~k4)VY)PO_cl|6`xM$vEt=K~cJ*%vV9SJ9#h8o@wa~#zA|%?V-*IPA9{x>LemA76@AcBq z$#(2TZo@PE67pb3&yil0&HjVLq9A!qe-GK?C%1lazO*gWKk`g}W2RqYHpE86lPE#T za(zcXw?M9bCLfp*X?J;r9WNI^*La;sOzYa&H_qJoPOfgBSE4DczdxLlE!XpG6aM#@ zH=I=Y&&3lxF0+5YL-LrlgN=uU8kfNcNqKns;7av5O;-1{t+)#sgwfK^i1)OAH1!>- zlG8mnH#%=GD#f9$&W4u!@yKl|cfhR5ZM`Z^i20{Kb77Eu0kvUF5U3~?c#M?!D;c(% zDDc0{8jX+Y(W@Jy?e@stwy3UWmkw_XYDRXaJ%lcLBdILif4chSQ-TLcl z>=6U_IgL7wS{IZiT(cH64Oli+s0QH;TEUVe`8Z4}c9V9(lqBB~g&N5h)U8f;9?ziL z_hf(^r{V$3O0xjdVhvzPx**||2pCH*gNNzE`M1VxH}sYxxk7CUr%k8iJ1X}BT9;)A zqjQ^!k9DQ;wGduEI83q8IcL{|A-U>fs!W&T-Itk?@uEtAcD3`{i3ui~-=%t^alQXS zgC*0+s&?$q+*R#Rqdlq-I$WM z?Be%<|H`r7K7IFF_O3z?s(L(>-Fbh&hRLwocF=xb4)7Ky6!8XoK6iQB19sCrzh9$Wjf-R7aA@d zO@jZB*jyd;hYDIbXFe>LeCK`VzJN{3yZ#Ef5wHusdS6N-WhghjXD2nRs?&Mzm|#C= zgSt%5eNdW!DYeyE(qBr5)U|Q7F5s-Ijzx^6q&pTrF;_L{YWzkqmWLPRke*+5ycT8C zX-&&YU(L|Y(O_M6Y%-aa<{D*9;Kz1?yDw_ z+>xtz)3VAiE50Snpmj*NAzFzl9_0ppbiut6QR;IdVd#rv^HVK$W2urq*$MDiBPTTO z6j*{^a`hT=dWboCo;kf8DH-`?*Qd`oUC01GfKJgQ)x1)>=W5>g6+-j6Y_rXmgoa;t*Bp!raM@(8+uWao?)i=xoX3+E)SkIvSiU&F8_+?b8j;1NY zl4iCPl-`f|2loYDQ~$~pe?_fr)$LBLoHe@pY;(t;HefA?l;Ckg&=RfrY^mbqEZ3Yg zb4|X$O*bVQ!W2rXC!outiiSAbAeedxs_^^MS%FOD;KRLVTa2w4i_T=>>R5*7UPel> zcgpc$BOIRGG>T4!3`DK*mBfsQdd?}DmfGkkoDoum-e z6E*V*h?^s44j=?p7I>NEqh=Zi2JYmBZ8QoXi6)%V^1!yY4DpS1r@xj$2mJKZq+LGt zz*Y0r%aa8VX~vmlMe;>ng%;83^E-eW1en=g4w9Mo!V$ph}Fun(7g-s@ZXc_!$RL z*f-L&p0){D;LkKDu2hw*69qBPA62&!By(Mt(pNh5_+}Tn56Y$-hm{=n?j1$G>fRbP zsW=tS_CWyK5(XAb#%0+3E5!Pxp$SfMFujWE@#^`0CnONFtD2~7$Y^rRRGJN~jBD@V zyKK?~d?qqgn|Q%U7MWfpe8@E!yYA=vBB%@*(t+NVbyXj~2MkcZVh=*k@@X@}OenKo zn?y?uuLo5G0vG6kUR^Fip6g& zqRMV7*mK$8)HOo)Z5ln^%WVt=uib|Hk6}1ykX9!=Nuc; z{TS+S*lF4Sz`EA5kKNfylaaKTdjIXH&;z&Ze30h#Vu9>g9$3Cfjg4wtQ2U$oP?jMg>Y;60Jp+4C29_!>2K{{sTP2HcTcg@g-6k1@a9lYbei@ zt~R|slyr55FK{$ftI*`3X7{hYSa(-%dA=IE;L9opp*GP~^FxG(9=~N9>5=ik;TFE* zYV5jSBgF79wUn~jt#!EMa)3RY`X?i~x3_LQ*7T4KI-v6onFrbfS8^H?9?4rYx-_hb zAruxJj8OMCmzimd`_g@%wlxN8XZS`Mwu0I5;QPn|qK@g2NI@N)2QUIP-jLh&C*=(w zf=Crfxu{TX%qwBnu=!AJG>p4J+_DA2h~keJXHmUXLrvgA$prmY)r*i$X;*Qga2#eV zu_#q=zJ#tIx3^!Eg3fs>rPmSDdD#jFXQ!cMeKUpT_d;J^`M}Cbeo3byS@GjW=R{Yo1eHB1VkMIJ!7Z+a!9TL zJEw}qSpDK}a}A2Nn8v_9sT_cndY?kv$5$#b&n0i~YI4G0{s0N^hwu1iv0iyiZ%0nF z8}xojU(mk$E=M{Br9&2~bn6~@8}^yVX$}oy3hxTIqj`tTb z!+O;jtRrwAykl(`osR#C_zt_+pabM2oAEiw^oQUrvX89&-dq6}1}-6jB!wfBha;i2vOho_ zIcsUjC!?2qjx9f=yODZ!Qy-!&NtBLDLSQwxl+=Q{Q>oF3|6aiVcmi7SpzLO`)6lV? z5{F$y%2l(B(?SY`H}ZefJ~-UZXgao%wiM|fBcco_-nBj%#|8R)-AzK=p%!;weLk02 z4#pn(!`~L8m#)<;teTJo6LcW}IZ$e0%hq<%kB^_LgU*Wn#?#ZVW#1a};0 z22P9tLG?_NSW+xZHDn^jwSw?ASFC1HJ%ZJoMn}T!w;jqj2`KY=cz`S*0^w@940sw_ zyoEK#5)zkSn&VuF#FG<9_cxj8BaP)G?(U2dVoPafL^elsc$fc*$XIf9Sf-8AWVo;u zmp`HSGN4P*s~@^fIy(!yyr|rJK9psiYu?lMw3X_eL>g}IZaJn|TpnD7OIbMScrxn- zL58qr(@N4;bo+(^lFTj?8l2! zZMPJF;edr0yij-KmI9}#AE5cv#rFw|!;1OH@}gNy^iorExE$_^C|UjV$x_!$ijWUKZ!iT&Wd?L zuH~tq8pPxsG129Nu;}mrmx_zxInrELE&C@zPoHKT5M5DfwV!WiIiG9A%Cp#Q4wgz* zhOBIq$8s6#o{YLz)!stcl5Zzgbv_*90~1VLyB*xhDmjE18$Qo9?L4zr$bz_6f1Ep~ zd-++MQ_(ee@y^KZ%#ULA1>OQinp`RL6rgc2&dG z*UdUUs?j*+BtY0Q1^Ax8GCWO_0FtnlSTov6vo1=r{dbIUEYD+b|@H!xy)vf7Y2sA1H$Cz?Rm{Vt;T!;3B|@h`G*yykMM%U4r+oTZwSI>v&BllWlTiE%_w91}=DDS|!^SF~pA^`uFEZH;r|-s-U~ z`ovlrT?X=}_ipO`c`ppc1d_Yc6i6R*tHj0*c%AxtLcfeJFp8{LggAtc^@H!j{W1U3 z<5c>2^5Q5K3aKLA4>OxKiFlDC`ycqzl*^U&lhUrQP}LVD2*OJ%(gdMDN3yjgVPz}j zWOejvsHVTbIg5+nf0;NN4;6nM_6IGaEBZLCNB97`?;;tSGA!v<+y2F(1!seX-XLYZ zTK}GD2>TAH!!L(law}^153t9>>GQbfCv5`{EIR+H@s5W-@ZMp6?oWl#N_zg-`HDY? z-p9FKQB{(#svhUx*TLoXv%uEUlpCn9W}&|uG}6m|Gbn=o!Yl@!Gr{jjvOG>4Sx7fp zxu~ky?4_syY#GgR03jaO0Op8*tj3vRwU#Civj+V--G)P@Pw&Yxd&WH%CZISJg`I?e zHgy||z2Z5S@7gG6!2t`!Y07oBfSk_b`=!$qPDO@~J-ZQQ!~aaA|3aOam;G}dILwj;ab1)VKD=6!Z_MYmf#lgCs8 zGZN$;+@lwL9=1uXEt+|z*uHm_9^@oK@-5hH#8Y0Nh*}&Cy+2>oMHS`{mL0-#LCAf& zl`7B(2w2ifZX;)neDIs=X-LDg)pL$XP|FCl_58rT$_*Ug1r*l1Ed(%V5kcU_Qno)F zw6;pz7+)h^TU@J>Bb0bpv?|}*F4MqHRsC7iKZV=?Lyx;#wFvVF!*>F|pz5`ACic06 z_9W$rwUXTF87+CA)}Jsq_gX6=Whvx>3cx+TX8)fB$i ztFm}D8Rr5j@Qg^e?UUMR=V$1WwKF*1;?ibxOzeNlr+i;!iXV+S;SXnyf@X^5(Q1*o z7q>*=p}T#POC^oSl>P;|1aL=hJJ2pLVr(-S7cujIAFO=IPqN!6F3qNB=gICVQ=k%! zmYEMxa5MdsGQa8iUI8n-oxr?hhsxM%{W>~XnxlFnU{=WM*`A{Jo3AbtMiZ#Ksy>>~ zo8xOjq-!3(Is?3-On9Nbt7JYdAICQ}%rAesKvRPY&CB-RBoeoK)620s94U z%rV;HM3651agd><^<2W?oy5OJh&A_6^=(U*i{|oy_oh)iDlEiW(=A}xBza8)9n__e zQ~kCkg}g^dwRbT1+oPwT^UvfY6)S{K%Vj52*&6l)n-dBB97)Ks+)RETFjefjd(85t zky=2e_8uElX5?LgtGWh!$FpAc{;?9v>_2r<=)#>f_TZ^^SmXb3eXI=bdhkfEMF@$q zg*aLoIo@z_V7uTVRB_|7hD?XEKbqEQfBTkCKwah#?=mMExYBN~uuana@e4gkVU9A7 z-~!9@|4gYrhC~eS1DIRZ>U#$36$l+CxB&MWtJG|qLtcui>(f!9Lj4~~xC*)KFeQ=F z&BU-y*iE!aC+wDIf&^@EotxSU9~n%LbiVp0V`QyF=^Cca@7zdj2GWiaU_~oUx^sW8 zuypuWqGr;~_53nppLXIy0FYWID`uW2?)I^kqk%R6SO3460-Sy~O)iiC)YLj}y9KttV{h+1cdXlu_g z`MpD1FE5tA^C`QmREJZONJDNm0Z$$@SfUkAu0k^`opwPLfXG4~IVQNz zr&PYidlC=%=s4{H74w=wAWx+cd|FwwMj_duo(ugm z_kzmde8um}X3uQ^l0x(b4yx*{*?pc|^C+;>9!e!;tb9GI7vR`~BzO84jc)^WNGoFv zY_mv1$n+nD4l)rk5jzrL^3ew;o6c<}M7v zq8KKwPDw(*h9gtJt=x}s-|(|*6mLsCSG|>#B~VKKPhn9axBT=j67Y!wtb>1{*3yD{ z`3?{yNgcd1s2ci6HP=j4!(3H-FZulT5jI9)0>-~8rzn`7YB8^!n?jc37q~UvsjjI? zTwK|fE`H(U8UhHK&OT$b@UXWJEAEU8-ma$LJ)`O!`TN;po*fJoV?XPc>LD3bV->>T zo1&$)_DQZj7BJ;Brb8smdpkm+XG$HPK7FOz_B&gNi{I(E&QML)D?j+`AStz$)0yP+ zzD-P7;UH0RU^Eo4;GAT0;@;Lih4F`u0O>{U&9UbAbD(U^dSwHsYp=|~>m>hn{dE&w z#DmnS-W_X?Iql==K1@*khXQIMdLlT@o0xI409pcYY5-pd0Wg<G39&$JyU(q~4~WHK-kO^i zISiiC#HrYZr8*SAdnrA1Rg+=}s{mCjtbo8c>BCtu!8?1Wn8&dG>~7xgOMSk@o_F@? zL9qE*@9U0E1EF#QXiobf{~+sv3u-N$I0fbV2d6!!AztBp2C5r>QSr07Or{a+)*giQ zE3Ed>N7e=(5O%qhvQ@zvf>9YaT7HGliE(xuJ=bL3i;fY@<>aTY`Mt^?oV$zXD1mOV zid3z>U7Web&=q52^Vx*_A0#_n@2&tYjSuUY2D8Mf0)>GZx*=ix?*53`+)D5Ne-ZSa zbW^3~&IUE(Uny0|wcLX>h)jGu5rRgp_{;jV>=YF%{(+Q}Jy|a2E~jO6C@9C_RnZeC zwKRd5=W>p%s*ro?}1 z#g?kjCwHO2TmaJc*WB-c)_O*Ir(F8 zMGn{Zpy$_8eD8+{dxZgo(U{-X{iTiy!F09%7?akLkJ zc?W|@_vT8!KH1LonD!?UQ0vm{Rvug=b zNT%6}@Qt(}&-wTE!L}7dPijbwDI35qQBuNsE&&*+-xe@yDP|!y+ z98%~`(BoA5u1hA=s;k3pwK@AyhBbXgf0>%3+UmSlbY?O_6gu)O_l(>NEj?FHUz<82 zoLXW__znT~Y2f{k_mR-H>CS7|?OVsMZ1GD(i~!s&e|>c!kpi68!4xyQ1bM}(3Q5J2 zj%X@lr_(pN#+eNe`aB>ex&@3m+fX^B;)H#_Aefr|R4nzs#EEH6D=%EGG&dx%8yzFr z*$HP*BCVj(nBu)HyXa? zY!g*0|F1d(5DxiU4LgNmGiwz`NLL`VT^SlyvCFvnzrAnM|JV)x_jUPZou=FCbBH$@ zJm=_W_5t*XL$|E6SLjbGtags5A5L27d6)Td?LF1Ne$Aj%=y8SZXI6zl5#nK*Wq`mW zgKoLl(~!P?F?AE;Im`N4I>fX?d47M%1f*iN5f$C(kf{OzWeQH6dIdN#Mt7c# z1-}1c{t-^ABJ1SD=T}azy`e>iQz1~x>>L)+Aeyzso+s-KSsZ3#N1t2j#vdFGorcAj$YK zm-h`ll2?Ql`Vs?!Yv0-gj|z}J1v2H-zZv*P+$ zIPkvjpc#qU;iD{Ax7EZNQRaIEhk`ZPQo=`uGRb~DKBU_Q4sxY6t_Rly=uR*mEv`BYJ}s5ZONx-xUb&F z@GkmunA4(Bt(AwDg8mchOUifCM*rxb^z@0>4FuEY;g{}ZpE{x9MNFjR<Dgel~McjLtDsOpR3G2k?#7+Ke`Rw05U$!SpSR1^`Qp&MO+FB{|aFA0Eq3<23Q4oxWiw=l^lbenz^CD{NUiT8KSdR7$#&>Bexc=j9UwjGd+_(+Aw9uQ(YT zOv|QJua$f-{ZJ7;Iw~h!ecRPCQh^UdK_No2hM%lmgM9r5=06T5z@5F_B(O)ZUIGhO z3Tunly9_9FW4HFYUO-+bOzh;-uOyKBFa^`yUC$F&t_nF<$`> zD=)601j8W!zydZEkfj26so+;x9UKUCv-FBE;>EDlu0!iXs*;}abchnL473KZ%nJvG zc(g$;yL@b%p=jtaAUE~{ak@h9k zHb4(?5(oa}z8#6A3)&mkx|&FsEE2^pxS{S1<$BDz)@M*lJiT>H#xA{mMkd=RFKY3PM`Lxto;EZ zd7?u=&tnj%feb<}z9yzsllp~#bhWw^?FXDch`43{>{}YHOwi6L3Ypf9eX0M6GLD&u z7FXx&1A8TAX>i20D=!su(rfWR*@d|zrIOqi>-+duL7$OAn4M-K?0rqH+E;e<|VC4`zn2PAm5jcJ6|}NroCwBPx#Ri zJ}mq8MO1LPH$xhlgDijxjb3>1E@W8_3$aj>80K&L0?0tVjHr9%Q=X$G4U2oMOmop0 zCIJwecWZk$;|RX5m?y+8^dzg>vTX(^HeS0nr@}r4uo~f`fSpm0KJ8f%zI)aFNK8 zvfCSK2J;}U+z~HtcDICwM93^q;%srwxTA!`e#74J5i=!LnOzy}C41~Ox$kwzBzRrk zub~}u2AQ}6`JQi1q!nTF8`lQ)x`wl_rygDv57N_w+d1*rO%`5mx=V(E|HD* zgEn$+c8s!nVp(?eTY35XoOEvd=1RADyp@WWproxS^UrCo zjvy=gPun6!)q_lvyuyy^#-x?8-0IdwiU*w*;o{gLP~3G-!b3(*OFdw3RyK6FRoOXd zl^H~SNgciRll4UdS!ywE&$}A1o+%)gi;m>pF86dvi&fowwSbn^H6+8t$%q5yC`J+ZQtUvX*C=T=wz@nXUz5^+yJJpVzjJxL(IRj` zbtm|vBN^h-+YU;Lw0wB?I3+GU`@hU@-+GB1Z>nG^5eB`-w2gJ*J)3Yuz(k34Xb}6H zU~vK_HNt}9%^p6$kDu|fl0L{PGMD>MSW!E>y-2%I6>mZs6By3w1$QT9@402zkonhz zk?kVoWD)_~EY>hpdxTO_^K=@rJS~?dSKnzPwj(|mm_mbX^ay>unxVM;x6}Tv%sqeQ zd%J&^o!RT#+@I?vO3v>|>$Bd!(3K2|h5HNoH5*k$W5`sG=Pul)w4#?Iz~wCCAwz{C z)$Ucaw7HNGQ}sdNm)77wvt7U9r3_JjIrv}4JJ*K?Ss23T<2}d|a#4F|2gJ-lW0q`5!XW74Rc7Ya9Z)MOzwKpp~iEt#aYUy4P| zo^B!EQC9+s&#(Qi6T^K3Q{85&pTcg4`7=UD^P%V<=g!9BarZ&0hN3ZcZ03ONj{^L>!m6)c-)-e2Wd^;Q(*3?enMtYd zO)*q1HgZLp*zJQNGgH+Krpex&IWHanJ1 z-GG45EdQO&ADd15zBczqrf;#8)K0Utna?#FRm;Aqmev;p;QBOcY3QQP&NXb)&(9@y z>yO;LKUmlP7KrtePUE8MuO6bwrg4FSzyL|DR`)Sb;u343upt8Xv!-vX>xttbTZTUv z1)H74OWPaOt!c(@2o}OtBjLN7RR0E_q3ctmak38@zh04s3-3dz4l?h!P+uMF_46d7 zrmp=zYd-B5s4PT660d+o(hj&~avKd#U?b|m#>VeMnq#PI8guHzGWXEcG^QQ>=_((V ze7Sr023YqbU(#+4Kh*m2XxD`v$#PF~fMG8uZ3c&Xmv3f!&PbCRg}PoGr(cA%2x#X2 zz6`PF%Am=)T12Jcc*^V$nsb;XP8MQZpEI6pTaU zp}C;=fug6y=`lNv7$4f+T~*OcyW67q+T#1MNmUJbJIpl6L^qP>HxmN9hNX*WCLQ!UCp;Flq$z4e9)o>d zU`uB7za22adP^tC{O_OygJPLnjTJ1l6Mara>34$^<>U~IBIT{*ql{$K44>QomZEh0 z8IVBM9>g?5v1;D!sVqz8;?JE8FU0aq+cMp1SdUVsw~Tb1Nt12;?!~CsAenzND>)k4 z$Ut_4qH@o9%*GMQHsgVnzWX${8rm5lD3X0ag-ztHzW%8V6gz#J{G9vt*C2eRx zz|w6qCU}1#j#|p)m2%3lRaLa9@h{&fl9D0LzgqFYN7fs9!f^t=u_;ZpTmDs;l5q>} zCa$+M&1OEuZrMxlsa9xdI+L#rV$wv)~;u@pXL`xCXl%IP-VToI1R0a}t=$d$2?BgZx|8~GyRhbTC|C2Pb<%ml2Dp&h%h%}|{&VsqP=^KuUP;LYPku^is7UU4N2S8U zN@<--r~Jv_zyX5dbjSgW#~eG!Eqw__W=maW&akjw_-qTuF>%@t~;5i&U4U&oHbY=ru)1bf@e*;f$_ycVZ-2xdz zJ^`Hb#W;(dTgBi*o5EA-B9JRV`rPK=Px%(rRx)$DVwP4KOOd3L1fO)~Hu{ccu`Y+L zw!1iXD={a`-!!Kw5LcvNWt{#?@q^()0bMjKKWQmX^@@o2P}rc zlaA5Z*MiauZQ|=}yxN?TOjTyLBeEjmtQZbt1@{bHO#mT$^hx)ST^!}uWu=#~{0}9W z5lZVYWa3I|jP0@YpNeQ5dQcDCMdGB|Ex{JL7&C(2P_3W=T3^Itci;#?5Q#qC>LjtM z-5wcTIUl^s8k11$atQgC`emNzk8hIv`qeF`9 z_3J1qE(dI0oQVhsky+iliAaSquUV-|0yb|fN3$N++uz)0c)NnYV90Q`59q z`Lt=~_B5uZrc9YzDNH(LWyzF|yOJrIE2+66FfEg1E@dvcL1r%HLWpK=kh!mzrsNX1 zf`|$ti0uE{d5`xaANk$KwVc;=UgxPXx~ z%{~as;o!RgdASf###~{_iSufnR;kbrnV-gLaQ=O&kQ4Z|9za!Xlh`txxGo1BEE(P% zkE`J{M0P^v?Bn}L%xoQy1nUayQ|gJ}-4eSCJH^z<*};1C7aeg=PFxAssj_ zTq@i%S6sCAVp)QpiYk%aR_ta;m&^nB6PU4OK-c5|HGz_N zZqjE_kagw2b;A+-OC>*4YO>qNOK(H_t_(5@pBN+&5NV z+4km#Rst@DXkc#9zvR=+Nq_F+!_g6mb0Ux7XY&KsfC>0DceW>%cf9AbgA^PVClG4d z2PZu2g>9W^T49lW&`qwGs|!J)6Cb(P1pL-ak*3xDY;cbk@Xf<)UXRx}5$oOs zDE)@{DGcwYgP)E5G_n8nKjXH7!qNvpE~tYse;*{9nqxACSAl|VuNt6_%Mu!#x5Y9X zur~LDJx`8~{irZrRqXht#D79dIoF}p`b9io31e=J_pcn3dmqAj9n#Xhc`>&4-`S`W z=^t10{Aa@T$lg%PM$qPxW1Q4+(-6ut^GP1ujh_-<6&(Yu!s7Z~P_1UR9FQ-7S*P4G zFjpLX3H#r*klsXnVR}We2)Z!f@j?pN$$+A%`R~x&eH@xg`C6%3vdIaL*W9f^8!L=u zj6fBM)U;x!9JI7gDDqIeJQUTkoWcBNm|*u}+%|czyNALB<_FL9PH*YYjZ%XrT5kJs zhNy4e-}~oR%I2Gmy6?RW(>6KH6J@}_$Do^nth($9A3QU8;l$kX4ePDN832Q5Qje962u<{Wh? zAa2iwaqhDj@=S-|a5Fg*$n<^Qa#i5kL#8=@twVegR&kbT>?zlWBCq_Q9<=Z7*qb=T z3G9Q@I|fgBZo$}IkfI=6*~HW3|AE+ETuXA0-tT3F`23jv2Jat}8A=YnknKBBHu&cZ zmO0>+M#Q3{^~Bk1AMG?((C9RvGNi@x>fE!`H!%Q*E@qB%?I=h%7r~XN`n!qi!H&jW z|LFtp_#39NYG1vVfbddCPO2%6>G%U+*$tB*nEl`NH^7%SKR=4xg> zcT5;Ih>~YrBywzz_!{=<{9i zV>%8kfBKf^7id~mETDc`c!2-gqWId{0S$MnaPurmqi=yaH}P@KmGigva|6D)5AHiv zNjs%LI_G}=@Gh_`J*jX`GiFi1$>H4uhRl2O6QB*%iMO37P6@rfh@pjLL(hHU=mmJV z8mCb9usd{R(VsWkJ_>q_-wiKb>ob8XSKd}y^gq$R693DF(qO2yyUf)EXfi&+zv*_a z^%cKx7aN_I*4M;u32pR!%}K@eCg@wt+k1Rv*dJR^MQUjizu7IQJ5E4$w-HUw{S zjl+soJxQPFo@}BK?tTa<4iMCo{ky6##7t9t*7f{}qfi7!)0t&lguVDZS+sX%Z|x+-n#?uNA)X>nq2lOzIek z{8!5494z_c`7Ya&=T+_TfiGi8GE+(&pz&;0hz_ zhL$dsw8&@8*e5qh^TYaEgaim+FWQHI>t3W?m=FpFD$*Y000tbuVTR1)0{w0MUxq&R zW^pjyejyLZjfoPev_z^{Q3ARg8s-R7Ygwzjtm>2e* zzuSY9JC2tvDiZ_OUKEskwit-vH0D8CE&s481H*^i)ms5_n%60WFiPy3Iq+Bg$+|bk zPMGAU@~)a2vzte1IS79@#HNeO#0*T&yCKZxs_Bn&(qT&DM)wh+PQ7kf=z>0fUU%o9 zb%WFT!m=PMdA#0OLq!Gc7gD|~5HNJ^c3vzM{}ia1WE%cPIr?hnZ$_6AD{Cp7hrTDB zNbJljRQc*rbe3mV9)Bm>QKQl*;zMV9QM9fhT8aRN`_w+3yhahIjJ<`-=_O1YIUmxw z`mtsiWc{QF6@vVDqt$xgD1*-@u1l278D#>x{a6 zUC~bKf7+6JXzrdlo$zzX>YL!R^p7st1?&*BZ2Y=P+`7046sMSk0P2VFBrXe(0bBl- zU3e~t9FP96K(P{NV~SMqR@@V-c_0gNt-aG=UQhycqiuv{w@3YWv}e=Iw?$8CG0F6A zRWJ0Le@;uExJEfzP~|Xemj^>dqpY8$Ws$5nN`prk4)pEX4&g$&%bu(E0fT1$loo=# ztYhD-x$WA|kUo4;@x2apYv|@KX`C1An=){?VTAe%nR4HHuhUuL+c4AY5_WLWZn0MxaGg<&gk*I7 zu4Nr`?M4s~EVQmuPDdMR(X^6S^^iuxjB&R$z(`TD%!=@>Bn}O~I&;s8Kb{ppzQ;dQ zeY*b*{aDXi>&Qq+Ql&M&EI*;cn(bk<82nTCqgsu>Fl##-X&LfM3oFUqpFfVfMXX{v z!GI@K&cV26bi!^SxS5H=qTA5loXyKn<%y?uWTs2+muj>~?+*e1cqdA%)N5}LDYN&9 zG0#?i>s5r^_I*bCT>WZm&-uP~3H)tTo z6jDAt;t`tl1a?RMl1$IUjVYnl4qBQ&&&9?Bk0cbi=4qow*ZT~;2LjG`+@WTujf9xR zi%+XwbzlWDQLTjIEqohp&HOj~`)Dq-nqKhYbcr73HG8o4;2)_Kjo|v@HlI#i7*5x< zr#q_O+-Lnm{J7A6+V5Fu8TuXQbd1YwzpPB(kWN6?0Qk9(NfsXj(Y8?&qRJS3b+iIL z#iLz<2vw>U42R;T6GGbE)dlkg^N3F3r$gQyj@`1an_r%>4a*_LryBSI4vF`&>@{LF zO2uYm9@Z&SFN1o(?k=AMp~#;$c4ODKn=}lOEHV$W;(}t^L|03GociZea+{!mB3O_ngRP{g*L-ivY^A2ttDQP{jHCYyNZ{= zPaE}@pTAmwpG05V+|_KoWdDsV9Yv|QiWwYx$_P$O<$sx3PK`6LupNBWK@rzuB3oq+ zlNnBOo>~IWYrC*Twr=8`A<}xxT}3mEG!KI`e}` z=MP=|mU65YlDb>lf^rO2$Z8a@SshMp z2W2!SN_IUBs~_w#=v){InX^q~ORO9tOfPAjEQ>0b?Rcv+clb7I%$J!MFMRLXzg{Nl zJLTL&JhM7D{HY0_8se@Pef|Y&*b(DM`0Y^g9LGBpnk^}>_L~X%Vn6+Tduc-NGr?v2 zr>C^U8=o=zcgY^H(zlhqN;4pjXH%F#!A#I zzJ{#y_e!;iogR1mG(7P2!e&5kg?g0wkhn45V|HmVZ#O=LVC|%5yd2O{{|a2}ly&;; zdqgbt=*-L5e@hzrP6{{W5Tc$&)v{SHD>zX6k#iY~#^C;G=+mSZTjkLDKuI?p?T4Hc zAA3n^S*X*7NPlOPy&IB0U_YHncZSN2%JB4vLoJNFTtuavF5g1uo{$djoL&pEg zPSXO$v&z+t0m9fj;MUAyy3h?$sC@w^f1__fCR#TeKm_}Intyhb<+E7Gaaz00ThXX1 z1=HVv{k0c?FiNY!EZfj9Odak4TsjC^YcpsOGK!#eZ#M5;xzfoL3wQfF4&2&*e-@3? zocQ};{Px&_G-3^*a~SGLnM=+oOJs}}=~X<+#GRV~M1yiv6MBuJL7Xh~rrZ61>$;bA zKbb+^_8ZN!iB3#=Lz+kRyhB(uRGIx~W_%`w*4dKfDPETPrTUU@#Yd-+nSkcr6`!6IXr(8Bq>AZClhD>*|6$zsh zY1;>B`s$|s78}0f-&J`>^N?Pl{d2OhS@Bt6TyGYc!D;&J@Nd>Y4|Y9^{l&8xTVG>r zMRnaEQwqb7(=1RwHUDm%eGKU<W$T0_P#6^P3ul&AgV#fkzec@w^KvtB+Ej zODY<=ptQ$n4}dJ4P8kNIvLsb_q=wNAgH|Kb^mbf{s<7!be?7wi)6VPzAT<r@ z`#@ukFNeuC95AtNwi#vvX?P*l^lL@Sh`W;P>UxECb$TFR^Ui{PCzGamy75cM>7X7F zX@4*1^w_JTA=gsO^is|CcOGj#Fe2wW1|-g;&7C{y^k>2KE>{h-@`_qnU2N#yPFv3% zuLgVV{jPl-~o-oC0(CkO(uIv1X5CTD^)ii4l#epVoNSzyScaY6@h}^hKRDBzA z(%>t3j}~u1mn*l#3{8I5+9=Q(mM#j3(pmR=rxI4K-}M&d0Ovvi8*cOb&Vst1KtOr@ z+6nIK{QlF!QeKytzMW{73V`Zvv7qw%0d;w2Sm%Nc>U^X(&WP5|*_KQH^tlqEr1(t- zzPCL{qbhV$$Hq-Ia@1pd@et4xeGh&bksYoXb-VbH-MjOf$5HM{r}fQiVu+>d3u^2} za9z}JFHpUxH%WRrXVV1Y zT~d9Kr3y4GL3k3-uzZ~Fg~e(;<@E}$tjG+?g&(eDYPqu~~BiGg>& zV%wF?!vi>V_%v%G>3LV;y)hCM>8bsU-gOhL2QLm&1Z+Mzod1hArC9Jn%_4+aKiwA^ zx*G9*L!Vq;bK3lQvdG%=j%i_k4%N06mCrq386EPTnczm`C+9E5n}cc&WXui{$KidJ zxG)(b>_%MuY0&rtevh&T;h*P$_Q?H^hC*F9%09s}lJ(A0E4CCs7$4i=+T*(j=)*ij z)wAbl+lE8Qeh%xIID2@UMZns`x_FfRph?Yyy(dUzy;0M~6CQfa_MU;Q z$?hM*RTiLrPEcBO=2|m=eJTm>0F${Ls0{k}SSUiJ%UPAbm)Rp^So2m)_|V##={*r|qzDCy#e8cA`7g-NJ>MgebB%G9rq zo$a9T)Rkz3T}`h|Z<65F)tt74m;7PjXQ3`rc4Gv#oVC_eekl?YjO8BOTr0<2z%$EK zgf^Bc3H3X^|FXxt8vYV|RzX}I1m1sYN|_dK{=_L=;Z+(dgtW<4>yBC6}Ks-2KnO_oYk&N~(=sTE*{I8*-OJ>rKwU zl2)G}E_>TBm%)xpCESHT_d4j)r)9d#1T#nO(&^yZl*X^=2Er*!i`b;sJ&QZ~wIgAd)_UG|VN1JRK G|MP!%JK(b8znC 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

    jvCN-1fci9jV*WTOxi}t5{v}* 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%0D<~qsLRr`ebA^2Yibe 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Ö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¬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%0A4|zGJr_IM99mT|gEVbm z;#4P(fKX!Zjp9H!;0mY@C%V392|iVH=9w2s{|_n$MAJOWR?*=#0euD9;yE(?8~lct z6!y3AP5Bq2JYH9Z#%YPYQ_u!Du(4ByYjyu8 zxHqs~HsqS6_y07!Wj+j8q|7J7)UulTr+rr28DwdaR0%k)b&D1_CDen!{8q(pnO0+r zFmXVs^b=m7_7Okvp=`a5$uR<>ftTa0b8IXs;2^F$AH{VTR+DTz)u*l*V&F%mF;tW< z&m$D`eKjP(xPsInDL&MPgbMKw|EJ#5+Awxp=v+Wr!v@HHq5NL%JQiq_ z>r9BT`X25so$##YH=qVsdXu)C-PR;~_DiN5?ltiBbVpy4CXjWK^4whQM&P!PPT>SX zgKXU~JE-}{O$=MF@P4`@W{2AmDSp6^lbjREk z7Be7l%QGnTeK}~yOl=xiKd+`hRAi~J1B4y#<<6;cgZD59D46s*lmO`<0VxCAzPffM z{>WP1|dHFL(C$iDViBin^uf-o&G|iSFr45KF>Bfv9r? z-hqKtNPjJNR`7(xI_T1(<&oM(CLwy6XsC|p2LV1brQ(3$QRiPl>^Stm@ODbQjh=~X z@1cteC>_>p9$pJKf!A0r;b-wz5IfGLo1nfE(Ku8mT%Q!Tj4H|xtdg}eyG%0>c!+|J3=}5RzwB5@iOrb_W*o zMR^d4-=$>U$fc(y*ptR{x=lP-4&mrJzZydDsn{VoNn}kK5tCsmfR=^OW zJ48L_q9VK(3|pWA&ebBMa71c*NR$kxf>#!H?3{p$7!>qW_rpj0sHC9wgo90L4nSu@ zV#!3;#oO;KU$OIL()xAeKn$VGp9QyYTLc{qQsgN^l2y%BPA2FR=I-r5!YG`8Z_Ma` zkCQRhK~rQif)IXWQca%eRRO#Q*~S1NUQX)^Ry>4H{Q`p{GEd@tNt6cPk5QQfVsvFq z7fEHUlpN|3LHZkywMb+?<+2ieW7G^RGa>VEBsi@K<#g!P`h5zzaKJ!^JN^5-|J%sJ ze)e$e$T{&`DMk-l(cWQ{F&+rqxI1ff_ORC=x_DyAY6yv)I+Q4(R1&v9FFE?8uEJ6I@{(6%gQHA-<7wCwVF^9u$eEMoA z_rwl*b@rX%HHh&H^67?+@_v)`@N9^#1{z)HVr`U=UGC9d=N29dL<`P$ zq`LDx*)s_OE^J|&&-!ZZ^dS zy3s(whr8oKwN2{jaL_lmP`ik{+LO#hXmg+~RNp7ybl#9qC>R3)iz_p4EYg&wH{Nxn zt-CGp{9Zf`Q4;w0lYa>)WN%&#|mzv-+s$;~H^B@DvH z#lVaCwVECGV`G%L5N&WZ!?QbV1^8l@g(c#At2%`c$elEr7$fjNm5`>Yp>1nYrl zLyGs+P?1IG6Eo26T_}6y0#l4j$aFqe%l+_Z9r`JxVD@2g2pQ}!bWcgH7^AMm1}KB5 zM8fafwIY{mnmOonjPhtqDjucdVT64O- zWd7}-O!@yjMjx{us+=suR7H29xFJBoyR`G75Fv<*5uvUjYX0_{uq%JRf>&?j#6Sh9 zi}h+H16frICR=dP<`tV3x7!v26IaRD@%KoN#TdDN>Jad4lzAgo7;kt0I7Vg{>9H26&9~hSrR9VSv;8LNO;bL1&N0FO zHcP*_bnoCn31!eZkVIPW3-pmxjpOyeouGin1kE0 zA1t5Pv4ul{fuIRAL>ll5CyMbhvy2nMU(21DsI~SCr4j)#qY8E3F>6o+p~@Dpp7k#Pe>-C&8pm!xP|mIH zf&k^ej^<>dy|*!Pd|@OW88H35H;=j%V2LLR4gq$dH#2ZLLj4#L4cZ_+0j!LvX=ntd zS?{lRyyg-NZwPXOy4u-)8LFDqQecO|;!(E$8YDcLlt7hw2=C?2{w}z;NRNAnYF``2h7O@eW3kPw$d_opM{-tl!J?0ms8qbPZ+%V6gi2UQYy zyj(Y|9uh8>9T|0gZ_ap5imU?1E|r1iXj_|)9tYiQJ8P~&W}6fH221tqmy5HG_il-2 zohxQ30+lQ0%6qvEB?ruL%yaD)L1OIXUt{CZ-^(2lN-~kCB(n^Ho!{87xzZlnOv*5p%;KC7QY-_;qk)O9M1s}zGIpbBuTyHok5lH^`LC~ zn~XAsY~bLjavz*Lq)3k6Eelh{sKvgZJLcHlw<<;gx@?|xB_O=We{=e9jJWMw>GKyhBgPuzt1wrS(ez7&Y* zmxKj&B({Z;w<5ueXOlx*GHUvnAwQ4)-uTDcc zx9$^zq)4JlrPI8b4*V8eBhIpp)3aEH#wzW6E{eye<8C}!Vp)iQZ;07$-_}Zj+kw&n z8-Rt(C7vX4?URPRslPW$KR|FBqd4^cG8CLG(ge5@q!WHa;T9|}1ESdJ+1y)+|GNP1 zCuY6fIdD@u#EL$5(`GWupPBw7{S{|!O3WJ=E}-|n;Pv^aQGjw76L6V0Ix2j^wMHIw z$_RRm8*L{>Nz^kYnNRi%osmD~Q-uxONswwiYHfnj7bpu0dEiy%!a^dpkN-( zGWOlZ;k((592rbwgM*CTmikd0f_XiNrS;vUvl}ILp4PPDb_Vh}d^O~J&^lw1;*HWv zgC6^53z^F&rK0hbNZ_OH@t2bg5M{8_Uu7%iff*kU>;k=yln<032XGRhe*opm6l04UGvM7$dO%&F@zm|(fNP#v)!Ei;hu;P~GgEUzaR16Z=wF;o7 zvnQf-@$btaYIzp)O)9E_OcIul2C9y97(tj-WYM;mURc;daE8*U8<7J*L(h0ci z6rd(8Hn;wT2v>sCM3>hD;79tW_^lPRGXDB@#|9q`M1__i&4*eyBd;=d;Y3I7gS8wi z7O8gjrh?NrJH1UXBWNfg zeB&r{(d0-3Gc)NNyg6mB0VoLW<$)p5gKc6NBSGwI`XVs|LVHFZ-;vu~?NRo*32d$} zh5{WIKW-ndha+#Or@M~9W|v|qt(@TCexw)dFwj8RxFNfHW#$0}-ib=L<$7efucmq@ zWrUZ))z)^N0+ktEKD%X7_CYnj0t_gm6w)?aT@wRKGyqh87UihgGRS2J>2H&tX2&aI z*dC|%!?HRzSa2{@p8e@J+0QATT{Wmrb)@+45m_l8h=od_ET=B-bW{CjY0TI=sq=LZ z(y<)|K&b!_fv~&)P~i0}b^}t3;t;sTX~IUOUmhT7KFch01kUX+oDl6Y=wJV`q z=VmuN0em{6j8<0efcZtD-Q9ucIfbDy*cw#s^i|sH+0M-ysd^zKQz2G5e+Srv5KExU zO7PV#=UVQhURr*wcJ?nPpPeX}(O!3IQi89IyKsf2kzFZ`j$0N#ai+TH^zOa@XzLQRDq4vv$d+C6{ew zwG!by?YUWo6>Wc%(4!uE4v)Qh5*ev`GHHf5sU3#BT9z}Q8BoohPn_~|UOI#xqGCuem; z7mg|J3+}9;gpML9mP|<;vnN-xC~_xW+3SMqcx_O!Ou#64zQXdEeJBz+&HqFR;kik| zMc9r!l*{D=gMekn0x8!ECh)%C&a*7Iwb=V2e_31(fqM@dj23|Ch8sZ%dS0`%miBjj zUIMipd2B%9B$guRfVVVYwL!g-bE!kW>{7#Wja0#ku}3h$%=*ZNLQQAVvQ`V(X~k$% zszVBYZ!rcK!poT#EY?IA@;-#;{y%127%?NRI8lnpWeXHgew20N4ka;c>oYcHa&ElK+gNg*7`Bs(=6JAr02)bXL->R;tRKP-n8A^WUc9YU`@ zq?a){8#p3`txs<6Dixi!J*{4&r(Ek*MX)dR#mo5PzK!L`eIiL%sv zD&)Ci3s$spUlPssdMho`@0t;pHrs35adW>)klR#ox;|YvK#eF{iCgYz1Zm%*|4Hq0 zBmoKp4!f95vF~=Q{qh;@t=OAKlOa7)bPO?u{WaPC_Y2Gv)`!&wzD)dw0%M>iwhzj%0h4nu(4N%a z&lb+l*66rkVS_Hx8UhBnWUvAI;O1F-Bp}_~g*&Qij(l4!o}LZU`c9#5`A~APKCt() zevQgjqYuhdT%y)l5Mg|+meOH06s!{R%$n2A?e|ouN{eh}lV{5v1P5kG83_D*zsZyj zZ_=(7&Ni+Xn3dHn;7X~5m?~-sTRZ?!;i>Lsn?1f)i>L2~Kkby^DGG>w<8TQe#mj{vBPMSs-{jWWFiY0UhP#;6L!uc0=o6@fX++tfD$$+&d zbCbFv{CnF{;jx+shyA;&fL|4Ltvn~(?89=np)m`yfxPQ{2DGU445aKIEGRh&ojS}i zVytvq2BqPOB@6^{^s|VaYjJ{0gS&}04q6xC;g`#5XU!At{3d)2XiHZ{Kqs<+%%IY# zo^(YDtvoIf$r_)i&h`(uA#99sF)MT{-Rl+6-;R1l@FylM0qRyO!xnp~FRX+`zJsDL zJu9e+2n5vWY#Po&WSD9hC6WT3Cm?nr+KwoL_l79ixQ87nWD5Xsq@@;|0AUcy5yDxL z<)uTSn1)2u^pjIqZ>Q~iwh{4~f)0a;@uURr5KzAMAIlcH(~$}|0oVos_56;>;X5W% z6=Kkyn4a5jz1?nx*!JjJ<-W#a+&BC`b|N^1i&%GCZGJvm{?S4E#V2!fPCN3p@eyU3 z$l&@7AZ9o;5E`~iFl4Qk&UE7RpE^#2W%{feT_&s&`W-0!cNg(yh?*<8H9CN0K2N|| zh)07Iz7qOeVQ$H{K&92Atie`dZnO zNRuIh1DRq&`DKbw1%gpMx&x#v|A1wHmk6W24xC!wNBO*>yGMwC~Hq3f9DtSu`fFE0p95-4hB0DVe+xg&|@GH+h;}hY+tOn3P!fz%zSSVnbH>8nQ z@!4?@2m?;K-U(FJQy@8{Bf122IyldQ6Fe-C(>R)hH+Dx7 zl3y)DbTvEfHZ7yG*3K;6>vP=mSmx9@8@>3VTo3)6L~!|v@80VpYE zAR)z@p_Q_dgp6KE&v~EaO@}=q^9{a+gxVd}Um0uK&ukhg#XVfKUkp7Ig!S^nhAA`r zIqRcgZcib<&7FvyOi>ZO;p*wDR)n~N5nsgPcad~&+drMQKQ__gI-&L)oGuMqIw6LJ z>ZZe5KxRST@9lb-F9KjV1mq^`L^?f1eu9o+&S=(5+I3KfJs>l4ghGG?)@-kj)((r2 z5ohtc!0m3P3DQi^=NJ;?aj$}*fLYCvV(c$!W9g?I53ltIxW7Qqlr!2{QNV$x1jp*~K)sNM4|+xCUEQFKzNrvoE7+hEuj< zr8UH>c*jSvb-wKyY=c=CK?r2d;U7%~k?a}?KliZ7e-&XsnED!wQbyUmPE8i;661%SWS2Nb4)6`rgOQrfy^9E=h-c7z(TO@TGGV7r3sSR&-3N_w z+%B;4%A56ct^h3gl<)|a4`cI!YC>!uKZ>Hf&l5>b0LeSzKl8mU`*jLFX*%e|5ckq_ zc#7^D5awJraxd}ag7UyJFG2k`!0Mm8A+3~W7B*scrCm_=5D5Txl<2xb6sa1|Dkp!? zdwG|~IyeTk6f%`*ADcC!;Kd9&ijm+&zGV+!DD5=bQ@>_7mqPe=#>Mo6)*p?v3137U#)m%JXtP|uqiY-&j}E29r&YQ?L*trnJh3|V1Q6M zmxrsT5)D1vC&GkgJ5>{amgXkeU4v<2l-;aLkinj=SfGT%W-mF6@z=||Hs%-T15?jB z&|pLS-j{>In1;4W4aHs08uM>_Hc@L#lIan zW(J@kJ@5E_x^aHGfwCyr1nDGgXBJp1)ZRU=466fxCmFizDe7}9%&|Lj_$3C`v`?^u zS<3+q7>Fst7;`>2OH;_w6teI5+A8=qgl}UCFp)6Rkj`N8y-vA&kRU1pq24GHxgLNV zP119DU#;_alM^OH1Ylm6eYq$bI}40ef-kperrl{k{84_NFXN>cPkuqTm@%=$NMjpr z+6Khv(7q@jwdyXx9S9=eF59kmp6HdOgzt?)w%4SU-+~lOij!FoaGJccNEFg=@WtrgxB$u&9D;YIMHvoMO$qJ zO0+KF0WoozmK@BW;GIW;c}iVZt{W6jpdvzAy^r_ z{+K~>+q&#VZ+``_dHQmE1PrM_ELt|}x*32j1e{cN-QfzB^n%-%&{3A%l#^N78Qx3( zVpf?l;Lq({8uSg}J7rLEZYK)i7ZH6hFeyDCux!hC%x39N)6NS5M7Irpf*U$fmdl$( z357utZPCtmsL%Li8|6q5Wu71*?+gjkeGVYKXADd%;$qO^;gS?gIDX7x;yvRd1DpAK z60N4WW#B=`Xh-B(l>qwBJ`wik3v!MOP!qRIwjvKXi=2);7GPwEr(#!Sh11v^Bq*vl zwoD&6qejSk1l9-?W4w#vdTJXo%ts_XC5hm+5s(_{MmPp{L)9Y48TbQ-8I6=h>Mx(vjlW!5I^o3+h zG~TV86qrDBoywT+VVF`c=b1zCsP+O2>gw4Jurv(;bqe^kWjbb32}_qf=JyR(PoZnb z&IWAIY7KfrVj9; z?%r$pGUy5l)e2qTC$^HS0ep`q!#lGa>3Ho_W#?E%Z6Q`79oK8cubb!4KZT*$uFH)I?H~Qyzojkh? zXQ}WsxVRDcCqeMa7*SBwuX?vGQmU#C*368uct%%x;E0l3}8*MlNn9c4ueC zflY(d8$>Q3oW^(C?8$39+zvui1?%G=rBa-t*C*?UPZO%q)mt+2aKDM3s4(IkoZ=m5 zGU`7lpl3+ei5Ujysnv+8g=v`(12Xw>0~)D`N0gRwc!g#8?|q^u6NqIz+AI1A#cv!{ z7ECCBhr0oXY9fRkIs2AniJNGS6TYlP1iE|LzJo#^ESb0JIge0Gq+cH&Ew*myHS?9PVjo8yc!OLzv${$K zO;}~Eq*v7`7hPZ3UNH@T^fWuO%YGgx^dcTkNl75ew00x{VW_BdgvV2_H%-UIb4f9z zTgEl&S zvpw`2gF7PO4%1jG0xRgRV0>o5LG+|mhS}LdSQGlC>x*d+_o$2CqVXf60dVwhA(gYV zNyyUZ69%C!h#zQFO(&=1eX}DmMC0voAe@JK)NM7uMMwW7l)93vZnkd&;2?-`)H3XS zXH!i~9MNt@kvxU*5@*V1DhaKt%X)F8VfzeAUZ&j9Lo%REl4rQXBe)^tgk6ObaxR-EBkDZp`a}Ps(r-l8fdaROZFZKY z9W4u9LAnS2Y!azST?n%A^f5f9BMEn9&^idHqO-iaCEv^DgTp6!6eAA(S1rNFlwpe2(r@cNz&? zJAgW%EkL<=kQ6iz*bEMU>Ctqu!+Cf#iJTJ$WqloYb>I2bQS}+L@4ULl1_NCm$a$^a zj~cFM$GI3RWBjip{ocBF2uusiFPID8=(LdgXu(xsXP&6PbG`kO9dFpw4ToamZXJLL zgH~%k^TSGr=5HrIzPA#7)coV1iXuxcYz`371_6kWXziYitQv7l7@R;m1lV*uc81nJ2w{SErD z@ZBtr0~6A2%K=NLAvMqocn3M5Mt z9$8P&CUJ!g(Ajo?E^^<(Wh#variNS*{OfXCEJH6m+&L8=^Z*VA4+=Lt<^sb&hBQs5X5RVwjjy+urAIbDizx(9$;eT+YzyIJiw(@wt-uF`+DqQz2MF;83Cp*b zZ=a0C`l(mmG^(Mkgm2+$TXc3KH6qqZTdgwaq$5F70XV1EV)O7C>3yPpiSHv7;aY6U zTNAu6_Qu^IoS1FO774z^crIqe)FDr(s6NB!kY4HL5Xy@xDSb#?v zF^~}dv?+>2D4>l|+t($;IWSSB;302?0kn?wrPW0*|FB6KD!#OU2Dq4>_KuY46HRUJ z%0x5>r?9w%W0CHgq#p&XX_F+J*P{>|Yp`Cx20>>}7NZ;8178fj3bsPHbd7s20bnSz z()>9s%@S#2R=IE_b@jbC0;{NkcYrBOfl!>tF`u!62E3rpmKn+>T{*P-@ zJ0#IJ`2#`bYdaD?qGbb_Ui+G;4;91wM7_)=?3Se9sdui%j}EEz@fob zS@|NPqrf;+%rS2rl7A)c_RP5IN&8VB;b2CGa(qRFao}a=PWK%>Mx??g1FP1Y3Bis6 zQ%2qy!z)70!$nh&sKcz!o+2#JtG!32uUIl5Fw*lzOH+VYcthOtGOfBV)(<;GAk8jg z5(HD$6$+;Z^PCGh(%ie6k+5X}cx3(9r+cwp+u61g-8AO0ExQ~_fhdJd16Ke#y3;j+ zvxtpTntiEjKf1w2_!rI(lXQC&t4q3%H5wRl!GNY_f7e<2f5y%$*>WApvi~`Xn7|8z z7W1E2`r5p3kPI{8c9!URB5+6o4i{T+i!ytFnhM<{k6SXr_AhMz&*_(?)_mS7)VJpc zyk1!4T?mi0Baz8~VUa>dOPN!bswDe}V@=0&*ZL z>vXUtZX!Acn2EW_2c;)7U~qhG^(TL_9(&T`jLlL5;AoQ%*L^W2=UkAD8D=hPe3;Zf zXBw61E?;MQ@h`!XoqK45EjiE+L7ZWAulQV)N~i$1)bM}hFM5M8T8Z6Aj_A8B8a|QX zbg-G$Agk1&x#U~oL*+3*4G;;v>_+v48kKab)Yrkz$Airj8HuG5y;Y|A$*MOtgXTHa z&pX4KDF@|zNz~sCHl(TV0(-)?$5lQ{|K{gKM&w8ad_kgQU9|1LVzDB<&%mvD)_)D7 z24;od*kops2(Yl?Mu1`}j#3>Kp<^{2Nmnf)vjD;6 z-wtl|ZBpnhGnWA|*xQ0<{fF6ihPE>$rj^pXZIjsJ*{#qbp)Sxe)vu_lqCiAn^>@%% zYE?T{N@5bkypn45=eu3c7WHgj`EjHDh$>34-`v+GfgdaFB^pU%*Ypv8$PPiS*M3Q( z_z7s|loeBT&6ClAUW5&Mk)XpeJ#xm_&Rv|+a+3W!l&bLaWLF0n$#DRDK!d-E(XWE- z62oTOL7rL(GNww@IunG>y57oPEYZ=Tw>!f&&j|Now3Q=-q-d5Esb8oMlP{(&Xha{? zc{vf%9h#fACX(7n>4rcf($NdI!PE%_QLq8t-#w>DVFR{z~I6-kwc( z^b09IWPCVYcj4!w_M$3;Ed1e8S&OrXa!agnOcYQTP zFFKPphksJvsn^L7p!m9aT1%q6m19yu>&&8ZPI9gE#w`j0Q#vLI0&V?iG7S^~l1wyY zllolkY$C&ZL_H+*%W-?{e~1RO+YyiIPW7P@kWdfP2V_1TtDW`IX|STh2@VC0_C!Ek%Fv%93+IG`P%Uq7ZlTVggkJDE`ZY0ghT(Wt0EJE(GD zcz(Bj`fk7yNlq(L?sKkPB0;HvEiT%jTdNn1&+#(>xsl^!sA%6#&~C@P#YYZgH~OF4QM#Dtx0u}_#RwRGTPC-3SqWJNq~`4 zyJ#@?&vu?`3*E--m%7Oh01{6;0S=i|h3mMr4*3^pt{USrB-?7o#wQYQN#23zGI-;Y zOax>~rvKAita=isk&2WfkG=M*XR$WP`AtTOrVOmVLaFfUW>x{SEOCs}^@-3<`yq05 zROOz}R?dV^?qE9WN_6tNZU8RHGaVjDcXtx?%mrWT8cx4fi^poJBlQNthfe8O+rbVo z#Ym=+#a*z58bO5GDz<N2co1{#a>kq`p zU6;}|pX#{t>Q-lK0;oi)Fyb{^L452+8fp1)Q(}D77#cIwO>Nx)ILR{*Yf^*vZDOl2 z`=g_0`Pt}?o^>z3Xzc>&MjDg`Q`oD~swO3wGVxfOGTEKZtrwB+AI}bXKYRYlokP}g z_9=$PC@az!Y|z&N9punSi^rA{NrSxY1Gk>-7v_Bwz}Vb^7H*!F@Z%w%KxAKHbP)nT z6*1oGaWq?As~xj)Fij}`0A6#9ae;UZIY>sRDdjEdpSvVr6DYm>TCE;i3RnbS=^e56 zSRM~-N(8J1y=f2-E);?-_qWy>wA;% zSqW(g8PL3ym#o#!#cwN2VwwO5) z_wJ&$_N@bk%#uf@_~F%ald>FemUdIB^=VN#+@wd(yXfEI8Rk+S9c-QJ_v zb*DmcB7G?5(16R^y0?*yLUaih)7YA!$o*m=Nh0HDf*p{Lc{0bWun0O$_#r(U(&ElW7pr4t$+$LbR0^}7u-R{^o18Gzql=k*m*-(EpQ5VU)~~&#WEWCP@z|O-FnM@}vO+wV> zXbS?2PV3T)e{sHL`q;%#2;sHbkw=OnVl;k=x z@AKAAL0Q9i`}6F(CAVvpIttV&rZi)Amz1JMqjqu}DF5DO+~I82irNV>PEfQhbzO05 zTr7iN1%4(%{WL+7woa5t5Wa{%i>=#ceoybwg`%+wrr*B4kH8pt*m-A5jO=wPRn){* zlqq)z`4&i+r=Rd>1C0d!AL`I8-{!Ai^Qo|a%=TSHVM{&nMspZo@PK^mlOy)UJW(=j z+4&OG*Yuw_htyI2#CS~r;N%^r`8sRIeiI{p{>9cWXS{WUEm8!D`(}&xKF|b04+uUY z*_B6r%}M(?v!iJtdoC$C`ZS%_D1t?^(Cag20NowID2VDc-y!5=8;tk9&o$)}9WvV` zeU;iI`Gqkro*T<{hRLPA(CA5vK#EqI30A6tFUCyzY2|x*K%jcl_&{cPVz*(x74{`cP_>-;2_6dX#fElpRY(79jv-Iy|#onhtlN#N@HcW98K(X`hSH zaJAjX2rR+{^EXLJ&lpkuRy}!HFfmNUAv?VgaPnXvdbgR3W1P?YgTeJwUli%I&tN-(J}m?zmH$s9U69@ z&Ram6{k1_xI<>Wsj|9X41Y-JNgKHViDuqaHTYn>37 z=6iU&oJ2?%^LjEcC-^hN&FcNRn2OOuD-s1{+HehV1?LHMvCXHR1dW2VK{}QIV{{RP zdwXOfp`SGbDyq}yJ&{B0y+4{z-a|=4^BbExCJ2bCdZTT8pYqidzVp?rS-))&(6oE{ zg$=WqUA)UBS|;Rwyj-m(j&|{mHVyGuL!o1D5nsGX1ciO@idJ}#EMQ({T_Dv8GNE)$ zXfMrd|Xl)_GM=Kmzhy7?YUBJl0beOxTB};VMihNP>|0jW{w{yoLB5sSkBYUlS zGEOUAW@;VrSf_Mi%!Eryk@eGqK!oG`q0E3ZO!;gX2V^gA*m2QVtxb1%K|{f*WwJM# z=}CF>E;D$vW1WGMx#Eu`TyV zrnoD2W1vS_6qskaToXh{#vl=e&06DYxpr)RqP>n)2O@WNx)$JcNc)_A1?V(KYsyr< zG?eejlHbdn^M7vPQGk-DmA0bE;0~P-5eFb!&%o&Hwu^I-=f5xW43trhZI`on=}zAq zMVx*Z4z$si;v7iEA+cVD1)l%=a%WY-4y71#c!ceP!*nkf+b&Iy?Do~%6EZW0E57?p z{_V~v2>t{x5a>$<*PH{CETQ8r`^%dhne;OYDlEyt^8R%Fd=QWkW>^H)$wA22t`@1; z0nYc)jpert*(a{?wy*wK?$`w4*CU6FDrVVU;C7LrXK%4h*w>|A0MW^gPL;1iZSUpI z9bN{d9U}OQ5)AZ_o8_mOv4h9}u6vD?4E+b&Lrm~r%Z)Q&43`&sE%tNy82;_1EG|h} z#3OfgHzB1p$VeIJB#M;YfpO$X6bY>tFLsi9R7zDf%2#!(Ptr?RVbO=`O@2btz5 zCs5H1z{vaBZVo+4=xGPsFmo=BbcHAgZ4@L=Tm2HJ)XjdNj5Nk5D78jViT>d*-)omU z;9NK|px&7?Xo;7utK6T>89Q{}=@9OWz{kNQgzkzm3@5EdYfVrO@7`4mW7@>WfWhJ& zozpOG9ET@E0Jej^Yq`6AeYVYqjQK$JqPRaY;U!4@LfW18?gd@4ewOUdGQ$`ggzg7` zi8Ba-hMLII*n{AS?FR@5u+Z%(%mc)ujL*qzl>;$#M2Bd*@T~Oec~ueSrS}sUlOnQ2 z$;_nUG2yd{?30)%`Cz)q12~fA7-KvdtAy@K78wEJ$Q++c_ zl*?lF!xQM}lVUM?&F0o~Rk#i58z2Mrxs$cZXLc4uMwH#kdau&Ar)L z@iY8>DijYfe#PjZb?3dq%Bv(ZG%j47ztc5D8VZ@(7W(6#FB#fJhlQ$MRd_fX#YQ5_uEh z2i5meBKGtPC7wyMPmYDa&m0}lu1l^dgYyPSlGduYdot|1v0o~-z@MKCiFFJF5K$)# zuJ@=ZFnTTEgk3f{NCpM(&N>yp#P6p901OxzD~!2;ij+qdkfCMF`11niU)-4hJHR}{{r0gD$7v(-NLla@ z>dWZ!CvYfLI^JzLvw%`W#U7Ty^%@^~hx6Qk9}uu8rw2U}m#2ve#)V|EG@tiYOB!tb zX;seCGM(q@r>|8&tTri)=f!3t#SsM_%#v;7xJF$;I3#i^bp`Jcicwep9(94kN-zMC zH)xx(Q?dVLOv?S0eHz*%`Oiqo_Gk?Ao=(*^&&;_9r?6es=F$SO(~PboKKJzLrbbU_Hw{u~DDN=@jv=bWNEyKscyrKJ__*m^_~{ z&z3+Z6k7(=xfSaP^6)dDDV63Z;etIXj*+9lgS?|*sFu#%C6Ln*MbCmlW7)hR-6B>P z;V{4bLvWKqu(YGJ@+@C)!8kk{xROY{K4eG;V9V2q+L0HCqf z7T;fO9=;m%zF@fq{+($!(0O2=VO0Y&j2wpddZ0WcWI^p!%-iJY`fB6!A_Xnr8Z46E zSznE9U=@ZPD-=B)C1V=~@7&IOBb5Gnk>wYCCD7?Ju?1soJBJHIVLTD(0WN`#0@=40 zafz;@d4G`z7=6D;$}yBG#F`1tnjlNKtZcvmx%4K4bStn2S!65W^&-!41PJ(Lh&6^! zC!4;OB{ziL8Ip@31Ah=lFvk3b@TGp@aW-bG5_7qZCF>2`5~7p#=N zp}ZD5oi+G*1qzSkM?6JEJR&2R6q!fnmK#U(r#c&y`KiXI49f|LkZE3X9fdF_?9E&U`kx*HV&;w199PNCA z5(s0q_l_*5S6NV|OftfryEa2~LJ|cKiDK`byn+XknKQ0*j~$72+n;uNlUAKc8j{oF zC2qq@3JNDf^UY8yc6-tuu|m;H(Y;CXY5NxpM~jTj@^qjl3JXB>I9uUnrP<&ENZ+*d zIo@Zj9$zCjewJRuTwblHTv-UK#3+;&-R=klE_{@Q1Pc#rE-3jkjh`+@N9dmlt!^48 zY+Q(DcH6D{uKraEaH1Vjm=3fX`P@F5g~;~Z0n9Z+@aD_3{n6%?Hc;jAejT1DJ}~58 z%N;_@FKx2ZmCgOc(1!x46vx6a8bs^~eBvC`Oi6Q8qrE<&u=SQjmq;MX;SRj2cVz4UN<(LCg`=m$>(Kkazx)L13(p|3Gb8Z#u&rt_GxL8G?lF zn%q?e9~}*HP#BM;PKpb&UAAX5)x#!k@~crG0G&OT3uOOWsHFmJ9s7>$LCK)VKKg@e?LcE!?&(!x*CUNCp}ke;QpnIr10hm&Df5F!ALXp=56qAW1ZaTGZBboOCwr$Y z$Q#y87hG&GIIVTQRy*5tg6gzj0EE9S&1jyD8EnL44%rcx+eaE06}TaZ-TGW@9xZDa zMO(He^j|DAuI)cA3>p&Bj4f7%1;#=hR11T)a(S(G^x+K> zTVSS{5fjPxl)qsw!IsUdESyZwIPOEtr2hJD$LTJdw;+QNY~8%Q*_E_)+~`n!S_vI> zCgXCZ4z@dAZ*m?d%P(OL_@h9af}6R9>9g63o;eWxXr&-I}2bU%Awd8 zusBMN@WI`OCnH2UB`?U4lmRUUR`sqE&v!cxW0E9nZJ%6DvEg>!tO#J{Z^yj*!JxK4 zH-zqCemtAqxFvd+OpM#^929(-<#PoRdAf8301Z_2;+}_IK@w&DKj~8>uh=dh zy&%So-Jnlm2AXfsU7*kXtThqKFVInK%OFsGqnj(iI=ARxl{a;k2A*&J%@X`!`*0cE zHxHd?C*ds?0K$}bPp~YNIHE`k;eEir7#%Aa$B8iFwc}m~Nq={lBvAf?ArrLGJHCem zYn~F-AmkIx01%hcd0os)Xt>LV)7umo0BffXpMZm3S#db!JoNC>>^j-a#eK-v7>2-h zM-gBx7T};y8fxP;%>^QUZn%@f^9sOB1P69zITzUzTcOYW>b*O7kVOfFC6zC#)p-t& zvLm;YyyJKFDBahFzzJ$T)8$3+%w?lmFiiP@S!J|lFY?{WcVp=1sAk>Rr5XgKKIJDGo0P}(%;4ojr5~W3lj>#yuwlNJDa&&wb>ywS$ zkFeFCtskwJKwoXR>OB-*0CRwf{X)QY71t9%jz@iS=uezw=8??kz~0U<9ANFb6oi!It;-5h7p|_WoJjNCy4kz)OltR4FdJT$>3zvp0 zDA)w)HeEpi*@$a1QoyF$i{!_irQt0@vm6u>XpG~A!GfXE`nF zSo*KyjKG>xx>$^Vta^5H2WTJm6Y$}jY3sGX-v{wufPwY;oJ}6#xb`Pu$w6P%G8gyU z;qb{O16h#h!Uq`@vCB%6rrCWE3Sj)`uM*_!1No`v>RCT3IF_5^xHjwaPwDpH&Q=g8#B;Lqf2)`Y8aFrB0s}I+!cR# zaGui*sbwLWr21^5y)dV>IE*m!%^5cS56Pxu9SUQl{8-5^9Waz(GWH)?SLMi_9u#zU zdV|gqYI?f$or@pb}t$C-b1JEJ3R8)z!IfKMhbCytW zxz|n>Lw>_T#W#i=oPn7~M;aI;LzZSy6R)iQ5={m8sg&sPXknafK_JLeBOziKn%~z0 zMRf@vVI7tZSqWKzgiQ6mdm{TSaQKuH13jAb*O)Eydf!A9}q z(d|5;%P3}s5+rJONAFv795@*@S)F=(jG|$H5d_KkaK^O4>eN^Td2U+(_nkDnp0PNE z0u*)OR!_HY*6|NYXye;!?)l+STz*r77QqEzI7L?%A^9yF=~5MU{YGQD%*+P6+Wf+# z*pq$pSvuC`+-OMw-aEzxkJz4M-yPj>8Y48OzDb&ScRq^+pcA}IsB@rBXy@*MEBPcc ztOUVDQ-CwiC4mBn-0Snh4;Iz$gVilz(GE32dsgka$r=nh*%x6fpFQDeWceA$5fSbt z8lgCR?yQpRqv!|vJo)4fmvdS)q>~lY&~O04uatb8?45&X zeOB6Jpzh9@6dn@aZgTXyLkIEh*u%n@k&zPWI*Zf|UlA&V6&9!fkC6TDL^n605*$!+ zze9ZaTj$am?PQRFgr;`W|q&7GVmkA1Jd3==8_J`%&w|~^eTAhC?m<_A1!Ml3XQ9d++O)r`!hcWYE1bV zBNrySi{C*f0y4M#1m-hq)<9k$=R?lt==Y-*v7PEi+o{Uvg1#fpsm`97NpFnnl$N(Q z`70ZjD93#EfjE!y6#D#Rh-YH@(XrIsauHFQrzo^oKI&s+(7;6K0GY8pEw0GL4l`>8 zGmwXSR`QRPu z)>LD*FhNSf_-jvkGL|BzZ$?KJwk6HkT{Mwq(GcOfTwWUUZ-?*9jUZG>8@F$U^yR6g zTF@koByuR3?J}lFI@zutXm{?ziTwoZBSBVk%MYmtyLtF%Uu_<{CJT!ENQks8@z-## zh-eW=dCC1isIHiaF~V8IVH|0L(lA)Vk65Sg9g_C6X0 z?EUh+_cIg5OdAd~vHofw@A`G zri@&2^3oH)RFVNV%5CXEG_o3Z91K}$J;T22NIQCCx^xy__vPm!s52fCJ>?&$Ye{9@4pj0Sy{(7=g3BQMj#3 ze+kXbl9qV?unWnqoXkW;x-9KABs|NlB0oZY1MhTU@+COg5DcM0a~XhX`w7TYxG0j( zv7Ii|W1?!WMRqt+DDaBb>J>njf(y2_O;uLg`2wP7DQtRNXf@UYl48)OO7bZLDbjpM z$jg;ZSA|gLqE#ab(~2B;5BDm@@`{rM2rlIv@Y9gWsP{pL>a`2 zK&{8hhb}QKIRJ3TAJvfD+5yckNsJ*i*4I*Ck-Es85eLC zDc6F;+C6w!id}KBu-hz^$HxjM#s%{?+NeS~O%K3`Zqs!jZFE9yyym|HPB*TL^SLj| zv1-RHjj^KGa$YNexPc?Z6nV?OCu~;0Uu8*G-?MHu{8?Yv4lr*9N@895w+cw8L=7~* z(o*V_$UNgZl%tUIZqL=u5(=4SJR1B>vPsT0E9ATMhpB3}?+r3|{Ew^=eR!>QRK7rf z2n;8#(P%L^%6+1=BAvdEnJ(E0ax8*4-L2k3`tvA}Ih*;rV?VpoovV}!t7l3c~S6DpvQIWL6 z2f9vxRAcWFe!lKGpq#Gi!OpX53_-Cp=Ic$?UkGiWEmSK*|D3$72$*9G8S0@hL;2Sdr!*)WuLbrGK%yKTQxgd z_UWQ~sDNKaXer|elh%2|K9$RW;Xfzuwb~J@BvcfxTu>phv&Nf@s1fRKpu0T1LhS?5 z_smC)@AG!d_PH!7Lp$a&ZJz+fSt{bYy3cF1fa*m;CIkKKUMh; zK6`?|g1e44$ciNi&5en_3;oIQJa6-Ck{5-*05O5G)8;2YLAFwp{AAmP@t_5PjUs?^ zeKua=IMnc&uotkYA{B74W@Pg_`Y84oAqSU7N%Bywa<~}vCdL9VC?06z6_@u84V&^L zx#to#Ud$*E7hD!v4J4Qymci&8bVj}VuuAmzFw_N{NtXpu>_SS2O^D8!M*Lw5bryVm zD<Z1I;ENb}p8-+d#_WAzuY=bEF1o%ajBZ9v!bC>)Bxnk*G^M9}Z;Q zn$QJekZo`}_&4KR*``-%(1q|^>{!ARSCd>I>qQ>^*yAckaZ4T(Xc6dD!(`lzwU<<|9EdwU&h*9O+1X`GOx~EIf0sf6N zV>0ll?Tc5SV-D_GxJUnJejSIAB5N>$*od;^`Pt46 zYh=KXVqo9Yc@qw_d?O)ICmm29#9I_YnFPRlZjUhuTlh4srVg}=nX)Oxypb9>Z;*^2 zU>LL4gZLB=DXh{pc(x4Up=D4cSpmUfU^C?atY8nx&>xgd+M+#n5SqNRnAN28Y#Ge{ z-FM-9p&vZx@Km2dTI{uW2`Z3rqsyTu8VL*@095z%n!=xvw>irqS9WyMZ)((O<)ez%zh`f05y33R~ht+_BK6-q`92aZ_tX@&jYGfDLei-r8!h*(^H ziy7G6!W3bG#vFdRVABZ40kigz(@p=Jf7+7NSx1bowbEfNz8BRy-QIn*kpJj9X5Q00 z)>m?`4!WMcK?$#S*uD=KiZx&u@h<7bu^B;NyhhrO5ytSnQK%U0@1gbA?%xYxe{l3) zP8*F%&%%+EiG50E`&v4dblp(ZT~wnWttxu1tzR|>j-%(JkHcwhn(RQRl&7N$sS2lr zhZWpl&vO#&Pne4KSh2l67##J_Yo$vr3sN)EBtAAvx;_vnBp`X_fhrqfb{T!&eg{%Y z82&i%!Gr;=406=98v5QmN@Ak-9VPee{{OMpWG zAj(^d+prB6<#Op=v~m}pkcR$gjGGd=jZIJMVW6^@H~<*b!kd8je!S?G zMoyS#dx#-hH^Fr6e{LZ{(m{p`8GjvDzm=simNc>o`+4Fup-z?te@lm#K}TIMpMvTPw`l?v7t}t}2*O9LLZ^U#}1&MveICTs;s4_C}77Ubnv&#m>V=aQAF5l(V~|Y>Bf$Spo;$`9+v+ z(+4H!^kvx+*Z2A~1;WY(?hZRKNS4V>3#xE%z@Q=dEu+o~dO0x`<<@(^UVnkH&55y& zdR@V{afUf1(x2NLY?60xO(?1N?S2>ue2V9T^+Q4m{GrGfV(Rv{=H_6Ly0*0=T1iS-=L96h7XIkK5t*-Q4=(m*Mi+JP=X9nn_gd09}q+fp)!Z{ zx!iPDvYuZF6=^%dItiPa>h6vR(pylp+5{HGiimut2{d2+_K#^hLZD~s4)UW3EKI&i zt75UhkF}yGoW)DAjtZ7^vZdSIo=~-8c?8N68GjJ7aXQ!)m}^9k6`A!m*9XHdtHZU( zQs=xkj-Y1z>Fv8IFbNv9qCr!3N35gwI%urJ{9OJ&3WL9SioTHuY@L9&yyXSD94)$t2YYlvbF-T%uuN>k{ z>!CAqA<~QoOrF(_pjrgWNi4EHgZl)Nxd+)8lo3`}lhrz+>Ri%Te9z}?5Z-*g|7jGHy)V2{zei^i8Ii z7KyiRbbtttNGk)6WzR_%4h;QeCITPsxme4m#e$k#R$X-%qtPV^+Qrxdm~^|$5_t#s zBsd8zJrCP2@?aX)R*EGRvhMk;>a#+eN|GyBNq0mX0I+$VZcz`{S`C6T0uL3?OBkEcEO-GP zgop~i1}^=SHTKIKmD~}?y3+#zLwB$OnpJrsXa5{JQ8f0S_+&5yNAy#y;DS-REJ%6Y z(vXJFX$396OqI|*=6%nSdPVgXu%N3~X2g@3 z((64IW#8YB;S9Z}V!c3HW&54ug=UM{Iaq@q(r?SiX(3JE$d8^d>I%nsBV==WCjbny zzekjj1cU&VJ)Qp5r9Eor8a>_eOnhh(^H|Y~ zIw3ufdl6$_ew-GgZ-k&LZac-*u5h{yG&vzMgs@VBAg?yEsfq;9L&zm!t(d>wAu>h6 zJ4ip)v2j`3#X_cCU3iYJwJs5s0ynLc2f=uT<4dFu1l%GbaB!1c6XYBFiio+imz)uD zR)D3N($d%UwIXYM>gj{6=7Rw~%`G{gkwIxglaJ_McCOzrIpH1W1$AGGF=zjLi5!*) z3>{Vd=C0~6qoF1amXu)$yYXVHtwlMi3W$K36!rL#fQz z8HIlmHUJgEgXILe&f@S46=f(CFB2{d`O%M=pl!8y#xk0S{EROE3g0IN_3D8#bO%Hku zZ^E2?dbZQxzE-Cn@El26nqnDorITa#j)w?Q&+u@(Ws#g!%`5|xQ+5(1XFy;rO8FmS}& zh8a7eiSqJZUlUR%TXYYQ6Igq zBC_0Yt6AJ_m|S4;8RIHDNgNu<3L+N$(QrZRE&UnkyLz|SsH+S4?y=Dr6njOzVGxeX zM3;__y+V0q=JXgJ*rrLpsNZSRi!u%QY3wdLvIhua(mh=>LK;q)qCO!d{A?D`e)==x z=LDQOwxMLEj#O}tcI6Rp&A=pYc+8^OVe{x#Sp3xm20e4ycp(!=9i5P{!JrxJFqNO( z4Nf@#W!MosRJ&`|hcB3I=|5?H3q+!}fte-nEfm_UBnK0AX_X1}?+*#e|>QxA{iz`l87t@y2gQ)q`Z`1x+cZJVCZoN;2c|MDOL>O3o~Bo|Ee zwF+x}OGg8Y?U$x~_5A^#9eG*Ua$(69(f^KVT!PGKQ9c)o6j81-OZcrHpo#(^MZwk-xDLbSIB2W3Q=|%O*_`Bp=X3lR=3#ea zJnoU}#Mis+?24&E0&0L~;)b&k--e&jWQ)Z-1Al0uF zghY}wDj{X}5YWQYt1!;s9~!7DM+AJu>tVfZdaH}?EJ^g0`c=S2&Y*? z?T#=|a2|?OYDKBuMn8f z|9BeRW9j~9j?c+KmgGg2%l)?PB+o&L(sJHXo42iiG|>J)VJa*Rl_T(ubJZe;HKv-; zN(;~D`SUDwV@Ls(a5sjL2k0REdUoOOpTygu4^Q^p%df(nHZaJuZ%6R~yP127N^0FN z_93mN5z7E-e|fHEhuT)lpO#jMhBJr2vT1j88%ST;M(K2p;(}(_DUSjttAqMn43H(r z(@%H{T9(ZHa=n@C)Itr2-!ugM-+AVWOOXXF{bw?XtT%X+cLf zs7PCHRkSrz*{mnyh6VWtVj`_+_Fk+Vo=nnlnYJ83$W_P&@8Il?KEZtM|zU83>m$bdIuONE>RNRk_T%aEvb&4&SVRMp7o&WT4|HUP)~-3zP_m zPqJ($X_8FlH{MScPrFgL#mwz79r1zSHkdhHAvE#ZH=_{_@US7U@>{+Z#t0`@VYNX*TLc~(BWzSzwU=R*?J%X0mh{Gda`+pAgFIaOyb6m z*$tbaABsK$wr%Z3=zO-r6X13WX7@vFAM9JRC0yBU1J$~u`70e5FcOoBY4)%lRvq^s zwGa&^?};1&~LqQn~Qw zbWu&-A;P3IOT(7h?i%hliR3NF$T}f;L~{gj+Tcd7)$F^< zd6MfT*8T)~mrtNKh5J;!Ng0dX<$8^nqb6nqI3M_vLEr$9j}M`}{rm)93lIG@-$zdg zQQsmJvz4QE7O}8AG3||^d%rfxfVkqPoLhaa)ema{)D`Fl@!#gSVPw{kyuga9??gZI z0_g`*kG2=6ytTtSyoe}xB}*q`W6E)6yo56>KCkD3UuLgbcit>>KGy2>@LVLjLF7$) z-z~?DhmO)QVzwC^)F_km0c?WmG{omx{q$T2icQGz%-pF7eZZBxO3hBf3`hQN*C-lJa@-wC+4dY zZ~-t<8cwCiG9JiDQtxXm)bIvOVkYtPAE@`)!vPruT;b3|pRUjkuX4?*JTihAu*ynTZCGj1UhOQxkwu6rINFna_`EC$pGh&F_p?RWuhM62AOYj+ zO`i2kSd8XcMrB~DFI`%mngsIkylaK!2_94yhF{9R7DO%8nP06Pa<|TSuFDO5b*(HU zqlt%iODd_}S`r;g8f@mn0$@4w_S|0YI-+Eo(RG=Xf6zR`MuAx31CgXSRwb<#`@3#W zho)6$^p@D+jg-`hX4o>L2ion_?JEXZK&Gq+7|r&kjULaM-MZM@6nyl;;-N5`2Aw=n z;FHq4w?7D%d7$8*99!o5@i@O7s5!`263ymq7X;axYzvjECCEZUjgpXZeyGFy+>h-D ziDqL&Ig%9Kn@3|1|7xR8l;pPUQlRtL3m0BX;dR!|Rv*Bvq_zdmwhhNm$|lYt40@W= ziK>yE3JIUW=B0amL@BdLMx}R>xk0vS;-CaWx}J_{_huu6hzu!+9}%8$gi#)6Eq;3L z60Z*4HS2~ni!Bjiq42|?O`#5&VYPSLS(-~ncLzGL;0SI zw?L*$+jO^aXU^whB;fPA6a;8#KUm^U8`lWC2GRE!M1WgQ2HpkUw7UJFz7`9I#mEgZ zSz0112^$ez&<-FSVXV2%8ePzd`@GbodwVUGPEW>JsG zF^ggpQr}P3PER(Ij%b&$??xL2tZ1z6u!79eI?oU2MSyz^6#(nKxkJw^|H+>UAee*N z9>A0f6oWTWA@^MUv*~*r-_1!f0w>UZUwL3o*pB_M9RWl{ol(>u9id;i`-5+NIpE8 zZ9^J|wB}0gH-XhgUmxwx9)h3i3i{eU7-L-6ey=T3Pg{h4pDFj0qlqJyMZoHGBAHx= z-2trFZ?HjH95cNRc05M@2z9Q?%Qw30q&@H8@{*>@@PRnBqs)mr`M=n?!iLKw&wnJswh7NJ3)J&2>E^qiofQ+%96c1hbHjmx03Y`svpbCjpa>AE7t z6$bZ6$F@|%YeODsZZ*p1hFX^HwkMFV>0p;7`sFg>l_>~=|MVL^hWFJu$={`;3Uz5zJLmTvB3gn%ZaZti!+?*VJk*L zVR=Ac(RMj(NGO-~4jI6Jr1hglR|mc@>6-XHK0vHpsu-iloU*_-kE*)FssBa890n?P9*{72eM;CS)`$dZn-kru$mtIne@VF+usAPe$Oh1niJ zU{6M@7##9=fIzjYUfGRL_0IEyaDPRSc1RC!4FthL*kDiWG|Q4VV5aaOy?H=RhugA6 z5af>XGm8Aet-`|iprZ%}tNBN>aG8+(gJ5J=vp-s8AdBJ!s;ljNu8$({mdiCUgdhWN zgLI2clA}quC@-=sty~EdNHhi9cs<+E1|bvZgzKu{kv$&MUmfzk1_t6cTa-8is`qqx(rdLd z#-<700*lR7@WL0}DNI}t4{58?r^==!ZtF;l`_a&)d^i#y5I=4B6kh_EH;XzNkyLBQ z$gCb7eq>D9Xlljj(f_Is!%^K3sStp$mi9uf-pW6!3mYotaL-(ztVYDbhDbwcjbb-k z>6qEEwU}!%I~fZ(Lt%r|V7Nrq`UZ_6wuD7awC~r`izRb>w2nm;3;`~z?2?p8@rnjX zN1JU-Rk7zyntJ6m_5gR6wi0jI_@hg6Wi;V9YkS0Tf9<7EyZc_f||f-`P!} zia%A_p2^X^7~-JOf$ftM1uzTgqCa$igYzlgaaJI{W>+vSz~s-(@|VsK7G+`MY9yu4@t>#S4+6-E5jB&4*_4IQW@;32A)Hu4KKnh&T^TBi_|z-*LO zw`EI^_a!FnR%)!SAc7?HAVIg=lb7cQJ9po0A^NrCSm?iQk4sTun4a0GUQbqKFo!HL z1$KMx`_RwIS15=fmu^8kI6j+H6#tSOnb~{(Xn_slQ?<$$4BTrg9_K+^TXe`^9@;K( zJ-~J;FW?+o!cMV}JGPUDX*r#?=OH^=h|59C?s+u#x@X3iz*KO}%+%U+JrazmBXSyv zmh!VpXM5@(dCZ{N3cV=F|2X_ED@fQ(dNL^5x*Q2GXYmC@*nN`F;(;pwppY3|)5xxd zZAUOJj}*AU@kV%~P(+vo4*ruXFv>3kQW0=Nqqg}^%}6bx#!aR{{BuSyFlsVJY2>7P z*9`dmxwIaZs)4a3t6orL%x$QwfmJeg-Ng(LV`c*b&)0`sdjEyb2nr{Nk>Uwjmm3Ge zNxQ&cn&F!`Ha9GD5lD+iDac*Zc6`Uh0HlCB8l=b)IfL+4QBG`9)5=bf2cX-PC|rIZ z4?g5sj)d(O0MRlOiOpTMGc*NIkjZ@mg%J^R7wl}`4W4wvhbrWo7l zqe*pDf>&s!JL?`f?*#DxFImUhpccR9kkH{~Q zDmeFr_flOsnh^uZOBPVXJ4%AoA#Qq zX{boM1d492FIAGW^3S*ekEI@H6=cVOLnFlQ4&#bV5N84Xs!ATh@p@r0|aOAfsbnXq}7zv_+r{Q!5k(}h9OXiOT^S5`(&5N z19FIyntHqt?#B*zkidv#-S#p;ORSb-6r&WAZ{bc#4--+_9x2+m2AZ#k>_di5J(x(VFcNt?o@XL^1d+?M1AyjY~QQ85kcA=@s zv8C*=I1#b5y_mBOt_4^1%1zF&&h?XB(dZ1ph6NPw@Aen<62Ps!@!v zWyv8nO1tSX2Jr=+Tcl04$X63-+GP>QC}{t=h`;o?5nF@zyCEF*WL!E8W0O1{S10>% z9yY%!pV)zARKnqwz{I-(qne39yElgcQ**0MKw7V8HQM3HIv1HRkJxSOla?_gl_Vg* z!WCD@JnWdTaqWb*{93G^o~+1?Eu_>WNad`i2I2;$jz!|K_D#?<2z?E#QpYL9auC_a5p z=c(l+-fg=SbBM=aoW=6t$p-Nr#$FN(<;GJKltS~Y>P&LdWBN^?mC#IhEq1&+?Wf{y z8L&AEo8iI!fOZy9mze7>M5HY|&731ry?CM4Xqaw)7kzzhj9lJZ0^$4$UHBNVR$EX4|SBlS2ot85(f)SxM5iUFsS8f5jXVY*l`(7*@7K5xmrAUk& zO7n1qcc$jlz}=@`F(_lhou~wZr^hySX~(`58U?5ghD+?s6Jm-L$|dsBwhlYg^1{J} zOOqe<8DH%?5-YZ5$nBAr6J0z2!Nn%j!4wVBM=*GKNKGTgr&0*-v7Gik644c1T-*!qPMC=$qXv>I{Bze5%@Nl)jkdqk`$W0_1PFz-rk^Z`+VBq z*k#LVpDjSFpCl(h^LsPK@z|vEEu)O$`TivL;5Pt%f3KF?;n}i~o3sjW3y2#FTYw-* zxGOCZ5CN+-4Cdq!*>g)3dt12zJ9NM0D`6YQ~5USvK2OEA>rFMavVd#`2eIZ)Pzm*#?aAXGOamD20q_pI0A!2U@7b>v6yF}0Sg^Dc~=_ra^-TNLRbLOGX5*b}fC&HVfIfOS{iSJFB!fBff{>&sQD_4$} zzOvRXVX2=3< zCO;^XR$84bAn3iJrdNQ>>=y}cqJa)c$bl}IAvDmLjMDVMUg3@RI-#N@iZ&T}H+Sr$xDP?NnKRb=g@%LcOz(C@+s(P+GH6XSc8jTxr#abdd+gf)<)H)KH8Xm!2N( zsISA_f1ziCG%pOFCb+6og18W9lSi(&?#Kq(Y?d2=^01pAy~aVuR2gMpwg`C@Dmt$8 zg>Pb~<&Tq$qw8guLz*f{;X4K$mf4?Hznd`=l~M|ujB2hEPkRw<7L%Xl$0~HC1!yo- z$VT-$*@?+7YkebMpzeZ8A`f>@qlEb{?K=Af-G$AHKsSt&NuzssuGJ6Eg>x~#)vD@- zVYREy1vo~9(NB$zAF?Xj@>n#>DU*OvU08a^8OdMyWESMsgp1-nw0^0#?D8BuL?$b?nUTS1^F9 zdGvS6f4p7Nkg;5^_!zgk$6S@h9lR&_KK^h8Mrgsk3=yCD#Fri4By!LA3X7Bz$JWED z45;yOEG`~~K_7P9be9rRQ_oFO#$iKZ1Rs>C25jY=C=l&53<>4|%ku|AR*5pllB2fN zgI$>|9Is83rQtwWvMWZI)BAvkw5D1w`1ZHIT!a;}oR-|+IZ{iBky`osX5b3YlnDr6 z`AE$+Vo>EGtGBs3xdAzhBB!)CpS`mqN{@GkQdLFbc5Zx#{<75-IK(zjKbWte8;l(Q zck8Pwazr3fEh7#~xEsr~w*0-QTvjb`qin-$#9ID{_OfF0a*&)D>tp02P{gfbRcO5HqFMIJj-xM`?00NgHvqPO-ka zB4>~Yebj<<=Kz_~-4@N>85$MH2sg*mBbhd?jxOYy{u=UXM}D#ip*-53E#Q3cE!n_E zYu*Xp%11W|g0K2fpcKmM+2XlRfp~8Q8)2^}yO|6ZN|h^61*zp1HY9nrFXjInuTEX) zXZJx%pqP|X4t2Mk%`!Sk>Tv@5@!>p99x&%R0?GA>Yde$fpfXbt+OaJ}k4=;B;*kU- zH+C&A)fUFIbT{(r1cdYHX4Ec!=WJiyq3-tffW#6kbn+u;fX#!`--CK zNv=Jq^P00RK>92t~Gl&HG=^;G@_`~t8q52%sstJ$)oN&}Q0FVEi4Y3W_9&Ziec?s0EIb;@D3!NYY1QROj_eGGz~KiANvHei zE{N4O3ICHQw^s&qwy=gxfh02#tt4bW7H|bT z9ih8nBelt|3vOBZ(R-Zi2O$t@sko{rK3o#Mx^nD`D|OjZihR@oEW|ipud*KzmqD`M zSisw9nrXoxB|S!3ERonq@k7HPZW;q%O zSejDed%0gcT|)JI$0xK`h42v@LunkjbfmN(?b2{t1{z;uCKW!AauRto|}# zP15X=c1m}bDq6aj#3I~JE%tu8V|*rYL>SBRW)vZPXQDS&nS4j?ny}+Dh{BF7q(y;$ zUgnYXhlLjd8el?o^z9yn&xqaForaWqkq;C=K)C<~El(M%baVqvOyTwKl34n^ij|t| ziZPIE4*8^K*(J~)Xd2Jw)pL*y*TF{b6gXO0vf+4S59yv222jCEQyTyHkdaA;#}<*7 z^(R9Uc%aHn*gIv@yzSKiHa8*b(0eji0v|$dCHX5?r0rlQ*~6(@pj| zSwqs*_>_KkP)j7o2XC^=0rzB;iGxxQf5q-($Gh2e0-2k7oW#IArkQ0UUuCu1cn%n7 zoSd#v6k*|aQ}V_|TEtGZK(T=W4%Ra}PhtvdQlsBK{Egk`#@%*CgoL%bel+mohfsQ$|CwGxvWQNskN!&&vz~{u&SYX44H8{o8 z89)Mxla`S5m4Jye3MVza2BRnCPDs^c(uD~^2&++!z(B%K8+7MZHtyZx zx1}O-9bHxBx@zJ)g@2Gl(ptgN+!a2M3`sIHDWGPyQ!?`|ZVPxDPXULCo$yJ)0Rv0; zah%xbW_}hgK&`{U03zVYL4}Qq81H}uoZeMiJydPHmaF580%mnb405G_Ko%{2HgYmm#rddZ zW=~WTvu|Y<46lP=o=Y<}GEXNpr?ZQP#CWljjya^P6aW_R-ScoksW_wyAd~G9eBOX2 zLFZ6|k$YU)(9V8gv?mj0dICb~t;2@dd&g)VWclVo(U|~pF-U^aBeP5W7ie9n_1hQ9 z2oZR97jToXv&&44zc2Tl(2CXg6hy;5Ik~jzH5uRP^`U~j@=*spGU?wmH-{4s^ zoSIz7a&a&pqhdrJEK9+Vaoo+j6JqAaVxGhw&*>@_xD$C`7GR?jK^Zvgj+Z-`EiMP(VT`?pu$e-33=zvg)_x&YEg9iEuUKrR_Tf z#@s}}NODUX!-yL&hG?kdEGvoIa%VlC4iU6*#YJ~Ghhc_wxfJ7YB1ukz9MD4$Tnlr# z#N0M!J&%G(LM2frCllZBK*svejTC&Y4?i8}S&Ns-TJFmsEATzQ#9j&Av;;rR61}ih zIRNQI09(i$w=ID=U{^rGheGlSDQBY?Xs$ybA~}J0xJ0em0$V1QdMO?#D4Dla#8%?t z%jq5c>4$OYxLD_mxRPgGRsQRC$)b0e9WFBfc~kWR+D#9kzetCh6aMKgAHk;t;RZZS z&8RNC`n65z23yLs4(1%XG8OXF*ktgXfInK~>~}{^9;s z;nJ|B<2j039MVuhZ!mQ5fRFiQ#Z~hgcSLf^2o2vqs;X7rgI~|Ux>9mUN-<_JzQSX^ zxy$?xlE>x+UCsoT3!S6t>`f+#WWzYwQCoRT2F;4yPE(utaoFg@{u$rEI|R zd?yR2dgd-SkT6}^pUsK#88#Vi)@{7wY}YXlf!1I zp1_Syg&!7+EcV&q#r!GJ{~m3l`6ddYbPSkKuI7+!NDD6bBn}GV7dD~(!UU=dLu=VW zMeu)ajvxvnIPP@Z!<~Uvxl3XGqB}R{`zk%=%K@Zfk$yQNKEH05%0dJflH}Q`A8t>X ztSgo!_;5=Uj&oVCiWef^ZsU|aQQ(foxd8mp8j8syxWh}6%I*r1x2J38yo9ho)lARC zJ9YNHFp2;jnOzcpnNbZrxeF_dWG6P{Ku%yp{v<7w0j{d zGWq`}4LVoDcx=-{wI`Wj-)|Jy*yVAX^}dC@lB{VY$TG$=V@_ly<+EQ1J+P6GqBXo} z+jx)hGtf=go;+yHV#pBX>fvQv{HX;7nZg$(3yAk%miBO#2zbBI@NYCWrXK=il^H7m zn^=6wU3m=UC0}#Pqz#FT3eVuVmF*ieQ)rd-?!7jPlo>9N%**0WLA+OM?XViE8%lWS zAry~Y3R*b-!o=@&TlN*H7`3arUEWnyJ-kVJK+K4vwY9J~w3yD=r`ctDPa66?zmx-j{jP}|B=Tgz^~ zNP_oe_<-pEWT=TbqklKzF`^^FSA{KuB?xf?R8Ygy6#-w}V;7IaP&!TEfwD6z<@TfG z6>^P_qkF)oaWFa#D6zeZj>NOYPs#hH=?Nm((IpBR$iD)rB{83M(NCflXAYs@RkN-O zHHI@M3ugzAb|7=RGa&5`v}z7uYJ+0xf~Hn^2ffUw%IFm(XZntkwCk{aD6}N^tfq?q zMwptQ$j7#&8iYyw^g?s6tNO~8I(%voD=&$J5UgbJCf;r*9XjhIob=m%lw4+N^z7$z z$_JljNSkrxCBig|0<(h&B$m>$IFRgW{k;*o8Jy;PL}Jdlnp zFAmQaELN&>OZ13S*Wfw@K=seH!l}4v1^H=ov5|}R`>WHdLBI|Yl>=oY`v9ihk_i|I zx3y3oJJvQqI^xJIvPc!h zIEAb(`QR_WJchwF=xwL*1?KziGml9ct`ctn!u^Y- z6SvLI@q}1IX&qhE0*lBZYd{78-c24wN=98yxbraqMv`R`KfVGZ;B>ZzJy))N$Qmwg zXf%QH*otV}eE^6DM{vBDvG$S2AzBrv-!q78Rhq*Da0dkOUj$fmNi^7j1;u{^DMrZe z)%s~Q6cTY=#rUr{!-w`b;xfQmQrvmCjN}Pc7NckU2XcLmS5*Lm0DL8E<7%lbf>bUt zecB$oG$hH-(@5hf4Q2m)I^-c>La;L_bm+=%mZ1tgFEb_B&R!E^X$N5))2}#QmrOWp z64*VEgb)(x+rAD#R?;?RG&Oq+K?`C?SQQ*#jjv1QL@@^ULl**J4m^3CiVNKO5>4pI zXTWriQ9lZo9P}e#)o>gXfl6$G3uZXx`}zc9L9a{gAMYVV+7yWYUrmQ+n<*V)$RIhr zYQq?BF$5J9Y)(*SYOWX6=%P?9T7c$)eLPq^SJ=s7Eh@GJp~K=PXkfO$$OGZtzHb5A z3nqSSp7J2`Q-X#=35o)B#k~$VTH1we=loh|ALzrn1hYN<#I>_j569}K0F_LvCb3E zc+$rrgz#m?3XRA=(0@eS$_EL=Dmx4WD@zS(f9ys2*M$fBRB6ICvtov@wY)%bTiC$! zfC_(XuNq*<*c69OTrAI6HTvm71H+9Lt827rKXp`&C#E!RIilp|=w6d+?`N|gR)t@bUGgI}pyhgMh=9MBF{$>$o?3u9!YT}w zOWTtZ=*Q@4LvAXM?`Dr(&NNbKhcY)9G55VEJE$K^6Y0Ks0vm*%hi*-8uf8#@XF8%q zTVPUnGxg%rJllsIb3jbFod`}PLpy}JqRQ~}6|~0Z*%td3S>w*O?l+ULfO%vSyu9wR zlqpz57z^}Ujt^-?lvw`MaY%a5ASj42jeVn_f=6e*3k)-y-@p_CX;vVM^9IEHFS1$; zf9j{Vr5? z4$nqkxIm}xVs`p!u$t{{F)?L`xb`F%Z@x35;P%h6ArbPq8tG?5Hji6>`f;liwsgHG z9R$A@653>T%agH$?6H-bZzIY`I8fPU&%Q~Rk&^9^h|k5e^Za-g z+x%b1Ph8l^)xa9Hv75uFzrpE|iSpPDK`0d9RIt+MxBM6a#gY3Ctt(VeN&^`XPZH2* zijtH-+jd{u_Rn8}Ux-)6XBv5u7XtPIhNp+A38be#8CBmx^3b{uFLCaw(83bjz45Ho zeqm0=$Lg2fVQ%io$|4Z}-^HTXlN4si10@8I+3A%=Hqyv1B=TgoBVUGC>eh4_C?re% z31Nv{%+t!oD5cSjd160dOMMqmt;$debP~0{mw*AC(t?~@$CGKjUE81uBSO5mM~;sI zDjY#06#>zUIuuZwatSZ=lu%8zJhpjz8exMj7kZpi`%{YKOzCgZFhwK@ZAg!U9V%N@ zh{k2Zuhy!<2|Wn1ivC>e4AII$?Ld47gytU7YPG72o~`*<1NCXyDQSu^o)(eu-0HNj zbipd5f8x|)l)ccp!Jlum8`=mg0`pM-WbyfAzp-L1AX;nW+1yJJA0#2Ru)5tQN5HxG zbtEd|Nx@?4*VEQ7VzwmN^;QSaO*{iIW60>*ZEzn@(~kC0mKxQ&NvDJM4Nw8&7I5)_ zGwsJ3Ofr;rIMwB5bqh#(NTmmlz{g2L&ij4{Frvag0Zq}gI2gwxk4v>?I*83f_MI&xuTy{ z*!WnW*Il|aESlIfDHXTz4QxVXN7_;O^<@39SfoTE)B&fSTbQ!q$ZNNK1h3~6Jsfwe z#<1zB;l-(^d^)^FnLbK#A0bw^14RG0kd>l#=ouB70E5x#X6YI9?tR}@UsWLp2bfG$a z@BS){{AwR^F~z6j4){ zU7vF?6qFeYDl2c8NIbzrAOJN6pA~kFPw>!%lurYoW=E?-NJr10A`Dkw_Y5$&L&G0^ z0!$!LsAOk6_}L<4VLj(PF3A+zcIE5U^b|L@;^9x~-ySG(?NXHIiuU3uBJcy^zQ@H| zt(XBs5UP-EQuhwzPv5xB6B!EN2d?N%T>XAyJ;`bUo=x|0O4N&Fgsy3Md_xlB0VHTY zl`coO3I@#h`eTvH&_!vb?M=BdA}SFXt6LHnM|i{b;-M!FKeCgi6;RsV6PMfq*dkEJ z)mgHa-zlnh9GCHIK^|2l7|v&@g)x)Hh0l`_w1k2fLD;K1+*1CO7(Q={=9R6|)A;NO z;`ojSc2pEcFr)2OTfm=O2WV zc~o$rJ2tc(VdZR@2Prsq)bS8Vt={*PDyt)++5ILa3J&-jeTmX1;-Wg6N!&y8W@ zNFfbIkIdO*G##-<9O4+H)uWErlN~up0!24q>EQ1D!j4hwSgBal;ffu+L|B#3J4vjo6tF(SStpa6DgQD!j%|b{F7%GUO>_eY&|D z(UV7U3aX9wTWMAz8-lH47`OMxM{BJ1X)lWXHx5mVWb#HcRQu~4@%-Wm75FJR&r<&& zwO$_|?HA-tpeHnI$uDy9K!`aTB|8VAI)a3QUTA|N*LnB#65K4F^&)XPZjw36!7G=9 zn>4KEG~_qoQ4^XRB!;fp@N=N?Q%F|^wzrp(rgG2f=WkqNb@eZb$86%CG$Gn6D@?2w}Ut(t%-Q_f0 z2$ll-nz|+n85`avF5494EVhT}0?$^C?1+x&5sLQU0laR<9+EQDb_zGS?|u*;lD|i7Y-zeoxy)d%#GYnm{e}iCf}xdN#P#0DOdW$XjqTny(wD~NNb+Y z)u@3uZl6lXY-Z*A^f^XVUbWIMbJxNC}&23uNWY~&iJCe4pGY2iO1D9gN z_w2#*<&OGwRLmU>R`QxX&WId)+m)DLA;;wU{{xQ?6kGsD)c0~nf>4$NVv?;!?Qt84 z0a~OVgsbRuuMK{ey$Cxo2nhbO+z|(i6r&}_1$PE2rhU7hH3xqpB6s2r7zn!n)j`SV z)f%_Yk`8Exo>g)t3FGa{TmC+108lqV9#nXQlTmW{XI~zP zn~2i&+2{ZzSL9`*G)Z29W3AiJj7!@tdq_HT-X2e9kA2MXNaGmR;NF6c)e4JMs;E>L zcKZF$5u>na0pn`n?v=gvvt)LM*oAV$a63sFX?e)48_eC<8Fa_TZ!k&ZzBGl$aH9xIsA7LJD+{P~bxys&wmG|ET^{l+$Sm1x=f0FsaB z7kVns{V{(5^2dD#-3S7gCsv@SEG^=?v&6&+L;yXf2=g6I|1*LdsS?Q1Ntvne9d;`| z0Cme^zB)0}o(%6L@up>iI-ZLi^$4WXAenO9qGI*VCy7HQCe>T}wdN>-5GtuwFFc;C zo;_v2x5%jpP*1pVwV0bxg5#iFu{Eyt6VY=#JF= z!NV1r42cdH%C~ji+Xw&<$|nE;L=086MclyLdIw^t1{3WD`vDu_L1&F4A--XJCRz}J z&oT>B0!egw%I;36_Xl_z?eXaE5qv(Q9b}(#Nl$7El`0jo6(^w77Y;ZIz53NqS^)y{mm#i>$RZgz>pjdx#Fc#g@l0!4~(6@Gprgx1z@U!Im9z$rDGOO z$`o{Y@J1cw*(Mztd=U^t-TjfI+Wn229kytCVtbFrXWE4$4Ac(zPCM^TOv4(DpZJwE*{GD14qk2du6Ja>SZL)J` zaHqAchm|$t{q6HR==e5F5a)QfAo3nhY&py~Nb6*#u|>zEr8zH6&9pBCat1^t$a?^M zyx!xHQ5K}2D7A0t`uJ)V(TOY`*Q&gTy=ZB$pj&WjL=C# zr(pW_x2&D9QA}b3r{~dzEPm=S0a^koWDkaf(A*Vv)PN;`l5*EC^2ZLg*2*f{+>hzG zY(fs@8rKPS-2CpmU^tA=GY^KTfh57!(=o8o2!z6|-9m}{EzSm(oKr9<@SEy33v8;p zaT1H@`fg~9owy8-r{bIY_;Sn!At!yS`_n8&2M?5+%Li4uOI8cpRok{xRhDWyiUi1I zxx?vC{u58yFib_{Zpxe?*L~lRlys!Pqje zJv{ShXe=<%&SHPfJr1Cpr*+I&?D@%JJ8h4FtKrO2XNi5w5kM`YPa!9F-!+inGqyw= z?1$3?+?RCFPqf#8=eR(mqi#(kjPj^=k~(WHt77}r!T>rlCFT0e#bZA`7(zr1K?4mu z_k$tb2sRd-A6Fmg9Y**h>%jM-K53#oK@ zxG}rk2W?2eq|!mKvd8znWM?B>Fj_b5d8~iI7P7C64J_>cnH)yPC{G4&;5w$an5-_e z9o$ltCjIkR(-%C8%r->X8bv)&04KWGk;p@O?%=$A`wS*X>IuTmcz6xXgMS!hW{1p9M%j!NWlyoRKLy+i~F`j!a@nsOoa%ltWRJ=*{Wm}XFLuXWEwjvXz{geYck zVb$b#y~-%UFl{RsG`o-^Ghr56CCl@~=;lw1F5)mGx)v>f1#H6M1c{FpwWR&Z&W$62 zsHrDQs!HlFIQ$WNKTr$DIs&zq?wNt*%sBIitlE9pRj3w0&m-cQdVIm*+X2NLaXI5u zR|t4c3ZijG%G?mt%9~-y*<}n2H)&h3ttUIuPNI}bsFSdg_Zc}YIbiZt6BTb4W~rN_ zN04t=ruAgy8|Y6ztBdhZ%1_qg&3;tot$+ev6kL0U`B&sGNGRY9^ha3pJL?Zp!?N_4 zd1Q+>ViF^6EHviyCZsA1TJwqBTi%aWKR+4+8fxj@Wk){aaKD-=3P?mQDaKp3-){FJ zLj_CF-%nN!d%sJm4VViPap$!MhF-wJs5Yx7J@)#<5E&{7{@MHO#HgVqqAn&Li*u7) z><&qkN*G&sR}j4lx#Kisi=Gy{GBG;fNLgRwn5}sgSdy(JG+>HD=?GKb< znw!5u|8JrivT=HF!XbW~jlEdi#rr}7!y{&~Pv$0Yh|w>%oxCODV3|iXTX=C!=*(F- z!zkCEd0&hC>Jw9%MN_EAAGGC{Ri*ESlQcy~-Rk%BQ|13MyQ~kNEo%F)Ct2~CE+YaU zOv!I$Byb*M~!={6^R>V(ZXT>=45lA2tb|5>FB6h6wx9{sy2cnNG5SSE>dl^P2(sn*)N_dQk0AaZcv+Nu zWEzGe>J~-4#stLD!1u^?(Qr@*}5|qPq52~M8&^#6K z5c&e{ZH;-d1M0FaW8|u5Y%cI-c?V1{0=I47+Mf>=c(AXFT5G8%HkdAMMGB--@Sg(k z>s0`wBfG-+ciJ9u{d}^sc?AMepdu`2(S6){^EhX4vh|HTHDM%7fknqSKI!^^Fwf4_ z^Fn|zc*=E8lu`P{nG(0%;SBAD00%s)D)RPgwPSd+6{-L&v>@9y@r9Bkwg&dP?jvva zN~EHrD2(~pqCj=w_-rtCO242;J?{`NYRRO<8^`vUMiN_=D&o$Km-lQuqT2$5Nye#& z!^}+wLc<40R<$Va0ulgtug%!RdwD)vIsz)P;=(1t8|v1th2cJMifx?OTO{MVbpgQQ zQx?zOWZKQ-NI`EkJmrw|@4@&<4~5<5kTujQpLcy#Cv0frqOIFJRl zTg-qFfhH;CL}-4Eq7qMz3qz#5k*mG_g54Vdfl-XoU~(J^%ns!1+H6}91O-nzbZQHZ zncvHu6$TM|Pcl5m4{Z-VrE*Aq4>}?F2@s8m*9`o+y_Rc7jVWN-^~cVXyxx;xly>ma zrGwWT)d%(#;}N^_a4~+AqIlaK7{1`{Au-a{FU3WTkzC7yHK1UcUCx4bQvv0P)nkvZ zBiC5$6A^%H1r}>+lsRDnZ!++fXu?&GXrPlXqbf@KcBd2b-HtXt%s$3Y@0f1WHY<{* zGH%`;b21<$_CbzUiyj!xdzcN`&p!LU|+M z+wndHe~veeSS=%!TY)waIWKU7oGs0PkI+)Zt^9Xa9?u-o;S)VRn$p|PhyH^^fl0l# zptJ-U@J?t!4wmobexvaaE)D}d4=>@l#q6S1!q39n!6UCqmpr_mtiu3w` zQq$1D6Z$8IxCu6DqVeg!)&vzwSvpBuE&z?!CTHSS9W5|mG)b9YhLE297-GR;+?(lo zz;A_CFot*0;7ZdWtWzyj_e;k8r>i&zLwtWUlDs1nK4UA&%?(EPW*>w<6!~%xqJO$< zYR06PL2C3C{Ti|*O)9_NBYjjd@ZOr!o%_N?BJ2y>dkm;=)fZ?sOWEzK-NanDU@1-*@w!x6hY4~=9O~@0m1E&_+35(8)-0*~Ai7#Yw9*WhZUGim+?KzeIfPv@Xxj@Ep zhav@5N7y2)%wcJ6n1f<>AJBcrx}O z4teOUB2MZM?jhlf+3B`=7Mb)KfllJETEqK2=EGM5_X1QYkmc99=gXo3MKEx#jKh1x zLnf)+8dB}=)#_n2`%uif;AOXz{hG;iA*cMP7!moi4Iw{@#6h-|yYI+wdNx#jFbhOH zt#5QOZi?cpH}0L7Q~WaYwlhTkasv-6ugUnNAS02qTyPQ1e*VR zw|I(M>by^G(E`nT3q1@9QakSevi8Un2`JmYNml3SCD+^Yx1KX&+<0kA(l6ge)wB;S zS+uKdY|RclZby>Sjubn-;*W%{ZFXn_daLN*1JGGoF~IF)pFOI~XTzIK z-114eE1=|;!MSwDEWsvL@lNIg(|7ao=;mP+Mt1!4)U|)?6p*_#r0S&{u|?d_B#`_P z9sgNxHYfo3pz!2W9|0M0gJUu>JHoYgV*&TCJ5!v}#6=mqrs!&)A^uQ28S|8TB3{Bb zvWO|5#X;R_?N-gOXDoSzG89*D1mnmK`V9%~RKv6A#aQ?ks;`_~^e7W%wGNF+V2v!i z*ewPj!xKx}Nug6iaZ~iCTNuNkZ#@+5jA$kcr4NkS)T#YmaT{ zNw9M)KZQoIFKx8@pjBsGI4`xBdh*i6(iLhGW}@RJZ-oJ26AKE7I;UA;bArz%auDqW z3bSzBPNXuZc65GdjLgl`?BqU0H3)Iqv5UOg+)+&!VaYhT7V!}id3nJ05iJuS^WU-r z1HVN1N!U^Fl%&Y+on|)OpIKf{m+Fb-;3VEE@<^r>e$ z&bB^zCjq_B;EC=2j&tY!*xQD{&>RyR$FT6xaQn@ptnuxpo`e&xOnV$-Wf+Kkb59t4 zU8?hV5PNNvpk5{0xT-C6-M%!EN!W!6R(k6pfzw2N!&jB0Kwqk#> zDaq(Qq3Kwf*j9u2Nsci$pA1d4a1|7r;fU0JK{=8eE$3GY=G@8xK?Kc%K3(!myaPAI zw1Tl^a`baRw*U+pH|Ts!*;wr;x0c~!qAQqXkl_p@E7CACDJr|?MlRN@nUy8EOjn-h z^m%BUb>w0Z(?q!vR(m<6gO$V!7Q zo-vxqbX@YDprbYn7at1cMh7G{lQGO>#PixCXE{o6Wh8AVh%#UD4sk((J68F}ZG;gd zCUhrI;+PMoA67f#EMQ{hqG8FLK4a71w@O+XxVHCvdnIw0K^Lb3h!lj{2uMX61dV+_bGPL_HZqwP7 z9n1p_7Ca-&3=UnWH|2^f-LY_4x;XOAZU8#{Ktb9X@Bg=b9ODUNhcOudV0zZW`*O%P z;8kQfD>Ku26Gmf?(gvI5VQh~3TEczp+YSnd5$Lw$a%<9JN(eOJRuq=`4Zu@InnA#% z^fZkmUH!%A5b_Ri)(NBBRovKm(DEW5X{((lT&n1spk)}ItaDrLJU`DE5;Mfjw%;5P zpVSrUND;QNVI2T=fOU}PaTs6A#Uu6srE*I3EGN!e$K9eB>ViDq;?&a{FEEKP%Et7t zzMt+m7)|ug=v8&m*gW@d5?5EE12XgmmRBDIpQD9Xye)SeYD38vjI*llc6T{TiLx%7 zAwB2)D}r3d5q<12zhCANw!$o};KZ3M)P{`&2pw5LCU2;Ac&N0Z01>Oq93nn_%6Ph? zG+!=q{J}#4NrGF$Y#_;mfDzLH7pq5cc>*#S00Q32odw>g+8X6l&g1UM$IuDrCqtBN z9RlQu`xI5*)tvHjBS=gA>qdsVRp&X66P+GYd-EUiWG_^TZlHu2sdx9$(?RbiBP_03>6Hj#cKw9^`G0|43nYT-vgmI zq&c@?Wh1Awdrdyzj_{@nFdNRdb&RJOEl+n;-{g8p>1sUMF5GmiNXQ6eBlH^_PQ@#( zbg|*bzi)$hW+UQa$omwFdEVM*s5;J~E~`frY|HsK@+H_d-pUBao*`yMjL3VXTy;_i zV`0oFNs7aBI@6ioOeTKlJj9ZXy&b8R+Rl&c+J@6)fcR`_k%|!QvWr=T5BL5++_tXOM7J+7VYX4EmsN!^a6Lf zcePCzsf=&GdPGXChT#MxZ-r8I!-I!tpLgfAN!z^)l=gCars%*ZP68_x3{%0c11}s; zL-1*X=!_uPb}{GxM4`J_w8n=0#e%5^Zg`T?!eFXCZ#9kW8saW-tIXu%8|3&&gltRE z1$ZuY6zN+ud&Jc3-l>kl$K%)XKJHo|58jnxmZ<90(x&z_)j-bY1QJ6&XaZDW_Uw6( zW&E}^6MXUE9>QRrn5!ZI1iRzWS>T+V6^bpsGYlAjle3G&Fzf|O!rSC=wi@OXRRgrq ze1MxsWDeUgQ`Z*muZ)^{**ay2SpQDX!F>gM`fT>zIx2V+OKo*dV6pMD!M%iW5`iXH!8&48>}^wWbR+H zX#n$xNGng{Ob;_)o_a#a5eYCeNRXGlB z$o^`TtKwbC8K~?a*R!f1EvN#^g)A&FK$84WpMr3D(!xi7W6}!ji_Da zEwYQq596qb!}^RbJEam%DhxR@7%7r(pFO&CuWbvVCI_{FOFkd~%@_r2W6j}>emf4F z(ZRt<29R(HHyxD*fR{>!j;xb$I|5z;lS^FqWr8Kt`llY6#0$YcTag(Z+=Lk?2iTHv z`!B~LLr(*yU=K3dlP3b}@4$eeGyelMYPUg`9cpBp5rXKu7lk%QwI9XgsBW3hYd=P& zr1M*SXG($?ZLYLk(h{sP_)*t1V%2h>e=h%!KD?_P1jb}Fyg%nRjHJN>3}_jZ-B2d1 zuoniNVZjr0fCM0PEM@^q$gkBf6Z>2ZEDmWH-vD5kYjVr0km0iK=AYG+Z0T{aHEZqt zZ1uDn07-HgQt{zZhX96Q_SjwksqSQt{ygAy>lB&qkvWerS@& zMD#6bg}^{~6BJT#Z4!Iy07F3$G9P|#N%U2|R}&$kA(1C>9Ot8eB7_FnNz~Vt#I<}# z*fhyW2TnNtXg>)|k}&2VecxO@^1V2NL#&8v} zPD_BGJv_VRS#llUhdT*w8W=b)JIwY4HEAc0AX_tKADBNo!wc^VX%}$M!lmwg0%|^-05~D?iKRO{ zeHP51kzx_o##Hv{4!H6l7lkTXN$=H8K{+$78$s$RVUb+0*0mcNdlk%tH%vzTX6Rd- zfl(e;0AQCt>2q2{&RVB1#`9Lz&So^SS?9IqXRL?UgVB z4L&YcTfkJ9?BNv%RK;6pjZu2TZpHpqh|e^EmcS|Zhm5F~2*bYj?ZN}fA7wz?eAj!V zSj4!JYJ2oYuT@Ao7W*>ngPrdf9g_p_2fgo!WnlC%1V$?rRoaYCZz#|ASd}Dv z%GH3jLv=&|ix6C{2E<>NV;a7-Ym0D`4|Kbw*56()GHA&6)vo}-q?Rz23mzja^uiso zdmlhaSv`}A0Rvq@)C605y~sEYi)9)xiK@-E<(m9JBc)QS87r0<$J!$psF4h2*%v?N zz=+WtnJS9oou)vNu+>g;L z;M=p!9i=WQoRZ>t13=51ivDqQ0s!*}02j#r-%y$1XGg| z_Gi{M8r--NNVR(BLcj`T(giM0IdF`Ij}lSxQL-bY_Jy}z?CV$@20uBmR1Lds3xK1m1SR{Ukc#c> zfgXe}uIM~-5A2qV2t&4c>@v#EinP$yL^YM;eN3;A{2Na_sNezh7z8LilH^NQ6rR-d z+lI*~O%ti?&h%QXp50JDqDRa?@if}(M<8i3@3uI#Rs2At@zfI8c{reYcU! zTP#7GY-^n(tYX2R4xObD(KC{Uo96(mz+gY!4*<-}qwi3-G#a^XfTFoZf@FSZ;|lcY zciUu)jLD%N;IJUHFd9wQv2&!r{gMYY=7k-E#h-`bA*|EG?|1_O7+D z!u@W5B6P*I*2S+$+ZQ%Y=}#8PPps7_&2c2M6q^6}Ty54P?6limW%YBXa_Y?y9ApD_ zh8wsyinpIPNpp~~DHC-nfk(ELDeVt!3qn?rHhkiZdPE)#vo^YOwyKwHMdsu~_=Rl; z^iz;pw)I_*Rvhn(Bt|3K+ed{Yid0e+^RQKrMqIE$K`Rufbbl36?NmrHhhnS&-#8`D z|LI>u+=~%;ua0qr3de+q%Po}tPjBlN2pO8}_USFx;^Vu=F5o5@H&7t!`kWj#s~e$% z!Vq|fz}fr$KHW(c0{AclY*Dr#8n-jJU9cN%p&BjS;wC41VdwNaC;fW3azs5qPes%h zkMNSWlLy)Ym2HW-)(&0u>aj_8tIns#scon~-}*me#>>rp&=c8$Xuv|Lf^lLi#e;HE zb3wALD>;ilsboLxNomM1UBVI`ZBdtA5Gj&ueb_N@0Ft->s3xFT)gJnGgvnz|(%uY| z_C#WzR=-wdqBH`Ltg&n^u9jrKW&=`KEjd2lW6Ov4NF#=eSh^}VnNLu01g~is^iSOC zN|tPc7CC#@pZK!gBUS9N+e*SJQhP)_&+QoO`mw@*-B4hNtm76`Z{#0^(s|EYL1mn! z`;Z(#C>x`@?TA(2sCKY9Ohi}SieE^hIH@|^;kjBrel}V<2{vHA{3w(PcwZq#b(`EdhqTK;^i z8b#@iVKx`@&V~`#;~>(?LWE?UHamfgqu@-2g+h&9xSa(aBmHqCqv`u4p8#Y;ropP? zx;I^W{VE4!I$-NPX<+ylF(&%zNrL)el3mqnY+E#y77yf<=;)*N7b>4#xFD6GKTD~z zXO3!2IMPi#ai`{HFlQMEVJRD}ES&=cP?Dtc!>hPC7u=v2fSZY7khVjQ6k1VxZ|>vA zaU&}S;A*io%}2v2>%*P70Ejs^ygab7b4*c|Y$by?Wau1@ zNt3eE+_EQ*OEAb)a`H({qcfbuSpvhK-lPOIuoQNc9D7Xi3Q&DHJc+VwlQXTt zelBBW8H1*|4Fy8@0eDn*v8OK?)Z?(y7!KMKk2cRF4!AX%Ezpa|qEF99?RSzg_sI$9c5As~-3Jt|AflFlJ;llw0D$&~A1 zzyV)@NifROu2v_jE%JN-d;@HZXUc>O#6lp^j_^n)t#Upl3Xz4dm_~~;Y=jm`CYoCI z=IUHw*=hojjTv%;nDVQiR?dVGE|)k|bJ|gNT`KzLI8@k!*Ja>YHLe1w3;+vZf!8)U zm)&U5R7CQj@1&cNUcRW?nD(UI;zimR(z<=<+{POrd<>N|1Tm<^^kkH}WkIY0MPFU| zv~ET;Wq>V4wB)QF%Z+ocfQLHz#SP`I9B#m46u<0_&7y0pA_wCfc*>HKt&cB9iE@M^ zw<_a4EO_P&+i99s0^_QJ`Qu!@nRa1;|brjKTyUwjF==B-)2kBcgFQ9!h~!!sSp2qij^9{%WT<`2e$u z6+{1*p2Jvyva@exs0pL>PWS)s^79^_*SA&q^j48e#*49TpFj}AC~k{-;|La+;{oFV z>fZZ9R*YuAkxBtI9M89k>PQYZ(FD>)yZlf>D&AF#szfqPsq_@X>TR^MjZ`E#XV#7G z@|MCyFJZ_cv@e0?Ci`!Y3^YaSb7Dl&QK`E>t5X5ff@tGQ2{B9B40S4Lvdp$8IM{9= zH<0y&ujYI`WD2SG9Mg}#Rw+0CBY?Yzk)v-ocl|bi`El^mtnUft7>CtB3n5ck5GWkp z6=8e>7znr57(Fkc0c3kW$g{oVcNS!Y_hGdz6D<4c_QHC*QLrrIs?=Dtp1gqpB`4r< zJP8Etwb~5lF-L>l$aQ18#I?#Y&1PK9x?Cu|?p6j==yoBY@_x3{n}lSK#wqgWwqLv# zYS|Im0vM6CT_9hki6|!XaN(cTPS1ugWJiLNj%waK#MlK04(h^$4F$5u&0PcZ$939(5|9rRJ4{tI8ZocfoF~Igxm|G0e zBg>8ye5`^75VmpZ#MSo+(3>ou+C!3(&cMIM<`+m*Ofo#xCHn2zY}+FvfWS@)GrylL zp4=wo25TV$Y4W@@`so-(i<%Zo#9#6vXVCtIt`4m{wep&E)HBNgsGr3RTsZ38^#}<8 z%uQ&T)YZge#zd1+o$MLrD|F4ns|<2W84UualTfhCWcpla{-9`fLyQH|T4GNR&(LM} zNd7a@_dJZt4b6$FJ>jPt?@^Fk9SZ20hm|SxEg)XIo92tZG3IGYlIb8o)R8~Du^`Ei z?NN!L$@fmDlcNS$0Ri=}c@mrDI5O3DC)w(7DK`yF&V*pYXp<+OV!{X-QIePAPMFm$ zu`Kc2GbD;!aCj(jt3^*6g|0XP3e%fUFvD;qMe29V^vIQIgq%JccB*XiBuCntqVJ@Z zN9mv^M_)5hL`nn2m+*ur@ZtI?av}Bw!%T{;dGo5FU^cruGp>6+SSh6GRWspqxAj(I zIiFjGxD*w_EQIhnwj}$1* zjytfbYoNJ0T_^*KO$ut}u6BBLUt9g|zTzOsm0YE=t{wx2HF{hqGeer0*7$AEEmvFQ~iKXQHtcBUTM+kPXdN;s)8EG$8MSHAD==yS-w_SpY5W*Ug zo=@*xa@1L(6;Z*0$;zqj?}lPX0Nym6kWbqjz4s=YOMAxp+9gK~DRKn(XQV^|4qA!lFvOsAsF^BWd-Y^yPe;(}{{Z;FpjK`^13jDMCrxFf6x(M*NW zyNr)r(tnW!O?p;`LW1F%hluo^>k*%pw*Uik;3^5Tb;oQxT$G#U213jFMfSE#n8)c zv9$MXdeqt*5j$Y{u5b<jo$?%0wlsKLsIdv3^?2G7rsS8w%KABg|#>I%Q8Yeg8|mXCU#65=IQK z#p0oZXDMoooZ<#~yKP_PF4+m3Tf&0d*{L&@KjRZdPfY)M~#XilIhe}##L&#Tb7iF~=a8ZZPG5w9_Y<)a|I{Azoz{Z416HOAj)mx{E z#xKBR5lhx`sBdIT6Hw*OH>U1S`F4awB(SEo&GeAj*;DExCYc^kHF_OPj~S1&1bQa^ z1LsP7x^J!)@z;_(lt0VdCm<>Bz!hf6rrV}u^U}c}e`)1)0%AC9%5>%45Q-3{+9pBh zre!#c<3=z=(+}A~a?D=qOJE?z!;?iRj$|DnfMTE2DE`pRMf=`K8KNHE&{(N&eFn&Z=&;AJLUk=hiP&MEl#0g(mc62>qBf>|m z>s4PApz<*CEw#tqBQS zPN=M)f1ElF@)U+EfGgzx9y(v72uFc=ncKlXP^Pd&uE~gonllzWonSOTWrQIrc7C9F z>*=J)dBwufg?bGB8( z340K16=2;}6C?EiTn#kGCcB}ttY(pnvg0#4rem3nG%P0bsAGoVGVC(4BHrOcx?IG0 zjdtcH69F(#4_rCEhQ~Zycx^fHZe$Omd$fhHJ!RPL-Oomj$D}<{k>=-X{EbO_VU9-x zArE!X(a4BfN`b8m2YS=v|~;3uWNgosUgJ=wA7uxvyg;>LxAB)N|ax5fAsHA490G7d!c!NJE;>J@X`@Ah9~!1 z25@`Q=m_v~c|Te{y+`}8O~5B4Xo#2_THqSAHSj3ehRu-?{=^8?)034@hw}b=1s5F6AEOO#J{#xu< z=`uDLr0;+M=ye(-iTGk6rwv6PB zX~L)ahC@__*J86CA~Eq3%y`Z6p`GrI3!W1ZQu4`Nq9HRj<@1SqZ+|Ihj86p(TJBsW zaHZ{w7Z*_{rRj7m5RPp=DiIinR%@14eSWse#;H|?#>bCMP|IUmslnOL;@rAEEjck9 zih<*1&+TcYMs09N90QJ@_;Uwr^_({}P{*S|$~3k(WL)l60dWKL!(w{v{Bhd(NKn&I zZ7ATR-IoLDj4di!Y}H4SNYDnzBb|BYd$DpnX6mzn?EwttVjYnjp(@*Vn`EY~u)L5W z1)JFGYq8VL$6JOwimvI{oe)gChlK2a)@{uPWcKj5hhJa%tG9nhQ-!>zC5CEmF3U7B z1L2M!pfPZ5E9tUSj%X5bGS>L=mFySo{I47YT`WnGjVNA%JH*MsQ0;vvJ3A2L+YWbB z7Lc!V)=%dw0oJtt!kxD7q?iwRVL~c;7S5cGXee9uVTYjh7jWr7KZG!3QIP4}sM5uE zT%v3)An!o#T2IC}iM|~A3v-6@VxHKaz_Wd|Q)TSJEX4Are6wS;{2CCO<;-=>UU-p= z=t*nw0jT{cjPnbZ3seR1_W~p2a`c1*tC8rIftB~6oxMc+&(z2%&R1dG$^iq}=np}g z0hYR%P?(R{#h)2bPe(0HAZYL}?H$);L=zVvE0)hG8s>1d%c6E*@9w52G~jS>76qcG zJ=vW@FyJXws0Xun{6aRB{ylBT#d-CQW}YUwji=?JRWy_%9=_ zB0XPsMwGgvctU_wT{DKInc*NJSmRU4tMDejcfS<&VJLIvx{JNRm}h!|xJBC}KpKNX zeA~=)x4vW}&zLqe{eujf;e~p#N@k2u6n%&qeUipRQpQwCl zw!K@E^d{gBM{hmmenk?HGDOk$a=#E?z}gZ0TIq7%C|+D$SYQO8OFp^_7zfG$p)cK| zn{aA8$W)>MfJ2BNiDPc`Z^VU)LWyC$tLyeGP&|mL5#E}}3d z$U%Jyenh#*<)yT?eHI5sW#HRwFGMFVGt$KmVjy!g+WlhVH6DqnJemx5sItA}wLjDj zHn+Kauhu@TRA@90p#Z)GGwjjAccR61w4D_aDBIx|8;~!REr6C*r6UGZ!V`k@cC1N5 z+<_#WhIgpf67?$T2JQ=ml5+yxi%4o1PLLq75GOH4dA8_)-T%UZG-FRic_>Pz6KRNH z5`(2r;hBHJH!G{(Gut!O;$)YzBr+v#uxJju+YvmlROQ6bq%WFw-D}U>8kUxA!N_K(L(+f?4x!mIX1S7-ZLsXW;9*{X%}K zu_IvfHuRnSyGivG#6RHGk$kxh4<3*Mwc9_-oi6}nDkyS+e9yF<7a=7flK|q_Tb}Ui zv2)0mfKz|(%Hzy%DhG{0f(XI+wUSK%cSxTn)jQt`)736kWPdMrCV-&Oijo8VSkyRM z!U6+AajARv?lFr0J)xLE>#dIW)19FQcquYM4#=Zzb8`9h1rWF+hq=WNEJS6^#_06@ zb9o;DBdC24l_U7W;pP?;p97_{Dw`#r=Aqz+StBH=Ug~?f_KT;(9*`2F_vY6$NnWL+ zR8d`XRz?v&r7%1cfAIb7j!MkxoesgzT`V%B4fs`IE#vexg!5o2mgFPb+j9ME zunHcRRQu|6I<=wV^o%M|183CcW63 ze~IGI5lg3H0INcRJNt3zIshMmr)(b;FT}o?x2T3yxvDd~eV%SK8@@jqpB-<+M1N#E z#8nF=NFPY-J$dSdfPDb8AiKIg-;32hp9Z{Bf@I`*k%D+zfC5%WagfQ5gD(+1hc(zH zS8#ZVLd|eSv1UoyQ6%9>I^EVrv|I3|oo0$7k1>eD;Lu+1`W0Je^w{L(!(iFkxS7`` zQ{xrb4C0s^LZ6XZ6yZ=!^&)e8zsd3aCZ%2l><3fT-BnXf)$7$luU>j%^a1vfSeC<6 z%7w+s_Z}f&kpKiayt`H(aYVF%h;pkJak8DyQlSRQ*WQb@12+{Qe1*cC#5r+*u9fU4 zBn|qc&Vxlonb`z$GqTRtVi@*(lWrpbfdt4N4)aC>1At?I1A=7LZ~=z1edY>*t=E5c ze?A>G3ODS?pdfAGJiEF`Yf(HvDu36)3OUi%cLM2cv3Ll_a9H5XL=o~Gi=bIEh7DKv zb)HbcOqQ*LN8)>fD7E`yxU&qB*ik^m4HvfnBHT1i_uiSgMB40}a6ip|7K`by8--8o z{1sXzuB&Br8gQ8*L6ht}QN(;LiU~wk@>`y!oTmx)V_%c^U7%9&d3lD@Tf&_SR|MB>~k-`uzH5yl<%jyY+;OB~A7L;(=2R!=QF?`-%a zhno#|-H1LPjq@eSni)8A;o(;@>PEvuaVCw2JsRSC37>O1PKhhM2f#!C(kwf78Z4wM z=F5>D#$5V}7O5IZmBl)mmv3&~FE}-zsN1~k&qs2B4yI~_p?(CW;{uEPIv`Jl;vxM* z1w1SD;m5@$ldH^T%YinAu+&i_9G<$;h{sDu!gD1(mTR(q{2o6LV?n==SS=j_l*%jt zM@J5Ug5dpaB&`SCb*`p97Nk`JDo%L*&RnH$%SGJe3+4EZQo#ijS+Ui+CzzSKpwVHp zEn1%q$^-9~BS)*NqQD87A~>rIA%TRvCulH-;Nx|GSOD4_<7sR*exYY7b6QLHk$$FU z?0!Tvo3UI$H>Sp$ic1HCY^Sp=f$tw^um#lq4WNamzyMUZxedX$y%G?CBTWw7dADL| z4V*_X%O3Te0G;ImY+HdHwVOn0+D_lBjE0~M$wz!W8l?u#CD0L;6Z=xdoZ&df8Q>xj z7YPiL_lx9mO+ZWt&0%eSjK@k5Fc^7=_lrCrk)y6m`X!o+CC`6gbz0gW$&TWe00YQu z1zQ%=K0j|9E3^K5n|~2U;DbywFt_Xiz4D50+?4f^rwIcG1-x|-9?JE7nU({m67d9J zxfC#YYfK}ho-S$Un!I&E3Wn>51#b?*JN*xA$nxn#k>#2?=^&@>`q_zD2CgZHcB~Yc ze-Qd6<7e*n*M^Kosu$=%3J!WNuEUJHXh#GA1q}G9*;62nnBX())+Y=fk&{+FtBr^U zOG5$~kF4#oflhaXgUW=~37m8?QK}4lV@Kv(+TdKtM+HvouVL|H#yH*9GQ&os=>-kk z6D};O6>Xra%m-M8vvzLKXHcqwi&=3qgVVq*IYpIQx$9Ub8#f`8jdbqUbSf@sj(iqj zZW2GX!jJ06uWbxfJ953SE0($_r%h~U{ujC5%V+iQB6Y7Z0P01aRhv0fX%NZ_G~pbv zr;3QYQr9I10yYP>FG;qFF*B5L95X^9BE2=ak4$R)XNytDQS!5i{N{HdL zTs*S$GMH&)t_AInxX<>0x`Vs|C@Pl&gaRgdDRZRqUheEQ1|OD;xa0QX_-AOOiB!FI zY3cfMvoTp0R4mT$j>+Nkx=G|}7`SqK@P2ND*ohdF{inI~n%w{s9VM;=V3R$+SDS}@ zQY4^LE`YZ$W^n;gTZpfCRF|z^fm2~@f>FLoV0)8Chyr*jDlyb`bJ;|!hQS6S2inwg zwLrPdi6ZzGhW=`9p%8uKeW6WC>xDBuT=&bxdEOKa|Ja-DH6JeZNIXMA$7?IYDclVnG=U z6s<-yeH=HyjI7c0;uks@@mkH^ZU5814InYZf#)dovl3ibLUz!W62rIcD^JESsG;Rv z5y?$2QI&&a9^({y)7V>}JQy7}0HKD_ky;1I1>LPK4&Z$Y=-ToI=3BvCze&Hqj)c|) zuI@Y{aO(-}!YtXTl_w;M$pVIgrbm9GlgnX@KSXe`-N)V1-5mvE*@n(WEs>Vp8kNYWVC%2c!`GD6-j0N1fmgqe6HJ2!U&^kLx38 zZl+pZvT4zUcj}=ZgVYipqZI7x0t28~bdysrr3Fc)kkSK#BTLZlUpm(5ActIO#Am9g zhU?YZBKE$ZpI++m-4%tbkYq>&4=%WU$yO8^-vucHX5hQh@GZ_CMd>oD9=30@LNO1< z92{3G!gPvHHRO24@M0EASIl0e99(_;WoZr;bvO)$)VG0J(Zm@)xAgQhvsio*xZ=}r zNYN{e3#phPw?~AtkUNXPRpV_h(T2rf4{6o>;u6(Uc$|%jkAw?{vYM(-PSbNHW2S_;e^{e<4(jL+`7aZq@`?S@*~=G)FYoSrPwk06uc z(>v*xKD*uCNe+9hY&0P?2YA#B-TAc}TRtUNbRM)Lk)-x=#!mR4RmcdP+QsK5NasO~ zj}XLOng~G%=r5EJO+k>t3U)5YIxjhRI3fW*Z#URRBD14Ig9uxEVJz|itipVb93-P# z(rR&SH~JD_oiMfEoX){?+p-nfvNgX3Uj)pv1uw!5xUM7!FYaFej~NwF+Fa46h_D?f z0kr?qKmG-!92*u1O;!xHsce?XHZK!7NUPs*++DttaKjO-!Gw?O2cK*hL}?E#t! zndr3}b4z)}B9@dKt!Q>WX@KmSc>wk1agVAY^PM(OXZ4h7?R9 zlEL!@;3YC0pAIU&?S&}5|A<}(Pm(hcA$8@4y&$^L?3_`LpQr#0-QL` z$+Oz2^T3~KSliJ>ZIrl9K*;1+s3%Bb!1+@e$yJPx@sNJZ-f;0e_MN&sK!TnwIo$y^ ziG3SVKC63OmnulZN>1=4?e@>$Y`4R#eV0w5w@U+!sJW$3)O~szqxw{zg+BX!l1fP*76Nbv;I8Mw0 zqQJdrwQX%XI&HNh%r>@^Jd+z_$MMCbu5I`9RRj3bvssRyeLzmU(JRPGqE0JIl;~WM zA^~dhmniSC`?D1$>M4De9WZtVQnRQvIDj`Z)k8xX#D8tov0DYzAgY4^Kl0HG!rkUH z;E?cx$W~BZ`Zh+C1sAGDeP)mR$!>Prja|s_1+DonZY0pT%t3vKmZ#-WR_{9!sB?oR z4x*id)LlvvEi;*)Q6aV$H0_vg;R1!QDFp@YunvR+lS_UXgTG_Ax-o!s4crKE-p@8& zy!3sq0rkNolipmJo=PGMD{?gi_AgO_w>e8OiZ25#5BD$)5ifBa~J^~zo=%UtiyYY@2g0{Z|h)&XTcEUhs0pXpVz@du|eY;&9pn8*@ zgV2Fvt~z*6t=(~USH;a`qEMw~pDz{|I}Bzh=mqx8I0)!4qPS7ULqeMZ^RPoIIy^ut z2nu~C{`5cSHb(^HtK+R1@Hgetb1pNt=%rzal!l+4AqcxcgJF|*2L#xOfNYG5dlBjNKla(a1l>X2C;_#6D>xvB_N&alxUSbuAROaHOe#^pW2bi$^w^f< zd?mRtK$3ItVn$1{qBy3xoQtee+#+@dV6Nr|C;?4?!;1tNE15Zzs1^vc3aG(JxzJ2!#U(9PB{JI zJr05e!n{^SIZ7tVmo_TgIN6u>f&HIcGP>Bjy&Eq@ta)^(1-u6hTl9hEsC+J&E~!T> zvFB|LKr?$lfE&w7)(`fPxl~2sR4W+*dUm;8sBM;zx^`Ya@e<9Am z5LQJXCM=F4qyhx+OgVe~X zv|SE5v5Md5Q$?WUNEb_bVhxDxV27*mWvN3R?Xg8@o~6UVwl8jpq14vXjE=j+L9Jtl zJM`AB7iJeRreNgZ0f;aK_uYA8W3gD@RQ{Hwbg-VHj&apUaKjPAY^|o z>!rL5n#A@>+!Sr-Nx4XnYe_v$%ZYH{jzxg$3w7bo#;l?806##$zu`XHOo)rq?L!#L zf&uxaMPnoN9<-P(*<0{doEd9dB*OqdEKIX{wZ4y4+&gc&v9eH?X~e zwh0joc>HvnddG*n;GPzhh+Jp+FG2%6#!Lttg#1v>9Oni(fKF;$3lvxy2d{K-nIV3X zLI31&@oz#XAG9NvVv6y;8o%N^+<>oOuQLWj+dWt|0h%I6Bg{P3a&SW*{$=9cOo@miUD|hTfpH^GNltCUd(mM$KNZU zVP9U?o%(aiDRHd8{ZrB>K?|?eDM99WlO<%TP%i~dd%C?XM-d|pT`KT?_n5+~JhLHb z|7W?gM5;K4$qc+PP+Uxo+9G12DkWWN^z4;L+&^7E&${hw^$X+B!nWb@FrMb z3D%>=p;WV?zNVk;y}sSd=Q$YkTpUGEML}?E<>KI*alWe%m)x%qV;If=t^hw$(%~m& z+P@u7w-4a_9!Xe<9Clhl;l5UrPKD5m+wKzytfE;q!XdHi%2pSwDqshoEK#cJ%D}>U}TNQHgBRaNY@dW z=-^#X+y7WKivCi(Ibyp9ExAO&MRZJ$n;hgS5#{TQlQ9hNKd3s5auZ){#87#n{wfr7uumE0zO{(*8hMa77CkTvyZ`iw_i|Ag!VPcM>*vV?N+{-KIgWM25DbQzosl+YB#64O%B`Ya8= z!hAL~Bu2;Nb-?loZL7`+J`ajm#%*;SIotgW?&qY*<_7RTRS%9npKU0tIA{lUtY~8P zhNPv%Skv&g$Lc8Bi$vZK2e*MpQB|9JJ(?{R5BET05`{^*q@w%QyB_d>1gq^UYK*@U z{4VSph=#4*u7Mfjshp!%hnsIiw5_^@0|04?L7W&YQ5x%p8_eXAgj5i4c`a61>>J93 z*-~!ebu_=>5R=MMfPk<2(-frufzHT4z|wKcN5}n!vrX0iaK69F56n2hlrV}et5FH> zi;b8_Z=;W{x=exT16!b;zWIN?SvhVHKokiJBul5lE&peH9y2m}GEoZBv5g&or=o?&ZcIx9NWK|xSJ0V4Z|yo}YOnn-(UCo>qJUNc z0>gYIgyhYPiuvA@5qIn>H%GWCO6?Le?$U1Q9jYJY&-k{P$Fd3yFCexx?k?Iy6pPLc zlNB$ja4;&c(yl17IcVrvB2-uon(Sz3WMn4!@8BM4NxH5PpSacS{ZHXIT`*X{QS%xsCk2R(e_U8Eo3|Z?lue01N z9g|jIdkAvUV?wNNoi_T)L@ji`hcoQ>XqZgl)n(OsxCfG%krDQuAK1lSUqe6hf<(In?`V?H6QL8rTvbN*ReD&kqoDqMd~SO&-o=p?fKvhztb_Wd|#T7V-)~R@LrrZ>1X%$&w58eGgRKl-w?tb)!!yA zq{K>cFbiYxXFaq^vKY&)=hn)5y>|Y3@Oh9#YqHYvO&Cx|fIC^hI(qq!r6{pZ6vzBb z%USR2d&&E$D9B(^w-XcFDAKD!^(_A!^u!no1Op0uxn6Q~&*%GvYEMzmB8Crm-9+sk@$IVgX!S>#^lSD5S~z<5w@);f$mm79 zj{mH8q$R*e3>1POly^6csbHecMMOD_r4pHS6DPfte#wnL5Bym+-QGEDI8qG7w}I&Ye#`b2uAc|5xTBknDG*B9E2QX?NLlSIfNOjL+ zy^+FMHyxe!0??O4DQ+POlykUb(Q97vSa`>hSY))2#!Q%RnMVSEgL_+gI{84#^*+9EC@07MFxz!{DcjY$e~CK6lMO zR5Cz@#fSaTh_YY!XMRt^89E^17Br^b^Og=cJmVj>XdDr@OiU_sl_UAhuOsR;j>BtA zT{d#4ewwkb&Sag1kOZ#r%oL zN$+}z&lF6op;lrC9!TI`DfH1U9>^1Cpvf`Mt!;-eIuJ6uTnQZ`#T1gxghkfY?g@MR zmLB8wX5?+D0odo&kOc3_d|lQtVy>@F4HSkfIt~Ph^4K8| zx6I>RC8Gmym)!7PJptaqQomml>Us4uKNo6eD*Cq5eQ<67rdIB?` zCx3@4i5ek`SZR^?7!F}1ju=WR)k^|Ob22bU_Ubz9eGlRMY%gRP4IWS28VmOfEJHtl zAvd7aRjLBasv0O4soCAbRVl|=bR`s66uD*{ZOh#y&qf5FGKz>ch_L}Uq3AD{W5T!ME<#z*7U6cU(nq(A*T?$4x@FsM(z z<+lnJLQQ+FFGETdR+2JBjB>>1Vx=A@!?=nBK%z{|yYr8su~o^d^?C1iP4%mkIg>hs z7gDGm5)r(T2GB$*>+Zp-*j^U)HKQ|`eO8Mug<=Z8Hk(qkafKN> zzy-Vse?K`c3ByxHZ?ZMJbP@d75S~5jfYCX(G}K-htUU)#qWOE#$K?9vDrMoCxdaw)dlMsex%2j<8&TVI}}9FVI%{HoALur4w)|G8fIB6TcGf~3gC4S zo9Nqe(zHHIJ}fT@Dlic{j++yY6qJkrrOV|*c2FjE6dQ(#lvwve2XFIK0)Wa6QP!o| z;hM~$`T3AcX!ib4i2q|khY=9QTg1KCA5V9ZJ4QjAi4@kbhKe@4iMtEojBMU030bi}FxVL|LazeSH#+@*%o=iAf zNLFk!0H6+#eSXJTGDoY2nzSw-dpiNR)W{l+e=k3CA>3xpx_E(d1IcK7Gs4~2q=S=% z0WsEk+9DUXm2NC^$V!X9W+ne$%* zt(FJcDgQ>ujg%GlR|^t!r`JX-lB2a>V5xfkIq3h9H&7^4kP1xRUqcm8Sf|`BCm9;% zsw~fsw4yE2N^07zE*cju#OO{3KehTOIPBj(Wp=nW6twg4R+)V#Ta)ZY?F6tU3mnSK zm}80J+Gy{QQMJ=@bZ7$TU@0;8)$BeVhHy=?X#b0(WL*mIn2QQYK6ZI@w!kqQt{PNc zAmszLYb%I=4u$=nWcW$yx8`phUaw3~^N(QGzO-BHN60cqS{ld5Hx(yBK#!*7cu4~L zxE~o?s&lMs%Jn9~{awy;^rsU!@o}>|Yq=v`qjt-@WiM~}oZDs~2-Y>PLx}G_jK=Wx zaK7cjS4eSjd+>c?SBWiC_2s&wH8YY)Agrtu$T>XYR;`EgO@Db|pIC3%y_t1`x&7=%LHN@&NEY z9x1DRvLi4QydsjM7;BZhQTx=@fNU*P&m|l(ki-Y=GSH_6^ZWQ@{qV^qpc}+Cq;&6m z1S;Gh)sTuz*6ovZO&BTpQ+|9h>~sn#Wc+Mg0HsZ64~^jUb^xHAWmOtb`&^S!+;`FD zZL~1v<6PHYP%}Xm+S^B6Q;2}|(Lm;bRKu%cy7({vwS=}mOd^%O~SJ}aY8;4V&* zfgmcAObaLNes4#u)=#T-**sXeQdbdnVLmMAib78vUyH8>nbjhAk`_mNua;TuKq{;- zp+&oNKqD+_R8oK^Kz3L&OQx7uIweq)F97|_XYv+^Rxndo&V=D-fO9>#Z{T%B@9Lq9 z3AGV$+Kt1w<|t>SIEWqO+?M6r@7;#Ippei}7r@e$1{);5DYKFoQhBX*CIDSYKDG-? zrCjfhQz3VnD$xF#IIwYqX9s+n+iSJ6!VQ2GQc;T=7HfU}+obf(O9bGOwue2KQB;FT zt?O$>6wfX$Vs8u?SZyDUioc<|uI&f%9`FTXPU$iK0)5B{_(Us9T$UbhZ)Mv$ClXir+G(qlpGhLh4HCFz8a?WK z9f7l~W*>CtJ9f(GCV3;277#3OME+M9V^tdlmF#{ZUVn_+INt4WyhSOm6V|G|Iu}}v zi2fy{EE}3B(_xgrhXPs{P@LYuq$+fMs+={n{3K*Nw`Og^xzDnMBxFootvd|d6Vlv? zH&WZ{7!?U3;j`k_&o)OEf#3@)61$l!1j9NfISm*|H)CSbp_+G7?-sFW?hO>n` z?AnuPu?m~RRHs!(Kp;9!2Hg-|XzypM*>2S;6_D}z!4Ona!?kdu;;k_T(c8S6dW-QEISs{uiq@vYMy$i{2{OdSER|b0z>k6xeQImAcW`QAw#Zkp}&@Tbz zSo{ohs9OIA;`EE*J?^@=(V$G_1r_s+#^<9mI=5strkt`nx3@jZKN!kBe=(z-Lt~&o zx4^}Z`lSOXOVlu2;0h%paaI^i#8)z8q2|vFpXFjz8VkN1cg*D33D&w1RV`3zeYZA{ zr?aG?Hq!Zb1$XW!1Ffhu_ql=Ea9<8+97u{~FwD~nEvPgNbEiQFct70a;l6}1Y@-w= z9jGBTw|A4<5Nx7A_o-&LL$RB50O~JXK+lJ>pL}|gwC%{VFgC4@C1yI-C8#eD-Ws{{ zRCJA|q&1(@Hv&0}eKN0sexX6r)JfQCwRD<0P zDgmKt-y@cON3L#qCaJnk5uNJ_J=K0po@qQ6%l+^g>i&MRB->%x^u?B3(im5PLf8N~AM#2S`j7w)4!;&N=j)r*dfXtu zdGUmy)zbXN0g{6z0pst*U$?x3L<#sddWx4M-)*rL4o`-x4n(#{_aO9LspXO{Ltk!! zb(u2a>7c^#?!06L?@u;PPlf~?tzk)zIjlX?2em68G4EQH{{XEC_`t#r6YD%;L7L|=F3?+{BiM%v(tkN>@>~g<2dRLMiV9yVES4bTWyVg z8Z4?H5cC}*S#U%v2isueT~mVuOpn4l3Gh(>TVRP)XK{rQ`-d?GjW|sA`NFoIIRJ!q z3q_#%=;HaaL9_wxV7F?_n^udnx}_2bAlFAvMp*-&?Gr5q+h@pq9B`p)1<^+9@&iiC z5PbX<(+YwRlj#)ipA9AOa##%NA4DPgk8#U>q5oU3$wBC1v~`1GxGuZwfe%W~&&A+w zq;D5rG;soiAueD~dk_aE$G88D<4$wm7@AM^cW7i?j>z{%i-$)8a*s_J`l?83_!K>$ z1XR%w!57W@)-=E-ZNiFr<8v|6@J~f?ZH~zCiCEIO^$q$|SlFS(HGZPYpy$wJC`##> zfAZpe)_x(oDx73Oc?<<*_l-dK9;bF%sGuzh%Lpc6e(uK+4(}1%10ygz6%;&-{17TP8F?ndHt$uSYxb2W`uW#E%egOxrs}gKPViTnlTEkD~v)z)if( zf7_pDGEryv7oU@10aPTg6Tfh^%StIz(XICnF)94 zI@NY01{nP)yV2E%;XF@3^C0AFNUz1xDTL4-$1oc3T=%gCxXbwxI`!q2w#O5JUm&o3~C@;fZ0JaeVr~2H6~g zgunSvBC$#MLldPe3G9f4K|-kk#uS)^$HWpOAgg_*#vlxWNMCsQI3|B`)KSBQ1mlyv zh9tZ6*2pc(W3mUJ>KGuwl`$F;)1~;d^gW#*#+ zJ-Q`BF)x`Ekn1hA8sCGxvwVoy7S5&alnEPJ8G646YNgRQywHDTkA9Y zM_>VTmNMULwC##bca{kX8pBTGV^tE9Xq z_`BHWI%_1A_F^$b9DS7dBsZL`rV?oz+(4xEe4;TxBBByXUYT90tzy=fBo=X9tv4X1 zX48Lq{`Mqe&O}d~A(v|;48%`q2_n9_@R@LNnNAJ-I1osAin8YerBg*lVxE8;bJ;aE za)KGYETpoSoNE9}4>c?L807{ty5O@J?88?d*K!zcTk;#4J`Nzvi7X5I__3_OGOz)J zbhzb#K;07`OVR;#l+U!M;yxtybeVmN4?)0bl33n~aNGo3wahU&Zcj{KJz*7T^{|&w zCr@tK!rg-oVSsqqqYqAyd_pZgAvJj!@)r^ateomzoNY00wf-SGtdOg2dDV^QpV< z5I#Wn!uyc0{BY^mE}c*mwc)>Je~AeD6}UWE9x4w5i9F*8qi$Cq_?Lu;&CSZWvg-oC zm^@sW|1bGKRWe5R|JlSP=+_gl8pZ!CTOWi;)}vv{ZI=MaIT`G>5Uw0Zp1EU~cMn#K z$xhe``loc!?IJ-{EO?(^`eb8Lx0Jph$Qf>yJb+|z^l;)pB143VZQ&Zuh|0sut-{2N zdlE8BKSW}Da&c_{c8{Q!qv4}4^4Lzn!g3_HoiqBqJqkte$gl7jI87!o02rJyFmAtF{C_E*K*K&Ik7iT=9_YshQkvFr->Cxe}K)DEXY5~tQa zUns*BRiV8w?nM1@IG+>pLPV}M3cT{1xmr4O_I+(d83g0&v}!W?X5j6pZ0(|{yHo=| z#=I2Rb$OcOK?UlcN}1I2JxN7)z?PdXuMKAiM?*Zwa(72{az0YWpg{d%XpC@(T6B)4 zlJz2?7`L{B2A`0W=RJ2XdNGybm)I`4+z+=7B2D9OiAPMB(#7Ism+gEX+FV1**W$4Y zBG|zjTz5TcSQVcd#^H#H2XFv_Ee)vz``opX@5I6^uP;oF-8CZZDn=u$@$j=HF+5Bb ziWE^K&ZbtdcYIK24wB+Q4r_a<)6|sU9zxBxzDS;DyniI;x%7xZGjvBXBm^1p1-GK3 zyC4W|^n?&nvRUp=W?|qH#x3e$SF@9L?MiP5B2bl3(*UIITJI4WJpPAWt})Lp#ry?L z15I0oOeChs?Sq&eqB|F)1Rr-TgBO7G`x@KyX+b>CLSplhz_`4PUE&d@oNW<%fuLkJ z?+T>>XaTV3+IYUka>}xxyI(R384cuZHdZ90U&)1ga!nz`JPMNqq;sAbe~pK=Xsv_Y z!^kZqx3z3pE)H{Q5adm>h)WX9m&VvArsrDeuoghW!HC=bcUYgGk}ohrVQ#>u^Xw6L zN{|I+v$y+ND}3J7aCj`G;6h6R2L7M1Gr^Xd*OByAyn**0&cpsU*7!n6Fez6jUEQY! zKl|!RqDUYRL-0_Ah6Kf4O4zFa+b|p!$Oz-{mX{JLUY0$+vi3ZR%C)Clv#%~wa-xSE2-^k z6QNeMd`90Y~eEMeaKkNT2mMxIAYA-`FqSFW+G zk*;V6T0Nit7Xkm&#Ss6uYnO_T0g!43Q#kCVkRje^odkuz?T4^8SLjUD3CT$cBcw0g zBYwpoxge=S9HSQc&%*2Tb=s|FcMF?Lx>yw>_5x(>?9&RLT8b(uRFH^a!4Y8g(j}= z$xKU>5O&s5hrIjGE5J`YUx~PA6Q1L%BuR;#vEQ-%*a0(osE=9}R>^TSUd3fe5+1^s z6aHu~p5={!AsOEjBgyuareiG{g(f12_HsZ23%h|7*aV{uC`4IpWjiBxq?o|cWoPKx z5h~D~=<-yLCCP974=Ra4MM3r*LqNYdC4aY#iF82?vLId7% z3%cCgpjnX-1?f>Dkoa*!f-Pj>fysY*_1EQYeVb-`hM)t#rA6d{yN_8U;u${hwNCg# z3r7*Xcs=SzBHymzHgaO&)>8jUSR<(!CpoJcO<+x>D7&)F=WMd)KLo-7b3mh0t9i2}W!3K>4@ ziH9qrxBUL(Fc-kHWXz90oWAdgb4zBeV?5{${Y0#43#1R|`0=zH$@4}^WNRqIzXYwb zy(q!5@TY4SkF*6a$tIv8JH#*P5ND%*yo;q(o)#_nzJf>DylCe`7Xfnm$RsnB>A3a5 zJ00H%)o5gH6i6jGq1L2wby*UL=#YsCl&*`ijqOg5aX$v;b+q)JVb{yV9O_5Kn#M{g zS6}b}4BP(+pPx|b>TcIyMJ7HqX4vO+(oXuD4jgxfiE}irm(BtMPKNGCdQb~)Tc7M> zr%Dd8kg6vM5>JgQ?S?NKGYrUo+1(q_qSJ?ne>hygj028BZb|1Vt)3@bnRgu^o-|~K za!}7rC&js5>Wf*I7Y~mTu|Lt68CWa4I^X-?bzoBzvL?DcY-c$_8=@knkWc!y49}m@ zLz5cjb+x-(nkaefd)cCzbJ8R8w8Eb=>F{v|BY?*)Rq0ye_yFSFelX1I?gN`XR7Hn9afY4ydrD8YOTU>h zD%eJE1BD#J2dt%QTX`aohIz-}Ky{qFWBAM0uZ=z$_uruk#2as`b?jiX*M|9yzcl4| z*qMN?-VUknGl0qS-JqajL7YFP?W+iy=nu0JpBTwH9LXHc-dJTn`A&s@`tE*ha(HVL zYz3}d+IfPUdT`(fKlNSG_W!AT#mKqv>bvh>cIwIjBH}|Scn(S8c*7W{b69VeRT&?1DZf+yCU~a#LyB%@{|uB#Zi0m(#x4dnR+wUh*rbohjS=Sxr)N zS23VCwQAS{bb^;NCqrI|wTks+!i;+hRHpi3!pAGu)6OgW{)_F3(PtVIk?__7?BnPa z7m<9Dj9}=o2+5nloo^R|W!5-Gsifi;gWEPq`a;N2ezaL7qV9T7t}pYSO)Tw~i?LY+ zYT|+ifEytU0*zIiD(H3Fw^xX)*uesAgzuLIv-_SnSvW_nA!GU1w2vC>deJqK)!@7F zpcA*V&bmk3`;Jo^q0-e26K-))q8L)D&4(z*XC{T#Eq?VNy6HRgmSriwle+t zz=N!i-|Rga*u|872HD;=lvCIN@v*3@!@DuP+v~!kw{1P*E0K1SPoPf(K<|QI9l*Bd z%h+g=Y;^+IYFclNX<7!ub)j8*iM^9RocsmXjk2v&xsvJ~{HmJSh&s z8l!IJ(%mOI>mx|lUAa6wbg4hevV)QvrrjN10!)DL^&sctWo>Jyr}27_tzPbJqOK*} zD?G8(>jQ_d-QXnKKAJYEsrJW0KrHW6U-x$Z1PIl$o!(wOS&z>5hhvY|o3!U~6O9_4 zzfD9}_mT8_>o?7i9c{GR8Rrj1&MpWc2G!n9<2P~3b1WXni^qV_c7^`ENTA)_zPC(_ z1jIKO3ERV>i&s6QDT~27Q+R91ek!aLd%iDFt>-)2qR_peaJ7?rgz0-_mHLAYCpL$A z0bG;zR#|tH_xCn#kCLDsTkzIpI6=k?x6^12Bs+4d^@p%ghZ>tneM5LUmNrF98e@FniBYL ziw=fmU6-5893tT~Unqp$@XfQUoI%I*IOWD%Av3ySbe!N5I&l$~GW!;%q7Cx0u;>zT zzyME71rCxmETpTK5w0q>NMeMdJ-cT{cN{dVT+qZ|ew}f+o?>dv>;Aqs5aUZ=DE`!_ zO3LFM;Z>ga(DvCe6>dB157xg#R2Zt(aPV5KcDpgU?TvS&*aO2UH?wP`J28@?gpMBg zg8zOM^_s-zHjW-AT)~PY z)Bl5Fo;kO{n`=MJcR2U%nR`^jQ3Z@Gvbj@w7#*5gBZ2#ch&z`_^s`l0thb77@*%`=$cr z$#MrMChr^;O^%cL(pkPAB;fkhg0@BG>f5q_U@rM)b+&dmiIt@!*_Q zZ1sEj1LQ?9g1#aj>05SZcc|Rn7F87{t+6_-yK76zkM^&OeP=2K6S13PyCQ!sc4ym7 z1jMMN$s}~mGz>_M;s|GqP85^0%r;W;LTj$C$9SEBLEH+$BRNUkKUawY_ylIf^>|N; zMwO;{Dzxf5RS$;d?X=FhDn0W#^PScW!XxPc%B2N**~I`qqr8hr>KX6!i7Rpky*@t@ z#^iNA9t#ZiCYH}k9)btMCw3+Tiwsr|P_p1*(J$tkSQ7`@ zh%N`uo}nE&gYpkZLI56PcZH7ZcoWHh5&~e--GgV_2Z*AIA+iPX4BEe)@bAZ3t^Sz76g6@j$+W%T{wZ*cce>o4L(->kO<^5%2 zK+0&U;Kx=DS{2NRYs_lJ2#48IEZP%2V2M~I+yBv=EcLdXqUa*+C=^>V)PtYH8@<81 zyw>48{eSP-5VaEthmUWLa|ed#{GyPwh2dlYTJp(GjcZ;ErY*A~Y`}6NqPE4H52-Vw0Tx1;hmDd{EseP$8?F$dO6Mvall5SSi0E`790M(DR`t4D{^ui{D zTGPV8+f;Z+s0o^#W(i(TbPxhPJ& z)7Ep;>`SJVj@b=9Fydztsn`ea4)>LI2jvrnH&gp@i`$!(sVm-ZG#?+zTGF`ei7d~s zRom;<+U3@)z-c%;OniE)tD_o`mdNU?A&5&`oB)^cVkX6g>Cx+@<$PNq%moL(G2vok z`b&#!x^v*4TfZUjxLlNW)X`Xa;B`cFRiN8P%09NQ|V7hj9`=H~hco5ArHR z%;IQ3vK(x*4xWu7-&K6Attg4>-WWOJ$bgo7WtFZ2JKyUp`)8Q0wvTJYDn=$ye3heP zjy@sf*S8&-^F3j#cxZ??nXcPN%TEF(302j#Hj`l3#7^9Z!S*GoM5&G`n}SPTOY&+_ zQxMlgRQ5R`l4# zepw=rNYmjqlk(+;#3(%>ztfFkqw;xaWE5b`P@ibV_m`b-kY{K71N~AG*|rr@8d(zW z()a3Dz;(nd9=ct5pP}XY&fs-1=Y^aV%a%yRsJP*b|IcEqMDkGSyk-1$D79hI%s=C2 zb{`W8Sm^9fpdG6=E*#ZObvXV_pNmxmX*7UD4yN!{^J_W&!n5#+k76&Of2@1gibd)v z0M_O)M~zUpjN&@U+u-{_wmTu2w#+IIHdjpjj8K>OCW3V^M9s-2aNb$#H`ph_ zAHmRX5D?%~8l|5!f_A6Y#M+E$3+?bEo!Q56erNZ0X4N->vo2`ecm9HA%8pfJj%mp$ z?P68teMQ!)OGWEG0VlR-?EjC2_;7%dAwGann#UsgbG%|% zK?z7`uWY-B!*+3BG+H38XyMjp02JmiypS{A8BfGr&Y4v@-!fn*99IEUfh_ELen$v)hAI z>JOtBV+O9+&*^lv|;w{+nPHZ9~smjMIM@JwB zJ3$~o49Mgt4+tFKLH=4IGBgA2c?w}qW2?k&1=-fby01m2MrIjRr*oJ-Njz4~{Jt1j zVO?@!Vpg0uOF|g5Ht6qj+gvGy*$!%^p^m}$#cHU(mq>$)6o*DyJv-I2iG)jrA9kY2 z?+jCC*iucJ#re8eyufs&%S)f;)@rn!UWY9h;(}(^4BhcZ=xqgkEdKjzneIEwm&Fft zlWLAHZA%b41IUINKFXG3gT??eksuWU{*J}p?n!JJ84}HEm6UgEUTJ2SNPz$a-W#+rx5h>xnJGmwNNzy zcP6AkdtlB06yeOozH3ykA33o(1<`=b1IJ>BQz%4!DzAoicw#hXcI8zbdC0E=AC>5- zw@lZ$Jtnnjl?PwY>OHCtP9;;*LE_uasliLp?wNGevgl<@gD~z21P|%cejRG%@?FcX zFv%^HvGQ7w)*z9&YzrTIY==as46r)K9cmc^eI067f+su?ad2U`G#7+ebBaG}p~lZC zcyUbRTt{6~vF(Vj>fj!q0llq)Om(@AyVTKk5M06N-)r}t7b1LFY9?@<4?Y6 z*M>M?Srh=@^{Z4#MSd&J?vYIx7QO|~o)peYl|L6RRvHB=rip7}*zzvO0O(LEMn(=y z!y)Y?{)v@gAi)@Us8RMZj)s~U8Wt+4gncP}TrCG>&7G?-TrOob8S0q^ z?wg#{Mg>%WH=*w=txOUtjSNgX9>`Nk=cU^32Pl!%fDL5(`SK58_a)2%;sksG?{Gi) zn|xOGi=^}0D)aYU1(X*W&P`%Vb~XX>g$!FS_Z37U_Ct`dvr@cIlC~YIzgHlWQn-E$ z);SElFr8!-FcqiJIbZ_t{6NNUd#%8FTY+@P7@d**8|rpQiWp2H*|)FOS0I8zoEO4C zSM%DO@}Hk`>hbL3@d*s=)xChh04g?5!!1_r0peTEScDC^^?F{aTrOps>mcBm7}q6s zWdKj&-xJqG1m3z7>UyTs8HDS-C2qO#vdByqg zalpyq_oavvW2DsSP>M^TNu`J)Au+p1evo9Wwlc^aF?Hc}8js5u%l=_xO%JHI)g?zs zfIE%^*y#GHg`+NQIz&?I*~{xR?w1=Igw1d^!Z~ywfPzO)Qwn#e#X$%X_muI60c{RP zQByB46?zqm*=7BtvcC)qLcu=C`nwRL>i; z^6gI^KilR+o>ZcO(s0ae6aYTR=R!czx?_Dg60c=jS#iPE;{H)%{b}R3J1(p$orLwv zzN$i=um#${O~;3wj1ru=*%La9eCM=WN_S=>$$MBnS9XwHUuW1?WQEFjudD;5F*D=< z2nYhmStCFjOgMIk(6HYw& zt0A=a5^Vos*Z5(bC>zGoS#lCI(~f`U(u6I)JqClGc=;G;@B5E(e%;UX6sV zU*#3}4c-OBU^k~*q1uCE&~YtW+H~4qFj|~NC|*weEPwAdR4pPU<;1Mma%_1C zKS&h%PTV9;Wy*Ki_V0P_$mJg>`%-d3?LZ*!;z+2rI08hua66R@tfeBCv_`R&dHPo6 zaNR_p2u(&)wC&sHl~4eg8QZzZp0*YwEC=D^lE58HAFHrGB=G$rov7WHXgw`-qgcDXC2Io=+E6qh4#?f%46cy4!LH?nyrFtrxh@rhaNSrM(bZ3&wM!U|@ zq~V7mL#_Q-53&=iqXLa2+xQ+*#LKLQeC9y5J!zfWN2*EKSp;_5H|!&`#>|4b0l{{$ zo^LJP#cz=1ak_(6(5mZoMLA)R9OaF>_AI+yvK#3;dPsjclU{jHunM7^;}wLj%T5}z z8USN{MPm4DDJm{2D$=JOj0u#S<4?NexH0vBAcHAg?;dMn`=IiG1I7`d?^Qx=Fef^y z#rOF@-u5WlHE00}zAUIG)^uKNaq@IgLa6!U2IC-XWH6dOQ+%z-mRXZOiFpt=8ydRY zS6Xd{(E{NSN@HX~`~?dK4K_%rkNM4SPdAFAZHBg}VJl2h_>!Nb1HX32mff@5(tjEp z*m@0AVCUD(y`{_dmM}`AKW_wk#~pnW>0y#4Ce3BtQ&ke!8U6?9;O^u3RQ}kz`_%$q zx&?ohvMM-rIik9z_l3?peBbv9mV@|g?0;7FKIB7q|30o9`(ii4a*mEEV4vZ?!V-y;|&&MdjL_jrd4+!@vH*ITFbWG%- z_@q^_R(Z0+AR&ilyzVUa%bj(631yr?MU|aYW1kVdKJA%x#mV29uq*{a#dehaJjQgn zGb9sON+@AxMCVfiV~|i6kr_CpOj6g1GQCbWTiACtZg&oP7MH3VdYq?{#d;9_?s-+cVeXhMCvvf9;_FHYiB9yc$zv)|y(s@a~Eigt+Q=Ega; zD^mxswao6Tv7?T$hmp{SrFi-%m;4VQI}?!`aotu3xL6m0TEnopYby!9IU*;h3=~@K zt-g5l_p2q1v+M}7HCa4?ora8TghG=)roT0yWybM|4D$JYkmd3qkvGG{2P|;Ki_D`K z7fzPsNRAFNqc1XWfF7Ik>(;JykG*l!Uf>6I1&?7W=$a74jVjij4`rmy#DEN>|6swk zSpPw1#K?Psq>i$M!B&n&&S?_oyC2p#1gC^jI+Emkrc>Mg*l)`}gYseA40h{AbZq;$ zyAY>LB)#t<40myEWcKw|HRYQW6Sp1mogl@v?5aLkP>@4N1tS*58(&OA5OM{?)`yA& z5lQ~-)F5|CaI@eZY0!J|MngD2ypwYZh=Io#0?JT*Es!YFi{DQ%J$HZzxr9ARQ&0!F z(B$=|v}(sJ3pwNgDZgsRDDRNVDBiOMEyC`6YhfF{WEJ2k>nh6OC_5J~+XX-=1nA z)(H%@=uXMppjM`-1WxZHZw}wZ_uK3PO$I zKf$rmcdLN|8CEMq&Ay_#tg_}}znr&-$hCD0(J0rvM_oha+Ff=)PM9FC0Q1C*&MEZs zh{5J7UpzwyDth$oV{5BLo2xM0cT)>?UK$e&s=3b(`MTD;Z69{L(^xl!nzZVGV1rZ) z!NCe}pA}-v1L2DCO>gJ5h|9R|`8e6rBO@dkZOc8aTx{h05kxjuULqB3Cd(IV!TyB^ z{!jF-es#?u%?Bt1P8|5A$2maXA;hzn{!IwM{Q8N&ZYjLzUG2&e?V1fEy|Uwa!#%K3 zXsx+-lvR6n4I3PQ8KD2okiL#+z|xU5%TjvN=rKZPO3(QP&gxTM{+=!WNv~Cp;9=`m z@7XDWU@1Q-5}mph35@_nEedNYyXc{9l5ZvndEbLPE_XL_P3ZR<0eq$P%}***)d>?C zzBeac;g+ds9O{huzT90TfbDIACr0XxdwoF_L0fd?(L@yUXLLx$J4k2O8JLe;DX;j5zCNOit|&6CBx!~{djNBjEAXYt>PkY{kU97cY8?=tu6^J z;a~1(MraabYG&Ta4^+T3O4lee$@?rnq@{vZ0)SQILb=qHx$c)0C3wHRBUN5WQTospsXyEyJP@e0mw85 z*n$CxzaiAye&CdsfHobYyRDWI3*PrG=(V2p3SEo1UpzO)yJfh%(S(w!q% zQQQukg7H)T7AQOtmdTC%LXgLlNg#ku-45cF*jX8oYQ7QoT+jYC88%jJt^}v`C^@Gt zYh;Tq6(h4KK_0kKE>$ywL})*Xsx|u99^RLmx0}OF%(g^)<8iWI zSIe;VB7|+mK?{}W$r>R|C~@sDI;pb#!Zi*LHi!)!dcIYeSiM}}%phaLb;)N#wvQnW zX)yOi`18(u^>4Bu#c2{B|?3H;f!U382e{Aq=_`o;8 z8D`ODW%`_nAM-x(B`ZoIOUBx5d)g?Rlp>6?a;yV%;t2$XO*ym}t}8z---D6RQ!Aky zuh>?04h{Ff7!8DStTq@KHfFxyVDv!l?Zrb`wd>G6pum;tW5K^6p;iruBei`E2`{XnW9$aExEM6HvRH*(-*W= zrfu;-Ua_7InLrE_JB8@miMoTd8rYTvy+VB-Xk%WEn8}Q?au@On^e|QyjxBU{nYnVo zq^-1zOiee*33=b!?MZ5I7;$MpJ>{PHpq{y@5Fr5E=gZ)v(7W?v#Qv^C>g8&R;U&)# zZqHKKHB6x?gP0;>>^}TSf=$WA8-vpG_$>J@&cv3O5(hebOHTU1asp0dh~fwMXcUto zq|?Y+sb2S+w!3DxOSaPUV~+973?ugPk~l~R~V zp!&OBz4aNe$;3Gp{FmGUgR})q($sE5hY~`9H*1GGaN0PohQG(nhLpV#PmLt#YA(O` z%pQxn6QjxI(y>I0X~XlH?4a`U_bByYfNam=BKu_PLnw6?5{pqaHkTQ=Pa89&qk8+RLeCo zu5~OF7A3^Uh`9EQSU?X1^{xE!(InOo&Iqa1PR6vajV$;u!NylHN4_KOL2O*?dE;ch zp{TracEPZ4&FKofcY|CQ92jDV$Q!H6QS5hvcL*;#A4DVOr1RpDIG9RxNJ5=;=+q8S zZD>-kg2pBY+vCN<1^Lq0J=>~-+ST^D$!7plow=-ylQw1T!ICCVYN6Ke_%yGMzyLzL;42rR)waW9nHxSqR zuFNnD7yU`8>iZ?PTyZ4jxjMIE$1$)WiMkcL0BQhi1{jZ>__ z`*}4QMmwAN5!TEixbg4Xo@_+4+2QT@ajI}W%r>Bbp1TR!!Oqow77IXF_Pc7YUqol1 zdAuv&7~=Hm+ew347@H2%wwXD8IX%i>jSeROsXz&pgyV#;1>01-Q>lx!3#ur_ofR!o zgNJt|)UU?n*olE%Yij;QT(<{9h9O2N&4qiBNJ9n>g9*<#3LzY2!^Ie*GD;(J##SdD z+YXx8xk5;)VttAO8K`;`PFwgO=lcs!H~(6&f(Q>zCZ(=QWSYZ9f`9oU(h$4YXtOxd z8JDH^i<>`RocbyfT2PRYvC+I@X7EO9g{SkLEGDdc6wAN?_%4L55&-#dNRW+Lx)axV zEcWvfFmu>eMfR7GBSS_d45hwUepib|CM57;Dh_R_IHwT(Na8_xeEy( z_Se0oyL}Li6MGSKEoZ06vJD$15~${$K#Sj(U@(%h)n9PeJ(CGBFDdF&H#xeiiOAMf zb!?{#Uc`v1I%q;0>o0x@$L|GCE}#lZ5Gi1~9$ds)zH<$*C~a3MQT{viePwLOx;^hGP(>l9~L>vrArg0{O_o2+XPY3+kzlKwtk6L8GkCM zIy#Cm8eUHcP9W9~f1PjjvTs2W*QNZ^=kxfq7v$EDV|angSXH3LHpaKm4pfmM=Rpp#Ta@nW$hqmz(QgW5)Nr zJxXDI^sJ*uF5T~{BwVfrZ>d70wyLr=4~Vo~f8eHz4--)!&MfKFXS5FFa+lZD;IIF@ zT12W3c_S&VXKV&9<36mbJAkX7Z2?DoTa93_`L+M2tFN+B-Ru$CXI# ztz51anK$$K!unrFCaWYX%M}q~T5bX;E)nRUV96p3y;n)U)UNzn-cMcn<*)P=EjA$FUgt9*PrK~8JOqXr>p}}%b;7M(%Y&n87^65#UYyE73 z6FUW}A*!|MhQP358rWWNdnojaC@HYeYDBu6-3IKZU z9!rB>iQJ(Kzu?q%+AeT;ij}N6S<}ctbn#sg&5|)_-x^WY$!!FbL@dE&h^N~Mch+u> z(Ltq%dij{#cOK*i0hY?5USHR;<_<+}OP*<=zziF3H_h(6n?YqibC}kftN|692 z>#9{QMJ@O!plV|Uo$|c4G8|D0J4o^lSx>oLz0HR!uVtr z1Ybg7l&!svP+Ga4SaMcniiJ1^E^*<3ogYg=x^)`3HEx<1#cd)YyltDjg(8d@*+zc7 zwxS0qbV4eIMJXX3%wA@|0d39NWxFBQ-T(`bT0#I0II zb`WKAS+OGa^s{KCfGRJBaMPD0M__~p*IKDZMjrQe-;X6doLFCpY`J%T1}s)QpgVDj zBu`=B(=^GznXe~#cgSI$N7!F`lB~9>0-D>vRj-i}ye)x=tf_K-Ec4y?)_Wmd@bU~| z%XFWTQYlAVS_zZhFe}EdkH$Lo@@i>H_=mgzMuSCyDV~k%v!_l3WSy74S zeR*B%@9lcBF=Gf=TJZb!ZPr_m^T}N-mc>921fZ#$b#0hizZ6>aD)0;nkEYc~(^YPi zXgn{gkD&>8OOG8R!|f!2etp@x)T{T;)c!ADp#(2+GpeHIeW?3OU(!_wHIn-wy$GkV z?QA#aL#)GC^)yMddUY(nz>1^~TGcv38MxRxgnwuqYI}DXF<-h2F~uWQIE9^)w-6dp zHrSp9H!~8y#CCe+C)$sRC(lZrQ#YsT(3Z%81v@t?l?4&oeyJR zuiyK3?ze3tS2IF;^oX-yGE)Y&@6!f?Gaf5nT@8@|0n(a^$ne@C{~<_D0|Sx`v0C2m z4KE48kcs~8ev+bxA=VsEqj@+9AQ`-yQ8AoEgn<=RcH_4WQ_YG5EDa!(ud~fw)Lyc9K?@JFS~5*k6Q1oxnnVJ<4%6QNpB;#IUU3 zZSOUdbPFRDPG9%arivoNa0r91*J;!4QBd%2tTx4=eC%FB)Z?l)4rajm;7Es`T`?y! z$Jc3-u3Pe);QNuVNb8z>QQC8qnSdA%HAU|=h@;Y+f$)s{y0UU>T%5Mujo*|B45BV0`vx%y&MTqLZY#s*B~U%u zu9@G~7U@3pf-q}!8m_nNv0%My+pFCtzKgjyplhpez+A^`x^M0FIz_L%4vZYQFF0mx z`Mp-zX$5JENQnG8MR8DKFXh0P<(v$)d7HyZG-Izjs@w2c4Nn)X1M2_ic`EY0?#m`xT!4U9ojN@&46)v-yEJI~fkeGsG zzc zbF_AdAo&cloo&AeX{eyoVGh(@-bh(7f*-!M@F6arf6Q7F>St7Tlb!kdXybIcxC3JQ z8)a!?^+k6LQBvf*Olo0K`R*TNP!6)KCG_rW?u!JIvLV=yfP(lH8Y3T3F=rhg3F<~Q z>*FD})A=xt+r7#AUd=N+SHCy#512kFqZ#ns$g|g-1w5JNdq_T^Skgy|HB9CZT_o2P67Ufv^3y;BG85Aw!dR*N& zo=p;yHn;78o2tkrKv_AS@_ZBW!!>Ai>7KZlBq}F?*>BIqp4`3ZEc5leZa4e%) zZsRX3zFs3fyU1q(=)T(Dp>l?dTS}w2T?Oo@NlZ({us;xMSkV`5Yerd9*r5{5tz8Aq^#~ zoG#G!0}R3B3(g;r2N;IwR#%Vq*VS%27lzz0I_-gi^t+^JK)(}nm*Q{wu51eu-?V{i z>qze>S#S4dKdL|gWY0)0wM;`W521+idnyH;Z$BxL{NpBJGo`9O%1N3)=4~>G+aH|V;c$B-`Rc{* zj@RynNF*yi)IV^(?6d(`ALde;_R)G?_}*?n~7!jLTj+Ril+cE2I@MS1-aQ@oZaG z3HxgQko8RH34Z3JdH7VS2RZ+fvxx(M!wG5@yVgkCCi$y;)kaxKoRx~C4Q*8DzICDR=bi}+@rH&&TEdP3GLplqWAFmdw92!`2h2O25dNF%;nrMwNGD4r2^I@0ctd)L)+*^di!al8!4eO!hn4SfoKL-dNOY=WIWO9cnoL8kc;x+Au}9B zm%Y&X4`JsZ1ccmRmgLh*$+DH+4Kh<4;!=vG=3`@?L;>4N%1!Cnp-w9!hhEVAa(GxU ze59%Hk+Zd<0IrOOwL!mjt{86WV>YJ*hKHYvTcBs)G~7I*LeHJG$Re5WcI{^$9I^Jo>L5A`Q(C{W~dof^GSqr4#Hhx{1v_-#%4@ADMHg7&CPkbutZ{~gCpxVT-ER$9= z+%J=0&?$G3f+zN&2WFx&?py(6n;E2{vw3(BEr70_np26-UI!)Bxk0VRe2ZoQgD#?3 zs}PGIaZDk+#$$c3NrE}x;Jqu8AVpo$u;Z^~5^vIKf+7O@GJ|zDu;Kq6H291N`ld;u zgMjy>z9_fXqYQVRB`5Oq&?vHezmes;oVh{h?f7<+W|DTvM`GL( zyHk%SxQGjVEL~qWN9OQ#`V2lpc`t^FLkpbW+~DZS+I1i!APi;vR&=(WqQUE6U8bf@ z8}amv85D|m77R2M^Gj321mC_ooPCq0f^1=3yC?XNQNrUSX?O3Ri96k z%3{}Kl5pNGboG9BaO~CU*c!|}e}>^#(GOwMU)+Cv(&muvLrPKYZ($vA0Kciw1?-i2 zG}1zOd19q9z}AF=+#M6LYGo?vbRa!AWex!K_elp#~Djy1E6AVE_kd$Azq{A{Kw!!bBiazNZ%g71OOp&3NTe zn9vODuF+nlRU#Ara#VMI%t^2UTVl#oX6sDu#Tb`D>a~YH1y}pyXCtqc&ck)RExN0$Nf=#$;A`(nKP_JeIafE zmy>dMyYj(}%LkY7*}}#c2jj&LM)BMMtjT~=zwdq}lMr@g9LJvCYVLTQ9x;#7-~$A7 zq&*o6lBWc`^7GgPE4oE1_^b{@wfwTI>X%+86%3LJqu)V4=n9n&{4}9y^s%kcY5DAP zN9NX!UWfN~=LNw=AoLeQgBg7@A?cD0yL6?6Id>8V_Nnx|dTM>dtGMzo?A5>z?j&}% zx>t$q8-&k9MC8eFQ6fkvcdM$=@>-MePE`w_t#&HgPRO{-o!GSfEnn|LF%kbw=)GRd6x<)Tdt4K~wT#C(dM?yYN@*gOMCE?)I6)@u9 z0u=IEr4qnw((63xEuJoZ?6ti(CgXa1i&X@VeKNPI4vUgREcqIXWp9)?dfK@grN#*3 zn`2V?Z}tGx6s9wZS(43amxGijLUnBC-r9SUELX5A&@`jR7E}G8$-o!|(Z!-C35r?Lc=_KA#DQ_)+43-a~uN|_-D8ffvrS5{2q>97%3#nFb?&OER?cYw7hB@4DBi{@G7&Kq@W z$S#H}D;l;wDJZ_>RLnwpzmf|v1SjMGBZIk(dcYV8u`C0tJy%vBQ(}xc@fvQ4=^&wf zcjXs31r=q-RES!xXR?|`85fF40ad_+8gbEDeC%0|aXMa>BxJa$8IgX0eBMxBGjD{$ z^I})kJ^{TAyRz(YK0xTU58G!*rclamFasta-fLs*p0)_rE7D)ZZ=Cvon6a`bVH!(S`8YzsAPJP91fQKbI$ zb>ARLz$CtF;$B=R2h;^Qn8U}ObM9W-6}8Q_!x2{ZVF>!yeMcze8lsqhgr`|^i8|J7 zSau-#uWm-Cz_m(`&wkKe;^S}=A5TWgkQS{%T;zMY8&njN*ui4;Y4RXL*in-?8R-Zw z8d6oV;3c5FSmS{2Y1^su%-5s>!Z>+^=~nF6+1NQ0e*QHOsPmGVNEgOOoGDLJ{i^KvqXJ?R zSIw=&H{4y{ z*%*-cE5~UEF#)7M{u9*v)2VR~rIF}Z^ESgg;sMINZG(mP1Wyi$q&%ORZwy%)oxeK> zHqqH}`RrB+}9L_bZc zimH6f{9@1Fl>rooz)Ask4G-LzqIJM1;2vxDz#Xt)CYD8{tRrxTrtP;wG+-taY?*+z z^|4`s3Xs8n9H$%Bww`1ahXSqVS0xDt?d}VQnead;OJc+-w`P(j!n73#u_8Nkr*40M zT{C_=ZY`9{_FskS&#rOQaC_(}ZyNwCH36QoR)n8dBm>0voyC@w71px-OvEP4TS5jn zncX?x7`-N#!_xsTuxq@ma9ybi5ium6G47%18EIaELzt>Z%MuO`N{&PkPZl@Tpd87X0a`72 z^oW^Y@tc?_W!ZsN5{zee!B4@$xpTPn;krRk3RHv410l8_1u_%J+r43C2S&wEX-wxb zqJF{23mJ8a?iW zPZwS$vzN~rZiu}F{IJ^G#x&4r^c^updT$~TVKxWj`55>WQis@oW=+)$f!DpR8G1RtJ{9I#XXdiHoO8QwXTYE6< zMv}>a{Xds$_nH+S?WfPRlE9^`@U*O4s4^$-yBx9hhhNGb{-{00@5^CLeIJzK&5b8? zW@_W5mhG8|HW&G9bkBh>B!nx3m@;_&f_1sKYw<%8P>3?WK~cS3Luze8n_%iR=ZsB! zi14Jx3nSL|qr8SNaYNSYb<`9%y*X!$U~v&A(eSQu8-K#%1qu!!9*;62VEI#jx@N-r zw@wtrGrWWBI~S{uuW(?A_55-953xnV5VwN`oUJ{(&sD2Mo)vmCj=Am*1B3WKvaaxg z$v!3}*P0=OI7qej#!rNc?tHSZ zGWlx1#Z?-f3>g_Mr?U_DVo#1qjLp}j8;f<=Xl z%?$v}nw?~YG{r833@NqgxH&t7Csc@Epwoc7#~_NSUD{?WOrOAw2Yi*fZ;nWWP6%dP z$%Kmv!6(mV`O9U={v~r#(R{j>c~%Eid0j!o$)7T>z?H+Lsw!}&l|zdRvcbiEYREBl zVgbUm@R5qVF|odeIGjI~L4g2;qZ7e0Y;UKmFZVy=H@<~P15qwB(Y}ZG4fzU`X&FPW z?`>dd#a4&+aeld(h4c@`?{PkgdlLP+L#|j**vbRaExoMc8&7`tR|p8l(g*v+{=pl) zQ}GnZr-nbq{uoZk@YFV$>9r>L5rq(x3Ql#5fbqM#Hm0IIlkk&g_5{U2>lR2oix|E5 z84z*uE99{e>2jPnP%LjCXu#%_lBX#4*pJf$+f~3T9^Pw-;9C!_Sjnkb=aXKW?OV{1 z{8AYF zu+cQeU?hmKQ0M1j9Y~KU&lI$GlGCiHxWZ|)IIuoBRZ)05R6g-_vOZL~YwOE~oJ4g- zLf~BT#`Ppiy)%dTRr#zZo`h@YfUgs&MGWJVV*`5S{@EGv@V~BInyA6odeV;>(hS z#dwKSquSngcONPu`U#yJCY-E2DX%9nMZ0oH=K2cofP!Di1C7gHLPK00)JsERQA z%3r(-l=qLs0s_6iI|7xU^UxiwB$UtPNJhABUzPloXF%)mYPNkLe}+u}(KC3odxX$A zl@*3#X!+VuO1fD@z?l*hN|om}3IlUulAWa@^pkX8d7xOmHfDO6Hq<-e8(|~~ilGp* z;3$Umkq}Dob_A>&e!6vyup|SSe}4h@u^Sjck}nxDq@MZYeG+d{!r3oIfW z-#6j2*EWZ0xg&tK&uh32VTzX-NZCXSyzbemD#AbPlOdd8966gI-yvo8Lwf{_Ia=5& zgn?9-Vt}1vwUOA_z$(F}sIL65b>xKGPz9D?R-zMM7T}?8l*H+%9~Xl2d5~5r7ulXh z?J_5Wk))ApAPwy%UiLu^o6|F^$jCTDriBe=0!wpIJJgg5_kDQV);_PaS}R7BAJr5| z=T@WxaUHB9UR&_~jS3!T&>>dITSgu(m1|9psR8EzVTbNVhl6cc9|B~M7o5(zg%SC!+j1XmWd2Iw!v&;v-SamldD_xN? zf$Kpw@g9GwK^#p%IXSZNd4(TdTP;JvT;)9ZC zR>~`?zWk@kI{90c)L-9PyuGv}(r$Rd;PaOAVLe%4q?9qd)+)qT7bPI8oOoTV-F6Ws zX!yD}aoe19VQ&)QO;gg8*O8fl8;}@I68SJu!yxPy*xqp#LgkCQVsNGmUSJ{%YX-RQ z4BsXEesM8*IF^)A3+fX)QBy}S|O1H4h$7Uph|vcvnoD7HOVnhlAjz<=FZiGf8A_1Md zXnS12MU$Cx&!;kryX*HblM4Cwu~8d7PQe==ScwK}6h{fE?A{lRlyAK z3EVs&gMKM|m@wu6MX1bGYT+42uQh=X(|8@DR{Q@xMj0>@v^jAyDxT8qf{sqfA}(Vqcr&yd0w>;;}?PbqNu3(-)=M;s82l-uqTm^U7E$(E`6NHn`Z&j*Ym} z`owA4-;d5+v}z$+YtIi}mO<>2kgjntYzlgPJ;!m|B`Yp0aB6K`56@bzXd76mN{kr} z{V=bE4FTCI#e*$?4Ej&IXguxg2w9`&SUnkXqMkwOXyr#(yul(oNO|B9&Rsqg4)q=~ z3-gnhPHdpaJ5>ug%)!Kdt?4YtZ;>C=WF6k{j%QNdMAIu?7b$240iI&{2NAJXLmt*A(Q8Y*bx#B;pLGTeHQR~lxVZ>2+1J9Oc2mq z9XulL0--6hEW@H&<^O0&Dr*&s{Z)|1b()sjX-djBl{|ikrMiRoY%(4ma>;S0o<@|_ zq=&+a_Xw+y6YsbYSj4r*f0>fNKei!%oBDX#EWiSCQh=sRDpM(MC%VYR;!huTEoKA& zWmBMK%3LUj1s(e6zCYP15woeK#Mu|S&7%-Sklg&h;adcZ(JKzlfY!+;q;v-uxIwyT zt4&@84M|Rn;gX?_j2~HIm>biwvIm|fF&-iX`$>cAFg$^*jMkG;MW(~0xU10JtkOc7 z=#e+d@`O)98z%+dS|ad321*Yij80Gs`{dsb5}~`TVK}TBb-4sa(=8m9=Z6xPa+7dV5l;MTl|uJv2uHi4e6x4 z7A7^-Ay#{gkY;JK6~*znn2N8;^QCx>WI;kmhVD75Th-bk z>TDK}t+5L^m*br#W=jy0t;Dg>)^?%DxUQgg!f}JUI8BX5v0UZre(Cmz{J3n!gyz=`#wudk=SbomSR8DwuLlXba=SP6;s z97cnu0Li`zKC?{Lt_9M8_9b{`+h4MVx$$#chE4M?9IAdhF zO?v%ZV-3+)m=}fVT5j-U*c_Gf;AMaU?dLv)!b+=)=_cf3RmX&6$T`OT+b$3I%IyP` z7b>Q32LZI)y<|v3dPoyiEv_ID@DW>y9h{nc+29NkGzq8^tmTjCz_j|fr|SU0%p}$i zl+)>tvQSJbUZ=3idHyc`yT76uKRdg2Sj|A<6j{)(nFuV+~V3UL7H?Mqf zW~ZL2f_a>ZW`7BjBm2giw@@ot&_4D*asK4V!w$!3R7}Wt!lK z8QMeo@_wMFA&low4?iEIoGR&BBvf@QvLmYQGQDEJzE&gx=m^b2k*)ni?E0n0s0^7z z=fLU5F*G}}HF2J_)4{z@nixBB)q|Yy%IOO2st`mCDn=(T|JG3eT}vN`@w<;jnTN{E z2K8b+Q6CZjxwT&q6GqoP4Com|etFC{mTy?(D}=)bzP3s`t!u!U_e?UeR_`BZIArM! z41Gvm^=*Wq8{xuiFd?pb6*C}=;S+AZ^Bh!S({H=~FXvH)G>{62XK%wvZ%Q{#a&)rI zZ0-INY&%Fg&gcEE5Ay94<@hAWaBzrJ2O^=S%ZQf3p?cg6NyJP}5>ok)(#zp4T#0C~ z0@xh7A}yU`YNy>KPm+d|7HyZul?huQ;k=&tBBUu^mOrjIu=yZPaRzucZ-Lx^LN~Y- zRQb;yB3`Rlz9`?~MM1dk{%W0wU&1VK@mZA@tuQM{t9{M9@_*W}NNx|JhP9(xE8$il zpnu77p~-c}eE^zO<;*ZQa|0QXOHk*CN0|=>f_-Z3_NhJTfnXrAT>iQ-3`UV6;?=O0 z2m@r4h=}w15m9HaOrLf6Nk5qVF_#_)+g#I+haHqQFu63G$3c!SQ+v56>C6wmc@7 zKW=VQ5?{BS#u=BvYlBzp`&EZjP28qTz|uj!x#tCeN>!O=O~EbeJF{Zn{v0nixjw9I zKST4hPXT~+1#qqxhEK;O-5X>8m{H-6epWLRmsj&Z#^ddbh&YK1tBK71z*g;c9KX%j>oxd{(s;HS7El-9#9nT?XBJmjG~UT-X1R$_r?H8dfCo#;X0({2;Ha)oT9 zjhR`m$eNpSDvT$Ndw1gu@`i;40;|W#{&4ArNMLOF)5|$h4;twukgog5PHgFJR8}G- zB7P^doo)d=^hsAt#L4ik-eIuaHug81MB@8$S6W38Dcl|>EccZ-R~3E$PLAVLUnzeD zOt7+J6BvDIoB^+J8XIvFGyOf=TIVsBe`BwW~^lBd|lgDO502z(?*eB*M=7;%xc7o$NjgY zS9=4W6&Q-E{S=}=E{HrG zoRg|2i{NI1E+fKrZ7w4v*IIyv{gS1;u2$OZ-msd(){)W3+=dfLDWy&GwlUYe0lQn> zf;a^^Uw&V$U+|`EWp$QG2U4i$@?UHvBu)gJbQuaxwB(@S)dPTW;7ugrUKL9aK9ds6 zaNey>N0<^hGE>IE)kQWO;8+#fUthZauWj<~N!w?I^UN5L>%}e3x|D>$gIc(_p}PuwBl~ z_3RF+`$Ppv&q9&zZw?0v@zcP)kW_%u;@L3XPq$#p3ztv)kv4}4Fy0!|AR0h$^-b2) z65^WJ(&bb%AnEBB2Ox?8Ta6(?yjdT&C`IHYr7{;An#L+COt(pi`Ad9SRJggTID+Io0HZh`zEkM+0rYk!zZI&Q2_2kX)EleBM8^(iPMp<} zl;?!RQzOuPpT;Br8&{|>!wkbRCRDdIuYju<0by!j^+{Yc*A%z{5ekda)LxtNxNRlq z$O4Kn`HimCK)MMUhZvH0BwoG}j1$4bunCXnR?`2$Nti4R90Ia@M?I~&!Bgs_iiqs* zPg2{9wYBgt!t36$Hszmuv|bY0BXE;3UFK^yhlT8v0Yk0D>jX?pQS{)>ndkS-0We=( zaHnW&X^Nc{9eHBtN4iCo_1xM$QxQ}cwOxiYKAJhiW!tjlTyTqGa?-{Q-k@+`KdiEQ zSg*~Ni1;n`t1vPLo#$F*S-(2=piLNd-LILG3xca zskq2Xlugrl}AUm|G{Lt&*5 z1019YMS(k%M)kBM;j|fl>Tknc<^M8cvLERs5QjMf;PjZ4@2@S1EEk<6Fi(gFUWK}BC^)8E|T%f7p281Ka`(hVUHdydUzOw|bdceqNS2njKj3@$7T`Aqf**}ci$#ldUJuCoX`6<kOF|{jU97?6b3ajd)Wf) zXu2cPtSY=@e#hKA*SmAOMK?u9Z99I9u1F~u3nlTrL+Gv%8AWHIT`=My5?)F(`wV|C zOGX4h_9rGW5iG6BV<$2n{HFZr^xw(N2-kSv6oGAs*Q*4DM_vPjyB zlPy@!ka>u0Ap(-}R`y(KNkW?mPAF7oB~`aSA*_h53HJnNBwKsJeuXPgO?e)7rc}op zoIsj0$9GkDhc|C1(+MsiF**z{CY9?>{4ze!<=Y7T5eSBQxjFj+5NFGucRIHlTQ=yE zf;3`xvVi>pL?HwsF{q3bvH+VR?v=W+~2@G z8j=vVUgVC6agh_{5eG4K&WKPPUWQ77e=Az4J?P%w_*LLQ3(y*00J5FFRRDHwGIH-E z?D_$YHRzBx1VCl3f4#i+`{j{}+ZeYF3~@?vuMpe3nsoi4R-a?y%FI3qUOSHj#pg2! z7dah_y$aJ_fk?hoke?86Me@t6Zm2=TTu0J}(RFwKIX`&%WnCgP9?AwHp2RC5(w-@x z@f2H54Rni)z$vhCG3oCkHH_cdy(XJH=KV~eoh&>Rc!7M$UR=zZ=mDJvuU4Rxvs>)Q zwr^DzGo~8VUXuy13d#;Ff^3T$bKfn%P)g9KFYZMuB--wFrsCepSq)AXeXAsDja5g! zGX$i4rlLV3r2xC(v&pez@2B&+1n}X>7iOT-wgm);ti4i61H1S5SfJn>oe-=alT%LM zae;!WCfsD54O|MneFKaaY=eVw&R&~{EsU2MEWi^k3IE_pLOF^HE-n3BG-{Mtl`&~W zf0#CYL2L{&M`{KHMSpEwSG7p7h0mUWhRMFK?5r8YutB-HX=Q1Z{}h(O-2a)^#=ow2 z&!VKbfetgsqw{n%%zhxxVA(`dv9@MH7TI_hk(cr+7i&kS#SGSz;Dz^VYB)OmhE2; z^KS71oC}%(KpsoqS<=KytILIP>hqkA07XE$zqSeY&Vm!iU+2y}ZZ>P43CED*a;Mv} zg;^WbaW@*>$EX?QJc$fIdE>9^UHyO}#yn_`X{m>29)MXS`YW`_V}A@oBvkM&FyX(> z)q6T#(ijES1?DZ&uUFYwm?B{j8rR2Qy(J#`Ui5G6~N$Vjq#eZw`GT^bvu~#9zQ64FrDZOJfzW@bAs# zj{Oow*7UvOSoQTipr}*6L>;cO9$7MRNzO;g=lZl)d&MjjJ5KT)Ov>E11#ln=oY)w$ z@6x8El4+_y`4r0A_$ypIFBn$hK#meElpVDIBM43e?2Ymz>TWV6qh^|mQMym_y9Y1> zOaQ}3Cf}%EL}Kz@H40mNLli4`y(lw~PCuM%+j8w8593H;5~2K; zP0{fj%U!I9qyt0C8Bsm1%~|X?j(6b6W%wGz7`k4j8>7&c#?>jL7q0j3!+<*gd_ES4yz!) z{^prySP9f~Sm;l$E13X{pkgXh^(;Iaqa}O7cwpw&a2WgHYo^H{Bm%?&$lv2pl`5X( za1hI)H(Ez9(VIX_DD+|n)0~Le@=NU;;g&N`AScM#Ps)wJki^zNbu1ghK#1o8vgf&f zK>WUbW{6RkXa(X0l5-VcQ!#W`!Cb}{w+l?YK?obCK^t+;*YOJaTs$n%)Q{|u4zPnj z8pM5c1~D}3%ypm=j}hL9wl`%M@+jUo33<6~x8E)&4}4zxvevhYp^_KmN82!8+QA%e zoOa4HDC3h|!RNFJv1M9Nb$V@q9jF2#IQvb)DMJG~s<$~UtZ@wV9&Kmx=ZKpMfGib1rM;uR}a5QFZEGNpg}7(a^m>-tYP?toYWj+A|-As`%t>_jzq zP7Ffi2Rw{mcZBcJk-fKk)7YU1z%&8OdS#~J9bPEq5FKcK>G+IoAc>6&mjB7uw@4cdvlAs9E~NVH)I81;L7}_P)1kB`!Y(MtBgzrpvXu(%qW!y5{aO3gin)x`OoTulIJ3{VuZX zvoDUc*{=yBDZ!LDxCDC00*7_1FsF+!x7WSh(S%W@`^07-Z^71xGV{P<7X{I}H`}i; zlq?vUQ{=v`c9n<0Fk!O@v20gg6kAqoL-OXYMsE)DL~+=K#I^J`dn|W1Zv{^b$Z;?g zHjmgU){Ze3?MqmnHzC4W8^of+=P@M7nl9C6ZM z2}j83v6on}9d8yaMAI^706nViQfNg96@hK`w(~B5KAsl|uxn~n#nYwVR^(kB4BnE1 z%=PL_3&$qjLs_x|Xe9c9(*Et2%<#UgNBotbJ5eFi zd9vsGtRvV9vIE7I4e8CUe!yLFKp=)}(&`B!G#ZZjduA%2fLuomPq*L*tCiNCV6^B8 zxJ0a*b+63F=L<{bQO2K-5|dgTDr7X^Kki{ncAyOnO=ovuD2hl6nqQs;Y-sqI0*m!+#{jL=&Pk<=43DJM7GU-Iv$4$Xa zhcnqm*vUXxtMmK3VM=jV6AIC{wluj(Ac!4GU5t8gLG+MKTXE6{F!ZI~UwPsRGZFq{`^IE0wocNlu(XEX;FxDENjH7@-0(Ug0~=3k!rZ(_Ku2r8 zZ6Yqh(`T8C;?Ob#g4Nd;-;RcBc~_$HQ3$rdsL!X}*&Z#P^_Xz34GkqN>~qX&Oa7uO ze-5{HQPMI%r25B>6iKd+p9ugaRhrEBkv5nB|1mMlrw=`wDLS|IdoD#NFAX*WjF>im ztY{uxDILCyv9Lx>05UM(&*U?NCO2rS$gUpe8dxULr$hlVIKUnLncYuPI{_oPI+Q_& zQDG8U`8JcnYYtVGWLVWT9gu62@}%IpI~LC`L|uUZBp<=YTyYZfXci(2^#(> z-fcYRJRH}xk0QcY?OBSI)2gtyE00CUAS6FBJ;Tw19 z>)x)Tbv(>SYeDn*72Ehgl=iI=bf2?Nzu@3y*=TXq*S+;?S4!d@2h=finzYyz}tep_gX}o_uT12@b2tKMOgLo)L z@7I1~@WkxJFsGN|o#;>7f-xPV8mVgxogP0jJe^o+;A0`RkIQrQBkzJ35%7P)HWEL~Ncawie z48cxt_BBLp6-6Vj*Sh}4>>Pv;tXVQ zs@j2WV7xUlSK18C8yzS@&pI6!AmZ034?#YPbF7`4_tN@1#lR}Zi2WstQ zO9w`Fd5+L)$zqp*_mQ)NhY`4;efh$j0?B^h zFs#%?^R2{)L5pHejm_|UbyVZx&oUs)stcf4ba!+tD3Rw#{xjUT4Zqhw%{3pp@7JB( z9wUTBj0>$h?cV)SnUgJ&QBX4lse7n`#R$D@{?b~ki{07)$YxQ_nD{mAHbBO$g=c6d zs`thjA~-FPwAg1kNuK-VF?KsN8mS+dbe7^aH<&WcRye22c2P-uDQIyhkWzVFtc?pU zV{{0A#4)1t#=*xieUj zAS}SvFphSnL&mA!KCE7n!{^Wdv7XZ2IOb`gFm5JU1rB1CycpWvW^CafOQo*ZNO$BS zg~m$O%16C$zCBAB_v4x@&yF-*enZY=*W?H>0DK3peK5&Gx(4LiYJWMK-4mq4(;0O+ z__%%$N*!@i_gVoU_JR*94Gzvc=aQL*k4{n&} zm!yXa^L)N4kt>#rHO~;upPt>J9^zv$SECLYi)Jm$5+drrEjX3h%RE2*G|xwfT%V*P ztVzPy9$>8~5*3@o?LNR99E8$d8A(59sJWW^-jMA=w|HWg!?{7)W8z}JYJbc%CRjVn`A~MWCRQa~PKey5v#tq5 zN`NG-w)xhWwwoY^(HTBE1V~qRe?-8GPcMz^Q@$RQLbG8mTzo+W#ER zwPVJX6`E3Psrq(IyqoQE(&|t;f4?>RN%?BoskB7|>1a}X(~2$2sVzh6OWPokcu2gJ z@%-!MMen$+e!iZ}9D{W4O-L(>)&yc8b=ecuHTTLzalI{+`Ck3=@@1m{?h1MwDni%l zA57?xu0rkJ;&HwQoab@A=rz8tHg5MOHzwp7AdjvBAn+~{WKN|s#}2#+;3(L35+|15 z`$)Uo8##=&5C)z+v3)s&hKFfwdp)6Jz9HkSY&(*aW=$|q-uD)7?+qMZWSA;x#abo6AS6dHxJ(XYKy<^ukvW)cXzzP# zxAz9+o_Q#GFgru zZQkb_WV&%yRXMgg-{HD#6+k0&D`CZM__5uy05Y-bDxAA{P@j)=EM^p)X9 zmjTCvW$rUDc|?=Xhmkob);4~r2y+;+7pQ@+fm^(-NLZl6kup&UPVlSrRaT0?HS-4s zsDMS9t~m0<0ho{}e(Ak&P52_#q@jWD zt~UtQv9bOc+}LV~FJ;d^=!k%YadN@O#x=+!r^6kONg0*S6ocXlCCwH~kGY>7Qg?L& zF6mt{zf#Eg@kV-GMYcM}nkqblQu@)B6*JzB#;sg!P|+#{ZR?orZK}MAJN#BjnROfe zsp*4Ke(?5ery?a^_~dr{Dr^F3h`p%h<2EW*%+M!lXy+uv2cVBiN*m$elM||b&xfJ! zRqp_HXHBPhcSwLEE5Xey|ku=+qF{wJ)?6ZwP3#@JIjzPRmv42QOA* z%Fs&CjS*p`vI%}oRU^I$(FYJwk>8|ZQlY;}E^xQov&`^Yo629S7u=Hc8J18MlkzpSZ?lZXa52g1^6_hceDTxX zwLqK-z7=a+Mz}fO202%brP%>x)w;6Az3uMSpRkygr=$+I>_d z+cs#7016@hwNB#vJ-vjW*-;-<>?&*YqmxdUY)JGEBue{ej1+l1>7f_o^4FWYQ#7%~ zfx%nVfp|hZZ;?)URvIh^(FrF+I3A=fI?zzUelK7U8XNn5GA=9J%;sLe5+y4V(X7|C zm|@$>#3DGZ{FWt~0-g9X%g=;@K&_0kNyM)#Z$4<2MtGvQ_Ue!6E%s8_M9goWINltb z(x3N+kb^NPB9KgcdvV$E2qb&j9ZH?%e!Vj5%3$d(jqt?5Hvb`)4{jLNdbaU@xo=mn zlt7|Zj+@?Pg>;$n!<0BTzi#f5sg+dTL*KIvkQt#rGm&WsgTj_B?y!|k%4QH{C6;{Z z-E7U?$bPIiHWaAO!9gv-=+KPpLu}c<0o7Z~kyyUP&vIt=%T0#Xi0f1f(}#)+0U3X&h{0EtB(QC z*LTRg49_W!_3}6KBKFJOS%<0_TZG`(vcI81f=3pUt5i3NueN;jy+AnW=`a3KzMiR8 zoiv1Dyyxgf)JzXa1(wV{k9`{Pl(84VtT>;JCB&BfDdXosfOMI4PF3DEUjSPJKJFx* zMDU@DeI|3tSPm@pyZs;-<4^hNs?4Yr(iqB)WIIq*=IOESRwIB`!NHPD^LytKr|vHLR2VR)wN$1~oGkh! z;1z=vZZ=uNO9*7Aw$#r+_0;|)E*>O6Hh zMLQZ~N^A#3Xz!&`?|kI~le=T)5tA$5#wV1Pz@%BjS7!o|CGhY;(%*M?9ef9@nTeMt zO?n&l1ZgALQ6_Y4uUiI1UQ_h0Z7St`cXvN25)?rg02K1JYLD3C(8baVImHB`8n|ts zCGR1<@9r+huaf%niAp zrvpUiYW?TcU`QvFF;@4}o$jxh!k9$SjMeF;UZMW57fm4n2z^X8r4hJ|QQ<4e^e%_E zZMb=`)&VH*)Te@UBaH8u`w)MAoOE{&umUPMBGn$ILtZsw8bP3=6t53bBn%WtI-!PA+Eu~u%ZJONAC!NxX8XPXl z!Yyc`4o82KDC3?FOMdx46`A6`nhMIvGQ-u}NpnGXY?QU8=b@~5#7KW?`OPE1+#5-? z6?NTNU0@j`?ogD&*<58T1~?H5IeV`qynrt|8ScT3SfbF+p|o5X?Oj+VWO9zqyvs6; z_~3qI0=CmRYy^=SXllk>9@2GS)f3f=-xPFx?{l& z5eIUhzfS@#f;bN11ok)jdsnU_+_kR_>jtk*&~{8E*kdQi)O~~bFx!WQbbm?UFgUop zIIHFm?hf|JRCZp6Jw&7{7=T9)wP+fzvVBH8wc`6~`SRj0a#l~%$i8XY-=MU|I1bp} z@k;Pv0!yF@^}|o+*-h>yNSdh+a3E~p-6zY|^TQZRx=*hbc)^ff^cB2!le@!WOc>Wu5*vG?;6~0ceP@Q?S1~IB3M+2TN)BDa z3>?dcKF?X|h?n;!@Lh%}iDP;5TPW^2!HWzztLJ_3_wkgTVivtu$!({!P7QP!gJwp+ zYpHiBcWvuq1UbUau^Djm5OASxe8Cx%l)t}#rd-SzG|k_6RP`BO+VeXU>x8?f(n1Ov4dYt88Dsa}YD#HQ=|UEMO;8mHPh_o9=e3jFJ4yvZ|LGRga6m!7 z&S=j^RQ&FNVLRauZMrSwRNu;}m}VHSC3zh$qfwsf?HL&Db*OH{mK^oU(0qc*k)5<1tj^yh55|QAw_^13Fl40$H zEgUYYWerVXK?McON70t*227bCrN|f9(u?5*T77K<&`-n85sj*Ol3up8ZwEU*$P7gs zSjVM(;LAVCqImr;`srPHmOrEI(6|90;11k;O=e-i1%-8}-M_d-&(TQU?%;i|FAfnU zi2X1ACW65xN2Cb}+Uo+u)hMxXx?g-mY{GDOib#p=a2)Z~d9a!MCPH-$QwCB}BxAlT z8#N+)2m*NLZU)Ht$+(2N)$G^R^6hE`p9zHt$!O}HH-o2!+Y&7 z-0LoeCN_mLL`v7OOW0(42HzH!+o4Cu{t(}y*e9#u-7@M?{(5skj+G)6Faz#>qV_pO zla=?c>m!u2Lh(mH)=7oRnn&D_p{R5Yj#NNMZwDeJWgrrrBW>4}h3<#xE8x%@%=icL zxs;N4lj6GN;3Q7cqlxbUnPLM`1)*Wbgo!-E_vP;LYkXXJ>zOpAxI+tMZ;!TxSxDdJ zEuhWM`B6hT6;-3O%RH6Sy2*!Bop{{{whCCxQE+JA{Uiump#rS+AWci^b;A}SVL6!V z=zAJFn=^fiknv^Sh2vmXz?%!jOYpDhPl+Nexj! z(F7DqtML74KdSQIXqVJL9ilDRnl~O(#sgGH*%K_PeEIrgF+_6JVLkw}h)U?EAq=`? z=;ziQhJ9`d^+f+oty%gvx056~Dif02PVQ~CPwjW%7360bVS5n@5dFtOtq*Kl#1*@y zw~7c}CPxO0B6&*f)|H1aaE4TFE9UpAm3sw0tZ1vnX&1xavs183Dc3X=X5l0 z(%(r=|Gv3)gS)tcK-@W&ziMyImqFs_zj)wf+d}rlcV{l?yM~P*39~h03 zP$bIw+3B=Pr-KD3F|89Bz%ttCC@pY^?s6}RF83H>=rZ>}wwV8FhugImKxJf~PR0T+ z22aVsofz(dtv%8oo#Pdhe?^35?P0v3yn4I22|SZzua;MCQ^zZeJmJ>V0r`W(fC*Bt z{VVHIUmOs8DX(XM^`;dY?!m?pc7i4S1sdx@H0JsSva*isQsBfjo-TYNUv90FfJoa} zAq08S3emo>-{YeLcZ!#$pZ5Qu0@Rni8jKe!?|%AI5YmVA8n($+bXPVg0D0?NTXNuB zCc7A<+0FHpWw;tfjEydwD=1t@$eTFtPG}V23vX8ZC{o-*2T+swW?6)euAr(DJauCDc7b6ryV-*g~zDo~63Tb7O_2W&CBzb5H2S8=|tKGQ! zU__*!_|8FLOFQPB{A?y*;ziAkz6w#c#b0VT*pK~t5>x6+z7*Tx_gNVM#&1?Zl;!P^Om;T~v_zFU& zXmEru%P4__j?C9EWDT_92;iooP)2HozHpAezHJ`lPs6{Uq=ifrRNCoYXpsS8U}Yp{ z<4zgLCrUvi3`eN&6ZHQ3-Ut{$#0aly28T+hFrkyGB(Bzf=l133S@vL6o=8#DXLi z`LhQHuQ9`uxegn*hnL0pyiKWK7}=HVy(50}kU&CdFnP4|axj4PaR6pJ6cA*0r1xm0 zk6Y==a9syLm0y=H22?SKuN!7#&cguDC~TjaT)$0q#=KQ`S@|{JJxD7ih z2QWNX#Ghfe7KOH^kS-d>CO_ev7Oy$jo(RIh=(Jil(G%uG2xRxi+iXpq-0Q(r{DQ1 zRWnk?St&Y3&w!yR#GaY6%gzC12Ix9fMSP7it(|DF8-ML2q}SP=#jM2PI7Dih;fFM@ zZq*LCOgRejPmlFgllR;Dx1N?wi%kfZPBLD(MCGKEVVeU| zU_0Qf)~XB{$;RYx>=9qI+ISffMP>bII_t^14GqrXU9cG~lK)ufso0|+>u?HB7o`ic z8(XaW$FG~S^>$C}XeeFO3d0ujDYWwD0$Vn|baj7oR{fAc71@UlOFZIMe^11c3?N~x zQ}U#h_<^36SBXJ=(Uj3u#RRNGYUN(TIQC^cC2sJAwH#oBltNPEI#r(<4_BeAf%>Y& z2=Krdm7wWS-dFpFH-}r4g1r=$=R;_89MJLjPMqv$)g6Z2{9v>tCtyBCxCe*AW#+=nxov9wAdZ`r(0fMmq;awsr9!e>DP7B(qFBhy~b$Y({U?R~50o z+dT!CHyXaf- zbUcBsZ)evZZHjTylL$vXw1w3Snt($2VeQ_<}k$?YZ|2a z4hzk~>JJE%8cjKz5HSX`Pi4aXPHCKDXS?Ogdc;P`zAHTcD5rJ~!<4zPR8L_~<0>AU zSOl_l#r)bu>g8hiR0s8aBp+_xcR{6vx8;KoVE2K=7u?LN-}8F2gP1tca6Ed_g75Rex^CO!+Vh3b2gI zmtviX0tY4*j<9!pkxbAMj5H81l-I|Wu8pG1F9>s^$Xl2oKpdN-{d9`^;=Zid5%T$A zjFHm|a;jIz3CV_h)U2rTAs^mO6jO;fq1|Fl+Jz!ZbE`^9dymx9Px8?d4{l2=KVG4( znXkC`Fh{DyCw*|U2VOOFm^m2S0x|dp*vqJOJp;6O|o0IM@jkN&S14ir{GFGWDfn_7%)a)3= z+!DVQbm+ZA@{Q<6E~cD^Y#%Af#S|6th^%4csp&*NyNbNykanb;-|IizzP3t47sjM^ zvb9YJWsjaBz2dC94W$Ed5R7>$b;)Z*-UXn8GM|k@F-6^ZVN#jn4hcH5?fDS(1}Hl% z_A-t|a#t*>>&1JQX?oaQRL1KA`3rfR+b@h>f$ho465i{p{!u;t3rDb0k-51Y+HB6Q zZJqWpp!u=ip+lqfY++1tD;Nhv`+gQcHDB5&d~C_)LsdV#f}-*XYo&bc>k3&mF|WAkq3LP1E;V6FJlFLL9YtzO}oYJVWrXecMit3e#?z z4m?JC91gSlTO;uq`CP*yM-_9WqCzcAn@!CEt zcXUjLs#kWn{lmPIKk|He>s!foX`_g)KrBA16hC=aIaQ2#Xdc76)FNXK5hY_zZ#I zrci7%e$ojo(e-ooR#lVk#6olDlU2@r5#_aRq*+3^b9?;a%feH`{?U>_tGg zd2v=y4m-msv`Q(j=a>a){bEv~-N%d(?fFj3kdeQAR_LLfGR1R5<`LvOSnBy*L+-iV zneDaU#!M=5c28hFIxx?~7G1Y|7v&gHc7a!PY6cO2Ue>;}sc?43Gxu>7lWmVUm(scH zAdQ0d2hGz^#@zSXXQXjucCZxfjWzh3%wvSVK**2fA*hyj>cBF#R=;)vjU+HY^-96`Jlqd{dkug*em6x)~Ux`Vj)v zk@&neO#T*eTd!>^-`WgRCgi=uiD7wn z%$;O-NFz!U^Y?}xnOKNeM67%b8FIXA|Kb*qL^ffN`s6oH&9C7wDZSGDHAw4(2@d<@ z&{eZWZl);YI+2ct`IWVS+xjSpKuEpVgX`Wh867zELN3qwFTAeazP4xf2)-Hk#n)m$ zt#1FGIi{yvak>tSQxm{4XWvT#lddh4su8*}T=Rz;TQr(IX{!O&<_;9#2@tY9FrPWL zWaeRa`U6uTT!Cb1Q+H=Zca2*d5U5w_Fogm_^C_C}>uPth1xFwj&P`6{`%!ix(#Ylm z^zC1N+)#j8Yl6q}d9`tUl1h6{ip{g~X(v8F4H(^)1elk1^&CHB*OP$UbA3I@ap(UG zJda>=qVIB$2S5&wk_1D&J1d!$0H(zVpUjZgle`0VR^i}afo)pNeP@u+Q9nT$?&Zwn zi`t87oyOvXwRjf)kWq)!%5)F43#85M)lv<-QbC5b6XZev@Wb#36} z>9y0x;|YZQjeIicCw!sfc@g6mK^GQ970NW7kvWO3r-@Ps&!G`fFz9vLf?^EjnKZE| z+oHt&6H*;3WM^MFjZaciAS*r3;4pfVn@Va*B}L(?jNn!2<5n=98D5+okjcb~q(`>u zIL?v;U)_srqsY7$QVo_6A$-a15rL3>n7>31Fh#91M-bFb`}q?7A*9T{Tk?qQcU73y z7elhtCvUx^zBxwt-av1G@BOVdV2N}s$6r30LAE%|xsscyV4Ma9$nJ?ly2B$@k`Yq- z%rN`W+04#_IbHO>{F-=Lw6bNz0p2|F7F=AL2NE(eY1k&#q)GSbb!5LPSNo}1!iaI8 z)~s<6H^``;@d-#8RIUz>WS%-LJy6lh2HSSN&eeWu%>c#0Zpm#)?okzCX=iy@$`RDr zwG!Yr@{<^^ylAxLO6d@>Ug2&O%O(2YR~*4sroy|N8b(D%P*Wt#q8)mBdzAI^C}l~F zM6jSYAMR65nkf#oV0K?{HG5;H#ElYLzh7LwEfdTW(KKRHQk~-|QsiiI>n+8R6Xsor z*U=nXwKd+BSoL-_0+WWEP7}qlQ{*e#60CVPF9#ANeou7v*doRE)$)Z#PBqA0&gi#A zr?twy5cXY`5Wqv=?EeJe8>k*?eLu-@BdvqBi`k9)%Azvhx2@B!Ca@@5|JX?I{cDw^%X_o^{9()m8BsgU zhz%KKywvf&CNZ#qAcGl7XtBTFTe)6sN>&-5XO(T0jlnXT z9i&SQ3ZVAouE(oHt4?MHE<+A(;m58ZB19tPC4uZ02_!{KX6TAYspq(fZ@}(os8j6D zRm?XuBot(Ixgs&t-Ot#@M){5xt~M zBV|=3W)knya7M=8Nrdvl1-D}ix+eBi3h3%20gkzC@f11W1HC6m-|JB-==>J=V=o=E zT|h>+CZlT9F@*6IRxH~eh^-5%=^(o8Xl@7_xRJV5M>cq-%m6%N#EPqk9$fBvb=#wW zb`g7MpJA9eyj!WOhjQtHcp3dn40hd3fNGefNxqNY9N+>BIB3GQD)Q;eKJUKlLxyWf zu7lnWl2TyL)mB5%nB6Z%8DypN9K$JI3zoDhhR^#~GbKkK!pOP^_-(KCDe@>IhU&vT z2ytLN*j8D;_n!autLv}GQc&EGC~c6M*c0sL@gnhn5ZYn}Q}z$?Tsm2Y67Gr5X!9!Q zY8M}PbsU5uHQo;q60S3_Q%L5S5k1j7`N70mUWX}>kq{tbk6~5dUH;U>p)swB8})4( z9r0i%zhF487VfrN6+!|$JAUKg)g-=AC@=$jP4DO+gCa1s+u+}g^J;P2^A6<<2-?rS zyaksq)A85B8*~E$v35DRo|^B-95IE9K}q&*3cr5)rlSPd<8(&nN#2ER z%u9e2tO*R!DG=lw*iIC=D5EI%J{m)5s}on_bDCc2-AsTP4Kf2ObaJlSO{U@XfL$Ak zUl+96_G~5e#H$=ryt8zLlk>ZDg&2a{BiaTltGl-rM94_SM%~_bTsUcS1=sXa^I@og z?f2COu0#ggI31<*J#YX@2)3(Xa#_9K;GW3NAiwyG>V~-4e~O4WwiE75t+l6FbIB6X z05L${u8SqZZe~R})|l96z9vOnZC;pt1Y;1@1^+D7FW*>st=PJQ^X<1xuK=XTQELC~ zWC+`#ab1yg6ak+E2ql}IPT>(*l{kv|cft2S?O^Y>yT$8PZG;As@j+ z3JO`Xd$dK-zCuTlH84?3IkdO1VO)d_*s+0v!jxoo=vLGCdGKs#NAhOnpoIiek#TZ) zJ;;C1tdh-yXv6lsFy3y#T_DcMG`W{|0WVz0d|d)n*=me#puT5xlEcC z=JH{CZzKvfDvA+YX3u^bgYj#g7DVQ$93m`-T>Vm%y52>cjCGeq^4P=M96!%Duk|Jm zB$|)n7M2#t;NO1am2l6Rd>kZ;4O>olr(&dWJeX7W=5}O_;&#z*JxS?Z(>z^GJA^R6baz zklQXyez83)z%1uJQ*0873%Rcy?0BaBx3Uff@Q9Dpa&EaQ`NSGSlgZrtt=UDM#giBd z9La7F8?I-la?jwO4J@+rzK2RIN0(R69>-F|GQ=0PZ_aph)HDQ{5OgP zd=;~lUwvCg)uurT-N%^kVx(S$=pDmWPA_<0c|S<&3+=(+`s=6*T13>9pcQn>r)wWq zYqw9E;uv8dn_u`)cuaisp>nGrJQeBc51-8Z0oB z;-mA)rH;FZb3n%f^sPk<{etW!kR<36jDw=jo+3)-rYLSI)3p8HlpfX}4Rkw|FZW0{ z1vWPfRTJSzI~xLu1tWHaIJm00%9mfsP4lFYB=RYKV+aKhM**cnNx9pP>S2CjjNkmz zwqhFJ`HXPO*6BO(Y+P|IOx%OyQ5alr9yz2H!cda}9LM�Kz7aZMyaL=W=KdZYAqr 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%0DN%IVKSkb?tkp)E8bOdHDe%6puQgS@J;>&0F> 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 z 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ĤKAnmV3q&I*DJy*a8=V)*ieAek$q*C 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

    EC2$`+i#FY2OkleukhBRVb#K zf66ZH6&X6QdK-o6EXc2oPBERcb?iiMFNYVV`ok_3s0YnheTSot&VoAD#AIw2Tn0yjK zXfHDj`-{1B$~O%wRer$!hr7}xb&;Yff|I~MaZnPlJfexff#5KxC3f@973N~(T27c= zIU;Fy3bL??8`1m$7`luoD(Ytn?0BdE5?9v!Y2}ke0->~xZEr+%X+Kj@ywuup;1)$n zL88+S?FOvXdx&!t=^;g_5FepclMG7g$(FY29<>8=D6G)?9y)w#1<3A~Ex;=P_b^te z!8@E) z*kogwXzr(tdAS9!J;1?;JT9=a{j@e{OB3C0_w5ai2iD(-@eJ{OnDpz@2GJ#1G|m0P zeZr5(7{=w%OG>b&k6%7Bg7+<8JL7hAkzm%j-1_LtvCEzYGE#&`zX;KJUUOu z(y%A9%NSQJe1Lo+oDdI_wFBX)pIlru;W3!2;ZCJ~LwCek;yG~Fo*!?2*WK8FVh7Ho*PmWZPF3fPNmKWqJSFB<1hi`xw`jpd&B3Eq|!GWT{o5xh)6?kyYT=8 zvIP}T3-Y+HpBGt?~QR-ilrexzkFTdOYs>(>11~ky0ec zre{443LN?&4&uI>?S1=LoOxiqJJS9JE7lbIxNSE)C$xa~iP{b*cq zYwK}vm(ri|eHu0x4$10-*3s)&^coX019Sn?r$$hEJI>*_qn{r04C5kC`{qGJ7B%2H z!-q7y{|K_NpLM9=T#6?H)8ti#NGF)~pKjv4KF{s*n;YJg@@sR#v;u?eX%U<`dsuZ<3v?0V&k{@Q~?}s?5N$=GpcShxUR> z2)=FX@5kLE_(-tr*gsP~_w683m2^y05V1iH!cM6luyD(5*7xJC=!u*OPuX zw+&V3N^)5%rEc0%d(M!lFS)YxpT5zn-g%EvW^|{Q+yTWfsmO; zzGgU#(E*|IWt>CD+nB90GK@~ygm^1UDlEElTT=*JLm>U)oXnbhtr4sRzJE#JY^#Lq z{vM%trkfHz(ZmyNGB+ux6B(+648s5NA^x$h@e(R7usEs_wO^_^BgpOmP<&;cw7#)J z+uMtpD5_Iecyx>{CQ}tqFXzUokpt(b zaz%Pl>2X}UHvB5`GklTgqI3x0*j=;tE3?bhfaD=#6f(Uq+dc;${LwekCKNbk>zvCi zyXz^5e+4lqsT|8Gp+jr5$~lsG&j6&o+bLmv^mnsQok3USn*o(qXZ16?*#|J-C>x$GN?-h zY`82T!v|z0Yky2xd={Ad3WJjY-+9CFCGU>*c$h(uCiisl*zJd-3Q1(g=o;`Z8Np6$ z`OBj(9zq~YDDM&D2o3c2P9~dcSy~;QgNm%C*xa=&30HwSivDS&^X*^@S!Hrd7>`q4 z4ShNOC~>Wc#BSy0D38&1!u)RHN<`CriXiODzo?Fg)q(Rdhe9&y){9|WEbl}p%0Ab@ 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%0A64L`8kwyM=eV$tS55Xig3 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 z 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

    5t>52 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%0D>Ocyj{OO*mcaMgq9^yqV3cd-~J!d$m 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

    s#bER!pV_#v=KjHrEb>Y@;Hp0uy3 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∋&*_v zo-caOuBY@6;+a279{}Gs^jYfNvRd{*-$&B1bT@G@+srgV9vx+f(+gT1@U?eS@tIds zsdF?+&S-H^1XuY+xao4Phymw2P0&zV3M^g${s^3Y}1W#7lQ8fW*?FbPr&JB6r!_O z&w44z7~4iFxLhk?engJNd<9HX4sZoz&`KGf1MbHan;n45*!kfH-ScvE(BTZyS$T&Z z0_z&XN9avD4aS&rM>Gf17>I%ANCX=q_aQ34_drm}grJja&$4%r(~Dp&S3`+gkpHDtJ^d^SU+%!qEI?5bC$7u;x1`=3KB2P@PX2WlYWGCj$Oz# z88o2i#(xXrA~9SnKzL#CBG(;+Ta3ONix9$+69FV!DS;D-5}@~P2XlR%3391rBY=nb zlPVyO?DwLg1&<*vKW(b1BXX5qNC?A~Ui78Y52XDqV?BBl-+L7bo{YcH4HH80J%e3I zpjZlEXg(+qAP|9LLAs9eFgkciiP1!F)*~|KdsB7#cI&lp$|u~3?E$zTX4sPTB@>!- z6*LUwNV1QM7oZ$7Q8Vqrf-6Yb_NHnh^CB>X|LuOCB`jIFz-hU-b@Xk>-;L|`w3WdVZESg-P??+~!G|GJ) zb3EXDI1Ec$ONi?CucKRLHh6DpwkO4uV#?6;?5v;4vOsYNaKNv~FijOGL^v&2K_i#; znBOQ&xYTJJJ%yN`)hyHb!fLsw@LDM;DM9jH6{L+)Z>CdRPz0rt0mymBwQR{<$%>XW zzg}VzcL6>*p`phJV=!3Ft-_VH#tWa1p<&b25AuO*rj)Z!vQ!V+7NsAB8(s@wnxeK? zW`z$`l5O1ltZz+lc4x3riRS|eqVvC}&a)xM#V|uDTv9h9km4l}Pu}^VkSCvWuxi{) zcSvSM(Q!@&U;{MeU7|Jg{hY-7dcg@*U|WLkzK<0bIdmp=Exdv!0>QrD7-1r{tA0bD zR#(mjtx%9iV{OFik^CzvG&*_WwDuZtQ*mz|%&r0fMOD4sW55!Ypo7bzYwVJ+SEglT zLopZj25>VH6t#XSHYT?r#1|514S%Fc&^>k)$n2EG zhdM*_6Ix0}Jnx11KE5kdI@5`rrLfHKXo)6?x-EX#tj#w4lLra)JA2vYyB!PbustZ% za-@8-;iN>afTki2Zs@5v=#xMILqNR01ZpTSP0I!)ogABkxq~71>iuOcPsItKul$~} z=Q^a@Ld&N^*;I|WL>Ur3YgK?rI6?fdF%ZyCLko-)AZz#s-LWd^T;kwI8|<3z6Qm~Z z@{a)E=r#~0x4xeyVLTh%(iKX0^1uSuMw~Dk}dd%LnUMdy5||NiugRJtCfdHfM_UApMiXAf!SV zsFX&{?(GaaFc^m|MJdg5Um66U0UVDS-i7lCaSgFQ45Xc}#NqR`@c4=;xG4X+Ow2vX z=w*sY4(vTou3}}YLwcy`L5G_)Z2aA+Emh``1uM3&EAaoD*~MhZe4hv|K9o*9edvXt6EqEA;zv9ecL}bjkt|zG zjP1F4FntYfIh{5oc>+w(r@HpDgGwd(KHf_te)wUlmPN6Nr#T@rrO3q-#?MO@R?LB%bJ;-E$-*>^}&zLEp6aEbC-%=2RW zAa-D^BlYzW4hKCTb>|?ZvF9&#EG~~LlmHt1yUXh+qp2x*T7MrMlWU5I?|+jL zkbbnmW6*#i>#K;Eourdy3uZ3gJEOBF80)IGG~)L;t-eS_K(p5YoOj3e?X_87zL(`< zd#Vygm3+auc;T9XUb-W1ao;T>zgygJ(iuIyK9k>0e&*2QnW)NoOCTG^%4CNyc=1LAk!;6L3NBVIFjgOm zQ+08sp($pUaxzU}V}ol9mGIE@n!i@lo|;jBvWS~MRv7~8qh|A>k;tt7d{eEEtzaJd-6 zsjqB;;tN6snd38KEh6bFVw0M&IW$Z5-!lJXBPkGVKcZO4B{aJ*l^AUyl%w zNmd0ZP!1hMgf#xR_0@V2U;%V#YEraF& zEL5i&dx?++A^8%Dmvsbx3`ftMi8VxF!fxVB-$Bc`Mk9ePM9@Xwb+Sg}{=}n!j*=wA zr#u(gZV+4>$Wx0BWs&jGaX+E*9pDoEH{PBD9>5y8!L;{1#V+Agb{^dTaC+LSG7bNoT@+5K44dAUSIv@fv ziIX#;0N!PWIhdHUa;BhGR5Kok8kS{I>A(L4Ay40RdGqZAQWlZ#cUfq0r>moz~1UdR7)J+p{;#2A~()D`#tXZlF29soF`ocZQgeh&UC_DC_~=g%}& z6Qg%tk%OkjZIB8p(~_Nl0=cl_Kc|kxmB{%z_WM3N>v?T9zvt%r)rFjkPx>mB9mpVX zuai;BDE(>wutD}vwS!O6D@a&bR|YN`p0~*$&;dAra2i2-s~m<{u#`{igdN`brBqXB z#M(5T1TU)7Veo_lu88#;z}%y)4ug4om0s3;J%kGMN!!lgu*x}_>4HPr(h7C5N4`rZ z(E(<{cQMgc*B~RzW5f(#O;ZM@mZ@DF;#8pD0i(3#`#hT@g;CK_E3AmsARtR7}qRA9q=#|mn?q+WkDfnu^i>z*H|Dp!G`8Yv|L ze97BmwVhT*JWA4Zq&u7;#(+1E(xvo7OtEjFglz0YPCxk_*z}*?&jI_uU`ZwclSkZdv)mEYchMUYCOjq2TfdT`Tu3Id64^?a&mT^&&H4uyJSQ z^RM`{OHlH}e$85QrKpxc-cEw_Z$Ha{d(*feU047jw~rEn^u5`ZEQ4_oFR^|Ez8D!y?II&dk359Qz5&Rb~Uu%TZqgGov9dt?=uVr;z?YrApNzw(EE1 zogc#5C6JO_J&afRiFwi()T=9aLpuF+mvnrXoEy{?NhO8;a*ZU7t2SMz)7p-&Sb#r@ zRBI<|8gw_(6}V`3{w1pfm$Nu0d`M;{l{(@p-N)4 zuyYp4`e0y}WC{ulltF3HRJPD~Aux+KHn>b1Yfz@pahV63Sq^uAWX8F!gE>z`49}&_L5AA|hNd6_ z(NWTj4U2M4V4HB_{zSz}kl)vCPk`lV=Vms44OoQ}K^eBJJn|D`gUh0n zO7`SzSRv^6P`<0RiMt#z(3)BkgMfYNu(|DfK5RxMrB-6#^SCrTURBnbUh8^XC~HY5 z30VC0ChtR@rbE$xFv^Cq+F~oGTm`OD%nT(Q^>^X$1F>M_RWGgC+_i zOnUX9uWWDt7-#=xApjsJi}(AhHXWG*r?Ks-^lF@;hgjMO>0vL{@Ft_#qfu(Fh-Aae zCJ85!zm$}1_{@s}QCON$+|_4w{I2T@T8?4&DA^G(%t1X-l;9ld5`^}qxhm2mpkoGD-w6^p9BYuMJi0< zn5&?7u=SrnHn5Hv6h(qC{U&iv)N$b+vurnlRH*Rxx_zc`cX+1!pgMvS%iW&kSCRi5 zgXnkeW=YD6$-ELVE2YcKZ@>T?%pa(r4W+f;(&jsrIjV%9%kl@i;e><=gFMhNN5kvDQvl89EmNg(r;Q$x4N!_rhCg2iuCv} z%Sq9N=x5?@TQ-8lbDo1VX5+5yYTa9>%}`vZUgghOKw z-L3Tg{FzDy-%w`4(8yoeqy_=&xfT2OohT#f9wEHo`YM#KL>?ggkO2%{I(Aj#Q@#Dt znt?4j9sc0t%0c&cL-5*7?U}~SXB7uZ(KHV;V1N-&r6BEUw6I-r{kl^10r9m-QHa94 zx0Ek+MvW}jiDj!Xoiz6^X+XqBqsu*Eh{7raQBWnB{-z|$6{ZR#YJSz9?>)D}?z!%n zv@~lbO}*GLD68?ux`5z12_6&--V%UteZ7z&X8a0RYWJjGw=xy~ zJ_@)eea=@|NFT@6hBCP;swAY2#FaLRM6^)rWc8|(tuEaZCB}BFO_jrGx?iNsBe0TI zp>w#i{~$&-6*b(oSmZIAoU`(04HKd9SF^8EQ8dF>poxN3@++G+)@S^K){IRrk>M$ms4KLrUhyYGl{kYuqiWX7Sk zGd}k!$sCm-bkk&;4?EZioP`dG1G~3}$fMomzd|7tg`+B63sJs8W`#cxYc&k}Eif~! z7yH7PXrdBlEParGJ!K%NiEXN9XJ(ixc_VQ#7b19!3m;sD|BvVZ2{uE~SAQ-jJwX^Z z`9^mn4ShdsTbez}$nURYY0^tD_gSe{urk<0_Uf*~5YGxL34`Gt+X4twnvO5Nb(Uo` zNQvR3Cm#ZroQH>`(+3{66}sjmdi(U{r&LiziXbt?x5eGf$fV0ypdjR2laVX|?d}i{BrAQADW2R#nEDPp>B?*vV;D^#(b)1w zmdkE^_`&)e!Qk9@voOmyJ6ILS$YZ(m$uRBwPSEv3h?@$rK9b+(m<_*16+VP;of4E1 z#xrEWFtA`SLDA`-3^+^cwHNPD8p4}mp^(Zl(wi-~iC{Fu3}<2{4VKagQ6vW0EknX54QdZ{&4SCstC3Qa91 z8MzDl$Ctb<6dFPxuww>+EtAYhDRfZjRk1_9+U(C3<51Fy$|IP2Z(+{mRhy`hj8CO0ieuZrVRltFS_YeI98~ z2n;pr!&kw0zB6WhX+ZK4;U;78wOiIyi0jy{f`=|Aiv6$hsakfh(3U!q-r=M^s0{se zU@v#Nd2!5AB7*TI7b5`31R`5@$<(ydGfTrY%JLRx9JJ9klV#kS1tK%&n=`mNbOW{v z2haOQ%WThDMCs&ZGAG0G&0qz!<04hWYAh!BbT%kA2DaPXu{;?HVH54<`*2`g z5{8p}$W6u@8(iM<+!=JY>nahcI@aYXu?~U2#hlC4IA^}(G)Fv3%+%_fxnNYfAKnU5 z4{htrkCFlWs;WTi#L4)`K}#Wbi?Q)dW+CVSgRCm`Z@*=@UE(5YOih0-rLq5ywmJ}n zzIJd#4}VJ;kGy<9C|g-l%V(&tZSoQY^@<@Y^-gEq-$@_OCTl7;m#Hgg*qK#ux#EOS zCR~D3Xis|zQ-L`VFe;?ViQ2L9Il>EOH4?~Bo-f7>{1p)PDLqQ;SH5zDVKACSf`Oio z{%gpj;v%f4_t+wVk~K4JCcRbg z>68h?FxppouObAjV>xqKiDRvZ%eqGH*6G>UpMfC$x|89`K=T$@kfa%}SowgHe&+h|A0Cp9sRh6#b z;t2-T@XNnKL_oCNUJ4g+OV|i0R>BX94c_lV{M%e?>^W~x6zbJnZD_MM&w5cD7|ci? zT|nT?L(i)%hC5X|Tg7c4thB4b&?;Bu8@E*G_m_CMwFy9H9u57lV}FiVRY1g9$gOx- zH||pAD5&E1d}Mce8SXo*&Z;TgH~A-#(EiAGE_-tA$lb%i_?7L0S&HU1|ejp}t_ zyLz#r1+q5i0G56|L`%gpVELUF(+%qP8%l9>joSE9KV^8sRLnE?CbH}GJ}!fP6ZIm0 zJ3^V74$Q5j>xS0jN5TqMfK4Pwa04~uPa6(I|6Z1&n2H{hMbU)F7F^`bjEGjyT7h`q zE1fulpPZu?O{zotr!ZJiG{Q#DCJUx8{dR#XJg$mEHN&oOekBn`3%C4Om4wTBU2 zh08>6OWTHC*mGcAY68QGG$GP8Vz0YY2_s3oyn~R>PO9SI>oO{3^m%HHZv_jSPVWYm zG_bo6*cG`-4^OYvng`@rLdkdOh$ut1>Ep-+Yz6h8^!ay}B;rjo<`$7)svIKQ5j7W& zxCXTgP5P~|B8Cej>LJ#o0Ipx7WkDI@6=oX0M=~UNfry=yd8xGsd4UHu#ei*sL-=oX zP1jqQ^z%RCn2yCAYD`kS^q;c5DH+1uNlVyT@3dVKU7&hS<``T8OxmIaF%iP|+~EQg z_A)9UBJ1dIi90y^CsLuBn~w}fxN9VsjPd#dhIgWS(*XCUkVdPcQ0mHPKX;w-5i^Zt zpJpJ0n4=71U3P&_ON|@-`?XN+vQ7gWavKYU=zKK^Opw@he z43t?Xe$P_IGYmUkFd8+^R^*p02i`}?ghLs$PJyt82#*hArSDsYNt~^gjUXysKBX$k zh?XllOqTd(8Yff*ReNP7mylPhUHEAJA(OSoqy zBrATi1BM7lJRBHSH0}C$4etsJJ>XkBFfG@^mH1_#cK8!!yhz{4CKhwyE0gPutgrN& z;QeIuwOGgB1PF3#a~jcxXK~J6+=!TX;u#H0CPcY8#L!UC^kB0sEA=F_b^w?0an?A) z5XU0)BbA$&RCv?T8(|d3$j6+t;?sE%U(~l2@Kim~S4o7|yaQEPGstUC(zk~Bo-rJJ zzt_zwsPRx^iIbWx%q9#@-8yiAun(<(v!>+A911Zb$@S(}!g^$$k>=In#~6N6^MkX<62Y zTtj{_O$|0#w0Lz3o7K20pr#^xz~Mi3M%JJq<#lY*OqJYoE{$dIB!DvGqAopbGYH&q zmP1Zqd6Nz#M6$#VF`B8j=Od;HhSPhP1(&5xd|_R=cjEjMqDDiItJa=of+&xOuZR4u z%JtkT$USn_GVV+2lM>0Oc+_K!}a`NNn0>U9cSP=$mX znT`$DDEvU$)2)-03oDoM0P2vxp%iGhZ8I(#6`hh2D(KwB2eb9vk5@IL$I@5%D?VeMB;_1LF6k z&XB1<)1o-MK;FLOpuL_C9KD#0$G}^Z=F=H7nrV^bQ0eca2S}i;tC`8pn zHkpD({wUPm$S}TI4sI|V{sXle7DZc@Hct{`;1+MGM|e?h{;VkUi$cgT_U{)Cev#%c z?BINHPrHPv_R8ytfAhRQa+?~H{Ispqv3U1&5eP*1b@@wCxcTg3sKuarq`E6Rf0`#1 z4bVB#i{AOjZgeIn>Wgw3N}5qOre};#q*u9hU*D!JFFFuZ2I2exC%O=x%*pT^Wy#Kc zo-LOVBQY|Hff%G_3nM=gS~dkHq_P$351S*V7(88gqrW*|9&?ndro-KUCX0USGv)Q&b6a*lNTqRV=%jN zF*5y#$PYS@>PA&6fMx>2o)i{ReFipe(hYV}zX|8K!XmF7WzavH?{Jv#Fe@6HVcn13 zlDmin{9=0h4BVXH7gy^=DxDS>6;^su3jGq%`tVS z=KNowxm>-1a;?Zb#wxYfh#)!?jZFPHKxLrMN>k%7>JZvr4w=*11AoCbX-fKKZ(I^I z$xgnCId(iaNJG-1rw^fVF=KZh{^0LF^<0-YGklPm2u&$=$t#`GI85&_s48IJD5kiI zGEDl@3zV~=F5~vEEnhLAB;^7Om*Tmi%;aw@S{Nx+y`v0>X5@ zOXBl1@utN^4zg!?j2{qopu$lq)O7r=X1QMYC9poC#IHA0`xn9q*t;%j_DRZBQ)=&G z;QM{vL78y|EuJ-=^;tFH+b`5_eV;SRIE9|Z3=u~XZY5ljqh*}x?fPLTHJCgpnB2vy zqEm8v9xf8%9fB%|f8@KsF;j4iyC#L;c*(Sed=?!0?T$dh;B)U9OHOq0K_- z4BW6rL$hBGrj>3ivs*%2ns zpe-~T82F)I2+iT6`~0 z7#fiUIs0X{LX3UYIQcv{w|H>uWf9Hf(O8$JsYPqZZPTX5OapYlM0V3U_Q$$lP%{O> zCb-g`e;R8$PT?AO%5IyX?-ChkGq*xLyMNLUieg5&0-&?yFLo^0gYO+3Nv#3sz?-v_ zv<1{b?_%yim$E3NXQo?=Qe}!<$|44+h%NncJVD6?vghzkKG4s`eTtfZDmJ}==zUDG z0i|CowM`Wg)F=g$vO)gt>-}0praZ`|$@%K(WTgkQ7+zj+7B5UiR^(xb2!}gwqo#P! zTwXd>E7U#i*!dm|z2(YoMZ$U%4Ly@LfkU31DRb1-AAkINx0TA;1thRh9ygOgQmeCx zm@@VhCehDf2|#-^%1(--yfo~Uv{QS>kIEGuO8C>9xsLRqvsJjd7^Na!r@U%O7BUcd z`F~6a)tBU{Oee4=4MloCM>6p@WH=E%k=9#qHCe(WiD4rBu2SQPU#bq}HO6 zCpCq_cfRyLUQ^~_%y4gxaM8?aW&yd9d<(3bS=AT0!*RRIof5wk_)g|)Xkw9z`QKNs zwaqO0n48d6w%5>a$r{M)m^V~~iz1O3%n^liMI!fT+o;q`S21fBwk5d=*&KvjKs3C{ z;kX8rTqvJ-43C32v5m`iuI+lIpJdPx`&YyQb0{xso-r~g9C0;nlMY#K)NsQ}n~Ho- zOrqOiUxyfpsf&J7K+W?_EUMPB6a8R|+7%!pUkXdd0dG|iTMx-ZYdnFSk%+y@6Q?dD z&%mn&Se$gP+O5V*P!ay09@1;=_lYrJ`+0AqqA5W5-~c5FQ!RQfdvr)C6mKZ8NhZ4B zIbhPIZil$$)Ms-XG4t%K0D2GL9IO`u!V`w5Kn)6oFk@aZ1$gjr9iMcZ(8(_ba_A*I zK=}LLPbW$;AN(E+Rfs3gRK|0Y%8X~bBw(1J4SrpqoyAl4_`Rh4rqMZ@%&^tX5#*&_;*pML(yuh?PnkU9|;Z3LGi z+F{%bcxWbs4Vg{V%7U&qZ(nYAEF#SGXM3we3m1ahud7xR&OCxqQqmPpWt_xRQx5i{ za4hKX|tKf^(+4O{jEyCuZxK4d1_of z&D5`pg_cmMtv)~vCj%CHqN~?vFVKwv5WdHCB_EByuolVsk*t&|rTz<(;4BC4$;{>Z z&1xngP0P1k;u-s^2)w0Zv1j4W%tcJo5Ep|bLp}`#dX)YXH)XR#km@t3o0v8Tco~|U zq2&u`8K=G6qO85fJ|Ytf{l7}Vm=A_+F0oB^sVDC z^jYC=xUxlg!0tbUFboQS4^fUcg}l7$y~;+yjmgS4JO~&nNrt*$n8RSiuVuJ+umX74 zCOh%CW`=ag+?34ueGbF0PbV$bs&;JSW>2ZKeT*!5n|T`&BX<8-s&rO$NJKniTPu{p zY@ZkL)EoKA+{5%E$la*L@P&;uE@M z#V5ELZE?&4ZI`5IJ})jMNwav#QFNZque$uvJ6ffa@KOn_bkn}~>U zEC+wt-)K!W{#qTEk$cvakq%Ap?F{J!YEsrFy8hKp zS3|Iaa3A*j>7_+LK^6$HA^NcG5kY;f`>WQ(-fI}#tgVO zGlEMS(qe94Ged;Syt!F;9lXXD4=_*b?(w6F4f1*DAz~7TFvG+3{hDZUFx?V^o>7?c z6)}NiWxgDygeKb_WK;oE!xYSqgNU9Mh8#w?$2455{Ei9RXhI#e0uV* z&*3vLT}HfBP??p*5|T`Yze6Y~U)`d&5K3AmuCI#fGU*35_xl;5?;zM}EuP@-tkt59 z<^-d^;o_$y(%}rk8?CtEmq>>!zcNS}l9)wGpvg8_Vv=;^R5^D3hJ_$)u%a2_tbEDU zhy_r$6k5a^`xyE9arR3byYuNP{s~{nJpn3}kx~x+3Un&$l~27%KLU|~5{}!+FJQh! z)3SfxCW9&k3eOcne*F8SdJfxzTp!{Lqu~@~zy>(466L6dN_%wj*9KzXcvHR`Xl?-@ z(PH(Q*@fV%Xs{u;IiC&=#(%a80q{#UNU0u5bp9Ale63%t!lCzY6QWuq=Yk?V9j;p} zaJ*p16`7%+`x?m!16{!S1f!`BQU3$usx(W~N$m7u*GD=9yE}DL$i*&Oo@dEFgg-Cl zi+e{8G;yR?RxA?Acq2y*C-ABkCxpStUlWVzrD_`NQYkewA2QES(n9@&=Hx0JVy!tL zl!R5l7dB?U>7c+QL$>?(s&M;1kfE~Jn-mM4?KJ-3N)ZbP5CUOJgq7`{wr62)n>-CL zd!o(a7*Px!5oR$91r92`880+WX}o4NiKthK@bC4Z6`QH@qzM}g`?2fWTg98G*maG# z?8fGXdv@O{2DwIxghD@^Yt0p|xmsc8k5GrSa9_>xpHFQ}Aur&zi_I93 z1@K$hpg3-PFuPgCm0${fsBHO7vLY027kVd3(sCkwbVEh@J}?GNrMfr}od}i#tS7{O zwt^3EgwfB&0Vez2{&ndIM)ja}YDYX7LKtnhso8f`nCYtf@wrGe7x)oVWzTb#nT_rZ zP_Wk*h7u98G3K1ZH;9kA#_$HkxxC+eGS|gvN&=UX>1w?^-w`o1Lt!g1v`b{87cx_J zZ&bwqMz?XZ@kI?b5>-WP&k*B}~7GSy@y;3|y2{8lgtTB2gty!UaL1M`W@n67`rg zbc;=w{{{vlegS5`q3j^GL!KSzYHSPvYu?bS(vl(BgRt0YW-zgh(j88iLX8%I?^?f> zfuRg|oRhwh zK?j1Y8eiTFQzX(MxxyOmSLSxOW9CcJWaxgmg6}H1uA`a!PDeoIq^ayUZ#1JK*OTcE zvx<@Z$YWt5%w*|$b4DtmW&%_y1!f5aLwX%h-y{3RdlxugNf){V zE%exR1orTItd~5Q(5m1kYT%ZgKlTGr5+Nv^9ujp5Bufn^^`a-rdfR9D{RtaG>G!_& zuEvfWMHXZa2*Q29Z_aV5jCDm&0cwp5s|T-*xwshyV)~fM3c{^{ z78edww%9t{Kh*<>;>DkyY1tuP4A~j~@OB{lSIJK!YpQX@OoJGp#8{*%P!K;L;{On5 zAk#!)h>h-+laUYFxD&ib-Y39_+J0tUkX^2#BUalUQt^H53lN$pjEF09hfqy)i=^dH zHKMzIp~hN%0gBU5J5EA`ql}74KRWrNy5e@#o#3TWl0!_%j)ta1r0QMAeyB$fgD7)m z@1Z@y6U|H$8N`s;p5+l__KAA~VT5Xcg6| zQ)JT7BzQ;>GLo6E;yjE6?(8pTl11KPSw8!%ZydCQIz##n;z0Q*EjsBVNP?za^tyqp zEG(+U*CL$f=76xO6D$=5+g#7Lq?hcH}Nx@0>cP<8gSg;O!Wn(uPl^+bzoX{^7) zK{<#szQw7uGNgir4Am?yluzVAL0>)U2KEb+;HF1-vB6c;C@w9TwOvF3OUl39>x0VB z8IUf@9w$_C82J<}Por1XPgD|v5+>r(lcxt& zZDVKdf=qU@y(`a_0GElaAsoM%DuM|pY_i|Q(tA^qAU_O<@^Q7k>;1Z7Ut;#5laPR; z<&u4ieTUsFE!^J$bPDkJymv0ev~XIgAM(22~p)GEr-4h{m7!4&EKq83aBauacRPs zp!nwn@uDATAzPHhblxE2kvx89Mdm!LYkE}W1X4QTw*QHSvBhbTE2HK3QubotI+}@O zkW{x2J1hxDk>FPtv>d+-Jk19H8&1?mifQz_B=5>QnZKIG6U>Cj(YdUlvMm5|3~&co z7~8ZG{vy^_V8lTHx+O(f1FOonO&y9879G<`LB9li%G@M|;)cxt?B=;TDYrSw@j~>;?u`<1#~9C$X#=QG(K0+? z8A_32p0V}6vU;xTYU2vQuhK=?Q(loS~tb*1#VyF$xhnz1=N|-omcoB#4 z%9>Ybv=QRkwqkjkt{}6NJdG5HqpWTR`hHZu7FUj@x5yjv)i+wh^Vvi0KP1PY2P)xy z-;{Xt!m7)|JvX}b^%z}g)s7a1QBEpV-U6}qJ(-_|Mn^Vwt?=IGZZ18xpjB7&Y!T=x zxWma)Gkksvfw=aA>_S-DT(U`Nf0-ta_X?)nq6zget( z^92Y$3>3)JKzlQEWVar2l*Y4uT~p=TMa#P<38oWxzAbQl{!^9$=K)tXnO8{I9)%y2 z52H5f8lqyJ&k{K&dMmmDe;dQejqye{&`u*a@;rcLA%8hD*P1)A!$z0!C49#onp%9^ zgv58mWc0AurhXJkglhnZL_CwiWQ3j+0!oCA?0Cf&>0w#y5QpU;Jf;s5!m5@Ui(=3C z8hj|AUpkg(pZCh!&%F1_tN^8h`FUDKr|3T&V|`8HrP5#fkxyTQ?)VcM3rt#v?`mLf zh-M_F0GxfOyLlLTdrVEOE{h^zfx5fCy|rpdWL&ogY|zO-J<=_xK5@wz9Vqt#4TB$Z zH#)dk;@28hhcprb3-hw$xDl?KD!;jYwQg%*2C?6jMl&m9Fc!M_Q6^O3GG$y^Ro0Xw zzyM#7iI{Tg2ie3XTTJ*CPnSM=*&jL4aqP-GcITs|vHJL~1J-MP7FfIn$!yH3kbm{~ zy^eloUN%4_-@DU(0uaCN=ql%2DzB#`<_qeCg$;lo)qmEo{Xc{NfUW$M<-Ghm3@>yq zwh!M^w)e>gbqi5JucY6phA`Po<}0EN9fo%umG%36u2XiI(jRSlNm&p>bzyEeJOFjKU&ifHr_2* z4>0Q>`4!dq(ZTFvF;|-10uAjT;XKjhFXT{SkiuVScNKR}5wU{}Kg8mV z#wnxz>-cTIc*ESV1KV9M5Fe;dW&lLxLp$xtG?375pkf zqD?P+X|D}Hf#Ua&xKLU|3@SETMc^aLB>M`rDRXhF}gc5b)eJMj}%#(a>0EZA|PV9Cab|aspq5=-6oP@g|k{ zVUVSPz+o|IAWi|O(Rz)gv04*-_i7|4&wFtiY z?jh!_qd!8}t>)c;t2N@O&=7z{eU(4s5G9aKRs6Hx-9W)R_Vd6)lV&S~KbRq#|EOjH zp05caz!K!$c{U89Os=Byn1_v?VSK>O51;|&l*PZsuE%SWg(BNHE#%GmS$-%{`U$8w z@xsGf#(+u7M^3BPT#|9X6e6AlnMDb#6PzLoK>3c;d4f4ZQkSgU{6a)$yDAQ?k4|Ap zvnClS3~WOBA%i>368^qXv)P7W#znTcf{%}(DN1>aVLuQtPSkQ6uU=roivA2!{jEEt zH3hB?lf@<+b@jio(K@0|<|dmeh~DkMMMh8|zX0I{uW^7~`}M%Ea@vh2^}88SYZSqN zn9a|cD+nEf1u`0(u9mD{qZxI9^qZSG$c(dqP6a=I9|Lgf__9DdUctnv(qgqXDeF2k zElT$qIB!(nY7XE@VoBX>V}8OJmwc!MEk5tbRHcGAw#r1=;*7A0gq9M%2(9*>@4co3 zodRDV+TZnQJ7`rm9V>9B6Q7o$n2^zFV}vEPrc+Vh5lVSpt{CyKV1d212)u6N{k7g!kNsN6dZiG+EDb$?9!@W?~QxJv5sN1n6?+mfQK z1pJ4ucskKXuzqrtF$;C}c=L523{r+3-e8d^h}8CeqYxkIJ0e$$qlh|uwf8k* zd4;rF6{~pic&0rdyaZZx-OAuN5C2^>S3@|~%1coa(UH6%fAHe5R~|Kd6d*&|F4z3M zD7(~2E4S`Jknq9M0_n@~Xb~Q-qrEB&&94>F&T3?YJO3L~O}=Hm@Sizdr1yZanJiX_$<%zYbwx=`T z?M&}!yEs38ta%kTFEIShp^gS|Lw89WkJJ$8`7F~li5<~rM*Kk8^Jl$lZWIr2nX|zFclUlY~e>sti@6~ zIQSNYE1Xzhs;cL|!z8$5ID7&$v`PC1jkIB+jn=SFG(Er7IPOf<>t`QF4GDQm2}h{b}3-AFu1wO-*JtfFn4uzvls zh*WrkgVZvnr)+NaPjUpLb^b$HBSOUo9D=e=FIVi(jwzQJWb$g0;Mrr$u45Sd4~Gui z{*uE%j7m!XqE`*@Hc3cUtt~kzMMbDNr=hi#|Ek(skZ4o~4s4eyziX2o zl!5omv{%j<^xUK8AV^GDQYJ_jVxTsyvZTi2{1{6Ms-ewlf8-tZ;;0Ka3j>W0E@!LF zo7$8Gs)%}0h6_eo-#I|0W<;viKe_MKXz}Ham{-DO06iir(RKJsC6d=Smz28X{#4rC zC_Sb~;NS67MKFn)fJkY&@ioXT%_aME3`Q4G9(MsM@x)ewAud|7p8L}uY!G~Cz*+LU zijd^SV>Jn}Xs=1Qaii{su*jHus5$rmAOBWV9HxrS`Cx0~sGD@z&o|%A(-m>@`nqJ`+ z!&Addg52A}jDFIDo)*nc@ zg`O+oF|0V;(Ekam#S(t-zu_HET_POxCgVP}Y~uNtp&Ugyz`F2e@B1ZemQ8*-Vrzh& zx6SB{n>D2pLhim-yI?56lN}2g8yc3_7StucfZl%PX`&5oo zVm|zT--|jT8}|GubPEv!kJ%1=93VN^pX~XyKNP<VLQ`3h5iM^+9HL?DTfy^*W|5_H&xjfvY~m|k z7l^r@jL9N-SEU&E1AkrhDKAvpqw(bk{o(mT@F^qs*}}#@7%Y#iq7=^<5wwbzMt1~< z8$~b8;~7~+PHZA%d(3vuvngUr6I8boa^a>I-!+yc{DH2O5u#UxnKt#Gj3vU*WE4YG zf<&Kgmn$GQ!ncGx773K})U%XKIPSayOujL+y~!awcDz?tpFvM**mToHISmd_A9l1ShyY%ErvaDh?MV=1gGiD_U5m@zo z@V1;r)&kq`%1rHF;!zYxBYyF#Xu^kshM$0D1j2f%?M3X@RtN-+EFjqAgzvXW#XLcI zd&MfdshGn>OM6^t=htj`)7oXjT4!@8>UyjRs~1uVA_DT=ywS8rJ0Q+k9i;L6D>*nj zDQd;nzY=KWHwM;-&WXv+s!`XQn2IY>bDBVpv@IPcs}=$-hjw}`i4e-)!J~uDvE1|< zX$PYjtcF-M9*cdf+oKub$4w%VVlp9Hi?mtl!gt~VQM9visfq!r`I#w~pa>FqnB}ap8IFMwMbi0mn6yspN^^9zN5R;D~a*--eS12A2+LG#F1bsYE^qbp&Jd zotB@*#)M@K!0YX6FJ-QCd(I(Y`}dr&!=G=^!Ukj>5l+j_b4=zDR6gA1o)hvXk1>q>JZ_DK#zm0LduJ7TyVh!pgg%%e6YpV;l8&asg<+D|g= z(Q_rVdvfP=ByC%9?Ku}>*)|C1wZV4$THA*G5})8}*zR=Du%D?38G<+fuMczhZINwZ zeMdi@x{HYm0A!lDVT9k+S)KmPdx%;Wkixnz3z%PuGLI*v>>hKWNfAIj1_zV@69>(6 za!$Zy3{jzNz2dqXOQ*}{=epzXFGQ02UBQ&LlUA`s7AT=)1XnEGNVU~OCy_g)&>SB0 zG4nh0gcKApT4oV;l5}EpvOIEFwT|~(w43xIWHRlWSyG(Xs>}*Hq@`2hL=dYs(=#UB(} zXa$eQ&O-(65A*O1^B80$%<KZUxn3=5IMiz*`R z*V@Tqn#T=M_XlYyh0$p_Io^UeU^C#LqV`>pcgB*JSs#@(ty1J(V!;K%cX3RQ=h-_U zR7GP2b#Fwi%%`HPBkCAP9W^GA43p`DP!yCzw%#>O1I1jC`l9gOM-fS;6|WtSq_^zN z9tfHvw%@EuM`(JgP3zdg(Y#RSCDZUo#*amq$y~ndl~FcIFX>^u<@k!mX6eC4vO6w_ z?K264t$>25(Y|kS&y-3?eko-iYmb!lG|yq8>f_3W-8Os9HwJJJQVGVWD+5W`-Xm4m zQev)@K*>tTw{5JT4oo!uM9k`F?qIEeo=+8W7i(C#o=lSRlUEoI$U%HA*46$7c?%N2frF3ZI>46Puv1dOPb0`o7Osqm$bf+kSCkt z^?>!%B17O$IQM<$4>ME(-E33LhnB*zZv>$*F_ExY?b#ns3r2?eOAGMUy;l*Rg5zIN z*lNieP`P4Q}uq6%vK|sF0WY9MQ zVx{xynEB2Lcm^d4l`v`K7!sMPCMAQ&ReBvNo~5wiykk*ZbJ#Ey>6Q}0NN8CgCA*JJ z>xgnT6%LJC9)%R+{9Hp4T|qs_@lT%zPl1a8(IUJ!2{ApU@Y@npagj2(h;QCT zFUbGc;kgKRiM&s`U{|QCOYGE-n%Qhh1AN*1jTY8V*pW=O7+?1KEX^$H@g<@FD8sQa z{A6odvALoAV1IgCBXqT^8Zz0lfxod6`mW?PIAYwL|<|$ZC%6cl>_hwM%?>KI0cT)-pnbsam zmn;cSxW-xC%Xz7U0`&0Ut5(S{CBcD3A(=IlzLU8J+d<@S_?SviC9h!(@je{TY$$RP zkq8`2mJ5&`B`-7xsccVq1HXTH<}Y^aYh>xkx}gx*nHF(|cURNU11@$%a_yqMQ%0vQ z-1zMG@+450&P1W25_-~0?D|*?IgeY(;STsd+|HOneRRyv62)S{1))KppKg>WmO3 zMrHl1*&=*5GD!RmCnN$IzrS%Shlr&>mC&$SgdiGz?jfb==b|>K$8+@+^N>$5lLQ;VIYM zNdaaj4W3n4`%qr;M^;$?i9cr|gD$840E)X1%-@H?QX}7ohEm=L1D2^*MiEOYSX3X|jLLDw)dIE5GJ8c_D3&O;}P6_uD3g=MtYwNYA4B4QBW z-`ILdP!6GzurwxjKVw+s)b=aOq%(mOiX=xzv1{IR;W{Q{zT9F9LCir&nj<}e?g)4m zp|j>TVNZ46mt%04rr982*PY;nK#IyrwLXV9$pWCA5i5QFPS0LTa265*Daz}KZTsjV z@^1x}Ub!PP#R~ZjHrj&DK3PS;VW1Vkz?2GWMh#%~Qn5G&I<(mmn81eL!kw9gdOGmuKs+lmx=h+c{eZWC1wgNnVoT@L6}72MVxJ%BhbeLbqZqJq zhG^X{7QtLe2CQ6NH?8*k)7)EpKn!pF8tM+wmfD#8H$JIUVpDoc3OqFN3Pl@tNVt-v9)ZG&%{X!*5b{jZztZbLwTD7!#??OA>^VZc6vJ*%+d2d1M=r^zlOG5O zZvPyE9Arcj>Av-0iIP=SnGJRHkQ4_$o#-OEejL`yEJ}4ynWZo}V z9QsQBzteXJ-+3e3sR}8??o*`9s0VR)@lP-bwV4{%yMlAXL;Sw1)|1w^wTERgdyFej zdRq$38PF;9(hl1|&_MbG|4^iU_fg|A{fw+y=J6^&3VS{{@=zw8+FD<2Cte#ZI|^@;rg)XwcUp4d@v4slhuzszPpgwoaH_>40gu zf{17j4>?$k|5^!gxo)(=fCK$rMeUU~bLArjC^8YXHQ^7%WyL&1_JX=2E<{L6%{aui zVtg92CB>+)(2{GKn|8lWNH9od0308#&ZbO~gOHv0BEy!Lkr!tmB)96G8KOuAhxjV+ zhEhQ~lvZ>@3tYySJ(q9-XS@X=c@6+}_V$DF4HSQudD1P zNA|K@;%G4&dlE|V%-t*a%g9g@h52P*agQ-vXBJVY{Q8+G;jGl1STMW0G_=dZzK`}8 z<*A2n{hPa3GO@17&INQsO9jk@u>$9ynwLbW9Es1+!TfwwC`PRi<>pls6;WBy|Dc6X zY63CO{aLGVQ!J&CBfc~kuk@StmeNTus!{(x?u#sL;-YN%1Y7>+#2-!RzJNHpRh%Q$ zVmd&aEd@T7(bF0B{l`GXI1PcsJd;%wv4bjoL^>-fj^**ktca?zV~_7#5Qj^WB9HOB zSwBfJjOPw(R7kUVfu^;FgbrM$(PfXAM``KF3x|Sa?s!mXak+uGHiqXef4`OGq%%`w za66S7^%UbuXhE*il~0pey(KmS7}*n<%slhtq$3t125?JCHhu=WXx?~Gz7o;+dYT@M zF7KJ3Ei3G)#gBA0=QN<#i2QK~f-1#1Vha9KUKk+8O?ptyj*M74bQ-rSQj{K7mgQ$i zM4iO??R#L0XJgvVeh6s8sOR_flov&IPXKcoeZvIRkJ`^i5@7q-Vk^#(iy!fOd*P^Pm+cb5ux&R}d11(0{NgfehF19z9Z(rL<$Zm&>!LB1F(sv>0Lf zQCM{k76-33`3?{WuaNBwPN&O*>k2q6w|1M6W`j;xIcE5_Hnr;aq{NBOi_*HZLxV~- zE7hv02g25siGcVKh9>~y@4z=l9~ZEGl$uSHb>)aBJX9-O##_Ls+)O~#RiqbyPYM{D zoATtd)QYeJICxRMzV#^U$tzAbx|aAG?KnihOOlN?-9KXq#MvUmE@@U1j9Y}`FNy`I z=R^qX_rKHwOU@1I#lbSW-6*tlKGsmjKl&m z928AtP37dT1wWZ21ip7~j`_8;u43!=or!fz+8^X)V&E|tZgJmw=H#h#-$TJrC#)P> zVJeVAJAO8$3yx^>-{KRveryV(I= zaC+ zrg^prMV>3*yP6-!jvb3b4vic;ZQD8#)&XWs6HfzjkrIMKG;Ud7O zS81JSp`Cw;B2E83+xbG~Oyzou_6M)Z0e!`mzppne6kmc4{=h1;QVdBBM2_#&U+N7) zqOXrwSvrUsxF+U$ldL9F4ocBlXU&tfO0O!YA5UvrBT@vBo^s^sMP?I_YK~!xzafu! z?Jd8@YZN&wd5TNHh1{Mllrpz5>o{nNUj_r9GO8m^GV8G#1+dI@T*Mj*iemGWPt5eU zJTWbj)fC^diI~C70|D0GaGo2UN{U)$xw^64NWF-OM9(k2*7ybI2vV*%LMSFZ{6|+( zG({w`#GgSD)2m01%vMFtua<*EzLm@2gDY=)S$B08fuUqfC=~&0pNuEC%sIHcnMsaE zVgwX*o5CK5r1u_#$+-Skq;xe1Ya$E9YgExFsLh4Z-`^f)pqzqI!C~g&SGca%%z76e z&G&u}lAyA-QDn99Ah&WCUt%_}j7t84oNW2|FC`+HR0JFW=!I?P3J5%Tm4tA*Lg(f^5fv2f<<-a+cNOZ*AAu}^^u#xj2 z>R}UX0*wrI^JupERGCb&5tMme>D6B6wh+z2&twfB1Gg$90R0zx$5@Wm89Zu<_(4K4 z!A;~OUw+pB99dlC1o4fbs0C5pM?S3Ei8WZFKufSYoBzY&L|15ZrJunXyLI|jVuQ03 zP_!M+C!|bD9*BwR{zH}toR?+doo@yV%MY;)6~S=e9s$lMIA&7=NWJT3U+WH#>j=Vm zNk&Q9BR(zKdCY^{z1ikA&%*J;WHcR9V zAzp-G4@rUCBD=xYwzCQmJKI*}l=l2=xaz+j2*!Z&=0>W98d!{F0hz~`=ae; z#Y_`4=1;|0ZM7#&7iDsrA)Mn6WvkZYaK0jCWfmH#_*q@q$=p}9oQpHaUt6A4cbAy;;^pW^blFm2bL>2#-1TFhM1QM@}u+Ds+ zHDhZz-B7d*1y-CKj+yP9WjE9jo&O^`weiOf2WwfBR(T$f9lQv3H@3dUUC~23ia~!+ zzpf?DM!o{}yKSw?`}PXML{5OF@l95_a^Kf!%yN)jV3mtN9IuB^Y&Wnx2AOe<4u$$j zIj<~)=u@YZ1!!V9&^X0!rVT0jid$ir138#r17mMtHi{0zT@YW1A`cro+>T3tjEwn1 zjAR0d?Fv1_b6$go5RRvb@zZxS%~Wp6mwFIt(%#Ih z6Q!SL&v=BC9PtYn6_bg3fh)9?Zj>3wu!#T>%ja|5%@PYTreXx%N>;KHd|xI0-G#+z z>n%N!uw;o&(C-}fQE3A-AA+oh8WO4b+t9I=68#M1^m-r{dM>sI7mJ_Uu6UEShZ+OY z=c1*^Ua1-)QimH*R{ne~=?>Mw@rln};v`#Die^5qB?)qJ-1OIM*~q}3f#8h8hsuI| z7wFOLm?nOfjz38tc`p{*LqD;;lXq(2)Y;ONmTICZw7Y>!+^ntNYw(PbF2jJus-}^v znyys@Fq}iOVGP=;c6TUNm_q#gjav@FO+ACV0|Ur$M=>V>#_dY~7&#Ey`hc9Vx%(+m zrjwzJMi`d%*G)hg=|B0Ock4U>^0FOpHw-pKY?Oi+iIG@&jTlv(Rn+%Y)3c0{ajiUy zNaeYdW|`*+BBAIgiijD-`zsv@i0_Vi@VmO|dOH@#QM^MB0|&zKA0Zw}LPhe!l#ooj^s^B+ zCGg@^_F@b?*%?BD=>q057VW8A`@VE4L!w=Zhqqz@D~jsl-KY2U`wj14k*4qaJm`ie zPiVxH5*#oY_R{-t!{+fzi$+3l8}{IEB|-HW4*> z)44KBKCuq9rNQ_PZ`$6H;M&neBE2Y@GhF1#KKmW-O_A-ctJ2S!MlnI`0VYGt%*N3Kg%2+~S;P$$W0X%EudyOPpxMZ@5qPwzGP;`A+`ZKKs=1$0Sb7q8o+Oi!OsR>Kf5?PzBzb<=vKbpa?8~`VG4S z6l2Pf?;qLWEK^mmlz-h=rqIPeczt3jm0c*c*-h@$`B3#$1yBO#TDeV9UbeFB3YVow zq;Z)wgyReXzdxyZ9j)mdnb0)%Y`|>VYK@l=i5M|Cuh1%<9k(z1NnREnGpw@_8-Rl9 z`@j8O7rHU;l+Lo_nr~7efm7J#bBwPKN#VNg}+-C@fwrEz1wGgvAZe6rQKZSEI76nq-rj z>3|oaghfl`-Ifb;h9X_f(=_evl*OtB>6j7?6V5@%H_v>JIoC2A-1vuRTR8*J0{HML$j-xm0trN}OU`ro32I|rOk4}*gyV>w z>O-RMGZo5`P2!1jVuLiI1Y&9lH8Wzt*l$$6YX0oq;`TTS*6S3OosODst;ZVgVEcjj z(v8&nRC+KDC^}h&_q>Vp$bT>3*0;sTW0p5%g>408lSA?6Kj+?Nx6b^(`6K`RUd#Bs z^t6UE#lISTs1ZJq@{$=>GD;Ir7&dK&fPIYky?7wdEfigmT^jdXmVU=Am7u_scjwrG zH}Jb|HN-AHMP~X6EJNJ4?@MQmaqWrsG*lcQ`f%3nnXHO&7;Zaifo}F2JrNaQ7;`DI zRnUCY1U(Kb=;7*-_gJ2ClblF~iHogG))UOpVYMh4lW95xQ1_G28p{-73i+CXXj=U5 ziIa6Sx;cI?TzV4CV40Bx>0N_RN-*{?Wg(t2MwVJgGEPv`V7Mb{NEFCwCLWRTONmm8 zMuy6y0^7Qta=_KJx#ty7xtr5ic+ZT93RI=RKtLRvghpz(Mg@YX^z@`?lVX7Q4xqGS zmg%TmKu8Qb@6P7_Oc)Q18h{!w)H7v`WC&0g0gRwQjp^&Ps73PJ86@(T%$g!l&=Opi z>y9+?aF^qm$7Fg@1kU(bUIX!-0Z*i}L+V|z(XGprlrmd=JmT{pMS5i!<(e@BzXaNF~Rkco*Xb`sEj zvARZgN0KzQIuequtKzU}*?JF76Tl2y;BS}=l?a3&la3XORZ$hiHscQ>Jzzv-t{ARL z_lbcYIc2Pn*tvjm;9;&9^V2^-_73}beF~$!shD&wjhQ29M+^pEq!-%`{#Q6vue;Us zOu`gG(z>v;+_#RhP?ToLHQbNn5yViE)(3n8CBj`vGDpOYY=|X}WjEO-T@71JmO!~2ON$`(!)%fV)wGmi&H$&|4>bRM(p-|uaP4z12ykb-0Vh6{sVb8Wf2t;V z>lMz?i$D6SQ1eEDJcW3YWx-6g1mBXz!OGr3%){{Iyr1>e*BaoXk8kby*}r~-xf>tw zi8z((Q*SB=otboNYdja{(w2(8jy8Mw8^*+MGKAq=_5w+r%rSQ9)D1#**LTof7Z_7n zeE%`2o6`ZF_E#!!`mmZQar7`o*>?LN1Hqeh)b;u#VaweymcWnmb*0TRI>EWnH-vw= zG#3Rk+c{X-l%kdG2eZeb_3Cm>mv{mYXeX+DqD5ngihA1e;VfhrEi-Rp{xI%JKzr;k z_jo%rtplrW`RcWmI-_cdc5D|RvY>i=4pX8D;f^BXfYY9j*~OGE52kkx_Nx^u*GQ${ zTh<#If6rBtW0jsRZ#XXU%jgqvCx)4t-Jb$JnF}i52(rD85$Uo>nPacQez(;}nI<#v zO2&F;tfNqisUQVk`jvyE$AvtP;g$w3d)NiIa_Y~3m$!}-wt7t<^xYoCR#=OTJ9ds; z?@i6vSC(U@03+@@T;Vm5M}X?S0$F7}W?p}}o7Lv>L*Ht5QS4I`3>u4Q;x%uTUxfbC zbzbPe&DD+uq>EEpjI?7{J1_%0tK4xl6BB`bZ)LpzOtcCe=(Nm~FqF1%{w1^vEKm^W zG9+p^xbvO_kpv%%^(g(l>p0J{gzKUeIJ0eYfgo^$B0$2;tQv2pVCaaz0z_jw6VRSh zKVB$Bd94q<>&O$C9tf2MCf{E3(lfO30f2!P{*4x#>0{9}Q}mUdCp8W{4BrKeMzql~ zDpe(#u#Ai$HFI9OMiGo^NbB*uCg$P)oChCGO;3>Z)NF`fnNxAOO>0}igwUU~6`O0m zrj!R&HD*gp53FjUcoMO=X{!-^G@t#I1cvwsSaZc((!JB0sZ4k(c zG-h^=2*}>_g{fgvlyd`n^3|n$I*9*Td|*uAkgDO)pL1n(fXV-R>7g^+ohjO2pKaX5 z`fZ3_(1Mo59l*Hs`#Gqt-RiIX!)2DuoRBT+jHlje7p5`nITSbd#4HE`(1U?g>N~SN zK)H%vp`SErJoW@8$yi2oDyzOSQ(;6siJ!2r|9i%561{NKu<+PD0+_!e+cXZm_>84B zmx_r5lln!t1Z*v@04Q?l-iwf}_+n;C{uqqnuq9^}LlJbuSn=SVrkJJAt2Imx0s?Z+ zDl*3zS{lO|@0P>nD48)bdjOh#r}>cV>9|)&qBc;`;ytpJ?fJP2yYY2O+PZG?c2?X! zKx~e((P6~6?Ud<(K(=5-XjN|fQn!i`f;6;RuM{eKefcYVQCh(C1RgMC=SgrKZr{m1CI`id_^BzHO<)HEgZ z9xxzn(g$-wiAAl)L~mhBMPG_&73*O9!f1^u-4!yxynw#XUQG-U+N_HiN!6AUB1TCK zvnv1TdTDkfWD$i@X$##!!|$aH%6Dll=>?7;F)yteKRbPOMYQ=|AW0Tb`M~N5#4*2_ z^|qLSX!=eOPBE6=M|KzH#cM^LsWyZ>@dyhzz#J#UuO>2XQ>Z4T1i>h=D&Mq`IA*!+ zu4k)j?QsG8@?1~=o2X-`jGmrUhS#5{1yU8-Pkc>90)@Kgj%2{LBi;)>TV^OF|IY2A zuZgY>jK{9IkES9gu=o3@@h7}cxe0I-&@juQbMx<1tg6)FNGiT3d(SbS8iKXLfZd3Z zDC3;yL=lQf3gtP{`e`;lM2td+4Ks!kP(wHqGW0T;fEX7g1&Dtt!b1Rx0pXjPB0Cv0 z4pGur?=OWBJq+88Wya3T{UifUv^k^zr{*hgmvK43j8tthM{`6k5H2CuDx@oF%?A>p zi)V-Py>88`icZbR;Y7Pc@Ga$B_$-w4f&T^(DM+TC#=h_O=K$bpYwrT#j-*jy4InYF ztK>v+hhj3w8lo{sz~^_qu)IFH*!}(x7GG9OZTpA#)CR2>!Wn;++&$XuP=-gPLq;dL zN#rP>fO3D;u-1fh=Y)TPis|#Y#Wx3>MTt0Dg0B0QscqMai1R*h%M*PMtEt$5*P0Q9T?96)mFIeL=&D|&{UKq&O_w@6jl|0flJx` zK3=6lp6^s*rOB{yF%OLJ4WQ*!F@1p1%)`!@yA_HeDPyN=@ANF_#V^2EnAH>@G9#6F z`18JEN>jV*pjk4NDCtu{lAo-#I~h&J;>a zy5&FY>+oy566-V9~pO%emhcqXlUt$WGLR<8>`EsCCn1AePN_~W&C!L^CS&{LjY4$!%ZZSfw`m}WnFLx-4jQ~=4nzd z888bl336e}ILqpr`C64V&+KjKD@MMHWKRy>Sb(SmAB2U0kvi=2u(UGJ551 z*FRLEJdzz1?ITi|Tc6oSTchv8FwV-%W9$59whHuchsDIYxeS9Y!hc2<9`n(6266yV z!=e_+2$QeOph%G3ke;Y(+!2dNCe=90zlv^@+$A%MWbBGu=sLDRjl%xV*C<#-XaVA? zIe$edO+yHobza^pI+($_X^^lro{iS}U2HfPCl-sW67_ObaYy^ai6!l;e;i49@39bssf!L&ejJ+OCj7G}I%oK94yg{F7E_$$6;YJw#)ceJOhKG`nlD{(72-@klL zsNI{G@;9jU7_-PbJ?t%bTXIUr8iJfKtOvy|CH+#qSD2iGvXT;Mli-L7%m~D z_b0g)qBmS*mIODH7*Enp=C#Pd54Wxv)?P63HE0c=x83eP!0*l3}If$K| z93lpigqr&)%qF;46)!XgH+mszQ`MbSI7+57%{gfbaumX?3VI&0EjB9O)mb!d)Z)me zjk^y67jsK*K7R;Mp+Um%gOE)Eq_R@{ey}2d3Ya9m1@z_n7j)JviRlzERz_Bps6&Xs zqwLMg)5Rh&+OY4xDlQCBB43 zvqoU(w%2?ZV5t$A{iAHTKi8}c*kHu5lE7DMOAr^GNQ8vTS_7b5Sm3!iYV^MULDJ*D zKP*HBC~WEC*tSHshvOIo+jmm-NP;&5-%&n1x`iHOJCam1ui{UaSRUPWXbEZPnDjGS zBpxz~FVqc+M`F5K($?6WzJlif*H1n5#1=f^LxeHF`8&Mg}eja>jdE8)Id5~$796@yH$+3hreqb&ciR@*l zUo28OL;>GP(K*2^H>|~$=_}y)?2&z+?}252JyQ6>l_PsH0JK?SFo&vvG5->(Z-juT zRdGzY9x3e+5HncJ4I^k>l*-Ec8L0;1ZB#}v61-k>!OA5`9xigS@4MlrJ&GNE60QqG z!E3zy7zxuvYhY;`AH9p4>5utf>QEP%qBdG=V7HWSbv~@`_b^~*Z#qW3s^HI*whP`P zIc$LGdr3MPZ7WH9;DEBE;+hcti(wLrv!_#^wio8e?J%Oi$vr0=yFFFDaJxqi2T-qK zD^nane*6yIg`(MHcSg4KVn)Ptv|PV^Gt8WY24Vro5UaRrpC7hNJ6A;CL%TU^Ph~#? ztglZ(=J=I-=becB@o1$A$(4S*@{wr-2^#49M1{P(s&=e1GJ%I5_(!?v24HF3W+YlqE?_llfuW20r4y6ZQ6Wi!Uz`X#o=F zp}5y{?%^@S%#Kwu0xbAhS}3tAaeCr?L63FICZsr%xE zx`CC|H|%lG8rbuFKQGRg>_Au{iEtaE;8y zSt1l4wA*lvwisK!R(U-}w^*^XheVNi73CPVGFGl&^{$+iyZyr0hw_ZzQ521cDAn)zVC$N`^e6$P?R`C zlu7j6sbV=t3exu%iWoxMBo;E=LU3eQe6ZeQ@1~F|Yn=|9ODj@4E7TSI_Cm?I1ZO8T zneM&kZ2XD`#j6aR5)t{7B^ zsRZeH@n&y34rFuQ!Xvbw$kz!VYrz}4&&V$p5q~3qDoVT)`@?D|15w+VnPK;PE~F|B zFOZ^sGj)BEOyGV+?Akp)dRre3krmmvGey`bDIi1}Eh>VBk+vxd0EIt7pL%YpAgy!f zAJ#+%Z_`Lsj_mb(%7Z;ddnRjIBwQ3pC8*hf_+y|FeauJ13-T7rAaNzU8&402(LJ%&mp|blZ*T{H@ zHQ^-|MalBO@_`QpmWHzfjR1~@HarX#G#}Nt;&uprfad!n^ygV>m~DCQTfW|ioxWoX zD<`+X45j}uCJ-2`DFOJ7{6M3O;z(yiF_aFH)lk!e25IK|c_;08U4~LlRRmB|dyo6> zSEvBUQvha-lWWq0fQsD6@7n|&nr1&U1@YbRH)*`U8Ny!_3<8<@j$Dmbf6ns&Hd=A~Bz~EXg=IkLx~R}BKp+UG!0jlPM(citMe8O z@Y>q?_x!}b-d(LHC{iyHu*`PkInv=&>6J$0Z9tWiMnmeXS`&aftc;<$V`q#cu)hU^ z{*R{=5oB)1n^{5sD*6!wz)UCAv;`T4A-HHAZq@d205Te$7b>;>Gls$~BoO)cvh<+K z@tT`J8IHG-5z9(@29h-#%H-nUxAZC0|5?k^l=cOLD8#5tG8C#xF+k_38ZVTOOBiDr zTARlVnr^?zI>2|l_?zjd^IoTnf1tJde1X|U|7CV2k z;Wf7WOj#{=N~2DF`V2I1l}+wh+uvD$xJVtvXY(g3GM%ra@StKlLAY58-PQyJwH*c; z#z7~yEW*w)A4LKY?qJPq3#@Bd$!ZQ^EvbaF6)O*x_8I-Cf>jaY0?Vgz$&{Avlp9o6 zI}S2*i~?U)Qus(ezKY9D=L||GFc(n&&hO@$0Tpr)_KxmaQe2@;s;Fc(GQLi26EnBQ zUvZHKP|T&em>WUH6zrYLXW-o;ILOzab3=5vdz&eEugb3P==z+qZNgI}tt0JWdy;iJ zN@Y=tsV8Yl60NDP^800`Trfclvj+xaCEMGkueDHZ_KcsQJK&9V~QCIjHFvN=jyt~u2~ z`9}IS>xO;&7yhmTo!kVtbzGS(Km2O3FmN>Bx?Z7Hvf<-Jo$|RTO7|tJL)*ezTV;ZX zIH_Wp4;)ME*x=&71(g1;#ek*#{Au=W=ZMD;t#Py@)y`Lo4Iz`48T!hMBphi?j)E1! zc4c`f%X8=-H;CTkX9+etlm^2?!=5Q)o23yaC5XP@DPS49BY~j)nl0NAAC66ItWr+! z!A9GmK%PQ?56Z&(h^nC6b_=E`g_X1TQ~DvzYC8pUSVDU2JZA40r?p) zb||x6BdCA7rd&fM0jY zszcw*Oqh(XHeZO0q$rwWATY`mDhe@#FZ@CSD#&V~44g<1j;PyMw@b+5zf(!jl%fsVY(kK-mB1T%!fU<#JnW1HU~Sl7a%7*JYt+pl2?hxz7|~u*mUqU0Z$uY*I}$B z9iiBtdYHf)uF~n=DNCS5U1R@zA2Khj{9DP6XEM{5;vK%_?{fRB2 z%30`gIdnHp(4QUQiKM+=p}+WEU4k5$itxBrZ<{Y6@rdVPP{OdLL2tPUq;I5h!vxoQ zx|wG2XqB8$0vCS z5>K2KtuJaF)M3NoFU)0c2Q$(IKfZ=DcEDve=&Y2u!(MaJzw{;=b$=q8%06 zOqfC>HuA_`NA(I8rxfCv%%-`K>~WgIa(L|;W|sl3Y0>}GlqqQ#3G+Z2L)yms;}}6? zMlpL(*wh50F(jt%DY{Yoq$iX~Knm!tG&vG~y!lI)WdQvHoS{4%`2q*>qKnzmi4fA8 z+60+oa~8E#ZR;cb9A=wRt#C9v!e|pLjXwG=hkw!+84-AE@J9sr9dV})y3(VITlJ|Q zIp0}}CW9uO8O8Cua*THd4Ium*jRIWI(?cVzVKbU@{+;>)!&&L@=y!zWH;b>%%7YQ< z&}Io`>aA&OKvNIhk9XpveeF=j;Y#cZa7|#?*1hr7d^RlZYMfHYiVW@hi*&1Ygk2 z5h+9jCUY<3570dZ=~OjY_lKDMxIvNx0%C9?{CoocG@x#L5bN}IMn6lw5vW*?(UnTC<-K6^Y<_yT?d zr%-=^y%HS~qym7fMAQh#2Pq*K?F_wWYv0H6MXf^uDwwdIqeKjlf|7l=?#g0-)bfZk z!Wz#_de>V=>M&De)D$r@_aPn03ei6k`N)V~zPb+VY8QxNai)p%Vgg?>u+k{b+Fr0Z z&{qmH1~l!NOD!20jlTkV;8*liqw3E=`H6n(!A}Qi@8skuI5}&v-t2pWRF8a!xSbo7 z5=KJtquBMGv#v0T*-Vz*%pZeqToO?#d?0MAXze5)m2^qFVlyh5!*MhjGK(m3xxp7 zb@lKo3e5(XKv@RCIQ{Azw`D-qz~0PPdBX4niLw)xG^LyhV|8P$C-O8UtdIWq#Vj9Z zK&?6MeAeMSwY^3GGo`o?xi5%0-xKsbdm<04?mK#ZnBrOJVx*G6LhePxgV{69|x3NHoz(v}X-d({?`!K7TQ_`EJ(%rdeiWK@W$D^5QWco;i%EVPPmbWoMr6UVWsN#k%+xIW%~{7HY3EZ=D6IyJrW9W?5N&HvBsIN zD&xjOi3}SNPEl;rPi_V{GY{-ioxEC0%3bBTotLrRAeaas5! zgwciwL_4>=hQ(ZnVQ}k94r5PK9xW{cwlO&I$n)L~oZe_D8uQefG1lLgj!vq{Na_sB zuWlR~@1Qzkk&3zg$pxY3Fo~K9aBr_nC(A*$F}jWz??BL#kP*)~Qj(6PbG$_`l`Y^} zFj-GB*4Z_S#c^Sc?f79!u^AKhIvpZwyg8CWM^H|e+J4Gs0@Ovb1tJ#EDAAbQ6AflJCSZ;N8& zc)04xm~?on&AZ10gAG1J#W8;Jy1VEI16$pAPpkV?*x4;8k$^etquN!C)qr@dC{hs7 zv6rUcoH)|n3ocW^z&p=QwL%Va`%Y=BaNmO; zalj^`Wy_^g3_)H;kaco%h#X-fIpIN$0!4IjI0@O zpjJE+-`^-BEABr^E7ShRKTq$kod$*bXc?BvM32NRngoI%;^5iZ!(hWhY{zTn^k7Tj z0JKTeW)(d+t^(}NP-++Fo}Y)jMzSzzJ+`Fgs^P9j@J$SSQ|;7;S9ITzEBLvsVIT?YWpo24qUC~5jl8BPW*7$dgU;32&aCH|DntoC+ZJ2cG#E9)PW zwONKKSohV9Ca%fI|vIxyV$61Og_&H z;=2tNu|?xWXH!!m#v@Vqxvtnjaa7>dZjKH52MwC3@|6;s^j+qX@6=&N);V}CbMI5r zs-=KO+~&9uM~DV2XQU|qQ!#oo!>jE!!s9fyxE8l2octAXU=VDC8 z1kh1CbMJBc7p!igJmCS07>TB68p#`Ac`Yt2{BN9(r&2A{`gk9XUO_qP^qgV_ij#$5n8{ z2&;A#cMhf2C@v%7M;(pX0QRz6`<_cmoQH5NLIVJIVvd|6XSfA~k;6zYJJ0+z&2A5v z8W;sp9`D*Al7W$l4HkBc)d2=7!H=`5x%~^LmWD&@%5Y~XHn>Ij0};o>av>HkYPnd&meg7hz(_>#PVBDNRh)G z(QyDGRy!uXY9JsnIWj+sw{OT+iV=iVWS6>MV1C44V9z~{EnvoDbA3X>#FNv6=uIUC zOqwYo(sE~(@pu?jF#@={DdT4q|GgF?EB+E812WT5h4%Ng!6r=Zro03VWCqGkXDK2A z@x8ZL8@gV4ye%Yxd>;potCaIS2Z;#Ak6I|Chp~EXVp$^&=T0MB>8_UvO^3yEPeFxW zGBX_o-JAkePip|CJ}@9Ktc%fBVH&ELM%1MtB0vh`J)7H?XL%K$2`t}1`TD@5&nBfB z_R?1--E($y2SnasmHJ*sT%;M@C&MX90ScTM+|}LmRiF{rAi*w=$8S19Q&4@%mvDDHjDNqv~RQ3P;cQR|K3mb9&D2s zjj~glW4x3&W>||ClF}=tK1C5cJoWT=Js+`#P6@^upk~sbzMod|W+V2!aaIx?8tV`Y zhgB67S5+{Yv3G0g1sm`?HjuHLw@g$5sDhUlN`gcJu>8`@qYOz*^7kr^KD@j$U8>KL zA=XP5OII>L@kA2d?}KcIz&*ORm|?;B<=5_}tJ-{)W#qmbxhptkPK9-DumZ3pO*YaR z*0=m7?O|pcAkoJmktw_>AP#AL#k(MYVtOktaVk4>Tunz4nV}z6iG1te?UC(^ZXJ#> z$aicZ(CVz}Fg@`#ndb56GYE{H4Gj`T3xGP1-`Q4G<98@^95n*}J^;R+B1!Bk_}i(0 zK@#U5sn}8^`5K7ANO`%m+fqx2fSo;P+kBM-S}Ax2(PLO?fEe+{GB;hC7!dlMx?+-E zuw8*{>AC475tGbB`uGz;P&{HnShDhD`OY2QdphsHR^aJGn%G-OfCbSNTwRDxR}u@E z07@NB+}RM*v$uq`zHRw%X_sznc@J?ntdqu*qXHkW6Zg>XBfFpbhF#GqPQVpd-sIeiDv5}`G z*cx9Yq4*SJl?orhWf9|Jc&Fq0vUp@_?^&TW5^h8rL8y>qMwU^Rp0P{@45D7o9*!mM zE?I@y@sCq8pX+;kn{1^Q8%hp8s_k|J3MYhddT^$tH{mMAdx`xlBh}1?4vZTi#jP`< zMQS$-%C5Q&CtA(vV^SpvP|PygoUXPu>F^er=PvO9BBX~;Lb^U>aU>>y$wgMb&dbF zpsOg(2T>SEcOeKSNAwgX-u%{}AfI-gYf={yV8X;nKuCJ#3PS=h;YD91SiLpXvN#In$EFcD>9d2WK( zE`TjYkH%qs{~Zt!UJRnNXY(tBau3HHhcv-vCoK!0?YXIFbo(efK6TBN`KOuD1C6*V z1S15Wa&d1Y6MH8BX>D<(hITW49HM(r_pj0&r76{Z&&=;DJ|a3l3}a`%a2~GaN&G1S zj~YLW@OZOTpRN_q&Y?01f1<#Azwq|}J%CqLQKUT1;_V+=aEWX&;T?kb zsI%^VzZ6??l-@BD^;4^$oGHI^8=oma80Gmj9N2iM!t9nx>$jP0e@Px z$6$f=8YZ$-pP<8Hk9;_mzEylPrr=hlbqQ`L$$+EXlO=Af)kFGhIu_%yqu`t zwRqXnJ4eDMOUzUtpK_N*@6GuJ=9Ib5l9V4zb%sb5UHuHg(dzWnw;aVyVUys&9kH`m z<^}>$%~uS{Vdj7XVl$pX447{tEO+7%Wf4VGdHqLiiXKBdM8@X#HTL}kLEm5T{Xc_j zh~=ZzV3pECX(-1aOy=Lf48;hXIan3CVgIzUfRT5nuI;n>lu0uc2m*the3L5cKbUJ~4X)DQEGTMbMTf+; zjAJUjlWYyPHlK*8{IDRxf(DYqN>6&;+d5vqXH*z_nTB)MKy}){-VAhTa3lQ;sXPu$ zJ^7Mdqoara*h~m7IqGkv#O4T#OijE#TUjVK@7u4K;3!~7IhOOpcsP&Aq6acA@*Js< zGQv}XoF+4?8085>`u=Z(Cqwi!O8RG-^xYUil~qUdL^!=gSH^+Y=_N{y$kp?QLi{R( zQq4&YO0NgSOFqi>pKjm*thd6*H|c8g#`UIGOA!j#4MM6v5oBGYHMHzd`)TxZH%8WW zB|v;=Z<((}1FN@X=!Jmt79qpTmD-ms0l`K&j|o)J$sl;FCGzNG-WYjPOF<7EIscakV#K8SS9_7Zy3{z()kt!~0PH!31$bEc% zFQroo+jg8-ihidqPXeZTl~f&I%}p_NA-#MFXIx?;^))#f#WKJmpRGHVm&vII81b%> zAAq=~#{LyGUS*rjwUk3@ZEM*j;Sj1d6C{>}w0^A$l@BBI+rn4({qeY3tNKt<@89u5 z^w%MAlchpN8!kl~;Xwlq1b4^9S$C8G6wX0BU19Yd?$m{D0zMiSN5v z#CW(bs&q2d*~n_({3go;mJNDRQlec7`aL372meNihen7ZHZkys@WjjLNT5&TK1eT( zX^V6VvrkAu(im3^#h+vFCrU62I7L%zak1f4{$vtR)gj(w#4z7s(LB$bl^z-#z z8$;kYJgOr`p4w!7Csx<+wke?3FOe!u2vT0)kqXdUC(H9GaM_i1uf`IBUJcJA%fwC0 z+wEDVbWbG2^m5fqt(xM+Zj)}M`HUZz3OxSr8KX3j!@@WG{Yu!>w7byQg7-hI?m!=^ zmYGXxjY(DM>y`Kd)0i2h7~pBe`@ zrE+Wn8Zbzw3K0u7SvYJk4o0B|9*3>Wb=BeBCaru4ySZfpCgzWNp#`^=_KXWb$qnaZ zbQW`c%S*hz;n%cCJ8Nm|=~c)9E~(D%f)LSk0PL+{Ibq;H?IOSX&bXOjK$xwP>k<>k zj$!}!dcJ=brx2CpO1Mu&+5vTlZD20Izpqm3Nq$4~SxTC4bE(Gt#yTApl8-mPFNJNx z?$GYgXZk}%m2d49WlvM8_I}bE2&nk<6f{ zqUwOZ!{oHz+cw)w-z1J~hD7LVzPB!Ob33AaxWzy_dt_8Ky_h_i12Z+dLKe>J*$_!B z!)w4WG4o0o#-pMl_NTRsd;RV?kv1DwDBB3EAT?;+22w@aw7eWOQa(B;Wcciy!oft_ zt+N{AC9@z_4mF!fBtq!n7>L&7WyrHJsJOf6jBDi-QTkND&8ald8;<;(b+UD`r7oC} znt5ZB`@kC2CvbNO{qx<)kprgwrHdU&H*nI9 zgwv2Gm=CMBnQ~r%K??~OB)}AL>Q~gf+bGhVyt6QKu0N$!bfq^Fr}IXx%e8o`$;z`J z{?8Q4uv9`}&h>hJX#42N82pf1G`$Ij7^Xu(z#|m3WkhRXzzE%upfvA%c@qpQJnRDB zdH6Yv(Ik&yHyP->KZr8I!pK!U>bsMaOE8n%Cxop}cbV{uu{kcbQNxD8WI7C`%+zte zqsm}a;fEMQBrtIZuTP93c_D{73(hL=E{q3yHjhK-e@bIzdB#Ey!=e-Bi0k|;#(W01t*IEm3@oA|>WfQu(bo{p_SkJ?N+^7p_G&&D zPbCT#JRm9LEk6CF+#lg{zB_thggBuQMD)zix~Wz6JC`e(s3%KItjkX@ezG~+$T-A? zIwac4KC~(gor<6GB05TD^4COCls+rUI!#*m;Z{%2hpGXd#G&5NigEls#HWp)a6K_} z?Ae4%3i!PjMLr%>Nl(Q?kjF64Bdp0-+~AzElYnc`(!c0VrPWdVw3hh+4W|pZ!)JUFq8hrUR4dH}?ae*otuS9fKG1mn&P%hhHVYVqkE!bW+nH^tkHO9+t z8U%k`wnx-FD}NXh;jb?OZGw6hDswiD-z$xo1u#u1ZatR}kkkt*K?2zC`!lEP0(|<@ z0F`-&DR+Gm!+=e#)%pgEG#nG%D2+x+8LCCkcZCsYNMG|kE|yKe>iC`hJwnm!Z@%+MEn! zcM@?Ck4blfc>eLJz|>>fwV-XM>r(K*tmCtQ%g-NqB7aVLAna3!7A~x<#3u;Y!-Gah z)vGp->kv2R{t--a#Q+A@3*I(-N3%Z{EEDc7Ss(B6&EHGkBb(u+90gsY<(;jRfUy2Z zi5fF!{=`Qzuw-KF10xDo!)gr;t*OO;v?b9UdOtaMh&pyjk{!qMg5|cB7u6!ax!}p?_<)nY(QaI_nuajJ$a9iI0`_+!Q~Un4cJnR( z1^m5p09DWm_533hNq;5$IBFx@!bl|o%LJK0myx}t6OW#iwKyxlvEDB>q6PfwMlxd% zy@l=KfZ;(n32Ly_nMIi5JP!TONe2gOZ9U42xGEa!<2pnhFc~V@w;E6_ zT$R4J=E8cMtKAsBh0$ZWrdu0$kEEGiX?}%(oOVFr88HATt96Her}Df*q5oc?-eylj z6|tBo{<)Gad67WvfgmTsU!id|x-?FzPydGGsQM(Vt5Ng-#*D;-ZF%^e}~@ zg9%Y*5>+dFbLGGyD?&QVG+{h~16{g=yjy=*ULOoW&|)F4o;yV!!%(e5hXUb5ZrL;t z2LA$Y%=bjj5i^YM8XZ#TPy*CZ^GEUB4`BqM?lS~@NDl*&krl+~p@zu~=7rQ#ouQ-g zF?hO`S|+`Z7}H5`jWHpoKYkKo`amhX=pFVJunigS<=1FUB&MB#yabtTKhJ%P2(PFa zWW<&(Ybq7`4pv*IW?^1E5|T3sD-aVy&(Fh~h7^X)Fi4rWi8>Hi3Ikc(_lVmA^__)y zd=D42KoH4+#L^Z>7!|M+b(F_nL2iWNKo@;+g$93TRa^xM4Yrozp>BVYkVOuWwy|eD zzSiJzxM*JZ{-gJ!_(W1iiY(v_YV}&fMJsW)bUg+Ni7B{Hw}Jo@)zI?E?@Be8Eb&(2pM_`6nY{C8!W5;s@1) z!Ac}2hv-Uv8-0X&`YLUr;*{KclJgmrcYj0qrp8h!CUH!6hPq*-KRZ8r*r3QRD!_@c!-!1A#!yr^Q9n1LcE9&b*AP`Bx^}gSNfbCT zZ3v&oS@@`(G@E!FK^u9~jV0ga#)5Khat0YXM+P33IFDeLo3s5eks(43=6}p|W3Vu~ zAsV2D(JvH=w)f_-kYX#0WV$%4{1{yw=b_@Nozleu$>{z-Zbd%YJqd^q;-OaPi@fD0 z*PK(Ei-v%!nva){^e}C6)h`r3<;UKL8U~EA>bYECk73zb#D(4)nKoZ(&&4g2F8Gu& zeT3nx`XM?XlZ)nRQ43RIz$`;7>^OTNznjt|QcEGW?23DgxQXHrWQV7VTRLYHRS+oh z4UTN&`Qgjgf%C4Csf39jcL|3WR(uv0MVVWUc~quCmIWE!&7e8jP0O~^0iH9`S{Z}K za#fn~aTVH_rZ|!6n23{Y;GnaAoN~5`u3}DgEyf;sTC>Nari?K~vIltu2agFKS@G0y z1WTCp&{~4Hy{s|!NJba~Tz&5o>3Jq{v39DcCaM$t^^=^RB_tq0J7d1I4N)){oOCg0 zV&#LiQA+PZqKChXSav0ILN+@Uhg(+9%$lx(RB~3l2t5R)5LTE7YnYfRTDKg75`k`K zcdUuX3o~N&r!xq;=1Rv3uRr)OKq=p|(c%|dW_^>|`55Qs*%8s+pp(QDRBgzsuLRsP zr|^&xH+qHdqf-aRra)gkWTv0_y7uwK)!qCPW5HavBxuMK667QRP>t6!wel zCpbm+P^M6fb3I<1YLNw*EbHL(&W=xv6NIy-f#yR}6S)Q7KYy{Rfg(pGlgsjnmB5%HCy88@M0bg-xd|A4!WFJ6Fvivk@M5i1^)a|A*BY3A0CNWEfv46iV zN}=!nwV(mlp9LjzZ8en>Q-kk_ZmAaPH!K@g`-PiAIwX8D%fSO1BLkUOnHtrdEm2qq zukF<}V68^Cx%=(=4rdFxgr$NxSL#D9{$*J<_l8>VMxdYwJ$$Y$ZN-F26{u|-A-81+ zEeihcfuI+NC=Gtpk@yd8F4T4OfAg9Ax8hxRPKKMHjXA=Q-niio{M2tHy&l_bro^b} z>*?!xjhU@(rg@Fzny8}~lB3G_-aQ0U@zJBcHgXqxXa?n)u1m(wjkGK=s1kUWia0oA zSk{YZ)NxLfY0f%K2Bh7Cvh=+n&m|TPLBQqz{8Zx4Gs;0$0z^K3^??C9R!69udSf`vHT3N?m$SbH^Mhw$# zIpRl2tun-IMMbzvi1-lQkd=XQHJK*1h2gpCg!B|Gv_ckcoLlG#SmhXg_me&;wV@aB zH$J7AoMBA-1$qWkcNdnmZaa27A`0r_lWa2zEXI};21s&N%Z3(*?^o=9uN29U)kpVD zl2#oa#L^;aEukaW8Whn3D|~P7`eMT%`LSKbl^oll?=+L7x(ijk6>B!4zTs-8&gTtU zp(+v>r%6fJrA3?R701&>Z;FSQ-XD>0=t00u55kIBUgZuM2MFsj?!@o^-sxja5xWYE zr$geLi7p>y4`1MBT}S&6lLT-)m7ZyHo44rmx@BIX3sf>1ddHf*4t^Dc6IVl;Oh6fXlEvbx1`h8>T`( zl6bkvJ?B-d+CarQ%Y>O3T~*TeT3L!;6ZA2F<(%4REH;H(jgSF)6vGKR0J zijWq}ZFO?Nlu7DH-{~y4+Kf+`T4*s z8;ocH?v25~f2IT&emjAmRI&Y;mZ;sfv||__0u_k>&1j9BAebCb=>FtLOW|6T?)iyG`gWb@)*#E z--sXz@Fm9Gf^pL=i5(4QMpSe@-fmcusf5HdGhzzX^o(IP3)q{oj=^wAxS$3JHfN5Y zQNJTcqx9|98A?5isbIY!rvN+9Fn>aq>H;|G7+WFR0nSLPuI!yzdw%pwWI-rlY%mA# zfS_$``9^e#2?!rG0Y@jPG>wtTSoy(En+>RMVa<$`zC3aVaY1}n$MbhgsZXB@Re{%{ zgpu_7Vb|1g%Q##Fr0o%ta10gf120;iGhcE6t2>4{s3n6#{++!HP}%HBgar)!OwS&Y z9dVHV#B!p(r7xj+P`Yc=+&;BY8YR#YE4P;tw*1J5!Pe6rf=xel#^{4og02x#7;;T| zdeqvGw|+1gkPVe9S$?rC6%=P>i(U_6;A~2Kx6D=7j>X#Da+%l+ThO(jdW==orVUao$i)FCdqsO(jcXSX9#?9$@#LKgy)dr08(Y z%WSr?&2I{SfZNB8MBVA6&!$eQ=(gy}TaOihI(F_Y7Ujrh_Kx8e5=nDZiTQm~p1};V zVr(WOc4ry4?D1yW4dhm&?0B(-XJk`EsP$uFPGxFx{a505POQBUBlGorpWpve^=8?U zD%zt9FMXiAsANg3!%`$G3)4a*2(E7kUKi?HIrxk-C9Z)c_zSAb0E1K^N?2-(x zcS{^whOOu{PSz$|XEmFde9_YGH3Ji9bbh~Dx*3$+xu<~^`(DMSu&nlMeip;2?4`?~ z90)}wwZkifaY6`p*+1#il+hMYhj@HNhaByMcr}MP+;JNEjvCUk z$OaH;5gffGlmCuX1WHR2^Rv8AE>p5VAlhMR!A}KU1I%8L*Vj9%-$wL(lmdL<*y@-O zMf2u7i7Sv^nu`+kHxq?H>~@nA>$no!oHjV1#0g~^Zcipkn`ViCr`LSCeYR@F{Z?<` z8f^=t;VWPXkXSg61-jMfF=_cO39V+tQYBhRstdV`sLseN@P03dKABa?jO|3qu;Ydr z6T8AV3h4j?pOpcpW}vnO&1BC{67su%9YJnBi^_y-9E$^s)_@x1M!W+#H$#S3R*T?- zBJ)=+Wur$$eADi!UAD+tEG`N_4VGL7JjqK(HWwK(kr%6x36@`Cx(^T`l7#DH9D)wV zF9w99#oK)~r2EP!v>*3{86MRd;F%GC-~{O-hyk2@Br|7jV$+|Yy@QU(U|h$p=0;g2 z1?*@{_DDw~1i7UJfV`l=G>4GseNrM?N##;^7k-NmnAq4Yz2^H$yuYM|p8CT;qZ_xC zMX*kWOPeQPXr9Nm6A!9}n^^40bz(;cYoC{kA>Kj^IcBD4N+)>4OJn|YP5o~*fSV?+ zrq!hS!4isHRXR9+5YE>V^A9GmTcc1sB`ta;%%im1f^S+Vp*Q{h{bHP(q}j?MY>p|a zpfBKcb+cLczJ@SRiyQSSbLd;8olg${P+O7wDCENpN+%i&DMsCGiAuU+7LFyDDa9w< zva-@2zOOp-)CcMMWFZue1+xsDsp4O2AB+8k!H(t_uHC~ZfQO{~BpBlHTVX=7P*C0C zRCY<)a8#%k0uDq61xGB=_+m&4RqO}JIU^&W(8Iwr)7zAvHO!(;DbLt(l-uI0f`}Zy zp|;0>k>W2hb?&7_S%aHQ3merRd<;rGdY?BZCRFdZSAk!z^#Z7{5Ah%hO+Is4HErV_ zV&_zD))*y4cgSoRHNZxmKltw<0SN~S$O|VW^Viy0$Pow4a}H%a*>EgjLRLcu80in+ z7%8ew?{xY@MfRP{{u5c1V2^{g^qiSE9;guR+eirR$!&K9+}%)p*i0#!qVhfpr5qz~sIrIl`F;8XWy{$=0jZ@4=Ks?42)@hVW|9u2Q6Qw}SdtT%% zo}A0915ixbuqoCWX*NTKp^=Cl4ZXqjBRqr<=JXO&F@WWZ6x|3verD8Iv+-PTuKj6R zO;4ysug(z;7|9EzL)^qr4*tgKxq74ZV}ASnTWFdyNJQhWW*YXM{bPyfOV^4i7yB)`Uz#8&!wfDsoFEfQ{Iie7+ z9@xu+dy1YV+gOVd|KeVo2sb#s-kj)s|E0~-=)pi!=i!fP=YPu2#BB~Z>MJltHcaIK zCO{7>^cp?yq{K{xae*90G6=kP5-H4k9s}HdOrx%yhxA>2!1<*pOH%sIsLRg$8&rV;^&eCo`2iwa0!I>XM&!o(cB(*B1cPLPu zZUv*4vl9c&f#F-@36G+0nV$9Ug``PynPe9?71POIw)Aiug)F?((vCkw5FR?Rt4%ao z-w@ZiU8t|nV<$2ITVG{@B7rsq=NXyW)oF?&deOKy6N>q|XuN3s&zgNO!*-E^NwN@j z-{?sw!G_@rJ+yBtE6FjT=h4K`V|+IsDb%7^7XXkptRM6I$+Ifl50xRJ#vem3`1b*V z4s%!9fR%GrlxayJO4Pu9EhpZuBc}ZK-EU+*41_tT4q>9Y?MOVe>lhuX5ayGdc*@g+ zq88+k!2fy5M^3OD_>g(-RAhd|7%Ivk?hor#TPuJ_X!*W92j4{1CBzkBs&?pCirU^73@a#ztF%+PC7%bY9}jy*DJ(*dD^X|bXCjN(+y-FpjMaNJ3#p7&YBQO&Aei zDRiq(wl|ma8Bw}XzC)EiF=C~(qOxB6v6#p%TYbisy|cOxfsv%0H`PET--C(Nj-*st zIK--4J$f^vzQ1J;xC-3idCRMN@c*dA#6M;!E549@4<76%NX7IEnzw6U*>C)>(HK1evI}kUJ@k}h^41gKd8oBdnLZ51gof#Sk2+~}Q zi^c4|R58x?Qe00(ktdl#nZ^ucXkj5X9T8&jl>;Ped>cLqI1y{ZJ(nI7Ypar1a;aW& zL&{%vr~~jX-`v5Oukprp{CM*bhrhRsOa?7T9K`$}vWhHDR-nkJ82o*Na8oo~U~8@P z)B_`t!B~nUX!Z=TSgtVU@Ic=K_sZ?Qwo>sl#TIg|j16@D2}34(7gwvVET0NZLFz|F z0K|j4A(6yL+TWbLHhs-;pM{Ow7=jTX$Q;Myez&f8*x0qPE6enZ;7wY6Xc0&P0!;FR zN}K`EJ|KrUNo=@sr!%dhC<3j0BS8eQAh_ktAkzlhvPcrCxr#tVkrpPWv*m2btHqIZ zB7NTJV`7&Rtd#J&ox6&foARau9*IZw2pp$=AG3JHcIPOIGN+*8Vd3@@l^sJ^wi#yO z5079<;-joDaEDe)p?_zFh<4FVISC=E{<$U>{><=7G=WJrr^(c(gjdOEFIjVUXxS;h6ts_Pd}d`yO=Es zkC+UsdnR{cVHqG8PdP$fP=A{+D+cLfoDaIoPx)5GRo82Z*D^T{)we>kE2#kG+@1#- z5a$ZLTXM9wNFZ*OriKMYL~WjfgoGAI=CDwyM0*A;(YT|vVLDLH^x@oKQ-Cgi%0d8s z;sjXHNa5fE>g3@uIKu&JipR+Fot*EotvaN0T6Eqi8Aj4{G#XVzMqZW`+}tCZKAi`S z^1g9k=d#lblSZyhag-%Kn0PkBz+A-J=h)=#3ge;C^$zJofrprpK2pR`hEg%#vlMGOmse87ImIr7#zvev~yf;$+1CQprK#2sd-U zU5eCOW_iU1M2iVZ)IikyiaA0!>oV?pkDYPvw?D{{k7|F1LPYuy0%CB)wUY`)w7){^ zb2zibvdDPiRXK^zEC1Am(UFZx9MfI$s{%Nr!o<>5B4Oy9wfd+op|`cw_3h-N7Nr>8by9qdvYyi#x_@@#mY+2Z)cgOJ>-us@xC2_Yuvl-RN5Cr7YV8$;*sl2dg406fGZs z*|UTl0<~omElp87`4%0B0r0vRDX_Trs8D$DNc)uxh`vuP`6H3XVu*rZ;{Y_)fvX-i z42Y%D>CUuGW9?)1#TXZ)xj!u=a_A6u(N?<0|JpCa^*`-=4gMkJOd!vgJPwAF$QDEcxxjP%Ue@snLW!J%EK!d7=}$81C2R)s4hqY5xiD2q{8mq#dOGx>Jm zB_OL$R9Fmc@csR|j*`!szuCdWzNgb0zRW}q|burjcuBB4@^ zDJ;lzIixy{4F9ZAEj5jy{PzSevB+0ufpf%F5*AXDM^ha=% z*cEh-vL}P81S&qwk2$itOe#0e{WRWB%b zmw}K=Eq-DqAoe0&U+6Lw`Z?RoU%24JRXP}b-Y3Hvn%FSBVt(!%&F=}O!ElgJb}>=4 zSZ6=Fsc(wv_ge)s`)=#NqJv9IV?>>nhk;@daS34+$3(f-4kbf?!T4fG7-2AQG>^5G zrL1xWf%x)NHeg**4{sgoVukHR3LYe`XE`wNKS7NVhoPS#DK#m@%W1@w!RaIibk^AR zk%Dp}CU1G1y`Dh}w-4_;?amR!xw#Moi#Vj{LHnNh7Gu|=w_=^YBvq1>E};^;svE@k zEbT^Q^uTnWRkI%dO!-3xv4p@1`9NT}BsKToS@50{pQV}-TEBykk-Rej z6I`)?2_k@Cr!{hEqP1X7Gt7=|R1?t~E|=^NkG0;M1kKEx;W681Oge`$=1DqaOISN~ z=r}$ZU~xQ%k@ffIE?XbdJLrlP#@xzT6R9?wrbxoNJ39SJsqdP?bo%(duIe05MNu$1 z;@q%l_OR5Bj&usJCF|J!A^cAT#7^akL~4}%Jx6 z26Q!NZfgoz20wrj1J_PTf=fktfoVXM*?OIVE(HUgUQXpLYm{le7CB*_&5`V1}m`E-eM%!-3?xe&-b_sLBN1oU^#rhQbhX$z`bi44oe3Hh~_ zay@ZEf%7Ig`Q(BF*PJ{ROCXtH$iYvK@s{%3nJ4yHNBBr+%J_9@W%nN^BWu>7JB?a% zB?S}z#6szVbG_!J-`}%EgXH_G81Yu8no2@}H4A?}GwD0xk>^nIE#`_71$h{{Jj~(v zzfn%WD=a^@d8K+W?MJ{d-GrtyI-+&X`YR*vhUL|wa%b8h3vC?KLAXiNjg#(_weuK5 zLru_s4p`O@*IR8SIEJ3B$i@5Jt5|NX(n-M1AHhcVeh_m&w(8q*k|`1RF`NCVslXcC zc4w!ZpLg*p5C^wtPlUS&VG0maL*nFzsdIRoy^W`G^;A7bB#HcN$z7a@f0&&_JEu!B z+$+QH+!jl8n_eHT+o~_1^db)chmHZLzNRMGtqy4HrhT--viu)t=@?4#N|tn=GJ`q{ zo*0>|AP14{#$kr~Lp*u6S?*~qr0-!suu1QMxk&`wppKYGpc!$Fusk&X?UEaB@Gr^}SNei9I zNdXOy5jnzamd+%!-|6!d%g052dy^=^P@%#mVE;Hd#a924I$XJ%tR>kPsM3HcbqZCN z?46J9SxI{o<%@ah>=`Fb7jzRQ2j(%CeuLRz>Kp>_;XyC2Olrznmnq@ar~AN`ax_Wj zAoN-mX8hx@(vVST2p5_dGTiB3edQze$~-qu&Jna^dt{~CQI`Qfa`&Tlw0XC3sX0<0 zBE#H1tQ?|y5|>SxuTW(>>fR%F9R{{mg!xA48U}Mweve|PvDs$@DzOO@71rK7{cRhl z5L3Qkqrn(m@hE){$#*hGsm)03t>arPQb9x*giNpUB?@M~2K<*beMHJOf`A5mgR>GQ z$`z-gVbCxfAE%U@r_^e;(#3niY9)^2$UL$;m3&19e+F!d4q8VOg9Z|qUYulD5!9(f zvZj)n;INmLo%>BT)kJLIWWX z6*B13kR#~ocni-OPtu$5ROxpByD2HEqx;sN$I}0}^Qlod!Qbjb#_0_nOiR2q4HFI* zI^JR)U*>t=J0y14&1DA~y2MAELd@rkIP$v;N>FTa5@C)QH)ptLLc4G%1v7F`7aOfh zpaupI3h6>ED_~z}r3qN0Qy5e{W-ny>Q8V8jr=ssK#E}eearW4CSq<%+L1iwwCI^|& zxK0|LGxoKz9!}%?PvH@9T;nUp0~WmnVz?H8qQn)nAMYEZ%qb&mKMAr{S`w)rJjT`K z9w-pDMy%9ZLQf)Y>B&P_`aLT7W@rRNVj5fQUfz`&HR5-z<>lvWQcd(#-$Z&)G;08d zwkV}u5Lzcpa5NLQdUp-Mnj)A7vB?{3(wOzWAez;P??jT;=RA*Y&qld~_3SkT-s4&g zN5h4lrmkqpMu)-~3o~Z*JQG&9bt>bFmGoSo<(&p})6A0Wpx$mqy3*F0`oOAMG5)!R zVrEZ|goV__rAyVVaa%RMK=o=()m72{kGw>#=dYT4PDPLwQfP zgnEd8RurX|Os$}76Af0uRGLpGl&)N}Wy{h~d}Rfg@&A^qrbkKk#2{5D>6jaWv>nLN z%tzx4iFcUSi)f(fT`V!011v5KLy{MYKIxKm9-^{-ifikJnF2*_&bDSk%L@RQOXFv` z723q9-yL6cs`0Co^&Z)6ozw*hjoA$5!JOI-4y#D@uaXJQ`{yXY=&p8_?47@ISyBpi zxXCup=C9fYu^Vb06a(ca9gBrzi2~nJkHV5b--Glt z#G7kJnqEYQZM8`*(C^$tFESuX#TFN7GphVW>7yq^uZD zqH|&lc5oBNONqXLodr3JWH&cI>biRjZ}fL*=*9PhIs-VlN^~jv5hJiJ^Mx8lzu=Bh zI;b7V3xHys7Vk*Sps43`#JVuSPeVc{*4hkM>f$v?u2`hLCD*H9Hcyumt(SLnr7^+M#4dKcAIT61s+|T0tm8LxBz4@T$1#@zg`xkX@&INrEuL@LqfRLqSxpgy z$W}eDw}m^b?fU|VSs{wF*AHgu&Mc#&~EcE@LpBJ(rDRP6fbr^d_ws??hemi+dJ z#~`1gLu=wae<9Bw4m5XsYNY&V>)(Jb$weG!i)(oDpyiL1n|RM>3+`Bi}N^e zJY^0xug^{Su!XemyDT&uhthC&CbfJwR_AH7PtN31zZw#ClWmm_$Vs(K)p+giHNHiLc(0-7*`-INLPKI?|+aiXTt*kA^dnJphQ z%u$^X&)NLDA}vfrEBLNj3VDtufr^;Gw!j6dsXOBtr|MwL07o=_W)YZliXs#;Sbdr< zG!9OTL;y0{j0TjbrD#@)A{|c}e2^<(7iT|dsiJCHWwvsg5pFUNiX9fSrEJH z65)!O8*wm?-pHY~#&^gpnExZ0n?G`We90^`;3&ol12(!Ei$h{>m~X|{Zel{lPdATA zQ%fT||PrvT!W$i~B2>1b@ON}N$Ll4LL3!a&&1@UG*;#D?$a;sn4J| zBFuW?C#oI=tt)*`kk|wOjAVaN@7Ie{jMh}U79l>$+8HW9l7N!F(3!0 zLPLl+OvxYlf%lPjg{Lppm*DW=387xtbga-qZwkDY1@Iwf{1(J-??GH$eEP6K1pr%PFfz+~ zC1f*h>Y0s*tm9YONS%4bMmi11HUs4#l!JVQxzxjRB}5yHVG4K-NggzZf~Kk-rzy)U zkMYaRj1P{bvM)EXJW~H;$tzdJfa7Bep;Wbl}dLnVTf z0anq26m@(czlc%yP@uiI7*X*f^W?XQ=AUvNkY=++Sj@aUuE$=VW1D}8sc&||!=ohJ6yeo@~z z#7gE}r427mJE;oOxm;3cQ^U|p6p#3UgJEm3*>m6zi3_O<#+K{aK^+Ym3L5}8XwfA1 zh&P{yACnooKA7$1hY>VEW?p67S`eR-ZgzKCap`Apg1Frcgw}y$+Fp3VQD`_^Zclq< zY4bvT!CDzCNY3C2#KbAWF497p0EL51XOK5%LPRI>AT-6^_U^GT=W5U%hMF^RYH?9tb9hN-KY?|HWFS4}Dx zf-ps9m6?_tv0K#8#YDMZVjq4H+AnM*ejQam(VE1VV1u2d)Z?FlEHBsh{k{@@4k4X+y7KPUmZ@lCiO=&W3n@Plt2#zz-a$Il!l(WM-R$|vXg zi9;nXxEMk#K5PqAo$JM%kUz3GSoWQ+d8!cl&KRIaiD;6qXcL{4!2mO_Leyb~v3?sD z5-|c69c|NH2O)z$WnJ}plCPrWau4wYsma9bhl@*Sqy(hEDBRU)PN^xbx0-@cMVM8 zof}w!jSs^vc%#z*mSNFGUaXUAT82XsK6oY&$bkh&)F!lurIoFrV2#bYSf7EVj#B`c zB}4}1xS#uuYn(}N?_r)}5Qa4oxemO|aG3OMRy8~e5OC>MuRPAn%s`qXY`_tf*u}h1 zz;@w`Y9Z$--GZ|R*a4p9B2`KB89JRWMFbOs7CukZv_~0!l2G29&eJzgTcBfm`rgS{ zCjKW_yndx>#D72fx$W zwvm}QF?2&+9$RwmJ@u6S(=nJlT7&OB(^i?ZX4YZ4c*Opk$PiFByeVK12ikH&6ca$P z$!OG*oPkJStpp!p3E&N9T68iq9Cs<4A>Dl^hUrc=OVfkQ3Js`)a>Zo{z)olz09lSM z4@ZxKuo3Cho=;_=zJLsMV6i|mWNHfKP8F#SGBW`KAWqM5ikwSv@&;S?(%)zUh;+x4CHo2g?DA@qGsxjPY42MX_HSumbSMPa5yH z4_+L1mqK*MJ`AUyz#NSOW_zD?^;ztxbicvrKTr*!3&ujk0<%KqhBgx&$B{StI$jy| zn2y=#6(qVu34DKSe}n%G0qlFv$Ifo)CIs$#_OH0aQ6Sc$*1N>E-vNqf!1WV9hyV+8 z&;oEi6D%s0Jud{%r;-=ngastw4z-UsCJaBfAi8HQDkkgAt{^lX-DR>;$IqSI>Tq&; zE?CGgqW7P&0{tw53dX4MPU;xNfw6EB^dvS-<@F+Aod!CI47{f{g`TDIF3F7Noj*!m8aB1Mj~(^oHft;`0#fHL*+4 z4yL5NA~>fK+GW%k`BI!QP>ax|^)zvN_?3a)v|MSiF73RcUKRZi`h>xd&s=~N93|(` zk1g+tZMg}gJ46%)TjQinlE;YLKu*p(xFS3&4Mq78EaN@;!;b&Tl!Lx;(;_NFDl$RF zZ72bLdJKz(H+wY^PbV+_)QX5PV~IRiXRA+?2#f|94yI7IUJ(o=yH*E5R%1It&SN>f z^y+aRqAxBpW4K8zgBKt!<8OJ4nF3rn|I$g}I+~i5iP1Hv(q+Ss-1h+&6%OSD6y<(^ zOOAOD>JWH)@zv(A&ijBcfKD4+X#Odj#&YSR_}I6-p&K}(Jw-ddBhFe?lxr##LLiCR zneCCCa5W>smz=F7?5(2ys!|Ws$QtMPJ6*iVp1_n}zacMp5|f&+C#hW?HSYexqil_$jlrXX_0HN_d(rv~pR z9=WFR`iTZn=gi!3Tmg8jDRkk?{QW%QM)_8AM{E>Y^ulJlaCdTaiXu@Q7Q|?xYm^!i z1T(miSdTJGl;-}R3Ew*bg$xmvT*bMA(htU^c3bQdk}VDK@cHSSL>VC8_ztXB_(^DE zVuF8fJ_C0AbzmD;44hF%C=d|cCk6MWL)dezM#ezQ=XV#`7Sa{SoJQTkrfO~FHG^YU1oA$jfJTzRBK)IgjX1C0{^ z0bF=R-8PR7%!Yw#hM@vn#j#G-_omt}YD&4OMD`NFBMZ-l=K+<$SXMr+aX z!(%a-i5+@`3oGJu4RQ&IoRg{1BzRVRvaVh`^&^4Nop2=*x{qlBcrn zoSU*2DUL(@hpK?ZH=ZvH)DX>J{(dh6;O4F&dnq-p{fLxTOz7VlwdHNu8M?hSIZ(H@ z?o5KzvEOpTuw4eM|J%tGP`;qHahzvk$W2lMCs=OW%Msjp#--?G%eF~eew5DaI#-f! z49sz*qXXB-R~MI}sP$~BqoPn46p_foul==*SE@aX!C*g7D#Y@|cSSApJ@qK}Q($t* zHJ&n2I?YLvzh<-y+F6$>%;&uFa(vaqV5=oHrj!~_1f$9+lAbE`SJG|u9KSDslbrbO zx)LL|;w0F&y(k z@ZK;P$GeNp1|SHTNCYnOh_e};F!6!FY)5J-XL5Sf$Ss)=mXlx1lHRe&QDrGDF!zow zY_+1^vCp>`{zB0Vq7S^9C&q}is4sTq0RVhLf4wENtCLg21CFdS=Wnv)Fo{}( znSrK}j)Ub!D*;(|uKcj-oPnvSD3wzw$?+Q!`_hHO+dV^I#CcyqRYQCIj1TLUj4M|C zE$Z4t!yD=?gn^+L9Ze^$OHWPnzyBnzlKS|W0p0ss%f=hb~?rkX;UC(_|? zxpVkC^9ibf_z){V=DPb!n75X%mD!Jdrpd+N8crl%MZ_rO@wc@UG~7{)-5BD!uY$Z z20v_Rnt)lr{b$e>VWi*tjmH7nH1uA>tl4C^8p}c5up@eFcnAlHkyk+;OpaR5gn9+E zK#3$2>Nx9+M_*1wQk|ND5tz!4uxp7vTa-G+V;rRmnh4?gz6EnwRG1y)6&`z;g*3e7 z5=I0jh=e`ZN>hr79gi`onAJeM(7f`wC|g1XW(bEU8j_aB&*?yKB&U)V-8H!7M;P}d zbbEadSy>W_3QG?jovG>Td<N8dsTKHxzf^j4&5o)NZ^7zHeyPLXE-?P8+!x(j{ zb-7VqZRRgwGJ=5sBxf=#m~RGqg#kK{u@7e5{E-$egAhwx=PJQ&nvbqRt0|w@MStRB zl<;)P{$9q4L?HhyDXIr)MKWyb!dGW#0MtC}XV^nV*dOSrvFFn&DKSdti^*ogJ)=`W zkZqaST@y+Nwh2PE(w?MhYsV>98nGvkzt1QN6sA&o`poCA<-N>Uo~2LMedm2wP-(uyV)iQWW+=GVG5 zw3gPwnldd8T1zDoM@`@Y{pLTWr06*N6d-I}6jHVP-IIEWl5nh5ew2M2G^k1?4U4oe zw$8&>!oTlQW0W#iVoVAJ5_$li&hTT#*trk{IY){I1s25E)Rd}uvWv0=RiohnKZ`cr z&7Ez2YhxjZQE73j`HnDg{xpJ zY{RGoyN|kb#WYi;?Zg&}VYT;{qCs&~RnX$ck4J@Q>n^+1W&7GG{U|0v79URIBLsfg zq{g3#q!n^Nd%Uw|kf*{^UIR@+X<@Ssd&_t!&uqC?TwFIqI1~ha-m8IpO0!p8Z&XCS z@Q}2t?phTg4*}o^j}MvQPF;f3HnJGn`qMeAX|@wEIFLyX*` zt-sIeVu;d0pyyPWEuE+XDHpNk0>s}&+8*|z5|9BVX%fPjI=DgXg=oznotjiZZ=$0( ziYcdF8NP%uY2o655n)61leF|L%2%j5Vzcf5#EtS?{e5ymU{{?d%$=+(2xVw7_-S1o z#9|Jo?;U}g#)xtyK3BLboH;_kte*NfLBZj%0=e^2Us-0LKc^BIiq`TU6fX^BA>nwv z`${FVrRWjXJhFM~$$N+akS~Eh^t?7(T>v(A`8p8vW^oL=<1#d$E7GH3pZ(oQ81f zP3Z-s`lH>K<&N0;NDR0-!*AvHT37RN(WWToxLmJY#C!-x4wHbp!<%o3A48J{B!NAj z{-b^oOlz4tIbGxqqMRK`3lUS_&a5UD;Pdj3{p^~cF5c1P(x8l$Q^7?xK10SamoY|1^HbQH86KxXhZQL^&Y5-~e&0hZ+}&}~#*tW|{|)}upRPM>d6@;UxB zQ|;PnEguIbV~mnmW>-Jae1!4WZ7mt7Qz9mH1Mwi~OhW7TV2Ghsh4Vmp#F00TM~5go zbjv_Gig%qa$ozxTj|qQw{E4nTj^n>M-&S5NOg{|=-!TWokW^2zfv=~_kb={lI37B9I{b~(h zj)s5`uW^@5?40-2B>T zh(iF(qTe#Vs>;r$OtPIB&G14n#S{$*>yv&h|7rcq9nErnJgr=S!MSve;_c_*7)@EYE0$S_Q4BH1IUh>^(xjeM4w9M6DOt6rg{k-qi_Q8Hue;61HPjov zmTIA>%_9Wao^kH@{^p@1DwgAwM`5UP==eBRt?n{HCI~7r6rwzo-|h9E^?>lFlJ`{U zr}oqQ zjiN`;Y(U=ZIJWQ2)jWzDOnmR9E;y;wMDsU{eYZmwg5ns@I*>e|)*&KQk-gY0 z@Vk1aiJ*Jw?O?BUtd3dr0}d2W1WWr4ikF6d497O#fF4X@<)*^wmFPt+GoMYAE-F3_ z%8_@iXn_>PLfWBzxFt`mAykJLjgL;xnXjTsn31qb*Z_ikzly6udsXLYLfT(BjtZ0R zdR2R(g?f{*f)KelV#ZCO(vXgXKq=rp3bq?52&*WBX_dJgI+cLxNFE`Ht1ET>F)Tgi zFe`*0BVc`+dZm&=S<(EO*n@74v??6gR-0#O!%R7Y>rcA$)Zo%j24ga2K;;Fk%(|LJGH^m$9mP6Z&T7agKew8I5JF;#>Fk z-|Z^HhL$=QCg8iyo4^u}@V$y0>0``0|CG%N1G^f5!@K9#OvB$bR@eWkPo209bQH|f ziDRMOc;5HLvH4(1%9zxxY%YWK4E^2Ajs1o#Lf!<%!kkQ&Wkz4<&H}d5NjpDF(_F;$ zlRtNapUAa^ZN6&;v6cUn#5obe%3N?^2N8JJFCODN?I!e-UH?3WXSR zfNHlyI2y`5(>fD*Na!}pdpeJp%Q6f@cR15HJQbk%l|M!B`W2m5{()ewLKZ+?5|k(9 zUHT6+@udBnh(tbw=!-$WbOZ++>*oZ zMEO=uVlxHv&={3>l+|dA3tP9IGp3i;qbvi)W z+0*&nMUAT@bum$sM4Uu}JG0h@I6S3hAOi5@6YJwUsf+mQ*cM%~v|)Ox-09f5Zy#^2 zC{vK+XE!EW%)VCGry1?SyILo+r4)@UD=vjcPr(pDnF!-L++uH8@?l5&2m!Jc#xv8< zmghiSFr}u@=pQXZ7#Jua)WdytOL!=&)u&|EPeKqTAoG`@i(+2wKP*UbqPf?=>H{W} ziPh|iZEb#Ld2AY%pXx@oLyQvLzNV0+{mLg+Nny``3%?o0vVda}4(ThPm>lov|BAe! z0rkGIE@Fy-nu&9qRICir_)dMok8tzFOki)Endd;yRqQ^Z*q?T`%M!#6)`y{`)ciK` z3hfxJ@mHzIZzmg^aTd|9ICl~ciin=@(t@VvWFvk2X9rgVp_{qTsEJpmUrOv0()~Ho z;Q=%V%OQis5~q1iU3!$!%tBA%h53n;6J!rvKm3WZ*CUQWKi!l;46q$F3K-DL)9C!a zi%FEmh;dk3_#3<8M@yS;PZC6ekQFr5=e^+C`Ozz5Z-Iu_y)|?c1uJtH=k598eVBfd zu*qVzy!oQfQk#kWO~H_i$M3U5k;4QNTr-1bU~IJ9@yaMAIO0veJ8AqhB?};rV0`!x zffHc>^|^^Dy)DKe3$hLM`S%2LgMn3Bs}b0+hSRz@-hVR~5_qI#agICp-3c$SDl#6B zh%3)%(h8bD?ObSZ;y^4h#MncF6=uPG{p2uk@>ujyn0z>1`dd=y?#uMa0%E(gG`j->wSiJyf|-?g+dcZv91SWBS9q0E-qvP?Y7#+u|IY#HlEh%TWM^0-2o zCz~djKLQ;KHAqG`}LrmJpkvb}5 zG%Xz|QJ?wf8{dRShI}7PwIpXn8--UMPnc#%y}Y3+lVx}VjC5boc{T8qah`Pc8A;H# zj8a*HCXwTR#yo=m#Goe#P2AtZy%aE+{j(~rW$e9E27e9FL@xo|z{BEJmQZH5l9@!- z_E+fo0jjZ&G&#R-qAV(28TvcCfMZ8|mkf$1nwxO!C8a3}U*%{-tblPCuG>WA|6%bf zQz@v=5GLW`MLBXklvAH&dKRR8tQFvF#%?c~^Q(i=BU(nlI}8*a?!!5trjHB=uC0D_ zjo?^eA|5O9f8f?bSXjv4+5-njwGG@$L2WUi|8AAkJhU_pDV$Zdif}^@0ai(B>L-q3 z=T883ICn>R0QtTA?^iX526EO26sH;h`L*f2P?43V!zYpbs!pQQpTAMJ5`4@+|A&yU zJ%0oMv8i{EMoYrTNo78L=cr~2Wd~wbf#x?af6?HtAA$I~1lv7>r^l6a z0cGT-GafT{<_JU#BgwDH`}@9Hk?Nm8;Vp7GMk}9&IS2xbmy@u>INGpZG;XryZr}To zYsR&x4AIxiq}$&6ypJHs$?f~rn7daUulx6{pi@HTh^w+!;L7}o^An&x2>O;0a-85$ zo{MKZQ@KPE6p4I*aC?MAuo9Yain{K~6wYWOR+>{~ZNx%B*Z2p+f#O*`hw45UE7XzM z9l2e|eLyW5?pW!I337vdo5`umLXOqM_(E=l2T4CF*0h04_+&IF0#NTh_SQa{o zQXkgvD{O@hff2mrIYwi_k9*=xZhUDOOEq3RVr7)C6pDA*_VVGV+4hm zZZ*dCc9k(60cTb8s-;$nL(=qF#(Q8Z`=0Vn)#P!`LXz`~J0=2Ve;KpYg)0>o?i}ZV z@lfb{efI$Plq|`k_W%w6L1m~5bnq*&R>EGtbpUo2Gdwp>>w9Urz%r!M-crs(dP23f zS*!ebEVXf48R&}Z0El!j4R~2JLs`B?%4U(JQhg;#|v5JJUp) zB1(#r(&sb&ejDRqOo_ar#Nk3dCo>%jKAb)Z;5Nk7&tbN8vkV1vtyq) z#~8J~70O;Ek=L$pN!-rcGi&B(4367}{;6jL@>#{W*=)Yw35Z-mBg76Lps|b(47l{f zUhV)QLvSwKf*j#B^DmK_iJT5pV!to8jRJz8kS2tMe_^oX12^nf8qDa?REPm;23%&s zSI+xVA0|LdR=ji6><+#YQUeKAW#IN*IFDpd|3{&K$}t}V;*MEzzr-q!@wrh3@Nx!Lj)BJmN)C95@$5j$PYW}#bN~llV8}; zMhb!?xbDi3VbC#Bw#tf3x`T$&J-=EjSki&^VrC}cXC#T`s|i$F%Y5=9B?jBVrvbS} z*p=Um!5c3)%3uhOR4xgQDhgVqcf_Fhd0W2iwTPsJ3zunbnk_tFKIun|k~($eVht+Tm^-muStINpu$l zj%`uMciQOr0-RrI%HNbGU!I9gA}b)no)1P*+h=N@<-`icvF2A$+a13O$B&bFvn<%m zl|k8^^7G9Ozmfzh`ss|jR!IqgkSCZimxUMlNQc}g3PAw=AlLJYS^JKABQpt_sQml4 zpuyct?(clJik=k6{~%*aJ{MB}Jmyy4>2j;iNI>#rRlrL&M(f0Of?Y$Q204dx1&b>U0Zr%3MO%$1QU_!G`<{2U1yb|KlU#;fO)>RRRLc}- zDm{o>%|_NSL{(*YEC6O`QF!poeviB`EH1<%FM-YlWft@UwaFFXDTz(EEx;eCLr}!l&f$fbiKy`uSn|AZElw~R?-g6Ngu^zSL z6jqswLE0iUi%8wGE#3ivH;wyA)m=sojjpI5=uYPB?o)dyifr`dUj- zwuNS36xQE?3?5zA2;$Ui-h3yFF2^$eLC;l($ZYhS7rA!LT~*N&zxVX`!*!~bwxdBj z!8P}c+;JF7cCiZR_1+Mq;{~96WaFxSqxh)f<5Ga4oFIYI1O=3mhNB||Z=EBhOa(?! zwRO1O_smP0rBS%F$~5lk%tI~mOT|KhUY;-Rbt*NORbo}w@(>9{7e<`k!CY+go!&I9 z1dKeWHrIPlIsB5B4ESqKe^9@VDwbd9IV4bXW_h#+6p7$i8n+;VC^#C(B8~DLCDV*c ze=UIr| z+fcyW+h^#IZ{)Kua37lDtIE|{>@a3)bW8D$DL!5tLQ)uT-6T9=X4TiR&KgoV9S%cWv!vM&Zl(8K`W-i+ObK>GFQ z#uPYTmGiAO663#rP8)kGXcH<<&rc)84VoVIeO~=mpXQsFt^*uuin9BGIK$HC?ZSEP z@)Uk2ABGqaSoRQ1wdNp}vj?3_fRE$F#7|NES%&Y75G%fy(19#=MQnBTQnFP2NE+^OTS752Th@z4l*OUXhcgLf)G~`XNG)(?8%oocJsYN9A4)=_2)3P$0QInAf>6)MM74l5()nRBv>eby4~-^%u#sYyvJ;+J!ldr2Y1t6X>MTj?5S_fTY~2BE8~! z#aTx&>av*WBzI@c#uHOWL4?qmRKLNf#3280R%IFWWo)an$)5ea-&02US+Xb8XhWf! zBz+}jK4w=OvIh_*bHf7$#8(Gzj{K;ug{^&Q3v#~|xnStJzAPWa2TbgdsrDYf@>`*p zBj8p>9k8V1j^WA{PLLM_ciMiCb|xDHyW%SgGA=ukIWd@qeILdi`z;H(F2hSi?#fj6 z?io&LQF$5aphNbs0bPDkKv)&X!Ql4X;zv)2*dpp+X<#IFvksH;i5UsP$h?)uMsoBW zX%Yd693`nm6h~dW7$70h5;zRw_;hk(TAcdTlPQ+GM?$w4<2>&xOD^bBDA!SQjEwe^ z0A?w5bJw1~(vn?C7-M4`bmem#OZ*XjDO99bWJ=DX6e6wYa%?rxU-+Ib7MUYJJ}gQE zpl?onQU9Ts+3&Ut>})hbNMk#m%0oz|Iw;CA!7BRQuhO!ILyJt7OrDiEVSOt&zz#Mp z2r)APvk&4kvUErVo_f&AOJ!fS-lNZ7yQJZrLg1^;Ma$aJSnjsx7M)l)dJyNcGEhSN z>b_?YFF&>&h5TewkXEXb!#xk1Tjn1Kk`r+ShXeXZ{fGeRjZnnf%LmhY~_ zl$2#%2A0$fvV6q4Pp#oPH_4lL{&(#WsO+@0%K-r>e)a-U5>a;GCpz&?a@Q@PqALJK zD7A8)Z=&)iw8BFldA$&>Fbf=B(o^3L6}P5BQs&(K9Z&BlIVHM!jlR2mz`r|&aq^E9 zW!fZZ3nDt=0}d~!tiEDQ2~(xTB$kt`8jD3ej+Ve=1`3G9s&cOUduculIMv2XjSb9P(`rF>p!($Ra9qNm28j@)}Nj)S}H?mzpVJcvws^5!!*P& zEiaf&+xQXRh3<-<+S$NmYDIVLDBSnF7~DD)=m2eD_M2Bstab!!)PB6*ZDuk!K8mB< zDR#11Uirv>&rlf8Vs1%w*-->rks|JIA3x?C^pk`J!@`XM7Gn_5X;58D1FqaGE#6F> zP+$Pe{Ac=)kJ2Yt<-2SRDV2s3tZoWIBTpIPxhNDeZQHyB@z(r_a}q+V>5tUY^3}ZR zg7J2C#W&=WF^nq183AGTQBC;9F-W-xq9r%^Bp7NMIfIf2k!Ai)oIav|J7roEc@|3ecow~j?NiY=T9rdMgFr>kKkF9C% zmqS8WF%;ONfJf)`i6$cd^>@Q)v1!7$1KV3QO=MLTFFtT5)Q_FZBG{@=FBs#9oq1^i zafsy^yd&qshce-avlTvSdbf05;Ag-S&cM^vpqMvJ=NN|)1hoUVIYb$uL`2^j6TK#& z4hKYzG|Pl0Ltjfk9in+V;-F2~d6sbM+#zBHjC7x5ud^x9f(PwBQmcJ*dWXzH`qy_D zU?B9=%0&`&qU*^aS!pw5iVusg$uO3J9`o4qbh9SVPP?hDRwNYY5f+%WLp6r2>Yz7} z^fLzsS1^5L4#0{r+LHv+ z=T@I=qQY1qK%%Qmfw`$(Z$F`~w$8a3u#h=oaZV%gB3uOdGMK+}-q-*N2nZnf_TKL9 zl6fso4+@(+B*C7Q;DbYWF0N1p{o|CUxxPANUd(rX)c!tfOHA=?2+ZeE>6|wL#Bcvq zuV4z{xaUJbB@Y;2TSl>euX9XEvS8DEyQF3WDZnyuLzl*rEQBo6Feea0iI%LsAWGN# zBfV(qx}N^p1JDGkk<}5u$EK@vDIQfofICVHCU}a-{nph^^*|oyiU&znJRTvi6KiFF z+YsJsNUhr6nE&cL56lNGS)o5wUd}RY55g&wI~9t7DtkPR&d=MlE zwe56t7*1gKT|_s0C#RFym_&df&SU!AV=Bpo(~(MPBj2A?&d&*-BnKS6(cwkfKjC>e z^nv7odv`CYzL+`a2_R)m!-T3Oim(jJJTx4Dzo+C(g6}^t{A44IFIJ{V6o@it?V_K5 z#|9QoG2fXA&zU-K2I7~RfpCG_OJ4jP$yWeUnU7GcWTs}N-%i;Hz$K5s%#M++6OX*T zsMUuF?$&W=f7O&7h?nIR}6Vd9t4j!M`&3auE`WHgr z0*lzW*-eeN8iNT6&XZSvIGqN|K~?u}#>7@3KMdpy~5u>eep}V|3r0TUnb*fg!lj#iyQ|_hRh{MQOPF0U|fW7es9zW zWqYGdUvN4N*}Y0$e)Fksauf*c0t00anWS&br7(my!Q5JpS%h_Vh37v$__a@ic*&tv zSrdzZdAIg1SK$IFcS+GuO#gsyk-8DuL$$!j_!yk>C*JFv z+X-+=4hrzQGIQzKqLSgqrx+vgu?M&pyfY~qfM9XA2Gm2BU2z7pjKm~1Wv!ed{HcbV zw?5(}q9G-laVgucuzBph6+LJ2dPi7_|8^2dc|4G8ZW=mQSIb$JWxB{YIhE^aN5!bfl%K`gl zsUV|oXL#X)8&s4!XWZhF4iP`-l4i+@$*AU$NZ4D6P1$^6O(Qr(D}WH1*k3{W95rTV zqJw`GhT8q*)0>QQ9B>YFm~*obBDW5mHbcvDJXR6(l{f$_L8#kV%3t6G=XFU}p%jew z-cy`la785gon^y3@zt3BsWsT79%}+~XS|%G_23wo*VLOHB=Q8+5uS3x?-U+r&|TQN zJLx{y;aVJMI@=vB|8FB{>t+LDfs|Jm!liBhR16NB<*@;3fDf}rbD-i58T?VyYU{^w zfNhkQh$|gA%g8-N8=_~ageHeCS&YN54#q$znwilHcJD){o>4OLY z8A{?xD@W3!g|7tj0+src1? ziW-Tj{tgWr6Hs%f@nqdJ2ALESUBX=#9x!2vTG(ybvckJQxOZz zd}8&yAjq58zhmjg;ASonhLRUn3+MDWqY>u%6;Mmas`B=vBF%zW$u+b^d{&n?8htwE zjx8=gFhHaNBSrw8msi%v9B82PkbiaYbfk`0mZq$SJ%Ta@`lR+Av!ycBT*CLZXE8P> zFZt&neMSj0E4UDqDqTx58mN_OR7eHnkjRTc2v@p-i(~^J9aOo7E@c-TobdwiO9k{# zoor!ifuVu8y1yuM#e-0biRuyAcSrhJd>T_DK5p|JJ0w&CjhMLI1V*IxWrN+82KIX( z`#kx@s&>DF(U-9ZXZ3u>_}!c~2Pcj7+5=m8aY6#HIpl189tplB>sSi#Y`*g@MrGgo zfO&>Al4nHvHg`GL2kM3E?o%FqHn=X|ElRngQ)>w!myNN?11uFxM0fBx;R- zajL9mv%^(JsC3M)5y%ObIB?k`eOo&!5+-7*;J&vAcSs6wP&MOXUMejG>6XS`(J zvxl^wlWKd>9pL4*Pp3Nk%Ia8u|fm4&t=bs$E0Tu>6R*$dv5%p4ts#mg80IJVh{1 zf8_p`1Y*idsV?>lN@NUo1dZl1yng+@r*(gibm$aiEt+hoTJSgkVrimPcvJX0>G3ci zf(Dcuxvt%a?M9kfBv4Z{WK)=!qm5RG<7jJ%nx3Rxh(F(1HQw)3CljIff&X&_M9Ho~ z1BLPJu*`i+2(*`SKY+n5JUBDI*pU{7T~G(;i(~!=zxD0J3`(gNBe{m58%_CT2!r-M zY}nx$gXERfH}R9a_ne)FRLb&m$HPzP3T#bIRipdRlW!)f@K=SYC>@BUM}iMH>w;pP z4yH=sKK!IIIO_pf%MTk8?%%H(6?c@$=c{|!z{sPZr3AY!8sG3p;hr-xyCt8CpWR`u9j#8EhX)6P<5r(y7bfvx8=X3s^#>4HM6;Cjk@M|4x@qd@)55=-^E zK#x%JVWx7UC!aN?c>pSmmm60=yNS{poX*55*jR&e?1BJ;Wtz>W-<@mEJZ2k}qeKFx z5g9HFk7*Eb2&Yl;Blcd(`W0Sov~cHq?>H8uZyhC)l*vAwul9n;$Pi<_0&L^@U=-M0 z(O5EOb{lTkHxW0prZPX3K_>Y?^i&Eo0I>5k7M_>{%xEYU8df|< zQ!In*i7z4Lkc{sg`CF#=c)zs9Xzn)SKvXHqo293%!r!yQPzgN;{7X^Q^Ru=ri%3X>ZN%Te4=JMVAGxOnB zIut21bSU=SNYHzl{PY;Pi4!@MBVl@bhmL+9Wvw2(3`-#*sOrM7 z(vY8Ua^zgqdZuoGAYEeFGr2GRt%`96n2bubLoh-rm;ov4gfVUAKW5S0uJGJwQbfu}`j0*wtxBe4q$!=TAZyd&@5GiQA7z$0l^351L zY?4!t-zfK`!ol;LI(#96$#udbPRj6Tp7J1riCQJ z=qQEbw8A*1GA-{VA5&>Juf}X!IIWx0mh_r=q`+uoTAC2Rcvy? zHvmA2X>5g}mvXbJZOGmc(h7BMAeg9w`yJbge=V~WL48AnJSBk1@sI@p9|3HOseqM3 z2nd33%*Nz@#KNpBlkY3bEUj|+&Um&2<-oEEO4ktwZ0g{WK$^MBkb)i<yOPZL`C>l$1A7og0$8 zS#PNm!->Pa|cc7f!bh%5wgUOAtD3c){ zqafn;5^0Y2m1xzT&G|BaFX0%QxN|yFHR$oo^X-Qc#WoaOO)(j}Kdw6lQiP@MdU9PI zP;gP#lPS^s!Qh(>$4H17i3PVsr~_prd6Erv1!05xEvy*6W@Tk-enu3$U-dX)9?b%Q zW_eg?5<8ThMs&s632IUj3#Zx&jyh({%oz?IwQ4?3%tGT=Kg9flL^;*+!FIVse9})* z{>i)i+O>xu@x+94Mk|jf2asXGBU+`s10R{Qj3tTp@%{fh=T;SqOtBRZaER`>Q7#eQ zT(N@;+Ilk@fZrO+s)mdhSV6!5j(iN0@L?q8$O}&Bw&2cwk>E23=Nmz+Xl zD#o~?*n}4gV3DtGm!P*WU)+}6{5|~L$sVkel){8RG~vV(zp0Qe$O?+EQDjk~(+T;4 zR?1-b`^Kp=<6^PgUrrCR<&{^_i%%Bu0{+0!^OOLST2p_8!)GvqL^EsYIM0I_XKi@W zhiMT~!ohk;3oDKm@`5Nw6{A{qAlH!7sPkDP=O|6wcuOieI+YRup^9w^luJ3N>hgOt zA4U_UB$tpN-O=V#({U6!GC%^{AQ7u1CE;|@#JQ2~jik&_J8~+gNuaX)UW?(6ZZFu$ zfdo1A@V!$Gf7?jA8ZqZ#8w856aOrim{IKm2ry}hf73N;F!Og02g%W`Y*FTM?!XfgY z5Gaxhg=NBGr)MXI_`h<%$_$+e4+=q!87(>r4F*UTX@^Pr$kD!m_P3G(wIua;jp*}i zsF?IxHD`9c5$wc;W~{6LA4)Um>;6UT!EBA1wPjT?`6E{*vs_<;;&BVmVI_3k9-gO`bap))x&h&`l^)egdTpKF}2-4P~9OPDq1qEn9tE=E2Jg zJJ0ROS!A1*gog8S%UAr!5?vWv`$;0ni29Zo$1py(l71Xw!M-YC8b4;Fb@ECL!ArR~ zDr8o9rl4~LtH_xBBIy*aD_whE;b zPe>?~u#8a<5xWCSicNB!nAA>z0H;Pm-`_Seg%8#p=;f+ra>{Ltg2E*^;`3qAe7aas zGm4t2p1x^e&={vWBfO=jCikN$Jc?CYBp=uOkxfaHoY66fQ1T}~7See^Mh>vE=W%VA zADudt;^m%%%_9_NL0X7Hi9(DeapAQRyMT#M#1;~I!`0;NS%Rq%44tu8g7_dN7x?+S ztQ2~$cW#S}FFvR%Qgc&96HuwtF zAT_%)o%MX_8ehesXuxq`gv2&kk(9t-CT(uV_d@!>U%?%Sv;ciCt*ujXb4my$%B5CX z!3Lm;=tw4=9hVKA2&lHF_WX_Btewik!RvX#BO~VNHAwEo#*`fuh7Fhi8PMJmQ)N&F zrsq6rh+^uSdu13D&BCv&tRyJSon7RvY-IR1WR%ahNEf5BQ3)s>k%}{)B(%*ukFcX} zx%m()r4@`Ky{Yt70q;~)$9J;?pi(ks&zUcA2FN;q)!cNYZ-JL68WmXa)ZOam5n9)k z?nb6VDtU2u9{I-lx;IaNTJqTgP`~W;p8P6J+oBZU{X<<-JfR*hX%!`pEwRRGR2JFv zg%J&!m0S+bm3e?hj}q_j?8ordz!>CIL0|eIWulB1VTGf_DH%nhF+2wkflOJEd>jOu zovj1KH!AjVa?%gG;rscGccMPHRyBGu8s)?CEmctnCpMmIS=2PE_7l!lIR%7Y(4Ug> zHzjOZf(6)crcU()mxX>fg8;!kmTt+^xqvr;MjsW$41yjzk&O@(mO#5AbT$}}I7qOg zffrn<4v_V$QBEH3-56VIS+?!>K2CM25p=}Bv590(cNJMhS~4+MkOcy7?0ABN3a6>8 z83{=M4}3Ms4ksy+FJ2NNb! zrtg_vDvW%9@`RJqZ z2i|0P({_gb2*IpGLT~4cE_Mwh9pE(iQ8sko1VBK_%&JjEF1sU&UjmL&JkFh**krL& zFoPZm$J9D0Ls}&oXn{JZ;jKn&|Gl4#%~}+B1;yJ)<5r~FeCugifZ}yhq^f<;HM>#evkZB6x@%dN3OSekhUlK2X zMQM%IQq)JaNmzcO1=9Z!fceL=2pM@v@q?#;3(Bv5Ciefqyi0Q&MjbXYPw4}P! zuySZxyRC&!Zy!bL_YFLYL8}C-^;eL>V%sMR^`%w^#$}!gcczd@&6U?YWr>;Gp5lru z2Ua0`$o*y+RZ%LlF@Gyzh$eMNcG(Ma5Cs9OAd^@~7>q#E0@gk9U_Y@mesJW!_I-n% zC#5~Z07BP=-fb%}3*R~hss!Yq;tU@q78oD(H8P?4MnqH2go@&Vqke7k#d*M$=UNd! z1S-iFLX5Er+?YZSlw5DLLL-g*z7<9vj`h(SHblMPZxjedyH^ip;spxr@h##??t2!!@3j6 zINxe7t>&T!@$DxTPN_$t8b6sHILT$OztUutp;%Rq_5_Kv;8nMo}7|C9ZQ&!D`;1d*B5TO(Upa%!4` zFZ~ok!#fT$W@o7~XXkF;(}V?=S?{Vhgo~iAB^XvnVrq%oRc3?I09NWe>8IOjOzpD7 zx69m&Z>>VkCHpsvcinmQ$uco;blW$ZbCx;Qm8C%gk2djKPc+QhQPB>ObvU0GqNzxt z_NynjJ53|*u0s`XS|QdbYB-6EgUV6f+=V4h()U6LZ4*k+-w^s}(;j*K|ci^OS=drfImlB{ZQ6AhUaGv=!Z zVOdChG1?!sZ!^zB%z#6;2T&+8+>^kDN>hlQ(a|(GUU0OM1ju1pO|0zqQI_I%B}v8( zSv_Z&K^<&I1^sd&?73D9{R~PO5F|G%iepfwy>D{p$bbZKaftHeDAAv-&hTf&F2YS)<1#!SQ)s1m2&fYFMcTNVXo$>2 z)`^=)wW<3~!tqV_re%2(qjL0Hzo+^gGXT^ui&Q##tu=K9q}9^Ugy7SC8ul%c*J7^G ztpOo}2l`?IXlf0Rb$y{xrsFKek>f z(J86Y3U>=4Mp6Bm#@k%a7Eocdj)=$+fho;*9DiRo4mNo5eMyNHKeMTo5AW;Xh34(_ z9g(<62JT%ViF03GDsE2d(1AzpI5M(JI0sXkuJlpNQV&*QY3$bIk${Y<<6)uUY6o}}U4~2wLe`APBv-i>gMT`YTJBRqI6Gwl> zt=}U<-F#}m7p{`xkq1H<`Zng3zmc)B5;$e6>Lp_DERPpPhV0|y3&*&ENNRFPx)CYt zn1zwm$PBd1X!Eg??}TVv9#Td)>QJV$Wa`acNS4ss`8G+vLGD3iWZ{HbC8j6?$~>Aj z)Xembqpu@6n%;&beX4yFDNIHwVujK+ph+qFh}yQ$5m*k|`Av5eOOsV-IY*Q{IQcUjLr2ubyZ+ z>+kY=WY?gIK%}zfEomU20u^wh%pM}A?>}AU|Hp62k$>LPjWue1|@ z#Dm|9Wr5>#rHJ6>cwup19ic^EHhXL-p)Pc*yS!d~lw81i)oxfo$8^}$$Kw@TYKk!B z3Jh>tGV7K&TbzCYagW@IsxqX$;|%R=h{Sz_zWQ>12d#-Nh0dx^NG!MJRLrUkg7quu zO%wQzxMC}5l@acf_c1&qO%r|Lvxp&?m6}G}@YvYEJQ-#b#eEmXVYbtfa*m4~c+C`@ zFM78{7M#LkyO%@Yw#KC2Zb+^LvQeDPeh`p810TpDEOZWt#$h69x?xkLkzm@xWGQvBAM z^LgZBauG2tHRYjlR)=Ko2(PZVC|KHCTJxdk;Q$l@F{ck4ddaAR*cqc^g)2x$P6*Gp zr{S@^Z**=1U0BJCXF{}r0sjhUV?0!(?m!2%p&=Uv%(`M z9s~p0S@UT%WAgVA$X*#>&d4u-RJw@IISO@3?UVK!QmZ&BmI%Di(`sn;q2T!MtKnns z=V9TiLGCE%LKV&d2*obfzDnm9y{BuQuB~`&v7KoQ4&Nt*8=@~lYoxx!Jqk7q)>{wd z^tVz8RcP4(6#$hwim`Zkha5zt=wXf*;m=UiStXS$;)FLX)hevi182TTghB~b=0Yuw zj}(phx_QYsN^ZTph~REAA;gCg*|>|lz-ce*3fiLx9U9K2QxdSR6c$(toW8rCnUNXm zP)7|$>xG$JkID8TUw*%?SP1jTky4vQ;5$6%y8~*(q~}I>B_2;)~f41bh## zKK1Lpj}t986pdwk@!=}LAc9gz^F~@NE^}f|x)qSc7-iW$T5K$ce8 zd4NaSupRFXGS2l3RR}+)d~hI9?VbD{H?1%n42H7mnP;bKQG;lLz#H?w5`#RUd9j&- zmW?P`oaQFY`ff5cCk~eVtlT(3$V?oH*H|snhU@~nDxc*2odPRh4R z)6FZ53rmdocZEc8W=KBQobDDz#>I(vjQBGIj!yww4obnZ(x$HzW=?GMBHcgCXKmN+ zULas}roJU0>m%m9Qs^@ETyrF5oQ->RL3`@R2i2nIhWNx3)8w%_wbkjizfvo8;O-q zV8aNSjZkfnN0^5@K@2JF6M8H0S=AQRDd;*f2G4iUOuskbiUt1)^wmO`JyrLLeRVUl z-I|A}+OUM6IB@&6niTAn1lbe0du}ea2ch3V&mw9{-o@jI?vs-`-hi`fe?W<;^!aH{ z@TA{^*HxEU$ z4klNIR6H6Mcf2Jz zbHbQ@CI$pNQVS{O5V$DLe>BH=po$oaUg%xP$yJn#!TYY*n5G>mI!>%+mX z6mrFV%9K{YY<1DD?w8nQ(6*bK2?ybB|G%^k}0Lj!U4YkZV~K=+K7^ zDP*R`b&$hbo9RDcPbFx8T;<_@N~(64e;nqjxLw}E`YMtl=4VGiNt1;T*coN(L~J6n z8n(U~Z6}6Bm3S+4LcPPl_gV%U5lBp-c)do@@i;LKV5l5}Y?4E0v=foJUZ(s~ ziA1}Pz6D! zwLApC3k(aq$s?a5M}e6}3)11qY@pIjUK_~`?1-e7%QA|sBV!~0A}`b&9fHP)NCdWF z!lgldj2d$1@1t}v)p?;i53KK_=^T8^s*rK5SuHL`mOgzfcm&^v>H13Ix&tQ>R@P0|Z(l1bA2p2GI?8%;51p z`5B)~qHEDcva+qb?a1B*r7rT<#hC%)HtFB^f_n^$rPL56UsJ{zaethF6|weR5A>*D zojp-YR)#s05W{P9b~0{=ZbZO<A@e@4nk}rC=42pBgU^bOu95_nVam|GCc?Z44JLC>6T|o@nKdYa=jQtGWaef z%Nv}^9drXt(ujNkwp(zCa+s{^xEJ($W2KpsYHIOUBmPd44b3@bwyx^jD%6mh~I_q^MP z{h7oh`YrIkqfWyyptT#-_v$AM_sY3skzhMV-7xYl?rJA|62^svCN&}UZVno%i>(cL zGEYkC;Kp#3x-Y)hZdPz?l*t4)?x&oBgQUTSxT@>CDCLG;zmlKOLzt(?M0qW@QV_8a zaaxSm5!ibpLl(&Q8LxXK{4UJ{f%5ZuZ6%>F_o?C@d<$~U2AH6JUyJebUiHO#YFF8QDQu=BuUWfKHlK?5+pA>>5WydBNuQyikaPdpE9Ibm_>JSEAAP(g7>7$d#19 z;Z-2FhfBX+)}-Q2z6bRPUg>f=jnPg`mU z9*h>9D~~4oruh1hTEiAWOCGK|q10UNSl8%GvU3sAXq^RX+b%O*E!GEcFg*7ynwqqf z(1SubvGQoxaRSy2%s>w6PHp9(P&x&tSEw6Z}!ufto*8{$F=6GCY%@`o=bI^!0 zJRf$92gTkw!G=%~q$P=tp|MQiQ^cFP)y(ZzoV=Bh#MkiC?Ai*5`nJb%;~Pu{oE-j; z1GG72`c}8zhoy3=N7;&5TD^Wn#U9-EbL2S3vf7xKa1tpa+dWJKak^h!&(!%(6C^NO zhs)cUgRX4bBQa8fFGu#BehqE(bc5JoTUc+t9Z2c+^(v%Kt(3{uDC0d1MHgg{F!Bbi=l`On*PJCN`76M1IUS?d3d22ox%R+IXh8`tO zKzz-3dqQQ9bS;kB^T`m#))~Dv_826*nZHc^C)6Y&mssTAdonL z5Vt3(eTC#QVh*(m+uHY_o${2PM7=8E7$-tc?~NpzRkIEjzaam73#V2Es5k?K&1n0+ zZ~>upTin;&3Oea%ZY~bQ5)|eLkd4JK7pjKGCY*D)*W_r zk)6;zrG4+K4oIroGEkKD?xl_(Jlp8O4$EMl51POt4j^|*(w8Aj!260(z+ci1WUn7MtIdqD2O1amchc2JBK|Q zG4OhI^;`16P!U5=;P+PxX&p49DcPu0K;M>4XCR&nICxwb*h)@n|HmB3o%ZBmzz5c` zwLO_Dg%WKmBq2B2;1;Y{X;w+Rm#0Y-H!#$X-bnDGGcC$fnj4~=sd3H=1soc(G3P{v zS$)O$_6kXXw7+oDI4}&nyV-@PC%QwqC)sV*c@S_I__}no^WRv{nY9EfhToB$Fvj?uL)X4Y&xV0>1|bm{H4%mPaYNV%HvFAT+JD`beM1HKyG-YUDGC&qx1Jc%7Dm zY^r8N##6oh+p-q6S4pl19<=W-oEi1=y`lo9(=cIvo{JKpqAa6eH{I)_Z>C{x<=w+Q z!YcdtsC044l^}{f?h6>yiTPX2)aLLCg9K+b=1r0|%-IH4Aa^BZ6CE8Q2kv{qAOy{4 zuqZGa95;oC>&nPLu|$LmNbA-EbOHL}D%qnDHkY_TMW4Ztks9dd@*f}ZPj#Bmfjhrb zBpDk0(kLuHCh)~Jzi<%225zEe^1!yINy$~yGS=5l@=n2zCh*6Uh%pf}jSx}74J3O^ z@Axjd28W>7b;Nt{YGo4*UgTV2jTxtf7^Jy-kXEr!$sqZ zAY|Q|iEYwWN&Liuk>6_@mF8MjT||XC6&$0af=yS5A-lxxzlcAv!j6aU;! z$gqwm!@FV;Lw#QH@!{QK8Z~n{Uhxo8NbVhNn`&v_ zQ(0DYiTEw>pTofXEpphWDFQ2|VG?;Wgb0iR-ni10Ig}1528tvKDhlMD6v8#FZk<^R zb?71c@;ppEapNQx5W*EnUWduem3QRg1oGyMn{%9h zj0=K0*ktGO)oU6al2!%$(Sj7N#N3E~F2EYkH}cfv+k(^Ds++o#&D+1P=F*~0s0P~| zFLKN208Nf6%@XIPJTzdOB&(ZVyUH-r7f31T3htfA*kSn4gnmU#VP7A<9N8Q(*j#vnAelOIcQ%`T!3yPY4D)cF`*O4o0%3Ke`njp4<0SdL zpaK9CUr)Zza_ctvMPN+fv(%)Npw*(jWCfltGqGzVN;U~#VK=+XCQq+Cj|!izXU`V} z$L*-Xw+i+hTO31#uUwawB#xxt1I0oIml>`qlk$k%a&3exZ z@2xAUHTXbk&XY)4iMaIp!>M2tIS|7eAm;Z{T@d-8&QMc%Zkg&N?TLsGP;Ltf7RVra zK}af4Obv}oLXLPy6G9!ueA5QUQ(tV_kpn<8?swYSFAJUP#M;cLgEm2!FSfy3DL1zP zB{fHB(k}oJ`|cDvquwJ*0PFGri^-X@teVlPXNlK-_Q&_(QYDihBQ~ zpWLL0LF+xSWFO+6h|c9Vww@*2(rPR3Zq*p2?bkfJfb+0Lu%zAlsBeV-2yw8_{TX3h zyUIlYk4vuD=Xe!Vjh&3e`P8V<<&sqY2jEK-?1xV$EWRos`3 zxRvaM1_q}I!x>MjwXnOZFga3%;6c6!$Zs9S%{mD8oB5DgOf>;yNFLgERS{|h4Mi|| zP`(l{mET4T|1EHU;@ZZ4DCnhOywo#W81AuaXs(5v#{_VdyfG4~Et?pVbqvwv-AZ%# zaet{>#M{2X0H`uARAmD1@KK2=Lthl+2<`#1H1Jtd<{X(6;FNHQ_CxP8Cp|=EaN&-> zNi@1atSxzgdN!vmBe^Qaw5dqwX>y`IV#b8og~4Rn37QWu#fgsmO6gWWFJ~Rr7OqEp!H~)mdpIv_ORxT3-C8+1RKP=@Gj<2>6VoZKwt%qiE zoMOg`QTP%WftIn_P+t7fv^tPwFipr9#+c0?2}Rcq1!w;d0-62rl@LZ9@>06j(Z~9H zidN^|OWB&MJ8+nTX|j$`vry$7nmpWil#$;3oo4@Mib3y{zRmFi2~Wg8_4L&&G|d9~ zjG}m`#Vtu-By@Z`7L_k{2vOX&G80obOv#VrlZog%18Sz%czcf`T;nml#Rizbpf64; z#K`^WH1)Wn=w;PO2sz$46d+O_t>AG9C195Ym@3OY&Vo#cpuf4*Tl0O@l0ApOT3C~7 zNX7J7(?$Y^X)`p3)oaPwxkU$)fWq-KK1nItu}Ai#(EyYF&J*AI&oW`o zCx|@|bd%{Gsod%!_zavI7Y-#hRj3nB+{xjoZ* zW66>jE0G+Zyq8yL>OA#G1bF?jElYX!-7wnJN@%}1M1lEDtSQK$>G~Ia*tKGm8%e1| z$F`@D3seQ3UJhSvezxZOW~u~Lh6otVsUdspz@^15lI*pmOaOBS6+LQ_ zVn>6ai>B970z%mC4DfA?BH*GFN4{B)RP`MQf#Jx=dJArZKd3M9Ud_ zH|=e8Q;?Gs7wxbYT{(Vfz;*_VGz??G!tr9TaK>&Uj&jgIfjMHv3!J2O4>ee+rp+uv zJMpHDk5>gvc@tvf;a>-7479>|k(*PQQ3-gsCpBMK7XGnl66hu~;?`xWsBg&i$UN8UkKw<0jXo0%0CGvOvP20zvLD za!$7efS^1VM|>ioPMbZaWn_ZNVozS%flv=S7~IoIait|SHa&Le@mQ*7{ub<^I)gxR zDaklHLXU7E4b7M5Z{sO^H=i04J+HIQ5;3E5Y@x9WolU^yNf-9%g0w{tkt5E%}#meCxTezs5it=0I zCm=)m(uTFU1^k67NB4%@S_~mY={|9p6%C}bBnid+Jd?0A|HQwo;}}Eyvur%&if0Uj z1(yAAxq%Me`>MyE;1vSRwSsewQ+F}uF>0ox7@~yY^3Of8%b*DkwGa=@PU#M1Fsg*6 zn97}#U}4#B(8M2C1BRMLSZ%i=EI$6di!GG+N29$?APX>#emRf%9QW|Z5Bx(;~e zRX|*hIwns5T?|Xq@Z{FJSBwWtIc{{fu#X>Fw+V8VDDu0$8XY+-hG&>LFx$~Z=QK;I z*3^|@w#3j!f|DP{AOm11-n0Yfn`&OoUYo3t$Ai57eZSfIYlVR#eREKXi59}2$EQIh z*e#bGWlMd9771U(?u2f^)By)_3f6pL*?P=lXeHwj<~9Dl_{}tPg5@~2Y=nW?Ge0(; zMa;u_^pGSJJ)xp7<)SGp$4uV|pld1i0{lh4xvkwH4K0oc8lr4OH@XXQ=n<&2)DC;W zBornJv6kg^$0N@JA;_#89h!VUE0taWP%lh_R!zDxwpm3*f9E^>LV2@|?mV;&f6JO) zm#4^VLgu60W7c4**wWW zR1n_lHY^>wCvZaY><>4qfwQ_AmQaM{`%|Ui_&#KVKHPy9o)#L_3A=%@z!K>dn9yTX z-+Uel;`F2|2!{jClDspX(P?1<3}Bg!lN!AvbA?s_&8H3ix3x@G*W1eQt!dLtO{?BF zG9tc$i80CAKdu1WLEk$nmP`l*Xd4p9`Yi%&z}RnocQTkJ4VDyLI`CcT(08}gA%iEn1DUudm zST=@(immk@+6WwT&3kZk?xc-uh^WZf;pVQyB^_C>nY=d53~!XHo316hDUv_YZsKxr z2EI#MKLlg{R#Q*b<{-d`gIBnmmZlH*1%u8p+=Ci~c>%9clydY4ocY=oJF#?jhyC9B z$ao3WaT9w~!^G1cd!GU0ZsIj{Z(He^u<;J_DC~G_5*deGMM{Gur1MYI!zz3zM^$v! z6Jc-^Pj*Zr21O)9VEFCHkf)LsCcpLZxeLk8R6cr*e1|1~0reQEfs>KQV5K~Hl{uhc z&7*mAPJM_W(Tg#Xb4+*n`w)N#RvPpS0<*P7Q3AWjY1_$6TPq1F<;4Lo3fk(E)bg7~_R6 zFJ6>$rZS0OXx;a{t_a`2d%V<~4);5cM#Q1X({5 z`^Mjm7e?sHbyg6~F(4_Fm?1Yi5Oag_=r|_I{t6+T)k7P6Wa~OjChzuxm||?s0?Mok zZDYGnxQaI9`x(eFpc_<|Luh~pxE{+kIrD5aULOMKMj$P#@pyEeh$=nPUZ{ z8`ccz9*vA>##Q^rEWysFOh*pP;f@^U0i|pG70(uiQbr^dN{7MRhaSQ@;d5mZ0<;5h zg{G1{uP8G4l>`DqGi}H_`U99VPR8Spie}gJ(xTXtY4ZD8C&1G@7E3YiI$F_7zwlM(7y8O~w}L0QEP z3dq3q-Cv2KG*Og{3*9Mk*zIM9<6I)Yt;)xriVb=!u-Z7itl6V3w08ot24fU}e7l7F z@>@)~1T04cdM8V$G7%toblI!ozi(;PJzAZKogC3IWa30PG}MQqke09#LX4Y=;2`vH zdj+OZ>v!_TtSvk1JsBKRnGO!1tcR4C{YC{#Y|cwTx^n2Dl8M?DsGS`X6K(`qm+aa> zrPpePZ}T+)V;=RL9oC8y`#T~rdgVEnf-<43Y_9Y}c+!{=B`Oue2y2NfH^BmSy)~LQ ze5f)6M_Y^z4eRbltw0f(wu=Esb)mD#eiSpH9Ts)X_kJLqH4-& z2}UGgp)1<#w3F%~ZMqyH$d7fOCYN5t1XN-4R-A&mi-C1`qAVp17O#I#6&-D8=9`T| zr#mQA2QZa|cqO?w3RF26)JB77UGpT@H%6yMY~nV7VsjY_AGX!sqVLm$n9;71ZCaus=OYq|3pDkcKeFhgP0y#!UrkO@h98Y|+-A1uX31!2F0xl=Pajo?-9cAM ze|2U?2PYBDjUaSKtLl7JG?=6BSOrI+xl)9x#BhFe?ynN9d6HtoMqvFt!+=K+pZE?y zBXk>@ut$4GH3=B7@2M|J{9?=WL$Br#oB??oON*6QrHXRAng1YmsX0-wp%uetvSrCc z7}<4WU~`5GDaT6%$BC=G=Mo{1*4A?@5*R@jZx2$=lJCkn+A6EU?a#@hAh8RA(lmk7 zr<#M^NE8(6)9rLUOd|mlf|YfNJTh}?f9&qlOa|hcI!skpA;Vh&#|&2 z?_BYk;wocu#X0FlQWPq8T^O{$efUYC1Wf^r7BYd$sJA2pnBh{9mvYlk87YXpoS)Eo z!6IUrKA9&-O@rJB3D%uYn+MqrOou|SOHX&xF{dIl7HkQ)Y>q444t{EkW#}}XXj*0z z0xiBWc!sYMpOhm88$Dx?AG;=kcwt!EssR*M>PHtWO-(E~LhPMuM0ZxMR??$LxMSa} zKaeEuUQ_NXe*TvT%1Hw;6)`_SMIcH-&bnRkBT}R@v<@N$?sfuLxb`^|;L$qR=;@Z9 z6N#7{XaUDoX7%5LeL>sKZO1Tn0Kns#OJRymPzH_}+5#Z_k86jaYgy-(Kfv+#dnoG7 zNJ#PtDp!hO=XQLb4j7Dy(To)jh|po&S>ePv!$%|}JgRLZgy4n3TZRMRLUR5#BP z8Dy|8X#e0fVy?@}=xQ#D8pil73@GfmT)8lRHn~|z1}e!IGeIl@6((a{+x>o;YSv`P zl0@=kY&1&S#^BWgqi(dIi|Gew;jvrub8i6Qi1R8;PZvs#mH{kmaTG&aapk$779&cD zaznX+HYvzt7ZN0fEgh)J=@|jeLW=aVvdfP1mgl03vOz4z_c)yyd5y}!rEbT4r(o(h zu?xvQtSa+npk4fJ5l+}o0knJ%X335LjRah?%=Sx7NrhQUNzg;r5f(f$PMGX5(}Up0 ze7%mHToD8yYCUn_7Y@SrYR zEOrnd`0^8%rEcEyD;VxO9(aP%tJN{&?ctH0n$E(uPF0ibqg3v)Zm z_z-9R)oQ~Xb*dE=S^;I?dt4)>OPp6(`=RCGya|EGttys}vLBiH-RQ8e-XGI{QFfOS zx@K-8S^&&2%&=^8{OZ6eO#M_JoKfQG&*X@?a%hV`sHL~>bWHb&_@J7Lwfo=Tz>eM; ztUW^H?~m^Ba&h28U_=75HFx@Jq1bYeXH2{OePl$VwhJe7i+tcvl9NynM`~RYCf-Jf zTARJ3M=$&e3(NOka7w{M34Lf4WzZymr!a+P%u`%Dt2&X^Jaj>%RPLYVleDsNqb^at zAiJVP%+$*wwH9aEIkK*YfuWh7l*_KKf{JA;G+!9E(|6~iPQ7}Ac-yB)^le7#5;+Jl zhU})!Q{ib)ZYWh9+)*mvnnO2wjVP+Ig&vQxb8j6}K((4$&Hlgj&E-yo&Y>RteyS8r zo|)nR?W`GeMrGb)x@6aiAE@363Z6>x0wPGCZ)po$W)z^Lsxx#C#2CpPTm?3^mzp<~ zq)`B=D2j2no{}A(iwsC1$J!xMD?tekylK(?3{)vIBcn<)@=^+XDWRriN#|HZY1cU# z#xK-&?^O&LPhaC}P3p=no;w8kqwzz^Q-R)ex*rWLPxpNs2`Z63==hgwg85d^wlD<1 zDIz$4NpSL0H*-nUi_850Migdxgbt|)_!_s+J0e87D;R6cnb|RFA~Xh`nW-`g zT3jnT`w$>sgk*>yFXsyBzSE_hd*%=naTl?2oS}R=_SMZ$sj0#7`S6{2tA?k$%EOOY zze(pddY;}VjwM~-Qi9mat0NhR&b3>m55CP{i(-CP@C=tQYk?x70eJ*#If=Bhj$VUg ze)k1wXkn zJAr6nyM=(s;0PN2O_M27YZ2TSgxsLl!!DC3lKQA0MVQ{~gOC=@yt+{#o0Y<_m00Mg zs{lvsXtmJik{}smB~UHQl4*CulZCm1$K7FR-ED#rUX`o4SR6ZPSq=%6S@`9`Y&AN( z7%I2=s7w$t`JJB)y_WdN5}a&4VT)0DNO!>-aWMF0GPKY?i~Mo-?)xznmM)!C5BJ;6`w=mz)J+cZT5P z`+XF&6Bhm0D{rL|c4#m|t`KH__QWjfl=qz$OFXTX;M4@yYsevQL~x90z0q$WAikim z7S=J7Gb99-1b$6W%qPbfO3;PX#*XHa5(NYD`8B~|DswMfSJY2kjb-ed z+5Vi^R~aoJyFlI2!l_577kfIiJj(o+3o@mS5n7HIj+`P)nk&+wP;ASP_~PD3>SocU zn|#X)xS{Qu1;*mVqnKf4q32DD_()@TGC9T8^N5Fh>ScK2@A`s2Y;!jNOc_b zn29vo)Ck`_oh#uSXd1+QCfh7x3y1OqNs|GO+Or#k3>TCO0pBzWzFU`hu>}ysPWqL2Etacznu0a?m@!6-yD9Z(mlNPf`LA zra^y1`KLeHd?19FL)k2LqOy_PU=tqp9c*F!K8to2=g&?my9Nb29thqOf&6I}^zqV} zp`g<*w9F}6@1e$QpoqBqCd}PURX-1MFi^+W@hS43>0+k zC>Z0TEEAok!gsmu(16a}RjhZg%Sq@#F7oJ6jBGkY1I~Zd<@(nf^@m>%7(`*=nfxG0 zTp4t(q(k$92}0M|ijD@-wc}zHCA;DPAOw7>T7KDs)ZEm=-@EGFR~lm=$QAahZ15Jp z@Cx2kDPm-Z`fhOgKiNQF{2^IyYvwaI77{bm30DxYsGl`GP}ZoTbwm(L+WcW96|;{O z@&zvvT3yxhCaT)REPOFpzUaXr|7e;O&X7mk#Z#(Hkm>J;Eqe>w19{*gSxr;X5o zJ+Kanb(-R5DJzu)sD#rr(9phx55pT0nRuMZ1drg;w?sARh>`dRRuBX@RMz1={a$SS z1NzcTdJTr4ZFbtRpJEvSAth2xLjpMwh+5=PTcKM;@eGBS{0bzWS*)sJYO+9WA*Y_< zXzMLpN-vtY(~s4HWW#Tld5i)p~O!xBO?%c-xzR7?oxj&J3i=@MbGCSW8P znK_^OF1ZCdOLcYSBpFZLza$8_RfpZx6J12T0c?Q#9870@H62NyK3K8~Zh=U(rR-(X zUTCRLgwlOWBw0!a%i$72IDe+hcnlYCSAK8itPb--{zQre))t)ht;9K({^xft5SQfE zo0S|YPC5zDj1;BDN>URbLBUBt|`694(H=A+~><%fbsrbw)pbJ6u9fF}h;3`3SW`^dfu_ z>1}v)Fwl9)#F^ciehYS4t7d_Cu{sRu=^Iy>xmuhdkM;38&wjZv7l#stWSiB2lW{nE9Jq+v6Dts3mF7}>(OH@LGKc@h`bfk+$wMA#&2L3f`*a7+=t)3lx0gF zu*`@>ZwJy1G&Gcsm3CY@2|5!z)x*FA%6gbHnh~1>89-}u=2|hO`ytAZqc0t~*`Ffy zyMSHUf;2JT9G~N6Q%3Vw;<@StyD@1z7|S65Ne=#=@Tw^f1?y2mHpbE{rvt_dfp+mpmQ%uHbfaUTI(jZFc3bpWd|r=W zs0qvrDj79zi8A>g-Y-d%X$@b#GP9p>exIg%3M`I10Xy~VC_L$~$rOL%lYp?O<`mGJ zK)n4#bY1akD3FoE{J>i&5}62A6nvh(+^XX^=|&z}VsxLG zH&l2Ou8vVVyQ){Y9PDM%)8$RP$|0qMM?Q!-%6&#lZwWD+omkb(@H&66*ct;uLC|Y7 zh7Oa)Eu$nY7!+f-JUUlpf5nyXtsj072MvqwAHpI;Y7839+K{7=n5lfFB+@6^xbpMj88ssLfYqxT z1?1xA`1|cHR9TRCC=Oqa(~@ZszxVfeheOiGf^@47?AyA$D00Xv%|PsBP&4{`1bu;{ z4(HW=!|=kW3nX&^n#u?rseUAr5J}3=eE@`QEsxj&4Py4dn==x-evCFHCl7NzIc0y6 zK4{IOx`V-4)7E%8l^&#wb7SuTF9uYQ^U+uDBA~|GmljFlO*hgI>cD-4*?PQ3^BAaVH#bver<7i>Uq)c`iRmmaO== z<_dbP6J;ve@dIWCGDkIihJK>W^YA~>h^JpM(%r`sHw9oj00u${O6!7&A@cfSDMcC; z8{Q6G$|Q9K+5Om0!Z1-(7r53@aypabThSoVF!DMcK**7Q>2cM0QdWPWz@tG=WnQ6R z(dxJ*UQ#izNZu$k+r3QXl8OID3iFa8vig~VbF}*rU66Mop`^?cIAdv7p(Ee-{E*Gj zn30pPwoB;sSz;6|^_#z!n6%XsTDD#+TCPgp-?B3Jo?Y@6@eWbuYG%C^UR#CY_AynkiBpnE_S{9wa6AQLH zGB`b2Sl`Qn>XZ+yWds3NqFK2fbYB{L+11|62re7R#!N$cez9w9Hb4p-m;npz?1rM5 zUidMlr9fkd^9W@%1ac;$+kcsA^L?EO`Hs>?n?|D*&D@|8` z1r3*X&#s`1F60I1^1Jfk{wdLyHNRg)()vfuW5W0*tutAr$E8TLc3FopwGb*8KvVv6 zEbp?ulRo68rSG#8F~fh!pZPA!4n02_PE7v_e;7RzK9$SSWM}?v6LXjwKXI9l6Pnxi z_!TA*-ef|s4ZK`ApG>XK^Qum%+lxqo-orfG&>qOeky2u0btepaj#4+ExziWy!(p-t zBiIOUxS0AICLgsey^2^>QZA4$obeKG>E<6&G*3@sEe9Q>kJMnTyWj=5i&4N2Yc66+ z@{pcoeZwMVmnI$Yq%nwQJu3kG*_(5F1>bzfutg{%(Vx5A=r2{VBL^738Im;$d(gyv z39^2jQlPhbm>3p31j7%~(R$WQl|It>ULcB~Qs3Nba=J&f#kLlLkfpgRUTUV`NMv>* z1Q08@QLNUJTsd52IMt~BhM!isSjT4i$Y>z54oA^-pVl09ZMYxK$di0uG2P$ApxP+xEP%QeAgXaAI+)6{UJJv=KYG<3;Q@zQ#YQ~-OmXN`d=FC10r`}jio+(EDhNm);fNKR#RsbGxc>eqAXT;{9t$`<(S{zT ziKB7e#XUO#icmHg#~sZ1t2t$Js3I2Xc$y%k-kcmO?Mb30{vNnw<2@A2xU1L(GVx`@ zPt7CdcSlO}ou8&H8$zo=ZN5Ph+g zaSWA-K+{0Q?2pESn4!id(&oObe2YFUFP7ZE!EjKZk{4O;x4YjwS@br;KQny z$;&Pd?OiEUa@d9Dk;kaYbVsS&YCc?-=NQvFetWdTW9%h`NpCCrECv_H#-f$IqecVgdM^L^GX(XZED% zw~(1fC?dh4d0W`08$nNCf^N7H;|5vJQ49(z8_ z0>Gpnh0CD5Jr7m@U>FVHcJ|lLA?Ygl%9I@_5@NUd_KOZD|09ft?Gz~wUO?xFh*%*H zkBH6e5gNK~yhlZ~##@Lw6!$(Jt0nM(~Ot&@q<*Y2U`ki}qDJUy;e$ z%3{edCwzY2bA}Fk%Ja*3xIDTwnNW1nX=(NMVM`^eTCyBEm1(i#8({Y(QI4^6SvfaR zXa{f)CT1JyU5sdD7nq#PJemNt-P0$1T4Or%pWjK!rN>%Ho1x=^`erd4kdplG=P2d@#d+`KptW!s57ju48d(Np%B}8E57?3CkByaCIN6j z$Kvn|4UD)TfcAsr0Ph7*PAXDCPt9ohm!-c)ob}_##(l$mve7DXnn2gNlCA=X!V*L{ zLLm@F5EBQDAp|fc7KM(kx9`c;y;*!Fx~!}b)rR39Og@1GHxKpNHCz-@AE9RUOvNc> zFj^>uSI^hzC{MepaY`wEYc^B~exUW=)beX7e7gc{@r;oK?KU~Cz7qb(D<;Vl9qrEB zPjjrWcGI7&J;j~$E-&X>vOnB|sLxU%-f2Jb{xI)~j@tLM!e`>YFLc#Xh75d_QEf%x z;HDTpYnXUg@mmx2+3=umiNChG(u}Hwz55AGrmb_NopR2WK1|Qd;Q%y9#l-zJQ&PnZ zlLU(#rdxBbyppO{p$M*r3UEAwr>Alv#i~H5h95qT ze?>=lmK$pET~9_GN%ivm*XXt>6++)9*8Wl}LfpG}^nrfq7(|PeQ<0(=+X)QLOc(i+5 zSPDoTPD!_iVmdXnQVJ|WV?0?{K4$bw4ELuHnvbX1u3kt5um!pTI-u@YQREKz8r(Md zf=}jALJcrz@FGEA7vbeNIdLg%G5{1q&p6%#a~_W9;2_8Ca*ZOaf|{E#2wm1=uCFk} z`Bdn1#M!H9TbEkySO;f-Q$3>yR2xp0uy z3Om48Ie#&OMl7AD++oNc3R?6asLDuo1z~aP8vS8|aM10Cc503ps)*f}2&8 zNU|mWO^^i&f=@&Q<9ODtTBeA?dA@KX&gLg(E;Vnfc+lvCH3S&ZxMZY>8HQiuCLurJ zQ$I5a>O@p$vA-D9p|Y3ok_mkTZF9g!n^PCsOf=`&4Fgd~QCH#kjFEMiHV~--v0yWz zzsX4`LiZQ`8kVIzAANVJ2;0kiB_dP!ECEQjn>~rJOAi1ZER<6;9D(xP@`$`R+0dPE z4{FJh&XMd3V>sP>w!f8N2U=^iZkT4S=M)sCxER1F<-hZ2SbS(*Lj`HvwXlQlVXXG#|F z@!~C#0Nj1H|Hib?E-+=tjc5Rm2*qG-R>h(uw|36wkWxpMw+ItdR^{JbyDadEb2%un zloC`6_(n%Jgba9tmBa9x=!PR?NqS&i^@3r8--xTN=Ym787vl$z$`;aTwV%5&I*|~c zh)SsfH4L6e8pkvocl4=P$xt|g)IMhfTWE@(imOwPoGYV7*)|9h#f<(XCi|pHGsc}N zWB>-d6>1v@nWx&-l=+4?oPRnm|VA{4NsS zb!EFMc@Fkcjj{xFeMOXjrm3YYty9i?3*Ee8)w!MTSg>I0>hjatTdBn)nwSa-eHqP= zP;yzZ3z3cCRg{-UmN}wy7DZg&83A+=Av12Ute>8_u1p|=I4nxSnJybD3cc$%Bh%3HE(h3iR?uSoR{n*K-*g%iwU4QD;rf!VHFPA8Bqgx(q9pCxWaMJS1*pdy8e2GABWod9yxikS{0 z9WhpGa3wxBY`2)47bz2q2a9dyCLbD3=*8J@Zf3C!WVCYJz>pp9fM8oWO|EM}YOZ;- zp4j)$H?*G0Gktjn(m7SNC%!AN;(KWbiJ1HQb+o9V1?I$78GwkFsBXNAzm#)RB=<)@ z*#azJq7G!g9KY#`B5;jMjIJM1EB-T`L<(4q@6Lsah z;o3rVe}pYptUT&bCg!2%>3l8tVr(fnyJCos{-UE&XDRjMNuiwKC zf<4sotgRseW@CiliU_CIX!(90tQq$`>ISL)$>YHg@rDdcNjqNao|Y!N5N?1IAy(!% zg(^H`o`8ijgPX;99hEP+M9f?2i>8#1ymTpaPQ*LWamP|d$;BX0ll(CQ{n#tkWc%pmx}@-n8ea4j?a6HrvlvI8-HbG9F4zP0fiDl z@Kvr}?8=#a%RgiKO%HF4%#tKtQ@BU@K~G*TVeGEe@I>&nj34=q@`v4?TTceh_FlpP zZ&xL0VyIzy1-o3(fCza1wjzej==oz}k1iYtu;vu~oc2Dplgq*^;47_oz5CZf&H5WZ0s~XfNWmC~{~j#p(p1YprANEbE13YPa!# z%XFI%#Bge=vqrYuw<~{-32aAX=K;*a9qtj7csC{UIk6p5>e36XmKt!ZRc9vRrUye> z#^cGm`ZR{{ocItX00Q`~cC>fN`~@YXNMBdJ@{hkapFUA1q-y(o4l9LH1~_Q)5}{6T zs-}^T*d7~T6%6@d|0Fa78VR1p@dj#ZEm!gk1?7=fv~ohEGN)q=Xxo+2b{2%wH#xuJ z8ti$&hVWg61k#DH&7TA@>=Yy{4cbl7S;nJ794sfS7Wz&gSDc@xP~+c=iQPQ`K%B-H z%U((PpD*&l2w}e~@E}8H@ICR;y&^cqw<)w+Mj!B3RIo?iD=~w1^FNL2(Fb$-QLtcm z-EDRRhnYl~31TDqds<)MYitJhH;QS7hD2oH^xJ9~#n#r%y4I$qCc0>G8__%|cX#2u z8TZ8)d`q#?a5lXBadTp>PDf|TjLhLkFdtbfR|b*}t{KB$ewNaXr@WG|H%@-BWwH%) zRks-XFf_CqEz9JFZ1gfGlR*zf000&2#a^5-=`)@jxO`*;7|hShZvU24v?oaV<_(*; z3|c5PI%6xPqT~qjNZH(g8nNq(@D*>QngpN}DUW@&47U|RWKR`*yK!SCJE|JIP%Un7nZFy(JIk_4kTmZ>KPUB> zOgb2LeK*dDl`JCcwh$(`)b+d{X|`1czu%j|Xls{NGsYM+!(GU8TKGR@PvIT^e&0}_ z?8-;>8a)<8xlU;A&6Mm8y(Y(xtG6?fYzsihqxK9;#hpJ<%?ci&+PP9p)`Qdb9auK) z5GmN(eyKj+$IyxwGJEv=iR?$x@PHBhZcsH|rrDxN3Q$Y~!6bPCz@~O>I!6*=&0pvc zViXn#lE1ricFt}pnS%5yio$%oK*r-(iN+~fvS${;IvHVlzD5~UTOgw^$VCJ}JjEd_ zFO&iK2pW|RNB+q@tN7Y#mQqk-#m(JSv0F+V(?@1R;8$u~Wx;hRRP%~W?fSJLf+LD& z*Gym7WPVs2H}Q7+wGDxrb?j%5sh{v?*szJmRf_Rpv8^^T=MW-;z;QUSQbyIUuY;#uRB z9&ix3xG>}vPz^PD72j4Si)O*?$*6Tin5`w-Fi0N^q53L&J*>nKW#ucl%5>zpD593Y zTI7vo?zY1)j`99m@d0KQ*>HLYPe@p0=4{NC_MCLxr+4cp9CIG0=i5o1@Bpe%?8zs& z7QnVJ&49BRPX6X_qhdrSR+2KPZBir(-auqVu5ekepanaFHTV0V>T`;DE$T@FK9sPe zHkNvtQ#KRLmAYAJf_so->_7bHZfatLZ66UjHlFoV%2{(_C3H z!4|GIWEcf7=F3=gEI3rUz&t(l1K*nfwwUTEXEBtVa54#&-$WoNGXs4v(E;9;P-k*7 zjqk;8M0=;0cSTgq==9QZ`JOZmD;y-oqomSp!9mv|D~xY-#15d2;8d#gniZl8&Vm4{ zQFfP|93*lVrqH!`OlX_27chElcUjtE@l!A2tp8|lgv{@&`MIFfG%0444ON+d^` zeI9OL(J6A3ceeh{RP;Cr$_<*;x5+i-?H5!O(~_vdHdkf* z9?=P42z`JQ+=Y6}1_HE*WE$ZjF}dPwhw_EDHe4&g{fg+_FMmbgI^ zS{Tx91euG&$BoI=GHydxoHKTKC>3v3LJI~R*Hk9m6SS1C0_b{8Al1i1aRjn~)5jlz zsF`uA1nntRgmZFISJl+PUxc)K?EpUV8^v`Z7-^%~qV8%n8y-SvOktGTJc(IA^G#h; z@5qXr?wJ0fjfjwBY;Nt%u?x;cm!s&l(GFcRW;mF}Gf`R1 z6MC6MzV?7ea(}-s2AdKmb#R8MaHMyD8+s(DL;qS+!p|V+N-p`WI;K_rh|+6sggS|@m#au@6(VWC&OIPgkBT%;qTX~TK= zcy&KoF=GKPUWH<@Z|72l3r76%!(Ki!yp~K627VKBcyN_Q(W=91$Vq_1>k8o|@x;h} zI6;0lvfllOu_#V2+lsh{27F|=O#SoyR`g{+;JA1X2LF}un2Trx*^o>fAgl!61*6+n zB1DAGa!v%WOCcUMecCjypsqvo&52>H$0wuj2eVX-W`ABeyLAiyknIkKS~~pUCsD?b zER2`@)SPPaWWhWJnd|*DHV{2x^#0|RW7Q2LgNVd@+V`Eoen#3LkC-sJ6t*QcPyNa& z*D|HSSA(Ju8fQM@(2<9axh;t0EOeMCN%jdOekE1RtP4u0(2*a9ax|&Bx!d+i)CYJu(w(%7V;`cFnVf3JfFgybfG7ZQb6<;6o@WnLuTXdG`U4IMh@gord z86YG`iy^&xJs;4PNW2x?VWU6#}@w_~ZJRJ~vR%oKDxy&`bga*oDto$Z#HvH?})2Ktm z4)EpsX2(~gbufxjsYMHf9-?@Fhp5TG)|{;;z7mzv*qQD~0V^(Q2Iq+9TbT8v`~V-_ zaepXzILPUw^>oCWRA>}BqlPSS)4}S<-wK@W6pJVrz=a5e zH?rlGMiM@iYNV%EXynJs`=PwpA8p!_w`!w7^QjK$Db*y7IMXk7g8sh2)^ULd2;Ra| zUXzLNlD98X*-SYd;~Pr%(C4;DPZl@TF`mvqO6jVrAZ!+d0JMVa zkZr+53<|$R^+pT%+bir>vKRG0HGg;4o|&zYgha@_J!`G##owQxGjx;cHSu0h<-w6^ zX@Ec}CmA{%5us9>tj2l#!4^3Rjwgy1NA{|k;Oq;KJvnp6sVhG z6)zmnV8xd|Q8{@9sy}G;Jb0~T511;U)fLM{y&P^?cfKigO0~W|D40 zPr;+YtoK5r+a6*lxOasI+EngD3LA|N^(^_hG!>PgnPHSinyaSJ4=z#;u;^2! zz_8Mimxw2aVG}@bYLpTDCnSfO>|**7Or&~D=zmJP#D>55Kx0B8THRun;97PZT*$~%D%b+ZKnd>x+ z=2e1fQX`k*|BfY#pBFdIYsp~k=u})o=45D!p*5M35BqdRlMr?^HH>BImxbn0I(dVZ z$0~1IQe&*fkRREiQDQQYh0vbP_OcKyJ((aEm0)hP5;1V%jnr{%6`_d;Hek!nDwi0& zPMjQxvp4-GR5le$4*jU^#!4R6ZLH@h(<2EXGnjBZNH}iMxUeVB4Ent$Y!^GWgusa^ z)%1%v%E9S;w?70BhsZ6yn|jcFXJ{}j3M)CFDLbZ=H%l~c8HAhi$<)?;dEZF$=4bu}C9M=Z5 zDK}lpR%ZYDE@Vr6OV>D)>?A~>LCl7~V;12iB{kk{gfNL8z^aaJl$OT2d5)mSC!0v~ zkEDzfd8t+?ENhN)w`D4}G)Xwu$n~c2`ce*=Z7?!bV&lqRd9~`GHH?eyNDmT#OS7#=%8immvwVtk_yrx>y3U=ks;8 zS9LTSIZHDSe@nYmeRvJO$2=nlFC-PEe+a`}ysVSlM~R`VFbl&D-!835l8Sv*BN1xt zwYr(dcjcgB#fjc6vp2;PGA$unb(BQTi86rCdmjriIuFB$N@fboLJU_HPelYBCSG>s zUt>X5NcK}jZ6OSbMVjrD&e~P9{Cp=Gt#F8pkUm(FQsO~jl%ZHs;bL)DmODzec$>;@ zKl@#G%mfJsLwh!OF@Vv zW5V~{(~ZQzn12>d#;_Mnrwz&Nnr#o(tm0vOuVoF- zFaI2*6~2WIn&Ew82(m{8%X?kNV_$7aX~Ov*`Jh^l*PnoC7PzVdUEeWf8A6a*rce!d^vWe5mV(DnR$r7Rq$-}Jjg2@jD=r3iy3qevgN0Yby#pbe^DGy zO<=Y}(+XWEhMY2mBuY{oF8maG0HpMB!Y5xeMI_i!r;2B!KMaGL_009b7x3LCdB|B)tL)k#bV|ANMDWf z1geTYZ{{zFQ_MJ&Q?w6v|8Wh(&nC|X13q)Vm1J)iB%1r6!L=Us5ZbvZ_~82r@bPyP zh}Nj0{F8$Vk!ZR|aA*+}Mzg{LO4L?H1xZjn0JfN)BWUpOd3HfMb#Bj-kV@KjR-;=`=>#Az%0w_GrRp-2DycL}NCEJ79p6ZfxFc`xIUMI3w(q$elZB7Bm_ znWBwImEr(w(6?=AM!g~r3Dn3jTLmGZZ3D(kmFw z*sVKcXNILdn$SmS_xQFOs$E&aPQG_IY2`W>YrWkUiOF0IFCaG$s(v<6RK39@zO)_? zot97z4Wvp~^Un|a4@e3Vdb|htv~SGBzF$OFl`|Q;7civ#aLrTBRLXWm;;y$8667Lk zZVhX>79FUz3YR|YEBwfrRsFZ!Tn$$T-GLGcTt*2CYpwt)EgrEstPnu&yfz#-&O2$g zM5T(%n4?B`qAw&Eu~o=J{jO=GzLjG+&s|GrQ~GENn?72A0`RjDu{HX;_BgGG7otgb zQWvH%8^wR8u?4xSjaaCd7@#3r_LwhwC6JM$WKiFZ9O>)dt71aM{>f)(4zM4loaPzL zUyNF48&m2+?uZ2|iKQ9a(9xbIDc{1`2@mK*Oz*B1gVKeM-KooB-xC;*y(p3|t67Z6 z76la7B)-fyvgx8LSC6quhF@bL=T}P{=lx{3CDiSNu3<*6#JIGdx!ffx)41_Jli=^E zWXPq~;VMsQ^DR4*vJEB*9c>Et+|w`+u}El3TN$S)u?8BL#(in2+EoH0@lG7WNO?RN zA_X>{7_u(uYM7|Ow4esu; zHJ#~Fv|3>oD2W}ARXgDWgXD18x;3+Vvj@gRSCAp~oibditJDB>Bu)Xtm--Y)3c`SC zA>&O9iV1l`tcGx8L|+Hd;Gr-@QrcN6HG!H>>no@l6)wfrOY~jp9gxFG`Rz{e??+!h z0x&H>0fU{kWWuOYXEonNiII#PG-i;sy3&rE-`MxDg8@_2rL^BRTsn+4gcB)b0XTN! zMNKb^8QFddY>N*Q7@b?9c9n7QUe{4T5768sC?zOzXo|{J;{|Lz zAKJ?LS`@Yfsc7I>2&R-=uIOVBoR%1U168CxV9c|xgMiV;4a@qJ##FX|n;jlhJ4dc7 z8s~J)GQODUY9}%b97Kr^GZORQ6@p*+y-(ekIn8QNdKk2Fnl}?#h#Sn*x!EV;`1h?V zvKFztVp9aXS);QGZItZ-z(XnTkcCzNtBV^;{yXCNhZrkU(UY_u|jyfq_euoI6ZTiFhjmi^P2HHsi%gj3NcejNApuJQ1L*tY^H>e& zqapA9B{D1x&xh_wn=O}%v5f^|{uA6xM0lp|<1%l+^TmOEKF!Nk^zFLJ^}OLrv5U-q zj$M98TbD!WuMFTw0W*PzDLzZ8PAsJZ3I#n@SMC=-`{eB3IH0uDIts&PYXRZ<&)B#x%Q;6vxfK=3 zzel`zgaY~(ka$Rkx9f1Yi&YKRfnpEa90-Xs^1=`0hOynvenJ?Biv!`Lggf0mu7tQV zb_I*ihQM(uvKShr@zA`8?(taBglEA~QNfhfaFaui!xSW?*obY(dtHJWyHH_+GbYw) z2DFuPy)rXdlzlLvH1btV<97dxSWo&xF5m$GI6rb`p-6Paj@1r>Fm^ z1Wr9jIVnXOK&Tpxs`d<WzK@Mp0pT-^DRL6}@tl?KQEJ*&Ag!Q} z*CeGDP8=$m_k=-a}-zg#AU242b>HL*T$^k@q9lL$P=@C_RW z=K)G4XZ1mRR;!IP$t`zjjrv=Sh413Q1481~W^S|JXAdRWE(m~rPKM(l-;rbkgd;KM z$i!VBAX}LB+j~t$H)9xB!4-f)?%0$|^n1ReJr|3<{WUw%Fs}|np94fsJ7)Yw(pbrc z1dX$c2Vh~^F($6C@-jM%(D5OJT~aaQP8TI3i?0s3@hfncEmofd!?@R@hn8xfbHI6b zqX{PBGAazRvCDbsV_&V(xAH`B@#e+9il`8rfarLL{0|XubQt0Q^G1H?FwSF_Z)*NKA+ z%bwd3H3|DTec>K@q-t$Ws05~`?fvt7!; z^;!qFJCsjPgfF->ps3c!BhD~&6drY`D3ZY?7kh^O5(*7Iuw`dX8%L$9&K&;A7M&tN zs-$n7BJzoNmX{+qL$+acZlX=>!94d^}R&wsYx0dfCFXv6q4a7Oq)(s1{$0xH!B0{fn z*I7I`;Ebfn;j^aqtu1}!kZu{=m>G~PYMfvnx2{UP_{Yp7BpU^BPX!2I7!*+b(IThi1OzrL6HriVtkrY={=A3m2)X$yoqvM(+eKbbI4qL& zo~+VlHH!su2l|*cHti&iNT_mx$nu?E)Sx8pnW3(XTCKh;`>OQ03okLoec#hkaTM~-*UNDudfOfRNTv{=6@>w8|5|&c*%ob)8Oev^RI8X7NtLbFXp{#pz>CDdi$>FaCX1#`n^w6F7d^fiDnY;y z8|5}8xK$%-oxU@A$19BM$S^&|Dkz{iwHznJ>W#e8To!RDbOxArJ$M&x6}V4KdG6~> z66#pN-S0d+a_xr-AriNT<`FAg2Fh3LviR@!71%9A^OUED zI1*-$*!}vG?%pfc%MsgZ#fK?GMw)Dq3Pf({NwHxR`W^kgKfAbiL1H?1KhRylA8`XH zTZje&s+ov313p!93xiDE2f9=Uj9 zDZL|tG5fYk_^3gt$s9{|+BU&)eD5s&<56#jHb85xA+R!5%lu|r*R070IpLJ_vs!dx zImjT>04EzXsd@u}`F)sbNd8fykue!c?id$}>h%2!92hT>brWU65eT~s zF#VYm3)BDL(?s@)WxS?H8DC(71Vhrwd7)ECn{Y<2CBssFGlfnuemm-X0Cer)Xhqf7 z+)11Ii2n)O&O6>D{Bp4zpLL2EtuJtJjso=O#uKI~m2>OB{ZtJN78x%l9nI>UX)c-h zOla>TfMWGG|M|3}4|67CdhJ#Wo5x!94*j+7-`pL0?*+av*>yQ0lM_|ee2`l*M)1FL zbxOvs!oXpHWg>2@KU643jH9XX@nHHF`VE=ISWxCv{Ph{$I#lKqR3LH41~HMC8BFTTV8W^8*zYtU{^QY6Xfd`X%0I0_kyt^`B!l z8cc3IMNg{yC4B)$Mc?wcW&~b}1`jB}VTWMi^VesHcT7e)!@{=CqCHp5@##NAOG~E-+ zaC`0w(TvGHoY-5U&NS2li^D>@hC=rA|CjQ%P~Z<{XAy-<`xKr9c`c}8qU~-HRAkPe z)HXB!$PrZF4`vkXJ7i(!Vl!%yySmT=-ZhmO1@@ExYbYTp>R&HgtVE1pF!1{Gi!b~} z^xDu~tccU%P_IKVb~?_>06w4A7bYBuqxb^K{rTq_i*Mz~G|On!h^V;JmjJn=W9fOB zA+%uWP$2>5q#3A4TBFEBhgtS>QX!o=qHRi1#gIg_17Qf9@@VFlFwar`^L1oLzdz$q zOa+u@WQiZK-^m$|-oh>l4*I^DG8rFA2J~4)zX;=I_{&%XOC)p$-vh{gu4YSXBsMsV z0OW+snP6L*Q#6*QaLl0@VOY?VWv#<(9*JPi&{g(M38RR zpFECURQH_U^nG^>fMr+akz=E$&yE5t6l9IOUEZWEtag^H8XqWsy*Vgh^5E-@)D)vZ z^#UCf`~3ZrbM7)9wf~dHUe;K!25KqB^s1>~+GeHH4{Gxr`#0zGqVp}C&>KCv3VxOz z|HM9(zp)?FF`?1oXpW{}mUzIK2sbnP@k~YVp15Hf_dXfa?S0tPjAcTPgr&{2EJ&41 z)#$>(L^%N7S z`IVKGU^kSTpt)yEg!-Q{HLtw7rR;3bX(EFc7omI-fO%s~{4|Fwhx(8-@{8fEFv6QVksID%}X_6$?O>m%;x9Tct7dRr}gmUJ1_1qQN$ z#DZyEMkOIIf&T_5fs=V^vKtXmbPJfX^mxLmCnYlbV7gQUn2UO8p{X3qZD&smp!Gb| zuRbEFXIh?#i16QG$|kO%%ojmTHkIfG91ChNX)egM!~7GkGzzG^0Yih;B?A%j%2i+Q zka;6AeXt9N3VwoX8=X@jU&qr0Q0mB&2?Ku?Dax{xn5EtU}31QF+Ys5o=%A;kHHfC-th2ngtPE8aUh4}0rOF`fH^}b{N51& z;9)MJOCzWJ(Wm(p6QhL=Z3SR>wg7(5OiZs&rXw3F#P|nB4h9Y|mnX7F6$xx{+ILI1 zDwW|gF>th=N~a@Ov(;F7aA9yNLY0@E*`?s(@#kS*sGHaoa-)`~Vu_Ze+`3TyH0Ud> zDu8>2_yjAb^!G&VAsJD}y=P0mS^H8zi2B2V1!%aJv$se0O0!VYVfw*8aW!GQp;ep$ zv(V_3IeUiMRxD?3)FAIEkj@+!&2t930J8*XCmA{>!Br(hy)mZA;K{FMsA|rW?NQtV z%5~7O@2dnS2_I+@g9rsZZxhSK)`ODp$w)93(c0nkX7Uz3O3{b-+?1{Q)uKRDa(GTN zl7b2_+e#+?k&E|mOdQc z57sI$p<|2M+iD`lFGV(syAu26XsJd57P&7JV0l6F7j8QvH!UBENU0~~P({oqj&}@j ze+m={w&`=TU)>N0ZbvkJTRYiqOZ|u}oxX2SA&(!$uK$63 z?eejMj6H9qupNY+4!jSX>^(O`^1_(}%d`ArXhX_IZJWSN#rXhuv!bO{8e7(t?vo?zzF1R^jl>*rni&X@%GE9sdw4$}A1k#usrJH$(G zox>s$TVNI5YOvhT=0&BB?3yQU?V#*c>*FiLY9dg>k8;CrQ|LVo*{a79AuGa3P*uVQ**XJZPlh;{zwbF$-mfBE;x# zqFocAmZ5%h#aPd2h?1rOJiq7nVkAJ%nSTm3mx*2Ovm!#PY+KP|XbcPJcM9w9)l4C`SDKHtvqI;~Pm!aKMcrKGsa{`>p_2RKgVPGTQg>`jC zQV?Ao8rMr@8RmirHdQ4nwKt|7N`QRm8P^M{^;Ji}m$JpivaHe@y<235Gtm%o2)*R@ z5+h2_U=~G^h#W>(^xgZpH!$6?R+;2F9Ou&(Xe8B`_l-ajW^kbO)N8Pfc94@b)j(%i zs-pXhi8yt=6gtIKXBnm<4^WQ?)F2Snl(D&th&=-4$rlJ21>uumxrjG|cG&@4Lox!jt)`csYm;_d!i1N)(L# ztPu9|Y}4B2Y$Hf^QR^iejZ2YdMIKUv*t=%HkWL5yn)?vGOI9`5q42|zyE(<3R{`(> z4VD57Uv}^_m3o`#VF5*js8PStFyQ7xp@GMUFTt+#AR881Y1p&hR9NgtvEmVk5}hNTNXU40~!gkt;|d!Ln}*XiIAQCLK`_&u;}Wg zoIVcVvt%g(X^h}gaJ-fj?nycr*yx2gx2@z&b!^_FutA@mzp>-OB5hUqL~2047G$$Z z5w*|^a;rikIR(nlvqLFG)n3(L{~m57SkXS*L9NEO%P$`r>#G+zSY`-_`p&ckeVt3x zdAX0(mn^yj{2)Q}lrB~(>@D9@`n~-AQ!M$DXd=enP+QundFfS4l10FOe}&{9Apq_g zo4|Jb%Ih>$e?`Co?gwH6k#hn#X0gp)q!J6E+c$nBDPULQ1BHqu`GtuT{CqM?W^{k4 zqCJs(Fsmyu*wk_mzUZeriS=RR41)gyHR zP>#}mG;agHEyK|p(TJ$=+SW;p18iZ^|9!t?Mu4##P~(qltp3nX%SbbFWrXS69Ejq+8SzI9iZ>8D|8k@$&D8k`u-5;FkeWh z0IcRyP+E^$lMD?ksbVVtsW!u$d1gxd< zk{Ezde_>6Hj8&D(RjEfD*XpXJMpJNx4Umc9{Dp9mCQme=2wy0_YfsYw;$#xvx!CO% zHzFQ)Cduq-cvTlJuz8;zOo2<>BTh=r$kD6_KhP9Ff_NH_?XCG;EiDOeXd>3N-AevV zL9lk3-_TGnBciQkS2(F3mf0TAi|Cb<3(?Y+cQDvdhr)(@QZd*I6}~4-x8Lty$0YX0 zA~8Qro!WoWA-lXpaKukSF}pC_U!lqLHW(wk*mROA$pBpKf#ZxHX#y@g{t)xOm4rOH zrfSHr&Qln$yc|Jd#odU)zOT&E<)yJ7e(R?7xJe?Q<07{ZPgc)oWM$ZWjtLGG1WCGm zr5Ke!;;9G&ZfzetC)p)HPuE6#JL9c8mK<3Zj#qvAkmfSlIV)oUSq% zHRIk{5^xpTtUvgJ$A!gkc(|mnXO40cR(!;@06yP2$OqZ5GcJ_XLca;v;6|M8KbZ^V zRKc(LzI+o#Evi~BhiF?z;?}v$d^;KCC|!=5CNv~eXhsBw_tkGs#>E+V)EgabN1W+K z7W^GClkQI45xPR+1y@{di^H^_A`AEGREsKZ15ofYXF5L#(NJn)bJ3p+*?)uSUm&WdboD z#VqX9tWe|&&!*JQ`DPe=!lv*#1-0cHv*=IMBJwfRlU=&WLPDPlRgj@fvWubiaS8}& zVeyOhJMsvNcP+}Ng3;nhVS{EIAV+S@7XPPQ4LUONf_o5%R#@jQk3jf9vjL^BbFm^4 zWuqoux!v`;-}Gd^tq^S|`qk8WXjxzv#PanmV-C{xszLM0R5d!DzSjBLA%d3y5fz&-$yyim7aqnTIRIuI`9lmqtf#!LL$I1K<~P$fNMbk+3F#6Kz!iY z(?hl8L9Q|s-1~mWN`tA(CJPCwDj7ABL^*~aFmTd=mh?@B+LiwVFU2@s>+@P7!)&R` zm?dbI99uCVpLn40$v4kXB|*4ltd#Jelq|jgK!8!li1Y#iX^01^tP1s(42xs zZwr?)ajD36@LdNS&lR~kCUnflnb?Vk^j;}YR}H9bb&q;jMk$zR1ZNlDt1mWLqqAj z^@A-|y*MR6Lw=Dcns*DK=y zHvw}~H~?~2z^Pgsq;FNLPreZ4uF3W znlo31b-E$d7j#5-UYXXEZb>x9JX#dE*qQCuP>#-HTCydkz?3^=MD@TlozQmFx?vp&=mgz1Aw!muDJ?x&X4F{M!ZnmX|x|nL=ps+5~DZzGTB593Z;U_S= z^t+;_SM(|vcoyv1NsmL7gFzH&{LZEYygbT4Y@5VsA^GV$ltWEz5y%H9KYs@C1H>jD zez;v52*fI;Cc};nV^Y7t>r?aP7Nzpm$nFs{6d6uY^dW^}Do2dmM^Bq zt?QKdQ)@yO1IPJW@S)lm9BUDYLX9Mn5%4a&?_v2TLIf8slvw&J-WK>S0YkeUKO*3| zA)jstbQh+dE?DV|n2z<2&ZL=^X%{#XlFe|4Gy#U2p~fVg>uvaG#`!yVBpq<6QiFa2 z6wRvUPuO`6woSyI^(u4**;>w-1b45D-B7yS>?sqCh;pBsjCtFoHMka4wn$dsfZl0n z<*8a5Z43S>54O?C*^zw>^dd~qcTUbPH9m|KTG5ki^4aqe!rCGHgXte7HG>!im!s{u~n~4sY{v4^2jpz2J1Kv~p^`)^#P#CMc<}VEgNk zS8^D+Co+hSONpFa7S^_43|&L61BdJZYUW; zp-!#d^>)@KceJoaHBvHZt7&wmPTjpspfU7is+DXtSU_QH=G=QI(#U+0#8T#xy_VE7 zasF@tZ`Fhy$t5VH>eoyAFP#y5q=vgXmevl((2|D%d@I4Hd zI&|mI;efwn^klc6Bj^>Gyx#*!3pw_7?ivUJF>_;0_&Iaoc>tS+OdoJa_UWrw=4}CC zs6|hWP*(s=&_PZwig)sgmLv*--*AC{U-3;yUbP_s?sI-SPMq)05)FZx!6gjH%&m{73Xj-b zgfjU(Zzbq3RqK)qWHH2ToLpkAfR@u@uO>r7Q)>&rUfogfid{G`%>pUmj*wyjti)H0 zytPM;bD7(r-&eTJfGp>}H-QZS!0-n^VcnZ!AQatGH-8ehYL*q&c$4Yq+ed{GUU_fC z6n*8Cmy~JD-6`U%L2y%Z(R-)2n=%4XNpF_!=iS5zO!qBnD60NPMQ=9GV-QR=!DY9DA;iUbxb74%EA2R|ZJF0$VK}o#`Ub})$n>o#6e}EO- zf@_yy3S)iFN=<}-)$EFRWS(uGo<3!S8Vhcyq5=i0E*HPca1XyFmoo2@zGerOPb^_zB< z4w;aa2=*KFNd&O4(A31`yA<3LEKl+Oh(?R#cHH#qjUWgFjhmPQxc_}e#wBm;TAkh$ zR7dn!D-ozpk3!)Hi)qnq?fzo=*)$N}-X5A61e-P&`u0%;v=kLU?zu zWmKJ(4}U@(@%_BkpA#t3VlsN~H!q~5c}@lUQEX-Ra}i+$*Y{FJkJM!w^`4POmxYA- z;g#2Y4G|)spVpn-3-y4H0wmTo@X^q)(lHp&8&}5<;;L<7t=NIlCtpU)(e9CO6G+k~ z!7+R6+`(ElwX2$zay;ML{VO%fz>ccG44MZsi?(?@3qTZpZ_x z05HMf$T9nAiHZej=0rV-|0T($!^$$Me9`(zTrMf{qQE1+8}&muF{|XvJUq!&X+mzf z*2g3XQmW)51NUfa=YK>2OQ;f{7_sbh^H74x44QKUl?m2Hh(U09=ED1FQbK{z@0<{=vI$08NfD%l#@Nc zW9h=QJka30r-dI9c>u;wFv#nXmW8O_0wEWtBj}O5cB@xaz#JEwS~!abf0}G5u0`YB zs+TwyM>)6W&Uam^a^jIh_g&Q|$N6iuO>qn8KccNz@kq{N&_}q0?FLtX?o!BkIF}Vr zvf{9$7R13YC27Ai2TO?e4hR_f8TQqWszn5Tqi}_z>Zz%-0R%&TW&|V5D_dNswB7Nr zyzJSbomJ^4O`GvofsKGbKzc+S0{d>nU5xoJmWQtlp_^4^cC(fx3^ynMtURheuLh<_ z`RKP8BDMYC+vrZT3BrBrHvkx;81@Kci`_2k^iCfdMv4BhVbPsSX$TW=8cdgT0{fkY zW@H2!q8GxCq~!Wjo>7@ok{jZ8;vkWDY-XOeg_o1j&dIqoDg*^tDiav<*a@5fX*ddE zgKITj(%~dJ3C04ZrqL6Y?wn@`O5E!g!{8ag-D++P#=QJ;CutU_g0QWVDrk-(e#ttI zX$=IsA3APljcX;)Sf*#F{*I3{`53wyQmHIagxu6)$U#hL&109FfBozVi_SFg~Lt>CCP> zGRAjw80$eS;pcFPr-XZ{iCuqKLB-rH^TkAeVLKm6lb1^?`wdNv9gY0He>XfAMMG)a zlqm09d&ZS;nsJb38u*zVjSbv!Chn%_RStUCmiYFXIQRs42G;DD;8hk4bCtmY$PP0K zSPZO%dqQ5_Q2t|xKJr*|4&*P{wDcjJRO#R5eDTKg>l8gjvnAwD-xo$^ar$@9{ws6nD$29&&flev&OoEzceGjgDb>kU2Y;;?^_oW zx#S_J8lf1e1kqDNEhqk_U_mrx;<32GmlN+q9A%H_t!nX8OiB*RY49=(y|G!EX0ltN^u>t&++{CFwG)vBT{q|g;E}@oQy{#6Gxe~CtW#1;7C3L zS?N##g5o2(($#cUH;#KBwBC&?f{R&pr#M|idg z7r_$@UWfB7bjRPe*v$S<6p(}?@hin#G4Ue#&go{BjSD{)J3Zp=>WO%K%fK{ z+UnGt9x50*tQ(+?&5-n~dYH7}E$I1LrT9>xA}(W&kGVI}T{@mHRae}~LR!AIELZd) zp@zhxL@wAOuMDM)zT=v8ujWiBS~?2k(pHeN;0txg3;4O62BKvl06XK$PJ(@hOx2Tp zJP}wiqFwcIYp4VGjd8bKKX>$XdB6(KH$^lk)SfOY1{kz%)#{kBzYPi+5XpeuZivy* zO{+7}rX<;Qsg}#rn#LkoJG|C8Q74GB(%EC%w+8$Bh;ksKT>1V_T9>`O@MQ*RAmc6O zs%DcDb2|}Zawvzk6z2ou56+`bmNRsnq=$(;&v5{Vb2yyWy7kB(t5kaoj^S3L^u!D%0sb%VBz8>J9Emvz8a0M5ppSw zCR?uGR%_`gw3i2U4VciEk30ErBC&CKjj8M+=(kCgh!m;Lo;AN1tjr@-z>>u^_sc{; ztEZ!vt3X}`7-awl#rsd$oxi5>J$PD40;4K>>7_71IsFl1e19iPSiGs0JGjHL?mT8~A=4Px6sVLE;3|6bn{&Tl zCV%9QdSv9oA9#-mL9Dtn85AD;h9ZE1$(?~9yEu-~p=-q3@^mM!ju^5ll=|BfC8=W| z!hXpa9~*!rMcI5V-&Kz7l7+}zdjhb`S&zXPuoq_Oggu7VE43~wWq*zN(_|9FfzrW9~--nTzZ)Pn@D z@aseU%50Gdb%zEZKWRb&I|r+-6`aTcs?hFZz-&fCxO%F1DN(9oL_z_^75=+SytpN# zd}M5Z0CS-2AN2I@USTW;RQSqG^l3rY5qYGX^r-sb>Jh|D!u{X&5cb35Q%p;@Y&}4e z!tjMA7kTTJ->D|qZ)$>oD39}J1q<Gq)%}z|D z6g{_}rAZ2_8L1r~cYD03-td%f`AUivS5CrBSdNnO?tr=?Aq*tV1ROUM0h;p)LSUIl zBGz~Ln%zePNTMEQVwsU+cd1-EUP~w0Mrp8PB z13L&;cT-B``_c`LhPce=9Q7sT+NUa$1+D^;tmHQ_JZ+jGP0ka4#90mIyYdZCO`S5B&v_n+2(ac=l~L-=6qKP;q$+rU z@^2%mkJNT_jC}e+97mXvMbzbiz^GrU$8AW-Ty%Lm(g}d?p%?Pzk$q|Ag7tcr_Fz=B z>T$9oyf`5Tsmnelyh8M^0t?okUu}!!d<<>kSK^;odZ-+ z1v85k%U-I=<;If;dMO+<3YJ;~(9%3FQT9WZ1pjJ8W8e7CzUo7x6(_>t+}st2mMxa$ zjVe27b2Ncykj$%nXUw-OhUFGATt-Pw$j2H_4Pvvvxgz+;tO{31Rir||_TG0ttaba{ zZR%9;z^E&;IZ5XO+9~SR%r^UX)^2)jG+PbjYoqY0o+96XRzAJG87cuSq($=Qch<~k z!O~w*dc;CF92Bf_^S%ce3R5xo*CjH;$t7T5lEY)ejILD1h* zBNy~6ND+Y|k?=sC!4Z+Ei(5~HfuQFHwH3%7h! zFU)0L799(jgem4uF3r)F&$wU0Ghh|y+SZGcCvaryxxr_8!(MEI`>X9@p4YM7%P@a{ z%V6^{|I11o4-j1lY+1);pfba>YQ9s<0H7*pu zO`AdkL6EH1pE*i<0Ua_}6dP0Hi#cSTT?N`~J^Smj+(=4}qkKKA&lRE zbTKKe6!x`}e>jLsLX-|3Gadh=Jby2Q%pJkQ&9`+e359zZ*c6n5JK$52u`$#i1fG|l z^lHp0q<~O4ILxq5y8(e}Vk;ErC&56-TexgM!tN~_vfSyWV1gGR->bl`q7bMK$ujyL zz~QISA(sdQ0ekg2iQ$-xL+~p#rOpK_o>UIqB)1Ysc*`LFckH326=LMVL@s&^^V@X@ zThaIwr_sp6Td5vH8WEacxZQSgq`&}kK7POd7%k1shYe-u=G()M(KXd2Z4UWC!OKxX z_X#TtmlFo)3v8%H1_q@M-6PCfM8)R!wFMd+=>6$%p$nb+C2F&E93e!TYn&`Jh23US zP1IwMcXvo!D~5lsQr-^WfS z5|RaZ2&BpS$-F~y!pVi~>BhN6$>-Ty6xy7Tv&^2rAoMRx371SjsmbE&V-h(vLC|?O z|J2II$jT2)$BLgT0Z)*scuw>klgfJX^j6V=CxsBulMkeE3+Pc6rE`y<57Bqj4TBAg zNVJ>+eP{iVVOPaAZ3xECTknsEOP~6{3No<3bh0s3lEmA@w!{%);uFxt|~s*M#%A@ z$|*`uj@If`z!4{ORY17+_0fpIwbDUns@Zz;O1wyWFYJmNcr-02dw`5LGy@SGce^dm3ufm3a zJf{S_4jh)AD%yx`24Q2!dPgD(A0#bJ-}9k60Q(V$8AY(pl(ixrlntHHWjNg^^wdw~ zFd&+z_?OSUh4uywDU@_o7_sz+9C~L(P%fw-+kG&^GtkwAjB=dfq#v@mNV3t2-LRT| zoV1nE;ZUdKI(7K($~ahP*ksmPTePz;5)JQxEK zn4-z@*pE)Jv|IqG4q#R(4blV$PpVONBteVaik8EcY>m}%pNo{4)e&W^MnTQdw!MdS z7`WnCxMSyYNhg}&C3WQ*DL*4E6)_$ju%I*Rjj7h1G#BaYZS|kR#80ITS&V+sDY?qn z#LiOM=D?N^ujRib?ItAhjKSA)*b-cNWDz?Oj=fY(dP+2ixs;du#;)ameH$83R?>c6 zd+!P`d<0#95}6}=&A<^8!R`p4I?t9x_MqEt(oyy>g=2w}03F9&3!03IJuaXcPZNQg zw6b!P6e2&997iK;>Nu`u$oQ0`6&ohx4BT z-ioZ|z)Smn*W9Kst^xfv*YS7Dp>ua=t0_e(!&W^?3}+nege{<7fci*805#9gInECY z0V+5;0_rgjtD@v_Xg!lSMx8QY1}$jH7mGWr3bLbReEtcqy9ly@;O2M|Wgf|oE?YT% z7#-@_r^8COxUXTm4sECVOQDPq@b=ou>Y#1tBvRL|W$#KlQJcxapo<^xc z0?qF;NK1)_hzw9FRxp$32X6k3YWdNzC8Z2NBjd*BGUX137MFr?Pc zH)iwksaL~_dSt)${vl2#DO+hf%z7RfRe9LL!<gd7PAmQp~2$Tt3DAjhiG4`K$9ADbal0HE=2$mlJ?eAKH;8_Z_+r zCE<2r;r||tcYZ+0XP(8LpF>{jQ*CkrWZCV{uqd<@QD^K_Sb0oc>FOfIms?K6t{EqL znIOx>hq2%5O}fg<;P8m0L6LHUn%Q8Zbb}!J?XIK#7@0^Ep`t9}==yb%Myn-U@N{eG ztjI(_`-0TBZ^T(6d;tC&LFL8(ozUsA9&6p+c}mS zx%{`E-rcbH6+mC1GAK^DHR+9_bb-2@P$WnQh8+X>Bu9pim~k5$I%La7$Go!DR(^PE zB7_3!D=Q@BfIA3Iokquu)C&R;O)$cUQ6(o+fXGTHOWM_oLhOc7_Nc1kXF_h)q9?$V zn70MKb&(R;b zKL+~m!S0Oy#k#!ihXtyouZ19M5T#nvA$cZ$PB8_1vitqcD zOGbcjvD|aeeEt?w4MfePn*p*0Fl;?5g)!4o%Qe8@Aa5QAE5`-9{;A@u9Cx_ifAC?s zyV3NnEo{s*k1Y}4;KWjdLp?d^6-StFR|A>z4h(Xh5oXY<-zSpe5MO7hfb=G%fy&FTML>?6~R7xyge&EXR3)-~Qt*F~0wWJ(C|wY;L~q@8W)AO7BiC^>R`PBZ@1pm~P|=z& zT+n37L@&XFoj6AC@kvpQGmIW1GtBIkB6+HM9aMBKVTA6ftKRon*x4={;fiEjaG8RP zT}xtqO=KEnAV8`zCi6k8MhQWWG(c^`wB9fAvz>1Ch$!;IZv4Nx}m*u7UynY_ep(#^jwt z=dwK@T+MzA5zM4J#x}OOb9yJZvlhCzWHK?TLX7Y`jk20v+qNNCSx16xYgc;fysbKu3*P@o@CQt z3UGJ2ri>YvCdoKc4NONJcY2uEzEkb{8|t93RChi;Qd2hFv3gJnYYq%i>T{2+QUQ<0 z<>>V98Ot)Nzt-CR9w31b3s~)nPY;=MDCdw~9Ezu*!|~;ZBgxm zfFyYA`|p@}Jbe;_RR$E?*j!_&B{2l$JwxDbGI)`CKldz8{Lu&$R9wQ9sycmY`pp%) zeUbE?(nxoFy3wuQmWTzuGLX#Vo~{?xLIt{+ztRr(528VzDax3ITq((!r|b;)BR&o& zEuP1x=92>&XF8Ih<_J(e=4E{JRZ-J~rt%rY({kx{(-T5=HOEihRS^tHU)7;QZ;7?}_7Va|${Bkfim)bB!dbI`{G((D=(gfQZD%|F2=z}7>r2r(;g zj;KzM5dw)uRTE)fJd%=Y({ZSBLepQ0zMFvNVj?qwd>KCI^czJU0nIJe*jd~1Uw~c0 z?~(B0G30g?)0`519lus}2|?g6cj(D&_Mj^_UlkZX@UbWtGc$Q80yr?x3A7!QY^^#b zEb!P`i4cfus7K&!Aac02j`6&B3%D>!(x$xl%x=YpwitMjZhxX+H5I@17jB#y;r1-s zxP}z{iqIi~0D$*S9lyiq;=C&wZRpEDgM7VhDu|0+IJ4Zz~o{HM*YS}tzvWpm`T`jfK3Eg#vF_g3aUbc_nsvkYhg29)l8Bnr$C4= zk%Evx%vT-qZYD-}bCuk-y~L-hq+Y{TQXvQv73Oa|)vW78J+NB_6j!y(J2q8%9e#8F z_EK)5{9Xv#2a2RRADKcUOCw12hc86gZ8!>`u`yFPhP)e+8G{nA*x7*0ew!o3FJ+jFmltKw}0QFIg1f_9lEBe^3iyy}-R1W8rD<&!IHU3dU%v2*oq&k7pd~ zqNY3)DLsiKVAj5m%~gTgJjGU3T}L1u@ZpF0AT1laSV^w={aMQWg>2KKU6{7%UB`=^ z#w$+Hj^W)a)Zc_$D47OQ~u%t(zAq9an1@1Oee=+-O8*DQ~DM=(vp6 z4HwH+>2$-_l6r4kg+WDF`IrlK7>H2tL|h!jO!hqAmkY%e9GB}(6s`@MPZ9SFU(w1& zjQxG3h2sKh#kIsn3)!3;oO(2)cY0)o`qZ?kxlNptwX0?KYG8&vnUXYhZD0v$c;I}T zE|IfutdPxyu%3xi&2MaozKj79aTB4#s`XF8g#3YIQf9mFr&l$=AaRTZiL zvtF=ChKdhnfX>e{;c2s;Oovb!HmN9Ng{?%a(4j+#M>CNYhS(>MjtNN^*9+*jKt~D7 z!4v;oLp3yRLCd-Gdd5*t)dJ|C~Gps#ME;9o#AQ)!zL)W_F9HZ}})Ic^ZWe=nc4eSL| z6o@XNUIc@0(RyDQifXs1*B|BzlJHcbfsS4&L9KYhzbdIRKkV;)F>eA;MnVBY&2i>< zq*amhzC9G?-pE{fnny-`FX*E3P#VYQbL0{6%-#qpun$>*v2%An^rZaYs>=#q)P zMK3VgD?4ap!}=Rl%=Qp4PKh)jvkbK(aAfx6JJF!7MaGXgZ}OegJ%rOFGFE&_)1DC4 z#55J-SJ^v*k_o7mt6HtiS8-F9luO$Nn{)ajjbKkN2@Toz@R51lo+C#3hrY}83{X3h zHAny=QPmYqy;N17m=OR*e-c7xjvN*1$Hs+DFQ(IygrI!elFV$!GBchQD_$+MBAdf` zVV@eD0^~rm!3OXO;>I29>e4x!GW^FI2^Tu!e(oykJZ!2)6D0YvkDvAG7`QZBk@Y-< zEd``}%nllZ8m|eM_3U_B<4E>4l*F8juwekb8i;6X>bb89If5IJ-c#JqnjV)XH5iY7 z(SXyhNi<)$A(IF2{m}mPlecI-_%32)(d{wQUXN5B2wB)upIQy4o1C;r^~$;VV$+Cd zw4!B&Yq6+UfE)2!HPyY=e<+HSh|R1>v3r8PMyv{d*aG94Fx1(;{_7d;$>2yuC|Ii(4!>-i~-VOJq*4z-Xu*M`z-YlsIPGRfenVuoQ`%yMT*S= zp2?Iy z#58WY8o}*k$5ANcRZ<@li`r@w1?;@MFWjiD{IojZc(Y`bw%k*oza8eT*iE=!Xd7ZI z&7bPDQ=8I-Vrw zZ#WY~I>*kQhH9|eVi2;6xAYTGTmzSZIz4aCt-7MEyhDawL|BaBs|%160SrZ5!te4J z{#6?k@ZWiBzRVAE>O~CH&;%a@MH)-7QzN;DHziF! z-tK3TZNw8!vrU&*j(y)c4Nf3~Y`oE({5Atl5pv=OTFtFFbj)GF-m7Qam53RIBGO#q z1u&DY7TIqozv)dEq)CkANqxP|b;aBO@YEBJ!#R?tZWVHhBMJFR%h$R}p3pH#Mc#wi zYvn*u)aK>fPe(P6QP-gU=&wiiI@zBR9V^*>^0)GMRXHXkz`#p0t);1N5|7s8E^NHI z+^oMv_T6s5gdK)RY%|uN6%UKT-%K2#?NfMnD2dMg7VZ*uyq=99m+wFrk_gvIqIBwUw#e z%KFqT{hT;=#kDMGlZYN6DDUkX?k z%u)5CD)I~)9EKwLB2(Bc5c23bP@)m4y2U)m4Z}i2ah40E!)!7;3sqsSpxvYxUXLO5 zU1tiKC{lV#7Q{tt2h)rOUS}nk484 z%*z;=Gmky%FhWO|q?pHqx8j0gc3!5k1nUFX^Uol*udIf!$Vrw0pLq*H@cN2|q=QlQ?XIxAPBsJRg)x}olmmZMVk9b&94iGSZKUV& zTL^bR6I>%Gjx5+_@ALoV;^7{z^F~IY{3zRtNDS_noMG~CRowF>o zwqk_{=TYdGx=nG8;a~(w{yhL+?X{n)0KXD$fGP(3%1unyH{=U~(-MZ@3NSfM7GTyQ zm`GhagDZ|uJ?I^F#2PRVAC}n-JrHgQ4mtnzX`HgTA3+^%^Z?8W2CkhPe|jDL6eiEJkt8TisHfzus| zvID#=m1)eSBplRtUzE9tnf{+29MD&U6EF?* zuB8~%9!XdO((qrw(PuE`xlJGHC{q4rWKA@AG<8`}<0y-Fj>0b> z*zw~MtFmM6y2JxI20_F0Z81b&Sxdc3t9SP3G%Y1VF!wdqYBrx$0;&u?v%Q|3iD!Uq zLBQcIehqT&wm7onpb~BVT!N`lb(rlC`CVeo)+G3{K}J?8DUF((mvv=}5?Dw3HL}sZ z4=BeqdcEaw&U(CyJ>DX-aS8m(bTKO`$BG z?@n0O4C*D~MIjZqwNtMgi6Tv`7Oc$)S?pWhU^`&bGB*lw{pj-5ErrO}gso|wPt^`k z^E`cu6lf$&ZUOU9DZOwQF8`=tNk*C@Zf=)MWdtf+2VtOLWx*2~mK%PRGoarG_PRh) zngZyM8>h6CS(unZ=m|$g%YOR@=4zgFpp{2A&YnLcI$%U-s3d;FAZSL@;^q=C^I)4- zJtJ`N9AaPf)1PV#pBb({HNa=dg}0AJ@dTWBZnVj=aeO8H>u^1X%E z%Fsfr*qyQ4kGCd{<*AF4FZB>-a->mQ(a3S=PzI(n5m(eg1~!0MuY6xQzAM(g}X zuxCz7S~K_NZ{LBZKxojsJHxz?m;vy?7|5_Tnrv!!F?2${vZBk0h+Xrlqi8yuX?upU zO99fs^9C`HtEhGWM!)S$VW5Cf@AiO7Q30mkD8M@R^BZDqqV7&QDkN96w?`|nSB8z<~Fq=^_#43wI&9oS__&7psCgq(x6&zR5 z)JOqme*dKCeqYIVP*fC%|rCO#Cgw=|B3wTOgsqiUXeMGR1D{_s=X;N}GFIv;S zf2~Ym7>K7$nN~Z)&M!bjx= zu3J3`Rt({}q|pz(4zbqzIUl!1gbm`Z|3E<{EQ>%#FxZ~}68E-xPRqxcb_b!Rk9gNd79E3fZeHJ=6pe_Fr>EzOB? z8e{`z;nPa=QML?#7iz%hEjl4i&C?W#*g! zA*|TC71`p9pckt-h6aA$#Z1%alQVrw7}B0Ly;W|#BF3?LEb0 zc3_?^;N2q!7Nh4zfO93~b7JM6xIpvYFgQKNejeJBi_(&5n!c`QEX2KmI7E>PV>`o& z%Njcv?oaO237FTlDD-{3-K&+ z@I;&hU3feWjC@Q^mUl_Oqel_Q{C9b0Q;L?%2FOuJNVq>)agd7vYCv2MtA{N+ook4N z7>>uo&DfMDlu$K{?_a4DW^LNsbT*fe_BF1)FgFk@VwWF1(OM7+6!WS1Cw}$*LkR}p za+L4HjnRF`iH)5U$~$tf21;p(WC(DNgE|m1L<{W<_f? ze}wc}q94NElxL~t`?{KS7#H)`HN?Kj#UHBL39Nt?4xSRK2(s|-tgx1~M~YKmtS)!AZ9QsNx;Lqm{1js}wo9R@eaW-=Yhb zc^`$#%m>IsIR&kRG9wrcMw5`k9~=mnwqABBUWsBMSnhjEM0WIanhZs(aQ{L+OhWv4 zNlA_OvKx3$RyixEN7(Bs^^!JvU}q%*Ye(Kn3rDuR$w3AnP;`ARJ+{+4Qc z@j7e7C87&=!z0=d8Mqh-C71=TX8||RcQ-%E1@<3tygTD=qz)0M1Rj-qs7_(*_@8FiL6+sgNo1o}#lV>B> zL@UuCMBdrn0)Q#lg^T$6W=?qU+ z!j|$qfqFo4ksmcwr=FvG6E6yIREhQ6uU7Q02=+BE6KeItu&?g*P0aBS!tnMUE@v&4e6DqKVNPSk`8~F(LDrYEQ=Do3y*s+~6H%^3|a8dB>4@`69Dy z;wOFY%c*Tpu{7!W-nG&sl&x0ZbF82v1??~wO!^Hqkp3$Elj;#3C_S``36}vUf?ssL z6CWDyMsG|v{x#0Y5JUh+_siWZyx7v{l`U#2!0gigNSr&BD%?$iPsZ5~z=v}f)A|BO z;`NU38s8dch60^=h|3xX-Azagfln~&AHSH3D4LHZ(VIJdVNG&1VfaDP9SU{l=~*TL zstM4|aLLAzVb7g&cE1kz!%Uny9+z6gz`K`_wG zRYQUJUG~6H{3I7ro^fx2Jnb5x&gN6~zkMgakn01rL*$*Q-G})9aC;c>2Q+x0H7!_4 z+qq(g$Ioh_dbE+1Ac0S^Dz8{i4DGVPa1pJcwY#_z90`kg%?cHC91b~>BIA--btIjs;Fbs!?S6L^G9ESzjq@{!!jLoT;*lPO(@8idx%>Y&trmb z7fs+2jN1+>o^Nengc|`IR^c~;m~wH@Dv7V$B>R4MEl9KEL?eqBe%GSyt}6;aL9%i% z0J^?@NPbPDfGIyEq4((U(iva2x6nZS(K6-u`X2W|s}VfId6-;MH|awnjb+LfQWVZW zY-n7Zo5`#OuO*GfSC4e{`fJ=*)X6J`5dajmPw`OpBOPr4TP~o zuu9V|WSJA80)UBc3B%r*5h;XFPhkXrf`<b;$kaf8Wz;ndXRrg*ZBpdQwVx%(6`tAn$(KIw~oQODcgI`|7uoSiOf9L24ho z;6B;EW)ZGjC`IkLpZ{6Qp+{02d> z#~#p$IF(BA-WgXSi>yZA#;y3uwyDjQ$BId(BJ>W>tR7OmZ-ExFF+|F^^%a<4I`-Dh z7w)w1;}6Pdd0@<==Grj~s{){qO2e@{oo-IJ33o3P$Ks~597=sTQk4GEpD+>1rW&%N zYH`NgW}=4E`(oQ8>Qh&>+tW!1n+85zRl-ihOp~Q@Im(v=p*>#88{9JNPI{xvDnhb? z^^7?nl~I|=*QBgO8Z(rb9YJMF3P#*~hpl&O-L-T8P3@?rd|dWf>^{T<7KHuu_B1p+RU)%)Vqb2*Rl&FXEo|@M6zRLU^66_@25f= zK6Z9=%97BOIpg=O<*&HR-d{P#F};ckev><@&H=?0F5P^)NWqFW0?Govar0u^=~O^m zxWcv`cp5WBN*&#RR^1b~`fFGPMB|8PZ@!pXXWQ~!X)n;!%L&>cw3PFJ-oi}rPovr> zf@cI;z`ilTV80a%=8goQ(|ge1K_oPRv@yEQ2V?C_Ein<`m((O^=#6PsvV?28g8QwK zd;RxiDKD4ErXI&Emm2gaM?h+Nkt@IdDr*evJ@PUOI|?l&A=y!mbh=psU(^W3*-L z`L_IRt_alew?x;LtAPE;mYZkuL&I3sXULxbP50Afb}p^fwXby47ce$uEACRc)F2@sQbzUm zEq>h~TMT)oDc=OU5!z#{8VTdnZAf@=|KN@~PxwaT`6>??Ws(cu7?aZSVemxy@Vt@~ zg>ZtZ7o;o#IJyg=?&2)Knla!yC(gC&3zIoRe@Z;mSF_SHY8Yd1fW5&VG6pbbxM=$D z79B^W33!i6EkhfWeEQHTT2LdZ4V(9c*8df1j*z4cbJap9lI;T?oOLEX2B61P zkk+D$68)h9z#L6mQJ%9gYItKNuSDF}q&V;COcKcMqP+n=d}6uof8;TdDS}J;#M-Y4 zZ6Z9EYda{)QcKiZsO1Nj1$Z3&CH62(C9y~J)^P*4SuDQ}u(LRFt)=E|;fN8w5?JQr zN-|DH_`}LBW2C6qC*eb#_G9I4N=^yrR`3$u?UvbY1yJ%931DW>C3i-8R>Wju=l*IX zV8m~_!}q3T$y}hi6%DBwz8_dFeiDp7d|}!tD?U8hQ~WOJphB~b%3>B$DEbdh72Rf6 z;a|MXK~bhQmymmyMO2(e-88gqGTz|0PfrBQd2)~$dwg5v2yfBw>>W`tmiD~eU#|3b zAczi*rl9WZ*DiHEnZi<_wP*sI<4@yY5fvFrTRLypWtrf*d^?smP{O%L_Wbd{8r^+PUIq?5JRsHZ7e9I)gc1?hw=p{Q1D4 zA`yvDR@!J&>3zi|A$<8;>5xSM)co++2VZ(#Wk$iBk3W|tp6|axi8qj{Rd?so{pxCd z;^&f)NYbxR;%#2P2=~biFItitNA6_qf_N-?kC)t_dM2PIWs&?VFwy0-DLeh+WsCLKi> z{SI@DZ)UIP<&L6Rqxm^>B?GGXEzw>xZk!nb0s;Oy9sBqR&UWDy&?OeMJgaXc$EF07 z4>Vd5E6_Pptq@8)@~u^l4>YY6>ImuCTPVA1T5@A!xByeCmBfu+LEpZ0fi}bjGDC+q z7FB^WnPhHc&=0H$WPsAa$m4Ee(#+9FW#Y-S=D1#uu@ znMs!mY7W}LT-A0knRqG5nWp$*)%rfE=aw|L6LO1s=*{XHqWdcfXtWvi2#5`VnI3j4 zL9=sZHUh5UA)fCccclFkuBS zA!bEKLi-G`rbW_*covLllb$MCx$w#$us0ja&E^^-*d=}zlHV0S3a>pSPbL$^-5+;o zTV&GOamy*fvSzY6r=c=A_1g|2g#31PNca~(jDPFP|nZ(Bc`qlFTQ6>@!*bw;8SXdg31QaxRQUL z5|*HDgt=fT#%yUdrN%|-!6nK)Won_QtxMlWl_n)o%XSQ{UW`kM%@`}oSth!ey9(z1 zx%0qXiY*f763rn~vYn)c@4E-_xADsCCqEg;RRyo2F>YG~{7ISb5ilvB{EXycvfUIS z>4p0$ZN>eWAfq9{45K#tP5vaiTCik6x6pNBqVV{CV0Dq*Fbz6$Wu`XTLQxUb> ztgZGx*D>1Jl_5_6hQH@cYKX%g*!Ij#XdWdzRY}rDtcc4w%h;Xbh&rjf7H}c0i7HS1 z{T=ypMB-`2IxR88_N_@-j!l#1mnZKof98-)fz0C6TpntsOcivam~glVk2GLyrk`kN zVGI?SG-hUQA%jt9vrL=&CNzfZMB+J_ZKztC`g~VyGfdamluhe=NIecp(|VRMN;GA{DS_}Ly+S0Pn;$g7cmbd4R;tD0RRs;AFt#{0x)G89*jcc zmZd-Q_`%4?twLd7J+WL0f5QUAS9kNZwzt`_SK|pFjV!}pI{;r`;LIyV&53DK`;kDm z?iOafmMRJCOk7yW01x<}T`dn*0KuDUOD`MVK;%P9IF&#VFi^4XFp6nf?;M^pCBTr+ zzCx=gKh1+4xJ1In(6q7BX?{`|v|t@KTc7@}A5xxC`G$@IUU3GHZ*yA_Uy)|cY9U6t z-Q0&n11JWFR$qVuIB&SyFfLHaqhAT>nRD%{pfgEPtNCIkWa!{GmXIqmHUy=e6C$zY zbOv7*r5rbV5WSprNq*!0%&AR-O7>qdOk8Fp%(LltSGF#CK`<;HA$5 zXHOUzNz8Cwa#^TsSPU|BtSJ%iDOk+CF%)fcZ`gR1SH-D;$W5;Sm2*{tWP;XLlg|}Q9=j*Fg(ov?*G&c#Y zaB(QFwWqQcf%Ay1&M5DPodVN)aK|QsVgDr3AoHX#%QhCb+i4e4E+AaF=}U)dUwOO? z;E#Mw!+Lk-HaloUs9FfEjA-5OOQNO8F<+z#XU4mqyM;H!SVG3^7U5i~V6k2TgAOIOQL1)9iDVRG626M>F|60#8A#IONPj3IdzrEPZny`!SS|igvcMD7cyl$ z&jOrL1r|J{b^E-3UQmcB#{)BboVo@GfwjvTqm_~3(M{Su1Vnz{F zs74{AoLCeHGc)AtG!%CLR5E18~AWYC!JKAOH{? zX?t(UAmx%clse|2T8hi{6IP@1?08$t3qbi>ZHm@Y zdc^&uGlj%E(Dw@kCk~QEle%BwT{zqFHblXq7lCA?znfGMpNwk@F@+J%IcdLuS00KN zj@LS3Z_v~LKY$;h^>~CJyg@!Bs^sjG+FDdXlKAf_v{C$$3nmDiDQJ*j9Ws+`GDJWP zb6ElCH3AhvOgqMD1XC@|9yE~Ao{}WRwx{TXsC^aiLfZt&LoGROQ*V?m6Y=ULxT6%! zdhP&hc8p^Zq-X!0e;;QO7pJjnO&m($LQ3sDxH0Dsi3uK)5y6oP(ruyRm~z-@uq9@}R3!4idHl{V z?lV8JgSarz>tHr~@(Lu~%SK^nAi|w=ESXByKAIE=iFW*!G^CH*CYo>Vk@I2HPV`|8 zv%Tk_KIYmHBuZN2tvSa7a55X#y`ayM9gL~B%2@FLM$RYc7@{7KE_f0Jbw>&XGjNJ5 z_OR7%w71dOfpQSBV8(()YNKD8h~;mK1F1IOD#y~nuzjl)diw(~q8(C49vX2C^}LNX z896K#BH2;VDp_Q((73qtoQ4w(k(y#NL+#4ZKD=4ZYw3X5bp04bqK&yFcQL9$ZfRnX z)tp5ZN^JG027tts<8D;~1EmP8Lj-=2o;q=6B7`!fdP+7lJ=DySviUn0-oU#WCrfRw z??-_6<`eIO3YiFsuRx$#vF{J_8R^dygwMn3^vmNdU3da5`ZF*AzkVR5fRNPWhL zFomU!e#bXO3XM5r@BH|?_Q(IAypus?B6ImE>3}A&@3O_+a7DUT77jItJtze$07ek~ zk9N1seIZ@iWMG0e`u;E{RYu1yGZP}Jn@tV=8c|l7&I{(qe4c!ifL16k0-7}wza9bs z%rfMu1QF1%pft33Ti^b&ANN<56oBg; zg8Xhz7=r~J_cGOBK%$3(;1$*QeUL)sb^Jk|SS&}SK4ly2@6%sCIaoq;fHis^#M&Uz zr2-e9{R%3XOPos{r?ff`C)&gGQV5&hCIs{r{9p)4&xZs66BX~6O0Xn(h^8{uWDRcFakD00QN3Pl0~alWOWk$@fv$xRJjS1PjLe^g2>sZveXckUB( zv?7a;tq>|9BYQG)P;Mjwf(%nI2uhDDGiTL`Km`e2WTK1Fj)rO|$Qm~a-hJyiI$Sb( zZjA9<`TJ`?Z9R)kJs_8sDRJxD@W{L3AVhaH#(efd1Z22!SuHm@`Inj)<>N;3=Ou;o z29oR!;7OZV3Y9|jt!1biU&Q}ErNv#%uA&+P08JmMFECgiIx%h!O!iLufhB(D<@a~M zgV8~V!UD9RdD z_Aop#l5+RSD;_)7#N|~$zl5XyqSS0n?U89e)zC{>MZ-|K$b-e4F7JL*`L~Sxgn&!? zAP`mY&8gW=t0}TAma(kU?ogysrNp?3Plh>$2*C03bLgQ_iVtPD_^g$*IV~7S=FH5# z2V>+lgFHPE^l1Rs6XYbiM$m2%Tf$PvLdRT{JV0PfXkCUM?|)`6;QS|rZ-Qi^b)6+I(-%(s6ee5Yg~NtLF{NJ%YD2@3Y3(Hs8H*U3e%urwPXOF5*r znxia@b+B~JZx3oNsZ{_Pw^(o?F$v~ZAc+G#*u3`_H)VOIjih={ZM>)0VXx&d z6~53@_Kq)!oK2}sPauR2Om=#coRY&))8miC%mI!Gr>vOHWA`LBuufs~E_SwOS^kde z#XnneA;r4C+Y@(SVan2ooi6$(=z1_v()=F5-DjUbEy+Ec>u`@Gl69}06ACW^^wz{X zkBKh_#YHN`!SXR z6lafDvg;_qM0D*(E|C%i2=Y6EL$>a5tz^3B;!dNu#x~thM6k3pqYRFj?SD6dbFxv6 z^X=R2i;|lAQDOt;i4FO2<+%OO@F2OwPYBzjo;Xd}F0fx8$FLc=h+s4yV^#Wh=& z_efDRq_IO}xc#a}u3Y0PhK8=!RBEigx@q)yIVTVik8IYTu3DWLYZ(c`Cu&QVGj{t~ z%a5*`YKdx8REZQc9n*s@v=WpqME#tn)Mmo~JX1X(-N!+ZiZ7 zCJ|Sy@)*}{bw#(Ru$5Wl_okn8>2NWEZ9geYZ<62zx}&{{V$FSAnEj>RFM=&|8*0Ck zxocUk+>O5dqvjd6;AdauZxbIMler^`F;Ymty!1$3=|}f+YP^e+G`ml5ou^sWEK4%(wyuh(m-NcJ!}@GWj9B{M-EL<<9nA`HdUgk28CWO zk*5mRh2;v8K@+B=`=&7L`=Y^xgrO}_>J5AWc4ADhf)Ae1sDHns{=A4P zJm2tc+DTNeu+qrYBr1NUCls`6Nz?07Hi_@HVWzrpDKH6YWc9GwHbN_LEdkO`!!6q~ z&kuT22DjcWTsC4QU**d0P3qpw9a`bHRAu+dS`mxlJ1gnc48|V89pEEWjg>fJAk!(m z_-)ZTt{Vs1EPZAXO{g2y0L_oP)|2&9UxL8k1pb~gwx#2lr<5#Aj)vtZRLGv5q&Q`JRiay9b@<2Ui72eXcuWcfP#Gg9qeC}4E&)}Z z-_k}<6qpwwL&lp4f94g?^sm{XS*`)JC;iHPN8U8{1eVPVyw#LbhAsfIt&?I+0EIk0 zO5|?sN$?F+4T7Svwgm3VnK3d2(63VzkrvJ%$S}%Vqat;*gti@1TcOeg7r@Ftk0eHr z9Az~j536KG7fEO0i;-C4Nve8^u4$|F&^LiBlL>av2l8VBDTTYZGUgP95%%Cq0&_yu zuN=ofEpQ`q(9JX7IW0`q0km*Jw+=4>lPji(3TQs@__r8wkOA1{$N031Gv#bf9Qem8Zn`K1FAYA(1 z6n6`N?ony7@q6|<@{MM-O2D7`xAP#tLpfhb_iE474G@^%LS+P`HKS@EacJGp4hQ*A zLO%~f1DhL}^(_#BV7jp#F(4_lUPHk$wh^?8h~Gx9IL{kZW!54yX*%`KBg{9N#P3aU zTj^PeSy=~uzA>#-Avf}VMJIv;5_rPZ5&hJmU$@N(03^+SY|bqNRVl>~Gst}C{Suapp(l(;DG!`QQm_-S(O;XGam zsXRkl-vvh^k_^1ltTsX5Xmh&?z6&J13BaNeBX04`&HLwYoR!j&lSN$pdKzDlG6R!grN@UrQVz#w|GQ}#8&ROkV>R0ZQ( z0(+)Gg;_hN+6vY>V{cH?mwEQ@V|nYyg6H-E{kXb9|hG{1+e z?aw8Rln?xqnj33HnWCw+Fca#EzcIXNMyhOFgdDr2TPGr43{!c!zx|!x14Yr0X785r zBqJhkAz;!x3JP$2$bhP_3P9IA;*E5$LIM{(jelY0s8vR6iY9`aztaPpM=tTMxVt8K zdG{;G`bWYUeKhzg+X+b8Tx|x7WR!~|lI=AUKLAhtD=idCUdv0Wkr$7#{aG~vPQPkX zw{mPzT$TY%-@uLwxHo|4s2FV{L>3L?mj=x=S-m~PYgyJEmvk(DjdQZbaY#zjup}F9 zOz*R!D}suNiLi{8HTBjcR6k1P2!eovqUWfn z;_YMTOrf;5^{%#N?B71sNE|rb#p=AZY1Y2)|3s2R+(wFz7J)uRDc$9mz*#^==zBc4 z7%@j^xQK?))f~h(iEC4_rP2{haAYFLAABKc0o}Hx&oCj;((n! z?hclY!Soh>x6n(jd1FQ>OPdbJ`pQre*vE8ZRE{Ma^aw-h1%9`Jl&V(2B}_z z!1WulzV8-=0ci>Z@4{+*_qt0C1N)&e+2;fk4xvmZOa(!H!lo83Oq4a~7zE?X*Rscj zgH_ky?_E8TFzy5ul=Kop+0C?GMHad$5IP>7&R(nC_~KA8BKwXh-J;S5BY^V&Dc6HZ zECJCc4b8g4qk$0Cb)XZwIbG6uN{Wy4)!cG#8baq9=%2)fCw^qRrXzaM>&Sd|R3&wYa`eCGWl%X~II@vcTtgRd$ zJ6J#j3^GB+hY;~-2*2fl>niqBr!UVk_I$qo@kUrCYUSgomT#O!CBv{J#`%{2r9+?Q zQl@}yi(`XU-!b{EIm-Y+INTRJt2b+buacsh&K<~;sKmlv+M?(f;C1hDm(c>h0qK9p zG_`1{L=R|cAuu}+(xP}NDMhR7IU6rM41$q7MyiuSIl<80TQ$6xA%|4x0I^1_SW}8d z%GV^YedvF?!K~uS*9jp<4!Nx3#iz8;5G>GBR6cImhx>I0>`2gv}hj@~u1YeM6gw4eEMR*zmkG77pAkDa7e%;@Ta?fC7(x^&w0y`Hs^E#2{7kLBFh6uIx6K*jUa5-7>;%y6(Xkd@whYAjN%lfUA!|jg$NzwsS0qIB^zS8 zg$ynLYYXZ&G793#0MR7>Xh?Juq=@T)%K`bu=5m{VkbymF1tEs|KkU6bucnBsFQj7x zASu6+3;r_K7o8(o@yOPRg#fREtlVX#I(Q)b;|t?=ah;8ScB)#0=~MYu!EjodP;Di) z90J$+e5fFD2l-8o%JZy)xT%w0OmG?CnW&x^d{c`R6cB|Q_$sHqAh;{B5|q=rXHv(% zdIl|zQplU9A%g?is-9>FZK)A&p!He%Qc?ikgO!ukR~=hS6bYXUD=Dvagb9ZD#CVVk z_|6t0SG>-)i^git_EgIa3>nWp)1&L5Im=F6B^)vE!%i|v+CMdC#ab^z-ppuga@M}b z9*owAuu{D>Ei&*QWbMG6*r8XHPmQ?-of_@~34)-RE!fi(&myZ=vj?EwgxiRmYQE$a z5*@*nT)gCM_FS-4&T{l4JI&${GmM0XY=(>gLL6q?jxWGK;7%2(%Tt+wu)^4dQW2AB zDzJ=8!^gxXMiH3UF-8?MY8OEQD0Y(vHE9_Yu@~^szhA((tT<)9`W^Zymh1RD+?(v| zo6EW^mbF-Pn-~A)Mm#1zfZ?ENu`*IEm|D~2G*mwF_82zLmWEQiwLEECd`ef`esA%+ z+94N(%RoL7vxoHjT}|&A0+;OxA)1jj#GnE~^FP>+Nt~U!6Vx~o<`4Xs5#zRS+9BvB zvTXJFqFZKB+Pj`6FRn*dRxm-*x01Q2BJf$IbJ_~%6G>e>5Mpn%N93QXUzY8%;iM9aNWTm+jbh1V zr-X?O>9&FG<}>DYh*z~s#?Vl@=cYJh4pG8!!vMtz6N5;_j1lbFhRk~5)N9(Q5vt<5 z%;$T!1`CrjTO6WS`O z0&t{sgWI`!$Zo%qg9@ERLZ{A<>J}sPJ#Ty|ctYy*z*LF=vmk%J)OX+u0pB7ZqDcSG z?#dEX|<-a<%4c{a>iYwB_k*D7+_hAXJPWTrcz1C zKUK^~BX>E0tk6$3M=>qm^-ckqtjKWYTH~cY$UPmOP!|-Hz>nsjA36ZvKFKU&f`qN( zX{Rw33G!0W==YFB8XB>YPtFVof_{zFJz-=Ca0yp7EfMORGv~*yuswPe7lGOCsa%(s zJu4=Ow4&)@5L1nG-7i{5r>D$jpsmi19KLG~J(9haz^9nS9u*YkBpM)2h*VU4UoYRP z>debt7jJ7Hn^l`XmM>v>wUSNw0vL96EtcUAD|Mx7qdb#=te2<{ansGRJ^kOjQo>VWl$CDT`E8j(@fQM3LBS z%xmVxKv>50iue|ZM|TZRALWO{9f_=d`4FHe0GkdIzwSzvANFoJI1t%gzj}Anlk#7X z%0Xjf1zXE!7Nh}_L0*L$@q45{Y|KKBTP!3E@5jkQa8OC9;?CBe4jCA>67e*0$g@#* zPHMT%hCX9ebXP56SeXj>SuwD!x|R&>k2IAt{*l`il1*yN<>}+!1}!QeBm62^(M~(x zB^izuIRVu0*0QS!m{~u$unH%?u44tGFk@0fgA&cg`IQK0Oe333-|Xdl<*G0xnr~TO zD$(StICqtRMmo=z%~o{o5(rzvVMF*&$Dqc{~!WnAdGBd z#_#xjWE!bd%Kh3H(aI&wS*G|o$Z_$;wy+su1R{lue&2enQ`k_P$Vah}CsHD&`IUK2 zp#?Dd|4Ot>=TatxWb}+>pS!*&ZT2htzsvl&S*xxp9KBjp=m6DOO%ppo;uQ~#2oW(3 z{_bfAxky5FKY+c|P`M;14crjY&_);!_{(sjnoI^WW%);mt|(<0yU&3C(GHM{UiAvV zuT0^(|1^lQgB&4Y@d+yZ%_cZ)iwvrvmol_EIhlkHqW|1A1HeJca5R2bkFkE@NxqF3 zsnb=qYiW7660@&X3j`!wqogAqfBnF|#0UcZUx=~Q?IPKbrsKI0w(|Yp|JgTlh5Lm3 zKF`ZMmPs7xTBoC%j7}JwjH%J#$Jft0lNvy}73^D0U4OsyaR(y^0!Y@5!JlEap;Ro4 za5ZRqjDh^#E7ucOvJ#VW&l9K7%q<%8?gBCAUiZ#y&z`h8x==|l_mvTT9 z2wW`n9z7I1qt)4I6dJ3faARt{*%LZkaE+5nc^nvU2ml6C`Lq}~s+@~XV9Sbbt;shd9 z4zV?!_Hfw%pldISP$pVg+V&avM-CaEa+unKbRJc+EYH*vaZjW)r>j3s=&$G?+CS|C zk%x{HRmEbIMxy~()7UF>1d;R-hRP0hM@vB{Yn<6K|DPN9Qet*}DPQ%X0A!itYZ!r- zIub!R1iq0w+eRa~rFG}Tv%$=&bBeo<04`2wpXN%!8ZUsUvvyq1}MbwPnW`vL0)#0#{@z7BG|3H#mW0Js~L|w zo{{f>X&G0~eI9oubte+oq`kttE9wdo>Fm0sb1Wd0IRg3*MYP?RP#iSQ0m0A|E ze7eHrtpil+`C?lJ0pJ&1$z$KUNM8!_Uj+d2gY}<`acqC!EQq4^AWW>bCKKi7=tOZJ z!YHzuqp=BZUs@N}B|()RQkZbFfEXUHwS0EZw3jEAaY?pc&^0o@N9J)~dyVGC!pjIS z?s(i9hm4K)`1UbmgDq-Nf8q6_FQUW}3&J#}7tjXb648Oi)bE&#YmuKwI+`+NT>}A= z1{-|mG+hZ<<9UY-v)I?qTJDTEGAd(QAR&p)BUqp}qs0ae5r)BOsA{>O(tK_r@_=U< z@wTkSm0Llo>FI&CLn~N`eJEu_n~7h9YX}RzQ7gAv{lT96H$|uv&QGv(Yv$3x-4Xr* z6~=hpi>acBYKpge<8c(ayddQ+$mrk%M4$YAr{h$(BO}pihzvrB7v^B1MjO5d_qxjHQ?TA5OZR3260pEsk)NFN22^L zg9Dn2s4y?mqAM2i4P-0ES429yY8MMl3@>GbKWJt|!Rro}eNP&;eD~-X$uo$x3Sfye zjH{t~$}_te2T==?9*-k?`Gw%Sjv;xNiabV1lKwn=tn5zTO8P#_D5+?@hSPvojPRXK zdLIvL35SR#30~zaCyqep!1U2e+!Xd%-(*RC%sq-bUeMu~XEtg*nymYzWMIlV$1E8x zE;59?cnmitAPgtP3baL@L{|behFA2(v+vs3acE5eDRwlSh8;{bnAmUOlIc&T53!J- zfu04}!+inX>>NePXmV-;UAEOD|2}o0KLWM7WxE}38o(yPsOEe`Y=(lHt*~Ktv^z3$ z2R&o7xi)w-kv?){OSHt){h6yw%j!$h0gP#EW8OAdP1OV$zLIKVyoj76JXgAi(tbjG zbJGjbQPI)~Mg$QAsOr(0L{)wVGZjvRwT*uQ-(e)C0~VG|awi5su!Nl}btA55ijd|B z9zv-q+siM<93{mRM73BuL43W+#8v!cKIDpZI*Ql-`5AdU2?*WYcl+<9zN@uzpqT2RDJ2JJk4N|8mnRyg^#DO4 zNJejBSg5(fg~GtnI;%K;)kh;bF~p~Izv-(&73$~NpNd?XX!VxBAhz7OUs#AT$Qtc1f01wA^5@DYJXb_)WLl3s` zD-vjcMVhCd!AvEWiC}@71w559f|^S6Xs#T%H?vSt+O{3(b_|!c>2EQV6IsNScLfO) zffa=}Bzz(>-jHbs)zw*Dset_M0M`3rsK6dPNfU1A*Cg1lscAtYHQiiHnh8z8L~0mH z7DY41`Qjb)D#8BFu{r=PQe)u1La+7OOP!-m^Qhw|yYWLVjYs;Hxs6UpA8Efsj!Lf# zx6%#kAr&|3N=)CPdY+ro2`@@9p6b%duyQ|LzlKZ;rt7nZ5hX-x36~ennmcpYz0pQZNqA2k@zpC^kRAt{Cty=F(I=zK0Pln9WvI~;F(ESi zCax0(m0J}XFJ=W87m;iD-AOMocb#u%Bm5K%>@Cb z1s#%0%d3oZa2WWvIWy38WHUpx{=q%^ZD4KXtN~QRB>xj}l!uh-wM_d8c6JM&)@%^r zz37hJ8qiB))RTN}=$u!$=X0FC#YeP2`GE!vBPoyG>tBEW(PdD3aqYZNWbXFBcA$q| ziz&13epwtjQw@ER@3hNd$C9QPAuW`+Hv!|B$99fx%LO0@4&w~ni;_#MH3L-Q7+IvaZv<(HZeY@}1nfsS8XF?<5#L^mrwU0$ ztO`prMM{c|`YQ~T+LqC%+?1FGs7WyAqoZQz=c14Q+0}f!Gs%y6rL_nf8aoxcqEmIs zb?9?p+|nPX#G(X3gXvf@y;#v9hP9VQH?f2@p^^$^xWc*Z`DnuAyni2YqrvPk8Ra^< z6>vUj=b*GD^QhKmW>kuC7pP|>v5bJEqC~#Ye!9^V zU7Y_Y{EFvmFw6A$Czf26@)p+Pd7hO9gVb)2Q}=+$gZ-8Vw)$PoZrqYTb9Mesb?UrQ z`y+A_cP8b+P?BNdyb7Kyx~>G(ubG4QrAz-Z;0JtZgtI9m=4gRl%1`-2Vyu|E88?uN z(mgEa`v}t@WUTYfz^D($S7fGh#So7b`!X9_zsJ?m^_nw9F{x*j)1fsm1#Aik%Q<#$xYuf#(~nrmdv1@<(g%(>CQUv-#z-T@?l| zB{t3um=1YzyktC z?Ewtp&`?}g*V>C|VoX9R$^wk=#ihF6!}8rM_2;;^iY+Z#rmB2;d z2Dz%di4l!;w6WiDe>Al_?LLJ#mzSw~SZl6GYw#B7H(+L4>H@8>hfk#d5yLI;;Mn0- z0|rZ`os@FNy?xzD07*c$zcJjXvA^6mk!NKcwWY2?u-ADhTg-@$;If*%`AZ!OgkawI zm0l3C#tTMezJX?BDnR-fL9y{s0sz1w2iw=XS^(&~1e`%iHhMPFsIXv*?eg%O;?Md_&6AGwjCGJ>IL_>ZV#zpCr1soMcp<&6+- zW5V0&6DgPxnzE5SL~W>W zvBX-Y6qIR{30~WQr0A%ItYN{Ir|9ZGG&j?zo0*{B>q4kFPk zJ13m9HZ7JO@oEIzVwM+a4j~Ht15lW&M63v?Kp%&<>jE#({~nY>mfe&L zjS-gP%fF9FYm}n}7wPEAdP^M|GjPR{!1b&Fm;9DC3Tbr-2$t|~3I$w7` zs3`U@+!i~g-Qt+`b`b=ARCojK`3EB5*1tCF6!l5os!cG9}FM)Qs zZJBIdiDkg3x&23ESyA7R*%^sXE7^OEs|fcU9_tz16UHSfD*BNAk?@BTLJ_1mT+7M2 z1>s!Jg9l+_unyIp!Ego)<1-YHqbSg@!ABh7mPQw$4C}wfxS|5_=u;H_{R|#Ho)k9lc*WW$4>(x^tneZsq6j?L0PFCwWi2g8oqrXR#Z zaAyjgMUSw?o^zzt{eDE6GN9C;`^+D-I-BmIrQgm=%R3s8l%kPEiC!4}6paa)>;UwD zpq3p+@xcqYPJ}tLyhpOrGv>DeP}lN1o0@1azT&U3qQZ=~kZQwftxE8T_$uhR0Me-u z2&^`lIBoNe;g;BOI;gUYtQ9F2LcbBoLQFw>T-m{FPVRrKGOnfMeaWD}qo?GPy?w_Q znvFE{N$x0!=^fW`tV7rdXE(-4^qYver~iQA3PnGsWHb(CJ3(J6adC(umnf*jqj9RX zl3)B(5G%-_stTqxE^Y9r z^s}Hqsw7}iysak|*-gp_R&aI1B83Jh2>DZ~vmyf)!KZo~WK}RZ2AJ~V1(|788S@Z| zKbC+tZIovdiHZe%;UtmR^@v+K<2!WwYHBg!HA?~XSu z!bZzF9%v?3kJV}vclDt-ZjcwPY&Jp(U^D#c^-=?hF8np|hTtODcUHWVat|TO6a?%{ z#Y@he=-2F;7H>&79`b0o?CdVF-oqI z40&AFO`iC#?w>0>E+_@0z~OKXpNJ%i}A zQiDQpsjhe?LIXht)(lF(m2b;f6!74QMq0-9pAQfO3W1i|;H%6O4X6RMuxacp?@CJ* zVRPN>+XEN5CF;1~fnBgwL#XpvHZaWh4Bgmf0W5OH@T>q;#0?$UjQKoRT7)Jt^v z5XDa21981nsZ4WDWY~$-`G~Og_@EsCGZ{JS0>FUNo=Zs z)Y+T<>(hpyNwkWZ!Eq2V?Vyv7N3h!ndUAT$gp|%aq&k}adj-)54VVEZms?;iZR8m&bJ|&;W7EsVi>CLlHm+#gSd_I3`8}sPN#>MW$w4solb- zveo6oh!~(t%%Hlxz%j*C$cA&H9tX>aTI2hvMm0F*G?EGxT$Oms#UOfkrdoD$z6;%Y+qKf!=F4rA%+oy z#qVCpamOveRvdAi>V$tM3)LfmlIQe%WA?~%e}O1b1l`KA*Z55baKqZW#ORk`E!v8J zCzjKud90;iA>)Z47=&njM0tA|>fkAB(z-_I7b1~M&W#HHnWsi`0Sk#yP1)MBXa8r> zLQ>C@fkaOPJi&kb8Vre$OvaLELjfaAjc+(Qd%XV$W?h#otgFfMq>K;;ugX;VaPeZ* zQaQJU_Ehk7Gb+Lf?}h0y8(O{5&EXHoF(3)#JW(v^l%LDhO_?(OI%&{hBbLAMUn zwq<{r&|!_j$bct1C{5RNr(Mavv?r!+6Y&Pn2{m|@#I)@w;z-3*(+5;_b!7o#1ZhD~ z&6|w0-kf$J2oo*@bmH*|`ur!%n=&81PuW9It~NCExni=8Ry-RmQ-NCQ9PM4A|cBWtReM7=8^r4owyQ$^t0C&Qsf#a6(rue2ON)*-s;WspcS zHs6_%yYQnB1&(&uQR@cV`brTx*n{TSe7R73Xu2;%HKd}+RLxu(zyD6@BW=w$nqE`c z7O-dQ&4x);F5Tgxk6ZF-9_+>eaub*3MDNxTt;~&e$q0qpVm|IDYmuk|CM1UcH#x?1 z$tco9piqo6Q~3KWT>bRmsgTNN;5M0Nd7uBBIwV~2a5^$jeU6);RgJ{C%FoVG_9wOWCf=m_=Gc6FlT=!2TdX2+9?4v z>xzs@Up6=!+;>2vHAPX+P-?hO8A2NQBmPP@fgz!pc{nPb^RjK>NMQd}ZsUpv|7srw ztogkrWk|^*(xz#^HR-BrJf9Io{9#UXnsVRXlzdm1Nk_(a{IcOl;(J#s7(z1Sh)AN7 z0g|rM_Xh}}3g!)SfGugfriKo4__na32&zi)L2H2Is7y`bHpLAEE?aBQJauvDeBW&s zd@x171Ix9Xq_15!?SZmsa5PyNPf_VUtLalEQen? zAXRWT6>~LWOnF}>F(h!0L2lC~5hdn;I!FJZ9W@6YL{dYfMjXctX9h>B2CVo4nQg0! znW`}?h+S+|5vbaaB#_*pidm$zofk)O*{O;SepRR)b*D|9?hUmZ^3uKb54iav4V%~o z&I!1sX&aV0f|!vM&$P2A$mR(#r6IgYl{5fVnrBkjo{$7$ezX2DsFaF44_a$3@(Q%5 z3KgeB_3+)$$|2JlSECKqS+CPXU<6ArY9b`Z_X&c`xwDea!=T>$99%}2(29kp7GlXj zAwzH}LV**f%dGA-6UKZgXSkd0mW^|z7uan7xJUcjy%wl8N=EE=_{4nYWdr{!esFs=y<u1hWXBMe&VkHcUh?Pex&q`yqTmc_Ku#j0}9aZvS?hZG%vn1;BK>~|gE z?v9d?n_>vlp7@%c8h{CJ0}_paXD!c#m0tzpu!<)#!A(qk#=PmQEoOh1GIj? z8p+^=hr)!jiJJMUyh&RI_67pL<^)5QzAnT=APDjezSHd`y;eo%D&AhlS2jw4vWl=i z88`Tbcr9ZJ?&=n8RpBXl-b?5}*&@-NQ#+;}du0&fBZ}1U%1)&EgzorvTG80So!;shdxq>Afbfh-ffyBQ3wPW}7QSI6*M5Z;lKeaP4+uX59j!gI$(6M3wa40hzon zI}#9;!S|&pdY=+Uq3o0)m%OfCUJX1Iyj^5;9y@fAdJSJX@x9y%X+Ff}zg z*|_3hLDeH|=FWGf+XqJx@+ggJ;y=P^(#1WXbl>;X*fD69VUsLMVVXVf@F?E-6hnQ! zrTp&fZZjx`#YxV2eU5nS9dy;ffUVFDF|$<2QfF0r=NL-=YMR2Sev?@M*Trg`Ns;ni9 zne$!z6B;a7n`cYE76H6)S;*S)GFzi}YGZ1uU3!FHUG+S+MjIU_FzoF_^U>lK!%%GU zb27CSylWN6m+T7f8?tX+yBRjJ3mIN+A7W?|;mD^!!Y_H_0#Adr8vlkoYCpcO8at@a z5cyeh#_%{RbB$oWBk_^y=035NfC#iHlx&{&qHdEY$i&hN_YABe1D2R|LGy63=UJ)5 zr*5K;>*XeM8N=oQK~wp>hKFP_K;f!Agg9*D4U$z~0~`RV5|lqaV-B%6?$$z2W$%#W=ptJuPPI@MtSUXUcmtRS7unM}ZsM5({NJUQj;r_j2Mq}DHeBCp z@X(>wf*Dvb94fmKnbeB0hjP!;_aN*anzV>#`m|pKmM)14Vt^c2CbMJZm$o@$_-7k-E)DUt@G{x|_DU#TD?g>o z>0c!z9m_^JLMSFRTHztBSSSH=Myn9Q5r-}g8qVy7+ z{ipB8B}Ycxg&P{(&Ap3Z9ZSDpD>)%<;(T+JF}*6`7Ks1LDLl+A?*Ehw462_~xC$;giMFGKcTe#P~$4S|IIOLI^U~SneH-Ci* z!4V-Ey^bibEAcs$U3$`P3|+gVWn3RNd^dyQW}=ra`IL#3Fz<)kgVT%v5z&)_YW2Qs z3}2<;9w@?ViCSd|wgexV)Jz{GnhcWb!6s`OJ8a~cm0qlW%P(0pf%HMVQsX+`@>D=~ z@6THdw~;|~Mege#UY!|5n=*AZ?daO)^f%&UqTdu4v3q^iVhr^RRZvYwhpluCaiN9b z%;q-SetyV_uuEtIgdMMdXFSek27O}0lZ4Px_bWD1ZgAgTa&GYIHBewo1wDItF?!*c zOf1S5X@d3aO(1a9IsnRxV2l9po#|<2rJHtL4frwNal#ZNMAM{>0p?ebn>qEfbkLJ zCqo+>6i%F8BItmRRNNb-X_AcyWh7bYDq1^BGJNoZUXG<^kXk`_E45UOpV;= zZed@Pi85;8#M<>~Ay5QCsldq*@cjdknMvNE!B=8j{eA7~DS>)mI;vdK8T>|}qgkl9 zq-O~-z1}WCoJf7W@Ziq7in<_#4lT7g_YY|v)__!rkRV#k1Nl4h^kblZiC}W92-*+1 zj8Uk9m;Slg6LW*xjmM_n9R(3K5Ip)t^9YwX(GWJ#As`I2Hk!`vkvY#3P)-*c?xqKn z_B9G0M48_cc2nXn7hKbDaMPM&CXt$LQe*K)^0rVTztGi+3Uetv<3tcIoEAIY1dAqa z7~w)pnK_m@`q|0nS@Ga2?{o>Jht53jyH)=q31ryBr=q};e?u|!l?l{+%iNss8=37M zL~>jrMr~PITj3>g2(l@z_9MHT&~TXbFn7s0GxQh23ci1x73nR19pP1Jf?}gm^awMY zkMZQ|LRNESehvgFrf0(PzOUf>o=19$fR=pE$W~zdQKVPTrhz$R088UWPCfPM#tS*DZLWnxLw#<>aPMGNFQubjfqkh0Ku;K|G>K~5$#!9u( zDZ-1T0(-5M5}qb!fW*M6X4dDeng^5UAR3)0nRg1*i12^{4;UwYS@f>-MD-sKaux;8 zs4nl20E;!xU^`Ig8*#d_t4Shua2s}T4NkbOzy!R}llMXZATmmNW)(dGIqBA5;Q-`V zZY^n|231bXwxsz9LS0AvE^MvJXIj1+Sm5cArkP_KNo*!{a@z9I215+5!nn{YeM!Mz zpd;ubXZIb?MWvsCYPpxUN1)VaHUvYuk4MB|4v6t|()wV{kDaZ*B4H7(TiljUiK6^l z0P#c8$BZ7+#QMPCMVAN8_wFRLjU`(qjmo|5144>U%Qi@d+Y140+iJ@5YC!6*VlDFH z;M1YjR`cRMxDW!)Zxw4|)QZkjt<>7jx$IIZoNzGrrHy;}g=})K@hdfd5PzPU82>@^098Ln? zrnQ=|P+(4lNPAjxH+kfBbdvnHb^v{^u)$hlB=JlXF(2|HgYaR0Hla4j1o9<-aDKH5k?Kehl%1Q3$Ys4eb=!*#Ay z7-p?YeVD!;4wPFrnGB2P%PE@N<-XlOvDiz2Ncn}CVt@uV8RwKIcbrEts!c;2j@w8d zK>~K9h0`Q-&e##Jr3=zRAj6Ze%CmZ)A(teAbjB2hWq@zRKQyK;Y_6P;38|P8AbkJg zQ7(DcQ8A6UO8^BPR7TSByOzhDDv}EfEZhF%F}mO4bhW+Z7aC|wrl z!EJ^v{X__W@$QB(#R_UF<3<1qQ~0!0st);9KRPtp={uU$k`sdUf&lHmiu6Ugev^yM zZcS=j8=)}9r^aK|0Gvm8$PAj|cqqRU4R=B-hfDXMD;$6f7%}t9-yq+~smVLLwC)02 zgYYe`bssu!D>fe5g6NotroSz>SF$#-U875A^_^@LQxN9|<_pd#)ZmoT~@&4vyCSP{hPc@H@gATS*-IDyGY%4@)H%B-{6Ev5aKsfGjR09^?#Dm)v%S&?U zDQNZg@qzx`I3uyAabahVIWDrHa$<8o(iV+o$C{NDc3HMomFVYV-}bVO39VEK#Pj&L z#k$xq=OSi4m@yS%4_$ps7HpQax0$2Q2-Ilte0JeVLJq zdas4dooNQ19gmipxs#kW3V^kqtmm*R0uUmuGeSAoQe^}XM-Gs?LZDLS2~SlVFk<@tRmR-=&S{Z;% zsfv)>l{fg_tn9C9qclig)z&UR53n(7$*qeePsaoeg@Q!fnZtaUZHzlT#_KfXUb43k z8!T$C*aQCH9Le>q1W>tl+~lJiReF;9O13}u7>Oig+{M5dHG8l5uCTXWtQq*Qzp4x3 zPwJY4-c$2Q&bG81TNLVmS>UCDUd!Sna6>T^A((5gmzz+~Ll*UzlO1Xa^$ITr33MZh zoL0QhFKA^2AMeC9`@Tu49F-(`>Tzc}Et)bnCEsbBf%(RuBM`;GQ;!!bGon#(;!IP& zczw5y%#5;Jx5LZ{HB0{Th@7B=4`GUD+DvPyU$mxOG^>-QmwN3jy&`Qd6KBs>CXrN-cyn-tIt z3-Uvfi3ZDo)}7CAnKP;@uhuOQe8kg4`;&Kz?-O$skOn`NI3_2nK`3oM%J}NHMHE)M|Id?#LVn(l1IQE^PUAi6y}T>QX$=H8LEK)YIP*IgDWe_2z5A zLgS$Yc+WU0m&7%oanVfR49)5j0(A+UBArSnP+H-nykkC2p>|VI)X=wfvc*EZkg?TJ zM{56W;T&*8k>`1h!Jkk?T6$*%v5$_7M&7J^wL0(#CHH;8+8N3tQv^j6!_-!|Os@=; ziCVBUhbFr#6o=zP7VLteWUxEL;d-M@a7Ak=GSu9AGnBS5VAImAbz zbHw?bRO~4yCk=BY$&Gw5Z{{L&BBLE`a1ZSe`L>W_BrMu~(4y$V8*si4NtF`}A;g~w zz<|60Q259q8l6X^jKGb)J0Fzdmc!eINEcVIFG9!l+f;7L<|-aGb`erJ zD57av-h}=GG(z!R6ebcjtw}l#j|!F7Oie1nZn>Vj$V$SmgwSf>nHY3QD=wwT&l9VX z#BQl)S^C~|hg@lDO0sTIdO%K}fnMPbhS!h*I0%pzsd?1F$GzD6hVm!DzU|>yL>uF3 zw4HfO&})G$Nv8U(*`;1i@g{p@dsxSx5W=z_Q^esG;%c+wx7VuX83M09cZjhSY18R> zP9;9&H+ICy|6Y>pVMV+|uLV~n=ui$F$x@#{9}1tMj|pNu`L?R%`v^qTMF?I`X@z~Q zFsFm}FmrOtcm#+KW6iVEj5W=ItHcFbhDg$P?Jpn{Dhie%wADEZgC4ugq4>8+EoL8U>w_PcaolP4Q$BP3h_(&jcqSuAMr!3sRv&LUIV5U9mS ze8Z*(D2E{{1s<%*mX8r?7G%6s*L?rQ^{O;e@$;ki#=F;AW(AYxCtxrQ1^*#Ma3o+1 zb2D{`(}2`~P|YpdS~+#bQ3v)I+eg!-KU>ICI2ODj3a_DQ`;+*?eYtAuqSZ4W&Ok{D zlzEtTuY;+kU`uR&S1ytzGh7Us_;xTp$y#;;71HUN7KG?j8t(2U4apDsZxQpjA+pOb zb0odEvFI4mEK5Be)eD3V-88+G@LdX-PIh{zV~WqzLiS=gI7b6FWu>f~K7kivib~(T zc>cFMJX%>4@uY)_j*w6=a1m$g7Q}3FJi0XH8kCqt%vB6?ps|27I^rA3W7gX{xNLwA z{sBGUeKuE$7^Fzzdezi>67kw^0jQ;cTvWwCJA-L?f3}Fx6M8`(u}2SNc0Gx-AM(iagpVXhsx`7i zSKK=|IP6!(C(qbXrSW||XD&*RY8K3?@tQ(h{fW*qF5b;AOmssKr#$}ywa^PjgU3bZ zqp{R$W?9KpK4eJZ4Uf1i+@qXR#RPBS?`o;V5T~*;t*pE;)Q5e-^Q^58HG(i7uzp!ab)Mm2Bk|a9hay`DfudKJC=3b8 zV;DZSUmh#{5X+gT_`@jHxY;Ett{H`#eur`ZVxeq_ECI5?EqOJxd3?X$97pixcX!<8 z{Rfr_6Dc;+UZ1Xln4BZ`fkwIS%csPF<$%@kJ9W@jr2-WS7We&cWfSd`cu0gMWH!m3 z);$!0>-N+gYO=T)tk6q3$^SxVRaMyI@Coo6_hLa|;R-F+jN$=*g*AJ zY9nDgE9p4`8ibN#!9R*hl|dT1a26f^52@vF+~dYmX}+T`BVxC`D~DRTyfY*v^9d;( zLqyrf+rx}>7o%io)FMe9|as6jsA+8HZ| z$dRK64V8aH&@z-Br0SvQTd$FJ6cEj&vSK;Vq&)ATa*!QX&H_yPWS`#`M*I-^$25S_ z>^1b6rVM)W?ZRs%Uf03R(0`1m3oldkO&g2b=sZCq>SJHWU02N#!CLQ;@y(cFpj;|z z@}v=wMhEusL(?Wa=igqXUicw%lC~q(>mH~$j1@EnNxi$#?8dfO5aeka;8Jhj7s1nJ zH0?vEZ5jn`tC7=BA-SM3l1pJ>T9ye82r*)gaK-U=5Z`biK`XG_)-Od;QB>-}57}~| zVsC>#z*VR^%JL5(!&b}rI{@4ukl1u?h=`Osw{6LZqKC=tl3v;pK`>4sMkrFyg1Nvt z(II5@ccLMCRSGg<^;{}ywPNXH_H^An@@<9cB~@hzvZqcB!-7FkFtr>}!0DrA^JS@n ziUhvo_jS!RHI$ZwaJXrN9;O2FvyfY%pE!XEK^t))|Kot6Gx)5GJdLucAI?HJ{3{kJ z-6gFogzY&}7B6a7LE~Rv0-4FT7jSbSNbHb}wQ~j`Py*m4t_xX;v&#j#%F*_fBytR!NwZOTRk~15vn%< zOcbYp+KyziO!%BdXhkM0`_ypPjA7A~jgtvW3ca|SAvE+p1g^znSi&Pos5`|Y5Vhsb z?LXtF16f$zSeBaPoZ)tl zw0}kZ4ihwz+}O*QGsHR-JVkb6#8`OI5ZU&Get?zxwmAfqB^yB+2#jm<-dW>&7gmH4 zq$*B>C$a`1MhS10s?|oF8JuJ;Jp#7ef200nb!5?v#o#nMf8K!Q* z?1)p#U2Et-L_Wd&h!~%fx!W5*>Q|(o52!2q=GOmY*4W zU~!I2sC$LS9~;C*(j#)|*ly^PoDBi@UfMhEcZ}N+C*yOIkyZ|!vPR@{0ZAekmg~of zxj!e0zThq}F3k$$K(Ret&0@(vzjQ89Yt|ixWZB^5QKud|{n1>&Dw74N;OQ(*k7a=)BGBQ)RPlYp zF$6-wQBhk2Jkyv$fI}0e-Ei<-;~-Qq0CDZE?jkq)j+t^UM$kA3R(868k`WG0W98UI zU8S2JCzJP!(gj3bDmcG#Ydh(kEcz#$Vb8-t%9z{LG5YfL%b;BU${&p1bNHNBv6h@z zmnxL$S-3LL_MsFgauNG*mR6a$(HqA&$57N`DoCL92oBu3&#WbHz)uYZLEPMulYiR& z41mQb*rNRZ;5i5_zzaM@y-F7a8@(hC0CJ-VXS^*OdIWe&AAZJp@dFqe8OpQlcK!`K z?V^m}L@zGIB}&AEd{lK4St(rqL zkn)tS^jnTBBbmm6;fVPNqU|wb)o&XLa2upI$B5uw( zDcYY#hbPorM9#Cu^CBwmWnT0^#~V?mBO^0_;uw~mk;8dkZg}S64ThYizoiJr-rp z0lRTiH_e=U&_q(SP9zC1Bj3t$_iM|YR90N9H&kQ0e+8$V_IZ+i}hIz-g zz4-bzSRykLFx8l#Z_m$Ij0M&KS)u-G3AhG)t%)^}N(B987Y-Q=`Ud9VHysXCHW=~f zD0MQzFu}es1L`bdkWk^A(SjsM$xq*mZDRF|4{X(QlLpJ2fdRLk#{-+HSHZp$!W)Z) zpB2xELj63iK)puG;>M>z*^2PArzDl$0#Xs$IHRA;Z^WvpxKX4OBM$DRwoB76N&#$G ze6kk>mW``7cZ*wh0tj(IFkQkHHM0fUP29q?K*|}~CN2DVQuo1}x@_?$75jiN>4kCG zitK1cy_!@jDuql~Hg2XNBv_caSDfFd7!3jikk$i$0a1 zuEUuOyfjlGv4Rb0BQO|$huwc< zDp#WuL$gFcRJTS05j6kzP~`d4_r0S+0bqnD4)DPEQ8`p@I1q7&KT9nqE(MQAh7O3D zqO9;J4g~=y1D7kmqy3fq#T5mdQ~QdbnS!IbWR2FxW#&mk;GxKB7qyViK^d8LiIQC| z?h7dN9g#!DG>y0;8+mc-qyPrOyz@icOzsiDp|DLw@j|VJMJAL&Po<>A+>P&GEhf2{1*$5qMTEOG~;$ zeo{oce&|4qa5UtqVBr2BeM>|SQgaC)bb$R#f0YmT?G?1qYC6dckqFg=roHzGsKb~6 zSSX_m2N=!xrk`w*v=&sbI0Ax5LJy388zcm?uZUpAbYYi6BE>+aV$_XR5PDBuLyd>> z#0l^|mRUxa{mgunj^Nb*y7>`~2mtGCWfHV@-rP@kqN60(q=bb0a76qKXl~MqDVlYwS0gJW&bz6Ap;9)Wx5{CHi zuNOs?^f%3;3Rb2xtk*g-{ckJgO^yBT0TQ}TN=^-UMzL0+kk%I+d(qVq@5%L|rdpoQ zj@p4P)eVLFnSfajol!0gBu$P71VR={O$AD17T{5$8ecyO7z-v~)QCvOW%(5O2?KC2+2=jkzSmzTui{OpprR$(IiA1L8UNUPwKlY0h`UA^f+Nj zMk-fXJwWk0oW{K(zohAUiSm8RUy-l1&3B1leW)I&b%u21Fp!k%5x4n@_J>k5HGYKM z<~K_H-&FQkrzmK?|;x0rz3j~AsdDe z3{_yu?tQ)k#!57)6oc)dki0E(l*=TCCxAb8QZNSplE~d9oyv*3G$#8ZWG3(XEeSC{ z)TqL+-AQK((mQ|>&Q-dU`M&7=V~Zl2m11bOTo7_?ZQfv0)*zhnWRcKmgLn-J--+%H zp5Q!Dx+?0F{Jzw^Mf*tECog*QB|)2#Xv1Zo;cjHmsddj`*HP)oBNdxY@z4<%H6UaT z2YiZpM8-PIoai8rcik%D?~C^Bwo-dF+x5|{Ff^iF^uoQka8#}xgp2eClBH=$iGZl) zt{<@?SEO&xKy88ChV0R>34>^N zHAHuJ3q|w9)5`L?Agvq<&B5cmBbs4gvcK{+0@@J0Avw~Tb`o=lWW8aqZY zjPAF@;i3WvZ`m2Z;0~aKtcX$4oCYceN46l18As1ZP$)^J4|9{^K~<4E`!F^ZhvzCj zEh5f^7nT5sl;N2r#WBk(?m4~!pet&POxN@v)I*p5t-mPHnKKOe^zRKel@>k}nD6J{ zWC8dlK2*->SSCeDk)gTJCM@2Ha;DqwZm(t)?JZ1^3}V(u)uRMAo%=W{`X~3$Ft^c6 z`F`>HwtLIJ))a>^2cXfFBKN9Yy|M8STJ}S+SenVxKI=d1(`#woQX@cWChsL0CV(}W z4wwhMWh3J|H7FlY&mxeTJMu#wvomrmqjwT~I1w_;ciE=9P`T~({Xp|@5}>Fb>wU~+c1AWXAUZNz zAJ(yjtB>k zA0=%yilP!5D~~WA%TMI~AI1ykQrVegCbc2P1!Hzxe(*UaZ_i;R4}pIjY!y z0O8bSlq|q1QZ-_35rW;3Pf-&t|K&;=2Ab*RR z>*h&uq)39A#W|dfQVv|%h$x9w<%q1mo|~xVi@q)A;D?EeFTM+b16ve%^dPQ z_`E6!?W&B`TXFS#$L~sdS^XMWvVi7ljWB==# z#-rmCh?h*smnA_0UllW(vG^^|@x;XjcqV9^74Pb*m?pyM`(+?>es3g`j;=svTnB0F zuXjdX76cJu3`AS(h4RkB%+a%>{J`AWiL(RLK6R?>>^K4QJQC7iZt1BjvtphLfl8Pw z07Zrh(WOP^@*UH6*3s{dy_XM1CcJ|INY|G|ObbgqUi0hdc5S3t26}BR-#k+mq(*hu~ zd4Why+O*RoG*JY4By0gN6Zlwt@UpUbYj?GxUZeuhR#-eZh$y55b1T3-qe09LfC`tH z0^uhq)Rm?liKFpkPhU4EKys$i$e`B~R2PJq)N5p(65$iWKe$?Q=_`@9%0(1@D{fuf zktr;WE?GZE?RRL<)Iu9IUWasIzNGcP6;N`>oOznZqdfMP$P`+$x36sUSMfuNQd*Xi6ZH^HArB8?1I8yB%m#C?QZI9n0H=RK z$O=t|V-Z-z9AQxV-q&!0t4~;$EX(V)+@TY45f_QolPq^7{)KF75X|E zON&?v)@GA^F?+yZ0GVVXiyJF-_-C1P=*ka_RN-55CCKg8-L@3fo@_2qWwRi@q_>vtPWQoJd*%FK)}D!lCf+Y z+05^P3!Q5mbHUvbJ@=i>SH@X1rAF-?da-L$g@L!gqI66OWL;IJt4eg0EI)vC9JVxD z5a?hNjE`v^r|$#e*CX*9Hh+St8QC(qhYYgM$s&Q_C-HC`$Sbbjtc_;SG;%2jXy-G% z(J&cbP5fsdQh_IiQ9)$7NM{%I+ z{5h|2ml(_tTS1;m&(Q^Lc_!k>A67(eu`sXbaI~9S;K8VREx#egMVGVKc2Cx&S4Crrt>2+_8gJ;RP0pMuHhkfu4$DI54t!4BSlz4UF%%E24-&gqt67SbGt*@OL|}Dxpg} zmW84n9;tB8JLyaO`&F?S;JjlDLNbV7Hz|_AGO{yfeppe42^l*z`0rZCaQiLf#uD4o8R(vaE}+S8 z78fMi6(|x&ggtlvzgTeE?3?e*oj1(};Ph(gRe&jCth7!*7I|?1KsbWWcn4gUXciF( z4bmRMh`lX#gf@UgHj9bL`_cG`*-7{l&q1Xl7fwf`zrJ(Iyu|$NQglx8zMN<1dP|Nd z!l2M!&GHj-UZ?6GNide{2fu$uaAj%~G>S|RZrZVk`G)n!-Ew;A^SzXYp2{jh0FqPw zt!fc(s|*@6o(=ux%oRaWm^siJ>fQ~9m`LwO@gkw*p$mqFuCpm!ePunj#0xIaIJQ@{PItp23y1*galGs|ir6kaMzxuMDVzI?vWa)^zt5Q#P*VmOK^Y z3vnxbn>BILG}AT|#QwH1yf0j_aoThfb=o0fWI=@4+AZmj?93l0!lWtmr@4~csMip+@qheEMfu~1B(xU zK|i4_E2RfQ13XVD84wt2X%6+3CBgF|hetWDILlEIK$?$c!*?ANpPWm>k*M8QSy%Wt za2YnI-t&!Bg8~9xpoh2`keG=;Q;5t&mW7_FKo`CxJr26Tp-}|2Uw@_rx<5h&!D7B= zt_;gTJeXxL_9N&@r#?SdkyU2USI#ykCj?h79Du9;>=@S?zzi@X!h@e$!y3FbvqPDO zEijIyN`1=bget@*+X&4xJu z4#Z?bKN(1K<&>|o>Th%E>p;duW)8pVV=C(%T{&4`>0sq;(`Pc;ln~~UpT{oK_RD(w z?r@k|ftn#B4HP=Wanw)bH(?)x5cX#9cs@u$VyHiU+Kl`|b%tp<#M}p^pGrS`W7E`E z?WHc=d6c?SB*)AK71S50utB_(9nLD5R1pEA!bOgVI`8GXbXv6(EGSl6hIcnqxLu&e z7FwmQW4wR691&?UTH{xG-cqbSo6@dp&J}a^(M4>7=5|eEVa45)cTTafTr@EnwuEtl z4i`a*#^K2b8KM^@(!uF>vw}LNJVQMC6_F@Y&q)Xy_OwGW!SA_isAUv01jGlmq%oS+ zGF=+B$f|rKYTc9&fadk-%4B~$D1~!pU>zMIgIK>?eDsKd9fpA%a+Kd zK9#N{4s^pAzwMT?;{Hiq%ivT5m~ zi%PKX|MLkCN>q68^oa9fNx1Z)GDF=ue^!P%xiO$($uI zLWQ5K@`^aBfYVGEEJZ{OrW`#@J~UR)II$l?LPPd@GfvjD!&{A_&>~CD@VzuB`a&}5 zcwL%fqcYs<1GNM7{7$ScZN`GFk$mwN^RYEmoh;{JHz8|xT8;~Bjimy%^&ss`lJiu= zQvkd<(qvPFtIfTV$8yBH<_Jf^m3b>C!4nb~{cxwp4@2pTx9DX+VpzwRi&*W}EMfU& zl;Y6vb}EWCI@cr!eP8co_P5qf#YzY2x#hoKyGHj8ii_g@7z0y(1LyofWuR?BUI)-A zDArJ!SPw+YbV`|;ueB{VgA26%bIO`jD2icW*J%Yp zdqEJqqv)Xs!Jp9?BGwg+OF*ka-byR&-A;PVMNoUL;D8z7zK)FfI2e|OW?!P-h717b z(U2+adp7|UhW;*m$+x>=EL0Fme@!*~z<9*F2vFy(6|RDlQjF-Wp5hy1l5^{_D*R6k z@d7rVDnO{(?3pmmIVrrIw9l?4&{@hWZMB@pmL%+1O_$AQUB#HRaaU zNE-Y;qxGl6Q=*q69c_O@vB`tHbP>)TD3ghc`i4*#p{w$zv<3kj_ob8*LR?WQ73{zY%?R8cLefHm zp-kiQE-7L&eqSY4h?-y7@jxBy{$5ef-Bt- zWovyE8`O(fi)RS&=gd1FFuJ1@E1E~`5i*Xlvf0cTDz$tyqlR5xL*ev2120IKCF+Y( zU380*F{7AH*_%)!tyiXtv!c*WL>1J8k&F#CU7^G}SbfLI8F~Eau z&%vX`#BT@#=oGxwQrbZ`*Xw6(qmq8Mq zw(qA29W6>XsA`Ze2n-wfTMlb!5xms64?AW}lVND))Mv~XhrcVt1pur)rdkoJ(J#IzASf2oF(e{y&F9^(+;x^LvqsAT}nzT zh}J5t&__a7F+e1d!XC?GigU3MDHA<zwFImMhAE-eohYMC0iPn|gk zfcy3JU30P0g!;-5@%I7eb05g@^A^g2_(bTWVLp}oT``Uve8ag@h;o(bc@-pF!Hd>e za(87&hd~`0{f%4^SVastn0o*+j*mEs=$79`frO)>j@x09FBFxa5zv;@mG71$4q6kO z?5(_cO{F!)OcsfOXtVc?5tp@WjVaWUodd3YD{!`=+VZs%f`Xw%8o?L}^Yt>s z1?Jb!NJb_;BHAb#SDgM{i+vhf3M>G;Y_mNc7A+;hxEN*h`ed{iB8XJ0$O(@Ngp}*a z@5l-#k$e&@&|+T1Swu((GrPG)kW(Q91`bariKNBHl!}6 zn>EfDt%*PtU=9`~MLTPwlrR+_EUnT(fM4$K`%;;}bd5k#?A_59MF56{rdsfFo4Ho1 z2wlvDzYTfEeX^jspv^-wZ7|Ce>nZFvBE19DlPn_K6nG|>A1QI%YVB{WPCsy=?R1i@ z$n}{|;rK210jUN!U=0@$tpH9GbUk!U;$3YCau?B68b{!D3{z0S+DpS5*HWN2s188s zSLvN$y@rSED{#3w;el2OKoiL4;NLBGN;fOx&$NIXZ~D^*MeIK@Gen|0kr)%7Fp(e( zJpf&gjO0MI)07G{`^e5ZeG*)f6FTt7)nzH0m5C|hDJF;>?ZVh&D-ML=A#&svzak)P zEZt->b?=n?MFoZ!k^+{o<7&^uNjyBpMH+uSouX`o-0|ryaM_!0c_|In`xM;1d*0c> z<}ugUB0vO!o}IJM@Ih#Y8co0N)Tb2G6dpH0kKd+CUwQ-}YSH2#6cx(K49Q$m!*@tW zR}AKB&!fpjfe8TOJ9w@$M2ji6mh-o_IUUxzSlpGNEL=--&5czfH=54sJQBeb>K!JF zKyim=0jqgrBMl2Z3lv{WN=iQ5-BjA_-$-A(PVS7xWIq!ZOpUBxyh~$9)cAFVE0{5m zC>)Z}F#S-X9G-9tsw(@VTKfUK<8)R*hUFi-=rT4iLJqwzgur6l9B%1(tm+Cw&@%eR z8lyNgw=g8R&d`7GDJ2arfdC09#?jIE0@BzFMGj*Ss<9K{IsemkgcyAf@p+d6(~2^0 zP>iDet$2iI?QSC@XORRqc0S>e)9;R82QnGFoUJMG&}-SDvp5bgmy_V+CLi5?2cczf zByrZf6vU!9dj$L22c&-@H7k}uKIvj16Fu`HI*KK+_y=wFU~plYKpmukv`avEU)-{< z6ecVvd<1z$Q+;vq-M9LGg;-lXG)Z&0-}(~edJirc#8#0 zqKI9RNjdtXbLrI+`7z(#aS-{2pU8v|{T=*O=dj0))c++>kf?B0pAl87D1wdMzi z2F3PjF*stRf?Nl+x!sjD9H;5P?a9b?bL2O#m`4-v?2>;nvJ*}sI7p{V7)G=ADeqGV~Z+kHaZDKflLp!$UoM#Hq_642K}sYHTB zNzG~#xt77%x1=4jO*JFT3CxPkQAtN*_^Hdci=2rW%_w0jzyeg!ewjt8>RkUS9FwdZ#qC4uvUG@49h zrpS>16|<<)EgV@paZoA}dYH=V#{Qxw8HydUQXY-dsVKzBVa<6( z12j!;@+%Qlcx5G3^ zO7a-zuaqNMsH_g8>vSAcCs#k6<9!V5IeNMRfz&jpUXmz8qg1lo1A|(&csw^{jAvXq zx<&!fpO1h*mg^?E3mSvmpI&d?X_^`UVRGL>hj>~W-A%v`;)t%H@Vt^U9f7-XsMJt$ zZhg`0`H(>_{i$eut$#*rM7hSXyp|LBIXS@SAix0M;4fv>n2?u*b3rYiCoe}>7%Bb1 zPlA}sDh-L#Qfv!}Emqo*1*>%dzKUoZ{#==F7(=t_s<^H`?ADo63DN=(M87_HXC_Rp zP2p0f7$72iwO3I{BBzy>nm9s_4pbnb?&b*T_vMtt%Y4=4Zw%(U_mxRc#|m+&Q^ymz zNbW|1ob)ay;_yzKS&9R!(r(Ope&(%OlW4h^-)i zQ;Ncjr9{VtpM>mrCHW^XHwRi0FLS4$JKiNbyd?*dO%F9)D9iNAbxQmc#@Z|7R5Ue> zT8k@5=;O;{(L)kOTDw9LW)rSId}Q2*AU|vgp+k{{7mXB^|GYj01`UExqItt_0^v!ymzt)pn;3aRC%d@t9E$m;6P`-6c=j%(4-abSo)fnGQ6kVSa>?Jpp)zd#xb!y zJbxu*KREM^c};Gtvuo(l(+YgE91|Lki+Ch097q!INQ84J9`U z;~B3j{SD>A{fYaa0D@~v8yMnQj!R(zG{y>;2I4wXmlTrF`Y6qKRtc5QhlmPW!+mVi zWu)9`sa_xK`hb6iLARc0ufn3Pk6eeYa39#eV(KBt9$Ess}fL58`{aga;Kr&!ri8bhH z<2CLVfv*Ty8l}bsgbRHF$GJl+{}>P1c$0^h3A>{HV)Sm-$0_#2l>;LMPmG?h6mmE3 z0sAj(`wdm+k#v#+ew?^sVU6brI((Hm%3#OiA;oabi5<)seYbePVV)7uwZ8uj zI78ff2?*0H0VrvE<&Lg?lg$XvEv}T_(=A72s@VEX!RP%M-zpbLjLp?`G7O)_F|7)U z8{Cq(X`@ED;HlYoEBKk(oY@mcQiEN}`2E*SstBoD`geZM30WRe-r zF8R&KxXkr#VxtY2G5jl-{~N;)Xq2#Oouwh;BJ`ed(f1|nMAcrFAO>;}`~BGt5wh`x zpiev=GDKBjI9!NWQ=zUb*ZE=|tJb(w-A_zANQ*|9Q`ATZ$-eodt03w;77M6&=5I{N zqJeyJ`y0n8$JDnE6wDAVhQn%KnL(_pOIlO4pvP!wq88_jt5blB& z3s#Ca+6X-=@Q9j2dY)Y-k6cSUmIV%vY=x4|aIZk{ThqW?&~Yl16A%A` zzQ_1MCl!WTK(DHBYVKh~y_$hWHTx@sn9DKDqk~Wbfo?HzbAPoUa#C!K8LQ_qX8~@i zx(Rt_Lu`iWdW+k(a=p^-M$j>6+H>;d0nQB+7Bc%AJ%i|-Z?q6Y>F1nM(`!Vbb(Q*o zd+&(oaCUZMbkcRvfKXHC^G#V!f*CduW_A9?#__exQW6yu_2usr{|t>qnCX;Q78_2| z_X)Y@6ld=0oLr(kpnpLdT9DPmKn@1vQ+PquH<2c*o(-OfCUq;bb zE$zld9G9cm+bbBn=l2JVCIW7Ow3E;zX9h(v&#=9L?0-jh;!3SK+ZQmN;B)%@ZHCV59Fv`2wMTJ2?fSHIARSO8qtUo2g=kW@iu*!DRvsVQ zzhYt&xfmf_ZJ9ws@b?y^5~RfAc>_3aiiZyqEb3KdQ_|06E=q5-XJF8xLo478?Uf#I zFbY?mULkOW%e3#F9-p3lu@;!7eQ*23p8p-Vg+UUwKI*iGOJS@xE%F{JpnXclVG)Q+ z{MSSe@}REYsY#QN+ixKhBbylC!a^+yeSlGCtgq`S7F|~shIwVB->WcWz^_ABy?B4& z{3B@kuv*wZhS$@0NL5r6vm!M`i>F$XOW(#iCWy|fka6EWBn zg5d@L{R)4_NCa`rg3oqtoT_33u^ld*i7n)~U&XE)Hq)Bnw2D6z;Fbr-Oq$O_8|^2c z#o`!{fzejXm47Af5UOBgH@^)lDnRupVHA(XdOIjwoUT}LGFWeT(;!gkR6|w}Z6aPm zEfmMfx>G$<@?*<% zwgdNDl(2Z^3sZmRMxA|ZoA{O$AvGWm&LcFzf*{!oRd4?xsi80WN_E&DWjOflkI$t4 zs96O}<6)E+T+EqL)r?{8Ju zEhSMEo#q)e6N$tgiU?e%XqG|`w%|vJ7c*HNJ$Bg11>0zQQaY3n0#8UOkWjq2m0`en z-fG;u`DA<;E_j5eTyb?{E<cN!BRgRUG0SZkhUO+tGU+~l8nAL>_{I?oJ(OA1?UymXAQg8{>-jw~du!DVDYhZoA z0!h|N{tUK4<$6cUoIOh2Z1O1YO=hjO;7$=gj>}5F(-G8)ED&W#jJJ*>iiYWb$iIN; zZDf<6qYRv_K>rkRHFBLU%VCjrQE{g`&Qu~d$(2OHI&@QxXQ2#r6ht7~28z~?$kpQ# zxYB92;hSpKP#=~&h3c+}Fz+r(zr!uoD0b`bDskS8bO@ZwuzR8?0PLGtAn;mlSD-!E z`2=@?{zgpGLYru!B0_Agg-azQ^@$VmWk`g?qT6$QkktieY zZ&K^mkSKraK$CF1sKlRxY%Z}KYqY5WC37AnTgO9GMKeXlN6+ibyv9svx3R??W0c&P zIwwF3^v_f>*fL_7n*ko5Gw zivD;?H7{08fkvMSB;;(Ka^>p$MOYP=pXL}v8%#)B_q{>QdPYle%(Z?L&fhCJM2W_| zw3kITS|X3yDd9|@D-BB)a0xueZ0M_ORb=NPY3$CtXzYIwws8D1(HS*7!~!i*mtrMu zna|GWyml)d!m^^RNin$c8JUX`xkFt!!{3QjZp&9rskB@iMvGgW1a7aO3OJB!>LBP{ zEa*dmbOqSqyO~Jj!Fk6`vjq=yO^Y01GyXnc5otG%Nqm&wAJm|#wwv6`Nd!DOvB1+- z2{XykuZihaX<|!mqma6x(!HAhq2)ctj}YZXAk}32)?ILpvR7k^F4Zs7SCpjt4MA{F zNqNX%KB|<9IUm^$rJ}cI^@XXC0Y-^!-!JDa4+|PdVA-o?XAikAB`He6KFbqesjNlh zLG=nIr5$t9u_e*Mfj7Fa=bU$w11EFUh8_-$vt?nm7}XVO12UqBU;3DWsU$*LeFdR+vsWVvqe9{u zv~9Z@W?)BC3^aR(Syp`wVy_gJDjTDZpT0drDsckZnaouMaz>09Qz>Mx9qYhKXb=tI zt#HWi(HjwVF(r<Om`}Z!_@M1x=H5SO~4ccxUuZFXkJ+GL3t4<{oWQeFv)J*DE4Cyc9eCTc+xF- zt^r+nwT=mfu7xrK_h)~3E=vOuQ59xdPSJmSpAiJ`+GWIREeo{1~7k zk4P;f3X+*GX5APRxuC(1jUe-~j69;qCP(_q52=iC1YepA5+hfBHGFQByH=NnHlqlp zF#D=8X-7&DNbWzT{r|_*nI%h-BT4c;6YH1YW!H_;eBLPjEInu6nW5c zzF7r0BMgV-vPrP_I(rgYZ4_{dHqFEDkQtFtcrQVd=IYx6i3Et(klyw(F4Onf+hAqQJJ437o8z9w zDJ7@US#HV00|B87A&1<(?{rkzbQryGJx~5l8RpoFVKOz?O;K^e5TxNmdrDKu@N40I z_!b@XOJd2z6uqMdW{d`Ol)MI)298Lx;Vc3xZ@r?*X3og3km!VThf%E3OND4G>Y5rD-ovp{zH>tu~kg$U$v|Q}*hqKqgGq z2hviw%#(TmIrWJEPF7!yArcq_4K-f35HFUqe6 z)cZO(exf!LN69t2JLhOR|-YI)KG^rOXlf|=LMe= zSOj7^?|iF;Eo2?01u|h&dgFN#tzKt9zFZT)N%H{z0RGa|e$A_IqCuo=fNeVvx0LVD z07rU@)1kscZc3Eq6bAu{i8Pq_^xGQ{D9;rZ*td|6WOeZhGhJfJ-^zO> zmHH;M7TJ!QseF|5Amqrn=r(dZ%<G)mxrLdfqnhH4 z$sS3d1@5mq^3$#idrI%Z9CWq%r4p$q_kD8;gkc#E1^Usi-2b*5IYv%?HH#7891qpq zMBy=K!!ShsqKT|CQpxPa5c<6n-y%pVg|(?M3aD*RHI>55^*w1nUhk>Cnq$O9a4`wZc|O;bG%Yj7KdqTsu5f z=nzPo>E4$3PlIYa!t`O8_N;s(w@niH%Gj-$++26kvHF|eTw;hwsB3D>Hq9!}7$x-! zHqyBqu#O-c_t6;<42l@szsK^H)G2RW3U+85+%;Na-G-7lk1$-OK6A{xoo$3~SfBpSI95*3k$bO2A$l#<+A~ZVi zpk7brMf1;5$bA2sZ1c6Vg@hZc!xWut_psi%7f%lqpRhrbS2xf8FXItsO!GqQp#)=HK zXCahg6kNtQIWH^1b#k77;^ATsA`qOl$g_2blI5btu=XgHh<{i-;;1>kgqo}}F#9g% zj-Mz+s`4Xv9+?l^d?q;)FBU4!#m8xxiWoww$svOdw$}g%LhSLv21~X(CGAu7lLSs9 zelu@sBWqS63y-pH$XD1g*`H?ETIxDZ>Df-&x{-{iC86J0qkmPYI*=;&Cb>oUixmEK zr0r!|OXOe)LKK@bC&;4?OE#M|D`M;{Tb!>rVC&8KHR&7+R5o5|LWm`44|G+-WTRO$ zYY-*}NYl4YQpy$1_Rn@ zX94r|Ewu!7uqNKn^(xMQ!3bkt=g@PxhTBfN#Ko3YQD44Pq1{ZT3(sv%@mNm~)(vGW zx0#A_jsCj8pem70y8)75nNkb*(C)5brNN(yI-JL~IQ5qwSrIl!@JL&Pe)tM70fibT zxFu~)K-I69BZv-Q%ythqq6suw;(TWZ~WKmOX+ zY8v5^?TuE6(JD-XhgHFjgEHz;|IR!_T*xp0uGj{nmTT^6Y?@xf7C|gApWSnE9soZ; zkEuNSH$jxZO}@Ijw~<~r2@73}m zGq#I-Svd0|DC(NQyc{}4XlT4hwefQC9|v%?%$Z&TKKl;7yx$R?+?2D1WsNM9=RuIO ztqEb-Z+$i95o$|rQf@w6g#El8q&lPF>jd@H(1A3uX)d}YR%736zr~Wbi0QH12odT&# zya-sEV=uZWl&n7 z(vRIg+I^IZBri$X-A`PwR%jh!11svp5XO*-{-VH83}pP{I4iJaaMtIWeIFO2>LP?9 zp$t@Bq%+j@$f}fmI3N&doEJeL4Z>PFh~MDu@x%+|g+f3$3K3EA2!o4?u@LmNK62H8 z=!eoCJ2ka`d{!|xhp-laH}NwCLQ#NLr2%|vdw(ItH07!$#r*tL{S0H%O{6ol+F*Z- zF`uy0NL@-1%4Ys|;Dq#nCw8<9+UD_+00`F=2VvFtd!*82ND4=p_x;@Lf8(K2j66EY z*7Bp4+y1fLVQm5oknf#z(+csTY47jj{A*&r!y>$@*`v?b46I2L0!P#WvoeCwzU zq*S6hH)UPE+F>aQMK#L4(Y0fF`L=F=7`iw4E2nTEyxddsPE~6Qw0u8HyokHvVqp_z0uPn`?2~V{oYhxRSl>$*3^SlWVoq?}lPy}^@vyu> z>O=xi5i6E_Ac&zQxedO&XIsdtK`lAuHyctWWn#75`!uOJcvQqpaX?+l=%lp?O*q(` zlSF4mC|fMH0~#^kV7LZa@|601W6+G7lga_Uds8lEewGtpc@?l$kizY&Cq8*e%;lFL zBst2QDt{cu6xJMHy%5gn71oa0l?BWg$v=y>5OQ)D)~#j~#Gp*AWIg!g_L;YV zu7V0@ksoLbJk4zddBtW}uoZ2ML^JV&>K=GGp(gYE1dS0tG{H30B!=>IS*w^M6_pEm z%#jTZ(r;<7=@@!%-d={kHqymnc6WAaY1PxCR3thS=+=XD$hc84k6f5>qtAd|8VSbb z$+#~4IWldc+9i~WoGV6OHH67m4R}y5UqyItUN2k)yoyUnC^1y~9wvsmj8s_67nA&& z&I;IF>N~;;=vp0@X|;)dU=c=CS@R9T439+uah0e{%_X(p)+o*a_EKd5j5t5&KnFyH zhJRa6-L#F&gAtqxjOg6#nP5ySg1%wWO6E69<;BLrG|Qrlhkm0@mWtUp-4GcWTFv07 zk`@EbkhtlbXbzqSyl2dF+i58-yQY$amPqvnm+74Bn1P|BD&hNV=+SR#tKa< z5?WhblnF}U3lZ4wkSxta<1h+cuD^&olv<3uaX`BE1k|_nUXdnH`}26@lNz&~@c}iT(;$u{O9oh&@Mg(D3@|k5Fwu?fo3UJsIoZO%XB2C8Xs}S0 zpB5(JeZ(+(!P=}lqYgJuD=go~Tv^t{o0hW{-X*>asQU+Vueh>P@?h-d_PFgZKmqyW-UEb{>)uP4XU|d%wlwdDR>II zL%q@ar?XB-1lsJ|XO5_kK>rN;H*?pSpEYb@z+5GCj?co)j0kj0^Vz$`ip-88V7E z73(Dmq!PYtx(5_=mW0CFZa6?5415t}N^}NzBx9Bz8_B|31l$3id3!0r0?XkayYgy< zkZ4Nqi#?aFIPI-5vdPL>h{VHDoCRX!%4Uqd0Y)pR9^giFm_RSiI6K1pQy{je&JwvE&)PE09F!)?}EFC}io}JDxjFw_LOYO6T!rqwwi@ z;z7EYuSXieVpu^|c7RyoZ||H!H$@5}0BZ97#Egh%o#t`{UUve#JFm25I8eW1XoDj8 zo%5p>fx3&Rm!4i(H7Zd22vdM`8Z{%1$y+ZzgmlCoTXM&p0TDFVfKstrt&*zNeuQC| z=C6opGFWaAgTBQBQ_c~KHG$XC1utOiTa@^i&^G?tQKj%dr#+lr+S{oiSZe#;fVdCSsR8&1?B*&(U}4I z91`Ob0%~HS6si?&$P%;$A90FBj)IJekQ;=2%(>J1%-6+~F*UcYshch^;0GgJWTy4~ zNDE4& zU-3WLQ%7#y)SZpt=LzGhx3Hn*^SkkeMu9>(%`1e033?(O?#P$L|`P+mE`+Iyg{61B&B{ zL`m|XC2;d=U7aE^u8CoZoH*Q{kd7H)FNLkn*GXJm8ZjAomJzqOk2>2HotIEo%&>;C zdf{lNE+(UC?R?<@eQN_mzjPmmz<53CRw6keO{8RLNcioMiGfUtlPmO4oE9T-=0__| zALlCfwMWSswDO8(@BU(MB_Lw=LDBp&n&@Z{5kp&USRw}d!mjy0Fu60E?(AG?9{y6r0#bfnPQAxq!_?NP~Bs#UJ`6YD9Vt*Q6-JvU{q4 z4!m2}p(OgSZgW;-Ti+29$?I&{7p3zFS4bn}{SXXOay^2T_}@QIMb$8d;<>8XIa*B% zh0YJi&5Cj?Qrl1F1`C^{WS@8#Kjt-Ku|>VV5RJxEx^>SpCBU#X&1h=F#GweZ$5` zfaAUR`jN0ZwC*5>JwUQ4t46j;&`in(K}gGPIS~;0o1#!W&Gg&MD-ibLCbQH zBbQWr0&FR(^l}XYydn(_F(rvgqLc>9LoO}6Rw>V_mxdA}V;U3y`kh9x7cZ<`u$;$A zBM_sVgOqqB@;Iz0%;J{qFDvM zjO{AxJe@Pgl~Jp=tnoFFfoH%Vj*{A@r$YvV1B^&8+8K*JrwC-JS2QS~WBKU2L9mH4 ze-y_v9sz~do9($$^0cV^sZ=#n-I%auT4buu9`Zfl6DlI5#W$dvxJ8JbfOd8!zAL;1 zzS5QbA=OBBkfFcM`HIG_f&GS=)CfjHh}Q%;jv*QI?@@L5siyv%`Y=>dTZ0^h8_y^m zP04$e_&W61?3^iM1j3vQsb<(?WMX2e4J$28%%gC}W@s>_Ps3*_joQ!H2M`qtBJ}(j zQm|sd>byoWs@D~C6eIhZmKj4=4CifBbGHsF{O(sql~0AT zQ0HO0e94HS^RkB47HoX2u=dp^Z!Dd%LH+(RiD5dTT+q=*Vy1U-R0{%R0;bie0|V8150d(s=5a2^Z#@eH#( zdhsg?pfc5N80^3EAKNm*dyeb#du6%T(cS?0hgu1x{+;a!JP-w3A{Md6NC^2 zAssIM7yYN}$kVFiEYD^%%M+nol7FCd7{Lr(=uZ~?sVQ(ce&#%RSM@NM-VWzr2n0wc z3&}3K<%%?DVq5i6Lb@9YzimH5CLI~h8Wy{IqiWYtj7J!eLo@_%5!q^i0hhtShB|iZ zGuI=N-h4NbR&NG2j4PZCwA$toLEHUwg8g&ygyVMnoQ11O8G~Xwxr$!aBC&yaiwZIn zYc8M}()xn^4Ja>hkQuz$6)XwXfLgoNH@xLiVWn>PRBWcK1Xu;gFqI*|7_D~;%BOJA zdt!H49Q|{`^L;CcqBk{jz%+M3$VwW?<=Bhpt7O6){i>?A2DSOlXivhN@6wTTxQJKZ zN{=?@#4@^uEISw0srZO%kccs7CU_E0*qE4u)VFRvHWeXJVFF^WMZG_7Eoluz6R?O- z>!UrY7tQb~_&;LV==4#byvyWAP?C1imOdATI*XUbw`5 z6)6y0;MD_jkD>xGv=JrngYs(#zxaW@!AT;@>gtJls&{b89eCbp#7sYRGxe6bx6vj>!j8#oMY{uT7J5yj zxxM91#yLqd^I?q#d#|Tw8S}XHCX2_pHGog|k9OYv>L`L>&v^_@)qHeh3!R9-BOuJT z>VV*Fp~&>kMh4QiUw2_?q%O{;A%PC!7Gb{%7%ii(?VUR$i@G?mzYKsI^`{H*#W7JM4;fRXD1H&R z0v6-!;NWF7u`d4fn1Zgqgk3u%tNbAby-jOay)6g*-&N-5$6N88vGRLKwa6=h{f3h5 z7!#-)z?2(-PzQfRf-eF3aBDf;v3J>rRUWrCmpO3;R2(KTq(8+v!T*{XzF@uaA9CsS97!A-we18+aJgVu`0JW zr7QQxE(~+VZ>dKWGj@5XP^E~mZ<3M{HNd20$bZVCF+EL`v9Izpk?}z4-pJJMOTUHE zhz^s);PZSb<`4!Rxr=x4kxw$IF^oG;GDw$Tf zt@AGRrG&CGW3iVwm6a{#1i%u>NUJt!M4oyaKSv0g5DXoa6M3z~w%(VGL;4Gcnn9l^ zYQk@kls9oof3qV1=~&QEg$luF8KvVW(IG_5U?c7(aCa!NkjgT4VyoVf2#2&o(A9&d zoJ?k_%onk(13CjlmYVnFAUs&oIpB7={$4UFAeyH?Fg>D}wX;dcCU5 zy5~uv5o6=!$D;AQN{N@};?nGqSIkVXe3TNz;7(EkYz2@%ZZI7g@LSZw5phI6vxm51l5^xVg3QhZYpCgH>I*R~of$pbvqDJM;#1ze8kmQImUl1KlYM2y5 zhqv^o;Rt0*;|*GI-S^U|71ggq3p9;xo{M?p1;SxJO|v>o!@&s!(&r93C|G4%1)KOK z5J%?DdaY{kOL z3euqFmD)O+%iRDwK*YcJUzo=TL>IpElfrymW|wt<7MGNkP2X zfi0yXSsHDuxqhTj7iTlciJE<7GCbFv>_b?j;qN!RH#<7#-KKDkS>6E(>lAPok@`GT zO#`1RITa+(?}`Mu6tJshC~*qj)F#9Mo<~%r5eyRs4`sMB80U7Pk9fWin7Pk}NCYE@ z4s0uARNr$~I#<=jLMf!?(;GYRJQlKC+6sH})Gu9n{Kdz@NiNr3bPulKJ2+~bY*=yn z0Q1`Em$!T{D1WytJ?yf;^%<>a{oUB?(8gA?0;dQR{198(w?piRFy_PPet|JzRsZfK zTS=s}6<#$+!moTe}cm|oAkWJ}40O3$L7{T;-fW3CWsjvyS=*?2}=#Hj#R8Q+~Y z^YC}{3hE^i#|3`ilO&NgJ~bj;YXriFLl#CvT&hBh`y0S#aR4GeZ*=L)M&F#pIHKz_I4Gc99~gCvxgF5(LzdsS$s~w_sUaY)u6&PpSSSBA$2$zSkx$37ii$@g&xJv21b&&GAwo1}N}S*BV-=1= z+m#CNyu+>96xgG%(=8;8kBzo3; zRMlp_X`xj*(4nUAn(XIcs3?r36bilK2}Y8OI+26-chFk#a9wQ)7tjz}5(egyJs0_D zn9fxC7a^X*u+K9NSZc?VNWW5&f;y$XK$^c@7q6Df_rsY^sJu#q1m`OWjySLQS^Rr} z4wG)V7fBqrLgCLxt|gZ5%C3e$))(&sj9h8*6zA)eC?+3c6t&fhS{@3kKrZHQ^v%dR z42&F^0vwTOJ(}_*K5JI9EiExOze{ku<)X|$kRL^60DMl5<*YG7kr;Y-OO~tUdplrv zjhhL0yU$Z>;XepGYLHbo&`a7WXg_J|1x?sv!jWYk@e)WCNyjgR3sw{~R&|w}n&Y73 z0MFF-%mCN$@EFFOrr8mGqFYSWtepF`I|LS<3C1LFM6B)N6$!eM1 zh8Knq;*0+MB2URXjPeA2Bkh~&0tjsBlCoo4@9L&A64|eKMhdOL?N_?qAC~fv=%q|l zbdkOzx`iyi*MNnUyt0z9;#fBc*22e{oz{j$2GJ(0rxLTP?&*&^=z`;W#lQU~=3?IyONn!+z-x;A37=&!ueiJlc6B}81? z=OpTvE1{5XR#WCV`mf+JaO!0=MmgS`)JV@1={9&Rxm$YJ1 z48>%z2^?NtvKi$cGYs}Ei}d4y2~9vBfP78x4`v=W+b0zUfP0~kcS;9k_K?4j1uuf@ zX|J+>sRa#YdLev!O0^C%mS*=6J}Eh{$k02fF z1~+oY?|)A3k%z3t26}2jxjZzJ&oU?;niRodn@FxZ;8?p!QT4qp96?e_!Xc8FuP$1~ zeNR8rB8)tocbGQQJIK^G89}?6*6X%RVA(QIDY_dZ=gn_+T+cyD`eti|B%1X=#i1fy z9D2|^Hlyre<)_n=S>6)<=>_g=GMlp6V3``E@ zSE*!-2S(mBIGsntDU9vwC#{PsOF!v*S^NfEp?eSQ6cNTC8sd-56qqjJ5RXg?Whpai zm|5hO9-Z8B_8TV1wL}Qljru=uk1}z%CJLF$zJ!K@LQkc*PNDT5kfIMkhv^nRJaTrK)sL z7%ObQdB_w9ka5jis@1ZcV*P}w8098{!0Nff0rh1+#jAN*jZvazqOd#Z%FdRR;^@v? z0>ZKNJMZnO5?~U|q2@^Mk`sR_WQu0wz!3_EibK!R(Zh!>_It~+uI4<|>7b*ixp{7b zkTCd%g_Ch)`yozLzZUU{UcS8|(w6QYfMT42lG*PE@qE9nwOjSY($z9L{Uc6vIKSIES9NRhWDVp!f zIZPcKwW742bS=0kEWicbb9;ag#Kw?{;RPhF({cdG{@b`rMo1Wx?*|)(R-d>_eyqHN z_QIS%f`k(@dqzAh${3)fxMzS%h;XU!NuYz%dsa$ST>rz7mgW>5{FgI8ei+Tap*Zgp z(tXR98}Lcm!B*EILmlBKFo265nXRt7wwS>)RVrq@@0~jFQFExkq3)LI0IyOY!iZ93 z$P4mnWp*azFg3)GcI5^gLxI%|t;w=8dSYnDoW)XHxU)v2%O_MROAr&1; zzn`2iHgrRSIB_JtH~G;_jnE%``was$+SZsbY$chdu<8D> zMbZLh!$OrDmNcZ^*vFeCouy(x#HvB4gsS3>*DXz#Ji>TUXpWzlrgwCg1j2D1XLRjA zfnAq{nQKDXAy(kukEe`<4J606i+qpT&H}s0;>%x8u|9GpCC~v`M<`-CYsR_{67zjY zj^|rwh8brIczYbvp|0K*e#CDX_v01f;9`N(H8E!3<^~4~+ELzrRImJEG-vjL4<{b7 zb<9$YI~{*v5p*#LOkH0LHFO&zUy5R$LVW1Bv{!yHRphjw2y-WDEs*cxPcB^3D3aE2 z>W5Sj#o)qh*Ug(yTN%*G3;`zq2dRA*`GFP~2rNXQ5Kep@VY8IUhMPjLkXNv{Kbhq) zy8@I;w|4A+j22_t{@0?8ob9?SJT z4{O&6{#L^B_a#EV1DgaXozvb!nKv{`hs=Nv74%YxiG$|v7zF4@Gg;2vn{F?9W6~YF zk4O0|*I%-H2-J#%C=?NDG?QMBxFPd%=zJ=t82bO1MvIs{Th^5nZkEGAmHaeyqy_sc zawpdJNCrbX%+W|vcLa^WR{d5OeQoMmf{-XT$Ii()BH$urIWzM81}g)t7oba2NXteK*t%@`xupeULF+>Ze&y`^xwQs?W>zZ6$GYb&K zs|e&5u~uu@p5v)hXaLiN;Wm5FE=q_}`T|)SvFcopn!~6{2Mt-rsXtrA;yn_#=w=s+ zmMGcO^hbAdhA){a+P`Jqref&&%&b#!k17S~D-*iIFHpD~aRR^#DF4ad%5$tW&Nz#v z6QY=1UcZU7u_^X2`l2Y(mLz3}1;I%BU<>o=RPqmfrc3|vN95A6R54rm)^Em*X?LOf z3Nn?uJU!-u`BC+7(M$X=-OQ0W8%wq!tnnu)WbSK=f8R8r-o5hjlpwYR;MUxao@ia2Ph%yH=`3C##P7j7;=IDYAhTnkI!fNUvOD2dZ-m#{JSjI^=P2XWd z;cSSXI4m-RK^NXyx?b-aex(O)m*ouy56bJ7eAMe9mRTteS9KekKHK@H(Woh8f}L z(QnFtVD@JRbaMpKZ1f!?!syhV98*U-+{vw3s&lbbUsx+0_CAJ5;?r?mfQr4hdIIHqv5Fm zg21C$yrD=poLU@h`^8X*_Iu_63vYIkVL z>-#8VUqqo2rBZ6ZnzthE(fKe|ZzZl59jN(-I+K(MFa_7d?864}aN|hQz{-0AWwKdn zzcVZToUbtPi_g~JY#Smou-Kwu58IO1K!ZlA%`+lt5!wri*G+%?=4)B?YRHX`a|@(e zaZfZ91VS0WaW6V?uMQX8zn({-iP&E16 zdeZVhDVhe{d`J`D*_mQ8Mt_jY=uQ(j_PydKvk9TknXr@9KUXp7TrejHiGq_n8anfj z=rgb&bQ!VZ=b@F~2Z9~7U5#l!qexZU$ZRHw@<_mH1`m-N#@GqrY!Im#RRMD^IuG3* zqM7fr5G85{S#lHLpUEaC)=JzRlFfugr_o|m))x&23MUtXt|HDci!|}cm*HQ{q#CwP zVvf`yD$%fmStGsJgy1#fqjvE;MP9rs4px7P-o_HfR0cnNKWUcJj7F)-L>0v@c|8JC zEGpXBZ9H!`BYlttI0#qoX$bvp2Jazjemge>z00LUoZ+_~{9M3@21Ff7(g4xiGkziw z0#Y|o2}QY2>7}p|EFbX3w@%=x)*niQAo)hwP$52t6-~ESJn+mm`5u1_OTI;f^u}sZ zOY%;eJ;kQnYfm4VEh8NT<1g_CO z0b7wd#9Fu%S2{TE88XAV%g0t-CTd5@pfmdGyE6l%tN}i|9zYZ#4T4WGw%=z>Nd~jLmukMWji! z1i08;3AZP^gYAPdpWbv}LkKM=;9UpN)NQcvY+Zl0;p=BSeV94uJGdAKycg_4`^gQY zrsjmnayDPFvw-X2#$gA2m4KZAk#Jy?mbLnM7M!vyQpeTxax61b7)280!nl-~63KD{T_G+#(CQB!&EbCnoH)`jUHNumHs71>i zp;6RLq`AR7qzQx|xsPA7ANmJ+L#PP7m}UkBd4TgP0)Vly;cDk)KKN#q~D}uL*oLO@+61stH&p= zV^vb^TP;xj(#|FCry2RjuGutAjkG>UPtoE;bQnad#w?$-$_%FD&>+n^?~vy7v9}rC z6e2i&0a{%v<7VEr#%IqP=yYS^IuF^%a1GRG>Pu zUjg(KeJl&YJuz<}bpC}%@>FNub0=p+uQMXN zoHrmir&WX$evc6JTQGA&cT4xT$8uqsY94VWlQ^x$cmx`lyKu*p*W)V^hoghvTyysC zlKOMOo5VG%bSYSAWbktB=lwf^%^|TwfOW$<$&?f4pLNk%?v!`Pob)~V6S6Y3#%b?2 zLL%7epPzY4ZY)TzWxQc%Uvt$T@@Rgmq&)ugU`}+4;2kUCRiR!t#QY6ODGLm*eI85M zVob3?6w?+c&zqI@8cpGV$(aMb@X~@%Fri5_e@MKOV{4$y$N~xoq=NijiZjDFAgo<` zQD?B8>0pB(nm%&4vRK1{1tiM;&S7V*Ov9?whnu`}-RfL+skExppk#69haDP8Lp%?h zjr_a$GaNfo3`k(rV{QXMlqrD-5$UsTQt8#31B* ztvkV}JBGZ*L{P}_<=L$68u-2d0Ah@e9cS#n>_)@k7TwL8AwJR1lmne8NiI-);rm_3lHOXFPwmNQPz-4=Z|PehSf zjgxl^8_ytlo~js+Cfm!y!VBn!M63}*cD>(fp#y`~WkYjCR&a(6XyAX~!tu2pvfEm` z-zy3X?(Q95tee3b8_z}KA)9q#rV%pp1akJ=eWvUJ47u6OcfYTs&==^+a8hkLN_HyX zLb7N`6R^XWyVd8%R`tErtkJ2t8E9vD9||q7ek7TD+2r!gle4!X_5gWcQA&VfcX|o( zJ!_>Rb{Jt&Yms*0xG%+x3gD!=sn%z_Cg=b)kSvYU;ig=$p|;QW5XtzDturPaQ_h;g z!JZYTw($dKV&Z*h?<823BcI1-@b2O>M-gy>x+=ISGwegc!856qz45~z)!ME{;aN~m z;QKlF#|d=afh*PCO~kx7bQ}FuV$CFEWsZ!NuI$w485y15L4+x-th(~U>J+H_`(J2# z`+3NE)O^G{(sv6?1bedfZWP)}LA6+jGg{xPH$%W|=@-%64nDdj-9I!@+0AfRSE?8=?ppugk?<@hoFqm$%2E(u|r^yScn7zuN4 zhAP0)**MECv=t?9C7T00t$93ER<}}l-neJMJ%HsYZ$(yM9}^HXwV_2pYOMx4)`_+a zuk*Un*>U>=O$b~BC($Lahc$dC`U|W9Oh#z{OxW-hY4)Z z1Tj9z8RT=RVmX}np3A2p@Bqz1%p&sala@bp`$vJ!0MWksElW*dONN3O!?d8+$gVRw z4vr|G(?@Q*D9Hz^8=9>90kR?S5`E5@hUCDU@zcoTpf1)mkb@fe3W(E-E*I8-7;=jM zbk)&D*yfb^0S-g>BZ;iJ|7^hZeF4@8z7=|fJ680>L>=eEBJ0ijUd@EaR0?>CQ4|O8 zMd==!W*WhFGD zQP&NHix_weCrQ_8E!X`OJ^my`{9mA({U>>sj(6)%# zr2N|SLh)I(o>CQ>F13m#TwdXWZVq5GbRBh&i@tw|!Zdw_0`^szwWXw183PcXXrM+3 z%TfH=V46paQzDJV_$4Q+upFM?n79Es{=|p}JsWAV$(v0dfUN?VzsG^PJKZXf18YIHXs%xwjG z5mWmh;>rjq%sFmmf~bIMO@w0_ATD}BwP91O?~;6fszG5L+4_ZKD<<(KEr{7$kT!86 z6+3J6JF|g)(N~ZVrL-t;xK0tITcaT}uqTpJSJGD`Fb36)kI%z{P<9z9eRC2SnA1w) zS73`DiI=XVv(HL^wEEJ+z`|1k3wN8BuM5=?4M7_GJH8k&Z0>Ktyw+Qg=lD+7w1`Yz zv$oTOOo#8zF{o0Sv?%QDwMM9hRC7d*hPWpL@^KCKj9KURwpmCPW0)%RVlCN@Z`56) zV2TWTQdKHb2*d5Ua&pIhp}fzc2u?5xKrNeN^;MqIyoKfwA>H3+4cg;HS%M{jqVz?* z9Sn=_`#gL`J8@Ge_Nzh)uMnw8C*?x7V-vcahLw4}Yx7;?BSYXA&)xCyoZ0UM;K+{H(o`6P+CI}3C z$0PnjUtrUn$0)tcc(;i&vOi z)c7X+q217jKdtb3nR4=P9F%2|y*$9hgz?wUEm|z(me>oZ5~5iyjl0N<=)g6@T7y|C zTMaz*NSj!yS{ON4UyVrBHM&I=bN705y62G)jjS+wk%Ra3hLJL&!>6c#5d#Um=%xs%zos{MO>10DDTjexve6!v5awuQ0xX3@UNNaRixKK21Rw47?O^9CEC;-R?L9+_qUcqWqv}{E z#S?oWM-~=qeDXC0!TcQpJc5$M?a=d*4Hytuis7u({#tE9f-=rT(1Nts)9N+%Fb+MT z8ee@Cq`&XndJ$$a?U=o0&s0J&O82UQode$q+X0EFt#kxj=~^Nx znFmTi+^DwC|$@#jA#N~!p;6Jd#mBSOxDu}J>ueoAll5C#tLaPNK1 zdgUDf#zcm&JXHt2A4wBdZh3e)PhR`S_9eG=r5O)ZmIwsXPj|Tn^JTVQLtMTC!_8h z-)-gW!56?5nb5Z*8$S5n!3|p}!*#1F*e!ZA^sRgDu~23t11D$P&qC^tDUFLKUo3f> zuqZ`~*@SK-E)~Yd*_@{FidRXodNq4M-!=eGc(S%Mb7BjTv4^d{RSJzlLGVb|U-`+H zn_gs1v2iC8o-a(v%U5{H6gEpR-YWh$T-=k9V2Zaiw+IOn(NN?U5BRQ2+fU6~DM>q` z{7QS|t0rc+8v(pRa)G>#eQvB5h76~>uyE<|t9dJ{qP|i8D7k3$fUw*@q>z_c4Uh3p zmmg$3@^jQY*HiGMk7xNMQUEEksbybvd1b65QcBq6bTCsKo)cdUELuXy**D(w&PiDQHg~Icew>^VhtfElw^Vjr)f%cPyw@3 z+lZ_NWDt@t!q`$v!b`*%>&WIYS2j#J(SDB|)cH+ZT3LbqIm!cT#Jtd)$Vu6-mL=1* zy@WP9ZzKk35dSs#0)4lauu1Z{W@yyOnRIwG#kz_m{azxpzvBsJz6w-1rW*V97B_tbWB0^W%A5D&y-^{4yQU&5agqGZc z*M(*uAp>0F(q5~9u__a9+JXq1^ZFY!g=th}=>r71vin_?kx2JVhm@1!b{)c?$&Tyg zgTC2h>4n@t@zIptnV!JwDgcU@@0^f7pPFWf$HY|Vsf@IUVbz$*_}N^tXOicPbOufX zA$s0Eh0cJaqwiMk7#I+opvRxI6$RIfN8{t#!1APL{Jmtm_SAC_2ztfG=zc!eCEKz% zGF(T9Fqp)Q%#ouGzDFtyv1oH|hrVbTC5&d?-Q3nnhvm6>Y4J8h2aw?&#=~*6V2%8l z7}JM3QP9_Jel-deny$DTk))RO6Y@rEIucqma4ukHL!iM$G?ETW+obz^mZFwmR)F+o z^j9NaWMfICsn!ThJLS;;my{SLe%rS4T4`-wCPaml{p=V$vK&C%DF({Ce=n#T{`w+k z45G++O9qD#CJt2tHii)XGBGg1u0#|nqN0*QG97@M9yK)KE3dxVubl#xNL}=X^_>%_ zDydQ+sA)Fmg7l}rG`#e27rY!1(^(e+1>aFh~BnLb70d@%s*Ml>f; z6S~2Z%y;RWkp3M{N>Q5Az2=Fo5h9lPSAyudU(0bW#N~?Ar#C^ zx)Bho@z+w7IIUDEDyf-&BFIS}=b+kRS|WkgO|=o3VZy15@~paqORMMv=*y-Eg{a<` zBtpz!nM6ObV~VXvfeMmNp@`E_8}#@s6ow;0RqwK%nSebK_hOh(gLS4027g&kZoC005udLORH#R`r#E$8#{96oy|T_p^HpDBmvn85qju=RISjG91O5k6lun z#&!gl`P&)lifP$*b&hqRbwFj)E+Yw^v^_z~4ty0my;10Jhy)a7J6}oa2a7MDIeo40 zO|dNa5!zgA3W!uPd`!@x+Z37B@54b3%1D~rXi@=!O}BZGr^PwvyYL7MVh6>a4KGZKlifn(RaKQFY+$qnlNQFd*pAw=|eywbBSiX&FU?A-!mJCfWNj%Aaj=z5s z-HNnRwy}C2u$Pv9Q3P$>*?ygBbxB(=Ev)j6fP8FdX9%IMC_MQ9bHC{=?k%ZL&$dNX zHUx80q!`T0S7c#wKVdR+oXD6U%XF<`MmFVRJn)cZo({E>4*K4>T%-9>az!d>!NaX`r~R}>{=H)WXmiuVC^ zN|8!FPc>7GM#3A$HP*v=_C^k1Xbg+evF@Aplbwv2jf&fkNK76qx8oWQQti=s$BSvD zh0e^sieZfiYalN2RR`fQ$#S6Tj?vH5G|7Rf6wDiYH?KtC)EQ(p#3^+ z5=jkZ|4rm8^OlUosm$PU`-{_gL+gd^5yCI);U2-(Lt>=QT0D9j)}%O1_cn#&0s+n8 z>qUow!6UOp8*-GdY?{*iXqEIyfUo<4XMJe`43EDXO11SC80JmE4BQ^17 z=u4G`h{6SJ-HHLQx|;1ZXN8THB`XUs1(Fcn|6~)!XHCh7>X^W(l}9tIAt;o?^{&P#RTS@kq*ELtP4pW2^WC?x#UDpf};-wco2KYx0`6m;{Gpi z^@@3Npfhb@CJKysR`7cCR1i*b<(KRyW)I(utX4gtCuT0C5%=;Bo6t+iokAN|Z^ki5 zIV0#je!k#tb&0H{IY1!A*JB1}AEqQ+`tE3f4zF~H$rqVc55p9|o53U{x&`&IMao&Qv#ff-;s12&@_gpCSQ(6Fyd=dM3EFYW0JfVIJ zCtAsM4E+aklI%){X$#92}+sObL9{e;&`Ibn6A?^3@dvnaM7UL!GeOMar z%{X)Fga(-8_LiZ|Si3p-Q~m3#8|Bm8nuTNY;108B)*12KbRc}yI64Yw@>s!pcQOX@G40_zEp!_2K;0h} zrLxw()e4+@?>GDYS8oHC9g$OnhhWQ)sN~y`z9I@f02-TI!{0zVi^rpxc!TU47v&A-A6#`}GhL^O&J?+57FiAKX9?(`0&3yhb>fD?Gp-s1r{ z!Js%YJutn-*h`e!m@QJP*;MfrfFKy_MPuJ$+#z)5I3DApfW|Vl7ubGIgdrtafBdyf z^u3?r}``q zaI}X(fEmD>gyh}`H!6d^7qM$fP42^VlK}cm9akwst&1`KLF03yL{ZY)R52J)2z5WRyM%Y2${rBXv*Xbx%?#(7Qtorst}-2iLfKWEctcpGzCSsWQR8+WMI zokR;ZHpb=L;=%tF+`9_`_?0eu#qKf4&*fQM zKpJ3Vu4k(uNgPZ!{wsXsA)x2YMRZNLoI#oOS>Kb-oaQjgr^%=Y)-3n&FPcXQaoCOT zy8$>+eVk(vTk#dhNxp?Te!U3; zGk5>7BK0mQ)uBX)=7R=RNb(9DG9^)I07&PDy)0JU95Fo?d?@I&{Pk++Lf(+Qllt z=0p*SPI%wk3b`Q!hJgY*^T~|h(=xoP`V;3VjtR$Rt^l~paDXesXBNkbJpzjPIZsp$ z{D8cgm8K59m%E->Jwc6tIDHBPaM!Goifp>s3oO>csM43#>f>~VmFO4|6jzCcpbLf= zmk6CESTnYf`DjR6H9J}f2v_-8RMVR{3RXhol040!h2O%utQj z>GxWhm>lwxW0IBSBhV*WJU!%nxALse8_+woCN_oVZlw_+pm0^FiGNm8z7tLOgSzM| znP+aQmuVSD^{aIF@&b|z(KpQT_!0gK2dXEbQUpg-r#-kU6CNncK#?5oW78j8e2uUV zDvcJ4y`L31l_1~~Md(K- zO%5i*fsIf@6S2t-bZY_2Ot`_Z^nE!$c`Bocr2b~d|H%=#R6NtSEYPKGS zp|Y0!+o`;|{;j8@oj6!2*Au54n$??bQ*uyn#y0M@YvpwZmk5@Ez8>j(d-7=*P&Ezw zsr*ZORF{U)tO&>Nf!z8mv+s#A#;p;vD-(sMA~G21>WPg@zXsyK6kuQfcceBn1Lq!yQx z%gT^R2eiV~dha*5PT8F{wzgKHCb0uDZ+w#*M3aW3S~76KvVS0rg|h?42fL2)T_v;g z83T=A9o?aEV5+M=~UbA{EuOxQH{XP%6IKu^1(R*u5!X|NvA!sW|PS9vK=*jX5z`R9dqDuguMgGiD7qY zT=d*w!{nP(CEfK;46`q;!!ZRk4jH2eFy{{;KDfJrD)KyhJ&j_^pOTpNC4UQIjE?r; zs&S>V74>w`N%{Ql7(j~s1Zz@^=}aAl8sS=(#I=j$sQui>4eJc^kd90jvvcvhdobR( zmIOip8GNI-nBqnr>Fpx|i?fFHz6O~RmtG3FRxfS?oCa1_F4^16=zf5M5VG{76`^dc z6P%@%|=VraqAVPH#>*Z(`ENe!)SvrEQ&eF;1JK?2q2|( zcP;B+s|SE;fE9P-Mr61D+f8}Rn+Qcavx`B(qea6JyTdbA|1|g3oU&2L)Yyq8eMyLx z!n+BGQL`|S3VcfzHp-)73HOQIe;=3g12uv~v)rVB=0R>71{S@=$u^W^l+6xWtV^9+_G2 zOcRC`lCv0pg6~Z-Gi_^*cZ`bM)2QExb{WrTk$rB)A!g}hjWmr}xUfpw{WCZa5k9f> z+&)4vQ-|Q0$X9Tm``3c^uaFKBcsjzA9X=hIy;vohVvAeLK3|tRhmLqr%Pv1kkJz9N zvp`?o%pB1%A3WG=X}p$K?vQ>1&QnMv3d>Kgvq`j9Y1g7pW1Z!vvRVJldpLMMXM~RcaM&yC`(g3I7 zn2}Qu)j8y4wYunYO|feio#QN>hb)0yw_fLZOt|ltFA_AB3YRs?EUv^rGrp_hH`4OK z+@mNKiW6_o5hdrCt}M|QAL@&J8!v>5LFQgzUpghNmSmf;ynOc<=5LC^fNU3apb#S5 z{92L(ci58UpmzX_8e&nbztG*(nB6hi>Bx!}iy{h*C=W3t3N3&wnA1KKk(O;aPL#^2 zfIfVlJY%6KD6rakiIm{vAT26`U4Ip)zSw=Q|5_>2)9_D{e(8VcCZ>Xv z^M|Mc3Kq$yVyb|vDo;3QS6BY=e4`Dgfs50n<#NT*2S_Lt{!bn>$9HKxh)6saA_S80~6v zv6wBX4veKUG{_H-+!p*u&e-c3hpT=XJzs_!z3eBgBV-lHLWgskj4iYN@l;c{bxQZ% za!SE|&f$cEc}?RTmUljFd)jj!Da+7gfdpEFn-*2KGElj1#or)GsmY3?m!v3kW8jqh zD5s`QjIC8}(f%~$%#MUilF+fvAH1HhLYy+{oslO&a05-&?~(x$6ptYW+5~q%6up9$ zEz6CVR-Z3Eg>8*X_rxdDj?2j5IqnUys^jgWO9eh1!(eklr+O~HSq2g4a2Uhk*eqrW z6(l_PLi*;)*%Ec`z*?Pb7LyM|JUXm+G1&jIs#{vsGg&u(Z(IlDVm%lCRNCm)&`PG$zliA!Ja5i{^MPGEX;)B+J1 zq%;-W^%Kb(`tkk4SYoJdlSN0bwc{!i#cNA6zdX>#&W)fHaFlPEvSUz#Fq^6Mx2e|^ zN!zR;)!qzvH5jLm<(5>JK}{i25f%{jb57}SRm#K3$-KoEo0h+h=}!|+{!j|%JJ~A~ zP+J)X>!rU;Nji}Uc+5DDg+rDrCn|-~f8Xs@NeoSy&x38Mt^YC+#oxhMG}C8Pht;hc z%q|5gYCKL{h8a?DX-{Oo@{m>DDqYWDD;Tzbc$lhRd8ZaS2 zSPch?N~L;*Ai1-y7e}e7X%S7{_68O*4mJ7WPBtuNyKn^?d4sXJP=_@OFhEy0)P~%r zw`cJhlC$$ZwEk-IhTn)?gb*XE9cVoraWGK)efyluz0kUntq2WyF@hx>XuPu#*nU?1 zZRM4J*tQlbyf{Iit}<<6WPw}o+jRP zv)p$VIr`DvawWL6p#{lC*hPzaWhbk6I~2s(W(T6TnNGH@UWlVDmy^~k*Yb{z!1YgRl#LNDt@IYw)ca=$v* z^*j8k5-0x%%=1J(8vsd-CRmlH{D;v;ymYN85MibD{kCwNe*}}T_!Vj2%E_S-&IINW zsJeF~s?dL?4FP`#+eU6iJ_pcPLqeCDXrik$3SL{BEW{7RFIN~AvFK#>wyaWycvZA} zx5O4qci#JrGoH~2-rJgfsKR)i?2_+M!eo}K{&KoMayKTvW#k&RNl^!6rQhD_PPZ5d>jvmf7`C)iKD8dx>Mkd!fD-+I}lE`G4 znU7(9Fe{0=M(e8Pnc2|(3==t^5#g5Lb)v&y9)bfqC!0Rvr66VD?{+1}KRI!{sKbHY z1zXe_EIDUQxhb=r6Ga$rQv@YZl zi!1^geGdIdU1Y*vfI%vIYvc%uH4X7I9`$}6*nUVE&uh#)$tOopZmfR}ByO6{i^fql zu{Pu-F{DV04}mHvdp00Zv%#0K3JE~)F}#yX00UBzo(*iXP(P3G-6t#IF3mh+K>;V@ z)Qo3--+w{26Zby+3iFBss*f8S{Eo3iL!Ccvce|;187kFEt5OOQp|Xo5ct5rmd~X7Yu1?0Ztbm9-^MjJz<)l|?sf^!Tho`<)w0!XRzuD|_MWCzUz7;g4!7jZWk{on>m$O61P zP0w_EuegH)t4GPzlmpOr@`No?y~o-?=bk@BPBLtlb0LJMkQbqfUd+XrAgL#p>=PxH^aO_)j7{~2gh>wbU3J1wiBj=nn3OP1U6Kb z^{)yY95*8A0@1&KdUzq-a`UYUMZI=*BPNVjh|D~HL7vAcG3h2{ybi|>NIb-t@7><) zU59Uu@ts|wXrS#qb$uaZR;U}seA%14F-$$N{Y;V=1CN}`az zm;AKx%hXcbHJ^smDRzirl@r$$QVK?@8;&E|d4RLve)3L*0PNyl;1GslE;0fpk3!Q# z{(EJ}q1!&HN1`#64Zg(_9QUEF$eE%&4JawRFpjGn;=MuwhWs7kV>GE4+W5C65`QkM z5hrbK(j_=8Ru@&+)EFJZ184jMunoPEO132AGJ6U=ikO>V^?%3gj7g z9myYvzy%FI%Wry&{t8OM@^DE|yotmDPqM>eMW3aZXmc{r!fPmER&I7Ih9X1&;ZL6p zf8A0p$mF=^}d@6;G$S~#2ovD`vF@e&lU66EpPm<{HYB#i5i}C z;^8TN(9$`y;#d%wBwngEEV7qrTX9Vgm);sG=gz4?V2#Z!sykb}EjGkv4we-Xii5WBW#EUW5=>QA+v< z15ay1FVT0K`RJ3N&d{(ZKPQMp1d9L?r|l=h?T8CjJ);!X96@rFD#`F?{JbSmMf;LW z0}^#eLt3`SzxAF=%A-;PLtit(2a&RU$jGP|VehEqL9yrUR z!$msF5158gmaO>jwoAg_FaN*qp42W*Mce>69;%eC=sXIhvXn*1kcq4o;^ax@UMCfR zCcAQNJ^0|eW~{B9&;y1HI6vmfWdWtMmIj&-=O?T2C^=^DDnLQcYgVKd+926DC`&sS zM?{*tYA>Qg>^q-W=zRs%mzTv@n{K=LrNnO5H``7E6=t+bC5p}>&!Eq>K9pxF}Gf& z)<4uO5*|#~mA?18_&U6Ho#GHjd~bNN28d+Dg+f=9+^`o1LK6CsI0N&}h_z>^!(Nod z0Eq#sY)wT0mfxbagfe+1k&WAqg2x){J$I3!tBlznRwBa>r@RXyB|0qfIx3fZTv%3> z{J3THvJV4Kqf0(eI1bMZ#)T8*6QU5! z&I-vFC&vgpth8)M8vzI$tD-fCz~j)=toZrH>pm}(wO|nLHbWU>SOU2>H~}u?3P9*; zob5eDH=8Kb4iN@fa?z7lTc1f-+{pS1f-7(B*11vWo z*s;9Ax5mIS=nN!@voxb1Y$UZ?NwwVU@g&ScuPOyZ4>;{ae-657h`ClrO7M@(*I07# z$!t25$>Kx?O+Nxc!EVWFf|^wU?Jl`NTiVKDhNFzvy@a^9?o;675al!rH)Oc^!`cWs z#xsrfi2$#W*lIy7GaayblPpdFL@T*Xc5EGT6 z*ZzmpP^3RDOEAubc$pGpDNMmt0CW#DJ*UY?*fK1(?Yb4(E9!A7qn6y^hYsb4M%Fm+ zZ9k^+BTdN0MQ6wZ3vs?K6|$c$<;dJ?Joq?1WR$ZU2HsLJ6@Pw|5%WFfpbct7fHPUb zTl}49#<>~GM#J&@TgFvlb}%DYZ6s2r`^eqJjX%;dN8Prh+h#{hOA0!cR+%eMT@8zR zV)56gAOE3d+5~6TXfSg?02a+jJp?=7J0#IRWz}XTFukHaL<4m(dbz}`yk)-v1sNpA z2L7U%ABBO0aVk^m7N_m4KHLCksl*UwuH}}O$;erE;Ey95Y(;m64gD(&K+<3we_#f! zUK578Sp7^FOV|}fikS-KM$M4z7lPC{#~`LIKMEfl(hcv_mCCGhZi~V7P@P$s7SJ@x zs7CsgEPRtcGV}0*!5gJ8*65jA#N(-B8?-q6z??t4NJW|{!aXn7pB zu9qGcrioMhO}f^ZyVr%!#y` z^)meinkLK>Rb5tpi#S#x${-Mio*FlyCrnK2du89kipUISB%5-TV5;je7lemp-XS!R zCLRkOB^kSXBh*lIs_sJvUt$4>3I>+fW2eIx|$Bs4NPq@6)nG=^mPd<~P}YBC8i7eb~utUFW+N|*Q!Ni^u)fFsSt(Su4~qbPy* zTUt)Mb+oWiuHHGDha#u*Gy6u)abZqv_zbqvKSHfXUYqlDQEX|k^cR+W~DHybJAovA5l z2A9K%U6mu$+Ur`1fO`}lq?$P4|5N?9D*99lzrz@g4*D()Ejl;=GgT7!>=OWAA!ou%h67!N ztbCETLcfLS+B_sl(j?vnvSGezbY#TiHOen%DoKom;Liwa^>J}<2q2QD7Yk_Bc#3-y zUu&y3)@Tz}wol6MfI@JjZlszvnX{Ig=!hy1uV30IC-HqBW%&j;Cg^nuxmns13fp&8 zhop?urBUlwj0(uAc3>50QbFw*}d|NoSZwuIQFrEHM|_LmbxE+Y{UA%R<= zPi46-4LTw{8#=zv)X!yP9fBYm5+nrYa;p(G-{nZmPg9wR8XO52Q=CyAJro~gQ>b>I zK6JL`D_A>4DZ+&I<0Gn`O0VURd`QaR6=yz$p-Pq~4W1KcyD!%U>mOboq$l0W^0UqO zjZaosiGmC^IE7H^2F*G=elT(QWJ6my39dFUH%B{;Mf?)gmZuz_-BGlmiXnJ## z=}9w|);mm}pw0HWEawm~0nD4Btn%b|cP-Ud-kq5^3t}9PDs_&QBU>;ciJ@TOGzb9~ z)_t&sKp9PCBO-Lo1DxU@K>%}Cmis$y-w2Rl61r zQSOu=+PRCQ(e2dauofG6<|@pNnMI5vF+xZygL9Uz9_0>#UqS3HLAEX5?}m_ODPtb< z1a^uRmP{$d32GGlItYR&%V}1t1wtkAzLpKUQC3a$A31D3Ap7@nk&mJs?}nUAIpuHJJ=?Amha$u=@l4pOaW zucgjWq}H+Yjh7O_Ne*Hw4@}!>rPO96Q$6%E*zYqlFF4~7cn)lQ#Uj4M)>o1hQAO*9 zj7b?G6F)=YB+vNcrmF+!*r0_n)Qt(z0=aVZBPElbF0bZu>9ArrmNE}mz>kR;orH{a zi&&>f4yg*w{=P1n=ujUuj-*o-R-`CIGLhjCzhrbxK~XcZygv;ybH?vUy{y(PP9NkC zDcG0OIO;AsQY%Nk{9TOIn@N@LBP&89A%=t5N{R19v5Aw0j4lrBH(g`Ux;N^0aqwEJ zFI^FnA{0O>R8L@$iIvV3)rPuLj4HfCroV$0qOvIQT*UdAm|?P{S@vioWZ%7dKmuGp zQ_!Cji+zVh0uiU`ruM>7z{G)^QQUAVX?@(n>}q09M-vTSw1VJke7}LyBB!AGxPA-$ z+P8TU$QfzFK>O*+A^v+}L=af@>O3AjI)1dgi3T3XA0CkL9;7<@+ zoQLC4%n{E7t-hl!`VNY+NVQalgw8EmqTCHBrL8gCT-t|prZa)$2KB?)E3?MKV#S9 zB!MgMlti8gjtUnTE<(>)U#FVFZ!0zU`#0X*X6aHkGvGoBBxWd?%OigDrX5OW?CiGF zHK7fbctYmoGyMcOX1<~UFFjg+cKa-7sLw?2N79^}}YtE}!3!HcDgdXa8Vw}zP}hSpri6(ZsuOQeex$Xp{- zr3l~AVvtOM#U;cm0H>y<1pQbxt8y#9Rd*4+9xHtTl?j5J+5Sw;4X77v>^xfi2AQAG zGGnbHyQR}X!b{Id7ZWp$9*ItlJ|h2|qY%f((Uhr~Q$B0>Fs_4$Qn*Ku8ZBr2Ien@6Oyvz^yDtl$qmKe#3`k+#Owlta0Y@#_i z)VumBazAoAT$d?3-HV?dlqeL4o>+=*e=HbXG8y#%92CvkBfv`lY21Ji?q<(M-=!gi zMg$vCYw5tB8hLQMn;g1pjXq!hTRf3ac<{r`8pk2@auvTP&5BcZa#EmJYz4ca+a+e; z{8(?u!{o(cm#nEDEp+D@o-{C{I}K6S(s-DgAg>}xp(PkVtTd=o6)oV*P`QmPd$Kb! zN>o>6s`|1cAto+*C|78}gt<|Y6V?mtX3Q1GaT(LW>o2i#N4(xmuyam`YGL!@otT{w zGFOvPg9!Y6!nPuCc(q$*aU1)?1A%jl31^*F0bC01hN5o`uvGoJ-2 zfl93imNWt`zDuogVj)WJs>&(n9+j3s934G2s50KEzCfBUk`Lq_ zwbG8pRiHsBY5z~89r><ds-Vf7QCfyTYt=yumalG6)j*gOPNN6Q?Vp>W*T& z5K9^9N1xs)iC>&bCP_hIKF4hCsZS&mquuVTD~W1HSVoNGVfnVTB5=GzLyXkHm-2MqEMoyvXD zi;;s!W*(D{6Olwc8v#Yp&r^ZK$aikrVLoEp-mL3K-uU(KzVO|Ulk!^vTTh<1@h-t#Oy?&f6RE*?re(tL7dt&!is6!!7PoT7dFDk^o1iHo%Uhb z_#C_LKf9PCm+96>wmNdR;*YMo_kX?#PMKD>KZVY;?A`q7+o)2lTwnAT*Q0OgAqw2d9s$hPHwNw5v zhq#uv#*tr9S2tVs;HXs;!UYr+thyZ#f2(5QznA>`D_nrbz{NH;-19y0JW3MC-T)&c*kk)Fp7Y$h%ZI7s3r)@YKO1IA zWPUqpS8CJ_UI7o3&5-f2Fyg*STX`vjc$%qIQSdnq1bYLe7S>`&nwEh04==hoh`;S| zGUFUFf=8oDW*B%oeU147wUm2z;c4@9L^B!tmza!9Y873DeYYpqhhd})c@WQ%b;TQk zdx}P9o3B%}q7MmTyc>6_yhVl{KYlh)$z|nXo|y}s465?oUu&RmX>hK5EetMiU+001 z6&FJQL~GBe{5?S$xHqtNku%9|q7srLp3^K?81g6&!VcvTq`zXeD@{wF$T9R>l8N-F zI1m34WkJQ01G{^q2!-l_48Foh+R4f)Upmn5@9DoQG7wZhEm|qm?VPk=?wAIK_g>*m zhf-59qv?mxah3lLHvErzaa!3y<5Z?6ZbQQF&sHQP(np&8&w#IE97q;SP0mu+V8^0u z!K1?yWaV!zB;QCQk!&9EOA~+oJ#k&JnRlKlM1aLltqhwsgx>+Z@B+p4YWtQ9xS0vL-Oyjn0cVALLm*N zNFC2x{7a;2Oq{ffaTa}@r>&%(#Y_ZS;m#X*3~SAl4v{Fm%9E!M#+wvROj&nJWe_mg z!AxX>R^5pVlz*4#Q)c(XIHpxWv}>Z1B)4GzmfJBJLmB$mws$1d^M>#%zoHfGGl7+5 z#enZy-6}#NhFOG9_BZt8BrU5f2;YFiF=kas0tM`=Lp4qvuh9VejiCZ>_iA~l7&?8S zKDwOjO5V$BgMZ%rt;51JKk0Op&at%Krla$Fl7Ui+(?e85jZYi$(IYI8`0e}8$}8jg zv@o*op6oNSW7IU6k>!m=lfQfEvxJQRT}69aHPMVpSeemFvRa6>xl{4SrX{M^ZR_$;%HD^i(wz8OCx0z)ib}!x-HX#4wv#mtB^}^ z`G@L|IV25SJMZN-2Nez)I(s7Ncj=n=PF@Ki=bY0+Kvc+jYS|;Mp;* zr93J0BW+ffoHA4l(`HScC&~-enA%z!gOs^1dav73F&7FE{x|^ zIiND;j04iLtr9{PSGu!VuPDa|x+55rLe&sS9ccnp(F>C~E}9331_bVmcwvwV z4m&DP-alpv4eu)!(}^6{e^g&fJC=%6w9Io_KTT4zLAf_gHn+#iIAT~xYoF0}9ci!M z1#1M8J~kK95m!oeX>g%Kr;eu0_FDeRrQ?NU#a?+Qz2*hqOJjzXl<%-xG1_=ZzW>WO zc_$7SXUkC3ANb3eIAX~uJDd=kximLwaR`PsGQrfiD0{ zu7Gu}Hh9<1WZ*YN>s>l;uToOMf)*Y7GGkKDsj=1sLMuUZl`*?=!BC=ukgSU2J8@D- zfJ)&k&;$(4cZ|u!_b>QAz%yo^QyG0A725ow3TL#>sNx{acfPfhXwk7Wb<&kr?|UsG z}*WHLF5!n=EW-)ozv zSI7pS2KSU1rtVFA&_UTrH?gOD1`sdlU()HUmE+DOjtkZ%0~+FJit++fjM}T9FKlQo z8I&4hTc|PsKDk=3C?X*SZ`-v+l?Z)1V(DFxenzTXn`F7v&6A^R#L-mpjP!5S;76G^ z6vFG>9?Xm1-Xhe&FztaFH)E-Kzfz2N+Q^E;tDZiH^ zI9;k$&J)!g6CLB!tE(kxiE#w={CotTU{i8JOJl&ez&p`KatmYR|yXU=oX>%twoGEo>!W=RpZdDEBi#Q;RGKjJ~HV}S z+Zp9GW_H}f0Jw1k^Rm;oU#P}6RL)e&V=j-iosLp8r~SPvF-G}$x!&hdhsbZn-n zh9jpx9ygsZA^_C6KDksojGuErQ|#CnZ?9C~QH5=cN;W;{K>L@r{X;HOP*J|8LHreb z^NN=L7W5wUHTr%FQ~ebn4JIxLI_7^ za_Q)T&8kQF%Jnil5#%R+JUdE;z+F&gO##x7d52@?5G|re03|`2ZRN#3%%ji>)Be0r z?~e2h`iDwkIN`}I+9Wj#sXYl;d`q>JBV#N0m>y{fx(!Po zV>iOGXlbnM2}LWne@FjY1hSR`fv7bs`-r^t5&ib-%a4Ja*`45I7HNo~&ym(yI6! z=<~zJT9%g6*i<+~Y$6JALiYKrnN zDwUynI!&g&@C(rJzObw)?#n)G+wTAP{r?BPIHLqr+a()_iTw7 zL7ha$lzI8fj|cd{R1xLTJ}WrFY%*N7sb)t_RYM!nKU-E66VDm-o80E;+cBO3LJh%? z=#!c`G6#=n4wg*47X*x>Ocl2*-Xhbts%OV!>Z#a~ZZo(ZGoqTU+Vq}AvkH}+VYHme zP!|$-r7m-=^F=F7q5MFca=7>RsPY>@+OdWR$T;UaIuct&=luc`=_$J_CY}edsvSJH zqbl+c4;R2-9*i6E7^L-h;k1Q!Ua%dd1Cn;%H?SDxIiqu9YgMUkJ1UGk)J_hqoRMbV4m!1dVn@0`1jdanUze)Ej^WJO zkqY9eD7U=8FZwB>>y`aGorWEUyRaGv58>+TWm*M z|Kk?LMZh*|-Has0g%SWfDzKoHQRP$#Wy?>*F5!&&f4FVT8w!eOY*_6hPqgGr^So|C zstC%8NQbVN9{v?ZL%HtONrQ!c4}SugJ1d5g$j73<+wEX5dvO`dcsyvP5ovlp>W;80n>$VDd8S zk%Oru?kv_LXC)$?tMN?gz_c}y2h6zJOqO3w)LJm3QX#;#N!Zu7fH!G$FE2Amkb!xkXz@e&;o@4{g1O7h8m z5qxM8ZLslg4>{BxqAmp7mDc1oJbgaN;L=i!nsB@mAkbt5xN*)MULw+;(2Iu`A5#+Z z)PCa>)HOjw(+wlf8}bWR6}oNhWj(qK6hYFCEcwF0abcU@Dg5Jfb1`jG;FK5!UJBOl z8DpJn*P5~lu+j~<-D!SYL_u7^1i;zdFVM}J4&S4V*E624ZA%Cty;b4Ggd4iEeTJNJt-erd*$X}MuL<-;xX0+WJgL&A z`$j_(OSeVW2>yTFbPTr{ip_;5ah_U-WFiV`;*-ZpF+0D5!8{te8Fz6S%L}1jpXlT9 zs;1WXE9*=&S`=A$e@FnEw(!9;kjZr0$Tt*DLupeKnMuIMx>E3BKrySaL>yA$q4CfL zF?tQ_6OrVe$1)V>^#D);w1{ zZKHx%E}pi#@7<0*%#y$o<|TgDl7nwL?^9T7Mtt3Uk_5LZnT*GqCFQ##0T>h7?7M`> zgs{->-*g;0No;f^_4RxiJ-Lg|7+#%&_Q4s8CmnUIfNf)ba`fan2Qz zMxCbFcBe`JCwz>xgN;jWF#X869=orItwoNu<{BwJW~c7-u_f3Jw-H=sJcd9a#UXtm z-|87IrU>G_bCU8sNKjMp zjq^aKVi+YAo)0nC?@3*eT51ZomY)(`TYHcq^Z=YgIr5e8UP45>B(-+M$wer<9W2R4 zZc;O9EFO)3NoxfEJv@>2pvWjaB>bgC;%!zY=u@xpQb4T$nvt{%*^dDd0HLuwIo4~O zF5VHk-RW>djrQ%xLCgYrnePRp*PG2Qa{6dOfYJ*ir~2y++Y*~Ree}He9gDVN-$`|# znus>5rCuTmX8|0wj{4%9AZ087Fj#3zst&f+OAy3rwILPR8M2KyaMMc%&K#hi|H)*! z)R1RcHfQtDMLUK~AOYbknQ2LcL=e0Y0#KSHrKBf7Eh1hLVv4@EW0X+)RZkTnWrSi5 z^-xc=V^x0N_w@|}8jBAg4-Plt?9RwCskA5n*>I)W)vt}naO3LJ7p68Aj39?)uwvPr zyJcJEHS=T?T4xZFHG*qt`lcc(g6ZxtT7nZuGU5j^jNh+!qHjRc7)R@(C2}*&9K9wD z?aHL7zsxRD5^2F~_Erlh(t5omQmSCH8EwLojKm!sh$qMfhPe!&9!QCu7*#ZJ9gZ>5 zS6kBT(;5a4@;x`FWhSIvZNzAUxXUCnSGX^ok&udZF9#s`95r<(^}1+-J1Nf-hzh57 z{^X2D`TOU9$bdN8k8gSTu_!{HRR;53QheuS7QTq)H4vkRE5G=$>8PHv!gj=SVWHid z2pBR8zm*}t%;!%9iqd^0obDN_OfPhEu4i0#%;P{R#KnSus8If#^1|d~$RPM;3RN`T z#b+;)iwGu9srg=_kV5)B6qL_B?NDgOMS5T%frD03Cu3efn$jfv zLGazV^#XA`xC&81uW8BVmV9n*^6C5qUl8^2Ri~#hu)Lgr_de*T0pgy$Khd zdd?sKAx{ah>$e6TX@i+^aInTi_5^xMn}J3KC$Y@@=LZp3xf(6sJkLy{o(+W)!&;i> zwbWoOP>A!ViXnq7Z3@Nl$+}vRZa>ijuQKyHu4dhTl-h z10iZDx{peK=crZfoeZbx;SoDd0KPq4I!l~AnjR&N$|SvVkR%z0r5Ful{UIh&g`)YP z`Ij@Ej*}QtG+t_9IinKR(Fm0pu2{wytJR3EF8ZE?`bsYzqxfUm9|{Fv5N{|0>~_i% zjHsYXr;{t#R9OL~p^WuvN3sw|U_nM-{Cz~yA|1*`=*gC>D)o)Yu^SN_tN}#k-t)`k zKrEnpYYtNO@ZlFRys+?5lZG)EJ39Y8r-v4yPv17l9f8ToOTV1c#c!O}2ULIWY+Vbee!J_gF=DB(LMQfDO;5n zT(NHEuxQI=%mIaH&7o0Zh$%6p^4H0~@$e($uPm{0Kq#%)yZ5mmRAwwwgOu-@_ROlf z>bA}fJ2~}?DMY{Z)d z;?)s@CKyvCx7#t$)RbBbRjh4a4c>E&#$1Dq8u4mRxgbvqG($aTbA>jBPL}m8(NM!r zz}Xf14Tc$#3+cS>h|K6>Ph&LnNc0-h7>)G5YfJBwGVQuh*_JhqN(!bpYOB3KB>L6I zmTzzM@s3&soz`CNwCx-4H#11?U&?7<-WhC8}Ueq-W8r=`VJ(U@G zM^ng`9(Lx*n=VccXfH#{fhAhL;QZ%<$;?4M{uO9zXYW^yLs)T&I+f@CiB1_haQqrH z-y@TU?%+~;n;!7-cR>%mwHv8Y36Nlycq3Xacwv8H)Oivoc8E|TXcFdabRj!>Dit{- zN>GKeWoN{V7=DWKLS-=?&|<=LXUxxU9m(+N_djc}0EnM3B1X?x44OtA9A$aSlv*1I zy9|j(o?AThI>Q4lIFgl42kBV05+{33C5*3f9hy3i$$GS_jyE~a+}{ea@d=_lggTy> z74AOA#42&>>Mg-!G_?w@y$L_qPYbkdY`UQE2W}ZQoB)tOookenX9XcvqYzZ)fV+6~ z;(*ImJ53sZNKL5?^Q26)DRzSLh4AB>3YT$|(88r$C6qsuK1>=>{(cn#6j>|^+0n#% z1^=HF=cla(dJSF+a{D{HAHZb9R3=OrEqG+z^+b>SEsDav5(z(x8&(Bmph9ZJr*UMr z5F->U00lI_%S}xR^u}98)bPr9QuHXO(2opadBsd5PwSKkC7`3bnv0$BLig|IsdTAN z@<~z1`Yz|;31J3}4pV88BO=zEU?({V!$QMU8~e!Hx*60rY9jW$-9lz?n>5{9YD>O# zBhV?rggK%@`JwU0Bl6m$PkiykZnDyLy>KeA67rbj$i zG23HCO3VU6%HuJ+5?SaGyJA2$fAw@XRqM+Ad^JJ4PuR*FX9)?etlunw7oZ@{udM#9 z?tC(cH)a3ef>IaUl2NThv2D9;<=0Jh ze+5)BNSMO0vN5ul$x+&W?5_L~v@g51CzrZL_urN67%Lc)pZG9n7Oab~w8kq?fTwdB zs7vy$o|UFMtvVw{VQ`lF{!MuUcc^z|c-L_1E|#&5?g(D^D7jh`N%}!y3gZgqzom{( z2yh;ZieT@J^uZpTEAiRdXXZ*0LmfQhwBI7%cEC3q1-4aKJ?sq{K6!CaobV{i|a@{2IW$ z8Vz6wy!q&Jl4(MMf$(&f5$9^FtpvAU3;~KGLGifYIxKkTDpdUbgA-wa62*dNz~AmV zENc$MI_+r2>mkjMqe6mbXhyR>z$TL=wn#2mjmQU9YGs!c$lO!Fe6lUyuOW5{p6Ix#n ziZw7v5rO$V%Ms5D7*1*$*!mY%D3GZV^dlMp;vM2S-JadGXf$FsWT1i);dNR$`HTL~ zVHFz2PiCgV-1ib_nbt=}E)2P+&{Pjsv+E~np2L6HiPQyL=wIvG3KqvMX_rwU-S}GH zQ3+xLeTOy@PJS&RgX1Hy%M|+8Knh`QB z^)}zeN+=r<;{YGV{cV7g@(9orHIFSkNIhL8OliqB!rZpR6(fdX$qo4Z(KTNi5*rW0 zVz%Sb;=H_#Hqiw!rOAON{XMVSQW^$l%zKmEg1SW$QT~0&sqoqw*>+wttRuVrq>M6+ z=Dmc_z)F*Gg7|7s!7p^Oeg?#Df-R*pU+pZ{OsFEKdtW=5@Mj{uSYB9eBXPVXgd|x~}16JiwDPol$1=3n#yjRfM<%n0G%>H!Bb8IMCMN8)D2`oa#ycqj)<9ACJ&ER+q z+X|Unsd4<)u>qA010y5>Ux^-qZjP4fqw_?T9Ag!cCJ;-ZY<0qEg@Fcy6DZ>)#A*ms zlP2`<)Ft&EKeNvE0uh+VQ{l?-=@l^WYI)K?FR=EWuRe{DG$M_{WZ*k4>9X}#X|fGo z)I`b{&pDPNU5YZoXhYl`Vb@X$bd9QYXpa&0S8XtaX8oXqir9y5`%tJffWGf(glT}G z=w)rwP;ErkRPXRN%X>Zm-e-|lDfO9x>Ifchko{z#tL{$#Bnu2ozx6LH=pur zjbx@SJOEGBqBYJ2tP=dqjpZPO)M7jwv1{3yF^}d0rgU)6iP@AuK;43R~PT!kybBvi79ywytD3&ZsXq4hEVk2RXS3-mg!a~%msTB zn#Y*BGbcan^Joj0A--$RTwitwFs`lTZ`9s_J&w}~FIi3JuI#Qn&r4BZEfu9`1{yh@ z1+jWe8NLs*Gbx(Y@6{mYs5qt1WNy4xhgRTnjPI~HgF-5<&LAxqVqK}T-#!Hrb)aP? zqSjPf>cqS_kGsS{z?I1KhQng$7<0VpTRPa;6YXiWry7LTXKbFSP{8M|68zq{AO$~ zT(Y(^T1SDf-w7Naz!m2v<;ZVt@#Z!`)1Hq#4=Ck{jY%q#H1fmy+slzDs~z z4n!P?J%QihthFt~n0kml!IJVIw(+Vo4n_|sF<(v(V?0c-lm$T9vgB9!+Q1Ebf3!=g z`4ZHDOL2M!j%9~!_C$6>h9_M^IM0^mn=Mg;HqSZXX>fQ0wLo1%<-K_~OGXPqGckBL zyK-p+b2C31SjeuYSy{gr(*LR9!H^Ji@N-O;XkFH5#5EKr#ob}ER zM5Ye;6z1+}ADG2jyb61QH*q6vf_DN9D4~5v-NX@?{&qRdv9=>eS+T>dV&R_Dn8#7b zIW|2@n0P$OWsLoUCHYo9sqv8thTyMgGS9$-!8GXxQ(1K(3`agdX9NTBO6)t^;Zf>g z3E`?W5=(%l1&o3P_9L#5D|Ru2*W&(oh#Yk&Zt>SGM=5=~v*Zs8DGpd+T;D6(-srIl zq0q|QXg{-IWDErCfRdWIT2zZ;!V`po2iVYFFN&V}l2$2miN}#TQsKhHp=N3MDotyh z;Gjm!F$58aL+W8}O|PDP7nJC?);)S=|ACEiS8W*BxTeX_BR2b%_{n7qaM%6aJjD=N%XHUwcZ-<@uwQEiuwk;b!~RRS@D*O0}S1a0F3?)REVTEpX2qA$_Yg3>f$oUuiNPlxk>TaMjiu0k5sY zfpNVm2bl7|-}LV*c(`FtWGLBFpsE}nIt-g*-tu~pTW(J#{(P`1yw%go2t2ybuZZHh z!M42B_BqpNwC^ikS#Q!W_jHUmfn7JQ1ljwek43fE+U5^ z0lx#L&Q8YAgPI&tXtcT*RB?9YX2G|NgjIGZ^&oK@)7e5V6`?^kq~{>E!E}P6`|+d0 zbU-1DAt`^Rb=8(|T#Q_mWN&aqa(gJqV2J@+dpTW2ggNvUwDv}RwK~NDo=nLp0Vs7d zK?A=#(p8e*i0w=}$I*lfKk6wnpRuCD4R07MtxEeo9t`vgiykw((n#x%0_qeBud!hN zQ2;?ezQ43vB|*9jAYs}L-AgZI1%Podq>0e~_%}?B0Yp?(>MQmnsU&Hd(bqc|E_VG1 zHN;rU#6SS6jVNFtMk0uNA__r;HTNh>W_dIk)OtcSH zT_r!v4<7hctI+8jOk%yjYz@e)$jvn$xfyvE9(Z0S_wPejJ__lZN?WA1W>g=a#qkK@ zB5Afb+|vxM9tBn z8g&G44KvLKcuH*{YB$(ySZ)bAYS7BHwsnLGJ(zHcNE@in2=(b9f?DR4uLS-PAI}os zpX~Fyv2?|0Zr~+~52Jjb+@XijYHF8mJx0Q&R{k~-oFSh0MBARMAC%aNjNa)TEm+k# z1#hSWQ7Ph|`j1QqMPopGGwRhTGrF!BJ)2`N--3bT&=Gm4AIhGCMwvu zZwhXz8d#N8d9*wHT|$LUTm{-h$TRuPt_1|JVKZe0^j31bzgXlMvn?g;gh(5p0wOb> z<2~ZN9Nk%VysS_p7IMev>f;W@=fp66^>houGd-BQh{0}QY5uN*Bn(6G$k+$SoJ^Up zl2xG3qffm3WwFEUBlQQNd<)#iu>)BXiqaiZ! zKS=YaeQ$=olWD_JjlO>-PFsX61zqBqc`9L2M?fuTw;Gn{5!Lenv7+=wj!sb{k~2j! z4To-+ajxYbg}g z^PuCmBBrDS%J?xTd@>Z!4#*IJA~?nA3dg#!dn}ES^pb8lgi%|CK~#=W_SHroy*>!x z>5?WxIA3`WPf^GetSA^(P1{(S2Z4MtB)w|#*5pVtHJ4UOc=o_2sKwefFM)84%5K&S zG6TNBNtLtQjKq3`Pap~avYy-D_>|+vx7gY0K=8-;>F`l7p*0Yb_090G@l6YL04)`f z3mmc}^q^Y0df&s-Nb3=03ddeKI+Ik5E(FN{kq{Y!LdcDYq`&g$SeRK2Lm^$nuVA}W z>I`FdWKb@#_BUsBjw=b#9oGeJMI)r$SiRC4O=qPm-rOer?6TPx zhX^v5AoHvUgWQ4?u%$_)m?z&t1_);lRR>{~7>d;Fe@^fx)tPQn%~Tg)Nc5R#X7u?= zFoYDSK)*$WNoKV7XN8T4K%B8I;_al4ne~RPrsDPQshN?jw;(PgBfcfYTeg@bCn1-G zQZ$Jz40VXxL^sk$+(~xdEnZ|RZcLZBt{DiBHo*~^w$(?8m$2)|%Rp>V%0H+tc;&ZP z%`V#LVqsjpkc)gCbmOhYQa=fR{_Y4ZlrnpakC5`99iCcR9j&aa8oKMqm;efbYO3Rz zsX1Fs>T&40@qnokRz)%uH{$D!#b}YqHS~Bhka{Vrh{XpEx-MqH^7nxtF7}_L8RU$p zk=wAF(Fg&{Lr;d$_lw-48ONagXnv6KjLfGRC<Z8AyDUw{-A$a~W zXodG)JmOB2;Phs!3RX4a;q_3jVJ_ZqDk?0`RmK$ zz~L2!uqfSQJsA}Z{EY(?puanw)P8FZJBpGbbfxr+cgFnD6okS~GP4y3_4F%aAOpen z-_eRMGLBNuh-V`(M|{*!nM^|;L}a{3Gyu!CS;O(_S`Wq6E)DFB0A>`)E;iBNZsS3q z8GG(oY2wDb4V9>Y1E@Pxy>?LE@=+9-I@n?3L_`CS`4C|9@zzOpXzPw+Y-#cNdx3a;{HT=Ly;;XVF3=sHnws)*EJed_U{b!J*|0LP~bK& zGPH#PKa0q#Xd~&+E=4XT*+AV#=mFfAoTO5Z;t!N1tjA;jy+U+nchRcOr&+`gTNK0a zt*V82a>A{U(BW?#a?rQ9QkK#!PwZjNz`*2Lc*s}(_5gZb-Df$bmgWL>u#1M#3l|Wo0CWng zW%m~m9QeI~Dron3uF$5Mn((_LO_;74%Lmj6H$x43~{xL%z@aB z*6Wr=bG>2VV8q0UfWCDoE?AvAqo-jI!T4U@8DUeY5 zC9z=*s{n}XRvaxg2FDk|vrBMLzeiC3)`AT`vbH&%Dh8#A_|;DO2Ta?~l6)`S62#2M zryiu9EvEAaNz8c>Ar~>HPzrOFe6&nNP3(qJg#n~RE+HDkA`GccrrS@tYEx@M@>L!~ zZHBm5-O_NuBhxHHRhxUMIFDVi7F1tZtl(ioZGo6$KJ3)@7f58w<3Z@nNly!z&U3I-mc1weWaG0bHCNvCarE1vm z@=OiYFc2RdA2Fe&lvIdKOrjM1zxgouYvf`j1IOnIHU;K*PPYQp`_QxMC5ieEIL|J% z$4?B1{-A<`5Sw|&9Z{!{92!LN2N80Ip=Z*C$0UH5?VJQYvOyK{3W+T9f&_CQS}zGV z_D~pI+4=UuKbo?2lQ$g(X)>p<4M4*@HEakpvoRLn{9q$dd+p?&JP24rLPgi2IdlDc ztg#OZkB|4VrI=#+85Ig8TLQq<*s8yce?V}=giy(0${`rrKDyCu?T?wCR+U=R1qe_9 z5~_OEm2VluajGb}?dKN&orEn`eOR|4@Ay|a8Hm-6Y?e?7#SlNygyq^-MjMY{qJTSg zZ|##OS7(+zPd!Dj!32Ev@u*thHZk`W#80JXV4mG}6AL97JqEfROGGW^G zx3E=x%PXG1S~S#%3x(Wr%78AIwjd@B5>gb!Erkn(O@lBM7}M~>Jp#_J3zRv>&s-6@*zd z>jD+e94|jmx_aoZB43H$d?4h-QlU|gd50p+0+9;c8yRu>w0vp6m#@HQl^RK??OoZPV|Iy zIsT0gGnO3fe-8hQ2tpCK1cu}-C2h84KI>5FyP1@oS>Su_)ctGqq7Vdk(wn_!kd>~ESfiQt2e+oQ?w;ABN0B;&#T>ICZ9 zMi$|>khttjvwU$$u}Q0vN6VAFclH#5C}AO8Yh~+!Ft2Te22 zm##<)AFsoOV77Be!|Te8<~+K#1JLYXM13iyx>ipoGW=<@axf{eW%)v6(4_|yP?6o7}-hLg{)X*#@8Ag z<2Z-1O_MYhutvCGl~MWkpUyykLb@`8gdV;v9qkFM765y?qMK-%14`(}z|6)+RH(uw zbE_lQ!Zp4 z##4%EBnq1{(yGbPWx=I- z2OG(OB)^xWmJG#J`D1&>~&eLKpxo)O7ISznP1G7bFd z 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

    gLx%Ne2WJ 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 Q0`uH-r`=0nL#K$IfO{(RO;6n#gCY)A~*lPY4I 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 z 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

    IuJG@C6QDS;903zZ3 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

    Qd6=qLsMIw0AvH9D*SJ%jByaNLAt0u_% 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�yb5cm~) zg9rGD_0P(iguuSKGa; z4SWmjw)gU;a$dvY_mTXvR44oVWRT|_hM^Yim-nn zHRY8Hw$OL=8RL8^BMzl$h@?ZYJuL<#*g=q*Io7>0ewq~llH&= z-{UW7RqY1lPTwsgZ@}4^aWhwDH!b?Z)8T7M*9CW9VnC#2l}UeF)jpsyZ`BAm(d1Z_M*~MkEK{{{Ui+l|A~PN6WsDQ@9Z2 zWM1?#w@`THkC8*AuBrD;>@CZ}x552q+o6>7CIT3}*(kM;`Wa{o9##j(8Ytc=51z$DadEn58)rT{nXxruW=8F$?TpF2ik)bB^R0|w<4Oaa!=nqjpcVxP3r&9AJZ}8ghKRZplVqXT+3N9p z^87*XrmbK*zLEExO~F}r13%_%JW8=vEZH9PM%gMXo-v01^6f@wV|lCc!o?_W?qc69 zLOX1t0U3bqLM4pT4y9aq4gIl+GuC&(lM(CNLwY>4Eo9de+LGc@GhxJ`Y)4t3F~Qtb zA-@Y2P-fysBeUN z=L!s+257sPqJfCmkjoxas~1W$gLVO4S6FG6c6*qPn&(TMavRrse!i2>I$g{q+33ba ziI1GUE=ck1MW{b`Di$y>1;Rt=n}z)FdY0%7Pv#L-1iAJT(fkxA^qeZ59iCPn!Ln=N zn&YuDW2SWVogE;=09+u9u`NTLo`|pByU*X;II;pPIZ-%7QWPH*2a+xl1>Y0T$|pq}`QVtmU+LrwL?YaRCL6dig0bk@3=z z;~xY|lh#CpxiQlV@$0`_RQ_q@o*K?Qu)uVc4dm-nuT{e3jG@qi&0m47q%2NJX9(MG z+DC>f-BT$BZ2AI29Q<12`_^a>uPephKj?RF&e(*t;nfB$o8vXWDj(r4Z${V@9fK3r zO0lH;%fdUf%|3@OA1r5$1EBhyW_9O4$f=_)7()Zm4|a@)5vS`><#j@JEB`!5(d;Im z=38QM>d|rk_bXU1=9$h{>Q7)VXxR++I=_=AD9Q}OW99E9^wTqw<}{k*!ZH(&BqjN-U;ai(iyM>PfQ?UU)4B4$%Dog&BiT%@0owV zF8hI>Dle~Z%{-oSvRR6qMRN3gr!P?EI4ty1d@MCOR)Nk^4Dm?XgbK1GPnaUA9u=NU zM8}d3$p{x)(L7|I7O)!26#WIFMH^)`zBDT}0Bjp#>mdi_-kalS(6_E_MyG`AnSp5G zls&U~aAqC-u5H1kWGc-QnjRl&2-weu9*_L_d&oCzl+U;RfUOgHBL1#nJ3W*g&mJX) zpz|bFfnEubeiT999U->vp7)6Pgf(z-9_X{_k~h=@fm&KMGb~tbJ&kKdE(mY^!m)bI zmrmc`wH^y!JTV6vpKZyB^M=j~cjm zL(1nCl+>aOqTTde%!fzHBYpe#TBaULrm?(zfNlh+ zeWt9p^DFJA;mI)u}JC+{7QSsa;1}mE0tT9KnU@xn3KVuof+#?2v{jB{8Cf`+4zPU zu!W6oKfKY)188mEE^?*RD+r{omVRy38Ak0)TS8xwcd?BpHpbpWQ_`bQHeOP znNJJj4Vc)3U%#6Ies?(eY8wG72vAiAN)Zu^N{I4_yD&x^=*&R6IZX~2)X|EK7EW*s zRP6r76XTGz*K&~&m5bW8T0l^ZN7~fV^?|Rz;y+fn0B`xGemxevXN4NJ_X3A^f#Ols*x;TNL;yWAOEqEiw8E7?lDGgCIRfBc-NqS>TY zGF!l1>HMnA2^1BruCtNvc-=N0x9}3ctABXDG;4o75i0!!qv(;-7eF&X$8ctQ%e;b@ zpE?;WR(XgL>`G=hFYwq|YkuL*&ob@gH|-^HG#c##?9AqTt@e>3EoSVC0+f^UlcAhb zdyq#C!YAuexqat4yoUv!j@!^ZZT*%#tZPZM^)2Q8dcns=HuRMbsOe?Wp^LP>1Vk`^ zC*2=J`SR`OVe*}1krOO?4U|#$A>&;M{`odR-;Kx3;Z)XzaOD&!Hzp63vPkQd-_IyTq6T8{dXLK~r zM5@_4HS6vk4R@I_8qzqbr-}d>!mmIV0skGXnT{Xd&r!uSDIE@10##Y&&5tfW>ERf0 zJdk{jkq?!t}f5Mpe3e4_3=hp!f1O#)NW+mptdF~eJ!f7fn;@}ui9{gQHEdFgfX#)p$|3+^Lx!2!)%gmhHllP)gFkroVL zNhO5k&$kdOdCZ|XNxtf;Rf^2aq(o5XUvp7c&%^|P{i@o&$VuFXusmByR{&;$?*xk~ zu056qensS7wS)i+^*1tBVl$n8mmaZlhNFm~&!IWqWD&*LJffWom1}Bq%Mnu<{|2)7V^e!C;HZp77vh`aLmaRajL8`J_7guH7xgR(;|G zCwUf#rNoMCOqAA(=>;)mZ-0r6%xX;pm0`4kxrB`0wiyU%n8{?=P#g2} z&ZxbkDr1_fF%^9Pua#);mJ1roq+=z>xw+^t)n3cl*WOv2%2j6>DmfsQqJP{R#ZKwt zZh}m~bWUMTmE{awwXe7jmx|BKTm8f}~`Z4<;G$iv(A(CVXg|(L=BIjQPOF1yFLLczWP#>syYH*Bvtq_diJn z>UF7>Ze(UpTJ>^g96wj5&Y~ql=l*V|^F_$+Rno7hoYo3jzR*AF^-i9g{?b;TZ|j1M zZwAcu?<{DJ%b$Y3a$r-@DH0cZ?aUmWy4f*WZ=S&Rl)uXi?!Fj%(3hdEANcdAybafu zI7V|9Ex?euB`CZr7U9XDD!)@RsN`am{&TZcao;KwUvBu->dVGB0CMntMdcfvZQP?d z;&KQT+~tX~%8d<(YyXmEd+#7OWD3Z#|K7hq)=^U83|N76J2?1*`Qf+cu#FgbZtH5S}Ri5f_sm;R?pv33<#Tc1){$2Y8T2q^@z+EBNiRF z0-yzPlu}jY_f|$9s6pFhaCgLu{3#z|^@c$6np|X|`NyhP0jl2avytkEj0pqQD$bTn zJJMr|)rnDq&{#v*w%JYRnTDv8j0>%S1<2)l87v;J`?KaQ>Z&bdr`@}{oi7k^KnA}6 zykl#$^p4(HsgH)DW6j?+0o(;jYc+JMSW-ssuxbsS(2RnbM~)V=)i<@267VZKz5t4I zgzxHVa^D%~W}MOLNen(v!pm+Y%k`_#>Egd>k>a{P|No1sdW{kS6Kqo$r>1%lZ$UX_ z@;w(nHOTE1l2FRAYN#4#2fzI|q-}bOC^F_Ax<++r^@w@6i4FN-Y`ON8xz_{-ydVu` z0hqEG98cKa=c(~mz3{ta6Ujtq$=Q&;n8RJ#I4PP*OHj);LlN|A3RT;iOokH8{@ugf z*X9@J(%R(eUKw{c0=+A!+G zE${oI-L{z1H5>;kpRG@42tPcC?;dZKj{Cei^;D8T(VxgZ7P%$IeD@HZZ$msmD8>2s zEuZm-RIP1yj;V2PWvYHw87YHTaW&A!=W9=!ua;~dCU z{Hg6oZ{_tsHTntf9WasqJwVp9`o+r3(94A1*FeUQUdEr><_o6x+3EtSRg@bRHby8q z;9Er%wb!n9_oJ5Y`><0V1Ew(dr=%SM2UNPuRb-B~%@F%A(pt{vMWO7e^4fyo*Gt&c@~}#0=-y-3jxtpBm)YHWd9% zldN$Sz+rIm&kOL)$9h!aM!CS!2P(3fEJCH56^yF}H|Y`A2c*<%L^@Mgb9@~oM*Yxn zKj*mD4@&)~f~ZK-Vy3^GY{+22I`T}-GB1quh(2enD?Ja&_IY zvB;{L(lRQsc@PmBS9~qvU>JD+g)v%NP=&450^g?`%#QNBxFXD6Hpca6KSkdP4`A$(9!lv;w%d2RLr zn{Mx&UBSb9gXc0j{>6>2FR^bH5xbG!##!K>TB2XJ<-kPpzYi3Iq-zvUU6fa zm9nliS42yROoBw#-W@ZK723~wkA}sx6xRcDz&o94Uq|;6xtk!=R5XR|m|yhZL4b`? zVX4A^FhEBPFlFFb#37qUhZE03Di_A}niql$Y}Q1=Ro`#1fAPo%TxG+Hh}nVfM_o}j z{;t+{wNvRWk7jGvfo-gS5U%IJpfd$BvD80hh;s`Va-$QLWcRxqc1AVVtZMGE`&2YK z0um!>eZRR7P}~kE!ZmU5)KCS+QE|brgSJ)-$s@}tyc$@czm~3b^Y6?8Au5c08jVbE z8ZFBTi%tFkMRNBl|uEyoR(romoBdw_Y7b@!>*kB#pjTl#ASY=?`ijLzs&Kc z%P`As_;0!a;4`(TMd2-*dBv57YPIiloOZhlKYyL*Ah|SO$jV@!LHM{Bkg#AE%9R5< z^A}ID_icJQAZOG*O~skSUHG(v=ri|!=d}H6STdRRi%%nCO12T4S##QXSlhXFmNh#7 z+V0YKCtgwKVlg2pd*7UBMr@diU3*b0TlV8cV#$^%857xYU&b#AYKe7CC4VQY-~I$e z6`Tw>_Gtql>rPmIFBDKG>RMiM+h^H*Bu9D%bqPwqo9v2}ox70NeLKtyoGeInCd->~ z<3=cL?y86!W*fh|kVA5%->s)KZUHn+xq`)3M^R$@Dip)YPLwcMj>5Vimxqb~BUc70 zqS-9o3&bDZJXjnb_vvpsr!N1&f=yZSXbk?SQA55p^;tfnA4r0J$#i|oM7-AAj?&ac zct;_5g053CkX1nr$uDJ}-X4t|d|2<5zakhg;*U5!%JYAp3DR@6w(K6nzk8*s9@IDW zpK(xrkqHLc)qT1liC(2jDHo+jsF!5aiNI-^Rs6G}i32~1`J@Xk_vX!PKq11D#TCDN z!ecJH>cGRi4m&nq5EUP|8m2cgm-RG__U|yDC-b2!^ygiF9$%C^nlP~BMB!cd$dgFC z(xP8M$82a+#Fq!@Q-Q4=WG)Sy`c!m=PGY^e3#3KDyn%lm!XXppkuIC2QvkrHJrxJm z(=Nb4=7n)v^}Rd0R>=&n0J_NRJkMb3cR^$QQTdb5misG1+T*dDLQ`=iT)fb^zc`?l z&HI*}k3gtwLW_#b^|XXb7q!T4rXU}ests*2YQMTd6TwmbY~C7BM0||PpLZf!|HK@^ z-GCo{n6)t?9uAq6;L=G>Y_86U2mD`!asqIhB_40|af0#2kvXLQ>srjg5FFxPmomw@ z*IU(i^tz|e&MO1nA{06i=X&-e6JM_}4~9Suxtho8FFsrQNvO-ayiD37|8 zlC*Vdi`(|fx4KRvo+7F0dGRT&vEZLxjTSzNYMU&>3Af=6z2VuWOxOoQG(FebWILh# zu)X*LZ<|1(6~qf0gnYF!x?k>-*F^sX5 z%pzi7x`y0j3lOi@urCP{tq}9SU!RQ`Wl9`+<0s0Vb--gv+^j`Yj(1AITg?qgd79{c zbw3fSLb*f6s9P_X6EbZmKHwr(?idnk?Ml6tr&b4+1l)uPx_9Yog5- z#`XmB>8O4^YlgT!xmBeX-RouTE#bYWP6`ZAM@o4Yd3QCDf)o-e{;ADCN4jiseV5!5dv?jZbdD> z`-kU;+a!e2r@mEXeLMNWDwM|%q35ot;me|zaiAhYJ!O*{mm-5&nHNllB!Sw()Ro+s zZ<#&%+FVcv!+C<>&793p%}F>>(gz8IT$~*OE0jw=i_OxC2HjcX>!g(US{vqRG;UHC zi>&7KvA*nlF2^9+yj_zyWOl|+)nAD@YuCVyC5zd33uTFBleE;JwBmD%3=nLc;^hw* zN`6K!;O}*m6&sXl+t3)XU5SFwa#oT02#ACq{83^2$y26YCq;CQKyk5!DxBR_J^3cf z;Yc{?s`Y#}h{|?Hy6_IERBW15*}nQ`M-sO}16$$+A*Z^yCp8LL3_9AsKKhN(DYiAd zx6e!O@E)0HA?Cf8;vbMKEN6(d%9X>=I1zI;+l=sCBED}WT<;yLqYvm*GhZUBTID}y zOf8x$hGQ_jd=sB`L;11q*eKYz^(z@N*3cH;hcgTNdyP4 z)=ymD8REytN>{x=r61KJV(2es!k*v7q;g4?6-l|}G{0}A7EK4kET=*#Hws}>Lbe$% zTj(fzm#4gF5Y-!54qn>EueIb^AJ|dBAW?FZh?{PTkO#V}OH-auCsfdat zk@2;7-HjmQV#dcAxcco#|CqT+s764?zl``0-dhU0Z|uaQIQgXFMFrM`DgGpmr#C}b z*6uBS>-?X^?YNzpxJ8D#S%fPK7Li*J=JI7FH)0s|_|IiVA>5a`8FCBojf&RDLGL&+ zG9yN%2RH^M<}_`h_Zp)zZ=l(7qBbU-7g(qdt;@D#j@fxg#gRuW+@({&g&eqlwlGA- z!L2}>1Gqc^^YD#r0$>I-b&Bo9bt~qrsVxBACh8m%0}2=KoV;M!{*A9_^PcAt7$q&h z#husA3x4^B{qj{@N4NgrFc_@4y2 zMsTjTa5YDkOb9mu39~XbRRtMrjtUSlp+hNeh7=Zj0(hVP?24`;puv1J{U9R{eV%%L z>{)A>3ZAKyj1-r6pJhYBS^UHx?-9Kq(0ZLw$}-xF`w~5Ko}`{x0`haV>_2RX z?aefBj!O~n4Gy#pxRnnCGK$Ym8_=KVp1App6k*Hu^l(Xm-KP{_M0WlTc6B`aJ9iTW zADX&?jh_S_UXtNr{#qMj*N@+!aoKBa^j*yN+Y}4~{{#;1<`rIe==n+X=Yd+P2b1n^ zn8ot?KKdn4Zegy>W-Y0NkPds=sz zUuJ)yzap$jE1h&J(i*?x51HdjHe*>}7~GeEFI{wcxh_oA4~_@-K%j}xdxWn6ieq*;k}hE^k9Bkchq)-^&zNkSHjq)p3CoN5w7 zzZM?i!?M3oy|V1!AHST2^G-9Wz7~K6+~18Q%<BwWZW+OXS6Dh7Q zv+g>ocRG-4hx4z$h%4xP`WZYM7l;24nu-2}p0jnH&=V>j6;N<#e#kFpis-O0 z`P<>yKdTyw=8AO7sR3}+{Yhqye=W1(Y8{5w;?#=`B;Yi{gbN%i7!*m1+k&u3&_<}p z3G+goNsymUhPT^{)5Uy~m@2r&N_bm?j?x({pta$>m6q3;Iy?YG7fp-VuCMvUDS|7pg z8PmXcZ?i#a)eC*K*q4Ir1Be*SBXI$q{PX8y8^8ax2si%L`pYJNqTAf40KBZ4(v$Jm z1_G1lo)clt^{-hOYiXw#!bwCNMPP%@XC(}kKFI{N^@nv|io7x3PV){IRbPsin@+_+ zQN6~0_Q`o;z^)We`8Wi9KH;aCcE_d5aoh6&7{M48UME)SGw38Q*a=`wPDlhxYQ3LO1MOd*hM_oCG)jY{f+W_hg<^iU zNUP_u(<%JBz;D{&ck$qgKR+b+gLj}iLy>@wI znIY?XOIgwLR&Tl@m3pq`JH3{EZnLd2u`z5-H#3)zH#T^Q!Ji)dOW8Y0BpLCN_{pti zV36x+PT)(ct6}koGKWPYwv3U+N9jS;W)F?u#{`RL_{;$_#@1XNaAXWQB*jNqz z-mucJwM1~?>y`uFMp8iOj}eyb;O)ybWQM7N%ymME|I~kZs$=~WRE~an!GlWe|1&KS zTq}^)j^a`M$(!4n)$Sq}^Y~7{Xne8xr1h#G!un;Y0svC$#qGO7^vcGw@9Gj~c)Xpo zB+*2i+;vsBba}m^J#F}c5eZUVHT?EZkpo+g#6EnVrwlUbz683nSkK{V=dvx$ZSIPl zvN@Xo>505+R7W`Hlq zQ*9^uLxsF)R}yEG(d3aehoy0;*}(v5(E3NQmd&>hi|$=R=w$p(`Z+&TK3_GN1Q*L$ z?c|I{Vf<+HNupCAgTMK3G26l}F1`MVjq5^wL+i@rsgl<1p-E~bo0$Cj# zkI%I>CVe+kR3$0XSQ?U@Zh}ksimHz-A+j62p|OJeJca`%=Xj;79^9=;AogA+fW`h- z>~n@jL?KYL-qhQyJ52BV7~ym0{hPniG9_r5MN5(eGM_J`wCl5lCdAPe2>|z2mWu9< zaa)~U9_)$iOQto>HSrgB0LOS$|1i66BR@u)M1)dIy3R%1@#nr^iOGgfN2TSXq)~hw z@zQp;1xg2x(bGH=&W$_VsJ7#65RBe+X@crVKsAO^$ab?UsrxvP9QL;eKQtxPZunZ+ zmA$TWbyo1zwWwJ(B!)W6Q?>O5&8K0vK&G2R3(V7I9}e z4#a>2`_)3$_x^L*(kp6-t|oU@7j=HdyW5%5SmxE0URUWSGpT)sU_ivCleSYn&Jup2 zbCrE-CXjP6VSco*4dQFhCoA4bYqPCGE5&@>1>R8Q1yD4y4^p1N>C{I|gRbm5wT1DF zh3Sp$doxs^{r&Ui@%1;7hdKZ&^7we@it4Mqzc~DZb|>89jpX(_Z4iX0IKCoM=3!o@ zZ$HR4-`nE6svGb(ae%97-~%uQW-9MVJl#q3Eveh1y9fdx^X7Q1(&sn@o_k(&DwIMcACfWNlf+S{-s4vHnKV7| zamdW`vLnwe$Es`+|J*^JQcbuICGkm2^)xcT6Arg~^V(Yo=o1*BLqu&M3ZM=xM|xP7 zZFA)kbOCm!uJOR&l}1UVzP?~-^q$3Pu?%lUH?Vi4e>p%+3I-_2+7dFp-U-;ee5#za zKIB&D1{|LbA_u-|`c0d+aJNgsS(~VSGEUe0RdBK&WX960Dc`N}E54-P~Uv>Vf9QZX|x?AN@ha zU{JdkPHPp2pqoKo32=JI3)|$$HfxMxI-u&NoYyLVOI)nbHT~G_jxVoj^&NIl<{$gJ z@S#GihksOuVHfhuhe>53(v(f|c_0;O;N!1>xtXh6qxJ|V0Um3u7^sGbZ56#{C5$?LHD+VwDQ#JMhBAcv*_{TWld9X_0Q z;iM>Y-8ce@Ie)it(%Z1;t?FnR=*>F;Brz1qyTxO(7j2uic7rS8us6ad5|s%_eCf?B?%lqSE;`o^dn5OL-$5BEv8Qx zxz2;ZEN>4qKBo@EQrHKH>+&#bero*Mnld>^n6sa5C#w`xsr6tQ?)LpID#fYRQd;zn zflzIVVsLpoJi6*P6kdYh+iP$6;@O!pgIjd(a=*RMM)wDxNgSJZgyKYy8T+|^_!UzB ziFjuEm(G*6o;T^`$}JD>_fcHTe_=xeuzXc>_UBRbgW20MAEc&ZumfmNq5$M-$G8lz`bFxWk@Hklxh@U>2tik zM11+LdRUO9s&m(PqcVv#jhZcM_!v6&V`PG9NI-jb+@4D^>f1ln5A!;!*#q905v)g_ zIT`h%wzDcMTE>JiAKaZq+wMv!2lB03Weu#wu>*~-j89weC z=rcDoB;|BnB^&OAG6m380zwim{N@#;$1nN6^vLw$^{yn`yWga%!5ymv0GW&AC*=-o}{*0 zt!xz3)!^vgTUfN4Y7wZcHeJuT zN26Rd2GY_@ize1wu$3n+qq=z|Jm@p(r$iNO#-T)9+Y>(%13w->T|B8x2M?0quTx~{ zPrTEcw|QJ1cEzcB>sb z5BxtIop(5u|NqCotxu##$_yD%A>)MXB724Gc^r=HkiAkk$+2a0LiXN!m&36RviDK8 zV;ti+Hotej>vFmLaZago-}n19p3ld#VUIN6SMZkExbRfFdBq$fQjz+f7;)=DM!xN5xwO(YyXr_K%1zvS* zBF4pxRAva;ua@TB6)L$OC!#Ry7ZysgK)4%37F!b?(MN7gscmFHvZxJ=E^<(`mMCx21P+JUbDR_YPYFO#&hRO^>^EJY zr5h^k2WLAN@irQM*DhvN#lV}elKf3}okG=T#Me@l9bc}vJ(x&wW<`EYiD>~aa$s{I zWScWB2GYGNzuq!6`8ENH4%Rt-f52kd-DLhGw+Pn1_0ABoy7Ai z>*Ka&so}FlKVMUj_m1O*i`w^mw;R*u;^tuHnkPx5pXD*0jf(U>#xkRiexwKE2@}jrVYH-_=Rn8)%j8Gx`>ny6^e zmLw;~1#Zaf3Z-K_S+mBiI4fx$Pb3wG>F87E4QfKH?RJV7a>~V2{QU`8{^;6gw&c0H z3g*|p?mSa=kafEXRvdW0)6~ZwQJ}c1)k~2nXy*f@j_Zk5CTmO_x zSNhf>YjX)FPCwNFACG#ewew)IQjDXw1yo9X7 zX?;$S4D{sjURb>`HMX>u_n&p6l`)uzwf|=yBVM7I&JS29BMhZvpRA-$jZzBc5Q}u* zwRT8)6a%bIb1ElgCb2(Ui$@`iK8JtX3cIA!xDH^sORN>qfPB-kLUb7J+&_ zX&>dnHQ+{SV&E(zolG2Ke@?QijD_<7Vp(7N0=)I zeJLH^Y8plCyNWhT&`N}-ILM!GL7Mf$L-maM54I{_%%h4E&pF;re7WdraP&})W-;AR z$J#fO#mdZ-yjY53?(oT$>ML<$>Dpso+^>@vq5eM9@Fd};N_t`k=i+%C|}uY|fmJ6Gs*; z@wN-SHE+H!XJbA}NCvy&Dj9Gy#yYCAyDM|K8xv78^obX2Mtk)3xvLlm#dc7xh8^SS zlzr{+b%C_$C4u-&*Dfz(_W*il?tw3Hvm@qmI;7>r4Fy<5Xz{-=!dj^{UEXn2*(SqH zeq%bJ+GA)=qNg$Afx$OkLJcP*>aY5z29QVPQ}}>k$)frc7B9!d{%CxU&H$$reRNBL zomIiq-TihQ#etPfOaQGYhxxOzPwE$!7gTZBmb@q`$Xxd$<}cinLdQL|s$M!*)@E%X zMx%AiA^NYlxz<v1f0oreQg4^9tl843_FV z%V_e;nQAT9)2) zd*UCt&x$ZO-QA>dGp$iIa}X#5?Elvcja#jL2Xfc{Qp6PkAS!*ia)`ej)-y;AojC&Of@xwk8I8 zKc7gDazc5^Qt4!+`x%Sul38{GOsCGc%KFZu> z>d)ibw?Ed<1;tn^h>Hz=`|daDIA{;)(VIqSt&AGFuQtsiXyIb9>ek7u3b*VhkKv|X zFxvu59=){tw&9WJUAFLqV*aYl5~t>8{mozx%GbKdVlG6;9i>aZ*%u)E`3zsIzD`k! z(yt{>RY_x$z#74JScv94W@_7hh_C~%d8iplB`4xp#?Af1Z6ehNh&MLhK17%XUR>Ub zgbUdl6ywoYeW|(UVa@wDUlWM6NyyZ5jlgi!;1kS#WN*_7iRk6J^;}G@&~xe@XlL`f z-RX}Cy6?4;J??zVkGU0H@U=9$t@S|~cQ@kk+_NaF<-bQXqN%Re5^7o~IZAkz(b1C< zAd(Yj6;WB2T=_dNAG*%tWAzLswN_$uB95h2an?XQR_%`}@Mp6|?V*wORMiX>Z+F&j z%)T*V+vpcr6aD137UTlysrj<^G2A<7Nr?)%I%_u3RA{@iE?}ihg+wLe4h5D_N6b6L zQ@!4Db`T$PzJN1>PfIhI@_%%q<{oFs?XFW+Aa%{#ZN7cOsOv6JjEx$E9g)lre`=RL zGz?Pr3}QEk-Dg+IR*&J?V5dH5ZCX0Cq#=PMmBECkMT2Im`nI)QqH3#dn|-`;KJu8$ zN)x9aZjCc_{|B0jiXu;w z&|S5(Hl)PB^uDoU=TrK^HN|y~YK@bZX{xM_6-#bSQQ@?1QZ;$vGHS`Ao*Q0NTQyTv zHxiI3Dcr&!077FwzNs#~@;kreu?i09?QC$(o>(7s#*dYl?B-?46m^c-W%O*NVh|#X zz8Bgv9UJXa`CdJbJ|{)RlxB*ms8DN*?6*)ZFne?31@M~d90)emNL+g7eYXABOklNg zC*rVm^=*x7-O1+CMy$y*2T3U@35b1Sl$HpoUV`q%cKChId*;DHS?(I|XQ#HM@L%Tz z((J|d1YemoYu^uTy3!XDs$s%Zb7@Nmp{d4fqy3*|j($^I>u=)nJ~T^oGTnA{R=A(l zj#sfWsyrM+{=g;o@z0TV4fv!st1n~`ws?LL61CKMu+U9}_H^D{6j(B@cn&obV=Us? z`|!9jfSxK-LkfjMik)UUkvhzlLnz_5dMy?@H&m;?NR?~u&}o|$M>$}yBD|jjQQ!Mh ztbDn??maf>C$lC}J#?=W^|c_?A7a11H5zr5a>g*0l&v$L^$lrWE?UN_iTsPwEnUGn z9Mes7tq{w9L-)}CVTJ$m5Nty0qlFCIB4rIM>M_w;xgph_H(dq4u1p-n~)!j3tgnR{UCls=WN7MPZ)dxf58OO>p>KXn*y z6ZfUTQF4&DlsdeaM;Y8-)-x2x2|#!ruKS-`{=G*Eo34hw9;#YF9GT#J{p!@)CF>Sj z4&d=z1L>lflJ$f>%BY0XLXoxrq_&6FIAijffW%o6{{ z+9rfe_wu}9O>Eo^0qLF(jBzFy%Vv*L`)*Wkw-XGwy_|eI_t)o_T}NETo?&%t{?0#zAcqisDG9V@7k=r8w#fxtUHu`#k{!$EopB1!h~4e1q5+tc%R#RHDylN3uH zT5X^bQjeuU*s$vCf60!erBrgX;}iPWC62{2Od4A! zHJ!}n4x&5I@g0rd1J&Q_%{>)S6nQB^?40kE;VU06yG<*4v-|}~l;KCh@*XrRyVNRv zkX3lhUU{?JYHWLv2yJgR(f+U|3Wc=X)gMPq!YVmfDlady>R=)d@9lMwDGxC3^u-%) zmV14S)(hJ2XDJ9xK`B+gZQPr`y4{wcz*k?RvHU379*keysyZ{iBQ=WlZydumxY%kP zmT#(I8eJUy4Hk|0-PPK9{%20T(eJFX>^6XkaR%{6aBN1KG(9Xi?v)a$;$^`AkoO(AGwD_tE$3elUQ|fbxGPH+V3fFvl?Yl z4h5{hyAFuh1u-}6;t=^1?aHE!a_Iw0=H(e-2Dhp*y5;jx`Omx^IzxTY*^>1Am}J4GRZJkYA5raov#7dN|rqnqE(nKg$O(wbm$2_O?LRhog*btFgxtuXPwALEDo zj#16@1pO#FaHdPiIAO4*K4@FQ!&OTxMskm{=bFOOA_+J8zI$naS!iYRKn?cLHFH@ zf#XLxWC2nTeK|EoGQM=vGjGwxn z3wV9t>FjAAh0l<(kk7DV-GIBkU)ji;wUc?zrH;WiPzm|vv~+!VMXqNeVPrQZj9F1v zuT#6Ord8C<_^Qi_bvE)9Lw8cSm_bJxYtx@gpB@(yqnE z@gs96HnI=F77nYd9sFW5UR*_$*;ih2E@=G{@=fezw|Aq*uK?g*6}h0VcrM}=7tv^6 zc7i^X#Rssa%qW*8P(hl{q>nYFC1Hz>==mpkqrj#IG^@ZlZ!mT3L@;fyfBR=n$F^zC zwJj^@MA|x0Irx?|O>Yc^-mVyM^}B<#xT+0PGXE8WKLEO%;F*T@kPVLKAV@neyEWbq z?fU<>B&-tsK1PeHQ_OT@YZIwB=A;zN&#xu>o`?n@Qz0844N=I-7OIV?qTejWq->*W z)9sRU{#V+^(9J9AUhqYh>stBBq?WjeF$8Tvn`Niz$hrMt(5c|?P&m)Z<i*<=rBU-G;QO;fxhH^VrN>jPM?CS-KfTHzlq89X4a-l&QhOz*KBgV$h)Ejea&k zVo*q7p@r~@JJaESh3|f=S}8Cv;rJAv%PoM3rCHU_h?HWouh#Hz#64?6&>l>2LL1(# zd}nt=IKstD3|ZkbZ9UhOP}Hse|qhKt#FWBH7Xe%5NZ}oB-*>v6K?sxTfQCKWUe=c7+lENEQ{Q4-|E(x zq6EG%Ky+SO;7m3B9NTy=W$>gkdf>zm5yRrUfG{+3Kt$A0p3oiMH3#MRKKm>2v2ny? zoAHH!4%0FtY;MyZfddDrS%Rzr|BP5Gi;JOXd(f*iRIpo98PnLO&um_$Unf4jbMv9W zXAnGp+|L=2!B*AnGmm>*Twb&il?)>UQ~T2NU_VRE&+nMO2-x`K{86o(+v{_APxx!i zOrx56k99aU0-fg}XY$d}I(TZjpw0%QaDMd!ZR+>;9v&^C>F{c5k>}SK?S6Xt>oJGU z=XweqkKK@=ay%Pf&@ux&V7dj2--Yc#KUHl13tS;y)Lu&)kX?)<{ zzU`O3o4>|onZ50eNIzs`cE^Zts*UdCOK#Ct4;4LE9^M1cZ%K!<8J(uhr8f8kNo8d;*mEwK-Iop3F0y8Ck&?N09y^NEn0D zYu9(i*35p12979iqYvtTI)4nTk8K*kAD=G_e1s1K}oC|XH zpE*6dj>wJRIB1MJN_A`Xh2UOpd2+*Og-mp)swl6wu;TN?RAZ&2MWt^h+aF)H;5Rp| zEaN1>yT&I92Wi}QNIfrDPX&(SfAJL`;;yrKKO@jNzILSDAMXxZ`wHzdCQ$3sC? zkn{lP9g)2=gwbI$W=DV;**~p`i&32O70w_1Z`xOQi$q`RNAKPf=8k2$!M0>QClPQ< zc6fS^B1tH>coUduEt$j|7^0sbn=AWHan+AV!OX#AVe4T)GWE;g3^r294G@;seNgQM z&cX4pRlZ`Ge%~1DRX#q$o>+g!TKLiB{R{Bt3y@Ae9O*W+0GQ_UTCRt(Q;?N0gkUG5 zjw#nh@n{V1=E%cLhf0uZweMgbSHs2R41np_8i~NOhk6)zp0qmQ>020Y*nmKQbKCUG zLWhofEv+Ap_h}Q`rz{+s!yea~^Df6MAg6lGZqz6`GGt3<)*$Z)*(s8!Um5={Fu2pg z==jA^n@w}f6Ppv(o;iV=O{NNEp9OVk>33EC^N z694G65>{v8`DDAzZ{N=>D6=RqZy%xu(ah+;HnmnW97(5MAk*EI@CL;dT`|#~>3Wm!qwkHE>4(2bXGe&4 z37vr;yBkb1RLhskwzSa=1`=1-!lg+9wip#SzE{OEynEJ}e5tqD8JVZ9>`x8L#$N4O zDDk|5uUkDK*C7-M*YF934HVI(Z|o0M-W~Ih(xPf)+3a|PG83qi2)^ZMpd7v>w5T$j zii)u}I#63i{pD;3iM8E}TzfU=OEbJuV|d8>lTq5bVA?GRNt_0iLg`AuVd$Z3wEBQ9 zf}wVi?mBEN*T3A$@>kcm){y|`SVA`xqf1BG+_+W%t2u%;X%X!DekUWN>u{suH~kn=CS_wyKa|v=!U*D7lwSbAt9kn;b^}|EpLc%cIGZrTC}oLo4seuQ`71* z?}86R1KoCPu(36-yw0C>KEfe^+{Ir39;WpY&vy1_Q6$USX5LI!?5(G=`1dz$?sP{d zn>s%gc_XaO4cp}!(RoY3`q65`)A^%GNtXVMt%9XNPa1MWXV@2lk7XJ~Ik52iWooJ@~s;a4eKPt1fp>^WR#6lnGg8|%fHVWt{_39&x%iyNfq9j=RD|_CgbR^-h?8e?z zL54E~2@`-_8Cut~xoX8#J;E3s?-j}T#(qN}4VBD~Wz@EJaG7e{eqgHaQ>cRBg^4i& z53kIOSKV`$Q;Nsa3+h3AkFM9|!w7D-k4<{dUem*@rkEv=uB&vJZmku*n(x=>V36bZ zkd(M+WSrCSR)-^=iM5lOy)r;hM5krfkG>*aO2Q5s=~ohvG%#730WqBkGTL%<#`L_N zhRG-}#~(#b_sMDUq_f^<^Um7?rsa7Y3A)I1{8KRYPV^@anYbic+IF@rgSYMuG-=8_ zughUbElF$q&v^XS;u+#gx;GVL~;uEt%U||^kF%iBSBo>uiXa;&*qTF zu=sO9+|nDu_4Vml)Cx4PNbqsghpBLMjQWOHjx?9Rlkep-VZW$ETThPE`84>Penk8t ztd$JN4D9ORP|L}ODK(f?-y{FDx%1i4$vK?>`@)SmWVL;L?;W1yR_D#w^q`GArMSA@0J?dnk z|7Iadd+%^F<^2ZVzeQ=v+|>VWZkjD^hqtqkw~il~E_hDeV7iz%vmZ}Mt+Z^}eaBQ3 zl2S&p%=*-sPyHq0%2}s}U<23VoLRH>k@BA3+Z5w<Q+pkM;iO(ZHnt1=NoZ2C@o*r$R}X{5@Y zEtiJt$9gfLlFogoReturk5!)9QZ>iEdkU9TUxy;@!9WAx)TbNCMo3>)lVPwfkWy@G zlgR3q;*$oq(fMz*(xPv%ZJ^S!uOkq(=@lUWY(TQC#6O8poh=;NDbW;PJZj>dD=Kc# zt6MXdd_)36|J8wd>CFf{Z4H_-xryOat;1_QFWkX&_S}kMvO(l?+pc_Y*VyQ0r%#7J z56X84^%y1nlu}OQOa=#a;gB`F5Lk%(E=s@abaE;%WpYq*P24+>E!%y+(NON+Ww$0+ zqo9**_h2KKYbW`beR1_Hf2?kFM*QJ#dmwWAd7^_zo&uRZ!{$8^DfsEy1?636m&kr{ z1w(bot*yFur;-8cMt?M9Q@^u2%SJ*@vhDh`K2CzW<9P!M+z#X~IZp=a>ipp2+y5IU ztWq}b`&olESN66;pXw>?7;X?B|5XxT9(PTA6$>xy(7L4w#&$Kfo>^3xCiZyW`{sIY zqpDOdq6PoZZJ5@UJ<8GV08wT~l(Fs;qynzrQEV47s8^3`O@th1Sepn2rN0+6FJI z{YNLgTkX2MS7VWHoWbw}``?1}TB`EVV~(sDlT3l@#{Ivx91&SRJk9+|3d7To6;%fO z{i}?*khn6oG0GhVUI#_d=X@;(A|A z1=xyyGeN!XJpTDPsBxkeclqbqVxe0w{=P^b z2J3$6I#(mTv*jVyJ$RRpRE%1J_d70{>0g2Tz4tNUNz#oqY#Q$8uUNgvsy}g!bNThn zd;(U8QWHhYIAoIi?ZFdJi$)sHVlLx%z;s^%eseGFs z9Tiw(J$_NzmnB75h8By{`Pb2OY^QRZqf_!YiBwR!A|2`r*PQLT175@BG4u8&B3YDU zCFZHF@6+ZGClRO*#n<$gL#Zdn0;$7u*Y@usC7<6q7uMq5QQN-LHuEHRZubm3N3ZfBp`t>#EC zw}*508I1$||2ytB*mtH9H%16@k3XU3ixS~PvF32j^dRHOx-(76`b}k=?$qXbt^Duo z0LLf4)Bg+Jl@YO7XW`Zu`kQNltI6izd)#(HbqVu$nv*`x=!&Ygx;LOt>WuLx@R{=2 zwRDkrs}xQl28F7g#@;kVklyP0R-zc?!o|f0Rw-gGGvn3OWPHvT5^r$TrcI*_Q0)g@ z2905{8S=O1jJx@7t4=AOUKXQpN>3t*;@C4Ku*!a+%)6Y6Et)|R+~}eoss1+rVR>wP z;hqQ+`?C_-GZCGq4%T1m5a)C`_jy`fTjf+n4#s=wd5ci%ug}^6oJ7H*U)t^i*X>^q*P}X+0Qx7kOo8)_07F&aOFphGoDf zZrfTAhvEC?;EAk0UoM99AES)qjla!pI7;K-H{#lZD@gEwlS6$>JA8>Z!?u%0xd&J| zXXrRop2zoyQd3$}rO&K;APp_LVB)v4;Es*t^^h8jdb*RuAKvk~^Jc;v=}0WqRez12 zn0#b8dob^H{EijRk97Sy@&)JcbEIw7p>3#O=QP)`_<71Pb&pZEc60{Ap7ldoSRz))>NCUaKt42c6uQ5c7nNgPphB14l|GMRr`4wq5juanRQf=AQ%tuyo?yd7%I=Osgq5hcEPh=pg?tI=r{umO8>3i78`d(r8 zpwHRq)!xZp(SvjtU+;aDMw9cLoZ%itgWpFKi35PaELL=lCG@@R(iMJisx0||4outc z**U$7RB42HaD3n1l+{sWdEb7g<%RuU>oVJvbpf9nn{H?HLJ~es3eH+}$}_Ue87_Mn z_w));^!z;!4E>aiR;Ge&3jBNK=vStT296?-qte-ggV#JfM1|$@RRj&eS_wt%Q2f3J2G5qo_?4s^Zn5Zni-1kYa`nT&R zh~l@sFbF&##JBC*KugyD(4R2yF;t;$)7~x}{jM{d$ECxEK6}@JHmZ%f&7_(|!DIjq z%qt5(O0b^tw>uG1=%}@s5B5FQCiaMfAAC`Lr{bN50(%kOYR~Fge@e?oEZ5yOnISyd z^PzSn*1Wqjv{Ul#PL?K5^0h*>!z+%~Th4R|`L$GXL&?RDNVykDVn`}TRC4uT{;gr~ zsPqx+gYp$PvAXP2R5R?MDztM27=+g8>?*h1#8Ajm2iJ_*q5sCARo}mghjhnVPvB*9 z<|pAq@68UcVH{m#_kJBz>1_0*a!(*fbdz4@DFLTsbWUnhD@b25c3!@$x& z&~q^|rF_2MKt9lp#?Aa_pI4P;184pLInwO?o_-B7r67Cp1w!TM1oe2xTl@ka9?iis zuKtK$0^>q6RjqF@HPw1{^1dZV^}jGTCGrY^ey;Sn(H6ZsK3~d8tnWB@zI1h>u{u`s zr&ig{8h_G+T5$dmVp>eHR4UfDa$0buq7~V{7vlM@iM*=d43Ew;-PC7Q2%BM!TFn>3baov@MRa8Z=GO2taY&_V26vFLgytOSxwRkam>vuMIV`* z2~2(a))NyO7_{$4iP`ed)j1NdPVO(vXkpz5uj=vMjM|ADTRLHGGGC7ZW&aIJ==HF@ zDb5X^(d^CBq*Slv*TYxt28*ewUufRRYCEt*9*FUOTpN}PrK;9zmUvG;l*!-Wmmsh^ z;sX#!p`^+Hho3X-}8^+d)&DT;07*E{_*B=!VV=8UZD``KSYbW&mERsuDp+8pxeAQa7cuYfAi5rm5WY~6pABv zr8zX8K0OGssGp9;f{Bn8|3iHt2ctN!fE;&t7;WQi796hW^e9hWdFl+Q6ErJNy+U!;1`~1ccY?Y)+k;CW z5BV%f;Q#yP(fvv)xt5l*0wY+C)Vxa5|k1j_*laQUd$C zbzgdGrUQu*ckw1B`ZMkPi3WSe4cFJ=o7 zXOVJyykddH$kiO4knhzi6$YRw8LynVm~J)RB={)Pql}I4J?vBzMgeU+bm1Yt|m%e z%B(D5DJEI(qU;(vL-zh{jRPBrfVAhY>>B62*xU?WBd_5t zHSYAt@^^+!<}{vm7NWHRu}7Hgdln;~6?{y^XE_#eDs_Ku zBF`QzSfcT4_>z!fG_da~q*DqGdE|%zf2~01osTbELvN&q+Iv&G7VXo859UJ{2M+zt zFXJhj^VP9DoOA8*E8$5(M$r=iow2?Gp4nQE?GY6ogF6E{4LG`L4)e-Q;Vn-GIECfa zNbDimgU4d5=|}r?FZ-9DvU`?|6N@tkfo!cTU1DN>>`&a3kW@227wr4$n!gJKA1<|K z!d3+*pNNyj-XY?pf_cD-J;K6pc@T`zwK)ze2tQ7x2s~Xym&SX+pcenEvA~uzY1Do! zxNEI>+=(=nMv4}v+}g^PS8AC^?B7@J4R~)a0;Da#N+DPk$6RysT-J9e{p_&LoRw`i zf6@<3Y+|Yz+zP8=s*}xy8;5zYV?{BV=`WLlJ<~&Yl`(k!dC2jPHd<%5fQ*PDC6UY7 zMlx-OU+A_E1v&mCyI&|BFc44be;CwyobRZuI*!xUlw00Mr+qts8=FTO zqO>l6eJ@t6$*KLwKA_hAMA zCWFCk(Y4tz0i1XNj99nthtQA0>$8lNV4`-uQYq?>{Ll0(q_|Kn;RuH2yeYuv3*9t% z2o04;J&}+8;Lgt#+Lm)WtBLF(w6Bre+S`(w8m8&K64LUGa}R`~_iTJa4Cdi+7_aZQ zW?Bta*>CxAS?WD;5PjJb9$k@Xn|HgqQ#+o-E{)#GZ5Kh~AYY#KxxLsl zbj*MT3FA!`lk{utgm27ahUJW^1S|ocSxW5yg9baS&w390JX2GY1 zl}@r|6tmA}_NE~`wMG11IYvD0eK#(z z7jHfASwiSv>}OtLnfB6mB0J}tG5EG291;kND@nX1d3v z227a(YJXC5RK*}^1UZ;sjBYb_R4un6Rk zSZNW=5MxRzvObzsbN)UTpXO#B;5lrJ%{^CO=`}6gLlFyd-6wu}H(iq&Rlp&?zMjex z$5s*l_u=8MQ1@RVg)IMzEjMNmDag^h{f%F*=IMs9NiX4b)J??BY+a@wP!I_|$FMuc zyv^*H>k8qs35?U<<5J1ykW(Ag`O5k)`(TH*D|=Q;DqbQACEW5Ag4SN4+ZR86R0wm;YKTujCNimOiCkn z`-$tRH;;1k6f&G6UyGP_a_TIHX!ex>MJU00Q;M6RqDbN($6`a!HW1(GSMuk&umj^g zKHt!qB}B3!ti=e{VyC(AZ9lSJGgxWm+rEIEb9O|G-Kraq?$npPTw;jLeY7rPf6!r& zt}xZ#^R(@{-iB@LJ%he_+%A7v!k+kKFc^N$#cce4)>+Sn(*azocO7icBn?JGeZ*N_ z(^oue&NN`syHb7+syh9QL%51*?yrm?QFp-gW)!KMjFD>w+y z#T|>r8aG&0qleM4>J;+a&YSfBT$@vl`!~qNIgGN80YQc+3cJ_xeBl;rlz~&lR$A3^ zyxLKPY4>WrUOm{|^*ENg4B8tEOg|a@#K*Q?8c(%gn(*z2w6`CsTToynsW_=}Az-CZ z_(qVaS*Ov-Tk}z}=+gwzkQ+RR49bZbm9N<2Lg0c%&~l2(ty{X_d_CXOHZDZn9#2K=4+ z@2Ir{i;}1+`CXp1mgRVec^bJTqU*1^jcMs(A?`e zaggRNWT&SZq;DFUyo{QNTj3WtQ*}^auKR++imZu)&D6B?588C>S7V`*&(;1fy7LN6 zl({P@tDHLU@%yWRF7n-zx)n+J#41rXEO?}O;Rrr<$)=5mGMvsx@NE8-7Y&}0 zB2LTG;RDs;&$h)VHpI%WznwQ)*>ix-kLcsm{Lzqb{II3&imTLEZf+Z5=P6OuuOoE5 z7_lE9mcXjevUD!6+tGr7Mu@xcMwu_ZOo=~+Hc>dAu)tfU`k*U+`Lj&pcc5J+RjA73 z-C`;^>9c1h8!RSXH5>Xy6H0n-d2FFD$dHaFkL9mNhz4VDlb(S3x%9auwRTN`X+@tG z>*(~!gp9LS_SzI0)JAW|5iyF5!;QmP122|Ien~F-sduMw!?k~v0y^>ygGVaH$|y7S zjC=}FUOA{`0cq@g2VEDtBRY+2W9OQ#@t9KqTo%VsM?QXZletR7n|^KW=pCfB%52W% ztnK9K^}rnpeYbT1yVT(YR)~3(gX|4id^W-LCzp2}mkd&J`-2iMz4xChJDpt|n=d=b z-;boNjZ#6Rii;dEC-lCHZ;vU0H)F2AslDf+UVxpK}S z2@4*aG61XqCWl#bUPi8S-+vM`i7j1xuK!A5_o#@EB(W!jrFZ+sq*AFQE8Jwm z%$IU_`@^iW9~+AYQ*AcC#tNBqt-k}K_I2wfu)@h$s(3vV{@brQua04DbR-2|B4#_V ze=dMS@Bl?I080@*OLQYUsE1mE`-*HMsi)3=w_|M8teIz>iDjaK#bFvRd7l|Xk(l^D zE1$NYrY_yF`^4;~+|rt(AjhkbV{XaAFFX58n31!JUcuRj+H{X|MD(0VL{Ja3A&R|>bScNb@S@^l%BKN_E}dx? zYn=u5-0RCET|Yq#7+YW6qHU;%s6lU< zw7(eZJBx2h3oQ@wq+5bE)1D^_S@Wz>AI6Jw-fqQ?O0=_bl=L&%WL!EdfI*YW;G~Rvy=LNG@y^Ga)7_V&+*;mZ((r!zN^uhW4#;4}Bc7h!8cQkgjf;6msgT z6WWzGcWB?)d!fqN!s^#8%eb4tUqeoaKij58EWxIX7L?p+rtKOHu5{*45m64JsSXQT zRhkVVRU+vn#@^J6ga45oAUTNn8!=YcF&6!PgjRzH&c)C)^j7iq&S(9&Uyosd#H{!9 z-g%xNUB|F_9qp$vhaR1mtGM}+(KU+zCD--}V17b&MLqGHc+QR)B9yhCf_ArYOvW-* zhj@Q7t?Im-LCCvz?F(eA^*8B<#{^XAuMzmjZASD>`ahpQnzR^2?{Yk&a*pSMRRx*= zJO+!AU>Jib&=VC=E%dp8QHL>7-f|0CsbwD8*Hk2iS58290tmdH{yy?!kfbttLcLLPK{%Sq@ z51c+R2er+&xVeaLo?g;HH|BT8w@H*&z-2a8{R|}aC0iroEkr?T5LjQ5NzfA*i~K;r zh0VM(zA^;__?pSkjnV9DB|RlN9TzZ73KP_=C1X&>*dU$8AXwk*nMCG^mQDFmD)8EF z!B%5NgFZG_PR3w}?(*Rh`SKrR(Ej*jPt$WOdfVHMEkcW;=pya?g)m zOmeFvV|8dxtTn>i9^yF&w%gJDkmmN3Q9A?<7i}R zebzXl?~(E2wN2|kwbzcebBQpFqoElw*Fma&x|v}=ws98qIGnMg$epfM%2#;+fzrCZ zi&4>ekFD}7y>*dz3`_)t&C7C2>dmqro8M)RNx&l?);`)~UADvC3sDJug ze%XbbdmpVv%vt~G(S6lVgslzv$0p*)D9rxm^VNiw{~D{Ft0u4Tw&T;fF;EnDcys*$ z(iX~7OxMK1RUUDZ^uKpD!Q&YveI-nUGyr;cZb`0|A|>)IgeM)Ve>U>-;On103J@~- zoJpe5vtiG&7PtG?lD(6Gj;`>(p*_3poWom`7pP{qoqHM_@`FqrsDp)YJtoO4*wP8+ zEwtBD;eoamjo^4ku=|*-dhALMcuPl5VjL3X6edTcrm<$w2u~B=-`QI)4CKD7#=%}}<)gRsHzaL|dMWEaUE2iD+CB5z*Gj|XHIb&hW-_6E2VG_q zg-1~i2d|BW^a0^yBwS(!S>hRq-LIFqc{KAE9J(!dY8R-l)nA)@M0M#73~N!iGU}Bc z@!RhNu_L|PBtGRc66CT13SvnRqE}~-bIyd8P0O}?S&C>b#gulo{%q1rLIxDjR*xS^ z7d9J?_H@CqnuUcMAVIBggVA5*-^>%UBq8JQ6AXC|aCVXA!6Q-MLAGN=W$1`rnSL_U7+>a00=!X`z=){__*+J zbaS-XiTo_xxFWQ_oclBfo5Zxt=L(%5V_6@s(Nv_%oI1OXCjv z1dNAd5qe*ZWAX_FAbK}bTfo$OVF>?C_0 z2aLneZODhx}Mk5m9Z(M`(np- zh8=hf_=h8_VUrR$3_fY!5lS=mDKhplr(+K#kkqfFL?5xzOYXmsz2MI1Jeml(-p0#e zQ%MIh^oszqF+^wJ>8x|=&%wle>4rCtW$19jDJNgW92O!f-`u4$2`szLjr)cX^dCK% z2vbGx_z;T%oJpM5nC1v<^oGe{*xvl%*voiJLd~Zxz?!%h02oAYQ+3^^DD5ok-7&=! z#vRZ3d`Ok)>}k{;4u^UEG!R4O5u`hJhaMKiDw#SXLdU&1<#Gh8ud1jP6!z+sP?cK;0^Zs@vpAUKFH%tCYyS7wX$N7O{$I!SzRLu89JTTdE}LX zwb8}XXNKFMkKv6w5F2asuw4v-e{V5&T_8IqLE+bH?MG7yXR6}Fy$}EsI zjHB<%Y@i#jfMbZ=erDV1odGtK7`kK1B4Gy?p|N+@nf2puZYW$Og1%ZKXg)Bnq}sP4 z-s0Yv^cp4i_4Z{j+df1igE_vxpDHLg@}A>shXZkMpJ=8DdtHS)-v*30zX7s580hd_ zh>Nv(M^QzEX0+QKsDEYUP90x@Ad3E3k17y(b|~&D)Ta+t7uC>Z=*tCgG2g%nio}qV z!rLe;6pbZsRVt)V{y{Bf0#IG^%qVP}h52>(3KH+j?fFb)<0~v>@FjV{C+VLg?S#g7-)&_gi-VhU#^Yi+v-555g%kb4zimDUp z>C!>YC6Vc`l$2zC=;gL09@_!JY5LYV&qgeCgC4qIdC6`^%d57v7I+Cc)Z*HF;4OF& zdbD;|vXk4n^XVIk<0b)X@vM2+Ruqmh-ZKytQIxle(VDZQ-ReYe!sYyFlOshWl2uPT zv)LNx!3DLwPxoMEnR)bS=#~}hR;N3CK@*k;_tqNb z@S-3l(kI`a2^v}xSk-n03Y$$o&LeK89ztNL9EPXrDgO zL7a$9Yw@9PAV)DC{p9cQA$X?1n97T_H0S{Jr1&Y%Fxqa_FhBS#9YeI`dKEGqQ^vDl zpKS*GBfWtf@f7|;B!wG%NN*E`j(SrYjxy8eW4hhy^6fvI?$RQa##6P#;AN%Tgt6?Q zB6gkf<}@-h0>l!ykTqdI!;2J68LhM7?ma3ONH-kX&}!S~isrCQwUL>s{(NcDlcmId zaX~&H9+(G0zc)8Lp=YTP0>uKjnx8BN_3ksfmj3LI6fbI#GvH!Ra-|JG+zI>4q@hnj zJrVPc_iU(Gmf!meAYDx|g)m9BtiGn7oKbGQcpGf`ve%;Mp{TOl8fC>>U^4qWB+`wA z>Kqy~)h8aVDHWijjW&Ea*dG9dc#dZVk$x#&cbYyZWh~ov2kYQyl$heS z!yF?LUgR&IM-2sx35tMZwsn7I&pkz*O;ZUO8rLmxq}yPTn_kD|P}$?Jq6pv1Q|^s{ zlDZ!pntzW5E0m8+R)$I&#tl8ZJX3Al6A!!(4#X3X$A9z-x(j=qQ$$8@g2sI()E<6W zBLbAhVnT(y_w`F7O|luuZ0G89K(R3tIpqE-aRjst(UY9L$Ky1Vatvmz)k4PIy*cNDV+{aj=#DW|luP|76F45^95?@M@%0 zVZwNdxy{5}^t<6&PmDow=$&FQok@DCGEi#sdP)pAh@p=M@Q;GNMlaJYw{$gp&nXjm zQqpdzOM~(v=@}lkDzzZ&G)_Q{OB9`h+trM=^O6?B&NQ1sD@{V^q#Siy)ORi3P}yO_ zHmwx-w|7BZ@0Tq`tsu@0J@&{GxevQ%nTwy|=WOS)Tn$sxXTsFgQ#EvcAg(v|E-_xu zRmuN!rS&;YPAxrfiHlpd5);lZyN2l#m?qTqo%3iJT}}5pPB-JN)U3NKbM59&tNiO* zf?p#xCQ$ZsHZ!V%XfNUF=}JF_P0@?!NM$khqe$DV$ulF}>X{%G&jmSlUki;(6IAt# zp^}}7y=2e7?o`t<5Qwz@1d!5E>?PohWD12^t;QPFYxguir_iHSf zlik^IDNvh)!wC>3m8A1qGnzwkqrG7polWWeiY|bCat35|+@VR!FTwMO)8ZBBi|q?p zPpUb9N$fP_1NDMWyazxDxH1h#QZc?X;oSlg$1!lYEQ#QH;{&?3sQ$TL^DN+!eN-Tm zCwxHt0G`m{qdDYkg@jzoTI(4|E> zy_w!ntoB)yZQ)gg*^vp^IGD4^9ED?&jKFpvAFa`-0Li;{F$6DQ?MoK@%!;D>-1OK2 zvQ$W!a^q(;ipKLHSBDBEbj))6$w*~~H0Nh8Dt{S`AiCyKl_(s8aafbB9AgWQ zVbO8=_O(gkYQh~G&!T%vgz+=>9|`9lkq+n1T*8*J7rLm*3h?AGd^mXD#_)TP=rS~) zf0k6189&et;B?1zK)RK)?UjF{0$Eqis9j9eUC+%P10t;+yGJ65_f9O1dHS~{kmDm` z^8^L>?>}WwrkQpP1JDCMM+_`^ue(Ac=^~IavAW`fk^+|u)^_WJ(8u*Z@*dSPN=Vim zAU_wy$fmN36-3)+)_ZmcBHj3NHJqyle)yyKhK-eZd-y>KRa%uuTQyYGSf5m-)EJ%w~wY{PWM<)>hy zIOl6)=#tYfBIsAYUscC-W_{0M84qDySu4lzB>l{o(r!Jk+=?ndgTbwJpDgCChk(hk z7_VJsUx@$}rPI?BFDr|5cDZO@i!__4d;3e2&2EQX!&R~DI-}Kv0G^ZDSdp?`bwlC$ zL#f3!wzeaXQ0q*{OR?nuh#ZSFl!zEPS;i#zVPSRZV+m@X$=xbUL#Y4$^6a3FzNDVq z$uMdMyHQoHWA{#sC_F{aRJmAGKbo&+PY)ChQ`?!|U|2I?r&_!Y;0WQTEe6+^`xjhq zD7;1O;X-srx9#%1It`8b+68czR_ov=z&O~m?`Q02!>)msGl8!{`5Quq@B2D7q;jFU zzAUEAeT&Kez^?-bCoB}8ZKo!3XTV*y#5ZmeudrR)Wqj)q5N&G?IZUGRNK)FJIRm?l(<(wEt&8_f=BRx^GW4?ntzLf}Izy}q?zpc=Ylf;^zMABfW z^)^-X1MS(>`9Aw-aFf=aH@gm^FQXx_XUvZP*HgU?V>+>iYg4O!0lgZ&5wHI)S4W0oL&H_^vrao7M-m;g?$eLiW=(%^iWPaTH`j zOx6}&MBq`#K+R8aBeG&O+^;etke-vx66Z169GL zGVvgaAvK+kPHd0nKFw)TMVFUTxj6FpJipxRONg4x=Q^7i{b?~KyMLR8ljR@8?{PO` z8}j?yK7j3`L2t#~%SK-N;Gd-kJ4F1cu$QFMu_W4U_AFTx>Gq)r;7q6*texv!m^^&^ zNL0>E^6~U?nvW7&_afXP#@`5}U+e@MrpY}{bKsCFh0UJAI`olt?lg^q-BhsP^ajY` zcd z#`ypjU)H?>^jqR{aOd_+vwvv6w#fIo+A_AyeOns2d>LJBPQt)9F_P}bKGH+`RW=n< zpPX`DOu2fB%sQ?XM^-^av)1Ak$UPnmutu8c@h!Ek=B0NgyS`yK(lPO!I=VHgbM|8v zsYAo)bze$e0wCqD(gGtP_a`l>t4v%;msGB!9x@#&3V$DXe(ql#{VtVGF1&kW?b%Z3 z++dgBO?lDIFhL4M4h5GZNnvP$S7u?~q1Hr8Y$dG#V}(mo!a7IelAv>5VVRwCqrmI; z_7-Ww-CwEcT-DgnFB7;ws=$(%TM@!EA)Am+zweIWg{><^|o0gt4A2%U-Y@@&u5O!y`>!I(tp*V;(*IL8)HXvU(ty( zk`5Mdj7#RvRFd7F>2FIpKry}kqD!dR?KiqrcaOnrRD2EI^UHe>{Ty3hhcEDi%T7A9 zSQ#{-T*CQL>eiomNi}x|0vUF(_oH=@lvNNO2gt40?8Z~9G}Fv8ZRH?tH}BGz#~d%u z^z2u+3xmzCA}R><-F77CEL-CHl;fS+jFx-cIMX?MFJbjHrN>>fs*DTo0f)8Sq!W0Z zH5z^UL`wyA)X8FJcnBUh2#+|~oSBY^tjU0yt&?DDtJ`c%ND zZx^rb2hZnA0fyIRcqX zeQbk&X8g3*N9wJGYOF1}3PN}_{QbIiEfDd%OS-Qr(lkd<^fK1+G-fE0s;mN+eC%(O z(XWtF%*D@hkjkyfrK3-)rEhjOEt&T{%RvoD7%|&DC0Bm7U$ghm_9>uybq7p6Pi;2_ z_PKlh5S_rs>!;@_-KsfvTtbSq#to1Z9o`$0F1tGo=z78k_Edn+B!HY?zhig2rdd{n zsd+slYC>b5+@TYeuU-iHNMb)v-+_wXsb1X7bu@quYk*s2q=pJnx(qz_iB9vvD1jXO zn%itoyc4WeybIsIU&v=$M|Vxc9JKlTMr^Uv%YmkL1Uzf0M9i5z|3NAGz=oK%JKJT; z^E%$cJ*Cyoylx9!!jj0pb7peAuH_957vkXB7bo9C1!fRU#q5Ddp3IM^vralKk503@ z@5@=ve(W9@dAU5={!XU>%Lj=VjA^CS*hHJ>y%)tdbo&MGZ5odg-XW%ykZGJgCR5h=Jn4gMYbN=0=PCy{3gc`V(CRm&Q6N2v^YZ3}8=Dnn(s;!p88ga>rAk{1YPkC- zVLY5nf_;e9zyz*38e)*nDe4`%D7Jxtd<~)iY_xz8GWcwEaClXG3b#OddmW`uJSfl^ z4Cj_1e$fRxj?F>qAlBH>F5?aRj8k!S=!Hq6_EBs4nDPwgR(Gt;Oh$cSHnG%7CTGi6 z@&Cj(11NfdhBmSGHj2s(0a>=SVCV05o{r%?_h(UC(Nj&wITJU<)+;nnovs9VLig1d zwtzx_RDKrE&PR3f^&f$Br9YVz_eOM-A=9i1#+Sv{4c~=0UOqCOBVn-T+D0;)+|k}Y zI)F#Rm&B)}y1Mc*O6j3?XJpDUmgQf*SnunGt)yqK0*Qm=on>xpznk7Uv#j0Yf(1_# zdg;{1fqNR0cdmK%+ga|tfB2qAa|~!&Ha9RA(|g^o+2cJ9z)~oQ#4_YlQ6E_G zuPmj#(h8{YR8Sap4^Gi$NsEm&U>Ce)GbL4f-H>1}Iai8y51t=x<+&(UoF9^x4Dpg; z`~KdnN%+cA1Qs20Y4vct<*?S^*K0d`LiPRnZzVz7@kT)HuZUL{6+^qe(O==(?elK~ z#t|>ze!byy>b1Pve<8jV;osk3IM6m_VfNujz;b>_XYp>6i0kwdtiWpRG(FC3)vf%X z_~!3ILv00mR`l1c9u)V!ph0+R97M=wY@xy+GU) z!Q~S;zc82?-*o9UKnL5)Ky`E#8N$Uu=rzHvDNpGcs+8PxS-`TIx?`S#qS9y? zoqbCa9jHpY^=`qFej_E!N@|N+H_c=NmMKu-DpYJE1Zs2Fga@a2^WuX^8y0FIIu+zm zNOil(hbZya-w#0tSQGTk!pyis9F{=7seLOQfhWTDv zaR{sLEe!YrUz*vC4x`F8+Z;e?SN3~G(soCR#KH7!E+8WL)0DxYoRTA(_VDDRKM!iy zB5X1dtV}j>Xlll=$1nkGP1>C;L0@xmfamYB@dXmOL*5OMLR&<+9$4y+Y}VY=DP)8( zYRdEWh^(O0Q+0Fp_&q|8J2p-_yG&MQYkr*mJ{CzOPN(fl66u9_wDwOrvm*zOGp~CH zXr5C}f0h#Y=fTdVs-#MGWTvTS`VLYy(c!x_3l0fi+dU>s14z%7QXQ;oieGTH@~{tJ*XJ^webrcF{<2(v;$EHqAXqLXa4np|R!CL}UnF=< z|EMSte1(H3#b(*_HvQZ~K=`~(AJ1Vt@BFIxYX|3_9t zL9n1ruq&G`lxW{!B?&+Pne0jJ9QE(m&Gn|~Mf!>`4Le}wAvX1t@=%sGe=gTF+GLD4 z{ZJ?oOT{YLQ?l>vSJaWK{6UM+noC9~mYQ&ACT?z~sGOXh!)`Iy`d~YmamsH_Xi;ch zV={^{-KM1{_z$uDL0;qHqV>mvvWYp5!j`i@m&q=Y17?H~4t*b~-3{woo?NvSxhNe)9TTKU_+mZ9Q_~@M8Ic`5kx$gQ{UJLMb(_GY z1AN>uo^x*bApb!W)h*H%QDPyU#5yoowHA6$F+0WEw_if7LGd3KXXY<1r%IARG|n z25jB83-`$df-~Si-(`vN>vzR@CkyZ9aY-&z&2J*o?0lc0vn5N|2 zhLtq&QL_L;3fASoj)d1-PS-SWj=SkECL9Z=guw_@eAgLmB0}hOJ1~uhJO`kh?cpsW z-dTE+Y!M6=er6j#y(tz4a1 zJ?9eICw;i5 zqu;9X>@Oa9-1A04?L=OvZJN)MW{)&Jc~U>pJ0S7e#_={`Zw-e_5HO0S+;_xSngZ2 zDM~DR3Cp6tha_$|hHQcX{*0kj^q)L7Wh87MFe1e*SHQ%ECPhgi|A2n?)-S?R3?y~< zE*SEW;D|FRr9x0Gji<~jK=?n3Z4=kIi}}inK~)iyyutmU726BVR~w&Dv=2BV{u&|t zo%g3~B|a&yJd}@S=b5#=4cYt)pE7=)aX^;%vo`xeBPLl48PoVRiebcazON`{C_yf& z(XP|T27aG^G=Lh}hl=++rYSRig60Y$zR^t;1?&^nRc?}vSL-j%itnot{7^>Ut2B!v z1ae#ayxr=)yb8f_Y!Cc+Cz7I*Up2Hv;E8IG9L8^i=J+b>s)X9>oG{Em3S}bUihh4( zy3}RySWb2j#3H{+&FOGS9jlexdR81CtKd7g5W0k$!5R zk{%8^hX1+}^^qQWR?8D?8!fX4J(LdrUDEDcYCm;_Bv48ct@se;i`3JRTL2HhT{1g>Qv8DDAdCdo%K6D!xzF)@GH(lt8w|j zu>0{f*Gq5&bj4k<2{48o7}ijEe0V8K;dC4y(juRE4;So^b?5{^CNVeEBG?Gkh)wb){n%gw65X% z`sl%f!M_hay#b3)QX~5ZhJ{ymD!t`eE{p+wLq2)hX!7gx`4(j_6F@1>;Gcvql{9FS zF3HwzSCATux@kWfm7f0+daki2u9)KsIsC)1hJk3e4o@Czzge3QIf#Z(JNu?xzS{U` zFOxHR%PG)TaAzQaF5VQGqeFepGk^O?yw~5jw!n;k`@^f}=ZYdnX_Q_jRql%3O7;OA z%?Hdcrx9x>EgJo5rd@whfPdW@=+RO~?1WvNg0hw!ywVyV`vv8Ses1I{loh;3CiSTx zQOnUCxZYR?qMR~oR#3ojY`N)eH?#D0)9jak5_zR=)I5do)@kt#wrPQmyaXpqOe23W z_51qMrotoG$_&&{YJ>*t*P+|pZar{MU|v0*KUxU%{XC~_K(#(Mb0va29qS?6z#s}U zZQUFfFAG6rfycpYZ!K8RgPP{h?~EI#4_0dV5vR*UR9pQAepff9W0*w{{f9((j#*uI64u8}Vd z*$|sH;2mbM5cVf9M$gg9DE24$KIqoEaSh>{u|E5#yQ9*4bpQQ7R(WOfL5Ey{)EhgRJIO3g z#(}?@o1A>%@kiD(is(tpzJ3*)-6r?RfRySq0>t(L-}`E{m1!-`=g3d-0~JaTa<; zW5gNHR*nh(4es+g&BRP4c->@NnqbQqM#p>~y70dHmRBkt|8F+zPCeanT)fY9M5h*( zlIduxhHI z+Rd^%Ehzy4FwG7WM+Sr*UZ{F4$hUJat`-cFySwh>2wb6d>um7FTkyTR(>}L&Y>O@9?`syHIEn zuZ-Dl0DE*)eQt`7-av51-!RpfT#tfxZ-U;fJf*w$J$RD>w_(sGS81_tC)O#hP{iNd zXyBJ?RNWrtEGuRn@Vc0OkE-(bVp6$NlCY4gkRNa9?fKiRs-qqBF6Pfu5^pH*W?SB! zRC2d8x#~KgLQ1yTPU>uVt{y%eJsWkX_Iv-4yB@zrFPLY9CJd}lPCXc(F$Nkm*60~^0=LGKr#_xMx2|e?>NuGO*(@C_; zy!7yJH2@^UNG^S*PL>ZZU-I!CADXNL;UsKkW-GZvyp@uaRQQcoE5-w*tzbKBMEIPK z8ZO`O*uFgn6^vO^6~neExyDO`H*o%2PU=x~=0h<)wD88qBI1bX#G=~qu66IdT5`| z-k8Q*^b=gNVL^UE5j=A;@!f0BdCOl;W$suv>h;+Nr*tem&ks2{pY@%Ws4MA^_baSi zTF47lG6!dBWWt+(pkx{>@-{x%z^s}b1Ez{V{=~Mbwkt2DrMb60HD;ZaWIx9bsI)ZK zq`BtD{PU`);7!xP5whPu=NYd;b!EQ8tjSU>E6F+M4S>4AR(|CiJ{VG?q4+dhLn@hc z;ns!@YOr-SJks_ zn4G5OgXBf20LMbgKj#X31=;9f)B zZ*5$mU*{jj_2Ye!qwRi2_rSu?=C6k|e4ctx92q}%N4TS^2tKeBKl4H}F3;sL%X^6x z-PPO=7qxhpbSi-ahdQ!@c$pdBLmRHw`Ay=6ZPE38tr@Kvw(8WxQ+?uX>GSB5y8&^A zHHgXF?SX<-boR9>a3kwP#1aToT(0m^ndCyTdx zSl7Fc)X11Os_dRbK|bfz$|0Axm=TDw_+$ZsiD#7>mC*ue9ops0uvk}<`y$NGNZ$3t zl%bxyJ<*#8e$W-d_!+?G96Av721%x`d%^}gB@DP?pZvi(*sYPTm6}`ST1VY{y#l~} z4o@rdxhgBO0&0oU2_=pJk$Q&-D;Q-d=$1?zAi3(f?WSUf{8&E640GyPQ9~ z2L~%=kQs&s=xmbI^Y%U{?LZeD(?7qcmjM*qxb(pEDMqX)Vo#jMRSer^Z2XisIYG(} zyL~pGN?N(OFcoik2mp9=yW*4`LWR+`D^C4SSS32^BxJNlChuh`r}UmFn$V*nxF{2R z`T*k~n+4+xW3RDb7kY40=!>;LY3C^twdCLYu15#0KhxS z>TkY&)r0jU*|4d0!TI5h^KVW9(EeDC(sROe%ZqQ#(KEnXpLyGA`GuyL%fSPIvqjOt`n@^VqQomzi{n9zgUMiw4o$f2Li3atb;; z6`)r%yNdU)c>BN{MMf!y+xzdBd!7Z=Mk1j0Y1^?`65lm;^Q`!utGQ?NM-Z;e#!dLq zRs+Vj$>bDR(I@o})eWf$)^sFxD_Pi)uaSB$~Y_Kuwax?_QyggTi+8^0*3j(L} zDwRqQL&ut4u#Q&(J?uEZ?0c}T1I!!%kFv{VJRU=oJwDvyYDoc$h!}^KJ9n<^>g?a+ zbmb6XDjp>B@hkbKUoT&IOb5p+Yi87LxhO;CUR>AT?FoIXXcC1|rITI6tOdWU2f@67 zrDN#LO0Lnr8l-2fi~NqH&p22`66ZUtfCpD7FqjlaYhh>%HTt2z;)u{4RL%eU)>d0{G^`Lp|OO52dswki-N`JG(TqZ%nU_JN6 z>G=^I9!AqY1+s0t8()11h+n-Gw&u3M9{yCB6~Z*hHuRD~)&Wm?GIKVbWzO4t9#XSD zv-`;l)(uhO;)<*%R#IxUOJ2q-La{KCC$~1Il`ID0uO@HjKt7w0(v{gfGm=L6MM#$E zpdfjc_bV*#k7XS(z1@+Pbew(X686}fpgh+rYi>O-9?BM4RZY^)!;;^Sz@)!3SJV}=uru3f z-&4JEs)R2Tv@Bp~0l~EX_FewLN|coaFC#KRj(!{u7krFAKJ3s*JY9HbtNm8ZTC8t&M|&;}KMRbBx%?_yu9=t8*o< zVesusk&dk0_$-+kDd{kh`v4 zq;X&Rh3$wzw;0lGDP|U9F@s^NiP`KO6I)yP<~ex_M}s$V zhr|`kG;ZKTCT&{l#lJ@`G?#DKtj_~urb&D4)JsEkPSsEX7r{wzKsKt^%mTu;mWg#x zajQFhAcvL*6j!||vcpS^N&Gm*rAZBYMDUe?+=RaT+%-!m+;oL!AwS{XPOxyHu?VM` zId!`*(o=Q$gnQWQLOdnKi63+H%`mzbOnQl>-8XfT@u z@f0f}c2L8Rf_A=`rf}7!u}vTroG1;9us7&kw%Y!hh_mtFa0863!&(8E>)2Hx*dyzU zcw3Bhji7&%Q*xeaK0Wr*lLLUMHY;Y)&$(W718ibFHTdbrLS;&PkOwbw0fu8VIL-;k z&p>0IHdI}m=(*~liXA=b%)a$NR#s0foCDjlg*uBVT{1MPd%W_d;Q-W2O@*wt3u|2m zzENXcYfLg|(;WEX%BYstE-`f2P`BBi2we`13{4;ml9}qz2RAl3JGmAwpD{gqq+syZ24V5}1=B9@j18pk_r;BI!9 zCgOSpwj-cnyk#B)HqwccVAbn&G!-R|s&y1yK$5@4iXM0NNpXliI2W6)5D%#Zw;R^Ix4aD))Jiz6e@Ll$b8hII z``6(!cPRW#@*#9wHSp|9a)}6jgOm9s=;S{gLXXtYMph4Hwx3nL7#~2rBgjuJ`Hu#! z%djln6?};McWkxJboWXP{hnjo_HcP?ykjLh9GNBZpd|0m82NmTprPaq)0=?UvJlf> zt8@qOd_7M#Pz+j5SJ3Qp4od^OXo z0@ssl(&Tzb8_-s(B#NwB^Q>#@H@NVx!sPr7JJs{)PCF&_{cI*=iahqNBu-zp^s8;# zdFuN)1VI$g|0WfOj`nB(^X_#So}<~P&%&J3tErZorAI)x)x@_&N`_^vL(Js%j*vLE zd9!=Z9zZf05cDzAu!7Mc-+xGEV*y^z5xj1b>aQU!o~|-R2E_^;6OqitMAqDgeh?>N zW%HFm=@A%NM{TyFzG_yF)300KOb>_{XKz1*>BkbDU-w=ul z4Zl{jZp35yT}s08Fy;Ae1rqJ`219OM^y%_?3H zJR1mpCz5SbQB8hU#r_X$RN=Vc@UX>6mkr$e0`Ed$0%O2HOzhvGbSAOOkC=mG=zXX?U)LK~hVY#j5R6U_H zMd=4H(N(^MZ+E1G3DxNW5Y)M|NTIThBArPk3&EEu)J@ZV!XF59_JLm7n1^QQggl3| z2WZxmD}JKCywZ);8(Vu8?Vx>5YO2HPabPqSoQejy-SXSjK$kx5vIzG{t0AV7eNQr+ z=tz%%$~WpcF_(4J$9?$dsPoaAkI(PWgt$-FJxQHops4kshF8f=9KY0>UgS-7r4{D9 z;?dd&7m#*>6Vf3~x!LfVhfguV^woIqoAoU79?}&-T>q)6z%vPzXkx}DuidIzvKga8 zG@@|Xpn$>A{U_jH{chb~v0B;Ycobp`jx4~pSYbKh^3b9F6z3S{Lcl3n*Atp92i}Bs!cGFAA2DNO4uZPkh^dSa}S5FyW`E+q<>c_ z^&nFlZ1h#P<4gGBT=gNkFJ1dy_jB1a!=T04Qy*tMhCef-Z^xOV%Pk!F?%h!BV*N`GTXXAPB)UMczLQ&vyQL;Iarib!@59lj6&Bx>=j3Ok8tjm%X_ z1<%knAR^9NZx>o<Q+8gOc2PSo2Hli`zX`i zaJU)L=|0}g`PUB($*LSy%OgsB8N^OUAIZMl6lsbtTsMB(k;f(JeRvdXCbA>!5W+T& zh$@aSeBQU4H9(yH29l1jgI`shKOi%S4lD_sc&Sm03a1`<3BZVXtE1r7uu?*lJ}={Q zYb-p{^2z4EmI}Iq=&U%V66VU9tvV-hGGGOHs8juMAK@tos8g zaZ>YtW^wPS_SctAxR=z>1iO}nA}q|m1XSnSL)MG+S9ee=CHxG@^-Z@`Z+5Ky{jy(V zF2-qZu8=L=v7!_n5h3)Qv@~_D6`0YC@{@+{IMnOmq_fGC?EJ(cn|)0!9i>`d$V+LV zM8nNH&rn$MZ!)w++$wKvt#4XK-TgO}@c(nn&3nPco?*yMOXDC@tHbLSVw}n?iS?vx zbdX5S+S!y2PjcB~ep@Ki1M#cFmconpUpvYg)lcPyWOe5$DNgBAd}n2JGkckTbT7E# zuReE-UVU8sY?V0s{OCT|GT_(g+e#arQAP%W5?ShsMbjvRJf1I2ZY`L$Pl2|*UFW12 zp`0#6d#^e4NAJ)v2!o{0L|Aw`EqCY&!nUkzjI{|Gm?zxo8_Fgt3LQSz%*(AoHMcrs z-U`vW5JO!&lhE#J8D;l;I_U(x9pmdA$(!qiGA6BWP%*s#dAq6&AG@Wvt|*_<+Qlz^ z4XRXOD;x+ud64x*FA3)}XFRL)9+BCAN9s-%Z!I~`t&_xSFL|nUYG<4e5+!NnKSo%L zmK0RXS=@$6y*62dDjI~)7q^usiYet!T}k%%pTE(;XIS3F zV)9jv^0A2?7Pju!LW+ijlhSWb@AZ!mOGW+(wcjF;eoL3wINc}uasJ1${BiR{7yl!_ zsYU8->1@8;+lI5wHRXkALwWR2X0L~Vs!`RpCp=ceA}y4Zk(~C`RtFp0%IYt@4o!Xu zIIw#<$X)C+*JKv`|3Ff9pn8<`9M5{kQEMO?t*Zp`R%PY{^Y#6f{uE?l;-Ora_jEFi z^H%cwwAS@w&L-}wT+fJU9|0{fvKfep@&PrfwfZAiwBqG7`ETaYsEG^o6T%@))Djfl zd$p5g%r4hA>(nT;^6e)wLMLH_8l?l76T78nFj|?WTJ0_TqDccQr18#MatL)4ihLO* z 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 z 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

    $3Q;8j)xWVW%&-Y;Lt3<=vP}?Q zL8aWe<{3hVKB6D{s=%RDMY!G9A5F?T<`1uE8rvs2*I7|GBN|@iH^nW<~)RiK}($>jbp{(}H`O=AAWK#Q42z3RpP2r3Rs0Zi!Vr#InVpm^A64 zn~}1j6=Sey>P9TONte4dK`_H)zj#q5L(y5IuF94A3z+V0wS|GQxSXD_ag#W*_~DRk zPs~bFcf;^rGZH_IjReyy4y-R4^!eGn0Oo z|1yy97q&pvSyukpXcE~1effZ$xofR6P(ceM_*D4zh|L(?He-YJ#V|}MP->HOhk<&q z8Vk;<*!%1X?(Ih!Q57`u?7iO@@r3}4`{+HA`3P)gmC(uW;ccq8w#{9iSAN?+Sntdl zN@_VtqZ&UBD%j0YBdb}|~qk`hSQ_rVM5zx;%=?S@Ep z2A-D@`GYo;u1^hIR;G?ame3^rg*^pya}Y7R;RFVn@Ke5p!zAO3y242Tw@r>dkDNA* z`!2HVWk^D&3GuJ?^+YUjkp{)aoS7No)H;ChIz8)lSx&bD%Cj3DRz8+*^vO|nBBDe{ zh@hO-Q?#}YYKzEBA=|Z<0!ONF6Y@~j+8hfe@}>o)9u}1qFJKQB-yE$?p=YO6zo8rv z%A$JI>n)L9J55V+UGM~nM7Y$m7QG8-(E)NB`Uvu@^i^2MCJR1OH#7iDZVdce1^Zo~ z`|<=3zLS4+G|g}Q$4~x0M4fe56kN3Rkxm&2r9--;L3(JEmXL06Xz7v|N*aR_q+7bX zyF(-;B!&_x>G}@7-@W%Ad>-bZoSAd>UVE+ICiW=91Ls?GK&oF9;L5C36DDtwtp4+9 z+VwR5T_TiCxT%9$sJR*1QDRQ1IlO^GWnD2pgC3*;-nHR2-FJuMrUHKiz081@-g92i z=+;tp8Xt8S1-q0w9F$nsWDV*6B41>)7cnwFRBqS5KF({CD#MVQ#YgoeAu^XBzzg2H zF_+r;SKU9OW!2){OI4d)N(uU7HM2|sJ+2Kah#{dl0>3Of=G+MP=J#)rUp}fE=$CbN z*WWG$U&u%wk!2}ZK%W2Z1$>5XhAqb7fbxEE-6^xQVdXDyxg%N1g~va!e#ec*;iHmC z=;8`|HN~_30d)V_-j&j=H@cG!8xb`*@Gfkx9rb)hVhz$wRjD;t4qxS5 zbjHxEd|dOK`}y0+aaojj{+KJdjOdq6DDVEq9gT$}zQ=b!$7()ukt%;HVJ~wFQTvF+ z0V(iknHd((vlOU)@%rJ|Y;n^az1(sx&XBq2;n_-4?ldq9Ddg@G0JB>Ss;>lt=h2(| z7jw{a712k4Dr%Ac%o!I|?$aM<3S7+Ha6qynrT+UJrGxq{jhghAanT1UjH^2{oF|6a zx8PhK^Wf^vXS!TYE4l4uQutmC&G7JgOar+V?KidOIw<(QqKou0MATatq)H{3WR5$$ zF%+9$ysp8Qs&hl#Se^TdZ!@HzO6P}Iephp9d9aMd=PwxKKdNp%A9=Gnr03toi?06} zgtYY5rXvlPKN!;8>^VCA$u$?sAi0DG^q9ps(~QFe*v#uu$|gWr)!5RcPv7gXw0+%F zRex`o`i#B`8m~;4#pg}ume4OBys^CcB{@KTFhM9R|O(pUxiJB3XU79GjjG{1($GGEN@1Nca^A71o$Q< zPKguca%S^i*sAIdzEF48@>)ZTyN?IhX68p-SJ4K)Ctx?(D+K{a(1?VBZ7 zzkN}>Fwt;Qv_UAX(Dxi?kwtMW4W-q4W0HFmnz78bd;o`PxkgouFO1vv+bPIH6W{+? z2G3iB_L}t=7JsppBJBFl`{NKhyt9mSh=%EIkS!E26+yATLHBI#H}Z@q&O!iQ>{Wt z%D9nZ&NuWhuqoh2ctTXdt8%sO83CiWM&^PcO`<)1wZD)4!Z){i-@13c|iNDk(?vR_~Blokgm%;>S>T@ zD;8x;g6ZBA<$U;06w@Eo-rpi+%??r%uBW59gaKLobpF%Ys99pH2 zu_L4_=8kOG8LbS8siV5YH$(SDNO5waAd`#%i^m@c)WFoZl<8_{xm%Tu${Y0j%xL8y z_c3Ymlo+n)9BalvFEf-quM8|j0Y!9nq2|7zgs7~7o3#4FPi>a3aZr=h-1)04p5K?j z9Ud1e9JFakR!pCKUz}1v+!G1f_#%@?L{C6A%0yY;DfQnqQu%9`EWB|ct5^WGFb}L< zWv6X_rA-c|w2s+q4%kjlx>Mdie25Ap7Iwwym&JI-C1uL?Ob1lwBX!u(1`8hmYuHumZk$mlzs*a2^6>eBIiARG7p8OKbV zw=vg#KH_XxQ~BxaQd^r{{^6%6|B4zP^&8u9m&&i-gor8+8uNqY?NyuJHT}LLslRe( zUS>QJSy0z>eCIRYbT8>{d!SQ0yq^?pWt};s5v^lIDcMQ}t`p@#wKou_7tEui7NTG8 zn#(735T6%2aKw)0hXt~J37*Uk4?2vYm?Az4XZOzHJ@cVDP7DamI`fcOH;R7--ES+a zIDd_neA`;_H&bYkCxpNc$wEYX9iCPn4q!FQ^E!@U5$e5j z3DUsoAPj$ar5-|`*YUkWcdhP{Z%atvSHW{9i%lnfv3lz8Y(Bo zWWlG73G7(K4?ao7qY-oeEi?IvUGJD>P5fdlgzKC*4TO0xsgygk2GZk3X==nue$l)f zIl=Kb9eQt_$cu<*kIh`fK&G6UyrjI#xtByW?&tSOCFt8RxBSE;O$P2vT)HnxKo?dy zXY*lcOT45ZiHyV^dN1B;B#e1rScTwx#uEM5a^3yx-GW3Q*<9G8aAzRho`B;cu?H2; zHNu_VSW1c{Wd38bC)&VM6K93_kGQNB=$qljm%Tv^B?jajb+-x_$Xc32x)DA9fH*t% zEz{@7a zB}UGuaY6iO-u-L%^$=@ASY--5+p#haCQ3BTImyE^UmX&C{eJIR=ZL)mPPh7P=?a=5 z>p%q`{cwf;>ro73{x<96(ywct_aohjVk&+DgMHr(TDaW$#ehOawnOO|D-%o12b9^< zIp4JB&FXL4(?*7>0v-L~<=;e*?LUDGVv^=uipNX=@MRS5M6vCKmFkY2%yWMkJ%GK& z+qwxM>=JpoUp5w#-KNg@rjLM|>-#IDI|X`(Xq@w5SoFVHt5!nUZVamb@>@4kJ1)ja zN*NXh<~B%gAad8L@8QdMTi?#*YS%6h%3>WD+esC-CJGoBHQ_)G+DJ9rL!ED%_0sw3 zjcZ*4sB1~vzPI!O#SK?)CYu!iLgOk$o<2Z^IVo zRNGjKVt0TcjV%s01lBt*Xj}6A9tvR<*Wyh>)JFY>AD8Q?@yp+KN3-8gyf#Te$Sv@ZsxuACZm|S*4%53EjHXM7Pno@2u znk(e%Bh=oUYcI_mKlJsb5D}+Z!%r9YwNFXtuQ6P-YjAj@y;3+Wy_VBa6qRLu-7%;o zd>I+wk?&-G>-FW=Gb=T^2x{(V4Uxf)EXCGG3mpS7XGtS~ehC~|AFgb)+{bb@u~zi= z&N5M85nHIqB^OczJuBP4E}sN{k)spdS+GVcI5G2|z;?CEJs&5v{D{1%tdhWN^-$$; zO*Y34nvQ6O7x@e5p$bQ}lu-4ZMtO@?$v-24;oi8Yu-)&m84TtJY5rZ=V`0)nH`Yc{ zDRz1oPfPdzK6IaY`4V_>)?4J@?RI#Qf2%<0vKXuO+v~nCq*{JQ>q8kta&JWBP@L#rO%pTuA>B4ti z#C^Meu(M_tY22|T{j=w4#?JiU0#EPdH*wepW<+9>ZAM^jX*2UYJVmp3uJwmnwdX-uZvWFwklm~6XLh{mPka?QDJGd8D=!lQQwiS<)C8LJXm>T-G+kR)DLP7t zR7E!2x~**TeOjileAiJ{5`GI)646;L3j7SkTun_3wpBovBSnRf-p8`xLhgBuB7PX8 zff^CH6cD+k^zspNa|B6|cagqr7Tj(6@W=Qvj4;)$*>kFka1B^15Rxd}8C}-n?fW)A zt)!BxeNC0$F%(mBbhl0$@jQ&rTywzbjC^H!VjT8j+LGcjCpn0@hvCs14^F<@(~3f2 zldrMcp)^>}DcRon(SP`5knJTG?Fs}wdy86yxRcMM=}()dBT36e;Ss}NR{IDC+5NCR zTGbY?Bdq{CQZ!skq!05=-V|wkCLNV@p?k~(;SDu@Za%fybvBbxg7=i#*;5^@f0E3K zRndcmo`4ez8Y2tIx9bCKPa*9F8%sV6n+vXwW}d!11q9JKm73Tl4ol;C{aqvH~>x{hD3k^ zsw!RYyk>_nzv^X*Vp8&oDoamFQY47_vwnn%orlAS0#D#{XLw@eLwgUQAYD{IfZ*0z z)MnOV{2S^tCbHpYoX)7Wj)_mavaZ(zsxm-;NS_!JHoGA!+O>l9ETHY^LjmaN+pjR6 zk$;LneQ5AHxVHfF>!E1UgI*C}46)o1%Tns_n;01aW1xgYV#&^IovpSx6xph3BK5dp z({OyO*c}E2U6`qV+oaE6CdqTI#^-U4@zYwBe=PgXZfF156zb}Yf}hg8%fnZ*?Z8%&pHT*&<@_zHD|79k_KY{q7SO9mo$TWhoXl+!B_X+KO!G31&7Gj-TyV_R2(Qd4(pq|wGtZ_J54JS&9e*mAVlA&)S9 zxdPYBmWpu6F|~TogN7w5No&q_OIyP%Sf3_cgu5oiv#|63Q*o_(&b`TU*X(TME3mp< zUQ_jO4GbKyiHF<0J$ZX^-1!ovf>$I^%Dp@H9TluOs{PBkPo~ZePuk5!FdDu$&NDYr zE=?ZQtG24<&O%axH_$1CjD)w)I8FMkNWVA2K~}|9`@=u%G+PUhQ923@4F$7d+)zl=S1I zCy3^Ug2EKDm_W?>uw^bJ9$mcpOI@s$Q9uNf&D3G$24G9H)+#$u21bz7r)H4jq`iIM zBTR@_qH~hA;`sG(fkH<4U$K1e@eF(|`U1GDXztU@wGY=v@2D{#!jG(}Q6F(h&}iRq z!X3uBCDY^h?x%t(@<+QXSVcmANcC&r;Ui{0FpwSHsR(gVmBbI^M_$E}UFSy3`a#53r*R58VRwp~2xoNV0len z(7}rpw%pvRz`ScuU3#0P)Gcn%mCXS<7AnhdGvqxBjB#t*+tZS3({H#=#Ty5`&s=ww27nw3FCZObX{&U{9zU-t+}GbVh!)DbQWl?R-QdWj|n;$Cw~5PIWqBEO4pq8V?D@Fl~H`&OL1 zESdfDe#FiIo=gkfbW|3m`W;$}7F;27woX)ae=MC@ZztbY+rMB))+M(Z)y+ru{o1*6 zwRShJADU5rBCx9wi^}mw(0xllgDT8!x+S{(XWmeo7-YDaj63`OoY=DZYx|Mp=>dwj zOXtA^!%sm2CJE#&`O$qxJb_hl7)@aUU&-3N ze5A<(IZJ#0rClKh#VM%Y>XVBcFQjMK^7T|f6Q0vQcnz}>%&ItMxSfI&{s1RyE|&Uf zkV(?`uttZap7ARQ4>J$WB2Hq6)rhU@p&SKi6*@-sdaQeeihu^?#nA0No@ z5_YV+yd4?I0q?3_t_8{1?zlZ9eb@9Q>Ha5n0}&>igHMJDDPq2khk(F~2wAgrd&T!dwe1>Jhl8*n>iP^g0l~5|;nqw3!~SH6_h{I-qJ^ zXvUz)RQ|q_(}c{$+x{mBytP7D zgs&QISg40uJuyEtsvi&mtcit?84t%>t#@V+y>)ce6{ZH!28s@)Mlaos|1zCSukle! z-Yh%DNbve$){~QBT?-2@Pk_{DrQfHG7&0p!b`FF(IAD{HbPA8dYd_JwrcrYl=|k?o zRvDthh<2jHgmFcn)YLBf3u>gWpULLYLtj>K+s!EiGrrt6eJSvBdsk)pTy zO#8UIdVz|~4}Yxc*ilC+-@yl02E9X>0|*2rJ%*6;2AX~sNznryYncW0*>k2%(}$MW zTu~q@2Xb@?XI_a4KPcDBn+&k^MQ)EVx@BaN=?SFXvXHK5~CM(sq)Aj_Ct`sR4 zKQ=nFZ7rGZ`d*g#>YM*N88bZ~=I>xPZG6rO?Q{TM5CfPpS%ug~xd$Gy!RLb%tmydq$^UanmSo$|yv_Sv!`_PH4{0iE#7yJXgk33c zv0P4n@oN8%dW{$-yEhV0>wddcG_fBlXa8ujt5S3!mWqySxo>}hQ0HuVGWlq-oMFDs zJKJ-K0zE){Pmg$NDU%XLEZp+X)Op>V?;zi&*R?? z?`eOERJy&7T3Gg&IT?F#iOWTWJ;*~ic-X!)E=h4*jN`3OlyfO(l;qW7V?N&JAmw8?29R8fB(dQ45t zeZZE<%|Sroys<>?G;=@YnBL5m5A>^w{=U~M96`uZaM`c)&b7g>&S>@$%u%v5D3HoSaEHx?a>j zjhI39fSwW212e8}t!FCagc6#lKil9WK z{mcf)bvnu6I-m6yh{K=xygc z40mQqItJy~wpsf3*CCV9FB+UcdW;}1&pV<7i@N)+!g)AIr~&c;0s=m)?79fjxR_lW~VKInuskDyh5Vo3_B-A7>Q{IVO^J8Fv%Gd;^XPBx+t zY;|gX4D9?<{f$1pOyvUACP$*_@WJt+X^Q9Ge{D8LspRsajBUoJHOI#KXTaTSzb2 z7=j#rR|AE;3(Zp@Y0C4-s$ zDxs`l_4F3Gfl=?dX`MjE^w8KyNR+@NO7Fc@21(5{aY}Kj!v<+)u!i`U3)hgxK%S+} z=4WBsf!aqT;w*+3S+^R)G$r9L71&x7YstRUSg>((*S&HyP&D_8dj*aZCbB$axT>(I z6;SL#g}$A!A-Dnc(Q{~(L!?vwP9r#1!6ff*9ouj<|6C$x|-{2dUYkCwei#vIaWf0K!fHq{*M)GxL;KyDp>} z!*W6Dl?Hz)C!nso1-8@#Gzo5ba?uTfR|)bh4^jE}P8zqT-gY@5t4;cGIjVjK9Fz$W zBz5NbQDR2XjI<`0!v3A-y9_f=;U~OIreCv6kuiuAVJZmRo_F-zYTu-}ai4F`Ykc?} z#%x*f74Z`$FSMXHCvBQRC$!+qY}1cqB!bQ6k;M@4otbHfgd%CX-qjY6bW&cCHXPbJ zJubc5TV}W!aSg2^cjy)cy^a?ppTbW8K6kw9PmH6e-wC7rY(nHlyGNwFt4Sk-ELK%A zrPVnvJ@;4??(<=|4dJPH@6B5N0&m%k$QzmTPqawBVBAK^Vui<9eU8T`%lE)CheWA{ z@|${u8}>B4jz5x?ssjvT{;6<)d-USMPz-PkXA?;V2>zWWrrC9SBjE^XM7Fq@e$gJ4 z=-7nZT^Ke{`+IiSI3V&d3H4xbpyL1}4?J8<tjh~~B~T_=Vy1dRo3y$^hul+o0yV*% z^4Pk~`2i+ay!R8V+3N*=J2{D9`(>d(t%^Mn)r|Q0opn-va4^bMysA-{vRq1AFzJKX z?%j_fENh=>H24uTg*s#*R&{orTt8bWh(vsHUlh5`B9^=U>9+m6)u-uqGI67;4@k~b zz_pxCYgfP8@5SG5!017LOfNcrQA>GJ^VoEF_myhdmrYvT~0)(quC(TXSy|NUP$^Nbee}r zqJ?u8H1nt(PPyYnIlS}Kc!VbZ0G*l^fbymoWx^jUuXrQnO#wKnFUBspaVl6JBG4CwCHa6 zQRhBk4BMmUL(MUZ~of+ua6VJ?(CodQUk`VH+y!t-ivqe_L70@Jh(hQ5DyZ#+sq%}`+w z*VsyG|8O&P7_wQvD(`xt)m-;p|U6QvQbH<#XB(Hykd_Cq1R6 zX%K62;^M2thuugM_NWa`sAe$KT;M64tfmDz+b{w%C5Idr)|XM@EBmktD|GeK*J+PP5_4|}4x9_VcC@5c{1e@5!^RYf z9TKS&`wIQRn~Q$)lGCVTX!(iL2F431ty=Fq00=}y|*XScW{U@ z+?03cX!}r138PFQgUa;)WE}ojvW_36*xJu-*(i?wra|5hO29|;etCwW&Yt(bOga+Z z=INjILgGOywU^HBj~}c_#mBw|JnX4w*&yFAZ;15q7Xb%@Vp(*GWT6=8p0 zyv}e9g&dO|Fc;uP*F`x%t*MsA2W8}BCWu^p1gm~BDb{(smr8&$0?)Xcl3nq4E|;sn8FRhY_fg*HBDXgDsl1Mn zz6h=W;>=A}JjIBReKkIbO`C_ZsoMxNF;0EpEb0w)Sj^V1d--5QLSBZOovGwjvW4WOHreBF|8B(JI~_fY%G`->HKR*#y9?LCS}IB{mR4v?ZN{sM6+~+}hb%%-`RXyQgy=#u|_{ z$E)gy54~V`T4Yx>D#l{74lqD;U#Oj;Wo{Rumre!H)xX-O$mGk3K}hhuz6`vX+5(4Y zSF1S(!ExCh2BFsn9Ab;4YXuto(1Cmq4E~edU;hs00WXi$udt8l?#8<{=&*fyJ321q z`+u0m{c~>`a<}p)fOcg^pzTbL5KiP0%vZoI^1g|tM*cFT|At~+xWSfPgCIRg+JLla z_%W{p#Pedx^5r}hqh%hworD+Oo0s$d-r;MUd!eioGzjq$$b-bpX&^!L+6X+-MZ4jf z1lMLQ0HVjWjqEt4U@>bIwW0n-DjA4d$7D|@;J&a_N&|KED=K+m9i91?DE#Ik3|j92|s-T5n-m6pH8=is9m~=3TWs+)YE! z%56`b4vOL5RyU4*U!$2wftYByNFO$87hF@ye#WKDZmUw25!wThJpKfNx&p|Qo^+oV_CctkJU8rMTWnF51$N z+;U3d8KMOEEdV-bGur zsat3SUI}D$@I_o!1ZLE$*>Dq&jGICiWHfU^+GcE#d==_o^!1!=tsJ6!MQRzAr99oE zhfZkiKdD~KCXnn|29eQ>-aH8&`8wKEV%j{H^L$s{+}|1xL;YnNn=P^2i>6;0OG9on z7J`Sf{8icp6SR529m>ASpdBqh>oc*fWyti+9 z&N`UjwpGPpOqWQKV=pM?pA2LwbUwqA!f&Ln?D)~OF^0p2mp0YMY&^g#;VYUm+{RoK zD^E&Ash+?x%#0Ja5Ulc;l5e^@<7n63?pQE3T9dYjrXm$6sE@SgTem z_JFUwVi5`Elk66U3qPb<6nRlpD;Q@Nuzpl_F&< zdeVFOvdF{|qrXM;AYBl=2>{1aIqL#SGxA_G3f+mRW-Wf-!HQ`Xea#7yk1F*(8rk24d${zU<6e% z6N@wVNF2PqSd001iV7R?R;ey&KbRsH96LwgjoX0ZH8G;-$RrRZ{`oyG#}!S zzi5XtoRD1rEL+>3LC@T@f~Sy$lMyWQ*McZoy@tM6e=(HRjq(21)C^0!A7(9Q2%t(R zi7v@;GzidkEb9T*X3u0O4N!Xi7yLZ;aPVE-8?O0B zV1RE~74lb`Gle@+=>lAUOVdAZ^%*(yC$yzSWVu>XWHTHu0XeeIw-ga&9c>G4&9i%n zlw4Hf+L!n|R0bcce;6+hdJ{oQ9R7`sniT83`#F$!ek1p#wp*R+Jb5mRJi;IPCvcem z-vSJ;?ZG~0`OeO=GW9;DOB=oOlaCUC`%@REKCw#NT?jB=oAMR6H!mk?#$A%<(_0a05A<) zmEs70RU5Q7Pl&B=gM>47G9H9IIQg}C_reWBJtFfjwONp7xn_gdosXY$#M3*ea(h-k z(VzQ*VVf^3*)Fp^me(!CsDo`7uStFlS4sXX2&Kic!et*LqP`8%!5n5bD&XmptQwom zMN}R(TMtm2NPSrSIxs9B@F3SR6FGQbo6lt`P)+kowq^i>7O=-9XYaH~8$S6_W{i|h z+C46NA__H=dDB=cy`kA3Hx!C!H#aND;3uMTl~?znWc;bl7Z7MH+0CSmn?_aYFPUV` zSH--;LI+}8+Zb7J5-XeHkI*uw04H3!N29*tn6HRiPNfd8WmepymKzl_XWk~8DHc5s zd!^;k@=FlxGa(eSd_pZ8DB-N^h}^NhcO)S^eEH7}P4b!+7*mt*D{#N}kI9F+_ zUPo5yZXLkF0q$E)H!F&}e#mUN`u41(xG>-rVPGXc=k`;>h50gff%Tp6oFCXV`C@km zF=01!Rl#@udEc@KU7e_YCM>JHWlmU}egZFzit7FkP~uQydt640tmDCpxI8IbgBwwv zEgvxZtp*(u<+cp$xaWj!1$#Q%2S6UX^oQO#;5xlW7ZbUkOxm44*L@OJx-a3FXOdA6 zOrvB1DI|Jd_qMX=C;P|1?Hn^4@~LM)9lykuLdOJI;{v)RO})CA;Wtgg9QgQ z-v&RC3a@y0LGxQ!B}7)iEwNLln>(MQWIN-ujP|9s-u6Mr1QGR3$Ppg15c31?W!iL2 zCrIvrUiZgucs9GzxC4AhZWzkY*(>kN{FptneiVw6%bfaMONP4Y`i&FGxR=)gZ%$rG zssBoDmSlbs2oGGOMeiH@OFH1n;)O^jmJxx#MpI}jd2V<`J2cn?ZYJcBx5QbHg=vez z5F!x{FHZN8jRb&lqidXvm@sp>s7Ry?UYty;dr1r;6mV@7+fNc%_uEL41QPe*{fQ4b z#%f;Zd{k)#g=SMq5n7XS=e?#r=bN6(X*`-&%^ME%!a|&ufAod4+41&0DHi~*7)UMkELJ?(|3dv5r~3w#sX;% z-T8bHUk2_Yv;`{EJ&m*#RhctE3}o}+V!mm&e{rY`-w0YH6mBhU3aPFdtm~%i=IBgM z6!;E*=qiWkD+K?i&||i!O(=DR#;J|11zb0N8S7d=59pGm(-zt*A=u(2tssu2b(7wm z=Ma)Lhu|O0=4tE{f)uotzBOXJHl$-AB>SPAPYjv+2GS#rYk%0<{trboQDd7yxgr18 zbX9k0JM>9-c(tp!35^=N5Rp224nz9WL0LxN)@H6S+o%4#L5L@6QQIhgi+O7&ufJbO z^@X2U4@m09!K=ys=rpY@Uxq{>1ud(|(yRoh<}=@@@N;-i%;ot*DxsD0zdHkotF6E* zT`DbGXW z{gi>r@m-M;>ki+!y?hbwLiL9-7^XAyM>T)=K&K`*Bgfx`>&quER3)aAKS1xYj&1XblP?o~oaCu3&TaPUq6&;C%K)gyq&7m}H!yMm zAwjL$^cjv=X7+2`4t0{OY|-QO_x&?)s8dyp5%+Zn)2Aqk&km#pp1F}PHbBkMDNFWr z7G0{tb6MNW>5C>Xc&Kq1J^Lh9L4moj$q`mJn7RpXH!*ETRVA91{#6L_oa=uyN-2)G zT8Ob~MRhXA4nn5~C0tl$=PkHyRc8O$W#(pl9(8q1+ltoc} zX;^YT8YHdyZS;!1?BX=(n)W~aN#OM-!9i!Hu_ z{}V_ussC007kt;Y;UKszDrlXsewNGR^<(6eV7qgnWD}($XIg<;{oY5~--2_Pk7BAl zrA0+h;6)9rDygS|h467a_`Xl@eq78emRC|VAB3d!&;kvM$dN^&VMfxKy{5mh|8ahr zAcWsxqKCFkMfjK%5yR-+GvL-O^5^&pn36kb*V z!e#U{Xf5yENZGq4boPe_8v^+T(1P7SVV}tFRRE+{j*pVKsB8o7igK3riOUcYG2b)e z@(|Iag$9-n{b*o7LyYR*LKJBo57K~B_Y^=zrsuuya^-9n zQypDZEkGaZ=eEF)SiTLZ#_E=)KUP`{%O8>ibE+4)Cp+KN@A+CpK93eZ>Xen)lZ(XHwKHk;$<)ac^}^=x77+Wq89K?%z$5BqR60@H1PYq ze0Vz9YD<4PO|6I@4I|`LHQ`#fKAFX;)@opnCE~MqakX=eFa@7ildhvU%sFrJ9TQFH zdcBM})y)3B>`}NoNE+N^NSY=2&zHiDRVpT)#ctNQ(lzfonqE8X&u6~jc;gQ^!H!y{O2v=G~}Wu~K?xF;J&_ig;pvsRz) zfo@uKdvwhBBs^?J1g8cbl z>Ix2Jo7@cFQNOo=MJe(Ye55md&~!vKiIPjUooIr${fP>*_Nn0{2+!_NUD=LhgVFO! zU?i{mLba*x2wq+rv(ZCyhgNh>;WDt`7C~tl&bUYKTj{AW-25)ScQa&gu9N*w3EjVy zm049Bu{r70mtYv*3o1>*6#ug`oW8Y-R14i9cRrMslb7e?$Z_bV!F_I(x)Qgm03w@P z+){4z9b%;KY03@pxwM0FjX;)SH6fHxc`#|P-V}ZZ5XWHjwckb)#aAyK4pvT#1#i|% zuA{&soa;UT4ig9NsK6I>|F`wUmZY6;#S5lC+2PVa#x{#~uug zwTs$p`}d2jQ1X7yB*r#SIra}W*}&ydnw2EIC9DfW%<=&v>Y4{_@ngB5#)7f*RxTet z>e2X!0N4}|)vW@S6r9#9CcHNo27QG-V=YJiwB!`nGyNqcelQ+S=5?W7EZLvb=6~y% z>uoP2r+aDsw3I|a5ezp3p06$b=(UPf*#6IQo(?Uo)l!qr7}|tmn2dv-95SUW2HQ(n zsR}qLELk%0up6^3#a{4pWcj3~P*sXjM&M~7S!26FBC1@>EO2c@#@-}+r*sdf$1bpN z`;K$Xe2!%rfk&@?)m@w|y9;9)%NqC*y>|)yi4lzq0s{);3r}IV5ZTd8#U7S+bkEA7Oc2(VMgS`lDf_LcbU$Ip zyS=X)PU{kf2Jy0*e!nnj%YG}uLqOTRb3w{C=|+?B(Sc1XQicb|MdKIWRFbxUt>dya zM0VQfGXorpWIwktDQ>T7ndlFB=d%P|towT=%=;1brXhmbmi#<29Qb z1iaCcV`=&vxMgRe+%y*GLs9l;1Y6QyI+p52<)(trKigp75nNYb;9V;nadoyVLzNV5 z=*lrPh{9+gTLv!7Rf6-SK)UCzY{Al}pH?*N(ZZUb?lIZ{6o-_S>J#|Z$L(FWwmMSp z9NgE01hYPDmQ#dP9goF2_gZc+JY+r0s zF(k(E-P5&3Q6B4+iaH&aYA!tpvN#z{X35(6^To@TRY_N5aPHzY9b@$E1phc38p8Bu zGbBM!wLkKYT$DW6=E06wIj=jdc91e2yT~t{yTo^#@dmT_fO>mK+`m;Pm3V;^Sa`>E zqVx`s6F`@XUQ17lPTLYd9uoAF!{7!y^`v|B4!zp~Gqo7(C&tOSc6HoPQJo!yzwRz%!gh20&~Fd`CGOxD!? zng)8{-JXI_W{dM!5DU|f((+k6e7@)AHTwkwrH^`$G7=@gT2`>Vp~QVITNKhziE()y z!zR{CF&}WGL$4I@P?=R%zo*LsKG7@|5!$}gD9z1L(yW2uZKN$W1K{>jLA|dDM31CdCktVBp z$PrZvzlNct63e9g5Xpk^l8lQ+@Msn->{$*aE+pI|u7B;GH0vL-r8kQ^ShX&1?e+lq zXc_0|1e?`tJ=Kpclp|2=(DAG6H|1OVH0U$%F-l>V->&5^_8Jzs2LI+YxupN$?@QEx zUwu=A2cm_^l3=P}GI{})7oC7tdcVqwW?WLjASU58Smb?ma!e6;5rTF^|Hp_N2~h#{uQa;I%OteM^4oO$4F#@=M41mkqT4TA6QsF zK_Yb8tx|ueYyPy0_U0m$9g?Rt^;)|FX?0p3^{wyAm}#+qCv9Uf)M?oUNY0vUS|`w| zkMq;)y@)bV=fUNB-?u6d7V5zNU8!8bmm+B~1tUQP3o z+ucTuLQ|OI-PZCx{Bt|D@$VZXf`Gq-EM5U}ASQ*E!^o{r9vyG9QaecZXPbH~#In;!(lwtwH)fIYE`ObZl z%yKI~r?krTklzjLSHW9?LX{5|Q8qdy)lWJl10wAD;1i3Dh0XKxqe!8eM$=o3)9)RA zk7=g!$0~I2#-fn9oimpi7z!b!{>VlAdhqihm#aW)Z`9X76S|DYs(TXzuSWAf34ar8pRne78;V+|YcQ{e(+xmTWg3$j*)LTGB z)xGh;XBc280cj)^BnFU>E=Nh}E~TYYx)}sP=}y6+TRNptx=TX3rBms9c>mvb?^-N| z#hPKA!`}PZzk2qe%osIX5dILlJ#Q@yml-d}2rXj09(?lB>U%y9N1jX9JKchaurdhq z6R0}_W&}V*s!PQe7;3jJC&jVmM+5eVD`5L4%&d_qo9Ru5DKtPQFs)A}@Zs!I(I)vr zx@^AcByNKoqU69CemhfJwURZUz@Q(tDO-%@JIDYIxRIR|X^k~fZ?cxNMqTzqL$0l; zAKsWllM!0&(i2G{!Z%QsB94^Eqd=^jn~@;9!ne^-YdCJ5?+mn3dJbi8(%DIBHIi42 z%j@UWxk)HEy|S~uye6e}l~3b!ky%`GTCPz|ajWu=dHH|@=XhZsf@gH;_!sDMB z5tDiDoW6Uq1+FcLG{>fo9{l3%vAI;!fPx=K2re=+mXD1a=W|>FlbUEpRc^XeN2qVc z=4d5Ln+^0Zu(iKKqThD>abU*w+#>3;CUr=*7k^jz0n-O6321>XT zq;rhXX2g2JASx=;46Ipd75#zG2(?9%DBnoq&i%208o5u}p4C9NN{Zt6bdrT5Js>@q zljJ2YY3Q8=_KY8H>}7sgDO7l4)^@5oN~CGLnNgmMs$1DxvFpc>~!M9F*ybU-PtXp1+!#LuyJ4y|ECGD5&=!IV}f zR56Lt;H1CKNzQ?#w+2B5$wnXHLT1)_kvuq32~yTB3U z1L;xqv!P2}!9vV8h9ZnN_Rx5Ns$U_S6yyN)Q3Y)YZF%aju<{k$8S?-DZxwm_$+Mzt zRGiP>= zc{TvvoTl()f??JCL~Hi0KFQfKI>2mOxFm(QjJk5a=HST#m%9QdSgYD74bOyOp=B%B zVPmD7CYoSH>PtLdtJd$JX`=f8m{8P~0v;{gTK8!oXWXE{|6ME2&$umRH&|Ymkx$hr zJs~IXM>Vet<%z8QMx%8=BfUYhpF%k!YOC?(Q_tCz^v@t&58DvN@1N|~D&s2r4T#k- zXoT&JpYFem@XhwWQV9P0%v8-{yH3li;!ke0m)tbiXV+gXL3ZFNAL^yOZ{ zPi!(m-5jcRzI-xXtBCQOt$!MfCpEoHO(fL4^qM{ckw-0MF%9VOx=2lr29-Or2tyZO zNit%P_q+=-$b2nPI`Q67W#r7g=^yN~!IDVN&xPY9wfabY8nYTUNaEd`q1rV{R$Wx|H9jvxpy z?S9Jr^&ysTs31KAr5y9BbY{r-_HyxuhnBe^iGE#nn(*aAufj~Mk$|BywDbdvpt?ed zhbS7PbY_(n3~ws1Yx8B~u@-*11ZHE%-0_HN4z%a7L@aEFRdg9Mrr7U`;7H1o78Sb4 zBAIV|)X1*Tw>HV~5fYE#v_3;*UH&+jz5u&UD^TF0(aMk#XC}{)bAok1BS?ldezYdS zd^m5Wsn!Tw(3$FVLlFVvKErXFBcwuJuNF=$!CRa^{zQj2crsEW3q#TBS#uzKXwS2> z-e^FCBe#%A47y^$Fxy}oyXDTFL|h!0(Zndv0MwH0QAo_Z^J&fNDbX$rAmqZycWdS} zvuZ2^Um@gogD|l7Eb1G9e(FB;)OM+V?*3X2IUuGPI$2(JhEBi7;tSiQwzK=o7v%@( z;Z}G(UTD~>{`$EA=?o6Nvk2-pq&ka6B{kN3{eA>^zIW#u!baMjaB0XRuapO#708r= z`$Iv~9rc!?Gptd3xTuQnX_qC6G1}+3|egZ$u|J(ZrxN2IRCC;dy zRT5BlGCqJzWWTQ$0Xm!C*Sj}H&I>hyjrn3x?;&lYX7GR3Wf$l&Nrm+I`38VR;uj*? z;U_@?_zRkEm&d{?k1>q)o8Gtira=EV=!-t0L!RT(f|(^lpeg9o?oQ57aBF!1y0p~% zI`0^8Sx!EzUfC|V0Dkgr@xzGpg4K}n2A_DCWIrsAdisdZHLr1XwjzA z5CvC6Ifmk$7U%MT>BO4hA{2tS{t5jA{L6xQ^~?+X%VJ0vzDJ^mjs98YOseZ~s3EY0 z(;v-pzHR6BbKQ!&kr6RqQ;vW4$3N;+=H^ZJgWHUW54H?RWi}=;gJkvFe80elyzh-qGYh7DOX z-WR?b$uL*vQoP`CA0n26%s#6UFQWK#n-JeE#CZ)f<^loInbQ8^H$x0vsf|5 zBj*mE3_A`c`;Tw?(0EK!s?mMEpn%Tz`^w*p#2Wl#J2six!0e&L(lV=e6zJ0HK% z9CpKaPi{oqGfRff zm&)BmFJ0uM7O=E%?tI}sj;r#FnnaV68a>sDLJPmCxMr^8`7e5(EQUYj=@sX*vpLS< z)=|;Y-TUF=;e`E&4|}Z%5tWkid{Seb$$k(e?B^d=x}Ln-AIPT=Pw6jC)_DV&pZJqU z_E<&bZt5A3TG<@>dDjg5wh}E)N<4!dhxzSDeReu)&w&;OR`B(~jyx zMXBK{#0%ZGsy>XlD=_(hpRMHRzzdy&xmO6??ZBEUtoBQEvKX$Ul7Dir*+kzQ9HJ@4 zYQbw+!QzmgIl0#i-1dCx$O$T0V+Pk~oy^_>4J!t2(k`Z5GIBLz;tmdnTBe+=U53ol zOgqNJ;$fz1wTOry4N;GvfaO;v?&W^|$HI*aT?xD+G+f_wWGNXF{7MSfqy)<<|H!Gq zDL;>d2shWPzW!WE95CEZfKYtr&Z)gkMSnmP3C&v5?|4tRswI28OteJQDp)9{H zt_n->TYyad+vS$be6KZ#_P1LDr8=e~ys~d^A9HBS&|#NhFs*$ITH#LS9Z*ZsusZKz zW^-W7gI665VoKar{c}YeBpvBW3VfJn*dBDp^}yDrwZlfnV5iS1DobP z-dzVsip8DQddA}vwH|;M_xb+f#>&d9_;R5=yFZ0miI)`A_x#$yX*A_$N8Pk=T+#^r zqGjC*Z2c8xdqEu%uY(WBRQYvpTESM>Idw7pomJ{||B@o+(-7BrPzlED&dm;Dt8o&2afBMxi$A+Ac}a?N!^|IB@nMWMW}z1DIOXjruHLnpG^E`vuy?N<=4q;GHKj;T%k-tc$%M?@YGprBafM!=^NT&Es6VoKWH z*0_%yp>}i@9ET>x}68ewj*70D=|-h_N|UY$cf$5J>H0W^#_~RNkw_FA!;tbzJFb)^;)c3BIp^O zCTigNj_KV+$6^7ghO~=80jXl=o0#7`c2<%W^ zw3_sy#+N(XVK8fL!={O@*aylt-rlBuE$265Y7apQqIEOXp)}cqzDe_vR$_@B9l7z; z1J^S^a+{yij{Vgi(N>DE*tiB>5nNr!Mppk;9*(|{WthTQL^X$x)QH=)SYe3+b_Nc% zo)-sEJijM=+=(np$ujqkd8OGM?jxaGVYtk@<>G?+VBATCQi&`4izgq$iDj2igNZO6 zq*2~cr}GcZz52DI3=;F<7=H(;8Nvtpk4-NV`fMAT^a?2&c=D3WEnXL=_3D_GIECat zDg8339P^@4)VAWI;dEhvY*=KdUHwHtex9Xb8jYq^Sf7ZS_2m4cWklvL(13}L}ewXBi)=5YL zSu9(^lh|xbxwg7?cvB8XWKnf>bP&g-wB6UYUqsJjt^ZB{@c1`WXJrw@cExRVx$9Qc zYPL=iry6-Rjm;fjF|E%h@U2xT6F(rWU2VMez_Z*roIrkD+5+`C*meDvok|`OrH5Mp zCJG9wnMZJ|auh*;eTnZ_*Ps$+b;a$7>1S++`S-{--y~U57sI5vHE&&PF*0J<8;-?e z_l6uEFYuWyF(QTQLHm|D7)FHoEaIylBwxm{GM@} zO~bPM6+>0^`_*hzGOOikyx^DFvoMo2{UBd@>6zY3gwJPIiEg8?ycp$bE8LSOyS3#Q zl~gWR2pe$Aq(PXy$@ryDplkM|li|$0QYAUw&!vfc%aWkqxl;D70?IyJ4@6Jqo@Qr% z*H3(+1{3-|_s|OAMusErylC|KLUL~W?mLW&VdTy`TDvtp8%{hhaO(GoIT$TTXmLTZ zbu`Ym>>4c`7bcla$~MILD(|6A z;!P|R4m`@=2iUqWNM^)fFt0q~&tmtmx;-I2#$1WTel1UUT>cY;OT+dM;*Ul_*LYm_ znJ3Z((i2lk+Y5CYS@hB&kPX;E`9m>vXE6|y*)*pDT}_McB0iIZFw&elu#+TyILEB5 zymFnM%?@mMKF(zvgluK*Qj}vR?9J4t@;y92Qe(90xAS8Ie=v-U3*Ys)1XMy#ZeQw` zE&+INgnbc4%IlkGDAyCOJEPTmOg{dW)02Kq&Y_A2Q^hZ=w*uhz`bG`}3e@G+Q^~Xf zYvpO=*@8&6%JpX?UoC$SJp-(VTvK2w1YR6Zzi;-qX~M5WLGlfIK)ukg9zu(zdmHmU zs8&G>P{?gYn+{g~bs&N)8N|Fv=QqT!dbtR3>Y2xTwkk;fTHx*v?uF#4R@!(jg@CWf zWv@@`0U%_nWC%=_^N&}P5054t+k1xN0{HMWvQ;Ya_EG*cGU(w#wFjDyRm~@xQ-#X^ zEs~SuWk}OTePz_ub$Xn@s=7a8B26t_{e#wM5~r}b?^K-rcY|gWl4NmSFfNtttO>|9 zrcKS1hqm{oN;!A3<9E?xP&L`^$zJlCp5sC6z}{8xBb6ytB~_1+wkI+t)M=%l!w1Sk<+D@DKhcV|oebbK zHgm_Ktx^r9R_kNF**tdf3(R{Ovu}s+tKM?~I{x1PvaWSjaunJU9xe)NJ7E)a{?$8oh^T(5;ivuL!HF#PPU;U}z*1Y zq+)*>p(qOXxyw1%7Osg4uvcVJCrTGT6II^eP0tGp_CKe;Cn*W1(?24o(DGzfCpFJ6G2b{1Uyypzkgh z*C;D4g~V^7A9@B|{mav!ZA%*xkvzQv3<*$Uezut_1-i6r0&r=Fw(;r1iriALY)5R; z37)+vobOoXmZN`HUv~ioV;1B)?ABvnzB6heEw6{0=kxJ7HBs=CVw`%vtlrWAc)iz&|SemeC1DxpifCk zVCE5h^`Oi&lj~bKad<=Qb?nKc&GDdac~%?o_x27>xwwZv|4xm5#(s#u@hU>2{WOUA zcxxEjh=zdfNU>0qa9bv{YNZ>7Sa5a&B$RQvU?@r}_*sI*^8HYLX~NB~q$wXxG!MG4 zMx)rFHUW;KYX=~NW|34IY^{zzKxT1e`*9;c$n%A~5=9M2Dx1bk{c1B@{h&r)Il6j& z3tkErmw~J2u=^$X(FppumA1=xI1Ek;m3k?e}aP)Y17p#R(eu78e)mO;s z)L5CMOJO3-iTlw=v~mrRm_|d^o$rG-(U5^|Y6|NR{a|>EyZDm>pC1ak<{Q^!ng_Je zO@l#b!bm5G%1puvzpI%QPW=x@QqDn&VUu9Z=HI_bxby7^!^k*tyC(pWq*d36NwW%pX(RJ4YOR_j*Z4{g$gns?(rp_eN z+1CPs!2GwGS^RQZ*125`Q5jwN8t?=JK*)S>T>DNT@?O6v(Xg_sctQVW(D^;}21oxR z(_V&dkZ8R##9eQ{=1CRX#6?aGN_~x?7F9W;j5+Ovp=N%!PGGv_A9DMnC4XTrIb#Z? zCY$ntwLRYX+mWz|FX`(}zP&$kR-Y%0HM` z8CQFCX7xIE^^}i;>C>#gp?ox?N`gi{T?G2{T6J!<&||co3%Z!W?*$)cs*#v4oH%v! z`nKnye)U)KYyjGcso{dMEu%&T+f$dPKeKbczyFttoN7X-7yPo9C9ok4YXbRIxFlY| zsQPHQ*o>v)lggNGrDrdal6k5R2MFfJU$~eIORV*sk&Dlo={`W^uRAT@4D1NZsz=I6 zn4rFrj?{>CLsS{w3Sy}g?+K0&G2Bd@h5u7|*zk55qEzP8umptTHoV2+)%z_p3s%Is zNrf|jc@6*WhyQSwL9kSQ(+_XdwT%9 zrs!r~vogXPCK(=-H@%@COA&ZumXpoSE`S~XFaBr9Q^iD}5?nKXnQBi5q>n1ql0lc^ z8gwZV{cHpt;n6!ZO97j#90|B1z`(t!2s(f+ps9%5&m;IP0G>;Lt?P+@*~QE>7ku$L zV}k||BNH72H9ia0K7whnZvL%bqJ7w(vh`?veRTm|wn-c#+g|rVsLo68d38tX^#))m zI?6NW7#ZHl#z3TvDfR7R))=_6HuvuWwy{U^iY9-lof_NMdo%8R#kSSGfmQ5l?;_3IeTXs!zEQ)(??!I*w~y%jD%wiZKSDrA~K6D zY9a`bk(}-rtWUj5XG_xAiPF*l|sdED4<2fhREO}vLux`*X0IGKez$(ExCmSW9%h!=*QpmRC} z_Sa%AI{Fi=^^f;U*V#%-wN%4x4tr}=tHAR7Gyf^6^Hd_4>AS-&mq6t@%sV@O0$x6L zUU&E(K^2*6gK@X*ALf25fDn5weNEsaF;`??f<@VagmmYzlcUh z6^#~0Le!micR=vcnDyhM&$J0r)A&m#7D`Jr$n&TZk>}JhUf|ZdmP`Wf5u50*6Mrn~ z2>s<{o+Fh7Y%3Leok`xD4*c*~`GOQ*TGg}5MH{PiBSCJ+-Jqcw#**ozIoV!-96e?7 zZwC)Pm#y5?X{2=TA|5-uR$O1HR11EYHf0prU!HfrSI%-rRjb!z6zp#H1*l)-CQ*67 zjKoF!r2A`!)@4@FKTi# z2CVe#;%nb|m*P?mnXU$WBQXFwjxykP(q5?{urZXj>->YA`UYG_TkW%Ao(KotA&E^R zfN$G(H!ifgPM52~X&d6#+xEC>Il z!fa-@3Kc{G{q{A|O1s#o1BYGoaY-4X*a{;;Zxc*M{{@NJ`D@1%|6VTiw_2v5U2k8; z$_N;S(0>8MNe=NB5n!qZ0>kN|Cv9Kl5#=7qB#LQzIe|*ubv`sT)Cgx3kSLC zhxikpe3lzeD1hB!{zD0<-YyH8L=&_MaA)jJS@sQ7!k1!v6_{0eV-({Wf!$^uzpj0u zKSkvFCzj0gk>5B?*!yMpp~-Y>wZPUf?~9&!=yC@{mDNBHi)G{IP=H_3tDWNK-~sv? z&j4Y`Bzl@Q(NwFT?9HuKP4A|)dtf+_xm9elO#G8CBufNoo-f`Hna1p80LL+;dG(~` z?wAFHFgU{K`Lg5Ym^CQokcd7w*YD^O>%{8SI?G;#i(u_Ud+LAPFrzoTTfOa27W2== z-)#T07iKiP2cflu?cXnaOCcJ*Zv>E@)gZ{6d-ZPp-T*wSFq1k#p1HnW3=g}xc0q52 zTK*8;JgFWU1;EVDicoEf!O1;-I-OH}LSxiIMs-);N)vX039+o(!n!?Tm)w2!v`i3v z;XPL48kfhdpg`wufB`q-g}p|T`-2*TLLG}vsLzwdj6^^4tyr^!H)07^+hG`gNa1rN$YqVW-`+M9X9gf^ms^vR^{oc zwvtBrWpPAkk#lK{DmVR=%ER$QH=UJL=#wZ5$3UtqWbOyM!P3Z?B( z9}D?`O6sv>$&)|G_b`+Rt+0^`V4zsq(zY+ug<*Mjd9oF%^X~M^gAtmgGK3^8{Si4n z3MvaS*JxkzSkM1UzIEaP*AKV75jBLEbO}}=*_fa5?%2k$e66;XTyo)d@iOZb>f>Lq zO4@v+=`X+(1qL1tl3f0ndeXMb+(eYk`K6-Wh!qfrqYk;wm>@yWWZ=v=`PRr9%~F8& z=U&YN5kA#%!xbI!HQ;n~9)d^RVDAnD%jAr$>ThvU@1aFY;MycR3L9BEj*y@EJUFI9 zeVh_`x#JEYtgUFcw^LNNJ6_VyT{SwPG_Y?)jBiJ@0JstAV!O_diCI{*{hk3u$(=sEm2qaOMKMDR|55i1)LQpX-X_!^n^RSWaV_Q2yRC|B z1)9UyT5tHcbylQVcA`um&vqgA2el+4239|WG(o%vWW>@Legxj|s)Og}T~f)DDHjNfj7%0)G;80V-e?i3 z5HbxeNtgRM8rhL%(^Vp6mLaKPl!N?B&!k z!pL>&O8IZS(Bqq1*d6xIjaKEwgSeo`$mBk8BCizwx6`BSg&s=b|3u5!|I~{UshjD( zN~%sILFz`7A*5XMo3AlZ#o04T#o}!DQUyh2(6@F-uWf$6UhRD?)~elj;0JrelW)OU z>5c!Lb>zcv_7|jJZ7QxkyZv{70^-EG47j*drq*o)XX=u5=LYme4)k%f{!BZSjlcpFWTH^*S_`?r>G3g$& zY@`3k+)|l16a6jlB9(Q`awSvx07J#us)4o$%N?Z;;!Z=b)Cx}w1tispx8|a>{CQ0t zoUcp}6nNO!GyxB3u0q|0b813cD+qgKvH zkM^0pM$S4MkJZh3BI%5^zdIFiS-R+TBVBi>^U&XgARaUWCqcHmK<7wpnUW`q(`H1U)j2>c4ZfTW_4ff>=9R55+ALHEM0HMq(BiPjG?vx-YTj6; zAhJ(0LaCUu4iT+bd5s7@j{&_A#Lld$>00jw&a~C)5Jc77velU|I`d{Iz??4h_G~OD zyJC0iJrvU{0k_R$=7QvHv9PWk$Tcf#7IheHucw>}U-_S?_+)T+qh+IEk%OIun0WuA z2nj`AMsD6-B6QEnynH|*i}vk@eIQ<46`vJz@UJ`m{Be%)O=8G1VPSw80;P4c@GmC6 zjd+hwRerw1;wrniNaH^)Ugqy{am%D66Tf%$eemU2>&Bx3$*nmgF(UCjWW@ITbfdW~tI;D^j_Z?nQ9`FY)>2HO2YAP3c8Wen|vV-Jz|A4K!EMCJ%DcSrp6szcw z5q_sCF-|<)3`t}<&PhP{NksT+xTqkR^QlI)axkt%&UB&YpY@VsupX;-*P#_y@zZ?e zo9`Ii4W3X4w|FPyDuz7pTW41{4xP)^(s!8K5-`x1S1Sp>DF1K!)^ioYM{A_0a7OJv z9nLTw-WIS?Gv_P={uq=bc?y}XmfJjj?rn-bR_BCmbiRsagsu~v(N}03XZF$yz8Oq2 zS`(fAv16e3*Be~X8Pt?!fV%_ipdcE5|^-a(rME!&UHtM@edN8_;lBl{0(lSyZp8%IB3- zhi&>=M3mHO+msfZ>LVJF#dX#3!_#sysg9)@yM-&V8KJwu`&J!7b4*zjpa36CqDLf; z$w6ygNoRNE{SHAxdGa}w2HukKrK9BsecIQHq#K!&){J_~%3!L3D|$XJYbdGnsPrDn zod0)$_v|a|>;tD_&?9g)_}WpC8}s!dBK0K=T;dMrSmwc$r!+s)1O`ai~6w%sMJY6M%uaaL=}o47m|EMLD~rFAYA^1=^@KhZJHV% zifEK?m_Wbz&&%f=Fe9^+>R`0*n=CKn*Z;#k(~zZ(GFI$6*NdV%*#XBAMxRxpNv*ud zY7GsYX2#sm3AM^t9i)0Mfv`1DGJ;{oH|^KiOiY$A3mi zL}Se8)hwGpt@msX5ZcOGfU;;Ve|S8q{9`DF5vMp?EXoIMMMY)k**vFK=dtEpOtNvd zTfOoFZdni0ia|rQ2RrG?TE6^5YLkc>@$kb#1s@aq0^yq=u|-_RzM^e3m3XC3{HiPW z)n#|M=U=(V$Oig!Yf>bK#udK^R$JS*RWww^-1B@P&f<@tp!8$0_m#0##zP$w@lgYg zyGsb_Tv3|3nQ_=yn%V&bELEEj-49>kqQ;N3|5;@k^g)v|9IxaHsYkvV8rD$zWa)@q zS63<0aUI(2H?~w&VZE+w@cnt%`?j)~>V|6SBm2*VJW_;Wz0)xu#pf;XVRH+-E{Ov= zgNz3hQG*OOX=pldt2}C?=(`68KxpOb67=E!O7sTY=dC+RkJf6r(}Q9U4OJ{%=T!n2 z5Mv%az8ZS$e{w*9Ox~)m!wvT)nq&;6+Pqc%1fi>bD0;G`tX3Yd(d#lt5 zDxajF@`?RPB2vw29h&y;(Z;)z*hUpqsB=so!`{cfH#EC{dVwPIy3^41ZSm^~5o?&{ z$t?3rtNWR1FMg=tpLv|8h7vd^+lCzGjm;6DPY0<+a=Vi~ZUT;Kg+pk}etJN7fGzIi zKByqiwQ$EjAl~&84w#uS0PqB7tQ5EZ+eOP?rUyb}saY|--rYR{J~dH000z$L0 z`?m|N^qTE@f?U=k?O!K+v@V&N@{Pb+kDG#_C{Q!$9%~^4LC*f^PXubKb$>mi35!;m zgxJRnKKf7;(K?ItM&y)6<(sT&?$Nx!mIE8ytm53-jPpB;F2&Y6m#LnTfO*&7^^&3K zMV}Jhz6t6eMYO+q(tk|j?}O}P?*E(q5sLuJ!W8un`a$ndBiw=gxjP)wy-F`n%_o=Pg#IRgrAqO1Ze%+h{#~TE6-=4ehj^b}+U)dAa8_0x2ZlW1Y;Q4w{roMw^ z#m7xB@+6WpS|@iLWoHdBh`>*)9sMQsO=rioWHj}ZWG2$TY0UQD+I`Ptl>gkqtY)^o zrSfuH4!7!M$Lz7}i zfUU%K+nSOl?wu9%S$V`1#4yoJ&zq7ws;&(CNa_`}IX=7tqrVKEOv5zWayo zHvBMY;Fst?N+*7_MDRiNa#%TaC-IN0=@|+-K{14#f`n_i=if zuSMs7qx|LZGq8C;5E0j(qYbh&vC_tn>n2qkkw#}p?gY87w3Jq|$ z0_$?tRCZ9ry;w0qCY2H9Zj{XQD%AJ3tG2GMI1ma)8o@(XAanCP=+EXEG5=Zao>k26 z;ov!~f$He=e&S2%jAhg%Hrp9sQPSL3+Nnk;-uv9|2DlAY%6${U zYPKHz_1{Ih^a4xsTVeJI*~h)=&kJVRjULzKae(rc#_u*qo9x;`6H`iDfAU28q8%;d zilV-D?5YvgSCZv+qTxv9Q~HF*KBCB@HbQaG+$gs9se2V42bPPl)T7)=%G~@c&Cb+X zU&X4PJ@5~j7A@7f{ge3OCkN<&SvVHOjO=>qN`v*^hqAYzMy%!6kG=Rs8kkt*am7NW zYWXdRwW0kz!!!C%xmf3pFgro0yr-16Qxc^x`FR@K%mFZU#MaIjL5{&db|1KiYABu7 zjS6?KGI&P*a-)?ciEM^Y8|By3(T`glv%kPFD5v2-NJq1$pWT+@+ zoO5dKe%;_ylet!5=GGSEDtVctq9wnQ=c39-Ll_F6;I_*>STsSm=5=9;JI#3-~K8 z4mA2EdO$ipGC)6(O@ysj%&n z_4?i5I&fNA(m;(&3b7HW^!}e?MLP(&$c)0Qp9+3`v=}&nAi%A^c?zFsbEIokf1fp3 z!1U%Ri=CTBF2||fNS6{{ShB+X7sZf%#O7zpL}N;G3x5JUk!O=UC9O=PWmvzgDDw>2 z5<)9DI2cvfYIC0^SSZ=(Rb!kP`!6y|tFpM9l{F~ZRQ1{2;&Kg}fURh~q6?)Cn4xEsF>o)$GYZxtkOPBr!GjuXNUziGg~MGzl8w!@_Y0z4O`zYw%KnR! z*-xNB=LC?3lH1@f{q9Qp1olMCk<|XzSFk1J5X;Vd8shVE7kFXG@D`Z(@|YZKJOC{e znOZMK0+P9rUr_{8j}KY>(Y9Eojo=Be9F@W*gEyY(wH*OQAZJ39~!;mF7Ujq9hm*RS~amasb^Tb1w{x#d=v)xZl1|egUUjT-Lima z+fThNDO1shnAG?--oH!+AzN-7Q#_pe`+#fyNnpP+XCv$Euj||uyEyI3h)@O69T=EQ zYOMXlE0V&`C~wl+*EZ?q1F(I*No53gvgErq8kMnj<#weR8vioRq=F4Jq@o;hMuISyBv9=>w}feB5S- z)Wlb*+M)$g7tIWm_wBe1C-AP0ZIrl|g!mNO*=0tJBEfV+hv|y5n@41iWKdT1l z!HI8v7EHLA;o!cgm^>$4C`PoW4S9%i;KaB4W#Z0oRuyIW@{ z)V1K zu9m|%2u^7cl)QT5};CM1em+s!5UyI4m8KPsW624>3DWU0T6Lj%tHu z0i|>anp3!d-x2`$uALT6_u`O7qT4JXCK?HF5S}ieyXv_>`Q78)(DV%M>d*RrBx0mTvD77^xBrl>LN=lsG_Eim zBi!_cP@;PoHkx!zJr24?bGF>RKZl0i;b4cjkrs2&y6{^hqX*?rI4FM}dMvzm0cyqU zy{zj(YjFn8tB;_<)=Hdbv_`a@yqGiZEuU@xj*@ez?O_9<=1H!~)N7oNN}bbsHL`yQgAnX-4#w&-Ln z>gi^8M4fj+8PzW_`wSK>flr$Dc6ymSjvVBVsp=dPksFg@GJXeB)g>Gj=bHP68aW(Q z85e9%q?G5UaPaV|3+HA5-sX!muH0Y$6Le>t&SYMph{;*rDIHm4Pzv?TH

    AR;+2`UTkn_KS@8k_#tBG+8&p5#MCBT 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 z zMp^80`IR^+cPPdEvpEWbLj*h<%0DRjg~=91l9FM&=Z!ovn%~)mRNrnEd3f`QvTvA; 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%0DoHEsBDxWf>DQ8K@4QHDjUUjq^cVF%_~R< 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º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

    NUpo_W{6*ZV7+9;8+%#_(WhjjZ$u4i%-f@T`s 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Ξpu>&B(jV+n5VN^JM_ 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

    QW7PSF)t6cSUt6ZAl^*^63ugj- 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 z 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 z
    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
    #@(}QpnG;P3Li%ohAFuy>E>Ivv2Mk@dyJcm} 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 z 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

    P7Jw0*w#yHOSUHGh;Wle}k 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 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/log.20Apr18.large_nylon_melt.g++.1 b/examples/PACKAGES/reaction/nylon,6-6_melt/log.20Apr18.large_nylon_melt.g++.1 deleted file mode 100644 index 653c7582f8..0000000000 --- a/examples/PACKAGES/reaction/nylon,6-6_melt/log.20Apr18.large_nylon_melt.g++.1 +++ /dev/null @@ -1,175 +0,0 @@ -LAMMPS (20 Apr 2018) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) - using 1 OpenMP thread(s) per MPI task -# 35,000 atom nylon melt example - -units real - -boundary p p p - -atom_style full - -kspace_style pppm 1.0e-4 - -pair_style lj/class2/coul/long 8.5 - -angle_style class2 - -bond_style class2 - -dihedral_style class2 - -improper_style class2 - -read_data large_nylon_melt.data.gz - orthogonal box = (-2.68344 -2.06791 -2.21988) to (73.4552 73.2448 73.4065) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 35200 atoms - reading velocities ... - 35200 velocities - scanning bonds ... - 9 = max bonds/atom - scanning angles ... - 21 = max angles/atom - scanning dihedrals ... - 31 = max dihedrals/atom - scanning impropers ... - 29 = max impropers/atom - reading bonds ... - 33600 bonds - reading angles ... - 59200 angles - reading dihedrals ... - 80000 dihedrals - reading impropers ... - 35200 impropers - 4 = max # of 1-2 neighbors - 6 = max # of 1-3 neighbors - 12 = max # of 1-4 neighbors - 41 = max # of special neighbors - -velocity all create 800.0 4928459 dist gaussian - -molecule mol1 rxn1_stp1_unreacted.data_template -Read molecule mol1: - 18 atoms with max type 8 - 16 bonds with max type 12 - 25 angles with max type 24 - 23 dihedrals with max type 33 - 14 impropers with max type 9 -molecule mol2 rxn1_stp1_reacted.data_template -Read molecule mol2: - 18 atoms with max type 9 - 17 bonds with max type 11 - 31 angles with max type 23 - 39 dihedrals with max type 30 - 20 impropers with max type 1 -molecule mol3 rxn1_stp2_unreacted.data_template -Read molecule mol3: - 15 atoms with max type 9 - 14 bonds with max type 11 - 25 angles with max type 23 - 30 dihedrals with max type 30 - 16 impropers with max type 1 -molecule mol4 rxn1_stp2_reacted.data_template -Read molecule mol4: - 15 atoms with max type 11 - 13 bonds with max type 13 - 19 angles with max type 25 - 16 dihedrals with max type 29 - 10 impropers with max type 11 - -thermo 50 - -# dump 1 all xyz 100 test_vis.xyz - -fix myrxns all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0.0 2.9 mol1 mol2 rxn1_stp1_map react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map -WARNING: An atom in 'react #1' changes bond connectivity but not atom type (../fix_bond_react.cpp:1489) -WARNING: An atom in 'react #2' changes bond connectivity but not atom type (../fix_bond_react.cpp:1489) -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp defined -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp defined - -# stable at 800K -fix 1 statted_grp nvt temp 800 800 100 - -# in order to customize behavior of reacting atoms, -# you can use the internally created 'bond_react_MASTER_group', like so: -# fix 2 bond_react_MASTER_group temp/rescale 1 800 800 10 1 - -thermo_style custom step temp press density f_myrxns[1] f_myrxns[2] # cumulative reaction counts - -# restart 100 restart1 restart2 - -run 200 -PPPM initialization ... - using 12-bit tables for long-range coulomb (../kspace.cpp:321) - G vector (1/distance) = 0.20765 - grid = 18 18 18 - stencil order = 5 - estimated absolute RMS force accuracy = 0.0333156 - estimated relative force accuracy = 0.000100329 - using double precision FFTs - 3d grid and FFT values/proc = 12167 5832 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10.5 - ghost atom cutoff = 10.5 - binsize = 5.25, bins = 15 15 15 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 209.1 | 209.1 | 209.1 Mbytes -Step Temp Press Density f_myrxns[1] f_myrxns[2] - 0 800 3666.3948 0.80366765 0 0 - 50 673.95238 -9670.9169 0.80366765 31 0 - 100 697.22819 -4624.0512 0.80366765 57 22 - 150 723.60507 -17175.571 0.80366765 76 48 - 200 736.71277 -12961.963 0.80366765 84 64 -Loop time of 102.825 on 1 procs for 200 steps with 35200 atoms - -Performance: 0.168 ns/day, 142.812 hours/ns, 1.945 timesteps/s -99.7% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 27.193 | 27.193 | 27.193 | 0.0 | 26.45 -Bond | 11.324 | 11.324 | 11.324 | 0.0 | 11.01 -Kspace | 4.1878 | 4.1878 | 4.1878 | 0.0 | 4.07 -Neigh | 54.724 | 54.724 | 54.724 | 0.0 | 53.22 -Comm | 0.40662 | 0.40662 | 0.40662 | 0.0 | 0.40 -Output | 0.0011101 | 0.0011101 | 0.0011101 | 0.0 | 0.00 -Modify | 4.9422 | 4.9422 | 4.9422 | 0.0 | 4.81 -Other | | 0.04545 | | | 0.04 - -Nlocal: 35200 ave 35200 max 35200 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 38403 ave 38403 max 38403 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 6.9281e+06 ave 6.9281e+06 max 6.9281e+06 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 6928101 -Ave neighs/atom = 196.821 -Ave special neighs/atom = 9.83727 -Neighbor list builds = 200 -Dangerous builds = 0 - -# write_restart restart_longrun -# write_data restart_longrun.data - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:01:43 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/log.20Apr18.large_nylon_melt.g++.4 b/examples/PACKAGES/reaction/nylon,6-6_melt/log.20Apr18.large_nylon_melt.g++.4 deleted file mode 100644 index cc0dda60c7..0000000000 --- a/examples/PACKAGES/reaction/nylon,6-6_melt/log.20Apr18.large_nylon_melt.g++.4 +++ /dev/null @@ -1,175 +0,0 @@ -LAMMPS (20 Apr 2018) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (../comm.cpp:90) - using 1 OpenMP thread(s) per MPI task -# 35,000 atom nylon melt example - -units real - -boundary p p p - -atom_style full - -kspace_style pppm 1.0e-4 - -pair_style lj/class2/coul/long 8.5 - -angle_style class2 - -bond_style class2 - -dihedral_style class2 - -improper_style class2 - -read_data large_nylon_melt.data.gz - orthogonal box = (-2.68344 -2.06791 -2.21988) to (73.4552 73.2448 73.4065) - 2 by 1 by 2 MPI processor grid - reading atoms ... - 35200 atoms - reading velocities ... - 35200 velocities - scanning bonds ... - 9 = max bonds/atom - scanning angles ... - 21 = max angles/atom - scanning dihedrals ... - 31 = max dihedrals/atom - scanning impropers ... - 29 = max impropers/atom - reading bonds ... - 33600 bonds - reading angles ... - 59200 angles - reading dihedrals ... - 80000 dihedrals - reading impropers ... - 35200 impropers - 4 = max # of 1-2 neighbors - 6 = max # of 1-3 neighbors - 12 = max # of 1-4 neighbors - 41 = max # of special neighbors - -velocity all create 800.0 4928459 dist gaussian - -molecule mol1 rxn1_stp1_unreacted.data_template -Read molecule mol1: - 18 atoms with max type 8 - 16 bonds with max type 12 - 25 angles with max type 24 - 23 dihedrals with max type 33 - 14 impropers with max type 9 -molecule mol2 rxn1_stp1_reacted.data_template -Read molecule mol2: - 18 atoms with max type 9 - 17 bonds with max type 11 - 31 angles with max type 23 - 39 dihedrals with max type 30 - 20 impropers with max type 1 -molecule mol3 rxn1_stp2_unreacted.data_template -Read molecule mol3: - 15 atoms with max type 9 - 14 bonds with max type 11 - 25 angles with max type 23 - 30 dihedrals with max type 30 - 16 impropers with max type 1 -molecule mol4 rxn1_stp2_reacted.data_template -Read molecule mol4: - 15 atoms with max type 11 - 13 bonds with max type 13 - 19 angles with max type 25 - 16 dihedrals with max type 29 - 10 impropers with max type 11 - -thermo 50 - -# dump 1 all xyz 100 test_vis.xyz - -fix myrxns all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0.0 2.9 mol1 mol2 rxn1_stp1_map react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map -WARNING: An atom in 'react #1' changes bond connectivity but not atom type (../fix_bond_react.cpp:1489) -WARNING: An atom in 'react #2' changes bond connectivity but not atom type (../fix_bond_react.cpp:1489) -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp defined -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp defined - -# stable at 800K -fix 1 statted_grp nvt temp 800 800 100 - -# in order to customize behavior of reacting atoms, -# you can use the internally created 'bond_react_MASTER_group', like so: -# fix 2 bond_react_MASTER_group temp/rescale 1 800 800 10 1 - -thermo_style custom step temp press density f_myrxns[1] f_myrxns[2] # cumulative reaction counts - -# restart 100 restart1 restart2 - -run 200 -PPPM initialization ... - using 12-bit tables for long-range coulomb (../kspace.cpp:321) - G vector (1/distance) = 0.20765 - grid = 18 18 18 - stencil order = 5 - estimated absolute RMS force accuracy = 0.0333156 - estimated relative force accuracy = 0.000100329 - using double precision FFTs - 3d grid and FFT values/proc = 4508 1620 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10.5 - ghost atom cutoff = 10.5 - binsize = 5.25, bins = 15 15 15 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 81.11 | 81.13 | 81.15 Mbytes -Step Temp Press Density f_myrxns[1] f_myrxns[2] - 0 800 3666.3948 0.80366765 0 0 - 50 673.95238 -9670.9169 0.80366765 31 0 - 100 697.22819 -4624.0512 0.80366765 57 22 - 150 724.40407 -17166.729 0.80366765 76 49 - 200 737.28582 -12968.224 0.80366765 84 65 -Loop time of 51.171 on 4 procs for 200 steps with 35200 atoms - -Performance: 0.338 ns/day, 71.071 hours/ns, 3.908 timesteps/s -98.4% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 12.926 | 13.247 | 13.493 | 6.7 | 25.89 -Bond | 5.2132 | 5.2733 | 5.3367 | 1.9 | 10.31 -Kspace | 2.3601 | 2.6534 | 3.0067 | 16.0 | 5.19 -Neigh | 25.93 | 25.934 | 25.937 | 0.1 | 50.68 -Comm | 0.73273 | 0.75464 | 0.78505 | 2.3 | 1.47 -Output | 0.00045228 | 0.00067407 | 0.0013323 | 0.0 | 0.00 -Modify | 3.2682 | 3.2686 | 3.2692 | 0.0 | 6.39 -Other | | 0.03995 | | | 0.08 - -Nlocal: 8800 ave 8913 max 8652 min -Histogram: 1 0 0 0 1 0 0 0 1 1 -Nghost: 18366 ave 18461 max 18190 min -Histogram: 1 0 0 0 0 0 0 1 1 1 -Neighs: 1.73203e+06 ave 1.77261e+06 max 1.68165e+06 min -Histogram: 1 0 1 0 0 0 0 0 0 2 - -Total # of neighbors = 6928132 -Ave neighs/atom = 196.822 -Ave special neighs/atom = 9.83608 -Neighbor list builds = 200 -Dangerous builds = 0 - -# write_restart restart_longrun -# write_data restart_longrun.data - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:52 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.1 b/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.1 new file mode 100644 index 0000000000..26c11bd020 --- /dev/null +++ b/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.1 @@ -0,0 +1,150 @@ +LAMMPS (4 Nov 2022) +Reading data file ... + orthogonal box = (-2.6834403 -2.0679138 -2.2198803) to (73.455228 73.244835 73.40648) + 1 by 1 by 1 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 35200 atoms + reading velocities ... + 35200 velocities + scanning bonds ... + 9 = max bonds/atom + scanning angles ... + 21 = max angles/atom + scanning dihedrals ... + 31 = max dihedrals/atom + scanning impropers ... + 29 = max impropers/atom + reading bonds ... + 33600 bonds + reading angles ... + 59200 angles + reading dihedrals ... + 80000 dihedrals + reading impropers ... + 35200 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 12 = max # of 1-4 neighbors + 41 = max # of special neighbors + special bonds CPU = 0.026 seconds + read_data CPU = 0.937 seconds +Read molecule template mol1: + 1 molecules + 0 fragments + 18 atoms with max type 8 + 16 bonds with max type 12 + 25 angles with max type 24 + 23 dihedrals with max type 33 + 2 impropers with max type 9 +Read molecule template mol2: + 1 molecules + 0 fragments + 18 atoms with max type 9 + 17 bonds with max type 11 + 31 angles with max type 23 + 39 dihedrals with max type 30 + 0 impropers with max type 0 +Read molecule template mol3: + 1 molecules + 0 fragments + 15 atoms with max type 9 + 14 bonds with max type 11 + 25 angles with max type 23 + 30 dihedrals with max type 30 + 0 impropers with max type 0 +Read molecule template mol4: + 1 molecules + 0 fragments + 15 atoms with max type 11 + 13 bonds with max type 13 + 19 angles with max type 25 + 16 dihedrals with max type 29 + 2 impropers with max type 11 +WARNING: Fix bond/react: Atom affected by reaction rxn2 is too close to template edge (../fix_bond_react.cpp:2624) +dynamic group bond_react_MASTER_group defined +dynamic group statted_grp_REACT defined + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 +The log file lists these citations in BibTeX format. + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +PPPM initialization ... + using 12-bit tables for long-range coulomb (../kspace.cpp:342) + G vector (1/distance) = 0.20765034 + grid = 18 18 18 + stencil order = 5 + estimated absolute RMS force accuracy = 0.033315619 + estimated relative force accuracy = 0.000100329 + using double precision KISS FFT + 3d grid and FFT values/proc = 12167 5832 +Generated 55 of 55 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 15 15 15 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Setting up Verlet run ... + Unit style : real + Current step : 0 + Time step : 1 +Per MPI rank memory allocation (min/avg/max) = 209.8 | 209.8 | 209.8 Mbytes + Step Temp Press Density f_myrxns[1] f_myrxns[2] + 0 800 3666.3948 0.80366765 0 0 + 50 673.94821 -9679.5038 0.80366765 31 0 + 100 694.45718 -2104.8514 0.80366765 57 22 + 150 716.53915 -12356.83 0.80366765 77 50 + 200 723.33218 -1319.9666 0.80366765 84 67 +Loop time of 87.9809 on 1 procs for 200 steps with 35200 atoms + +Performance: 0.196 ns/day, 122.196 hours/ns, 2.273 timesteps/s, 80.017 katom-step/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 25.691 | 25.691 | 25.691 | 0.0 | 29.20 +Bond | 15.772 | 15.772 | 15.772 | 0.0 | 17.93 +Kspace | 4.611 | 4.611 | 4.611 | 0.0 | 5.24 +Neigh | 35.616 | 35.616 | 35.616 | 0.0 | 40.48 +Comm | 0.24971 | 0.24971 | 0.24971 | 0.0 | 0.28 +Output | 0.00098602 | 0.00098602 | 0.00098602 | 0.0 | 0.00 +Modify | 5.9596 | 5.9596 | 5.9596 | 0.0 | 6.77 +Other | | 0.08051 | | | 0.09 + +Nlocal: 35200 ave 35200 max 35200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 38403 ave 38403 max 38403 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 6.92764e+06 ave 6.92764e+06 max 6.92764e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 6927635 +Ave neighs/atom = 196.80781 +Ave special neighs/atom = 9.8480114 +Neighbor list builds = 128 +Dangerous builds = 0 +Total wall time: 0:01:29 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.4 b/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.4 new file mode 100644 index 0000000000..69a663c59c --- /dev/null +++ b/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.4 @@ -0,0 +1,151 @@ +LAMMPS (4 Nov 2022) +WARNING: Using I/O redirection is unreliable with parallel runs. Better use -in switch to read input file. (../lammps.cpp:529) +Reading data file ... + orthogonal box = (-2.6834403 -2.0679138 -2.2198803) to (73.455228 73.244835 73.40648) + 2 by 1 by 2 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 35200 atoms + reading velocities ... + 35200 velocities + scanning bonds ... + 9 = max bonds/atom + scanning angles ... + 21 = max angles/atom + scanning dihedrals ... + 31 = max dihedrals/atom + scanning impropers ... + 29 = max impropers/atom + reading bonds ... + 33600 bonds + reading angles ... + 59200 angles + reading dihedrals ... + 80000 dihedrals + reading impropers ... + 35200 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 12 = max # of 1-4 neighbors + 41 = max # of special neighbors + special bonds CPU = 0.007 seconds + read_data CPU = 0.853 seconds +Read molecule template mol1: + 1 molecules + 0 fragments + 18 atoms with max type 8 + 16 bonds with max type 12 + 25 angles with max type 24 + 23 dihedrals with max type 33 + 2 impropers with max type 9 +Read molecule template mol2: + 1 molecules + 0 fragments + 18 atoms with max type 9 + 17 bonds with max type 11 + 31 angles with max type 23 + 39 dihedrals with max type 30 + 0 impropers with max type 0 +Read molecule template mol3: + 1 molecules + 0 fragments + 15 atoms with max type 9 + 14 bonds with max type 11 + 25 angles with max type 23 + 30 dihedrals with max type 30 + 0 impropers with max type 0 +Read molecule template mol4: + 1 molecules + 0 fragments + 15 atoms with max type 11 + 13 bonds with max type 13 + 19 angles with max type 25 + 16 dihedrals with max type 29 + 2 impropers with max type 11 +WARNING: Fix bond/react: Atom affected by reaction rxn2 is too close to template edge (../fix_bond_react.cpp:2624) +dynamic group bond_react_MASTER_group defined +dynamic group statted_grp_REACT defined + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 +The log file lists these citations in BibTeX format. + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +PPPM initialization ... + using 12-bit tables for long-range coulomb (../kspace.cpp:342) + G vector (1/distance) = 0.20765034 + grid = 18 18 18 + stencil order = 5 + estimated absolute RMS force accuracy = 0.033315619 + estimated relative force accuracy = 0.000100329 + using double precision KISS FFT + 3d grid and FFT values/proc = 4508 1620 +Generated 55 of 55 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 15 15 15 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Setting up Verlet run ... + Unit style : real + Current step : 0 + Time step : 1 +Per MPI rank memory allocation (min/avg/max) = 81.39 | 81.41 | 81.43 Mbytes + Step Temp Press Density f_myrxns[1] f_myrxns[2] + 0 800 3666.3948 0.80366765 0 0 + 50 673.94821 -9679.5038 0.80366765 31 0 + 100 694.36354 -2108.4881 0.80366765 57 22 + 150 716.5075 -12356.04 0.80366765 77 50 + 200 722.97306 -1308.3439 0.80366765 84 67 +Loop time of 23.0703 on 4 procs for 200 steps with 35200 atoms + +Performance: 0.749 ns/day, 32.042 hours/ns, 8.669 timesteps/s, 305.154 katom-step/s +100.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 6.6778 | 6.8513 | 6.9896 | 5.2 | 29.70 +Bond | 3.8962 | 3.9719 | 4.0488 | 3.0 | 17.22 +Kspace | 1.1907 | 1.3846 | 1.6278 | 15.9 | 6.00 +Neigh | 8.7963 | 8.7965 | 8.7967 | 0.0 | 38.13 +Comm | 0.1468 | 0.15512 | 0.16131 | 1.6 | 0.67 +Output | 0.00035931 | 0.00037432 | 0.00041707 | 0.0 | 0.00 +Modify | 1.8808 | 1.8808 | 1.8809 | 0.0 | 8.15 +Other | | 0.02973 | | | 0.13 + +Nlocal: 8800 ave 8911 max 8662 min +Histogram: 1 0 0 1 0 0 0 0 1 1 +Nghost: 18358.5 ave 18438 max 18183 min +Histogram: 1 0 0 0 0 0 0 0 1 2 +Neighs: 1.73191e+06 ave 1.77313e+06 max 1.68375e+06 min +Histogram: 1 0 1 0 0 0 0 0 0 2 + +Total # of neighbors = 6927655 +Ave neighs/atom = 196.80838 +Ave special neighs/atom = 9.8480114 +Neighbor list builds = 128 +Dangerous builds = 0 +Total wall time: 0:00:24 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_reacted.data_template b/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_reacted.data_template deleted file mode 100644 index 61c0408ce3..0000000000 --- a/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_reacted.data_template +++ /dev/null @@ -1,189 +0,0 @@ -this is a molecule template for: initial nylon crosslink, post-reacting - -18 atoms -17 bonds -31 angles -39 dihedrals -20 impropers - -Types - -1 9 -2 1 -3 1 -4 4 -5 4 -6 3 -7 3 -8 1 -9 1 -10 5 -11 8 -12 6 -13 3 -14 3 -15 7 -16 1 -17 3 -18 3 - -Charges - -1 -0.300000 -2 0.000000 -3 0.000000 -4 0.000000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.300000 -11 0.000000 -12 0.000000 -13 0.000000 -14 0.000000 -15 0.000000 -16 0.000000 -17 0.000000 -18 0.000000 - -Coords - -1 -5.522237 -0.752722 1.631158 -2 -5.170398 -0.545733 0.178130 -3 -6.469695 -0.553072 -0.648889 -4 -6.052076 -1.721152 1.744648 -5 -6.183059 0.071387 1.971497 -6 -4.489340 -1.389197 -0.173156 -7 -4.637591 0.453703 0.051252 -8 -5.618658 0.138919 4.386107 -9 -4.669492 -0.989819 3.943591 -10 -4.270194 -0.766405 2.474102 -11 -3.348470 -1.875393 2.024289 -12 -3.569794 0.564183 2.345995 -13 -5.201079 -1.993301 4.044219 -14 -3.736682 -0.984819 4.598305 -15 -4.255402 1.370923 2.679069 -16 -6.136394 -0.339866 -2.136775 -17 -6.996331 -1.555519 -0.517408 -18 -7.153308 0.284949 -0.289930 - -Bonds - -1 9 1 2 -2 10 1 4 -3 10 1 5 -4 11 1 10 -5 1 2 3 -6 2 2 6 -7 2 2 7 -8 1 3 16 -9 2 3 17 -10 2 3 18 -11 1 8 9 -12 6 9 10 -13 2 9 13 -14 2 9 14 -15 7 10 11 -16 5 10 12 -17 8 12 15 - -Angles - -1 14 2 1 4 -2 14 2 1 5 -3 15 2 1 10 -4 16 4 1 5 -5 17 4 1 10 -6 17 5 1 10 -7 18 1 2 3 -8 19 1 2 6 -9 19 1 2 7 -10 1 3 2 6 -11 1 3 2 7 -12 3 6 2 7 -13 2 2 3 16 -14 1 2 3 17 -15 1 2 3 18 -16 1 16 3 17 -17 1 16 3 18 -18 3 17 3 18 -19 12 8 9 10 -20 1 8 9 13 -21 1 8 9 14 -22 13 13 9 10 -23 13 14 9 10 -24 3 13 9 14 -25 10 9 10 11 -26 8 9 10 12 -27 20 1 10 9 -28 21 11 10 12 -29 22 1 10 11 -30 23 1 10 12 -31 11 10 12 15 - -Dihedrals - -1 16 4 1 2 3 -2 17 4 1 2 6 -3 17 4 1 2 7 -4 16 5 1 2 3 -5 17 5 1 2 6 -6 17 5 1 2 7 -7 18 10 1 2 3 -8 19 10 1 2 6 -9 19 10 1 2 7 -10 20 2 1 10 9 -11 21 2 1 10 11 -12 22 2 1 10 12 -13 23 4 1 10 9 -14 24 4 1 10 11 -15 25 4 1 10 12 -16 23 5 1 10 9 -17 24 5 1 10 11 -18 25 5 1 10 12 -19 26 1 2 3 16 -20 27 1 2 3 17 -21 27 1 2 3 18 -22 4 16 3 2 6 -23 2 6 2 3 17 -24 2 6 2 3 18 -25 4 16 3 2 7 -26 2 7 2 3 17 -27 2 7 2 3 18 -28 14 8 9 10 11 -29 12 8 9 10 12 -30 28 8 9 10 1 -31 15 13 9 10 11 -32 13 13 9 10 12 -33 29 13 9 10 1 -34 15 14 9 10 11 -35 13 14 9 10 12 -36 29 14 9 10 1 -37 10 9 10 12 15 -38 11 11 10 12 15 -39 30 1 10 12 15 - -Impropers - -1 1 2 1 4 5 -2 1 2 1 4 10 -3 1 2 1 5 10 -4 1 4 1 5 10 -5 1 1 2 3 6 -6 1 1 2 3 7 -7 1 1 2 6 7 -8 1 3 2 6 7 -9 1 2 3 16 17 -10 1 2 3 16 18 -11 1 2 3 17 18 -12 1 16 3 17 18 -13 1 8 9 13 10 -14 1 8 9 14 10 -15 1 8 9 13 14 -16 1 13 9 14 10 -17 1 9 10 11 12 -18 1 1 10 9 11 -19 1 1 10 9 12 -20 1 1 10 11 12 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_reacted.molecule_template b/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_reacted.molecule_template new file mode 100644 index 0000000000..40f3aa8276 --- /dev/null +++ b/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_reacted.molecule_template @@ -0,0 +1,187 @@ +this is a molecule template for: initial nylon crosslink, post-reacting + + 18 atoms + 17 bonds + 31 angles + 39 dihedrals + 0 impropers + +Coords + + 1 -5.522237178 -0.752722499 1.631158408 + 2 -5.170398325 -0.545733378 0.178129978 + 3 -6.469694974 -0.553071841 -0.648889109 + 4 -6.052075697 -1.721152483 1.744647858 + 5 -6.183058842 0.071386755 1.971497329 + 6 -4.489339595 -1.389196844 -0.173156276 + 7 -4.637590712 0.453703382 0.051251954 + 8 -5.618657658 0.138918810 4.386106928 + 9 -4.669491736 -0.989818781 3.943591338 + 10 -4.270193542 -0.766405234 2.474102239 + 11 -3.348470373 -1.875393291 2.024289246 + 12 -3.569793683 0.564183226 2.345995471 + 13 -5.201078949 -1.993301389 4.044218837 + 14 -3.736681607 -0.984819193 4.598304847 + 15 -4.255401979 1.370923174 2.679069013 + 16 -6.136393628 -0.339866195 -2.136774990 + 17 -6.996331494 -1.555519161 -0.517408063 + 18 -7.153308038 0.284949373 -0.289930394 + +Types + + 1 n + 2 c2 + 3 c2 + 4 hn + 5 hn + 6 hc + 7 hc + 8 c2 + 9 c2 + 10 c_1 + 11 o_1 + 12 o + 13 hc + 14 hc + 15 ho + 16 c2 + 17 hc + 18 hc + +Charges + + 1 -0.300000 + 2 0.000000 + 3 0.000000 + 4 0.000000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.300000 + 11 0.000000 + 12 0.000000 + 13 0.000000 + 14 0.000000 + 15 0.000000 + 16 0.000000 + 17 0.000000 + 18 0.000000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + +Bonds + + 1 n-c2 1 2 + 2 n-hn 1 4 + 3 n-hn 1 5 + 4 n-c_1 1 10 + 5 c2-c2 2 3 + 6 c2-hc 2 6 + 7 c2-hc 2 7 + 8 c2-c2 3 16 + 9 c2-hc 3 17 + 10 c2-hc 3 18 + 11 c2-c2 8 9 + 12 c2-c_1 9 10 + 13 c2-hc 9 13 + 14 c2-hc 9 14 + 15 c_1-o_1 10 11 + 16 c_1-o 10 12 + 17 o-ho 12 15 + +Angles + + 1 c2-n-hn 2 1 4 + 2 c2-n-hn 2 1 5 + 3 c2-n-c_1 2 1 10 + 4 hn-n-hn 4 1 5 + 5 hn-n-c_1 4 1 10 + 6 hn-n-c_1 5 1 10 + 7 n-c2-c2 1 2 3 + 8 n-c2-hc 1 2 6 + 9 n-c2-hc 1 2 7 + 10 c2-c2-hc 3 2 6 + 11 c2-c2-hc 3 2 7 + 12 hc-c2-hc 6 2 7 + 13 c2-c2-c2 2 3 16 + 14 c2-c2-hc 2 3 17 + 15 c2-c2-hc 2 3 18 + 16 c2-c2-hc 16 3 17 + 17 c2-c2-hc 16 3 18 + 18 hc-c2-hc 17 3 18 + 19 c2-c2-c_1 8 9 10 + 20 c2-c2-hc 8 9 13 + 21 c2-c2-hc 8 9 14 + 22 hc-c2-c_1 13 9 10 + 23 hc-c2-c_1 14 9 10 + 24 hc-c2-hc 13 9 14 + 25 c2-c_1-o_1 9 10 11 + 26 c2-c_1-o 9 10 12 + 27 n-c_1-c2 1 10 9 + 28 o_1-c_1-o 11 10 12 + 29 n-c_1-o_1 1 10 11 + 30 n-c_1-o 1 10 12 + 31 c_1-o-ho 10 12 15 + +Dihedrals + + 1 hn-n-c2-c2 4 1 2 3 + 2 hn-n-c2-hc 4 1 2 6 + 3 hn-n-c2-hc 4 1 2 7 + 4 hn-n-c2-c2 5 1 2 3 + 5 hn-n-c2-hc 5 1 2 6 + 6 hn-n-c2-hc 5 1 2 7 + 7 c_1-n-c2-c2 10 1 2 3 + 8 c_1-n-c2-hc 10 1 2 6 + 9 c_1-n-c2-hc 10 1 2 7 + 10 c2-n-c_1-c2 2 1 10 9 + 11 c2-n-c_1-o_1 2 1 10 11 + 12 c2-n-c_1-o 2 1 10 12 + 13 hn-n-c_1-c2 4 1 10 9 + 14 hn-n-c_1-o_1 4 1 10 11 + 15 hn-n-c_1-o 4 1 10 12 + 16 hn-n-c_1-c2 5 1 10 9 + 17 hn-n-c_1-o_1 5 1 10 11 + 18 hn-n-c_1-o 5 1 10 12 + 19 n-c2-c2-c2 1 2 3 16 + 20 n-c2-c2-hc 1 2 3 17 + 21 n-c2-c2-hc 1 2 3 18 + 22 c2-c2-c2-hc 16 3 2 6 + 23 hc-c2-c2-hc 6 2 3 17 + 24 hc-c2-c2-hc 6 2 3 18 + 25 c2-c2-c2-hc 16 3 2 7 + 26 hc-c2-c2-hc 7 2 3 17 + 27 hc-c2-c2-hc 7 2 3 18 + 28 c2-c2-c_1-o_1 8 9 10 11 + 29 c2-c2-c_1-o 8 9 10 12 + 30 c2-c2-c_1-n 8 9 10 1 + 31 hc-c2-c_1-o_1 13 9 10 11 + 32 hc-c2-c_1-o 13 9 10 12 + 33 hc-c2-c_1-n 13 9 10 1 + 34 hc-c2-c_1-o_1 14 9 10 11 + 35 hc-c2-c_1-o 14 9 10 12 + 36 hc-c2-c_1-n 14 9 10 1 + 37 c2-c_1-o-ho 9 10 12 15 + 38 o_1-c_1-o-ho 11 10 12 15 + 39 n-c_1-o-ho 1 10 12 15 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_unreacted.data_template b/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_unreacted.data_template deleted file mode 100644 index 944d6918c5..0000000000 --- a/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_unreacted.data_template +++ /dev/null @@ -1,160 +0,0 @@ -this is a molecule template for: initial nylon crosslink, pre-reacting - -18 atoms -16 bonds -25 angles -23 dihedrals -14 impropers - -Types - -1 2 -2 1 -3 1 -4 4 -5 4 -6 3 -7 3 -8 1 -9 1 -10 5 -11 8 -12 6 -13 3 -14 3 -15 7 -16 1 -17 3 -18 3 - -Charges - -1 -0.300000 -2 0.000000 -3 0.000000 -4 0.000000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.300000 -11 0.000000 -12 0.000000 -13 0.000000 -14 0.000000 -15 0.000000 -16 0.000000 -17 0.000000 -18 0.000000 - -Coords - -1 -4.922858 -0.946982 1.146055 -2 -5.047195 -0.935267 -0.358173 -3 -6.526281 -0.755366 -0.743523 -4 -5.282604 0.020447 1.552710 -5 -3.860697 -1.095850 1.428305 -6 -4.662382 -1.920900 -0.781524 -7 -4.433977 -0.072765 -0.784071 -8 -5.506279 0.202610 4.825816 -9 -4.449177 -0.844592 4.423366 -10 -4.103916 -0.749629 2.925195 -11 -3.376249 -1.886171 2.245643 -12 -4.493235 0.477214 2.137199 -13 -4.849053 -1.888877 4.663994 -14 -3.491823 -0.662913 5.018510 -15 -5.020777 1.189745 2.805427 -16 -3.964987 2.900602 -1.551341 -17 -4.460694 2.836102 0.668882 -18 -4.828494 3.219656 -0.122111 - -Bonds - -1 12 1 2 -2 4 1 4 -3 4 1 5 -4 1 2 3 -5 2 2 6 -6 2 2 7 -7 1 3 16 -8 2 3 17 -9 2 3 18 -10 1 8 9 -11 6 9 10 -12 2 9 13 -13 2 9 14 -14 7 10 11 -15 5 10 12 -16 8 12 15 - -Angles - -1 6 2 1 4 -2 6 2 1 5 -3 7 4 1 5 -4 24 1 2 3 -5 5 1 2 6 -6 5 1 2 7 -7 1 3 2 6 -8 1 3 2 7 -9 3 6 2 7 -10 2 2 3 16 -11 1 2 3 17 -12 1 2 3 18 -13 1 16 3 17 -14 1 16 3 18 -15 3 17 3 18 -16 12 8 9 10 -17 1 8 9 13 -18 1 8 9 14 -19 13 13 9 10 -20 13 14 9 10 -21 3 13 9 14 -22 10 9 10 11 -23 8 9 10 12 -24 21 11 10 12 -25 11 10 12 15 - -Dihedrals - -1 31 4 1 2 3 -2 32 4 1 2 6 -3 32 4 1 2 7 -4 31 5 1 2 3 -5 32 5 1 2 6 -6 32 5 1 2 7 -7 33 1 2 3 16 -8 1 1 2 3 17 -9 1 1 2 3 18 -10 4 16 3 2 6 -11 2 6 2 3 17 -12 2 6 2 3 18 -13 4 16 3 2 7 -14 2 7 2 3 17 -15 2 7 2 3 18 -16 14 8 9 10 11 -17 12 8 9 10 12 -18 15 13 9 10 11 -19 13 13 9 10 12 -20 15 14 9 10 11 -21 13 14 9 10 12 -22 10 9 10 12 15 -23 11 11 10 12 15 - -Impropers - -1 1 2 1 4 5 -2 9 9 10 11 12 -3 1 1 2 3 6 -4 1 1 2 3 7 -5 1 1 2 6 7 -6 1 3 2 6 7 -7 1 2 3 16 17 -8 1 2 3 16 18 -9 1 2 3 17 18 -10 1 16 3 17 18 -11 1 8 9 13 10 -12 1 8 9 14 10 -13 1 8 9 13 14 -14 1 13 9 14 10 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_unreacted.molecule_template b/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_unreacted.molecule_template new file mode 100644 index 0000000000..7de7512f1c --- /dev/null +++ b/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp1_unreacted.molecule_template @@ -0,0 +1,169 @@ +this is a molecule template for: initial nylon crosslink, pre-reacting + + 18 atoms + 16 bonds + 25 angles + 23 dihedrals + 2 impropers + +Coords + + 1 -4.922858499 -0.946981747 1.146055346 + 2 -5.047194816 -0.935266843 -0.358172771 + 3 -6.526281447 -0.755365854 -0.743523227 + 4 -5.282604074 0.020446894 1.552710361 + 5 -3.860696509 -1.095850190 1.428304925 + 6 -4.662381862 -1.920899862 -0.781524026 + 7 -4.433976540 -0.072765142 -0.784070641 + 8 -5.506279186 0.202610302 4.825815562 + 9 -4.449176624 -0.844592213 4.423366146 + 10 -4.103915981 -0.749628655 2.925195217 + 11 -3.376248536 -1.886171498 2.245643443 + 12 -4.493235430 0.477213651 2.137199034 + 13 -4.849052953 -1.888876753 4.663993750 + 14 -3.491822950 -0.662913310 5.018510248 + 15 -5.020776528 1.189745133 2.805427194 + 16 -3.964987378 2.900602044 -1.551341170 + 17 -4.460693773 2.836101897 0.668881952 + 18 -4.828494000 3.219655862 -0.122111278 + +Types + + 1 na + 2 c2 + 3 c2 + 4 hn + 5 hn + 6 hc + 7 hc + 8 c2 + 9 c2 + 10 c_1 + 11 o_1 + 12 o + 13 hc + 14 hc + 15 ho + 16 c2 + 17 hc + 18 hc + +Charges + + 1 -0.300000 + 2 0.000000 + 3 0.000000 + 4 0.000000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.300000 + 11 0.000000 + 12 0.000000 + 13 0.000000 + 14 0.000000 + 15 0.000000 + 16 0.000000 + 17 0.000000 + 18 0.000000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + +Bonds + + 1 na-c2 1 2 + 2 na-hn 1 4 + 3 na-hn 1 5 + 4 c2-c2 2 3 + 5 c2-hc 2 6 + 6 c2-hc 2 7 + 7 c2-c2 3 16 + 8 c2-hc 3 17 + 9 c2-hc 3 18 + 10 c2-c2 8 9 + 11 c2-c_1 9 10 + 12 c2-hc 9 13 + 13 c2-hc 9 14 + 14 c_1-o_1 10 11 + 15 c_1-o 10 12 + 16 o-ho 12 15 + +Angles + + 1 c2-na-hn 2 1 4 + 2 c2-na-hn 2 1 5 + 3 hn-na-hn 4 1 5 + 4 na-c2-c2 1 2 3 + 5 na-c2-hc 1 2 6 + 6 na-c2-hc 1 2 7 + 7 c2-c2-hc 3 2 6 + 8 c2-c2-hc 3 2 7 + 9 hc-c2-hc 6 2 7 + 10 c2-c2-c2 2 3 16 + 11 c2-c2-hc 2 3 17 + 12 c2-c2-hc 2 3 18 + 13 c2-c2-hc 16 3 17 + 14 c2-c2-hc 16 3 18 + 15 hc-c2-hc 17 3 18 + 16 c2-c2-c_1 8 9 10 + 17 c2-c2-hc 8 9 13 + 18 c2-c2-hc 8 9 14 + 19 hc-c2-c_1 13 9 10 + 20 hc-c2-c_1 14 9 10 + 21 hc-c2-hc 13 9 14 + 22 c2-c_1-o_1 9 10 11 + 23 c2-c_1-o 9 10 12 + 24 o_1-c_1-o 11 10 12 + 25 c_1-o-ho 10 12 15 + +Dihedrals + + 1 hn-na-c2-c2 4 1 2 3 + 2 hn-na-c2-hc 4 1 2 6 + 3 hn-na-c2-hc 4 1 2 7 + 4 hn-na-c2-c2 5 1 2 3 + 5 hn-na-c2-hc 5 1 2 6 + 6 hn-na-c2-hc 5 1 2 7 + 7 na-c2-c2-c2 1 2 3 16 + 8 na-c2-c2-hc 1 2 3 17 + 9 na-c2-c2-hc 1 2 3 18 + 10 c2-c2-c2-hc 16 3 2 6 + 11 hc-c2-c2-hc 6 2 3 17 + 12 hc-c2-c2-hc 6 2 3 18 + 13 c2-c2-c2-hc 16 3 2 7 + 14 hc-c2-c2-hc 7 2 3 17 + 15 hc-c2-c2-hc 7 2 3 18 + 16 c2-c2-c_1-o_1 8 9 10 11 + 17 c2-c2-c_1-o 8 9 10 12 + 18 hc-c2-c_1-o_1 13 9 10 11 + 19 hc-c2-c_1-o 13 9 10 12 + 20 hc-c2-c_1-o_1 14 9 10 11 + 21 hc-c2-c_1-o 14 9 10 12 + 22 c2-c_1-o-ho 9 10 12 15 + 23 o_1-c_1-o-ho 11 10 12 15 + +Impropers + + 1 c2-na-hn-hn 2 1 4 5 + 2 c2-c_1-o_1-o 9 10 11 12 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_reacted.data_template b/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_reacted.data_template deleted file mode 100644 index ffd3ef733c..0000000000 --- a/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_reacted.data_template +++ /dev/null @@ -1,131 +0,0 @@ -this is a molecule template for: water condensation, post-reacting - -15 atoms -13 bonds -19 angles -16 dihedrals -10 impropers - -Types - -1 9 -2 1 -3 1 -4 10 -5 4 -6 3 -7 3 -8 1 -9 1 -10 5 -11 8 -12 11 -13 3 -14 3 -15 10 - -Charges - -1 -0.300000 -2 0.000000 -3 0.000000 -4 0.410000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.300000 -11 0.000000 -12 -0.820000 -13 0.000000 -14 0.000000 -15 0.410000 - -Coords - -1 -4.856280 -1.050468 1.432625 -2 -5.047195 -0.935267 -0.358173 -3 -6.526281 -0.755366 -0.743523 -4 -5.282604 0.020447 1.552710 -5 -3.860697 -1.095850 1.428305 -6 -4.662382 -1.920900 -0.781524 -7 -4.433977 -0.072765 -0.784071 -8 -5.506279 0.202610 4.825816 -9 -4.449177 -0.844592 4.423366 -10 -4.103916 -0.749629 2.925195 -11 -3.376249 -1.886171 2.245643 -12 -4.493235 0.477214 2.137199 -13 -4.849053 -1.888877 4.663994 -14 -3.491823 -0.662913 5.018510 -15 -5.020777 1.189745 2.805427 - -Bonds - -1 9 1 2 -2 10 1 5 -3 11 1 10 -4 1 2 3 -5 2 2 6 -6 2 2 7 -7 13 4 12 -8 1 8 9 -9 6 9 10 -10 2 9 13 -11 2 9 14 -12 7 10 11 -13 13 15 12 - -Angles - -1 14 2 1 5 -2 15 2 1 10 -3 17 5 1 10 -4 18 1 2 3 -5 19 1 2 6 -6 19 1 2 7 -7 1 3 2 6 -8 1 3 2 7 -9 3 6 2 7 -10 12 8 9 10 -11 1 8 9 13 -12 1 8 9 14 -13 13 13 9 10 -14 13 14 9 10 -15 3 13 9 14 -16 10 9 10 11 -17 20 1 10 9 -18 22 1 10 11 -19 25 15 12 4 - -Dihedrals - -1 16 5 1 2 3 -2 17 5 1 2 6 -3 17 5 1 2 7 -4 18 10 1 2 3 -5 19 10 1 2 6 -6 19 10 1 2 7 -7 20 2 1 10 9 -8 21 2 1 10 11 -9 23 5 1 10 9 -10 24 5 1 10 11 -11 14 8 9 10 11 -12 28 8 9 10 1 -13 15 13 9 10 11 -14 29 13 9 10 1 -15 15 14 9 10 11 -16 29 14 9 10 1 - -Impropers - -1 10 2 1 5 10 -2 11 1 10 9 11 -3 1 1 2 3 6 -4 1 1 2 3 7 -5 1 1 2 6 7 -6 1 3 2 6 7 -7 1 8 9 13 10 -8 1 8 9 14 10 -9 1 8 9 13 14 -10 1 13 9 14 10 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_reacted.molecule_template b/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_reacted.molecule_template new file mode 100644 index 0000000000..2e91261468 --- /dev/null +++ b/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_reacted.molecule_template @@ -0,0 +1,141 @@ +this is a molecule template for: water condensation, post-reacting + + 15 atoms + 13 bonds + 19 angles + 16 dihedrals + 2 impropers + +Coords + + 1 -4.856280281 -1.050467974 1.432625159 + 2 -5.047194816 -0.935266843 -0.358172771 + 3 -6.526281447 -0.755365854 -0.743523227 + 4 -5.282604074 0.020446894 1.552710361 + 5 -3.860696509 -1.095850190 1.428304925 + 6 -4.662381862 -1.920899862 -0.781524026 + 7 -4.433976540 -0.072765142 -0.784070641 + 8 -5.506279186 0.202610302 4.825815562 + 9 -4.449176624 -0.844592213 4.423366146 + 10 -4.103915981 -0.749628655 2.925195217 + 11 -3.376248536 -1.886171498 2.245643443 + 12 -4.493235430 0.477213651 2.137199034 + 13 -4.849052953 -1.888876753 4.663993750 + 14 -3.491822950 -0.662913310 5.018510248 + 15 -5.020776528 1.189745133 2.805427194 + +Types + + 1 n + 2 c2 + 3 c2 + 4 hw + 5 hn + 6 hc + 7 hc + 8 c2 + 9 c2 + 10 c_1 + 11 o_1 + 12 o* + 13 hc + 14 hc + 15 hw + +Charges + + 1 -0.300000 + 2 0.000000 + 3 0.000000 + 4 0.410000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.300000 + 11 0.000000 + 12 -0.820000 + 13 0.000000 + 14 0.000000 + 15 0.410000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + +Bonds + + 1 n-c2 1 2 + 2 n-hn 1 5 + 3 n-c_1 1 10 + 4 c2-c2 2 3 + 5 c2-hc 2 6 + 6 c2-hc 2 7 + 7 hw-o* 4 12 + 8 c2-c2 8 9 + 9 c2-c_1 9 10 + 10 c2-hc 9 13 + 11 c2-hc 9 14 + 12 c_1-o_1 10 11 + 13 hw-o* 15 12 + +Angles + + 1 c2-n-hn 2 1 5 + 2 c2-n-c_1 2 1 10 + 3 hn-n-c_1 5 1 10 + 4 n-c2-c2 1 2 3 + 5 n-c2-hc 1 2 6 + 6 n-c2-hc 1 2 7 + 7 c2-c2-hc 3 2 6 + 8 c2-c2-hc 3 2 7 + 9 hc-c2-hc 6 2 7 + 10 c2-c2-c_1 8 9 10 + 11 c2-c2-hc 8 9 13 + 12 c2-c2-hc 8 9 14 + 13 hc-c2-c_1 13 9 10 + 14 hc-c2-c_1 14 9 10 + 15 hc-c2-hc 13 9 14 + 16 c2-c_1-o_1 9 10 11 + 17 n-c_1-c2 1 10 9 + 18 n-c_1-o_1 1 10 11 + 19 hw-o*-hw 15 12 4 + +Dihedrals + + 1 hn-n-c2-c2 5 1 2 3 + 2 hn-n-c2-hc 5 1 2 6 + 3 hn-n-c2-hc 5 1 2 7 + 4 c_1-n-c2-c2 10 1 2 3 + 5 c_1-n-c2-hc 10 1 2 6 + 6 c_1-n-c2-hc 10 1 2 7 + 7 c2-n-c_1-c2 2 1 10 9 + 8 c2-n-c_1-o_1 2 1 10 11 + 9 hn-n-c_1-c2 5 1 10 9 + 10 hn-n-c_1-o_1 5 1 10 11 + 11 c2-c2-c_1-o_1 8 9 10 11 + 12 c2-c2-c_1-n 8 9 10 1 + 13 hc-c2-c_1-o_1 13 9 10 11 + 14 hc-c2-c_1-n 13 9 10 1 + 15 hc-c2-c_1-o_1 14 9 10 11 + 16 hc-c2-c_1-n 14 9 10 1 + +Impropers + + 1 c2-n-hn-c_1 2 1 5 10 + 2 n-c_1-c2-o_1 1 10 9 11 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_unreacted.data_template b/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_unreacted.data_template deleted file mode 100644 index 7abe15ada8..0000000000 --- a/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_unreacted.data_template +++ /dev/null @@ -1,158 +0,0 @@ -this is a molecule template for: water condensation, pre-reacting - -15 atoms -14 bonds -25 angles -30 dihedrals -16 impropers - -Types - -1 9 -2 1 -3 1 -4 4 -5 4 -6 3 -7 3 -8 1 -9 1 -10 5 -11 8 -12 6 -13 3 -14 3 -15 7 - -Charges - -1 -0.300000 -2 0.000000 -3 0.000000 -4 0.000000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.300000 -11 0.000000 -12 0.000000 -13 0.000000 -14 0.000000 -15 0.000000 - -Coords - -1 -4.922858 -0.946982 1.146055 -2 -5.047195 -0.935267 -0.358173 -3 -6.526281 -0.755366 -0.743523 -4 -5.282604 0.020447 1.552710 -5 -3.860697 -1.095850 1.428305 -6 -4.662382 -1.920900 -0.781524 -7 -4.433977 -0.072765 -0.784071 -8 -5.506279 0.202610 4.825816 -9 -4.449177 -0.844592 4.423366 -10 -4.103916 -0.749629 2.925195 -11 -3.376249 -1.886171 2.245643 -12 -4.493235 0.477214 2.137199 -13 -4.849053 -1.888877 4.663994 -14 -3.491823 -0.662913 5.018510 -15 -5.020777 1.189745 2.805427 - -Bonds - -1 9 1 2 -2 10 1 4 -3 10 1 5 -4 11 1 10 -5 1 2 3 -6 2 2 6 -7 2 2 7 -8 1 8 9 -9 6 9 10 -10 2 9 13 -11 2 9 14 -12 7 10 11 -13 5 10 12 -14 8 12 15 - -Angles - -1 14 2 1 4 -2 14 2 1 5 -3 15 2 1 10 -4 16 4 1 5 -5 17 4 1 10 -6 17 5 1 10 -7 18 1 2 3 -8 19 1 2 6 -9 19 1 2 7 -10 1 3 2 6 -11 1 3 2 7 -12 3 6 2 7 -13 12 8 9 10 -14 1 8 9 13 -15 1 8 9 14 -16 13 13 9 10 -17 13 14 9 10 -18 3 13 9 14 -19 10 9 10 11 -20 8 9 10 12 -21 20 1 10 9 -22 21 11 10 12 -23 22 1 10 11 -24 23 1 10 12 -25 11 10 12 15 - -Dihedrals - -1 16 4 1 2 3 -2 17 4 1 2 6 -3 17 4 1 2 7 -4 16 5 1 2 3 -5 17 5 1 2 6 -6 17 5 1 2 7 -7 18 10 1 2 3 -8 19 10 1 2 6 -9 19 10 1 2 7 -10 20 2 1 10 9 -11 21 2 1 10 11 -12 22 2 1 10 12 -13 23 4 1 10 9 -14 24 4 1 10 11 -15 25 4 1 10 12 -16 23 5 1 10 9 -17 24 5 1 10 11 -18 25 5 1 10 12 -19 14 8 9 10 11 -20 12 8 9 10 12 -21 28 8 9 10 1 -22 15 13 9 10 11 -23 13 13 9 10 12 -24 29 13 9 10 1 -25 15 14 9 10 11 -26 13 14 9 10 12 -27 29 14 9 10 1 -28 10 9 10 12 15 -29 11 11 10 12 15 -30 30 1 10 12 15 - -Impropers - -1 1 2 1 4 5 -2 1 2 1 4 10 -3 1 2 1 5 10 -4 1 4 1 5 10 -5 1 1 2 3 6 -6 1 1 2 3 7 -7 1 1 2 6 7 -8 1 3 2 6 7 -9 1 8 9 13 10 -10 1 8 9 14 10 -11 1 8 9 13 14 -12 1 13 9 14 10 -13 1 9 10 11 12 -14 1 1 10 9 11 -15 1 1 10 9 12 -16 1 1 10 11 12 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_unreacted.molecule_template b/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_unreacted.molecule_template new file mode 100644 index 0000000000..86a772634d --- /dev/null +++ b/examples/PACKAGES/reaction/nylon,6-6_melt/rxn1_stp2_unreacted.molecule_template @@ -0,0 +1,157 @@ +this is a molecule template for: water condensation, pre-reacting + + 15 atoms + 14 bonds + 25 angles + 30 dihedrals + 0 impropers + +Coords + + 1 -4.922858499 -0.946981747 1.146055346 + 2 -5.047194816 -0.935266843 -0.358172771 + 3 -6.526281447 -0.755365854 -0.743523227 + 4 -5.282604074 0.020446894 1.552710361 + 5 -3.860696509 -1.095850190 1.428304925 + 6 -4.662381862 -1.920899862 -0.781524026 + 7 -4.433976540 -0.072765142 -0.784070641 + 8 -5.506279186 0.202610302 4.825815562 + 9 -4.449176624 -0.844592213 4.423366146 + 10 -4.103915981 -0.749628655 2.925195217 + 11 -3.376248536 -1.886171498 2.245643443 + 12 -4.493235430 0.477213651 2.137199034 + 13 -4.849052953 -1.888876753 4.663993750 + 14 -3.491822950 -0.662913310 5.018510248 + 15 -5.020776528 1.189745133 2.805427194 + +Types + + 1 n + 2 c2 + 3 c2 + 4 hn + 5 hn + 6 hc + 7 hc + 8 c2 + 9 c2 + 10 c_1 + 11 o_1 + 12 o + 13 hc + 14 hc + 15 ho + +Charges + + 1 -0.300000 + 2 0.000000 + 3 0.000000 + 4 0.000000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.300000 + 11 0.000000 + 12 0.000000 + 13 0.000000 + 14 0.000000 + 15 0.000000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + +Bonds + + 1 n-c2 1 2 + 2 n-hn 1 4 + 3 n-hn 1 5 + 4 n-c_1 1 10 + 5 c2-c2 2 3 + 6 c2-hc 2 6 + 7 c2-hc 2 7 + 8 c2-c2 8 9 + 9 c2-c_1 9 10 + 10 c2-hc 9 13 + 11 c2-hc 9 14 + 12 c_1-o_1 10 11 + 13 c_1-o 10 12 + 14 o-ho 12 15 + +Angles + + 1 c2-n-hn 2 1 4 + 2 c2-n-hn 2 1 5 + 3 c2-n-c_1 2 1 10 + 4 hn-n-hn 4 1 5 + 5 hn-n-c_1 4 1 10 + 6 hn-n-c_1 5 1 10 + 7 n-c2-c2 1 2 3 + 8 n-c2-hc 1 2 6 + 9 n-c2-hc 1 2 7 + 10 c2-c2-hc 3 2 6 + 11 c2-c2-hc 3 2 7 + 12 hc-c2-hc 6 2 7 + 13 c2-c2-c_1 8 9 10 + 14 c2-c2-hc 8 9 13 + 15 c2-c2-hc 8 9 14 + 16 hc-c2-c_1 13 9 10 + 17 hc-c2-c_1 14 9 10 + 18 hc-c2-hc 13 9 14 + 19 c2-c_1-o_1 9 10 11 + 20 c2-c_1-o 9 10 12 + 21 n-c_1-c2 1 10 9 + 22 o_1-c_1-o 11 10 12 + 23 n-c_1-o_1 1 10 11 + 24 n-c_1-o 1 10 12 + 25 c_1-o-ho 10 12 15 + +Dihedrals + + 1 hn-n-c2-c2 4 1 2 3 + 2 hn-n-c2-hc 4 1 2 6 + 3 hn-n-c2-hc 4 1 2 7 + 4 hn-n-c2-c2 5 1 2 3 + 5 hn-n-c2-hc 5 1 2 6 + 6 hn-n-c2-hc 5 1 2 7 + 7 c_1-n-c2-c2 10 1 2 3 + 8 c_1-n-c2-hc 10 1 2 6 + 9 c_1-n-c2-hc 10 1 2 7 + 10 c2-n-c_1-c2 2 1 10 9 + 11 c2-n-c_1-o_1 2 1 10 11 + 12 c2-n-c_1-o 2 1 10 12 + 13 hn-n-c_1-c2 4 1 10 9 + 14 hn-n-c_1-o_1 4 1 10 11 + 15 hn-n-c_1-o 4 1 10 12 + 16 hn-n-c_1-c2 5 1 10 9 + 17 hn-n-c_1-o_1 5 1 10 11 + 18 hn-n-c_1-o 5 1 10 12 + 19 c2-c2-c_1-o_1 8 9 10 11 + 20 c2-c2-c_1-o 8 9 10 12 + 21 c2-c2-c_1-n 8 9 10 1 + 22 hc-c2-c_1-o_1 13 9 10 11 + 23 hc-c2-c_1-o 13 9 10 12 + 24 hc-c2-c_1-n 13 9 10 1 + 25 hc-c2-c_1-o_1 14 9 10 11 + 26 hc-c2-c_1-o 14 9 10 12 + 27 hc-c2-c_1-n 14 9 10 1 + 28 c2-c_1-o-ho 9 10 12 15 + 29 o_1-c_1-o-ho 11 10 12 15 + 30 n-c_1-o-ho 1 10 12 15 From b5eb64cc0c2ab83497cc0964a9b626b779245940 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Thu, 15 Dec 2022 13:08:25 -0500 Subject: [PATCH 06/47] type labels for tiny_nylon example --- .../tiny_nylon/in.tiny_nylon.stabilized | 15 +- ...tiny_nylon.stabilized_variable_probability | 15 +- .../tiny_nylon/in.tiny_nylon.unstabilized | 16 +- ...ylon.stabilized_variable_probability.g++.1 | 201 --------- ...ylon.stabilized_variable_probability.g++.4 | 201 --------- .../log.4Nov2020.tiny_nylon.stabilized.g++.1 | 412 ++++++++++++++++++ .../log.4Nov2020.tiny_nylon.stabilized.g++.4 | 412 ++++++++++++++++++ ...ylon.stabilized_variable_probability.g++.1 | 237 ++++++++++ ...ylon.stabilized_variable_probability.g++.4 | 237 ++++++++++ ...log.4Nov2020.tiny_nylon.unstabilized.g++.1 | 228 ++++++++++ ...log.4Nov2020.tiny_nylon.unstabilized.g++.4 | 228 ++++++++++ .../log.5Jun19.tiny_nylon.stabilized.g++.1 | 148 ------- .../log.5Jun19.tiny_nylon.stabilized.g++.4 | 148 ------- .../log.5Jun19.tiny_nylon.unstabilized.g++.1 | 147 ------- .../log.5Jun19.tiny_nylon.unstabilized.g++.4 | 147 ------- .../rxn1_stp1_reacted.data_template | 189 -------- .../rxn1_stp1_reacted.molecule_template | 187 ++++++++ .../rxn1_stp1_unreacted.data_template | 160 ------- .../rxn1_stp1_unreacted.molecule_template | 169 +++++++ .../rxn1_stp2_reacted.data_template | 131 ------ .../rxn1_stp2_reacted.molecule_template | 141 ++++++ .../rxn1_stp2_unreacted.data_template | 158 ------- .../rxn1_stp2_unreacted.molecule_template | 157 +++++++ .../reaction/tiny_nylon/tiny_nylon.data | 126 +++++- 24 files changed, 2559 insertions(+), 1651 deletions(-) delete mode 100644 examples/PACKAGES/reaction/tiny_nylon/log.22Apr20.tiny_nylon.stabilized_variable_probability.g++.1 delete mode 100644 examples/PACKAGES/reaction/tiny_nylon/log.22Apr20.tiny_nylon.stabilized_variable_probability.g++.4 create mode 100644 examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized.g++.1 create mode 100644 examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized.g++.4 create mode 100644 examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized_variable_probability.g++.1 create mode 100644 examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized_variable_probability.g++.4 create mode 100644 examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.unstabilized.g++.1 create mode 100644 examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.unstabilized.g++.4 delete mode 100644 examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.stabilized.g++.1 delete mode 100644 examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.stabilized.g++.4 delete mode 100644 examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.unstabilized.g++.1 delete mode 100644 examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.unstabilized.g++.4 delete mode 100644 examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_reacted.data_template create mode 100644 examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_reacted.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_unreacted.data_template create mode 100644 examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_unreacted.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_reacted.data_template create mode 100644 examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_reacted.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_unreacted.data_template create mode 100644 examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_unreacted.molecule_template diff --git a/examples/PACKAGES/reaction/tiny_nylon/in.tiny_nylon.stabilized b/examples/PACKAGES/reaction/tiny_nylon/in.tiny_nylon.stabilized index b152dec00a..81a12b4ccb 100644 --- a/examples/PACKAGES/reaction/tiny_nylon/in.tiny_nylon.stabilized +++ b/examples/PACKAGES/reaction/tiny_nylon/in.tiny_nylon.stabilized @@ -19,14 +19,19 @@ dihedral_style class2 improper_style class2 -read_data tiny_nylon.data +read_data tiny_nylon.data & + extra/bond/per/atom 5 & + extra/angle/per/atom 15 & + extra/dihedral/per/atom 15 & + extra/improper/per/atom 25 & + extra/special/per/atom 25 velocity all create 300.0 4928459 dist gaussian -molecule mol1 rxn1_stp1_unreacted.data_template -molecule mol2 rxn1_stp1_reacted.data_template -molecule mol3 rxn1_stp2_unreacted.data_template -molecule mol4 rxn1_stp2_reacted.data_template +molecule mol1 rxn1_stp1_unreacted.molecule_template +molecule mol2 rxn1_stp1_reacted.molecule_template +molecule mol3 rxn1_stp2_unreacted.molecule_template +molecule mol4 rxn1_stp2_reacted.molecule_template thermo 50 diff --git a/examples/PACKAGES/reaction/tiny_nylon/in.tiny_nylon.stabilized_variable_probability b/examples/PACKAGES/reaction/tiny_nylon/in.tiny_nylon.stabilized_variable_probability index e81fedc34a..515d4cb2f8 100644 --- a/examples/PACKAGES/reaction/tiny_nylon/in.tiny_nylon.stabilized_variable_probability +++ b/examples/PACKAGES/reaction/tiny_nylon/in.tiny_nylon.stabilized_variable_probability @@ -19,7 +19,12 @@ dihedral_style class2 improper_style class2 -read_data tiny_nylon.data +read_data tiny_nylon.data & + extra/bond/per/atom 5 & + extra/angle/per/atom 15 & + extra/dihedral/per/atom 15 & + extra/improper/per/atom 25 & + extra/special/per/atom 25 variable runsteps equal 1000 variable prob1 equal step/v_runsteps*2+0.1 @@ -27,10 +32,10 @@ variable prob2 equal (step/v_runsteps)>0.5 velocity all create 300.0 4928459 dist gaussian -molecule mol1 rxn1_stp1_unreacted.data_template -molecule mol2 rxn1_stp1_reacted.data_template -molecule mol3 rxn1_stp2_unreacted.data_template -molecule mol4 rxn1_stp2_reacted.data_template +molecule mol1 rxn1_stp1_unreacted.molecule_template +molecule mol2 rxn1_stp1_reacted.molecule_template +molecule mol3 rxn1_stp2_unreacted.molecule_template +molecule mol4 rxn1_stp2_reacted.molecule_template thermo 50 diff --git a/examples/PACKAGES/reaction/tiny_nylon/in.tiny_nylon.unstabilized b/examples/PACKAGES/reaction/tiny_nylon/in.tiny_nylon.unstabilized index 1e5a493821..4891e9ebff 100644 --- a/examples/PACKAGES/reaction/tiny_nylon/in.tiny_nylon.unstabilized +++ b/examples/PACKAGES/reaction/tiny_nylon/in.tiny_nylon.unstabilized @@ -19,14 +19,20 @@ dihedral_style class2 improper_style class2 -read_data tiny_nylon.data +read_data tiny_nylon.data & + extra/bond/per/atom 5 & + extra/angle/per/atom 15 & + extra/dihedral/per/atom 15 & + extra/improper/per/atom 25 & + extra/special/per/atom 25 + velocity all create 300.0 4928459 dist gaussian -molecule mol1 rxn1_stp1_unreacted.data_template -molecule mol2 rxn1_stp1_reacted.data_template -molecule mol3 rxn1_stp2_unreacted.data_template -molecule mol4 rxn1_stp2_reacted.data_template +molecule mol1 rxn1_stp1_unreacted.molecule_template +molecule mol2 rxn1_stp1_reacted.molecule_template +molecule mol3 rxn1_stp2_unreacted.molecule_template +molecule mol4 rxn1_stp2_reacted.molecule_template thermo 50 diff --git a/examples/PACKAGES/reaction/tiny_nylon/log.22Apr20.tiny_nylon.stabilized_variable_probability.g++.1 b/examples/PACKAGES/reaction/tiny_nylon/log.22Apr20.tiny_nylon.stabilized_variable_probability.g++.1 deleted file mode 100644 index 57455b04f4..0000000000 --- a/examples/PACKAGES/reaction/tiny_nylon/log.22Apr20.tiny_nylon.stabilized_variable_probability.g++.1 +++ /dev/null @@ -1,201 +0,0 @@ -LAMMPS (15 Apr 2020) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:94) - using 1 OpenMP thread(s) per MPI task -# two monomer nylon example -# reaction produces a condensed water molecule - -units real - -boundary p p p - -atom_style full - -kspace_style pppm 1.0e-4 - -pair_style lj/class2/coul/long 8.5 - -angle_style class2 - -bond_style class2 - -dihedral_style class2 - -improper_style class2 - -read_data tiny_nylon.data - orthogonal box = (-25 -25 -25) to (25 25 25) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 44 atoms - reading velocities ... - 44 velocities - scanning bonds ... - 9 = max bonds/atom - scanning angles ... - 21 = max angles/atom - scanning dihedrals ... - 29 = max dihedrals/atom - scanning impropers ... - 29 = max impropers/atom - reading bonds ... - 42 bonds - reading angles ... - 74 angles - reading dihedrals ... - 100 dihedrals - reading impropers ... - 44 impropers - 4 = max # of 1-2 neighbors - 6 = max # of 1-3 neighbors - 12 = max # of 1-4 neighbors - 41 = max # of special neighbors - special bonds CPU = 0.000385045 secs - read_data CPU = 0.013443 secs - -variable runsteps equal 1000 -variable prob1 equal step/v_runsteps*2 -variable prob2 equal (step/v_runsteps)>0.5 - -velocity all create 300.0 4928459 dist gaussian - -molecule mol1 rxn1_stp1_unreacted.data_template -Read molecule template mol1: - 1 molecules - 18 atoms with max type 8 - 16 bonds with max type 14 - 25 angles with max type 28 - 23 dihedrals with max type 36 - 14 impropers with max type 11 -molecule mol2 rxn1_stp1_reacted.data_template -Read molecule template mol2: - 1 molecules - 18 atoms with max type 9 - 17 bonds with max type 13 - 31 angles with max type 27 - 39 dihedrals with max type 33 - 20 impropers with max type 1 -molecule mol3 rxn1_stp2_unreacted.data_template -Read molecule template mol3: - 1 molecules - 15 atoms with max type 9 - 14 bonds with max type 13 - 25 angles with max type 27 - 30 dihedrals with max type 33 - 16 impropers with max type 1 -molecule mol4 rxn1_stp2_reacted.data_template -Read molecule template mol4: - 1 molecules - 15 atoms with max type 11 - 13 bonds with max type 15 - 19 angles with max type 29 - 16 dihedrals with max type 32 - 10 impropers with max type 13 - -thermo 50 - -# dump 1 all xyz 1 test_vis.xyz - -fix myrxns all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0.0 5.0 mol1 mol2 rxn1_stp1_map prob v_prob1 1234 react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map prob v_prob2 1234 -WARNING: Bond/react: Atom affected by reaction rxn1 too close to template edge (src/REACTION/fix_bond_react.cpp:2051) -WARNING: Bond/react: Atom affected by reaction rxn2 too close to template edge (src/REACTION/fix_bond_react.cpp:2051) -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp_REACT defined - -fix 1 statted_grp_REACT nvt temp 300 300 100 - -# optionally, you can customize behavior of reacting atoms, -# by using the internally-created 'bond_react_MASTER_group', like so: -fix 4 bond_react_MASTER_group temp/rescale 1 300 300 10 1 - -thermo_style custom step temp press density v_prob1 v_prob2 f_myrxns[1] f_myrxns[2] - -# restart 100 restart1 restart2 - -run ${runsteps} -run 1000 -PPPM initialization ... - using 12-bit tables for long-range coulomb (src/kspace.cpp:332) - G vector (1/distance) = 0.0534597 - grid = 2 2 2 - stencil order = 5 - estimated absolute RMS force accuracy = 0.0402256 - estimated relative force accuracy = 0.000121138 - using double precision FFTW3 - 3d grid and FFT values/proc = 343 8 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10.5 - ghost atom cutoff = 10.5 - binsize = 5.25, bins = 10 10 10 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -WARNING: Inconsistent image flags (src/domain.cpp:812) -Per MPI rank memory allocation (min/avg/max) = 33.78 | 33.78 | 33.78 Mbytes -Step Temp Press Density v_prob1 v_prob2 f_myrxns[1] f_myrxns[2] - 0 300 346.78165 0.0034851739 0 0 0 0 - 50 262.63913 -492.10749 0.0034851739 0.1 0 1 0 - 100 766.52962 -29.714349 0.0034851739 0.2 0 1 0 - 150 503.86837 50.220304 0.0034851739 0.3 0 1 0 - 200 456.51295 12.312892 0.0034851739 0.4 0 1 0 - 250 391.54928 9.2335844 0.0034851739 0.5 0 1 0 - 300 336.6988 -47.193937 0.0034851739 0.6 0 1 0 - 350 254.06985 -9.2867898 0.0034851739 0.7 0 1 0 - 400 259.41098 -25.657321 0.0034851739 0.8 0 1 0 - 450 258.10364 22.5086 0.0034851739 0.9 0 1 0 - 500 272.13412 -6.5391448 0.0034851739 1 0 1 0 - 550 202.75504 54.658731 0.0034851739 1.1 1 1 1 - 600 344.79887 23.798478 0.0034851739 1.2 1 1 1 - 650 328.44488 -29.908484 0.0034851739 1.3 1 1 1 - 700 280.13593 -8.3223255 0.0034851739 1.4 1 1 1 - 750 300.67624 1.0632669 0.0034851739 1.5 1 1 1 - 800 376.64234 12.488392 0.0034851739 1.6 1 1 1 - 850 321.07642 19.814074 0.0034851739 1.7 1 1 1 - 900 332.23751 30.814079 0.0034851739 1.8 1 1 1 - 950 311.14029 5.7853136 0.0034851739 1.9 1 1 1 - 1000 253.14634 -37.560642 0.0034851739 2 1 1 1 -Loop time of 0.379454 on 1 procs for 1000 steps with 44 atoms - -Performance: 227.696 ns/day, 0.105 hours/ns, 2635.368 timesteps/s -99.6% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.069723 | 0.069723 | 0.069723 | 0.0 | 18.37 -Bond | 0.14802 | 0.14802 | 0.14802 | 0.0 | 39.01 -Kspace | 0.044252 | 0.044252 | 0.044252 | 0.0 | 11.66 -Neigh | 0.072359 | 0.072359 | 0.072359 | 0.0 | 19.07 -Comm | 0.0044748 | 0.0044748 | 0.0044748 | 0.0 | 1.18 -Output | 0.0022775 | 0.0022775 | 0.0022775 | 0.0 | 0.60 -Modify | 0.036509 | 0.036509 | 0.036509 | 0.0 | 9.62 -Other | | 0.00184 | | | 0.48 - -Nlocal: 44 ave 44 max 44 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 3 ave 3 max 3 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 722 ave 722 max 722 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 722 -Ave neighs/atom = 16.4091 -Ave special neighs/atom = 9.77273 -Neighbor list builds = 1000 -Dangerous builds = 0 - -# write_restart restart_longrun -# write_data restart_longrun.data - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:00 diff --git a/examples/PACKAGES/reaction/tiny_nylon/log.22Apr20.tiny_nylon.stabilized_variable_probability.g++.4 b/examples/PACKAGES/reaction/tiny_nylon/log.22Apr20.tiny_nylon.stabilized_variable_probability.g++.4 deleted file mode 100644 index b6dcdafc54..0000000000 --- a/examples/PACKAGES/reaction/tiny_nylon/log.22Apr20.tiny_nylon.stabilized_variable_probability.g++.4 +++ /dev/null @@ -1,201 +0,0 @@ -LAMMPS (15 Apr 2020) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:94) - using 1 OpenMP thread(s) per MPI task -# two monomer nylon example -# reaction produces a condensed water molecule - -units real - -boundary p p p - -atom_style full - -kspace_style pppm 1.0e-4 - -pair_style lj/class2/coul/long 8.5 - -angle_style class2 - -bond_style class2 - -dihedral_style class2 - -improper_style class2 - -read_data tiny_nylon.data - orthogonal box = (-25 -25 -25) to (25 25 25) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 44 atoms - reading velocities ... - 44 velocities - scanning bonds ... - 9 = max bonds/atom - scanning angles ... - 21 = max angles/atom - scanning dihedrals ... - 29 = max dihedrals/atom - scanning impropers ... - 29 = max impropers/atom - reading bonds ... - 42 bonds - reading angles ... - 74 angles - reading dihedrals ... - 100 dihedrals - reading impropers ... - 44 impropers - 4 = max # of 1-2 neighbors - 6 = max # of 1-3 neighbors - 12 = max # of 1-4 neighbors - 41 = max # of special neighbors - special bonds CPU = 0.000431282 secs - read_data CPU = 0.0129571 secs - -variable runsteps equal 1000 -variable prob1 equal step/v_runsteps*2 -variable prob2 equal (step/v_runsteps)>0.5 - -velocity all create 300.0 4928459 dist gaussian - -molecule mol1 rxn1_stp1_unreacted.data_template -Read molecule template mol1: - 1 molecules - 18 atoms with max type 8 - 16 bonds with max type 14 - 25 angles with max type 28 - 23 dihedrals with max type 36 - 14 impropers with max type 11 -molecule mol2 rxn1_stp1_reacted.data_template -Read molecule template mol2: - 1 molecules - 18 atoms with max type 9 - 17 bonds with max type 13 - 31 angles with max type 27 - 39 dihedrals with max type 33 - 20 impropers with max type 1 -molecule mol3 rxn1_stp2_unreacted.data_template -Read molecule template mol3: - 1 molecules - 15 atoms with max type 9 - 14 bonds with max type 13 - 25 angles with max type 27 - 30 dihedrals with max type 33 - 16 impropers with max type 1 -molecule mol4 rxn1_stp2_reacted.data_template -Read molecule template mol4: - 1 molecules - 15 atoms with max type 11 - 13 bonds with max type 15 - 19 angles with max type 29 - 16 dihedrals with max type 32 - 10 impropers with max type 13 - -thermo 50 - -# dump 1 all xyz 1 test_vis.xyz - -fix myrxns all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0.0 5.0 mol1 mol2 rxn1_stp1_map prob v_prob1 1234 react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map prob v_prob2 1234 -WARNING: Bond/react: Atom affected by reaction rxn1 too close to template edge (src/REACTION/fix_bond_react.cpp:2051) -WARNING: Bond/react: Atom affected by reaction rxn2 too close to template edge (src/REACTION/fix_bond_react.cpp:2051) -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp_REACT defined - -fix 1 statted_grp_REACT nvt temp 300 300 100 - -# optionally, you can customize behavior of reacting atoms, -# by using the internally-created 'bond_react_MASTER_group', like so: -fix 4 bond_react_MASTER_group temp/rescale 1 300 300 10 1 - -thermo_style custom step temp press density v_prob1 v_prob2 f_myrxns[1] f_myrxns[2] - -# restart 100 restart1 restart2 - -run ${runsteps} -run 1000 -PPPM initialization ... - using 12-bit tables for long-range coulomb (src/kspace.cpp:332) - G vector (1/distance) = 0.0534597 - grid = 2 2 2 - stencil order = 5 - estimated absolute RMS force accuracy = 0.0402256 - estimated relative force accuracy = 0.000121138 - using double precision FFTW3 - 3d grid and FFT values/proc = 252 2 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10.5 - ghost atom cutoff = 10.5 - binsize = 5.25, bins = 10 10 10 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -WARNING: Inconsistent image flags (src/domain.cpp:812) -Per MPI rank memory allocation (min/avg/max) = 33.66 | 33.88 | 34.43 Mbytes -Step Temp Press Density v_prob1 v_prob2 f_myrxns[1] f_myrxns[2] - 0 300 346.78165 0.0034851739 0 0 0 0 - 50 266.5092 -90.813802 0.0034851739 0.1 0 1 0 - 100 559.41271 -53.23688 0.0034851739 0.2 0 1 0 - 150 489.90516 31.555817 0.0034851739 0.3 0 1 0 - 200 326.18391 7.7889992 0.0034851739 0.4 0 1 0 - 250 339.78203 2.3919541 0.0034851739 0.5 0 1 0 - 300 370.90263 -32.01673 0.0034851739 0.6 0 1 0 - 350 294.07547 -5.4019813 0.0034851739 0.7 0 1 0 - 400 287.76477 12.254133 0.0034851739 0.8 0 1 0 - 450 293.36482 66.372956 0.0034851739 0.9 0 1 0 - 500 246.84496 26.132317 0.0034851739 1 0 1 0 - 550 253.08778 -15.350262 0.0034851739 1.1 1 1 1 - 600 358.83641 25.007371 0.0034851739 1.2 1 1 1 - 650 320.51492 -32.34823 0.0034851739 1.3 1 1 1 - 700 310.87976 -8.2306669 0.0034851739 1.4 1 1 1 - 750 307.54142 12.025818 0.0034851739 1.5 1 1 1 - 800 272.51724 -22.92823 0.0034851739 1.6 1 1 1 - 850 268.66181 10.069534 0.0034851739 1.7 1 1 1 - 900 265.5531 -10.471377 0.0034851739 1.8 1 1 1 - 950 259.43086 9.4546712 0.0034851739 1.9 1 1 1 - 1000 247.14622 20.250308 0.0034851739 2 1 1 1 -Loop time of 0.357762 on 4 procs for 1000 steps with 44 atoms - -Performance: 241.502 ns/day, 0.099 hours/ns, 2795.157 timesteps/s -99.0% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.0003917 | 0.015545 | 0.033317 | 11.9 | 4.35 -Bond | 0.0010131 | 0.030153 | 0.076975 | 18.2 | 8.43 -Kspace | 0.092857 | 0.1462 | 0.18688 | 10.7 | 40.87 -Neigh | 0.043786 | 0.044014 | 0.044189 | 0.1 | 12.30 -Comm | 0.03636 | 0.038345 | 0.040538 | 0.8 | 10.72 -Output | 0.00091578 | 0.0012541 | 0.0020923 | 1.4 | 0.35 -Modify | 0.075379 | 0.080791 | 0.086052 | 1.8 | 22.58 -Other | | 0.00146 | | | 0.41 - -Nlocal: 11 ave 32 max 0 min -Histogram: 2 0 1 0 0 0 0 0 0 1 -Nghost: 40 ave 51 max 19 min -Histogram: 1 0 0 0 0 0 0 1 0 2 -Neighs: 191 ave 529 max 0 min -Histogram: 2 0 0 0 1 0 0 0 0 1 - -Total # of neighbors = 764 -Ave neighs/atom = 17.3636 -Ave special neighs/atom = 9.77273 -Neighbor list builds = 1000 -Dangerous builds = 0 - -# write_restart restart_longrun -# write_data restart_longrun.data - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:00 diff --git a/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized.g++.1 b/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized.g++.1 new file mode 100644 index 0000000000..9a2d240ca4 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized.g++.1 @@ -0,0 +1,412 @@ +LAMMPS (4 Nov 2022) +# two monomer nylon example +# reaction produces a condensed water molecule + +units real + +boundary p p p + +atom_style full + +kspace_style pppm 1.0e-4 + +pair_style lj/class2/coul/long 8.5 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data tiny_nylon.data extra/bond/per/atom 5 extra/angle/per/atom 15 extra/dihedral/per/atom 15 extra/improper/per/atom 25 extra/special/per/atom 25 +Reading data file ... + orthogonal box = (-25 -25 -25) to (25 25 25) + 1 by 1 by 1 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 44 atoms + reading velocities ... + 44 velocities + scanning bonds ... + 9 = max bonds/atom + scanning angles ... + 21 = max angles/atom + scanning dihedrals ... + 29 = max dihedrals/atom + scanning impropers ... + 29 = max impropers/atom + reading bonds ... + 42 bonds + reading angles ... + 74 angles + reading dihedrals ... + 100 dihedrals + reading impropers ... + 44 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 12 = max # of 1-4 neighbors + 41 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.007 seconds + +velocity all create 300.0 4928459 dist gaussian + +molecule mol1 rxn1_stp1_unreacted.molecule_template +Read molecule template mol1: + 1 molecules + 0 fragments + 18 atoms with max type 8 + 16 bonds with max type 10 + 25 angles with max type 28 + 23 dihedrals with max type 36 + 2 impropers with max type 3 +molecule mol2 rxn1_stp1_reacted.molecule_template +Read molecule template mol2: + 1 molecules + 0 fragments + 18 atoms with max type 9 + 17 bonds with max type 13 + 31 angles with max type 27 + 39 dihedrals with max type 33 + 0 impropers with max type 0 +molecule mol3 rxn1_stp2_unreacted.molecule_template +Read molecule template mol3: + 1 molecules + 0 fragments + 15 atoms with max type 9 + 14 bonds with max type 13 + 25 angles with max type 27 + 30 dihedrals with max type 33 + 0 impropers with max type 0 +molecule mol4 rxn1_stp2_reacted.molecule_template +Read molecule template mol4: + 1 molecules + 0 fragments + 15 atoms with max type 11 + 13 bonds with max type 15 + 19 angles with max type 29 + 16 dihedrals with max type 32 + 2 impropers with max type 13 + +thermo 50 + +# dump 1 all xyz 1 test_vis.xyz + +fix myrxns all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0.0 2.9 mol1 mol2 rxn1_stp1_map react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map +WARNING: Fix bond/react: Atom affected by reaction rxn2 is too close to template edge (../fix_bond_react.cpp:2624) +dynamic group bond_react_MASTER_group defined +dynamic group statted_grp_REACT defined + +fix 1 statted_grp_REACT nvt temp 300 300 100 + +# optionally, you can customize behavior of reacting atoms, +# by using the internally-created 'bond_react_MASTER_group', like so: +fix 4 bond_react_MASTER_group temp/rescale 1 300 300 10 1 + +thermo_style custom step temp press density f_myrxns[1] f_myrxns[2] + +# restart 100 restart1 restart2 + +run 10000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +PPPM initialization ... + using 12-bit tables for long-range coulomb (../kspace.cpp:342) + G vector (1/distance) = 0.05345967 + grid = 2 2 2 + stencil order = 5 + estimated absolute RMS force accuracy = 0.040225597 + estimated relative force accuracy = 0.00012113819 + using double precision KISS FFT + 3d grid and FFT values/proc = 343 8 +Generated 55 of 55 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 10 10 10 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +WARNING: Inconsistent image flags (../domain.cpp:819) +Per MPI rank memory allocation (min/avg/max) = 33.78 | 33.78 | 33.78 Mbytes + Step Temp Press Density f_myrxns[1] f_myrxns[2] + 0 300 346.78165 0.0034851739 0 0 + 50 283.51963 -47.16359 0.0034851739 1 0 + 100 256.04648 21.778898 0.0034851739 1 1 + 150 450.78138 -11.7887 0.0034851739 1 1 + 200 400.15754 49.489858 0.0034851739 1 1 + 250 347.06066 68.952063 0.0034851739 1 1 + 300 291.89228 -1.5986302 0.0034851739 1 1 + 350 290.25995 17.634558 0.0034851739 1 1 + 400 234.89168 26.36452 0.0034851739 1 1 + 450 305.80709 -28.923896 0.0034851739 1 1 + 500 375.19218 -37.024375 0.0034851739 1 1 + 550 321.86944 -4.6961825 0.0034851739 1 1 + 600 307.2639 -31.393161 0.0034851739 1 1 + 650 255.95833 8.4995589 0.0034851739 1 1 + 700 294.54665 -17.06105 0.0034851739 1 1 + 750 273.08231 -10.7175 0.0034851739 1 1 + 800 249.69175 9.9777683 0.0034851739 1 1 + 850 307.71806 -6.9950048 0.0034851739 1 1 + 900 367.39855 9.9874985 0.0034851739 1 1 + 950 327.57334 -4.7029779 0.0034851739 1 1 + 1000 348.85247 15.763492 0.0034851739 1 1 + 1050 328.94435 -35.031279 0.0034851739 1 1 + 1100 283.23971 -16.937443 0.0034851739 1 1 + 1150 266.69676 42.308482 0.0034851739 1 1 + 1200 244.61493 -8.291143 0.0034851739 1 1 + 1250 206.68495 6.6280168 0.0034851739 1 1 + 1300 257.83339 -7.0826267 0.0034851739 1 1 + 1350 358.0875 -7.6024741 0.0034851739 1 1 + 1400 353.66614 18.091914 0.0034851739 1 1 + 1450 302.27969 13.828755 0.0034851739 1 1 + 1500 262.57851 9.256794 0.0034851739 1 1 + 1550 252.39493 1.2438641 0.0034851739 1 1 + 1600 247.18352 10.008173 0.0034851739 1 1 + 1650 290.30112 -2.1829035 0.0034851739 1 1 + 1700 272.78999 -57.305766 0.0034851739 1 1 + 1750 253.35258 24.729795 0.0034851739 1 1 + 1800 278.67831 -0.95016566 0.0034851739 1 1 + 1850 302.04743 16.002867 0.0034851739 1 1 + 1900 330.67188 -22.034206 0.0034851739 1 1 + 1950 342.64206 8.0076017 0.0034851739 1 1 + 2000 348.74388 -12.159887 0.0034851739 1 1 + 2050 300.48093 36.01054 0.0034851739 1 1 + 2100 275.01699 8.7612261 0.0034851739 1 1 + 2150 303.92758 10.317056 0.0034851739 1 1 + 2200 308.89457 33.245018 0.0034851739 1 1 + 2250 265.74177 35.857118 0.0034851739 1 1 + 2300 273.40088 53.001593 0.0034851739 1 1 + 2350 287.74746 -0.14590128 0.0034851739 1 1 + 2400 278.76055 -8.2080851 0.0034851739 1 1 + 2450 331.88978 39.025208 0.0034851739 1 1 + 2500 280.04045 -21.423616 0.0034851739 1 1 + 2550 388.81531 -12.350023 0.0034851739 1 1 + 2600 311.13452 -13.287102 0.0034851739 1 1 + 2650 325.07681 88.710878 0.0034851739 1 1 + 2700 319.08502 14.118057 0.0034851739 1 1 + 2750 261.72066 26.051675 0.0034851739 1 1 + 2800 281.03508 -21.200833 0.0034851739 1 1 + 2850 312.27359 4.3892078 0.0034851739 1 1 + 2900 274.81147 -12.738114 0.0034851739 1 1 + 2950 281.76969 11.198451 0.0034851739 1 1 + 3000 291.83918 48.595884 0.0034851739 1 1 + 3050 297.40189 -24.91102 0.0034851739 1 1 + 3100 341.47331 13.82699 0.0034851739 1 1 + 3150 347.51825 -10.458257 0.0034851739 1 1 + 3200 301.24666 26.550464 0.0034851739 1 1 + 3250 281.3679 -23.02985 0.0034851739 1 1 + 3300 279.8332 -53.222264 0.0034851739 1 1 + 3350 289.41496 -8.793156 0.0034851739 1 1 + 3400 288.5722 -25.441134 0.0034851739 1 1 + 3450 259.59524 77.884773 0.0034851739 1 1 + 3500 296.00389 30.3654 0.0034851739 1 1 + 3550 302.14443 -5.1101538 0.0034851739 1 1 + 3600 288.98098 -12.688781 0.0034851739 1 1 + 3650 333.83238 -33.121195 0.0034851739 1 1 + 3700 347.7556 -24.693995 0.0034851739 1 1 + 3750 354.42689 6.7030374 0.0034851739 1 1 + 3800 341.24011 -18.775449 0.0034851739 1 1 + 3850 320.50998 35.492418 0.0034851739 1 1 + 3900 326.81918 -49.073015 0.0034851739 1 1 + 3950 299.55145 -19.487946 0.0034851739 1 1 + 4000 308.81019 30.579971 0.0034851739 1 1 + 4050 251.83279 -17.500379 0.0034851739 1 1 + 4100 242.0783 21.228088 0.0034851739 1 1 + 4150 265.59921 -3.9446469 0.0034851739 1 1 + 4200 369.32464 -14.626205 0.0034851739 1 1 + 4250 346.22904 -32.749662 0.0034851739 1 1 + 4300 369.43175 11.916047 0.0034851739 1 1 + 4350 321.17007 -9.3009147 0.0034851739 1 1 + 4400 312.41821 -31.360537 0.0034851739 1 1 + 4450 281.59211 40.338618 0.0034851739 1 1 + 4500 289.10806 -4.2135222 0.0034851739 1 1 + 4550 317.55705 -4.3727576 0.0034851739 1 1 + 4600 310.64469 -14.403478 0.0034851739 1 1 + 4650 284.43433 37.416848 0.0034851739 1 1 + 4700 353.88469 7.7633789 0.0034851739 1 1 + 4750 328.48834 -60.780145 0.0034851739 1 1 + 4800 390.23986 4.2691385 0.0034851739 1 1 + 4850 364.06188 40.18245 0.0034851739 1 1 + 4900 304.64696 6.3557092 0.0034851739 1 1 + 4950 309.12139 -16.598924 0.0034851739 1 1 + 5000 311.03552 14.748037 0.0034851739 1 1 + 5050 320.97847 -26.733755 0.0034851739 1 1 + 5100 275.1237 -29.734972 0.0034851739 1 1 + 5150 287.76954 -2.5726321 0.0034851739 1 1 + 5200 267.72493 -6.6677739 0.0034851739 1 1 + 5250 290.63862 29.209807 0.0034851739 1 1 + 5300 276.51052 -19.746615 0.0034851739 1 1 + 5350 255.69196 25.130356 0.0034851739 1 1 + 5400 313.43108 -18.556701 0.0034851739 1 1 + 5450 327.91785 -16.08265 0.0034851739 1 1 + 5500 342.03301 33.271603 0.0034851739 1 1 + 5550 272.96564 -5.0247163 0.0034851739 1 1 + 5600 315.93807 -16.793394 0.0034851739 1 1 + 5650 294.66353 19.720691 0.0034851739 1 1 + 5700 283.4631 -6.5193772 0.0034851739 1 1 + 5750 261.06436 12.755679 0.0034851739 1 1 + 5800 274.15767 -9.6693117 0.0034851739 1 1 + 5850 271.1371 18.441828 0.0034851739 1 1 + 5900 283.39277 -4.6324708 0.0034851739 1 1 + 5950 326.30497 12.106133 0.0034851739 1 1 + 6000 316.91847 -32.864812 0.0034851739 1 1 + 6050 344.86369 21.226768 0.0034851739 1 1 + 6100 295.85211 -7.3603837 0.0034851739 1 1 + 6150 256.72292 4.6010174 0.0034851739 1 1 + 6200 248.33379 -20.795929 0.0034851739 1 1 + 6250 259.4054 63.590928 0.0034851739 1 1 + 6300 264.16648 2.6570242 0.0034851739 1 1 + 6350 243.22677 -18.621317 0.0034851739 1 1 + 6400 269.96092 53.832036 0.0034851739 1 1 + 6450 252.06358 -26.231052 0.0034851739 1 1 + 6500 275.4825 25.577441 0.0034851739 1 1 + 6550 298.27441 11.17373 0.0034851739 1 1 + 6600 297.29358 -21.382334 0.0034851739 1 1 + 6650 334.78542 38.892678 0.0034851739 1 1 + 6700 299.48699 -20.336163 0.0034851739 1 1 + 6750 315.01936 21.000444 0.0034851739 1 1 + 6800 244.68344 -6.3625659 0.0034851739 1 1 + 6850 251.56543 27.857872 0.0034851739 1 1 + 6900 280.81518 -12.494398 0.0034851739 1 1 + 6950 273.87437 -34.211085 0.0034851739 1 1 + 7000 274.91068 33.483158 0.0034851739 1 1 + 7050 298.56432 -61.821668 0.0034851739 1 1 + 7100 299.08395 10.365875 0.0034851739 1 1 + 7150 317.38233 29.049831 0.0034851739 1 1 + 7200 317.24932 -27.515026 0.0034851739 1 1 + 7250 305.63931 12.732123 0.0034851739 1 1 + 7300 309.44007 -53.922033 0.0034851739 1 1 + 7350 280.35029 45.495031 0.0034851739 1 1 + 7400 228.60929 1.7072084 0.0034851739 1 1 + 7450 276.206 -19.170327 0.0034851739 1 1 + 7500 257.9851 77.105642 0.0034851739 1 1 + 7550 306.46848 -29.189265 0.0034851739 1 1 + 7600 296.84522 -20.83365 0.0034851739 1 1 + 7650 296.5965 -14.890206 0.0034851739 1 1 + 7700 322.80474 44.883023 0.0034851739 1 1 + 7750 293.7355 -48.487658 0.0034851739 1 1 + 7800 358.41838 13.156339 0.0034851739 1 1 + 7850 293.81457 -19.50566 0.0034851739 1 1 + 7900 309.49618 -28.562417 0.0034851739 1 1 + 7950 285.6339 -22.488886 0.0034851739 1 1 + 8000 262.85312 57.125049 0.0034851739 1 1 + 8050 243.28673 -28.082125 0.0034851739 1 1 + 8100 279.71604 10.011975 0.0034851739 1 1 + 8150 344.77027 -56.89744 0.0034851739 1 1 + 8200 366.36063 21.02453 0.0034851739 1 1 + 8250 347.07209 2.7752885 0.0034851739 1 1 + 8300 337.74753 -10.957676 0.0034851739 1 1 + 8350 300.41188 -22.840776 0.0034851739 1 1 + 8400 282.27447 0.32063982 0.0034851739 1 1 + 8450 285.40722 -3.7167264 0.0034851739 1 1 + 8500 321.32722 -21.308158 0.0034851739 1 1 + 8550 293.65903 15.681219 0.0034851739 1 1 + 8600 293.38929 37.727045 0.0034851739 1 1 + 8650 299.55185 -15.004573 0.0034851739 1 1 + 8700 270.7608 14.615287 0.0034851739 1 1 + 8750 306.46813 67.018302 0.0034851739 1 1 + 8800 308.35025 -91.212286 0.0034851739 1 1 + 8850 349.40419 31.906004 0.0034851739 1 1 + 8900 351.32706 -24.901778 0.0034851739 1 1 + 8950 320.84369 18.380221 0.0034851739 1 1 + 9000 289.2862 9.981138 0.0034851739 1 1 + 9050 270.53883 12.028672 0.0034851739 1 1 + 9100 270.63206 -0.87842772 0.0034851739 1 1 + 9150 274.30671 -4.1228725 0.0034851739 1 1 + 9200 343.78546 20.427647 0.0034851739 1 1 + 9250 348.1019 13.339075 0.0034851739 1 1 + 9300 345.11791 -32.515359 0.0034851739 1 1 + 9350 329.8365 12.644587 0.0034851739 1 1 + 9400 286.41337 -28.79111 0.0034851739 1 1 + 9450 321.92318 32.154255 0.0034851739 1 1 + 9500 302.68527 -42.576022 0.0034851739 1 1 + 9550 335.24034 26.675219 0.0034851739 1 1 + 9600 270.62012 17.230138 0.0034851739 1 1 + 9650 273.71088 35.651219 0.0034851739 1 1 + 9700 286.2141 -26.15835 0.0034851739 1 1 + 9750 262.25352 -4.1954047 0.0034851739 1 1 + 9800 314.29455 23.252049 0.0034851739 1 1 + 9850 273.71272 -29.586039 0.0034851739 1 1 + 9900 300.63743 42.595289 0.0034851739 1 1 + 9950 367.68979 -64.582508 0.0034851739 1 1 + 10000 357.17941 31.607766 0.0034851739 1 1 +Loop time of 1.82433 on 1 procs for 10000 steps with 44 atoms + +Performance: 473.599 ns/day, 0.051 hours/ns, 5481.467 timesteps/s, 241.185 katom-step/s +99.8% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.25039 | 0.25039 | 0.25039 | 0.0 | 13.72 +Bond | 1.0461 | 1.0461 | 1.0461 | 0.0 | 57.34 +Kspace | 0.34339 | 0.34339 | 0.34339 | 0.0 | 18.82 +Neigh | 0.0097352 | 0.0097352 | 0.0097352 | 0.0 | 0.53 +Comm | 0.0047764 | 0.0047764 | 0.0047764 | 0.0 | 0.26 +Output | 0.0030537 | 0.0030537 | 0.0030537 | 0.0 | 0.17 +Modify | 0.15534 | 0.15534 | 0.15534 | 0.0 | 8.51 +Other | | 0.01155 | | | 0.63 + +Nlocal: 44 ave 44 max 44 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 44 ave 44 max 44 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 823 ave 823 max 823 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 823 +Ave neighs/atom = 18.704545 +Ave special neighs/atom = 9.9090909 +Neighbor list builds = 221 +Dangerous builds = 0 + +# write_restart restart_longrun +# write_data restart_longrun.data +Total wall time: 0:00:01 diff --git a/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized.g++.4 b/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized.g++.4 new file mode 100644 index 0000000000..0a30cd6984 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized.g++.4 @@ -0,0 +1,412 @@ +LAMMPS (4 Nov 2022) +# two monomer nylon example +# reaction produces a condensed water molecule + +units real + +boundary p p p + +atom_style full + +kspace_style pppm 1.0e-4 + +pair_style lj/class2/coul/long 8.5 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data tiny_nylon.data extra/bond/per/atom 5 extra/angle/per/atom 15 extra/dihedral/per/atom 15 extra/improper/per/atom 25 extra/special/per/atom 25 +Reading data file ... + orthogonal box = (-25 -25 -25) to (25 25 25) + 1 by 2 by 2 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 44 atoms + reading velocities ... + 44 velocities + scanning bonds ... + 9 = max bonds/atom + scanning angles ... + 21 = max angles/atom + scanning dihedrals ... + 29 = max dihedrals/atom + scanning impropers ... + 29 = max impropers/atom + reading bonds ... + 42 bonds + reading angles ... + 74 angles + reading dihedrals ... + 100 dihedrals + reading impropers ... + 44 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 12 = max # of 1-4 neighbors + 41 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.008 seconds + +velocity all create 300.0 4928459 dist gaussian + +molecule mol1 rxn1_stp1_unreacted.molecule_template +Read molecule template mol1: + 1 molecules + 0 fragments + 18 atoms with max type 8 + 16 bonds with max type 10 + 25 angles with max type 28 + 23 dihedrals with max type 36 + 2 impropers with max type 3 +molecule mol2 rxn1_stp1_reacted.molecule_template +Read molecule template mol2: + 1 molecules + 0 fragments + 18 atoms with max type 9 + 17 bonds with max type 13 + 31 angles with max type 27 + 39 dihedrals with max type 33 + 0 impropers with max type 0 +molecule mol3 rxn1_stp2_unreacted.molecule_template +Read molecule template mol3: + 1 molecules + 0 fragments + 15 atoms with max type 9 + 14 bonds with max type 13 + 25 angles with max type 27 + 30 dihedrals with max type 33 + 0 impropers with max type 0 +molecule mol4 rxn1_stp2_reacted.molecule_template +Read molecule template mol4: + 1 molecules + 0 fragments + 15 atoms with max type 11 + 13 bonds with max type 15 + 19 angles with max type 29 + 16 dihedrals with max type 32 + 2 impropers with max type 13 + +thermo 50 + +# dump 1 all xyz 1 test_vis.xyz + +fix myrxns all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0.0 2.9 mol1 mol2 rxn1_stp1_map react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map +WARNING: Fix bond/react: Atom affected by reaction rxn2 is too close to template edge (../fix_bond_react.cpp:2624) +dynamic group bond_react_MASTER_group defined +dynamic group statted_grp_REACT defined + +fix 1 statted_grp_REACT nvt temp 300 300 100 + +# optionally, you can customize behavior of reacting atoms, +# by using the internally-created 'bond_react_MASTER_group', like so: +fix 4 bond_react_MASTER_group temp/rescale 1 300 300 10 1 + +thermo_style custom step temp press density f_myrxns[1] f_myrxns[2] + +# restart 100 restart1 restart2 + +run 10000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +PPPM initialization ... + using 12-bit tables for long-range coulomb (../kspace.cpp:342) + G vector (1/distance) = 0.05345967 + grid = 2 2 2 + stencil order = 5 + estimated absolute RMS force accuracy = 0.040225597 + estimated relative force accuracy = 0.00012113819 + using double precision KISS FFT + 3d grid and FFT values/proc = 252 2 +Generated 55 of 55 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 10 10 10 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +WARNING: Inconsistent image flags (../domain.cpp:819) +Per MPI rank memory allocation (min/avg/max) = 33.66 | 33.88 | 34.43 Mbytes + Step Temp Press Density f_myrxns[1] f_myrxns[2] + 0 300 346.78165 0.0034851739 0 0 + 50 283.51963 -47.16359 0.0034851739 1 0 + 100 256.04648 21.778898 0.0034851739 1 1 + 150 450.78138 -11.7887 0.0034851739 1 1 + 200 400.15754 49.489858 0.0034851739 1 1 + 250 347.06066 68.952063 0.0034851739 1 1 + 300 291.89228 -1.5986302 0.0034851739 1 1 + 350 290.25995 17.634558 0.0034851739 1 1 + 400 234.89168 26.36452 0.0034851739 1 1 + 450 305.80709 -28.923896 0.0034851739 1 1 + 500 375.19218 -37.024375 0.0034851739 1 1 + 550 321.86944 -4.6961825 0.0034851739 1 1 + 600 307.2639 -31.393161 0.0034851739 1 1 + 650 255.95833 8.4995589 0.0034851739 1 1 + 700 294.54665 -17.06105 0.0034851739 1 1 + 750 273.08231 -10.7175 0.0034851739 1 1 + 800 249.69175 9.9777684 0.0034851739 1 1 + 850 307.71806 -6.9950047 0.0034851739 1 1 + 900 367.39855 9.9874984 0.0034851739 1 1 + 950 327.57334 -4.702978 0.0034851739 1 1 + 1000 348.85247 15.763492 0.0034851739 1 1 + 1050 328.94435 -35.031279 0.0034851739 1 1 + 1100 283.23971 -16.937443 0.0034851739 1 1 + 1150 266.69676 42.308482 0.0034851739 1 1 + 1200 244.61493 -8.2911432 0.0034851739 1 1 + 1250 206.68495 6.6280166 0.0034851739 1 1 + 1300 257.83339 -7.0826264 0.0034851739 1 1 + 1350 358.0875 -7.602474 0.0034851739 1 1 + 1400 353.66614 18.091914 0.0034851739 1 1 + 1450 302.27969 13.828755 0.0034851739 1 1 + 1500 262.57851 9.2567956 0.0034851739 1 1 + 1550 252.39492 1.2438631 0.0034851739 1 1 + 1600 247.18352 10.008173 0.0034851739 1 1 + 1650 290.30112 -2.1829055 0.0034851739 1 1 + 1700 272.78999 -57.305766 0.0034851739 1 1 + 1750 253.35258 24.729797 0.0034851739 1 1 + 1800 278.67832 -0.95017071 0.0034851739 1 1 + 1850 302.04743 16.002872 0.0034851739 1 1 + 1900 330.67188 -22.034206 0.0034851739 1 1 + 1950 342.64206 8.0075967 0.0034851739 1 1 + 2000 348.74388 -12.159899 0.0034851739 1 1 + 2050 300.48095 36.010534 0.0034851739 1 1 + 2100 275.017 8.7612294 0.0034851739 1 1 + 2150 303.92758 10.317032 0.0034851739 1 1 + 2200 308.89452 33.245012 0.0034851739 1 1 + 2250 265.74176 35.857111 0.0034851739 1 1 + 2300 273.40086 53.001626 0.0034851739 1 1 + 2350 287.74753 -0.14586562 0.0034851739 1 1 + 2400 278.7606 -8.20812 0.0034851739 1 1 + 2450 331.88979 39.02519 0.0034851739 1 1 + 2500 280.04041 -21.423589 0.0034851739 1 1 + 2550 388.81536 -12.350053 0.0034851739 1 1 + 2600 311.13468 -13.286785 0.0034851739 1 1 + 2650 325.07686 88.710881 0.0034851739 1 1 + 2700 319.08471 14.118288 0.0034851739 1 1 + 2750 261.72067 26.051439 0.0034851739 1 1 + 2800 281.03459 -21.201297 0.0034851739 1 1 + 2850 312.27342 4.3904047 0.0034851739 1 1 + 2900 274.81152 -12.739138 0.0034851739 1 1 + 2950 281.76873 11.199981 0.0034851739 1 1 + 3000 291.8377 48.595661 0.0034851739 1 1 + 3050 297.40212 -24.911752 0.0034851739 1 1 + 3100 341.48252 13.825136 0.0034851739 1 1 + 3150 347.5099 -10.452847 0.0034851739 1 1 + 3200 301.24901 26.553909 0.0034851739 1 1 + 3250 281.35392 -23.028031 0.0034851739 1 1 + 3300 279.82881 -53.225332 0.0034851739 1 1 + 3350 289.41016 -8.7866567 0.0034851739 1 1 + 3400 288.56923 -25.445059 0.0034851739 1 1 + 3450 259.59956 77.88466 0.0034851739 1 1 + 3500 295.99591 30.357393 0.0034851739 1 1 + 3550 302.1675 -5.103997 0.0034851739 1 1 + 3600 289.00244 -12.687621 0.0034851739 1 1 + 3650 333.89968 -33.124064 0.0034851739 1 1 + 3700 347.82328 -24.745583 0.0034851739 1 1 + 3750 354.51391 6.7131611 0.0034851739 1 1 + 3800 341.31124 -18.777474 0.0034851739 1 1 + 3850 320.48132 35.547595 0.0034851739 1 1 + 3900 326.8911 -49.153151 0.0034851739 1 1 + 3950 299.65543 -19.443322 0.0034851739 1 1 + 4000 308.97943 30.368402 0.0034851739 1 1 + 4050 251.46183 -17.518988 0.0034851739 1 1 + 4100 241.50223 22.103347 0.0034851739 1 1 + 4150 265.01178 -4.4952098 0.0034851739 1 1 + 4200 369.78569 -14.603579 0.0034851739 1 1 + 4250 348.20071 -33.060693 0.0034851739 1 1 + 4300 368.11836 11.897676 0.0034851739 1 1 + 4350 321.1145 -9.3124104 0.0034851739 1 1 + 4400 313.95395 -31.940883 0.0034851739 1 1 + 4450 280.50985 41.398853 0.0034851739 1 1 + 4500 289.36914 -2.3915112 0.0034851739 1 1 + 4550 318.52735 -5.0086703 0.0034851739 1 1 + 4600 308.68169 -13.642004 0.0034851739 1 1 + 4650 285.24153 35.314806 0.0034851739 1 1 + 4700 357.15021 8.8271927 0.0034851739 1 1 + 4750 359.11051 -59.672314 0.0034851739 1 1 + 4800 453.11584 0.54316266 0.0034851739 1 1 + 4850 392.52232 46.350736 0.0034851739 1 1 + 4900 310.42864 5.9002223 0.0034851739 1 1 + 4950 285.97355 -19.321724 0.0034851739 1 1 + 5000 309.41828 18.331381 0.0034851739 1 1 + 5050 324.96434 -27.143631 0.0034851739 1 1 + 5100 266.49422 -26.977074 0.0034851739 1 1 + 5150 295.35576 -14.271299 0.0034851739 1 1 + 5200 275.8961 14.057873 0.0034851739 1 1 + 5250 332.75955 26.04747 0.0034851739 1 1 + 5300 296.57102 -20.904181 0.0034851739 1 1 + 5350 264.68808 29.533914 0.0034851739 1 1 + 5400 293.373 -13.579532 0.0034851739 1 1 + 5450 290.55933 9.3458628 0.0034851739 1 1 + 5500 340.54834 8.8308229 0.0034851739 1 1 + 5550 336.08713 -6.9696582 0.0034851739 1 1 + 5600 331.77668 -7.9756709 0.0034851739 1 1 + 5650 307.8419 -10.263349 0.0034851739 1 1 + 5700 262.70119 78.855544 0.0034851739 1 1 + 5750 285.37985 -15.4042 0.0034851739 1 1 + 5800 267.44612 -30.053955 0.0034851739 1 1 + 5850 241.52125 3.2904907 0.0034851739 1 1 + 5900 265.13367 27.69901 0.0034851739 1 1 + 5950 277.95155 18.419031 0.0034851739 1 1 + 6000 309.62777 -20.054029 0.0034851739 1 1 + 6050 363.41588 16.435337 0.0034851739 1 1 + 6100 348.85793 -14.513241 0.0034851739 1 1 + 6150 323.73745 56.990265 0.0034851739 1 1 + 6200 338.66823 -19.93498 0.0034851739 1 1 + 6250 325.41329 -13.824943 0.0034851739 1 1 + 6300 279.82345 -9.0557197 0.0034851739 1 1 + 6350 285.90705 52.434161 0.0034851739 1 1 + 6400 260.34102 -15.766595 0.0034851739 1 1 + 6450 304.65686 7.5058044 0.0034851739 1 1 + 6500 265.02097 1.7203356 0.0034851739 1 1 + 6550 293.35057 1.8896974 0.0034851739 1 1 + 6600 284.06837 -9.3674953 0.0034851739 1 1 + 6650 307.29863 -2.3882614 0.0034851739 1 1 + 6700 336.20676 43.913926 0.0034851739 1 1 + 6750 291.53938 -16.749433 0.0034851739 1 1 + 6800 298.4418 -13.340335 0.0034851739 1 1 + 6850 264.13368 -11.219357 0.0034851739 1 1 + 6900 273.63109 -15.897238 0.0034851739 1 1 + 6950 282.64715 6.8275423 0.0034851739 1 1 + 7000 277.4091 -25.381099 0.0034851739 1 1 + 7050 278.07001 63.552969 0.0034851739 1 1 + 7100 293.33358 22.103462 0.0034851739 1 1 + 7150 308.36447 -27.212203 0.0034851739 1 1 + 7200 251.45077 -40.385347 0.0034851739 1 1 + 7250 317.57808 1.0302048 0.0034851739 1 1 + 7300 348.52627 48.392457 0.0034851739 1 1 + 7350 356.5821 27.933626 0.0034851739 1 1 + 7400 311.29835 -18.899768 0.0034851739 1 1 + 7450 274.24476 -19.41577 0.0034851739 1 1 + 7500 261.38075 1.2110527 0.0034851739 1 1 + 7550 299.78907 -17.64954 0.0034851739 1 1 + 7600 271.36191 25.99439 0.0034851739 1 1 + 7650 287.51241 1.532789 0.0034851739 1 1 + 7700 280.87778 -31.828432 0.0034851739 1 1 + 7750 312.22588 45.320976 0.0034851739 1 1 + 7800 312.73849 4.1022573 0.0034851739 1 1 + 7850 299.18742 50.272069 0.0034851739 1 1 + 7900 312.4916 -34.425195 0.0034851739 1 1 + 7950 284.5205 15.716375 0.0034851739 1 1 + 8000 248.39764 -7.1922339 0.0034851739 1 1 + 8050 242.65659 -32.701773 0.0034851739 1 1 + 8100 228.76112 54.351 0.0034851739 1 1 + 8150 308.67672 -15.835344 0.0034851739 1 1 + 8200 304.26746 -11.106867 0.0034851739 1 1 + 8250 338.67601 44.199636 0.0034851739 1 1 + 8300 308.59612 -9.6487546 0.0034851739 1 1 + 8350 287.08027 11.036122 0.0034851739 1 1 + 8400 319.79578 -78.918735 0.0034851739 1 1 + 8450 320.78978 57.275745 0.0034851739 1 1 + 8500 282.90803 33.716746 0.0034851739 1 1 + 8550 235.23686 -44.587941 0.0034851739 1 1 + 8600 265.62925 45.976855 0.0034851739 1 1 + 8650 260.35429 -9.3951434 0.0034851739 1 1 + 8700 236.16314 19.504695 0.0034851739 1 1 + 8750 291.51087 -13.996885 0.0034851739 1 1 + 8800 357.00246 -26.674845 0.0034851739 1 1 + 8850 327.72543 15.954838 0.0034851739 1 1 + 8900 321.17809 -14.794959 0.0034851739 1 1 + 8950 357.51102 39.861567 0.0034851739 1 1 + 9000 286.68385 -52.799636 0.0034851739 1 1 + 9050 283.96224 13.044025 0.0034851739 1 1 + 9100 304.04431 25.510777 0.0034851739 1 1 + 9150 261.33631 -18.611794 0.0034851739 1 1 + 9200 297.50501 25.733551 0.0034851739 1 1 + 9250 279.85018 -26.91045 0.0034851739 1 1 + 9300 336.07358 35.385228 0.0034851739 1 1 + 9350 326.27961 -36.941794 0.0034851739 1 1 + 9400 400.42857 7.5301492 0.0034851739 1 1 + 9450 296.80174 11.898673 0.0034851739 1 1 + 9500 275.98796 41.303486 0.0034851739 1 1 + 9550 278.56924 31.033397 0.0034851739 1 1 + 9600 260.24476 -11.416595 0.0034851739 1 1 + 9650 281.86065 12.60709 0.0034851739 1 1 + 9700 287.26789 -29.086626 0.0034851739 1 1 + 9750 290.82789 3.2830325 0.0034851739 1 1 + 9800 270.99421 -25.824595 0.0034851739 1 1 + 9850 385.1884 4.1048816 0.0034851739 1 1 + 9900 363.1711 18.815879 0.0034851739 1 1 + 9950 344.93572 17.375158 0.0034851739 1 1 + 10000 335.65852 -0.84087429 0.0034851739 1 1 +Loop time of 1.78856 on 4 procs for 10000 steps with 44 atoms + +Performance: 483.070 ns/day, 0.050 hours/ns, 5591.087 timesteps/s, 246.008 katom-step/s +100.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.0021174 | 0.066025 | 0.20024 | 31.5 | 3.69 +Bond | 0.0035593 | 0.2715 | 0.74757 | 58.6 | 15.18 +Kspace | 0.50386 | 1.0492 | 1.3455 | 33.6 | 58.66 +Neigh | 0.0079056 | 0.0079463 | 0.0079766 | 0.0 | 0.44 +Comm | 0.044284 | 0.08173 | 0.10388 | 8.1 | 4.57 +Output | 0.0021661 | 0.0024497 | 0.0031314 | 0.8 | 0.14 +Modify | 0.2648 | 0.29459 | 0.33479 | 5.5 | 16.47 +Other | | 0.01514 | | | 0.85 + +Nlocal: 11 ave 41 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 +Nghost: 27.5 ave 41 max 0 min +Histogram: 1 0 0 0 0 0 0 0 2 1 +Neighs: 205.75 ave 820 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 823 +Ave neighs/atom = 18.704545 +Ave special neighs/atom = 9.9090909 +Neighbor list builds = 225 +Dangerous builds = 0 + +# write_restart restart_longrun +# write_data restart_longrun.data +Total wall time: 0:00:01 diff --git a/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized_variable_probability.g++.1 b/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized_variable_probability.g++.1 new file mode 100644 index 0000000000..ec822e8b3b --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized_variable_probability.g++.1 @@ -0,0 +1,237 @@ +LAMMPS (4 Nov 2022) +# two monomer nylon example +# reaction produces a condensed water molecule + +units real + +boundary p p p + +atom_style full + +kspace_style pppm 1.0e-4 + +pair_style lj/class2/coul/long 8.5 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data tiny_nylon.data extra/bond/per/atom 5 extra/angle/per/atom 15 extra/dihedral/per/atom 15 extra/improper/per/atom 25 extra/special/per/atom 25 +Reading data file ... + orthogonal box = (-25 -25 -25) to (25 25 25) + 1 by 1 by 1 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 44 atoms + reading velocities ... + 44 velocities + scanning bonds ... + 9 = max bonds/atom + scanning angles ... + 21 = max angles/atom + scanning dihedrals ... + 29 = max dihedrals/atom + scanning impropers ... + 29 = max impropers/atom + reading bonds ... + 42 bonds + reading angles ... + 74 angles + reading dihedrals ... + 100 dihedrals + reading impropers ... + 44 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 12 = max # of 1-4 neighbors + 41 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.007 seconds + +variable runsteps equal 1000 +variable prob1 equal step/v_runsteps*2+0.1 +variable prob2 equal (step/v_runsteps)>0.5 + +velocity all create 300.0 4928459 dist gaussian + +molecule mol1 rxn1_stp1_unreacted.molecule_template +Read molecule template mol1: + 1 molecules + 0 fragments + 18 atoms with max type 8 + 16 bonds with max type 10 + 25 angles with max type 28 + 23 dihedrals with max type 36 + 2 impropers with max type 3 +molecule mol2 rxn1_stp1_reacted.molecule_template +Read molecule template mol2: + 1 molecules + 0 fragments + 18 atoms with max type 9 + 17 bonds with max type 13 + 31 angles with max type 27 + 39 dihedrals with max type 33 + 0 impropers with max type 0 +molecule mol3 rxn1_stp2_unreacted.molecule_template +Read molecule template mol3: + 1 molecules + 0 fragments + 15 atoms with max type 9 + 14 bonds with max type 13 + 25 angles with max type 27 + 30 dihedrals with max type 33 + 0 impropers with max type 0 +molecule mol4 rxn1_stp2_reacted.molecule_template +Read molecule template mol4: + 1 molecules + 0 fragments + 15 atoms with max type 11 + 13 bonds with max type 15 + 19 angles with max type 29 + 16 dihedrals with max type 32 + 2 impropers with max type 13 + +thermo 50 + +# dump 1 all xyz 1 test_vis.xyz + +fix myrxns all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0.0 5.0 mol1 mol2 rxn1_stp1_map prob v_prob1 1234 react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map prob v_prob2 1234 +WARNING: Fix bond/react: Atom affected by reaction rxn2 is too close to template edge (../fix_bond_react.cpp:2624) +dynamic group bond_react_MASTER_group defined +dynamic group statted_grp_REACT defined + +fix 1 statted_grp_REACT nvt temp 300 300 100 + +# optionally, you can customize behavior of reacting atoms, +# by using the internally-created 'bond_react_MASTER_group', like so: +fix 4 bond_react_MASTER_group temp/rescale 1 300 300 10 1 + +thermo_style custom step temp press density v_prob1 v_prob2 f_myrxns[1] f_myrxns[2] + +# restart 100 restart1 restart2 + +run ${runsteps} +run 1000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +PPPM initialization ... + using 12-bit tables for long-range coulomb (../kspace.cpp:342) + G vector (1/distance) = 0.05345967 + grid = 2 2 2 + stencil order = 5 + estimated absolute RMS force accuracy = 0.040225597 + estimated relative force accuracy = 0.00012113819 + using double precision KISS FFT + 3d grid and FFT values/proc = 343 8 +Generated 55 of 55 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 10 10 10 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +WARNING: Inconsistent image flags (../domain.cpp:819) +Per MPI rank memory allocation (min/avg/max) = 33.78 | 33.78 | 33.78 Mbytes + Step Temp Press Density v_prob1 v_prob2 f_myrxns[1] f_myrxns[2] + 0 300 346.78165 0.0034851739 0.1 0 0 0 + 50 265.51039 -67.489756 0.0034851739 0.2 0 1 0 + 100 596.03388 -27.815189 0.0034851739 0.3 0 1 0 + 150 500.05269 2.9684972 0.0034851739 0.4 0 1 0 + 200 511.40295 56.791868 0.0034851739 0.5 0 1 0 + 250 375.95679 -4.0587677 0.0034851739 0.6 0 1 0 + 300 371.1629 -60.689059 0.0034851739 0.7 0 1 0 + 350 336.06545 8.6411023 0.0034851739 0.8 0 1 0 + 400 301.41962 50.628044 0.0034851739 0.9 0 1 0 + 450 281.08727 -15.590922 0.0034851739 1 0 1 0 + 500 297.35323 -9.5761786 0.0034851739 1.1 0 1 0 + 550 197.45298 3.6867353 0.0034851739 1.2 1 1 1 + 600 240.1748 -19.889198 0.0034851739 1.3 1 1 1 + 650 231.57018 -13.078808 0.0034851739 1.4 1 1 1 + 700 296.00816 -18.772183 0.0034851739 1.5 1 1 1 + 750 294.94016 15.43915 0.0034851739 1.6 1 1 1 + 800 316.51231 12.070563 0.0034851739 1.7 1 1 1 + 850 348.59373 9.0940092 0.0034851739 1.8 1 1 1 + 900 330.5264 -3.4868175 0.0034851739 1.9 1 1 1 + 950 307.02461 34.643373 0.0034851739 2 1 1 1 + 1000 250.06536 5.8440413 0.0034851739 2.1 1 1 1 +Loop time of 0.202863 on 1 procs for 1000 steps with 44 atoms + +Performance: 425.903 ns/day, 0.056 hours/ns, 4929.437 timesteps/s, 216.895 katom-step/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.025759 | 0.025759 | 0.025759 | 0.0 | 12.70 +Bond | 0.11024 | 0.11024 | 0.11024 | 0.0 | 54.34 +Kspace | 0.034344 | 0.034344 | 0.034344 | 0.0 | 16.93 +Neigh | 0.0015719 | 0.0015719 | 0.0015719 | 0.0 | 0.77 +Comm | 0.00045259 | 0.00045259 | 0.00045259 | 0.0 | 0.22 +Output | 0.0004759 | 0.0004759 | 0.0004759 | 0.0 | 0.23 +Modify | 0.028713 | 0.028713 | 0.028713 | 0.0 | 14.15 +Other | | 0.001307 | | | 0.64 + +Nlocal: 44 ave 44 max 44 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 3 ave 3 max 3 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 802 ave 802 max 802 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 802 +Ave neighs/atom = 18.227273 +Ave special neighs/atom = 9.9090909 +Neighbor list builds = 32 +Dangerous builds = 0 + +# write_restart restart_longrun +# write_data restart_longrun.data +Total wall time: 0:00:00 diff --git a/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized_variable_probability.g++.4 b/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized_variable_probability.g++.4 new file mode 100644 index 0000000000..d85e7fb474 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.stabilized_variable_probability.g++.4 @@ -0,0 +1,237 @@ +LAMMPS (4 Nov 2022) +# two monomer nylon example +# reaction produces a condensed water molecule + +units real + +boundary p p p + +atom_style full + +kspace_style pppm 1.0e-4 + +pair_style lj/class2/coul/long 8.5 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data tiny_nylon.data extra/bond/per/atom 5 extra/angle/per/atom 15 extra/dihedral/per/atom 15 extra/improper/per/atom 25 extra/special/per/atom 25 +Reading data file ... + orthogonal box = (-25 -25 -25) to (25 25 25) + 1 by 2 by 2 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 44 atoms + reading velocities ... + 44 velocities + scanning bonds ... + 9 = max bonds/atom + scanning angles ... + 21 = max angles/atom + scanning dihedrals ... + 29 = max dihedrals/atom + scanning impropers ... + 29 = max impropers/atom + reading bonds ... + 42 bonds + reading angles ... + 74 angles + reading dihedrals ... + 100 dihedrals + reading impropers ... + 44 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 12 = max # of 1-4 neighbors + 41 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.008 seconds + +variable runsteps equal 1000 +variable prob1 equal step/v_runsteps*2+0.1 +variable prob2 equal (step/v_runsteps)>0.5 + +velocity all create 300.0 4928459 dist gaussian + +molecule mol1 rxn1_stp1_unreacted.molecule_template +Read molecule template mol1: + 1 molecules + 0 fragments + 18 atoms with max type 8 + 16 bonds with max type 10 + 25 angles with max type 28 + 23 dihedrals with max type 36 + 2 impropers with max type 3 +molecule mol2 rxn1_stp1_reacted.molecule_template +Read molecule template mol2: + 1 molecules + 0 fragments + 18 atoms with max type 9 + 17 bonds with max type 13 + 31 angles with max type 27 + 39 dihedrals with max type 33 + 0 impropers with max type 0 +molecule mol3 rxn1_stp2_unreacted.molecule_template +Read molecule template mol3: + 1 molecules + 0 fragments + 15 atoms with max type 9 + 14 bonds with max type 13 + 25 angles with max type 27 + 30 dihedrals with max type 33 + 0 impropers with max type 0 +molecule mol4 rxn1_stp2_reacted.molecule_template +Read molecule template mol4: + 1 molecules + 0 fragments + 15 atoms with max type 11 + 13 bonds with max type 15 + 19 angles with max type 29 + 16 dihedrals with max type 32 + 2 impropers with max type 13 + +thermo 50 + +# dump 1 all xyz 1 test_vis.xyz + +fix myrxns all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0.0 5.0 mol1 mol2 rxn1_stp1_map prob v_prob1 1234 react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map prob v_prob2 1234 +WARNING: Fix bond/react: Atom affected by reaction rxn2 is too close to template edge (../fix_bond_react.cpp:2624) +dynamic group bond_react_MASTER_group defined +dynamic group statted_grp_REACT defined + +fix 1 statted_grp_REACT nvt temp 300 300 100 + +# optionally, you can customize behavior of reacting atoms, +# by using the internally-created 'bond_react_MASTER_group', like so: +fix 4 bond_react_MASTER_group temp/rescale 1 300 300 10 1 + +thermo_style custom step temp press density v_prob1 v_prob2 f_myrxns[1] f_myrxns[2] + +# restart 100 restart1 restart2 + +run ${runsteps} +run 1000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +PPPM initialization ... + using 12-bit tables for long-range coulomb (../kspace.cpp:342) + G vector (1/distance) = 0.05345967 + grid = 2 2 2 + stencil order = 5 + estimated absolute RMS force accuracy = 0.040225597 + estimated relative force accuracy = 0.00012113819 + using double precision KISS FFT + 3d grid and FFT values/proc = 252 2 +Generated 55 of 55 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 10 10 10 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +WARNING: Inconsistent image flags (../domain.cpp:819) +Per MPI rank memory allocation (min/avg/max) = 33.66 | 33.88 | 34.43 Mbytes + Step Temp Press Density v_prob1 v_prob2 f_myrxns[1] f_myrxns[2] + 0 300 346.78165 0.0034851739 0.1 0 0 0 + 50 275.80938 -29.158908 0.0034851739 0.2 0 1 0 + 100 751.80013 8.8967942 0.0034851739 0.3 0 1 0 + 150 412.82804 61.44542 0.0034851739 0.4 0 1 0 + 200 432.95275 81.052275 0.0034851739 0.5 0 1 0 + 250 338.65702 -39.770422 0.0034851739 0.6 0 1 0 + 300 326.15993 -46.690912 0.0034851739 0.7 0 1 0 + 350 286.66126 51.986782 0.0034851739 0.8 0 1 0 + 400 244.24575 25.460254 0.0034851739 0.9 0 1 0 + 450 294.06274 5.0448726 0.0034851739 1 0 1 0 + 500 280.71089 0.86710712 0.0034851739 1.1 0 1 0 + 550 241.94123 -5.7812057 0.0034851739 1.2 1 1 1 + 600 235.1535 61.669814 0.0034851739 1.3 1 1 1 + 650 359.33618 -22.053171 0.0034851739 1.4 1 1 1 + 700 329.37555 -4.7839581 0.0034851739 1.5 1 1 1 + 750 285.76974 11.553815 0.0034851739 1.6 1 1 1 + 800 303.29561 16.017529 0.0034851739 1.7 1 1 1 + 850 256.86479 8.7487305 0.0034851739 1.8 1 1 1 + 900 292.29316 -11.376211 0.0034851739 1.9 1 1 1 + 950 293.47531 -2.7153276 0.0034851739 2 1 1 1 + 1000 303.66454 -4.8603249 0.0034851739 2.1 1 1 1 +Loop time of 0.195512 on 4 procs for 1000 steps with 44 atoms + +Performance: 441.916 ns/day, 0.054 hours/ns, 5114.771 timesteps/s, 225.050 katom-step/s +99.9% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.000163 | 0.0068784 | 0.016583 | 8.5 | 3.52 +Bond | 0.00040383 | 0.028615 | 0.083462 | 20.0 | 14.64 +Kspace | 0.043566 | 0.10199 | 0.13314 | 11.4 | 52.16 +Neigh | 0.00096634 | 0.00097064 | 0.00097509 | 0.0 | 0.50 +Comm | 0.0052532 | 0.0093802 | 0.014076 | 3.2 | 4.80 +Output | 0.00039802 | 0.00043637 | 0.00050031 | 0.0 | 0.22 +Modify | 0.043549 | 0.045538 | 0.049781 | 1.2 | 23.29 +Other | | 0.001708 | | | 0.87 + +Nlocal: 11 ave 29 max 0 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Nghost: 32.5 ave 45 max 16 min +Histogram: 1 0 0 1 0 0 0 0 1 1 +Neighs: 196.25 ave 448 max 0 min +Histogram: 2 0 0 0 0 0 0 1 0 1 + +Total # of neighbors = 785 +Ave neighs/atom = 17.840909 +Ave special neighs/atom = 9.9090909 +Neighbor list builds = 27 +Dangerous builds = 0 + +# write_restart restart_longrun +# write_data restart_longrun.data +Total wall time: 0:00:00 diff --git a/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.unstabilized.g++.1 b/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.unstabilized.g++.1 new file mode 100644 index 0000000000..5d696dae45 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.unstabilized.g++.1 @@ -0,0 +1,228 @@ +LAMMPS (4 Nov 2022) +# two monomer nylon example +# reaction produces a condensed water molecule + +units real + +boundary p p p + +atom_style full + +kspace_style pppm 1.0e-4 + +pair_style lj/class2/coul/long 8.5 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data tiny_nylon.data extra/bond/per/atom 5 extra/angle/per/atom 15 extra/dihedral/per/atom 15 extra/improper/per/atom 25 extra/special/per/atom 25 +Reading data file ... + orthogonal box = (-25 -25 -25) to (25 25 25) + 1 by 1 by 1 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 44 atoms + reading velocities ... + 44 velocities + scanning bonds ... + 9 = max bonds/atom + scanning angles ... + 21 = max angles/atom + scanning dihedrals ... + 29 = max dihedrals/atom + scanning impropers ... + 29 = max impropers/atom + reading bonds ... + 42 bonds + reading angles ... + 74 angles + reading dihedrals ... + 100 dihedrals + reading impropers ... + 44 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 12 = max # of 1-4 neighbors + 41 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.008 seconds + + +velocity all create 300.0 4928459 dist gaussian + +molecule mol1 rxn1_stp1_unreacted.molecule_template +Read molecule template mol1: + 1 molecules + 0 fragments + 18 atoms with max type 8 + 16 bonds with max type 10 + 25 angles with max type 28 + 23 dihedrals with max type 36 + 2 impropers with max type 3 +molecule mol2 rxn1_stp1_reacted.molecule_template +Read molecule template mol2: + 1 molecules + 0 fragments + 18 atoms with max type 9 + 17 bonds with max type 13 + 31 angles with max type 27 + 39 dihedrals with max type 33 + 0 impropers with max type 0 +molecule mol3 rxn1_stp2_unreacted.molecule_template +Read molecule template mol3: + 1 molecules + 0 fragments + 15 atoms with max type 9 + 14 bonds with max type 13 + 25 angles with max type 27 + 30 dihedrals with max type 33 + 0 impropers with max type 0 +molecule mol4 rxn1_stp2_reacted.molecule_template +Read molecule template mol4: + 1 molecules + 0 fragments + 15 atoms with max type 11 + 13 bonds with max type 15 + 19 angles with max type 29 + 16 dihedrals with max type 32 + 2 impropers with max type 13 + +thermo 50 + +# dump 1 all xyz 1 test_vis.xyz + +fix myrxns all bond/react stabilization no react rxn1 all 1 0.0 2.9 mol1 mol2 rxn1_stp1_map react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map +WARNING: Fix bond/react: Atom affected by reaction rxn2 is too close to template edge (../fix_bond_react.cpp:2624) +dynamic group bond_react_MASTER_group defined + +fix 1 all nve/limit .03 + +thermo_style custom step temp press density f_myrxns[1] f_myrxns[2] + +# restart 100 restart1 restart2 + +run 1000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +PPPM initialization ... + using 12-bit tables for long-range coulomb (../kspace.cpp:342) + G vector (1/distance) = 0.05345967 + grid = 2 2 2 + stencil order = 5 + estimated absolute RMS force accuracy = 0.040225597 + estimated relative force accuracy = 0.00012113819 + using double precision KISS FFT + 3d grid and FFT values/proc = 343 8 +Generated 55 of 55 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 10 10 10 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +WARNING: Inconsistent image flags (../domain.cpp:819) +Per MPI rank memory allocation (min/avg/max) = 33.72 | 33.72 | 33.72 Mbytes + Step Temp Press Density f_myrxns[1] f_myrxns[2] + 0 300 346.78165 0.0034851739 0 0 + 50 530.51001 -15.418012 0.0034851739 1 0 + 100 677.21327 16.545108 0.0034851739 1 1 + 150 386.79268 -28.445486 0.0034851739 1 1 + 200 380.29074 1.8065066 0.0034851739 1 1 + 250 353.27609 -7.3505628 0.0034851739 1 1 + 300 357.84405 -7.0569 0.0034851739 1 1 + 350 337.65224 54.441683 0.0034851739 1 1 + 400 322.54035 20.338902 0.0034851739 1 1 + 450 316.91217 44.76973 0.0034851739 1 1 + 500 345.40444 -8.2133383 0.0034851739 1 1 + 550 296.22085 -30.331582 0.0034851739 1 1 + 600 263.8024 -36.834323 0.0034851739 1 1 + 650 284.05699 1.2532577 0.0034851739 1 1 + 700 274.86269 4.6881357 0.0034851739 1 1 + 750 298.72284 -18.225831 0.0034851739 1 1 + 800 292.72143 -5.1622029 0.0034851739 1 1 + 850 279.30224 -10.72513 0.0034851739 1 1 + 900 284.97331 30.268801 0.0034851739 1 1 + 950 262.46089 16.98134 0.0034851739 1 1 + 1000 297.55359 28.583097 0.0034851739 1 1 +Loop time of 0.175951 on 1 procs for 1000 steps with 44 atoms + +Performance: 491.045 ns/day, 0.049 hours/ns, 5683.388 timesteps/s, 250.069 katom-step/s +99.6% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.022992 | 0.022992 | 0.022992 | 0.0 | 13.07 +Bond | 0.1045 | 0.1045 | 0.1045 | 0.0 | 59.39 +Kspace | 0.034057 | 0.034057 | 0.034057 | 0.0 | 19.36 +Neigh | 0.0013592 | 0.0013592 | 0.0013592 | 0.0 | 0.77 +Comm | 0.00040677 | 0.00040677 | 0.00040677 | 0.0 | 0.23 +Output | 0.00030929 | 0.00030929 | 0.00030929 | 0.0 | 0.18 +Modify | 0.01121 | 0.01121 | 0.01121 | 0.0 | 6.37 +Other | | 0.001118 | | | 0.64 + +Nlocal: 44 ave 44 max 44 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 8 ave 8 max 8 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 810 ave 810 max 810 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 810 +Ave neighs/atom = 18.409091 +Ave special neighs/atom = 9.9090909 +Neighbor list builds = 28 +Dangerous builds = 0 + +# write_restart restart_longrun +# write_data restart_longrun.data +Total wall time: 0:00:00 diff --git a/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.unstabilized.g++.4 b/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.unstabilized.g++.4 new file mode 100644 index 0000000000..0b022918be --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_nylon/log.4Nov2020.tiny_nylon.unstabilized.g++.4 @@ -0,0 +1,228 @@ +LAMMPS (4 Nov 2022) +# two monomer nylon example +# reaction produces a condensed water molecule + +units real + +boundary p p p + +atom_style full + +kspace_style pppm 1.0e-4 + +pair_style lj/class2/coul/long 8.5 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data tiny_nylon.data extra/bond/per/atom 5 extra/angle/per/atom 15 extra/dihedral/per/atom 15 extra/improper/per/atom 25 extra/special/per/atom 25 +Reading data file ... + orthogonal box = (-25 -25 -25) to (25 25 25) + 1 by 2 by 2 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 44 atoms + reading velocities ... + 44 velocities + scanning bonds ... + 9 = max bonds/atom + scanning angles ... + 21 = max angles/atom + scanning dihedrals ... + 29 = max dihedrals/atom + scanning impropers ... + 29 = max impropers/atom + reading bonds ... + 42 bonds + reading angles ... + 74 angles + reading dihedrals ... + 100 dihedrals + reading impropers ... + 44 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 12 = max # of 1-4 neighbors + 41 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.008 seconds + + +velocity all create 300.0 4928459 dist gaussian + +molecule mol1 rxn1_stp1_unreacted.molecule_template +Read molecule template mol1: + 1 molecules + 0 fragments + 18 atoms with max type 8 + 16 bonds with max type 10 + 25 angles with max type 28 + 23 dihedrals with max type 36 + 2 impropers with max type 3 +molecule mol2 rxn1_stp1_reacted.molecule_template +Read molecule template mol2: + 1 molecules + 0 fragments + 18 atoms with max type 9 + 17 bonds with max type 13 + 31 angles with max type 27 + 39 dihedrals with max type 33 + 0 impropers with max type 0 +molecule mol3 rxn1_stp2_unreacted.molecule_template +Read molecule template mol3: + 1 molecules + 0 fragments + 15 atoms with max type 9 + 14 bonds with max type 13 + 25 angles with max type 27 + 30 dihedrals with max type 33 + 0 impropers with max type 0 +molecule mol4 rxn1_stp2_reacted.molecule_template +Read molecule template mol4: + 1 molecules + 0 fragments + 15 atoms with max type 11 + 13 bonds with max type 15 + 19 angles with max type 29 + 16 dihedrals with max type 32 + 2 impropers with max type 13 + +thermo 50 + +# dump 1 all xyz 1 test_vis.xyz + +fix myrxns all bond/react stabilization no react rxn1 all 1 0.0 2.9 mol1 mol2 rxn1_stp1_map react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map +WARNING: Fix bond/react: Atom affected by reaction rxn2 is too close to template edge (../fix_bond_react.cpp:2624) +dynamic group bond_react_MASTER_group defined + +fix 1 all nve/limit .03 + +thermo_style custom step temp press density f_myrxns[1] f_myrxns[2] + +# restart 100 restart1 restart2 + +run 1000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +PPPM initialization ... + using 12-bit tables for long-range coulomb (../kspace.cpp:342) + G vector (1/distance) = 0.05345967 + grid = 2 2 2 + stencil order = 5 + estimated absolute RMS force accuracy = 0.040225597 + estimated relative force accuracy = 0.00012113819 + using double precision KISS FFT + 3d grid and FFT values/proc = 252 2 +Generated 55 of 55 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 10 10 10 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +WARNING: Inconsistent image flags (../domain.cpp:819) +Per MPI rank memory allocation (min/avg/max) = 33.59 | 33.82 | 34.37 Mbytes + Step Temp Press Density f_myrxns[1] f_myrxns[2] + 0 300 346.78165 0.0034851739 0 0 + 50 530.51001 -15.418012 0.0034851739 1 0 + 100 677.21327 16.545108 0.0034851739 1 1 + 150 386.79268 -28.445486 0.0034851739 1 1 + 200 380.29074 1.8065066 0.0034851739 1 1 + 250 353.27609 -7.3505628 0.0034851739 1 1 + 300 357.84405 -7.0569 0.0034851739 1 1 + 350 337.65224 54.441683 0.0034851739 1 1 + 400 322.54035 20.338902 0.0034851739 1 1 + 450 316.91217 44.76973 0.0034851739 1 1 + 500 345.40444 -8.2133383 0.0034851739 1 1 + 550 296.22085 -30.331582 0.0034851739 1 1 + 600 263.8024 -36.834323 0.0034851739 1 1 + 650 284.05699 1.2532577 0.0034851739 1 1 + 700 274.86269 4.6881357 0.0034851739 1 1 + 750 298.72284 -18.225831 0.0034851739 1 1 + 800 292.72143 -5.1622029 0.0034851739 1 1 + 850 279.30224 -10.72513 0.0034851739 1 1 + 900 284.97331 30.268801 0.0034851739 1 1 + 950 262.46089 16.98134 0.0034851739 1 1 + 1000 297.55359 28.583097 0.0034851739 1 1 +Loop time of 0.179911 on 4 procs for 1000 steps with 44 atoms + +Performance: 480.238 ns/day, 0.050 hours/ns, 5558.315 timesteps/s, 244.566 katom-step/s +99.9% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.0001131 | 0.0060483 | 0.016546 | 8.7 | 3.36 +Bond | 0.00024262 | 0.027106 | 0.07455 | 18.6 | 15.07 +Kspace | 0.059795 | 0.11105 | 0.13995 | 9.9 | 61.72 +Neigh | 0.0012033 | 0.0012139 | 0.0012228 | 0.0 | 0.67 +Comm | 0.0056243 | 0.0098345 | 0.013482 | 2.9 | 5.47 +Output | 0.00025378 | 0.0002833 | 0.00034961 | 0.0 | 0.16 +Modify | 0.020145 | 0.02287 | 0.027899 | 2.1 | 12.71 +Other | | 0.001506 | | | 0.84 + +Nlocal: 11 ave 41 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 +Nghost: 34.5 ave 46 max 8 min +Histogram: 1 0 0 0 0 0 0 0 2 1 +Neighs: 202.5 ave 807 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 810 +Ave neighs/atom = 18.409091 +Ave special neighs/atom = 9.9090909 +Neighbor list builds = 28 +Dangerous builds = 0 + +# write_restart restart_longrun +# write_data restart_longrun.data +Total wall time: 0:00:00 diff --git a/examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.stabilized.g++.1 b/examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.stabilized.g++.1 deleted file mode 100644 index de1167c652..0000000000 --- a/examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.stabilized.g++.1 +++ /dev/null @@ -1,148 +0,0 @@ -LAMMPS (5 Jun 2019) -Reading data file ... - orthogonal box = (-25 -25 -25) to (25 25 25) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 44 atoms - reading velocities ... - 44 velocities - scanning bonds ... - 9 = max bonds/atom - scanning angles ... - 21 = max angles/atom - scanning dihedrals ... - 29 = max dihedrals/atom - scanning impropers ... - 29 = max impropers/atom - reading bonds ... - 42 bonds - reading angles ... - 74 angles - reading dihedrals ... - 100 dihedrals - reading impropers ... - 44 impropers -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 4 = max # of 1-2 neighbors - 6 = max # of 1-3 neighbors - 12 = max # of 1-4 neighbors - 41 = max # of special neighbors - special bonds CPU = 0.000181113 secs - read_data CPU = 0.0251833 secs -Read molecule mol1: - 18 atoms with max type 8 - 16 bonds with max type 14 - 25 angles with max type 28 - 23 dihedrals with max type 36 - 14 impropers with max type 11 -Read molecule mol2: - 18 atoms with max type 9 - 17 bonds with max type 13 - 31 angles with max type 27 - 39 dihedrals with max type 33 - 20 impropers with max type 1 -Read molecule mol3: - 15 atoms with max type 9 - 14 bonds with max type 13 - 25 angles with max type 27 - 30 dihedrals with max type 33 - 16 impropers with max type 1 -Read molecule mol4: - 15 atoms with max type 11 - 13 bonds with max type 15 - 19 angles with max type 29 - 16 dihedrals with max type 32 - 10 impropers with max type 13 -WARNING: Bond/react: Atom affected by reaction rxn1 too close to template edge (../fix_bond_react.cpp:1785) -WARNING: Bond/react: Atom affected by reaction rxn2 too close to template edge (../fix_bond_react.cpp:1785) -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp_REACT defined -PPPM initialization ... - using 12-bit tables for long-range coulomb (../kspace.cpp:319) - G vector (1/distance) = 0.0534597 - grid = 2 2 2 - stencil order = 5 - estimated absolute RMS force accuracy = 0.0402256 - estimated relative force accuracy = 0.000121138 - using double precision FFTs - 3d grid and FFT values/proc = 343 8 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10.5 - ghost atom cutoff = 10.5 - binsize = 5.25, bins = 10 10 10 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 -WARNING: Inconsistent image flags (../domain.cpp:784) -Per MPI rank memory allocation (min/avg/max) = 34.41 | 34.41 | 34.41 Mbytes -Step Temp Press Density f_myrxns[1] f_myrxns[2] - 0 300 346.78165 0.0034851739 0 0 - 50 293.70542 -52.547388 0.0034851739 1 0 - 100 276.36755 54.81826 0.0034851739 1 1 - 150 448.65869 16.874435 0.0034851739 1 1 - 200 379.84257 11.578545 0.0034851739 1 1 - 250 298.21983 90.656585 0.0034851739 1 1 - 300 333.3111 -30.139607 0.0034851739 1 1 - 350 266.57108 6.4505134 0.0034851739 1 1 - 400 264.05476 10.513204 0.0034851739 1 1 - 450 250.70418 -18.635379 0.0034851739 1 1 - 500 261.21632 10.231013 0.0034851739 1 1 - 550 309.89024 -8.8299506 0.0034851739 1 1 - 600 373.45851 30.368993 0.0034851739 1 1 - 650 338.26242 9.0362267 0.0034851739 1 1 - 700 295.67794 -5.6007538 0.0034851739 1 1 - 750 310.86563 -59.228181 0.0034851739 1 1 - 800 286.22678 -9.9022407 0.0034851739 1 1 - 850 218.42135 27.845352 0.0034851739 1 1 - 900 259.62551 24.216336 0.0034851739 1 1 - 950 250.21307 -14.560985 0.0034851739 1 1 - 1000 274.29245 -0.38768626 0.0034851739 1 1 -Loop time of 0.341061 on 1 procs for 1000 steps with 44 atoms - -Performance: 253.327 ns/day, 0.095 hours/ns, 2932.025 timesteps/s -87.9% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.031135 | 0.031135 | 0.031135 | 0.0 | 9.13 -Bond | 0.12623 | 0.12623 | 0.12623 | 0.0 | 37.01 -Kspace | 0.036491 | 0.036491 | 0.036491 | 0.0 | 10.70 -Neigh | 0.046395 | 0.046395 | 0.046395 | 0.0 | 13.60 -Comm | 0.0025396 | 0.0025396 | 0.0025396 | 0.0 | 0.74 -Output | 0.07775 | 0.07775 | 0.07775 | 0.0 | 22.80 -Modify | 0.019219 | 0.019219 | 0.019219 | 0.0 | 5.64 -Other | | 0.001306 | | | 0.38 - -Nlocal: 44 ave 44 max 44 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 2 ave 2 max 2 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 740 ave 740 max 740 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 740 -Ave neighs/atom = 16.8182 -Ave special neighs/atom = 9.77273 -Neighbor list builds = 1000 -Dangerous builds = 0 - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:00 diff --git a/examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.stabilized.g++.4 b/examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.stabilized.g++.4 deleted file mode 100644 index b9c7a3ba15..0000000000 --- a/examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.stabilized.g++.4 +++ /dev/null @@ -1,148 +0,0 @@ -LAMMPS (5 Jun 2019) -Reading data file ... - orthogonal box = (-25 -25 -25) to (25 25 25) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 44 atoms - reading velocities ... - 44 velocities - scanning bonds ... - 9 = max bonds/atom - scanning angles ... - 21 = max angles/atom - scanning dihedrals ... - 29 = max dihedrals/atom - scanning impropers ... - 29 = max impropers/atom - reading bonds ... - 42 bonds - reading angles ... - 74 angles - reading dihedrals ... - 100 dihedrals - reading impropers ... - 44 impropers -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 4 = max # of 1-2 neighbors - 6 = max # of 1-3 neighbors - 12 = max # of 1-4 neighbors - 41 = max # of special neighbors - special bonds CPU = 0.000178751 secs - read_data CPU = 0.0385782 secs -Read molecule mol1: - 18 atoms with max type 8 - 16 bonds with max type 14 - 25 angles with max type 28 - 23 dihedrals with max type 36 - 14 impropers with max type 11 -Read molecule mol2: - 18 atoms with max type 9 - 17 bonds with max type 13 - 31 angles with max type 27 - 39 dihedrals with max type 33 - 20 impropers with max type 1 -Read molecule mol3: - 15 atoms with max type 9 - 14 bonds with max type 13 - 25 angles with max type 27 - 30 dihedrals with max type 33 - 16 impropers with max type 1 -Read molecule mol4: - 15 atoms with max type 11 - 13 bonds with max type 15 - 19 angles with max type 29 - 16 dihedrals with max type 32 - 10 impropers with max type 13 -WARNING: Bond/react: Atom affected by reaction rxn1 too close to template edge (../fix_bond_react.cpp:1785) -WARNING: Bond/react: Atom affected by reaction rxn2 too close to template edge (../fix_bond_react.cpp:1785) -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp_REACT defined -PPPM initialization ... - using 12-bit tables for long-range coulomb (../kspace.cpp:319) - G vector (1/distance) = 0.0534597 - grid = 2 2 2 - stencil order = 5 - estimated absolute RMS force accuracy = 0.0402256 - estimated relative force accuracy = 0.000121138 - using double precision FFTs - 3d grid and FFT values/proc = 252 2 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10.5 - ghost atom cutoff = 10.5 - binsize = 5.25, bins = 10 10 10 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 -WARNING: Inconsistent image flags (../domain.cpp:784) -Per MPI rank memory allocation (min/avg/max) = 34.42 | 34.77 | 35.45 Mbytes -Step Temp Press Density f_myrxns[1] f_myrxns[2] - 0 300 346.78165 0.0034851739 0 0 - 50 293.70542 -52.547388 0.0034851739 1 0 - 100 276.36755 54.81826 0.0034851739 1 1 - 150 448.65869 16.874435 0.0034851739 1 1 - 200 379.84257 11.578545 0.0034851739 1 1 - 250 298.21983 90.656585 0.0034851739 1 1 - 300 333.3111 -30.139607 0.0034851739 1 1 - 350 266.57108 6.4505134 0.0034851739 1 1 - 400 264.05476 10.513204 0.0034851739 1 1 - 450 250.70418 -18.635379 0.0034851739 1 1 - 500 261.21632 10.231013 0.0034851739 1 1 - 550 309.89024 -8.8299506 0.0034851739 1 1 - 600 373.45851 30.368993 0.0034851739 1 1 - 650 338.26242 9.0362267 0.0034851739 1 1 - 700 295.67794 -5.6007538 0.0034851739 1 1 - 750 310.86563 -59.228181 0.0034851739 1 1 - 800 286.22678 -9.9022407 0.0034851739 1 1 - 850 218.42135 27.845352 0.0034851739 1 1 - 900 259.62551 24.216336 0.0034851739 1 1 - 950 250.21307 -14.560985 0.0034851739 1 1 - 1000 274.29245 -0.38768626 0.0034851739 1 1 -Loop time of 0.271242 on 4 procs for 1000 steps with 44 atoms - -Performance: 318.535 ns/day, 0.075 hours/ns, 3686.747 timesteps/s -98.6% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.00023773 | 0.0077322 | 0.016042 | 8.4 | 2.85 -Bond | 0.00073385 | 0.032108 | 0.08446 | 19.4 | 11.84 -Kspace | 0.041659 | 0.098095 | 0.13373 | 12.3 | 36.16 -Neigh | 0.028894 | 0.029247 | 0.029558 | 0.1 | 10.78 -Comm | 0.012367 | 0.013642 | 0.01503 | 0.9 | 5.03 -Output | 0.032475 | 0.040504 | 0.061019 | 5.9 | 14.93 -Modify | 0.032934 | 0.049086 | 0.0577 | 4.3 | 18.10 -Other | | 0.0008281 | | | 0.31 - -Nlocal: 11 ave 21 max 0 min -Histogram: 1 1 0 0 0 0 0 0 0 2 -Nghost: 32.5 ave 43 max 23 min -Histogram: 2 0 0 0 0 0 0 0 0 2 -Neighs: 185 ave 376 max 0 min -Histogram: 2 0 0 0 0 0 0 0 0 2 - -Total # of neighbors = 740 -Ave neighs/atom = 16.8182 -Ave special neighs/atom = 9.77273 -Neighbor list builds = 1000 -Dangerous builds = 0 - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:00 diff --git a/examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.unstabilized.g++.1 b/examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.unstabilized.g++.1 deleted file mode 100644 index 14cac1dfad..0000000000 --- a/examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.unstabilized.g++.1 +++ /dev/null @@ -1,147 +0,0 @@ -LAMMPS (5 Jun 2019) -Reading data file ... - orthogonal box = (-25 -25 -25) to (25 25 25) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 44 atoms - reading velocities ... - 44 velocities - scanning bonds ... - 9 = max bonds/atom - scanning angles ... - 21 = max angles/atom - scanning dihedrals ... - 29 = max dihedrals/atom - scanning impropers ... - 29 = max impropers/atom - reading bonds ... - 42 bonds - reading angles ... - 74 angles - reading dihedrals ... - 100 dihedrals - reading impropers ... - 44 impropers -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 4 = max # of 1-2 neighbors - 6 = max # of 1-3 neighbors - 12 = max # of 1-4 neighbors - 41 = max # of special neighbors - special bonds CPU = 0.000217102 secs - read_data CPU = 0.00630778 secs -Read molecule mol1: - 18 atoms with max type 8 - 16 bonds with max type 14 - 25 angles with max type 28 - 23 dihedrals with max type 36 - 14 impropers with max type 11 -Read molecule mol2: - 18 atoms with max type 9 - 17 bonds with max type 13 - 31 angles with max type 27 - 39 dihedrals with max type 33 - 20 impropers with max type 1 -Read molecule mol3: - 15 atoms with max type 9 - 14 bonds with max type 13 - 25 angles with max type 27 - 30 dihedrals with max type 33 - 16 impropers with max type 1 -Read molecule mol4: - 15 atoms with max type 11 - 13 bonds with max type 15 - 19 angles with max type 29 - 16 dihedrals with max type 32 - 10 impropers with max type 13 -WARNING: Bond/react: Atom affected by reaction rxn1 too close to template edge (../fix_bond_react.cpp:1785) -WARNING: Bond/react: Atom affected by reaction rxn2 too close to template edge (../fix_bond_react.cpp:1785) -dynamic group bond_react_MASTER_group defined -PPPM initialization ... - using 12-bit tables for long-range coulomb (../kspace.cpp:319) - G vector (1/distance) = 0.0534597 - grid = 2 2 2 - stencil order = 5 - estimated absolute RMS force accuracy = 0.0402256 - estimated relative force accuracy = 0.000121138 - using double precision FFTs - 3d grid and FFT values/proc = 343 8 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10.5 - ghost atom cutoff = 10.5 - binsize = 5.25, bins = 10 10 10 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 -WARNING: Inconsistent image flags (../domain.cpp:784) -Per MPI rank memory allocation (min/avg/max) = 34.35 | 34.35 | 34.35 Mbytes -Step Temp Press Density f_myrxns[1] f_myrxns[2] - 0 300 346.78165 0.0034851739 0 0 - 50 416.49412 -20.293038 0.0034851739 1 0 - 100 746.49323 91.912227 0.0034851739 1 1 - 150 515.15907 -1.4024709 0.0034851739 1 1 - 200 441.14572 -19.333087 0.0034851739 1 1 - 250 376.40996 30.717679 0.0034851739 1 1 - 300 326.15127 -3.0433799 0.0034851739 1 1 - 350 326.21116 6.235391 0.0034851739 1 1 - 400 366.48556 3.9807338 0.0034851739 1 1 - 450 313.79097 7.6674629 0.0034851739 1 1 - 500 278.89836 14.102052 0.0034851739 1 1 - 550 267.50214 18.241417 0.0034851739 1 1 - 600 276.28064 7.4649611 0.0034851739 1 1 - 650 255.26713 -8.5258573 0.0034851739 1 1 - 700 258.59752 -5.3341215 0.0034851739 1 1 - 750 263.71264 33.369869 0.0034851739 1 1 - 800 246.22976 -15.349137 0.0034851739 1 1 - 850 255.93887 16.331669 0.0034851739 1 1 - 900 239.72525 -0.20075789 0.0034851739 1 1 - 950 213.73064 12.17619 0.0034851739 1 1 - 1000 218.25094 -9.0955642 0.0034851739 1 1 -Loop time of 0.348252 on 1 procs for 1000 steps with 44 atoms - -Performance: 248.096 ns/day, 0.097 hours/ns, 2871.483 timesteps/s -91.8% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.031941 | 0.031941 | 0.031941 | 0.0 | 9.17 -Bond | 0.13031 | 0.13031 | 0.13031 | 0.0 | 37.42 -Kspace | 0.037554 | 0.037554 | 0.037554 | 0.0 | 10.78 -Neigh | 0.047397 | 0.047397 | 0.047397 | 0.0 | 13.61 -Comm | 0.0025814 | 0.0025814 | 0.0025814 | 0.0 | 0.74 -Output | 0.083526 | 0.083526 | 0.083526 | 0.0 | 23.98 -Modify | 0.013602 | 0.013602 | 0.013602 | 0.0 | 3.91 -Other | | 0.001336 | | | 0.38 - -Nlocal: 44 ave 44 max 44 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 3 ave 3 max 3 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 818 ave 818 max 818 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 818 -Ave neighs/atom = 18.5909 -Ave special neighs/atom = 9.77273 -Neighbor list builds = 1000 -Dangerous builds = 0 - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:00 diff --git a/examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.unstabilized.g++.4 b/examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.unstabilized.g++.4 deleted file mode 100644 index 6b13dd60d3..0000000000 --- a/examples/PACKAGES/reaction/tiny_nylon/log.5Jun19.tiny_nylon.unstabilized.g++.4 +++ /dev/null @@ -1,147 +0,0 @@ -LAMMPS (5 Jun 2019) -Reading data file ... - orthogonal box = (-25 -25 -25) to (25 25 25) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 44 atoms - reading velocities ... - 44 velocities - scanning bonds ... - 9 = max bonds/atom - scanning angles ... - 21 = max angles/atom - scanning dihedrals ... - 29 = max dihedrals/atom - scanning impropers ... - 29 = max impropers/atom - reading bonds ... - 42 bonds - reading angles ... - 74 angles - reading dihedrals ... - 100 dihedrals - reading impropers ... - 44 impropers -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 4 = max # of 1-2 neighbors - 6 = max # of 1-3 neighbors - 12 = max # of 1-4 neighbors - 41 = max # of special neighbors - special bonds CPU = 0.000163256 secs - read_data CPU = 0.0244579 secs -Read molecule mol1: - 18 atoms with max type 8 - 16 bonds with max type 14 - 25 angles with max type 28 - 23 dihedrals with max type 36 - 14 impropers with max type 11 -Read molecule mol2: - 18 atoms with max type 9 - 17 bonds with max type 13 - 31 angles with max type 27 - 39 dihedrals with max type 33 - 20 impropers with max type 1 -Read molecule mol3: - 15 atoms with max type 9 - 14 bonds with max type 13 - 25 angles with max type 27 - 30 dihedrals with max type 33 - 16 impropers with max type 1 -Read molecule mol4: - 15 atoms with max type 11 - 13 bonds with max type 15 - 19 angles with max type 29 - 16 dihedrals with max type 32 - 10 impropers with max type 13 -WARNING: Bond/react: Atom affected by reaction rxn1 too close to template edge (../fix_bond_react.cpp:1785) -WARNING: Bond/react: Atom affected by reaction rxn2 too close to template edge (../fix_bond_react.cpp:1785) -dynamic group bond_react_MASTER_group defined -PPPM initialization ... - using 12-bit tables for long-range coulomb (../kspace.cpp:319) - G vector (1/distance) = 0.0534597 - grid = 2 2 2 - stencil order = 5 - estimated absolute RMS force accuracy = 0.0402256 - estimated relative force accuracy = 0.000121138 - using double precision FFTs - 3d grid and FFT values/proc = 252 2 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10.5 - ghost atom cutoff = 10.5 - binsize = 5.25, bins = 10 10 10 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 -WARNING: Inconsistent image flags (../domain.cpp:784) -Per MPI rank memory allocation (min/avg/max) = 33.34 | 33.69 | 34.37 Mbytes -Step Temp Press Density f_myrxns[1] f_myrxns[2] - 0 300 346.78165 0.0034851739 0 0 - 50 416.49412 -20.293038 0.0034851739 1 0 - 100 746.49323 91.912227 0.0034851739 1 1 - 150 515.15907 -1.4024709 0.0034851739 1 1 - 200 441.14572 -19.333087 0.0034851739 1 1 - 250 376.40996 30.717679 0.0034851739 1 1 - 300 326.15127 -3.0433799 0.0034851739 1 1 - 350 326.21116 6.235391 0.0034851739 1 1 - 400 366.48556 3.9807338 0.0034851739 1 1 - 450 313.79097 7.6674629 0.0034851739 1 1 - 500 278.89836 14.102052 0.0034851739 1 1 - 550 267.50214 18.241417 0.0034851739 1 1 - 600 276.28064 7.4649611 0.0034851739 1 1 - 650 255.26713 -8.5258573 0.0034851739 1 1 - 700 258.59752 -5.3341215 0.0034851739 1 1 - 750 263.71264 33.369869 0.0034851739 1 1 - 800 246.22976 -15.349137 0.0034851739 1 1 - 850 255.93887 16.331669 0.0034851739 1 1 - 900 239.72525 -0.20075789 0.0034851739 1 1 - 950 213.73064 12.17619 0.0034851739 1 1 - 1000 218.25094 -9.0955642 0.0034851739 1 1 -Loop time of 0.254903 on 4 procs for 1000 steps with 44 atoms - -Performance: 338.952 ns/day, 0.071 hours/ns, 3923.053 timesteps/s -99.8% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.00014252 | 0.0090715 | 0.021332 | 9.6 | 3.56 -Bond | 0.00047028 | 0.037261 | 0.10789 | 22.7 | 14.62 -Kspace | 0.051006 | 0.12756 | 0.1693 | 13.6 | 50.04 -Neigh | 0.035644 | 0.036088 | 0.036523 | 0.2 | 14.16 -Comm | 0.013984 | 0.016074 | 0.018676 | 1.6 | 6.31 -Output | 0.0002816 | 0.00033726 | 0.00044251 | 0.0 | 0.13 -Modify | 0.023697 | 0.027803 | 0.033552 | 2.5 | 10.91 -Other | | 0.0007123 | | | 0.28 - -Nlocal: 11 ave 29 max 0 min -Histogram: 1 1 0 0 1 0 0 0 0 1 -Nghost: 25 ave 31 max 12 min -Histogram: 1 0 0 0 0 0 0 0 2 1 -Neighs: 204.5 ave 443 max 0 min -Histogram: 2 0 0 0 0 0 0 0 1 1 - -Total # of neighbors = 818 -Ave neighs/atom = 18.5909 -Ave special neighs/atom = 9.77273 -Neighbor list builds = 1000 -Dangerous builds = 0 - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:00 diff --git a/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_reacted.data_template b/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_reacted.data_template deleted file mode 100644 index d7256f43d2..0000000000 --- a/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_reacted.data_template +++ /dev/null @@ -1,189 +0,0 @@ -this is a molecule template for: initial nylon crosslink, post-reacting - -18 atoms -17 bonds -31 angles -39 dihedrals -20 impropers - -Types - -1 9 -2 1 -3 1 -4 8 -5 8 -6 4 -7 4 -8 1 -9 1 -10 2 -11 6 -12 3 -13 4 -14 4 -15 5 -16 1 -17 4 -18 4 - -Charges - -1 -0.300000 -2 0.000000 -3 0.000000 -4 0.000000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.300000 -11 0.000000 -12 0.000000 -13 0.000000 -14 0.000000 -15 0.000000 -16 0.000000 -17 0.000000 -18 0.000000 - -Coords - -1 -5.522237 -0.752722 1.631158 -2 -5.170398 -0.545733 0.178130 -3 -6.469695 -0.553072 -0.648889 -4 -6.052076 -1.721152 1.744648 -5 -6.183059 0.071387 1.971497 -6 -4.489340 -1.389197 -0.173156 -7 -4.637591 0.453703 0.051252 -8 -5.618658 0.138919 4.386107 -9 -4.669492 -0.989819 3.943591 -10 -4.270194 -0.766405 2.474102 -11 -3.348470 -1.875393 2.024289 -12 -3.569794 0.564183 2.345995 -13 -5.201079 -1.993301 4.044219 -14 -3.736682 -0.984819 4.598305 -15 -4.255402 1.370923 2.679069 -16 -6.136394 -0.339866 -2.136775 -17 -6.996331 -1.555519 -0.517408 -18 -7.153308 0.284949 -0.289930 - -Bonds - -1 11 1 2 -2 12 1 4 -3 12 1 5 -4 13 1 10 -5 2 2 3 -6 1 2 6 -7 1 2 7 -8 2 3 16 -9 1 3 17 -10 1 3 18 -11 2 8 9 -12 4 9 10 -13 1 9 13 -14 1 9 14 -15 5 10 11 -16 3 10 12 -17 6 12 15 - -Angles - -1 17 2 1 4 -2 17 2 1 5 -3 18 2 1 10 -4 19 4 1 5 -5 20 4 1 10 -6 20 5 1 10 -7 21 1 2 3 -8 22 1 2 6 -9 22 1 2 7 -10 2 3 2 6 -11 2 3 2 7 -12 1 6 2 7 -13 3 2 3 16 -14 2 2 3 17 -15 2 2 3 18 -16 2 16 3 17 -17 2 16 3 18 -18 1 17 3 18 -19 8 8 9 10 -20 2 8 9 13 -21 2 8 9 14 -22 23 13 9 10 -23 23 14 9 10 -24 1 13 9 14 -25 6 9 10 11 -26 4 9 10 12 -27 24 1 10 9 -28 25 11 10 12 -29 26 1 10 11 -30 27 1 10 12 -31 7 10 12 15 - -Dihedrals - -1 19 4 1 2 3 -2 20 4 1 2 6 -3 20 4 1 2 7 -4 19 5 1 2 3 -5 20 5 1 2 6 -6 20 5 1 2 7 -7 21 10 1 2 3 -8 22 10 1 2 6 -9 22 10 1 2 7 -10 23 2 1 10 9 -11 24 2 1 10 11 -12 25 2 1 10 12 -13 26 4 1 10 9 -14 27 4 1 10 11 -15 28 4 1 10 12 -16 26 5 1 10 9 -17 27 5 1 10 11 -18 28 5 1 10 12 -19 29 1 2 3 16 -20 30 1 2 3 17 -21 30 1 2 3 18 -22 4 16 3 2 6 -23 2 6 2 3 17 -24 2 6 2 3 18 -25 4 16 3 2 7 -26 2 7 2 3 17 -27 2 7 2 3 18 -28 10 8 9 10 11 -29 8 8 9 10 12 -30 31 8 9 10 1 -31 11 13 9 10 11 -32 9 13 9 10 12 -33 32 13 9 10 1 -34 11 14 9 10 11 -35 9 14 9 10 12 -36 32 14 9 10 1 -37 6 9 10 12 15 -38 7 11 10 12 15 -39 33 1 10 12 15 - -Impropers - -1 1 2 1 4 5 -2 1 2 1 4 10 -3 1 2 1 5 10 -4 1 4 1 5 10 -5 1 1 2 3 6 -6 1 1 2 3 7 -7 1 1 2 6 7 -8 1 3 2 6 7 -9 1 2 3 16 17 -10 1 2 3 16 18 -11 1 2 3 17 18 -12 1 16 3 17 18 -13 1 8 9 13 10 -14 1 8 9 14 10 -15 1 8 9 13 14 -16 1 13 9 14 10 -17 1 9 10 11 12 -18 1 1 10 9 11 -19 1 1 10 9 12 -20 1 1 10 11 12 diff --git a/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_reacted.molecule_template b/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_reacted.molecule_template new file mode 100644 index 0000000000..40f3aa8276 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_reacted.molecule_template @@ -0,0 +1,187 @@ +this is a molecule template for: initial nylon crosslink, post-reacting + + 18 atoms + 17 bonds + 31 angles + 39 dihedrals + 0 impropers + +Coords + + 1 -5.522237178 -0.752722499 1.631158408 + 2 -5.170398325 -0.545733378 0.178129978 + 3 -6.469694974 -0.553071841 -0.648889109 + 4 -6.052075697 -1.721152483 1.744647858 + 5 -6.183058842 0.071386755 1.971497329 + 6 -4.489339595 -1.389196844 -0.173156276 + 7 -4.637590712 0.453703382 0.051251954 + 8 -5.618657658 0.138918810 4.386106928 + 9 -4.669491736 -0.989818781 3.943591338 + 10 -4.270193542 -0.766405234 2.474102239 + 11 -3.348470373 -1.875393291 2.024289246 + 12 -3.569793683 0.564183226 2.345995471 + 13 -5.201078949 -1.993301389 4.044218837 + 14 -3.736681607 -0.984819193 4.598304847 + 15 -4.255401979 1.370923174 2.679069013 + 16 -6.136393628 -0.339866195 -2.136774990 + 17 -6.996331494 -1.555519161 -0.517408063 + 18 -7.153308038 0.284949373 -0.289930394 + +Types + + 1 n + 2 c2 + 3 c2 + 4 hn + 5 hn + 6 hc + 7 hc + 8 c2 + 9 c2 + 10 c_1 + 11 o_1 + 12 o + 13 hc + 14 hc + 15 ho + 16 c2 + 17 hc + 18 hc + +Charges + + 1 -0.300000 + 2 0.000000 + 3 0.000000 + 4 0.000000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.300000 + 11 0.000000 + 12 0.000000 + 13 0.000000 + 14 0.000000 + 15 0.000000 + 16 0.000000 + 17 0.000000 + 18 0.000000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + +Bonds + + 1 n-c2 1 2 + 2 n-hn 1 4 + 3 n-hn 1 5 + 4 n-c_1 1 10 + 5 c2-c2 2 3 + 6 c2-hc 2 6 + 7 c2-hc 2 7 + 8 c2-c2 3 16 + 9 c2-hc 3 17 + 10 c2-hc 3 18 + 11 c2-c2 8 9 + 12 c2-c_1 9 10 + 13 c2-hc 9 13 + 14 c2-hc 9 14 + 15 c_1-o_1 10 11 + 16 c_1-o 10 12 + 17 o-ho 12 15 + +Angles + + 1 c2-n-hn 2 1 4 + 2 c2-n-hn 2 1 5 + 3 c2-n-c_1 2 1 10 + 4 hn-n-hn 4 1 5 + 5 hn-n-c_1 4 1 10 + 6 hn-n-c_1 5 1 10 + 7 n-c2-c2 1 2 3 + 8 n-c2-hc 1 2 6 + 9 n-c2-hc 1 2 7 + 10 c2-c2-hc 3 2 6 + 11 c2-c2-hc 3 2 7 + 12 hc-c2-hc 6 2 7 + 13 c2-c2-c2 2 3 16 + 14 c2-c2-hc 2 3 17 + 15 c2-c2-hc 2 3 18 + 16 c2-c2-hc 16 3 17 + 17 c2-c2-hc 16 3 18 + 18 hc-c2-hc 17 3 18 + 19 c2-c2-c_1 8 9 10 + 20 c2-c2-hc 8 9 13 + 21 c2-c2-hc 8 9 14 + 22 hc-c2-c_1 13 9 10 + 23 hc-c2-c_1 14 9 10 + 24 hc-c2-hc 13 9 14 + 25 c2-c_1-o_1 9 10 11 + 26 c2-c_1-o 9 10 12 + 27 n-c_1-c2 1 10 9 + 28 o_1-c_1-o 11 10 12 + 29 n-c_1-o_1 1 10 11 + 30 n-c_1-o 1 10 12 + 31 c_1-o-ho 10 12 15 + +Dihedrals + + 1 hn-n-c2-c2 4 1 2 3 + 2 hn-n-c2-hc 4 1 2 6 + 3 hn-n-c2-hc 4 1 2 7 + 4 hn-n-c2-c2 5 1 2 3 + 5 hn-n-c2-hc 5 1 2 6 + 6 hn-n-c2-hc 5 1 2 7 + 7 c_1-n-c2-c2 10 1 2 3 + 8 c_1-n-c2-hc 10 1 2 6 + 9 c_1-n-c2-hc 10 1 2 7 + 10 c2-n-c_1-c2 2 1 10 9 + 11 c2-n-c_1-o_1 2 1 10 11 + 12 c2-n-c_1-o 2 1 10 12 + 13 hn-n-c_1-c2 4 1 10 9 + 14 hn-n-c_1-o_1 4 1 10 11 + 15 hn-n-c_1-o 4 1 10 12 + 16 hn-n-c_1-c2 5 1 10 9 + 17 hn-n-c_1-o_1 5 1 10 11 + 18 hn-n-c_1-o 5 1 10 12 + 19 n-c2-c2-c2 1 2 3 16 + 20 n-c2-c2-hc 1 2 3 17 + 21 n-c2-c2-hc 1 2 3 18 + 22 c2-c2-c2-hc 16 3 2 6 + 23 hc-c2-c2-hc 6 2 3 17 + 24 hc-c2-c2-hc 6 2 3 18 + 25 c2-c2-c2-hc 16 3 2 7 + 26 hc-c2-c2-hc 7 2 3 17 + 27 hc-c2-c2-hc 7 2 3 18 + 28 c2-c2-c_1-o_1 8 9 10 11 + 29 c2-c2-c_1-o 8 9 10 12 + 30 c2-c2-c_1-n 8 9 10 1 + 31 hc-c2-c_1-o_1 13 9 10 11 + 32 hc-c2-c_1-o 13 9 10 12 + 33 hc-c2-c_1-n 13 9 10 1 + 34 hc-c2-c_1-o_1 14 9 10 11 + 35 hc-c2-c_1-o 14 9 10 12 + 36 hc-c2-c_1-n 14 9 10 1 + 37 c2-c_1-o-ho 9 10 12 15 + 38 o_1-c_1-o-ho 11 10 12 15 + 39 n-c_1-o-ho 1 10 12 15 diff --git a/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_unreacted.data_template b/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_unreacted.data_template deleted file mode 100644 index ec3f109d7b..0000000000 --- a/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_unreacted.data_template +++ /dev/null @@ -1,160 +0,0 @@ -this is a molecule template for: initial nylon crosslink, pre-reacting - -18 atoms -16 bonds -25 angles -23 dihedrals -14 impropers - -Types - -1 7 -2 1 -3 1 -4 8 -5 8 -6 4 -7 4 -8 1 -9 1 -10 2 -11 6 -12 3 -13 4 -14 4 -15 5 -16 1 -17 4 -18 4 - -Charges - -1 -0.300000 -2 0.000000 -3 0.000000 -4 0.000000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.300000 -11 0.000000 -12 0.000000 -13 0.000000 -14 0.000000 -15 0.000000 -16 0.000000 -17 0.000000 -18 0.000000 - -Coords - -1 -4.922858 -0.946982 1.146055 -2 -5.047195 -0.935267 -0.358173 -3 -6.526281 -0.755366 -0.743523 -4 -5.282604 0.020447 1.552710 -5 -3.860697 -1.095850 1.428305 -6 -4.662382 -1.920900 -0.781524 -7 -4.433977 -0.072765 -0.784071 -8 -5.506279 0.202610 4.825816 -9 -4.449177 -0.844592 4.423366 -10 -4.103916 -0.749629 2.925195 -11 -3.376249 -1.886171 2.245643 -12 -4.493235 0.477214 2.137199 -13 -4.849053 -1.888877 4.663994 -14 -3.491823 -0.662913 5.018510 -15 -5.020777 1.189745 2.805427 -16 -3.964987 2.900602 -1.551341 -17 -4.460694 2.836102 0.668882 -18 -4.828494 3.219656 -0.122111 - -Bonds - -1 14 1 2 -2 10 1 4 -3 10 1 5 -4 2 2 3 -5 1 2 6 -6 1 2 7 -7 2 3 16 -8 1 3 17 -9 1 3 18 -10 2 8 9 -11 4 9 10 -12 1 9 13 -13 1 9 14 -14 5 10 11 -15 3 10 12 -16 6 12 15 - -Angles - -1 15 2 1 4 -2 15 2 1 5 -3 16 4 1 5 -4 28 1 2 3 -5 14 1 2 6 -6 14 1 2 7 -7 2 3 2 6 -8 2 3 2 7 -9 1 6 2 7 -10 3 2 3 16 -11 2 2 3 17 -12 2 2 3 18 -13 2 16 3 17 -14 2 16 3 18 -15 1 17 3 18 -16 8 8 9 10 -17 2 8 9 13 -18 2 8 9 14 -19 23 13 9 10 -20 23 14 9 10 -21 1 13 9 14 -22 6 9 10 11 -23 4 9 10 12 -24 25 11 10 12 -25 7 10 12 15 - -Dihedrals - -1 34 4 1 2 3 -2 35 4 1 2 6 -3 35 4 1 2 7 -4 34 5 1 2 3 -5 35 5 1 2 6 -6 35 5 1 2 7 -7 36 1 2 3 16 -8 12 1 2 3 17 -9 12 1 2 3 18 -10 4 16 3 2 6 -11 2 6 2 3 17 -12 2 6 2 3 18 -13 4 16 3 2 7 -14 2 7 2 3 17 -15 2 7 2 3 18 -16 10 8 9 10 11 -17 8 8 9 10 12 -18 11 13 9 10 11 -19 9 13 9 10 12 -20 11 14 9 10 11 -21 9 14 9 10 12 -22 6 9 10 12 15 -23 7 11 10 12 15 - -Impropers - -1 6 2 1 4 5 -2 11 9 10 11 12 -3 1 1 2 3 6 -4 1 1 2 3 7 -5 1 1 2 6 7 -6 1 3 2 6 7 -7 1 2 3 16 17 -8 1 2 3 16 18 -9 1 2 3 17 18 -10 1 16 3 17 18 -11 1 8 9 13 10 -12 1 8 9 14 10 -13 1 8 9 13 14 -14 1 13 9 14 10 diff --git a/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_unreacted.molecule_template b/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_unreacted.molecule_template new file mode 100644 index 0000000000..7de7512f1c --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp1_unreacted.molecule_template @@ -0,0 +1,169 @@ +this is a molecule template for: initial nylon crosslink, pre-reacting + + 18 atoms + 16 bonds + 25 angles + 23 dihedrals + 2 impropers + +Coords + + 1 -4.922858499 -0.946981747 1.146055346 + 2 -5.047194816 -0.935266843 -0.358172771 + 3 -6.526281447 -0.755365854 -0.743523227 + 4 -5.282604074 0.020446894 1.552710361 + 5 -3.860696509 -1.095850190 1.428304925 + 6 -4.662381862 -1.920899862 -0.781524026 + 7 -4.433976540 -0.072765142 -0.784070641 + 8 -5.506279186 0.202610302 4.825815562 + 9 -4.449176624 -0.844592213 4.423366146 + 10 -4.103915981 -0.749628655 2.925195217 + 11 -3.376248536 -1.886171498 2.245643443 + 12 -4.493235430 0.477213651 2.137199034 + 13 -4.849052953 -1.888876753 4.663993750 + 14 -3.491822950 -0.662913310 5.018510248 + 15 -5.020776528 1.189745133 2.805427194 + 16 -3.964987378 2.900602044 -1.551341170 + 17 -4.460693773 2.836101897 0.668881952 + 18 -4.828494000 3.219655862 -0.122111278 + +Types + + 1 na + 2 c2 + 3 c2 + 4 hn + 5 hn + 6 hc + 7 hc + 8 c2 + 9 c2 + 10 c_1 + 11 o_1 + 12 o + 13 hc + 14 hc + 15 ho + 16 c2 + 17 hc + 18 hc + +Charges + + 1 -0.300000 + 2 0.000000 + 3 0.000000 + 4 0.000000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.300000 + 11 0.000000 + 12 0.000000 + 13 0.000000 + 14 0.000000 + 15 0.000000 + 16 0.000000 + 17 0.000000 + 18 0.000000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + +Bonds + + 1 na-c2 1 2 + 2 na-hn 1 4 + 3 na-hn 1 5 + 4 c2-c2 2 3 + 5 c2-hc 2 6 + 6 c2-hc 2 7 + 7 c2-c2 3 16 + 8 c2-hc 3 17 + 9 c2-hc 3 18 + 10 c2-c2 8 9 + 11 c2-c_1 9 10 + 12 c2-hc 9 13 + 13 c2-hc 9 14 + 14 c_1-o_1 10 11 + 15 c_1-o 10 12 + 16 o-ho 12 15 + +Angles + + 1 c2-na-hn 2 1 4 + 2 c2-na-hn 2 1 5 + 3 hn-na-hn 4 1 5 + 4 na-c2-c2 1 2 3 + 5 na-c2-hc 1 2 6 + 6 na-c2-hc 1 2 7 + 7 c2-c2-hc 3 2 6 + 8 c2-c2-hc 3 2 7 + 9 hc-c2-hc 6 2 7 + 10 c2-c2-c2 2 3 16 + 11 c2-c2-hc 2 3 17 + 12 c2-c2-hc 2 3 18 + 13 c2-c2-hc 16 3 17 + 14 c2-c2-hc 16 3 18 + 15 hc-c2-hc 17 3 18 + 16 c2-c2-c_1 8 9 10 + 17 c2-c2-hc 8 9 13 + 18 c2-c2-hc 8 9 14 + 19 hc-c2-c_1 13 9 10 + 20 hc-c2-c_1 14 9 10 + 21 hc-c2-hc 13 9 14 + 22 c2-c_1-o_1 9 10 11 + 23 c2-c_1-o 9 10 12 + 24 o_1-c_1-o 11 10 12 + 25 c_1-o-ho 10 12 15 + +Dihedrals + + 1 hn-na-c2-c2 4 1 2 3 + 2 hn-na-c2-hc 4 1 2 6 + 3 hn-na-c2-hc 4 1 2 7 + 4 hn-na-c2-c2 5 1 2 3 + 5 hn-na-c2-hc 5 1 2 6 + 6 hn-na-c2-hc 5 1 2 7 + 7 na-c2-c2-c2 1 2 3 16 + 8 na-c2-c2-hc 1 2 3 17 + 9 na-c2-c2-hc 1 2 3 18 + 10 c2-c2-c2-hc 16 3 2 6 + 11 hc-c2-c2-hc 6 2 3 17 + 12 hc-c2-c2-hc 6 2 3 18 + 13 c2-c2-c2-hc 16 3 2 7 + 14 hc-c2-c2-hc 7 2 3 17 + 15 hc-c2-c2-hc 7 2 3 18 + 16 c2-c2-c_1-o_1 8 9 10 11 + 17 c2-c2-c_1-o 8 9 10 12 + 18 hc-c2-c_1-o_1 13 9 10 11 + 19 hc-c2-c_1-o 13 9 10 12 + 20 hc-c2-c_1-o_1 14 9 10 11 + 21 hc-c2-c_1-o 14 9 10 12 + 22 c2-c_1-o-ho 9 10 12 15 + 23 o_1-c_1-o-ho 11 10 12 15 + +Impropers + + 1 c2-na-hn-hn 2 1 4 5 + 2 c2-c_1-o_1-o 9 10 11 12 diff --git a/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_reacted.data_template b/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_reacted.data_template deleted file mode 100644 index 7853634646..0000000000 --- a/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_reacted.data_template +++ /dev/null @@ -1,131 +0,0 @@ -this is a molecule template for: water condensation, post-reacting - -15 atoms -13 bonds -19 angles -16 dihedrals -10 impropers - -Types - -1 9 -2 1 -3 1 -4 10 -5 8 -6 4 -7 4 -8 1 -9 1 -10 2 -11 6 -12 11 -13 4 -14 4 -15 10 - -Charges - -1 -0.300000 -2 0.000000 -3 0.000000 -4 0.410000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.300000 -11 0.000000 -12 -0.820000 -13 0.000000 -14 0.000000 -15 0.410000 - -Coords - -1 -4.856280 -1.050468 1.432625 -2 -5.047195 -0.935267 -0.358173 -3 -6.526281 -0.755366 -0.743523 -4 -5.282604 0.020447 1.552710 -5 -3.860697 -1.095850 1.428305 -6 -4.662382 -1.920900 -0.781524 -7 -4.433977 -0.072765 -0.784071 -8 -5.506279 0.202610 4.825816 -9 -4.449177 -0.844592 4.423366 -10 -4.103916 -0.749629 2.925195 -11 -3.376249 -1.886171 2.245643 -12 -4.493235 0.477214 2.137199 -13 -4.849053 -1.888877 4.663994 -14 -3.491823 -0.662913 5.018510 -15 -5.020777 1.189745 2.805427 - -Bonds - -1 11 1 2 -2 12 1 5 -3 13 1 10 -4 2 2 3 -5 1 2 6 -6 1 2 7 -7 15 4 12 -8 2 8 9 -9 4 9 10 -10 1 9 13 -11 1 9 14 -12 5 10 11 -13 15 15 12 - -Angles - -1 17 2 1 5 -2 18 2 1 10 -3 20 5 1 10 -4 21 1 2 3 -5 22 1 2 6 -6 22 1 2 7 -7 2 3 2 6 -8 2 3 2 7 -9 1 6 2 7 -10 8 8 9 10 -11 2 8 9 13 -12 2 8 9 14 -13 23 13 9 10 -14 23 14 9 10 -15 1 13 9 14 -16 6 9 10 11 -17 24 1 10 9 -18 26 1 10 11 -19 29 15 12 4 - -Dihedrals - -1 19 5 1 2 3 -2 20 5 1 2 6 -3 20 5 1 2 7 -4 21 10 1 2 3 -5 22 10 1 2 6 -6 22 10 1 2 7 -7 23 2 1 10 9 -8 24 2 1 10 11 -9 26 5 1 10 9 -10 27 5 1 10 11 -11 10 8 9 10 11 -12 31 8 9 10 1 -13 11 13 9 10 11 -14 32 13 9 10 1 -15 11 14 9 10 11 -16 32 14 9 10 1 - -Impropers - -1 12 2 1 5 10 -2 13 1 10 9 11 -3 1 1 2 3 6 -4 1 1 2 3 7 -5 1 1 2 6 7 -6 1 3 2 6 7 -7 1 8 9 13 10 -8 1 8 9 14 10 -9 1 8 9 13 14 -10 1 13 9 14 10 diff --git a/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_reacted.molecule_template b/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_reacted.molecule_template new file mode 100644 index 0000000000..2e91261468 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_reacted.molecule_template @@ -0,0 +1,141 @@ +this is a molecule template for: water condensation, post-reacting + + 15 atoms + 13 bonds + 19 angles + 16 dihedrals + 2 impropers + +Coords + + 1 -4.856280281 -1.050467974 1.432625159 + 2 -5.047194816 -0.935266843 -0.358172771 + 3 -6.526281447 -0.755365854 -0.743523227 + 4 -5.282604074 0.020446894 1.552710361 + 5 -3.860696509 -1.095850190 1.428304925 + 6 -4.662381862 -1.920899862 -0.781524026 + 7 -4.433976540 -0.072765142 -0.784070641 + 8 -5.506279186 0.202610302 4.825815562 + 9 -4.449176624 -0.844592213 4.423366146 + 10 -4.103915981 -0.749628655 2.925195217 + 11 -3.376248536 -1.886171498 2.245643443 + 12 -4.493235430 0.477213651 2.137199034 + 13 -4.849052953 -1.888876753 4.663993750 + 14 -3.491822950 -0.662913310 5.018510248 + 15 -5.020776528 1.189745133 2.805427194 + +Types + + 1 n + 2 c2 + 3 c2 + 4 hw + 5 hn + 6 hc + 7 hc + 8 c2 + 9 c2 + 10 c_1 + 11 o_1 + 12 o* + 13 hc + 14 hc + 15 hw + +Charges + + 1 -0.300000 + 2 0.000000 + 3 0.000000 + 4 0.410000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.300000 + 11 0.000000 + 12 -0.820000 + 13 0.000000 + 14 0.000000 + 15 0.410000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + +Bonds + + 1 n-c2 1 2 + 2 n-hn 1 5 + 3 n-c_1 1 10 + 4 c2-c2 2 3 + 5 c2-hc 2 6 + 6 c2-hc 2 7 + 7 hw-o* 4 12 + 8 c2-c2 8 9 + 9 c2-c_1 9 10 + 10 c2-hc 9 13 + 11 c2-hc 9 14 + 12 c_1-o_1 10 11 + 13 hw-o* 15 12 + +Angles + + 1 c2-n-hn 2 1 5 + 2 c2-n-c_1 2 1 10 + 3 hn-n-c_1 5 1 10 + 4 n-c2-c2 1 2 3 + 5 n-c2-hc 1 2 6 + 6 n-c2-hc 1 2 7 + 7 c2-c2-hc 3 2 6 + 8 c2-c2-hc 3 2 7 + 9 hc-c2-hc 6 2 7 + 10 c2-c2-c_1 8 9 10 + 11 c2-c2-hc 8 9 13 + 12 c2-c2-hc 8 9 14 + 13 hc-c2-c_1 13 9 10 + 14 hc-c2-c_1 14 9 10 + 15 hc-c2-hc 13 9 14 + 16 c2-c_1-o_1 9 10 11 + 17 n-c_1-c2 1 10 9 + 18 n-c_1-o_1 1 10 11 + 19 hw-o*-hw 15 12 4 + +Dihedrals + + 1 hn-n-c2-c2 5 1 2 3 + 2 hn-n-c2-hc 5 1 2 6 + 3 hn-n-c2-hc 5 1 2 7 + 4 c_1-n-c2-c2 10 1 2 3 + 5 c_1-n-c2-hc 10 1 2 6 + 6 c_1-n-c2-hc 10 1 2 7 + 7 c2-n-c_1-c2 2 1 10 9 + 8 c2-n-c_1-o_1 2 1 10 11 + 9 hn-n-c_1-c2 5 1 10 9 + 10 hn-n-c_1-o_1 5 1 10 11 + 11 c2-c2-c_1-o_1 8 9 10 11 + 12 c2-c2-c_1-n 8 9 10 1 + 13 hc-c2-c_1-o_1 13 9 10 11 + 14 hc-c2-c_1-n 13 9 10 1 + 15 hc-c2-c_1-o_1 14 9 10 11 + 16 hc-c2-c_1-n 14 9 10 1 + +Impropers + + 1 c2-n-hn-c_1 2 1 5 10 + 2 n-c_1-c2-o_1 1 10 9 11 diff --git a/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_unreacted.data_template b/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_unreacted.data_template deleted file mode 100644 index 847f0622e5..0000000000 --- a/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_unreacted.data_template +++ /dev/null @@ -1,158 +0,0 @@ -this is a molecule template for: water condensation, pre-reacting - -15 atoms -14 bonds -25 angles -30 dihedrals -16 impropers - -Types - -1 9 -2 1 -3 1 -4 8 -5 8 -6 4 -7 4 -8 1 -9 1 -10 2 -11 6 -12 3 -13 4 -14 4 -15 5 - -Charges - -1 -0.300000 -2 0.000000 -3 0.000000 -4 0.000000 -5 0.000000 -6 0.000000 -7 0.000000 -8 0.000000 -9 0.000000 -10 0.300000 -11 0.000000 -12 0.000000 -13 0.000000 -14 0.000000 -15 0.000000 - -Coords - -1 -4.922858 -0.946982 1.146055 -2 -5.047195 -0.935267 -0.358173 -3 -6.526281 -0.755366 -0.743523 -4 -5.282604 0.020447 1.552710 -5 -3.860697 -1.095850 1.428305 -6 -4.662382 -1.920900 -0.781524 -7 -4.433977 -0.072765 -0.784071 -8 -5.506279 0.202610 4.825816 -9 -4.449177 -0.844592 4.423366 -10 -4.103916 -0.749629 2.925195 -11 -3.376249 -1.886171 2.245643 -12 -4.493235 0.477214 2.137199 -13 -4.849053 -1.888877 4.663994 -14 -3.491823 -0.662913 5.018510 -15 -5.020777 1.189745 2.805427 - -Bonds - -1 11 1 2 -2 12 1 4 -3 12 1 5 -4 13 1 10 -5 2 2 3 -6 1 2 6 -7 1 2 7 -8 2 8 9 -9 4 9 10 -10 1 9 13 -11 1 9 14 -12 5 10 11 -13 3 10 12 -14 6 12 15 - -Angles - -1 17 2 1 4 -2 17 2 1 5 -3 18 2 1 10 -4 19 4 1 5 -5 20 4 1 10 -6 20 5 1 10 -7 21 1 2 3 -8 22 1 2 6 -9 22 1 2 7 -10 2 3 2 6 -11 2 3 2 7 -12 1 6 2 7 -13 8 8 9 10 -14 2 8 9 13 -15 2 8 9 14 -16 23 13 9 10 -17 23 14 9 10 -18 1 13 9 14 -19 6 9 10 11 -20 4 9 10 12 -21 24 1 10 9 -22 25 11 10 12 -23 26 1 10 11 -24 27 1 10 12 -25 7 10 12 15 - -Dihedrals - -1 19 4 1 2 3 -2 20 4 1 2 6 -3 20 4 1 2 7 -4 19 5 1 2 3 -5 20 5 1 2 6 -6 20 5 1 2 7 -7 21 10 1 2 3 -8 22 10 1 2 6 -9 22 10 1 2 7 -10 23 2 1 10 9 -11 24 2 1 10 11 -12 25 2 1 10 12 -13 26 4 1 10 9 -14 27 4 1 10 11 -15 28 4 1 10 12 -16 26 5 1 10 9 -17 27 5 1 10 11 -18 28 5 1 10 12 -19 10 8 9 10 11 -20 8 8 9 10 12 -21 31 8 9 10 1 -22 11 13 9 10 11 -23 9 13 9 10 12 -24 32 13 9 10 1 -25 11 14 9 10 11 -26 9 14 9 10 12 -27 32 14 9 10 1 -28 6 9 10 12 15 -29 7 11 10 12 15 -30 33 1 10 12 15 - -Impropers - -1 1 2 1 4 5 -2 1 2 1 4 10 -3 1 2 1 5 10 -4 1 4 1 5 10 -5 1 1 2 3 6 -6 1 1 2 3 7 -7 1 1 2 6 7 -8 1 3 2 6 7 -9 1 8 9 13 10 -10 1 8 9 14 10 -11 1 8 9 13 14 -12 1 13 9 14 10 -13 1 9 10 11 12 -14 1 1 10 9 11 -15 1 1 10 9 12 -16 1 1 10 11 12 diff --git a/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_unreacted.molecule_template b/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_unreacted.molecule_template new file mode 100644 index 0000000000..86a772634d --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_nylon/rxn1_stp2_unreacted.molecule_template @@ -0,0 +1,157 @@ +this is a molecule template for: water condensation, pre-reacting + + 15 atoms + 14 bonds + 25 angles + 30 dihedrals + 0 impropers + +Coords + + 1 -4.922858499 -0.946981747 1.146055346 + 2 -5.047194816 -0.935266843 -0.358172771 + 3 -6.526281447 -0.755365854 -0.743523227 + 4 -5.282604074 0.020446894 1.552710361 + 5 -3.860696509 -1.095850190 1.428304925 + 6 -4.662381862 -1.920899862 -0.781524026 + 7 -4.433976540 -0.072765142 -0.784070641 + 8 -5.506279186 0.202610302 4.825815562 + 9 -4.449176624 -0.844592213 4.423366146 + 10 -4.103915981 -0.749628655 2.925195217 + 11 -3.376248536 -1.886171498 2.245643443 + 12 -4.493235430 0.477213651 2.137199034 + 13 -4.849052953 -1.888876753 4.663993750 + 14 -3.491822950 -0.662913310 5.018510248 + 15 -5.020776528 1.189745133 2.805427194 + +Types + + 1 n + 2 c2 + 3 c2 + 4 hn + 5 hn + 6 hc + 7 hc + 8 c2 + 9 c2 + 10 c_1 + 11 o_1 + 12 o + 13 hc + 14 hc + 15 ho + +Charges + + 1 -0.300000 + 2 0.000000 + 3 0.000000 + 4 0.000000 + 5 0.000000 + 6 0.000000 + 7 0.000000 + 8 0.000000 + 9 0.000000 + 10 0.300000 + 11 0.000000 + 12 0.000000 + 13 0.000000 + 14 0.000000 + 15 0.000000 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + +Bonds + + 1 n-c2 1 2 + 2 n-hn 1 4 + 3 n-hn 1 5 + 4 n-c_1 1 10 + 5 c2-c2 2 3 + 6 c2-hc 2 6 + 7 c2-hc 2 7 + 8 c2-c2 8 9 + 9 c2-c_1 9 10 + 10 c2-hc 9 13 + 11 c2-hc 9 14 + 12 c_1-o_1 10 11 + 13 c_1-o 10 12 + 14 o-ho 12 15 + +Angles + + 1 c2-n-hn 2 1 4 + 2 c2-n-hn 2 1 5 + 3 c2-n-c_1 2 1 10 + 4 hn-n-hn 4 1 5 + 5 hn-n-c_1 4 1 10 + 6 hn-n-c_1 5 1 10 + 7 n-c2-c2 1 2 3 + 8 n-c2-hc 1 2 6 + 9 n-c2-hc 1 2 7 + 10 c2-c2-hc 3 2 6 + 11 c2-c2-hc 3 2 7 + 12 hc-c2-hc 6 2 7 + 13 c2-c2-c_1 8 9 10 + 14 c2-c2-hc 8 9 13 + 15 c2-c2-hc 8 9 14 + 16 hc-c2-c_1 13 9 10 + 17 hc-c2-c_1 14 9 10 + 18 hc-c2-hc 13 9 14 + 19 c2-c_1-o_1 9 10 11 + 20 c2-c_1-o 9 10 12 + 21 n-c_1-c2 1 10 9 + 22 o_1-c_1-o 11 10 12 + 23 n-c_1-o_1 1 10 11 + 24 n-c_1-o 1 10 12 + 25 c_1-o-ho 10 12 15 + +Dihedrals + + 1 hn-n-c2-c2 4 1 2 3 + 2 hn-n-c2-hc 4 1 2 6 + 3 hn-n-c2-hc 4 1 2 7 + 4 hn-n-c2-c2 5 1 2 3 + 5 hn-n-c2-hc 5 1 2 6 + 6 hn-n-c2-hc 5 1 2 7 + 7 c_1-n-c2-c2 10 1 2 3 + 8 c_1-n-c2-hc 10 1 2 6 + 9 c_1-n-c2-hc 10 1 2 7 + 10 c2-n-c_1-c2 2 1 10 9 + 11 c2-n-c_1-o_1 2 1 10 11 + 12 c2-n-c_1-o 2 1 10 12 + 13 hn-n-c_1-c2 4 1 10 9 + 14 hn-n-c_1-o_1 4 1 10 11 + 15 hn-n-c_1-o 4 1 10 12 + 16 hn-n-c_1-c2 5 1 10 9 + 17 hn-n-c_1-o_1 5 1 10 11 + 18 hn-n-c_1-o 5 1 10 12 + 19 c2-c2-c_1-o_1 8 9 10 11 + 20 c2-c2-c_1-o 8 9 10 12 + 21 c2-c2-c_1-n 8 9 10 1 + 22 hc-c2-c_1-o_1 13 9 10 11 + 23 hc-c2-c_1-o 13 9 10 12 + 24 hc-c2-c_1-n 13 9 10 1 + 25 hc-c2-c_1-o_1 14 9 10 11 + 26 hc-c2-c_1-o 14 9 10 12 + 27 hc-c2-c_1-n 14 9 10 1 + 28 c2-c_1-o-ho 9 10 12 15 + 29 o_1-c_1-o-ho 11 10 12 15 + 30 n-c_1-o-ho 1 10 12 15 diff --git a/examples/PACKAGES/reaction/tiny_nylon/tiny_nylon.data b/examples/PACKAGES/reaction/tiny_nylon/tiny_nylon.data index 8466e68ea5..ee8e397956 100644 --- a/examples/PACKAGES/reaction/tiny_nylon/tiny_nylon.data +++ b/examples/PACKAGES/reaction/tiny_nylon/tiny_nylon.data @@ -10,16 +10,130 @@ this is LAMMPS data file containing two nylon monomers 36 dihedral types 44 impropers 13 improper types -5 extra bond per atom -15 extra angle per atom -15 extra dihedral per atom -25 extra improper per atom -25 extra special per atom -25 25 xlo xhi -25 25 ylo yhi -25 25 zlo zhi +Atom Type Labels + +1 c2 +2 c_1 +3 o +4 hc +5 ho +6 o_1 +7 na +8 hn +9 n +10 hw +11 o* + +Bond Type Labels + +1 c2-hc +2 c2-c2 +3 c_1-o +4 c2-c_1 +5 c_1-o_1 +6 o-ho +7 c2-c2-repeat +8 c2-hc-repeat +9 na-c2 +10 na-hn +11 n-c2 +12 n-hn +13 n-c_1 +14 c2-na +15 hw-o* + +Angle Type Labels + +1 hc-c2-hc +2 c2-c2-hc +3 c2-c2-c2 +4 c2-c_1-o_1 +5 o-c_1-o_1 +6 c2-c_1-o +7 c_1-o-ho +8 c2-c2-c_1 +9 c_1-c2-hc +10 c2-c2-hc-repeat +11 c2-c2-c2-repeat +12 hc-c2-hc-repeat +13 c2-c2-na +14 na-c2-hc +15 c2-na-hn +16 hn-na-hn +17 c2-n-hn +18 c2-n-c_1 +19 hn-n-hn +20 hn-n-c_1 +21 n-c2-c2 +22 n-c2-hc +23 hc-c2-c_1 +24 n-c_1-c2 +25 o_1-c_1-o +26 n-c_1-o_1 +27 n-c_1-o +28 na-c2-c2 +29 hw-o*-hw + +Dihedral Type Labels + +1 c_1-c2-c2-hc +2 hc-c2-c2-hc +3 c2-c2-c2-c_1 +4 c2-c2-c2-hc +5 c2-c2-c2-c2 +6 c2-c_1-o-ho +7 o_1-c_1-o-ho +8 c2-c2-c_1-o +9 hc-c2-c_1-o +10 c2-c2-c_1-o_1 +11 hc-c2-c_1-o_1 +12 na-c2-c2-hc +13 hc-c2-c2-hc-repeat +14 c2-c2-c2-na +15 c2-c2-c2-hc-repeat +16 c2-c2-c2-c2-repeat +17 c2-c2-na-hn +18 hn-na-c2-hc +19 hn-n-c2-c2 +20 hn-n-c2-hc +21 c_1-n-c2-c2 +22 c_1-n-c2-hc +23 c2-n-c_1-c2 +24 c2-n-c_1-o_1 +25 c2-n-c_1-o +26 hn-n-c_1-c2 +27 hn-n-c_1-o_1 +28 hn-n-c_1-o +29 n-c2-c2-c2 +30 n-c2-c2-hc +31 c2-c2-c_1-n +32 hc-c2-c_1-n +33 n-c_1-o-ho +34 hn-na-c2-c2 +35 hc-c2-na-hn +36 na-c2-c2-c2 + +Improper Type Labels + +1 c2-c_1-o-o_1 +2 c2-na-hn-hn +3 c2-c_1-o_1-o +4 c2-n-hn-c_1 +5 zero5 +6 zero6 +7 zero7 +8 zero8 +9 zero9 +10 zero10 +11 zero11 +12 zero12 +13 n-c_1-c2-o_1 + Masses 1 12.0112 @@ -94,7 +208,7 @@ Angle Coeffs # class2 24 116.926 39.4193 -10.9945 -8.7733 25 118.986 98.6813 -22.2485 10.3673 26 125.542 92.572 -34.48 -11.1871 -27 0 0 0 0 +27 125.542 92.572 -34.48 -11.1871 28 111.91 60.7147 -13.3366 -13.0785 29 103.7 49.84 -11.6 -8 From 35eff624abf2fa4f9e4ed4c62207bc11db5e4e9e Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Thu, 15 Dec 2022 13:16:49 -0500 Subject: [PATCH 07/47] nylon_melt: actually use log files not output file --- .../log.4Nov2022.large_nylon_melt.g++.1 | 75 +++++++++++++- .../log.4Nov2022.large_nylon_melt.g++.4 | 98 +++++++++++++++---- 2 files changed, 151 insertions(+), 22 deletions(-) diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.1 b/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.1 index 26c11bd020..440b2e5cf0 100644 --- a/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.1 +++ b/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.1 @@ -1,4 +1,25 @@ LAMMPS (4 Nov 2022) +# 35,000 atom nylon melt example + +units real + +boundary p p p + +atom_style full + +kspace_style pppm 1.0e-4 + +pair_style lj/class2/coul/long 8.5 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data large_nylon_melt.data.gz extra/bond/per/atom 5 extra/angle/per/atom 15 extra/dihedral/per/atom 15 extra/improper/per/atom 25 extra/special/per/atom 25 Reading data file ... orthogonal box = (-2.6834403 -2.0679138 -2.2198803) to (73.455228 73.244835 73.40648) 1 by 1 by 1 MPI processor grid @@ -36,6 +57,10 @@ Finding 1-2 1-3 1-4 neighbors ... 41 = max # of special neighbors special bonds CPU = 0.026 seconds read_data CPU = 0.937 seconds + +velocity all create 800.0 4928459 dist gaussian + +molecule mol1 rxn1_stp1_unreacted.molecule_template Read molecule template mol1: 1 molecules 0 fragments @@ -44,6 +69,7 @@ Read molecule template mol1: 25 angles with max type 24 23 dihedrals with max type 33 2 impropers with max type 9 +molecule mol2 rxn1_stp1_reacted.molecule_template Read molecule template mol2: 1 molecules 0 fragments @@ -52,6 +78,7 @@ Read molecule template mol2: 31 angles with max type 23 39 dihedrals with max type 30 0 impropers with max type 0 +molecule mol3 rxn1_stp2_unreacted.molecule_template Read molecule template mol3: 1 molecules 0 fragments @@ -60,6 +87,7 @@ Read molecule template mol3: 25 angles with max type 23 30 dihedrals with max type 30 0 impropers with max type 0 +molecule mol4 rxn1_stp2_reacted.molecule_template Read molecule template mol4: 1 molecules 0 fragments @@ -68,15 +96,53 @@ Read molecule template mol4: 19 angles with max type 25 16 dihedrals with max type 29 2 impropers with max type 11 + +thermo 50 + +# dump 1 all xyz 100 test_vis.xyz + +fix myrxns all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0.0 2.9 mol1 mol2 rxn1_stp1_map react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map WARNING: Fix bond/react: Atom affected by reaction rxn2 is too close to template edge (../fix_bond_react.cpp:2624) dynamic group bond_react_MASTER_group defined dynamic group statted_grp_REACT defined +# stable at 800K +fix 1 statted_grp_REACT nvt temp 800 800 100 + +# in order to customize behavior of reacting atoms, +# you can use the internally created 'bond_react_MASTER_group', like so: +# fix 2 bond_react_MASTER_group temp/rescale 1 800 800 10 1 + +thermo_style custom step temp press density f_myrxns[1] f_myrxns[2] # cumulative reaction counts + +# restart 100 restart1 restart2 + +run 200 + CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: + - fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 -The log file lists these citations in BibTeX format. + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -107,10 +173,6 @@ Neighbor list info ... pair build: copy stencil: none bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 Per MPI rank memory allocation (min/avg/max) = 209.8 | 209.8 | 209.8 Mbytes Step Temp Press Density f_myrxns[1] f_myrxns[2] 0 800 3666.3948 0.80366765 0 0 @@ -147,4 +209,7 @@ Ave neighs/atom = 196.80781 Ave special neighs/atom = 9.8480114 Neighbor list builds = 128 Dangerous builds = 0 + +# write_restart restart_longrun +# write_data restart_longrun.data Total wall time: 0:01:29 diff --git a/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.4 b/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.4 index 69a663c59c..52b36325b8 100644 --- a/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.4 +++ b/examples/PACKAGES/reaction/nylon,6-6_melt/log.4Nov2022.large_nylon_melt.g++.4 @@ -1,5 +1,25 @@ LAMMPS (4 Nov 2022) -WARNING: Using I/O redirection is unreliable with parallel runs. Better use -in switch to read input file. (../lammps.cpp:529) +# 35,000 atom nylon melt example + +units real + +boundary p p p + +atom_style full + +kspace_style pppm 1.0e-4 + +pair_style lj/class2/coul/long 8.5 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data large_nylon_melt.data.gz extra/bond/per/atom 5 extra/angle/per/atom 15 extra/dihedral/per/atom 15 extra/improper/per/atom 25 extra/special/per/atom 25 Reading data file ... orthogonal box = (-2.6834403 -2.0679138 -2.2198803) to (73.455228 73.244835 73.40648) 2 by 1 by 2 MPI processor grid @@ -36,7 +56,11 @@ Finding 1-2 1-3 1-4 neighbors ... 12 = max # of 1-4 neighbors 41 = max # of special neighbors special bonds CPU = 0.007 seconds - read_data CPU = 0.853 seconds + read_data CPU = 0.854 seconds + +velocity all create 800.0 4928459 dist gaussian + +molecule mol1 rxn1_stp1_unreacted.molecule_template Read molecule template mol1: 1 molecules 0 fragments @@ -45,6 +69,7 @@ Read molecule template mol1: 25 angles with max type 24 23 dihedrals with max type 33 2 impropers with max type 9 +molecule mol2 rxn1_stp1_reacted.molecule_template Read molecule template mol2: 1 molecules 0 fragments @@ -53,6 +78,7 @@ Read molecule template mol2: 31 angles with max type 23 39 dihedrals with max type 30 0 impropers with max type 0 +molecule mol3 rxn1_stp2_unreacted.molecule_template Read molecule template mol3: 1 molecules 0 fragments @@ -61,6 +87,7 @@ Read molecule template mol3: 25 angles with max type 23 30 dihedrals with max type 30 0 impropers with max type 0 +molecule mol4 rxn1_stp2_reacted.molecule_template Read molecule template mol4: 1 molecules 0 fragments @@ -69,15 +96,53 @@ Read molecule template mol4: 19 angles with max type 25 16 dihedrals with max type 29 2 impropers with max type 11 + +thermo 50 + +# dump 1 all xyz 100 test_vis.xyz + +fix myrxns all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0.0 2.9 mol1 mol2 rxn1_stp1_map react rxn2 all 1 0.0 5.0 mol3 mol4 rxn1_stp2_map WARNING: Fix bond/react: Atom affected by reaction rxn2 is too close to template edge (../fix_bond_react.cpp:2624) dynamic group bond_react_MASTER_group defined dynamic group statted_grp_REACT defined +# stable at 800K +fix 1 statted_grp_REACT nvt temp 800 800 100 + +# in order to customize behavior of reacting atoms, +# you can use the internally created 'bond_react_MASTER_group', like so: +# fix 2 bond_react_MASTER_group temp/rescale 1 800 800 10 1 + +thermo_style custom step temp press density f_myrxns[1] f_myrxns[2] # cumulative reaction counts + +# restart 100 restart1 restart2 + +run 200 + CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: + - fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 -The log file lists these citations in BibTeX format. + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -108,10 +173,6 @@ Neighbor list info ... pair build: copy stencil: none bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 Per MPI rank memory allocation (min/avg/max) = 81.39 | 81.41 | 81.43 Mbytes Step Temp Press Density f_myrxns[1] f_myrxns[2] 0 800 3666.3948 0.80366765 0 0 @@ -119,22 +180,22 @@ Per MPI rank memory allocation (min/avg/max) = 81.39 | 81.41 | 81.43 Mbytes 100 694.36354 -2108.4881 0.80366765 57 22 150 716.5075 -12356.04 0.80366765 77 50 200 722.97306 -1308.3439 0.80366765 84 67 -Loop time of 23.0703 on 4 procs for 200 steps with 35200 atoms +Loop time of 23.1041 on 4 procs for 200 steps with 35200 atoms -Performance: 0.749 ns/day, 32.042 hours/ns, 8.669 timesteps/s, 305.154 katom-step/s +Performance: 0.748 ns/day, 32.089 hours/ns, 8.656 timesteps/s, 304.708 katom-step/s 100.0% CPU use with 4 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 6.6778 | 6.8513 | 6.9896 | 5.2 | 29.70 -Bond | 3.8962 | 3.9719 | 4.0488 | 3.0 | 17.22 -Kspace | 1.1907 | 1.3846 | 1.6278 | 15.9 | 6.00 -Neigh | 8.7963 | 8.7965 | 8.7967 | 0.0 | 38.13 -Comm | 0.1468 | 0.15512 | 0.16131 | 1.6 | 0.67 -Output | 0.00035931 | 0.00037432 | 0.00041707 | 0.0 | 0.00 -Modify | 1.8808 | 1.8808 | 1.8809 | 0.0 | 8.15 -Other | | 0.02973 | | | 0.13 +Pair | 6.6935 | 6.8618 | 7.0049 | 5.1 | 29.70 +Bond | 3.8936 | 3.9807 | 4.0626 | 3.5 | 17.23 +Kspace | 1.1828 | 1.4033 | 1.6503 | 16.6 | 6.07 +Neigh | 8.7942 | 8.7945 | 8.7946 | 0.0 | 38.06 +Comm | 0.14682 | 0.15559 | 0.16441 | 1.8 | 0.67 +Output | 0.00035959 | 0.00037472 | 0.00041627 | 0.0 | 0.00 +Modify | 1.8787 | 1.8787 | 1.8788 | 0.0 | 8.13 +Other | | 0.02917 | | | 0.13 Nlocal: 8800 ave 8911 max 8662 min Histogram: 1 0 0 1 0 0 0 0 1 1 @@ -148,4 +209,7 @@ Ave neighs/atom = 196.80838 Ave special neighs/atom = 9.8480114 Neighbor list builds = 128 Dangerous builds = 0 + +# write_restart restart_longrun +# write_data restart_longrun.data Total wall time: 0:00:24 From f0af982d09c323b0d40128c83355e18ecda7fe32 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Thu, 15 Dec 2022 13:22:15 -0500 Subject: [PATCH 08/47] tiny_epoxy: actually use log files --- .../log.4Nov2022.tiny_epoxy.stabilized.g++.1 | 92 ++++++++++++++---- .../log.4Nov2022.tiny_epoxy.stabilized.g++.4 | 93 +++++++++++++++---- 2 files changed, 152 insertions(+), 33 deletions(-) diff --git a/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.1 b/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.1 index b5eb8c4157..24b8fb0987 100644 --- a/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.1 +++ b/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.1 @@ -1,4 +1,24 @@ LAMMPS (4 Nov 2022) +# two molecules DGEBA (diepoxy) and one DETA (linker) +# two crosslinking reactions + +units real + +boundary p p p + +atom_style full + +pair_style lj/class2 8 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data tiny_epoxy.data Reading data file ... orthogonal box = (10 -10 -15) to (30 20 10) 1 by 1 by 1 MPI processor grid @@ -33,7 +53,11 @@ Finding 1-2 1-3 1-4 neighbors ... 19 = max # of 1-4 neighbors 22 = max # of special neighbors special bonds CPU = 0.000 seconds - read_data CPU = 0.022 seconds + read_data CPU = 0.015 seconds + +velocity all create 300.0 4928459 dist gaussian + +molecule mol1 rxn1_stp1_pre.molecule_template Read molecule template mol1: 1 molecules 0 fragments @@ -42,6 +66,7 @@ Read molecule template mol1: 53 angles with max type 29 66 dihedrals with max type 39 3 impropers with max type 5 +molecule mol2 rxn1_stp1_post.molecule_template Read molecule template mol2: 1 molecules 0 fragments @@ -50,6 +75,7 @@ Read molecule template mol2: 55 angles with max type 36 75 dihedrals with max type 51 2 impropers with max type 5 +molecule mol3 rxn1_stp2_post.molecule_template Read molecule template mol3: 1 molecules 0 fragments @@ -58,6 +84,7 @@ Read molecule template mol3: 53 angles with max type 37 72 dihedrals with max type 53 3 impropers with max type 5 +molecule mol4 rxn2_stp1_pre.molecule_template Read molecule template mol4: 1 molecules 0 fragments @@ -66,6 +93,7 @@ Read molecule template mol4: 73 angles with max type 41 96 dihedrals with max type 54 3 impropers with max type 5 +molecule mol5 rxn2_stp1_post.molecule_template Read molecule template mol5: 1 molecules 0 fragments @@ -74,6 +102,7 @@ Read molecule template mol5: 75 angles with max type 37 108 dihedrals with max type 53 2 impropers with max type 5 +molecule mol6 rxn2_stp2_post.molecule_template Read molecule template mol6: 1 molecules 0 fragments @@ -82,14 +111,46 @@ Read molecule template mol6: 73 angles with max type 50 102 dihedrals with max type 66 3 impropers with max type 22 + +thermo 50 + +# dump 1 all xyz 1 test_vis.xyz + +fix rxns all bond/react stabilization yes statted_grp .03 react rxn1_stp1 all 1 0.0 5 mol1 mol2 rxn1_stp1.map react rxn1_stp2 all 1 0.0 5 mol2 mol3 rxn1_stp2.map react rxn2_stp1 all 1 0.0 5 mol4 mol5 rxn2_stp1.map react rxn2_stp2 all 1 0.0 5 mol5 mol6 rxn2_stp2.map dynamic group bond_react_MASTER_group defined dynamic group statted_grp_REACT defined + +fix 1 statted_grp_REACT nvt temp 300 300 100 + +thermo_style custom step temp f_rxns[1] f_rxns[2] f_rxns[3] f_rxns[4] + +run 2000 + CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: + - fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 -The log file lists these citations in BibTeX format. + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -111,10 +172,6 @@ Neighbor list info ... pair build: copy stencil: none bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 Per MPI rank memory allocation (min/avg/max) = 16.64 | 16.64 | 16.64 Mbytes Step Temp f_rxns[1] f_rxns[2] f_rxns[3] f_rxns[4] 0 300 0 0 0 0 @@ -158,21 +215,21 @@ Per MPI rank memory allocation (min/avg/max) = 16.64 | 16.64 | 16.64 Mbytes 1900 315.3756 1 1 1 1 1950 260.65335 1 1 1 1 2000 354.03612 1 1 1 1 -Loop time of 0.909774 on 1 procs for 2000 steps with 118 atoms +Loop time of 0.910097 on 1 procs for 2000 steps with 118 atoms -Performance: 189.937 ns/day, 0.126 hours/ns, 2198.347 timesteps/s, 259.405 katom-step/s -100.0% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 189.870 ns/day, 0.126 hours/ns, 2197.568 timesteps/s, 259.313 katom-step/s +99.9% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.10261 | 0.10261 | 0.10261 | 0.0 | 11.28 -Bond | 0.63695 | 0.63695 | 0.63695 | 0.0 | 70.01 -Neigh | 0.013916 | 0.013916 | 0.013916 | 0.0 | 1.53 -Comm | 0.0057214 | 0.0057214 | 0.0057214 | 0.0 | 0.63 -Output | 0.0005856 | 0.0005856 | 0.0005856 | 0.0 | 0.06 -Modify | 0.14641 | 0.14641 | 0.14641 | 0.0 | 16.09 -Other | | 0.003576 | | | 0.39 +Pair | 0.10286 | 0.10286 | 0.10286 | 0.0 | 11.30 +Bond | 0.63714 | 0.63714 | 0.63714 | 0.0 | 70.01 +Neigh | 0.013949 | 0.013949 | 0.013949 | 0.0 | 1.53 +Comm | 0.0056606 | 0.0056606 | 0.0056606 | 0.0 | 0.62 +Output | 0.00055825 | 0.00055825 | 0.00055825 | 0.0 | 0.06 +Modify | 0.14629 | 0.14629 | 0.14629 | 0.0 | 16.07 +Other | | 0.003637 | | | 0.40 Nlocal: 118 ave 118 max 118 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -186,4 +243,7 @@ Ave neighs/atom = 29.550847 Ave special neighs/atom = 10.576271 Neighbor list builds = 68 Dangerous builds = 0 + +# write_restart restart_longrun +# write_data restart_longrun.data nofix Total wall time: 0:00:01 diff --git a/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.4 b/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.4 index 5d6ac8ab21..5d1a80405a 100644 --- a/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.4 +++ b/examples/PACKAGES/reaction/tiny_epoxy/log.4Nov2022.tiny_epoxy.stabilized.g++.4 @@ -1,5 +1,24 @@ LAMMPS (4 Nov 2022) -WARNING: Using I/O redirection is unreliable with parallel runs. Better use -in switch to read input file. (../lammps.cpp:529) +# two molecules DGEBA (diepoxy) and one DETA (linker) +# two crosslinking reactions + +units real + +boundary p p p + +atom_style full + +pair_style lj/class2 8 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +read_data tiny_epoxy.data Reading data file ... orthogonal box = (10 -10 -15) to (30 20 10) 1 by 2 by 2 MPI processor grid @@ -34,7 +53,11 @@ Finding 1-2 1-3 1-4 neighbors ... 19 = max # of 1-4 neighbors 22 = max # of special neighbors special bonds CPU = 0.000 seconds - read_data CPU = 0.009 seconds + read_data CPU = 0.013 seconds + +velocity all create 300.0 4928459 dist gaussian + +molecule mol1 rxn1_stp1_pre.molecule_template Read molecule template mol1: 1 molecules 0 fragments @@ -43,6 +66,7 @@ Read molecule template mol1: 53 angles with max type 29 66 dihedrals with max type 39 3 impropers with max type 5 +molecule mol2 rxn1_stp1_post.molecule_template Read molecule template mol2: 1 molecules 0 fragments @@ -51,6 +75,7 @@ Read molecule template mol2: 55 angles with max type 36 75 dihedrals with max type 51 2 impropers with max type 5 +molecule mol3 rxn1_stp2_post.molecule_template Read molecule template mol3: 1 molecules 0 fragments @@ -59,6 +84,7 @@ Read molecule template mol3: 53 angles with max type 37 72 dihedrals with max type 53 3 impropers with max type 5 +molecule mol4 rxn2_stp1_pre.molecule_template Read molecule template mol4: 1 molecules 0 fragments @@ -67,6 +93,7 @@ Read molecule template mol4: 73 angles with max type 41 96 dihedrals with max type 54 3 impropers with max type 5 +molecule mol5 rxn2_stp1_post.molecule_template Read molecule template mol5: 1 molecules 0 fragments @@ -75,6 +102,7 @@ Read molecule template mol5: 75 angles with max type 37 108 dihedrals with max type 53 2 impropers with max type 5 +molecule mol6 rxn2_stp2_post.molecule_template Read molecule template mol6: 1 molecules 0 fragments @@ -83,14 +111,46 @@ Read molecule template mol6: 73 angles with max type 50 102 dihedrals with max type 66 3 impropers with max type 22 + +thermo 50 + +# dump 1 all xyz 1 test_vis.xyz + +fix rxns all bond/react stabilization yes statted_grp .03 react rxn1_stp1 all 1 0.0 5 mol1 mol2 rxn1_stp1.map react rxn1_stp2 all 1 0.0 5 mol2 mol3 rxn1_stp2.map react rxn2_stp1 all 1 0.0 5 mol4 mol5 rxn2_stp1.map react rxn2_stp2 all 1 0.0 5 mol5 mol6 rxn2_stp2.map dynamic group bond_react_MASTER_group defined dynamic group statted_grp_REACT defined + +fix 1 statted_grp_REACT nvt temp 300 300 100 + +thermo_style custom step temp f_rxns[1] f_rxns[2] f_rxns[3] f_rxns[4] + +run 2000 + CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: + - fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 -The log file lists these citations in BibTeX format. + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE @@ -112,10 +172,6 @@ Neighbor list info ... pair build: copy stencil: none bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 Per MPI rank memory allocation (min/avg/max) = 16.63 | 16.63 | 16.64 Mbytes Step Temp f_rxns[1] f_rxns[2] f_rxns[3] f_rxns[4] 0 300 0 0 0 0 @@ -159,21 +215,21 @@ Per MPI rank memory allocation (min/avg/max) = 16.63 | 16.63 | 16.64 Mbytes 1900 315.3756 1 1 1 1 1950 260.65334 1 1 1 1 2000 354.03612 1 1 1 1 -Loop time of 0.473184 on 4 procs for 2000 steps with 118 atoms +Loop time of 0.47159 on 4 procs for 2000 steps with 118 atoms -Performance: 365.186 ns/day, 0.066 hours/ns, 4226.686 timesteps/s, 498.749 katom-step/s -100.0% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 366.420 ns/day, 0.065 hours/ns, 4240.970 timesteps/s, 500.434 katom-step/s +99.9% CPU use with 4 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 0.01651 | 0.024868 | 0.039209 | 5.4 | 5.26 -Bond | 0.072805 | 0.16458 | 0.21783 | 13.9 | 34.78 -Neigh | 0.0056701 | 0.0057265 | 0.0057792 | 0.1 | 1.21 -Comm | 0.028105 | 0.095922 | 0.19546 | 20.3 | 20.27 -Output | 0.00034311 | 0.00041507 | 0.0006278 | 0.0 | 0.09 -Modify | 0.17725 | 0.17761 | 0.17826 | 0.1 | 37.54 -Other | | 0.004064 | | | 0.86 +Pair | 0.016546 | 0.024458 | 0.038858 | 5.5 | 5.19 +Bond | 0.072622 | 0.16458 | 0.21778 | 13.9 | 34.90 +Neigh | 0.0056307 | 0.0056812 | 0.0057292 | 0.1 | 1.20 +Comm | 0.028022 | 0.095922 | 0.19526 | 20.3 | 20.34 +Output | 0.00034591 | 0.00041633 | 0.00062378 | 0.0 | 0.09 +Modify | 0.17613 | 0.17649 | 0.17711 | 0.1 | 37.43 +Other | | 0.00404 | | | 0.86 Nlocal: 29.5 ave 45 max 7 min Histogram: 1 0 0 0 0 0 1 1 0 1 @@ -187,4 +243,7 @@ Ave neighs/atom = 29.550847 Ave special neighs/atom = 10.576271 Neighbor list builds = 68 Dangerous builds = 0 + +# write_restart restart_longrun +# write_data restart_longrun.data nofix Total wall time: 0:00:00 From ac20f22056520db12c273b0d76654bbc36db56de Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Fri, 16 Dec 2022 18:39:37 -0500 Subject: [PATCH 09/47] type-labels: polystyrene example --- .../2styrene_reacted.data_template | 312 ----------- .../2styrene_reacted.molecule_template | 339 +++++++++++ .../2styrene_unreacted.data_template | 284 ---------- .../2styrene_unreacted.molecule_template | 319 +++++++++++ .../chain_chain_reacted.data_template | 497 ----------------- .../chain_chain_reacted.molecule_template | 526 ++++++++++++++++++ .../chain_chain_unreacted.data_template | 467 ---------------- .../chain_chain_unreacted.molecule_template | 504 +++++++++++++++++ .../chain_plus_styrene_reacted.data_template | 451 --------------- ...ain_plus_styrene_reacted.molecule_template | 484 ++++++++++++++++ ...chain_plus_styrene_unreacted.data_template | 422 -------------- ...n_plus_styrene_unreacted.molecule_template | 463 +++++++++++++++ .../in.tiny_polystyrene.stabilized | 20 +- ....20Nov19.tiny_polystyrene.stabilized.g++.1 | 245 -------- ....20Nov19.tiny_polystyrene.stabilized.g++.4 | 255 --------- ...g.4Nov19.tiny_polystyrene.stabilized.g++.4 | 329 +++++++++++ ...4Nov2020.tiny_polystyrene.stabilized.g++.1 | 329 +++++++++++ .../tiny_polystyrene/tiny_polystyrene.data | 102 ++++ 18 files changed, 3405 insertions(+), 2943 deletions(-) delete mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/2styrene_reacted.data_template create mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/2styrene_reacted.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/2styrene_unreacted.data_template create mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/2styrene_unreacted.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_reacted.data_template create mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_reacted.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_unreacted.data_template create mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_unreacted.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_reacted.data_template create mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_reacted.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_unreacted.data_template create mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_unreacted.molecule_template delete mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/log.20Nov19.tiny_polystyrene.stabilized.g++.1 delete mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/log.20Nov19.tiny_polystyrene.stabilized.g++.4 create mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/log.4Nov19.tiny_polystyrene.stabilized.g++.4 create mode 100644 examples/PACKAGES/reaction/tiny_polystyrene/log.4Nov2020.tiny_polystyrene.stabilized.g++.1 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/2styrene_reacted.data_template b/examples/PACKAGES/reaction/tiny_polystyrene/2styrene_reacted.data_template deleted file mode 100644 index c4fa646e9f..0000000000 --- a/examples/PACKAGES/reaction/tiny_polystyrene/2styrene_reacted.data_template +++ /dev/null @@ -1,312 +0,0 @@ -2styrene_reacted - -32 atoms -33 bonds -54 angles -79 dihedrals -22 impropers - -Types - -1 1 -2 2 -3 1 -4 5 -5 1 -6 2 -7 1 -8 2 -9 1 -10 2 -11 1 -12 2 -13 2 -14 6 -15 2 -16 2 -17 1 -18 2 -19 1 -20 5 -21 1 -22 2 -23 1 -24 2 -25 1 -26 2 -27 1 -28 2 -29 2 -30 6 -31 2 -32 2 - -Charges - -1 -0.129000 -2 0.123700 -3 0.026600 -4 -0.018200 -5 -0.129000 -6 0.123700 -7 -0.173400 -8 0.140300 -9 -0.113400 -10 0.128800 -11 -0.173400 -12 0.140300 -13 0.051600 -14 -0.069600 -15 0.035400 -16 0.035400 -17 -0.129000 -18 0.123700 -19 0.026600 -20 -0.018200 -21 -0.129000 -22 0.123700 -23 -0.173400 -24 0.140300 -25 -0.113400 -26 0.128800 -27 -0.173400 -28 0.140300 -29 0.051600 -30 -0.069600 -31 0.035400 -32 0.035400 - -Coords - -1 13.465810 0.682530 -1.658940 -2 14.397820 1.221530 -1.658940 -3 12.235820 1.392530 -1.658940 -4 12.235820 2.892530 -1.658940 -5 11.005820 0.682530 -1.658940 -6 10.073820 1.221530 -1.658940 -7 11.005820 -0.737470 -1.658940 -8 10.073820 -1.276460 -1.658940 -9 12.235820 -1.447460 -1.658940 -10 12.235820 -2.524470 -1.658940 -11 13.465810 -0.737470 -1.658940 -12 14.397820 -1.276460 -1.658940 -13 13.101820 3.297530 -1.301940 -14 10.957820 3.441530 -2.220940 -15 11.007810 4.183540 -2.319940 -16 10.314820 2.618530 -2.514940 -17 18.663521 0.855480 -1.372130 -18 19.595510 1.394480 -1.372130 -19 17.433510 1.565480 -1.372130 -20 17.433510 3.065480 -1.372130 -21 16.203510 0.855480 -1.372130 -22 15.271510 1.394480 -1.372130 -23 16.203510 -0.564520 -1.372130 -24 15.271510 -1.103520 -1.372130 -25 17.433510 -1.274520 -1.372130 -26 17.433510 -2.351520 -1.372130 -27 18.663521 -0.564520 -1.372130 -28 19.595510 -1.103520 -1.372130 -29 18.299509 3.470480 -1.015130 -30 16.155510 3.614480 -1.934130 -31 16.205509 4.356480 -2.033130 -32 15.512510 2.791480 -2.228130 - -Bonds - -1 1 1 2 -2 2 1 3 -3 2 1 11 -4 7 3 4 -5 2 3 5 -6 8 13 4 -7 9 4 14 -8 9 4 30 -9 1 5 6 -10 2 5 7 -11 1 7 8 -12 2 7 9 -13 1 9 10 -14 2 9 11 -15 1 11 12 -16 10 15 14 -17 10 16 14 -18 1 17 18 -19 2 17 19 -20 2 17 27 -21 7 19 20 -22 2 19 21 -23 8 29 20 -24 9 20 30 -25 1 21 22 -26 2 21 23 -27 1 23 24 -28 2 23 25 -29 1 25 26 -30 2 25 27 -31 1 27 28 -32 10 31 30 -33 10 32 30 - -Angles - -1 1 3 1 2 -2 1 11 1 2 -3 2 3 1 11 -4 9 1 3 4 -5 2 1 3 5 -6 9 5 3 4 -7 10 3 4 13 -8 11 3 4 14 -9 11 3 4 30 -10 12 13 4 14 -11 12 13 4 30 -12 13 14 4 30 -13 1 3 5 6 -14 2 3 5 7 -15 1 7 5 6 -16 1 5 7 8 -17 2 5 7 9 -18 1 9 7 8 -19 1 7 9 10 -20 2 7 9 11 -21 1 11 9 10 -22 2 1 11 9 -23 1 1 11 12 -24 1 9 11 12 -25 14 15 14 4 -26 14 16 14 4 -27 15 15 14 16 -28 1 19 17 18 -29 1 27 17 18 -30 2 19 17 27 -31 9 17 19 20 -32 2 17 19 21 -33 9 21 19 20 -34 10 19 20 29 -35 11 19 20 30 -36 12 29 20 30 -37 1 19 21 22 -38 2 19 21 23 -39 1 23 21 22 -40 1 21 23 24 -41 2 21 23 25 -42 1 25 23 24 -43 1 23 25 26 -44 2 23 25 27 -45 1 27 25 26 -46 2 17 27 25 -47 1 17 27 28 -48 1 25 27 28 -49 16 4 30 20 -50 14 31 30 4 -51 14 32 30 4 -52 14 31 30 20 -53 14 32 30 20 -54 15 31 30 32 - -Dihedrals - -1 10 2 1 3 4 -2 2 5 3 1 2 -3 11 11 1 3 4 -4 4 11 1 3 5 -5 2 9 11 1 2 -6 5 2 1 11 12 -7 4 3 1 11 9 -8 2 3 1 11 12 -9 12 1 3 4 13 -10 13 1 3 4 14 -11 13 1 3 4 30 -12 12 5 3 4 13 -13 13 5 3 4 14 -14 13 5 3 4 30 -15 2 1 3 5 6 -16 4 1 3 5 7 -17 10 6 5 3 4 -18 11 7 5 3 4 -19 14 3 4 14 15 -20 14 3 4 14 16 -21 15 13 4 14 15 -22 15 13 4 14 16 -23 16 30 4 14 15 -24 16 30 4 14 16 -25 17 3 4 30 20 -26 14 3 4 30 31 -27 14 3 4 30 32 -28 18 13 4 30 20 -29 15 13 4 30 31 -30 15 13 4 30 32 -31 19 14 4 30 20 -32 16 14 4 30 31 -33 16 14 4 30 32 -34 2 3 5 7 8 -35 4 3 5 7 9 -36 5 6 5 7 8 -37 2 9 7 5 6 -38 2 5 7 9 10 -39 4 5 7 9 11 -40 5 8 7 9 10 -41 2 11 9 7 8 -42 4 7 9 11 1 -43 2 7 9 11 12 -44 2 1 11 9 10 -45 5 10 9 11 12 -46 10 18 17 19 20 -47 2 21 19 17 18 -48 11 27 17 19 20 -49 4 27 17 19 21 -50 2 25 27 17 18 -51 5 18 17 27 28 -52 4 19 17 27 25 -53 2 19 17 27 28 -54 12 17 19 20 29 -55 13 17 19 20 30 -56 12 21 19 20 29 -57 13 21 19 20 30 -58 2 17 19 21 22 -59 4 17 19 21 23 -60 10 22 21 19 20 -61 11 23 21 19 20 -62 17 19 20 30 4 -63 14 19 20 30 31 -64 14 19 20 30 32 -65 18 29 20 30 4 -66 15 29 20 30 31 -67 15 29 20 30 32 -68 2 19 21 23 24 -69 4 19 21 23 25 -70 5 22 21 23 24 -71 2 25 23 21 22 -72 2 21 23 25 26 -73 4 21 23 25 27 -74 5 24 23 25 26 -75 2 27 25 23 24 -76 4 23 25 27 17 -77 2 23 25 27 28 -78 2 17 27 25 26 -79 5 26 25 27 28 - -Impropers - -1 1 3 1 11 2 -2 5 1 3 5 4 -3 1 3 5 7 6 -4 1 5 7 9 8 -5 1 7 9 11 10 -6 1 1 11 9 12 -7 6 15 14 16 4 -8 1 19 17 27 18 -9 5 17 19 21 20 -10 7 19 20 29 30 -11 1 19 21 23 22 -12 1 21 23 25 24 -13 1 23 25 27 26 -14 1 17 27 25 28 -15 1 3 4 13 14 -16 1 3 4 13 30 -17 1 3 4 14 30 -18 1 13 4 14 30 -19 1 31 30 20 4 -20 1 32 30 20 4 -21 1 31 30 32 4 -22 1 31 30 32 20 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/2styrene_reacted.molecule_template b/examples/PACKAGES/reaction/tiny_polystyrene/2styrene_reacted.molecule_template new file mode 100644 index 0000000000..a321d5f6bb --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_polystyrene/2styrene_reacted.molecule_template @@ -0,0 +1,339 @@ +2styrene_reacted + + 32 atoms + 33 bonds + 54 angles + 79 dihedrals + 14 impropers + +Coords + + 1 13.465809822 0.682529986 -1.658939958 + 2 14.397820473 1.221529961 -1.658939958 + 3 12.235819817 1.392529964 -1.658939958 + 4 12.235819817 2.892529964 -1.658939958 + 5 11.005820274 0.682529986 -1.658939958 + 6 10.073820114 1.221529961 -1.658939958 + 7 11.005820274 -0.737469971 -1.658939958 + 8 10.073820114 -1.276460052 -1.658939958 + 9 12.235819817 -1.447460055 -1.658939958 + 10 12.235819817 -2.524470091 -1.658939958 + 11 13.465809822 -0.737469971 -1.658939958 + 12 14.397820473 -1.276460052 -1.658939958 + 13 13.101819992 3.297529936 -1.301939964 + 14 10.957819939 3.441529989 -2.220940113 + 15 11.007809639 4.183539867 -2.319940090 + 16 10.314820290 2.618530035 -2.514940023 + 17 18.663520813 0.855480015 -1.372130036 + 18 19.595510483 1.394479990 -1.372130036 + 19 17.433509827 1.565479994 -1.372130036 + 20 17.433509827 3.065479994 -1.372130036 + 21 16.203510284 0.855480015 -1.372130036 + 22 15.271510124 1.394479990 -1.372130036 + 23 16.203510284 -0.564520001 -1.372130036 + 24 15.271510124 -1.103520036 -1.372130036 + 25 17.433509827 -1.274520040 -1.372130036 + 26 17.433509827 -2.351520061 -1.372130036 + 27 18.663520813 -0.564520001 -1.372130036 + 28 19.595510483 -1.103520036 -1.372130036 + 29 18.299509048 3.470479965 -1.015130043 + 30 16.155509949 3.614480019 -1.934129953 + 31 16.205509186 4.356480122 -2.033129930 + 32 15.512510300 2.791480064 -2.228130102 + +Types + + 1 cp + 2 hc + 3 cp + 4 c1 + 5 cp + 6 hc + 7 cp + 8 hc + 9 cp + 10 hc + 11 cp + 12 hc + 13 hc + 14 c2 + 15 hc + 16 hc + 17 cp + 18 hc + 19 cp + 20 c1 + 21 cp + 22 hc + 23 cp + 24 hc + 25 cp + 26 hc + 27 cp + 28 hc + 29 hc + 30 c2 + 31 hc + 32 hc + +Charges + + 1 -0.129000 + 2 0.123700 + 3 0.026600 + 4 -0.018200 + 5 -0.129000 + 6 0.123700 + 7 -0.173400 + 8 0.140300 + 9 -0.113400 + 10 0.128800 + 11 -0.173400 + 12 0.140300 + 13 0.051600 + 14 -0.069600 + 15 0.035400 + 16 0.035400 + 17 -0.129000 + 18 0.123700 + 19 0.026600 + 20 -0.018200 + 21 -0.129000 + 22 0.123700 + 23 -0.173400 + 24 0.140300 + 25 -0.113400 + 26 0.128800 + 27 -0.173400 + 28 0.140300 + 29 0.051600 + 30 -0.069600 + 31 0.035400 + 32 0.035400 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + 32 1 + +Bonds + + 1 cp-hc 1 2 + 2 cp-cp 1 3 + 3 cp-cp 1 11 + 4 cp-c1 3 4 + 5 cp-cp 3 5 + 6 hc-c1 13 4 + 7 c1-c2 4 14 + 8 c1-c2 4 30 + 9 cp-hc 5 6 + 10 cp-cp 5 7 + 11 cp-hc 7 8 + 12 cp-cp 7 9 + 13 cp-hc 9 10 + 14 cp-cp 9 11 + 15 cp-hc 11 12 + 16 hc-c2 15 14 + 17 hc-c2 16 14 + 18 cp-hc 17 18 + 19 cp-cp 17 19 + 20 cp-cp 17 27 + 21 cp-c1 19 20 + 22 cp-cp 19 21 + 23 hc-c1 29 20 + 24 c1-c2 20 30 + 25 cp-hc 21 22 + 26 cp-cp 21 23 + 27 cp-hc 23 24 + 28 cp-cp 23 25 + 29 cp-hc 25 26 + 30 cp-cp 25 27 + 31 cp-hc 27 28 + 32 hc-c2 31 30 + 33 hc-c2 32 30 + +Angles + + 1 cp-cp-hc 3 1 2 + 2 cp-cp-hc 11 1 2 + 3 cp-cp-cp 3 1 11 + 4 cp-cp-c1 1 3 4 + 5 cp-cp-cp 1 3 5 + 6 cp-cp-c1 5 3 4 + 7 cp-c1-hc 3 4 13 + 8 cp-c1-c2 3 4 14 + 9 cp-c1-c2 3 4 30 + 10 hc-c1-c2 13 4 14 + 11 hc-c1-c2 13 4 30 + 12 c2-c1-c2 14 4 30 + 13 cp-cp-hc 3 5 6 + 14 cp-cp-cp 3 5 7 + 15 cp-cp-hc 7 5 6 + 16 cp-cp-hc 5 7 8 + 17 cp-cp-cp 5 7 9 + 18 cp-cp-hc 9 7 8 + 19 cp-cp-hc 7 9 10 + 20 cp-cp-cp 7 9 11 + 21 cp-cp-hc 11 9 10 + 22 cp-cp-cp 1 11 9 + 23 cp-cp-hc 1 11 12 + 24 cp-cp-hc 9 11 12 + 25 hc-c2-c1 15 14 4 + 26 hc-c2-c1 16 14 4 + 27 hc-c2-hc 15 14 16 + 28 cp-cp-hc 19 17 18 + 29 cp-cp-hc 27 17 18 + 30 cp-cp-cp 19 17 27 + 31 cp-cp-c1 17 19 20 + 32 cp-cp-cp 17 19 21 + 33 cp-cp-c1 21 19 20 + 34 cp-c1-hc 19 20 29 + 35 cp-c1-c2 19 20 30 + 36 hc-c1-c2 29 20 30 + 37 cp-cp-hc 19 21 22 + 38 cp-cp-cp 19 21 23 + 39 cp-cp-hc 23 21 22 + 40 cp-cp-hc 21 23 24 + 41 cp-cp-cp 21 23 25 + 42 cp-cp-hc 25 23 24 + 43 cp-cp-hc 23 25 26 + 44 cp-cp-cp 23 25 27 + 45 cp-cp-hc 27 25 26 + 46 cp-cp-cp 17 27 25 + 47 cp-cp-hc 17 27 28 + 48 cp-cp-hc 25 27 28 + 49 c1-c2-c1 4 30 20 + 50 hc-c2-c1 31 30 4 + 51 hc-c2-c1 32 30 4 + 52 hc-c2-c1 31 30 20 + 53 hc-c2-c1 32 30 20 + 54 hc-c2-hc 31 30 32 + +Dihedrals + + 1 hc-cp-cp-c1 2 1 3 4 + 2 cp-cp-cp-hc 5 3 1 2 + 3 cp-cp-cp-c1 11 1 3 4 + 4 cp-cp-cp-cp 11 1 3 5 + 5 cp-cp-cp-hc 9 11 1 2 + 6 hc-cp-cp-hc 2 1 11 12 + 7 cp-cp-cp-cp 3 1 11 9 + 8 cp-cp-cp-hc 3 1 11 12 + 9 cp-cp-c1-hc 1 3 4 13 + 10 cp-cp-c1-c2 1 3 4 14 + 11 cp-cp-c1-c2 1 3 4 30 + 12 cp-cp-c1-hc 5 3 4 13 + 13 cp-cp-c1-c2 5 3 4 14 + 14 cp-cp-c1-c2 5 3 4 30 + 15 cp-cp-cp-hc 1 3 5 6 + 16 cp-cp-cp-cp 1 3 5 7 + 17 hc-cp-cp-c1 6 5 3 4 + 18 cp-cp-cp-c1 7 5 3 4 + 19 cp-c1-c2-hc 3 4 14 15 + 20 cp-c1-c2-hc 3 4 14 16 + 21 hc-c1-c2-hc 13 4 14 15 + 22 hc-c1-c2-hc 13 4 14 16 + 23 c2-c1-c2-hc 30 4 14 15 + 24 c2-c1-c2-hc 30 4 14 16 + 25 cp-c1-c2-c1 3 4 30 20 + 26 cp-c1-c2-hc 3 4 30 31 + 27 cp-c1-c2-hc 3 4 30 32 + 28 hc-c1-c2-c1 13 4 30 20 + 29 hc-c1-c2-hc 13 4 30 31 + 30 hc-c1-c2-hc 13 4 30 32 + 31 c2-c1-c2-c1 14 4 30 20 + 32 c2-c1-c2-hc 14 4 30 31 + 33 c2-c1-c2-hc 14 4 30 32 + 34 cp-cp-cp-hc 3 5 7 8 + 35 cp-cp-cp-cp 3 5 7 9 + 36 hc-cp-cp-hc 6 5 7 8 + 37 cp-cp-cp-hc 9 7 5 6 + 38 cp-cp-cp-hc 5 7 9 10 + 39 cp-cp-cp-cp 5 7 9 11 + 40 hc-cp-cp-hc 8 7 9 10 + 41 cp-cp-cp-hc 11 9 7 8 + 42 cp-cp-cp-cp 7 9 11 1 + 43 cp-cp-cp-hc 7 9 11 12 + 44 cp-cp-cp-hc 1 11 9 10 + 45 hc-cp-cp-hc 10 9 11 12 + 46 hc-cp-cp-c1 18 17 19 20 + 47 cp-cp-cp-hc 21 19 17 18 + 48 cp-cp-cp-c1 27 17 19 20 + 49 cp-cp-cp-cp 27 17 19 21 + 50 cp-cp-cp-hc 25 27 17 18 + 51 hc-cp-cp-hc 18 17 27 28 + 52 cp-cp-cp-cp 19 17 27 25 + 53 cp-cp-cp-hc 19 17 27 28 + 54 cp-cp-c1-hc 17 19 20 29 + 55 cp-cp-c1-c2 17 19 20 30 + 56 cp-cp-c1-hc 21 19 20 29 + 57 cp-cp-c1-c2 21 19 20 30 + 58 cp-cp-cp-hc 17 19 21 22 + 59 cp-cp-cp-cp 17 19 21 23 + 60 hc-cp-cp-c1 22 21 19 20 + 61 cp-cp-cp-c1 23 21 19 20 + 62 cp-c1-c2-c1 19 20 30 4 + 63 cp-c1-c2-hc 19 20 30 31 + 64 cp-c1-c2-hc 19 20 30 32 + 65 hc-c1-c2-c1 29 20 30 4 + 66 hc-c1-c2-hc 29 20 30 31 + 67 hc-c1-c2-hc 29 20 30 32 + 68 cp-cp-cp-hc 19 21 23 24 + 69 cp-cp-cp-cp 19 21 23 25 + 70 hc-cp-cp-hc 22 21 23 24 + 71 cp-cp-cp-hc 25 23 21 22 + 72 cp-cp-cp-hc 21 23 25 26 + 73 cp-cp-cp-cp 21 23 25 27 + 74 hc-cp-cp-hc 24 23 25 26 + 75 cp-cp-cp-hc 27 25 23 24 + 76 cp-cp-cp-cp 23 25 27 17 + 77 cp-cp-cp-hc 23 25 27 28 + 78 cp-cp-cp-hc 17 27 25 26 + 79 hc-cp-cp-hc 26 25 27 28 + +Impropers + + 1 cp-cp-cp-hc 3 1 11 2 + 2 cp-cp-cp-c1 1 3 5 4 + 3 cp-cp-cp-hc 3 5 7 6 + 4 cp-cp-cp-hc 5 7 9 8 + 5 cp-cp-cp-hc 7 9 11 10 + 6 cp-cp-cp-hc 1 11 9 12 + 7 hc-c2-hc-c1 15 14 16 4 + 8 cp-cp-cp-hc 19 17 27 18 + 9 cp-cp-cp-c1 17 19 21 20 + 10 cp-c1-hc-c2 19 20 29 30 + 11 cp-cp-cp-hc 19 21 23 22 + 12 cp-cp-cp-hc 21 23 25 24 + 13 cp-cp-cp-hc 23 25 27 26 + 14 cp-cp-cp-hc 17 27 25 28 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/2styrene_unreacted.data_template b/examples/PACKAGES/reaction/tiny_polystyrene/2styrene_unreacted.data_template deleted file mode 100644 index fc0a893191..0000000000 --- a/examples/PACKAGES/reaction/tiny_polystyrene/2styrene_unreacted.data_template +++ /dev/null @@ -1,284 +0,0 @@ -2styrene_unreacted - -32 atoms -32 bonds -48 angles -64 dihedrals -16 impropers - -Types - -1 1 -2 2 -3 1 -4 3 -5 1 -6 2 -7 1 -8 2 -9 1 -10 2 -11 1 -12 2 -13 2 -14 4 -15 2 -16 2 -17 1 -18 2 -19 1 -20 3 -21 1 -22 2 -23 1 -24 2 -25 1 -26 2 -27 1 -28 2 -29 2 -30 4 -31 2 -32 2 - -Charges - -1 -0.129000 -2 0.123700 -3 0.026600 -4 -0.018200 -5 -0.129000 -6 0.123700 -7 -0.173400 -8 0.140300 -9 -0.113400 -10 0.128800 -11 -0.173400 -12 0.140300 -13 0.051600 -14 -0.069600 -15 0.035400 -16 0.035400 -17 -0.129000 -18 0.123700 -19 0.026600 -20 -0.018200 -21 -0.129000 -22 0.123700 -23 -0.173400 -24 0.140300 -25 -0.113400 -26 0.128800 -27 -0.173400 -28 0.140300 -29 0.051600 -30 -0.069600 -31 0.035400 -32 0.035400 - -Coords - -1 13.465815 0.682534 -1.658941 -2 14.397816 1.221534 -1.658941 -3 12.235815 1.392534 -1.658941 -4 12.235815 2.892534 -1.658941 -5 11.005816 0.682534 -1.658941 -6 10.073815 1.221534 -1.658941 -7 11.005816 -0.737466 -1.658941 -8 10.073815 -1.276465 -1.658941 -9 12.235815 -1.447465 -1.658941 -10 12.235815 -2.524465 -1.658941 -11 13.465815 -0.737466 -1.658941 -12 14.397816 -1.276465 -1.658941 -13 13.101815 3.297535 -1.301941 -14 10.957815 3.441535 -2.220941 -15 11.007814 4.183536 -2.319941 -16 10.314816 2.618534 -2.514940 -17 18.663515 0.855482 -1.372128 -18 19.595514 1.394482 -1.372128 -19 17.433512 1.565481 -1.372128 -20 17.433512 3.065482 -1.372128 -21 16.203512 0.855482 -1.372128 -22 15.271511 1.394482 -1.372128 -23 16.203512 -0.564518 -1.372128 -24 15.271511 -1.103518 -1.372128 -25 17.433512 -1.274518 -1.372128 -26 17.433512 -2.351518 -1.372128 -27 18.663515 -0.564518 -1.372128 -28 19.595514 -1.103518 -1.372128 -29 18.299513 3.470482 -1.015128 -30 16.155512 3.614482 -1.934128 -31 16.205513 4.356482 -2.033128 -32 15.512512 2.791482 -2.228127 - -Bonds - -1 1 1 2 -2 2 1 3 -3 2 1 11 -4 3 3 4 -5 2 3 5 -6 4 13 4 -7 5 4 14 -8 1 5 6 -9 2 5 7 -10 1 7 8 -11 2 7 9 -12 1 9 10 -13 2 9 11 -14 1 11 12 -15 6 15 14 -16 6 16 14 -17 1 17 18 -18 2 17 19 -19 2 17 27 -20 3 19 20 -21 2 19 21 -22 4 29 20 -23 5 20 30 -24 1 21 22 -25 2 21 23 -26 1 23 24 -27 2 23 25 -28 1 25 26 -29 2 25 27 -30 1 27 28 -31 6 31 30 -32 6 32 30 - -Angles - -1 1 3 1 2 -2 1 11 1 2 -3 2 3 1 11 -4 3 1 3 4 -5 2 1 3 5 -6 3 5 3 4 -7 4 3 4 13 -8 5 3 4 14 -9 6 13 4 14 -10 1 3 5 6 -11 2 3 5 7 -12 1 7 5 6 -13 1 5 7 8 -14 2 5 7 9 -15 1 9 7 8 -16 1 7 9 10 -17 2 7 9 11 -18 1 11 9 10 -19 2 1 11 9 -20 1 1 11 12 -21 1 9 11 12 -22 7 15 14 4 -23 7 16 14 4 -24 8 15 14 16 -25 1 19 17 18 -26 1 27 17 18 -27 2 19 17 27 -28 3 17 19 20 -29 2 17 19 21 -30 3 21 19 20 -31 4 19 20 29 -32 5 19 20 30 -33 6 29 20 30 -34 1 19 21 22 -35 2 19 21 23 -36 1 23 21 22 -37 1 21 23 24 -38 2 21 23 25 -39 1 25 23 24 -40 1 23 25 26 -41 2 23 25 27 -42 1 27 25 26 -43 2 17 27 25 -44 1 17 27 28 -45 1 25 27 28 -46 7 31 30 20 -47 7 32 30 20 -48 8 31 30 32 - -Dihedrals - -1 1 2 1 3 4 -2 2 5 3 1 2 -3 3 11 1 3 4 -4 4 11 1 3 5 -5 2 9 11 1 2 -6 5 2 1 11 12 -7 4 3 1 11 9 -8 2 3 1 11 12 -9 6 1 3 4 13 -10 7 1 3 4 14 -11 6 5 3 4 13 -12 7 5 3 4 14 -13 2 1 3 5 6 -14 4 1 3 5 7 -15 1 6 5 3 4 -16 3 7 5 3 4 -17 8 3 4 14 15 -18 8 3 4 14 16 -19 9 13 4 14 15 -20 9 13 4 14 16 -21 2 3 5 7 8 -22 4 3 5 7 9 -23 5 6 5 7 8 -24 2 9 7 5 6 -25 2 5 7 9 10 -26 4 5 7 9 11 -27 5 8 7 9 10 -28 2 11 9 7 8 -29 4 7 9 11 1 -30 2 7 9 11 12 -31 2 1 11 9 10 -32 5 10 9 11 12 -33 1 18 17 19 20 -34 2 21 19 17 18 -35 3 27 17 19 20 -36 4 27 17 19 21 -37 2 25 27 17 18 -38 5 18 17 27 28 -39 4 19 17 27 25 -40 2 19 17 27 28 -41 6 17 19 20 29 -42 7 17 19 20 30 -43 6 21 19 20 29 -44 7 21 19 20 30 -45 2 17 19 21 22 -46 4 17 19 21 23 -47 1 22 21 19 20 -48 3 23 21 19 20 -49 8 19 20 30 31 -50 8 19 20 30 32 -51 9 29 20 30 31 -52 9 29 20 30 32 -53 2 19 21 23 24 -54 4 19 21 23 25 -55 5 22 21 23 24 -56 2 25 23 21 22 -57 2 21 23 25 26 -58 4 21 23 25 27 -59 5 24 23 25 26 -60 2 27 25 23 24 -61 4 23 25 27 17 -62 2 23 25 27 28 -63 2 17 27 25 26 -64 5 26 25 27 28 - -Impropers - -1 1 3 1 11 2 -2 2 1 3 5 4 -3 3 3 4 13 14 -4 1 3 5 7 6 -5 1 5 7 9 8 -6 1 7 9 11 10 -7 1 1 11 9 12 -8 4 15 14 16 4 -9 1 19 17 27 18 -10 2 17 19 21 20 -11 3 19 20 29 30 -12 1 19 21 23 22 -13 1 21 23 25 24 -14 1 23 25 27 26 -15 1 17 27 25 28 -16 4 31 30 32 20 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/2styrene_unreacted.molecule_template b/examples/PACKAGES/reaction/tiny_polystyrene/2styrene_unreacted.molecule_template new file mode 100644 index 0000000000..44d01d7582 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_polystyrene/2styrene_unreacted.molecule_template @@ -0,0 +1,319 @@ +2styrene_unreacted + + 32 atoms + 32 bonds + 48 angles + 64 dihedrals + 16 impropers + +Coords + + 1 13.465814590 0.682534277 -1.658940911 + 2 14.397815704 1.221534133 -1.658940911 + 3 12.235815048 1.392534137 -1.658940911 + 4 12.235815048 2.892534256 -1.658940911 + 5 11.005815506 0.682534277 -1.658940911 + 6 10.073815346 1.221534133 -1.658940911 + 7 11.005815506 -0.737465739 -1.658940911 + 8 10.073815346 -1.276464581 -1.658940911 + 9 12.235815048 -1.447464824 -1.658940911 + 10 12.235815048 -2.524465084 -1.658940911 + 11 13.465814590 -0.737465739 -1.658940911 + 12 14.397815704 -1.276464581 -1.658940911 + 13 13.101815224 3.297534943 -1.301940918 + 14 10.957815170 3.441534996 -2.220940590 + 15 11.007814407 4.183535576 -2.319940567 + 16 10.314815521 2.618533611 -2.514940262 + 17 18.663515091 0.855481565 -1.372127652 + 18 19.595514297 1.394481659 -1.372127652 + 19 17.433511734 1.565481424 -1.372127652 + 20 17.433511734 3.065481663 -1.372127652 + 21 16.203512192 0.855481565 -1.372127652 + 22 15.271511078 1.394481659 -1.372127652 + 23 16.203512192 -0.564518392 -1.372127652 + 24 15.271511078 -1.103518248 -1.372127652 + 25 17.433511734 -1.274518251 -1.372127652 + 26 17.433511734 -2.351518154 -1.372127652 + 27 18.663515091 -0.564518392 -1.372127652 + 28 19.595514297 -1.103518248 -1.372127652 + 29 18.299512863 3.470481873 -1.015127659 + 30 16.155511856 3.614481926 -1.934127688 + 31 16.205513000 4.356481552 -2.033127785 + 32 15.512512207 2.791481972 -2.228127480 + +Types + + 1 cp + 2 hc + 3 cp + 4 c=1 + 5 cp + 6 hc + 7 cp + 8 hc + 9 cp + 10 hc + 11 cp + 12 hc + 13 hc + 14 c= + 15 hc + 16 hc + 17 cp + 18 hc + 19 cp + 20 c=1 + 21 cp + 22 hc + 23 cp + 24 hc + 25 cp + 26 hc + 27 cp + 28 hc + 29 hc + 30 c= + 31 hc + 32 hc + +Charges + + 1 -0.129000 + 2 0.123700 + 3 0.026600 + 4 -0.018200 + 5 -0.129000 + 6 0.123700 + 7 -0.173400 + 8 0.140300 + 9 -0.113400 + 10 0.128800 + 11 -0.173400 + 12 0.140300 + 13 0.051600 + 14 -0.069600 + 15 0.035400 + 16 0.035400 + 17 -0.129000 + 18 0.123700 + 19 0.026600 + 20 -0.018200 + 21 -0.129000 + 22 0.123700 + 23 -0.173400 + 24 0.140300 + 25 -0.113400 + 26 0.128800 + 27 -0.173400 + 28 0.140300 + 29 0.051600 + 30 -0.069600 + 31 0.035400 + 32 0.035400 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + 32 1 + +Bonds + + 1 cp-hc 1 2 + 2 cp-cp 1 3 + 3 cp-cp 1 11 + 4 cp-c=1 3 4 + 5 cp-cp 3 5 + 6 hc-c=1 13 4 + 7 c=1-c= 4 14 + 8 cp-hc 5 6 + 9 cp-cp 5 7 + 10 cp-hc 7 8 + 11 cp-cp 7 9 + 12 cp-hc 9 10 + 13 cp-cp 9 11 + 14 cp-hc 11 12 + 15 hc-c= 15 14 + 16 hc-c= 16 14 + 17 cp-hc 17 18 + 18 cp-cp 17 19 + 19 cp-cp 17 27 + 20 cp-c=1 19 20 + 21 cp-cp 19 21 + 22 hc-c=1 29 20 + 23 c=1-c= 20 30 + 24 cp-hc 21 22 + 25 cp-cp 21 23 + 26 cp-hc 23 24 + 27 cp-cp 23 25 + 28 cp-hc 25 26 + 29 cp-cp 25 27 + 30 cp-hc 27 28 + 31 hc-c= 31 30 + 32 hc-c= 32 30 + +Angles + + 1 cp-cp-hc 3 1 2 + 2 cp-cp-hc 11 1 2 + 3 cp-cp-cp 3 1 11 + 4 cp-cp-c=1 1 3 4 + 5 cp-cp-cp 1 3 5 + 6 cp-cp-c=1 5 3 4 + 7 cp-c=1-hc 3 4 13 + 8 cp-c=1-c= 3 4 14 + 9 hc-c=1-c= 13 4 14 + 10 cp-cp-hc 3 5 6 + 11 cp-cp-cp 3 5 7 + 12 cp-cp-hc 7 5 6 + 13 cp-cp-hc 5 7 8 + 14 cp-cp-cp 5 7 9 + 15 cp-cp-hc 9 7 8 + 16 cp-cp-hc 7 9 10 + 17 cp-cp-cp 7 9 11 + 18 cp-cp-hc 11 9 10 + 19 cp-cp-cp 1 11 9 + 20 cp-cp-hc 1 11 12 + 21 cp-cp-hc 9 11 12 + 22 hc-c=-c=1 15 14 4 + 23 hc-c=-c=1 16 14 4 + 24 hc-c=-hc 15 14 16 + 25 cp-cp-hc 19 17 18 + 26 cp-cp-hc 27 17 18 + 27 cp-cp-cp 19 17 27 + 28 cp-cp-c=1 17 19 20 + 29 cp-cp-cp 17 19 21 + 30 cp-cp-c=1 21 19 20 + 31 cp-c=1-hc 19 20 29 + 32 cp-c=1-c= 19 20 30 + 33 hc-c=1-c= 29 20 30 + 34 cp-cp-hc 19 21 22 + 35 cp-cp-cp 19 21 23 + 36 cp-cp-hc 23 21 22 + 37 cp-cp-hc 21 23 24 + 38 cp-cp-cp 21 23 25 + 39 cp-cp-hc 25 23 24 + 40 cp-cp-hc 23 25 26 + 41 cp-cp-cp 23 25 27 + 42 cp-cp-hc 27 25 26 + 43 cp-cp-cp 17 27 25 + 44 cp-cp-hc 17 27 28 + 45 cp-cp-hc 25 27 28 + 46 hc-c=-c=1 31 30 20 + 47 hc-c=-c=1 32 30 20 + 48 hc-c=-hc 31 30 32 + +Dihedrals + + 1 hc-cp-cp-c=1 2 1 3 4 + 2 cp-cp-cp-hc 5 3 1 2 + 3 cp-cp-cp-c=1 11 1 3 4 + 4 cp-cp-cp-cp 11 1 3 5 + 5 cp-cp-cp-hc 9 11 1 2 + 6 hc-cp-cp-hc 2 1 11 12 + 7 cp-cp-cp-cp 3 1 11 9 + 8 cp-cp-cp-hc 3 1 11 12 + 9 cp-cp-c=1-hc 1 3 4 13 + 10 cp-cp-c=1-c= 1 3 4 14 + 11 cp-cp-c=1-hc 5 3 4 13 + 12 cp-cp-c=1-c= 5 3 4 14 + 13 cp-cp-cp-hc 1 3 5 6 + 14 cp-cp-cp-cp 1 3 5 7 + 15 hc-cp-cp-c=1 6 5 3 4 + 16 cp-cp-cp-c=1 7 5 3 4 + 17 cp-c=1-c=-hc 3 4 14 15 + 18 cp-c=1-c=-hc 3 4 14 16 + 19 hc-c=1-c=-hc 13 4 14 15 + 20 hc-c=1-c=-hc 13 4 14 16 + 21 cp-cp-cp-hc 3 5 7 8 + 22 cp-cp-cp-cp 3 5 7 9 + 23 hc-cp-cp-hc 6 5 7 8 + 24 cp-cp-cp-hc 9 7 5 6 + 25 cp-cp-cp-hc 5 7 9 10 + 26 cp-cp-cp-cp 5 7 9 11 + 27 hc-cp-cp-hc 8 7 9 10 + 28 cp-cp-cp-hc 11 9 7 8 + 29 cp-cp-cp-cp 7 9 11 1 + 30 cp-cp-cp-hc 7 9 11 12 + 31 cp-cp-cp-hc 1 11 9 10 + 32 hc-cp-cp-hc 10 9 11 12 + 33 hc-cp-cp-c=1 18 17 19 20 + 34 cp-cp-cp-hc 21 19 17 18 + 35 cp-cp-cp-c=1 27 17 19 20 + 36 cp-cp-cp-cp 27 17 19 21 + 37 cp-cp-cp-hc 25 27 17 18 + 38 hc-cp-cp-hc 18 17 27 28 + 39 cp-cp-cp-cp 19 17 27 25 + 40 cp-cp-cp-hc 19 17 27 28 + 41 cp-cp-c=1-hc 17 19 20 29 + 42 cp-cp-c=1-c= 17 19 20 30 + 43 cp-cp-c=1-hc 21 19 20 29 + 44 cp-cp-c=1-c= 21 19 20 30 + 45 cp-cp-cp-hc 17 19 21 22 + 46 cp-cp-cp-cp 17 19 21 23 + 47 hc-cp-cp-c=1 22 21 19 20 + 48 cp-cp-cp-c=1 23 21 19 20 + 49 cp-c=1-c=-hc 19 20 30 31 + 50 cp-c=1-c=-hc 19 20 30 32 + 51 hc-c=1-c=-hc 29 20 30 31 + 52 hc-c=1-c=-hc 29 20 30 32 + 53 cp-cp-cp-hc 19 21 23 24 + 54 cp-cp-cp-cp 19 21 23 25 + 55 hc-cp-cp-hc 22 21 23 24 + 56 cp-cp-cp-hc 25 23 21 22 + 57 cp-cp-cp-hc 21 23 25 26 + 58 cp-cp-cp-cp 21 23 25 27 + 59 hc-cp-cp-hc 24 23 25 26 + 60 cp-cp-cp-hc 27 25 23 24 + 61 cp-cp-cp-cp 23 25 27 17 + 62 cp-cp-cp-hc 23 25 27 28 + 63 cp-cp-cp-hc 17 27 25 26 + 64 hc-cp-cp-hc 26 25 27 28 + +Impropers + + 1 cp-cp-cp-hc 3 1 11 2 + 2 cp-cp-cp-c=1 1 3 5 4 + 3 cp-c=1-hc-c= 3 4 13 14 + 4 cp-cp-cp-hc 3 5 7 6 + 5 cp-cp-cp-hc 5 7 9 8 + 6 cp-cp-cp-hc 7 9 11 10 + 7 cp-cp-cp-hc 1 11 9 12 + 8 hc-c=-hc-c=1 15 14 16 4 + 9 cp-cp-cp-hc 19 17 27 18 + 10 cp-cp-cp-c=1 17 19 21 20 + 11 cp-c=1-hc-c= 19 20 29 30 + 12 cp-cp-cp-hc 19 21 23 22 + 13 cp-cp-cp-hc 21 23 25 24 + 14 cp-cp-cp-hc 23 25 27 26 + 15 cp-cp-cp-hc 17 27 25 28 + 16 hc-c=-hc-c=1 31 30 32 20 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_reacted.data_template b/examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_reacted.data_template deleted file mode 100644 index e01d42b7fb..0000000000 --- a/examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_reacted.data_template +++ /dev/null @@ -1,497 +0,0 @@ -chain_chain_reacted - -50 atoms -52 bonds -90 angles -135 dihedrals -42 impropers - -Types - -1 1 -2 2 -3 1 -4 5 -5 1 -6 2 -7 1 -8 2 -9 1 -10 2 -11 1 -12 2 -13 2 -14 6 -15 2 -16 2 -17 5 -18 6 -19 2 -20 2 -21 1 -22 2 -23 1 -24 5 -25 1 -26 2 -27 1 -28 2 -29 1 -30 2 -31 1 -32 2 -33 2 -34 6 -35 1 -36 2 -37 1 -38 5 -39 1 -40 2 -41 1 -42 2 -43 1 -44 2 -45 1 -46 2 -47 2 -48 6 -49 2 -50 2 - -Charges - -1 -0.129000 -2 0.123700 -3 0.026600 -4 -0.018200 -5 -0.129000 -6 0.123700 -7 -0.173400 -8 0.140300 -9 -0.113400 -10 0.128800 -11 -0.173400 -12 0.140300 -13 0.051600 -14 -0.069600 -15 0.035400 -16 0.035400 -17 -0.018200 -18 -0.069600 -19 0.035400 -20 0.035400 -21 -0.129000 -22 0.123700 -23 0.026600 -24 -0.018200 -25 -0.129000 -26 0.123700 -27 -0.173400 -28 0.140300 -29 -0.113400 -30 0.128800 -31 -0.173400 -32 0.140300 -33 0.051600 -34 -0.069600 -35 -0.129000 -36 0.123700 -37 0.026600 -38 -0.018200 -39 -0.129000 -40 0.123700 -41 -0.173400 -42 0.140300 -43 -0.113400 -44 0.128800 -45 -0.173400 -46 0.140300 -47 0.051600 -48 -0.069600 -49 0.035400 -50 0.035400 - -Coords - -1 24.391510 0.871570 -1.658940 -2 25.323530 1.410570 -1.658940 -3 23.161520 1.581570 -1.658940 -4 23.161520 3.081570 -1.658940 -5 21.931530 0.871570 -1.658940 -6 20.999531 1.410570 -1.658940 -7 21.931530 -0.548430 -1.658940 -8 20.999531 -1.087420 -1.658940 -9 23.161520 -1.258420 -1.658940 -10 23.161520 -2.335430 -1.658940 -11 24.391510 -0.548430 -1.658940 -12 25.323530 -1.087420 -1.658940 -13 24.027519 3.486570 -1.301940 -14 21.883520 3.630570 -2.220940 -15 21.933510 4.372580 -2.319940 -16 21.240520 2.807570 -2.514940 -17 28.359209 3.254520 -1.372130 -18 27.081209 3.803520 -1.934130 -19 27.131210 4.545520 -2.033130 -20 26.438219 2.980520 -2.228130 -21 13.465810 0.682530 -1.658940 -22 14.397820 1.221530 -1.658940 -23 12.235820 1.392530 -1.658940 -24 12.235820 2.892530 -1.658940 -25 11.005820 0.682530 -1.658940 -26 10.073820 1.221530 -1.658940 -27 11.005820 -0.737470 -1.658940 -28 10.073820 -1.276460 -1.658940 -29 12.235820 -1.447460 -1.658940 -30 12.235820 -2.524470 -1.658940 -31 13.465810 -0.737470 -1.658940 -32 14.397820 -1.276460 -1.658940 -33 13.101820 3.297530 -1.301940 -34 10.957820 3.441530 -2.220940 -35 18.663521 0.855480 -1.372130 -36 19.595510 1.394480 -1.372130 -37 17.433510 1.565480 -1.372130 -38 17.433510 3.065480 -1.372130 -39 16.203510 0.855480 -1.372130 -40 15.271510 1.394480 -1.372130 -41 16.203510 -0.564520 -1.372130 -42 15.271510 -1.103520 -1.372130 -43 17.433510 -1.274520 -1.372130 -44 17.433510 -2.351520 -1.372130 -45 18.663521 -0.564520 -1.372130 -46 19.595510 -1.103520 -1.372130 -47 18.299509 3.470480 -1.015130 -48 16.155510 3.614480 -1.934130 -49 16.205509 4.356480 -2.033130 -50 15.512510 2.791480 -2.228130 - -Bonds - -1 1 1 2 -2 2 1 3 -3 2 1 11 -4 7 3 4 -5 2 3 5 -6 8 13 4 -7 9 4 14 -8 9 4 18 -9 1 5 6 -10 2 5 7 -11 1 7 8 -12 2 7 9 -13 1 9 10 -14 2 9 11 -15 1 11 12 -16 10 15 14 -17 10 16 14 -18 9 38 14 -19 9 17 18 -20 10 19 18 -21 10 20 18 -22 1 21 22 -23 2 21 23 -24 2 21 31 -25 7 23 24 -26 2 23 25 -27 8 33 24 -28 9 24 34 -29 9 24 48 -30 1 25 26 -31 2 25 27 -32 1 27 28 -33 2 27 29 -34 1 29 30 -35 2 29 31 -36 1 31 32 -37 1 35 36 -38 2 35 37 -39 2 35 45 -40 7 37 38 -41 2 37 39 -42 8 47 38 -43 9 38 48 -44 1 39 40 -45 2 39 41 -46 1 41 42 -47 2 41 43 -48 1 43 44 -49 2 43 45 -50 1 45 46 -51 10 49 48 -52 10 50 48 - -Angles - -1 1 3 1 2 -2 1 11 1 2 -3 2 3 1 11 -4 9 1 3 4 -5 2 1 3 5 -6 9 5 3 4 -7 10 3 4 13 -8 11 3 4 14 -9 11 3 4 18 -10 12 13 4 14 -11 12 13 4 18 -12 13 14 4 18 -13 1 3 5 6 -14 2 3 5 7 -15 1 7 5 6 -16 1 5 7 8 -17 2 5 7 9 -18 1 9 7 8 -19 1 7 9 10 -20 2 7 9 11 -21 1 11 9 10 -22 2 1 11 9 -23 1 1 11 12 -24 1 9 11 12 -25 14 15 14 4 -26 14 16 14 4 -27 16 4 14 38 -28 15 15 14 16 -29 14 15 14 38 -30 14 16 14 38 -31 16 4 18 17 -32 14 19 18 4 -33 14 20 18 4 -34 14 19 18 17 -35 14 20 18 17 -36 15 19 18 20 -37 1 23 21 22 -38 1 31 21 22 -39 2 23 21 31 -40 9 21 23 24 -41 2 21 23 25 -42 9 25 23 24 -43 10 23 24 33 -44 11 23 24 34 -45 11 23 24 48 -46 12 33 24 34 -47 12 33 24 48 -48 13 34 24 48 -49 1 23 25 26 -50 2 23 25 27 -51 1 27 25 26 -52 1 25 27 28 -53 2 25 27 29 -54 1 29 27 28 -55 1 27 29 30 -56 2 27 29 31 -57 1 31 29 30 -58 2 21 31 29 -59 1 21 31 32 -60 1 29 31 32 -61 1 37 35 36 -62 1 45 35 36 -63 2 37 35 45 -64 9 35 37 38 -65 2 35 37 39 -66 9 39 37 38 -67 11 37 38 14 -68 12 47 38 14 -69 13 14 38 48 -70 10 37 38 47 -71 11 37 38 48 -72 12 47 38 48 -73 1 37 39 40 -74 2 37 39 41 -75 1 41 39 40 -76 1 39 41 42 -77 2 39 41 43 -78 1 43 41 42 -79 1 41 43 44 -80 2 41 43 45 -81 1 45 43 44 -82 2 35 45 43 -83 1 35 45 46 -84 1 43 45 46 -85 16 24 48 38 -86 14 49 48 24 -87 14 50 48 24 -88 14 49 48 38 -89 14 50 48 38 -90 15 49 48 50 - -Dihedrals - -1 10 2 1 3 4 -2 2 5 3 1 2 -3 11 11 1 3 4 -4 4 11 1 3 5 -5 2 9 11 1 2 -6 5 2 1 11 12 -7 4 3 1 11 9 -8 2 3 1 11 12 -9 12 1 3 4 13 -10 13 1 3 4 14 -11 13 1 3 4 18 -12 12 5 3 4 13 -13 13 5 3 4 14 -14 13 5 3 4 18 -15 2 1 3 5 6 -16 4 1 3 5 7 -17 10 6 5 3 4 -18 11 7 5 3 4 -19 14 3 4 14 15 -20 14 3 4 14 16 -21 17 3 4 14 38 -22 15 13 4 14 15 -23 15 13 4 14 16 -24 18 13 4 14 38 -25 16 18 4 14 15 -26 16 18 4 14 16 -27 19 18 4 14 38 -28 17 3 4 18 17 -29 14 3 4 18 19 -30 14 3 4 18 20 -31 18 13 4 18 17 -32 15 13 4 18 19 -33 15 13 4 18 20 -34 19 14 4 18 17 -35 16 14 4 18 19 -36 16 14 4 18 20 -37 2 3 5 7 8 -38 4 3 5 7 9 -39 5 6 5 7 8 -40 2 9 7 5 6 -41 2 5 7 9 10 -42 4 5 7 9 11 -43 5 8 7 9 10 -44 2 11 9 7 8 -45 4 7 9 11 1 -46 2 7 9 11 12 -47 2 1 11 9 10 -48 5 10 9 11 12 -49 17 37 38 14 4 -50 18 47 38 14 4 -51 19 48 38 14 4 -52 14 37 38 14 15 -53 15 47 38 14 15 -54 16 48 38 14 15 -55 14 37 38 14 16 -56 15 47 38 14 16 -57 16 48 38 14 16 -58 10 22 21 23 24 -59 2 25 23 21 22 -60 11 31 21 23 24 -61 4 31 21 23 25 -62 2 29 31 21 22 -63 5 22 21 31 32 -64 4 23 21 31 29 -65 2 23 21 31 32 -66 12 21 23 24 33 -67 13 21 23 24 34 -68 13 21 23 24 48 -69 12 25 23 24 33 -70 13 25 23 24 34 -71 13 25 23 24 48 -72 2 21 23 25 26 -73 4 21 23 25 27 -74 10 26 25 23 24 -75 11 27 25 23 24 -76 17 23 24 48 38 -77 14 23 24 48 49 -78 14 23 24 48 50 -79 18 33 24 48 38 -80 15 33 24 48 49 -81 15 33 24 48 50 -82 19 34 24 48 38 -83 16 34 24 48 49 -84 16 34 24 48 50 -85 2 23 25 27 28 -86 4 23 25 27 29 -87 5 26 25 27 28 -88 2 29 27 25 26 -89 2 25 27 29 30 -90 4 25 27 29 31 -91 5 28 27 29 30 -92 2 31 29 27 28 -93 4 27 29 31 21 -94 2 27 29 31 32 -95 2 21 31 29 30 -96 5 30 29 31 32 -97 10 36 35 37 38 -98 2 39 37 35 36 -99 11 45 35 37 38 -100 4 45 35 37 39 -101 2 43 45 35 36 -102 5 36 35 45 46 -103 4 37 35 45 43 -104 2 37 35 45 46 -105 13 35 37 38 14 -106 12 35 37 38 47 -107 13 35 37 38 48 -108 13 39 37 38 14 -109 12 39 37 38 47 -110 13 39 37 38 48 -111 2 35 37 39 40 -112 4 35 37 39 41 -113 10 40 39 37 38 -114 11 41 39 37 38 -115 19 14 38 48 24 -116 16 14 38 48 49 -117 16 14 38 48 50 -118 17 37 38 48 24 -119 14 37 38 48 49 -120 14 37 38 48 50 -121 18 47 38 48 24 -122 15 47 38 48 49 -123 15 47 38 48 50 -124 2 37 39 41 42 -125 4 37 39 41 43 -126 5 40 39 41 42 -127 2 43 41 39 40 -128 2 39 41 43 44 -129 4 39 41 43 45 -130 5 42 41 43 44 -131 2 45 43 41 42 -132 4 41 43 45 35 -133 2 41 43 45 46 -134 2 35 45 43 44 -135 5 44 43 45 46 - -Impropers - -1 1 3 1 11 2 -2 5 1 3 5 4 -3 1 3 5 7 6 -4 1 5 7 9 8 -5 1 7 9 11 10 -6 1 1 11 9 12 -7 1 23 21 31 22 -8 5 21 23 25 24 -9 1 23 25 27 26 -10 1 25 27 29 28 -11 1 27 29 31 30 -12 1 21 31 29 32 -13 1 37 35 45 36 -14 5 35 37 39 38 -15 1 37 39 41 40 -16 1 39 41 43 42 -17 1 41 43 45 44 -18 1 35 45 43 46 -19 1 3 4 13 14 -20 1 3 4 13 18 -21 1 3 4 14 18 -22 1 13 4 14 18 -23 1 15 14 16 4 -24 1 15 14 4 38 -25 1 16 14 4 38 -26 1 15 14 16 38 -27 1 19 18 17 4 -28 1 20 18 17 4 -29 1 19 18 20 4 -30 1 19 18 20 17 -31 1 23 24 33 34 -32 1 23 24 33 48 -33 1 23 24 34 48 -34 1 33 24 34 48 -35 1 37 38 47 14 -36 1 37 38 14 48 -37 1 47 38 14 48 -38 1 37 38 47 48 -39 1 49 48 38 24 -40 1 50 48 38 24 -41 1 49 48 50 24 -42 1 49 48 50 38 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_reacted.molecule_template b/examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_reacted.molecule_template new file mode 100644 index 0000000000..3eca90c7c8 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_reacted.molecule_template @@ -0,0 +1,526 @@ +chain_chain_reacted + + 50 atoms + 52 bonds + 90 angles + 135 dihedrals + 18 impropers + +Coords + + 1 24.391510010 0.871569991 -1.658939958 + 2 25.323530197 1.410570025 -1.658939958 + 3 23.161520004 1.581570029 -1.658939958 + 4 23.161520004 3.081569910 -1.658939958 + 5 21.931529999 0.871569991 -1.658939958 + 6 20.999530792 1.410570025 -1.658939958 + 7 21.931529999 -0.548430026 -1.658939958 + 8 20.999530792 -1.087419987 -1.658939958 + 9 23.161520004 -1.258419991 -1.658939958 + 10 23.161520004 -2.335429907 -1.658939958 + 11 24.391510010 -0.548430026 -1.658939958 + 12 25.323530197 -1.087419987 -1.658939958 + 13 24.027519226 3.486569881 -1.301939964 + 14 21.883520126 3.630569935 -2.220940113 + 15 21.933509827 4.372580051 -2.319940090 + 16 21.240520477 2.807569981 -2.514940023 + 17 28.359209061 3.254519939 -1.372130036 + 18 27.081209183 3.803519964 -1.934129953 + 19 27.131210327 4.545519829 -2.033129930 + 20 26.438219070 2.980520010 -2.228130102 + 21 13.465809822 0.682529986 -1.658939958 + 22 14.397820473 1.221529961 -1.658939958 + 23 12.235819817 1.392529964 -1.658939958 + 24 12.235819817 2.892529964 -1.658939958 + 25 11.005820274 0.682529986 -1.658939958 + 26 10.073820114 1.221529961 -1.658939958 + 27 11.005820274 -0.737469971 -1.658939958 + 28 10.073820114 -1.276460052 -1.658939958 + 29 12.235819817 -1.447460055 -1.658939958 + 30 12.235819817 -2.524470091 -1.658939958 + 31 13.465809822 -0.737469971 -1.658939958 + 32 14.397820473 -1.276460052 -1.658939958 + 33 13.101819992 3.297529936 -1.301939964 + 34 10.957819939 3.441529989 -2.220940113 + 35 18.663520813 0.855480015 -1.372130036 + 36 19.595510483 1.394479990 -1.372130036 + 37 17.433509827 1.565479994 -1.372130036 + 38 17.433509827 3.065479994 -1.372130036 + 39 16.203510284 0.855480015 -1.372130036 + 40 15.271510124 1.394479990 -1.372130036 + 41 16.203510284 -0.564520001 -1.372130036 + 42 15.271510124 -1.103520036 -1.372130036 + 43 17.433509827 -1.274520040 -1.372130036 + 44 17.433509827 -2.351520061 -1.372130036 + 45 18.663520813 -0.564520001 -1.372130036 + 46 19.595510483 -1.103520036 -1.372130036 + 47 18.299509048 3.470479965 -1.015130043 + 48 16.155509949 3.614480019 -1.934129953 + 49 16.205509186 4.356480122 -2.033129930 + 50 15.512510300 2.791480064 -2.228130102 + +Types + + 1 cp + 2 hc + 3 cp + 4 c1 + 5 cp + 6 hc + 7 cp + 8 hc + 9 cp + 10 hc + 11 cp + 12 hc + 13 hc + 14 c2 + 15 hc + 16 hc + 17 c1 + 18 c2 + 19 hc + 20 hc + 21 cp + 22 hc + 23 cp + 24 c1 + 25 cp + 26 hc + 27 cp + 28 hc + 29 cp + 30 hc + 31 cp + 32 hc + 33 hc + 34 c2 + 35 cp + 36 hc + 37 cp + 38 c1 + 39 cp + 40 hc + 41 cp + 42 hc + 43 cp + 44 hc + 45 cp + 46 hc + 47 hc + 48 c2 + 49 hc + 50 hc + +Charges + + 1 -0.129000 + 2 0.123700 + 3 0.026600 + 4 -0.018200 + 5 -0.129000 + 6 0.123700 + 7 -0.173400 + 8 0.140300 + 9 -0.113400 + 10 0.128800 + 11 -0.173400 + 12 0.140300 + 13 0.051600 + 14 -0.069600 + 15 0.035400 + 16 0.035400 + 17 -0.018200 + 18 -0.069600 + 19 0.035400 + 20 0.035400 + 21 -0.129000 + 22 0.123700 + 23 0.026600 + 24 -0.018200 + 25 -0.129000 + 26 0.123700 + 27 -0.173400 + 28 0.140300 + 29 -0.113400 + 30 0.128800 + 31 -0.173400 + 32 0.140300 + 33 0.051600 + 34 -0.069600 + 35 -0.129000 + 36 0.123700 + 37 0.026600 + 38 -0.018200 + 39 -0.129000 + 40 0.123700 + 41 -0.173400 + 42 0.140300 + 43 -0.113400 + 44 0.128800 + 45 -0.173400 + 46 0.140300 + 47 0.051600 + 48 -0.069600 + 49 0.035400 + 50 0.035400 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + 32 1 + 33 1 + 34 1 + 35 1 + 36 1 + 37 1 + 38 1 + 39 1 + 40 1 + 41 1 + 42 1 + 43 1 + 44 1 + 45 1 + 46 1 + 47 1 + 48 1 + 49 1 + 50 1 + +Bonds + + 1 cp-hc 1 2 + 2 cp-cp 1 3 + 3 cp-cp 1 11 + 4 cp-c1 3 4 + 5 cp-cp 3 5 + 6 hc-c1 13 4 + 7 c1-c2 4 14 + 8 c1-c2 4 18 + 9 cp-hc 5 6 + 10 cp-cp 5 7 + 11 cp-hc 7 8 + 12 cp-cp 7 9 + 13 cp-hc 9 10 + 14 cp-cp 9 11 + 15 cp-hc 11 12 + 16 hc-c2 15 14 + 17 hc-c2 16 14 + 18 c1-c2 38 14 + 19 c1-c2 17 18 + 20 hc-c2 19 18 + 21 hc-c2 20 18 + 22 cp-hc 21 22 + 23 cp-cp 21 23 + 24 cp-cp 21 31 + 25 cp-c1 23 24 + 26 cp-cp 23 25 + 27 hc-c1 33 24 + 28 c1-c2 24 34 + 29 c1-c2 24 48 + 30 cp-hc 25 26 + 31 cp-cp 25 27 + 32 cp-hc 27 28 + 33 cp-cp 27 29 + 34 cp-hc 29 30 + 35 cp-cp 29 31 + 36 cp-hc 31 32 + 37 cp-hc 35 36 + 38 cp-cp 35 37 + 39 cp-cp 35 45 + 40 cp-c1 37 38 + 41 cp-cp 37 39 + 42 hc-c1 47 38 + 43 c1-c2 38 48 + 44 cp-hc 39 40 + 45 cp-cp 39 41 + 46 cp-hc 41 42 + 47 cp-cp 41 43 + 48 cp-hc 43 44 + 49 cp-cp 43 45 + 50 cp-hc 45 46 + 51 hc-c2 49 48 + 52 hc-c2 50 48 + +Angles + + 1 cp-cp-hc 3 1 2 + 2 cp-cp-hc 11 1 2 + 3 cp-cp-cp 3 1 11 + 4 cp-cp-c1 1 3 4 + 5 cp-cp-cp 1 3 5 + 6 cp-cp-c1 5 3 4 + 7 cp-c1-hc 3 4 13 + 8 cp-c1-c2 3 4 14 + 9 cp-c1-c2 3 4 18 + 10 hc-c1-c2 13 4 14 + 11 hc-c1-c2 13 4 18 + 12 c2-c1-c2 14 4 18 + 13 cp-cp-hc 3 5 6 + 14 cp-cp-cp 3 5 7 + 15 cp-cp-hc 7 5 6 + 16 cp-cp-hc 5 7 8 + 17 cp-cp-cp 5 7 9 + 18 cp-cp-hc 9 7 8 + 19 cp-cp-hc 7 9 10 + 20 cp-cp-cp 7 9 11 + 21 cp-cp-hc 11 9 10 + 22 cp-cp-cp 1 11 9 + 23 cp-cp-hc 1 11 12 + 24 cp-cp-hc 9 11 12 + 25 hc-c2-c1 15 14 4 + 26 hc-c2-c1 16 14 4 + 27 c1-c2-c1 4 14 38 + 28 hc-c2-hc 15 14 16 + 29 hc-c2-c1 15 14 38 + 30 hc-c2-c1 16 14 38 + 31 c1-c2-c1 4 18 17 + 32 hc-c2-c1 19 18 4 + 33 hc-c2-c1 20 18 4 + 34 hc-c2-c1 19 18 17 + 35 hc-c2-c1 20 18 17 + 36 hc-c2-hc 19 18 20 + 37 cp-cp-hc 23 21 22 + 38 cp-cp-hc 31 21 22 + 39 cp-cp-cp 23 21 31 + 40 cp-cp-c1 21 23 24 + 41 cp-cp-cp 21 23 25 + 42 cp-cp-c1 25 23 24 + 43 cp-c1-hc 23 24 33 + 44 cp-c1-c2 23 24 34 + 45 cp-c1-c2 23 24 48 + 46 hc-c1-c2 33 24 34 + 47 hc-c1-c2 33 24 48 + 48 c2-c1-c2 34 24 48 + 49 cp-cp-hc 23 25 26 + 50 cp-cp-cp 23 25 27 + 51 cp-cp-hc 27 25 26 + 52 cp-cp-hc 25 27 28 + 53 cp-cp-cp 25 27 29 + 54 cp-cp-hc 29 27 28 + 55 cp-cp-hc 27 29 30 + 56 cp-cp-cp 27 29 31 + 57 cp-cp-hc 31 29 30 + 58 cp-cp-cp 21 31 29 + 59 cp-cp-hc 21 31 32 + 60 cp-cp-hc 29 31 32 + 61 cp-cp-hc 37 35 36 + 62 cp-cp-hc 45 35 36 + 63 cp-cp-cp 37 35 45 + 64 cp-cp-c1 35 37 38 + 65 cp-cp-cp 35 37 39 + 66 cp-cp-c1 39 37 38 + 67 cp-c1-c2 37 38 14 + 68 hc-c1-c2 47 38 14 + 69 c2-c1-c2 14 38 48 + 70 cp-c1-hc 37 38 47 + 71 cp-c1-c2 37 38 48 + 72 hc-c1-c2 47 38 48 + 73 cp-cp-hc 37 39 40 + 74 cp-cp-cp 37 39 41 + 75 cp-cp-hc 41 39 40 + 76 cp-cp-hc 39 41 42 + 77 cp-cp-cp 39 41 43 + 78 cp-cp-hc 43 41 42 + 79 cp-cp-hc 41 43 44 + 80 cp-cp-cp 41 43 45 + 81 cp-cp-hc 45 43 44 + 82 cp-cp-cp 35 45 43 + 83 cp-cp-hc 35 45 46 + 84 cp-cp-hc 43 45 46 + 85 c1-c2-c1 24 48 38 + 86 hc-c2-c1 49 48 24 + 87 hc-c2-c1 50 48 24 + 88 hc-c2-c1 49 48 38 + 89 hc-c2-c1 50 48 38 + 90 hc-c2-hc 49 48 50 + +Dihedrals + + 1 hc-cp-cp-c1 2 1 3 4 + 2 cp-cp-cp-hc 5 3 1 2 + 3 cp-cp-cp-c1 11 1 3 4 + 4 cp-cp-cp-cp 11 1 3 5 + 5 cp-cp-cp-hc 9 11 1 2 + 6 hc-cp-cp-hc 2 1 11 12 + 7 cp-cp-cp-cp 3 1 11 9 + 8 cp-cp-cp-hc 3 1 11 12 + 9 cp-cp-c1-hc 1 3 4 13 + 10 cp-cp-c1-c2 1 3 4 14 + 11 cp-cp-c1-c2 1 3 4 18 + 12 cp-cp-c1-hc 5 3 4 13 + 13 cp-cp-c1-c2 5 3 4 14 + 14 cp-cp-c1-c2 5 3 4 18 + 15 cp-cp-cp-hc 1 3 5 6 + 16 cp-cp-cp-cp 1 3 5 7 + 17 hc-cp-cp-c1 6 5 3 4 + 18 cp-cp-cp-c1 7 5 3 4 + 19 cp-c1-c2-hc 3 4 14 15 + 20 cp-c1-c2-hc 3 4 14 16 + 21 cp-c1-c2-c1 3 4 14 38 + 22 hc-c1-c2-hc 13 4 14 15 + 23 hc-c1-c2-hc 13 4 14 16 + 24 hc-c1-c2-c1 13 4 14 38 + 25 c2-c1-c2-hc 18 4 14 15 + 26 c2-c1-c2-hc 18 4 14 16 + 27 c2-c1-c2-c1 18 4 14 38 + 28 cp-c1-c2-c1 3 4 18 17 + 29 cp-c1-c2-hc 3 4 18 19 + 30 cp-c1-c2-hc 3 4 18 20 + 31 hc-c1-c2-c1 13 4 18 17 + 32 hc-c1-c2-hc 13 4 18 19 + 33 hc-c1-c2-hc 13 4 18 20 + 34 c2-c1-c2-c1 14 4 18 17 + 35 c2-c1-c2-hc 14 4 18 19 + 36 c2-c1-c2-hc 14 4 18 20 + 37 cp-cp-cp-hc 3 5 7 8 + 38 cp-cp-cp-cp 3 5 7 9 + 39 hc-cp-cp-hc 6 5 7 8 + 40 cp-cp-cp-hc 9 7 5 6 + 41 cp-cp-cp-hc 5 7 9 10 + 42 cp-cp-cp-cp 5 7 9 11 + 43 hc-cp-cp-hc 8 7 9 10 + 44 cp-cp-cp-hc 11 9 7 8 + 45 cp-cp-cp-cp 7 9 11 1 + 46 cp-cp-cp-hc 7 9 11 12 + 47 cp-cp-cp-hc 1 11 9 10 + 48 hc-cp-cp-hc 10 9 11 12 + 49 cp-c1-c2-c1 37 38 14 4 + 50 hc-c1-c2-c1 47 38 14 4 + 51 c2-c1-c2-c1 48 38 14 4 + 52 cp-c1-c2-hc 37 38 14 15 + 53 hc-c1-c2-hc 47 38 14 15 + 54 c2-c1-c2-hc 48 38 14 15 + 55 cp-c1-c2-hc 37 38 14 16 + 56 hc-c1-c2-hc 47 38 14 16 + 57 c2-c1-c2-hc 48 38 14 16 + 58 hc-cp-cp-c1 22 21 23 24 + 59 cp-cp-cp-hc 25 23 21 22 + 60 cp-cp-cp-c1 31 21 23 24 + 61 cp-cp-cp-cp 31 21 23 25 + 62 cp-cp-cp-hc 29 31 21 22 + 63 hc-cp-cp-hc 22 21 31 32 + 64 cp-cp-cp-cp 23 21 31 29 + 65 cp-cp-cp-hc 23 21 31 32 + 66 cp-cp-c1-hc 21 23 24 33 + 67 cp-cp-c1-c2 21 23 24 34 + 68 cp-cp-c1-c2 21 23 24 48 + 69 cp-cp-c1-hc 25 23 24 33 + 70 cp-cp-c1-c2 25 23 24 34 + 71 cp-cp-c1-c2 25 23 24 48 + 72 cp-cp-cp-hc 21 23 25 26 + 73 cp-cp-cp-cp 21 23 25 27 + 74 hc-cp-cp-c1 26 25 23 24 + 75 cp-cp-cp-c1 27 25 23 24 + 76 cp-c1-c2-c1 23 24 48 38 + 77 cp-c1-c2-hc 23 24 48 49 + 78 cp-c1-c2-hc 23 24 48 50 + 79 hc-c1-c2-c1 33 24 48 38 + 80 hc-c1-c2-hc 33 24 48 49 + 81 hc-c1-c2-hc 33 24 48 50 + 82 c2-c1-c2-c1 34 24 48 38 + 83 c2-c1-c2-hc 34 24 48 49 + 84 c2-c1-c2-hc 34 24 48 50 + 85 cp-cp-cp-hc 23 25 27 28 + 86 cp-cp-cp-cp 23 25 27 29 + 87 hc-cp-cp-hc 26 25 27 28 + 88 cp-cp-cp-hc 29 27 25 26 + 89 cp-cp-cp-hc 25 27 29 30 + 90 cp-cp-cp-cp 25 27 29 31 + 91 hc-cp-cp-hc 28 27 29 30 + 92 cp-cp-cp-hc 31 29 27 28 + 93 cp-cp-cp-cp 27 29 31 21 + 94 cp-cp-cp-hc 27 29 31 32 + 95 cp-cp-cp-hc 21 31 29 30 + 96 hc-cp-cp-hc 30 29 31 32 + 97 hc-cp-cp-c1 36 35 37 38 + 98 cp-cp-cp-hc 39 37 35 36 + 99 cp-cp-cp-c1 45 35 37 38 + 100 cp-cp-cp-cp 45 35 37 39 + 101 cp-cp-cp-hc 43 45 35 36 + 102 hc-cp-cp-hc 36 35 45 46 + 103 cp-cp-cp-cp 37 35 45 43 + 104 cp-cp-cp-hc 37 35 45 46 + 105 cp-cp-c1-c2 35 37 38 14 + 106 cp-cp-c1-hc 35 37 38 47 + 107 cp-cp-c1-c2 35 37 38 48 + 108 cp-cp-c1-c2 39 37 38 14 + 109 cp-cp-c1-hc 39 37 38 47 + 110 cp-cp-c1-c2 39 37 38 48 + 111 cp-cp-cp-hc 35 37 39 40 + 112 cp-cp-cp-cp 35 37 39 41 + 113 hc-cp-cp-c1 40 39 37 38 + 114 cp-cp-cp-c1 41 39 37 38 + 115 c2-c1-c2-c1 14 38 48 24 + 116 c2-c1-c2-hc 14 38 48 49 + 117 c2-c1-c2-hc 14 38 48 50 + 118 cp-c1-c2-c1 37 38 48 24 + 119 cp-c1-c2-hc 37 38 48 49 + 120 cp-c1-c2-hc 37 38 48 50 + 121 hc-c1-c2-c1 47 38 48 24 + 122 hc-c1-c2-hc 47 38 48 49 + 123 hc-c1-c2-hc 47 38 48 50 + 124 cp-cp-cp-hc 37 39 41 42 + 125 cp-cp-cp-cp 37 39 41 43 + 126 hc-cp-cp-hc 40 39 41 42 + 127 cp-cp-cp-hc 43 41 39 40 + 128 cp-cp-cp-hc 39 41 43 44 + 129 cp-cp-cp-cp 39 41 43 45 + 130 hc-cp-cp-hc 42 41 43 44 + 131 cp-cp-cp-hc 45 43 41 42 + 132 cp-cp-cp-cp 41 43 45 35 + 133 cp-cp-cp-hc 41 43 45 46 + 134 cp-cp-cp-hc 35 45 43 44 + 135 hc-cp-cp-hc 44 43 45 46 + +Impropers + + 1 cp-cp-cp-hc 3 1 11 2 + 2 cp-cp-cp-c1 1 3 5 4 + 3 cp-cp-cp-hc 3 5 7 6 + 4 cp-cp-cp-hc 5 7 9 8 + 5 cp-cp-cp-hc 7 9 11 10 + 6 cp-cp-cp-hc 1 11 9 12 + 7 cp-cp-cp-hc 23 21 31 22 + 8 cp-cp-cp-c1 21 23 25 24 + 9 cp-cp-cp-hc 23 25 27 26 + 10 cp-cp-cp-hc 25 27 29 28 + 11 cp-cp-cp-hc 27 29 31 30 + 12 cp-cp-cp-hc 21 31 29 32 + 13 cp-cp-cp-hc 37 35 45 36 + 14 cp-cp-cp-c1 35 37 39 38 + 15 cp-cp-cp-hc 37 39 41 40 + 16 cp-cp-cp-hc 39 41 43 42 + 17 cp-cp-cp-hc 41 43 45 44 + 18 cp-cp-cp-hc 35 45 43 46 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_unreacted.data_template b/examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_unreacted.data_template deleted file mode 100644 index d8e0d977df..0000000000 --- a/examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_unreacted.data_template +++ /dev/null @@ -1,467 +0,0 @@ -chain_chain_unreacted - -50 atoms -51 bonds -84 angles -118 dihedrals -36 impropers - -Types - -1 1 -2 2 -3 1 -4 5 -5 1 -6 2 -7 1 -8 2 -9 1 -10 2 -11 1 -12 2 -13 2 -14 6 -15 2 -16 2 -17 5 -18 6 -19 2 -20 2 -21 1 -22 2 -23 1 -24 5 -25 1 -26 2 -27 1 -28 2 -29 1 -30 2 -31 1 -32 2 -33 2 -34 6 -35 1 -36 2 -37 1 -38 5 -39 1 -40 2 -41 1 -42 2 -43 1 -44 2 -45 1 -46 2 -47 2 -48 6 -49 2 -50 2 - -Charges - -1 -0.129000 -2 0.123700 -3 0.026600 -4 -0.018200 -5 -0.129000 -6 0.123700 -7 -0.173400 -8 0.140300 -9 -0.113400 -10 0.128800 -11 -0.173400 -12 0.140300 -13 0.051600 -14 -0.069600 -15 0.035400 -16 0.035400 -17 -0.018200 -18 -0.069600 -19 0.035400 -20 0.035400 -21 -0.129000 -22 0.123700 -23 0.026600 -24 -0.018200 -25 -0.129000 -26 0.123700 -27 -0.173400 -28 0.140300 -29 -0.113400 -30 0.128800 -31 -0.173400 -32 0.140300 -33 0.051600 -34 -0.069600 -35 -0.129000 -36 0.123700 -37 0.026600 -38 -0.018200 -39 -0.129000 -40 0.123700 -41 -0.173400 -42 0.140300 -43 -0.113400 -44 0.128800 -45 -0.173400 -46 0.140300 -47 0.051600 -48 -0.069600 -49 0.035400 -50 0.035400 - -Coords - -1 24.391510 0.871570 -1.658940 -2 25.323530 1.410570 -1.658940 -3 23.161520 1.581570 -1.658940 -4 23.161520 3.081570 -1.658940 -5 21.931530 0.871570 -1.658940 -6 20.999531 1.410570 -1.658940 -7 21.931530 -0.548430 -1.658940 -8 20.999531 -1.087420 -1.658940 -9 23.161520 -1.258420 -1.658940 -10 23.161520 -2.335430 -1.658940 -11 24.391510 -0.548430 -1.658940 -12 25.323530 -1.087420 -1.658940 -13 24.027519 3.486570 -1.301940 -14 21.883520 3.630570 -2.220940 -15 21.933510 4.372580 -2.319940 -16 21.240520 2.807570 -2.514940 -17 28.359209 3.254520 -1.372130 -18 27.081209 3.803520 -1.934130 -19 27.131210 4.545520 -2.033130 -20 26.438219 2.980520 -2.228130 -21 13.465810 0.682530 -1.658940 -22 14.397820 1.221530 -1.658940 -23 12.235820 1.392530 -1.658940 -24 12.235820 2.892530 -1.658940 -25 11.005820 0.682530 -1.658940 -26 10.073820 1.221530 -1.658940 -27 11.005820 -0.737470 -1.658940 -28 10.073820 -1.276460 -1.658940 -29 12.235820 -1.447460 -1.658940 -30 12.235820 -2.524470 -1.658940 -31 13.465810 -0.737470 -1.658940 -32 14.397820 -1.276460 -1.658940 -33 13.101820 3.297530 -1.301940 -34 10.957820 3.441530 -2.220940 -35 18.663521 0.855480 -1.372130 -36 19.595510 1.394480 -1.372130 -37 17.433510 1.565480 -1.372130 -38 17.433510 3.065480 -1.372130 -39 16.203510 0.855480 -1.372130 -40 15.271510 1.394480 -1.372130 -41 16.203510 -0.564520 -1.372130 -42 15.271510 -1.103520 -1.372130 -43 17.433510 -1.274520 -1.372130 -44 17.433510 -2.351520 -1.372130 -45 18.663521 -0.564520 -1.372130 -46 19.595510 -1.103520 -1.372130 -47 18.299509 3.470480 -1.015130 -48 16.155510 3.614480 -1.934130 -49 16.205509 4.356480 -2.033130 -50 15.512510 2.791480 -2.228130 - -Bonds - -1 1 1 2 -2 2 1 3 -3 2 1 11 -4 7 3 4 -5 2 3 5 -6 8 13 4 -7 9 4 14 -8 9 4 18 -9 1 5 6 -10 2 5 7 -11 1 7 8 -12 2 7 9 -13 1 9 10 -14 2 9 11 -15 1 11 12 -16 10 15 14 -17 10 16 14 -18 9 17 18 -19 10 19 18 -20 10 20 18 -21 1 21 22 -22 2 21 23 -23 2 21 31 -24 7 23 24 -25 2 23 25 -26 8 33 24 -27 9 24 34 -28 9 24 48 -29 1 25 26 -30 2 25 27 -31 1 27 28 -32 2 27 29 -33 1 29 30 -34 2 29 31 -35 1 31 32 -36 1 35 36 -37 2 35 37 -38 2 35 45 -39 7 37 38 -40 2 37 39 -41 8 47 38 -42 9 38 48 -43 1 39 40 -44 2 39 41 -45 1 41 42 -46 2 41 43 -47 1 43 44 -48 2 43 45 -49 1 45 46 -50 10 49 48 -51 10 50 48 - -Angles - -1 1 3 1 2 -2 1 11 1 2 -3 2 3 1 11 -4 9 1 3 4 -5 2 1 3 5 -6 9 5 3 4 -7 10 3 4 13 -8 11 3 4 14 -9 11 3 4 18 -10 12 13 4 14 -11 12 13 4 18 -12 13 14 4 18 -13 1 3 5 6 -14 2 3 5 7 -15 1 7 5 6 -16 1 5 7 8 -17 2 5 7 9 -18 1 9 7 8 -19 1 7 9 10 -20 2 7 9 11 -21 1 11 9 10 -22 2 1 11 9 -23 1 1 11 12 -24 1 9 11 12 -25 14 15 14 4 -26 14 16 14 4 -27 15 15 14 16 -28 16 4 18 17 -29 14 19 18 4 -30 14 20 18 4 -31 14 19 18 17 -32 14 20 18 17 -33 15 19 18 20 -34 1 23 21 22 -35 1 31 21 22 -36 2 23 21 31 -37 9 21 23 24 -38 2 21 23 25 -39 9 25 23 24 -40 10 23 24 33 -41 11 23 24 34 -42 11 23 24 48 -43 12 33 24 34 -44 12 33 24 48 -45 13 34 24 48 -46 1 23 25 26 -47 2 23 25 27 -48 1 27 25 26 -49 1 25 27 28 -50 2 25 27 29 -51 1 29 27 28 -52 1 27 29 30 -53 2 27 29 31 -54 1 31 29 30 -55 2 21 31 29 -56 1 21 31 32 -57 1 29 31 32 -58 1 37 35 36 -59 1 45 35 36 -60 2 37 35 45 -61 9 35 37 38 -62 2 35 37 39 -63 9 39 37 38 -64 10 37 38 47 -65 11 37 38 48 -66 12 47 38 48 -67 1 37 39 40 -68 2 37 39 41 -69 1 41 39 40 -70 1 39 41 42 -71 2 39 41 43 -72 1 43 41 42 -73 1 41 43 44 -74 2 41 43 45 -75 1 45 43 44 -76 2 35 45 43 -77 1 35 45 46 -78 1 43 45 46 -79 16 24 48 38 -80 14 49 48 24 -81 14 50 48 24 -82 14 49 48 38 -83 14 50 48 38 -84 15 49 48 50 - -Dihedrals - -1 10 2 1 3 4 -2 2 5 3 1 2 -3 11 11 1 3 4 -4 4 11 1 3 5 -5 2 9 11 1 2 -6 5 2 1 11 12 -7 4 3 1 11 9 -8 2 3 1 11 12 -9 12 1 3 4 13 -10 13 1 3 4 14 -11 13 1 3 4 18 -12 12 5 3 4 13 -13 13 5 3 4 14 -14 13 5 3 4 18 -15 2 1 3 5 6 -16 4 1 3 5 7 -17 10 6 5 3 4 -18 11 7 5 3 4 -19 14 3 4 14 15 -20 14 3 4 14 16 -21 15 13 4 14 15 -22 15 13 4 14 16 -23 16 18 4 14 15 -24 16 18 4 14 16 -25 17 3 4 18 17 -26 14 3 4 18 19 -27 14 3 4 18 20 -28 18 13 4 18 17 -29 15 13 4 18 19 -30 15 13 4 18 20 -31 19 14 4 18 17 -32 16 14 4 18 19 -33 16 14 4 18 20 -34 2 3 5 7 8 -35 4 3 5 7 9 -36 5 6 5 7 8 -37 2 9 7 5 6 -38 2 5 7 9 10 -39 4 5 7 9 11 -40 5 8 7 9 10 -41 2 11 9 7 8 -42 4 7 9 11 1 -43 2 7 9 11 12 -44 2 1 11 9 10 -45 5 10 9 11 12 -46 10 22 21 23 24 -47 2 25 23 21 22 -48 11 31 21 23 24 -49 4 31 21 23 25 -50 2 29 31 21 22 -51 5 22 21 31 32 -52 4 23 21 31 29 -53 2 23 21 31 32 -54 12 21 23 24 33 -55 13 21 23 24 34 -56 13 21 23 24 48 -57 12 25 23 24 33 -58 13 25 23 24 34 -59 13 25 23 24 48 -60 2 21 23 25 26 -61 4 21 23 25 27 -62 10 26 25 23 24 -63 11 27 25 23 24 -64 17 23 24 48 38 -65 14 23 24 48 49 -66 14 23 24 48 50 -67 18 33 24 48 38 -68 15 33 24 48 49 -69 15 33 24 48 50 -70 19 34 24 48 38 -71 16 34 24 48 49 -72 16 34 24 48 50 -73 2 23 25 27 28 -74 4 23 25 27 29 -75 5 26 25 27 28 -76 2 29 27 25 26 -77 2 25 27 29 30 -78 4 25 27 29 31 -79 5 28 27 29 30 -80 2 31 29 27 28 -81 4 27 29 31 21 -82 2 27 29 31 32 -83 2 21 31 29 30 -84 5 30 29 31 32 -85 10 36 35 37 38 -86 2 39 37 35 36 -87 11 45 35 37 38 -88 4 45 35 37 39 -89 2 43 45 35 36 -90 5 36 35 45 46 -91 4 37 35 45 43 -92 2 37 35 45 46 -93 12 35 37 38 47 -94 13 35 37 38 48 -95 12 39 37 38 47 -96 13 39 37 38 48 -97 2 35 37 39 40 -98 4 35 37 39 41 -99 10 40 39 37 38 -100 11 41 39 37 38 -101 17 37 38 48 24 -102 14 37 38 48 49 -103 14 37 38 48 50 -104 18 47 38 48 24 -105 15 47 38 48 49 -106 15 47 38 48 50 -107 2 37 39 41 42 -108 4 37 39 41 43 -109 5 40 39 41 42 -110 2 43 41 39 40 -111 2 39 41 43 44 -112 4 39 41 43 45 -113 5 42 41 43 44 -114 2 45 43 41 42 -115 4 41 43 45 35 -116 2 41 43 45 46 -117 2 35 45 43 44 -118 5 44 43 45 46 - -Impropers - -1 1 3 1 11 2 -2 5 1 3 5 4 -3 1 3 5 7 6 -4 1 5 7 9 8 -5 1 7 9 11 10 -6 1 1 11 9 12 -7 6 15 14 16 4 -8 1 23 21 31 22 -9 5 21 23 25 24 -10 1 23 25 27 26 -11 1 25 27 29 28 -12 1 27 29 31 30 -13 1 21 31 29 32 -14 1 37 35 45 36 -15 5 35 37 39 38 -16 7 37 38 47 48 -17 1 37 39 41 40 -18 1 39 41 43 42 -19 1 41 43 45 44 -20 1 35 45 43 46 -21 1 3 4 13 14 -22 1 3 4 13 18 -23 1 3 4 14 18 -24 1 13 4 14 18 -25 1 19 18 17 4 -26 1 20 18 17 4 -27 1 19 18 20 4 -28 1 19 18 20 17 -29 1 23 24 33 34 -30 1 23 24 33 48 -31 1 23 24 34 48 -32 1 33 24 34 48 -33 1 49 48 38 24 -34 1 50 48 38 24 -35 1 49 48 50 24 -36 1 49 48 50 38 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_unreacted.molecule_template b/examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_unreacted.molecule_template new file mode 100644 index 0000000000..8b4c36d26b --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_polystyrene/chain_chain_unreacted.molecule_template @@ -0,0 +1,504 @@ +chain_chain_unreacted + + 50 atoms + 51 bonds + 84 angles + 118 dihedrals + 20 impropers + +Coords + + 1 24.391510010 0.871569991 -1.658939958 + 2 25.323530197 1.410570025 -1.658939958 + 3 23.161520004 1.581570029 -1.658939958 + 4 23.161520004 3.081569910 -1.658939958 + 5 21.931529999 0.871569991 -1.658939958 + 6 20.999530792 1.410570025 -1.658939958 + 7 21.931529999 -0.548430026 -1.658939958 + 8 20.999530792 -1.087419987 -1.658939958 + 9 23.161520004 -1.258419991 -1.658939958 + 10 23.161520004 -2.335429907 -1.658939958 + 11 24.391510010 -0.548430026 -1.658939958 + 12 25.323530197 -1.087419987 -1.658939958 + 13 24.027519226 3.486569881 -1.301939964 + 14 21.883520126 3.630569935 -2.220940113 + 15 21.933509827 4.372580051 -2.319940090 + 16 21.240520477 2.807569981 -2.514940023 + 17 28.359209061 3.254519939 -1.372130036 + 18 27.081209183 3.803519964 -1.934129953 + 19 27.131210327 4.545519829 -2.033129930 + 20 26.438219070 2.980520010 -2.228130102 + 21 13.465809822 0.682529986 -1.658939958 + 22 14.397820473 1.221529961 -1.658939958 + 23 12.235819817 1.392529964 -1.658939958 + 24 12.235819817 2.892529964 -1.658939958 + 25 11.005820274 0.682529986 -1.658939958 + 26 10.073820114 1.221529961 -1.658939958 + 27 11.005820274 -0.737469971 -1.658939958 + 28 10.073820114 -1.276460052 -1.658939958 + 29 12.235819817 -1.447460055 -1.658939958 + 30 12.235819817 -2.524470091 -1.658939958 + 31 13.465809822 -0.737469971 -1.658939958 + 32 14.397820473 -1.276460052 -1.658939958 + 33 13.101819992 3.297529936 -1.301939964 + 34 10.957819939 3.441529989 -2.220940113 + 35 18.663520813 0.855480015 -1.372130036 + 36 19.595510483 1.394479990 -1.372130036 + 37 17.433509827 1.565479994 -1.372130036 + 38 17.433509827 3.065479994 -1.372130036 + 39 16.203510284 0.855480015 -1.372130036 + 40 15.271510124 1.394479990 -1.372130036 + 41 16.203510284 -0.564520001 -1.372130036 + 42 15.271510124 -1.103520036 -1.372130036 + 43 17.433509827 -1.274520040 -1.372130036 + 44 17.433509827 -2.351520061 -1.372130036 + 45 18.663520813 -0.564520001 -1.372130036 + 46 19.595510483 -1.103520036 -1.372130036 + 47 18.299509048 3.470479965 -1.015130043 + 48 16.155509949 3.614480019 -1.934129953 + 49 16.205509186 4.356480122 -2.033129930 + 50 15.512510300 2.791480064 -2.228130102 + +Types + + 1 cp + 2 hc + 3 cp + 4 c1 + 5 cp + 6 hc + 7 cp + 8 hc + 9 cp + 10 hc + 11 cp + 12 hc + 13 hc + 14 c2 + 15 hc + 16 hc + 17 c1 + 18 c2 + 19 hc + 20 hc + 21 cp + 22 hc + 23 cp + 24 c1 + 25 cp + 26 hc + 27 cp + 28 hc + 29 cp + 30 hc + 31 cp + 32 hc + 33 hc + 34 c2 + 35 cp + 36 hc + 37 cp + 38 c1 + 39 cp + 40 hc + 41 cp + 42 hc + 43 cp + 44 hc + 45 cp + 46 hc + 47 hc + 48 c2 + 49 hc + 50 hc + +Charges + + 1 -0.129000 + 2 0.123700 + 3 0.026600 + 4 -0.018200 + 5 -0.129000 + 6 0.123700 + 7 -0.173400 + 8 0.140300 + 9 -0.113400 + 10 0.128800 + 11 -0.173400 + 12 0.140300 + 13 0.051600 + 14 -0.069600 + 15 0.035400 + 16 0.035400 + 17 -0.018200 + 18 -0.069600 + 19 0.035400 + 20 0.035400 + 21 -0.129000 + 22 0.123700 + 23 0.026600 + 24 -0.018200 + 25 -0.129000 + 26 0.123700 + 27 -0.173400 + 28 0.140300 + 29 -0.113400 + 30 0.128800 + 31 -0.173400 + 32 0.140300 + 33 0.051600 + 34 -0.069600 + 35 -0.129000 + 36 0.123700 + 37 0.026600 + 38 -0.018200 + 39 -0.129000 + 40 0.123700 + 41 -0.173400 + 42 0.140300 + 43 -0.113400 + 44 0.128800 + 45 -0.173400 + 46 0.140300 + 47 0.051600 + 48 -0.069600 + 49 0.035400 + 50 0.035400 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + 32 1 + 33 1 + 34 1 + 35 1 + 36 1 + 37 1 + 38 1 + 39 1 + 40 1 + 41 1 + 42 1 + 43 1 + 44 1 + 45 1 + 46 1 + 47 1 + 48 1 + 49 1 + 50 1 + +Bonds + + 1 cp-hc 1 2 + 2 cp-cp 1 3 + 3 cp-cp 1 11 + 4 cp-c1 3 4 + 5 cp-cp 3 5 + 6 hc-c1 13 4 + 7 c1-c2 4 14 + 8 c1-c2 4 18 + 9 cp-hc 5 6 + 10 cp-cp 5 7 + 11 cp-hc 7 8 + 12 cp-cp 7 9 + 13 cp-hc 9 10 + 14 cp-cp 9 11 + 15 cp-hc 11 12 + 16 hc-c2 15 14 + 17 hc-c2 16 14 + 18 c1-c2 17 18 + 19 hc-c2 19 18 + 20 hc-c2 20 18 + 21 cp-hc 21 22 + 22 cp-cp 21 23 + 23 cp-cp 21 31 + 24 cp-c1 23 24 + 25 cp-cp 23 25 + 26 hc-c1 33 24 + 27 c1-c2 24 34 + 28 c1-c2 24 48 + 29 cp-hc 25 26 + 30 cp-cp 25 27 + 31 cp-hc 27 28 + 32 cp-cp 27 29 + 33 cp-hc 29 30 + 34 cp-cp 29 31 + 35 cp-hc 31 32 + 36 cp-hc 35 36 + 37 cp-cp 35 37 + 38 cp-cp 35 45 + 39 cp-c1 37 38 + 40 cp-cp 37 39 + 41 hc-c1 47 38 + 42 c1-c2 38 48 + 43 cp-hc 39 40 + 44 cp-cp 39 41 + 45 cp-hc 41 42 + 46 cp-cp 41 43 + 47 cp-hc 43 44 + 48 cp-cp 43 45 + 49 cp-hc 45 46 + 50 hc-c2 49 48 + 51 hc-c2 50 48 + +Angles + + 1 cp-cp-hc 3 1 2 + 2 cp-cp-hc 11 1 2 + 3 cp-cp-cp 3 1 11 + 4 cp-cp-c1 1 3 4 + 5 cp-cp-cp 1 3 5 + 6 cp-cp-c1 5 3 4 + 7 cp-c1-hc 3 4 13 + 8 cp-c1-c2 3 4 14 + 9 cp-c1-c2 3 4 18 + 10 hc-c1-c2 13 4 14 + 11 hc-c1-c2 13 4 18 + 12 c2-c1-c2 14 4 18 + 13 cp-cp-hc 3 5 6 + 14 cp-cp-cp 3 5 7 + 15 cp-cp-hc 7 5 6 + 16 cp-cp-hc 5 7 8 + 17 cp-cp-cp 5 7 9 + 18 cp-cp-hc 9 7 8 + 19 cp-cp-hc 7 9 10 + 20 cp-cp-cp 7 9 11 + 21 cp-cp-hc 11 9 10 + 22 cp-cp-cp 1 11 9 + 23 cp-cp-hc 1 11 12 + 24 cp-cp-hc 9 11 12 + 25 hc-c2-c1 15 14 4 + 26 hc-c2-c1 16 14 4 + 27 hc-c2-hc 15 14 16 + 28 c1-c2-c1 4 18 17 + 29 hc-c2-c1 19 18 4 + 30 hc-c2-c1 20 18 4 + 31 hc-c2-c1 19 18 17 + 32 hc-c2-c1 20 18 17 + 33 hc-c2-hc 19 18 20 + 34 cp-cp-hc 23 21 22 + 35 cp-cp-hc 31 21 22 + 36 cp-cp-cp 23 21 31 + 37 cp-cp-c1 21 23 24 + 38 cp-cp-cp 21 23 25 + 39 cp-cp-c1 25 23 24 + 40 cp-c1-hc 23 24 33 + 41 cp-c1-c2 23 24 34 + 42 cp-c1-c2 23 24 48 + 43 hc-c1-c2 33 24 34 + 44 hc-c1-c2 33 24 48 + 45 c2-c1-c2 34 24 48 + 46 cp-cp-hc 23 25 26 + 47 cp-cp-cp 23 25 27 + 48 cp-cp-hc 27 25 26 + 49 cp-cp-hc 25 27 28 + 50 cp-cp-cp 25 27 29 + 51 cp-cp-hc 29 27 28 + 52 cp-cp-hc 27 29 30 + 53 cp-cp-cp 27 29 31 + 54 cp-cp-hc 31 29 30 + 55 cp-cp-cp 21 31 29 + 56 cp-cp-hc 21 31 32 + 57 cp-cp-hc 29 31 32 + 58 cp-cp-hc 37 35 36 + 59 cp-cp-hc 45 35 36 + 60 cp-cp-cp 37 35 45 + 61 cp-cp-c1 35 37 38 + 62 cp-cp-cp 35 37 39 + 63 cp-cp-c1 39 37 38 + 64 cp-c1-hc 37 38 47 + 65 cp-c1-c2 37 38 48 + 66 hc-c1-c2 47 38 48 + 67 cp-cp-hc 37 39 40 + 68 cp-cp-cp 37 39 41 + 69 cp-cp-hc 41 39 40 + 70 cp-cp-hc 39 41 42 + 71 cp-cp-cp 39 41 43 + 72 cp-cp-hc 43 41 42 + 73 cp-cp-hc 41 43 44 + 74 cp-cp-cp 41 43 45 + 75 cp-cp-hc 45 43 44 + 76 cp-cp-cp 35 45 43 + 77 cp-cp-hc 35 45 46 + 78 cp-cp-hc 43 45 46 + 79 c1-c2-c1 24 48 38 + 80 hc-c2-c1 49 48 24 + 81 hc-c2-c1 50 48 24 + 82 hc-c2-c1 49 48 38 + 83 hc-c2-c1 50 48 38 + 84 hc-c2-hc 49 48 50 + +Dihedrals + + 1 hc-cp-cp-c1 2 1 3 4 + 2 cp-cp-cp-hc 5 3 1 2 + 3 cp-cp-cp-c1 11 1 3 4 + 4 cp-cp-cp-cp 11 1 3 5 + 5 cp-cp-cp-hc 9 11 1 2 + 6 hc-cp-cp-hc 2 1 11 12 + 7 cp-cp-cp-cp 3 1 11 9 + 8 cp-cp-cp-hc 3 1 11 12 + 9 cp-cp-c1-hc 1 3 4 13 + 10 cp-cp-c1-c2 1 3 4 14 + 11 cp-cp-c1-c2 1 3 4 18 + 12 cp-cp-c1-hc 5 3 4 13 + 13 cp-cp-c1-c2 5 3 4 14 + 14 cp-cp-c1-c2 5 3 4 18 + 15 cp-cp-cp-hc 1 3 5 6 + 16 cp-cp-cp-cp 1 3 5 7 + 17 hc-cp-cp-c1 6 5 3 4 + 18 cp-cp-cp-c1 7 5 3 4 + 19 cp-c1-c2-hc 3 4 14 15 + 20 cp-c1-c2-hc 3 4 14 16 + 21 hc-c1-c2-hc 13 4 14 15 + 22 hc-c1-c2-hc 13 4 14 16 + 23 c2-c1-c2-hc 18 4 14 15 + 24 c2-c1-c2-hc 18 4 14 16 + 25 cp-c1-c2-c1 3 4 18 17 + 26 cp-c1-c2-hc 3 4 18 19 + 27 cp-c1-c2-hc 3 4 18 20 + 28 hc-c1-c2-c1 13 4 18 17 + 29 hc-c1-c2-hc 13 4 18 19 + 30 hc-c1-c2-hc 13 4 18 20 + 31 c2-c1-c2-c1 14 4 18 17 + 32 c2-c1-c2-hc 14 4 18 19 + 33 c2-c1-c2-hc 14 4 18 20 + 34 cp-cp-cp-hc 3 5 7 8 + 35 cp-cp-cp-cp 3 5 7 9 + 36 hc-cp-cp-hc 6 5 7 8 + 37 cp-cp-cp-hc 9 7 5 6 + 38 cp-cp-cp-hc 5 7 9 10 + 39 cp-cp-cp-cp 5 7 9 11 + 40 hc-cp-cp-hc 8 7 9 10 + 41 cp-cp-cp-hc 11 9 7 8 + 42 cp-cp-cp-cp 7 9 11 1 + 43 cp-cp-cp-hc 7 9 11 12 + 44 cp-cp-cp-hc 1 11 9 10 + 45 hc-cp-cp-hc 10 9 11 12 + 46 hc-cp-cp-c1 22 21 23 24 + 47 cp-cp-cp-hc 25 23 21 22 + 48 cp-cp-cp-c1 31 21 23 24 + 49 cp-cp-cp-cp 31 21 23 25 + 50 cp-cp-cp-hc 29 31 21 22 + 51 hc-cp-cp-hc 22 21 31 32 + 52 cp-cp-cp-cp 23 21 31 29 + 53 cp-cp-cp-hc 23 21 31 32 + 54 cp-cp-c1-hc 21 23 24 33 + 55 cp-cp-c1-c2 21 23 24 34 + 56 cp-cp-c1-c2 21 23 24 48 + 57 cp-cp-c1-hc 25 23 24 33 + 58 cp-cp-c1-c2 25 23 24 34 + 59 cp-cp-c1-c2 25 23 24 48 + 60 cp-cp-cp-hc 21 23 25 26 + 61 cp-cp-cp-cp 21 23 25 27 + 62 hc-cp-cp-c1 26 25 23 24 + 63 cp-cp-cp-c1 27 25 23 24 + 64 cp-c1-c2-c1 23 24 48 38 + 65 cp-c1-c2-hc 23 24 48 49 + 66 cp-c1-c2-hc 23 24 48 50 + 67 hc-c1-c2-c1 33 24 48 38 + 68 hc-c1-c2-hc 33 24 48 49 + 69 hc-c1-c2-hc 33 24 48 50 + 70 c2-c1-c2-c1 34 24 48 38 + 71 c2-c1-c2-hc 34 24 48 49 + 72 c2-c1-c2-hc 34 24 48 50 + 73 cp-cp-cp-hc 23 25 27 28 + 74 cp-cp-cp-cp 23 25 27 29 + 75 hc-cp-cp-hc 26 25 27 28 + 76 cp-cp-cp-hc 29 27 25 26 + 77 cp-cp-cp-hc 25 27 29 30 + 78 cp-cp-cp-cp 25 27 29 31 + 79 hc-cp-cp-hc 28 27 29 30 + 80 cp-cp-cp-hc 31 29 27 28 + 81 cp-cp-cp-cp 27 29 31 21 + 82 cp-cp-cp-hc 27 29 31 32 + 83 cp-cp-cp-hc 21 31 29 30 + 84 hc-cp-cp-hc 30 29 31 32 + 85 hc-cp-cp-c1 36 35 37 38 + 86 cp-cp-cp-hc 39 37 35 36 + 87 cp-cp-cp-c1 45 35 37 38 + 88 cp-cp-cp-cp 45 35 37 39 + 89 cp-cp-cp-hc 43 45 35 36 + 90 hc-cp-cp-hc 36 35 45 46 + 91 cp-cp-cp-cp 37 35 45 43 + 92 cp-cp-cp-hc 37 35 45 46 + 93 cp-cp-c1-hc 35 37 38 47 + 94 cp-cp-c1-c2 35 37 38 48 + 95 cp-cp-c1-hc 39 37 38 47 + 96 cp-cp-c1-c2 39 37 38 48 + 97 cp-cp-cp-hc 35 37 39 40 + 98 cp-cp-cp-cp 35 37 39 41 + 99 hc-cp-cp-c1 40 39 37 38 + 100 cp-cp-cp-c1 41 39 37 38 + 101 cp-c1-c2-c1 37 38 48 24 + 102 cp-c1-c2-hc 37 38 48 49 + 103 cp-c1-c2-hc 37 38 48 50 + 104 hc-c1-c2-c1 47 38 48 24 + 105 hc-c1-c2-hc 47 38 48 49 + 106 hc-c1-c2-hc 47 38 48 50 + 107 cp-cp-cp-hc 37 39 41 42 + 108 cp-cp-cp-cp 37 39 41 43 + 109 hc-cp-cp-hc 40 39 41 42 + 110 cp-cp-cp-hc 43 41 39 40 + 111 cp-cp-cp-hc 39 41 43 44 + 112 cp-cp-cp-cp 39 41 43 45 + 113 hc-cp-cp-hc 42 41 43 44 + 114 cp-cp-cp-hc 45 43 41 42 + 115 cp-cp-cp-cp 41 43 45 35 + 116 cp-cp-cp-hc 41 43 45 46 + 117 cp-cp-cp-hc 35 45 43 44 + 118 hc-cp-cp-hc 44 43 45 46 + +Impropers + + 1 cp-cp-cp-hc 3 1 11 2 + 2 cp-cp-cp-c1 1 3 5 4 + 3 cp-cp-cp-hc 3 5 7 6 + 4 cp-cp-cp-hc 5 7 9 8 + 5 cp-cp-cp-hc 7 9 11 10 + 6 cp-cp-cp-hc 1 11 9 12 + 7 hc-c2-hc-c1 15 14 16 4 + 8 cp-cp-cp-hc 23 21 31 22 + 9 cp-cp-cp-c1 21 23 25 24 + 10 cp-cp-cp-hc 23 25 27 26 + 11 cp-cp-cp-hc 25 27 29 28 + 12 cp-cp-cp-hc 27 29 31 30 + 13 cp-cp-cp-hc 21 31 29 32 + 14 cp-cp-cp-hc 37 35 45 36 + 15 cp-cp-cp-c1 35 37 39 38 + 16 cp-c1-hc-c2 37 38 47 48 + 17 cp-cp-cp-hc 37 39 41 40 + 18 cp-cp-cp-hc 39 41 43 42 + 19 cp-cp-cp-hc 41 43 45 44 + 20 cp-cp-cp-hc 35 45 43 46 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_reacted.data_template b/examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_reacted.data_template deleted file mode 100644 index 352d88737d..0000000000 --- a/examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_reacted.data_template +++ /dev/null @@ -1,451 +0,0 @@ -chain_plus_styrene_reacted - -46 atoms -48 bonds -81 angles -121 dihedrals -35 impropers - -Types - -1 1 -2 2 -3 1 -4 5 -5 1 -6 2 -7 1 -8 2 -9 1 -10 2 -11 1 -12 2 -13 2 -14 6 -15 2 -16 2 -17 1 -18 2 -19 1 -20 5 -21 1 -22 2 -23 1 -24 2 -25 1 -26 2 -27 1 -28 2 -29 2 -30 6 -31 1 -32 2 -33 1 -34 5 -35 1 -36 2 -37 1 -38 2 -39 1 -40 2 -41 1 -42 2 -43 2 -44 6 -45 2 -46 2 - -Charges - -1 -0.129000 -2 0.123700 -3 0.026600 -4 -0.018200 -5 -0.129000 -6 0.123700 -7 -0.173400 -8 0.140300 -9 -0.113400 -10 0.128800 -11 -0.173400 -12 0.140300 -13 0.051600 -14 -0.069600 -15 0.035400 -16 0.035400 -17 -0.129000 -18 0.123700 -19 0.026600 -20 -0.018200 -21 -0.129000 -22 0.123700 -23 -0.173400 -24 0.140300 -25 -0.113400 -26 0.128800 -27 -0.173400 -28 0.140300 -29 0.051600 -30 -0.069600 -31 -0.129000 -32 0.123700 -33 0.026600 -34 -0.018200 -35 -0.129000 -36 0.123700 -37 -0.173400 -38 0.140300 -39 -0.113400 -40 0.128800 -41 -0.173400 -42 0.140300 -43 0.051600 -44 -0.069600 -45 0.035400 -46 0.035400 - -Coords - -1 24.130699 1.043900 -1.309300 -2 25.062700 1.582900 -1.309300 -3 22.900700 1.753900 -1.309300 -4 22.900700 3.253900 -1.309300 -5 21.670700 1.043900 -1.309300 -6 20.738701 1.582900 -1.309300 -7 21.670700 -0.376100 -1.309300 -8 20.738701 -0.915100 -1.309300 -9 22.900700 -1.086100 -1.309300 -10 22.900700 -2.163100 -1.309300 -11 24.130699 -0.376100 -1.309300 -12 25.062700 -0.915100 -1.309300 -13 23.766701 3.658900 -0.952300 -14 21.622700 3.802900 -1.871300 -15 21.672701 4.544900 -1.970300 -16 20.979700 2.979900 -2.165300 -17 13.465800 0.682500 -1.658900 -18 14.397800 1.221500 -1.658900 -19 12.235800 1.392500 -1.658900 -20 12.235800 2.892500 -1.658900 -21 11.005800 0.682500 -1.658900 -22 10.073800 1.221500 -1.658900 -23 11.005800 -0.737500 -1.658900 -24 10.073800 -1.276500 -1.658900 -25 12.235800 -1.447500 -1.658900 -26 12.235800 -2.524500 -1.658900 -27 13.465800 -0.737500 -1.658900 -28 14.397800 -1.276500 -1.658900 -29 13.101800 3.297500 -1.301900 -30 10.957800 3.441500 -2.220900 -31 18.663500 0.855500 -1.372100 -32 19.595501 1.394500 -1.372100 -33 17.433500 1.565500 -1.372100 -34 17.433500 3.065500 -1.372100 -35 16.203501 0.855500 -1.372100 -36 15.271500 1.394500 -1.372100 -37 16.203501 -0.564500 -1.372100 -38 15.271500 -1.103500 -1.372100 -39 17.433500 -1.274500 -1.372100 -40 17.433500 -2.351500 -1.372100 -41 18.663500 -0.564500 -1.372100 -42 19.595501 -1.103500 -1.372100 -43 18.299500 3.470500 -1.015100 -44 16.155500 3.614500 -1.934100 -45 16.205500 4.356500 -2.033100 -46 15.512500 2.791500 -2.228100 - -Bonds - -1 1 1 2 -2 2 1 3 -3 2 1 11 -4 11 3 4 -5 2 3 5 -6 12 13 4 -7 13 4 14 -8 1 5 6 -9 2 5 7 -10 1 7 8 -11 2 7 9 -12 1 9 10 -13 2 9 11 -14 1 11 12 -15 10 15 14 -16 10 16 14 -17 9 14 34 -18 1 17 18 -19 2 17 19 -20 2 17 27 -21 7 19 20 -22 2 19 21 -23 8 29 20 -24 9 30 20 -25 9 44 20 -26 1 21 22 -27 2 21 23 -28 1 23 24 -29 2 23 25 -30 1 25 26 -31 2 25 27 -32 1 27 28 -33 1 31 32 -34 2 31 33 -35 2 31 41 -36 7 33 34 -37 2 33 35 -38 8 43 34 -39 9 44 34 -40 1 35 36 -41 2 35 37 -42 1 37 38 -43 2 37 39 -44 1 39 40 -45 2 39 41 -46 1 41 42 -47 10 45 44 -48 10 46 44 - -Angles - -1 1 3 1 2 -2 1 11 1 2 -3 2 3 1 11 -4 17 1 3 4 -5 2 1 3 5 -6 17 5 3 4 -7 18 3 4 13 -8 19 3 4 14 -9 20 13 4 14 -10 1 3 5 6 -11 2 3 5 7 -12 1 7 5 6 -13 1 5 7 8 -14 2 5 7 9 -15 1 9 7 8 -16 1 7 9 10 -17 2 7 9 11 -18 1 11 9 10 -19 2 1 11 9 -20 1 1 11 12 -21 1 9 11 12 -22 21 15 14 4 -23 21 16 14 4 -24 22 4 14 34 -25 15 15 14 16 -26 14 15 14 34 -27 14 16 14 34 -28 1 19 17 18 -29 1 27 17 18 -30 2 19 17 27 -31 9 17 19 20 -32 2 17 19 21 -33 9 21 19 20 -34 10 19 20 29 -35 11 19 20 30 -36 11 19 20 44 -37 12 29 20 30 -38 12 29 20 44 -39 13 30 20 44 -40 1 19 21 22 -41 2 19 21 23 -42 1 23 21 22 -43 1 21 23 24 -44 2 21 23 25 -45 1 25 23 24 -46 1 23 25 26 -47 2 23 25 27 -48 1 27 25 26 -49 2 17 27 25 -50 1 17 27 28 -51 1 25 27 28 -52 1 33 31 32 -53 1 41 31 32 -54 2 33 31 41 -55 9 31 33 34 -56 2 31 33 35 -57 9 35 33 34 -58 11 33 34 14 -59 12 43 34 14 -60 13 14 34 44 -61 10 33 34 43 -62 11 33 34 44 -63 12 43 34 44 -64 1 33 35 36 -65 2 33 35 37 -66 1 37 35 36 -67 1 35 37 38 -68 2 35 37 39 -69 1 39 37 38 -70 1 37 39 40 -71 2 37 39 41 -72 1 41 39 40 -73 2 31 41 39 -74 1 31 41 42 -75 1 39 41 42 -76 16 20 44 34 -77 14 45 44 20 -78 14 46 44 20 -79 14 45 44 34 -80 14 46 44 34 -81 15 45 44 46 - -Dihedrals - -1 20 2 1 3 4 -2 2 5 3 1 2 -3 21 11 1 3 4 -4 4 11 1 3 5 -5 2 9 11 1 2 -6 5 2 1 11 12 -7 4 3 1 11 9 -8 2 3 1 11 12 -9 22 1 3 4 13 -10 23 1 3 4 14 -11 22 5 3 4 13 -12 23 5 3 4 14 -13 2 1 3 5 6 -14 4 1 3 5 7 -15 20 6 5 3 4 -16 21 7 5 3 4 -17 24 3 4 14 15 -18 24 3 4 14 16 -19 25 3 4 14 34 -20 26 13 4 14 15 -21 26 13 4 14 16 -22 27 13 4 14 34 -23 2 3 5 7 8 -24 4 3 5 7 9 -25 5 6 5 7 8 -26 2 9 7 5 6 -27 2 5 7 9 10 -28 4 5 7 9 11 -29 5 8 7 9 10 -30 2 11 9 7 8 -31 4 7 9 11 1 -32 2 7 9 11 12 -33 2 1 11 9 10 -34 5 10 9 11 12 -35 28 4 14 34 33 -36 29 4 14 34 43 -37 30 4 14 34 44 -38 31 15 14 34 33 -39 32 15 14 34 43 -40 33 15 14 34 44 -41 31 16 14 34 33 -42 32 16 14 34 43 -43 33 16 14 34 44 -44 10 18 17 19 20 -45 2 21 19 17 18 -46 11 27 17 19 20 -47 4 27 17 19 21 -48 2 25 27 17 18 -49 5 18 17 27 28 -50 4 19 17 27 25 -51 2 19 17 27 28 -52 12 17 19 20 29 -53 13 17 19 20 30 -54 13 17 19 20 44 -55 12 21 19 20 29 -56 13 21 19 20 30 -57 13 21 19 20 44 -58 2 17 19 21 22 -59 4 17 19 21 23 -60 10 22 21 19 20 -61 11 23 21 19 20 -62 34 34 44 20 19 -63 31 45 44 20 19 -64 31 46 44 20 19 -65 35 34 44 20 29 -66 32 45 44 20 29 -67 32 46 44 20 29 -68 36 34 44 20 30 -69 33 45 44 20 30 -70 33 46 44 20 30 -71 2 19 21 23 24 -72 4 19 21 23 25 -73 5 22 21 23 24 -74 2 25 23 21 22 -75 2 21 23 25 26 -76 4 21 23 25 27 -77 5 24 23 25 26 -78 2 27 25 23 24 -79 4 23 25 27 17 -80 2 23 25 27 28 -81 2 17 27 25 26 -82 5 26 25 27 28 -83 10 32 31 33 34 -84 2 35 33 31 32 -85 11 41 31 33 34 -86 4 41 31 33 35 -87 2 39 41 31 32 -88 5 32 31 41 42 -89 4 33 31 41 39 -90 2 33 31 41 42 -91 13 31 33 34 14 -92 12 31 33 34 43 -93 13 31 33 34 44 -94 13 35 33 34 14 -95 12 35 33 34 43 -96 13 35 33 34 44 -97 2 31 33 35 36 -98 4 31 33 35 37 -99 10 36 35 33 34 -100 11 37 35 33 34 -101 36 20 44 34 14 -102 33 45 44 34 14 -103 33 46 44 34 14 -104 34 20 44 34 33 -105 31 45 44 34 33 -106 31 46 44 34 33 -107 35 20 44 34 43 -108 32 45 44 34 43 -109 32 46 44 34 43 -110 2 33 35 37 38 -111 4 33 35 37 39 -112 5 36 35 37 38 -113 2 39 37 35 36 -114 2 35 37 39 40 -115 4 35 37 39 41 -116 5 38 37 39 40 -117 2 41 39 37 38 -118 4 37 39 41 31 -119 2 37 39 41 42 -120 2 31 41 39 40 -121 5 40 39 41 42 - -Impropers - -1 1 3 1 11 2 -2 8 1 3 5 4 -3 9 3 4 13 14 -4 1 3 5 7 6 -5 1 5 7 9 8 -6 1 7 9 11 10 -7 1 1 11 9 12 -8 1 19 17 27 18 -9 5 17 19 21 20 -10 1 19 21 23 22 -11 1 21 23 25 24 -12 1 23 25 27 26 -13 1 17 27 25 28 -14 1 33 31 41 32 -15 5 31 33 35 34 -16 1 33 35 37 36 -17 1 35 37 39 38 -18 1 37 39 41 40 -19 1 31 41 39 42 -20 1 15 14 16 4 -21 1 15 14 4 34 -22 1 16 14 4 34 -23 1 15 14 16 34 -24 1 19 20 29 30 -25 1 19 20 29 44 -26 1 19 20 30 44 -27 1 29 20 30 44 -28 1 33 34 43 14 -29 1 33 34 14 44 -30 1 43 34 14 44 -31 1 33 34 43 44 -32 1 45 44 34 20 -33 1 46 44 34 20 -34 1 45 44 46 20 -35 1 45 44 46 34 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_reacted.molecule_template b/examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_reacted.molecule_template new file mode 100644 index 0000000000..1755111d59 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_reacted.molecule_template @@ -0,0 +1,484 @@ +chain_plus_styrene_reacted + + 46 atoms + 48 bonds + 81 angles + 121 dihedrals + 19 impropers + +Coords + + 1 24.130699158 1.043900013 -1.309299946 + 2 25.062700272 1.582900047 -1.309299946 + 3 22.900699615 1.753900051 -1.309299946 + 4 22.900699615 3.253900051 -1.309299946 + 5 21.670700073 1.043900013 -1.309299946 + 6 20.738700867 1.582900047 -1.309299946 + 7 21.670700073 -0.376100004 -1.309299946 + 8 20.738700867 -0.915099978 -1.309299946 + 9 22.900699615 -1.086099982 -1.309299946 + 10 22.900699615 -2.163100004 -1.309299946 + 11 24.130699158 -0.376100004 -1.309299946 + 12 25.062700272 -0.915099978 -1.309299946 + 13 23.766700745 3.658900023 -0.952300012 + 14 21.622699738 3.802900076 -1.871299982 + 15 21.672700882 4.544899940 -1.970299959 + 16 20.979700088 2.979899883 -2.165299892 + 17 13.465800285 0.682500005 -1.658900022 + 18 14.397800446 1.221500039 -1.658900022 + 19 12.235799789 1.392500043 -1.658900022 + 20 12.235799789 2.892499924 -1.658900022 + 21 11.005800247 0.682500005 -1.658900022 + 22 10.073800087 1.221500039 -1.658900022 + 23 11.005800247 -0.737500012 -1.658900022 + 24 10.073800087 -1.276499987 -1.658900022 + 25 12.235799789 -1.447499990 -1.658900022 + 26 12.235799789 -2.524499893 -1.658900022 + 27 13.465800285 -0.737500012 -1.658900022 + 28 14.397800446 -1.276499987 -1.658900022 + 29 13.101799965 3.297499895 -1.301900029 + 30 10.957799911 3.441499949 -2.220900059 + 31 18.663499832 0.855499983 -1.372099996 + 32 19.595500946 1.394500017 -1.372099996 + 33 17.433500290 1.565500021 -1.372099996 + 34 17.433500290 3.065500021 -1.372099996 + 35 16.203500748 0.855499983 -1.372099996 + 36 15.271499634 1.394500017 -1.372099996 + 37 16.203500748 -0.564499974 -1.372099996 + 38 15.271499634 -1.103500009 -1.372099996 + 39 17.433500290 -1.274500012 -1.372099996 + 40 17.433500290 -2.351500034 -1.372099996 + 41 18.663499832 -0.564499974 -1.372099996 + 42 19.595500946 -1.103500009 -1.372099996 + 43 18.299499512 3.470499992 -1.015100002 + 44 16.155500412 3.614500046 -1.934100032 + 45 16.205499649 4.356500149 -2.033099890 + 46 15.512499809 2.791500092 -2.228100061 + +Types + + 1 cp + 2 hc + 3 cp + 4 c1 + 5 cp + 6 hc + 7 cp + 8 hc + 9 cp + 10 hc + 11 cp + 12 hc + 13 hc + 14 c2 + 15 hc + 16 hc + 17 cp + 18 hc + 19 cp + 20 c1 + 21 cp + 22 hc + 23 cp + 24 hc + 25 cp + 26 hc + 27 cp + 28 hc + 29 hc + 30 c2 + 31 cp + 32 hc + 33 cp + 34 c1 + 35 cp + 36 hc + 37 cp + 38 hc + 39 cp + 40 hc + 41 cp + 42 hc + 43 hc + 44 c2 + 45 hc + 46 hc + +Charges + + 1 -0.129000 + 2 0.123700 + 3 0.026600 + 4 -0.018200 + 5 -0.129000 + 6 0.123700 + 7 -0.173400 + 8 0.140300 + 9 -0.113400 + 10 0.128800 + 11 -0.173400 + 12 0.140300 + 13 0.051600 + 14 -0.069600 + 15 0.035400 + 16 0.035400 + 17 -0.129000 + 18 0.123700 + 19 0.026600 + 20 -0.018200 + 21 -0.129000 + 22 0.123700 + 23 -0.173400 + 24 0.140300 + 25 -0.113400 + 26 0.128800 + 27 -0.173400 + 28 0.140300 + 29 0.051600 + 30 -0.069600 + 31 -0.129000 + 32 0.123700 + 33 0.026600 + 34 -0.018200 + 35 -0.129000 + 36 0.123700 + 37 -0.173400 + 38 0.140300 + 39 -0.113400 + 40 0.128800 + 41 -0.173400 + 42 0.140300 + 43 0.051600 + 44 -0.069600 + 45 0.035400 + 46 0.035400 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + 32 1 + 33 1 + 34 1 + 35 1 + 36 1 + 37 1 + 38 1 + 39 1 + 40 1 + 41 1 + 42 1 + 43 1 + 44 1 + 45 1 + 46 1 + +Bonds + + 1 cp-hc 1 2 + 2 cp-cp 1 3 + 3 cp-cp 1 11 + 4 cp-c1 3 4 + 5 cp-cp 3 5 + 6 hc-c1 13 4 + 7 c1-c2 4 14 + 8 cp-hc 5 6 + 9 cp-cp 5 7 + 10 cp-hc 7 8 + 11 cp-cp 7 9 + 12 cp-hc 9 10 + 13 cp-cp 9 11 + 14 cp-hc 11 12 + 15 hc-c2 15 14 + 16 hc-c2 16 14 + 17 c1-c2 34 14 + 18 cp-hc 17 18 + 19 cp-cp 17 19 + 20 cp-cp 17 27 + 21 cp-c1 19 20 + 22 cp-cp 19 21 + 23 hc-c1 29 20 + 24 c1-c2 20 30 + 25 c1-c2 20 44 + 26 cp-hc 21 22 + 27 cp-cp 21 23 + 28 cp-hc 23 24 + 29 cp-cp 23 25 + 30 cp-hc 25 26 + 31 cp-cp 25 27 + 32 cp-hc 27 28 + 33 cp-hc 31 32 + 34 cp-cp 31 33 + 35 cp-cp 31 41 + 36 cp-c1 33 34 + 37 cp-cp 33 35 + 38 hc-c1 43 34 + 39 c1-c2 34 44 + 40 cp-hc 35 36 + 41 cp-cp 35 37 + 42 cp-hc 37 38 + 43 cp-cp 37 39 + 44 cp-hc 39 40 + 45 cp-cp 39 41 + 46 cp-hc 41 42 + 47 hc-c2 45 44 + 48 hc-c2 46 44 + +Angles + + 1 cp-cp-hc 3 1 2 + 2 cp-cp-hc 11 1 2 + 3 cp-cp-cp 3 1 11 + 4 cp-cp-c1 1 3 4 + 5 cp-cp-cp 1 3 5 + 6 cp-cp-c1 5 3 4 + 7 cp-c1-hc 3 4 13 + 8 cp-c1-c2 3 4 14 + 9 hc-c1-c2 13 4 14 + 10 cp-cp-hc 3 5 6 + 11 cp-cp-cp 3 5 7 + 12 cp-cp-hc 7 5 6 + 13 cp-cp-hc 5 7 8 + 14 cp-cp-cp 5 7 9 + 15 cp-cp-hc 9 7 8 + 16 cp-cp-hc 7 9 10 + 17 cp-cp-cp 7 9 11 + 18 cp-cp-hc 11 9 10 + 19 cp-cp-cp 1 11 9 + 20 cp-cp-hc 1 11 12 + 21 cp-cp-hc 9 11 12 + 22 hc-c2-c1 15 14 4 + 23 hc-c2-c1 16 14 4 + 24 c1-c2-c1 4 14 34 + 25 hc-c2-hc 15 14 16 + 26 hc-c2-c1 15 14 34 + 27 hc-c2-c1 16 14 34 + 28 cp-cp-hc 19 17 18 + 29 cp-cp-hc 27 17 18 + 30 cp-cp-cp 19 17 27 + 31 cp-cp-c1 17 19 20 + 32 cp-cp-cp 17 19 21 + 33 cp-cp-c1 21 19 20 + 34 cp-c1-hc 19 20 29 + 35 cp-c1-c2 19 20 30 + 36 cp-c1-c2 19 20 44 + 37 hc-c1-c2 29 20 30 + 38 hc-c1-c2 29 20 44 + 39 c2-c1-c2 30 20 44 + 40 cp-cp-hc 19 21 22 + 41 cp-cp-cp 19 21 23 + 42 cp-cp-hc 23 21 22 + 43 cp-cp-hc 21 23 24 + 44 cp-cp-cp 21 23 25 + 45 cp-cp-hc 25 23 24 + 46 cp-cp-hc 23 25 26 + 47 cp-cp-cp 23 25 27 + 48 cp-cp-hc 27 25 26 + 49 cp-cp-cp 17 27 25 + 50 cp-cp-hc 17 27 28 + 51 cp-cp-hc 25 27 28 + 52 cp-cp-hc 33 31 32 + 53 cp-cp-hc 41 31 32 + 54 cp-cp-cp 33 31 41 + 55 cp-cp-c1 31 33 34 + 56 cp-cp-cp 31 33 35 + 57 cp-cp-c1 35 33 34 + 58 cp-c1-c2 33 34 14 + 59 hc-c1-c2 43 34 14 + 60 c2-c1-c2 14 34 44 + 61 cp-c1-hc 33 34 43 + 62 cp-c1-c2 33 34 44 + 63 hc-c1-c2 43 34 44 + 64 cp-cp-hc 33 35 36 + 65 cp-cp-cp 33 35 37 + 66 cp-cp-hc 37 35 36 + 67 cp-cp-hc 35 37 38 + 68 cp-cp-cp 35 37 39 + 69 cp-cp-hc 39 37 38 + 70 cp-cp-hc 37 39 40 + 71 cp-cp-cp 37 39 41 + 72 cp-cp-hc 41 39 40 + 73 cp-cp-cp 31 41 39 + 74 cp-cp-hc 31 41 42 + 75 cp-cp-hc 39 41 42 + 76 c1-c2-c1 20 44 34 + 77 hc-c2-c1 45 44 20 + 78 hc-c2-c1 46 44 20 + 79 hc-c2-c1 45 44 34 + 80 hc-c2-c1 46 44 34 + 81 hc-c2-hc 45 44 46 + +Dihedrals + + 1 hc-cp-cp-c1 2 1 3 4 + 2 cp-cp-cp-hc 5 3 1 2 + 3 cp-cp-cp-c1 11 1 3 4 + 4 cp-cp-cp-cp 11 1 3 5 + 5 cp-cp-cp-hc 9 11 1 2 + 6 hc-cp-cp-hc 2 1 11 12 + 7 cp-cp-cp-cp 3 1 11 9 + 8 cp-cp-cp-hc 3 1 11 12 + 9 cp-cp-c1-hc 1 3 4 13 + 10 cp-cp-c1-c2 1 3 4 14 + 11 cp-cp-c1-hc 5 3 4 13 + 12 cp-cp-c1-c2 5 3 4 14 + 13 cp-cp-cp-hc 1 3 5 6 + 14 cp-cp-cp-cp 1 3 5 7 + 15 hc-cp-cp-c1 6 5 3 4 + 16 cp-cp-cp-c1 7 5 3 4 + 17 cp-c1-c2-hc 3 4 14 15 + 18 cp-c1-c2-hc 3 4 14 16 + 19 cp-c1-c2-c1 3 4 14 34 + 20 hc-c1-c2-hc 13 4 14 15 + 21 hc-c1-c2-hc 13 4 14 16 + 22 hc-c1-c2-c1 13 4 14 34 + 23 cp-cp-cp-hc 3 5 7 8 + 24 cp-cp-cp-cp 3 5 7 9 + 25 hc-cp-cp-hc 6 5 7 8 + 26 cp-cp-cp-hc 9 7 5 6 + 27 cp-cp-cp-hc 5 7 9 10 + 28 cp-cp-cp-cp 5 7 9 11 + 29 hc-cp-cp-hc 8 7 9 10 + 30 cp-cp-cp-hc 11 9 7 8 + 31 cp-cp-cp-cp 7 9 11 1 + 32 cp-cp-cp-hc 7 9 11 12 + 33 cp-cp-cp-hc 1 11 9 10 + 34 hc-cp-cp-hc 10 9 11 12 + 35 cp-c1-c2-c1 33 34 14 4 + 36 hc-c1-c2-c1 43 34 14 4 + 37 c2-c1-c2-c1 44 34 14 4 + 38 cp-c1-c2-hc 33 34 14 15 + 39 hc-c1-c2-hc 43 34 14 15 + 40 c2-c1-c2-hc 44 34 14 15 + 41 cp-c1-c2-hc 33 34 14 16 + 42 hc-c1-c2-hc 43 34 14 16 + 43 c2-c1-c2-hc 44 34 14 16 + 44 hc-cp-cp-c1 18 17 19 20 + 45 cp-cp-cp-hc 21 19 17 18 + 46 cp-cp-cp-c1 27 17 19 20 + 47 cp-cp-cp-cp 27 17 19 21 + 48 cp-cp-cp-hc 25 27 17 18 + 49 hc-cp-cp-hc 18 17 27 28 + 50 cp-cp-cp-cp 19 17 27 25 + 51 cp-cp-cp-hc 19 17 27 28 + 52 cp-cp-c1-hc 17 19 20 29 + 53 cp-cp-c1-c2 17 19 20 30 + 54 cp-cp-c1-c2 17 19 20 44 + 55 cp-cp-c1-hc 21 19 20 29 + 56 cp-cp-c1-c2 21 19 20 30 + 57 cp-cp-c1-c2 21 19 20 44 + 58 cp-cp-cp-hc 17 19 21 22 + 59 cp-cp-cp-cp 17 19 21 23 + 60 hc-cp-cp-c1 22 21 19 20 + 61 cp-cp-cp-c1 23 21 19 20 + 62 cp-c1-c2-c1 19 20 44 34 + 63 cp-c1-c2-hc 19 20 44 45 + 64 cp-c1-c2-hc 19 20 44 46 + 65 hc-c1-c2-c1 29 20 44 34 + 66 hc-c1-c2-hc 29 20 44 45 + 67 hc-c1-c2-hc 29 20 44 46 + 68 c2-c1-c2-c1 30 20 44 34 + 69 c2-c1-c2-hc 30 20 44 45 + 70 c2-c1-c2-hc 30 20 44 46 + 71 cp-cp-cp-hc 19 21 23 24 + 72 cp-cp-cp-cp 19 21 23 25 + 73 hc-cp-cp-hc 22 21 23 24 + 74 cp-cp-cp-hc 25 23 21 22 + 75 cp-cp-cp-hc 21 23 25 26 + 76 cp-cp-cp-cp 21 23 25 27 + 77 hc-cp-cp-hc 24 23 25 26 + 78 cp-cp-cp-hc 27 25 23 24 + 79 cp-cp-cp-cp 23 25 27 17 + 80 cp-cp-cp-hc 23 25 27 28 + 81 cp-cp-cp-hc 17 27 25 26 + 82 hc-cp-cp-hc 26 25 27 28 + 83 hc-cp-cp-c1 32 31 33 34 + 84 cp-cp-cp-hc 35 33 31 32 + 85 cp-cp-cp-c1 41 31 33 34 + 86 cp-cp-cp-cp 41 31 33 35 + 87 cp-cp-cp-hc 39 41 31 32 + 88 hc-cp-cp-hc 32 31 41 42 + 89 cp-cp-cp-cp 33 31 41 39 + 90 cp-cp-cp-hc 33 31 41 42 + 91 cp-cp-c1-c2 31 33 34 14 + 92 cp-cp-c1-hc 31 33 34 43 + 93 cp-cp-c1-c2 31 33 34 44 + 94 cp-cp-c1-c2 35 33 34 14 + 95 cp-cp-c1-hc 35 33 34 43 + 96 cp-cp-c1-c2 35 33 34 44 + 97 cp-cp-cp-hc 31 33 35 36 + 98 cp-cp-cp-cp 31 33 35 37 + 99 hc-cp-cp-c1 36 35 33 34 + 100 cp-cp-cp-c1 37 35 33 34 + 101 c2-c1-c2-c1 14 34 44 20 + 102 c2-c1-c2-hc 14 34 44 45 + 103 c2-c1-c2-hc 14 34 44 46 + 104 cp-c1-c2-c1 33 34 44 20 + 105 cp-c1-c2-hc 33 34 44 45 + 106 cp-c1-c2-hc 33 34 44 46 + 107 hc-c1-c2-c1 43 34 44 20 + 108 hc-c1-c2-hc 43 34 44 45 + 109 hc-c1-c2-hc 43 34 44 46 + 110 cp-cp-cp-hc 33 35 37 38 + 111 cp-cp-cp-cp 33 35 37 39 + 112 hc-cp-cp-hc 36 35 37 38 + 113 cp-cp-cp-hc 39 37 35 36 + 114 cp-cp-cp-hc 35 37 39 40 + 115 cp-cp-cp-cp 35 37 39 41 + 116 hc-cp-cp-hc 38 37 39 40 + 117 cp-cp-cp-hc 41 39 37 38 + 118 cp-cp-cp-cp 37 39 41 31 + 119 cp-cp-cp-hc 37 39 41 42 + 120 cp-cp-cp-hc 31 41 39 40 + 121 hc-cp-cp-hc 40 39 41 42 + +Impropers + + 1 cp-cp-cp-hc 3 1 11 2 + 2 cp-cp-cp-c1 1 3 5 4 + 3 cp-c1-hc-c2 3 4 13 14 + 4 cp-cp-cp-hc 3 5 7 6 + 5 cp-cp-cp-hc 5 7 9 8 + 6 cp-cp-cp-hc 7 9 11 10 + 7 cp-cp-cp-hc 1 11 9 12 + 8 cp-cp-cp-hc 19 17 27 18 + 9 cp-cp-cp-c1 17 19 21 20 + 10 cp-cp-cp-hc 19 21 23 22 + 11 cp-cp-cp-hc 21 23 25 24 + 12 cp-cp-cp-hc 23 25 27 26 + 13 cp-cp-cp-hc 17 27 25 28 + 14 cp-cp-cp-hc 33 31 41 32 + 15 cp-cp-cp-c1 31 33 35 34 + 16 cp-cp-cp-hc 33 35 37 36 + 17 cp-cp-cp-hc 35 37 39 38 + 18 cp-cp-cp-hc 37 39 41 40 + 19 cp-cp-cp-hc 31 41 39 42 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_unreacted.data_template b/examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_unreacted.data_template deleted file mode 100644 index f76aad50e6..0000000000 --- a/examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_unreacted.data_template +++ /dev/null @@ -1,422 +0,0 @@ -chain_plus_styrene_unreacted - -46 atoms -47 bonds -75 angles -105 dihedrals -29 impropers - -Types - -1 1 -2 2 -3 1 -4 3 -5 1 -6 2 -7 1 -8 2 -9 1 -10 2 -11 1 -12 2 -13 2 -14 4 -15 2 -16 2 -17 1 -18 2 -19 1 -20 5 -21 1 -22 2 -23 1 -24 2 -25 1 -26 2 -27 1 -28 2 -29 2 -30 6 -31 1 -32 2 -33 1 -34 5 -35 1 -36 2 -37 1 -38 2 -39 1 -40 2 -41 1 -42 2 -43 2 -44 6 -45 2 -46 2 - -Charges - -1 -0.129000 -2 0.123700 -3 0.026600 -4 -0.018200 -5 -0.129000 -6 0.123700 -7 -0.173400 -8 0.140300 -9 -0.113400 -10 0.128800 -11 -0.173400 -12 0.140300 -13 0.051600 -14 -0.069600 -15 0.035400 -16 0.035400 -17 -0.129000 -18 0.123700 -19 0.026600 -20 -0.018200 -21 -0.129000 -22 0.123700 -23 -0.173400 -24 0.140300 -25 -0.113400 -26 0.128800 -27 -0.173400 -28 0.140300 -29 0.051600 -30 -0.069600 -31 -0.129000 -32 0.123700 -33 0.026600 -34 -0.018200 -35 -0.129000 -36 0.123700 -37 -0.173400 -38 0.140300 -39 -0.113400 -40 0.128800 -41 -0.173400 -42 0.140300 -43 0.051600 -44 -0.069600 -45 0.035400 -46 0.035400 - -Coords - -1 24.130699 1.043900 -1.309300 -2 25.062700 1.582900 -1.309300 -3 22.900700 1.753900 -1.309300 -4 22.900700 3.253900 -1.309300 -5 21.670700 1.043900 -1.309300 -6 20.738701 1.582900 -1.309300 -7 21.670700 -0.376100 -1.309300 -8 20.738701 -0.915100 -1.309300 -9 22.900700 -1.086100 -1.309300 -10 22.900700 -2.163100 -1.309300 -11 24.130699 -0.376100 -1.309300 -12 25.062700 -0.915100 -1.309300 -13 23.766701 3.658900 -0.952300 -14 21.622700 3.802900 -1.871300 -15 21.672701 4.544900 -1.970300 -16 20.979700 2.979900 -2.165300 -17 13.465800 0.682500 -1.658900 -18 14.397800 1.221500 -1.658900 -19 12.235800 1.392500 -1.658900 -20 12.235800 2.892500 -1.658900 -21 11.005800 0.682500 -1.658900 -22 10.073800 1.221500 -1.658900 -23 11.005800 -0.737500 -1.658900 -24 10.073800 -1.276500 -1.658900 -25 12.235800 -1.447500 -1.658900 -26 12.235800 -2.524500 -1.658900 -27 13.465800 -0.737500 -1.658900 -28 14.397800 -1.276500 -1.658900 -29 13.101800 3.297500 -1.301900 -30 10.957800 3.441500 -2.220900 -31 18.663500 0.855500 -1.372100 -32 19.595501 1.394500 -1.372100 -33 17.433500 1.565500 -1.372100 -34 17.433500 3.065500 -1.372100 -35 16.203501 0.855500 -1.372100 -36 15.271500 1.394500 -1.372100 -37 16.203501 -0.564500 -1.372100 -38 15.271500 -1.103500 -1.372100 -39 17.433500 -1.274500 -1.372100 -40 17.433500 -2.351500 -1.372100 -41 18.663500 -0.564500 -1.372100 -42 19.595501 -1.103500 -1.372100 -43 18.299500 3.470500 -1.015100 -44 16.155500 3.614500 -1.934100 -45 16.205500 4.356500 -2.033100 -46 15.512500 2.791500 -2.228100 - -Bonds - -1 1 1 2 -2 2 1 3 -3 2 1 11 -4 3 3 4 -5 2 3 5 -6 4 13 4 -7 5 4 14 -8 1 5 6 -9 2 5 7 -10 1 7 8 -11 2 7 9 -12 1 9 10 -13 2 9 11 -14 1 11 12 -15 6 15 14 -16 6 16 14 -17 1 17 18 -18 2 17 19 -19 2 17 27 -20 7 19 20 -21 2 19 21 -22 8 29 20 -23 9 20 30 -24 9 20 44 -25 1 21 22 -26 2 21 23 -27 1 23 24 -28 2 23 25 -29 1 25 26 -30 2 25 27 -31 1 27 28 -32 1 31 32 -33 2 31 33 -34 2 31 41 -35 7 33 34 -36 2 33 35 -37 8 43 34 -38 9 34 44 -39 1 35 36 -40 2 35 37 -41 1 37 38 -42 2 37 39 -43 1 39 40 -44 2 39 41 -45 1 41 42 -46 10 45 44 -47 10 46 44 - -Angles - -1 1 3 1 2 -2 1 11 1 2 -3 2 3 1 11 -4 3 1 3 4 -5 2 1 3 5 -6 3 5 3 4 -7 4 3 4 13 -8 5 3 4 14 -9 6 13 4 14 -10 1 3 5 6 -11 2 3 5 7 -12 1 7 5 6 -13 1 5 7 8 -14 2 5 7 9 -15 1 9 7 8 -16 1 7 9 10 -17 2 7 9 11 -18 1 11 9 10 -19 2 1 11 9 -20 1 1 11 12 -21 1 9 11 12 -22 7 15 14 4 -23 7 16 14 4 -24 8 15 14 16 -25 1 19 17 18 -26 1 27 17 18 -27 2 19 17 27 -28 9 17 19 20 -29 2 17 19 21 -30 9 21 19 20 -31 10 19 20 29 -32 11 19 20 30 -33 11 19 20 44 -34 12 29 20 30 -35 12 29 20 44 -36 13 30 20 44 -37 1 19 21 22 -38 2 19 21 23 -39 1 23 21 22 -40 1 21 23 24 -41 2 21 23 25 -42 1 25 23 24 -43 1 23 25 26 -44 2 23 25 27 -45 1 27 25 26 -46 2 17 27 25 -47 1 17 27 28 -48 1 25 27 28 -49 1 33 31 32 -50 1 41 31 32 -51 2 33 31 41 -52 9 31 33 34 -53 2 31 33 35 -54 9 35 33 34 -55 10 33 34 43 -56 11 33 34 44 -57 12 43 34 44 -58 1 33 35 36 -59 2 33 35 37 -60 1 37 35 36 -61 1 35 37 38 -62 2 35 37 39 -63 1 39 37 38 -64 1 37 39 40 -65 2 37 39 41 -66 1 41 39 40 -67 2 31 41 39 -68 1 31 41 42 -69 1 39 41 42 -70 16 20 44 34 -71 14 45 44 20 -72 14 46 44 20 -73 14 45 44 34 -74 14 46 44 34 -75 15 45 44 46 - -Dihedrals - -1 1 2 1 3 4 -2 2 5 3 1 2 -3 3 11 1 3 4 -4 4 11 1 3 5 -5 2 9 11 1 2 -6 5 2 1 11 12 -7 4 3 1 11 9 -8 2 3 1 11 12 -9 6 1 3 4 13 -10 7 1 3 4 14 -11 6 5 3 4 13 -12 7 5 3 4 14 -13 2 1 3 5 6 -14 4 1 3 5 7 -15 1 6 5 3 4 -16 3 7 5 3 4 -17 8 3 4 14 15 -18 8 3 4 14 16 -19 9 13 4 14 15 -20 9 13 4 14 16 -21 2 3 5 7 8 -22 4 3 5 7 9 -23 5 6 5 7 8 -24 2 9 7 5 6 -25 2 5 7 9 10 -26 4 5 7 9 11 -27 5 8 7 9 10 -28 2 11 9 7 8 -29 4 7 9 11 1 -30 2 7 9 11 12 -31 2 1 11 9 10 -32 5 10 9 11 12 -33 10 18 17 19 20 -34 2 21 19 17 18 -35 11 27 17 19 20 -36 4 27 17 19 21 -37 2 25 27 17 18 -38 5 18 17 27 28 -39 4 19 17 27 25 -40 2 19 17 27 28 -41 12 17 19 20 29 -42 13 17 19 20 30 -43 13 17 19 20 44 -44 12 21 19 20 29 -45 13 21 19 20 30 -46 13 21 19 20 44 -47 2 17 19 21 22 -48 4 17 19 21 23 -49 10 22 21 19 20 -50 11 23 21 19 20 -51 17 19 20 44 34 -52 14 19 20 44 45 -53 14 19 20 44 46 -54 18 29 20 44 34 -55 15 29 20 44 45 -56 15 29 20 44 46 -57 19 30 20 44 34 -58 16 30 20 44 45 -59 16 30 20 44 46 -60 2 19 21 23 24 -61 4 19 21 23 25 -62 5 22 21 23 24 -63 2 25 23 21 22 -64 2 21 23 25 26 -65 4 21 23 25 27 -66 5 24 23 25 26 -67 2 27 25 23 24 -68 4 23 25 27 17 -69 2 23 25 27 28 -70 2 17 27 25 26 -71 5 26 25 27 28 -72 10 32 31 33 34 -73 2 35 33 31 32 -74 11 41 31 33 34 -75 4 41 31 33 35 -76 2 39 41 31 32 -77 5 32 31 41 42 -78 4 33 31 41 39 -79 2 33 31 41 42 -80 12 31 33 34 43 -81 13 31 33 34 44 -82 12 35 33 34 43 -83 13 35 33 34 44 -84 2 31 33 35 36 -85 4 31 33 35 37 -86 10 36 35 33 34 -87 11 37 35 33 34 -88 17 33 34 44 20 -89 14 33 34 44 45 -90 14 33 34 44 46 -91 18 43 34 44 20 -92 15 43 34 44 45 -93 15 43 34 44 46 -94 2 33 35 37 38 -95 4 33 35 37 39 -96 5 36 35 37 38 -97 2 39 37 35 36 -98 2 35 37 39 40 -99 4 35 37 39 41 -100 5 38 37 39 40 -101 2 41 39 37 38 -102 4 37 39 41 31 -103 2 37 39 41 42 -104 2 31 41 39 40 -105 5 40 39 41 42 - -Impropers - -1 1 3 1 11 2 -2 2 1 3 5 4 -3 3 3 4 13 14 -4 1 3 5 7 6 -5 1 5 7 9 8 -6 1 7 9 11 10 -7 1 1 11 9 12 -8 4 15 14 16 4 -9 1 19 17 27 18 -10 5 17 19 21 20 -11 1 19 21 23 22 -12 1 21 23 25 24 -13 1 23 25 27 26 -14 1 17 27 25 28 -15 1 33 31 41 32 -16 5 31 33 35 34 -17 7 33 34 43 44 -18 1 33 35 37 36 -19 1 35 37 39 38 -20 1 37 39 41 40 -21 1 31 41 39 42 -22 1 19 20 29 30 -23 1 19 20 29 44 -24 1 19 20 30 44 -25 1 29 20 30 44 -26 1 45 44 34 20 -27 1 46 44 34 20 -28 1 45 44 46 20 -29 1 45 44 46 34 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_unreacted.molecule_template b/examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_unreacted.molecule_template new file mode 100644 index 0000000000..f43993e2d6 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_polystyrene/chain_plus_styrene_unreacted.molecule_template @@ -0,0 +1,463 @@ +chain_plus_styrene_unreacted + + 46 atoms + 47 bonds + 75 angles + 105 dihedrals + 21 impropers + +Coords + + 1 24.130699158 1.043900013 -1.309299946 + 2 25.062700272 1.582900047 -1.309299946 + 3 22.900699615 1.753900051 -1.309299946 + 4 22.900699615 3.253900051 -1.309299946 + 5 21.670700073 1.043900013 -1.309299946 + 6 20.738700867 1.582900047 -1.309299946 + 7 21.670700073 -0.376100004 -1.309299946 + 8 20.738700867 -0.915099978 -1.309299946 + 9 22.900699615 -1.086099982 -1.309299946 + 10 22.900699615 -2.163100004 -1.309299946 + 11 24.130699158 -0.376100004 -1.309299946 + 12 25.062700272 -0.915099978 -1.309299946 + 13 23.766700745 3.658900023 -0.952300012 + 14 21.622699738 3.802900076 -1.871299982 + 15 21.672700882 4.544899940 -1.970299959 + 16 20.979700088 2.979899883 -2.165299892 + 17 13.465800285 0.682500005 -1.658900022 + 18 14.397800446 1.221500039 -1.658900022 + 19 12.235799789 1.392500043 -1.658900022 + 20 12.235799789 2.892499924 -1.658900022 + 21 11.005800247 0.682500005 -1.658900022 + 22 10.073800087 1.221500039 -1.658900022 + 23 11.005800247 -0.737500012 -1.658900022 + 24 10.073800087 -1.276499987 -1.658900022 + 25 12.235799789 -1.447499990 -1.658900022 + 26 12.235799789 -2.524499893 -1.658900022 + 27 13.465800285 -0.737500012 -1.658900022 + 28 14.397800446 -1.276499987 -1.658900022 + 29 13.101799965 3.297499895 -1.301900029 + 30 10.957799911 3.441499949 -2.220900059 + 31 18.663499832 0.855499983 -1.372099996 + 32 19.595500946 1.394500017 -1.372099996 + 33 17.433500290 1.565500021 -1.372099996 + 34 17.433500290 3.065500021 -1.372099996 + 35 16.203500748 0.855499983 -1.372099996 + 36 15.271499634 1.394500017 -1.372099996 + 37 16.203500748 -0.564499974 -1.372099996 + 38 15.271499634 -1.103500009 -1.372099996 + 39 17.433500290 -1.274500012 -1.372099996 + 40 17.433500290 -2.351500034 -1.372099996 + 41 18.663499832 -0.564499974 -1.372099996 + 42 19.595500946 -1.103500009 -1.372099996 + 43 18.299499512 3.470499992 -1.015100002 + 44 16.155500412 3.614500046 -1.934100032 + 45 16.205499649 4.356500149 -2.033099890 + 46 15.512499809 2.791500092 -2.228100061 + +Types + + 1 cp + 2 hc + 3 cp + 4 c=1 + 5 cp + 6 hc + 7 cp + 8 hc + 9 cp + 10 hc + 11 cp + 12 hc + 13 hc + 14 c= + 15 hc + 16 hc + 17 cp + 18 hc + 19 cp + 20 c1 + 21 cp + 22 hc + 23 cp + 24 hc + 25 cp + 26 hc + 27 cp + 28 hc + 29 hc + 30 c2 + 31 cp + 32 hc + 33 cp + 34 c1 + 35 cp + 36 hc + 37 cp + 38 hc + 39 cp + 40 hc + 41 cp + 42 hc + 43 hc + 44 c2 + 45 hc + 46 hc + +Charges + + 1 -0.129000 + 2 0.123700 + 3 0.026600 + 4 -0.018200 + 5 -0.129000 + 6 0.123700 + 7 -0.173400 + 8 0.140300 + 9 -0.113400 + 10 0.128800 + 11 -0.173400 + 12 0.140300 + 13 0.051600 + 14 -0.069600 + 15 0.035400 + 16 0.035400 + 17 -0.129000 + 18 0.123700 + 19 0.026600 + 20 -0.018200 + 21 -0.129000 + 22 0.123700 + 23 -0.173400 + 24 0.140300 + 25 -0.113400 + 26 0.128800 + 27 -0.173400 + 28 0.140300 + 29 0.051600 + 30 -0.069600 + 31 -0.129000 + 32 0.123700 + 33 0.026600 + 34 -0.018200 + 35 -0.129000 + 36 0.123700 + 37 -0.173400 + 38 0.140300 + 39 -0.113400 + 40 0.128800 + 41 -0.173400 + 42 0.140300 + 43 0.051600 + 44 -0.069600 + 45 0.035400 + 46 0.035400 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + 32 1 + 33 1 + 34 1 + 35 1 + 36 1 + 37 1 + 38 1 + 39 1 + 40 1 + 41 1 + 42 1 + 43 1 + 44 1 + 45 1 + 46 1 + +Bonds + + 1 cp-hc 1 2 + 2 cp-cp 1 3 + 3 cp-cp 1 11 + 4 cp-c=1 3 4 + 5 cp-cp 3 5 + 6 hc-c=1 13 4 + 7 c=1-c= 4 14 + 8 cp-hc 5 6 + 9 cp-cp 5 7 + 10 cp-hc 7 8 + 11 cp-cp 7 9 + 12 cp-hc 9 10 + 13 cp-cp 9 11 + 14 cp-hc 11 12 + 15 hc-c= 15 14 + 16 hc-c= 16 14 + 17 cp-hc 17 18 + 18 cp-cp 17 19 + 19 cp-cp 17 27 + 20 cp-c1 19 20 + 21 cp-cp 19 21 + 22 hc-c1 29 20 + 23 c1-c2 20 30 + 24 c1-c2 20 44 + 25 cp-hc 21 22 + 26 cp-cp 21 23 + 27 cp-hc 23 24 + 28 cp-cp 23 25 + 29 cp-hc 25 26 + 30 cp-cp 25 27 + 31 cp-hc 27 28 + 32 cp-hc 31 32 + 33 cp-cp 31 33 + 34 cp-cp 31 41 + 35 cp-c1 33 34 + 36 cp-cp 33 35 + 37 hc-c1 43 34 + 38 c1-c2 34 44 + 39 cp-hc 35 36 + 40 cp-cp 35 37 + 41 cp-hc 37 38 + 42 cp-cp 37 39 + 43 cp-hc 39 40 + 44 cp-cp 39 41 + 45 cp-hc 41 42 + 46 hc-c2 45 44 + 47 hc-c2 46 44 + +Angles + + 1 cp-cp-hc 3 1 2 + 2 cp-cp-hc 11 1 2 + 3 cp-cp-cp 3 1 11 + 4 cp-cp-c=1 1 3 4 + 5 cp-cp-cp 1 3 5 + 6 cp-cp-c=1 5 3 4 + 7 cp-c=1-hc 3 4 13 + 8 cp-c=1-c= 3 4 14 + 9 hc-c=1-c= 13 4 14 + 10 cp-cp-hc 3 5 6 + 11 cp-cp-cp 3 5 7 + 12 cp-cp-hc 7 5 6 + 13 cp-cp-hc 5 7 8 + 14 cp-cp-cp 5 7 9 + 15 cp-cp-hc 9 7 8 + 16 cp-cp-hc 7 9 10 + 17 cp-cp-cp 7 9 11 + 18 cp-cp-hc 11 9 10 + 19 cp-cp-cp 1 11 9 + 20 cp-cp-hc 1 11 12 + 21 cp-cp-hc 9 11 12 + 22 hc-c=-c=1 15 14 4 + 23 hc-c=-c=1 16 14 4 + 24 hc-c=-hc 15 14 16 + 25 cp-cp-hc 19 17 18 + 26 cp-cp-hc 27 17 18 + 27 cp-cp-cp 19 17 27 + 28 cp-cp-c1 17 19 20 + 29 cp-cp-cp 17 19 21 + 30 cp-cp-c1 21 19 20 + 31 cp-c1-hc 19 20 29 + 32 cp-c1-c2 19 20 30 + 33 cp-c1-c2 19 20 44 + 34 hc-c1-c2 29 20 30 + 35 hc-c1-c2 29 20 44 + 36 c2-c1-c2 30 20 44 + 37 cp-cp-hc 19 21 22 + 38 cp-cp-cp 19 21 23 + 39 cp-cp-hc 23 21 22 + 40 cp-cp-hc 21 23 24 + 41 cp-cp-cp 21 23 25 + 42 cp-cp-hc 25 23 24 + 43 cp-cp-hc 23 25 26 + 44 cp-cp-cp 23 25 27 + 45 cp-cp-hc 27 25 26 + 46 cp-cp-cp 17 27 25 + 47 cp-cp-hc 17 27 28 + 48 cp-cp-hc 25 27 28 + 49 cp-cp-hc 33 31 32 + 50 cp-cp-hc 41 31 32 + 51 cp-cp-cp 33 31 41 + 52 cp-cp-c1 31 33 34 + 53 cp-cp-cp 31 33 35 + 54 cp-cp-c1 35 33 34 + 55 cp-c1-hc 33 34 43 + 56 cp-c1-c2 33 34 44 + 57 hc-c1-c2 43 34 44 + 58 cp-cp-hc 33 35 36 + 59 cp-cp-cp 33 35 37 + 60 cp-cp-hc 37 35 36 + 61 cp-cp-hc 35 37 38 + 62 cp-cp-cp 35 37 39 + 63 cp-cp-hc 39 37 38 + 64 cp-cp-hc 37 39 40 + 65 cp-cp-cp 37 39 41 + 66 cp-cp-hc 41 39 40 + 67 cp-cp-cp 31 41 39 + 68 cp-cp-hc 31 41 42 + 69 cp-cp-hc 39 41 42 + 70 c1-c2-c1 20 44 34 + 71 hc-c2-c1 45 44 20 + 72 hc-c2-c1 46 44 20 + 73 hc-c2-c1 45 44 34 + 74 hc-c2-c1 46 44 34 + 75 hc-c2-hc 45 44 46 + +Dihedrals + + 1 hc-cp-cp-c=1 2 1 3 4 + 2 cp-cp-cp-hc 5 3 1 2 + 3 cp-cp-cp-c=1 11 1 3 4 + 4 cp-cp-cp-cp 11 1 3 5 + 5 cp-cp-cp-hc 9 11 1 2 + 6 hc-cp-cp-hc 2 1 11 12 + 7 cp-cp-cp-cp 3 1 11 9 + 8 cp-cp-cp-hc 3 1 11 12 + 9 cp-cp-c=1-hc 1 3 4 13 + 10 cp-cp-c=1-c= 1 3 4 14 + 11 cp-cp-c=1-hc 5 3 4 13 + 12 cp-cp-c=1-c= 5 3 4 14 + 13 cp-cp-cp-hc 1 3 5 6 + 14 cp-cp-cp-cp 1 3 5 7 + 15 hc-cp-cp-c=1 6 5 3 4 + 16 cp-cp-cp-c=1 7 5 3 4 + 17 cp-c=1-c=-hc 3 4 14 15 + 18 cp-c=1-c=-hc 3 4 14 16 + 19 hc-c=1-c=-hc 13 4 14 15 + 20 hc-c=1-c=-hc 13 4 14 16 + 21 cp-cp-cp-hc 3 5 7 8 + 22 cp-cp-cp-cp 3 5 7 9 + 23 hc-cp-cp-hc 6 5 7 8 + 24 cp-cp-cp-hc 9 7 5 6 + 25 cp-cp-cp-hc 5 7 9 10 + 26 cp-cp-cp-cp 5 7 9 11 + 27 hc-cp-cp-hc 8 7 9 10 + 28 cp-cp-cp-hc 11 9 7 8 + 29 cp-cp-cp-cp 7 9 11 1 + 30 cp-cp-cp-hc 7 9 11 12 + 31 cp-cp-cp-hc 1 11 9 10 + 32 hc-cp-cp-hc 10 9 11 12 + 33 hc-cp-cp-c1 18 17 19 20 + 34 cp-cp-cp-hc 21 19 17 18 + 35 cp-cp-cp-c1 27 17 19 20 + 36 cp-cp-cp-cp 27 17 19 21 + 37 cp-cp-cp-hc 25 27 17 18 + 38 hc-cp-cp-hc 18 17 27 28 + 39 cp-cp-cp-cp 19 17 27 25 + 40 cp-cp-cp-hc 19 17 27 28 + 41 cp-cp-c1-hc 17 19 20 29 + 42 cp-cp-c1-c2 17 19 20 30 + 43 cp-cp-c1-c2 17 19 20 44 + 44 cp-cp-c1-hc 21 19 20 29 + 45 cp-cp-c1-c2 21 19 20 30 + 46 cp-cp-c1-c2 21 19 20 44 + 47 cp-cp-cp-hc 17 19 21 22 + 48 cp-cp-cp-cp 17 19 21 23 + 49 hc-cp-cp-c1 22 21 19 20 + 50 cp-cp-cp-c1 23 21 19 20 + 51 cp-c1-c2-c1 19 20 44 34 + 52 cp-c1-c2-hc 19 20 44 45 + 53 cp-c1-c2-hc 19 20 44 46 + 54 hc-c1-c2-c1 29 20 44 34 + 55 hc-c1-c2-hc 29 20 44 45 + 56 hc-c1-c2-hc 29 20 44 46 + 57 c2-c1-c2-c1 30 20 44 34 + 58 c2-c1-c2-hc 30 20 44 45 + 59 c2-c1-c2-hc 30 20 44 46 + 60 cp-cp-cp-hc 19 21 23 24 + 61 cp-cp-cp-cp 19 21 23 25 + 62 hc-cp-cp-hc 22 21 23 24 + 63 cp-cp-cp-hc 25 23 21 22 + 64 cp-cp-cp-hc 21 23 25 26 + 65 cp-cp-cp-cp 21 23 25 27 + 66 hc-cp-cp-hc 24 23 25 26 + 67 cp-cp-cp-hc 27 25 23 24 + 68 cp-cp-cp-cp 23 25 27 17 + 69 cp-cp-cp-hc 23 25 27 28 + 70 cp-cp-cp-hc 17 27 25 26 + 71 hc-cp-cp-hc 26 25 27 28 + 72 hc-cp-cp-c1 32 31 33 34 + 73 cp-cp-cp-hc 35 33 31 32 + 74 cp-cp-cp-c1 41 31 33 34 + 75 cp-cp-cp-cp 41 31 33 35 + 76 cp-cp-cp-hc 39 41 31 32 + 77 hc-cp-cp-hc 32 31 41 42 + 78 cp-cp-cp-cp 33 31 41 39 + 79 cp-cp-cp-hc 33 31 41 42 + 80 cp-cp-c1-hc 31 33 34 43 + 81 cp-cp-c1-c2 31 33 34 44 + 82 cp-cp-c1-hc 35 33 34 43 + 83 cp-cp-c1-c2 35 33 34 44 + 84 cp-cp-cp-hc 31 33 35 36 + 85 cp-cp-cp-cp 31 33 35 37 + 86 hc-cp-cp-c1 36 35 33 34 + 87 cp-cp-cp-c1 37 35 33 34 + 88 cp-c1-c2-c1 33 34 44 20 + 89 cp-c1-c2-hc 33 34 44 45 + 90 cp-c1-c2-hc 33 34 44 46 + 91 hc-c1-c2-c1 43 34 44 20 + 92 hc-c1-c2-hc 43 34 44 45 + 93 hc-c1-c2-hc 43 34 44 46 + 94 cp-cp-cp-hc 33 35 37 38 + 95 cp-cp-cp-cp 33 35 37 39 + 96 hc-cp-cp-hc 36 35 37 38 + 97 cp-cp-cp-hc 39 37 35 36 + 98 cp-cp-cp-hc 35 37 39 40 + 99 cp-cp-cp-cp 35 37 39 41 + 100 hc-cp-cp-hc 38 37 39 40 + 101 cp-cp-cp-hc 41 39 37 38 + 102 cp-cp-cp-cp 37 39 41 31 + 103 cp-cp-cp-hc 37 39 41 42 + 104 cp-cp-cp-hc 31 41 39 40 + 105 hc-cp-cp-hc 40 39 41 42 + +Impropers + + 1 cp-cp-cp-hc 3 1 11 2 + 2 cp-cp-cp-c=1 1 3 5 4 + 3 cp-c=1-hc-c= 3 4 13 14 + 4 cp-cp-cp-hc 3 5 7 6 + 5 cp-cp-cp-hc 5 7 9 8 + 6 cp-cp-cp-hc 7 9 11 10 + 7 cp-cp-cp-hc 1 11 9 12 + 8 hc-c=-hc-c=1 15 14 16 4 + 9 cp-cp-cp-hc 19 17 27 18 + 10 cp-cp-cp-c1 17 19 21 20 + 11 cp-cp-cp-hc 19 21 23 22 + 12 cp-cp-cp-hc 21 23 25 24 + 13 cp-cp-cp-hc 23 25 27 26 + 14 cp-cp-cp-hc 17 27 25 28 + 15 cp-cp-cp-hc 33 31 41 32 + 16 cp-cp-cp-c1 31 33 35 34 + 17 cp-c1-hc-c2 33 34 43 44 + 18 cp-cp-cp-hc 33 35 37 36 + 19 cp-cp-cp-hc 35 37 39 38 + 20 cp-cp-cp-hc 37 39 41 40 + 21 cp-cp-cp-hc 31 41 39 42 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/in.tiny_polystyrene.stabilized b/examples/PACKAGES/reaction/tiny_polystyrene/in.tiny_polystyrene.stabilized index a711f3eaa9..ab9c012905 100644 --- a/examples/PACKAGES/reaction/tiny_polystyrene/in.tiny_polystyrene.stabilized +++ b/examples/PACKAGES/reaction/tiny_polystyrene/in.tiny_polystyrene.stabilized @@ -1,5 +1,5 @@ # 20 styrene molecules -# three reactions defined +# three reactions defined units real @@ -11,9 +11,9 @@ kspace_style pppm 1.0e-4 pair_style lj/class2/coul/long 8.5 -angle_style class2 +angle_style class2 -bond_style class2 +bond_style class2 dihedral_style class2 @@ -28,12 +28,12 @@ read_data tiny_polystyrene.data & extra/improper/per/atom 25 & extra/special/per/atom 25 -molecule mol1 2styrene_unreacted.data_template -molecule mol2 2styrene_reacted.data_template -molecule mol3 chain_plus_styrene_unreacted.data_template -molecule mol4 chain_plus_styrene_reacted.data_template -molecule mol5 chain_chain_unreacted.data_template -molecule mol6 chain_chain_reacted.data_template +molecule mol1 2styrene_unreacted.molecule_template +molecule mol2 2styrene_reacted.molecule_template +molecule mol3 chain_plus_styrene_unreacted.molecule_template +molecule mol4 chain_plus_styrene_reacted.molecule_template +molecule mol5 chain_chain_unreacted.molecule_template +molecule mol6 chain_chain_reacted.molecule_template thermo 100 @@ -53,4 +53,4 @@ thermo_style custom step temp press density f_rxn1[1] f_rxn1[2] f_rxn1[3] run 10000 # write_restart restart_longrun nofix -# write_data restart_longrun.data +# write_data restart_longrun.data diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/log.20Nov19.tiny_polystyrene.stabilized.g++.1 b/examples/PACKAGES/reaction/tiny_polystyrene/log.20Nov19.tiny_polystyrene.stabilized.g++.1 deleted file mode 100644 index 274c72ece9..0000000000 --- a/examples/PACKAGES/reaction/tiny_polystyrene/log.20Nov19.tiny_polystyrene.stabilized.g++.1 +++ /dev/null @@ -1,245 +0,0 @@ -LAMMPS (20 Nov 2019) - -WARNING-WARNING-WARNING-WARNING-WARNING -This LAMMPS executable was compiled using C++98 compatibility. -Please report the compiler info below at https://github.com/lammps/lammps/issues/1659 -GNU C++ 4.8.5 -WARNING-WARNING-WARNING-WARNING-WARNING - -Reading data file ... - orthogonal box = (1.74267 1.74267 1.74267) to (18.2573 18.2573 18.2573) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 320 atoms - reading velocities ... - 320 velocities - scanning bonds ... - 8 = max bonds/atom - scanning angles ... - 18 = max angles/atom - scanning dihedrals ... - 22 = max dihedrals/atom - scanning impropers ... - 26 = max impropers/atom - reading bonds ... - 320 bonds - reading angles ... - 480 angles - reading dihedrals ... - 640 dihedrals - reading impropers ... - 160 impropers -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 3 = max # of 1-2 neighbors - 6 = max # of 1-3 neighbors - 12 = max # of 1-4 neighbors - 39 = max # of special neighbors - special bonds CPU = 0.000929056 secs - read_data CPU = 0.00930568 secs -Read molecule mol1: - 32 atoms with max type 4 - 32 bonds with max type 6 - 48 angles with max type 8 - 64 dihedrals with max type 9 - 16 impropers with max type 4 -Read molecule mol2: - 32 atoms with max type 6 - 33 bonds with max type 10 - 54 angles with max type 16 - 79 dihedrals with max type 19 - 22 impropers with max type 7 -Read molecule mol3: - 46 atoms with max type 6 - 47 bonds with max type 10 - 75 angles with max type 16 - 105 dihedrals with max type 19 - 29 impropers with max type 7 -Read molecule mol4: - 46 atoms with max type 6 - 48 bonds with max type 13 - 81 angles with max type 22 - 121 dihedrals with max type 36 - 35 impropers with max type 9 -Read molecule mol5: - 50 atoms with max type 6 - 51 bonds with max type 10 - 84 angles with max type 16 - 118 dihedrals with max type 19 - 36 impropers with max type 7 -Read molecule mol6: - 50 atoms with max type 6 - 52 bonds with max type 10 - 90 angles with max type 16 - 135 dihedrals with max type 19 - 42 impropers with max type 5 -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp_REACT defined -PPPM initialization ... -WARNING: System is not charge neutral, net charge = -0.004 (../kspace.cpp:304) - using 12-bit tables for long-range coulomb (../kspace.cpp:323) - G vector (1/distance) = 0.255611 - grid = 6 6 6 - stencil order = 5 - estimated absolute RMS force accuracy = 0.00974692 - estimated relative force accuracy = 2.93525e-05 - using double precision FFTs - 3d grid and FFT values/proc = 1331 216 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10.5 - ghost atom cutoff = 10.5 - binsize = 5.25, bins = 4 4 4 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 -Per MPI rank memory allocation (min/avg/max) = 31.14 | 31.14 | 31.14 Mbytes -Step Temp Press Density f_rxn1[1] f_rxn1[2] f_rxn1[3] - 0 320.13638 -376.0844 0.76796752 0 0 0 - 100 520.00782 3952.7008 0.76796752 8 0 0 - 200 499.9174 2360.8219 0.76796752 8 3 1 - 300 583.93895 2453.7374 0.76796752 8 3 2 - 400 560.65536 -2243.3464 0.76796752 8 3 3 - 500 556.27995 3598.7044 0.76796752 8 3 3 - 600 570.8397 -3340.1826 0.76796752 8 4 4 - 700 456.89894 -1087.8081 0.76796752 8 4 4 - 800 572.91817 -776.19188 0.76796752 8 4 4 - 900 530.13621 -246734.46 0.76796752 8 4 5 - 1000 542.34698 1044.0793 0.76796752 8 4 5 - 1100 562.86339 1207.1715 0.76796752 8 4 5 - 1200 520.1559 2725.6523 0.76796752 8 4 5 - 1300 534.01667 951.0972 0.76796752 8 4 5 - 1400 478.68681 1184.9224 0.76796752 8 4 5 - 1500 509.05445 2020.5224 0.76796752 8 4 5 - 1600 549.5382 810.17577 0.76796752 8 4 5 - 1700 549.46882 -6349.7751 0.76796752 8 4 5 - 1800 496.77334 3953.1043 0.76796752 8 4 5 - 1900 522.28719 -2271.7599 0.76796752 8 4 6 - 2000 569.95975 5633.4352 0.76796752 8 4 6 - 2100 590.8418 2355.8447 0.76796752 8 4 6 - 2200 537.64787 6459.6743 0.76796752 8 4 6 - 2300 548.38487 -1566.3528 0.76796752 8 4 6 - 2400 533.50353 6755.664 0.76796752 8 4 6 - 2500 512.57053 325.30968 0.76796752 8 4 6 - 2600 498.4597 -2468.1165 0.76796752 8 4 6 - 2700 559.03937 2428.3446 0.76796752 8 4 6 - 2800 585.85721 -2896.3607 0.76796752 8 4 6 - 2900 523.18635 1391.254 0.76796752 8 4 6 - 3000 524.62076 375.02973 0.76796752 8 4 6 - 3100 534.65688 -1522.7879 0.76796752 8 4 6 - 3200 499.42665 3725.5476 0.76796752 8 4 6 - 3300 514.36972 1725.8329 0.76796752 8 4 6 - 3400 482.52662 4648.5013 0.76796752 8 4 6 - 3500 495.36836 967.3482 0.76796752 8 4 6 - 3600 583.28736 745.21794 0.76796752 8 4 6 - 3700 531.99717 -804.39572 0.76796752 8 4 6 - 3800 555.08359 -2381.363 0.76796752 8 4 6 - 3900 520.1818 -547.34169 0.76796752 8 4 6 - 4000 444.38804 -2488.7881 0.76796752 8 4 6 - 4100 518.65622 -3135.9573 0.76796752 8 4 6 - 4200 484.15227 -1040.2447 0.76796752 8 4 6 - 4300 514.58006 550.14626 0.76796752 8 4 6 - 4400 579.81405 -849.81454 0.76796752 8 4 6 - 4500 522.8698 5222.654 0.76796752 8 4 6 - 4600 490.78275 3251.2892 0.76796752 8 4 6 - 4700 492.64299 3785.3482 0.76796752 8 4 6 - 4800 500.11059 4441.8978 0.76796752 8 4 6 - 4900 536.80009 965.33724 0.76796752 8 4 6 - 5000 516.98575 -3794.4213 0.76796752 8 4 6 - 5100 516.76648 -3593.9106 0.76796752 8 4 6 - 5200 521.6379 -6532.7773 0.76796752 8 4 6 - 5300 535.64798 2931.412 0.76796752 8 4 6 - 5400 559.83266 7628.1659 0.76796752 8 4 6 - 5500 538.91756 2841.6746 0.76796752 8 4 6 - 5600 539.13999 10445.173 0.76796752 8 4 6 - 5700 501.56603 -2106.3309 0.76796752 8 4 6 - 5800 496.72952 -4831.0565 0.76796752 8 4 6 - 5900 536.12979 -3916.8197 0.76796752 8 4 6 - 6000 553.10092 3142.6871 0.76796752 8 4 6 - 6100 558.09546 3154.584 0.76796752 8 4 6 - 6200 523.48472 9807.0034 0.76796752 8 4 6 - 6300 551.80343 -3608.2078 0.76796752 8 4 6 - 6400 484.28359 2255.4675 0.76796752 8 4 6 - 6500 560.68443 -4826.4868 0.76796752 8 4 6 - 6600 604.50797 402.32183 0.76796752 8 4 6 - 6700 538.84714 -7670.3312 0.76796752 8 4 6 - 6800 528.82853 -380.32058 0.76796752 8 4 6 - 6900 579.30919 4438.4574 0.76796752 8 4 6 - 7000 540.3406 3738.0524 0.76796752 8 4 6 - 7100 519.53645 -1825.5563 0.76796752 8 4 6 - 7200 474.136 1657.3863 0.76796752 8 4 6 - 7300 485.55159 -221.84939 0.76796752 8 4 6 - 7400 527.38494 1037.1777 0.76796752 8 4 6 - 7500 517.14767 -2313.5823 0.76796752 8 4 6 - 7600 517.95967 -4763.4709 0.76796752 8 4 6 - 7700 513.63507 4819.0253 0.76796752 8 4 6 - 7800 503.56828 1295.1212 0.76796752 8 4 6 - 7900 520.87804 1506.9417 0.76796752 8 4 6 - 8000 509.46453 -5800.0971 0.76796752 8 4 6 - 8100 566.67059 6065.4607 0.76796752 8 4 6 - 8200 592.53068 1097.2277 0.76796752 8 4 6 - 8300 529.55235 -580.81757 0.76796752 8 4 6 - 8400 518.22587 560.45589 0.76796752 8 4 6 - 8500 521.94561 5325.9459 0.76796752 8 4 6 - 8600 510.54416 -1929.1967 0.76796752 8 4 6 - 8700 562.71252 -629.90392 0.76796752 8 4 6 - 8800 540.23123 -3484.3893 0.76796752 8 4 6 - 8900 513.82411 -5227.152 0.76796752 8 4 6 - 9000 534.3307 -3299.088 0.76796752 8 4 6 - 9100 509.24467 -5676.2775 0.76796752 8 4 6 - 9200 506.3216 -7043.8493 0.76796752 8 4 7 - 9300 480.37682 2380.4696 0.76796752 8 4 7 - 9400 546.15532 1831.0103 0.76796752 8 4 7 - 9500 567.18341 3839.9843 0.76796752 8 4 7 - 9600 536.14883 4258.5304 0.76796752 8 4 7 - 9700 496.04153 3321.3561 0.76796752 8 4 7 - 9800 531.78927 3124.9156 0.76796752 8 4 7 - 9900 530.91395 38.987859 0.76796752 8 4 7 - 10000 551.22761 1027.5706 0.76796752 8 4 7 -Loop time of 57.7096 on 1 procs for 10000 steps with 320 atoms - -Performance: 14.972 ns/day, 1.603 hours/ns, 173.281 timesteps/s -99.9% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 11.621 | 11.621 | 11.621 | 0.0 | 20.14 -Bond | 11.151 | 11.151 | 11.151 | 0.0 | 19.32 -Kspace | 2.2403 | 2.2403 | 2.2403 | 0.0 | 3.88 -Neigh | 25.467 | 25.467 | 25.467 | 0.0 | 44.13 -Comm | 0.90467 | 0.90467 | 0.90467 | 0.0 | 1.57 -Output | 0.0017984 | 0.0017984 | 0.0017984 | 0.0 | 0.00 -Modify | 6.2622 | 6.2622 | 6.2622 | 0.0 | 10.85 -Other | | 0.06192 | | | 0.11 - -Nlocal: 320 ave 320 max 320 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 3240 ave 3240 max 3240 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 54336 ave 54336 max 54336 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 54336 -Ave neighs/atom = 169.8 -Ave special neighs/atom = 11.3063 -Neighbor list builds = 10000 -Dangerous builds = 0 - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:58 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/log.20Nov19.tiny_polystyrene.stabilized.g++.4 b/examples/PACKAGES/reaction/tiny_polystyrene/log.20Nov19.tiny_polystyrene.stabilized.g++.4 deleted file mode 100644 index 29aae1cd0b..0000000000 --- a/examples/PACKAGES/reaction/tiny_polystyrene/log.20Nov19.tiny_polystyrene.stabilized.g++.4 +++ /dev/null @@ -1,255 +0,0 @@ -LAMMPS (20 Nov 2019) - -WARNING-WARNING-WARNING-WARNING-WARNING -This LAMMPS executable was compiled using C++98 compatibility. -Please report the compiler info below at https://github.com/lammps/lammps/issues/1659 -GNU C++ 4.8.5 -WARNING-WARNING-WARNING-WARNING-WARNING - -Reading data file ... - orthogonal box = (1.74267 1.74267 1.74267) to (18.2573 18.2573 18.2573) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 320 atoms - reading velocities ... - 320 velocities - scanning bonds ... - 8 = max bonds/atom - scanning angles ... - 18 = max angles/atom - scanning dihedrals ... - 22 = max dihedrals/atom - scanning impropers ... - 26 = max impropers/atom - reading bonds ... - 320 bonds - reading angles ... - 480 angles - reading dihedrals ... - 640 dihedrals - reading impropers ... - 160 impropers -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 3 = max # of 1-2 neighbors - 6 = max # of 1-3 neighbors - 12 = max # of 1-4 neighbors - 39 = max # of special neighbors - special bonds CPU = 0.000751222 secs - read_data CPU = 0.0268223 secs -Read molecule mol1: - 32 atoms with max type 4 - 32 bonds with max type 6 - 48 angles with max type 8 - 64 dihedrals with max type 9 - 16 impropers with max type 4 -Read molecule mol2: - 32 atoms with max type 6 - 33 bonds with max type 10 - 54 angles with max type 16 - 79 dihedrals with max type 19 - 22 impropers with max type 7 -Read molecule mol3: - 46 atoms with max type 6 - 47 bonds with max type 10 - 75 angles with max type 16 - 105 dihedrals with max type 19 - 29 impropers with max type 7 -Read molecule mol4: - 46 atoms with max type 6 - 48 bonds with max type 13 - 81 angles with max type 22 - 121 dihedrals with max type 36 - 35 impropers with max type 9 -Read molecule mol5: - 50 atoms with max type 6 - 51 bonds with max type 10 - 84 angles with max type 16 - 118 dihedrals with max type 19 - 36 impropers with max type 7 -Read molecule mol6: - 50 atoms with max type 6 - 52 bonds with max type 10 - 90 angles with max type 16 - 135 dihedrals with max type 19 - 42 impropers with max type 5 -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp_REACT defined -PPPM initialization ... -WARNING: System is not charge neutral, net charge = -0.004 (../kspace.cpp:304) - using 12-bit tables for long-range coulomb (../kspace.cpp:323) - G vector (1/distance) = 0.255611 - grid = 6 6 6 - stencil order = 5 - estimated absolute RMS force accuracy = 0.00974692 - estimated relative force accuracy = 2.93525e-05 - using double precision FFTs - 3d grid and FFT values/proc = 704 72 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10.5 - ghost atom cutoff = 10.5 - binsize = 5.25, bins = 4 4 4 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 -Per MPI rank memory allocation (min/avg/max) = 30.66 | 30.68 | 30.69 Mbytes -Step Temp Press Density f_rxn1[1] f_rxn1[2] f_rxn1[3] - 0 320.13638 -376.0844 0.76796752 0 0 0 - 100 522.71544 6623.0579 0.76796752 8 0 0 - 200 500.86716 -9439.5519 0.76796752 8 3 2 - 300 594.60588 6714.1323 0.76796752 8 3 3 - 400 598.68768 683.70457 0.76796752 8 3 3 - 500 563.1011 3576.6857 0.76796752 8 3 4 - 600 510.29713 -196148.37 0.76796752 8 3 5 - 700 494.14346 -118517.45 0.76796752 8 3 6 - 800 565.62849 7678.1235 0.76796752 8 3 6 - 900 515.74468 554.84571 0.76796752 8 3 6 - 1000 500.64636 450.15932 0.76796752 8 3 6 - 1100 463.34973 6023.8346 0.76796752 8 3 6 - 1200 529.88483 2748.185 0.76796752 8 3 6 - 1300 546.84049 1353.4891 0.76796752 8 3 6 - 1400 552.27356 1446.5807 0.76796752 8 3 6 - 1500 557.70874 -2745.1523 0.76796752 8 3 6 - 1600 572.0005 629.36722 0.76796752 8 3 6 - 1700 503.96569 5937.0231 0.76796752 8 3 6 - 1800 491.34262 -1175.8104 0.76796752 8 3 6 - 1900 538.24798 -81.197397 0.76796752 8 3 6 - 2000 523.89324 2857.2466 0.76796752 8 3 6 - 2100 515.1424 2288.2405 0.76796752 8 3 6 - 2200 546.80854 3807.1038 0.76796752 8 3 6 - 2300 500.31231 -135.33933 0.76796752 8 4 6 - 2400 497.16354 5516.857 0.76796752 8 4 6 - 2500 545.34187 3485.5645 0.76796752 8 4 6 - 2600 522.70122 3114.1284 0.76796752 8 4 6 - 2700 531.76604 6633.5518 0.76796752 8 4 6 - 2800 521.97643 -279.83682 0.76796752 8 4 6 - 2900 497.29575 7052.9409 0.76796752 8 4 6 - 3000 524.5942 2284.8918 0.76796752 8 4 6 - 3100 567.61329 -3667.4557 0.76796752 8 4 6 - 3200 506.82452 -2934.4936 0.76796752 8 4 6 - 3300 510.8521 313.36263 0.76796752 8 4 6 - 3400 516.70206 3671.1899 0.76796752 8 4 6 - 3500 535.12788 2645.2564 0.76796752 8 4 6 - 3600 580.14214 2604.3079 0.76796752 8 4 6 - 3700 529.77869 2684.0812 0.76796752 8 4 6 - 3800 502.93191 2838.6698 0.76796752 8 4 6 - 3900 585.91492 5308.0828 0.76796752 8 4 6 - 4000 548.89917 5262.5775 0.76796752 8 4 6 - 4100 550.7662 -1066.6807 0.76796752 8 4 6 - 4200 519.19198 2777.5276 0.76796752 8 4 6 - 4300 521.46332 -3429.7171 0.76796752 8 4 6 - 4400 532.64173 2301.3135 0.76796752 8 4 6 - 4500 528.96107 1369.0991 0.76796752 8 4 6 - 4600 564.66443 9687.2531 0.76796752 8 4 6 - 4700 558.49446 2322.6085 0.76796752 8 4 6 - 4800 497.78614 -442.45053 0.76796752 8 4 6 - 4900 511.09435 -10251.159 0.76796752 8 4 6 - 5000 525.6642 -1202.0584 0.76796752 8 4 6 - 5100 521.76974 1821.7811 0.76796752 8 4 6 - 5200 555.9859 7256.9632 0.76796752 8 4 6 - 5300 551.51971 -122893.16 0.76796752 8 4 7 - 5400 524.34705 2905.1033 0.76796752 8 4 7 - 5500 567.09396 2896.4824 0.76796752 8 4 7 - 5600 487.57746 1417.1715 0.76796752 8 4 7 - 5700 547.37304 3900.8734 0.76796752 8 4 7 - 5800 536.17647 -4048.7522 0.76796752 8 4 7 - 5900 536.85051 4497.9847 0.76796752 8 4 7 - 6000 548.58212 -4880.4979 0.76796752 8 4 7 - 6100 500.94692 6004.2105 0.76796752 8 4 7 - 6200 486.82494 402.5875 0.76796752 8 4 7 - 6300 478.09381 6600.767 0.76796752 8 4 7 - 6400 559.90398 2868.0805 0.76796752 8 4 7 - 6500 526.01866 -3398.4788 0.76796752 8 4 7 - 6600 539.68471 -1202.0012 0.76796752 8 4 7 - 6700 507.51217 -378.71164 0.76796752 8 4 7 - 6800 526.15958 -4536.9888 0.76796752 8 4 7 - 6900 511.37134 -2522.3553 0.76796752 8 4 7 - 7000 538.86918 -2028.0323 0.76796752 8 4 7 - 7100 523.25566 2911.9962 0.76796752 8 4 7 - 7200 513.28464 -1000.4758 0.76796752 8 4 7 - 7300 510.19826 5181.7976 0.76796752 8 4 7 - 7400 493.46528 -1166.3996 0.76796752 8 4 7 - 7500 491.51305 5669.2213 0.76796752 8 4 7 - 7600 506.72032 -2840.301 0.76796752 8 4 7 - 7700 513.4319 2802.1719 0.76796752 8 4 7 - 7800 543.7658 -7477.3623 0.76796752 8 4 7 - 7900 527.35619 -3182.3155 0.76796752 8 4 7 - 8000 533.50993 613.16561 0.76796752 8 4 7 - 8100 512.44958 -5037.3414 0.76796752 8 4 7 - 8200 494.88981 1799.3513 0.76796752 8 4 7 - 8300 554.81474 -2436.0507 0.76796752 8 4 7 - 8400 523.22917 364.30593 0.76796752 8 4 7 - 8500 515.12395 525.24581 0.76796752 8 4 7 - 8600 511.6321 -1679.8669 0.76796752 8 4 7 - 8700 531.6327 -1168.1215 0.76796752 8 4 7 - 8800 548.14438 -5222.7573 0.76796752 8 4 7 - 8900 517.72579 2073.9695 0.76796752 8 4 7 - 9000 543.11894 -5307.0759 0.76796752 8 4 7 - 9100 521.13747 -5546.8552 0.76796752 8 4 7 - 9200 509.66142 -1584.019 0.76796752 8 4 7 - 9300 488.73821 -277.85847 0.76796752 8 4 7 - 9400 513.67282 989.60653 0.76796752 8 4 7 - 9500 509.98833 -1754.8786 0.76796752 8 4 7 - 9600 558.72497 5616.6969 0.76796752 8 4 7 - 9700 533.74988 811.48871 0.76796752 8 4 7 - 9800 510.94641 -3136.5876 0.76796752 8 4 7 - 9900 517.80127 -1962.0837 0.76796752 8 4 7 - 10000 477.50428 -3768.1653 0.76796752 8 4 7 -Loop time of 20.9963 on 4 procs for 10000 steps with 320 atoms - -Performance: 41.150 ns/day, 0.583 hours/ns, 476.276 timesteps/s -100.0% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.4968 | 3.0329 | 3.3607 | 18.6 | 14.45 -Bond | 2.3164 | 2.8835 | 3.456 | 26.0 | 13.73 -Kspace | 1.3332 | 2.2082 | 3.285 | 48.0 | 10.52 -Neigh | 7.4831 | 7.4922 | 7.5012 | 0.3 | 35.68 -Comm | 1.2809 | 1.3121 | 1.3297 | 1.6 | 6.25 -Output | 0.0012138 | 0.0013506 | 0.0017552 | 0.6 | 0.01 -Modify | 4.0269 | 4.0301 | 4.0335 | 0.1 | 19.19 -Other | | 0.03583 | | | 0.17 - -Nlocal: 80 ave 94 max 66 min -Histogram: 2 0 0 0 0 0 0 0 0 2 -Nghost: 2243.75 ave 2260 max 2221 min -Histogram: 1 0 0 1 0 0 0 0 0 2 -Neighs: 13658.5 ave 17096 max 9421 min -Histogram: 1 0 0 0 0 1 1 0 0 1 - -Total # of neighbors = 54634 -Ave neighs/atom = 170.731 -Ave special neighs/atom = 11.3063 -Neighbor list builds = 10000 -Dangerous builds = 0 -System init for write_data ... -PPPM initialization ... - using 12-bit tables for long-range coulomb (../kspace.cpp:323) - G vector (1/distance) = 0.255611 - grid = 6 6 6 - stencil order = 5 - estimated absolute RMS force accuracy = 0.00974692 - estimated relative force accuracy = 2.93525e-05 - using double precision FFTs - 3d grid and FFT values/proc = 704 72 - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:21 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/log.4Nov19.tiny_polystyrene.stabilized.g++.4 b/examples/PACKAGES/reaction/tiny_polystyrene/log.4Nov19.tiny_polystyrene.stabilized.g++.4 new file mode 100644 index 0000000000..aaa8b2f190 --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_polystyrene/log.4Nov19.tiny_polystyrene.stabilized.g++.4 @@ -0,0 +1,329 @@ +LAMMPS (4 Nov 2022) +# 20 styrene molecules +# three reactions defined + +units real + +boundary p p p + +atom_style full + +kspace_style pppm 1.0e-4 + +pair_style lj/class2/coul/long 8.5 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +variable T equal 530 + +read_data tiny_polystyrene.data extra/bond/per/atom 5 extra/angle/per/atom 15 extra/dihedral/per/atom 15 extra/improper/per/atom 25 extra/special/per/atom 25 +Reading data file ... + orthogonal box = (1.7426663 1.7426663 1.7426663) to (18.257334 18.257334 18.257334) + 1 by 2 by 2 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 320 atoms + reading velocities ... + 320 velocities + scanning bonds ... + 8 = max bonds/atom + scanning angles ... + 18 = max angles/atom + scanning dihedrals ... + 22 = max dihedrals/atom + scanning impropers ... + 26 = max impropers/atom + reading bonds ... + 320 bonds + reading angles ... + 480 angles + reading dihedrals ... + 640 dihedrals + reading impropers ... + 160 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 3 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 12 = max # of 1-4 neighbors + 39 = max # of special neighbors + special bonds CPU = 0.001 seconds + read_data CPU = 0.018 seconds + +molecule mol1 2styrene_unreacted.molecule_template +Read molecule template mol1: + 1 molecules + 0 fragments + 32 atoms with max type 4 + 32 bonds with max type 11 + 48 angles with max type 19 + 64 dihedrals with max type 21 + 16 impropers with max type 8 +molecule mol2 2styrene_reacted.molecule_template +Read molecule template mol2: + 1 molecules + 0 fragments + 32 atoms with max type 6 + 33 bonds with max type 13 + 54 angles with max type 22 + 79 dihedrals with max type 19 + 14 impropers with max type 7 +molecule mol3 chain_plus_styrene_unreacted.molecule_template +Read molecule template mol3: + 1 molecules + 0 fragments + 46 atoms with max type 6 + 47 bonds with max type 13 + 75 angles with max type 22 + 105 dihedrals with max type 21 + 21 impropers with max type 8 +molecule mol4 chain_plus_styrene_reacted.molecule_template +Read molecule template mol4: + 1 molecules + 0 fragments + 46 atoms with max type 6 + 48 bonds with max type 13 + 81 angles with max type 22 + 121 dihedrals with max type 19 + 19 impropers with max type 7 +molecule mol5 chain_chain_unreacted.molecule_template +Read molecule template mol5: + 1 molecules + 0 fragments + 50 atoms with max type 6 + 51 bonds with max type 13 + 84 angles with max type 22 + 118 dihedrals with max type 19 + 20 impropers with max type 7 +molecule mol6 chain_chain_reacted.molecule_template +Read molecule template mol6: + 1 molecules + 0 fragments + 50 atoms with max type 6 + 52 bonds with max type 13 + 90 angles with max type 22 + 135 dihedrals with max type 19 + 18 impropers with max type 2 + +thermo 100 + +# dump 1 all xyz 5 test_vis.xyz + +fix rxn1 all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0 3.0 mol1 mol2 2styrene_map stabilize_steps 100 react rxn2 all 1 0 3.0 mol3 mol4 chain_plus_styrene_map stabilize_steps 100 react rxn3 all 1 0 5.0 mol5 mol6 chain_chain_map stabilize_steps 100 +dynamic group bond_react_MASTER_group defined +dynamic group statted_grp_REACT defined + +fix 1 statted_grp_REACT nvt temp $T $T 100 +fix 1 statted_grp_REACT nvt temp 530 $T 100 +fix 1 statted_grp_REACT nvt temp 530 530 100 + +fix 4 bond_react_MASTER_group temp/rescale 1 $T $T 1 1 +fix 4 bond_react_MASTER_group temp/rescale 1 530 $T 1 1 +fix 4 bond_react_MASTER_group temp/rescale 1 530 530 1 1 + +thermo_style custom step temp press density f_rxn1[1] f_rxn1[2] f_rxn1[3] + +run 10000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +PPPM initialization ... +WARNING: System is not charge neutral, net charge = -0.004 (../kspace.cpp:327) + using 12-bit tables for long-range coulomb (../kspace.cpp:342) + G vector (1/distance) = 0.25561147 + grid = 6 6 6 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0097469157 + estimated relative force accuracy = 2.9352547e-05 + using double precision KISS FFT + 3d grid and FFT values/proc = 704 72 +Generated 21 of 21 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 4 4 4 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 31.03 | 31.05 | 31.06 Mbytes + Step Temp Press Density f_rxn1[1] f_rxn1[2] f_rxn1[3] + 0 320.13638 -376.0844 0.76796752 0 0 0 + 100 342.22237 -3489.4495 0.76796752 0 0 0 + 200 412.23828 -1367.104 0.76796752 0 0 0 + 300 467.98145 4841.002 0.76796752 0 0 0 + 400 505.39864 2213.0509 0.76796752 1 0 0 + 500 519.63371 -28223.513 0.76796752 2 0 0 + 600 526.40655 8701.2728 0.76796752 2 0 0 + 700 579.91953 2507.5868 0.76796752 2 0 0 + 800 517.29593 5558.2895 0.76796752 2 0 0 + 900 503.38392 -5027.1154 0.76796752 2 0 0 + 1000 509.30767 3979.0529 0.76796752 2 0 0 + 1100 551.34763 5119.0848 0.76796752 2 0 0 + 1200 562.5176 -2867.8688 0.76796752 2 0 0 + 1300 552.90918 2090.7508 0.76796752 2 0 0 + 1400 516.10716 3374.2169 0.76796752 2 0 0 + 1500 518.70418 471.99711 0.76796752 2 0 0 + 1600 559.49915 5450.8774 0.76796752 2 0 0 + 1700 531.50638 4525.5892 0.76796752 2 0 0 + 1800 529.18331 -3566.9245 0.76796752 2 0 0 + 1900 517.79846 -2364.8287 0.76796752 2 0 0 + 2000 495.0983 -488.99696 0.76796752 2 0 0 + 2100 567.80521 2050.9596 0.76796752 3 0 0 + 2200 553.24434 5665.0753 0.76796752 3 0 0 + 2300 561.08278 2879.1572 0.76796752 3 0 0 + 2400 461.3712 3185.6091 0.76796752 3 0 0 + 2500 500.95595 565.81792 0.76796752 4 0 0 + 2600 538.3865 463.58228 0.76796752 4 0 0 + 2700 525.95739 2011.1914 0.76796752 4 0 0 + 2800 533.4197 157.38106 0.76796752 4 0 0 + 2900 526.27036 1331.5115 0.76796752 5 1 0 + 3000 502.65015 -93.915921 0.76796752 5 1 0 + 3100 505.4224 -1314.224 0.76796752 5 1 0 + 3200 538.52692 10420.644 0.76796752 5 1 0 + 3300 518.32801 5933.553 0.76796752 5 2 0 + 3400 540.04815 741.54438 0.76796752 6 2 1 + 3500 554.07567 5778.8913 0.76796752 6 2 1 + 3600 546.90828 4751.5437 0.76796752 6 2 1 + 3700 529.75739 432.20829 0.76796752 6 2 1 + 3800 542.806 -380.00399 0.76796752 6 2 1 + 3900 521.55789 -1224.1912 0.76796752 6 2 2 + 4000 519.73935 2792.996 0.76796752 6 2 2 + 4100 535.06314 -1926.8692 0.76796752 6 2 2 + 4200 549.75482 2852.5521 0.76796752 6 2 2 + 4300 510.71949 6581.1729 0.76796752 7 2 2 + 4400 485.93403 -695.24007 0.76796752 7 2 2 + 4500 535.3677 2519.2711 0.76796752 7 2 2 + 4600 504.87216 533.16619 0.76796752 7 2 2 + 4700 495.68939 5502.1672 0.76796752 7 2 2 + 4800 534.13893 -1187.1228 0.76796752 7 2 2 + 4900 512.56394 1731.3856 0.76796752 7 2 2 + 5000 508.63054 2467.0387 0.76796752 7 2 2 + 5100 501.65027 3403.8111 0.76796752 7 2 2 + 5200 556.68281 4310.0492 0.76796752 7 2 2 + 5300 506.86652 -773630.77 0.76796752 7 2 3 + 5400 570.01783 11663.867 0.76796752 7 2 3 + 5500 538.08785 6391.6546 0.76796752 7 2 3 + 5600 502.48456 44.409604 0.76796752 7 2 3 + 5700 545.75445 1558.6373 0.76796752 7 2 3 + 5800 517.5076 -166.52488 0.76796752 7 2 3 + 5900 558.64383 1528.1198 0.76796752 7 2 3 + 6000 557.8358 442.21273 0.76796752 7 2 3 + 6100 483.13771 5201.4489 0.76796752 8 2 3 + 6200 533.42675 5112.0828 0.76796752 8 2 3 + 6300 576.32772 269.77058 0.76796752 8 2 3 + 6400 492.79331 565.35222 0.76796752 8 2 4 + 6500 514.5727 6233.7568 0.76796752 8 2 4 + 6600 509.86906 -943.58621 0.76796752 8 2 4 + 6700 546.62752 -323284.04 0.76796752 8 2 5 + 6800 541.19749 1306.3182 0.76796752 8 2 5 + 6900 497.72333 -1792.483 0.76796752 8 2 5 + 7000 516.02636 2028.3813 0.76796752 8 2 5 + 7100 486.54013 6153.9142 0.76796752 8 2 5 + 7200 553.33698 4352.3987 0.76796752 8 2 5 + 7300 519.23896 6536.766 0.76796752 8 2 5 + 7400 486.74787 -1744.8351 0.76796752 8 2 5 + 7500 516.71935 -315.43649 0.76796752 8 2 5 + 7600 513.62572 -1100.1363 0.76796752 8 2 5 + 7700 531.11296 1727.7113 0.76796752 8 2 5 + 7800 530.82809 9566.2386 0.76796752 8 2 5 + 7900 513.09884 8545.6728 0.76796752 8 2 5 + 8000 511.38714 2995.8438 0.76796752 8 2 5 + 8100 527.76731 709.63649 0.76796752 8 2 5 + 8200 514.09092 2103.8591 0.76796752 8 2 5 + 8300 534.90612 7707.3378 0.76796752 8 2 5 + 8400 547.40716 660.54641 0.76796752 8 2 5 + 8500 518.75522 -872.69754 0.76796752 8 2 5 + 8600 511.70922 6645.6264 0.76796752 8 2 5 + 8700 480.70739 -640.57939 0.76796752 8 2 5 + 8800 527.35475 6944.8472 0.76796752 8 2 5 + 8900 554.26477 -2311.6153 0.76796752 8 2 5 + 9000 520.48502 1469.4805 0.76796752 8 2 5 + 9100 522.0619 -4159.697 0.76796752 8 2 5 + 9200 501.34664 7486.8266 0.76796752 8 2 5 + 9300 524.96422 6158.2524 0.76796752 8 2 5 + 9400 564.30456 -2964.7187 0.76796752 8 2 6 + 9500 569.02736 5765.8856 0.76796752 8 2 6 + 9600 554.31532 2805.5671 0.76796752 8 2 6 + 9700 521.3957 -924.74562 0.76796752 8 2 6 + 9800 518.45356 -2440.5266 0.76796752 8 2 6 + 9900 512.03787 -834.07647 0.76796752 8 2 6 + 10000 573.10576 4372.5769 0.76796752 8 2 6 +Loop time of 11.2088 on 4 procs for 10000 steps with 320 atoms + +Performance: 77.082 ns/day, 0.311 hours/ns, 892.155 timesteps/s, 285.490 katom-step/s +100.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.6217 | 2.8126 | 3.0128 | 9.5 | 25.09 +Bond | 2.0439 | 2.1734 | 2.3326 | 7.0 | 19.39 +Kspace | 1.4277 | 1.7772 | 2.0148 | 17.9 | 15.86 +Neigh | 0.32002 | 0.3201 | 0.3202 | 0.0 | 2.86 +Comm | 0.42382 | 0.43347 | 0.4412 | 1.1 | 3.87 +Output | 0.0013461 | 0.0015202 | 0.0020328 | 0.8 | 0.01 +Modify | 3.6386 | 3.6396 | 3.6408 | 0.0 | 32.47 +Other | | 0.05092 | | | 0.45 + +Nlocal: 80 ave 93 max 71 min +Histogram: 1 1 0 0 1 0 0 0 0 1 +Nghost: 2184.75 ave 2276 max 2092 min +Histogram: 1 0 1 0 0 0 0 1 0 1 +Neighs: 13678.5 ave 15576 max 11682 min +Histogram: 1 0 0 1 0 0 0 1 0 1 + +Total # of neighbors = 54714 +Ave neighs/atom = 170.98125 +Ave special neighs/atom = 10.9125 +Neighbor list builds = 471 +Dangerous builds = 0 + +# write_restart restart_longrun nofix +# write_data restart_longrun.data +Total wall time: 0:00:11 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/log.4Nov2020.tiny_polystyrene.stabilized.g++.1 b/examples/PACKAGES/reaction/tiny_polystyrene/log.4Nov2020.tiny_polystyrene.stabilized.g++.1 new file mode 100644 index 0000000000..be40e6b0de --- /dev/null +++ b/examples/PACKAGES/reaction/tiny_polystyrene/log.4Nov2020.tiny_polystyrene.stabilized.g++.1 @@ -0,0 +1,329 @@ +LAMMPS (4 Nov 2022) +# 20 styrene molecules +# three reactions defined + +units real + +boundary p p p + +atom_style full + +kspace_style pppm 1.0e-4 + +pair_style lj/class2/coul/long 8.5 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +variable T equal 530 + +read_data tiny_polystyrene.data extra/bond/per/atom 5 extra/angle/per/atom 15 extra/dihedral/per/atom 15 extra/improper/per/atom 25 extra/special/per/atom 25 +Reading data file ... + orthogonal box = (1.7426663 1.7426663 1.7426663) to (18.257334 18.257334 18.257334) + 1 by 1 by 1 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 320 atoms + reading velocities ... + 320 velocities + scanning bonds ... + 8 = max bonds/atom + scanning angles ... + 18 = max angles/atom + scanning dihedrals ... + 22 = max dihedrals/atom + scanning impropers ... + 26 = max impropers/atom + reading bonds ... + 320 bonds + reading angles ... + 480 angles + reading dihedrals ... + 640 dihedrals + reading impropers ... + 160 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 3 = max # of 1-2 neighbors + 6 = max # of 1-3 neighbors + 12 = max # of 1-4 neighbors + 39 = max # of special neighbors + special bonds CPU = 0.001 seconds + read_data CPU = 0.015 seconds + +molecule mol1 2styrene_unreacted.molecule_template +Read molecule template mol1: + 1 molecules + 0 fragments + 32 atoms with max type 4 + 32 bonds with max type 11 + 48 angles with max type 19 + 64 dihedrals with max type 21 + 16 impropers with max type 8 +molecule mol2 2styrene_reacted.molecule_template +Read molecule template mol2: + 1 molecules + 0 fragments + 32 atoms with max type 6 + 33 bonds with max type 13 + 54 angles with max type 22 + 79 dihedrals with max type 19 + 14 impropers with max type 7 +molecule mol3 chain_plus_styrene_unreacted.molecule_template +Read molecule template mol3: + 1 molecules + 0 fragments + 46 atoms with max type 6 + 47 bonds with max type 13 + 75 angles with max type 22 + 105 dihedrals with max type 21 + 21 impropers with max type 8 +molecule mol4 chain_plus_styrene_reacted.molecule_template +Read molecule template mol4: + 1 molecules + 0 fragments + 46 atoms with max type 6 + 48 bonds with max type 13 + 81 angles with max type 22 + 121 dihedrals with max type 19 + 19 impropers with max type 7 +molecule mol5 chain_chain_unreacted.molecule_template +Read molecule template mol5: + 1 molecules + 0 fragments + 50 atoms with max type 6 + 51 bonds with max type 13 + 84 angles with max type 22 + 118 dihedrals with max type 19 + 20 impropers with max type 7 +molecule mol6 chain_chain_reacted.molecule_template +Read molecule template mol6: + 1 molecules + 0 fragments + 50 atoms with max type 6 + 52 bonds with max type 13 + 90 angles with max type 22 + 135 dihedrals with max type 19 + 18 impropers with max type 2 + +thermo 100 + +# dump 1 all xyz 5 test_vis.xyz + +fix rxn1 all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0 3.0 mol1 mol2 2styrene_map stabilize_steps 100 react rxn2 all 1 0 3.0 mol3 mol4 chain_plus_styrene_map stabilize_steps 100 react rxn3 all 1 0 5.0 mol5 mol6 chain_chain_map stabilize_steps 100 +dynamic group bond_react_MASTER_group defined +dynamic group statted_grp_REACT defined + +fix 1 statted_grp_REACT nvt temp $T $T 100 +fix 1 statted_grp_REACT nvt temp 530 $T 100 +fix 1 statted_grp_REACT nvt temp 530 530 100 + +fix 4 bond_react_MASTER_group temp/rescale 1 $T $T 1 1 +fix 4 bond_react_MASTER_group temp/rescale 1 530 $T 1 1 +fix 4 bond_react_MASTER_group temp/rescale 1 530 530 1 1 + +thermo_style custom step temp press density f_rxn1[1] f_rxn1[2] f_rxn1[3] + +run 10000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +PPPM initialization ... +WARNING: System is not charge neutral, net charge = -0.004 (../kspace.cpp:327) + using 12-bit tables for long-range coulomb (../kspace.cpp:342) + G vector (1/distance) = 0.25561147 + grid = 6 6 6 + stencil order = 5 + estimated absolute RMS force accuracy = 0.0097469157 + estimated relative force accuracy = 2.9352547e-05 + using double precision KISS FFT + 3d grid and FFT values/proc = 1331 216 +Generated 21 of 21 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 4 4 4 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 31.51 | 31.51 | 31.51 Mbytes + Step Temp Press Density f_rxn1[1] f_rxn1[2] f_rxn1[3] + 0 320.13638 -376.0844 0.76796752 0 0 0 + 100 342.22237 -3489.4495 0.76796752 0 0 0 + 200 412.23828 -1367.104 0.76796752 0 0 0 + 300 467.98145 4841.002 0.76796752 0 0 0 + 400 505.39864 2213.0509 0.76796752 1 0 0 + 500 519.63371 -28223.513 0.76796752 2 0 0 + 600 526.40655 8701.2728 0.76796752 2 0 0 + 700 579.91953 2507.5868 0.76796752 2 0 0 + 800 517.29593 5558.2894 0.76796752 2 0 0 + 900 503.38392 -5027.1155 0.76796752 2 0 0 + 1000 509.30766 3979.0526 0.76796752 2 0 0 + 1100 551.34763 5119.0854 0.76796752 2 0 0 + 1200 562.51766 -2867.8721 0.76796752 2 0 0 + 1300 552.90947 2090.7196 0.76796752 2 0 0 + 1400 516.10667 3374.3471 0.76796752 2 0 0 + 1500 518.70363 472.0237 0.76796752 2 0 0 + 1600 559.50145 5451.1908 0.76796752 2 0 0 + 1700 531.49515 4526.9547 0.76796752 2 0 0 + 1800 529.18545 -3566.8838 0.76796752 2 0 0 + 1900 517.52577 -2390.6662 0.76796752 2 0 0 + 2000 495.24246 -485.62368 0.76796752 2 0 0 + 2100 567.90338 2009.3507 0.76796752 3 0 0 + 2200 553.05006 5694.0307 0.76796752 3 0 0 + 2300 561.22521 2944.2766 0.76796752 3 0 0 + 2400 460.05535 3058.3944 0.76796752 3 0 0 + 2500 501.01426 365.04418 0.76796752 4 0 0 + 2600 543.94728 267.33298 0.76796752 4 0 0 + 2700 539.40536 4258.9345 0.76796752 4 0 0 + 2800 557.67853 -2732.3135 0.76796752 4 0 0 + 2900 539.85456 3987.7331 0.76796752 4 1 0 + 3000 501.3125 3280.3821 0.76796752 4 1 0 + 3100 537.77092 -5290.371 0.76796752 4 1 0 + 3200 528.20744 11690.902 0.76796752 4 1 0 + 3300 548.56721 2464.6039 0.76796752 4 1 0 + 3400 542.73725 -27951.173 0.76796752 4 1 1 + 3500 547.63988 7925.1202 0.76796752 4 1 1 + 3600 502.69726 7875.8308 0.76796752 4 1 1 + 3700 495.26614 -1907.7215 0.76796752 4 1 1 + 3800 526.91826 -4267.1784 0.76796752 4 1 1 + 3900 538.8248 6811.7446 0.76796752 4 1 1 + 4000 531.42158 5031.2992 0.76796752 4 1 1 + 4100 539.69772 6278.9861 0.76796752 4 1 1 + 4200 519.11497 9206.6513 0.76796752 4 1 1 + 4300 518.08237 -63.769046 0.76796752 4 1 1 + 4400 582.43352 4189.0234 0.76796752 4 1 1 + 4500 541.87979 -2072.4133 0.76796752 4 1 1 + 4600 514.7508 7502.1057 0.76796752 4 1 1 + 4700 530.22173 51.50674 0.76796752 4 1 1 + 4800 507.14885 5148.7797 0.76796752 4 1 1 + 4900 516.05055 9110.3072 0.76796752 4 1 1 + 5000 552.55865 7310.0399 0.76796752 4 1 1 + 5100 581.79588 3282.8939 0.76796752 4 1 1 + 5200 523.07607 -1312.6111 0.76796752 4 1 1 + 5300 528.44235 -2242.0268 0.76796752 4 1 1 + 5400 537.63408 4599.5474 0.76796752 4 1 1 + 5500 526.75093 5551.7841 0.76796752 4 1 1 + 5600 562.74766 2764.4556 0.76796752 4 1 1 + 5700 545.12259 -3139.3468 0.76796752 4 1 1 + 5800 563.77404 4261.7786 0.76796752 4 1 1 + 5900 514.07804 4057.43 0.76796752 4 1 1 + 6000 548.42605 -2814.3308 0.76796752 4 1 1 + 6100 525.16391 -2902.5409 0.76796752 4 1 1 + 6200 504.92542 -706.19923 0.76796752 4 1 2 + 6300 531.55271 1217.7795 0.76796752 4 1 2 + 6400 537.29797 264.24006 0.76796752 4 1 2 + 6500 581.8752 2228.1037 0.76796752 4 1 2 + 6600 536.95487 -10318.365 0.76796752 4 2 2 + 6700 498.26961 5005.4587 0.76796752 5 2 2 + 6800 526.00873 -2678.0327 0.76796752 5 2 2 + 6900 542.74619 -1567.8558 0.76796752 5 2 2 + 7000 549.02037 8321.4935 0.76796752 5 2 2 + 7100 542.28295 -1513.6114 0.76796752 5 2 2 + 7200 474.70347 2120.9699 0.76796752 5 2 2 + 7300 506.58637 2588.8837 0.76796752 5 2 2 + 7400 512.45393 -2101371.7 0.76796752 5 2 3 + 7500 546.20285 -2458.3002 0.76796752 5 2 3 + 7600 551.57132 3148.9131 0.76796752 5 2 3 + 7700 544.3684 -775.59686 0.76796752 5 2 3 + 7800 511.32529 2353.0343 0.76796752 5 2 3 + 7900 520.30502 10726.007 0.76796752 5 2 3 + 8000 561.81009 12476.296 0.76796752 5 2 3 + 8100 588.85859 5905.4979 0.76796752 5 2 3 + 8200 490.1071 1132.5027 0.76796752 5 2 3 + 8300 537.65085 -1445.0979 0.76796752 5 2 3 + 8400 523.60343 -589.18012 0.76796752 5 2 3 + 8500 538.90848 -300.32152 0.76796752 5 2 3 + 8600 573.63835 5912.9027 0.76796752 5 2 3 + 8700 557.82593 2585.6634 0.76796752 5 2 3 + 8800 562.5277 -1843272.8 0.76796752 5 2 4 + 8900 564.26894 -1396.8521 0.76796752 5 2 4 + 9000 576.4382 5029.6995 0.76796752 5 2 4 + 9100 514.83258 -935.9015 0.76796752 5 2 4 + 9200 536.33755 -1671.9254 0.76796752 5 2 4 + 9300 494.49553 582.08687 0.76796752 5 2 4 + 9400 532.12156 -6991.3223 0.76796752 6 2 4 + 9500 528.87489 4587.7048 0.76796752 6 2 4 + 9600 555.92299 -3688.5966 0.76796752 6 2 4 + 9700 510.09341 1545.1276 0.76796752 6 2 4 + 9800 505.94984 -4677.2879 0.76796752 6 2 4 + 9900 531.38104 4891.0352 0.76796752 6 2 4 + 10000 517.59995 4299.0553 0.76796752 6 2 4 +Loop time of 29.4182 on 1 procs for 10000 steps with 320 atoms + +Performance: 29.370 ns/day, 0.817 hours/ns, 339.926 timesteps/s, 108.776 katom-step/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 10.883 | 10.883 | 10.883 | 0.0 | 36.99 +Bond | 8.0953 | 8.0953 | 8.0953 | 0.0 | 27.52 +Kspace | 2.6136 | 2.6136 | 2.6136 | 0.0 | 8.88 +Neigh | 1.0863 | 1.0863 | 1.0863 | 0.0 | 3.69 +Comm | 0.2095 | 0.2095 | 0.2095 | 0.0 | 0.71 +Output | 0.0019263 | 0.0019263 | 0.0019263 | 0.0 | 0.01 +Modify | 6.4695 | 6.4695 | 6.4695 | 0.0 | 21.99 +Other | | 0.05924 | | | 0.20 + +Nlocal: 320 ave 320 max 320 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 3425 ave 3425 max 3425 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 54783 ave 54783 max 54783 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 54783 +Ave neighs/atom = 171.19688 +Ave special neighs/atom = 10.3375 +Neighbor list builds = 460 +Dangerous builds = 0 + +# write_restart restart_longrun nofix +# write_data restart_longrun.data +Total wall time: 0:00:29 diff --git a/examples/PACKAGES/reaction/tiny_polystyrene/tiny_polystyrene.data b/examples/PACKAGES/reaction/tiny_polystyrene/tiny_polystyrene.data index 5f0ed4cfa6..ab12e8d4b1 100644 --- a/examples/PACKAGES/reaction/tiny_polystyrene/tiny_polystyrene.data +++ b/examples/PACKAGES/reaction/tiny_polystyrene/tiny_polystyrene.data @@ -15,6 +15,108 @@ LAMMPS data file via write_data, version 20 Nov 2019, timestep = 25000 1.7426663385337786e+00 1.8257333661465619e+01 ylo yhi 1.7426663385337786e+00 1.8257333661465619e+01 zlo zhi +Atom Type Labels + +1 cp +2 hc +3 c=1 +4 c= +5 c1 +6 c2 +7 c3 + +Bond Type Labels + +1 cp-hc +2 cp-cp +3 cp-c1 +4 hc-c=1 +5 c=1-c= +6 hc-c= +7 cp-c3 +8 hc-c3 +9 c3-c2 +10 hc-c2 +11 cp-c=1 +12 hc-c1 +13 c1-c2 + +Angle Type Labels + +1 cp-cp-hc +2 cp-cp-cp +3 cp-cp-c1 +4 cp-c1-hc +5 cp-c1-c2 +6 hc-c=1-c= +7 hc-c=-c=1 +8 hc-c=-hc +9 cp-cp-c3 +10 cp-c3-hc +11 cp-c3-c2 +12 hc-c3-c2 +13 c3-c2-c1 +14 hc-c2-c3 +15 hc-c2-hc +16 c1-c2-c1 +17 cp-cp-c=1 +18 cp-c=1-hc +19 cp-c=1-c= +20 hc-c2-c1 +21 hc-c1-c2 +22 c2-c1-c2 + +Dihedral Type Labels + +1 hc-cp-cp-c1 +2 cp-cp-cp-hc +3 cp-cp-cp-c1 +4 cp-cp-cp-cp +5 hc-cp-cp-hc +6 cp-cp-c=1-hc +7 cp-cp-c=1-c= +8 cp-c=1-c=-hc +9 hc-c=1-c=-hc +10 hc-cp-cp-c3 +11 cp-cp-cp-c3 +12 cp-cp-c1-hc +13 cp-cp-c1-c2 +14 cp-c1-c2-hc +15 hc-c1-c2-hc +16 c2-c1-c2-hc +17 cp-c1-c2-c1 +18 hc-c1-c2-c1 +19 c2-c1-c2-c1 +20 hc-cp-cp-c=1 +21 cp-cp-cp-c=1 +22 cp-cp-c3-hc +23 cp-cp-c3-c2 +24 cp-c3-c2-hc +25 cp-c3-c2-c1 +26 hc-c3-c2-hc +27 hc-c3-c2-c1 +28 c3-c2-c1-cp +29 c3-c2-c1-hc +30 c3-c2-c1-c2 +31 hc-c2-c1-cp +32 hc-c2-c1-hc +33 hc-c2-c1-c2 +34 c1-c2-c1-cp +35 c1-c2-c1-hc +36 c1-c2-c1-c2 + +Improper Type Labels + +1 cp-cp-cp-hc +2 cp-cp-cp-c1 +3 cp-c=1-hc-c= +4 hc-c=-hc-c=1 +5 cp-cp-cp-c3 +6 hc-c2-hc-c1 +7 cp-c1-hc-c2 +8 cp-cp-cp-c=1 +9 cp-c3-hc-c2 + Masses 1 12.0112 From 7383a8957b55fe647c3fa799213154cb4453ba22 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Tue, 20 Dec 2022 11:41:11 -0500 Subject: [PATCH 10/47] refactor atom stabilization code --- src/REACTION/fix_bond_react.cpp | 107 ++++++++------------------------ src/REACTION/fix_bond_react.h | 1 - 2 files changed, 26 insertions(+), 82 deletions(-) diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp index b983172860..926c31a12f 100644 --- a/src/REACTION/fix_bond_react.cpp +++ b/src/REACTION/fix_bond_react.cpp @@ -1476,9 +1476,6 @@ void FixBondReact::superimpose_algorithm() // this updates topology next step next_reneighbor = update->ntimestep; - // call limit_bond in 'global_mega_glove mode.' oh, and local mode - limit_bond(LOCAL); // add reacting atoms to nve/limit - limit_bond(GLOBAL); update_everything(); // change topology } @@ -2779,80 +2776,6 @@ void FixBondReact::dedup_mega_gloves(int dedup_mode) delete [] dup_list; } -/* ---------------------------------------------------------------------- -let's limit movement of newly bonded atoms -and exclude them from other thermostats via exclude_group -------------------------------------------------------------------------- */ - -void FixBondReact::limit_bond(int limit_bond_mode) -{ - //two types of passes: 1) while superimpose algorithm is iterating (only local atoms) - // 2) once more for global_mega_glove [after de-duplicating rxn instances] - //in second case, only add local atoms to group - //as with update_everything, we can pre-prepare these arrays, then run generic limit_bond code - - //create local, generic variables for onemol->natoms and glove - //to be filled differently on respective passes - - int nlocal = atom->nlocal; - int temp_limit_num = 0; - tagint *temp_limit_glove; - if (limit_bond_mode == LOCAL) { - int max_temp = local_num_mega * (max_natoms + 1); - temp_limit_glove = new tagint[max_temp]; - for (int j = 0; j < local_num_mega; j++) { - rxnID = local_mega_glove[0][j]; - onemol = atom->molecules[unreacted_mol[rxnID]]; - for (int i = 0; i < onemol->natoms; i++) { - temp_limit_glove[temp_limit_num++] = local_mega_glove[i+1][j]; - } - } - - } else if (limit_bond_mode == GLOBAL) { - int max_temp = global_megasize * (max_natoms + 1); - temp_limit_glove = new tagint[max_temp]; - for (int j = 0; j < global_megasize; j++) { - rxnID = global_mega_glove[0][j]; - onemol = atom->molecules[unreacted_mol[rxnID]]; - for (int i = 0; i < onemol->natoms; i++) { - if (atom->map(global_mega_glove[i+1][j]) >= 0 && - atom->map(global_mega_glove[i+1][j]) < nlocal) - temp_limit_glove[temp_limit_num++] = global_mega_glove[i+1][j]; - } - } - } - - if (temp_limit_num == 0) { - delete [] temp_limit_glove; - return; - } - - // we must keep our own list of limited atoms - // this will be a new per-atom property! - - int flag,cols; - int index1 = atom->find_custom("limit_tags",flag,cols); - int *i_limit_tags = atom->ivector[index1]; - - int *i_statted_tags; - if (stabilization_flag == 1) { - int index2 = atom->find_custom(statted_id,flag,cols); - i_statted_tags = atom->ivector[index2]; - } - - int index3 = atom->find_custom("react_tags",flag,cols); - int *i_react_tags = atom->ivector[index3]; - - for (int i = 0; i < temp_limit_num; i++) { - // update->ntimestep could be 0. so add 1 throughout - i_limit_tags[atom->map(temp_limit_glove[i])] = update->ntimestep + 1; - if (stabilization_flag == 1) i_statted_tags[atom->map(temp_limit_glove[i])] = 0; - i_react_tags[atom->map(temp_limit_glove[i])] = rxnID; - } - - delete [] temp_limit_glove; -} - /* ---------------------------------------------------------------------- let's unlimit movement of newly bonded atoms after n timesteps. we give them back to the system thermostat @@ -3055,6 +2978,21 @@ void FixBondReact::update_everything() int delta_dihed = 0; int delta_imprp = 0; + // use the following per-atom arrays to keep track of reacting atoms + + int flag,cols; + int index1 = atom->find_custom("limit_tags",flag,cols); + int *i_limit_tags = atom->ivector[index1]; + + int *i_statted_tags; + if (stabilization_flag == 1) { + int index2 = atom->find_custom(statted_id,flag,cols); + i_statted_tags = atom->ivector[index2]; + } + + int index3 = atom->find_custom("react_tags",flag,cols); + int *i_react_tags = atom->ivector[index3]; + // pass through twice // redefining 'update_num_mega' and 'update_mega_glove' each time // first pass: when glove is all local atoms @@ -3175,18 +3113,25 @@ void FixBondReact::update_everything() } // update charges and types of landlocked atoms + // also keep track of 'stabilization' groups here for (int i = 0; i < update_num_mega; i++) { rxnID = update_mega_glove[0][i]; twomol = atom->molecules[reacted_mol[rxnID]]; for (int j = 0; j < twomol->natoms; j++) { int jj = equivalences[j][1][rxnID]-1; - if (atom->map(update_mega_glove[jj+1][i]) >= 0 && - atom->map(update_mega_glove[jj+1][i]) < nlocal) { + int ilocal = atom->map(update_mega_glove[jj+1][i]); + if (ilocal >= 0 && ilocal < nlocal) { + + // update->ntimestep could be 0. so add 1 throughout + i_limit_tags[ilocal] = update->ntimestep + 1; + if (stabilization_flag == 1) i_statted_tags[ilocal] = 0; + i_react_tags[ilocal] = rxnID; + if (landlocked_atoms[j][rxnID] == 1) - type[atom->map(update_mega_glove[jj+1][i])] = twomol->type[j]; + type[ilocal] = twomol->type[j]; if (twomol->qflag && atom->q_flag && custom_charges[jj][rxnID] == 1) { double *q = atom->q; - q[atom->map(update_mega_glove[jj+1][i])] = twomol->q[j]+charge_rescale_addend; + q[ilocal] = twomol->q[j]+charge_rescale_addend; } } } diff --git a/src/REACTION/fix_bond_react.h b/src/REACTION/fix_bond_react.h index 4751bc4eef..b434699ec7 100644 --- a/src/REACTION/fix_bond_react.h +++ b/src/REACTION/fix_bond_react.h @@ -209,7 +209,6 @@ class FixBondReact : public Fix { void update_everything(); int insert_atoms(tagint **, int); void unlimit_bond(); // removes atoms from stabilization, and other post-reaction every-step operations - void limit_bond(int); void dedup_mega_gloves(int); //dedup global mega_glove void write_restart(FILE *) override; void restart(char *buf) override; From 21b14cd7e4d886cfa8140dd34d85f1732aebd7f7 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Tue, 20 Dec 2022 12:46:59 -0500 Subject: [PATCH 11/47] remove now-redundant code --- src/REACTION/fix_bond_react.cpp | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp index 926c31a12f..7d488c3592 100644 --- a/src/REACTION/fix_bond_react.cpp +++ b/src/REACTION/fix_bond_react.cpp @@ -3858,25 +3858,6 @@ int FixBondReact::insert_atoms(tagint **my_mega_glove, int iupdate) v[n][1] = v[n][1]/vnorm*vtnorm; v[n][2] = v[n][2]/vnorm*vtnorm; modify->create_attribute(n); - - // initialize group statuses - // why aren't these more global... - int flag,cols; - int index1 = atom->find_custom("limit_tags",flag,cols); - int *i_limit_tags = atom->ivector[index1]; - - int *i_statted_tags; - if (stabilization_flag == 1) { - int index2 = atom->find_custom(statted_id,flag,cols); - i_statted_tags = atom->ivector[index2]; - } - - int index3 = atom->find_custom("react_tags",flag,cols); - int *i_react_tags = atom->ivector[index3]; - - i_limit_tags[n] = update->ntimestep + 1; - if (stabilization_flag == 1) i_statted_tags[n] = 0; - i_react_tags[n] = rxnID; } // globally update mega_glove and equivalences MPI_Allreduce(MPI_IN_PLACE,&root,1,MPI_INT,MPI_SUM,world); From 84d97a9ef7b5dca4932701a028168b9a2341d15a Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Tue, 20 Dec 2022 13:15:59 -0500 Subject: [PATCH 12/47] type labels for create_atoms_polystyrene example --- .../grow_styrene_post.data_template | 456 ------ .../grow_styrene_post.molecule_template | 489 +++++++ .../grow_styrene_pre.data_template | 294 ---- .../grow_styrene_pre.molecule_template | 319 ++++ .../create_atoms_polystyrene/in.grow_styrene | 10 +- .../log.24Dec20.grow_styrene.g++.1 | 196 --- .../log.24Dec20.grow_styrene.g++.4 | 196 --- .../log.4Nov2022.grow_styrene.g++.1 | 256 ++++ .../log.4Nov2022.grow_styrene.g++.4 | 256 ++++ .../create_atoms_polystyrene/trimer.data | 1303 +++++++---------- 10 files changed, 1870 insertions(+), 1905 deletions(-) delete mode 100644 examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_post.data_template create mode 100644 examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_post.molecule_template delete mode 100644 examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_pre.data_template create mode 100644 examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_pre.molecule_template delete mode 100644 examples/PACKAGES/reaction/create_atoms_polystyrene/log.24Dec20.grow_styrene.g++.1 delete mode 100644 examples/PACKAGES/reaction/create_atoms_polystyrene/log.24Dec20.grow_styrene.g++.4 create mode 100644 examples/PACKAGES/reaction/create_atoms_polystyrene/log.4Nov2022.grow_styrene.g++.1 create mode 100644 examples/PACKAGES/reaction/create_atoms_polystyrene/log.4Nov2022.grow_styrene.g++.4 diff --git a/examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_post.data_template b/examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_post.data_template deleted file mode 100644 index 7269e3a269..0000000000 --- a/examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_post.data_template +++ /dev/null @@ -1,456 +0,0 @@ -molecule template: end of chain plus polymerized styrene - -46 atoms -48 bonds -81 angles -121 dihedrals -35 impropers -1 fragments - -Fragments - -create_fit 34 44 - -Types - -1 1 -2 2 -3 1 -4 5 -5 1 -6 2 -7 1 -8 2 -9 1 -10 2 -11 1 -12 2 -13 2 -14 6 -15 2 -16 2 -17 1 -18 2 -19 1 -20 5 -21 1 -22 2 -23 1 -24 2 -25 1 -26 2 -27 1 -28 2 -29 2 -30 6 -31 1 -32 2 -33 1 -34 5 -35 1 -36 2 -37 1 -38 2 -39 1 -40 2 -41 1 -42 2 -43 2 -44 6 -45 2 -46 2 - -Charges - -1 -0.129000 -2 0.123700 -3 0.026600 -4 -0.018200 -5 -0.129000 -6 0.123700 -7 -0.173400 -8 0.140300 -9 -0.113400 -10 0.128800 -11 -0.173400 -12 0.140300 -13 0.051600 -14 -0.069600 -15 0.035400 -16 0.035400 -17 -0.129000 -18 0.123700 -19 0.026600 -20 -0.018200 -21 -0.129000 -22 0.123700 -23 -0.173400 -24 0.140300 -25 -0.113400 -26 0.128800 -27 -0.173400 -28 0.140300 -29 0.051600 -30 -0.069600 -31 -0.129000 -32 0.123700 -33 0.026600 -34 -0.018200 -35 -0.129000 -36 0.123700 -37 -0.173400 -38 0.140300 -39 -0.113400 -40 0.128800 -41 -0.173400 -42 0.140300 -43 0.051600 -44 -0.069600 -45 0.035400 -46 0.035400 - -Coords - -1 24.130699 1.043900 -1.309300 -2 25.062700 1.582900 -1.309300 -3 22.900700 1.753900 -1.309300 -4 22.900700 3.253900 -1.309300 -5 21.670700 1.043900 -1.309300 -6 20.738701 1.582900 -1.309300 -7 21.670700 -0.376100 -1.309300 -8 20.738701 -0.915100 -1.309300 -9 22.900700 -1.086100 -1.309300 -10 22.900700 -2.163100 -1.309300 -11 24.130699 -0.376100 -1.309300 -12 25.062700 -0.915100 -1.309300 -13 23.766701 3.658900 -0.952300 -14 21.622700 3.802900 -1.871300 -15 21.672701 4.544900 -1.970300 -16 20.979700 2.979900 -2.165300 -17 13.465800 0.682500 -1.658900 -18 14.397800 1.221500 -1.658900 -19 12.235800 1.392500 -1.658900 -20 12.235800 2.892500 -1.658900 -21 11.005800 0.682500 -1.658900 -22 10.073800 1.221500 -1.658900 -23 11.005800 -0.737500 -1.658900 -24 10.073800 -1.276500 -1.658900 -25 12.235800 -1.447500 -1.658900 -26 12.235800 -2.524500 -1.658900 -27 13.465800 -0.737500 -1.658900 -28 14.397800 -1.276500 -1.658900 -29 13.101800 3.297500 -1.301900 -30 10.957800 3.441500 -2.220900 -31 18.663500 0.855500 -1.372100 -32 19.595501 1.394500 -1.372100 -33 17.433500 1.565500 -1.372100 -34 17.433500 3.065500 -1.372100 -35 16.203501 0.855500 -1.372100 -36 15.271500 1.394500 -1.372100 -37 16.203501 -0.564500 -1.372100 -38 15.271500 -1.103500 -1.372100 -39 17.433500 -1.274500 -1.372100 -40 17.433500 -2.351500 -1.372100 -41 18.663500 -0.564500 -1.372100 -42 19.595501 -1.103500 -1.372100 -43 18.299500 3.470500 -1.015100 -44 16.155500 3.614500 -1.934100 -45 16.205500 4.356500 -2.033100 -46 15.512500 2.791500 -2.228100 - -Bonds - -1 1 1 2 -2 2 1 3 -3 2 1 11 -4 11 3 4 -5 2 3 5 -6 12 13 4 -7 13 4 14 -8 1 5 6 -9 2 5 7 -10 1 7 8 -11 2 7 9 -12 1 9 10 -13 2 9 11 -14 1 11 12 -15 10 15 14 -16 10 16 14 -17 9 14 34 -18 1 17 18 -19 2 17 19 -20 2 17 27 -21 7 19 20 -22 2 19 21 -23 8 29 20 -24 9 30 20 -25 9 44 20 -26 1 21 22 -27 2 21 23 -28 1 23 24 -29 2 23 25 -30 1 25 26 -31 2 25 27 -32 1 27 28 -33 1 31 32 -34 2 31 33 -35 2 31 41 -36 7 33 34 -37 2 33 35 -38 8 43 34 -39 9 44 34 -40 1 35 36 -41 2 35 37 -42 1 37 38 -43 2 37 39 -44 1 39 40 -45 2 39 41 -46 1 41 42 -47 10 45 44 -48 10 46 44 - -Angles - -1 1 3 1 2 -2 1 11 1 2 -3 2 3 1 11 -4 17 1 3 4 -5 2 1 3 5 -6 17 5 3 4 -7 18 3 4 13 -8 19 3 4 14 -9 20 13 4 14 -10 1 3 5 6 -11 2 3 5 7 -12 1 7 5 6 -13 1 5 7 8 -14 2 5 7 9 -15 1 9 7 8 -16 1 7 9 10 -17 2 7 9 11 -18 1 11 9 10 -19 2 1 11 9 -20 1 1 11 12 -21 1 9 11 12 -22 21 15 14 4 -23 21 16 14 4 -24 22 4 14 34 -25 15 15 14 16 -26 14 15 14 34 -27 14 16 14 34 -28 1 19 17 18 -29 1 27 17 18 -30 2 19 17 27 -31 9 17 19 20 -32 2 17 19 21 -33 9 21 19 20 -34 10 19 20 29 -35 11 19 20 30 -36 11 19 20 44 -37 12 29 20 30 -38 12 29 20 44 -39 13 30 20 44 -40 1 19 21 22 -41 2 19 21 23 -42 1 23 21 22 -43 1 21 23 24 -44 2 21 23 25 -45 1 25 23 24 -46 1 23 25 26 -47 2 23 25 27 -48 1 27 25 26 -49 2 17 27 25 -50 1 17 27 28 -51 1 25 27 28 -52 1 33 31 32 -53 1 41 31 32 -54 2 33 31 41 -55 9 31 33 34 -56 2 31 33 35 -57 9 35 33 34 -58 11 33 34 14 -59 12 43 34 14 -60 13 14 34 44 -61 10 33 34 43 -62 11 33 34 44 -63 12 43 34 44 -64 1 33 35 36 -65 2 33 35 37 -66 1 37 35 36 -67 1 35 37 38 -68 2 35 37 39 -69 1 39 37 38 -70 1 37 39 40 -71 2 37 39 41 -72 1 41 39 40 -73 2 31 41 39 -74 1 31 41 42 -75 1 39 41 42 -76 16 20 44 34 -77 14 45 44 20 -78 14 46 44 20 -79 14 45 44 34 -80 14 46 44 34 -81 15 45 44 46 - -Dihedrals - -1 20 2 1 3 4 -2 2 5 3 1 2 -3 21 11 1 3 4 -4 4 11 1 3 5 -5 2 9 11 1 2 -6 5 2 1 11 12 -7 4 3 1 11 9 -8 2 3 1 11 12 -9 22 1 3 4 13 -10 23 1 3 4 14 -11 22 5 3 4 13 -12 23 5 3 4 14 -13 2 1 3 5 6 -14 4 1 3 5 7 -15 20 6 5 3 4 -16 21 7 5 3 4 -17 24 3 4 14 15 -18 24 3 4 14 16 -19 25 3 4 14 34 -20 26 13 4 14 15 -21 26 13 4 14 16 -22 27 13 4 14 34 -23 2 3 5 7 8 -24 4 3 5 7 9 -25 5 6 5 7 8 -26 2 9 7 5 6 -27 2 5 7 9 10 -28 4 5 7 9 11 -29 5 8 7 9 10 -30 2 11 9 7 8 -31 4 7 9 11 1 -32 2 7 9 11 12 -33 2 1 11 9 10 -34 5 10 9 11 12 -35 28 4 14 34 33 -36 29 4 14 34 43 -37 30 4 14 34 44 -38 31 15 14 34 33 -39 32 15 14 34 43 -40 33 15 14 34 44 -41 31 16 14 34 33 -42 32 16 14 34 43 -43 33 16 14 34 44 -44 10 18 17 19 20 -45 2 21 19 17 18 -46 11 27 17 19 20 -47 4 27 17 19 21 -48 2 25 27 17 18 -49 5 18 17 27 28 -50 4 19 17 27 25 -51 2 19 17 27 28 -52 12 17 19 20 29 -53 13 17 19 20 30 -54 13 17 19 20 44 -55 12 21 19 20 29 -56 13 21 19 20 30 -57 13 21 19 20 44 -58 2 17 19 21 22 -59 4 17 19 21 23 -60 10 22 21 19 20 -61 11 23 21 19 20 -62 34 34 44 20 19 -63 31 45 44 20 19 -64 31 46 44 20 19 -65 35 34 44 20 29 -66 32 45 44 20 29 -67 32 46 44 20 29 -68 36 34 44 20 30 -69 33 45 44 20 30 -70 33 46 44 20 30 -71 2 19 21 23 24 -72 4 19 21 23 25 -73 5 22 21 23 24 -74 2 25 23 21 22 -75 2 21 23 25 26 -76 4 21 23 25 27 -77 5 24 23 25 26 -78 2 27 25 23 24 -79 4 23 25 27 17 -80 2 23 25 27 28 -81 2 17 27 25 26 -82 5 26 25 27 28 -83 10 32 31 33 34 -84 2 35 33 31 32 -85 11 41 31 33 34 -86 4 41 31 33 35 -87 2 39 41 31 32 -88 5 32 31 41 42 -89 4 33 31 41 39 -90 2 33 31 41 42 -91 13 31 33 34 14 -92 12 31 33 34 43 -93 13 31 33 34 44 -94 13 35 33 34 14 -95 12 35 33 34 43 -96 13 35 33 34 44 -97 2 31 33 35 36 -98 4 31 33 35 37 -99 10 36 35 33 34 -100 11 37 35 33 34 -101 36 20 44 34 14 -102 33 45 44 34 14 -103 33 46 44 34 14 -104 34 20 44 34 33 -105 31 45 44 34 33 -106 31 46 44 34 33 -107 35 20 44 34 43 -108 32 45 44 34 43 -109 32 46 44 34 43 -110 2 33 35 37 38 -111 4 33 35 37 39 -112 5 36 35 37 38 -113 2 39 37 35 36 -114 2 35 37 39 40 -115 4 35 37 39 41 -116 5 38 37 39 40 -117 2 41 39 37 38 -118 4 37 39 41 31 -119 2 37 39 41 42 -120 2 31 41 39 40 -121 5 40 39 41 42 - -Impropers - -1 1 3 1 11 2 -2 8 1 3 5 4 -3 9 3 4 13 14 -4 1 3 5 7 6 -5 1 5 7 9 8 -6 1 7 9 11 10 -7 1 1 11 9 12 -8 1 19 17 27 18 -9 5 17 19 21 20 -10 1 19 21 23 22 -11 1 21 23 25 24 -12 1 23 25 27 26 -13 1 17 27 25 28 -14 1 33 31 41 32 -15 5 31 33 35 34 -16 1 33 35 37 36 -17 1 35 37 39 38 -18 1 37 39 41 40 -19 1 31 41 39 42 -20 1 15 14 16 4 -21 1 15 14 4 34 -22 1 16 14 4 34 -23 1 15 14 16 34 -24 1 19 20 29 30 -25 1 19 20 29 44 -26 1 19 20 30 44 -27 1 29 20 30 44 -28 1 33 34 43 14 -29 1 33 34 14 44 -30 1 43 34 14 44 -31 1 33 34 43 44 -32 1 45 44 34 20 -33 1 46 44 34 20 -34 1 45 44 46 20 -35 1 45 44 46 34 diff --git a/examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_post.molecule_template b/examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_post.molecule_template new file mode 100644 index 0000000000..62b42afd3e --- /dev/null +++ b/examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_post.molecule_template @@ -0,0 +1,489 @@ +molecule template: end of chain plus polymerized styrene + + 46 atoms + 48 bonds + 81 angles + 121 dihedrals + 19 impropers + 1 fragments + +Fragments + + create_fit 34 44 + +Coords + + 1 24.130699158 1.043900013 -1.309299946 + 2 25.062700272 1.582900047 -1.309299946 + 3 22.900699615 1.753900051 -1.309299946 + 4 22.900699615 3.253900051 -1.309299946 + 5 21.670700073 1.043900013 -1.309299946 + 6 20.738700867 1.582900047 -1.309299946 + 7 21.670700073 -0.376100004 -1.309299946 + 8 20.738700867 -0.915099978 -1.309299946 + 9 22.900699615 -1.086099982 -1.309299946 + 10 22.900699615 -2.163100004 -1.309299946 + 11 24.130699158 -0.376100004 -1.309299946 + 12 25.062700272 -0.915099978 -1.309299946 + 13 23.766700745 3.658900023 -0.952300012 + 14 21.622699738 3.802900076 -1.871299982 + 15 21.672700882 4.544899940 -1.970299959 + 16 20.979700089 2.979899883 -2.165299892 + 17 13.465800285 0.682500005 -1.658900023 + 18 14.397800446 1.221500039 -1.658900023 + 19 12.235799789 1.392500043 -1.658900023 + 20 12.235799789 2.892499924 -1.658900023 + 21 11.005800247 0.682500005 -1.658900023 + 22 10.073800087 1.221500039 -1.658900023 + 23 11.005800247 -0.737500012 -1.658900023 + 24 10.073800087 -1.276499987 -1.658900023 + 25 12.235799789 -1.447499990 -1.658900023 + 26 12.235799789 -2.524499893 -1.658900023 + 27 13.465800285 -0.737500012 -1.658900023 + 28 14.397800446 -1.276499987 -1.658900023 + 29 13.101799965 3.297499895 -1.301900029 + 30 10.957799911 3.441499949 -2.220900059 + 31 18.663499832 0.855499983 -1.372099996 + 32 19.595500946 1.394500017 -1.372099996 + 33 17.433500290 1.565500021 -1.372099996 + 34 17.433500290 3.065500021 -1.372099996 + 35 16.203500748 0.855499983 -1.372099996 + 36 15.271499634 1.394500017 -1.372099996 + 37 16.203500748 -0.564499974 -1.372099996 + 38 15.271499634 -1.103500009 -1.372099996 + 39 17.433500290 -1.274500012 -1.372099996 + 40 17.433500290 -2.351500034 -1.372099996 + 41 18.663499832 -0.564499974 -1.372099996 + 42 19.595500946 -1.103500009 -1.372099996 + 43 18.299499512 3.470499992 -1.015100002 + 44 16.155500412 3.614500046 -1.934100032 + 45 16.205499649 4.356500149 -2.033099890 + 46 15.512499809 2.791500092 -2.228100061 + +Types + + 1 cp + 2 hc + 3 cp + 4 c1 + 5 cp + 6 hc + 7 cp + 8 hc + 9 cp + 10 hc + 11 cp + 12 hc + 13 hc + 14 c2 + 15 hc + 16 hc + 17 cp + 18 hc + 19 cp + 20 c1 + 21 cp + 22 hc + 23 cp + 24 hc + 25 cp + 26 hc + 27 cp + 28 hc + 29 hc + 30 c2 + 31 cp + 32 hc + 33 cp + 34 c1 + 35 cp + 36 hc + 37 cp + 38 hc + 39 cp + 40 hc + 41 cp + 42 hc + 43 hc + 44 c2 + 45 hc + 46 hc + +Charges + + 1 -0.129000 + 2 0.123700 + 3 0.026600 + 4 -0.018200 + 5 -0.129000 + 6 0.123700 + 7 -0.173400 + 8 0.140300 + 9 -0.113400 + 10 0.128800 + 11 -0.173400 + 12 0.140300 + 13 0.051600 + 14 -0.069600 + 15 0.035400 + 16 0.035400 + 17 -0.129000 + 18 0.123700 + 19 0.026600 + 20 -0.018200 + 21 -0.129000 + 22 0.123700 + 23 -0.173400 + 24 0.140300 + 25 -0.113400 + 26 0.128800 + 27 -0.173400 + 28 0.140300 + 29 0.051600 + 30 -0.069600 + 31 -0.129000 + 32 0.123700 + 33 0.026600 + 34 -0.018200 + 35 -0.129000 + 36 0.123700 + 37 -0.173400 + 38 0.140300 + 39 -0.113400 + 40 0.128800 + 41 -0.173400 + 42 0.140300 + 43 0.051600 + 44 -0.069600 + 45 0.035400 + 46 0.035400 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + 31 1 + 32 1 + 33 1 + 34 1 + 35 1 + 36 1 + 37 1 + 38 1 + 39 1 + 40 1 + 41 1 + 42 1 + 43 1 + 44 1 + 45 1 + 46 1 + +Bonds + + 1 hc-cp 1 2 + 2 cp-cp 1 3 + 3 cp-cp 1 11 + 4 cp-c1 3 4 + 5 cp-cp 3 5 + 6 hc-c1 13 4 + 7 c1-c2 4 14 + 8 hc-cp 5 6 + 9 cp-cp 5 7 + 10 hc-cp 7 8 + 11 cp-cp 7 9 + 12 hc-cp 9 10 + 13 cp-cp 9 11 + 14 hc-cp 11 12 + 15 hc-c2 15 14 + 16 hc-c2 16 14 + 17 c1-c2 34 14 + 18 hc-cp 17 18 + 19 cp-cp 17 19 + 20 cp-cp 17 27 + 21 cp-c1 19 20 + 22 cp-cp 19 21 + 23 hc-c1 29 20 + 24 c1-c2 20 30 + 25 c1-c2 20 44 + 26 hc-cp 21 22 + 27 cp-cp 21 23 + 28 hc-cp 23 24 + 29 cp-cp 23 25 + 30 hc-cp 25 26 + 31 cp-cp 25 27 + 32 hc-cp 27 28 + 33 hc-cp 31 32 + 34 cp-cp 31 33 + 35 cp-cp 31 41 + 36 cp-c1 33 34 + 37 cp-cp 33 35 + 38 hc-c1 43 34 + 39 c1-c2 34 44 + 40 hc-cp 35 36 + 41 cp-cp 35 37 + 42 hc-cp 37 38 + 43 cp-cp 37 39 + 44 hc-cp 39 40 + 45 cp-cp 39 41 + 46 hc-cp 41 42 + 47 hc-c2 45 44 + 48 hc-c2 46 44 + +Angles + + 1 hc-cp-cp 3 1 2 + 2 hc-cp-cp 11 1 2 + 3 cp-cp-cp 3 1 11 + 4 cp-cp-c1 1 3 4 + 5 cp-cp-cp 1 3 5 + 6 cp-cp-c1 5 3 4 + 7 hc-c1-cp 3 4 13 + 8 cp-c1-c2 3 4 14 + 9 hc-c1-c2 13 4 14 + 10 hc-cp-cp 3 5 6 + 11 cp-cp-cp 3 5 7 + 12 hc-cp-cp 7 5 6 + 13 hc-cp-cp 5 7 8 + 14 cp-cp-cp 5 7 9 + 15 hc-cp-cp 9 7 8 + 16 hc-cp-cp 7 9 10 + 17 cp-cp-cp 7 9 11 + 18 hc-cp-cp 11 9 10 + 19 cp-cp-cp 1 11 9 + 20 hc-cp-cp 1 11 12 + 21 hc-cp-cp 9 11 12 + 22 hc-c2-c1 15 14 4 + 23 hc-c2-c1 16 14 4 + 24 c1-c2-c1 4 14 34 + 25 hc-c2-hc 15 14 16 + 26 hc-c2-c1 15 14 34 + 27 hc-c2-c1 16 14 34 + 28 hc-cp-cp 19 17 18 + 29 hc-cp-cp 27 17 18 + 30 cp-cp-cp 19 17 27 + 31 cp-cp-c1 17 19 20 + 32 cp-cp-cp 17 19 21 + 33 cp-cp-c1 21 19 20 + 34 hc-c1-cp 19 20 29 + 35 cp-c1-c2 19 20 30 + 36 cp-c1-c2 19 20 44 + 37 hc-c1-c2 29 20 30 + 38 hc-c1-c2 29 20 44 + 39 c2-c1-c2 30 20 44 + 40 hc-cp-cp 19 21 22 + 41 cp-cp-cp 19 21 23 + 42 hc-cp-cp 23 21 22 + 43 hc-cp-cp 21 23 24 + 44 cp-cp-cp 21 23 25 + 45 hc-cp-cp 25 23 24 + 46 hc-cp-cp 23 25 26 + 47 cp-cp-cp 23 25 27 + 48 hc-cp-cp 27 25 26 + 49 cp-cp-cp 17 27 25 + 50 hc-cp-cp 17 27 28 + 51 hc-cp-cp 25 27 28 + 52 hc-cp-cp 33 31 32 + 53 hc-cp-cp 41 31 32 + 54 cp-cp-cp 33 31 41 + 55 cp-cp-c1 31 33 34 + 56 cp-cp-cp 31 33 35 + 57 cp-cp-c1 35 33 34 + 58 cp-c1-c2 33 34 14 + 59 hc-c1-c2 43 34 14 + 60 c2-c1-c2 14 34 44 + 61 hc-c1-cp 33 34 43 + 62 cp-c1-c2 33 34 44 + 63 hc-c1-c2 43 34 44 + 64 hc-cp-cp 33 35 36 + 65 cp-cp-cp 33 35 37 + 66 hc-cp-cp 37 35 36 + 67 hc-cp-cp 35 37 38 + 68 cp-cp-cp 35 37 39 + 69 hc-cp-cp 39 37 38 + 70 hc-cp-cp 37 39 40 + 71 cp-cp-cp 37 39 41 + 72 hc-cp-cp 41 39 40 + 73 cp-cp-cp 31 41 39 + 74 hc-cp-cp 31 41 42 + 75 hc-cp-cp 39 41 42 + 76 c1-c2-c1 20 44 34 + 77 hc-c2-c1 45 44 20 + 78 hc-c2-c1 46 44 20 + 79 hc-c2-c1 45 44 34 + 80 hc-c2-c1 46 44 34 + 81 hc-c2-hc 45 44 46 + +Dihedrals + + 1 hc-cp-cp-c1 2 1 3 4 + 2 hc-cp-cp-cp 5 3 1 2 + 3 cp-cp-cp-c1 11 1 3 4 + 4 cp-cp-cp-cp 11 1 3 5 + 5 hc-cp-cp-cp 9 11 1 2 + 6 hc-cp-cp-hc 2 1 11 12 + 7 cp-cp-cp-cp 3 1 11 9 + 8 hc-cp-cp-cp 3 1 11 12 + 9 cp-cp-c1-hc 1 3 4 13 + 10 cp-cp-c1-c2 1 3 4 14 + 11 cp-cp-c1-hc 5 3 4 13 + 12 cp-cp-c1-c2 5 3 4 14 + 13 hc-cp-cp-cp 1 3 5 6 + 14 cp-cp-cp-cp 1 3 5 7 + 15 hc-cp-cp-c1 6 5 3 4 + 16 cp-cp-cp-c1 7 5 3 4 + 17 cp-c1-c2-hc 3 4 14 15 + 18 cp-c1-c2-hc 3 4 14 16 + 19 cp-c1-c2-c1 3 4 14 34 + 20 hc-c1-c2-hc 13 4 14 15 + 21 hc-c1-c2-hc 13 4 14 16 + 22 hc-c1-c2-c1 13 4 14 34 + 23 hc-cp-cp-cp 3 5 7 8 + 24 cp-cp-cp-cp 3 5 7 9 + 25 hc-cp-cp-hc 6 5 7 8 + 26 hc-cp-cp-cp 9 7 5 6 + 27 hc-cp-cp-cp 5 7 9 10 + 28 cp-cp-cp-cp 5 7 9 11 + 29 hc-cp-cp-hc 8 7 9 10 + 30 hc-cp-cp-cp 11 9 7 8 + 31 cp-cp-cp-cp 7 9 11 1 + 32 hc-cp-cp-cp 7 9 11 12 + 33 hc-cp-cp-cp 1 11 9 10 + 34 hc-cp-cp-hc 10 9 11 12 + 35 cp-c1-c2-c1 33 34 14 4 + 36 hc-c1-c2-c1 43 34 14 4 + 37 c2-c1-c2-c1 44 34 14 4 + 38 cp-c1-c2-hc 33 34 14 15 + 39 hc-c1-c2-hc 43 34 14 15 + 40 c2-c1-c2-hc 44 34 14 15 + 41 cp-c1-c2-hc 33 34 14 16 + 42 hc-c1-c2-hc 43 34 14 16 + 43 c2-c1-c2-hc 44 34 14 16 + 44 hc-cp-cp-c1 18 17 19 20 + 45 hc-cp-cp-cp 21 19 17 18 + 46 cp-cp-cp-c1 27 17 19 20 + 47 cp-cp-cp-cp 27 17 19 21 + 48 hc-cp-cp-cp 25 27 17 18 + 49 hc-cp-cp-hc 18 17 27 28 + 50 cp-cp-cp-cp 19 17 27 25 + 51 hc-cp-cp-cp 19 17 27 28 + 52 cp-cp-c1-hc 17 19 20 29 + 53 cp-cp-c1-c2 17 19 20 30 + 54 cp-cp-c1-c2 17 19 20 44 + 55 cp-cp-c1-hc 21 19 20 29 + 56 cp-cp-c1-c2 21 19 20 30 + 57 cp-cp-c1-c2 21 19 20 44 + 58 hc-cp-cp-cp 17 19 21 22 + 59 cp-cp-cp-cp 17 19 21 23 + 60 hc-cp-cp-c1 22 21 19 20 + 61 cp-cp-cp-c1 23 21 19 20 + 62 cp-c1-c2-c1 19 20 44 34 + 63 cp-c1-c2-hc 19 20 44 45 + 64 cp-c1-c2-hc 19 20 44 46 + 65 hc-c1-c2-c1 29 20 44 34 + 66 hc-c1-c2-hc 29 20 44 45 + 67 hc-c1-c2-hc 29 20 44 46 + 68 c2-c1-c2-c1 30 20 44 34 + 69 c2-c1-c2-hc 30 20 44 45 + 70 c2-c1-c2-hc 30 20 44 46 + 71 hc-cp-cp-cp 19 21 23 24 + 72 cp-cp-cp-cp 19 21 23 25 + 73 hc-cp-cp-hc 22 21 23 24 + 74 hc-cp-cp-cp 25 23 21 22 + 75 hc-cp-cp-cp 21 23 25 26 + 76 cp-cp-cp-cp 21 23 25 27 + 77 hc-cp-cp-hc 24 23 25 26 + 78 hc-cp-cp-cp 27 25 23 24 + 79 cp-cp-cp-cp 23 25 27 17 + 80 hc-cp-cp-cp 23 25 27 28 + 81 hc-cp-cp-cp 17 27 25 26 + 82 hc-cp-cp-hc 26 25 27 28 + 83 hc-cp-cp-c1 32 31 33 34 + 84 hc-cp-cp-cp 35 33 31 32 + 85 cp-cp-cp-c1 41 31 33 34 + 86 cp-cp-cp-cp 41 31 33 35 + 87 hc-cp-cp-cp 39 41 31 32 + 88 hc-cp-cp-hc 32 31 41 42 + 89 cp-cp-cp-cp 33 31 41 39 + 90 hc-cp-cp-cp 33 31 41 42 + 91 cp-cp-c1-c2 31 33 34 14 + 92 cp-cp-c1-hc 31 33 34 43 + 93 cp-cp-c1-c2 31 33 34 44 + 94 cp-cp-c1-c2 35 33 34 14 + 95 cp-cp-c1-hc 35 33 34 43 + 96 cp-cp-c1-c2 35 33 34 44 + 97 hc-cp-cp-cp 31 33 35 36 + 98 cp-cp-cp-cp 31 33 35 37 + 99 hc-cp-cp-c1 36 35 33 34 + 100 cp-cp-cp-c1 37 35 33 34 + 101 c2-c1-c2-c1 14 34 44 20 + 102 c2-c1-c2-hc 14 34 44 45 + 103 c2-c1-c2-hc 14 34 44 46 + 104 cp-c1-c2-c1 33 34 44 20 + 105 cp-c1-c2-hc 33 34 44 45 + 106 cp-c1-c2-hc 33 34 44 46 + 107 hc-c1-c2-c1 43 34 44 20 + 108 hc-c1-c2-hc 43 34 44 45 + 109 hc-c1-c2-hc 43 34 44 46 + 110 hc-cp-cp-cp 33 35 37 38 + 111 cp-cp-cp-cp 33 35 37 39 + 112 hc-cp-cp-hc 36 35 37 38 + 113 hc-cp-cp-cp 39 37 35 36 + 114 hc-cp-cp-cp 35 37 39 40 + 115 cp-cp-cp-cp 35 37 39 41 + 116 hc-cp-cp-hc 38 37 39 40 + 117 hc-cp-cp-cp 41 39 37 38 + 118 cp-cp-cp-cp 37 39 41 31 + 119 hc-cp-cp-cp 37 39 41 42 + 120 hc-cp-cp-cp 31 41 39 40 + 121 hc-cp-cp-hc 40 39 41 42 + +Impropers + + 1 hc-cp-cp-cp 3 1 11 2 + 2 cp-cp-cp-c1 1 3 5 4 + 3 hc-c1-cp-c2 3 4 13 14 + 4 hc-cp-cp-cp 3 5 7 6 + 5 hc-cp-cp-cp 5 7 9 8 + 6 hc-cp-cp-cp 7 9 11 10 + 7 hc-cp-cp-cp 1 11 9 12 + 8 hc-cp-cp-cp 19 17 27 18 + 9 cp-cp-cp-c1 17 19 21 20 + 10 hc-cp-cp-cp 19 21 23 22 + 11 hc-cp-cp-cp 21 23 25 24 + 12 hc-cp-cp-cp 23 25 27 26 + 13 hc-cp-cp-cp 17 27 25 28 + 14 hc-cp-cp-cp 33 31 41 32 + 15 cp-cp-cp-c1 31 33 35 34 + 16 hc-cp-cp-cp 33 35 37 36 + 17 hc-cp-cp-cp 35 37 39 38 + 18 hc-cp-cp-cp 37 39 41 40 + 19 hc-cp-cp-cp 31 41 39 42 diff --git a/examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_pre.data_template b/examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_pre.data_template deleted file mode 100644 index d04fefccf5..0000000000 --- a/examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_pre.data_template +++ /dev/null @@ -1,294 +0,0 @@ -molecule template: end of styrene chain - -30 atoms -31 bonds -51 angles -73 dihedrals -21 impropers - -Types - -1 2 -2 2 -3 6 -4 2 -5 2 -6 1 -7 2 -8 1 -9 2 -10 1 -11 2 -12 1 -13 5 -14 1 -15 2 -16 1 -17 1 -18 2 -19 1 -20 5 -21 1 -22 2 -23 1 -24 2 -25 1 -26 2 -27 1 -28 2 -29 2 -30 6 - -Coords - -1 59.89981112372972 62.733697275315585 59.09884284578856 -2 61.41970248324232 63.42116581894993 59.52874545893742 -3 60.864754970096406 62.91724243011892 59.559720865992695 -4 62.139819000186826 61.41011937002877 60.81065044071466 -5 60.036455711425084 57.160029629288026 60.31958663310848 -6 59.734195751174056 58.18706337912225 60.20562410798949 -7 57.64574781117771 57.712432799329 59.860109977091554 -8 58.37408644866664 58.50134169314242 59.94422053768215 -9 56.94300092269842 60.093170109004795 59.5955638127831 -10 57.974275786582744 59.85577775892068 59.793714995577716 -11 58.63231375134033 61.922969938852454 59.79065033121885 -12 58.934573711591355 60.89593618901822 59.904612856337835 -13 61.30908151524225 61.68041745837013 60.28316188676589 -14 60.29468229868386 60.58165855333751 60.16601625920239 -15 61.725768540066994 58.98982945913568 60.51467315154424 -16 60.69449367618267 59.2272218092198 60.31652196874961 -17 56.90935800040509 62.609851248143706 59.150831390216375 -18 57.940632148874506 62.37245957639904 59.3489824055682 -19 56.509546622906285 63.96428799226142 59.00032568066915 -20 57.52394583946467 65.06304689729403 59.11747130823266 -21 55.14943732039887 64.27856630628159 58.738922110361806 -22 54.84717807556275 65.30559937777636 58.62495975268562 -23 54.18913939539026 63.23840787618404 58.62802424960169 -24 53.15786524692084 63.4757995479287 58.42987323424986 -25 54.58895077288906 61.88397113206633 58.77852995914891 -26 53.86061213540014 61.09506223825291 58.69441939855832 -27 55.94906007539648 61.56969281804616 59.039933529456256 -28 56.2513193202326 60.54265974655139 59.15389588713244 -29 58.35468332440925 64.79274880895268 59.64495986218142 -30 57.07961929431883 66.29987186904283 58.394030287459465 - -Charges - -1 0.0354 -2 0.0354 -3 -0.0696 -4 0.0516 -5 0.1403 -6 -0.1734 -7 0.1288 -8 -0.1134 -9 0.1403 -10 -0.1734 -11 0.1237 -12 -0.129 -13 -0.0182 -14 0.0266 -15 0.1237 -16 -0.129 -17 -0.129 -18 0.1237 -19 0.0266 -20 -0.0182 -21 -0.129 -22 0.1237 -23 -0.1734 -24 0.1403 -25 -0.1134 -26 0.1288 -27 -0.1734 -28 0.1403 -29 0.0516 -30 -0.0696 - -Bonds - -1 10 1 3 -2 10 2 3 -3 8 4 13 -4 1 6 5 -5 1 8 7 -6 2 8 6 -7 1 10 9 -8 2 10 8 -9 1 12 11 -10 2 12 10 -11 9 13 3 -12 7 14 13 -13 2 14 12 -14 1 16 15 -15 2 16 14 -16 2 16 6 -17 1 17 18 -18 2 17 19 -19 2 17 27 -20 7 19 20 -21 2 19 21 -22 9 20 30 -23 9 20 3 -24 1 21 22 -25 2 21 23 -26 1 23 24 -27 2 23 25 -28 1 25 26 -29 2 25 27 -30 1 27 28 -31 8 29 20 - -Angles - -1 16 20 3 13 -2 14 2 3 20 -3 14 1 3 20 -4 14 2 3 13 -5 14 1 3 13 -6 15 2 3 1 -7 2 16 6 8 -8 1 16 6 5 -9 1 8 6 5 -10 1 10 8 7 -11 2 10 8 6 -12 1 6 8 7 -13 1 12 10 9 -14 2 12 10 8 -15 1 8 10 9 -16 1 14 12 11 -17 2 14 12 10 -18 1 10 12 11 -19 10 14 13 4 -20 11 14 13 3 -21 12 4 13 3 -22 9 16 14 13 -23 2 16 14 12 -24 9 12 14 13 -25 1 14 16 15 -26 1 6 16 15 -27 2 14 16 6 -28 1 19 17 18 -29 1 27 17 18 -30 2 19 17 27 -31 9 17 19 20 -32 2 17 19 21 -33 9 21 19 20 -34 10 19 20 29 -35 11 19 20 30 -36 11 19 20 3 -37 12 29 20 30 -38 12 29 20 3 -39 13 30 20 3 -40 1 19 21 22 -41 2 19 21 23 -42 1 23 21 22 -43 1 21 23 24 -44 2 21 23 25 -45 1 25 23 24 -46 1 23 25 26 -47 2 23 25 27 -48 1 27 25 26 -49 2 17 27 25 -50 1 17 27 28 -51 1 25 27 28 - -Dihedrals - -1 2 8 6 16 15 -2 2 16 6 8 7 -3 2 6 8 10 9 -4 4 10 8 6 16 -5 2 10 8 6 5 -6 5 7 8 6 5 -7 2 8 10 12 11 -8 2 12 10 8 7 -9 4 12 10 8 6 -10 5 9 10 8 7 -11 10 11 12 14 13 -12 11 10 12 14 13 -13 2 14 12 10 9 -14 4 14 12 10 8 -15 5 11 12 10 9 -16 17 14 13 3 20 -17 14 14 13 3 2 -18 14 14 13 3 1 -19 18 4 13 3 20 -20 15 4 13 3 2 -21 15 4 13 3 1 -22 2 12 14 16 15 -23 12 16 14 13 4 -24 13 16 14 13 3 -25 12 12 14 13 4 -26 13 12 14 13 3 -27 2 16 14 12 11 -28 4 16 14 12 10 -29 10 15 16 14 13 -30 11 6 16 14 13 -31 4 6 16 14 12 -32 5 15 16 6 5 -33 4 14 16 6 8 -34 2 14 16 6 5 -35 10 18 17 19 20 -36 11 27 17 19 20 -37 4 27 17 19 21 -38 5 18 17 27 28 -39 4 19 17 27 25 -40 2 19 17 27 28 -41 2 21 19 17 18 -42 12 17 19 20 29 -43 13 17 19 20 30 -44 13 17 19 20 3 -45 12 21 19 20 29 -46 13 21 19 20 30 -47 13 21 19 20 3 -48 2 17 19 21 22 -49 4 17 19 21 23 -50 17 19 20 3 13 -51 14 19 20 3 2 -52 14 19 20 3 1 -53 18 29 20 3 13 -54 15 29 20 3 2 -55 15 29 20 3 1 -56 19 30 20 3 13 -57 16 30 20 3 2 -58 16 30 20 3 1 -59 10 22 21 19 20 -60 11 23 21 19 20 -61 2 19 21 23 24 -62 4 19 21 23 25 -63 5 22 21 23 24 -64 2 25 23 21 22 -65 2 21 23 25 26 -66 4 21 23 25 27 -67 5 24 23 25 26 -68 2 27 25 23 24 -69 4 23 25 27 17 -70 2 23 25 27 28 -71 5 26 25 27 28 -72 2 25 27 17 18 -73 2 17 27 25 26 - -Impropers - -1 1 2 3 13 20 -2 1 1 3 13 20 -3 1 2 3 1 20 -4 1 2 3 1 13 -5 1 16 6 8 5 -6 1 10 8 6 7 -7 1 12 10 8 9 -8 1 14 12 10 11 -9 7 14 13 4 3 -10 5 16 14 12 13 -11 1 14 16 6 15 -12 1 19 17 27 18 -13 5 17 19 21 20 -14 1 19 20 29 30 -15 1 19 20 29 3 -16 1 19 20 30 3 -17 1 29 20 30 3 -18 1 19 21 23 22 -19 1 21 23 25 24 -20 1 23 25 27 26 -21 1 17 27 25 28 diff --git a/examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_pre.molecule_template b/examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_pre.molecule_template new file mode 100644 index 0000000000..2ef1453d72 --- /dev/null +++ b/examples/PACKAGES/reaction/create_atoms_polystyrene/grow_styrene_pre.molecule_template @@ -0,0 +1,319 @@ +molecule template: end of styrene chain + + 30 atoms + 31 bonds + 51 angles + 73 dihedrals + 13 impropers + +Coords + + 1 59.899810791 62.733695984 59.098842621 + 2 61.419700623 63.421165466 59.528743744 + 3 60.864753723 62.917243958 59.559719086 + 4 62.139820099 61.410118103 60.810649872 + 5 60.036457062 57.160030365 60.319587708 + 6 59.734195709 58.187065125 60.205623627 + 7 57.645748138 57.712432861 59.860111237 + 8 58.374088287 58.501342773 59.944221497 + 9 56.943000793 60.093170166 59.595561981 + 10 57.974277496 59.855777740 59.793716431 + 11 58.632312775 61.922969818 59.790649414 + 12 58.934574127 60.895935059 59.904613495 + 13 61.309082031 61.680416107 60.283161163 + 14 60.294681549 60.581657410 60.166015625 + 15 61.725769043 58.989830017 60.514671326 + 16 60.694492340 59.227222443 60.316520691 + 17 56.909358978 62.609851837 59.150833130 + 18 57.940631866 62.372459412 59.348983765 + 19 56.509548187 63.964286804 59.000324249 + 20 57.523944855 65.063049316 59.117469788 + 21 55.149436951 64.278564453 58.738922119 + 22 54.847179413 65.305603027 58.624958038 + 23 54.189140320 63.238407135 58.628025055 + 24 53.157863617 63.475799561 58.429874420 + 25 54.588951111 61.883972168 58.778530121 + 26 53.860610962 61.095062256 58.694419861 + 27 55.949058533 61.569694519 59.039932251 + 28 56.251319885 60.542659760 59.153896332 + 29 58.354682922 64.792747498 59.644958496 + 30 57.079620361 66.299873352 58.394031525 + +Types + + 1 hc + 2 hc + 3 c2 + 4 hc + 5 hc + 6 cp + 7 hc + 8 cp + 9 hc + 10 cp + 11 hc + 12 cp + 13 c1 + 14 cp + 15 hc + 16 cp + 17 cp + 18 hc + 19 cp + 20 c1 + 21 cp + 22 hc + 23 cp + 24 hc + 25 cp + 26 hc + 27 cp + 28 hc + 29 hc + 30 c2 + +Charges + + 1 0.035400 + 2 0.035400 + 3 -0.069600 + 4 0.051600 + 5 0.140300 + 6 -0.173400 + 7 0.128800 + 8 -0.113400 + 9 0.140300 + 10 -0.173400 + 11 0.123700 + 12 -0.129000 + 13 -0.018200 + 14 0.026600 + 15 0.123700 + 16 -0.129000 + 17 -0.129000 + 18 0.123700 + 19 0.026600 + 20 -0.018200 + 21 -0.129000 + 22 0.123700 + 23 -0.173400 + 24 0.140300 + 25 -0.113400 + 26 0.128800 + 27 -0.173400 + 28 0.140300 + 29 0.051600 + 30 -0.069600 + +Molecules + + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 + 8 1 + 9 1 + 10 1 + 11 1 + 12 1 + 13 1 + 14 1 + 15 1 + 16 1 + 17 1 + 18 1 + 19 1 + 20 1 + 21 1 + 22 1 + 23 1 + 24 1 + 25 1 + 26 1 + 27 1 + 28 1 + 29 1 + 30 1 + +Bonds + + 1 hc-c2 1 3 + 2 hc-c2 2 3 + 3 c1-c2 3 13 + 4 c1-c2 3 20 + 5 hc-c1 4 13 + 6 hc-cp 5 6 + 7 cp-cp 6 8 + 8 cp-cp 6 16 + 9 hc-cp 7 8 + 10 cp-cp 8 10 + 11 hc-cp 9 10 + 12 cp-cp 10 12 + 13 hc-cp 11 12 + 14 cp-cp 12 14 + 15 cp-c1 14 13 + 16 cp-cp 14 16 + 17 hc-cp 15 16 + 18 hc-cp 18 17 + 19 cp-cp 17 19 + 20 cp-cp 17 27 + 21 cp-c1 19 20 + 22 cp-cp 19 21 + 23 c1-c2 30 20 + 24 hc-c1 29 20 + 25 hc-cp 22 21 + 26 cp-cp 21 23 + 27 hc-cp 24 23 + 28 cp-cp 23 25 + 29 hc-cp 26 25 + 30 cp-cp 25 27 + 31 hc-cp 28 27 + +Angles + + 1 hc-c2-hc 1 3 2 + 2 hc-c2-c1 1 3 13 + 3 hc-c2-c1 1 3 20 + 4 hc-c2-c1 2 3 13 + 5 hc-c2-c1 2 3 20 + 6 c1-c2-c1 13 3 20 + 7 hc-cp-cp 5 6 8 + 8 hc-cp-cp 5 6 16 + 9 cp-cp-cp 8 6 16 + 10 hc-cp-cp 7 8 6 + 11 cp-cp-cp 6 8 10 + 12 hc-cp-cp 7 8 10 + 13 hc-cp-cp 9 10 8 + 14 cp-cp-cp 8 10 12 + 15 hc-cp-cp 9 10 12 + 16 hc-cp-cp 11 12 10 + 17 cp-cp-cp 10 12 14 + 18 hc-cp-cp 11 12 14 + 19 hc-c1-c2 4 13 3 + 20 cp-c1-c2 3 13 14 + 21 hc-c1-cp 4 13 14 + 22 cp-cp-c1 12 14 13 + 23 cp-cp-cp 12 14 16 + 24 cp-cp-c1 16 14 13 + 25 cp-cp-cp 6 16 14 + 26 hc-cp-cp 15 16 6 + 27 hc-cp-cp 15 16 14 + 28 hc-cp-cp 18 17 19 + 29 hc-cp-cp 18 17 27 + 30 cp-cp-cp 19 17 27 + 31 cp-cp-c1 17 19 20 + 32 cp-cp-cp 17 19 21 + 33 cp-cp-c1 21 19 20 + 34 cp-c1-c2 3 20 19 + 35 c2-c1-c2 3 20 30 + 36 hc-c1-c2 29 20 3 + 37 cp-c1-c2 30 20 19 + 38 hc-c1-cp 29 20 19 + 39 hc-c1-c2 29 20 30 + 40 hc-cp-cp 22 21 19 + 41 cp-cp-cp 19 21 23 + 42 hc-cp-cp 22 21 23 + 43 hc-cp-cp 24 23 21 + 44 cp-cp-cp 21 23 25 + 45 hc-cp-cp 24 23 25 + 46 hc-cp-cp 26 25 23 + 47 cp-cp-cp 23 25 27 + 48 hc-cp-cp 26 25 27 + 49 cp-cp-cp 17 27 25 + 50 hc-cp-cp 28 27 17 + 51 hc-cp-cp 28 27 25 + +Dihedrals + + 1 hc-c1-c2-hc 1 3 13 4 + 2 cp-c1-c2-hc 1 3 13 14 + 3 hc-c1-c2-hc 2 3 13 4 + 4 cp-c1-c2-hc 2 3 13 14 + 5 hc-c1-c2-c1 20 3 13 4 + 6 cp-c1-c2-c1 20 3 13 14 + 7 cp-c1-c2-hc 1 3 20 19 + 8 c2-c1-c2-hc 1 3 20 30 + 9 hc-c1-c2-hc 1 3 20 29 + 10 cp-c1-c2-hc 2 3 20 19 + 11 c2-c1-c2-hc 2 3 20 30 + 12 hc-c1-c2-hc 2 3 20 29 + 13 cp-c1-c2-c1 13 3 20 19 + 14 c2-c1-c2-c1 13 3 20 30 + 15 hc-c1-c2-c1 13 3 20 29 + 16 hc-cp-cp-hc 5 6 8 7 + 17 hc-cp-cp-cp 5 6 8 10 + 18 hc-cp-cp-cp 7 8 6 16 + 19 cp-cp-cp-cp 16 6 8 10 + 20 hc-cp-cp-cp 5 6 16 14 + 21 hc-cp-cp-hc 5 6 16 15 + 22 cp-cp-cp-cp 8 6 16 14 + 23 hc-cp-cp-cp 15 16 6 8 + 24 hc-cp-cp-cp 9 10 8 6 + 25 cp-cp-cp-cp 6 8 10 12 + 26 hc-cp-cp-hc 7 8 10 9 + 27 hc-cp-cp-cp 7 8 10 12 + 28 hc-cp-cp-cp 11 12 10 8 + 29 cp-cp-cp-cp 8 10 12 14 + 30 hc-cp-cp-hc 9 10 12 11 + 31 hc-cp-cp-cp 9 10 12 14 + 32 cp-cp-cp-c1 10 12 14 13 + 33 cp-cp-cp-cp 10 12 14 16 + 34 hc-cp-cp-c1 11 12 14 13 + 35 hc-cp-cp-cp 11 12 14 16 + 36 cp-cp-c1-c2 12 14 13 3 + 37 cp-cp-c1-c2 16 14 13 3 + 38 cp-cp-c1-hc 12 14 13 4 + 39 cp-cp-c1-hc 16 14 13 4 + 40 cp-cp-cp-cp 12 14 16 6 + 41 hc-cp-cp-cp 15 16 14 12 + 42 cp-cp-cp-c1 6 16 14 13 + 43 hc-cp-cp-c1 15 16 14 13 + 44 hc-cp-cp-c1 18 17 19 20 + 45 hc-cp-cp-cp 18 17 19 21 + 46 cp-cp-cp-c1 27 17 19 20 + 47 cp-cp-cp-cp 27 17 19 21 + 48 hc-cp-cp-cp 18 17 27 25 + 49 hc-cp-cp-hc 18 17 27 28 + 50 cp-cp-cp-cp 19 17 27 25 + 51 hc-cp-cp-cp 28 27 17 19 + 52 cp-cp-c1-c2 17 19 20 3 + 53 cp-cp-c1-c2 17 19 20 30 + 54 cp-cp-c1-hc 17 19 20 29 + 55 cp-cp-c1-c2 21 19 20 3 + 56 cp-cp-c1-c2 21 19 20 30 + 57 cp-cp-c1-hc 21 19 20 29 + 58 hc-cp-cp-cp 22 21 19 17 + 59 cp-cp-cp-cp 17 19 21 23 + 60 hc-cp-cp-c1 22 21 19 20 + 61 cp-cp-cp-c1 23 21 19 20 + 62 hc-cp-cp-cp 24 23 21 19 + 63 cp-cp-cp-cp 19 21 23 25 + 64 hc-cp-cp-hc 22 21 23 24 + 65 hc-cp-cp-cp 22 21 23 25 + 66 hc-cp-cp-cp 26 25 23 21 + 67 cp-cp-cp-cp 21 23 25 27 + 68 hc-cp-cp-hc 24 23 25 26 + 69 hc-cp-cp-cp 24 23 25 27 + 70 cp-cp-cp-cp 23 25 27 17 + 71 hc-cp-cp-cp 28 27 25 23 + 72 hc-cp-cp-cp 26 25 27 17 + 73 hc-cp-cp-hc 26 25 27 28 + +Impropers + + 1 hc-cp-cp-cp 5 6 8 16 + 2 hc-cp-cp-cp 7 8 6 10 + 3 hc-cp-cp-cp 9 10 8 12 + 4 hc-cp-cp-cp 11 12 10 14 + 5 hc-c1-cp-c2 4 13 3 14 + 6 cp-cp-cp-c1 12 14 16 13 + 7 hc-cp-cp-cp 15 16 14 6 + 8 hc-cp-cp-cp 18 17 19 27 + 9 cp-cp-cp-c1 17 19 21 20 + 10 hc-cp-cp-cp 22 21 19 23 + 11 hc-cp-cp-cp 24 23 21 25 + 12 hc-cp-cp-cp 26 25 23 27 + 13 hc-cp-cp-cp 28 27 25 17 diff --git a/examples/PACKAGES/reaction/create_atoms_polystyrene/in.grow_styrene b/examples/PACKAGES/reaction/create_atoms_polystyrene/in.grow_styrene index 6e34fd2a67..b17b321fe5 100644 --- a/examples/PACKAGES/reaction/create_atoms_polystyrene/in.grow_styrene +++ b/examples/PACKAGES/reaction/create_atoms_polystyrene/in.grow_styrene @@ -6,9 +6,7 @@ boundary p p p atom_style full -kspace_style pppm 1.0e-4 - -pair_style lj/class2/coul/long 8.5 +pair_style lj/class2/coul/cut 8.5 angle_style class2 @@ -27,13 +25,13 @@ read_data trimer.data & extra/improper/per/atom 25 & extra/special/per/atom 25 -molecule mol1 grow_styrene_pre.data_template -molecule mol2 grow_styrene_post.data_template +molecule mol1 grow_styrene_pre.molecule_template +molecule mol2 grow_styrene_post.molecule_template fix myrxns all bond/react stabilization yes statted_grp .03 & react rxn1 all 1 0 3.0 mol1 mol2 grow_styrene.map & modify_create fit create_fit overlap 2.0 & - stabilize_steps 100 max_rxn 30 + stabilize_steps 200 max_rxn 30 fix 1 statted_grp_REACT nvt temp $T $T 100 diff --git a/examples/PACKAGES/reaction/create_atoms_polystyrene/log.24Dec20.grow_styrene.g++.1 b/examples/PACKAGES/reaction/create_atoms_polystyrene/log.24Dec20.grow_styrene.g++.1 deleted file mode 100644 index 5f1f2c6698..0000000000 --- a/examples/PACKAGES/reaction/create_atoms_polystyrene/log.24Dec20.grow_styrene.g++.1 +++ /dev/null @@ -1,196 +0,0 @@ -LAMMPS (24 Dec 2020) -Reading data file ... - orthogonal box = (50.000000 50.000000 50.000000) to (250.00000 250.00000 250.00000) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 48 atoms - reading velocities ... - 48 velocities - scanning bonds ... - 8 = max bonds/atom - scanning angles ... - 21 = max angles/atom - scanning dihedrals ... - 33 = max dihedrals/atom - scanning impropers ... - 29 = max impropers/atom - reading bonds ... - 50 bonds - reading angles ... - 84 angles - reading dihedrals ... - 127 dihedrals - reading impropers ... - 36 impropers -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 4 = max # of 1-2 neighbors - 8 = max # of 1-3 neighbors - 17 = max # of 1-4 neighbors - 46 = max # of special neighbors - special bonds CPU = 0.000 seconds - read_data CPU = 0.077 seconds -Read molecule template mol1: - 1 molecules - 30 atoms with max type 6 - 31 bonds with max type 10 - 51 angles with max type 16 - 73 dihedrals with max type 19 - 21 impropers with max type 7 -Read molecule template mol2: - 1 molecules - 46 atoms with max type 6 - 48 bonds with max type 13 - 81 angles with max type 22 - 121 dihedrals with max type 36 - 35 impropers with max type 9 -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp_REACT defined -PPPM initialization ... -WARNING: System is not charge neutral, net charge = -0.00060000000 (../kspace.cpp:324) - using 12-bit tables for long-range coulomb (../kspace.cpp:339) - G vector (1/distance) = 0.20144813 - grid = 45 45 45 - stencil order = 5 - estimated absolute RMS force accuracy = 0.00053712952 - estimated relative force accuracy = 1.6175496e-06 - using double precision KISS FFT - 3d grid and FFT values/proc = 125000 91125 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10.5 - ghost atom cutoff = 10.5 - binsize = 5.25, bins = 39 39 39 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 -Per MPI rank memory allocation (min/avg/max) = 48.02 | 48.02 | 48.02 Mbytes -Step Temp Press Density f_myrxns[1] - 0 496.23742 0.9983211 6.4856516e-05 0 - 100 534.05394 -0.76952227 6.4856516e-05 0 - 200 552.2225 -0.55375493 6.4856516e-05 0 - 300 857.52834 -0.4272061 8.6475354e-05 1 - 400 714.10681 1.5004615 8.6475354e-05 1 - 500 678.19171 0.21965471 8.6475354e-05 1 - 600 572.3234 0.87879933 8.6475354e-05 1 - 700 996.17398 -0.24269717 0.00010809419 2 - 800 904.50395 1.3662054 0.00010809419 2 - 900 1097.1568 -2.2909907 0.00012971303 3 - 1000 954.08892 1.7705672 0.00012971303 3 - 1100 1102.0377 -1.7018446 0.00015133187 4 - 1200 1239.785 -0.30442903 0.00015133187 4 - 1300 1388.4127 1.3301175 0.00017295071 5 - 1400 1559.3853 1.6709729 0.00017295071 5 - 1500 1471.8623 0.8268427 0.00017295071 5 - 1600 1543.6793 2.1987908 0.00019456955 6 - 1700 1694.5595 0.48852817 0.00019456955 6 - 1800 1632.7737 -1.4617692 0.00021618839 7 - 1900 1922.6502 1.1664257 0.00021618839 7 - 2000 2223.503 -0.95799878 0.00023780722 8 - 2100 2142.6035 0.88444463 0.00025942606 9 - 2200 2298.8636 3.4239313 0.00025942606 9 - 2300 2252.4355 0.82167302 0.00025942606 9 - 2400 2321.0788 1.7499714 0.00025942606 9 - 2500 2095.6715 0.55288444 0.00025942606 9 - 2600 2136.0316 -3.833114 0.00025942606 9 - 2700 2466.3134 -2.2519511 0.00025942606 9 - 2800 2294.3454 1.0637304 0.00025942606 9 - 2900 2340.3891 1.3997049 0.0002810449 10 - 3000 2272.0013 -0.27591886 0.0002810449 10 - 3100 2333.9696 -0.11772138 0.0002810449 10 - 3200 2409.0946 -1.025473 0.0002810449 10 - 3300 2148.023 1.6752329 0.0002810449 10 - 3400 2267.636 -0.45297583 0.0002810449 10 - 3500 2457.622 0.35627297 0.0002810449 10 - 3600 2288.008 -15.516626 0.00030266374 11 - 3700 2458.2681 1.4571773 0.00030266374 11 - 3800 2566.7623 -29.140553 0.00032428258 12 - 3900 2839.4062 0.64583638 0.00032428258 12 - 4000 2893.9852 -52.954497 0.00034590142 13 - 4100 3021.3611 -65.03731 0.00036752025 14 - 4200 3002.7136 1.5750081 0.00036752025 14 - 4300 3218.6248 -120.74039 0.00038913909 15 - 4400 3345.1482 -0.96545269 0.00038913909 15 - 4500 3603.2429 1.2438833 0.00038913909 15 - 4600 3129.8814 -249.91806 0.00041075793 16 - 4700 3769.052 -289.24351 0.00043237677 17 - 4800 3560.4714 -3.1655406 0.00043237677 17 - 4900 3452.2717 -2.1270765 0.00043237677 17 - 5000 3594.3247 -523.48506 0.00045399561 18 - 5100 3578.4199 1.0009097 0.00045399561 18 - 5200 3822.1566 1.0526914 0.00047561445 19 - 5300 3901.8883 -0.14607602 0.00047561445 19 - 5400 4059.3644 -1.7789927 0.00049723329 20 - 5500 4163.6847 1.0240127 0.00049723329 20 - 5600 4109.1649 0.80199787 0.00049723329 20 - 5700 4391.2091 2.8730036 0.00049723329 20 - 5800 4279.6579 -0.36499822 0.00051885212 21 - 5900 4296.2695 -1.3064528 0.00051885212 21 - 6000 4065.3758 -2.0483224 0.00051885212 21 - 6100 4772.5362 -2.6814694 0.00054047096 22 - 6200 4627.029 2.999215 0.0005620898 23 - 6300 5120.7881 0.65372968 0.00058370864 24 - 6400 4588.9559 3.7570705 0.00058370864 24 - 6500 5008.7814 2.3595833 0.00060532748 25 - 6600 5195.0053 1.4641612 0.00060532748 25 - 6700 5622.293 -0.33396047 0.00062694632 26 - 6800 5515.1957 -4.234874 0.00062694632 26 - 6900 5156.7455 0.40171954 0.00064856516 27 - 7000 5120.1639 -1.6065245 0.00064856516 27 - 7100 5650.0327 0.94436323 0.00067018399 28 - 7200 5985.1115 -3.8940347 0.00069180283 29 - 7300 5983.197 0.5293568 0.00069180283 29 - 7400 6001.1559 -0.13712834 0.00071342167 30 - 7500 5889.2134 0.17230892 0.00071342167 30 - 7600 5797.31 2.0920058 0.00071342167 30 - 7700 5865.2783 -0.18556395 0.00071342167 30 - 7800 6207.0659 -5.6237083 0.00071342167 30 - 7900 5627.5108 -2.3718942 0.00071342167 30 - 8000 5823.9502 -0.85418578 0.00071342167 30 -Loop time of 184.87 on 1 procs for 8000 steps with 528 atoms - -Performance: 3.739 ns/day, 6.419 hours/ns, 43.274 timesteps/s -99.9% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 3.3043 | 3.3043 | 3.3043 | 0.0 | 1.79 -Bond | 8.0003 | 8.0003 | 8.0003 | 0.0 | 4.33 -Kspace | 168.33 | 168.33 | 168.33 | 0.0 | 91.05 -Neigh | 4.6322 | 4.6322 | 4.6322 | 0.0 | 2.51 -Comm | 0.077927 | 0.077927 | 0.077927 | 0.0 | 0.04 -Output | 0.0020548 | 0.0020548 | 0.0020548 | 0.0 | 0.00 -Modify | 0.5005 | 0.5005 | 0.5005 | 0.0 | 0.27 -Other | | 0.02483 | | | 0.01 - -Nlocal: 528.000 ave 528 max 528 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 341.000 ave 341 max 341 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 35111.0 ave 35111 max 35111 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 35111 -Ave neighs/atom = 66.498106 -Ave special neighs/atom = 11.409091 -Neighbor list builds = 8000 -Dangerous builds = 0 - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:03:05 diff --git a/examples/PACKAGES/reaction/create_atoms_polystyrene/log.24Dec20.grow_styrene.g++.4 b/examples/PACKAGES/reaction/create_atoms_polystyrene/log.24Dec20.grow_styrene.g++.4 deleted file mode 100644 index 8daa6d8161..0000000000 --- a/examples/PACKAGES/reaction/create_atoms_polystyrene/log.24Dec20.grow_styrene.g++.4 +++ /dev/null @@ -1,196 +0,0 @@ -LAMMPS (24 Dec 2020) -Reading data file ... - orthogonal box = (50.000000 50.000000 50.000000) to (250.00000 250.00000 250.00000) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 48 atoms - reading velocities ... - 48 velocities - scanning bonds ... - 8 = max bonds/atom - scanning angles ... - 21 = max angles/atom - scanning dihedrals ... - 33 = max dihedrals/atom - scanning impropers ... - 29 = max impropers/atom - reading bonds ... - 50 bonds - reading angles ... - 84 angles - reading dihedrals ... - 127 dihedrals - reading impropers ... - 36 impropers -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 4 = max # of 1-2 neighbors - 8 = max # of 1-3 neighbors - 17 = max # of 1-4 neighbors - 46 = max # of special neighbors - special bonds CPU = 0.000 seconds - read_data CPU = 0.007 seconds -Read molecule template mol1: - 1 molecules - 30 atoms with max type 6 - 31 bonds with max type 10 - 51 angles with max type 16 - 73 dihedrals with max type 19 - 21 impropers with max type 7 -Read molecule template mol2: - 1 molecules - 46 atoms with max type 6 - 48 bonds with max type 13 - 81 angles with max type 22 - 121 dihedrals with max type 36 - 35 impropers with max type 9 -dynamic group bond_react_MASTER_group defined -dynamic group statted_grp_REACT defined -PPPM initialization ... -WARNING: System is not charge neutral, net charge = -0.00060000000 (../kspace.cpp:324) - using 12-bit tables for long-range coulomb (../kspace.cpp:339) - G vector (1/distance) = 0.20144813 - grid = 45 45 45 - stencil order = 5 - estimated absolute RMS force accuracy = 0.00053712952 - estimated relative force accuracy = 1.6175496e-06 - using double precision KISS FFT - 3d grid and FFT values/proc = 39200 24300 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 10.5 - ghost atom cutoff = 10.5 - binsize = 5.25, bins = 39 39 39 - 2 neighbor lists, perpetual/occasional/extra = 1 1 0 - (1) pair lj/class2/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix bond/react, occasional, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Setting up Verlet run ... - Unit style : real - Current step : 0 - Time step : 1 -Per MPI rank memory allocation (min/avg/max) = 38.70 | 38.92 | 39.43 Mbytes -Step Temp Press Density f_myrxns[1] - 0 496.23742 0.9983211 6.4856516e-05 0 - 100 534.05394 -0.76952227 6.4856516e-05 0 - 200 552.2225 -0.55375493 6.4856516e-05 0 - 300 857.52834 -0.4272061 8.6475354e-05 1 - 400 714.10681 1.5004615 8.6475354e-05 1 - 500 678.19171 0.21965471 8.6475354e-05 1 - 600 572.3234 0.87879933 8.6475354e-05 1 - 700 996.17398 -0.24269717 0.00010809419 2 - 800 904.50395 1.3662054 0.00010809419 2 - 900 1097.1568 -2.2909907 0.00012971303 3 - 1000 954.08892 1.7705672 0.00012971303 3 - 1100 1102.0377 -1.7018446 0.00015133187 4 - 1200 1239.785 -0.30442903 0.00015133187 4 - 1300 1388.4127 1.3301175 0.00017295071 5 - 1400 1559.3853 1.6709729 0.00017295071 5 - 1500 1471.8623 0.8268427 0.00017295071 5 - 1600 1543.6793 2.1987908 0.00019456955 6 - 1700 1694.5595 0.48852817 0.00019456955 6 - 1800 1632.7737 -1.4617692 0.00021618839 7 - 1900 1922.6502 1.1664257 0.00021618839 7 - 2000 2223.503 -0.95799878 0.00023780722 8 - 2100 2142.6035 0.88444463 0.00025942606 9 - 2200 2298.8636 3.4239313 0.00025942606 9 - 2300 2252.4355 0.82167302 0.00025942606 9 - 2400 2321.0788 1.7499714 0.00025942606 9 - 2500 2095.6715 0.55288444 0.00025942606 9 - 2600 2136.0316 -3.833114 0.00025942606 9 - 2700 2466.3134 -2.2519511 0.00025942606 9 - 2800 2294.3454 1.0637304 0.00025942606 9 - 2900 2340.3891 1.3997049 0.0002810449 10 - 3000 2272.0013 -0.27591886 0.0002810449 10 - 3100 2333.9696 -0.11772138 0.0002810449 10 - 3200 2409.0946 -1.025473 0.0002810449 10 - 3300 2148.023 1.6752329 0.0002810449 10 - 3400 2267.636 -0.45297583 0.0002810449 10 - 3500 2457.622 0.35627297 0.0002810449 10 - 3600 2288.008 -15.516626 0.00030266374 11 - 3700 2458.2681 1.4571773 0.00030266374 11 - 3800 2566.7623 -29.140553 0.00032428258 12 - 3900 2839.4062 0.64583638 0.00032428258 12 - 4000 2893.2204 -53.187892 0.00034590142 13 - 4100 3024.6375 -65.068146 0.00036752025 14 - 4200 3004.6784 1.4155214 0.00036752025 14 - 4300 3033.1895 1.8572273 0.00036752025 14 - 4400 3157.2542 -0.92462977 0.00036752025 14 - 4500 3557.7137 -194.46498 0.00038913909 15 - 4600 3096.485 -1.830492 0.00038913909 15 - 4700 3488.088 -286.81055 0.00041075793 16 - 4800 3390.5493 -372.77818 0.00043237677 17 - 4900 3773.7226 -446.58574 0.00045399561 18 - 5000 3703.0159 -0.81188551 0.00045399561 18 - 5100 4051.3067 1.2567439 0.00045399561 18 - 5200 3813.3682 0.92945737 0.00047561445 19 - 5300 4036.0078 -2.5336258 0.00049723329 20 - 5400 4219.803 -0.96928261 0.00049723329 20 - 5500 4433.7447 -0.026762463 0.00051885212 21 - 5600 4477.4505 -1.417316 0.00054047096 22 - 5700 4500.0306 -1.0551443 0.00054047096 22 - 5800 4600.3507 -4.9580056 0.00054047096 22 - 5900 4765.4978 -2.2546941 0.0005620898 23 - 6000 5442.6193 0.91161284 0.00058370864 24 - 6100 5086.8047 -0.9875332 0.00060532748 25 - 6200 5485.3437 -2.8296626 0.00062694632 26 - 6300 4988.0396 -0.15179023 0.00064856516 27 - 6400 5597.3703 4.2941885 0.00067018399 28 - 6500 5677.0263 -2.8611595 0.00069180283 29 - 6600 6058.0009 1.4111778 0.00071342167 30 - 6700 5859.0817 -2.5782466 0.00071342167 30 - 6800 5879.3941 -4.5681807 0.00071342167 30 - 6900 6398.288 2.5259412 0.00071342167 30 - 7000 6250.1096 -2.6049627 0.00071342167 30 - 7100 5849.651 -0.44062578 0.00071342167 30 - 7200 5778.6532 -0.27299118 0.00071342167 30 - 7300 5977.6661 4.2483639 0.00071342167 30 - 7400 5862.4231 1.0289519 0.00071342167 30 - 7500 6482.376 7.5412373 0.00071342167 30 - 7600 5810.4325 1.0343075 0.00071342167 30 - 7700 5916.7304 2.304302 0.00071342167 30 - 7800 5869.9504 -0.5946555 0.00071342167 30 - 7900 5804.0522 -4.1207689 0.00071342167 30 - 8000 6077.1704 0.52211243 0.00071342167 30 -Loop time of 60.5603 on 4 procs for 8000 steps with 528 atoms - -Performance: 11.413 ns/day, 2.103 hours/ns, 132.100 timesteps/s -99.9% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.0041695 | 0.90113 | 2.3423 | 102.8 | 1.49 -Bond | 0.011606 | 2.1188 | 5.8107 | 163.9 | 3.50 -Kspace | 47.987 | 52.817 | 55.679 | 43.7 | 87.21 -Neigh | 3.5961 | 3.6262 | 3.6496 | 1.2 | 5.99 -Comm | 0.11097 | 0.16569 | 0.26369 | 15.3 | 0.27 -Output | 0.0020366 | 0.0023427 | 0.0032469 | 1.1 | 0.00 -Modify | 0.62302 | 0.91659 | 1.1227 | 21.5 | 1.51 -Other | | 0.0126 | | | 0.02 - -Nlocal: 132.000 ave 295 max 0 min -Histogram: 2 0 0 0 0 0 0 1 0 1 -Nghost: 133.000 ave 349 max 0 min -Histogram: 2 0 0 0 0 1 0 0 0 1 -Neighs: 8383.50 ave 20143 max 0 min -Histogram: 2 0 0 0 0 0 1 0 0 1 - -Total # of neighbors = 33534 -Ave neighs/atom = 63.511364 -Ave special neighs/atom = 11.409091 -Neighbor list builds = 8000 -Dangerous builds = 0 - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:01:00 diff --git a/examples/PACKAGES/reaction/create_atoms_polystyrene/log.4Nov2022.grow_styrene.g++.1 b/examples/PACKAGES/reaction/create_atoms_polystyrene/log.4Nov2022.grow_styrene.g++.1 new file mode 100644 index 0000000000..fb9b22d134 --- /dev/null +++ b/examples/PACKAGES/reaction/create_atoms_polystyrene/log.4Nov2022.grow_styrene.g++.1 @@ -0,0 +1,256 @@ +LAMMPS (4 Nov 2022) +# use bond/react 'create atoms' feature to add 30 new styrene monomers to chain + +units real + +boundary p p p + +atom_style full + +pair_style lj/class2/coul/cut 8.5 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +variable T equal 530 + +read_data trimer.data extra/bond/per/atom 5 extra/angle/per/atom 15 extra/dihedral/per/atom 15 extra/improper/per/atom 25 extra/special/per/atom 25 +Reading data file ... + orthogonal box = (-200 -200 -200) to (200 200 200) + 1 by 1 by 1 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 48 atoms + scanning bonds ... + 8 = max bonds/atom + scanning angles ... + 21 = max angles/atom + scanning dihedrals ... + 33 = max dihedrals/atom + scanning impropers ... + 26 = max impropers/atom + reading bonds ... + 50 bonds + reading angles ... + 84 angles + reading dihedrals ... + 127 dihedrals + reading impropers ... + 20 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 8 = max # of 1-3 neighbors + 17 = max # of 1-4 neighbors + 46 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.011 seconds + +molecule mol1 grow_styrene_pre.molecule_template +Read molecule template mol1: + 1 molecules + 0 fragments + 30 atoms with max type 4 + 31 bonds with max type 6 + 51 angles with max type 10 + 73 dihedrals with max type 13 + 13 impropers with max type 3 +molecule mol2 grow_styrene_post.molecule_template +Read molecule template mol2: + 1 molecules + 1 fragments + 46 atoms with max type 4 + 48 bonds with max type 6 + 81 angles with max type 10 + 121 dihedrals with max type 13 + 19 impropers with max type 3 + +fix myrxns all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0 3.0 mol1 mol2 grow_styrene.map modify_create fit create_fit overlap 2.0 stabilize_steps 200 max_rxn 30 +dynamic group bond_react_MASTER_group defined +dynamic group statted_grp_REACT defined + +fix 1 statted_grp_REACT nvt temp $T $T 100 +fix 1 statted_grp_REACT nvt temp 530 $T 100 +fix 1 statted_grp_REACT nvt temp 530 530 100 + +fix 4 bond_react_MASTER_group temp/rescale 1 $T $T 1 1 +fix 4 bond_react_MASTER_group temp/rescale 1 530 $T 1 1 +fix 4 bond_react_MASTER_group temp/rescale 1 530 530 1 1 + +thermo_style custom step temp press density f_myrxns[1] + +thermo 100 + +dump 1 all xyz 1 test_vis.xyz + +run 8000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 6 of 6 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 77 77 77 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2/coul/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 36.99 | 36.99 | 36.99 Mbytes + Step Temp Press Density f_myrxns[1] + 0 0 0.076588866 8.1070333e-06 0 + 100 598.41967 -0.1670029 1.0809378e-05 1 + 200 696.77845 0.11857422 1.0809378e-05 1 + 300 932.97222 -0.058615676 1.3511722e-05 2 + 400 1016.3732 0.062233715 1.3511722e-05 2 + 500 1006.451 -0.17987841 1.6214067e-05 3 + 600 1143.8859 0.33297898 1.6214067e-05 3 + 700 1209.6144 -0.22743773 1.8916411e-05 4 + 800 1429.1639 0.14048255 1.8916411e-05 4 + 900 1375.0968 -0.04016551 2.1618755e-05 5 + 1000 1583.6696 -0.23364852 2.1618755e-05 5 + 1100 1811.0697 -0.054436797 2.43211e-05 6 + 1200 1928.4658 0.012242837 2.43211e-05 6 + 1300 1666.6176 0.057157656 2.43211e-05 6 + 1400 1686.18 -28.442814 2.7023444e-05 7 + 1500 1704.6248 -0.16861218 2.7023444e-05 7 + 1600 2171.7628 -33.6156 2.9725789e-05 8 + 1700 1991.2922 -0.11813381 2.9725789e-05 8 + 1800 2037.4991 -40.015612 3.2428133e-05 9 + 1900 2143.9447 -0.090964375 3.2428133e-05 9 + 2000 1927.9564 0.29856007 3.2428133e-05 9 + 2100 2255.5877 -4.9166327 3.5130478e-05 10 + 2200 2512.5193 0.00044804842 3.5130478e-05 10 + 2300 2336.1503 -45.094726 3.7832822e-05 11 + 2400 2508.9655 -0.1024684 3.7832822e-05 11 + 2500 2747.7344 -53.939212 4.0535167e-05 12 + 2600 2790.5736 0.07042181 4.0535167e-05 12 + 2700 3014.7092 -0.0025387793 4.0535167e-05 12 + 2800 2745.0295 -0.099361314 4.3237511e-05 13 + 2900 2952.1281 -0.13667582 4.3237511e-05 13 + 3000 3032.5298 0.28882784 4.5939855e-05 14 + 3100 3149.992 0.55269076 4.5939855e-05 14 + 3200 3422.5233 -0.11794908 4.86422e-05 15 + 3300 3040.2691 -0.067532834 4.86422e-05 15 + 3400 3323.3263 0.049969149 5.1344544e-05 16 + 3500 3539.0877 -0.065546641 5.1344544e-05 16 + 3600 3894.6897 -0.24222461 5.4046889e-05 17 + 3700 3689.3513 0.21366533 5.4046889e-05 17 + 3800 3924.799 -0.60817646 5.6749233e-05 18 + 3900 3713.1947 -0.024834682 5.6749233e-05 18 + 4000 3887.6151 0.052787631 5.9451578e-05 19 + 4100 3868.2877 0.42532898 5.9451578e-05 19 + 4200 3784.9874 -0.12018512 5.9451578e-05 19 + 4300 4169.9997 0.19652089 6.2153922e-05 20 + 4400 4112.291 -0.084839982 6.2153922e-05 20 + 4500 3974.2226 -0.13641761 6.2153922e-05 20 + 4600 4064.3852 0.16435039 6.2153922e-05 20 + 4700 3880.0044 -0.42874552 6.2153922e-05 20 + 4800 4508.2324 0.20208091 6.2153922e-05 20 + 4900 4364.033 -0.56300441 6.2153922e-05 20 + 5000 4030.4642 -0.29006515 6.2153922e-05 20 + 5100 4010.9518 0.32060145 6.2153922e-05 20 + 5200 4058.5072 0.088924924 6.2153922e-05 20 + 5300 4529.9866 -0.38882748 6.4856266e-05 21 + 5400 4305.9161 0.24046553 6.4856266e-05 21 + 5500 4556.8628 -0.014044879 6.4856266e-05 21 + 5600 4730.2206 0.1526293 6.4856266e-05 21 + 5700 4810.9968 -17.600253 6.7558611e-05 22 + 5800 4655.651 -0.25941928 6.7558611e-05 22 + 5900 4507.1045 -0.084691005 6.7558611e-05 22 + 6000 4516.0965 0.092662842 7.0260955e-05 23 + 6100 4592.4068 0.10403004 7.0260955e-05 23 + 6200 4583.9491 0.1692786 7.29633e-05 24 + 6300 4512.226 0.32590723 7.29633e-05 24 + 6400 4885.9205 -0.24208842 7.5665644e-05 25 + 6500 5250.5008 0.4135064 7.5665644e-05 25 + 6600 5216.9452 0.00059199905 7.8367989e-05 26 + 6700 5302.2925 0.50452368 7.8367989e-05 26 + 6800 4931.7328 -0.064719953 8.1070333e-05 27 + 6900 5549.8746 0.55101191 8.1070333e-05 27 + 7000 5472.9107 0.31358281 8.3772677e-05 28 + 7100 5559.9339 0.14034743 8.3772677e-05 28 + 7200 5726.4492 -0.39732059 8.6475022e-05 29 + 7300 5869.324 0.18989804 8.6475022e-05 29 + 7400 6109.5519 0.11206572 8.9177366e-05 30 + 7500 5966.7085 0.2059557 8.9177366e-05 30 + 7600 6051.2064 0.025316679 8.9177366e-05 30 + 7700 5719.6669 0.16548544 8.9177366e-05 30 + 7800 6118.8183 -0.20036999 8.9177366e-05 30 + 7900 6477.1901 0.10308473 8.9177366e-05 30 + 8000 6241.9498 0.090165102 8.9177366e-05 30 +Loop time of 17.4848 on 1 procs for 8000 steps with 528 atoms + +Performance: 39.531 ns/day, 0.607 hours/ns, 457.540 timesteps/s, 241.581 katom-step/s +97.6% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 3.0991 | 3.0991 | 3.0991 | 0.0 | 17.72 +Bond | 7.6807 | 7.6807 | 7.6807 | 0.0 | 43.93 +Neigh | 1.6906 | 1.6906 | 1.6906 | 0.0 | 9.67 +Comm | 0.019091 | 0.019091 | 0.019091 | 0.0 | 0.11 +Output | 4.5095 | 4.5095 | 4.5095 | 0.0 | 25.79 +Modify | 0.46277 | 0.46277 | 0.46277 | 0.0 | 2.65 +Other | | 0.02296 | | | 0.13 + +Nlocal: 528 ave 528 max 528 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 35904 ave 35904 max 35904 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 35904 +Ave neighs/atom = 68 +Ave special neighs/atom = 11.409091 +Neighbor list builds = 1836 +Dangerous builds = 0 + +# write_data final.data nofix +Total wall time: 0:00:17 diff --git a/examples/PACKAGES/reaction/create_atoms_polystyrene/log.4Nov2022.grow_styrene.g++.4 b/examples/PACKAGES/reaction/create_atoms_polystyrene/log.4Nov2022.grow_styrene.g++.4 new file mode 100644 index 0000000000..b14ff6c8d0 --- /dev/null +++ b/examples/PACKAGES/reaction/create_atoms_polystyrene/log.4Nov2022.grow_styrene.g++.4 @@ -0,0 +1,256 @@ +LAMMPS (4 Nov 2022) +# use bond/react 'create atoms' feature to add 30 new styrene monomers to chain + +units real + +boundary p p p + +atom_style full + +pair_style lj/class2/coul/cut 8.5 + +angle_style class2 + +bond_style class2 + +dihedral_style class2 + +improper_style class2 + +variable T equal 530 + +read_data trimer.data extra/bond/per/atom 5 extra/angle/per/atom 15 extra/dihedral/per/atom 15 extra/improper/per/atom 25 extra/special/per/atom 25 +Reading data file ... + orthogonal box = (-200 -200 -200) to (200 200 200) + 1 by 2 by 2 MPI processor grid + reading atom labelmap ... + reading bond labelmap ... + reading angle labelmap ... + reading dihedral labelmap ... + reading improper labelmap ... + reading atoms ... + 48 atoms + scanning bonds ... + 8 = max bonds/atom + scanning angles ... + 21 = max angles/atom + scanning dihedrals ... + 33 = max dihedrals/atom + scanning impropers ... + 26 = max impropers/atom + reading bonds ... + 50 bonds + reading angles ... + 84 angles + reading dihedrals ... + 127 dihedrals + reading impropers ... + 20 impropers +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 4 = max # of 1-2 neighbors + 8 = max # of 1-3 neighbors + 17 = max # of 1-4 neighbors + 46 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.007 seconds + +molecule mol1 grow_styrene_pre.molecule_template +Read molecule template mol1: + 1 molecules + 0 fragments + 30 atoms with max type 4 + 31 bonds with max type 6 + 51 angles with max type 10 + 73 dihedrals with max type 13 + 13 impropers with max type 3 +molecule mol2 grow_styrene_post.molecule_template +Read molecule template mol2: + 1 molecules + 1 fragments + 46 atoms with max type 4 + 48 bonds with max type 6 + 81 angles with max type 10 + 121 dihedrals with max type 13 + 19 impropers with max type 3 + +fix myrxns all bond/react stabilization yes statted_grp .03 react rxn1 all 1 0 3.0 mol1 mol2 grow_styrene.map modify_create fit create_fit overlap 2.0 stabilize_steps 200 max_rxn 30 +dynamic group bond_react_MASTER_group defined +dynamic group statted_grp_REACT defined + +fix 1 statted_grp_REACT nvt temp $T $T 100 +fix 1 statted_grp_REACT nvt temp 530 $T 100 +fix 1 statted_grp_REACT nvt temp 530 530 100 + +fix 4 bond_react_MASTER_group temp/rescale 1 $T $T 1 1 +fix 4 bond_react_MASTER_group temp/rescale 1 530 $T 1 1 +fix 4 bond_react_MASTER_group temp/rescale 1 530 530 1 1 + +thermo_style custom step temp press density f_myrxns[1] + +thermo 100 + +dump 1 all xyz 1 test_vis.xyz + +run 8000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- fix bond/react: reacter.org doi:10.1016/j.polymer.2017.09.038, doi:10.1021/acs.macromol.0c02012 + +@Article{Gissinger17, + author = {J. R. Gissinger and B. D. Jensen and K. E. Wise}, + title = {Modeling Chemical Reactions in Classical Molecular Dynamics Simulations}, + journal = {Polymer}, + year = 2017, + volume = 128, + pages = {211--217} +} + +@Article{Gissinger20, + author = {J. R. Gissinger, B. D. Jensen, K. E. Wise}, + title = {{REACTER}: A Heuristic Method for Reactive Molecular Dynamics}, + journal = {Macromolecules}, + year = 2020, + volume = 53, + number = 22, + pages = {9953--9961} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 6 of 6 mixed pair_coeff terms from sixthpower/geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 10.5 + ghost atom cutoff = 10.5 + binsize = 5.25, bins = 77 77 77 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair lj/class2/coul/cut, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard + (2) fix bond/react, occasional, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 35.37 | 35.56 | 36.15 Mbytes + Step Temp Press Density f_myrxns[1] + 0 0 0.076588866 8.1070333e-06 0 + 100 598.29879 -0.17888669 1.0809378e-05 1 + 200 699.08337 0.11172183 1.0809378e-05 1 + 300 931.85797 -0.13923465 1.3511722e-05 2 + 400 893.78126 0.14680427 1.3511722e-05 2 + 500 1001.0848 -0.021703999 1.6214067e-05 3 + 600 989.24943 0.04641672 1.6214067e-05 3 + 700 1244.794 -0.19464667 1.8916411e-05 4 + 800 1210.997 -0.06710628 1.8916411e-05 4 + 900 1310.0005 0.099408095 2.1618755e-05 5 + 1000 1640.5956 -0.05975911 2.1618755e-05 5 + 1100 1380.7273 -0.025206389 2.1618755e-05 5 + 1200 1637.6542 0.057149266 2.43211e-05 6 + 1300 1757.3409 0.3232123 2.43211e-05 6 + 1400 1664.5048 -0.29656858 2.7023444e-05 7 + 1500 1578.9691 0.21997047 2.7023444e-05 7 + 1600 1848.9227 -0.11783672 2.9725789e-05 8 + 1700 1981.1695 0.28374154 2.9725789e-05 8 + 1800 2330.8852 -0.082109894 3.2428133e-05 9 + 1900 2177.4096 0.23853778 3.2428133e-05 9 + 2000 2095.1618 -1.5405667 3.5130478e-05 10 + 2100 2272.2653 0.05572226 3.5130478e-05 10 + 2200 2599.5994 -2.2307507 3.7832822e-05 11 + 2300 2457.7904 0.40228312 3.7832822e-05 11 + 2400 2372.9736 -3.3415973 4.0535167e-05 12 + 2500 2427.4613 -0.16211888 4.0535167e-05 12 + 2600 3022.2608 -4.3278098 4.3237511e-05 13 + 2700 3115.6526 0.013828954 4.3237511e-05 13 + 2800 2841.7091 -6.4163443 4.5939855e-05 14 + 2900 3047.8436 0.16052429 4.5939855e-05 14 + 3000 3373.7997 -7.7904706 4.86422e-05 15 + 3100 3381.6653 0.35152687 4.86422e-05 15 + 3200 3589.5561 -10.754027 5.1344544e-05 16 + 3300 3473.4415 -0.13274479 5.1344544e-05 16 + 3400 3696.3283 -13.75504 5.4046889e-05 17 + 3500 3486.5442 -0.31091832 5.4046889e-05 17 + 3600 3647.0818 0.34662993 5.4046889e-05 17 + 3700 3636.7138 -0.041981737 5.4046889e-05 17 + 3800 3427.6532 0.42008936 5.6749233e-05 18 + 3900 3574.0094 -0.05475272 5.6749233e-05 18 + 4000 4158.9339 0.14426361 5.9451578e-05 19 + 4100 3862.5026 0.094232438 5.9451578e-05 19 + 4200 3969.4378 -0.10602108 6.2153922e-05 20 + 4300 3840.0126 0.29190336 6.2153922e-05 20 + 4400 4365.9912 -36.954812 6.4856266e-05 21 + 4500 4565.3708 0.061879092 6.4856266e-05 21 + 4600 4565.491 -70.588435 6.7558611e-05 22 + 4700 4570.2702 -0.56661378 6.7558611e-05 22 + 4800 4445.786 0.20534323 6.7558611e-05 22 + 4900 4782.6436 0.012783481 7.0260955e-05 23 + 5000 4777.2132 0.092416308 7.0260955e-05 23 + 5100 4944.0402 0.11614993 7.29633e-05 24 + 5200 5139.165 -0.23180938 7.29633e-05 24 + 5300 4647.2328 0.13570142 7.5665644e-05 25 + 5400 4982.7355 -0.25477884 7.5665644e-05 25 + 5500 5400.5924 0.19902824 7.8367989e-05 26 + 5600 5761.3552 0.083102065 7.8367989e-05 26 + 5700 5723.8581 0.039332796 8.1070333e-05 27 + 5800 5548.0789 -0.14511631 8.1070333e-05 27 + 5900 5358.5431 -0.099694264 8.3772677e-05 28 + 6000 5591.2678 9.9924655e-05 8.3772677e-05 28 + 6100 6101.8008 0.26538732 8.6475022e-05 29 + 6200 5848.9979 0.091137862 8.6475022e-05 29 + 6300 5582.1828 -0.039900602 8.9177366e-05 30 + 6400 6077.0548 0.3191104 8.9177366e-05 30 + 6500 5794.6827 0.69322336 8.9177366e-05 30 + 6600 5610.4331 0.080420058 8.9177366e-05 30 + 6700 5615.3492 0.12810868 8.9177366e-05 30 + 6800 5900.9749 -0.31704866 8.9177366e-05 30 + 6900 6233.9524 0.010288514 8.9177366e-05 30 + 7000 5972.7488 -1.0442089 8.9177366e-05 30 + 7100 6258.1332 0.56270399 8.9177366e-05 30 + 7200 6172.5919 -0.19595153 8.9177366e-05 30 + 7300 5898.7547 0.020862491 8.9177366e-05 30 + 7400 5815.1659 -0.0020680171 8.9177366e-05 30 + 7500 6003.867 -0.12288131 8.9177366e-05 30 + 7600 5966.0609 -0.1504333 8.9177366e-05 30 + 7700 6274.3331 -0.62752757 8.9177366e-05 30 + 7800 6051.0914 0.22821201 8.9177366e-05 30 + 7900 5981.5209 -0.19623554 8.9177366e-05 30 + 8000 5835.4657 0.3602475 8.9177366e-05 30 +Loop time of 13.936 on 4 procs for 8000 steps with 528 atoms + +Performance: 49.598 ns/day, 0.484 hours/ns, 574.051 timesteps/s, 303.099 katom-step/s +99.4% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.001058 | 0.78388 | 3.1317 | 153.1 | 5.62 +Bond | 0.0031874 | 2.0525 | 8.1984 | 247.7 | 14.73 +Neigh | 0.53495 | 0.53527 | 0.53551 | 0.0 | 3.84 +Comm | 0.01177 | 0.012451 | 0.013306 | 0.5 | 0.09 +Output | 1.3336 | 1.4735 | 1.7322 | 13.2 | 10.57 +Modify | 0.55142 | 9.0568 | 12.031 | 163.3 | 64.99 +Other | | 0.02159 | | | 0.15 + +Nlocal: 132 ave 528 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 +Nghost: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Neighs: 9115.75 ave 36463 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 + +Total # of neighbors = 36463 +Ave neighs/atom = 69.058712 +Ave special neighs/atom = 11.409091 +Neighbor list builds = 771 +Dangerous builds = 0 + +# write_data final.data nofix +Total wall time: 0:00:13 diff --git a/examples/PACKAGES/reaction/create_atoms_polystyrene/trimer.data b/examples/PACKAGES/reaction/create_atoms_polystyrene/trimer.data index b3ad132f03..2608a0ed10 100644 --- a/examples/PACKAGES/reaction/create_atoms_polystyrene/trimer.data +++ b/examples/PACKAGES/reaction/create_atoms_polystyrene/trimer.data @@ -1,796 +1,585 @@ polystyrene trimer -48 atoms -7 atom types -50 bonds -13 bond types -84 angles -22 angle types -127 dihedrals -36 dihedral types -36 impropers -9 improper types + 48 atoms + 50 bonds + 84 angles + 127 dihedrals + 20 impropers -50 250 xlo xhi -50 250 ylo yhi -50 250 zlo zhi + 4 atom types + 6 bond types + 10 angle types + 13 dihedral types + 4 improper types + + -200 200 xlo xhi + -200 200 ylo yhi + -200 200 zlo zhi + +Atom Type Labels + + 1 hc + 2 cp + 3 c1 + 4 c2 + +Bond Type Labels + + 1 hc-cp + 2 cp-cp + 3 hc-c2 + 4 c1-c2 + 5 cp-c1 + 6 hc-c1 + +Angle Type Labels + + 1 hc-cp-cp + 2 cp-cp-cp + 3 cp-c1-c2 + 4 hc-c1-c2 + 5 hc-c1-cp + 6 hc-c2-c1 + 7 hc-c2-hc + 8 c1-c2-c1 + 9 cp-cp-c1 + 10 c2-c1-c2 + +Dihedral Type Labels + + 1 hc-cp-cp-hc + 2 hc-cp-cp-cp + 3 cp-cp-cp-cp + 4 cp-cp-cp-c1 + 5 hc-cp-cp-c1 + 6 cp-c1-c2-hc + 7 cp-c1-c2-c1 + 8 hc-c1-c2-hc + 9 hc-c1-c2-c1 + 10 cp-cp-c1-c2 + 11 cp-cp-c1-hc + 12 c2-c1-c2-hc + 13 c2-c1-c2-c1 + +Improper Type Labels + + 1 hc-cp-cp-cp + 2 hc-c1-cp-c2 + 3 cp-cp-cp-c1 + 4 hc-c2-hc-c1 Masses -1 12.0112 -2 1.00797 -3 12.0112 -4 12.0112 -5 12.0112 -6 12.0112 -7 12.0112 + 1 1.007970 # hc + 2 12.011150 # cp + 3 12.011150 # c1 + 4 12.011150 # c2 Pair Coeffs # lj/class2/coul/long -1 0.064 4.01 -2 0.02 2.7 -3 0.064 4.01 -4 0.064 3.9 -5 0.054 4.01 -6 0.054 4.01 -7 0.054 4.01 + 1 0.0200000000 2.7000000000 + 2 0.0640000000 4.0100000000 + 3 0.0540000000 4.0100000000 + 4 0.0540000000 4.0100000000 Bond Coeffs # class2 -1 1.0982 372.825 -803.453 894.317 -2 1.417 470.836 -627.618 1327.63 -3 1.501 321.902 -521.821 572.163 -4 1.0883 365.768 -725.54 781.662 -5 1.34 543.99 -1238.2 1644.03 -6 1.0883 365.768 -725.54 781.662 -7 1.501 321.902 -521.821 572.163 -8 1.101 345 -691.89 844.6 -9 1.53 299.67 -501.77 679.81 -10 1.101 345 -691.89 844.6 -11 1.501 321.902 -521.821 572.163 -12 1.101 345 -691.89 844.6 -13 1.53 299.67 -501.77 679.81 + 1 1.0982 372.8251 -803.4526 894.3173 + 2 1.4170 470.8361 -627.6179 1327.6345 + 3 1.1010 345.0000 -691.8900 844.6000 + 4 1.5300 299.6700 -501.7700 679.8100 + 5 1.5010 321.9021 -521.8208 572.1628 + 6 1.1010 345.0000 -691.8900 844.6000 Angle Coeffs # class2 -1 117.94 35.1558 -12.4682 0 -2 118.9 61.0226 -34.9931 0 -3 120.05 44.7148 -22.7352 0 -4 111 44.3234 -9.4454 0 -5 108.4 43.9594 -8.3924 -9.3379 -6 124.88 35.2766 -17.774 -1.6215 -7 124.88 35.2766 -17.774 -1.6215 -8 115.49 29.6363 -12.4853 -6.2218 -9 120.05 44.7148 -22.7352 0 -10 111 44.3234 -9.4454 0 -11 108.4 43.9594 -8.3924 -9.3379 -12 110.77 41.453 -10.604 5.129 -13 112.67 39.516 -7.443 -9.5583 -14 110.77 41.453 -10.604 5.129 -15 107.66 39.641 -12.921 -2.4318 -16 112.67 39.516 -7.443 -9.5583 -17 120.05 44.7148 -22.7352 0 -18 111 44.3234 -9.4454 0 -19 108.4 43.9594 -8.3924 -9.3379 -20 110.77 41.453 -10.604 5.129 -21 110.77 41.453 -10.604 5.129 -22 112.67 39.516 -7.443 -9.5583 - -BondBond Coeffs - -1 1.0795 1.417 1.0982 -2 68.2856 1.417 1.417 -3 12.0676 1.417 1.501 -4 2.9168 1.501 1.0883 -5 0 1.501 1.34 -6 10.1047 1.0883 1.34 -7 10.1047 1.0883 1.34 -8 4.8506 1.0883 1.0883 -9 12.0676 1.417 1.501 -10 2.9168 1.501 1.101 -11 0 1.501 1.53 -12 3.3872 1.101 1.53 -13 0 1.53 1.53 -14 3.3872 1.101 1.53 -15 5.3316 1.101 1.101 -16 0 1.53 1.53 -17 12.0676 1.417 1.501 -18 2.9168 1.501 1.101 -19 0 1.501 1.53 -20 3.3872 1.101 1.53 -21 3.3872 1.101 1.53 -22 0 1.53 1.53 - -BondAngle Coeffs - -1 20.0033 24.2183 1.417 1.0982 -2 28.8708 28.8708 1.417 1.417 -3 31.0771 47.0579 1.417 1.501 -4 26.4608 11.7717 1.501 1.0883 -5 0 0 1.501 1.34 -6 19.0592 23.3588 1.0883 1.34 -7 19.0592 23.3588 1.0883 1.34 -8 17.9795 17.9795 1.0883 1.0883 -9 31.0771 47.0579 1.417 1.501 -10 26.4608 11.7717 1.501 1.101 -11 0 0 1.501 1.53 -12 11.421 20.754 1.101 1.53 -13 8.016 8.016 1.53 1.53 -14 11.421 20.754 1.101 1.53 -15 18.103 18.103 1.101 1.101 -16 8.016 8.016 1.53 1.53 -17 31.0771 47.0579 1.417 1.501 -18 26.4608 11.7717 1.501 1.101 -19 0 0 1.501 1.53 -20 11.421 20.754 1.101 1.53 -21 11.421 20.754 1.101 1.53 -22 8.016 8.016 1.53 1.53 + 1 117.9400 35.1558 -12.4682 0.0000 + 2 118.9000 61.0226 -34.9931 0.0000 + 3 108.4000 43.9594 -8.3924 -9.3379 + 4 110.7700 41.4530 -10.6040 5.1290 + 5 111.0000 44.3234 -9.4454 0.0000 + 6 110.7700 41.4530 -10.6040 5.1290 + 7 107.6600 39.6410 -12.9210 -2.4318 + 8 112.6700 39.5160 -7.4430 -9.5583 + 9 120.0500 44.7148 -22.7352 0.0000 + 10 112.6700 39.5160 -7.4430 -9.5583 Dihedral Coeffs # class2 -1 0 0 1.559 0 0 0 -2 0 0 3.9661 0 0 0 -3 0 0 4.4072 0 0 0 -4 8.3667 0 1.1932 0 0 0 -5 0 0 1.8769 0 0 0 -6 0 0 0 0 0 0 -7 0 0 0 0 0 0 -8 0 0 0 0 0 0 -9 0 0 4.8974 0 0 0 -10 0 0 1.559 0 0 0 -11 0 0 4.4072 0 0 0 -12 -0.2801 0 -0.0678 0 -0.0122 0 -13 -0.2802 0 -0.0678 0 -0.0122 0 -14 -0.0228 0 0.028 0 -0.1863 0 -15 -0.1432 0 0.0617 0 -0.1083 0 -16 0 0 0.0316 0 -0.1681 0 -17 0 0 0 0 0 0 -18 0 0 0.0316 0 -0.1681 0 -19 0 0 0.0514 0 -0.143 0 -20 0 0 1.559 0 0 0 -21 0 0 4.4072 0 0 0 -22 -0.2801 0 -0.0678 0 -0.0122 0 -23 -0.2802 0 -0.0678 0 -0.0122 0 -24 -0.0228 0 0.028 0 -0.1863 0 -25 0 0 0 0 0 0 -26 -0.1432 0 0.0617 0 -0.1083 0 -27 0 0 0.0316 0 -0.1681 0 -28 0 0 0 0 0 0 -29 0 0 0.0316 0 -0.1681 0 -30 0 0 0.0514 0 -0.143 0 -31 -0.0228 0 0.028 0 -0.1863 0 -32 -0.1432 0 0.0617 0 -0.1083 0 -33 0 0 0.0316 0 -0.1681 0 -34 0 0 0 0 0 0 -35 0 0 0.0316 0 -0.1681 0 -36 0 0 0.0514 0 -0.143 0 - -AngleAngleTorsion Coeffs - -1 4.4444 117.94 120.05 -2 -4.8141 118.9 117.94 -3 -14.4097 118.9 120.05 -4 0 118.9 118.9 -5 0.3598 117.94 117.94 -6 0 120.05 111 -7 0 120.05 108.4 -8 0 108.4 124.88 -9 -7.0058 124.88 124.88 -10 4.4444 117.94 120.05 -11 -14.4097 118.9 120.05 -12 -5.8888 120.05 111 -13 0 120.05 108.4 -14 0 108.4 110.77 -15 -12.564 110.77 110.77 -16 -16.164 112.67 110.77 -17 0 108.4 112.67 -18 -16.164 110.77 112.67 -19 -22.045 112.67 112.67 -20 4.4444 117.94 120.05 -21 -14.4097 118.9 120.05 -22 -5.8888 120.05 111 -23 0 120.05 108.4 -24 0 108.4 110.77 -25 0 108.4 112.67 -26 -12.564 110.77 110.77 -27 -16.164 110.77 112.67 -28 0 112.67 108.4 -29 -16.164 112.67 110.77 -30 -22.045 112.67 112.67 -31 0 110.77 108.4 -32 -12.564 110.77 110.77 -33 -16.164 110.77 112.67 -34 0 112.67 108.4 -35 -16.164 112.67 110.77 -36 -22.045 112.67 112.67 - -EndBondTorsion Coeffs - -1 0 -0.4879 0 0 -1.797 0 1.0982 1.501 -2 0 -6.8958 0 0 -0.4669 0 1.417 1.0982 -3 0 -0.6918 0 0 0.2421 0 1.417 1.501 -4 -0.1185 6.3204 0 -0.1185 6.3204 0 1.417 1.417 -5 0 -0.689 0 0 -0.689 0 1.0982 1.0982 -6 0 0 0 0 0 0 1.417 1.0883 -7 0 0 0 0 0 0 1.417 1.34 -8 0 0 0 0 0 0 1.501 1.0883 -9 0.7129 0.5161 0 0.7129 0.5161 0 1.0883 1.0883 -10 0 -0.4879 0 0 -1.797 0 1.0982 1.501 -11 0 -0.6918 0 0 0.2421 0 1.417 1.501 -12 -0.5835 1.122 0.3978 1.3997 0.7756 0 1.417 1.101 -13 0 0 0 0 0 0 1.417 1.53 -14 0 0 0 0 0 0 1.501 1.101 -15 0.213 0.312 0.0777 0.213 0.312 0.0777 1.101 1.101 -16 0.2486 0.2422 -0.0925 0.0814 0.0591 0.2219 1.53 1.101 -17 0 0 0 0 0 0 1.501 1.53 -18 0.0814 0.0591 0.2219 0.2486 0.2422 -0.0925 1.101 1.53 -19 -0.0732 0 0 -0.0732 0 0 1.53 1.53 -20 0 -0.4879 0 0 -1.797 0 1.0982 1.501 -21 0 -0.6918 0 0 0.2421 0 1.417 1.501 -22 -0.5835 1.122 0.3978 1.3997 0.7756 0 1.417 1.101 -23 0 0 0 0 0 0 1.417 1.53 -24 0 0 0 0 0 0 1.501 1.101 -25 0 0 0 0 0 0 1.501 1.53 -26 0.213 0.312 0.0777 0.213 0.312 0.0777 1.101 1.101 -27 0.0814 0.0591 0.2219 0.2486 0.2422 -0.0925 1.101 1.53 -28 0 0 0 0 0 0 1.53 1.501 -29 0.2486 0.2422 -0.0925 0.0814 0.0591 0.2219 1.53 1.101 -30 -0.0732 0 0 -0.0732 0 0 1.53 1.53 -31 0 0 0 0 0 0 1.101 1.501 -32 0.213 0.312 0.0777 0.213 0.312 0.0777 1.101 1.101 -33 0.0814 0.0591 0.2219 0.2486 0.2422 -0.0925 1.101 1.53 -34 0 0 0 0 0 0 1.53 1.501 -35 0.2486 0.2422 -0.0925 0.0814 0.0591 0.2219 1.53 1.101 -36 -0.0732 0 0 -0.0732 0 0 1.53 1.53 - -MiddleBondTorsion Coeffs - -1 0 3.9421 0 1.417 -2 0 -1.1521 0 1.417 -3 0 9.1792 0 1.417 -4 27.5989 -2.312 0 1.417 -5 0 4.8228 0 1.417 -6 0 0 0 1.501 -7 0 0 0 1.501 -8 0 0 0 1.34 -9 0.8558 6.3911 0 1.34 -10 0 3.9421 0 1.417 -11 0 9.1792 0 1.417 -12 -5.5679 1.4083 0.301 1.501 -13 0 0 0 1.501 -14 0 0 0 1.53 -15 -14.261 -0.5322 -0.4864 1.53 -16 -14.879 -3.6581 -0.3138 1.53 -17 0 0 0 1.53 -18 -14.879 -3.6581 -0.3138 1.53 -19 -17.787 -7.1877 0 1.53 -20 0 3.9421 0 1.417 -21 0 9.1792 0 1.417 -22 -5.5679 1.4083 0.301 1.501 -23 0 0 0 1.501 -24 0 0 0 1.53 -25 0 0 0 1.53 -26 -14.261 -0.5322 -0.4864 1.53 -27 -14.879 -3.6581 -0.3138 1.53 -28 0 0 0 1.53 -29 -14.879 -3.6581 -0.3138 1.53 -30 -17.787 -7.1877 0 1.53 -31 0 0 0 1.53 -32 -14.261 -0.5322 -0.4864 1.53 -33 -14.879 -3.6581 -0.3138 1.53 -34 0 0 0 1.53 -35 -14.879 -3.6581 -0.3138 1.53 -36 -17.787 -7.1877 0 1.53 - -BondBond13 Coeffs - -1 0.8743 1.0982 1.501 -2 -6.2741 1.417 1.0982 -3 2.5085 1.417 1.501 -4 53 1.417 1.417 -5 -1.7077 1.0982 1.0982 -6 0 1.417 1.0883 -7 0 1.417 1.34 -8 0 1.501 1.0883 -9 0 1.0883 1.0883 -10 0.8743 1.0982 1.501 -11 2.5085 1.417 1.501 -12 -3.4826 1.417 1.101 -13 0 1.417 1.53 -14 0 1.501 1.101 -15 0 1.101 1.101 -16 0 1.53 1.101 -17 0 1.501 1.53 -18 0 1.101 1.53 -19 0 1.53 1.53 -20 0.8743 1.0982 1.501 -21 2.5085 1.417 1.501 -22 -3.4826 1.417 1.101 -23 0 1.417 1.53 -24 0 1.501 1.101 -25 0 1.501 1.53 -26 0 1.101 1.101 -27 0 1.101 1.53 -28 0 1.53 1.501 -29 0 1.53 1.101 -30 0 1.53 1.53 -31 0 1.101 1.501 -32 0 1.101 1.101 -33 0 1.101 1.53 -34 0 1.53 1.501 -35 0 1.53 1.101 -36 0 1.53 1.53 - -AngleTorsion Coeffs - -1 0 3.4601 0 0 -0.1242 0 117.94 120.05 -2 0 2.5014 0 0 2.7147 0 118.9 117.94 -3 0 3.8987 0 0 -4.4683 0 118.9 120.05 -4 1.9767 1.0239 0 1.9767 1.0239 0 118.9 118.9 -5 0 2.4501 0 0 2.4501 0 117.94 117.94 -6 0 0 0 0 0 0 120.05 111 -7 0 0 0 0 0 0 120.05 108.4 -8 0 0 0 0 0 0 108.4 124.88 -9 -1.8911 3.254 0 -1.8911 3.254 0 124.88 124.88 -10 0 3.4601 0 0 -0.1242 0 117.94 120.05 -11 0 3.8987 0 0 -4.4683 0 118.9 120.05 -12 0.2251 0.6548 0.1237 4.6266 0.1632 0.0461 120.05 111 -13 0 0 0 0 0 0 120.05 108.4 -14 0 0 0 0 0 0 108.4 110.77 -15 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.77 110.77 -16 -0.2454 0 -0.1136 0.3113 0.4516 -0.1988 112.67 110.77 -17 0 0 0 0 0 0 108.4 112.67 -18 0.3113 0.4516 -0.1988 -0.2454 0 -0.1136 110.77 112.67 -19 0.3886 -0.3139 0.1389 0.3886 -0.3139 0.1389 112.67 112.67 -20 0 3.4601 0 0 -0.1242 0 117.94 120.05 -21 0 3.8987 0 0 -4.4683 0 118.9 120.05 -22 0.2251 0.6548 0.1237 4.6266 0.1632 0.0461 120.05 111 -23 0 0 0 0 0 0 120.05 108.4 -24 0 0 0 0 0 0 108.4 110.77 -25 0 0 0 0 0 0 108.4 112.67 -26 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.77 110.77 -27 0.3113 0.4516 -0.1988 -0.2454 0 -0.1136 110.77 112.67 -28 0 0 0 0 0 0 112.67 108.4 -29 -0.2454 0 -0.1136 0.3113 0.4516 -0.1988 112.67 110.77 -30 0.3886 -0.3139 0.1389 0.3886 -0.3139 0.1389 112.67 112.67 -31 0 0 0 0 0 0 110.77 108.4 -32 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.77 110.77 -33 0.3113 0.4516 -0.1988 -0.2454 0 -0.1136 110.77 112.67 -34 0 0 0 0 0 0 112.67 108.4 -35 -0.2454 0 -0.1136 0.3113 0.4516 -0.1988 112.67 110.77 -36 0.3886 -0.3139 0.1389 0.3886 -0.3139 0.1389 112.67 112.67 + 1 0.0000 0.0000 1.8769 0.0000 0.0000 0.0000 + 2 0.0000 0.0000 3.9661 0.0000 0.0000 0.0000 + 3 8.3667 0.0000 1.1932 0.0000 0.0000 0.0000 + 4 0.0000 0.0000 4.4072 0.0000 0.0000 0.0000 + 5 0.0000 0.0000 1.5590 0.0000 0.0000 0.0000 + 6 -0.0228 0.0000 0.0280 0.0000 -0.1863 0.0000 + 7 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 + 8 -0.1432 0.0000 0.0617 0.0000 -0.1083 0.0000 + 9 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000 + 10 -0.2802 0.0000 -0.0678 0.0000 -0.0122 0.0000 + 11 -0.2801 0.0000 -0.0678 0.0000 -0.0122 0.0000 + 12 0.0000 0.0000 0.0316 0.0000 -0.1681 0.0000 + 13 0.0000 0.0000 0.0514 0.0000 -0.1430 0.0000 Improper Coeffs # class2 -1 4.8912 0 -2 7.8153 0 -3 0 0 -4 2.8561 0 -5 7.8153 0 -6 0 0 -7 0 0 -8 7.8153 0 -9 0 0 + 1 4.8912 0.0000 + 2 0.0000 0.0000 + 3 7.8153 0.0000 + 4 0.0000 0.0000 + +BondBond Coeffs + + 1 1.0795 1.0982 1.4170 + 2 68.2856 1.4170 1.4170 + 3 0.0000 1.5010 1.5300 + 4 3.3872 1.1010 1.5300 + 5 2.9168 1.1010 1.5010 + 6 3.3872 1.1010 1.5300 + 7 5.3316 1.1010 1.1010 + 8 0.0000 1.5300 1.5300 + 9 12.0676 1.4170 1.5010 + 10 0.0000 1.5300 1.5300 + +BondAngle Coeffs + + 1 24.2183 20.0033 1.0982 1.4170 + 2 28.8708 28.8708 1.4170 1.4170 + 3 0.0000 0.0000 1.5010 1.5300 + 4 11.4210 20.7540 1.1010 1.5300 + 5 11.7717 26.4608 1.1010 1.5010 + 6 11.4210 20.7540 1.1010 1.5300 + 7 18.1030 18.1030 1.1010 1.1010 + 8 8.0160 8.0160 1.5300 1.5300 + 9 31.0771 47.0579 1.4170 1.5010 + 10 8.0160 8.0160 1.5300 1.5300 AngleAngle Coeffs -1 0 0 0 118.9 117.94 117.94 -2 0 0 0 118.9 120.05 120.05 -3 0 0 0 111 124.88 108.4 -4 0 0 0 115.49 124.88 124.88 -5 0 0 0 118.9 120.05 120.05 -6 0 0 0 107.66 110.77 110.77 -7 0 0 0 111 110.77 108.4 -8 0 0 0 118.9 120.05 120.05 -9 0 0 0 111 110.77 108.4 + 1 0.0000 0.0000 0.0000 117.9400 118.9000 117.9400 + 2 0.0000 0.0000 0.0000 111.0000 108.4000 110.7700 + 3 0.0000 0.0000 0.0000 118.9000 120.0500 120.0500 + 4 0.0000 0.0000 0.0000 107.6600 110.7700 110.7700 + +AngleAngleTorsion Coeffs + + 1 0.3598 117.9400 117.9400 + 2 -4.8141 117.9400 118.9000 + 3 0.0000 118.9000 118.9000 + 4 -14.4097 118.9000 120.0500 + 5 4.4444 117.9400 120.0500 + 6 0.0000 108.4000 110.7700 + 7 0.0000 108.4000 112.6700 + 8 -12.5640 110.7700 110.7700 + 9 -16.1640 110.7700 112.6700 + 10 0.0000 120.0500 108.4000 + 11 -5.8888 120.0500 111.0000 + 12 -16.1640 112.6700 110.7700 + 13 -22.0450 112.6700 112.6700 + +EndBondTorsion Coeffs + +1 0.0000 -0.6890 0.0000 0.0000 -0.6890 0.0000 1.0982 1.0982 +2 0.0000 -0.4669 0.0000 0.0000 -6.8958 0.0000 1.0982 1.4170 +3 -0.1185 6.3204 0.0000 -0.1185 6.3204 0.0000 1.4170 1.4170 +4 0.0000 -0.6918 0.0000 0.0000 0.2421 0.0000 1.4170 1.5010 +5 0.0000 -0.4879 0.0000 0.0000 -1.7970 0.0000 1.0982 1.5010 +6 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.5010 1.1010 +7 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.5010 1.5300 +8 0.2130 0.3120 0.0777 0.2130 0.3120 0.0777 1.1010 1.1010 +9 0.0814 0.0591 0.2219 0.2486 0.2422 -0.0925 1.1010 1.5300 +10 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.4170 1.5300 +11 -0.5835 1.1220 0.3978 1.3997 0.7756 0.0000 1.4170 1.1010 +12 0.2486 0.2422 -0.0925 0.0814 0.0591 0.2219 1.5300 1.1010 +13 -0.0732 0.0000 0.0000 -0.0732 0.0000 0.0000 1.5300 1.5300 + +MiddleBondTorsion Coeffs + + 1 0.0000 4.8228 0.0000 1.4170 + 2 0.0000 -1.1521 0.0000 1.4170 + 3 27.5989 -2.3120 0.0000 1.4170 + 4 0.0000 9.1792 0.0000 1.4170 + 5 0.0000 3.9421 0.0000 1.4170 + 6 0.0000 0.0000 0.0000 1.5300 + 7 0.0000 0.0000 0.0000 1.5300 + 8 -14.2610 -0.5322 -0.4864 1.5300 + 9 -14.8790 -3.6581 -0.3138 1.5300 + 10 0.0000 0.0000 0.0000 1.5010 + 11 -5.5679 1.4083 0.3010 1.5010 + 12 -14.8790 -3.6581 -0.3138 1.5300 + 13 -17.7870 -7.1877 0.0000 1.5300 + +BondBond13 Coeffs + + 1 -1.7077 1.0982 1.0982 + 2 -6.2741 1.0982 1.4170 + 3 53.0000 1.4170 1.4170 + 4 2.5085 1.4170 1.5010 + 5 0.8743 1.0982 1.5010 + 6 0.0000 1.5010 1.1010 + 7 0.0000 1.5010 1.5300 + 8 0.0000 1.1010 1.1010 + 9 0.0000 1.1010 1.5300 + 10 0.0000 1.4170 1.5300 + 11 -3.4826 1.4170 1.1010 + 12 0.0000 1.5300 1.1010 + 13 0.0000 1.5300 1.5300 + +AngleTorsion Coeffs + + 1 0.0000 2.4501 0.0000 0.0000 2.4501 0.0000 117.9400 117.9400 + 2 0.0000 2.7147 0.0000 0.0000 2.5014 0.0000 117.9400 118.9000 + 3 1.9767 1.0239 0.0000 1.9767 1.0239 0.0000 118.9000 118.9000 + 4 0.0000 3.8987 0.0000 0.0000 -4.4683 0.0000 118.9000 120.0500 + 5 0.0000 3.4601 0.0000 0.0000 -0.1242 0.0000 117.9400 120.0500 + 6 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 108.4000 110.7700 + 7 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 108.4000 112.6700 + 8 -0.8085 0.5569 -0.2466 -0.8085 0.5569 -0.2466 110.7700 110.7700 + 9 0.3113 0.4516 -0.1988 -0.2454 0.0000 -0.1136 110.7700 112.6700 + 10 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 120.0500 108.4000 + 11 0.2251 0.6548 0.1237 4.6266 0.1632 0.0461 120.0500 111.0000 + 12 -0.2454 0.0000 -0.1136 0.3113 0.4516 -0.1988 112.6700 110.7700 + 13 0.3886 -0.3139 0.1389 0.3886 -0.3139 0.1389 112.6700 112.6700 Atoms # full -44 1 2 3.5400000000000001e-02 6.1476397222913839e+01 8.2376490601205234e+01 6.0906939115836181e+01 -45 1276 2 3.5400000000000001e-02 5.8398688202244472e+01 8.0172948526664996e+01 6.2115536813582672e+01 -46 1276 6 -6.9599999999999995e-02 5.9489073989392523e+01 8.0264057167571636e+01 6.1984002598976552e+01 -48 1276 2 3.5400000000000001e-02 5.9675170230342431e+01 8.0048052449390738e+01 6.0920159395372401e+01 -47 1276 2 1.2370000000000000e-01 5.9297455513100488e+01 8.3187777608476154e+01 5.9645157256520122e+01 -18 1 5 -1.8200000000000001e-02 6.2426251430535707e+01 8.2055473568260709e+01 6.2971661388612958e+01 -19 1 6 -6.9599999999999995e-02 6.1399255844467369e+01 8.1794665295860213e+01 6.1821819828185660e+01 -21 1 1 -1.2900000000000000e-01 6.4032918371445831e+01 8.0190179089286701e+01 6.3021564712316334e+01 -22 1 1 2.6599999999999999e-02 6.3672975135915053e+01 8.1418558650051665e+01 6.2448012627881994e+01 -23 1 2 3.5400000000000001e-02 6.1545198223694939e+01 8.0836309422842305e+01 6.1349823957467130e+01 -27 1276 2 5.1600000000000000e-02 5.9809503696580933e+01 8.1831265916389881e+01 6.3253745193271065e+01 -28 1276 5 -1.8200000000000001e-02 5.9900307947967441e+01 8.1677453781363639e+01 6.2190757403657820e+01 -31 1276 2 1.2370000000000000e-01 5.8050043823867973e+01 8.2698312265456622e+01 6.3667111329534436e+01 -38 1 2 1.2370000000000000e-01 6.3754126973935612e+01 7.9931147303963002e+01 6.4022259163067275e+01 -20 1 2 1.2370000000000000e-01 6.4070158368422781e+01 8.2950071388392274e+01 6.1042631212883315e+01 -24 1 1 -1.2900000000000000e-01 6.4337973861569580e+01 8.1916618276489871e+01 6.1387866780102470e+01 -37 1 2 1.4030000000000001e-01 6.5360115866618415e+01 7.8586112104863830e+01 6.3004997314380716e+01 -39 1 1 -1.7340000000000000e-01 6.5018338085325610e+01 7.9478260591306125e+01 6.2440745569712817e+01 -40 1 1 -1.1340000000000000e-01 6.5628759887796605e+01 7.9941156332165264e+01 6.1248476296558067e+01 -41 1 1 -1.7340000000000000e-01 6.5247995680260402e+01 8.1172439250598345e+01 6.0753045571239831e+01 -42 1 2 1.2880000000000000e-01 6.6569600059599281e+01 7.9514748976494360e+01 6.0810611807135601e+01 -43 1 2 1.4030000000000001e-01 6.5780165393063371e+01 8.1570974991007958e+01 5.9850915261812396e+01 -9 1276 2 1.2880000000000000e-01 5.5651795605743445e+01 8.5074472139235127e+01 6.1094480497979262e+01 -30 1276 2 1.4030000000000001e-01 5.6082982679196888e+01 8.3912863624076010e+01 6.3351889697403472e+01 -33 1276 1 -1.7340000000000000e-01 5.6718133911388506e+01 8.3758479063002000e+01 6.2493293749545209e+01 -34 1276 1 -1.1340000000000000e-01 5.6498352105218459e+01 8.4426576393179090e+01 6.1290147608586011e+01 -6 3822 1 -1.7340000000000000e-01 6.3308103537340351e+01 8.7713509787622499e+01 6.4643082313868433e+01 -7 3822 1 -1.2900000000000000e-01 6.3010291684764312e+01 8.6423650045069493e+01 6.4252844241495922e+01 -8 3822 2 1.2370000000000000e-01 6.2089199187020355e+01 8.6309198636296912e+01 6.3711263099850854e+01 -10 1276 2 1.4030000000000001e-01 5.7266131308654970e+01 8.4599328362003035e+01 5.9281511478144402e+01 -11 3822 2 3.5400000000000001e-02 6.1694306618059791e+01 8.3823470438280594e+01 6.3778953909925114e+01 -12 3822 5 -1.8200000000000001e-02 6.3814926998838651e+01 8.3900077798460728e+01 6.4108991789590448e+01 -13 3822 6 -6.9599999999999995e-02 6.2604540882379787e+01 8.3491998603381077e+01 6.3249610918984622e+01 -14 3822 2 1.2370000000000000e-01 6.5739253131027880e+01 8.4813736128157771e+01 6.5351692111169555e+01 -15 3822 1 -1.2900000000000000e-01 6.5071144269009466e+01 8.5646783550482454e+01 6.5086813218945636e+01 -16 3822 1 2.6599999999999999e-02 6.3957099792282079e+01 8.5375816595044753e+01 6.4385073943729708e+01 -17 1 2 5.1600000000000000e-02 6.2256484483973310e+01 8.1576962161157596e+01 6.3963984654065122e+01 -26 3822 2 5.1600000000000000e-02 6.4196825763126355e+01 8.3291442832977836e+01 6.4907094488854057e+01 -29 1276 1 2.6599999999999999e-02 5.8784742332505303e+01 8.2766055380197670e+01 6.1667239692876961e+01 -32 1276 1 -1.2900000000000000e-01 5.7836199787435064e+01 8.3005060229118428e+01 6.2669788306756018e+01 -35 1276 1 -1.2900000000000000e-01 5.8572661840325132e+01 8.3404075689965083e+01 6.0443288532625175e+01 -36 1276 1 -1.7340000000000000e-01 5.7380616699226330e+01 8.4134680429976896e+01 6.0248710539932475e+01 -25 3822 2 3.5400000000000001e-02 6.2750675036816460e+01 8.3891633300878468e+01 6.2249429178485677e+01 -5 3822 2 1.4030000000000001e-01 6.2626160082050376e+01 8.8416565740835182e+01 6.4093918967496805e+01 -1 3822 2 1.2880000000000000e-01 6.4863557606529355e+01 8.9096029197548390e+01 6.5342927535537825e+01 -2 3822 1 -1.1340000000000000e-01 6.4627442641031166e+01 8.8047381925321190e+01 6.5138073202291650e+01 -3 3822 2 1.4030000000000001e-01 6.6470254992065406e+01 8.6991893750821745e+01 6.5857474890608984e+01 -4 3822 1 -1.7340000000000000e-01 6.5416488888088338e+01 8.6963894801200169e+01 6.5357641085394278e+01 - -Velocities - -44 -1.1274099342391698e-02 2.8614364731871914e-02 7.8116535486555949e-03 -45 2.3164382404151666e-03 3.9815732957733160e-03 -2.9971878581527899e-02 -46 -7.1653099619954563e-03 4.5491360587300133e-04 4.9898614093692017e-03 -48 9.8069086061434527e-03 4.0008139512159270e-03 6.2934259772882122e-03 -47 2.2646445306743783e-03 1.3029071608409702e-03 4.2232440120174040e-02 -18 7.0040064100195757e-03 3.2877451206009701e-03 -3.5376010407568422e-04 -19 -1.3998188760009689e-02 7.2238210565990146e-03 7.7956220633332383e-03 -21 3.1954292320462373e-03 -2.9717583309420764e-03 -3.1753395094325522e-03 -22 5.2997643939121201e-03 -2.9646963088534335e-03 -4.1351926198204894e-03 -23 7.6443400078766528e-03 4.0358953976530103e-02 -2.6684706183248367e-02 -27 1.9261652416455359e-03 -1.1632914130150688e-02 1.0061732021630769e-02 -28 -8.2251676802878315e-03 -1.5111873066969876e-04 1.3808893565582731e-02 -31 5.2475840572179860e-03 1.8266996572138715e-02 2.3453280610166885e-03 -38 -2.0343905130199073e-02 3.2815536859276281e-02 3.6511922534330152e-03 -20 2.2914549087537126e-02 1.4424503744223915e-02 2.1708279654645496e-03 -24 -2.4717233344142471e-03 1.2966123098719246e-02 8.1261459853411936e-03 -37 -2.4547379584186218e-02 -3.0213966592845171e-02 -3.1437442951939183e-02 -39 2.5476117829076835e-03 1.2743160680987653e-03 1.8775880208113892e-03 -40 -6.9216508143939990e-03 1.0986173624795060e-02 8.4543093049661480e-03 -41 -6.9641432145561661e-03 3.4497795547843439e-03 -6.5914679936187716e-03 -42 -1.6682931637687005e-02 -7.9952140358728052e-03 -5.4993265930488526e-02 -43 -1.2747392921213267e-03 -8.9033092043203244e-03 -1.4285400545629027e-02 -9 -4.6235166357676289e-03 -1.3071850427027999e-02 -1.4097407987100977e-02 -30 -1.0949617396609294e-02 2.8255703113196974e-03 1.7171748232322353e-02 -33 -6.1375812469323665e-03 -2.4748644899411924e-03 -9.4761978149296138e-03 -34 1.3676079846441525e-03 5.6076140293943458e-03 4.3217204641336267e-03 -6 -1.0264635053701928e-02 6.5278337056107680e-03 7.0056151148588212e-04 -7 -8.7519451205145676e-03 -4.6476440106580945e-03 2.5970484253527112e-03 -8 2.1377395557690311e-02 -3.3261274153819453e-03 -1.0112266596677577e-02 -10 -3.5793767912309253e-02 -4.7139872292323019e-02 -1.6709528481405608e-02 -11 8.5071485795589590e-03 9.9402848610678270e-03 -3.8088596341056854e-03 -12 -7.1678159384257103e-04 -6.9164463557228907e-04 -6.4073519808107186e-03 -13 -4.8443902657902991e-03 -1.1919190682985097e-03 6.3946846087726637e-03 -14 1.4810157483257907e-02 1.9829623839419017e-03 -2.7393844990063056e-02 -15 2.4171850935506777e-03 8.5003135180758520e-03 -1.4373227798951704e-03 -16 2.7567342910947553e-03 4.7168484476890456e-03 -5.5131873288712992e-03 -17 -3.8456662730386774e-02 2.0220106671151108e-02 -1.3822049134399602e-02 -26 2.7415414728694614e-02 1.4392155257037418e-03 -6.7281635499082748e-03 -29 2.8284983560440745e-03 2.8809942505517976e-03 -9.0489583066552114e-04 -32 -3.8543634697614316e-03 4.6751647301899795e-03 4.2171867397204537e-03 -35 -8.6957974827209118e-03 -4.4615282666186267e-04 -2.6571026120482824e-03 -36 9.4881057996863086e-04 -7.5665878069688429e-03 2.0333670960646154e-03 -25 1.8105924111310519e-02 -8.6933495274689535e-03 -1.9695291360338044e-04 -5 -5.0447438383189585e-03 -4.5665146331657552e-02 1.0653751333175230e-02 -1 -1.7372868398038824e-02 -2.3625357536259349e-03 1.2220266128368908e-02 -2 3.7050246021929395e-03 -1.0236943515935205e-03 7.2206774682170580e-03 -3 2.3669435799326944e-02 2.7891427939155597e-02 -6.7091036888174346e-03 -4 3.4910623999263577e-03 2.6370880132825258e-03 -6.4694788112864129e-03 + 1 3 1 0.128800 64.863555908 89.096031189 65.342926025 0 0 0 # hc + 2 3 2 -0.113400 64.627441406 88.047378540 65.138076782 0 0 0 # cp + 3 3 1 0.140300 66.470252991 86.991889954 65.857475281 0 0 0 # hc + 4 3 2 -0.173400 65.416488647 86.963897705 65.357643127 0 0 0 # cp + 5 3 1 0.140300 62.626159668 88.416564941 64.093917847 0 0 0 # hc + 6 3 2 -0.173400 63.308101654 87.713508606 64.643081665 0 0 0 # cp + 7 3 2 -0.129000 63.010292053 86.423652649 64.252845764 0 0 0 # cp + 8 3 1 0.123700 62.089199066 86.309196472 63.711261749 0 0 0 # hc + 9 2 1 0.128800 55.651794434 85.074470520 61.094478607 0 0 0 # hc + 10 2 1 0.140300 57.266132355 84.599327087 59.281513214 0 0 0 # hc + 11 3 1 0.035400 61.694305420 83.823471069 63.778953552 0 0 0 # hc + 12 3 3 -0.018200 63.814926147 83.900077820 64.108993530 0 0 0 # c1 + 13 3 4 -0.069600 62.604541779 83.491996765 63.249610901 0 0 0 # c2 + 14 3 1 0.123700 65.739250183 84.813735962 65.351692200 0 0 0 # hc + 15 3 2 -0.129000 65.071144104 85.646781921 65.086814880 0 0 0 # cp + 16 3 2 0.026600 63.957099915 85.375816345 64.385070801 0 0 0 # cp + 17 1 1 0.051600 62.256484985 81.576965332 63.963985443 0 0 0 # hc + 18 1 3 -0.018200 62.426250458 82.055473328 62.971660614 0 0 0 # c1 + 19 1 4 -0.069600 61.399257660 81.794662476 61.821819305 0 0 0 # c2 + 20 1 1 0.123700 64.070159912 82.950073242 61.042633057 0 0 0 # hc + 21 1 2 -0.129000 64.032920837 80.190177917 63.021564484 0 0 0 # cp + 22 1 2 0.026600 63.672973633 81.418556213 62.448013306 0 0 0 # cp + 23 1 1 0.035400 61.545196533 80.836311340 61.349822998 0 0 0 # hc + 24 1 2 -0.129000 64.337974548 81.916618347 61.387866974 0 0 0 # cp + 25 3 1 0.035400 62.750675201 83.891632080 62.249427795 0 0 0 # hc + 26 3 1 0.051600 64.196823120 83.291442871 64.907096863 0 0 0 # hc + 27 2 1 0.051600 59.809505463 81.831268311 63.253746033 0 0 0 # hc + 28 2 3 -0.018200 59.900306702 81.677452087 62.190757751 0 0 0 # c1 + 29 2 2 0.026600 58.784740448 82.766052246 61.667240143 0 0 0 # cp + 30 2 1 0.140300 56.082981110 83.912864685 63.351890564 0 0 0 # hc + 31 2 1 0.123700 58.050045013 82.698310852 63.667110443 0 0 0 # hc + 32 2 2 -0.129000 57.836200714 83.005058289 62.669788361 0 0 0 # cp + 33 2 2 -0.173400 56.718132019 83.758476257 62.493293762 0 0 0 # cp + 34 2 2 -0.113400 56.498352051 84.426574707 61.290145874 0 0 0 # cp + 35 2 2 -0.129000 58.572662354 83.404075623 60.443286896 0 0 0 # cp + 36 2 2 -0.173400 57.380615234 84.134681702 60.248710632 0 0 0 # cp + 37 1 1 0.140300 65.360115051 78.586112976 63.004997253 0 0 0 # hc + 38 1 1 0.123700 63.754127502 79.931144714 64.022262573 0 0 0 # hc + 39 1 2 -0.173400 65.018341064 79.478263855 62.440746307 0 0 0 # cp + 40 1 2 -0.113400 65.628761292 79.941154480 61.248477936 0 0 0 # cp + 41 1 2 -0.173400 65.247993469 81.172439575 60.753044128 0 0 0 # cp + 42 1 1 0.128800 66.569602966 79.514747620 60.810611725 0 0 0 # hc + 43 1 1 0.140300 65.780166626 81.570976257 59.850914001 0 0 0 # hc + 44 1 1 0.035400 61.476398468 82.376487732 60.906940460 0 0 0 # hc + 45 2 1 0.035400 58.398689270 80.172950745 62.115535736 0 0 0 # hc + 46 2 4 -0.069600 59.489074707 80.264060974 61.984001160 0 0 0 # c2 + 47 2 1 0.123700 59.297454834 83.187774658 59.645156860 0 0 0 # hc + 48 2 1 0.035400 59.675170898 80.048049927 60.920158386 0 0 0 # hc Bonds -1 10 44 19 -2 10 45 46 -3 10 48 46 -4 9 19 18 -5 1 21 38 -6 2 21 22 -7 2 21 39 -8 7 22 18 -9 2 22 24 -10 10 23 19 -11 8 27 28 -12 9 28 46 -13 9 28 19 -14 1 24 20 -15 2 24 41 -16 1 39 37 -17 1 40 42 -18 2 40 39 -19 1 41 43 -20 2 41 40 -21 1 33 30 -22 1 34 9 -23 2 34 33 -24 1 6 5 -25 2 6 2 -26 1 7 8 -27 2 7 6 -28 10 11 13 -29 13 12 13 -30 9 13 18 -31 1 15 14 -32 2 15 16 -33 2 15 4 -34 11 16 12 -35 2 16 7 -36 8 17 18 -37 12 26 12 -38 7 29 28 -39 2 29 35 -40 1 32 31 -41 2 32 29 -42 2 32 33 -43 1 35 47 -44 2 35 36 -45 1 36 10 -46 2 36 34 -47 10 25 13 -48 1 2 1 -49 2 2 4 -50 1 4 3 + 1 1 1 2 + 2 2 2 6 + 3 2 2 4 + 4 1 3 4 + 5 2 4 15 + 6 1 5 6 + 7 2 6 7 + 8 1 8 7 + 9 2 7 16 + 10 1 9 34 + 11 1 10 36 + 12 3 11 13 + 13 4 12 13 + 14 5 16 12 + 15 6 26 12 + 16 4 18 13 + 17 3 25 13 + 18 1 14 15 + 19 2 15 16 + 20 6 17 18 + 21 4 18 19 + 22 5 22 18 + 23 3 44 19 + 24 3 23 19 + 25 4 28 19 + 26 1 20 24 + 27 1 38 21 + 28 2 21 22 + 29 2 21 39 + 30 2 22 24 + 31 2 24 41 + 32 6 27 28 + 33 4 28 46 + 34 5 29 28 + 35 2 29 35 + 36 2 29 32 + 37 1 30 33 + 38 1 31 32 + 39 2 32 33 + 40 2 33 34 + 41 2 34 36 + 42 1 47 35 + 43 2 35 36 + 44 1 37 39 + 45 2 39 40 + 46 1 42 40 + 47 2 40 41 + 48 1 43 41 + 49 3 45 46 + 50 3 48 46 Angles -1 14 45 46 28 -2 14 48 46 28 -3 15 45 46 48 -4 11 22 18 13 -5 12 17 18 13 -6 13 13 18 19 -7 10 22 18 17 -8 11 22 18 19 -9 12 17 18 19 -10 16 28 19 18 -11 14 44 19 28 -12 14 23 19 28 -13 14 44 19 18 -14 14 23 19 18 -15 15 44 19 23 -16 1 22 21 38 -17 1 39 21 38 -18 2 22 21 39 -19 9 21 22 18 -20 2 21 22 24 -21 9 24 22 18 -22 10 29 28 27 -23 11 29 28 46 -24 11 29 28 19 -25 12 27 28 46 -26 12 27 28 19 -27 13 46 28 19 -28 1 22 24 20 -29 2 22 24 41 -30 1 41 24 20 -31 2 21 39 40 -32 1 21 39 37 -33 1 40 39 37 -34 1 41 40 42 -35 2 41 40 39 -36 1 39 40 42 -37 1 24 41 43 -38 2 24 41 40 -39 1 40 41 43 -40 2 32 33 34 -41 1 32 33 30 -42 1 34 33 30 -43 1 36 34 9 -44 2 36 34 33 -45 1 33 34 9 -46 1 7 6 5 -47 2 7 6 2 -48 1 2 6 5 -49 1 16 7 8 -50 2 16 7 6 -51 1 6 7 8 -52 18 16 12 26 -53 19 16 12 13 -54 20 26 12 13 -55 21 25 13 12 -56 21 11 13 12 -57 22 12 13 18 -58 15 25 13 11 -59 14 25 13 18 -60 14 11 13 18 -61 1 16 15 14 -62 1 4 15 14 -63 2 16 15 4 -64 17 15 16 12 -65 2 15 16 7 -66 17 7 16 12 -67 9 32 29 28 -68 2 32 29 35 -69 9 35 29 28 -70 1 29 32 31 -71 1 33 32 31 -72 2 29 32 33 -73 1 29 35 47 -74 2 29 35 36 -75 1 36 35 47 -76 1 35 36 10 -77 2 35 36 34 -78 1 34 36 10 -79 1 6 2 1 -80 2 6 2 4 -81 1 4 2 1 -82 2 15 4 2 -83 1 15 4 3 -84 1 2 4 3 + 1 1 1 2 6 + 2 1 1 2 4 + 3 2 6 2 4 + 4 1 3 4 2 + 5 2 2 4 15 + 6 1 3 4 15 + 7 1 5 6 2 + 8 2 2 6 7 + 9 1 5 6 7 + 10 1 8 7 6 + 11 2 6 7 16 + 12 1 8 7 16 + 13 3 16 12 13 + 14 4 26 12 13 + 15 5 26 12 16 + 16 6 11 13 12 + 17 6 11 13 18 + 18 7 11 13 25 + 19 8 12 13 18 + 20 6 25 13 12 + 21 6 25 13 18 + 22 1 14 15 4 + 23 2 4 15 16 + 24 1 14 15 16 + 25 9 7 16 12 + 26 2 7 16 15 + 27 9 15 16 12 + 28 4 17 18 13 + 29 10 13 18 19 + 30 3 22 18 13 + 31 4 17 18 19 + 32 5 17 18 22 + 33 3 22 18 19 + 34 6 44 19 18 + 35 6 23 19 18 + 36 8 18 19 28 + 37 7 44 19 23 + 38 6 44 19 28 + 39 6 23 19 28 + 40 1 38 21 22 + 41 1 38 21 39 + 42 2 22 21 39 + 43 9 21 22 18 + 44 9 24 22 18 + 45 2 21 22 24 + 46 1 20 24 22 + 47 1 20 24 41 + 48 2 22 24 41 + 49 4 27 28 19 + 50 10 19 28 46 + 51 3 29 28 19 + 52 4 27 28 46 + 53 5 27 28 29 + 54 3 29 28 46 + 55 9 35 29 28 + 56 9 32 29 28 + 57 2 35 29 32 + 58 1 31 32 29 + 59 2 29 32 33 + 60 1 31 32 33 + 61 1 30 33 32 + 62 1 30 33 34 + 63 2 32 33 34 + 64 1 9 34 33 + 65 1 9 34 36 + 66 2 33 34 36 + 67 1 47 35 29 + 68 2 29 35 36 + 69 1 47 35 36 + 70 1 10 36 34 + 71 1 10 36 35 + 72 2 34 36 35 + 73 1 37 39 21 + 74 2 21 39 40 + 75 1 37 39 40 + 76 1 42 40 39 + 77 2 39 40 41 + 78 1 42 40 41 + 79 2 24 41 40 + 80 1 43 41 24 + 81 1 43 41 40 + 82 6 45 46 28 + 83 6 48 46 28 + 84 7 45 46 48 Dihedrals -1 34 18 19 28 29 -2 31 44 19 28 29 -3 31 23 19 28 29 -4 35 18 19 28 27 -5 32 44 19 28 27 -6 32 23 19 28 27 -7 36 18 19 28 46 -8 33 44 19 28 46 -9 33 23 19 28 46 -10 36 28 19 18 13 -11 33 44 19 18 13 -12 33 23 19 18 13 -13 34 28 19 18 22 -14 31 44 19 18 22 -15 31 23 19 18 22 -16 35 28 19 18 17 -17 32 44 19 18 17 -18 32 23 19 18 17 -19 10 38 21 22 18 -20 11 39 21 22 18 -21 4 39 21 22 24 -22 5 38 21 39 37 -23 4 22 21 39 40 -24 2 22 21 39 37 -25 2 24 22 21 38 -26 13 21 22 18 13 -27 12 21 22 18 17 -28 13 21 22 18 19 -29 13 24 22 18 13 -30 12 24 22 18 17 -31 13 24 22 18 19 -32 2 21 22 24 20 -33 4 21 22 24 41 -34 14 29 28 46 45 -35 14 29 28 46 48 -36 15 27 28 46 45 -37 15 27 28 46 48 -38 16 19 28 46 45 -39 16 19 28 46 48 -40 10 20 24 22 18 -41 11 41 24 22 18 -42 2 22 24 41 43 -43 4 22 24 41 40 -44 5 20 24 41 43 -45 2 40 39 21 38 -46 2 21 39 40 42 -47 2 39 40 41 43 -48 4 41 40 39 21 -49 2 41 40 39 37 -50 5 42 40 39 37 -51 2 40 41 24 20 -52 2 24 41 40 42 -53 4 24 41 40 39 -54 5 43 41 40 42 -55 2 34 33 32 31 -56 2 32 33 34 9 -57 2 33 34 36 10 -58 4 36 34 33 32 -59 2 36 34 33 30 -60 5 9 34 33 30 -61 2 2 6 7 8 -62 2 7 6 2 1 -63 4 7 6 2 4 -64 5 5 6 2 1 -65 20 8 7 16 12 -66 21 6 7 16 12 -67 2 16 7 6 5 -68 4 16 7 6 2 -69 5 8 7 6 5 -70 24 16 12 13 25 -71 24 16 12 13 11 -72 25 16 12 13 18 -73 26 26 12 13 25 -74 26 26 12 13 11 -75 27 26 12 13 18 -76 28 12 13 18 22 -77 29 12 13 18 17 -78 30 12 13 18 19 -79 31 25 13 18 22 -80 32 25 13 18 17 -81 33 25 13 18 19 -82 31 11 13 18 22 -83 32 11 13 18 17 -84 33 11 13 18 19 -85 20 14 15 16 12 -86 21 4 15 16 12 -87 4 4 15 16 7 -88 5 14 15 4 3 -89 4 16 15 4 2 -90 2 16 15 4 3 -91 2 7 16 15 14 -92 22 15 16 12 26 -93 23 15 16 12 13 -94 22 7 16 12 26 -95 23 7 16 12 13 -96 2 15 16 7 8 -97 4 15 16 7 6 -98 2 35 29 32 31 -99 12 32 29 28 27 -100 13 32 29 28 46 -101 13 32 29 28 19 -102 12 35 29 28 27 -103 13 35 29 28 46 -104 13 35 29 28 19 -105 2 32 29 35 47 -106 4 32 29 35 36 -107 10 31 32 29 28 -108 11 33 32 29 28 -109 4 33 32 29 35 -110 5 31 32 33 30 -111 4 29 32 33 34 -112 2 29 32 33 30 -113 10 47 35 29 28 -114 11 36 35 29 28 -115 2 29 35 36 10 -116 4 29 35 36 34 -117 5 47 35 36 10 -118 2 34 36 35 47 -119 2 35 36 34 9 -120 4 35 36 34 33 -121 5 10 36 34 9 -122 2 4 2 6 5 -123 4 6 2 4 15 -124 2 6 2 4 3 -125 5 1 2 4 3 -126 2 2 4 15 14 -127 2 15 4 2 1 + 1 1 1 2 6 5 + 2 2 1 2 6 7 + 3 2 5 6 2 4 + 4 3 4 2 6 7 + 5 1 1 2 4 3 + 6 2 1 2 4 15 + 7 2 3 4 2 6 + 8 3 6 2 4 15 + 9 2 14 15 4 2 + 10 3 2 4 15 16 + 11 1 3 4 15 14 + 12 2 3 4 15 16 + 13 2 8 7 6 2 + 14 3 2 6 7 16 + 15 1 5 6 7 8 + 16 2 5 6 7 16 + 17 4 6 7 16 12 + 18 3 6 7 16 15 + 19 5 8 7 16 12 + 20 2 8 7 16 15 + 21 6 16 12 13 11 + 22 7 16 12 13 18 + 23 6 16 12 13 25 + 24 8 26 12 13 11 + 25 9 26 12 13 18 + 26 8 26 12 13 25 + 27 10 7 16 12 13 + 28 10 15 16 12 13 + 29 11 7 16 12 26 + 30 11 15 16 12 26 + 31 8 17 18 13 11 + 32 12 19 18 13 11 + 33 6 22 18 13 11 + 34 9 17 18 13 12 + 35 13 19 18 13 12 + 36 7 22 18 13 12 + 37 8 17 18 13 25 + 38 12 19 18 13 25 + 39 6 22 18 13 25 + 40 3 4 15 16 7 + 41 4 4 15 16 12 + 42 2 14 15 16 7 + 43 5 14 15 16 12 + 44 12 13 18 19 44 + 45 12 13 18 19 23 + 46 13 13 18 19 28 + 47 8 17 18 19 44 + 48 8 17 18 19 23 + 49 9 17 18 19 28 + 50 6 22 18 19 44 + 51 6 22 18 19 23 + 52 7 22 18 19 28 + 53 10 21 22 18 13 + 54 10 24 22 18 13 + 55 11 21 22 18 17 + 56 11 24 22 18 17 + 57 10 21 22 18 19 + 58 10 24 22 18 19 + 59 9 27 28 19 18 + 60 13 46 28 19 18 + 61 7 29 28 19 18 + 62 8 27 28 19 44 + 63 12 46 28 19 44 + 64 6 29 28 19 44 + 65 8 27 28 19 23 + 66 12 46 28 19 23 + 67 6 29 28 19 23 + 68 5 38 21 22 18 + 69 2 38 21 22 24 + 70 4 39 21 22 18 + 71 3 39 21 22 24 + 72 1 38 21 39 37 + 73 2 38 21 39 40 + 74 2 37 39 21 22 + 75 3 22 21 39 40 + 76 5 20 24 22 18 + 77 4 41 24 22 18 + 78 2 20 24 22 21 + 79 3 21 22 24 41 + 80 2 20 24 41 40 + 81 1 20 24 41 43 + 82 3 22 24 41 40 + 83 2 43 41 24 22 + 84 12 19 28 46 45 + 85 12 19 28 46 48 + 86 8 27 28 46 45 + 87 8 27 28 46 48 + 88 6 29 28 46 45 + 89 6 29 28 46 48 + 90 10 35 29 28 19 + 91 10 32 29 28 19 + 92 11 35 29 28 27 + 93 11 32 29 28 27 + 94 10 35 29 28 46 + 95 10 32 29 28 46 + 96 5 47 35 29 28 + 97 4 36 35 29 28 + 98 2 47 35 29 32 + 99 3 32 29 35 36 + 100 5 31 32 29 28 + 101 4 33 32 29 28 + 102 2 31 32 29 35 + 103 3 35 29 32 33 + 104 2 30 33 32 29 + 105 3 29 32 33 34 + 106 1 31 32 33 30 + 107 2 31 32 33 34 + 108 1 30 33 34 9 + 109 2 30 33 34 36 + 110 2 9 34 33 32 + 111 3 32 33 34 36 + 112 1 9 34 36 10 + 113 2 9 34 36 35 + 114 2 10 36 34 33 + 115 3 33 34 36 35 + 116 2 10 36 35 29 + 117 3 29 35 36 34 + 118 1 47 35 36 10 + 119 2 47 35 36 34 + 120 2 42 40 39 21 + 121 3 21 39 40 41 + 122 1 37 39 40 42 + 123 2 37 39 40 41 + 124 3 39 40 41 24 + 125 2 43 41 40 39 + 126 2 42 40 41 24 + 127 1 42 40 41 43 Impropers -1 6 45 46 48 28 -2 1 22 18 17 13 -3 1 22 18 13 19 -4 1 17 18 13 19 -5 1 22 18 17 19 -6 1 44 19 18 28 -7 1 23 19 18 28 -8 1 44 19 23 28 -9 1 44 19 23 18 -10 1 22 21 39 38 -11 5 21 22 24 18 -12 1 29 28 27 46 -13 1 29 28 27 19 -14 1 29 28 46 19 -15 1 27 28 46 19 -16 1 22 24 41 20 -17 1 21 39 40 37 -18 1 41 40 39 42 -19 1 24 41 40 43 -20 1 32 33 34 30 -21 1 36 34 33 9 -22 1 7 6 2 5 -23 1 16 7 6 8 -24 9 16 12 26 13 -25 1 25 13 11 12 -26 1 25 13 12 18 -27 1 11 13 12 18 -28 1 25 13 11 18 -29 1 16 15 4 14 -30 8 15 16 7 12 -31 5 32 29 35 28 -32 1 29 32 33 31 -33 1 29 35 36 47 -34 1 35 36 34 10 -35 1 6 2 4 1 -36 1 15 4 2 3 + 1 1 1 2 6 4 + 2 1 3 4 2 15 + 3 1 5 6 2 7 + 4 1 8 7 6 16 + 5 2 26 12 16 13 + 6 1 14 15 4 16 + 7 3 7 16 15 12 + 8 1 38 21 22 39 + 9 3 21 22 24 18 + 10 1 20 24 22 41 + 11 3 35 29 32 28 + 12 1 31 32 29 33 + 13 1 30 33 32 34 + 14 1 9 34 33 36 + 15 1 47 35 29 36 + 16 1 10 36 34 35 + 17 1 37 39 21 40 + 18 1 42 40 39 41 + 19 1 43 41 40 24 + 20 4 45 46 48 28 From a235cd4719d53d28fbfaff61ea8c2fde76bde435 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Tue, 20 Dec 2022 14:02:46 -0500 Subject: [PATCH 13/47] mention type labels in bond/react docs --- doc/src/fix_bond_react.rst | 40 +++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/doc/src/fix_bond_react.rst b/doc/src/fix_bond_react.rst index 4377d9d946..d8071facd2 100644 --- a/doc/src/fix_bond_react.rst +++ b/doc/src/fix_bond_react.rst @@ -123,6 +123,17 @@ using this fix is (4) create a map that relates the template-atom-IDs of each atom between pre- and post-reaction molecule templates (5) fill a simulation box with molecules and run a simulation with fix bond/react. +.. note:: + + .. versionadded:: 15Sep2022 + + :doc:`Type labels ` allow for molecule templates + and data files to use alphanumeric atom types that match those of + a force field. Input files that use type labels are inherently + compatible with each other and portable between different + simulations. Therefore, it is highly recommended to use type labels + to specify atom, bond, etc. types when using fix bond/react. + Only one 'fix bond/react' command can be used at a time. Multiple reactions can be simultaneously applied by specifying multiple *react* arguments to a single 'fix bond/react' command. This syntax is @@ -228,18 +239,18 @@ pairs are identified within the cutoff distance: initiator partners, these two atoms are identified as the initiator atom pair of the reaction site. -Note that it can be helpful to select -unique atom types for the initiator atoms: if an initiator atom pair -is identified, as described in the previous steps, but it does not -correspond to the same pair specified in the pre-reaction template, an -otherwise eligible reaction could be prevented from occurring. Once -this unique initiator atom pair is identified for each reaction, there -could be two or more reactions that involve the same atom on the same -time step. If this is the case, only one such reaction is permitted to -occur. This reaction is chosen randomly from all potential reactions -involving the overlapping atom. This capability allows, for example, -different reaction pathways to proceed from identical reaction sites -with user-specified probabilities. +Note that it can be helpful to select unique atom types for the +initiator atoms: if an initiator atom pair is identified, as described +in the previous steps, but it does not correspond to the same pair +specified in the pre-reaction template, an otherwise eligible reaction +could be prevented from occurring. Once this unique initiator atom +pair is identified for each reaction, there could be two or more +reactions that involve the same atom on the same time step. If this is +the case, only one such reaction is permitted to occur. This reaction +is chosen randomly from all potential reactions involving the +overlapping atom. This capability allows, for example, different +reaction pathways to proceed from identical reaction sites with +user-specified probabilities. The pre-reacted molecule template is specified by a molecule command. This molecule template file contains a sample reaction site and its @@ -280,7 +291,10 @@ for a given simulation. All atom types in the pre-reacted template must be the same as those of a potential reaction site in the simulation. A detailed discussion of matching molecule template atom types with the simulation is provided on the :doc:`molecule ` -command page. +command page. It is highly recommended to use :doc:`Type labels ` +(added in version 15Sep2022) in both molecule templates and data +files, which automates the process of syncing atom types between +different input files. The post-reacted molecule template contains a sample of the reaction site and its surrounding topology after the reaction has occurred. It From da98363a25ec6cb6f18aed85fc621525fbf94fa7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Dec 2022 22:49:42 -0500 Subject: [PATCH 14/47] implement angle_write command --- doc/src/Commands_all.rst | 1 + doc/src/angle_table.rst | 11 +- doc/src/angle_write.rst | 98 ++++++++ doc/src/bond_write.rst | 2 +- doc/src/commands_list.rst | 1 + doc/utils/sphinx-config/false_positives.txt | 1 + src/angle_write.cpp | 244 ++++++++++++++++++++ src/angle_write.h | 34 +++ 8 files changed, 387 insertions(+), 5 deletions(-) create mode 100644 doc/src/angle_write.rst create mode 100644 src/angle_write.cpp create mode 100644 src/angle_write.h diff --git a/doc/src/Commands_all.rst b/doc/src/Commands_all.rst index bd9d0ed09c..2ba5cba51d 100644 --- a/doc/src/Commands_all.rst +++ b/doc/src/Commands_all.rst @@ -24,6 +24,7 @@ table above. * :doc:`angle_coeff ` * :doc:`angle_style ` + * :doc:`angle_write ` * :doc:`atom_modify ` * :doc:`atom_style ` * :doc:`balance ` diff --git a/doc/src/angle_table.rst b/doc/src/angle_table.rst index c0faa3f046..fba41db045 100644 --- a/doc/src/angle_table.rst +++ b/doc/src/angle_table.rst @@ -59,9 +59,12 @@ format of this file is described below. ---------- -Suitable tables for use with this angle style can be created using the -Python code in the ``tools/tabulate`` folder of the LAMMPS source code -distribution. +Suitable tables for use with this angle style can be created by LAMMPS +itself from existing angle styles using the :doc:`angle_write +` command. This can be useful to have a template file for +testing the angle style settings and to build a compatible custom file. +Another option to generate tables is the Python code in the +``tools/tabulate`` folder of the LAMMPS source code distribution. The format of a tabulated file is as follows (without the parenthesized comments): @@ -154,7 +157,7 @@ for more info. Related commands """""""""""""""" -:doc:`angle_coeff ` +:doc:`angle_coeff `, :doc:`angle_write ` Default """"""" diff --git a/doc/src/angle_write.rst b/doc/src/angle_write.rst new file mode 100644 index 0000000000..16a4ee4e2c --- /dev/null +++ b/doc/src/angle_write.rst @@ -0,0 +1,98 @@ +.. index:: angle_write + +angle_write command +=================== + +Syntax +"""""" + +.. code-block:: LAMMPS + + angle_write atype N file keyword + +* atype = angle type +* N = # of values +* file = name of file to write values to +* keyword = section name in file for this set of tabulated values + +Examples +"""""""" + +.. code-block:: LAMMPS + + angle_write 1 500 table.txt Harmonic_1 + angle_write 3 1000 table.txt Harmonic_3 + +Description +""""""""""" + +Write energy and force values to a file as a function of angle for the +currently defined angle potential. Force in this context means the +angle force, not the force on individual atoms. This is useful for +plotting the potential function or otherwise debugging its values. The +resulting file can also be used as input for use with :doc:`angle style +table `. + +If the file already exists, the table of values is appended to the end +of the file to allow multiple tables of energy and force to be included +in one file. The individual sections may be identified by the *keyword*. + +The energy and force values are computed for angles ranging from 0 +degrees to 180 degrees for 3 interacting atoms forming an angle type +atype, using the appropriate :doc:`angle_coeff ` +coefficients. N evenly spaced angles are used. + +For example, for N = 6, values are computed at :math:`\theta = 0, 36, +72, 108, 144, 180`. + +The file is written in the format used as input for the +:doc:`angle_style table ` option with *keyword* as the +section name. Each line written to the file lists an index number +(1-N), an angle (in degrees), an energy (in energy units), and a force +(in force units per radians^2). In case a new file is created, the +first line will be a comment with a "DATE:" and "UNITS:" tag with the +current date and :doc:`units ` settings. For subsequent +invocations of the *angle_write* command for the same file, data will be +appended and the current units settings will be compared to the data +from the header, if present. The *angle_write* will refuse to add a +table to an existing file if the units are not the same. + +Restrictions +"""""""""""" + +All force field coefficients for angle and other kinds of interactions +must be set before this command can be invoked. + +The table of the angle energy and force data data is created by using a +separate, internally created, new LAMMPS instance with a dummy system of +3 atoms for which the angle potential energy is computed after +transferring the angle style and coefficients and arranging the 3 atoms +into the corresponding geometries. The angle force is then determined +from the potential energies through numerical differentiation. As a +consequence or this approach, not all angle styles are compatible. The +following conditions must be met: + +- The angle style must be able to write its coefficients to a data file. + This condition excludes for example :doc:`angle style hybrid ` and + :doc:`angle style table `. +- The potential function must not have any terms that depend on geometry + properties other than the angle. This condition excludes for example + all angle types for :doc:`angle style charmm ` that have + non-zero Urey-Bradley terms. Please note that the *write_angle* + command has no way of checking for this condition, so the resulting tables + may be bogus. It is strongly recommended to make careful tests for any + created tables. +- There must not be multiple angle interactions defined for the same + triple of atoms. This applies for example to :doc:`angle_style class2 + `. + +Related commands +"""""""""""""""" + +:doc:`angle_style table `, :doc:`bond_write `, +:doc:`angle_style `, :doc:`angle_coeff ` + +Default +""""""" + +none diff --git a/doc/src/bond_write.rst b/doc/src/bond_write.rst index 4170029239..51e0653f51 100644 --- a/doc/src/bond_write.rst +++ b/doc/src/bond_write.rst @@ -67,7 +67,7 @@ be specified even if the potential has a finite value at r = 0.0. Related commands """""""""""""""" -:doc:`bond_style table `, +:doc:`bond_style table `, `angle_write `, :doc:`bond_style `, :doc:`bond_coeff ` Default diff --git a/doc/src/commands_list.rst b/doc/src/commands_list.rst index ff2502189d..5731cbb755 100644 --- a/doc/src/commands_list.rst +++ b/doc/src/commands_list.rst @@ -6,6 +6,7 @@ Commands angle_coeff angle_style + angle_write atom_modify atom_style balance diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 7cb409d040..13cc96f993 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -174,6 +174,7 @@ attrac Atw Atwater atwt +atype augt AuO automagically diff --git a/src/angle_write.cpp b/src/angle_write.cpp new file mode 100644 index 0000000000..e0d6827a66 --- /dev/null +++ b/src/angle_write.cpp @@ -0,0 +1,244 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Axel Kohlmeyer (Temple U) +------------------------------------------------------------------------- */ + +#include "angle_write.h" + +#include "angle.h" +#include "atom.h" +#include "atom_vec.h" +#include "comm.h" +#include "domain.h" +#include "error.h" +#include "force.h" +#include "input.h" +#include "lammps.h" +#include "math_const.h" +#include "update.h" + +#include +using namespace LAMMPS_NS; +using MathConst::DEG2RAD; +using MathConst::RAD2DEG; + +static constexpr double epsilon = 6.5e-6; +#define MAXLINE 1024 +/* ---------------------------------------------------------------------- */ + +void AngleWrite::command(int narg, char **arg) +{ + // sanity checks + + if (domain->box_exist == 0) + error->all(FLERR, "Angle_write command before simulation box is defined"); + if (atom->avec->angles_allow == 0) + error->all(FLERR, "Angle_write command when no angles allowed"); + auto angle = force->angle; + if (angle == nullptr) error->all(FLERR, "Angle_write command before an angle_style is defined"); + if (angle && (force->angle->writedata == 0)) + error->all(FLERR, "Angle style must support writing coeffs to data file for angle_write"); + + // parse arguments + + if (narg != 4) error->all(FLERR, "Illegal angle_write command"); + + int atype = utils::inumeric(FLERR, arg[0], false, lmp); + int n = utils::inumeric(FLERR, arg[1], false, lmp); + std::string table_file = arg[2]; + std::string keyword = arg[3]; + + // make sure system is initialized before calling any functions + + lmp->init(); + + double theta0 = angle->equilibrium_angle(atype) * RAD2DEG; + + // write out all angle_coeff settings to file. use function from write_data. + // open table file in append mode if it already exists + // add line with DATE: and UNITS: tag when creating new file + // otherwise make certain that units are consistent + // print header in format used by angle_style table + + FILE *fp = nullptr; + std::string coeffs_file = table_file + ".tmp.coeffs"; + if (comm->me == 0) { + + fp = fopen(coeffs_file.c_str(), "w"); + force->angle->write_data(fp); + fclose(fp); + + // units sanity check: + // - if this is the first time we write to this potential file, + // write out a line with "DATE:" and "UNITS:" tags + // - if the file already exists, print a message about appending + // while printing the date and check that units are consistent. + if (platform::file_is_readable(table_file)) { + std::string units = utils::get_potential_units(table_file, "table"); + if (!units.empty() && (units != update->unit_style)) { + error->one(FLERR, "Trying to append to a table file with UNITS: {} while units are {}", + units, update->unit_style); + } + std::string date = utils::get_potential_date(table_file, "table"); + utils::logmesg(lmp, "Appending to table file {} with DATE: {}\n", table_file, date); + fp = fopen(table_file.c_str(), "a"); + } else { + utils::logmesg(lmp, "Creating table file {} with DATE: {}\n", table_file, + utils::current_date()); + fp = fopen(table_file.c_str(), "w"); + if (fp) + fmt::print(fp, "# DATE: {} UNITS: {} Created by angle_write\n", utils::current_date(), + update->unit_style); + } + if (fp == nullptr) + error->one(FLERR, "Cannot open angle_write file {}: {}", table_file, utils::getsyserror()); + } + + // split communicator so that we can run a new LAMMPS class instance only on comm->me == 0 + + MPI_Comm singlecomm; + int color = (comm->me == 0) ? 1 : MPI_UNDEFINED; + int key = comm->me; + MPI_Comm_split(world, color, key, &singlecomm); + + if (comm->me == 0) { + // set up new LAMMPS instance with dummy system to evaluate angle potential + const char *args[] = {"AngleWrite", "-nocite", "-echo", "none", + "-log", "none", "-screen", "none"}; + char **argv = (char **) args; + int argc = sizeof(args) / sizeof(char *); + LAMMPS *writer = new LAMMPS(argc, argv, singlecomm); + + // create dummy system replicating angle style settings + writer->input->one(fmt::format("units {}", update->unit_style)); + writer->input->one("atom_style angle"); + writer->input->one("atom_modify map array"); + writer->input->one("boundary f f f"); + writer->input->one("region box block -2 2 -2 2 -1 1"); + writer->input->one(fmt::format("create_box {} box angle/types {} " + "extra/angle/per/atom 1 " + "extra/special/per/atom 4", + atom->ntypes, atom->nangletypes)); + writer->input->one("create_atoms 1 single 0.0 0.0 0.0"); + writer->input->one("create_atoms 1 single 1.0 0.0 0.0"); + writer->input->one("create_atoms 1 single -1.0 0.0 0.0"); + writer->input->one(fmt::format("create_bonds single/angle {} 2 1 3", atype)); + + writer->input->one("pair_style zero 10.0"); + writer->input->one("pair_coeff * *"); + writer->input->one("mass * 1.0"); + writer->input->one(fmt::format("angle_style {}", force->angle_style)); + FILE *coeffs; + char line[MAXLINE]; + coeffs = fopen(coeffs_file.c_str(), "r"); + for (int i = 0; i < atom->nangletypes; ++i) { + fgets(line, MAXLINE, coeffs); + writer->input->one(fmt::format("angle_coeff {}", line)); + } + platform::unlink(coeffs_file); + + // initialize system + + writer->init(); + + // move third atom to reproduce angles + + double theta, phi, phi1, phi2, f; + angle = writer->force->angle; + int i1, i2, i3; + i1 = writer->atom->map(1); + i2 = writer->atom->map(2); + i3 = writer->atom->map(3); + auto atom3 = writer->atom->x[i3]; + + // evaluate energy and force at each of N distances + + fmt::print(fp, "# Angle potential {} for angle type {}: i,theta,energy,force\n", + force->angle_style, atype); + fmt::print(fp, "\n{}\nN {} EQ {:.15g}\n\n", keyword, n, theta0); + + const double dtheta = 180.0 / static_cast(n - 1); + + // get force for divergent 0 degree angle from interpolation to the right + theta = 0.0; + atom3[0] = cos(theta * DEG2RAD); + atom3[1] = sin(theta * DEG2RAD); + phi = angle->single(atype, i2, i1, i3); + + theta = epsilon; + atom3[0] = cos(theta * DEG2RAD); + atom3[1] = sin(theta * DEG2RAD); + phi1 = angle->single(atype, i2, i1, i3); + + theta = 2.0 * epsilon; + atom3[0] = cos(theta * DEG2RAD); + atom3[1] = sin(theta * DEG2RAD); + phi2 = angle->single(atype, i2, i1, i3); + + f = (1.5 * phi - 2.0 * phi1 + 0.5 * phi2) / epsilon; + if (!std::isfinite(f)) f = 0.0; + if (!std::isfinite(phi)) phi = 0.0; + fprintf(fp, "%8d %- 22.15g %- 22.15g %- 22.15g\n", 1, 0.0, phi, f); + + for (int i = 1; i < n - 1; i++) { + theta = dtheta * static_cast(i) - epsilon; + atom3[0] = cos(theta * DEG2RAD); + atom3[1] = sin(theta * DEG2RAD); + phi1 = angle->single(atype, i2, i1, i3); + + theta = dtheta * static_cast(i) + epsilon; + atom3[0] = cos(theta * DEG2RAD); + atom3[1] = sin(theta * DEG2RAD); + phi2 = angle->single(atype, i2, i1, i3); + + theta = dtheta * static_cast(i); + atom3[0] = cos(theta * DEG2RAD); + atom3[1] = sin(theta * DEG2RAD); + phi = angle->single(atype, i2, i1, i3); + if (!std::isfinite(phi)) phi = 0.0; + + // get force from numerical differentiation + f = -0.5 * (phi2 - phi1) / epsilon; + if (!std::isfinite(f)) f = 0.0; + fprintf(fp, "%8d %- 22.15g %- 22.15g %- 22.15g\n", i + 1, theta, phi, f); + } + + // get force for divergent 180 degree angle from interpolation to the left + theta = 180.0; + atom3[0] = cos(theta * DEG2RAD); + atom3[1] = sin(theta * DEG2RAD); + phi = angle->single(atype, i2, i1, i3); + + theta = 180.0 - epsilon; + atom3[0] = cos(theta * DEG2RAD); + atom3[1] = sin(theta * DEG2RAD); + phi1 = angle->single(atype, i2, i1, i3); + + theta = 180.0 - 2.0 * epsilon; + atom3[0] = cos(theta * DEG2RAD); + atom3[1] = sin(theta * DEG2RAD); + phi2 = angle->single(atype, i2, i1, i3); + + f = (2.0 * phi1 - 1.5 * phi - 0.5 * phi2) / epsilon; + if (!std::isfinite(f)) f = 0.0; + if (!std::isfinite(phi)) phi = 0.0; + fprintf(fp, "%8d %- 22.15g %- 22.15g %- 22.15g\n", 1, 180.0, phi, f); + + // clean up + delete writer; + fclose(fp); + } + MPI_Comm_free(&singlecomm); +} diff --git a/src/angle_write.h b/src/angle_write.h new file mode 100644 index 0000000000..5c56cd8efc --- /dev/null +++ b/src/angle_write.h @@ -0,0 +1,34 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef COMMAND_CLASS +// clang-format off +CommandStyle(angle_write,AngleWrite); +// clang-format on +#else + +#ifndef LMP_ANGLE_WRITE_H +#define LMP_ANGLE_WRITE_H + +#include "command.h" + +namespace LAMMPS_NS { + +class AngleWrite : public Command { + public: + AngleWrite(class LAMMPS *lmp) : Command(lmp){}; + void command(int, char **) override; +}; +} // namespace LAMMPS_NS +#endif +#endif From bbdc6fd3ab1ef7ce093fcc6337342e680d0942d5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Dec 2022 04:35:03 -0500 Subject: [PATCH 15/47] fix file handle leak --- src/angle_write.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/angle_write.cpp b/src/angle_write.cpp index e0d6827a66..ca0118eda5 100644 --- a/src/angle_write.cpp +++ b/src/angle_write.cpp @@ -147,6 +147,7 @@ void AngleWrite::command(int narg, char **arg) fgets(line, MAXLINE, coeffs); writer->input->one(fmt::format("angle_coeff {}", line)); } + fclose(coeffs); platform::unlink(coeffs_file); // initialize system From ecf11f2f20d16de4a81bed70efc6e21090148dbb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Dec 2022 06:06:34 -0500 Subject: [PATCH 16/47] use macro for keeping repetitive code consistent --- src/angle_write.cpp | 55 +++++++++++++-------------------------------- 1 file changed, 15 insertions(+), 40 deletions(-) diff --git a/src/angle_write.cpp b/src/angle_write.cpp index ca0118eda5..554f03d18f 100644 --- a/src/angle_write.cpp +++ b/src/angle_write.cpp @@ -170,23 +170,19 @@ void AngleWrite::command(int narg, char **arg) force->angle_style, atype); fmt::print(fp, "\n{}\nN {} EQ {:.15g}\n\n", keyword, n, theta0); +#define GET_ENERGY(myphi, mytheta) \ + theta = mytheta; \ + atom3[0] = cos(theta * DEG2RAD); \ + atom3[1] = sin(theta * DEG2RAD); \ + myphi = angle->single(atype, i2, i1, i3) + const double dtheta = 180.0 / static_cast(n - 1); // get force for divergent 0 degree angle from interpolation to the right - theta = 0.0; - atom3[0] = cos(theta * DEG2RAD); - atom3[1] = sin(theta * DEG2RAD); - phi = angle->single(atype, i2, i1, i3); - theta = epsilon; - atom3[0] = cos(theta * DEG2RAD); - atom3[1] = sin(theta * DEG2RAD); - phi1 = angle->single(atype, i2, i1, i3); - - theta = 2.0 * epsilon; - atom3[0] = cos(theta * DEG2RAD); - atom3[1] = sin(theta * DEG2RAD); - phi2 = angle->single(atype, i2, i1, i3); + GET_ENERGY(phi, 0.0); + GET_ENERGY(phi1, epsilon); + GET_ENERGY(phi2, 2.0 * epsilon); f = (1.5 * phi - 2.0 * phi1 + 0.5 * phi2) / epsilon; if (!std::isfinite(f)) f = 0.0; @@ -194,20 +190,10 @@ void AngleWrite::command(int narg, char **arg) fprintf(fp, "%8d %- 22.15g %- 22.15g %- 22.15g\n", 1, 0.0, phi, f); for (int i = 1; i < n - 1; i++) { - theta = dtheta * static_cast(i) - epsilon; - atom3[0] = cos(theta * DEG2RAD); - atom3[1] = sin(theta * DEG2RAD); - phi1 = angle->single(atype, i2, i1, i3); + GET_ENERGY(phi1, dtheta * static_cast(i) - epsilon); + GET_ENERGY(phi2, dtheta * static_cast(i) + epsilon); + GET_ENERGY(phi, dtheta * static_cast(i)); - theta = dtheta * static_cast(i) + epsilon; - atom3[0] = cos(theta * DEG2RAD); - atom3[1] = sin(theta * DEG2RAD); - phi2 = angle->single(atype, i2, i1, i3); - - theta = dtheta * static_cast(i); - atom3[0] = cos(theta * DEG2RAD); - atom3[1] = sin(theta * DEG2RAD); - phi = angle->single(atype, i2, i1, i3); if (!std::isfinite(phi)) phi = 0.0; // get force from numerical differentiation @@ -217,20 +203,9 @@ void AngleWrite::command(int narg, char **arg) } // get force for divergent 180 degree angle from interpolation to the left - theta = 180.0; - atom3[0] = cos(theta * DEG2RAD); - atom3[1] = sin(theta * DEG2RAD); - phi = angle->single(atype, i2, i1, i3); - - theta = 180.0 - epsilon; - atom3[0] = cos(theta * DEG2RAD); - atom3[1] = sin(theta * DEG2RAD); - phi1 = angle->single(atype, i2, i1, i3); - - theta = 180.0 - 2.0 * epsilon; - atom3[0] = cos(theta * DEG2RAD); - atom3[1] = sin(theta * DEG2RAD); - phi2 = angle->single(atype, i2, i1, i3); + GET_ENERGY(phi, 180.0); + GET_ENERGY(phi1, 180.0 - epsilon); + GET_ENERGY(phi2, 180.0 - 2.0 * epsilon); f = (2.0 * phi1 - 1.5 * phi - 0.5 * phi2) / epsilon; if (!std::isfinite(f)) f = 0.0; From c4f2befb1f535daf06f42c7bebe98ee3c4ba21c9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Dec 2022 06:25:45 -0500 Subject: [PATCH 17/47] add sanity check on valid angle type --- src/angle_write.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/angle_write.cpp b/src/angle_write.cpp index 554f03d18f..3b7c7f2e24 100644 --- a/src/angle_write.cpp +++ b/src/angle_write.cpp @@ -56,6 +56,9 @@ void AngleWrite::command(int narg, char **arg) if (narg != 4) error->all(FLERR, "Illegal angle_write command"); int atype = utils::inumeric(FLERR, arg[0], false, lmp); + if ((atype <= 0) || (atype > atom->nangletypes)) + error->all(FLERR, "Invalid angle type {} in angle_write command", atype); + int n = utils::inumeric(FLERR, arg[1], false, lmp); std::string table_file = arg[2]; std::string keyword = arg[3]; From a4f8cb9a9230566d72d579e7bdb0a260130d3ef7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Dec 2022 06:54:40 -0500 Subject: [PATCH 18/47] explicitly disallow angle_write with angle_style class2 --- src/angle_write.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/angle_write.cpp b/src/angle_write.cpp index 3b7c7f2e24..e7c95be3cf 100644 --- a/src/angle_write.cpp +++ b/src/angle_write.cpp @@ -51,6 +51,10 @@ void AngleWrite::command(int narg, char **arg) if (angle && (force->angle->writedata == 0)) error->all(FLERR, "Angle style must support writing coeffs to data file for angle_write"); + if (angle && (utils::strmatch(force->angle_style, "^class2"))) + error->all(FLERR, "Angle_write command is not compatible with angle style {}", + force->angle_style); + // parse arguments if (narg != 4) error->all(FLERR, "Illegal angle_write command"); From bbfc7381fb81dca21ffc9b109e6761150cc4d63a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Dec 2022 06:54:53 -0500 Subject: [PATCH 19/47] updates and corrections for docs --- doc/src/angle_write.rst | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/doc/src/angle_write.rst b/doc/src/angle_write.rst index 16a4ee4e2c..8bc94b5191 100644 --- a/doc/src/angle_write.rst +++ b/doc/src/angle_write.rst @@ -28,10 +28,10 @@ Description Write energy and force values to a file as a function of angle for the currently defined angle potential. Force in this context means the -angle force, not the force on individual atoms. This is useful for -plotting the potential function or otherwise debugging its values. The -resulting file can also be used as input for use with :doc:`angle style -table `. +force with respect to the angle, not the force on individual atoms. +This is useful for plotting the potential function or otherwise +debugging its values. The resulting file can also be used as input for +use with :doc:`angle style table `. If the file already exists, the table of values is appended to the end of the file to allow multiple tables of energy and force to be included @@ -69,7 +69,7 @@ separate, internally created, new LAMMPS instance with a dummy system of transferring the angle style and coefficients and arranging the 3 atoms into the corresponding geometries. The angle force is then determined from the potential energies through numerical differentiation. As a -consequence or this approach, not all angle styles are compatible. The +consequence of this approach, not all angle styles are compatible. The following conditions must be met: - The angle style must be able to write its coefficients to a data file. @@ -77,20 +77,19 @@ following conditions must be met: :doc:`angle style table `. - The potential function must not have any terms that depend on geometry properties other than the angle. This condition excludes for example - all angle types for :doc:`angle style charmm ` that have - non-zero Urey-Bradley terms. Please note that the *write_angle* - command has no way of checking for this condition, so the resulting tables - may be bogus. It is strongly recommended to make careful tests for any - created tables. -- There must not be multiple angle interactions defined for the same - triple of atoms. This applies for example to :doc:`angle_style class2 - `. + :doc:`angle style class2 ` all angle types for + :doc:`angle style charmm ` that have non-zero + Urey-Bradley terms. Please note that the *write_angle* command has no + way of checking for this condition, so the resulting tables may be + bogus if the requirement is not met. It is thus recommended to make + careful tests for any created tables. Related commands """""""""""""""" :doc:`angle_style table `, :doc:`bond_write `, -:doc:`angle_style `, :doc:`angle_coeff ` +:doc:`dihedral_write `, :doc:`angle_style `, +:doc:`angle_coeff ` Default """"""" From 4ac830bf73a90820070b96c54057c36a829fd3c9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Dec 2022 06:57:38 -0500 Subject: [PATCH 20/47] add dihedral_write command --- doc/src/Commands_all.rst | 1 + doc/src/commands_list.rst | 1 + doc/src/dihedral_write.rst | 99 ++++++++++ doc/utils/sphinx-config/false_positives.txt | 1 + src/dihedral_write.cpp | 206 ++++++++++++++++++++ src/dihedral_write.h | 34 ++++ 6 files changed, 342 insertions(+) create mode 100644 doc/src/dihedral_write.rst create mode 100644 src/dihedral_write.cpp create mode 100644 src/dihedral_write.h diff --git a/doc/src/Commands_all.rst b/doc/src/Commands_all.rst index 2ba5cba51d..4a035f5b41 100644 --- a/doc/src/Commands_all.rst +++ b/doc/src/Commands_all.rst @@ -46,6 +46,7 @@ table above. * :doc:`dielectric ` * :doc:`dihedral_coeff ` * :doc:`dihedral_style ` + * :doc:`dihedral_write ` * :doc:`dimension ` * :doc:`displace_atoms ` * :doc:`dump ` diff --git a/doc/src/commands_list.rst b/doc/src/commands_list.rst index 5731cbb755..cea237f14e 100644 --- a/doc/src/commands_list.rst +++ b/doc/src/commands_list.rst @@ -28,6 +28,7 @@ Commands dielectric dihedral_coeff dihedral_style + dihedral_write dimension displace_atoms dump diff --git a/doc/src/dihedral_write.rst b/doc/src/dihedral_write.rst new file mode 100644 index 0000000000..d0deb1d2e8 --- /dev/null +++ b/doc/src/dihedral_write.rst @@ -0,0 +1,99 @@ +.. index:: dihedral_write + +dihedral_write command +====================== + +Syntax +"""""" + +.. code-block:: LAMMPS + + dihedral_write dtype N file keyword + +* dtype = dihedral type +* N = # of values +* file = name of file to write values to +* keyword = section name in file for this set of tabulated values + +Examples +"""""""" + +.. code-block:: LAMMPS + + dihedral_write 1 500 table.txt Harmonic_1 + dihedral_write 3 1000 table.txt Harmonic_3 + +Description +""""""""""" + +Write energy and force values to a file as a function of the dihedral +angle for the currently defined dihedral potential. Force in this +context means the force with respect to the dihedral angle, not the +force on individual atoms. This is useful for plotting the potential +function or otherwise debugging its values. The resulting file can also +be used as input for use with :doc:`dihedral style table +`. + +If the file already exists, the table of values is appended to the end +of the file to allow multiple tables of energy and force to be included +in one file. The individual sections may be identified by the *keyword*. + +The energy and force values are computed for dihedrals ranging from 0 +degrees to 360 degrees for 4 interacting atoms forming an dihedral type +dtype, using the appropriate :doc:`dihedral_coeff ` +coefficients. N evenly spaced dihedrals are used. Since 0 and 360 +degrees are the same dihedral angle, the latter entry is skipped. + +For example, for N = 6, values would be computed at +:math:`\phi = 0, 60, 120, 180, 240, 300`. + +The file is written in the format used as input for the +:doc:`dihedral_style table ` option with *keyword* as +the section name. Each line written to the file lists an index number +(1-N), an dihedral angle (in degrees), an energy (in energy units), and +a force (in force units per radians^2). In case a new file is created, +the first line will be a comment with a "DATE:" and "UNITS:" tag with +the current date and :doc:`units ` settings. For subsequent +invocations of the *dihedral_write* command for the same file, data will +be appended and the current units settings will be compared to the data +from the header, if present. The *dihedral_write* will refuse to add a +table to an existing file if the units are not the same. + +Restrictions +"""""""""""" + +All force field coefficients for dihedrals and other kinds of interactions +must be set before this command can be invoked. + +The table of the dihedral energy and force data data is created by using a +separate, internally created, new LAMMPS instance with a dummy system of +4 atoms for which the dihedral potential energy is computed after +transferring the dihedral style and coefficients and arranging the 4 atoms +into the corresponding geometries. The dihedral force is then determined +from the potential energies through numerical differentiation. As a +consequence of this approach, not all dihedral styles are compatible. The +following conditions must be met: + +- The dihedral style must be able to write its coefficients to a data file. + This condition excludes for example :doc:`dihedral style hybrid ` and + :doc:`dihedral style table `. +- The potential function must not have any terms that depend on geometry + properties other than the dihedral. This condition excludes for + example :doc:`dihedral style class2 `. Please note + that the *write_dihedral* command has no way of checking for this + condition. It will check the style name against an internal list of + known to be incompatible styles. The resulting tables may be bogus + for unlisted dihedral styles if the requirement is not met. It is + thus recommended to make careful tests for any created tables. + +Related commands +"""""""""""""""" + +:doc:`dihedral_style table `, :doc:`bond_write `, +:doc:`angle_write `, :doc:`dihedral_style `, +:doc:`dihedral_coeff ` + +Default +""""""" + +none diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 13cc96f993..855f306f84 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -829,6 +829,7 @@ dtemp dtgrow dtheta dtshrink +dtype du dU Ducastelle diff --git a/src/dihedral_write.cpp b/src/dihedral_write.cpp new file mode 100644 index 0000000000..eedcde0eb8 --- /dev/null +++ b/src/dihedral_write.cpp @@ -0,0 +1,206 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Axel Kohlmeyer (Temple U) +------------------------------------------------------------------------- */ + +#include "dihedral_write.h" + +#include "atom.h" +#include "atom_vec.h" +#include "comm.h" +#include "dihedral.h" +#include "domain.h" +#include "error.h" +#include "force.h" +#include "input.h" +#include "lammps.h" +#include "math_const.h" +#include "update.h" + +#include +using namespace LAMMPS_NS; +using MathConst::DEG2RAD; +using MathConst::RAD2DEG; + +static constexpr double epsilon = 6.5e-6; +#define MAXLINE 1024 +/* ---------------------------------------------------------------------- */ + +void DihedralWrite::command(int narg, char **arg) +{ + // sanity checks + + if (domain->box_exist == 0) + error->all(FLERR, "Dihedral_write command before simulation box is defined"); + if (atom->avec->dihedrals_allow == 0) + error->all(FLERR, "Dihedral_write command when no dihedrals allowed"); + auto dihedral = force->dihedral; + if (dihedral == nullptr) + error->all(FLERR, "Dihedral_write command before an dihedral_style is defined"); + if (dihedral && (force->dihedral->writedata == 0)) + error->all(FLERR, "Dihedral style must support writing coeffs to data file for dihedral_write"); + + if (dihedral && + (utils::strmatch(force->dihedral_style, "^charmm") || + utils::strmatch(force->dihedral_style, "^class2"))) + error->all(FLERR, "Dihedral_write command is not compatible with dihedral style {}", + force->dihedral_style); + + // parse arguments + + if (narg != 4) error->all(FLERR, "Illegal dihedral_write command"); + + int dtype = utils::inumeric(FLERR, arg[0], false, lmp); + if ((dtype <= 0) || (dtype > atom->ndihedraltypes)) + error->all(FLERR, "Invalid dihedral type {} in dihedral_write command", dtype); + + int n = utils::inumeric(FLERR, arg[1], false, lmp); + std::string table_file = arg[2]; + std::string keyword = arg[3]; + + // make sure system is initialized before calling any functions + + lmp->init(); + + // write out all dihedral_coeff settings to file. use function from write_data. + // open table file in append mode if it already exists + // add line with DATE: and UNITS: tag when creating new file + // otherwise make certain that units are consistent + // print header in format used by dihedral_style table + + FILE *fp = nullptr; + std::string coeffs_file = table_file + ".tmp.coeffs"; + if (comm->me == 0) { + + fp = fopen(coeffs_file.c_str(), "w"); + force->dihedral->write_data(fp); + fclose(fp); + + // units sanity check: + // - if this is the first time we write to this potential file, + // write out a line with "DATE:" and "UNITS:" tags + // - if the file already exists, print a message about appending + // while printing the date and check that units are consistent. + if (platform::file_is_readable(table_file)) { + std::string units = utils::get_potential_units(table_file, "table"); + if (!units.empty() && (units != update->unit_style)) { + error->one(FLERR, "Trying to append to a table file with UNITS: {} while units are {}", + units, update->unit_style); + } + std::string date = utils::get_potential_date(table_file, "table"); + utils::logmesg(lmp, "Appending to table file {} with DATE: {}\n", table_file, date); + fp = fopen(table_file.c_str(), "a"); + } else { + utils::logmesg(lmp, "Creating table file {} with DATE: {}\n", table_file, + utils::current_date()); + fp = fopen(table_file.c_str(), "w"); + if (fp) + fmt::print(fp, "# DATE: {} UNITS: {} Created by dihedral_write\n", utils::current_date(), + update->unit_style); + } + if (fp == nullptr) + error->one(FLERR, "Cannot open dihedral_write file {}: {}", table_file, utils::getsyserror()); + } + + // split communicator so that we can run a new LAMMPS class instance only on comm->me == 0 + + MPI_Comm singlecomm; + int color = (comm->me == 0) ? 1 : MPI_UNDEFINED; + int key = comm->me; + MPI_Comm_split(world, color, key, &singlecomm); + + if (comm->me == 0) { + // set up new LAMMPS instance with dummy system to evaluate dihedral potential + // const char *args[] = {"DihedralWrite", "-nocite", "-echo", "none", + // "-log", "none", "-screen", "none"}; + const char *args[] = {"DihedralWrite", "-nocite", "-echo", "screen", "-log", "none"}; + char **argv = (char **) args; + int argc = sizeof(args) / sizeof(char *); + LAMMPS *writer = new LAMMPS(argc, argv, singlecomm); + + // create dummy system replicating dihedral style settings + writer->input->one(fmt::format("units {}", update->unit_style)); + writer->input->one("atom_style molecular"); + writer->input->one("atom_modify map array"); + writer->input->one("boundary f f f"); + writer->input->one("region box block -2 2 -2 2 -2 2"); + writer->input->one(fmt::format("create_box {} box dihedral/types {} " + "extra/dihedral/per/atom 1 " + "extra/special/per/atom 4", + atom->ntypes, atom->ndihedraltypes)); + writer->input->one("create_atoms 1 single 1.0 0.0 -1.0"); + writer->input->one("create_atoms 1 single 0.0 0.0 -1.0"); + writer->input->one("create_atoms 1 single 0.0 0.0 1.0"); + writer->input->one("create_atoms 1 single 1.0 0.0 1.0"); + writer->input->one(fmt::format("create_bonds single/dihedral {} 1 2 3 4", dtype)); + + writer->input->one("pair_style zero 10.0"); + writer->input->one("pair_coeff * *"); + writer->input->one("mass * 1.0"); + writer->input->one(fmt::format("dihedral_style {}", force->dihedral_style)); + FILE *coeffs; + char line[MAXLINE]; + coeffs = fopen(coeffs_file.c_str(), "r"); + for (int i = 0; i < atom->ndihedraltypes; ++i) { + fgets(line, MAXLINE, coeffs); + writer->input->one(fmt::format("dihedral_coeff {}", line)); + } + fclose(coeffs); + platform::unlink(coeffs_file); + + // must complete a full setup() to initialize system including neighbor and dihedral lists. + + writer->input->one("run 0 post no"); + + // move third atom to reproduce dihedrals + + double theta, phi, phi1, phi2, f; + dihedral = writer->force->dihedral; + auto atom4 = writer->atom->x[writer->atom->map(4)]; + + // evaluate energy and force at each of N distances + + fmt::print(fp, "# Dihedral potential {} for dihedral type {}: i,theta,energy,force\n", + force->dihedral_style, dtype); + fmt::print(fp, "\n{}\nN {} DEGREES\n\n", keyword, n); + +#define GET_ENERGY(myphi, mytheta) \ + theta = mytheta; \ + atom4[0] = cos(theta * DEG2RAD); \ + atom4[1] = sin(theta * DEG2RAD); \ + dihedral->energy = 0.0; \ + dihedral->compute(ENERGY_GLOBAL, 0); \ + myphi = dihedral->energy + + const double dtheta = 360.0 / static_cast(n); + for (int i = 0; i < n; i++) { + GET_ENERGY(phi1, dtheta * static_cast(i) - epsilon); + GET_ENERGY(phi2, dtheta * static_cast(i) + epsilon); + GET_ENERGY(phi, dtheta * static_cast(i)); + + if (!std::isfinite(phi)) phi = 0.0; + + // get force from numerical differentiation + f = -0.5 * (phi2 - phi1) / epsilon; + if (!std::isfinite(f)) f = 0.0; + fprintf(fp, "%8d %- 22.15g %- 22.15g %- 22.15g\n", i + 1, theta, phi, f); + } + + // clean up + delete writer; + fclose(fp); + } + MPI_Comm_free(&singlecomm); +} diff --git a/src/dihedral_write.h b/src/dihedral_write.h new file mode 100644 index 0000000000..b17f8d19da --- /dev/null +++ b/src/dihedral_write.h @@ -0,0 +1,34 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef COMMAND_CLASS +// clang-format off +CommandStyle(dihedral_write,DihedralWrite); +// clang-format on +#else + +#ifndef LMP_DIHEDRAL_WRITE_H +#define LMP_DIHEDRAL_WRITE_H + +#include "command.h" + +namespace LAMMPS_NS { + +class DihedralWrite : public Command { + public: + DihedralWrite(class LAMMPS *lmp) : Command(lmp){}; + void command(int, char **) override; +}; +} // namespace LAMMPS_NS +#endif +#endif From 63ddb07c594fd7124a20df849f4e6b6ec05d2698 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Dec 2022 07:04:20 -0500 Subject: [PATCH 21/47] add versionadded tags --- doc/src/angle_write.rst | 2 ++ doc/src/dihedral_write.rst | 2 ++ 2 files changed, 4 insertions(+) diff --git a/doc/src/angle_write.rst b/doc/src/angle_write.rst index 8bc94b5191..1541a7120a 100644 --- a/doc/src/angle_write.rst +++ b/doc/src/angle_write.rst @@ -26,6 +26,8 @@ Examples Description """"""""""" +.. versionadded:: TBD + Write energy and force values to a file as a function of angle for the currently defined angle potential. Force in this context means the force with respect to the angle, not the force on individual atoms. diff --git a/doc/src/dihedral_write.rst b/doc/src/dihedral_write.rst index d0deb1d2e8..94fa3da0fa 100644 --- a/doc/src/dihedral_write.rst +++ b/doc/src/dihedral_write.rst @@ -26,6 +26,8 @@ Examples Description """"""""""" +.. versionadded:: TBD + Write energy and force values to a file as a function of the dihedral angle for the currently defined dihedral potential. Force in this context means the force with respect to the dihedral angle, not the From 7cceabe5bdc3243064c48805e2a7d760b183eac1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 12:14:36 -0500 Subject: [PATCH 22/47] ILAENV function does not use IPARAM2STAGE anymore --- lib/linalg/Makefile.gfortran | 8 +- lib/linalg/Makefile.mpi | 8 +- lib/linalg/ilaenv.f | 4 +- lib/linalg/iparam2stage.F | 386 ----------------------------------- 4 files changed, 6 insertions(+), 400 deletions(-) delete mode 100644 lib/linalg/iparam2stage.F diff --git a/lib/linalg/Makefile.gfortran b/lib/linalg/Makefile.gfortran index 2a777099e9..89ac3bbe6d 100644 --- a/lib/linalg/Makefile.gfortran +++ b/lib/linalg/Makefile.gfortran @@ -7,14 +7,13 @@ SHELL = /bin/sh # ------ FILES ------ SRC = $(wildcard *.f) -SRC1 = $(wildcard *.F) -FILES = $(SRC) $(SRC1) Makefile.* README +FILES = $(SRC) Makefile.* README # ------ DEFINITIONS ------ LIB = liblinalg.a -OBJ = $(SRC:.f=.o) $(SRC1:.F=.o) +OBJ = $(SRC:.f=.o) # ------ SETTINGS ------ @@ -34,9 +33,6 @@ lib: $(OBJ) # ------ COMPILE RULES ------ -%.o:%.F - $(FC) $(FFLAGS) -c $< - %.o:%.f $(FC) $(FFLAGS) -c $< diff --git a/lib/linalg/Makefile.mpi b/lib/linalg/Makefile.mpi index 26bfab4c80..74de6cdf3d 100644 --- a/lib/linalg/Makefile.mpi +++ b/lib/linalg/Makefile.mpi @@ -7,14 +7,13 @@ SHELL = /bin/sh # ------ FILES ------ SRC = $(wildcard *.f) -SRC1 = $(wildcard *.F) -FILES = $(SRC) $(SRC1) Makefile.* README +FILES = $(SRC) Makefile.* README # ------ DEFINITIONS ------ LIB = liblinalg.a -OBJ = $(SRC:.f=.o) $(SRC1:.F=.o) +OBJ = $(SRC:.f=.o) # ------ SETTINGS ------ @@ -34,9 +33,6 @@ lib: $(OBJ) # ------ COMPILE RULES ------ -%.o:%.F - $(FC) $(FFLAGS) -c $< - %.o:%.f $(FC) $(FFLAGS) -c $< diff --git a/lib/linalg/ilaenv.f b/lib/linalg/ilaenv.f index a639e0375a..3f0800b95e 100644 --- a/lib/linalg/ilaenv.f +++ b/lib/linalg/ilaenv.f @@ -180,8 +180,8 @@ INTRINSIC CHAR, ICHAR, INT, MIN, REAL * .. * .. External Functions .. - INTEGER IEEECK, IPARMQ, IPARAM2STAGE - EXTERNAL IEEECK, IPARMQ, IPARAM2STAGE + INTEGER IEEECK, IPARMQ + EXTERNAL IEEECK, IPARMQ * .. * .. Executable Statements .. * diff --git a/lib/linalg/iparam2stage.F b/lib/linalg/iparam2stage.F deleted file mode 100644 index ecf30dbea8..0000000000 --- a/lib/linalg/iparam2stage.F +++ /dev/null @@ -1,386 +0,0 @@ -*> \brief \b IPARAM2STAGE -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download IPARAM2STAGE + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION IPARAM2STAGE( ISPEC, NAME, OPTS, -* NI, NBI, IBI, NXI ) -* #if defined(_OPENMP) -* use omp_lib -* #endif -* IMPLICIT NONE -* -* .. Scalar Arguments .. -* CHARACTER*( * ) NAME, OPTS -* INTEGER ISPEC, NI, NBI, IBI, NXI -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> This program sets problem and machine dependent parameters -*> useful for xHETRD_2STAGE, xHETRD_H@2HB, xHETRD_HB2ST, -*> xGEBRD_2STAGE, xGEBRD_GE2GB, xGEBRD_GB2BD -*> and related subroutines for eigenvalue problems. -*> It is called whenever ILAENV is called with 17 <= ISPEC <= 21 -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ISPEC -*> \verbatim -*> ISPEC is integer scalar -*> ISPEC specifies which tunable parameter IPARAM2STAGE should -*> return. -*> -*> ISPEC=17: the optimal blocksize nb for the reduction to -* BAND -*> -*> ISPEC=18: the optimal blocksize ib for the eigenvectors -*> singular vectors update routine -*> -*> ISPEC=19: The length of the array that store the Housholder -*> representation for the second stage -*> Band to Tridiagonal or Bidiagonal -*> -*> ISPEC=20: The workspace needed for the routine in input. -*> -*> ISPEC=21: For future release. -*> \endverbatim -*> -*> \param[in] NAME -*> \verbatim -*> NAME is character string -*> Name of the calling subroutine -*> \endverbatim -*> -*> \param[in] OPTS -*> \verbatim -*> OPTS is CHARACTER*(*) -*> The character options to the subroutine NAME, concatenated -*> into a single character string. For example, UPLO = 'U', -*> TRANS = 'T', and DIAG = 'N' for a triangular routine would -*> be specified as OPTS = 'UTN'. -*> \endverbatim -*> -*> \param[in] NI -*> \verbatim -*> NI is INTEGER which is the size of the matrix -*> \endverbatim -*> -*> \param[in] NBI -*> \verbatim -*> NBI is INTEGER which is the used in the reduction, -* (e.g., the size of the band), needed to compute workspace -* and LHOUS2. -*> \endverbatim -*> -*> \param[in] IBI -*> \verbatim -*> IBI is INTEGER which represent the IB of the reduction, -* needed to compute workspace and LHOUS2. -*> \endverbatim -*> -*> \param[in] NXI -*> \verbatim -*> NXI is INTEGER needed in the future release. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date June 2016 -* -*> \ingroup auxOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Implemented by Azzam Haidar. -*> -*> All detail are available on technical report, SC11, SC13 papers. -*> -*> Azzam Haidar, Hatem Ltaief, and Jack Dongarra. -*> Parallel reduction to condensed forms for symmetric eigenvalue problems -*> using aggregated fine-grained and memory-aware kernels. In Proceedings -*> of 2011 International Conference for High Performance Computing, -*> Networking, Storage and Analysis (SC '11), New York, NY, USA, -*> Article 8 , 11 pages. -*> https://doi.acm.org/10.1145/2063384.2063394 -*> -*> A. Haidar, J. Kurzak, P. Luszczek, 2013. -*> An improved parallel singular value algorithm and its implementation -*> for multicore hardware, In Proceedings of 2013 International Conference -*> for High Performance Computing, Networking, Storage and Analysis (SC '13). -*> Denver, Colorado, USA, 2013. -*> Article 90, 12 pages. -*> https://doi.acm.org/10.1145/2503210.2503292 -*> -*> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra. -*> A novel hybrid CPU-GPU generalized eigensolver for electronic structure -*> calculations based on fine-grained memory aware tasks. -*> International Journal of High Performance Computing Applications. -*> Volume 28 Issue 2, Pages 196-209, May 2014. -*> http://hpc.sagepub.com/content/28/2/196 -*> -*> \endverbatim -*> -* ===================================================================== - INTEGER FUNCTION IPARAM2STAGE( ISPEC, NAME, OPTS, - $ NI, NBI, IBI, NXI ) -#if defined(_OPENMP) - use omp_lib -#endif - IMPLICIT NONE -* -* -- LAPACK auxiliary routine (version 3.7.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* June 2016 -* -* .. Scalar Arguments .. - CHARACTER*( * ) NAME, OPTS - INTEGER ISPEC, NI, NBI, IBI, NXI -* -* ================================================================ -* .. -* .. Local Scalars .. - INTEGER I, IC, IZ, KD, IB, LHOUS, LWORK, NTHREADS, - $ FACTOPTNB, QROPTNB, LQOPTNB - LOGICAL RPREC, CPREC - CHARACTER PREC*1, ALGO*3, STAG*5, SUBNAM*12, VECT*1 -* .. -* .. Intrinsic Functions .. - INTRINSIC CHAR, ICHAR, MAX -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. Executable Statements .. -* -* Invalid value for ISPEC -* - IF( (ISPEC.LT.17).OR.(ISPEC.GT.21) ) THEN - IPARAM2STAGE = -1 - RETURN - ENDIF -* -* Get the number of threads -* - NTHREADS = 1 -#if defined(_OPENMP) -!$OMP PARALLEL - NTHREADS = OMP_GET_NUM_THREADS() -!$OMP END PARALLEL -#endif -* WRITE(*,*) 'IPARAM VOICI NTHREADS ISPEC ',NTHREADS, ISPEC -* - IF( ISPEC .NE. 19 ) THEN -* -* Convert NAME to upper case if the first character is lower case. -* - IPARAM2STAGE = -1 - SUBNAM = NAME - IC = ICHAR( SUBNAM( 1: 1 ) ) - IZ = ICHAR( 'Z' ) - IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN -* -* ASCII character set -* - IF( IC.GE.97 .AND. IC.LE.122 ) THEN - SUBNAM( 1: 1 ) = CHAR( IC-32 ) - DO 100 I = 2, 12 - IC = ICHAR( SUBNAM( I: I ) ) - IF( IC.GE.97 .AND. IC.LE.122 ) - $ SUBNAM( I: I ) = CHAR( IC-32 ) - 100 CONTINUE - END IF -* - ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN -* -* EBCDIC character set -* - IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR. - $ ( IC.GE.145 .AND. IC.LE.153 ) .OR. - $ ( IC.GE.162 .AND. IC.LE.169 ) ) THEN - SUBNAM( 1: 1 ) = CHAR( IC+64 ) - DO 110 I = 2, 12 - IC = ICHAR( SUBNAM( I: I ) ) - IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR. - $ ( IC.GE.145 .AND. IC.LE.153 ) .OR. - $ ( IC.GE.162 .AND. IC.LE.169 ) )SUBNAM( I: - $ I ) = CHAR( IC+64 ) - 110 CONTINUE - END IF -* - ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN -* -* Prime machines: ASCII+128 -* - IF( IC.GE.225 .AND. IC.LE.250 ) THEN - SUBNAM( 1: 1 ) = CHAR( IC-32 ) - DO 120 I = 2, 12 - IC = ICHAR( SUBNAM( I: I ) ) - IF( IC.GE.225 .AND. IC.LE.250 ) - $ SUBNAM( I: I ) = CHAR( IC-32 ) - 120 CONTINUE - END IF - END IF -* - PREC = SUBNAM( 1: 1 ) - ALGO = SUBNAM( 4: 6 ) - STAG = SUBNAM( 8:12 ) - RPREC = PREC.EQ.'S' .OR. PREC.EQ.'D' - CPREC = PREC.EQ.'C' .OR. PREC.EQ.'Z' -* -* Invalid value for PRECISION -* - IF( .NOT.( RPREC .OR. CPREC ) ) THEN - IPARAM2STAGE = -1 - RETURN - ENDIF - ENDIF -* WRITE(*,*),'RPREC,CPREC ',RPREC,CPREC, -* $ ' ALGO ',ALGO,' STAGE ',STAG -* -* - IF (( ISPEC .EQ. 17 ) .OR. ( ISPEC .EQ. 18 )) THEN -* -* ISPEC = 17, 18: block size KD, IB -* Could be also dependent from N but for now it -* depend only on sequential or parallel -* - IF( NTHREADS.GT.4 ) THEN - IF( CPREC ) THEN - KD = 128 - IB = 32 - ELSE - KD = 160 - IB = 40 - ENDIF - ELSE IF( NTHREADS.GT.1 ) THEN - IF( CPREC ) THEN - KD = 64 - IB = 32 - ELSE - KD = 64 - IB = 32 - ENDIF - ELSE - IF( CPREC ) THEN - KD = 16 - IB = 16 - ELSE - KD = 32 - IB = 16 - ENDIF - ENDIF - IF( ISPEC.EQ.17 ) IPARAM2STAGE = KD - IF( ISPEC.EQ.18 ) IPARAM2STAGE = IB -* - ELSE IF ( ISPEC .EQ. 19 ) THEN -* -* ISPEC = 19: -* LHOUS length of the Houselholder representation -* matrix (V,T) of the second stage. should be >= 1. -* -* Will add the VECT OPTION HERE next release - VECT = OPTS(1:1) - IF( VECT.EQ.'N' ) THEN - LHOUS = MAX( 1, 4*NI ) - ELSE -* This is not correct, it need to call the ALGO and the stage2 - LHOUS = MAX( 1, 4*NI ) + IBI - ENDIF - IF( LHOUS.GE.0 ) THEN - IPARAM2STAGE = LHOUS - ELSE - IPARAM2STAGE = -1 - ENDIF -* - ELSE IF ( ISPEC .EQ. 20 ) THEN -* -* ISPEC = 20: (21 for future use) -* LWORK length of the workspace for -* either or both stages for TRD and BRD. should be >= 1. -* TRD: -* TRD_stage 1: = LT + LW + LS1 + LS2 -* = LDT*KD + N*KD + N*MAX(KD,FACTOPTNB) + LDS2*KD -* where LDT=LDS2=KD -* = N*KD + N*max(KD,FACTOPTNB) + 2*KD*KD -* TRD_stage 2: = (2NB+1)*N + KD*NTHREADS -* TRD_both : = max(stage1,stage2) + AB ( AB=(KD+1)*N ) -* = N*KD + N*max(KD+1,FACTOPTNB) -* + max(2*KD*KD, KD*NTHREADS) -* + (KD+1)*N - LWORK = -1 - SUBNAM(1:1) = PREC - SUBNAM(2:6) = 'GEQRF' - QROPTNB = ILAENV( 1, SUBNAM, ' ', NI, NBI, -1, -1 ) - SUBNAM(2:6) = 'GELQF' - LQOPTNB = ILAENV( 1, SUBNAM, ' ', NBI, NI, -1, -1 ) -* Could be QR or LQ for TRD and the max for BRD - FACTOPTNB = MAX(QROPTNB, LQOPTNB) - IF( ALGO.EQ.'TRD' ) THEN - IF( STAG.EQ.'2STAG' ) THEN - LWORK = NI*NBI + NI*MAX(NBI+1,FACTOPTNB) - $ + MAX(2*NBI*NBI, NBI*NTHREADS) - $ + (NBI+1)*NI - ELSE IF( (STAG.EQ.'HE2HB').OR.(STAG.EQ.'SY2SB') ) THEN - LWORK = NI*NBI + NI*MAX(NBI,FACTOPTNB) + 2*NBI*NBI - ELSE IF( (STAG.EQ.'HB2ST').OR.(STAG.EQ.'SB2ST') ) THEN - LWORK = (2*NBI+1)*NI + NBI*NTHREADS - ENDIF - ELSE IF( ALGO.EQ.'BRD' ) THEN - IF( STAG.EQ.'2STAG' ) THEN - LWORK = 2*NI*NBI + NI*MAX(NBI+1,FACTOPTNB) - $ + MAX(2*NBI*NBI, NBI*NTHREADS) - $ + (NBI+1)*NI - ELSE IF( STAG.EQ.'GE2GB' ) THEN - LWORK = NI*NBI + NI*MAX(NBI,FACTOPTNB) + 2*NBI*NBI - ELSE IF( STAG.EQ.'GB2BD' ) THEN - LWORK = (3*NBI+1)*NI + NBI*NTHREADS - ENDIF - ENDIF - LWORK = MAX ( 1, LWORK ) - - IF( LWORK.GT.0 ) THEN - IPARAM2STAGE = LWORK - ELSE - IPARAM2STAGE = -1 - ENDIF -* - ELSE IF ( ISPEC .EQ. 21 ) THEN -* -* ISPEC = 21 for future use - IPARAM2STAGE = NXI - ENDIF -* -* ==== End of IPARAM2STAGE ==== -* - END From c5a87f75d6cfbcca5a4b6e2e2f44865c55bf6a89 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 13:18:38 -0500 Subject: [PATCH 23/47] convert linalg library from Fortran to C++ --- cmake/CMakeLists.txt | 9 +- .../{Makefile.gfortran => Makefile.g++} | 18 +- lib/linalg/Makefile.mpi | 18 +- lib/linalg/Makefile.serial | 2 +- lib/linalg/convert.sh | 44 + lib/linalg/dasum.cpp | 168 + lib/linalg/daxpy.cpp | 194 + lib/linalg/dbdsqr.cpp | 1053 +++++ lib/linalg/dcabs1.cpp | 92 + lib/linalg/dcopy.cpp | 187 + lib/linalg/ddot.cpp | 189 + lib/linalg/dgebd2.cpp | 393 ++ lib/linalg/dgebrd.cpp | 431 ++ lib/linalg/dgecon.cpp | 313 ++ lib/linalg/dgelq2.cpp | 245 + lib/linalg/dgelqf.cpp | 345 ++ lib/linalg/dgelsd.cpp | 816 ++++ lib/linalg/dgelss.cpp | 988 ++++ lib/linalg/dgemm.cpp | 458 ++ lib/linalg/dgemv.cpp | 385 ++ lib/linalg/dgeqr2.cpp | 250 + lib/linalg/dgeqrf.cpp | 354 ++ lib/linalg/dger.cpp | 265 ++ lib/linalg/dgesv.cpp | 217 + lib/linalg/dgesvd.cpp | 4158 +++++++++++++++++ lib/linalg/dgetf2.cpp | 266 ++ lib/linalg/dgetrf.cpp | 293 ++ lib/linalg/dgetrf2.cpp | 331 ++ lib/linalg/dgetri.cpp | 343 ++ lib/linalg/dgetrs.cpp | 272 ++ lib/linalg/disnan.cpp | 14 + lib/linalg/dlabad.cpp | 128 + lib/linalg/dlabrd.cpp | 532 +++ lib/linalg/dlacn2.cpp | 364 ++ lib/linalg/dlacpy.cpp | 200 + lib/linalg/dladiv.cpp | 277 ++ lib/linalg/dlae2.cpp | 210 + lib/linalg/dlaed0.cpp | 534 +++ lib/linalg/dlaed1.cpp | 336 ++ lib/linalg/dlaed2.cpp | 646 +++ lib/linalg/dlaed3.cpp | 437 ++ lib/linalg/dlaed4.cpp | 1036 ++++ lib/linalg/dlaed5.cpp | 219 + lib/linalg/dlaed6.cpp | 463 ++ lib/linalg/dlaed7.cpp | 483 ++ lib/linalg/dlaed8.cpp | 610 +++ lib/linalg/dlaed9.cpp | 370 ++ lib/linalg/dlaeda.cpp | 386 ++ lib/linalg/dlaev2.cpp | 263 ++ lib/linalg/dlals0.cpp | 602 +++ lib/linalg/dlalsa.cpp | 598 +++ lib/linalg/dlalsd.cpp | 632 +++ lib/linalg/dlamch.cpp | 45 + lib/linalg/dlamrg.cpp | 206 + lib/linalg/dlange.cpp | 277 ++ lib/linalg/dlanst.cpp | 239 + lib/linalg/dlansy.cpp | 317 ++ lib/linalg/dlapy2.cpp | 150 + lib/linalg/dlapy3.cpp | 149 + lib/linalg/dlarf.cpp | 275 ++ lib/linalg/dlarfb.cpp | 886 ++++ lib/linalg/dlarfg.cpp | 240 + lib/linalg/dlarft.cpp | 417 ++ lib/linalg/dlartg.cpp | 258 + lib/linalg/dlas2.cpp | 212 + lib/linalg/dlascl.cpp | 448 ++ lib/linalg/dlasd4.cpp | 1198 +++++ lib/linalg/dlasd5.cpp | 264 ++ lib/linalg/dlasd6.cpp | 514 ++ lib/linalg/dlasd7.cpp | 663 +++ lib/linalg/dlasd8.cpp | 419 ++ lib/linalg/dlasda.cpp | 624 +++ lib/linalg/dlasdq.cpp | 486 ++ lib/linalg/dlasdt.cpp | 209 + lib/linalg/dlaset.cpp | 229 + lib/linalg/dlasq1.cpp | 298 ++ lib/linalg/dlasq2.cpp | 716 +++ lib/linalg/dlasq3.cpp | 475 ++ lib/linalg/dlasq4.cpp | 501 ++ lib/linalg/dlasq5.cpp | 480 ++ lib/linalg/dlasq6.cpp | 291 ++ lib/linalg/dlasr.cpp | 536 +++ lib/linalg/dlasrt.cpp | 352 ++ lib/linalg/dlassq.cpp | 191 + lib/linalg/dlasv2.cpp | 356 ++ lib/linalg/dlaswp.cpp | 238 + lib/linalg/dlatrd.cpp | 445 ++ lib/linalg/dlatrs.cpp | 984 ++++ lib/linalg/dnrm2.cpp | 169 + lib/linalg/dorg2l.cpp | 252 + lib/linalg/dorg2r.cpp | 255 + lib/linalg/dorgbr.cpp | 404 ++ lib/linalg/dorgl2.cpp | 254 + lib/linalg/dorglq.cpp | 366 ++ lib/linalg/dorgql.cpp | 376 ++ lib/linalg/dorgqr.cpp | 367 ++ lib/linalg/dorgtr.cpp | 331 ++ lib/linalg/dorm2l.cpp | 324 ++ lib/linalg/dorm2r.cpp | 328 ++ lib/linalg/dormbr.cpp | 464 ++ lib/linalg/dorml2.cpp | 324 ++ lib/linalg/dormlq.cpp | 424 ++ lib/linalg/dormql.cpp | 416 ++ lib/linalg/dormqr.cpp | 417 ++ lib/linalg/dormtr.cpp | 396 ++ lib/linalg/dposv.cpp | 232 + lib/linalg/dpotf2.cpp | 294 ++ lib/linalg/dpotrf.cpp | 322 ++ lib/linalg/dpotrf2.cpp | 285 ++ lib/linalg/dpotrs.cpp | 248 + lib/linalg/drot.cpp | 180 + lib/linalg/drscl.cpp | 200 + lib/linalg/dscal.cpp | 173 + lib/linalg/dstedc.cpp | 576 +++ lib/linalg/dsteqr.cpp | 704 +++ lib/linalg/dsterf.cpp | 534 +++ lib/linalg/dswap.cpp | 194 + lib/linalg/dsyev.cpp | 369 ++ lib/linalg/dsyevd.cpp | 440 ++ lib/linalg/dsygs2.cpp | 381 ++ lib/linalg/dsygst.cpp | 436 ++ lib/linalg/dsygv.cpp | 384 ++ lib/linalg/dsygvd.cpp | 445 ++ lib/linalg/dsymm.cpp | 440 ++ lib/linalg/dsymv.cpp | 388 ++ lib/linalg/dsyr2.cpp | 347 ++ lib/linalg/dsyr2k.cpp | 485 ++ lib/linalg/dsyrk.cpp | 445 ++ lib/linalg/dsytd2.cpp | 389 ++ lib/linalg/dsytrd.cpp | 454 ++ lib/linalg/dtrmm.cpp | 527 +++ lib/linalg/dtrmv.cpp | 415 ++ lib/linalg/dtrsm.cpp | 565 +++ lib/linalg/dtrsv.cpp | 411 ++ lib/linalg/dtrti2.cpp | 258 + lib/linalg/dtrtri.cpp | 321 ++ lib/linalg/dznrm2.cpp | 183 + lib/linalg/{ => fortran}/dasum.f | 0 lib/linalg/{ => fortran}/daxpy.f | 0 lib/linalg/{ => fortran}/dbdsqr.f | 0 lib/linalg/{ => fortran}/dcabs1.f | 0 lib/linalg/{ => fortran}/dcopy.f | 0 lib/linalg/{ => fortran}/ddot.f | 0 lib/linalg/{ => fortran}/dgebd2.f | 0 lib/linalg/{ => fortran}/dgebrd.f | 0 lib/linalg/{ => fortran}/dgecon.f | 0 lib/linalg/{ => fortran}/dgelq2.f | 0 lib/linalg/{ => fortran}/dgelqf.f | 0 lib/linalg/{ => fortran}/dgelsd.f | 0 lib/linalg/{ => fortran}/dgelss.f | 0 lib/linalg/{ => fortran}/dgemm.f | 0 lib/linalg/{ => fortran}/dgemv.f | 0 lib/linalg/{ => fortran}/dgeqr2.f | 0 lib/linalg/{ => fortran}/dgeqrf.f | 0 lib/linalg/{ => fortran}/dger.f | 0 lib/linalg/{ => fortran}/dgesv.f | 0 lib/linalg/{ => fortran}/dgesvd.f | 0 lib/linalg/{ => fortran}/dgetf2.f | 0 lib/linalg/{ => fortran}/dgetrf.f | 0 lib/linalg/{ => fortran}/dgetrf2.f | 0 lib/linalg/{ => fortran}/dgetri.f | 0 lib/linalg/{ => fortran}/dgetrs.f | 0 lib/linalg/{ => fortran}/disnan.f | 0 lib/linalg/{ => fortran}/dlabad.f | 0 lib/linalg/{ => fortran}/dlabrd.f | 0 lib/linalg/{ => fortran}/dlacn2.f | 0 lib/linalg/{ => fortran}/dlacpy.f | 0 lib/linalg/{ => fortran}/dladiv.f | 0 lib/linalg/{ => fortran}/dlae2.f | 0 lib/linalg/{ => fortran}/dlaed0.f | 0 lib/linalg/{ => fortran}/dlaed1.f | 0 lib/linalg/{ => fortran}/dlaed2.f | 0 lib/linalg/{ => fortran}/dlaed3.f | 0 lib/linalg/{ => fortran}/dlaed4.f | 0 lib/linalg/{ => fortran}/dlaed5.f | 0 lib/linalg/{ => fortran}/dlaed6.f | 0 lib/linalg/{ => fortran}/dlaed7.f | 0 lib/linalg/{ => fortran}/dlaed8.f | 0 lib/linalg/{ => fortran}/dlaed9.f | 0 lib/linalg/{ => fortran}/dlaeda.f | 0 lib/linalg/{ => fortran}/dlaev2.f | 0 lib/linalg/{ => fortran}/dlaisnan.f | 0 lib/linalg/{ => fortran}/dlals0.f | 0 lib/linalg/{ => fortran}/dlalsa.f | 0 lib/linalg/{ => fortran}/dlalsd.f | 0 lib/linalg/{ => fortran}/dlamch.f | 0 lib/linalg/{ => fortran}/dlamrg.f | 0 lib/linalg/{ => fortran}/dlange.f | 0 lib/linalg/{ => fortran}/dlanst.f | 0 lib/linalg/{ => fortran}/dlansy.f | 0 lib/linalg/{ => fortran}/dlapy2.f | 0 lib/linalg/{ => fortran}/dlapy3.f | 0 lib/linalg/{ => fortran}/dlarf.f | 0 lib/linalg/{ => fortran}/dlarfb.f | 0 lib/linalg/{ => fortran}/dlarfg.f | 0 lib/linalg/{ => fortran}/dlarft.f | 0 lib/linalg/{ => fortran}/dlartg.f | 0 lib/linalg/{ => fortran}/dlas2.f | 0 lib/linalg/{ => fortran}/dlascl.f | 0 lib/linalg/{ => fortran}/dlasd4.f | 0 lib/linalg/{ => fortran}/dlasd5.f | 0 lib/linalg/{ => fortran}/dlasd6.f | 0 lib/linalg/{ => fortran}/dlasd7.f | 0 lib/linalg/{ => fortran}/dlasd8.f | 0 lib/linalg/{ => fortran}/dlasda.f | 0 lib/linalg/{ => fortran}/dlasdq.f | 0 lib/linalg/{ => fortran}/dlasdt.f | 0 lib/linalg/{ => fortran}/dlaset.f | 0 lib/linalg/{ => fortran}/dlasq1.f | 0 lib/linalg/{ => fortran}/dlasq2.f | 0 lib/linalg/{ => fortran}/dlasq3.f | 0 lib/linalg/{ => fortran}/dlasq4.f | 0 lib/linalg/{ => fortran}/dlasq5.f | 0 lib/linalg/{ => fortran}/dlasq6.f | 0 lib/linalg/{ => fortran}/dlasr.f | 0 lib/linalg/{ => fortran}/dlasrt.f | 0 lib/linalg/{ => fortran}/dlassq.f | 0 lib/linalg/{ => fortran}/dlasv2.f | 0 lib/linalg/{ => fortran}/dlaswp.f | 0 lib/linalg/{ => fortran}/dlatrd.f | 0 lib/linalg/{ => fortran}/dlatrs.f | 0 lib/linalg/{ => fortran}/dnrm2.f | 0 lib/linalg/{ => fortran}/dorg2l.f | 0 lib/linalg/{ => fortran}/dorg2r.f | 0 lib/linalg/{ => fortran}/dorgbr.f | 0 lib/linalg/{ => fortran}/dorgl2.f | 0 lib/linalg/{ => fortran}/dorglq.f | 0 lib/linalg/{ => fortran}/dorgql.f | 0 lib/linalg/{ => fortran}/dorgqr.f | 0 lib/linalg/{ => fortran}/dorgtr.f | 0 lib/linalg/{ => fortran}/dorm2l.f | 0 lib/linalg/{ => fortran}/dorm2r.f | 0 lib/linalg/{ => fortran}/dormbr.f | 0 lib/linalg/{ => fortran}/dorml2.f | 0 lib/linalg/{ => fortran}/dormlq.f | 0 lib/linalg/{ => fortran}/dormql.f | 0 lib/linalg/{ => fortran}/dormqr.f | 0 lib/linalg/{ => fortran}/dormtr.f | 0 lib/linalg/{ => fortran}/dposv.f | 0 lib/linalg/{ => fortran}/dpotf2.f | 0 lib/linalg/{ => fortran}/dpotrf.f | 0 lib/linalg/{ => fortran}/dpotrf2.f | 0 lib/linalg/{ => fortran}/dpotrs.f | 0 lib/linalg/{ => fortran}/drot.f | 0 lib/linalg/{ => fortran}/drscl.f | 0 lib/linalg/{ => fortran}/dscal.f | 0 lib/linalg/{ => fortran}/dstedc.f | 0 lib/linalg/{ => fortran}/dsteqr.f | 0 lib/linalg/{ => fortran}/dsterf.f | 0 lib/linalg/{ => fortran}/dswap.f | 0 lib/linalg/{ => fortran}/dsyev.f | 0 lib/linalg/{ => fortran}/dsyevd.f | 0 lib/linalg/{ => fortran}/dsygs2.f | 0 lib/linalg/{ => fortran}/dsygst.f | 0 lib/linalg/{ => fortran}/dsygv.f | 0 lib/linalg/{ => fortran}/dsygvd.f | 0 lib/linalg/{ => fortran}/dsymm.f | 0 lib/linalg/{ => fortran}/dsymv.f | 0 lib/linalg/{ => fortran}/dsyr2.f | 0 lib/linalg/{ => fortran}/dsyr2k.f | 0 lib/linalg/{ => fortran}/dsyrk.f | 0 lib/linalg/{ => fortran}/dsytd2.f | 0 lib/linalg/{ => fortran}/dsytrd.f | 0 lib/linalg/{ => fortran}/dtrmm.f | 0 lib/linalg/{ => fortran}/dtrmv.f | 0 lib/linalg/{ => fortran}/dtrsm.f | 0 lib/linalg/{ => fortran}/dtrsv.f | 0 lib/linalg/{ => fortran}/dtrti2.f | 0 lib/linalg/{ => fortran}/dtrtri.f | 0 lib/linalg/{ => fortran}/dznrm2.f | 0 lib/linalg/{ => fortran}/idamax.f | 0 lib/linalg/{ => fortran}/ieeeck.f | 0 lib/linalg/{ => fortran}/iladlc.f | 0 lib/linalg/{ => fortran}/iladlr.f | 0 lib/linalg/{ => fortran}/ilaenv.f | 0 lib/linalg/{ => fortran}/ilazlc.f | 0 lib/linalg/{ => fortran}/ilazlr.f | 0 lib/linalg/{ => fortran}/iparmq.f | 0 lib/linalg/{ => fortran}/lsame.f | 0 lib/linalg/{ => fortran}/xerbla.f | 0 lib/linalg/{ => fortran}/zaxpy.f | 0 lib/linalg/{ => fortran}/zcopy.f | 0 lib/linalg/{ => fortran}/zdotc.f | 0 lib/linalg/{ => fortran}/zdrot.f | 0 lib/linalg/{ => fortran}/zdscal.f | 0 lib/linalg/{ => fortran}/zgemm.f | 0 lib/linalg/{ => fortran}/zgemv.f | 0 lib/linalg/{ => fortran}/zgerc.f | 0 lib/linalg/{ => fortran}/zheev.f | 0 lib/linalg/{ => fortran}/zheevd.f | 0 lib/linalg/{ => fortran}/zhemv.f | 0 lib/linalg/{ => fortran}/zher2.f | 0 lib/linalg/{ => fortran}/zher2k.f | 0 lib/linalg/{ => fortran}/zhetd2.f | 0 lib/linalg/{ => fortran}/zhetrd.f | 0 lib/linalg/{ => fortran}/zhpr.f | 0 lib/linalg/{ => fortran}/zlacgv.f | 0 lib/linalg/{ => fortran}/zlacpy.f | 0 lib/linalg/{ => fortran}/zlacrm.f | 0 lib/linalg/{ => fortran}/zladiv.f | 0 lib/linalg/{ => fortran}/zlaed0.f | 0 lib/linalg/{ => fortran}/zlaed7.f | 0 lib/linalg/{ => fortran}/zlaed8.f | 0 lib/linalg/{ => fortran}/zlanhe.f | 0 lib/linalg/{ => fortran}/zlarf.f | 0 lib/linalg/{ => fortran}/zlarfb.f | 0 lib/linalg/{ => fortran}/zlarfg.f | 0 lib/linalg/{ => fortran}/zlarft.f | 0 lib/linalg/{ => fortran}/zlascl.f | 0 lib/linalg/{ => fortran}/zlaset.f | 0 lib/linalg/{ => fortran}/zlasr.f | 0 lib/linalg/{ => fortran}/zlassq.f | 0 lib/linalg/{ => fortran}/zlatrd.f | 0 lib/linalg/{ => fortran}/zpptrf.f | 0 lib/linalg/{ => fortran}/zpptri.f | 0 lib/linalg/{ => fortran}/zscal.f | 0 lib/linalg/{ => fortran}/zstedc.f | 0 lib/linalg/{ => fortran}/zsteqr.f | 0 lib/linalg/{ => fortran}/zswap.f | 0 lib/linalg/{ => fortran}/ztpmv.f | 0 lib/linalg/{ => fortran}/ztpsv.f | 0 lib/linalg/{ => fortran}/ztptri.f | 0 lib/linalg/{ => fortran}/ztrmm.f | 0 lib/linalg/{ => fortran}/ztrmv.f | 0 lib/linalg/{ => fortran}/zung2l.f | 0 lib/linalg/{ => fortran}/zung2r.f | 0 lib/linalg/{ => fortran}/zungl2.f | 0 lib/linalg/{ => fortran}/zungql.f | 0 lib/linalg/{ => fortran}/zungqr.f | 0 lib/linalg/{ => fortran}/zungtr.f | 0 lib/linalg/{ => fortran}/zunm2l.f | 0 lib/linalg/{ => fortran}/zunm2r.f | 0 lib/linalg/{ => fortran}/zunmql.f | 0 lib/linalg/{ => fortran}/zunmqr.f | 0 lib/linalg/{ => fortran}/zunmtr.f | 0 lib/linalg/idamax.cpp | 161 + lib/linalg/ieeeck.cpp | 228 + lib/linalg/iladlc.cpp | 150 + lib/linalg/iladlr.cpp | 151 + lib/linalg/ilaenv.cpp | 845 ++++ lib/linalg/ilazlc.cpp | 156 + lib/linalg/ilazlr.cpp | 159 + lib/linalg/iparmq.cpp | 449 ++ lib/linalg/lmp_f2c.h | 223 + lib/linalg/lsame.cpp | 17 + lib/linalg/static/README | 5 + lib/linalg/static/dgetrf2.f | 269 ++ lib/linalg/static/disnan.cpp | 14 + lib/linalg/static/dlamch.cpp | 45 + lib/linalg/static/dlarft.f | 327 ++ lib/linalg/static/dpotrf2.f | 234 + lib/linalg/static/lsame.cpp | 17 + lib/linalg/static/xerbla.cpp | 30 + lib/linalg/static/zlarft.f | 328 ++ lib/linalg/xerbla.cpp | 30 + lib/linalg/zaxpy.cpp | 191 + lib/linalg/zcopy.cpp | 168 + lib/linalg/zdotc.cpp | 186 + lib/linalg/zdrot.cpp | 213 + lib/linalg/zdscal.cpp | 169 + lib/linalg/zgemm.cpp | 763 +++ lib/linalg/zgemv.cpp | 477 ++ lib/linalg/zgerc.cpp | 289 ++ lib/linalg/zheev.cpp | 379 ++ lib/linalg/zheevd.cpp | 486 ++ lib/linalg/zhemv.cpp | 508 ++ lib/linalg/zher2.cpp | 519 ++ lib/linalg/zher2k.cpp | 750 +++ lib/linalg/zhetd2.cpp | 439 ++ lib/linalg/zhetrd.cpp | 463 ++ lib/linalg/zhpr.cpp | 405 ++ lib/linalg/zlacgv.cpp | 157 + lib/linalg/zlacpy.cpp | 210 + lib/linalg/zlacrm.cpp | 258 + lib/linalg/zladiv.cpp | 132 + lib/linalg/zlaed0.cpp | 458 ++ lib/linalg/zlaed7.cpp | 456 ++ lib/linalg/zlaed8.cpp | 569 +++ lib/linalg/zlanhe.cpp | 348 ++ lib/linalg/zlarf.cpp | 283 ++ lib/linalg/zlarfb.cpp | 949 ++++ lib/linalg/zlarfg.cpp | 261 ++ lib/linalg/zlarft.cpp | 465 ++ lib/linalg/zlascl.cpp | 470 ++ lib/linalg/zlaset.cpp | 240 + lib/linalg/zlasr.cpp | 694 +++ lib/linalg/zlassq.cpp | 212 + lib/linalg/zlatrd.cpp | 509 ++ lib/linalg/zpptrf.cpp | 301 ++ lib/linalg/zpptri.cpp | 248 + lib/linalg/zscal.cpp | 162 + lib/linalg/zstedc.cpp | 590 +++ lib/linalg/zsteqr.cpp | 706 +++ lib/linalg/zswap.cpp | 176 + lib/linalg/ztpmv.cpp | 639 +++ lib/linalg/ztpsv.cpp | 607 +++ lib/linalg/ztptri.cpp | 308 ++ lib/linalg/ztrmm.cpp | 762 +++ lib/linalg/ztrmv.cpp | 624 +++ lib/linalg/zung2l.cpp | 262 ++ lib/linalg/zung2r.cpp | 264 ++ lib/linalg/zungl2.cpp | 273 ++ lib/linalg/zungql.cpp | 381 ++ lib/linalg/zungqr.cpp | 372 ++ lib/linalg/zungtr.cpp | 342 ++ lib/linalg/zunm2l.cpp | 339 ++ lib/linalg/zunm2r.cpp | 343 ++ lib/linalg/zunmql.cpp | 419 ++ lib/linalg/zunmqr.cpp | 420 ++ lib/linalg/zunmtr.cpp | 397 ++ 410 files changed, 80736 insertions(+), 30 deletions(-) rename lib/linalg/{Makefile.gfortran => Makefile.g++} (65%) create mode 100755 lib/linalg/convert.sh create mode 100644 lib/linalg/dasum.cpp create mode 100644 lib/linalg/daxpy.cpp create mode 100644 lib/linalg/dbdsqr.cpp create mode 100644 lib/linalg/dcabs1.cpp create mode 100644 lib/linalg/dcopy.cpp create mode 100644 lib/linalg/ddot.cpp create mode 100644 lib/linalg/dgebd2.cpp create mode 100644 lib/linalg/dgebrd.cpp create mode 100644 lib/linalg/dgecon.cpp create mode 100644 lib/linalg/dgelq2.cpp create mode 100644 lib/linalg/dgelqf.cpp create mode 100644 lib/linalg/dgelsd.cpp create mode 100644 lib/linalg/dgelss.cpp create mode 100644 lib/linalg/dgemm.cpp create mode 100644 lib/linalg/dgemv.cpp create mode 100644 lib/linalg/dgeqr2.cpp create mode 100644 lib/linalg/dgeqrf.cpp create mode 100644 lib/linalg/dger.cpp create mode 100644 lib/linalg/dgesv.cpp create mode 100644 lib/linalg/dgesvd.cpp create mode 100644 lib/linalg/dgetf2.cpp create mode 100644 lib/linalg/dgetrf.cpp create mode 100644 lib/linalg/dgetrf2.cpp create mode 100644 lib/linalg/dgetri.cpp create mode 100644 lib/linalg/dgetrs.cpp create mode 100644 lib/linalg/disnan.cpp create mode 100644 lib/linalg/dlabad.cpp create mode 100644 lib/linalg/dlabrd.cpp create mode 100644 lib/linalg/dlacn2.cpp create mode 100644 lib/linalg/dlacpy.cpp create mode 100644 lib/linalg/dladiv.cpp create mode 100644 lib/linalg/dlae2.cpp create mode 100644 lib/linalg/dlaed0.cpp create mode 100644 lib/linalg/dlaed1.cpp create mode 100644 lib/linalg/dlaed2.cpp create mode 100644 lib/linalg/dlaed3.cpp create mode 100644 lib/linalg/dlaed4.cpp create mode 100644 lib/linalg/dlaed5.cpp create mode 100644 lib/linalg/dlaed6.cpp create mode 100644 lib/linalg/dlaed7.cpp create mode 100644 lib/linalg/dlaed8.cpp create mode 100644 lib/linalg/dlaed9.cpp create mode 100644 lib/linalg/dlaeda.cpp create mode 100644 lib/linalg/dlaev2.cpp create mode 100644 lib/linalg/dlals0.cpp create mode 100644 lib/linalg/dlalsa.cpp create mode 100644 lib/linalg/dlalsd.cpp create mode 100644 lib/linalg/dlamch.cpp create mode 100644 lib/linalg/dlamrg.cpp create mode 100644 lib/linalg/dlange.cpp create mode 100644 lib/linalg/dlanst.cpp create mode 100644 lib/linalg/dlansy.cpp create mode 100644 lib/linalg/dlapy2.cpp create mode 100644 lib/linalg/dlapy3.cpp create mode 100644 lib/linalg/dlarf.cpp create mode 100644 lib/linalg/dlarfb.cpp create mode 100644 lib/linalg/dlarfg.cpp create mode 100644 lib/linalg/dlarft.cpp create mode 100644 lib/linalg/dlartg.cpp create mode 100644 lib/linalg/dlas2.cpp create mode 100644 lib/linalg/dlascl.cpp create mode 100644 lib/linalg/dlasd4.cpp create mode 100644 lib/linalg/dlasd5.cpp create mode 100644 lib/linalg/dlasd6.cpp create mode 100644 lib/linalg/dlasd7.cpp create mode 100644 lib/linalg/dlasd8.cpp create mode 100644 lib/linalg/dlasda.cpp create mode 100644 lib/linalg/dlasdq.cpp create mode 100644 lib/linalg/dlasdt.cpp create mode 100644 lib/linalg/dlaset.cpp create mode 100644 lib/linalg/dlasq1.cpp create mode 100644 lib/linalg/dlasq2.cpp create mode 100644 lib/linalg/dlasq3.cpp create mode 100644 lib/linalg/dlasq4.cpp create mode 100644 lib/linalg/dlasq5.cpp create mode 100644 lib/linalg/dlasq6.cpp create mode 100644 lib/linalg/dlasr.cpp create mode 100644 lib/linalg/dlasrt.cpp create mode 100644 lib/linalg/dlassq.cpp create mode 100644 lib/linalg/dlasv2.cpp create mode 100644 lib/linalg/dlaswp.cpp create mode 100644 lib/linalg/dlatrd.cpp create mode 100644 lib/linalg/dlatrs.cpp create mode 100644 lib/linalg/dnrm2.cpp create mode 100644 lib/linalg/dorg2l.cpp create mode 100644 lib/linalg/dorg2r.cpp create mode 100644 lib/linalg/dorgbr.cpp create mode 100644 lib/linalg/dorgl2.cpp create mode 100644 lib/linalg/dorglq.cpp create mode 100644 lib/linalg/dorgql.cpp create mode 100644 lib/linalg/dorgqr.cpp create mode 100644 lib/linalg/dorgtr.cpp create mode 100644 lib/linalg/dorm2l.cpp create mode 100644 lib/linalg/dorm2r.cpp create mode 100644 lib/linalg/dormbr.cpp create mode 100644 lib/linalg/dorml2.cpp create mode 100644 lib/linalg/dormlq.cpp create mode 100644 lib/linalg/dormql.cpp create mode 100644 lib/linalg/dormqr.cpp create mode 100644 lib/linalg/dormtr.cpp create mode 100644 lib/linalg/dposv.cpp create mode 100644 lib/linalg/dpotf2.cpp create mode 100644 lib/linalg/dpotrf.cpp create mode 100644 lib/linalg/dpotrf2.cpp create mode 100644 lib/linalg/dpotrs.cpp create mode 100644 lib/linalg/drot.cpp create mode 100644 lib/linalg/drscl.cpp create mode 100644 lib/linalg/dscal.cpp create mode 100644 lib/linalg/dstedc.cpp create mode 100644 lib/linalg/dsteqr.cpp create mode 100644 lib/linalg/dsterf.cpp create mode 100644 lib/linalg/dswap.cpp create mode 100644 lib/linalg/dsyev.cpp create mode 100644 lib/linalg/dsyevd.cpp create mode 100644 lib/linalg/dsygs2.cpp create mode 100644 lib/linalg/dsygst.cpp create mode 100644 lib/linalg/dsygv.cpp create mode 100644 lib/linalg/dsygvd.cpp create mode 100644 lib/linalg/dsymm.cpp create mode 100644 lib/linalg/dsymv.cpp create mode 100644 lib/linalg/dsyr2.cpp create mode 100644 lib/linalg/dsyr2k.cpp create mode 100644 lib/linalg/dsyrk.cpp create mode 100644 lib/linalg/dsytd2.cpp create mode 100644 lib/linalg/dsytrd.cpp create mode 100644 lib/linalg/dtrmm.cpp create mode 100644 lib/linalg/dtrmv.cpp create mode 100644 lib/linalg/dtrsm.cpp create mode 100644 lib/linalg/dtrsv.cpp create mode 100644 lib/linalg/dtrti2.cpp create mode 100644 lib/linalg/dtrtri.cpp create mode 100644 lib/linalg/dznrm2.cpp rename lib/linalg/{ => fortran}/dasum.f (100%) rename lib/linalg/{ => fortran}/daxpy.f (100%) rename lib/linalg/{ => fortran}/dbdsqr.f (100%) rename lib/linalg/{ => fortran}/dcabs1.f (100%) rename lib/linalg/{ => fortran}/dcopy.f (100%) rename lib/linalg/{ => fortran}/ddot.f (100%) rename lib/linalg/{ => fortran}/dgebd2.f (100%) rename lib/linalg/{ => fortran}/dgebrd.f (100%) rename lib/linalg/{ => fortran}/dgecon.f (100%) rename lib/linalg/{ => fortran}/dgelq2.f (100%) rename lib/linalg/{ => fortran}/dgelqf.f (100%) rename lib/linalg/{ => fortran}/dgelsd.f (100%) rename lib/linalg/{ => fortran}/dgelss.f (100%) rename lib/linalg/{ => fortran}/dgemm.f (100%) rename lib/linalg/{ => fortran}/dgemv.f (100%) rename lib/linalg/{ => fortran}/dgeqr2.f (100%) rename lib/linalg/{ => fortran}/dgeqrf.f (100%) rename lib/linalg/{ => fortran}/dger.f (100%) rename lib/linalg/{ => fortran}/dgesv.f (100%) rename lib/linalg/{ => fortran}/dgesvd.f (100%) rename lib/linalg/{ => fortran}/dgetf2.f (100%) rename lib/linalg/{ => fortran}/dgetrf.f (100%) rename lib/linalg/{ => fortran}/dgetrf2.f (100%) rename lib/linalg/{ => fortran}/dgetri.f (100%) rename lib/linalg/{ => fortran}/dgetrs.f (100%) rename lib/linalg/{ => fortran}/disnan.f (100%) rename lib/linalg/{ => fortran}/dlabad.f (100%) rename lib/linalg/{ => fortran}/dlabrd.f (100%) rename lib/linalg/{ => fortran}/dlacn2.f (100%) rename lib/linalg/{ => fortran}/dlacpy.f (100%) rename lib/linalg/{ => fortran}/dladiv.f (100%) rename lib/linalg/{ => fortran}/dlae2.f (100%) rename lib/linalg/{ => fortran}/dlaed0.f (100%) rename lib/linalg/{ => fortran}/dlaed1.f (100%) rename lib/linalg/{ => fortran}/dlaed2.f (100%) rename lib/linalg/{ => fortran}/dlaed3.f (100%) rename lib/linalg/{ => fortran}/dlaed4.f (100%) rename lib/linalg/{ => fortran}/dlaed5.f (100%) rename lib/linalg/{ => fortran}/dlaed6.f (100%) rename lib/linalg/{ => fortran}/dlaed7.f (100%) rename lib/linalg/{ => fortran}/dlaed8.f (100%) rename lib/linalg/{ => fortran}/dlaed9.f (100%) rename lib/linalg/{ => fortran}/dlaeda.f (100%) rename lib/linalg/{ => fortran}/dlaev2.f (100%) rename lib/linalg/{ => fortran}/dlaisnan.f (100%) rename lib/linalg/{ => fortran}/dlals0.f (100%) rename lib/linalg/{ => fortran}/dlalsa.f (100%) rename lib/linalg/{ => fortran}/dlalsd.f (100%) rename lib/linalg/{ => fortran}/dlamch.f (100%) rename lib/linalg/{ => fortran}/dlamrg.f (100%) rename lib/linalg/{ => fortran}/dlange.f (100%) rename lib/linalg/{ => fortran}/dlanst.f (100%) rename lib/linalg/{ => fortran}/dlansy.f (100%) rename lib/linalg/{ => fortran}/dlapy2.f (100%) rename lib/linalg/{ => fortran}/dlapy3.f (100%) rename lib/linalg/{ => fortran}/dlarf.f (100%) rename lib/linalg/{ => fortran}/dlarfb.f (100%) rename lib/linalg/{ => fortran}/dlarfg.f (100%) rename lib/linalg/{ => fortran}/dlarft.f (100%) rename lib/linalg/{ => fortran}/dlartg.f (100%) rename lib/linalg/{ => fortran}/dlas2.f (100%) rename lib/linalg/{ => fortran}/dlascl.f (100%) rename lib/linalg/{ => fortran}/dlasd4.f (100%) rename lib/linalg/{ => fortran}/dlasd5.f (100%) rename lib/linalg/{ => fortran}/dlasd6.f (100%) rename lib/linalg/{ => fortran}/dlasd7.f (100%) rename lib/linalg/{ => fortran}/dlasd8.f (100%) rename lib/linalg/{ => fortran}/dlasda.f (100%) rename lib/linalg/{ => fortran}/dlasdq.f (100%) rename lib/linalg/{ => fortran}/dlasdt.f (100%) rename lib/linalg/{ => fortran}/dlaset.f (100%) rename lib/linalg/{ => fortran}/dlasq1.f (100%) rename lib/linalg/{ => fortran}/dlasq2.f (100%) rename lib/linalg/{ => fortran}/dlasq3.f (100%) rename lib/linalg/{ => fortran}/dlasq4.f (100%) rename lib/linalg/{ => fortran}/dlasq5.f (100%) rename lib/linalg/{ => fortran}/dlasq6.f (100%) rename lib/linalg/{ => fortran}/dlasr.f (100%) rename lib/linalg/{ => fortran}/dlasrt.f (100%) rename lib/linalg/{ => fortran}/dlassq.f (100%) rename lib/linalg/{ => fortran}/dlasv2.f (100%) rename lib/linalg/{ => fortran}/dlaswp.f (100%) rename lib/linalg/{ => fortran}/dlatrd.f (100%) rename lib/linalg/{ => fortran}/dlatrs.f (100%) rename lib/linalg/{ => fortran}/dnrm2.f (100%) rename lib/linalg/{ => fortran}/dorg2l.f (100%) rename lib/linalg/{ => fortran}/dorg2r.f (100%) rename lib/linalg/{ => fortran}/dorgbr.f (100%) rename lib/linalg/{ => fortran}/dorgl2.f (100%) rename lib/linalg/{ => fortran}/dorglq.f (100%) rename lib/linalg/{ => fortran}/dorgql.f (100%) rename lib/linalg/{ => fortran}/dorgqr.f (100%) rename lib/linalg/{ => fortran}/dorgtr.f (100%) rename lib/linalg/{ => fortran}/dorm2l.f (100%) rename lib/linalg/{ => fortran}/dorm2r.f (100%) rename lib/linalg/{ => fortran}/dormbr.f (100%) rename lib/linalg/{ => fortran}/dorml2.f (100%) rename lib/linalg/{ => fortran}/dormlq.f (100%) rename lib/linalg/{ => fortran}/dormql.f (100%) rename lib/linalg/{ => fortran}/dormqr.f (100%) rename lib/linalg/{ => fortran}/dormtr.f (100%) rename lib/linalg/{ => fortran}/dposv.f (100%) rename lib/linalg/{ => fortran}/dpotf2.f (100%) rename lib/linalg/{ => fortran}/dpotrf.f (100%) rename lib/linalg/{ => fortran}/dpotrf2.f (100%) rename lib/linalg/{ => fortran}/dpotrs.f (100%) rename lib/linalg/{ => fortran}/drot.f (100%) rename lib/linalg/{ => fortran}/drscl.f (100%) rename lib/linalg/{ => fortran}/dscal.f (100%) rename lib/linalg/{ => fortran}/dstedc.f (100%) rename lib/linalg/{ => fortran}/dsteqr.f (100%) rename lib/linalg/{ => fortran}/dsterf.f (100%) rename lib/linalg/{ => fortran}/dswap.f (100%) rename lib/linalg/{ => fortran}/dsyev.f (100%) rename lib/linalg/{ => fortran}/dsyevd.f (100%) rename lib/linalg/{ => fortran}/dsygs2.f (100%) rename lib/linalg/{ => fortran}/dsygst.f (100%) rename lib/linalg/{ => fortran}/dsygv.f (100%) rename lib/linalg/{ => fortran}/dsygvd.f (100%) rename lib/linalg/{ => fortran}/dsymm.f (100%) rename lib/linalg/{ => fortran}/dsymv.f (100%) rename lib/linalg/{ => fortran}/dsyr2.f (100%) rename lib/linalg/{ => fortran}/dsyr2k.f (100%) rename lib/linalg/{ => fortran}/dsyrk.f (100%) rename lib/linalg/{ => fortran}/dsytd2.f (100%) rename lib/linalg/{ => fortran}/dsytrd.f (100%) rename lib/linalg/{ => fortran}/dtrmm.f (100%) rename lib/linalg/{ => fortran}/dtrmv.f (100%) rename lib/linalg/{ => fortran}/dtrsm.f (100%) rename lib/linalg/{ => fortran}/dtrsv.f (100%) rename lib/linalg/{ => fortran}/dtrti2.f (100%) rename lib/linalg/{ => fortran}/dtrtri.f (100%) rename lib/linalg/{ => fortran}/dznrm2.f (100%) rename lib/linalg/{ => fortran}/idamax.f (100%) rename lib/linalg/{ => fortran}/ieeeck.f (100%) rename lib/linalg/{ => fortran}/iladlc.f (100%) rename lib/linalg/{ => fortran}/iladlr.f (100%) rename lib/linalg/{ => fortran}/ilaenv.f (100%) rename lib/linalg/{ => fortran}/ilazlc.f (100%) rename lib/linalg/{ => fortran}/ilazlr.f (100%) rename lib/linalg/{ => fortran}/iparmq.f (100%) rename lib/linalg/{ => fortran}/lsame.f (100%) rename lib/linalg/{ => fortran}/xerbla.f (100%) rename lib/linalg/{ => fortran}/zaxpy.f (100%) rename lib/linalg/{ => fortran}/zcopy.f (100%) rename lib/linalg/{ => fortran}/zdotc.f (100%) rename lib/linalg/{ => fortran}/zdrot.f (100%) rename lib/linalg/{ => fortran}/zdscal.f (100%) rename lib/linalg/{ => fortran}/zgemm.f (100%) rename lib/linalg/{ => fortran}/zgemv.f (100%) rename lib/linalg/{ => fortran}/zgerc.f (100%) rename lib/linalg/{ => fortran}/zheev.f (100%) rename lib/linalg/{ => fortran}/zheevd.f (100%) rename lib/linalg/{ => fortran}/zhemv.f (100%) rename lib/linalg/{ => fortran}/zher2.f (100%) rename lib/linalg/{ => fortran}/zher2k.f (100%) rename lib/linalg/{ => fortran}/zhetd2.f (100%) rename lib/linalg/{ => fortran}/zhetrd.f (100%) rename lib/linalg/{ => fortran}/zhpr.f (100%) rename lib/linalg/{ => fortran}/zlacgv.f (100%) rename lib/linalg/{ => fortran}/zlacpy.f (100%) rename lib/linalg/{ => fortran}/zlacrm.f (100%) rename lib/linalg/{ => fortran}/zladiv.f (100%) rename lib/linalg/{ => fortran}/zlaed0.f (100%) rename lib/linalg/{ => fortran}/zlaed7.f (100%) rename lib/linalg/{ => fortran}/zlaed8.f (100%) rename lib/linalg/{ => fortran}/zlanhe.f (100%) rename lib/linalg/{ => fortran}/zlarf.f (100%) rename lib/linalg/{ => fortran}/zlarfb.f (100%) rename lib/linalg/{ => fortran}/zlarfg.f (100%) rename lib/linalg/{ => fortran}/zlarft.f (100%) rename lib/linalg/{ => fortran}/zlascl.f (100%) rename lib/linalg/{ => fortran}/zlaset.f (100%) rename lib/linalg/{ => fortran}/zlasr.f (100%) rename lib/linalg/{ => fortran}/zlassq.f (100%) rename lib/linalg/{ => fortran}/zlatrd.f (100%) rename lib/linalg/{ => fortran}/zpptrf.f (100%) rename lib/linalg/{ => fortran}/zpptri.f (100%) rename lib/linalg/{ => fortran}/zscal.f (100%) rename lib/linalg/{ => fortran}/zstedc.f (100%) rename lib/linalg/{ => fortran}/zsteqr.f (100%) rename lib/linalg/{ => fortran}/zswap.f (100%) rename lib/linalg/{ => fortran}/ztpmv.f (100%) rename lib/linalg/{ => fortran}/ztpsv.f (100%) rename lib/linalg/{ => fortran}/ztptri.f (100%) rename lib/linalg/{ => fortran}/ztrmm.f (100%) rename lib/linalg/{ => fortran}/ztrmv.f (100%) rename lib/linalg/{ => fortran}/zung2l.f (100%) rename lib/linalg/{ => fortran}/zung2r.f (100%) rename lib/linalg/{ => fortran}/zungl2.f (100%) rename lib/linalg/{ => fortran}/zungql.f (100%) rename lib/linalg/{ => fortran}/zungqr.f (100%) rename lib/linalg/{ => fortran}/zungtr.f (100%) rename lib/linalg/{ => fortran}/zunm2l.f (100%) rename lib/linalg/{ => fortran}/zunm2r.f (100%) rename lib/linalg/{ => fortran}/zunmql.f (100%) rename lib/linalg/{ => fortran}/zunmqr.f (100%) rename lib/linalg/{ => fortran}/zunmtr.f (100%) create mode 100644 lib/linalg/idamax.cpp create mode 100644 lib/linalg/ieeeck.cpp create mode 100644 lib/linalg/iladlc.cpp create mode 100644 lib/linalg/iladlr.cpp create mode 100644 lib/linalg/ilaenv.cpp create mode 100644 lib/linalg/ilazlc.cpp create mode 100644 lib/linalg/ilazlr.cpp create mode 100644 lib/linalg/iparmq.cpp create mode 100644 lib/linalg/lmp_f2c.h create mode 100644 lib/linalg/lsame.cpp create mode 100644 lib/linalg/static/README create mode 100644 lib/linalg/static/dgetrf2.f create mode 100644 lib/linalg/static/disnan.cpp create mode 100644 lib/linalg/static/dlamch.cpp create mode 100644 lib/linalg/static/dlarft.f create mode 100644 lib/linalg/static/dpotrf2.f create mode 100644 lib/linalg/static/lsame.cpp create mode 100644 lib/linalg/static/xerbla.cpp create mode 100644 lib/linalg/static/zlarft.f create mode 100644 lib/linalg/xerbla.cpp create mode 100644 lib/linalg/zaxpy.cpp create mode 100644 lib/linalg/zcopy.cpp create mode 100644 lib/linalg/zdotc.cpp create mode 100644 lib/linalg/zdrot.cpp create mode 100644 lib/linalg/zdscal.cpp create mode 100644 lib/linalg/zgemm.cpp create mode 100644 lib/linalg/zgemv.cpp create mode 100644 lib/linalg/zgerc.cpp create mode 100644 lib/linalg/zheev.cpp create mode 100644 lib/linalg/zheevd.cpp create mode 100644 lib/linalg/zhemv.cpp create mode 100644 lib/linalg/zher2.cpp create mode 100644 lib/linalg/zher2k.cpp create mode 100644 lib/linalg/zhetd2.cpp create mode 100644 lib/linalg/zhetrd.cpp create mode 100644 lib/linalg/zhpr.cpp create mode 100644 lib/linalg/zlacgv.cpp create mode 100644 lib/linalg/zlacpy.cpp create mode 100644 lib/linalg/zlacrm.cpp create mode 100644 lib/linalg/zladiv.cpp create mode 100644 lib/linalg/zlaed0.cpp create mode 100644 lib/linalg/zlaed7.cpp create mode 100644 lib/linalg/zlaed8.cpp create mode 100644 lib/linalg/zlanhe.cpp create mode 100644 lib/linalg/zlarf.cpp create mode 100644 lib/linalg/zlarfb.cpp create mode 100644 lib/linalg/zlarfg.cpp create mode 100644 lib/linalg/zlarft.cpp create mode 100644 lib/linalg/zlascl.cpp create mode 100644 lib/linalg/zlaset.cpp create mode 100644 lib/linalg/zlasr.cpp create mode 100644 lib/linalg/zlassq.cpp create mode 100644 lib/linalg/zlatrd.cpp create mode 100644 lib/linalg/zpptrf.cpp create mode 100644 lib/linalg/zpptri.cpp create mode 100644 lib/linalg/zscal.cpp create mode 100644 lib/linalg/zstedc.cpp create mode 100644 lib/linalg/zsteqr.cpp create mode 100644 lib/linalg/zswap.cpp create mode 100644 lib/linalg/ztpmv.cpp create mode 100644 lib/linalg/ztpsv.cpp create mode 100644 lib/linalg/ztptri.cpp create mode 100644 lib/linalg/ztrmm.cpp create mode 100644 lib/linalg/ztrmv.cpp create mode 100644 lib/linalg/zung2l.cpp create mode 100644 lib/linalg/zung2r.cpp create mode 100644 lib/linalg/zungl2.cpp create mode 100644 lib/linalg/zungql.cpp create mode 100644 lib/linalg/zungqr.cpp create mode 100644 lib/linalg/zungtr.cpp create mode 100644 lib/linalg/zunm2l.cpp create mode 100644 lib/linalg/zunm2r.cpp create mode 100644 lib/linalg/zunmql.cpp create mode 100644 lib/linalg/zunmqr.cpp create mode 100644 lib/linalg/zunmtr.cpp diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 6666636a09..4351c40d75 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -440,13 +440,8 @@ if(PKG_MSCG OR PKG_ATC OR PKG_AWPMD OR PKG_ML-QUIP OR PKG_ML-POD OR PKG_LATTE OR find_package(BLAS) endif() if(NOT LAPACK_FOUND OR NOT BLAS_FOUND OR USE_INTERNAL_LINALG) - include(CheckGeneratorSupport) - if(NOT CMAKE_GENERATOR_SUPPORT_FORTRAN) - status(FATAL_ERROR "Cannot build internal linear algebra library as CMake build tool lacks Fortran support") - endif() - enable_language(Fortran) - file(GLOB LAPACK_SOURCES ${LAMMPS_LIB_SOURCE_DIR}/linalg/[^.]*.[fF]) - add_library(linalg STATIC ${LAPACK_SOURCES}) + file(GLOB LINALG_SOURCES ${LAMMPS_LIB_SOURCE_DIR}/linalg/[^.]*.cpp) + add_library(linalg STATIC ${LINALG_SOURCES}) set_target_properties(linalg PROPERTIES OUTPUT_NAME lammps_linalg${LAMMPS_MACHINE}) set(BLAS_LIBRARIES "$") set(LAPACK_LIBRARIES "$") diff --git a/lib/linalg/Makefile.gfortran b/lib/linalg/Makefile.g++ similarity index 65% rename from lib/linalg/Makefile.gfortran rename to lib/linalg/Makefile.g++ index 89ac3bbe6d..b1e18e8fd3 100644 --- a/lib/linalg/Makefile.gfortran +++ b/lib/linalg/Makefile.g++ @@ -6,20 +6,19 @@ SHELL = /bin/sh # ------ FILES ------ -SRC = $(wildcard *.f) +SRC = $(wildcard *.cpp) FILES = $(SRC) Makefile.* README # ------ DEFINITIONS ------ LIB = liblinalg.a -OBJ = $(SRC:.f=.o) +OBJ = $(SRC:.cpp=.o) # ------ SETTINGS ------ -FC = gfortran -FFLAGS = -O3 -fPIC -ffast-math -fstrict-aliasing -fno-second-underscore -FFLAGS0 = -O0 -fPIC -fno-second-underscore +CXX = g++ -std=c++11 +CCFLAGS = -O3 -fPIC -ffast-math -fstrict-aliasing ARCHIVE = ar AR = ar ARCHFLAG = -rcs @@ -33,16 +32,13 @@ lib: $(OBJ) # ------ COMPILE RULES ------ -%.o:%.f - $(FC) $(FFLAGS) -c $< - -dlamch.o: dlamch.f - $(FC) $(FFLAGS0) -c $< +%.o:%.cpp + $(CC) $(CCFLAGS) -c $< # ------ CLEAN ------ clean: - -rm -f *.o *.mod *~ $(LIB) + -rm -f *.o *~ $(LIB) tar: -tar -czvf ../linalg.tar.gz $(FILES) diff --git a/lib/linalg/Makefile.mpi b/lib/linalg/Makefile.mpi index 74de6cdf3d..567653cebc 100644 --- a/lib/linalg/Makefile.mpi +++ b/lib/linalg/Makefile.mpi @@ -6,20 +6,19 @@ SHELL = /bin/sh # ------ FILES ------ -SRC = $(wildcard *.f) +SRC = $(wildcard *.cpp) FILES = $(SRC) Makefile.* README # ------ DEFINITIONS ------ LIB = liblinalg.a -OBJ = $(SRC:.f=.o) +OBJ = $(SRC:.cpp=.o) # ------ SETTINGS ------ -FC = mpifort -FFLAGS = -O3 -fPIC -FFLAGS0 = -O0 -fPIC +CC = mpicxx +CCFLAGS = -O3 -fPIC ARCHIVE = ar AR = ar ARCHFLAG = -rcs @@ -33,16 +32,13 @@ lib: $(OBJ) # ------ COMPILE RULES ------ -%.o:%.f - $(FC) $(FFLAGS) -c $< - -dlamch.o: dlamch.f - $(FC) $(FFLAGS0) -c $< +%.o:%.cpp + $(CC) $(CCFLAGS) -c $< # ------ CLEAN ------ clean: - -rm -f *.o *.mod *~ $(LIB) + -rm -f *.o *~ $(LIB) tar: -tar -czvf ../linalg.tar.gz $(FILES) diff --git a/lib/linalg/Makefile.serial b/lib/linalg/Makefile.serial index c52fbcb986..9d7bb000f9 120000 --- a/lib/linalg/Makefile.serial +++ b/lib/linalg/Makefile.serial @@ -1 +1 @@ -Makefile.gfortran \ No newline at end of file +Makefile.g++ \ No newline at end of file diff --git a/lib/linalg/convert.sh b/lib/linalg/convert.sh new file mode 100755 index 0000000000..c73e0d3393 --- /dev/null +++ b/lib/linalg/convert.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +has_f2c=$(type f2c > /dev/null 2>&1 && echo 1 || echo 0) +if test ${has_f2c} -eq 0 +then + echo "Must have f2c installed to run this script" + exit 1 +fi + +# cleanup +rm -f *.c *.cpp *.P *~ *.orig *.bak *.rej + +# translate files directly, skip those for which we have replacements. +for f in fortran/*.f +do \ + b=$(basename $f .f) + if test $b == dgetrf2 || test $b == disnan || test $b == dlaisnan || \ + test $b == dlamch || test $b == dlarft || test $b == dpotrf2 || \ + test $b == lsame || test $b == xerbla || test $b == zlarft + then + echo Skipping $b + else + f2c -C++ -a -f $f && mv $b.c $b.cpp || exit 2 + # silence c++ compiler warnings about string constants + sed -i -e 's/\("[^"]\+"\)/(char *)\1/g' -e 's/^extern.*"C"/extern "C"/' \ + -e 's/^#include.*"f2c.h"/#include "lmp_f2c.h"/' $b.cpp + fi +done + +# translate modified versions +for f in static/*.f +do \ + b=$(basename $f .f) + f2c -C++ -a -f $f && mv $b.c $b.cpp || exit 2 + # silence c++ compiler warnings about string constants + sed -i -e 's/\("[^"]\+"\)/(char *)\1/g' -e 's/^extern.*"C"/extern "C"/' \ + -e 's/^#include.*"f2c.h"/#include "lmp_f2c.h"/' $b.cpp +done + +# copy direct C++ alternatives +for c in static/*.cpp +do \ + cp -v $c . +done diff --git a/lib/linalg/dasum.cpp b/lib/linalg/dasum.cpp new file mode 100644 index 0000000000..0119bed6fd --- /dev/null +++ b/lib/linalg/dasum.cpp @@ -0,0 +1,168 @@ +/* fortran/dasum.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DASUM */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* DOUBLE PRECISION FUNCTION DASUM(N,DX,INCX) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION DX(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DASUM takes the sum of the absolute values. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DX */ +/* > \verbatim */ +/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of DX */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, linpack, 3/11/78. */ +/* > modified 3/93 to return if incx .le. 0. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +doublereal dasum_(integer *n, doublereal *dx, integer *incx) +{ + /* System generated locals */ + integer i__1, i__2; + doublereal ret_val, d__1, d__2, d__3, d__4, d__5, d__6; + + /* Local variables */ + integer i__, m, mp1; + doublereal dtemp; + integer nincx; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + /* Parameter adjustments */ + --dx; + + /* Function Body */ + ret_val = 0.; + dtemp = 0.; + if (*n <= 0 || *incx <= 0) { + return ret_val; + } + if (*incx == 1) { +/* code for increment equal to 1 */ + + +/* clean-up loop */ + + m = *n % 6; + if (m != 0) { + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp += (d__1 = dx[i__], abs(d__1)); + } + if (*n < 6) { + ret_val = dtemp; + return ret_val; + } + } + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 6) { + dtemp = dtemp + (d__1 = dx[i__], abs(d__1)) + (d__2 = dx[i__ + 1], + abs(d__2)) + (d__3 = dx[i__ + 2], abs(d__3)) + (d__4 = + dx[i__ + 3], abs(d__4)) + (d__5 = dx[i__ + 4], abs(d__5)) + + (d__6 = dx[i__ + 5], abs(d__6)); + } + } else { + +/* code for increment not equal to 1 */ + + nincx = *n * *incx; + i__1 = nincx; + i__2 = *incx; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + dtemp += (d__1 = dx[i__], abs(d__1)); + } + } + ret_val = dtemp; + return ret_val; + +/* End of DASUM */ + +} /* dasum_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/daxpy.cpp b/lib/linalg/daxpy.cpp new file mode 100644 index 0000000000..d89cd6e9c4 --- /dev/null +++ b/lib/linalg/daxpy.cpp @@ -0,0 +1,194 @@ +/* fortran/daxpy.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DAXPY */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DAXPY(N,DA,DX,INCX,DY,INCY) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION DA */ +/* INTEGER INCX,INCY,N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION DX(*),DY(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DAXPY constant times a vector plus a vector. */ +/* > uses unrolled loops for increments equal to one. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DA */ +/* > \verbatim */ +/* > DA is DOUBLE PRECISION */ +/* > On entry, DA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DX */ +/* > \verbatim */ +/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of DX */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DY */ +/* > \verbatim */ +/* > DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > storage spacing between elements of DY */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, linpack, 3/11/78. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int daxpy_(integer *n, doublereal *da, doublereal *dx, + integer *incx, doublereal *dy, integer *incy) +{ + /* System generated locals */ + integer i__1; + + /* Local variables */ + integer i__, m, ix, iy, mp1; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + /* Parameter adjustments */ + --dy; + --dx; + + /* Function Body */ + if (*n <= 0) { + return 0; + } + if (*da == 0.) { + return 0; + } + if (*incx == 1 && *incy == 1) { + +/* code for both increments equal to 1 */ + + +/* clean-up loop */ + + m = *n % 4; + if (m != 0) { + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + dy[i__] += *da * dx[i__]; + } + } + if (*n < 4) { + return 0; + } + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 4) { + dy[i__] += *da * dx[i__]; + dy[i__ + 1] += *da * dx[i__ + 1]; + dy[i__ + 2] += *da * dx[i__ + 2]; + dy[i__ + 3] += *da * dx[i__ + 3]; + } + } else { + +/* code for unequal increments or equal increments */ +/* not equal to 1 */ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dy[iy] += *da * dx[ix]; + ix += *incx; + iy += *incy; + } + } + return 0; + +/* End of DAXPY */ + +} /* daxpy_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dbdsqr.cpp b/lib/linalg/dbdsqr.cpp new file mode 100644 index 0000000000..78c996dc2b --- /dev/null +++ b/lib/linalg/dbdsqr.cpp @@ -0,0 +1,1053 @@ +/* fortran/dbdsqr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b15 = -.125; +static integer c__1 = 1; +static doublereal c_b49 = 1.; +static doublereal c_b72 = -1.; + +/* > \brief \b DBDSQR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DBDSQR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, */ +/* LDU, C, LDC, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION C( LDC, * ), D( * ), E( * ), U( LDU, * ), */ +/* $ VT( LDVT, * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DBDSQR computes the singular values and, optionally, the right and/or */ +/* > left singular vectors from the singular value decomposition (SVD) of */ +/* > a real N-by-N (upper or lower) bidiagonal matrix B using the implicit */ +/* > zero-shift QR algorithm. The SVD of B has the form */ +/* > */ +/* > B = Q * S * P**T */ +/* > */ +/* > where S is the diagonal matrix of singular values, Q is an orthogonal */ +/* > matrix of left singular vectors, and P is an orthogonal matrix of */ +/* > right singular vectors. If left singular vectors are requested, this */ +/* > subroutine actually returns U*Q instead of Q, and, if right singular */ +/* > vectors are requested, this subroutine returns P**T*VT instead of */ +/* > P**T, for given real input matrices U and VT. When U and VT are the */ +/* > orthogonal matrices that reduce a general matrix A to bidiagonal */ +/* > form: A = U*B*VT, as computed by DGEBRD, then */ +/* > */ +/* > A = (U*Q) * S * (P**T*VT) */ +/* > */ +/* > is the SVD of A. Optionally, the subroutine may also compute Q**T*C */ +/* > for a given real input matrix C. */ +/* > */ +/* > See "Computing Small Singular Values of Bidiagonal Matrices With */ +/* > Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan, */ +/* > LAPACK Working Note #3 (or SIAM J. Sci. Statist. Comput. vol. 11, */ +/* > no. 5, pp. 873-912, Sept 1990) and */ +/* > (char *)"Accurate singular values and differential qd algorithms," by */ +/* > B. Parlett and V. Fernando, Technical Report CPAM-554, Mathematics */ +/* > Department, University of California at Berkeley, July 1992 */ +/* > for a detailed description of the algorithm. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': B is upper bidiagonal; */ +/* > = 'L': B is lower bidiagonal. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix B. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NCVT */ +/* > \verbatim */ +/* > NCVT is INTEGER */ +/* > The number of columns of the matrix VT. NCVT >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NRU */ +/* > \verbatim */ +/* > NRU is INTEGER */ +/* > The number of rows of the matrix U. NRU >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NCC */ +/* > \verbatim */ +/* > NCC is INTEGER */ +/* > The number of columns of the matrix C. NCC >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the n diagonal elements of the bidiagonal matrix B. */ +/* > On exit, if INFO=0, the singular values of B in decreasing */ +/* > order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > On entry, the N-1 offdiagonal elements of the bidiagonal */ +/* > matrix B. */ +/* > On exit, if INFO = 0, E is destroyed; if INFO > 0, D and E */ +/* > will contain the diagonal and superdiagonal elements of a */ +/* > bidiagonal matrix orthogonally equivalent to the one given */ +/* > as input. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] VT */ +/* > \verbatim */ +/* > VT is DOUBLE PRECISION array, dimension (LDVT, NCVT) */ +/* > On entry, an N-by-NCVT matrix VT. */ +/* > On exit, VT is overwritten by P**T * VT. */ +/* > Not referenced if NCVT = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDVT */ +/* > \verbatim */ +/* > LDVT is INTEGER */ +/* > The leading dimension of the array VT. */ +/* > LDVT >= max(1,N) if NCVT > 0; LDVT >= 1 if NCVT = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] U */ +/* > \verbatim */ +/* > U is DOUBLE PRECISION array, dimension (LDU, N) */ +/* > On entry, an NRU-by-N matrix U. */ +/* > On exit, U is overwritten by U * Q. */ +/* > Not referenced if NRU = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDU */ +/* > \verbatim */ +/* > LDU is INTEGER */ +/* > The leading dimension of the array U. LDU >= max(1,NRU). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension (LDC, NCC) */ +/* > On entry, an N-by-NCC matrix C. */ +/* > On exit, C is overwritten by Q**T * C. */ +/* > Not referenced if NCC = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. */ +/* > LDC >= max(1,N) if NCC > 0; LDC >=1 if NCC = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (4*(N-1)) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: If INFO = -i, the i-th argument had an illegal value */ +/* > > 0: */ +/* > if NCVT = NRU = NCC = 0, */ +/* > = 1, a split was marked by a positive value in E */ +/* > = 2, current block of Z not diagonalized after 30*N */ +/* > iterations (in inner while loop) */ +/* > = 3, termination criterion of outer while loop not met */ +/* > (program created more than N unreduced blocks) */ +/* > else NCVT = NRU = NCC = 0, */ +/* > the algorithm did not converge; D and E contain the */ +/* > elements of a bidiagonal matrix which is orthogonally */ +/* > similar to the input matrix B; if INFO = i, i */ +/* > elements of E have not converged to zero. */ +/* > \endverbatim */ + +/* > \par Internal Parameters: */ +/* ========================= */ +/* > */ +/* > \verbatim */ +/* > TOLMUL DOUBLE PRECISION, default = max(10,min(100,EPS**(-1/8))) */ +/* > TOLMUL controls the convergence criterion of the QR loop. */ +/* > If it is positive, TOLMUL*EPS is the desired relative */ +/* > precision in the computed singular values. */ +/* > If it is negative, abs(TOLMUL*EPS*sigma_max) is the */ +/* > desired absolute accuracy in the computed singular */ +/* > values (corresponds to relative accuracy */ +/* > abs(TOLMUL*EPS) in the largest singular value. */ +/* > abs(TOLMUL) should be between 1 and 1/EPS, and preferably */ +/* > between 10 (for fast convergence) and .1/EPS */ +/* > (for there to be some accuracy in the results). */ +/* > Default is to lose at either one eighth or 2 of the */ +/* > available decimal digits in each computed singular value */ +/* > (whichever is smaller). */ +/* > */ +/* > MAXITR INTEGER, default = 6 */ +/* > MAXITR controls the maximum number of passes of the */ +/* > algorithm through its inner loop. The algorithms stops */ +/* > (and so fails to converge) if the number of passes */ +/* > through the inner loop exceeds MAXITR*N**2. */ +/* > */ +/* > \endverbatim */ + +/* > \par Note: */ +/* =========== */ +/* > */ +/* > \verbatim */ +/* > Bug report from Cezary Dendek. */ +/* > On March 23rd 2017, the INTEGER variable MAXIT = MAXITR*N**2 is */ +/* > removed since it can overflow pretty easily (for N larger or equal */ +/* > than 18,919). We instead use MAXITDIVN = MAXITR*N. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dbdsqr_(char *uplo, integer *n, integer *ncvt, integer * + nru, integer *ncc, doublereal *d__, doublereal *e, doublereal *vt, + integer *ldvt, doublereal *u, integer *ldu, doublereal *c__, integer * + ldc, doublereal *work, integer *info, ftnlen uplo_len) +{ + /* System generated locals */ + integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, + i__2; + doublereal d__1, d__2, d__3, d__4; + + /* Builtin functions */ + double pow_dd(doublereal *, doublereal *), sqrt(doublereal), d_sign( + doublereal *, doublereal *); + + /* Local variables */ + integer iterdivn; + doublereal f, g, h__; + integer i__, j, m; + doublereal r__; + integer maxitdivn; + doublereal cs; + integer ll; + doublereal sn, mu; + integer nm1, nm12, nm13, lll; + doublereal eps, sll, tol, abse; + integer idir; + doublereal abss; + integer oldm; + doublereal cosl; + integer isub, iter; + doublereal unfl, sinl, cosr, smin, smax, sinr; + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *), dlas2_( + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *), dscal_(integer *, doublereal *, doublereal *, + integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + doublereal oldcs; + extern /* Subroutine */ int dlasr_(char *, char *, char *, integer *, + integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen, ftnlen); + integer oldll; + doublereal shift, sigmn, oldsn; + extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, + doublereal *, integer *); + doublereal sminl, sigmx; + logical lower; + extern /* Subroutine */ int dlasq1_(integer *, doublereal *, doublereal *, + doublereal *, integer *), dlasv2_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); + extern doublereal dlamch_(char *, ftnlen); + extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *), xerbla_(char *, + integer *, ftnlen); + doublereal sminoa, thresh; + logical rotate; + doublereal tolmul; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --e; + vt_dim1 = *ldvt; + vt_offset = 1 + vt_dim1; + vt -= vt_offset; + u_dim1 = *ldu; + u_offset = 1 + u_dim1; + u -= u_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + lower = lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1); + if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lower) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*ncvt < 0) { + *info = -3; + } else if (*nru < 0) { + *info = -4; + } else if (*ncc < 0) { + *info = -5; + } else if (*ncvt == 0 && *ldvt < 1 || *ncvt > 0 && *ldvt < max(1,*n)) { + *info = -9; + } else if (*ldu < max(1,*nru)) { + *info = -11; + } else if (*ncc == 0 && *ldc < 1 || *ncc > 0 && *ldc < max(1,*n)) { + *info = -13; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DBDSQR", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + if (*n == 1) { + goto L160; + } + +/* ROTATE is true if any singular vectors desired, false otherwise */ + + rotate = *ncvt > 0 || *nru > 0 || *ncc > 0; + +/* If no singular vectors desired, use qd algorithm */ + + if (! rotate) { + dlasq1_(n, &d__[1], &e[1], &work[1], info); + +/* If INFO equals 2, dqds didn't finish, try to finish */ + + if (*info != 2) { + return 0; + } + *info = 0; + } + + nm1 = *n - 1; + nm12 = nm1 + nm1; + nm13 = nm12 + nm1; + idir = 0; + +/* Get machine constants */ + + eps = dlamch_((char *)"Epsilon", (ftnlen)7); + unfl = dlamch_((char *)"Safe minimum", (ftnlen)12); + +/* If matrix lower bidiagonal, rotate to be upper bidiagonal */ +/* by applying Givens rotations on the left */ + + if (lower) { + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); + d__[i__] = r__; + e[i__] = sn * d__[i__ + 1]; + d__[i__ + 1] = cs * d__[i__ + 1]; + work[i__] = cs; + work[nm1 + i__] = sn; +/* L10: */ + } + +/* Update singular vectors if desired */ + + if (*nru > 0) { + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, n, &work[1], &work[*n], &u[u_offset], + ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + if (*ncc > 0) { + dlasr_((char *)"L", (char *)"V", (char *)"F", n, ncc, &work[1], &work[*n], &c__[c_offset], + ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + } + +/* Compute singular values to relative accuracy TOL */ +/* (By setting TOL to be negative, algorithm will compute */ +/* singular values to absolute accuracy ABS(TOL)*norm(input matrix)) */ + +/* Computing MAX */ +/* Computing MIN */ + d__3 = 100., d__4 = pow_dd(&eps, &c_b15); + d__1 = 10., d__2 = min(d__3,d__4); + tolmul = max(d__1,d__2); + tol = tolmul * eps; + +/* Compute approximate maximum, minimum singular values */ + + smax = 0.; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { +/* Computing MAX */ + d__2 = smax, d__3 = (d__1 = d__[i__], abs(d__1)); + smax = max(d__2,d__3); +/* L20: */ + } + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { +/* Computing MAX */ + d__2 = smax, d__3 = (d__1 = e[i__], abs(d__1)); + smax = max(d__2,d__3); +/* L30: */ + } + sminl = 0.; + if (tol >= 0.) { + +/* Relative accuracy desired */ + + sminoa = abs(d__[1]); + if (sminoa == 0.) { + goto L50; + } + mu = sminoa; + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + mu = (d__2 = d__[i__], abs(d__2)) * (mu / (mu + (d__1 = e[i__ - 1] + , abs(d__1)))); + sminoa = min(sminoa,mu); + if (sminoa == 0.) { + goto L50; + } +/* L40: */ + } +L50: + sminoa /= sqrt((doublereal) (*n)); +/* Computing MAX */ + d__1 = tol * sminoa, d__2 = *n * (*n * unfl) * 6; + thresh = max(d__1,d__2); + } else { + +/* Absolute accuracy desired */ + +/* Computing MAX */ + d__1 = abs(tol) * smax, d__2 = *n * (*n * unfl) * 6; + thresh = max(d__1,d__2); + } + +/* Prepare for main iteration loop for the singular values */ +/* (MAXIT is the maximum number of passes through the inner */ +/* loop permitted before nonconvergence signalled.) */ + + maxitdivn = *n * 6; + iterdivn = 0; + iter = -1; + oldll = -1; + oldm = -1; + +/* M points to last element of unconverged part of matrix */ + + m = *n; + +/* Begin main iteration loop */ + +L60: + +/* Check for convergence or exceeding iteration count */ + + if (m <= 1) { + goto L160; + } + + if (iter >= *n) { + iter -= *n; + ++iterdivn; + if (iterdivn >= maxitdivn) { + goto L200; + } + } + +/* Find diagonal block of matrix to work on */ + + if (tol < 0. && (d__1 = d__[m], abs(d__1)) <= thresh) { + d__[m] = 0.; + } + smax = (d__1 = d__[m], abs(d__1)); + smin = smax; + i__1 = m - 1; + for (lll = 1; lll <= i__1; ++lll) { + ll = m - lll; + abss = (d__1 = d__[ll], abs(d__1)); + abse = (d__1 = e[ll], abs(d__1)); + if (tol < 0. && abss <= thresh) { + d__[ll] = 0.; + } + if (abse <= thresh) { + goto L80; + } + smin = min(smin,abss); +/* Computing MAX */ + d__1 = max(smax,abss); + smax = max(d__1,abse); +/* L70: */ + } + ll = 0; + goto L90; +L80: + e[ll] = 0.; + +/* Matrix splits since E(LL) = 0 */ + + if (ll == m - 1) { + +/* Convergence of bottom singular value, return to top of loop */ + + --m; + goto L60; + } +L90: + ++ll; + +/* E(LL) through E(M-1) are nonzero, E(LL-1) is zero */ + + if (ll == m - 1) { + +/* 2 by 2 block, handle separately */ + + dlasv2_(&d__[m - 1], &e[m - 1], &d__[m], &sigmn, &sigmx, &sinr, &cosr, + &sinl, &cosl); + d__[m - 1] = sigmx; + e[m - 1] = 0.; + d__[m] = sigmn; + +/* Compute singular vectors, if desired */ + + if (*ncvt > 0) { + drot_(ncvt, &vt[m - 1 + vt_dim1], ldvt, &vt[m + vt_dim1], ldvt, & + cosr, &sinr); + } + if (*nru > 0) { + drot_(nru, &u[(m - 1) * u_dim1 + 1], &c__1, &u[m * u_dim1 + 1], & + c__1, &cosl, &sinl); + } + if (*ncc > 0) { + drot_(ncc, &c__[m - 1 + c_dim1], ldc, &c__[m + c_dim1], ldc, & + cosl, &sinl); + } + m += -2; + goto L60; + } + +/* If working on new submatrix, choose shift direction */ +/* (from larger end diagonal element towards smaller) */ + + if (ll > oldm || m < oldll) { + if ((d__1 = d__[ll], abs(d__1)) >= (d__2 = d__[m], abs(d__2))) { + +/* Chase bulge from top (big end) to bottom (small end) */ + + idir = 1; + } else { + +/* Chase bulge from bottom (big end) to top (small end) */ + + idir = 2; + } + } + +/* Apply convergence tests */ + + if (idir == 1) { + +/* Run convergence test in forward direction */ +/* First apply standard test to bottom of matrix */ + + if ((d__2 = e[m - 1], abs(d__2)) <= abs(tol) * (d__1 = d__[m], abs( + d__1)) || tol < 0. && (d__3 = e[m - 1], abs(d__3)) <= thresh) + { + e[m - 1] = 0.; + goto L60; + } + + if (tol >= 0.) { + +/* If relative accuracy desired, */ +/* apply convergence criterion forward */ + + mu = (d__1 = d__[ll], abs(d__1)); + sminl = mu; + i__1 = m - 1; + for (lll = ll; lll <= i__1; ++lll) { + if ((d__1 = e[lll], abs(d__1)) <= tol * mu) { + e[lll] = 0.; + goto L60; + } + mu = (d__2 = d__[lll + 1], abs(d__2)) * (mu / (mu + (d__1 = e[ + lll], abs(d__1)))); + sminl = min(sminl,mu); +/* L100: */ + } + } + + } else { + +/* Run convergence test in backward direction */ +/* First apply standard test to top of matrix */ + + if ((d__2 = e[ll], abs(d__2)) <= abs(tol) * (d__1 = d__[ll], abs(d__1) + ) || tol < 0. && (d__3 = e[ll], abs(d__3)) <= thresh) { + e[ll] = 0.; + goto L60; + } + + if (tol >= 0.) { + +/* If relative accuracy desired, */ +/* apply convergence criterion backward */ + + mu = (d__1 = d__[m], abs(d__1)); + sminl = mu; + i__1 = ll; + for (lll = m - 1; lll >= i__1; --lll) { + if ((d__1 = e[lll], abs(d__1)) <= tol * mu) { + e[lll] = 0.; + goto L60; + } + mu = (d__2 = d__[lll], abs(d__2)) * (mu / (mu + (d__1 = e[lll] + , abs(d__1)))); + sminl = min(sminl,mu); +/* L110: */ + } + } + } + oldll = ll; + oldm = m; + +/* Compute shift. First, test if shifting would ruin relative */ +/* accuracy, and if so set the shift to zero. */ + +/* Computing MAX */ + d__1 = eps, d__2 = tol * .01; + if (tol >= 0. && *n * tol * (sminl / smax) <= max(d__1,d__2)) { + +/* Use a zero shift to avoid loss of relative accuracy */ + + shift = 0.; + } else { + +/* Compute the shift from 2-by-2 block at end of matrix */ + + if (idir == 1) { + sll = (d__1 = d__[ll], abs(d__1)); + dlas2_(&d__[m - 1], &e[m - 1], &d__[m], &shift, &r__); + } else { + sll = (d__1 = d__[m], abs(d__1)); + dlas2_(&d__[ll], &e[ll], &d__[ll + 1], &shift, &r__); + } + +/* Test if shift negligible, and if so set to zero */ + + if (sll > 0.) { +/* Computing 2nd power */ + d__1 = shift / sll; + if (d__1 * d__1 < eps) { + shift = 0.; + } + } + } + +/* Increment iteration count */ + + iter = iter + m - ll; + +/* If SHIFT = 0, do simplified QR iteration */ + + if (shift == 0.) { + if (idir == 1) { + +/* Chase bulge from top to bottom */ +/* Save cosines and sines for later singular vector updates */ + + cs = 1.; + oldcs = 1.; + i__1 = m - 1; + for (i__ = ll; i__ <= i__1; ++i__) { + d__1 = d__[i__] * cs; + dlartg_(&d__1, &e[i__], &cs, &sn, &r__); + if (i__ > ll) { + e[i__ - 1] = oldsn * r__; + } + d__1 = oldcs * r__; + d__2 = d__[i__ + 1] * sn; + dlartg_(&d__1, &d__2, &oldcs, &oldsn, &d__[i__]); + work[i__ - ll + 1] = cs; + work[i__ - ll + 1 + nm1] = sn; + work[i__ - ll + 1 + nm12] = oldcs; + work[i__ - ll + 1 + nm13] = oldsn; +/* L120: */ + } + h__ = d__[m] * cs; + d__[m] = h__ * oldcs; + e[m - 1] = h__ * oldsn; + +/* Update singular vectors */ + + if (*ncvt > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncvt, &work[1], &work[*n], &vt[ + ll + vt_dim1], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + if (*nru > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &i__1, &work[nm12 + 1], &work[nm13 + + 1], &u[ll * u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + } + if (*ncc > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncc, &work[nm12 + 1], &work[nm13 + + 1], &c__[ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + } + +/* Test convergence */ + + if ((d__1 = e[m - 1], abs(d__1)) <= thresh) { + e[m - 1] = 0.; + } + + } else { + +/* Chase bulge from bottom to top */ +/* Save cosines and sines for later singular vector updates */ + + cs = 1.; + oldcs = 1.; + i__1 = ll + 1; + for (i__ = m; i__ >= i__1; --i__) { + d__1 = d__[i__] * cs; + dlartg_(&d__1, &e[i__ - 1], &cs, &sn, &r__); + if (i__ < m) { + e[i__] = oldsn * r__; + } + d__1 = oldcs * r__; + d__2 = d__[i__ - 1] * sn; + dlartg_(&d__1, &d__2, &oldcs, &oldsn, &d__[i__]); + work[i__ - ll] = cs; + work[i__ - ll + nm1] = -sn; + work[i__ - ll + nm12] = oldcs; + work[i__ - ll + nm13] = -oldsn; +/* L130: */ + } + h__ = d__[ll] * cs; + d__[ll] = h__ * oldcs; + e[ll] = h__ * oldsn; + +/* Update singular vectors */ + + if (*ncvt > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncvt, &work[nm12 + 1], &work[ + nm13 + 1], &vt[ll + vt_dim1], ldvt, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + } + if (*nru > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"R", (char *)"V", (char *)"B", nru, &i__1, &work[1], &work[*n], &u[ll * + u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + if (*ncc > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncc, &work[1], &work[*n], &c__[ + ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + +/* Test convergence */ + + if ((d__1 = e[ll], abs(d__1)) <= thresh) { + e[ll] = 0.; + } + } + } else { + +/* Use nonzero shift */ + + if (idir == 1) { + +/* Chase bulge from top to bottom */ +/* Save cosines and sines for later singular vector updates */ + + f = ((d__1 = d__[ll], abs(d__1)) - shift) * (d_sign(&c_b49, &d__[ + ll]) + shift / d__[ll]); + g = e[ll]; + i__1 = m - 1; + for (i__ = ll; i__ <= i__1; ++i__) { + dlartg_(&f, &g, &cosr, &sinr, &r__); + if (i__ > ll) { + e[i__ - 1] = r__; + } + f = cosr * d__[i__] + sinr * e[i__]; + e[i__] = cosr * e[i__] - sinr * d__[i__]; + g = sinr * d__[i__ + 1]; + d__[i__ + 1] = cosr * d__[i__ + 1]; + dlartg_(&f, &g, &cosl, &sinl, &r__); + d__[i__] = r__; + f = cosl * e[i__] + sinl * d__[i__ + 1]; + d__[i__ + 1] = cosl * d__[i__ + 1] - sinl * e[i__]; + if (i__ < m - 1) { + g = sinl * e[i__ + 1]; + e[i__ + 1] = cosl * e[i__ + 1]; + } + work[i__ - ll + 1] = cosr; + work[i__ - ll + 1 + nm1] = sinr; + work[i__ - ll + 1 + nm12] = cosl; + work[i__ - ll + 1 + nm13] = sinl; +/* L140: */ + } + e[m - 1] = f; + +/* Update singular vectors */ + + if (*ncvt > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncvt, &work[1], &work[*n], &vt[ + ll + vt_dim1], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + if (*nru > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &i__1, &work[nm12 + 1], &work[nm13 + + 1], &u[ll * u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + } + if (*ncc > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncc, &work[nm12 + 1], &work[nm13 + + 1], &c__[ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + } + +/* Test convergence */ + + if ((d__1 = e[m - 1], abs(d__1)) <= thresh) { + e[m - 1] = 0.; + } + + } else { + +/* Chase bulge from bottom to top */ +/* Save cosines and sines for later singular vector updates */ + + f = ((d__1 = d__[m], abs(d__1)) - shift) * (d_sign(&c_b49, &d__[m] + ) + shift / d__[m]); + g = e[m - 1]; + i__1 = ll + 1; + for (i__ = m; i__ >= i__1; --i__) { + dlartg_(&f, &g, &cosr, &sinr, &r__); + if (i__ < m) { + e[i__] = r__; + } + f = cosr * d__[i__] + sinr * e[i__ - 1]; + e[i__ - 1] = cosr * e[i__ - 1] - sinr * d__[i__]; + g = sinr * d__[i__ - 1]; + d__[i__ - 1] = cosr * d__[i__ - 1]; + dlartg_(&f, &g, &cosl, &sinl, &r__); + d__[i__] = r__; + f = cosl * e[i__ - 1] + sinl * d__[i__ - 1]; + d__[i__ - 1] = cosl * d__[i__ - 1] - sinl * e[i__ - 1]; + if (i__ > ll + 1) { + g = sinl * e[i__ - 2]; + e[i__ - 2] = cosl * e[i__ - 2]; + } + work[i__ - ll] = cosr; + work[i__ - ll + nm1] = -sinr; + work[i__ - ll + nm12] = cosl; + work[i__ - ll + nm13] = -sinl; +/* L150: */ + } + e[ll] = f; + +/* Test convergence */ + + if ((d__1 = e[ll], abs(d__1)) <= thresh) { + e[ll] = 0.; + } + +/* Update singular vectors if desired */ + + if (*ncvt > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncvt, &work[nm12 + 1], &work[ + nm13 + 1], &vt[ll + vt_dim1], ldvt, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + } + if (*nru > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"R", (char *)"V", (char *)"B", nru, &i__1, &work[1], &work[*n], &u[ll * + u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + if (*ncc > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncc, &work[1], &work[*n], &c__[ + ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + } + } + +/* QR iteration finished, go back and check convergence */ + + goto L60; + +/* All singular values converged, so make them positive */ + +L160: + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + if (d__[i__] < 0.) { + d__[i__] = -d__[i__]; + +/* Change sign of singular vectors, if desired */ + + if (*ncvt > 0) { + dscal_(ncvt, &c_b72, &vt[i__ + vt_dim1], ldvt); + } + } +/* L170: */ + } + +/* Sort the singular values into decreasing order (insertion sort on */ +/* singular values, but only one transposition per singular vector) */ + + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Scan for smallest D(I) */ + + isub = 1; + smin = d__[1]; + i__2 = *n + 1 - i__; + for (j = 2; j <= i__2; ++j) { + if (d__[j] <= smin) { + isub = j; + smin = d__[j]; + } +/* L180: */ + } + if (isub != *n + 1 - i__) { + +/* Swap singular values and vectors */ + + d__[isub] = d__[*n + 1 - i__]; + d__[*n + 1 - i__] = smin; + if (*ncvt > 0) { + dswap_(ncvt, &vt[isub + vt_dim1], ldvt, &vt[*n + 1 - i__ + + vt_dim1], ldvt); + } + if (*nru > 0) { + dswap_(nru, &u[isub * u_dim1 + 1], &c__1, &u[(*n + 1 - i__) * + u_dim1 + 1], &c__1); + } + if (*ncc > 0) { + dswap_(ncc, &c__[isub + c_dim1], ldc, &c__[*n + 1 - i__ + + c_dim1], ldc); + } + } +/* L190: */ + } + goto L220; + +/* Maximum number of iterations exceeded, failure to converge */ + +L200: + *info = 0; + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + if (e[i__] != 0.) { + ++(*info); + } +/* L210: */ + } +L220: + return 0; + +/* End of DBDSQR */ + +} /* dbdsqr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dcabs1.cpp b/lib/linalg/dcabs1.cpp new file mode 100644 index 0000000000..2733be3c74 --- /dev/null +++ b/lib/linalg/dcabs1.cpp @@ -0,0 +1,92 @@ +/* fortran/dcabs1.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DCABS1 */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* DOUBLE PRECISION FUNCTION DCABS1(Z) */ + +/* .. Scalar Arguments .. */ +/* COMPLEX*16 Z */ +/* .. */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DCABS1 computes |Re(.)| + |Im(.)| of a double complex number */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is COMPLEX*16 */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level1 */ + +/* ===================================================================== */ +doublereal dcabs1_(doublecomplex *z__) +{ + /* System generated locals */ + doublereal ret_val, d__1, d__2; + + /* Builtin functions */ + double d_imag(doublecomplex *); + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. */ +/* ===================================================================== */ + +/* .. Intrinsic Functions .. */ + + ret_val = (d__1 = z__->r, abs(d__1)) + (d__2 = d_imag(z__), abs(d__2)); + return ret_val; + +/* End of DCABS1 */ + +} /* dcabs1_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dcopy.cpp b/lib/linalg/dcopy.cpp new file mode 100644 index 0000000000..52fe214e90 --- /dev/null +++ b/lib/linalg/dcopy.cpp @@ -0,0 +1,187 @@ +/* fortran/dcopy.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DCOPY */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DCOPY(N,DX,INCX,DY,INCY) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,INCY,N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION DX(*),DY(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DCOPY copies a vector, x, to a vector, y. */ +/* > uses unrolled loops for increments equal to 1. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DX */ +/* > \verbatim */ +/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of DX */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DY */ +/* > \verbatim */ +/* > DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > storage spacing between elements of DY */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, linpack, 3/11/78. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dcopy_(integer *n, doublereal *dx, integer *incx, + doublereal *dy, integer *incy) +{ + /* System generated locals */ + integer i__1; + + /* Local variables */ + integer i__, m, ix, iy, mp1; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + /* Parameter adjustments */ + --dy; + --dx; + + /* Function Body */ + if (*n <= 0) { + return 0; + } + if (*incx == 1 && *incy == 1) { + +/* code for both increments equal to 1 */ + + +/* clean-up loop */ + + m = *n % 7; + if (m != 0) { + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + dy[i__] = dx[i__]; + } + if (*n < 7) { + return 0; + } + } + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 7) { + dy[i__] = dx[i__]; + dy[i__ + 1] = dx[i__ + 1]; + dy[i__ + 2] = dx[i__ + 2]; + dy[i__ + 3] = dx[i__ + 3]; + dy[i__ + 4] = dx[i__ + 4]; + dy[i__ + 5] = dx[i__ + 5]; + dy[i__ + 6] = dx[i__ + 6]; + } + } else { + +/* code for unequal increments or equal increments */ +/* not equal to 1 */ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dy[iy] = dx[ix]; + ix += *incx; + iy += *incy; + } + } + return 0; + +/* End of DCOPY */ + +} /* dcopy_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/ddot.cpp b/lib/linalg/ddot.cpp new file mode 100644 index 0000000000..3f57f45459 --- /dev/null +++ b/lib/linalg/ddot.cpp @@ -0,0 +1,189 @@ +/* fortran/ddot.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DDOT */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,INCY,N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION DX(*),DY(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DDOT forms the dot product of two vectors. */ +/* > uses unrolled loops for increments equal to one. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DX */ +/* > \verbatim */ +/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of DX */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DY */ +/* > \verbatim */ +/* > DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > storage spacing between elements of DY */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, linpack, 3/11/78. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +doublereal ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, + integer *incy) +{ + /* System generated locals */ + integer i__1; + doublereal ret_val; + + /* Local variables */ + integer i__, m, ix, iy, mp1; + doublereal dtemp; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + /* Parameter adjustments */ + --dy; + --dx; + + /* Function Body */ + ret_val = 0.; + dtemp = 0.; + if (*n <= 0) { + return ret_val; + } + if (*incx == 1 && *incy == 1) { + +/* code for both increments equal to 1 */ + + +/* clean-up loop */ + + m = *n % 5; + if (m != 0) { + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp += dx[i__] * dy[i__]; + } + if (*n < 5) { + ret_val = dtemp; + return ret_val; + } + } + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 5) { + dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1] + + dx[i__ + 2] * dy[i__ + 2] + dx[i__ + 3] * dy[i__ + 3] + + dx[i__ + 4] * dy[i__ + 4]; + } + } else { + +/* code for unequal increments or equal increments */ +/* not equal to 1 */ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp += dx[ix] * dy[iy]; + ix += *incx; + iy += *incy; + } + } + ret_val = dtemp; + return ret_val; + +/* End of DDOT */ + +} /* ddot_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgebd2.cpp b/lib/linalg/dgebd2.cpp new file mode 100644 index 0000000000..399cd3ca6e --- /dev/null +++ b/lib/linalg/dgebd2.cpp @@ -0,0 +1,393 @@ +/* fortran/dgebd2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DGEBD2 reduces a general matrix to bidiagonal form using an unblocked algorithm. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGEBD2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGEBD2( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAUP( * ), */ +/* $ TAUQ( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGEBD2 reduces a real general m by n matrix A to upper or lower */ +/* > bidiagonal form B by an orthogonal transformation: Q**T * A * P = B. */ +/* > */ +/* > If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows in the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns in the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the m by n general matrix to be reduced. */ +/* > On exit, */ +/* > if m >= n, the diagonal and the first superdiagonal are */ +/* > overwritten with the upper bidiagonal matrix B; the */ +/* > elements below the diagonal, with the array TAUQ, represent */ +/* > the orthogonal matrix Q as a product of elementary */ +/* > reflectors, and the elements above the first superdiagonal, */ +/* > with the array TAUP, represent the orthogonal matrix P as */ +/* > a product of elementary reflectors; */ +/* > if m < n, the diagonal and the first subdiagonal are */ +/* > overwritten with the lower bidiagonal matrix B; the */ +/* > elements below the first subdiagonal, with the array TAUQ, */ +/* > represent the orthogonal matrix Q as a product of */ +/* > elementary reflectors, and the elements above the diagonal, */ +/* > with the array TAUP, represent the orthogonal matrix P as */ +/* > a product of elementary reflectors. */ +/* > See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The diagonal elements of the bidiagonal matrix B: */ +/* > D(i) = A(i,i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (min(M,N)-1) */ +/* > The off-diagonal elements of the bidiagonal matrix B: */ +/* > if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1; */ +/* > if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAUQ */ +/* > \verbatim */ +/* > TAUQ is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The scalar factors of the elementary reflectors which */ +/* > represent the orthogonal matrix Q. See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAUP */ +/* > \verbatim */ +/* > TAUP is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The scalar factors of the elementary reflectors which */ +/* > represent the orthogonal matrix P. See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (max(M,N)) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The matrices Q and P are represented as products of elementary */ +/* > reflectors: */ +/* > */ +/* > If m >= n, */ +/* > */ +/* > Q = H(1) H(2) . . . H(n) and P = G(1) G(2) . . . G(n-1) */ +/* > */ +/* > Each H(i) and G(i) has the form: */ +/* > */ +/* > H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T */ +/* > */ +/* > where tauq and taup are real scalars, and v and u are real vectors; */ +/* > v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i); */ +/* > u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n); */ +/* > tauq is stored in TAUQ(i) and taup in TAUP(i). */ +/* > */ +/* > If m < n, */ +/* > */ +/* > Q = H(1) H(2) . . . H(m-1) and P = G(1) G(2) . . . G(m) */ +/* > */ +/* > Each H(i) and G(i) has the form: */ +/* > */ +/* > H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T */ +/* > */ +/* > where tauq and taup are real scalars, and v and u are real vectors; */ +/* > v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i); */ +/* > u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n); */ +/* > tauq is stored in TAUQ(i) and taup in TAUP(i). */ +/* > */ +/* > The contents of A on exit are illustrated by the following examples: */ +/* > */ +/* > m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): */ +/* > */ +/* > ( d e u1 u1 u1 ) ( d u1 u1 u1 u1 u1 ) */ +/* > ( v1 d e u2 u2 ) ( e d u2 u2 u2 u2 ) */ +/* > ( v1 v2 d e u3 ) ( v1 e d u3 u3 u3 ) */ +/* > ( v1 v2 v3 d e ) ( v1 v2 e d u4 u4 ) */ +/* > ( v1 v2 v3 v4 d ) ( v1 v2 v3 e d u5 ) */ +/* > ( v1 v2 v3 v4 v5 ) */ +/* > */ +/* > where d and e denote diagonal and off-diagonal elements of B, vi */ +/* > denotes an element of the vector defining H(i), and ui an element of */ +/* > the vector defining G(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dgebd2_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * + taup, doublereal *work, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__; + extern /* Subroutine */ int dlarf_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen), dlarfg_(integer *, doublereal *, + doublereal *, integer *, doublereal *), xerbla_(char *, integer *, + ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --d__; + --e; + --tauq; + --taup; + --work; + + /* Function Body */ + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*m)) { + *info = -4; + } + if (*info < 0) { + i__1 = -(*info); + xerbla_((char *)"DGEBD2", &i__1, (ftnlen)6); + return 0; + } + + if (*m >= *n) { + +/* Reduce to upper bidiagonal form */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Generate elementary reflector H(i) to annihilate A(i+1:m,i) */ + + i__2 = *m - i__ + 1; +/* Computing MIN */ + i__3 = i__ + 1; + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3,*m) + i__ * + a_dim1], &c__1, &tauq[i__]); + d__[i__] = a[i__ + i__ * a_dim1]; + a[i__ + i__ * a_dim1] = 1.; + +/* Apply H(i) to A(i:m,i+1:n) from the left */ + + if (i__ < *n) { + i__2 = *m - i__ + 1; + i__3 = *n - i__; + dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, & + tauq[i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1] + , (ftnlen)4); + } + a[i__ + i__ * a_dim1] = d__[i__]; + + if (i__ < *n) { + +/* Generate elementary reflector G(i) to annihilate */ +/* A(i,i+2:n) */ + + i__2 = *n - i__; +/* Computing MIN */ + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + (i__ + 1) * a_dim1], &a[i__ + min( + i__3,*n) * a_dim1], lda, &taup[i__]); + e[i__] = a[i__ + (i__ + 1) * a_dim1]; + a[i__ + (i__ + 1) * a_dim1] = 1.; + +/* Apply G(i) to A(i+1:m,i+1:n) from the right */ + + i__2 = *m - i__; + i__3 = *n - i__; + dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + (i__ + 1) * a_dim1], + lda, &taup[i__], &a[i__ + 1 + (i__ + 1) * a_dim1], + lda, &work[1], (ftnlen)5); + a[i__ + (i__ + 1) * a_dim1] = e[i__]; + } else { + taup[i__] = 0.; + } +/* L10: */ + } + } else { + +/* Reduce to lower bidiagonal form */ + + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Generate elementary reflector G(i) to annihilate A(i,i+1:n) */ + + i__2 = *n - i__ + 1; +/* Computing MIN */ + i__3 = i__ + 1; + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3,*n) * + a_dim1], lda, &taup[i__]); + d__[i__] = a[i__ + i__ * a_dim1]; + a[i__ + i__ * a_dim1] = 1.; + +/* Apply G(i) to A(i+1:m,i:n) from the right */ + + if (i__ < *m) { + i__2 = *m - i__; + i__3 = *n - i__ + 1; + dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, & + taup[i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1], + (ftnlen)5); + } + a[i__ + i__ * a_dim1] = d__[i__]; + + if (i__ < *m) { + +/* Generate elementary reflector H(i) to annihilate */ +/* A(i+2:m,i) */ + + i__2 = *m - i__; +/* Computing MIN */ + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*m) + + i__ * a_dim1], &c__1, &tauq[i__]); + e[i__] = a[i__ + 1 + i__ * a_dim1]; + a[i__ + 1 + i__ * a_dim1] = 1.; + +/* Apply H(i) to A(i+1:m,i+1:n) from the left */ + + i__2 = *m - i__; + i__3 = *n - i__; + dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + 1 + i__ * a_dim1], & + c__1, &tauq[i__], &a[i__ + 1 + (i__ + 1) * a_dim1], + lda, &work[1], (ftnlen)4); + a[i__ + 1 + i__ * a_dim1] = e[i__]; + } else { + tauq[i__] = 0.; + } +/* L20: */ + } + } + return 0; + +/* End of DGEBD2 */ + +} /* dgebd2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgebrd.cpp b/lib/linalg/dgebrd.cpp new file mode 100644 index 0000000000..84827afcfd --- /dev/null +++ b/lib/linalg/dgebrd.cpp @@ -0,0 +1,431 @@ +/* fortran/dgebrd.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__3 = 3; +static integer c__2 = 2; +static doublereal c_b21 = -1.; +static doublereal c_b22 = 1.; + +/* > \brief \b DGEBRD */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGEBRD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, */ +/* INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAUP( * ), */ +/* $ TAUQ( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGEBRD reduces a general real M-by-N matrix A to upper or lower */ +/* > bidiagonal form B by an orthogonal transformation: Q**T * A * P = B. */ +/* > */ +/* > If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows in the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns in the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the M-by-N general matrix to be reduced. */ +/* > On exit, */ +/* > if m >= n, the diagonal and the first superdiagonal are */ +/* > overwritten with the upper bidiagonal matrix B; the */ +/* > elements below the diagonal, with the array TAUQ, represent */ +/* > the orthogonal matrix Q as a product of elementary */ +/* > reflectors, and the elements above the first superdiagonal, */ +/* > with the array TAUP, represent the orthogonal matrix P as */ +/* > a product of elementary reflectors; */ +/* > if m < n, the diagonal and the first subdiagonal are */ +/* > overwritten with the lower bidiagonal matrix B; the */ +/* > elements below the first subdiagonal, with the array TAUQ, */ +/* > represent the orthogonal matrix Q as a product of */ +/* > elementary reflectors, and the elements above the diagonal, */ +/* > with the array TAUP, represent the orthogonal matrix P as */ +/* > a product of elementary reflectors. */ +/* > See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The diagonal elements of the bidiagonal matrix B: */ +/* > D(i) = A(i,i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (min(M,N)-1) */ +/* > The off-diagonal elements of the bidiagonal matrix B: */ +/* > if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1; */ +/* > if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAUQ */ +/* > \verbatim */ +/* > TAUQ is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The scalar factors of the elementary reflectors which */ +/* > represent the orthogonal matrix Q. See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAUP */ +/* > \verbatim */ +/* > TAUP is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The scalar factors of the elementary reflectors which */ +/* > represent the orthogonal matrix P. See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The length of the array WORK. LWORK >= max(1,M,N). */ +/* > For optimum performance LWORK >= (M+N)*NB, where NB */ +/* > is the optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The matrices Q and P are represented as products of elementary */ +/* > reflectors: */ +/* > */ +/* > If m >= n, */ +/* > */ +/* > Q = H(1) H(2) . . . H(n) and P = G(1) G(2) . . . G(n-1) */ +/* > */ +/* > Each H(i) and G(i) has the form: */ +/* > */ +/* > H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T */ +/* > */ +/* > where tauq and taup are real scalars, and v and u are real vectors; */ +/* > v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i); */ +/* > u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n); */ +/* > tauq is stored in TAUQ(i) and taup in TAUP(i). */ +/* > */ +/* > If m < n, */ +/* > */ +/* > Q = H(1) H(2) . . . H(m-1) and P = G(1) G(2) . . . G(m) */ +/* > */ +/* > Each H(i) and G(i) has the form: */ +/* > */ +/* > H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T */ +/* > */ +/* > where tauq and taup are real scalars, and v and u are real vectors; */ +/* > v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i); */ +/* > u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n); */ +/* > tauq is stored in TAUQ(i) and taup in TAUP(i). */ +/* > */ +/* > The contents of A on exit are illustrated by the following examples: */ +/* > */ +/* > m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): */ +/* > */ +/* > ( d e u1 u1 u1 ) ( d u1 u1 u1 u1 u1 ) */ +/* > ( v1 d e u2 u2 ) ( e d u2 u2 u2 u2 ) */ +/* > ( v1 v2 d e u3 ) ( v1 e d u3 u3 u3 ) */ +/* > ( v1 v2 v3 d e ) ( v1 v2 e d u4 u4 ) */ +/* > ( v1 v2 v3 v4 d ) ( v1 v2 v3 e d u5 ) */ +/* > ( v1 v2 v3 v4 v5 ) */ +/* > */ +/* > where d and e denote diagonal and off-diagonal elements of B, vi */ +/* > denotes an element of the vector defining H(i), and ui an element of */ +/* > the vector defining G(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dgebrd_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * + taup, doublereal *work, integer *lwork, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + + /* Local variables */ + integer i__, j, nb, nx, ws; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer nbmin, iinfo, minmn; + extern /* Subroutine */ int dgebd2_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *), dlabrd_(integer *, integer *, integer * + , doublereal *, integer *, doublereal *, doublereal *, doublereal + *, doublereal *, doublereal *, integer *, doublereal *, integer *) + , xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + integer ldwrkx, ldwrky, lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --d__; + --e; + --tauq; + --taup; + --work; + + /* Function Body */ + *info = 0; +/* Computing MAX */ + i__1 = 1, i__2 = ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, ( + ftnlen)6, (ftnlen)1); + nb = max(i__1,i__2); + lwkopt = (*m + *n) * nb; + work[1] = (doublereal) lwkopt; + lquery = *lwork == -1; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*m)) { + *info = -4; + } else /* if(complicated condition) */ { +/* Computing MAX */ + i__1 = max(1,*m); + if (*lwork < max(i__1,*n) && ! lquery) { + *info = -10; + } + } + if (*info < 0) { + i__1 = -(*info); + xerbla_((char *)"DGEBRD", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + minmn = min(*m,*n); + if (minmn == 0) { + work[1] = 1.; + return 0; + } + + ws = max(*m,*n); + ldwrkx = *m; + ldwrky = *n; + + if (nb > 1 && nb < minmn) { + +/* Set the crossover point NX. */ + +/* Computing MAX */ + i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + +/* Determine when to switch from blocked to unblocked code. */ + + if (nx < minmn) { + ws = (*m + *n) * nb; + if (*lwork < ws) { + +/* Not enough work space for the optimal NB, consider using */ +/* a smaller block size. */ + + nbmin = ilaenv_(&c__2, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, ( + ftnlen)6, (ftnlen)1); + if (*lwork >= (*m + *n) * nbmin) { + nb = *lwork / (*m + *n); + } else { + nb = 1; + nx = minmn; + } + } + } + } else { + nx = minmn; + } + + i__1 = minmn - nx; + i__2 = nb; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + +/* Reduce rows and columns i:i+nb-1 to bidiagonal form and return */ +/* the matrices X and Y which are needed to update the unreduced */ +/* part of the matrix */ + + i__3 = *m - i__ + 1; + i__4 = *n - i__ + 1; + dlabrd_(&i__3, &i__4, &nb, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[ + i__], &tauq[i__], &taup[i__], &work[1], &ldwrkx, &work[ldwrkx + * nb + 1], &ldwrky); + +/* Update the trailing submatrix A(i+nb:m,i+nb:n), using an update */ +/* of the form A := A - V*Y**T - X*U**T */ + + i__3 = *m - i__ - nb + 1; + i__4 = *n - i__ - nb + 1; + dgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &i__4, &nb, &c_b21, &a[i__ + + nb + i__ * a_dim1], lda, &work[ldwrkx * nb + nb + 1], & + ldwrky, &c_b22, &a[i__ + nb + (i__ + nb) * a_dim1], lda, ( + ftnlen)12, (ftnlen)9); + i__3 = *m - i__ - nb + 1; + i__4 = *n - i__ - nb + 1; + dgemm_((char *)"No transpose", (char *)"No transpose", &i__3, &i__4, &nb, &c_b21, & + work[nb + 1], &ldwrkx, &a[i__ + (i__ + nb) * a_dim1], lda, & + c_b22, &a[i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)12, ( + ftnlen)12); + +/* Copy diagonal and off-diagonal elements of B back into A */ + + if (*m >= *n) { + i__3 = i__ + nb - 1; + for (j = i__; j <= i__3; ++j) { + a[j + j * a_dim1] = d__[j]; + a[j + (j + 1) * a_dim1] = e[j]; +/* L10: */ + } + } else { + i__3 = i__ + nb - 1; + for (j = i__; j <= i__3; ++j) { + a[j + j * a_dim1] = d__[j]; + a[j + 1 + j * a_dim1] = e[j]; +/* L20: */ + } + } +/* L30: */ + } + +/* Use unblocked code to reduce the remainder of the matrix */ + + i__2 = *m - i__ + 1; + i__1 = *n - i__ + 1; + dgebd2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], & + tauq[i__], &taup[i__], &work[1], &iinfo); + work[1] = (doublereal) ws; + return 0; + +/* End of DGEBRD */ + +} /* dgebrd_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgecon.cpp b/lib/linalg/dgecon.cpp new file mode 100644 index 0000000000..07a305d74f --- /dev/null +++ b/lib/linalg/dgecon.cpp @@ -0,0 +1,313 @@ +/* fortran/dgecon.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DGECON */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGECON + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, IWORK, */ +/* INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER NORM */ +/* INTEGER INFO, LDA, N */ +/* DOUBLE PRECISION ANORM, RCOND */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IWORK( * ) */ +/* DOUBLE PRECISION A( LDA, * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGECON estimates the reciprocal of the condition number of a general */ +/* > real matrix A, in either the 1-norm or the infinity-norm, using */ +/* > the LU factorization computed by DGETRF. */ +/* > */ +/* > An estimate is obtained for norm(inv(A)), and the reciprocal of the */ +/* > condition number is computed as */ +/* > RCOND = 1 / ( norm(A) * norm(inv(A)) ). */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] NORM */ +/* > \verbatim */ +/* > NORM is CHARACTER*1 */ +/* > Specifies whether the 1-norm condition number or the */ +/* > infinity-norm condition number is required: */ +/* > = '1' or 'O': 1-norm; */ +/* > = 'I': Infinity-norm. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > The factors L and U from the factorization A = P*L*U */ +/* > as computed by DGETRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ANORM */ +/* > \verbatim */ +/* > ANORM is DOUBLE PRECISION */ +/* > If NORM = '1' or 'O', the 1-norm of the original matrix A. */ +/* > If NORM = 'I', the infinity-norm of the original matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RCOND */ +/* > \verbatim */ +/* > RCOND is DOUBLE PRECISION */ +/* > The reciprocal of the condition number of the matrix A, */ +/* > computed as RCOND = 1/(norm(A) * norm(inv(A))). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (4*N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension (N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dgecon_(char *norm, integer *n, doublereal *a, integer * + lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * + iwork, integer *info, ftnlen norm_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1; + doublereal d__1; + + /* Local variables */ + doublereal sl; + integer ix; + doublereal su; + integer kase, kase1; + doublereal scale; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer isave[3]; + extern /* Subroutine */ int drscl_(integer *, doublereal *, doublereal *, + integer *), dlacn2_(integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *); + extern doublereal dlamch_(char *, ftnlen); + extern integer idamax_(integer *, doublereal *, integer *); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + doublereal ainvnm; + extern /* Subroutine */ int dlatrs_(char *, char *, char *, char *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + logical onenrm; + char normin[1]; + doublereal smlnum; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Local Arrays .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --work; + --iwork; + + /* Function Body */ + *info = 0; + onenrm = *(unsigned char *)norm == '1' || lsame_(norm, (char *)"O", (ftnlen)1, ( + ftnlen)1); + if (! onenrm && ! lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } else if (*anorm < 0.) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGECON", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + *rcond = 0.; + if (*n == 0) { + *rcond = 1.; + return 0; + } else if (*anorm == 0.) { + return 0; + } + + smlnum = dlamch_((char *)"Safe minimum", (ftnlen)12); + +/* Estimate the norm of inv(A). */ + + ainvnm = 0.; + *(unsigned char *)normin = 'N'; + if (onenrm) { + kase1 = 1; + } else { + kase1 = 2; + } + kase = 0; +L10: + dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); + if (kase != 0) { + if (kase == kase1) { + +/* Multiply by inv(L). */ + + dlatrs_((char *)"Lower", (char *)"No transpose", (char *)"Unit", normin, n, &a[a_offset], + lda, &work[1], &sl, &work[(*n << 1) + 1], info, (ftnlen)5, + (ftnlen)12, (ftnlen)4, (ftnlen)1); + +/* Multiply by inv(U). */ + + dlatrs_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", normin, n, &a[ + a_offset], lda, &work[1], &su, &work[*n * 3 + 1], info, ( + ftnlen)5, (ftnlen)12, (ftnlen)8, (ftnlen)1); + } else { + +/* Multiply by inv(U**T). */ + + dlatrs_((char *)"Upper", (char *)"Transpose", (char *)"Non-unit", normin, n, &a[a_offset], + lda, &work[1], &su, &work[*n * 3 + 1], info, (ftnlen)5, ( + ftnlen)9, (ftnlen)8, (ftnlen)1); + +/* Multiply by inv(L**T). */ + + dlatrs_((char *)"Lower", (char *)"Transpose", (char *)"Unit", normin, n, &a[a_offset], + lda, &work[1], &sl, &work[(*n << 1) + 1], info, (ftnlen)5, + (ftnlen)9, (ftnlen)4, (ftnlen)1); + } + +/* Divide X by 1/(SL*SU) if doing so will not cause overflow. */ + + scale = sl * su; + *(unsigned char *)normin = 'Y'; + if (scale != 1.) { + ix = idamax_(n, &work[1], &c__1); + if (scale < (d__1 = work[ix], abs(d__1)) * smlnum || scale == 0.) + { + goto L20; + } + drscl_(n, &scale, &work[1], &c__1); + } + goto L10; + } + +/* Compute the estimate of the reciprocal condition number. */ + + if (ainvnm != 0.) { + *rcond = 1. / ainvnm / *anorm; + } + +L20: + return 0; + +/* End of DGECON */ + +} /* dgecon_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgelq2.cpp b/lib/linalg/dgelq2.cpp new file mode 100644 index 0000000000..6000253184 --- /dev/null +++ b/lib/linalg/dgelq2.cpp @@ -0,0 +1,245 @@ +/* fortran/dgelq2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DGELQ2 computes the LQ factorization of a general rectangular matrix using an unblocked algorit +hm. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGELQ2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGELQ2( M, N, A, LDA, TAU, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGELQ2 computes an LQ factorization of a real m-by-n matrix A: */ +/* > */ +/* > A = ( L 0 ) * Q */ +/* > */ +/* > where: */ +/* > */ +/* > Q is a n-by-n orthogonal matrix; */ +/* > L is a lower-triangular m-by-m matrix; */ +/* > 0 is a m-by-(n-m) zero matrix, if m < n. */ +/* > */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the m by n matrix A. */ +/* > On exit, the elements on and below the diagonal of the array */ +/* > contain the m by min(m,n) lower trapezoidal matrix L (L is */ +/* > lower triangular if m <= n); the elements above the diagonal, */ +/* > with the array TAU, represent the orthogonal matrix Q as a */ +/* > product of elementary reflectors (see Further Details). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The scalar factors of the elementary reflectors (see Further */ +/* > Details). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (M) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The matrix Q is represented as a product of elementary reflectors */ +/* > */ +/* > Q = H(k) . . . H(2) H(1), where k = min(m,n). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**T */ +/* > */ +/* > where tau is a real scalar, and v is a real vector with */ +/* > v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n), */ +/* > and tau in TAU(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dgelq2_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, k; + doublereal aii; + extern /* Subroutine */ int dlarf_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen), dlarfg_(integer *, doublereal *, + doublereal *, integer *, doublereal *), xerbla_(char *, integer *, + ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*m)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGELQ2", &i__1, (ftnlen)6); + return 0; + } + + k = min(*m,*n); + + i__1 = k; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Generate elementary reflector H(i) to annihilate A(i,i+1:n) */ + + i__2 = *n - i__ + 1; +/* Computing MIN */ + i__3 = i__ + 1; + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3,*n) * a_dim1] + , lda, &tau[i__]); + if (i__ < *m) { + +/* Apply H(i) to A(i+1:m,i:n) from the right */ + + aii = a[i__ + i__ * a_dim1]; + a[i__ + i__ * a_dim1] = 1.; + i__2 = *m - i__; + i__3 = *n - i__ + 1; + dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[ + i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1], (ftnlen) + 5); + a[i__ + i__ * a_dim1] = aii; + } +/* L10: */ + } + return 0; + +/* End of DGELQ2 */ + +} /* dgelq2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgelqf.cpp b/lib/linalg/dgelqf.cpp new file mode 100644 index 0000000000..ede5b8198b --- /dev/null +++ b/lib/linalg/dgelqf.cpp @@ -0,0 +1,345 @@ +/* fortran/dgelqf.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__3 = 3; +static integer c__2 = 2; + +/* > \brief \b DGELQF */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGELQF + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGELQF computes an LQ factorization of a real M-by-N matrix A: */ +/* > */ +/* > A = ( L 0 ) * Q */ +/* > */ +/* > where: */ +/* > */ +/* > Q is a N-by-N orthogonal matrix; */ +/* > L is a lower-triangular M-by-M matrix; */ +/* > 0 is a M-by-(N-M) zero matrix, if M < N. */ +/* > */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the M-by-N matrix A. */ +/* > On exit, the elements on and below the diagonal of the array */ +/* > contain the m-by-min(m,n) lower trapezoidal matrix L (L is */ +/* > lower triangular if m <= n); the elements above the diagonal, */ +/* > with the array TAU, represent the orthogonal matrix Q as a */ +/* > product of elementary reflectors (see Further Details). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The scalar factors of the elementary reflectors (see Further */ +/* > Details). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= max(1,M). */ +/* > For optimum performance LWORK >= M*NB, where NB is the */ +/* > optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The matrix Q is represented as a product of elementary reflectors */ +/* > */ +/* > Q = H(k) . . . H(2) H(1), where k = min(m,n). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**T */ +/* > */ +/* > where tau is a real scalar, and v is a real vector with */ +/* > v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n), */ +/* > and tau in TAU(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dgelqf_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + + /* Local variables */ + integer i__, k, ib, nb, nx, iws, nbmin, iinfo; + extern /* Subroutine */ int dgelq2_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *), dlarfb_(char *, + char *, char *, char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + integer ldwork, lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + nb = ilaenv_(&c__1, (char *)"DGELQF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen) + 1); + lwkopt = *m * nb; + work[1] = (doublereal) lwkopt; + lquery = *lwork == -1; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*m)) { + *info = -4; + } else if (*lwork < max(1,*m) && ! lquery) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGELQF", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + k = min(*m,*n); + if (k == 0) { + work[1] = 1.; + return 0; + } + + nbmin = 2; + nx = 0; + iws = *m; + if (nb > 1 && nb < k) { + +/* Determine when to cross over from blocked to unblocked code. */ + +/* Computing MAX */ + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DGELQF", (char *)" ", m, n, &c_n1, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < k) { + +/* Determine if workspace is large enough for blocked code. */ + + ldwork = *m; + iws = ldwork * nb; + if (*lwork < iws) { + +/* Not enough workspace to use optimal NB: reduce NB and */ +/* determine the minimum value of NB. */ + + nb = *lwork / ldwork; +/* Computing MAX */ + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DGELQF", (char *)" ", m, n, &c_n1, & + c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } + } + + if (nb >= nbmin && nb < k && nx < k) { + +/* Use blocked code initially */ + + i__1 = k - nx; + i__2 = nb; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { +/* Computing MIN */ + i__3 = k - i__ + 1; + ib = min(i__3,nb); + +/* Compute the LQ factorization of the current block */ +/* A(i:i+ib-1,i:n) */ + + i__3 = *n - i__ + 1; + dgelq2_(&ib, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ + 1], &iinfo); + if (i__ + ib <= *m) { + +/* Form the triangular factor of the block reflector */ +/* H = H(i) H(i+1) . . . H(i+ib-1) */ + + i__3 = *n - i__ + 1; + dlarft_((char *)"Forward", (char *)"Rowwise", &i__3, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, + (ftnlen)7); + +/* Apply H to A(i+ib:m,i:n) from the right */ + + i__3 = *m - i__ - ib + 1; + i__4 = *n - i__ + 1; + dlarfb_((char *)"Right", (char *)"No transpose", (char *)"Forward", (char *)"Rowwise", &i__3, + &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & + ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[ib + + 1], &ldwork, (ftnlen)5, (ftnlen)12, (ftnlen)7, ( + ftnlen)7); + } +/* L10: */ + } + } else { + i__ = 1; + } + +/* Use unblocked code to factor the last or only block. */ + + if (i__ <= k) { + i__2 = *m - i__ + 1; + i__1 = *n - i__ + 1; + dgelq2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1] + , &iinfo); + } + + work[1] = (doublereal) iws; + return 0; + +/* End of DGELQF */ + +} /* dgelqf_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgelsd.cpp b/lib/linalg/dgelsd.cpp new file mode 100644 index 0000000000..7a74d30ef2 --- /dev/null +++ b/lib/linalg/dgelsd.cpp @@ -0,0 +1,816 @@ +/* fortran/dgelsd.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__6 = 6; +static integer c_n1 = -1; +static integer c__9 = 9; +static integer c__0 = 0; +static integer c__1 = 1; +static doublereal c_b82 = 0.; + +/* > \brief DGELSD computes the minimum-norm solution to a linear least squares problem for GE matrices */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGELSD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGELSD( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, */ +/* WORK, LWORK, IWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS, RANK */ +/* DOUBLE PRECISION RCOND */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IWORK( * ) */ +/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), S( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGELSD computes the minimum-norm solution to a real linear least */ +/* > squares problem: */ +/* > minimize 2-norm(| b - A*x |) */ +/* > using the singular value decomposition (SVD) of A. A is an M-by-N */ +/* > matrix which may be rank-deficient. */ +/* > */ +/* > Several right hand side vectors b and solution vectors x can be */ +/* > handled in a single call; they are stored as the columns of the */ +/* > M-by-NRHS right hand side matrix B and the N-by-NRHS solution */ +/* > matrix X. */ +/* > */ +/* > The problem is solved in three steps: */ +/* > (1) Reduce the coefficient matrix A to bidiagonal form with */ +/* > Householder transformations, reducing the original problem */ +/* > into a (char *)"bidiagonal least squares problem" (BLS) */ +/* > (2) Solve the BLS using a divide and conquer approach. */ +/* > (3) Apply back all the Householder transformations to solve */ +/* > the original least squares problem. */ +/* > */ +/* > The effective rank of A is determined by treating as zero those */ +/* > singular values which are less than RCOND times the largest singular */ +/* > value. */ +/* > */ +/* > The divide and conquer algorithm makes very mild assumptions about */ +/* > floating point arithmetic. It will work on machines with a guard */ +/* > digit in add/subtract, or on those binary machines without guard */ +/* > digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ +/* > Cray-2. It could conceivably fail on hexadecimal or decimal machines */ +/* > without guard digits, but we know of none. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NRHS */ +/* > \verbatim */ +/* > NRHS is INTEGER */ +/* > The number of right hand sides, i.e., the number of columns */ +/* > of the matrices B and X. NRHS >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the M-by-N matrix A. */ +/* > On exit, A has been destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ +/* > On entry, the M-by-NRHS right hand side matrix B. */ +/* > On exit, B is overwritten by the N-by-NRHS solution */ +/* > matrix X. If m >= n and RANK = n, the residual */ +/* > sum-of-squares for the solution in the i-th column is given */ +/* > by the sum of squares of elements n+1:m in that column. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >= max(1,max(M,N)). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The singular values of A in decreasing order. */ +/* > The condition number of A in the 2-norm = S(1)/S(min(m,n)). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RCOND */ +/* > \verbatim */ +/* > RCOND is DOUBLE PRECISION */ +/* > RCOND is used to determine the effective rank of A. */ +/* > Singular values S(i) <= RCOND*S(1) are treated as zero. */ +/* > If RCOND < 0, machine precision is used instead. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RANK */ +/* > \verbatim */ +/* > RANK is INTEGER */ +/* > The effective rank of A, i.e., the number of singular values */ +/* > which are greater than RCOND*S(1). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK must be at least 1. */ +/* > The exact minimum amount of workspace needed depends on M, */ +/* > N and NRHS. As long as LWORK is at least */ +/* > 12*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS + (SMLSIZ+1)**2, */ +/* > if M is greater than or equal to N or */ +/* > 12*M + 2*M*SMLSIZ + 8*M*NLVL + M*NRHS + (SMLSIZ+1)**2, */ +/* > if M is less than N, the code will execute correctly. */ +/* > SMLSIZ is returned by ILAENV and is equal to the maximum */ +/* > size of the subproblems at the bottom of the computation */ +/* > tree (usually about 25), and */ +/* > NLVL = MAX( 0, INT( LOG_2( MIN( M,N )/(SMLSIZ+1) ) ) + 1 ) */ +/* > For good performance, LWORK should generally be larger. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension (MAX(1,LIWORK)) */ +/* > LIWORK >= max(1, 3 * MINMN * NLVL + 11 * MINMN), */ +/* > where MINMN = MIN( M,N ). */ +/* > On exit, if INFO = 0, IWORK(1) returns the minimum LIWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: the algorithm for computing the SVD failed to converge; */ +/* > if INFO = i, i off-diagonal elements of an intermediate */ +/* > bidiagonal form did not converge to zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEsolve */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ming Gu and Ren-Cang Li, Computer Science Division, University of */ +/* > California at Berkeley, USA \n */ +/* > Osni Marques, LBNL/NERSC, USA \n */ + +/* ===================================================================== */ +/* Subroutine */ int dgelsd_(integer *m, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * + s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, + integer *iwork, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; + + /* Builtin functions */ + double log(doublereal); + + /* Local variables */ + integer ie, il, mm; + doublereal eps, anrm, bnrm; + integer itau, nlvl, iascl, ibscl; + doublereal sfmin; + integer minmn, maxmn, itaup, itauq, mnthr, nwork; + extern /* Subroutine */ int dlabad_(doublereal *, doublereal *), dgebrd_( + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *); + extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, ftnlen); + extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *), + dlalsd_(char *, integer *, integer *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, integer *, ftnlen), dlascl_(char *, + integer *, integer *, doublereal *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, ftnlen), dgeqrf_( + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *), dlacpy_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), dlaset_(char *, integer *, integer *, doublereal *, + doublereal *, doublereal *, integer *, ftnlen), xerbla_(char *, + integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + doublereal bignum; + extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *, + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen, ftnlen); + integer wlalsd; + extern /* Subroutine */ int dormlq_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + integer ldwork; + extern /* Subroutine */ int dormqr_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + integer liwork, minwrk, maxwrk; + doublereal smlnum; + logical lquery; + integer smlsiz; + + +/* -- LAPACK driver routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + --s; + --work; + --iwork; + + /* Function Body */ + *info = 0; + minmn = min(*m,*n); + maxmn = max(*m,*n); + mnthr = ilaenv_(&c__6, (char *)"DGELSD", (char *)" ", m, n, nrhs, &c_n1, (ftnlen)6, ( + ftnlen)1); + lquery = *lwork == -1; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } else if (*ldb < max(1,maxmn)) { + *info = -7; + } + + smlsiz = ilaenv_(&c__9, (char *)"DGELSD", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( + ftnlen)6, (ftnlen)1); + +/* Compute workspace. */ +/* (Note: Comments in the code beginning (char *)"Workspace:" describe the */ +/* minimal amount of workspace needed at that point in the code, */ +/* as well as the preferred amount for good performance. */ +/* NB refers to the optimal block size for the immediately */ +/* following subroutine, as returned by ILAENV.) */ + + minwrk = 1; + liwork = 1; + minmn = max(1,minmn); +/* Computing MAX */ + i__1 = (integer) (log((doublereal) minmn / (doublereal) (smlsiz + 1)) / + log(2.)) + 1; + nlvl = max(i__1,0); + + if (*info == 0) { + maxwrk = 0; + liwork = minmn * 3 * nlvl + minmn * 11; + mm = *m; + if (*m >= *n && *m >= mnthr) { + +/* Path 1a - overdetermined, with many more rows than columns. */ + + mm = *n; +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n + *n * ilaenv_(&c__1, (char *)"DGEQRF", (char *)" ", m, + n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n + *nrhs * ilaenv_(&c__1, (char *)"DORMQR", (char *)"LT", + m, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)2); + maxwrk = max(i__1,i__2); + } + if (*m >= *n) { + +/* Path 1 - overdetermined or exactly determined. */ + +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n * 3 + (mm + *n) * ilaenv_(&c__1, (char *)"DGEBRD" + , (char *)" ", &mm, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n * 3 + *nrhs * ilaenv_(&c__1, (char *)"DORMBR", + (char *)"QLT", &mm, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n * 3 + (*n - 1) * ilaenv_(&c__1, (char *)"DORMBR", + (char *)"PLN", n, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1,i__2); +/* Computing 2nd power */ + i__1 = smlsiz + 1; + wlalsd = *n * 9 + (*n << 1) * smlsiz + (*n << 3) * nlvl + *n * * + nrhs + i__1 * i__1; +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n * 3 + wlalsd; + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = *n * 3 + mm, i__2 = *n * 3 + *nrhs, i__1 = max(i__1,i__2), + i__2 = *n * 3 + wlalsd; + minwrk = max(i__1,i__2); + } + if (*n > *m) { +/* Computing 2nd power */ + i__1 = smlsiz + 1; + wlalsd = *m * 9 + (*m << 1) * smlsiz + (*m << 3) * nlvl + *m * * + nrhs + i__1 * i__1; + if (*n >= mnthr) { + +/* Path 2a - underdetermined, with many more columns */ +/* than rows. */ + + maxwrk = *m + *m * ilaenv_(&c__1, (char *)"DGELQF", (char *)" ", m, n, &c_n1, + &c_n1, (ftnlen)6, (ftnlen)1); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + (*m << 1) * + ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, m, &c_n1, &c_n1, ( + ftnlen)6, (ftnlen)1); + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + *nrhs * ilaenv_(& + c__1, (char *)"DORMBR", (char *)"QLT", m, nrhs, m, &c_n1, (ftnlen)6, ( + ftnlen)3); + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + (*m - 1) * + ilaenv_(&c__1, (char *)"DORMBR", (char *)"PLN", m, nrhs, m, &c_n1, ( + ftnlen)6, (ftnlen)3); + maxwrk = max(i__1,i__2); + if (*nrhs > 1) { +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + *m + *m * *nrhs; + maxwrk = max(i__1,i__2); + } else { +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + (*m << 1); + maxwrk = max(i__1,i__2); + } +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m + *nrhs * ilaenv_(&c__1, (char *)"DORMLQ", + (char *)"LT", n, nrhs, m, &c_n1, (ftnlen)6, (ftnlen)2); + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + wlalsd; + maxwrk = max(i__1,i__2); +/* XXX: Ensure the Path 2a case below is triggered. The workspace */ +/* calculation should use queries for all routines eventually. */ +/* Computing MAX */ +/* Computing MAX */ + i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = + max(i__3,*nrhs), i__4 = *n - *m * 3; + i__1 = maxwrk, i__2 = (*m << 2) + *m * *m + max(i__3,i__4); + maxwrk = max(i__1,i__2); + } else { + +/* Path 2 - remaining underdetermined cases. */ + + maxwrk = *m * 3 + (*n + *m) * ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, + n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * 3 + *nrhs * ilaenv_(&c__1, (char *)"DORMBR" + , (char *)"QLT", m, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * 3 + *m * ilaenv_(&c__1, (char *)"DORMBR", + (char *)"PLN", n, nrhs, m, &c_n1, (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * 3 + wlalsd; + maxwrk = max(i__1,i__2); + } +/* Computing MAX */ + i__1 = *m * 3 + *nrhs, i__2 = *m * 3 + *m, i__1 = max(i__1,i__2), + i__2 = *m * 3 + wlalsd; + minwrk = max(i__1,i__2); + } + minwrk = min(minwrk,maxwrk); + work[1] = (doublereal) maxwrk; + iwork[1] = liwork; + if (*lwork < minwrk && ! lquery) { + *info = -12; + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGELSD", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + goto L10; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0) { + *rank = 0; + return 0; + } + +/* Get machine parameters. */ + + eps = dlamch_((char *)"P", (ftnlen)1); + sfmin = dlamch_((char *)"S", (ftnlen)1); + smlnum = sfmin / eps; + bignum = 1. / smlnum; + dlabad_(&smlnum, &bignum); + +/* Scale A if max entry outside range [SMLNUM,BIGNUM]. */ + + anrm = dlange_((char *)"M", m, n, &a[a_offset], lda, &work[1], (ftnlen)1); + iascl = 0; + if (anrm > 0. && anrm < smlnum) { + +/* Scale matrix norm up to SMLNUM. */ + + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, + info, (ftnlen)1); + iascl = 1; + } else if (anrm > bignum) { + +/* Scale matrix norm down to BIGNUM. */ + + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, + info, (ftnlen)1); + iascl = 2; + } else if (anrm == 0.) { + +/* Matrix all zero. Return zero solution. */ + + i__1 = max(*m,*n); + dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[b_offset], ldb, (ftnlen) + 1); + dlaset_((char *)"F", &minmn, &c__1, &c_b82, &c_b82, &s[1], &c__1, (ftnlen)1); + *rank = 0; + goto L10; + } + +/* Scale B if max entry outside range [SMLNUM,BIGNUM]. */ + + bnrm = dlange_((char *)"M", m, nrhs, &b[b_offset], ldb, &work[1], (ftnlen)1); + ibscl = 0; + if (bnrm > 0. && bnrm < smlnum) { + +/* Scale matrix norm up to SMLNUM. */ + + dlascl_((char *)"G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + ibscl = 1; + } else if (bnrm > bignum) { + +/* Scale matrix norm down to BIGNUM. */ + + dlascl_((char *)"G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + ibscl = 2; + } + +/* If M < N make sure certain entries of B are zero. */ + + if (*m < *n) { + i__1 = *n - *m; + dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[*m + 1 + b_dim1], ldb, ( + ftnlen)1); + } + +/* Overdetermined case. */ + + if (*m >= *n) { + +/* Path 1 - overdetermined or exactly determined. */ + + mm = *m; + if (*m >= mnthr) { + +/* Path 1a - overdetermined, with many more rows than columns. */ + + mm = *n; + itau = 1; + nwork = itau + *n; + +/* Compute A=Q*R. */ +/* (Workspace: need 2*N, prefer N+N*NB) */ + + i__1 = *lwork - nwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, + info); + +/* Multiply B by transpose(Q). */ +/* (Workspace: need N+NRHS, prefer N+NRHS*NB) */ + + i__1 = *lwork - nwork + 1; + dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itau], &b[ + b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( + ftnlen)1); + +/* Zero out below R. */ + + if (*n > 1) { + i__1 = *n - 1; + i__2 = *n - 1; + dlaset_((char *)"L", &i__1, &i__2, &c_b82, &c_b82, &a[a_dim1 + 2], + lda, (ftnlen)1); + } + } + + ie = 1; + itauq = ie + *n; + itaup = itauq + *n; + nwork = itaup + *n; + +/* Bidiagonalize R in A. */ +/* (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB) */ + + i__1 = *lwork - nwork + 1; + dgebrd_(&mm, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & + work[itaup], &work[nwork], &i__1, info); + +/* Multiply B by transpose of left bidiagonalizing vectors of R. */ +/* (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB) */ + + i__1 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, &work[itauq], + &b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + +/* Solve the bidiagonal least squares problem. */ + + dlalsd_((char *)"U", &smlsiz, n, nrhs, &s[1], &work[ie], &b[b_offset], ldb, + rcond, rank, &work[nwork], &iwork[1], info, (ftnlen)1); + if (*info != 0) { + goto L10; + } + +/* Multiply B by right bidiagonalizing vectors of R. */ + + i__1 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"N", n, nrhs, n, &a[a_offset], lda, &work[itaup], & + b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + + } else /* if(complicated condition) */ { +/* Computing MAX */ + i__1 = *m, i__2 = (*m << 1) - 4, i__1 = max(i__1,i__2), i__1 = max( + i__1,*nrhs), i__2 = *n - *m * 3, i__1 = max(i__1,i__2); + if (*n >= mnthr && *lwork >= (*m << 2) + *m * *m + max(i__1,wlalsd)) { + +/* Path 2a - underdetermined, with many more columns than rows */ +/* and sufficient workspace for an efficient algorithm. */ + + ldwork = *m; +/* Computing MAX */ +/* Computing MAX */ + i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = + max(i__3,*nrhs), i__4 = *n - *m * 3; + i__1 = (*m << 2) + *m * *lda + max(i__3,i__4), i__2 = *m * *lda + + *m + *m * *nrhs, i__1 = max(i__1,i__2), i__2 = (*m << 2) + + *m * *lda + wlalsd; + if (*lwork >= max(i__1,i__2)) { + ldwork = *lda; + } + itau = 1; + nwork = *m + 1; + +/* Compute A=L*Q. */ +/* (Workspace: need 2*M, prefer M+M*NB) */ + + i__1 = *lwork - nwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, + info); + il = nwork; + +/* Copy L to WORK(IL), zeroing out above its diagonal. */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[il], &ldwork, (ftnlen) + 1); + i__1 = *m - 1; + i__2 = *m - 1; + dlaset_((char *)"U", &i__1, &i__2, &c_b82, &c_b82, &work[il + ldwork], & + ldwork, (ftnlen)1); + ie = il + ldwork * *m; + itauq = ie + *m; + itaup = itauq + *m; + nwork = itaup + *m; + +/* Bidiagonalize L in WORK(IL). */ +/* (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB) */ + + i__1 = *lwork - nwork + 1; + dgebrd_(m, m, &work[il], &ldwork, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[nwork], &i__1, info); + +/* Multiply B by transpose of left bidiagonalizing vectors of L. */ +/* (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB) */ + + i__1 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &work[il], &ldwork, &work[ + itauq], &b[b_offset], ldb, &work[nwork], &i__1, info, ( + ftnlen)1, (ftnlen)1, (ftnlen)1); + +/* Solve the bidiagonal least squares problem. */ + + dlalsd_((char *)"U", &smlsiz, m, nrhs, &s[1], &work[ie], &b[b_offset], + ldb, rcond, rank, &work[nwork], &iwork[1], info, (ftnlen) + 1); + if (*info != 0) { + goto L10; + } + +/* Multiply B by right bidiagonalizing vectors of L. */ + + i__1 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"N", m, nrhs, m, &work[il], &ldwork, &work[ + itaup], &b[b_offset], ldb, &work[nwork], &i__1, info, ( + ftnlen)1, (ftnlen)1, (ftnlen)1); + +/* Zero out below first M rows of B. */ + + i__1 = *n - *m; + dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[*m + 1 + b_dim1], + ldb, (ftnlen)1); + nwork = itau + *m; + +/* Multiply transpose(Q) by B. */ +/* (Workspace: need M+NRHS, prefer M+NRHS*NB) */ + + i__1 = *lwork - nwork + 1; + dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, &work[itau], &b[ + b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( + ftnlen)1); + + } else { + +/* Path 2 - remaining underdetermined cases. */ + + ie = 1; + itauq = ie + *m; + itaup = itauq + *m; + nwork = itaup + *m; + +/* Bidiagonalize A. */ +/* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ + + i__1 = *lwork - nwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & + work[itaup], &work[nwork], &i__1, info); + +/* Multiply B by transpose of left bidiagonalizing vectors. */ +/* (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB) */ + + i__1 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itauq] + , &b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, + (ftnlen)1, (ftnlen)1); + +/* Solve the bidiagonal least squares problem. */ + + dlalsd_((char *)"L", &smlsiz, m, nrhs, &s[1], &work[ie], &b[b_offset], + ldb, rcond, rank, &work[nwork], &iwork[1], info, (ftnlen) + 1); + if (*info != 0) { + goto L10; + } + +/* Multiply B by right bidiagonalizing vectors of A. */ + + i__1 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"N", n, nrhs, m, &a[a_offset], lda, &work[itaup] + , &b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, + (ftnlen)1, (ftnlen)1); + + } + } + +/* Undo scaling. */ + + if (iascl == 1) { + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & + minmn, info, (ftnlen)1); + } else if (iascl == 2) { + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & + minmn, info, (ftnlen)1); + } + if (ibscl == 1) { + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + } else if (ibscl == 2) { + dlascl_((char *)"G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + } + +L10: + work[1] = (doublereal) maxwrk; + iwork[1] = liwork; + return 0; + +/* End of DGELSD */ + +} /* dgelsd_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgelss.cpp b/lib/linalg/dgelss.cpp new file mode 100644 index 0000000000..6377208923 --- /dev/null +++ b/lib/linalg/dgelss.cpp @@ -0,0 +1,988 @@ +/* fortran/dgelss.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__6 = 6; +static integer c_n1 = -1; +static integer c__0 = 0; +static doublereal c_b46 = 0.; +static integer c__1 = 1; +static doublereal c_b79 = 1.; + +/* > \brief DGELSS solves overdetermined or underdetermined systems for GE matrices */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGELSS + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, */ +/* WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS, RANK */ +/* DOUBLE PRECISION RCOND */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), S( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGELSS computes the minimum norm solution to a real linear least */ +/* > squares problem: */ +/* > */ +/* > Minimize 2-norm(| b - A*x |). */ +/* > */ +/* > using the singular value decomposition (SVD) of A. A is an M-by-N */ +/* > matrix which may be rank-deficient. */ +/* > */ +/* > Several right hand side vectors b and solution vectors x can be */ +/* > handled in a single call; they are stored as the columns of the */ +/* > M-by-NRHS right hand side matrix B and the N-by-NRHS solution matrix */ +/* > X. */ +/* > */ +/* > The effective rank of A is determined by treating as zero those */ +/* > singular values which are less than RCOND times the largest singular */ +/* > value. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NRHS */ +/* > \verbatim */ +/* > NRHS is INTEGER */ +/* > The number of right hand sides, i.e., the number of columns */ +/* > of the matrices B and X. NRHS >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the M-by-N matrix A. */ +/* > On exit, the first min(m,n) rows of A are overwritten with */ +/* > its right singular vectors, stored rowwise. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ +/* > On entry, the M-by-NRHS right hand side matrix B. */ +/* > On exit, B is overwritten by the N-by-NRHS solution */ +/* > matrix X. If m >= n and RANK = n, the residual */ +/* > sum-of-squares for the solution in the i-th column is given */ +/* > by the sum of squares of elements n+1:m in that column. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >= max(1,max(M,N)). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The singular values of A in decreasing order. */ +/* > The condition number of A in the 2-norm = S(1)/S(min(m,n)). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RCOND */ +/* > \verbatim */ +/* > RCOND is DOUBLE PRECISION */ +/* > RCOND is used to determine the effective rank of A. */ +/* > Singular values S(i) <= RCOND*S(1) are treated as zero. */ +/* > If RCOND < 0, machine precision is used instead. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RANK */ +/* > \verbatim */ +/* > RANK is INTEGER */ +/* > The effective rank of A, i.e., the number of singular values */ +/* > which are greater than RCOND*S(1). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= 1, and also: */ +/* > LWORK >= 3*min(M,N) + max( 2*min(M,N), max(M,N), NRHS ) */ +/* > For good performance, LWORK should generally be larger. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: the algorithm for computing the SVD failed to converge; */ +/* > if INFO = i, i off-diagonal elements of an intermediate */ +/* > bidiagonal form did not converge to zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEsolve */ + +/* ===================================================================== */ +/* Subroutine */ int dgelss_(integer *m, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * + s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, + integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; + doublereal d__1; + + /* Local variables */ + integer i__, bl, ie, il, mm; + doublereal dum[1], eps, thr, anrm, bnrm; + integer itau, lwork_dgebrd__, lwork_dgelqf__, lwork_dgeqrf__, + lwork_dorgbr__, lwork_dormbr__, lwork_dormlq__, lwork_dormqr__; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer iascl, ibscl; + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen), drscl_(integer *, + doublereal *, doublereal *, integer *); + integer chunk; + doublereal sfmin; + integer minmn; + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); + integer maxmn, itaup, itauq, mnthr, iwork; + extern /* Subroutine */ int dlabad_(doublereal *, doublereal *), dgebrd_( + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *); + extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, ftnlen); + integer bdspac; + extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, + integer *, integer *, doublereal *, integer *, integer *, ftnlen), + dgeqrf_(integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *), dlacpy_(char *, + integer *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen), dlaset_(char *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen), dbdsqr_(char *, integer *, + integer *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen), dorgbr_(char *, + integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *, ftnlen); + doublereal bignum; + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *, + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen, ftnlen), dormlq_(char *, char *, integer *, + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen); + integer ldwork; + extern /* Subroutine */ int dormqr_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + integer minwrk, maxwrk; + doublereal smlnum; + logical lquery; + + +/* -- LAPACK driver routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Local Arrays .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + --s; + --work; + + /* Function Body */ + *info = 0; + minmn = min(*m,*n); + maxmn = max(*m,*n); + lquery = *lwork == -1; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } else if (*ldb < max(1,maxmn)) { + *info = -7; + } + +/* Compute workspace */ +/* (Note: Comments in the code beginning (char *)"Workspace:" describe the */ +/* minimal amount of workspace needed at that point in the code, */ +/* as well as the preferred amount for good performance. */ +/* NB refers to the optimal block size for the immediately */ +/* following subroutine, as returned by ILAENV.) */ + + if (*info == 0) { + minwrk = 1; + maxwrk = 1; + if (minmn > 0) { + mm = *m; + mnthr = ilaenv_(&c__6, (char *)"DGELSS", (char *)" ", m, n, nrhs, &c_n1, (ftnlen) + 6, (ftnlen)1); + if (*m >= *n && *m >= mnthr) { + +/* Path 1a - overdetermined, with many more rows than */ +/* columns */ + +/* Compute space needed for DGEQRF */ + dgeqrf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, info); + lwork_dgeqrf__ = (integer) dum[0]; +/* Compute space needed for DORMQR */ + dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, dum, &b[ + b_offset], ldb, dum, &c_n1, info, (ftnlen)1, (ftnlen) + 1); + lwork_dormqr__ = (integer) dum[0]; + mm = *n; +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n + lwork_dgeqrf__; + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n + lwork_dormqr__; + maxwrk = max(i__1,i__2); + } + if (*m >= *n) { + +/* Path 1 - overdetermined or exactly determined */ + +/* Compute workspace needed for DBDSQR */ + +/* Computing MAX */ + i__1 = 1, i__2 = *n * 5; + bdspac = max(i__1,i__2); +/* Compute space needed for DGEBRD */ + dgebrd_(&mm, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, + &c_n1, info); + lwork_dgebrd__ = (integer) dum[0]; +/* Compute space needed for DORMBR */ + dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, dum, & + b[b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + lwork_dormbr__ = (integer) dum[0]; +/* Compute space needed for DORGBR */ + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, + info, (ftnlen)1); + lwork_dorgbr__ = (integer) dum[0]; +/* Compute total workspace needed */ +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n * 3 + lwork_dgebrd__; + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n * 3 + lwork_dormbr__; + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n * 3 + lwork_dorgbr__; + maxwrk = max(i__1,i__2); + maxwrk = max(maxwrk,bdspac); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n * *nrhs; + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = *n * 3 + mm, i__2 = *n * 3 + *nrhs, i__1 = max(i__1, + i__2); + minwrk = max(i__1,bdspac); + maxwrk = max(minwrk,maxwrk); + } + if (*n > *m) { + +/* Compute workspace needed for DBDSQR */ + +/* Computing MAX */ + i__1 = 1, i__2 = *m * 5; + bdspac = max(i__1,i__2); +/* Computing MAX */ + i__1 = *m * 3 + *nrhs, i__2 = *m * 3 + *n, i__1 = max(i__1, + i__2); + minwrk = max(i__1,bdspac); + if (*n >= mnthr) { + +/* Path 2a - underdetermined, with many more columns */ +/* than rows */ + +/* Compute space needed for DGELQF */ + dgelqf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, info); + lwork_dgelqf__ = (integer) dum[0]; +/* Compute space needed for DGEBRD */ + dgebrd_(m, m, &a[a_offset], lda, &s[1], dum, dum, dum, + dum, &c_n1, info); + lwork_dgebrd__ = (integer) dum[0]; +/* Compute space needed for DORMBR */ + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, dum, + &b[b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + lwork_dormbr__ = (integer) dum[0]; +/* Compute space needed for DORGBR */ + dorgbr_((char *)"P", m, m, m, &a[a_offset], lda, dum, dum, &c_n1, + info, (ftnlen)1); + lwork_dorgbr__ = (integer) dum[0]; +/* Compute space needed for DORMLQ */ + dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, dum, &b[ + b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( + ftnlen)1); + lwork_dormlq__ = (integer) dum[0]; +/* Compute total workspace needed */ + maxwrk = *m + lwork_dgelqf__; +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + + lwork_dgebrd__; + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + + lwork_dormbr__; + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + + lwork_dorgbr__; + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + *m + bdspac; + maxwrk = max(i__1,i__2); + if (*nrhs > 1) { +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + *m + *m * *nrhs; + maxwrk = max(i__1,i__2); + } else { +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + (*m << 1); + maxwrk = max(i__1,i__2); + } +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m + lwork_dormlq__; + maxwrk = max(i__1,i__2); + } else { + +/* Path 2 - underdetermined */ + +/* Compute space needed for DGEBRD */ + dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, + dum, &c_n1, info); + lwork_dgebrd__ = (integer) dum[0]; +/* Compute space needed for DORMBR */ + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &a[a_offset], lda, dum, + &b[b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + lwork_dormbr__ = (integer) dum[0]; +/* Compute space needed for DORGBR */ + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, dum, dum, &c_n1, + info, (ftnlen)1); + lwork_dorgbr__ = (integer) dum[0]; + maxwrk = *m * 3 + lwork_dgebrd__; +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * 3 + lwork_dormbr__; + maxwrk = max(i__1,i__2); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * 3 + lwork_dorgbr__; + maxwrk = max(i__1,i__2); + maxwrk = max(maxwrk,bdspac); +/* Computing MAX */ + i__1 = maxwrk, i__2 = *n * *nrhs; + maxwrk = max(i__1,i__2); + } + } + maxwrk = max(minwrk,maxwrk); + } + work[1] = (doublereal) maxwrk; + + if (*lwork < minwrk && ! lquery) { + *info = -12; + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGELSS", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0) { + *rank = 0; + return 0; + } + +/* Get machine parameters */ + + eps = dlamch_((char *)"P", (ftnlen)1); + sfmin = dlamch_((char *)"S", (ftnlen)1); + smlnum = sfmin / eps; + bignum = 1. / smlnum; + dlabad_(&smlnum, &bignum); + +/* Scale A if max element outside range [SMLNUM,BIGNUM] */ + + anrm = dlange_((char *)"M", m, n, &a[a_offset], lda, &work[1], (ftnlen)1); + iascl = 0; + if (anrm > 0. && anrm < smlnum) { + +/* Scale matrix norm up to SMLNUM */ + + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, + info, (ftnlen)1); + iascl = 1; + } else if (anrm > bignum) { + +/* Scale matrix norm down to BIGNUM */ + + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, + info, (ftnlen)1); + iascl = 2; + } else if (anrm == 0.) { + +/* Matrix all zero. Return zero solution. */ + + i__1 = max(*m,*n); + dlaset_((char *)"F", &i__1, nrhs, &c_b46, &c_b46, &b[b_offset], ldb, (ftnlen) + 1); + dlaset_((char *)"F", &minmn, &c__1, &c_b46, &c_b46, &s[1], &minmn, (ftnlen)1); + *rank = 0; + goto L70; + } + +/* Scale B if max element outside range [SMLNUM,BIGNUM] */ + + bnrm = dlange_((char *)"M", m, nrhs, &b[b_offset], ldb, &work[1], (ftnlen)1); + ibscl = 0; + if (bnrm > 0. && bnrm < smlnum) { + +/* Scale matrix norm up to SMLNUM */ + + dlascl_((char *)"G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + ibscl = 1; + } else if (bnrm > bignum) { + +/* Scale matrix norm down to BIGNUM */ + + dlascl_((char *)"G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + ibscl = 2; + } + +/* Overdetermined case */ + + if (*m >= *n) { + +/* Path 1 - overdetermined or exactly determined */ + + mm = *m; + if (*m >= mnthr) { + +/* Path 1a - overdetermined, with many more rows than columns */ + + mm = *n; + itau = 1; + iwork = itau + *n; + +/* Compute A=Q*R */ +/* (Workspace: need 2*N, prefer N+N*NB) */ + + i__1 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__1, + info); + +/* Multiply B by transpose(Q) */ +/* (Workspace: need N+NRHS, prefer N+NRHS*NB) */ + + i__1 = *lwork - iwork + 1; + dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itau], &b[ + b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, ( + ftnlen)1); + +/* Zero out below R */ + + if (*n > 1) { + i__1 = *n - 1; + i__2 = *n - 1; + dlaset_((char *)"L", &i__1, &i__2, &c_b46, &c_b46, &a[a_dim1 + 2], + lda, (ftnlen)1); + } + } + + ie = 1; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in A */ +/* (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB) */ + + i__1 = *lwork - iwork + 1; + dgebrd_(&mm, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & + work[itaup], &work[iwork], &i__1, info); + +/* Multiply B by transpose of left bidiagonalizing vectors of R */ +/* (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB) */ + + i__1 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, &work[itauq], + &b[b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + +/* Generate right bidiagonalizing vectors of R in A */ +/* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ + + i__1 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], & + i__1, info, (ftnlen)1); + iwork = ie + *n; + +/* Perform bidiagonal QR iteration */ +/* multiply B by transpose of left singular vectors */ +/* compute right singular vectors in A */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, n, &c__0, nrhs, &s[1], &work[ie], &a[a_offset], lda, + dum, &c__1, &b[b_offset], ldb, &work[iwork], info, (ftnlen)1); + if (*info != 0) { + goto L70; + } + +/* Multiply B by reciprocals of singular values */ + +/* Computing MAX */ + d__1 = *rcond * s[1]; + thr = max(d__1,sfmin); + if (*rcond < 0.) { +/* Computing MAX */ + d__1 = eps * s[1]; + thr = max(d__1,sfmin); + } + *rank = 0; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + if (s[i__] > thr) { + drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); + ++(*rank); + } else { + dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1], + ldb, (ftnlen)1); + } +/* L10: */ + } + +/* Multiply B by right singular vectors */ +/* (Workspace: need N, prefer N*NRHS) */ + + if (*lwork >= *ldb * *nrhs && *nrhs > 1) { + dgemm_((char *)"T", (char *)"N", n, nrhs, n, &c_b79, &a[a_offset], lda, &b[ + b_offset], ldb, &c_b46, &work[1], ldb, (ftnlen)1, (ftnlen) + 1); + dlacpy_((char *)"G", n, nrhs, &work[1], ldb, &b[b_offset], ldb, (ftnlen)1) + ; + } else if (*nrhs > 1) { + chunk = *lwork / *n; + i__1 = *nrhs; + i__2 = chunk; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { +/* Computing MIN */ + i__3 = *nrhs - i__ + 1; + bl = min(i__3,chunk); + dgemm_((char *)"T", (char *)"N", n, &bl, n, &c_b79, &a[a_offset], lda, &b[i__ + * b_dim1 + 1], ldb, &c_b46, &work[1], n, (ftnlen)1, ( + ftnlen)1); + dlacpy_((char *)"G", n, &bl, &work[1], n, &b[i__ * b_dim1 + 1], ldb, ( + ftnlen)1); +/* L20: */ + } + } else { + dgemv_((char *)"T", n, n, &c_b79, &a[a_offset], lda, &b[b_offset], &c__1, + &c_b46, &work[1], &c__1, (ftnlen)1); + dcopy_(n, &work[1], &c__1, &b[b_offset], &c__1); + } + + } else /* if(complicated condition) */ { +/* Computing MAX */ + i__2 = *m, i__1 = (*m << 1) - 4, i__2 = max(i__2,i__1), i__2 = max( + i__2,*nrhs), i__1 = *n - *m * 3; + if (*n >= mnthr && *lwork >= (*m << 2) + *m * *m + max(i__2,i__1)) { + +/* Path 2a - underdetermined, with many more columns than rows */ +/* and sufficient workspace for an efficient algorithm */ + + ldwork = *m; +/* Computing MAX */ +/* Computing MAX */ + i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = + max(i__3,*nrhs), i__4 = *n - *m * 3; + i__2 = (*m << 2) + *m * *lda + max(i__3,i__4), i__1 = *m * *lda + + *m + *m * *nrhs; + if (*lwork >= max(i__2,i__1)) { + ldwork = *lda; + } + itau = 1; + iwork = *m + 1; + +/* Compute A=L*Q */ +/* (Workspace: need 2*M, prefer M+M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, + info); + il = iwork; + +/* Copy L to WORK(IL), zeroing out above it */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[il], &ldwork, (ftnlen) + 1); + i__2 = *m - 1; + i__1 = *m - 1; + dlaset_((char *)"U", &i__2, &i__1, &c_b46, &c_b46, &work[il + ldwork], & + ldwork, (ftnlen)1); + ie = il + ldwork * *m; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in WORK(IL) */ +/* (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[il], &ldwork, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, info); + +/* Multiply B by transpose of left bidiagonalizing vectors of L */ +/* (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &work[il], &ldwork, &work[ + itauq], &b[b_offset], ldb, &work[iwork], &i__2, info, ( + ftnlen)1, (ftnlen)1, (ftnlen)1); + +/* Generate right bidiagonalizing vectors of R in WORK(IL) */ +/* (Workspace: need M*M+5*M-1, prefer M*M+4*M+(M-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[il], &ldwork, &work[itaup], &work[ + iwork], &i__2, info, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, */ +/* computing right singular vectors of L in WORK(IL) and */ +/* multiplying B by transpose of left singular vectors */ +/* (Workspace: need M*M+M+BDSPAC) */ + + dbdsqr_((char *)"U", m, m, &c__0, nrhs, &s[1], &work[ie], &work[il], & + ldwork, &a[a_offset], lda, &b[b_offset], ldb, &work[iwork] + , info, (ftnlen)1); + if (*info != 0) { + goto L70; + } + +/* Multiply B by reciprocals of singular values */ + +/* Computing MAX */ + d__1 = *rcond * s[1]; + thr = max(d__1,sfmin); + if (*rcond < 0.) { +/* Computing MAX */ + d__1 = eps * s[1]; + thr = max(d__1,sfmin); + } + *rank = 0; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + if (s[i__] > thr) { + drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); + ++(*rank); + } else { + dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1] + , ldb, (ftnlen)1); + } +/* L30: */ + } + iwork = ie; + +/* Multiply B by right singular vectors of L in WORK(IL) */ +/* (Workspace: need M*M+2*M, prefer M*M+M+M*NRHS) */ + + if (*lwork >= *ldb * *nrhs + iwork - 1 && *nrhs > 1) { + dgemm_((char *)"T", (char *)"N", m, nrhs, m, &c_b79, &work[il], &ldwork, &b[ + b_offset], ldb, &c_b46, &work[iwork], ldb, (ftnlen)1, + (ftnlen)1); + dlacpy_((char *)"G", m, nrhs, &work[iwork], ldb, &b[b_offset], ldb, ( + ftnlen)1); + } else if (*nrhs > 1) { + chunk = (*lwork - iwork + 1) / *m; + i__2 = *nrhs; + i__1 = chunk; + for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += + i__1) { +/* Computing MIN */ + i__3 = *nrhs - i__ + 1; + bl = min(i__3,chunk); + dgemm_((char *)"T", (char *)"N", m, &bl, m, &c_b79, &work[il], &ldwork, & + b[i__ * b_dim1 + 1], ldb, &c_b46, &work[iwork], m, + (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"G", m, &bl, &work[iwork], m, &b[i__ * b_dim1 + 1] + , ldb, (ftnlen)1); +/* L40: */ + } + } else { + dgemv_((char *)"T", m, m, &c_b79, &work[il], &ldwork, &b[b_dim1 + 1], + &c__1, &c_b46, &work[iwork], &c__1, (ftnlen)1); + dcopy_(m, &work[iwork], &c__1, &b[b_dim1 + 1], &c__1); + } + +/* Zero out below first M rows of B */ + + i__1 = *n - *m; + dlaset_((char *)"F", &i__1, nrhs, &c_b46, &c_b46, &b[*m + 1 + b_dim1], + ldb, (ftnlen)1); + iwork = itau + *m; + +/* Multiply transpose(Q) by B */ +/* (Workspace: need M+NRHS, prefer M+NRHS*NB) */ + + i__1 = *lwork - iwork + 1; + dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, &work[itau], &b[ + b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, ( + ftnlen)1); + + } else { + +/* Path 2 - remaining underdetermined cases */ + + ie = 1; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize A */ +/* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ + + i__1 = *lwork - iwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & + work[itaup], &work[iwork], &i__1, info); + +/* Multiply B by transpose of left bidiagonalizing vectors */ +/* (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB) */ + + i__1 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itauq] + , &b[b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, + (ftnlen)1, (ftnlen)1); + +/* Generate right bidiagonalizing vectors in A */ +/* (Workspace: need 4*M, prefer 3*M+M*NB) */ + + i__1 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], &work[ + iwork], &i__1, info, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, */ +/* computing right singular vectors of A in A and */ +/* multiplying B by transpose of left singular vectors */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"L", m, n, &c__0, nrhs, &s[1], &work[ie], &a[a_offset], + lda, dum, &c__1, &b[b_offset], ldb, &work[iwork], info, ( + ftnlen)1); + if (*info != 0) { + goto L70; + } + +/* Multiply B by reciprocals of singular values */ + +/* Computing MAX */ + d__1 = *rcond * s[1]; + thr = max(d__1,sfmin); + if (*rcond < 0.) { +/* Computing MAX */ + d__1 = eps * s[1]; + thr = max(d__1,sfmin); + } + *rank = 0; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + if (s[i__] > thr) { + drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); + ++(*rank); + } else { + dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1] + , ldb, (ftnlen)1); + } +/* L50: */ + } + +/* Multiply B by right singular vectors of A */ +/* (Workspace: need N, prefer N*NRHS) */ + + if (*lwork >= *ldb * *nrhs && *nrhs > 1) { + dgemm_((char *)"T", (char *)"N", n, nrhs, m, &c_b79, &a[a_offset], lda, &b[ + b_offset], ldb, &c_b46, &work[1], ldb, (ftnlen)1, ( + ftnlen)1); + dlacpy_((char *)"F", n, nrhs, &work[1], ldb, &b[b_offset], ldb, ( + ftnlen)1); + } else if (*nrhs > 1) { + chunk = *lwork / *n; + i__1 = *nrhs; + i__2 = chunk; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += + i__2) { +/* Computing MIN */ + i__3 = *nrhs - i__ + 1; + bl = min(i__3,chunk); + dgemm_((char *)"T", (char *)"N", n, &bl, m, &c_b79, &a[a_offset], lda, &b[ + i__ * b_dim1 + 1], ldb, &c_b46, &work[1], n, ( + ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", n, &bl, &work[1], n, &b[i__ * b_dim1 + 1], + ldb, (ftnlen)1); +/* L60: */ + } + } else { + dgemv_((char *)"T", m, n, &c_b79, &a[a_offset], lda, &b[b_offset], & + c__1, &c_b46, &work[1], &c__1, (ftnlen)1); + dcopy_(n, &work[1], &c__1, &b[b_offset], &c__1); + } + } + } + +/* Undo scaling */ + + if (iascl == 1) { + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & + minmn, info, (ftnlen)1); + } else if (iascl == 2) { + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & + minmn, info, (ftnlen)1); + } + if (ibscl == 1) { + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + } else if (ibscl == 2) { + dlascl_((char *)"G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + } + +L70: + work[1] = (doublereal) maxwrk; + return 0; + +/* End of DGELSS */ + +} /* dgelss_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgemm.cpp b/lib/linalg/dgemm.cpp new file mode 100644 index 0000000000..2f59801245 --- /dev/null +++ b/lib/linalg/dgemm.cpp @@ -0,0 +1,458 @@ +/* fortran/dgemm.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DGEMM */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION ALPHA,BETA */ +/* INTEGER K,LDA,LDB,LDC,M,N */ +/* CHARACTER TRANSA,TRANSB */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGEMM performs one of the matrix-matrix operations */ +/* > */ +/* > C := alpha*op( A )*op( B ) + beta*C, */ +/* > */ +/* > where op( X ) is one of */ +/* > */ +/* > op( X ) = X or op( X ) = X**T, */ +/* > */ +/* > alpha and beta are scalars, and A, B and C are matrices, with op( A ) */ +/* > an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] TRANSA */ +/* > \verbatim */ +/* > TRANSA is CHARACTER*1 */ +/* > On entry, TRANSA specifies the form of op( A ) to be used in */ +/* > the matrix multiplication as follows: */ +/* > */ +/* > TRANSA = 'N' or 'n', op( A ) = A. */ +/* > */ +/* > TRANSA = 'T' or 't', op( A ) = A**T. */ +/* > */ +/* > TRANSA = 'C' or 'c', op( A ) = A**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANSB */ +/* > \verbatim */ +/* > TRANSB is CHARACTER*1 */ +/* > On entry, TRANSB specifies the form of op( B ) to be used in */ +/* > the matrix multiplication as follows: */ +/* > */ +/* > TRANSB = 'N' or 'n', op( B ) = B. */ +/* > */ +/* > TRANSB = 'T' or 't', op( B ) = B**T. */ +/* > */ +/* > TRANSB = 'C' or 'c', op( B ) = B**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > On entry, M specifies the number of rows of the matrix */ +/* > op( A ) and of the matrix C. M must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the number of columns of the matrix */ +/* > op( B ) and the number of columns of the matrix C. N must be */ +/* > at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > On entry, K specifies the number of columns of the matrix */ +/* > op( A ) and the number of rows of the matrix op( B ). K must */ +/* > be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION. */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is */ +/* > k when TRANSA = 'N' or 'n', and is m otherwise. */ +/* > Before entry with TRANSA = 'N' or 'n', the leading m by k */ +/* > part of the array A must contain the matrix A, otherwise */ +/* > the leading k by m part of the array A must contain the */ +/* > matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. When TRANSA = 'N' or 'n' then */ +/* > LDA must be at least max( 1, m ), otherwise LDA must be at */ +/* > least max( 1, k ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension ( LDB, kb ), where kb is */ +/* > n when TRANSB = 'N' or 'n', and is k otherwise. */ +/* > Before entry with TRANSB = 'N' or 'n', the leading k by n */ +/* > part of the array B must contain the matrix B, otherwise */ +/* > the leading n by k part of the array B must contain the */ +/* > matrix B. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > On entry, LDB specifies the first dimension of B as declared */ +/* > in the calling (sub) program. When TRANSB = 'N' or 'n' then */ +/* > LDB must be at least max( 1, k ), otherwise LDB must be at */ +/* > least max( 1, n ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is DOUBLE PRECISION. */ +/* > On entry, BETA specifies the scalar beta. When BETA is */ +/* > supplied as zero then C need not be set on input. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension ( LDC, N ) */ +/* > Before entry, the leading m by n part of the array C must */ +/* > contain the matrix C, except when beta is zero, in which */ +/* > case C need not be set on entry. */ +/* > On exit, the array C is overwritten by the m by n matrix */ +/* > ( alpha*op( A )*op( B ) + beta*C ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > On entry, LDC specifies the first dimension of C as declared */ +/* > in the calling (sub) program. LDC must be at least */ +/* > max( 1, m ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level3 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 3 Blas routine. */ +/* > */ +/* > -- Written on 8-February-1989. */ +/* > Jack Dongarra, Argonne National Laboratory. */ +/* > Iain Duff, AERE Harwell. */ +/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ +/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dgemm_(char *transa, char *transb, integer *m, integer * + n, integer *k, doublereal *alpha, doublereal *a, integer *lda, + doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, + integer *ldc, ftnlen transa_len, ftnlen transb_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3; + + /* Local variables */ + integer i__, j, l, info; + logical nota, notb; + doublereal temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nrowa, nrowb; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level3 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Parameters .. */ +/* .. */ + +/* Set NOTA and NOTB as true if A and B respectively are not */ +/* transposed and set NROWA and NROWB as the number of rows of A */ +/* and B respectively. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + nota = lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1); + notb = lsame_(transb, (char *)"N", (ftnlen)1, (ftnlen)1); + if (nota) { + nrowa = *m; + } else { + nrowa = *k; + } + if (notb) { + nrowb = *k; + } else { + nrowb = *n; + } + +/* Test the input parameters. */ + + info = 0; + if (! nota && ! lsame_(transa, (char *)"C", (ftnlen)1, (ftnlen)1) && ! lsame_( + transa, (char *)"T", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! notb && ! lsame_(transb, (char *)"C", (ftnlen)1, (ftnlen)1) && ! + lsame_(transb, (char *)"T", (ftnlen)1, (ftnlen)1)) { + info = 2; + } else if (*m < 0) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*k < 0) { + info = 5; + } else if (*lda < max(1,nrowa)) { + info = 8; + } else if (*ldb < max(1,nrowb)) { + info = 10; + } else if (*ldc < max(1,*m)) { + info = 13; + } + if (info != 0) { + xerbla_((char *)"DGEMM ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { + return 0; + } + +/* And if alpha.eq.zero. */ + + if (*alpha == 0.) { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + return 0; + } + +/* Start the operations. */ + + if (notb) { + if (nota) { + +/* Form C := alpha*A*B + beta*C. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; +/* L50: */ + } + } else if (*beta != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L60: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + temp = *alpha * b[l + j * b_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; +/* L70: */ + } +/* L80: */ + } +/* L90: */ + } + } else { + +/* Form C := alpha*A**T*B + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * b[l + j * b_dim1]; +/* L100: */ + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L110: */ + } +/* L120: */ + } + } + } else { + if (nota) { + +/* Form C := alpha*A*B**T + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; +/* L130: */ + } + } else if (*beta != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L140: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + temp = *alpha * b[j + l * b_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; +/* L150: */ + } +/* L160: */ + } +/* L170: */ + } + } else { + +/* Form C := alpha*A**T*B**T + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * b[j + l * b_dim1]; +/* L180: */ + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L190: */ + } +/* L200: */ + } + } + } + + return 0; + +/* End of DGEMM */ + +} /* dgemm_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgemv.cpp b/lib/linalg/dgemv.cpp new file mode 100644 index 0000000000..1d121c33c0 --- /dev/null +++ b/lib/linalg/dgemv.cpp @@ -0,0 +1,385 @@ +/* fortran/dgemv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DGEMV */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION ALPHA,BETA */ +/* INTEGER INCX,INCY,LDA,M,N */ +/* CHARACTER TRANS */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A(LDA,*),X(*),Y(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGEMV performs one of the matrix-vector operations */ +/* > */ +/* > y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y, */ +/* > */ +/* > where alpha and beta are scalars, x and y are vectors and A is an */ +/* > m by n matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > On entry, TRANS specifies the operation to be performed as */ +/* > follows: */ +/* > */ +/* > TRANS = 'N' or 'n' y := alpha*A*x + beta*y. */ +/* > */ +/* > TRANS = 'T' or 't' y := alpha*A**T*x + beta*y. */ +/* > */ +/* > TRANS = 'C' or 'c' y := alpha*A**T*x + beta*y. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > On entry, M specifies the number of rows of the matrix A. */ +/* > M must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the number of columns of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION. */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension ( LDA, N ) */ +/* > Before entry, the leading m by n part of the array A must */ +/* > contain the matrix of coefficients. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. LDA must be at least */ +/* > max( 1, m ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' */ +/* > and at least */ +/* > ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. */ +/* > Before entry, the incremented array X must contain the */ +/* > vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is DOUBLE PRECISION. */ +/* > On entry, BETA specifies the scalar beta. When BETA is */ +/* > supplied as zero then Y need not be set on input. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Y */ +/* > \verbatim */ +/* > Y is DOUBLE PRECISION array, dimension at least */ +/* > ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' */ +/* > and at least */ +/* > ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. */ +/* > Before entry with BETA non-zero, the incremented array Y */ +/* > must contain the vector y. On exit, Y is overwritten by the */ +/* > updated vector y. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > On entry, INCY specifies the increment for the elements of */ +/* > Y. INCY must not be zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dgemv_(char *trans, integer *m, integer *n, doublereal * + alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, + doublereal *beta, doublereal *y, integer *incy, ftnlen trans_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + + /* Local variables */ + integer i__, j, ix, iy, jx, jy, kx, ky, info; + doublereal temp; + integer lenx, leny; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + --y; + + /* Function Body */ + info = 0; + if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"T", ( + ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1) + ) { + info = 1; + } else if (*m < 0) { + info = 2; + } else if (*n < 0) { + info = 3; + } else if (*lda < max(1,*m)) { + info = 6; + } else if (*incx == 0) { + info = 8; + } else if (*incy == 0) { + info = 11; + } + if (info != 0) { + xerbla_((char *)"DGEMV ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) { + return 0; + } + +/* Set LENX and LENY, the lengths of the vectors x and y, and set */ +/* up the start points in X and Y. */ + + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + lenx = *n; + leny = *m; + } else { + lenx = *m; + leny = *n; + } + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (lenx - 1) * *incx; + } + if (*incy > 0) { + ky = 1; + } else { + ky = 1 - (leny - 1) * *incy; + } + +/* Start the operations. In this version the elements of A are */ +/* accessed sequentially with one pass through A. */ + +/* First form y := beta*y. */ + + if (*beta != 1.) { + if (*incy == 1) { + if (*beta == 0.) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = 0.; +/* L10: */ + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = *beta * y[i__]; +/* L20: */ + } + } + } else { + iy = ky; + if (*beta == 0.) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = 0.; + iy += *incy; +/* L30: */ + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = *beta * y[iy]; + iy += *incy; +/* L40: */ + } + } + } + } + if (*alpha == 0.) { + return 0; + } + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form y := alpha*A*x + y. */ + + jx = kx; + if (*incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = *alpha * x[jx]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + y[i__] += temp * a[i__ + j * a_dim1]; +/* L50: */ + } + jx += *incx; +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = *alpha * x[jx]; + iy = ky; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + y[iy] += temp * a[i__ + j * a_dim1]; + iy += *incy; +/* L70: */ + } + jx += *incx; +/* L80: */ + } + } + } else { + +/* Form y := alpha*A**T*x + y. */ + + jy = ky; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = 0.; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp += a[i__ + j * a_dim1] * x[i__]; +/* L90: */ + } + y[jy] += *alpha * temp; + jy += *incy; +/* L100: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = 0.; + ix = kx; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp += a[i__ + j * a_dim1] * x[ix]; + ix += *incx; +/* L110: */ + } + y[jy] += *alpha * temp; + jy += *incy; +/* L120: */ + } + } + } + + return 0; + +/* End of DGEMV */ + +} /* dgemv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgeqr2.cpp b/lib/linalg/dgeqr2.cpp new file mode 100644 index 0000000000..635e360bc7 --- /dev/null +++ b/lib/linalg/dgeqr2.cpp @@ -0,0 +1,250 @@ +/* fortran/dgeqr2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DGEQR2 computes the QR factorization of a general rectangular matrix using an unblocked algorit +hm. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGEQR2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGEQR2( M, N, A, LDA, TAU, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGEQR2 computes a QR factorization of a real m-by-n matrix A: */ +/* > */ +/* > A = Q * ( R ), */ +/* > ( 0 ) */ +/* > */ +/* > where: */ +/* > */ +/* > Q is a m-by-m orthogonal matrix; */ +/* > R is an upper-triangular n-by-n matrix; */ +/* > 0 is a (m-n)-by-n zero matrix, if m > n. */ +/* > */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the m by n matrix A. */ +/* > On exit, the elements on and above the diagonal of the array */ +/* > contain the min(m,n) by n upper trapezoidal matrix R (R is */ +/* > upper triangular if m >= n); the elements below the diagonal, */ +/* > with the array TAU, represent the orthogonal matrix Q as a */ +/* > product of elementary reflectors (see Further Details). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The scalar factors of the elementary reflectors (see Further */ +/* > Details). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The matrix Q is represented as a product of elementary reflectors */ +/* > */ +/* > Q = H(1) H(2) . . . H(k), where k = min(m,n). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**T */ +/* > */ +/* > where tau is a real scalar, and v is a real vector with */ +/* > v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), */ +/* > and tau in TAU(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dgeqr2_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, k; + doublereal aii; + extern /* Subroutine */ int dlarf_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen), dlarfg_(integer *, doublereal *, + doublereal *, integer *, doublereal *), xerbla_(char *, integer *, + ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*m)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGEQR2", &i__1, (ftnlen)6); + return 0; + } + + k = min(*m,*n); + + i__1 = k; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Generate elementary reflector H(i) to annihilate A(i+1:m,i) */ + + i__2 = *m - i__ + 1; +/* Computing MIN */ + i__3 = i__ + 1; + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3,*m) + i__ * a_dim1] + , &c__1, &tau[i__]); + if (i__ < *n) { + +/* Apply H(i) to A(i:m,i+1:n) from the left */ + + aii = a[i__ + i__ * a_dim1]; + a[i__ + i__ * a_dim1] = 1.; + i__2 = *m - i__ + 1; + i__3 = *n - i__; + dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, &tau[ + i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], ( + ftnlen)4); + a[i__ + i__ * a_dim1] = aii; + } +/* L10: */ + } + return 0; + +/* End of DGEQR2 */ + +} /* dgeqr2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgeqrf.cpp b/lib/linalg/dgeqrf.cpp new file mode 100644 index 0000000000..fa0aca3f47 --- /dev/null +++ b/lib/linalg/dgeqrf.cpp @@ -0,0 +1,354 @@ +/* fortran/dgeqrf.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__3 = 3; +static integer c__2 = 2; + +/* > \brief \b DGEQRF */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGEQRF + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGEQRF computes a QR factorization of a real M-by-N matrix A: */ +/* > */ +/* > A = Q * ( R ), */ +/* > ( 0 ) */ +/* > */ +/* > where: */ +/* > */ +/* > Q is a M-by-M orthogonal matrix; */ +/* > R is an upper-triangular N-by-N matrix; */ +/* > 0 is a (M-N)-by-N zero matrix, if M > N. */ +/* > */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the M-by-N matrix A. */ +/* > On exit, the elements on and above the diagonal of the array */ +/* > contain the min(M,N)-by-N upper trapezoidal matrix R (R is */ +/* > upper triangular if m >= n); the elements below the diagonal, */ +/* > with the array TAU, represent the orthogonal matrix Q as a */ +/* > product of min(m,n) elementary reflectors (see Further */ +/* > Details). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The scalar factors of the elementary reflectors (see Further */ +/* > Details). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise. */ +/* > For optimum performance LWORK >= N*NB, where NB is */ +/* > the optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The matrix Q is represented as a product of elementary reflectors */ +/* > */ +/* > Q = H(1) H(2) . . . H(k), where k = min(m,n). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**T */ +/* > */ +/* > where tau is a real scalar, and v is a real vector with */ +/* > v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), */ +/* > and tau in TAU(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dgeqrf_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + + /* Local variables */ + integer i__, k, ib, nb, nx, iws, nbmin, iinfo; + extern /* Subroutine */ int dgeqr2_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *), dlarfb_(char *, + char *, char *, char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + integer ldwork, lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + k = min(*m,*n); + *info = 0; + nb = ilaenv_(&c__1, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen) + 1); + lquery = *lwork == -1; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*m)) { + *info = -4; + } else if (! lquery) { + if (*lwork <= 0 || *m > 0 && *lwork < max(1,*n)) { + *info = -7; + } + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGEQRF", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + if (k == 0) { + lwkopt = 1; + } else { + lwkopt = *n * nb; + } + work[1] = (doublereal) lwkopt; + return 0; + } + +/* Quick return if possible */ + + if (k == 0) { + work[1] = 1.; + return 0; + } + + nbmin = 2; + nx = 0; + iws = *n; + if (nb > 1 && nb < k) { + +/* Determine when to cross over from blocked to unblocked code. */ + +/* Computing MAX */ + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < k) { + +/* Determine if workspace is large enough for blocked code. */ + + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { + +/* Not enough workspace to use optimal NB: reduce NB and */ +/* determine the minimum value of NB. */ + + nb = *lwork / ldwork; +/* Computing MAX */ + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, & + c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } + } + + if (nb >= nbmin && nb < k && nx < k) { + +/* Use blocked code initially */ + + i__1 = k - nx; + i__2 = nb; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { +/* Computing MIN */ + i__3 = k - i__ + 1; + ib = min(i__3,nb); + +/* Compute the QR factorization of the current block */ +/* A(i:m,i:i+ib-1) */ + + i__3 = *m - i__ + 1; + dgeqr2_(&i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ + 1], &iinfo); + if (i__ + ib <= *n) { + +/* Form the triangular factor of the block reflector */ +/* H = H(i) H(i+1) . . . H(i+ib-1) */ + + i__3 = *m - i__ + 1; + dlarft_((char *)"Forward", (char *)"Columnwise", &i__3, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, + (ftnlen)10); + +/* Apply H**T to A(i:m,i+ib:n) from the left */ + + i__3 = *m - i__ + 1; + i__4 = *n - i__ - ib + 1; + dlarfb_((char *)"Left", (char *)"Transpose", (char *)"Forward", (char *)"Columnwise", &i__3, & + i__4, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & + ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, &work[ib + + 1], &ldwork, (ftnlen)4, (ftnlen)9, (ftnlen)7, ( + ftnlen)10); + } +/* L10: */ + } + } else { + i__ = 1; + } + +/* Use unblocked code to factor the last or only block. */ + + if (i__ <= k) { + i__2 = *m - i__ + 1; + i__1 = *n - i__ + 1; + dgeqr2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1] + , &iinfo); + } + + work[1] = (doublereal) iws; + return 0; + +/* End of DGEQRF */ + +} /* dgeqrf_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dger.cpp b/lib/linalg/dger.cpp new file mode 100644 index 0000000000..fd5c4940bf --- /dev/null +++ b/lib/linalg/dger.cpp @@ -0,0 +1,265 @@ +/* fortran/dger.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DGER */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGER(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION ALPHA */ +/* INTEGER INCX,INCY,LDA,M,N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A(LDA,*),X(*),Y(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGER performs the rank 1 operation */ +/* > */ +/* > A := alpha*x*y**T + A, */ +/* > */ +/* > where alpha is a scalar, x is an m element vector, y is an n element */ +/* > vector and A is an m by n matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > On entry, M specifies the number of rows of the matrix A. */ +/* > M must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the number of columns of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION. */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION array, dimension at least */ +/* > ( 1 + ( m - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array X must contain the m */ +/* > element vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Y */ +/* > \verbatim */ +/* > Y is DOUBLE PRECISION array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCY ) ). */ +/* > Before entry, the incremented array Y must contain the n */ +/* > element vector y. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > On entry, INCY specifies the increment for the elements of */ +/* > Y. INCY must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension ( LDA, N ) */ +/* > Before entry, the leading m by n part of the array A must */ +/* > contain the matrix of coefficients. On exit, A is */ +/* > overwritten by the updated matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. LDA must be at least */ +/* > max( 1, m ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dger_(integer *m, integer *n, doublereal *alpha, + doublereal *x, integer *incx, doublereal *y, integer *incy, + doublereal *a, integer *lda) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + + /* Local variables */ + integer i__, j, ix, jy, kx, info; + doublereal temp; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --x; + --y; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + info = 0; + if (*m < 0) { + info = 1; + } else if (*n < 0) { + info = 2; + } else if (*incx == 0) { + info = 5; + } else if (*incy == 0) { + info = 7; + } else if (*lda < max(1,*m)) { + info = 9; + } + if (info != 0) { + xerbla_((char *)"DGER ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || *alpha == 0.) { + return 0; + } + +/* Start the operations. In this version the elements of A are */ +/* accessed sequentially with one pass through A. */ + + if (*incy > 0) { + jy = 1; + } else { + jy = 1 - (*n - 1) * *incy; + } + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (y[jy] != 0.) { + temp = *alpha * y[jy]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] += x[i__] * temp; +/* L10: */ + } + } + jy += *incy; +/* L20: */ + } + } else { + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (*m - 1) * *incx; + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (y[jy] != 0.) { + temp = *alpha * y[jy]; + ix = kx; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] += x[ix] * temp; + ix += *incx; +/* L30: */ + } + } + jy += *incy; +/* L40: */ + } + } + + return 0; + +/* End of DGER */ + +} /* dger_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgesv.cpp b/lib/linalg/dgesv.cpp new file mode 100644 index 0000000000..a71b2caa68 --- /dev/null +++ b/lib/linalg/dgesv.cpp @@ -0,0 +1,217 @@ +/* fortran/dgesv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief DGESV computes the solution to system of linear equations A * X = B for GE matrices */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGESV + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, LDB, N, NRHS */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IPIV( * ) */ +/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGESV computes the solution to a real system of linear equations */ +/* > A * X = B, */ +/* > where A is an N-by-N matrix and X and B are N-by-NRHS matrices. */ +/* > */ +/* > The LU decomposition with partial pivoting and row interchanges is */ +/* > used to factor A as */ +/* > A = P * L * U, */ +/* > where P is a permutation matrix, L is unit lower triangular, and U is */ +/* > upper triangular. The factored form of A is then used to solve the */ +/* > system of equations A * X = B. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of linear equations, i.e., the order of the */ +/* > matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NRHS */ +/* > \verbatim */ +/* > NRHS is INTEGER */ +/* > The number of right hand sides, i.e., the number of columns */ +/* > of the matrix B. NRHS >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the N-by-N coefficient matrix A. */ +/* > On exit, the factors L and U from the factorization */ +/* > A = P*L*U; the unit diagonal elements of L are not stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IPIV */ +/* > \verbatim */ +/* > IPIV is INTEGER array, dimension (N) */ +/* > The pivot indices that define the permutation matrix P; */ +/* > row i of the matrix was interchanged with row IPIV(i). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ +/* > On entry, the N-by-NRHS matrix of right hand side matrix B. */ +/* > On exit, if INFO = 0, the N-by-NRHS solution matrix X. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, U(i,i) is exactly zero. The factorization */ +/* > has been completed, but the factor U is exactly */ +/* > singular, so the solution could not be computed. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEsolve */ + +/* ===================================================================== */ +/* Subroutine */ int dgesv_(integer *n, integer *nrhs, doublereal *a, integer + *lda, integer *ipiv, doublereal *b, integer *ldb, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + + /* Local variables */ + extern /* Subroutine */ int dgetrf_(integer *, integer *, doublereal *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen), dgetrs_(char *, integer *, integer *, doublereal *, + integer *, integer *, doublereal *, integer *, integer *, ftnlen); + + +/* -- LAPACK driver routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + *info = 0; + if (*n < 0) { + *info = -1; + } else if (*nrhs < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } else if (*ldb < max(1,*n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGESV ", &i__1, (ftnlen)6); + return 0; + } + +/* Compute the LU factorization of A. */ + + dgetrf_(n, n, &a[a_offset], lda, &ipiv[1], info); + if (*info == 0) { + +/* Solve the system A*X = B, overwriting B with X. */ + + dgetrs_((char *)"No transpose", n, nrhs, &a[a_offset], lda, &ipiv[1], &b[ + b_offset], ldb, info, (ftnlen)12); + } + return 0; + +/* End of DGESV */ + +} /* dgesv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgesvd.cpp b/lib/linalg/dgesvd.cpp new file mode 100644 index 0000000000..96fd8735b0 --- /dev/null +++ b/lib/linalg/dgesvd.cpp @@ -0,0 +1,4158 @@ +/* fortran/dgesvd.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__6 = 6; +static integer c__0 = 0; +static integer c__2 = 2; +static integer c_n1 = -1; +static doublereal c_b57 = 0.; +static integer c__1 = 1; +static doublereal c_b79 = 1.; + +/* > \brief DGESVD computes the singular value decomposition (SVD) for GE matrices */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGESVD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT, */ +/* WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER JOBU, JOBVT */ +/* INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), S( * ), U( LDU, * ), */ +/* $ VT( LDVT, * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGESVD computes the singular value decomposition (SVD) of a real */ +/* > M-by-N matrix A, optionally computing the left and/or right singular */ +/* > vectors. The SVD is written */ +/* > */ +/* > A = U * SIGMA * transpose(V) */ +/* > */ +/* > where SIGMA is an M-by-N matrix which is zero except for its */ +/* > min(m,n) diagonal elements, U is an M-by-M orthogonal matrix, and */ +/* > V is an N-by-N orthogonal matrix. The diagonal elements of SIGMA */ +/* > are the singular values of A; they are real and non-negative, and */ +/* > are returned in descending order. The first min(m,n) columns of */ +/* > U and V are the left and right singular vectors of A. */ +/* > */ +/* > Note that the routine returns V**T, not V. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] JOBU */ +/* > \verbatim */ +/* > JOBU is CHARACTER*1 */ +/* > Specifies options for computing all or part of the matrix U: */ +/* > = 'A': all M columns of U are returned in array U: */ +/* > = 'S': the first min(m,n) columns of U (the left singular */ +/* > vectors) are returned in the array U; */ +/* > = 'O': the first min(m,n) columns of U (the left singular */ +/* > vectors) are overwritten on the array A; */ +/* > = 'N': no columns of U (no left singular vectors) are */ +/* > computed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] JOBVT */ +/* > \verbatim */ +/* > JOBVT is CHARACTER*1 */ +/* > Specifies options for computing all or part of the matrix */ +/* > V**T: */ +/* > = 'A': all N rows of V**T are returned in the array VT; */ +/* > = 'S': the first min(m,n) rows of V**T (the right singular */ +/* > vectors) are returned in the array VT; */ +/* > = 'O': the first min(m,n) rows of V**T (the right singular */ +/* > vectors) are overwritten on the array A; */ +/* > = 'N': no rows of V**T (no right singular vectors) are */ +/* > computed. */ +/* > */ +/* > JOBVT and JOBU cannot both be 'O'. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the input matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the input matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the M-by-N matrix A. */ +/* > On exit, */ +/* > if JOBU = 'O', A is overwritten with the first min(m,n) */ +/* > columns of U (the left singular vectors, */ +/* > stored columnwise); */ +/* > if JOBVT = 'O', A is overwritten with the first min(m,n) */ +/* > rows of V**T (the right singular vectors, */ +/* > stored rowwise); */ +/* > if JOBU .ne. 'O' and JOBVT .ne. 'O', the contents of A */ +/* > are destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION array, dimension (min(M,N)) */ +/* > The singular values of A, sorted so that S(i) >= S(i+1). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] U */ +/* > \verbatim */ +/* > U is DOUBLE PRECISION array, dimension (LDU,UCOL) */ +/* > (LDU,M) if JOBU = 'A' or (LDU,min(M,N)) if JOBU = 'S'. */ +/* > If JOBU = 'A', U contains the M-by-M orthogonal matrix U; */ +/* > if JOBU = 'S', U contains the first min(m,n) columns of U */ +/* > (the left singular vectors, stored columnwise); */ +/* > if JOBU = 'N' or 'O', U is not referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDU */ +/* > \verbatim */ +/* > LDU is INTEGER */ +/* > The leading dimension of the array U. LDU >= 1; if */ +/* > JOBU = 'S' or 'A', LDU >= M. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] VT */ +/* > \verbatim */ +/* > VT is DOUBLE PRECISION array, dimension (LDVT,N) */ +/* > If JOBVT = 'A', VT contains the N-by-N orthogonal matrix */ +/* > V**T; */ +/* > if JOBVT = 'S', VT contains the first min(m,n) rows of */ +/* > V**T (the right singular vectors, stored rowwise); */ +/* > if JOBVT = 'N' or 'O', VT is not referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDVT */ +/* > \verbatim */ +/* > LDVT is INTEGER */ +/* > The leading dimension of the array VT. LDVT >= 1; if */ +/* > JOBVT = 'A', LDVT >= N; if JOBVT = 'S', LDVT >= min(M,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK; */ +/* > if INFO > 0, WORK(2:MIN(M,N)) contains the unconverged */ +/* > superdiagonal elements of an upper bidiagonal matrix B */ +/* > whose diagonal is in S (not necessarily sorted). B */ +/* > satisfies A = U * B * VT, so it has the same singular values */ +/* > as A, and singular vectors related by U and VT. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > LWORK >= MAX(1,5*MIN(M,N)) for the paths (see comments inside code): */ +/* > - PATH 1 (M much larger than N, JOBU='N') */ +/* > - PATH 1t (N much larger than M, JOBVT='N') */ +/* > LWORK >= MAX(1,3*MIN(M,N) + MAX(M,N),5*MIN(M,N)) for the other paths */ +/* > For good performance, LWORK should generally be larger. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: if DBDSQR did not converge, INFO specifies how many */ +/* > superdiagonals of an intermediate bidiagonal form B */ +/* > did not converge to zero. See the description of WORK */ +/* > above for details. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEsing */ + +/* ===================================================================== */ +/* Subroutine */ int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, + doublereal *a, integer *lda, doublereal *s, doublereal *u, integer * + ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, + integer *info, ftnlen jobu_len, ftnlen jobvt_len) +{ + /* System generated locals */ + address a__1[2]; + integer a_dim1, a_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1[2], + i__2, i__3, i__4; + char ch__1[2]; + + /* Builtin functions */ + /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + double sqrt(doublereal); + + /* Local variables */ + integer i__, ie, ir, iu, blk, ncu; + doublereal dum[1], eps; + integer nru, iscl; + doublereal anrm; + integer ierr, itau, ncvt, nrvt, lwork_dgebrd__, lwork_dgelqf__, + lwork_dgeqrf__; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer chunk, minmn, wrkbl, itaup, itauq, mnthr, iwork; + logical wntua, wntva, wntun, wntuo, wntvn, wntvo, wntus, wntvs; + extern /* Subroutine */ int dgebrd_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *, integer *); + extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, ftnlen); + integer bdspac; + extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, + integer *, integer *, doublereal *, integer *, integer *, ftnlen), + dgeqrf_(integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *), dlacpy_(char *, + integer *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen), dlaset_(char *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, ftnlen), + dbdsqr_(char *, integer *, integer *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), dorgbr_(char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + integer *, ftnlen); + doublereal bignum; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *, + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen, ftnlen), dorglq_(integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + integer *), dorgqr_(integer *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *); + integer ldwrkr, minwrk, ldwrku, maxwrk; + doublereal smlnum; + logical lquery, wntuas, wntvas; + integer lwork_dorgbr_p__, lwork_dorgbr_q__, lwork_dorglq_m__, + lwork_dorglq_n__, lwork_dorgqr_m__, lwork_dorgqr_n__; + + +/* -- LAPACK driver routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Local Arrays .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --s; + u_dim1 = *ldu; + u_offset = 1 + u_dim1; + u -= u_offset; + vt_dim1 = *ldvt; + vt_offset = 1 + vt_dim1; + vt -= vt_offset; + --work; + + /* Function Body */ + *info = 0; + minmn = min(*m,*n); + wntua = lsame_(jobu, (char *)"A", (ftnlen)1, (ftnlen)1); + wntus = lsame_(jobu, (char *)"S", (ftnlen)1, (ftnlen)1); + wntuas = wntua || wntus; + wntuo = lsame_(jobu, (char *)"O", (ftnlen)1, (ftnlen)1); + wntun = lsame_(jobu, (char *)"N", (ftnlen)1, (ftnlen)1); + wntva = lsame_(jobvt, (char *)"A", (ftnlen)1, (ftnlen)1); + wntvs = lsame_(jobvt, (char *)"S", (ftnlen)1, (ftnlen)1); + wntvas = wntva || wntvs; + wntvo = lsame_(jobvt, (char *)"O", (ftnlen)1, (ftnlen)1); + wntvn = lsame_(jobvt, (char *)"N", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + + if (! (wntua || wntus || wntuo || wntun)) { + *info = -1; + } else if (! (wntva || wntvs || wntvo || wntvn) || wntvo && wntuo) { + *info = -2; + } else if (*m < 0) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*lda < max(1,*m)) { + *info = -6; + } else if (*ldu < 1 || wntuas && *ldu < *m) { + *info = -9; + } else if (*ldvt < 1 || wntva && *ldvt < *n || wntvs && *ldvt < minmn) { + *info = -11; + } + +/* Compute workspace */ +/* (Note: Comments in the code beginning (char *)"Workspace:" describe the */ +/* minimal amount of workspace needed at that point in the code, */ +/* as well as the preferred amount for good performance. */ +/* NB refers to the optimal block size for the immediately */ +/* following subroutine, as returned by ILAENV.) */ + + if (*info == 0) { + minwrk = 1; + maxwrk = 1; + if (*m >= *n && minmn > 0) { + +/* Compute space needed for DBDSQR */ + +/* Writing concatenation */ + i__1[0] = 1, a__1[0] = jobu; + i__1[1] = 1, a__1[1] = jobvt; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + mnthr = ilaenv_(&c__6, (char *)"DGESVD", ch__1, m, n, &c__0, &c__0, ( + ftnlen)6, (ftnlen)2); + bdspac = *n * 5; +/* Compute space needed for DGEQRF */ + dgeqrf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); + lwork_dgeqrf__ = (integer) dum[0]; +/* Compute space needed for DORGQR */ + dorgqr_(m, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); + lwork_dorgqr_n__ = (integer) dum[0]; + dorgqr_(m, m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); + lwork_dorgqr_m__ = (integer) dum[0]; +/* Compute space needed for DGEBRD */ + dgebrd_(n, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, + &ierr); + lwork_dgebrd__ = (integer) dum[0]; +/* Compute space needed for DORGBR P */ + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr, ( + ftnlen)1); + lwork_dorgbr_p__ = (integer) dum[0]; +/* Compute space needed for DORGBR Q */ + dorgbr_((char *)"Q", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr, ( + ftnlen)1); + lwork_dorgbr_q__ = (integer) dum[0]; + + if (*m >= mnthr) { + if (wntun) { + +/* Path 1 (M much larger than N, JOBU='N') */ + + maxwrk = *n + lwork_dgeqrf__; +/* Computing MAX */ + i__2 = maxwrk, i__3 = *n * 3 + lwork_dgebrd__; + maxwrk = max(i__2,i__3); + if (wntvo || wntvas) { +/* Computing MAX */ + i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_p__; + maxwrk = max(i__2,i__3); + } + maxwrk = max(maxwrk,bdspac); +/* Computing MAX */ + i__2 = *n << 2; + minwrk = max(i__2,bdspac); + } else if (wntuo && wntvn) { + +/* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */ + + wrkbl = *n + lwork_dgeqrf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); +/* Computing MAX */ + i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n; + maxwrk = max(i__2,i__3); +/* Computing MAX */ + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntuo && wntvas) { + +/* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or */ +/* 'A') */ + + wrkbl = *n + lwork_dgeqrf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); +/* Computing MAX */ + i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n; + maxwrk = max(i__2,i__3); +/* Computing MAX */ + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntus && wntvn) { + +/* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */ + + wrkbl = *n + lwork_dgeqrf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *n * *n + wrkbl; +/* Computing MAX */ + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntus && wntvo) { + +/* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */ + + wrkbl = *n + lwork_dgeqrf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = (*n << 1) * *n + wrkbl; +/* Computing MAX */ + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntus && wntvas) { + +/* Path 6 (M much larger than N, JOBU='S', JOBVT='S' or */ +/* 'A') */ + + wrkbl = *n + lwork_dgeqrf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *n * *n + wrkbl; +/* Computing MAX */ + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntua && wntvn) { + +/* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */ + + wrkbl = *n + lwork_dgeqrf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *n * *n + wrkbl; +/* Computing MAX */ + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntua && wntvo) { + +/* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */ + + wrkbl = *n + lwork_dgeqrf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = (*n << 1) * *n + wrkbl; +/* Computing MAX */ + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntua && wntvas) { + +/* Path 9 (M much larger than N, JOBU='A', JOBVT='S' or */ +/* 'A') */ + + wrkbl = *n + lwork_dgeqrf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *n * *n + wrkbl; +/* Computing MAX */ + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } + } else { + +/* Path 10 (M at least N, but not much larger) */ + + dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, & + c_n1, &ierr); + lwork_dgebrd__ = (integer) dum[0]; + maxwrk = *n * 3 + lwork_dgebrd__; + if (wntus || wntuo) { + dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, dum, dum, &c_n1, + &ierr, (ftnlen)1); + lwork_dorgbr_q__ = (integer) dum[0]; +/* Computing MAX */ + i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_q__; + maxwrk = max(i__2,i__3); + } + if (wntua) { + dorgbr_((char *)"Q", m, m, n, &a[a_offset], lda, dum, dum, &c_n1, + &ierr, (ftnlen)1); + lwork_dorgbr_q__ = (integer) dum[0]; +/* Computing MAX */ + i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_q__; + maxwrk = max(i__2,i__3); + } + if (! wntvn) { +/* Computing MAX */ + i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_p__; + maxwrk = max(i__2,i__3); + } + maxwrk = max(maxwrk,bdspac); +/* Computing MAX */ + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } + } else if (minmn > 0) { + +/* Compute space needed for DBDSQR */ + +/* Writing concatenation */ + i__1[0] = 1, a__1[0] = jobu; + i__1[1] = 1, a__1[1] = jobvt; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + mnthr = ilaenv_(&c__6, (char *)"DGESVD", ch__1, m, n, &c__0, &c__0, ( + ftnlen)6, (ftnlen)2); + bdspac = *m * 5; +/* Compute space needed for DGELQF */ + dgelqf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); + lwork_dgelqf__ = (integer) dum[0]; +/* Compute space needed for DORGLQ */ + dorglq_(n, n, m, dum, n, dum, dum, &c_n1, &ierr); + lwork_dorglq_n__ = (integer) dum[0]; + dorglq_(m, n, m, &a[a_offset], lda, dum, dum, &c_n1, &ierr); + lwork_dorglq_m__ = (integer) dum[0]; +/* Compute space needed for DGEBRD */ + dgebrd_(m, m, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, + &ierr); + lwork_dgebrd__ = (integer) dum[0]; +/* Compute space needed for DORGBR P */ + dorgbr_((char *)"P", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, ( + ftnlen)1); + lwork_dorgbr_p__ = (integer) dum[0]; +/* Compute space needed for DORGBR Q */ + dorgbr_((char *)"Q", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, ( + ftnlen)1); + lwork_dorgbr_q__ = (integer) dum[0]; + if (*n >= mnthr) { + if (wntvn) { + +/* Path 1t(N much larger than M, JOBVT='N') */ + + maxwrk = *m + lwork_dgelqf__; +/* Computing MAX */ + i__2 = maxwrk, i__3 = *m * 3 + lwork_dgebrd__; + maxwrk = max(i__2,i__3); + if (wntuo || wntuas) { +/* Computing MAX */ + i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_q__; + maxwrk = max(i__2,i__3); + } + maxwrk = max(maxwrk,bdspac); +/* Computing MAX */ + i__2 = *m << 2; + minwrk = max(i__2,bdspac); + } else if (wntvo && wntun) { + +/* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */ + + wrkbl = *m + lwork_dgelqf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); +/* Computing MAX */ + i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m; + maxwrk = max(i__2,i__3); +/* Computing MAX */ + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntvo && wntuas) { + +/* Path 3t(N much larger than M, JOBU='S' or 'A', */ +/* JOBVT='O') */ + + wrkbl = *m + lwork_dgelqf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); +/* Computing MAX */ + i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m; + maxwrk = max(i__2,i__3); +/* Computing MAX */ + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntvs && wntun) { + +/* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */ + + wrkbl = *m + lwork_dgelqf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *m * *m + wrkbl; +/* Computing MAX */ + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntvs && wntuo) { + +/* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */ + + wrkbl = *m + lwork_dgelqf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = (*m << 1) * *m + wrkbl; +/* Computing MAX */ + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntvs && wntuas) { + +/* Path 6t(N much larger than M, JOBU='S' or 'A', */ +/* JOBVT='S') */ + + wrkbl = *m + lwork_dgelqf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *m * *m + wrkbl; +/* Computing MAX */ + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntva && wntun) { + +/* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */ + + wrkbl = *m + lwork_dgelqf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *m * *m + wrkbl; +/* Computing MAX */ + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntva && wntuo) { + +/* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */ + + wrkbl = *m + lwork_dgelqf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = (*m << 1) * *m + wrkbl; +/* Computing MAX */ + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntva && wntuas) { + +/* Path 9t(N much larger than M, JOBU='S' or 'A', */ +/* JOBVT='A') */ + + wrkbl = *m + lwork_dgelqf__; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); +/* Computing MAX */ + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *m * *m + wrkbl; +/* Computing MAX */ + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } + } else { + +/* Path 10t(N greater than M, but not much larger) */ + + dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, & + c_n1, &ierr); + lwork_dgebrd__ = (integer) dum[0]; + maxwrk = *m * 3 + lwork_dgebrd__; + if (wntvs || wntvo) { +/* Compute space needed for DORGBR P */ + dorgbr_((char *)"P", m, n, m, &a[a_offset], n, dum, dum, &c_n1, & + ierr, (ftnlen)1); + lwork_dorgbr_p__ = (integer) dum[0]; +/* Computing MAX */ + i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_p__; + maxwrk = max(i__2,i__3); + } + if (wntva) { + dorgbr_((char *)"P", n, n, m, &a[a_offset], n, dum, dum, &c_n1, & + ierr, (ftnlen)1); + lwork_dorgbr_p__ = (integer) dum[0]; +/* Computing MAX */ + i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_p__; + maxwrk = max(i__2,i__3); + } + if (! wntun) { +/* Computing MAX */ + i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_q__; + maxwrk = max(i__2,i__3); + } + maxwrk = max(maxwrk,bdspac); +/* Computing MAX */ + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } + } + maxwrk = max(maxwrk,minwrk); + work[1] = (doublereal) maxwrk; + + if (*lwork < minwrk && ! lquery) { + *info = -13; + } + } + + if (*info != 0) { + i__2 = -(*info); + xerbla_((char *)"DGESVD", &i__2, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0) { + return 0; + } + +/* Get machine constants */ + + eps = dlamch_((char *)"P", (ftnlen)1); + smlnum = sqrt(dlamch_((char *)"S", (ftnlen)1)) / eps; + bignum = 1. / smlnum; + +/* Scale A if max element outside range [SMLNUM,BIGNUM] */ + + anrm = dlange_((char *)"M", m, n, &a[a_offset], lda, dum, (ftnlen)1); + iscl = 0; + if (anrm > 0. && anrm < smlnum) { + iscl = 1; + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, & + ierr, (ftnlen)1); + } else if (anrm > bignum) { + iscl = 1; + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, & + ierr, (ftnlen)1); + } + + if (*m >= *n) { + +/* A has at least as many rows as columns. If A has sufficiently */ +/* more rows than columns, first reduce using the QR */ +/* decomposition (if sufficient workspace available) */ + + if (*m >= mnthr) { + + if (wntun) { + +/* Path 1 (M much larger than N, JOBU='N') */ +/* No left singular vectors to be computed */ + + itau = 1; + iwork = itau + *n; + +/* Compute A=Q*R */ +/* (Workspace: need 2*N, prefer N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], & + i__2, &ierr); + +/* Zero out below R */ + + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[a_dim1 + 2], + lda, (ftnlen)1); + } + ie = 1; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in A */ +/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__2, &ierr); + ncvt = 0; + if (wntvo || wntvas) { + +/* If right singular vectors desired, generate P'. */ +/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], & + work[iwork], &i__2, &ierr, (ftnlen)1); + ncvt = *n; + } + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing right */ +/* singular vectors of A in A if desired */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, &ncvt, &c__0, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, dum, &c__1, dum, &c__1, &work[iwork], + info, (ftnlen)1); + +/* If right singular vectors desired in VT, copy them there */ + + if (wntvas) { + dlacpy_((char *)"F", n, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + } + + } else if (wntuo && wntvn) { + +/* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */ +/* N left singular vectors to be overwritten on A and */ +/* no right singular vectors to be computed */ + +/* Computing MAX */ + i__2 = *n << 2; + if (*lwork >= *n * *n + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + ir = 1; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *lda * *n + *n; + if (*lwork >= max(i__2,i__3) + *lda * *n) { + +/* WORK(IU) is LDA by N, WORK(IR) is LDA by N */ + + ldwrku = *lda; + ldwrkr = *lda; + } else /* if(complicated condition) */ { +/* Computing MAX */ + i__2 = wrkbl, i__3 = *lda * *n + *n; + if (*lwork >= max(i__2,i__3) + *n * *n) { + +/* WORK(IU) is LDA by N, WORK(IR) is N by N */ + + ldwrku = *lda; + ldwrkr = *n; + } else { + +/* WORK(IU) is LDWRKU by N, WORK(IR) is N by N */ + + ldwrku = (*lwork - *n * *n - *n) / *n; + ldwrkr = *n; + } + } + itau = ir + ldwrkr * *n; + iwork = itau + *n; + +/* Compute A=Q*R */ +/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] + , &i__2, &ierr); + +/* Copy R to WORK(IR) and zero out below it */ + + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr, + (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + 1], + &ldwrkr, (ftnlen)1); + +/* Generate Q in A */ +/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in WORK(IR) */ +/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__2, &ierr); + +/* Generate left vectors bidiagonalizing R */ +/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], & + work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of R in WORK(IR) */ +/* (Workspace: need N*N + BDSPAC) */ + + dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, & + c__1, &work[ir], &ldwrkr, dum, &c__1, &work[iwork] + , info, (ftnlen)1); + iu = ie + *n; + +/* Multiply Q in A by left singular vectors of R in */ +/* WORK(IR), storing result in WORK(IU) and copying to A */ +/* (Workspace: need N*N + 2*N, prefer N*N + M*N + N) */ + + i__2 = *m; + i__3 = ldwrku; + for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += + i__3) { +/* Computing MIN */ + i__4 = *m - i__ + 1; + chunk = min(i__4,ldwrku); + dgemm_((char *)"N", (char *)"N", &chunk, n, n, &c_b79, &a[i__ + + a_dim1], lda, &work[ir], &ldwrkr, &c_b57, & + work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", &chunk, n, &work[iu], &ldwrku, &a[i__ + + a_dim1], lda, (ftnlen)1); +/* L10: */ + } + + } else { + +/* Insufficient workspace for a fast algorithm */ + + ie = 1; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize A */ +/* (Workspace: need 3*N + M, prefer 3*N + (M + N)*NB) */ + + i__3 = *lwork - iwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__3, &ierr); + +/* Generate left vectors bidiagonalizing A */ +/* (Workspace: need 4*N, prefer 3*N + N*NB) */ + + i__3 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, &work[itauq], & + work[iwork], &i__3, &ierr, (ftnlen)1); + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of A in A */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, & + c__1, &a[a_offset], lda, dum, &c__1, &work[iwork], + info, (ftnlen)1); + + } + + } else if (wntuo && wntvas) { + +/* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A') */ +/* N left singular vectors to be overwritten on A and */ +/* N right singular vectors to be computed in VT */ + +/* Computing MAX */ + i__3 = *n << 2; + if (*lwork >= *n * *n + max(i__3,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + ir = 1; +/* Computing MAX */ + i__3 = wrkbl, i__2 = *lda * *n + *n; + if (*lwork >= max(i__3,i__2) + *lda * *n) { + +/* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ + + ldwrku = *lda; + ldwrkr = *lda; + } else /* if(complicated condition) */ { +/* Computing MAX */ + i__3 = wrkbl, i__2 = *lda * *n + *n; + if (*lwork >= max(i__3,i__2) + *n * *n) { + +/* WORK(IU) is LDA by N and WORK(IR) is N by N */ + + ldwrku = *lda; + ldwrkr = *n; + } else { + +/* WORK(IU) is LDWRKU by N and WORK(IR) is N by N */ + + ldwrku = (*lwork - *n * *n - *n) / *n; + ldwrkr = *n; + } + } + itau = ir + ldwrkr * *n; + iwork = itau + *n; + +/* Compute A=Q*R */ +/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ + + i__3 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] + , &i__3, &ierr); + +/* Copy R to VT, zeroing out below it */ + + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + if (*n > 1) { + i__3 = *n - 1; + i__2 = *n - 1; + dlaset_((char *)"L", &i__3, &i__2, &c_b57, &c_b57, &vt[ + vt_dim1 + 2], ldvt, (ftnlen)1); + } + +/* Generate Q in A */ +/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ + + i__3 = *lwork - iwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__3, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in VT, copying result to WORK(IR) */ +/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ + + i__3 = *lwork - iwork + 1; + dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], &i__3, & + ierr); + dlacpy_((char *)"L", n, n, &vt[vt_offset], ldvt, &work[ir], & + ldwrkr, (ftnlen)1); + +/* Generate left vectors bidiagonalizing R in WORK(IR) */ +/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ + + i__3 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], & + work[iwork], &i__3, &ierr, (ftnlen)1); + +/* Generate right vectors bidiagonalizing R in VT */ +/* (Workspace: need N*N + 4*N-1, prefer N*N + 3*N + (N-1)*NB) */ + + i__3 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], + &work[iwork], &i__3, &ierr, (ftnlen)1); + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of R in WORK(IR) and computing right */ +/* singular vectors of R in VT */ +/* (Workspace: need N*N + BDSPAC) */ + + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &work[ir], &ldwrkr, dum, &c__1, + &work[iwork], info, (ftnlen)1); + iu = ie + *n; + +/* Multiply Q in A by left singular vectors of R in */ +/* WORK(IR), storing result in WORK(IU) and copying to A */ +/* (Workspace: need N*N + 2*N, prefer N*N + M*N + N) */ + + i__3 = *m; + i__2 = ldwrku; + for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += + i__2) { +/* Computing MIN */ + i__4 = *m - i__ + 1; + chunk = min(i__4,ldwrku); + dgemm_((char *)"N", (char *)"N", &chunk, n, n, &c_b79, &a[i__ + + a_dim1], lda, &work[ir], &ldwrkr, &c_b57, & + work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", &chunk, n, &work[iu], &ldwrku, &a[i__ + + a_dim1], lda, (ftnlen)1); +/* L20: */ + } + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *n; + +/* Compute A=Q*R */ +/* (Workspace: need 2*N, prefer N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] + , &i__2, &ierr); + +/* Copy R to VT, zeroing out below it */ + + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[ + vt_dim1 + 2], ldvt, (ftnlen)1); + } + +/* Generate Q in A */ +/* (Workspace: need 2*N, prefer N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in VT */ +/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], &i__2, & + ierr); + +/* Multiply Q in A by left vectors bidiagonalizing R */ +/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, & + work[itauq], &a[a_offset], lda, &work[iwork], & + i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + +/* Generate right vectors bidiagonalizing R in VT */ +/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of A in A and computing right */ +/* singular vectors of A in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & + work[iwork], info, (ftnlen)1); + + } + + } else if (wntus) { + + if (wntvn) { + +/* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */ +/* N left singular vectors to be computed in U and */ +/* no right singular vectors to be computed */ + +/* Computing MAX */ + i__2 = *n << 2; + if (*lwork >= *n * *n + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + ir = 1; + if (*lwork >= wrkbl + *lda * *n) { + +/* WORK(IR) is LDA by N */ + + ldwrkr = *lda; + } else { + +/* WORK(IR) is N by N */ + + ldwrkr = *n; + } + itau = ir + ldwrkr * *n; + iwork = itau + *n; + +/* Compute A=Q*R */ +/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + +/* Copy R to WORK(IR), zeroing out below it */ + + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], & + ldwrkr, (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + + 1], &ldwrkr, (ftnlen)1); + +/* Generate Q in A */ +/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in WORK(IR) */ +/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Generate left vectors bidiagonalizing R in WORK(IR) */ +/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of R in WORK(IR) */ +/* (Workspace: need N*N + BDSPAC) */ + + dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], + dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, & + work[iwork], info, (ftnlen)1); + +/* Multiply Q in A by left singular vectors of R in */ +/* WORK(IR), storing result in U */ +/* (Workspace: need N*N) */ + + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, & + work[ir], &ldwrkr, &c_b57, &u[u_offset], ldu, + (ftnlen)1, (ftnlen)1); + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *n; + +/* Compute A=Q*R, copying result to U */ +/* (Workspace: need 2*N, prefer N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + +/* Generate Q in U */ +/* (Workspace: need 2*N, prefer N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Zero out below R in A */ + + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ + a_dim1 + 2], lda, (ftnlen)1); + } + +/* Bidiagonalize R in A */ +/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Multiply Q in U by left vectors bidiagonalizing R */ +/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & + work[itauq], &u[u_offset], ldu, &work[iwork], + &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) + ; + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of A in U */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], + dum, &c__1, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); + + } + + } else if (wntvo) { + +/* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */ +/* N left singular vectors to be computed in U and */ +/* N right singular vectors to be overwritten on A */ + +/* Computing MAX */ + i__2 = *n << 2; + if (*lwork >= (*n << 1) * *n + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + iu = 1; + if (*lwork >= wrkbl + (*lda << 1) * *n) { + +/* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ + + ldwrku = *lda; + ir = iu + ldwrku * *n; + ldwrkr = *lda; + } else if (*lwork >= wrkbl + (*lda + *n) * *n) { + +/* WORK(IU) is LDA by N and WORK(IR) is N by N */ + + ldwrku = *lda; + ir = iu + ldwrku * *n; + ldwrkr = *n; + } else { + +/* WORK(IU) is N by N and WORK(IR) is N by N */ + + ldwrku = *n; + ir = iu + ldwrku * *n; + ldwrkr = *n; + } + itau = ir + ldwrkr * *n; + iwork = itau + *n; + +/* Compute A=Q*R */ +/* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + +/* Copy R to WORK(IU), zeroing out below it */ + + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + 1], &ldwrku, (ftnlen)1); + +/* Generate Q in A */ +/* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in WORK(IU), copying result to */ +/* WORK(IR) */ +/* (Workspace: need 2*N*N + 4*N, */ +/* prefer 2*N*N+3*N+2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &work[ir], & + ldwrkr, (ftnlen)1); + +/* Generate left bidiagonalizing vectors in WORK(IU) */ +/* (Workspace: need 2*N*N + 4*N, prefer 2*N*N + 3*N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + +/* Generate right bidiagonalizing vectors in WORK(IR) */ +/* (Workspace: need 2*N*N + 4*N-1, */ +/* prefer 2*N*N+3*N+(N-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &work[ir], &ldwrkr, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of R in WORK(IU) and computing */ +/* right singular vectors of R in WORK(IR) */ +/* (Workspace: need 2*N*N + BDSPAC) */ + + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &work[ + ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1, + &work[iwork], info, (ftnlen)1); + +/* Multiply Q in A by left singular vectors of R in */ +/* WORK(IU), storing result in U */ +/* (Workspace: need N*N) */ + + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, & + work[iu], &ldwrku, &c_b57, &u[u_offset], ldu, + (ftnlen)1, (ftnlen)1); + +/* Copy right singular vectors of R to A */ +/* (Workspace: need N*N) */ + + dlacpy_((char *)"F", n, n, &work[ir], &ldwrkr, &a[a_offset], + lda, (ftnlen)1); + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *n; + +/* Compute A=Q*R, copying result to U */ +/* (Workspace: need 2*N, prefer N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + +/* Generate Q in U */ +/* (Workspace: need 2*N, prefer N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Zero out below R in A */ + + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ + a_dim1 + 2], lda, (ftnlen)1); + } + +/* Bidiagonalize R in A */ +/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Multiply Q in U by left vectors bidiagonalizing R */ +/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & + work[itauq], &u[u_offset], ldu, &work[iwork], + &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) + ; + +/* Generate right vectors bidiagonalizing R in A */ +/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of A in U and computing right */ +/* singular vectors of A in A */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, &u[u_offset], ldu, dum, &c__1, + &work[iwork], info, (ftnlen)1); + + } + + } else if (wntvas) { + +/* Path 6 (M much larger than N, JOBU='S', JOBVT='S' */ +/* or 'A') */ +/* N left singular vectors to be computed in U and */ +/* N right singular vectors to be computed in VT */ + +/* Computing MAX */ + i__2 = *n << 2; + if (*lwork >= *n * *n + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + iu = 1; + if (*lwork >= wrkbl + *lda * *n) { + +/* WORK(IU) is LDA by N */ + + ldwrku = *lda; + } else { + +/* WORK(IU) is N by N */ + + ldwrku = *n; + } + itau = iu + ldwrku * *n; + iwork = itau + *n; + +/* Compute A=Q*R */ +/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + +/* Copy R to WORK(IU), zeroing out below it */ + + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + 1], &ldwrku, (ftnlen)1); + +/* Generate Q in A */ +/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in WORK(IU), copying result to VT */ +/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &vt[vt_offset], + ldvt, (ftnlen)1); + +/* Generate left bidiagonalizing vectors in WORK(IU) */ +/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + +/* Generate right bidiagonalizing vectors in VT */ +/* (Workspace: need N*N + 4*N-1, */ +/* prefer N*N+3*N+(N-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ + itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) + ; + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of R in WORK(IU) and computing */ +/* right singular vectors of R in VT */ +/* (Workspace: need N*N + BDSPAC) */ + + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &work[iu], &ldwrku, dum, & + c__1, &work[iwork], info, (ftnlen)1); + +/* Multiply Q in A by left singular vectors of R in */ +/* WORK(IU), storing result in U */ +/* (Workspace: need N*N) */ + + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, & + work[iu], &ldwrku, &c_b57, &u[u_offset], ldu, + (ftnlen)1, (ftnlen)1); + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *n; + +/* Compute A=Q*R, copying result to U */ +/* (Workspace: need 2*N, prefer N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + +/* Generate Q in U */ +/* (Workspace: need 2*N, prefer N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + +/* Copy R to VT, zeroing out below it */ + + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[ + vt_dim1 + 2], ldvt, (ftnlen)1); + } + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in VT */ +/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], + &work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Multiply Q in U by left bidiagonalizing vectors */ +/* in VT */ +/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, + &work[itauq], &u[u_offset], ldu, &work[iwork], + &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen) + 1); + +/* Generate right bidiagonalizing vectors in VT */ +/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ + itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) + ; + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of A in U and computing right */ +/* singular vectors of A in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &u[u_offset], ldu, dum, & + c__1, &work[iwork], info, (ftnlen)1); + + } + + } + + } else if (wntua) { + + if (wntvn) { + +/* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */ +/* M left singular vectors to be computed in U and */ +/* no right singular vectors to be computed */ + +/* Computing MAX */ + i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); + if (*lwork >= *n * *n + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + ir = 1; + if (*lwork >= wrkbl + *lda * *n) { + +/* WORK(IR) is LDA by N */ + + ldwrkr = *lda; + } else { + +/* WORK(IR) is N by N */ + + ldwrkr = *n; + } + itau = ir + ldwrkr * *n; + iwork = itau + *n; + +/* Compute A=Q*R, copying result to U */ +/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + +/* Copy R to WORK(IR), zeroing out below it */ + + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], & + ldwrkr, (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + + 1], &ldwrkr, (ftnlen)1); + +/* Generate Q in U */ +/* (Workspace: need N*N + N + M, prefer N*N + N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in WORK(IR) */ +/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Generate left bidiagonalizing vectors in WORK(IR) */ +/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of R in WORK(IR) */ +/* (Workspace: need N*N + BDSPAC) */ + + dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], + dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, & + work[iwork], info, (ftnlen)1); + +/* Multiply Q in U by left singular vectors of R in */ +/* WORK(IR), storing result in A */ +/* (Workspace: need N*N) */ + + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, & + work[ir], &ldwrkr, &c_b57, &a[a_offset], lda, + (ftnlen)1, (ftnlen)1); + +/* Copy left singular vectors of A from A to U */ + + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *n; + +/* Compute A=Q*R, copying result to U */ +/* (Workspace: need 2*N, prefer N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + +/* Generate Q in U */ +/* (Workspace: need N + M, prefer N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Zero out below R in A */ + + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ + a_dim1 + 2], lda, (ftnlen)1); + } + +/* Bidiagonalize R in A */ +/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Multiply Q in U by left bidiagonalizing vectors */ +/* in A */ +/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & + work[itauq], &u[u_offset], ldu, &work[iwork], + &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) + ; + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of A in U */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], + dum, &c__1, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); + + } + + } else if (wntvo) { + +/* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */ +/* M left singular vectors to be computed in U and */ +/* N right singular vectors to be overwritten on A */ + +/* Computing MAX */ + i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); + if (*lwork >= (*n << 1) * *n + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + iu = 1; + if (*lwork >= wrkbl + (*lda << 1) * *n) { + +/* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ + + ldwrku = *lda; + ir = iu + ldwrku * *n; + ldwrkr = *lda; + } else if (*lwork >= wrkbl + (*lda + *n) * *n) { + +/* WORK(IU) is LDA by N and WORK(IR) is N by N */ + + ldwrku = *lda; + ir = iu + ldwrku * *n; + ldwrkr = *n; + } else { + +/* WORK(IU) is N by N and WORK(IR) is N by N */ + + ldwrku = *n; + ir = iu + ldwrku * *n; + ldwrkr = *n; + } + itau = ir + ldwrkr * *n; + iwork = itau + *n; + +/* Compute A=Q*R, copying result to U */ +/* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + +/* Generate Q in U */ +/* (Workspace: need 2*N*N + N + M, prefer 2*N*N + N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + +/* Copy R to WORK(IU), zeroing out below it */ + + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + 1], &ldwrku, (ftnlen)1); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in WORK(IU), copying result to */ +/* WORK(IR) */ +/* (Workspace: need 2*N*N + 4*N, */ +/* prefer 2*N*N+3*N+2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &work[ir], & + ldwrkr, (ftnlen)1); + +/* Generate left bidiagonalizing vectors in WORK(IU) */ +/* (Workspace: need 2*N*N + 4*N, prefer 2*N*N + 3*N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + +/* Generate right bidiagonalizing vectors in WORK(IR) */ +/* (Workspace: need 2*N*N + 4*N-1, */ +/* prefer 2*N*N+3*N+(N-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &work[ir], &ldwrkr, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of R in WORK(IU) and computing */ +/* right singular vectors of R in WORK(IR) */ +/* (Workspace: need 2*N*N + BDSPAC) */ + + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &work[ + ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1, + &work[iwork], info, (ftnlen)1); + +/* Multiply Q in U by left singular vectors of R in */ +/* WORK(IU), storing result in A */ +/* (Workspace: need N*N) */ + + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, & + work[iu], &ldwrku, &c_b57, &a[a_offset], lda, + (ftnlen)1, (ftnlen)1); + +/* Copy left singular vectors of A from A to U */ + + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + +/* Copy right singular vectors of R from WORK(IR) to A */ + + dlacpy_((char *)"F", n, n, &work[ir], &ldwrkr, &a[a_offset], + lda, (ftnlen)1); + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *n; + +/* Compute A=Q*R, copying result to U */ +/* (Workspace: need 2*N, prefer N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + +/* Generate Q in U */ +/* (Workspace: need N + M, prefer N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Zero out below R in A */ + + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ + a_dim1 + 2], lda, (ftnlen)1); + } + +/* Bidiagonalize R in A */ +/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Multiply Q in U by left bidiagonalizing vectors */ +/* in A */ +/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & + work[itauq], &u[u_offset], ldu, &work[iwork], + &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) + ; + +/* Generate right bidiagonalizing vectors in A */ +/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of A in U and computing right */ +/* singular vectors of A in A */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, &u[u_offset], ldu, dum, &c__1, + &work[iwork], info, (ftnlen)1); + + } + + } else if (wntvas) { + +/* Path 9 (M much larger than N, JOBU='A', JOBVT='S' */ +/* or 'A') */ +/* M left singular vectors to be computed in U and */ +/* N right singular vectors to be computed in VT */ + +/* Computing MAX */ + i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); + if (*lwork >= *n * *n + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + iu = 1; + if (*lwork >= wrkbl + *lda * *n) { + +/* WORK(IU) is LDA by N */ + + ldwrku = *lda; + } else { + +/* WORK(IU) is N by N */ + + ldwrku = *n; + } + itau = iu + ldwrku * *n; + iwork = itau + *n; + +/* Compute A=Q*R, copying result to U */ +/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + +/* Generate Q in U */ +/* (Workspace: need N*N + N + M, prefer N*N + N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + +/* Copy R to WORK(IU), zeroing out below it */ + + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + 1], &ldwrku, (ftnlen)1); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in WORK(IU), copying result to VT */ +/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &vt[vt_offset], + ldvt, (ftnlen)1); + +/* Generate left bidiagonalizing vectors in WORK(IU) */ +/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + +/* Generate right bidiagonalizing vectors in VT */ +/* (Workspace: need N*N + 4*N-1, */ +/* prefer N*N+3*N+(N-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ + itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) + ; + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of R in WORK(IU) and computing */ +/* right singular vectors of R in VT */ +/* (Workspace: need N*N + BDSPAC) */ + + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &work[iu], &ldwrku, dum, & + c__1, &work[iwork], info, (ftnlen)1); + +/* Multiply Q in U by left singular vectors of R in */ +/* WORK(IU), storing result in A */ +/* (Workspace: need N*N) */ + + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, & + work[iu], &ldwrku, &c_b57, &a[a_offset], lda, + (ftnlen)1, (ftnlen)1); + +/* Copy left singular vectors of A from A to U */ + + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *n; + +/* Compute A=Q*R, copying result to U */ +/* (Workspace: need 2*N, prefer N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + +/* Generate Q in U */ +/* (Workspace: need N + M, prefer N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + +/* Copy R from A to VT, zeroing out below it */ + + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[ + vt_dim1 + 2], ldvt, (ftnlen)1); + } + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize R in VT */ +/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], + &work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Multiply Q in U by left bidiagonalizing vectors */ +/* in VT */ +/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, + &work[itauq], &u[u_offset], ldu, &work[iwork], + &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen) + 1); + +/* Generate right bidiagonalizing vectors in VT */ +/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ + itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) + ; + iwork = ie + *n; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of A in U and computing right */ +/* singular vectors of A in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &u[u_offset], ldu, dum, & + c__1, &work[iwork], info, (ftnlen)1); + + } + + } + + } + + } else { + +/* M .LT. MNTHR */ + +/* Path 10 (M at least N, but not much larger) */ +/* Reduce to bidiagonal form without QR decomposition */ + + ie = 1; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; + +/* Bidiagonalize A */ +/* (Workspace: need 3*N + M, prefer 3*N + (M + N)*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & + work[itaup], &work[iwork], &i__2, &ierr); + if (wntuas) { + +/* If left singular vectors desired in U, copy result to U */ +/* and generate left bidiagonalizing vectors in U */ +/* (Workspace: need 3*N + NCU, prefer 3*N + NCU*NB) */ + + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, ( + ftnlen)1); + if (wntus) { + ncu = *n; + } + if (wntua) { + ncu = *m; + } + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, &ncu, n, &u[u_offset], ldu, &work[itauq], & + work[iwork], &i__2, &ierr, (ftnlen)1); + } + if (wntvas) { + +/* If right singular vectors desired in VT, copy result to */ +/* VT and generate right bidiagonalizing vectors in VT */ +/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ + + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt, ( + ftnlen)1); + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], & + work[iwork], &i__2, &ierr, (ftnlen)1); + } + if (wntuo) { + +/* If left singular vectors desired in A, generate left */ +/* bidiagonalizing vectors in A */ +/* (Workspace: need 4*N, prefer 3*N + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, &work[itauq], &work[ + iwork], &i__2, &ierr, (ftnlen)1); + } + if (wntvo) { + +/* If right singular vectors desired in A, generate right */ +/* bidiagonalizing vectors in A */ +/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[ + iwork], &i__2, &ierr, (ftnlen)1); + } + iwork = ie + *n; + if (wntuas || wntuo) { + nru = *m; + } + if (wntun) { + nru = 0; + } + if (wntvas || wntvo) { + ncvt = *n; + } + if (wntvn) { + ncvt = 0; + } + if (! wntuo && ! wntvo) { + +/* Perform bidiagonal QR iteration, if desired, computing */ +/* left singular vectors in U and computing right singular */ +/* vectors in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); + } else if (! wntuo && wntvo) { + +/* Perform bidiagonal QR iteration, if desired, computing */ +/* left singular vectors in U and computing right singular */ +/* vectors in A */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[ + iwork], info, (ftnlen)1); + } else { + +/* Perform bidiagonal QR iteration, if desired, computing */ +/* left singular vectors in A and computing right singular */ +/* vectors in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & + work[iwork], info, (ftnlen)1); + } + + } + + } else { + +/* A has more columns than rows. If A has sufficiently more */ +/* columns than rows, first reduce using the LQ decomposition (if */ +/* sufficient workspace available) */ + + if (*n >= mnthr) { + + if (wntvn) { + +/* Path 1t(N much larger than M, JOBVT='N') */ +/* No right singular vectors to be computed */ + + itau = 1; + iwork = itau + *m; + +/* Compute A=L*Q */ +/* (Workspace: need 2*M, prefer M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], & + i__2, &ierr); + +/* Zero out above L */ + + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 << 1) + + 1], lda, (ftnlen)1); + ie = 1; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in A */ +/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__2, &ierr); + if (wntuo || wntuas) { + +/* If left singular vectors desired, generate Q */ +/* (Workspace: need 4*M, prefer 3*M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], & + work[iwork], &i__2, &ierr, (ftnlen)1); + } + iwork = ie + *m; + nru = 0; + if (wntuo || wntuas) { + nru = *m; + } + +/* Perform bidiagonal QR iteration, computing left singular */ +/* vectors of A in A if desired */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", m, &c__0, &nru, &c__0, &s[1], &work[ie], dum, & + c__1, &a[a_offset], lda, dum, &c__1, &work[iwork], + info, (ftnlen)1); + +/* If left singular vectors desired in U, copy them there */ + + if (wntuas) { + dlacpy_((char *)"F", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( + ftnlen)1); + } + + } else if (wntvo && wntun) { + +/* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */ +/* M right singular vectors to be overwritten on A and */ +/* no left singular vectors to be computed */ + +/* Computing MAX */ + i__2 = *m << 2; + if (*lwork >= *m * *m + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + ir = 1; +/* Computing MAX */ + i__2 = wrkbl, i__3 = *lda * *n + *m; + if (*lwork >= max(i__2,i__3) + *lda * *m) { + +/* WORK(IU) is LDA by N and WORK(IR) is LDA by M */ + + ldwrku = *lda; + chunk = *n; + ldwrkr = *lda; + } else /* if(complicated condition) */ { +/* Computing MAX */ + i__2 = wrkbl, i__3 = *lda * *n + *m; + if (*lwork >= max(i__2,i__3) + *m * *m) { + +/* WORK(IU) is LDA by N and WORK(IR) is M by M */ + + ldwrku = *lda; + chunk = *n; + ldwrkr = *m; + } else { + +/* WORK(IU) is M by CHUNK and WORK(IR) is M by M */ + + ldwrku = *m; + chunk = (*lwork - *m * *m - *m) / *m; + ldwrkr = *m; + } + } + itau = ir + ldwrkr * *m; + iwork = itau + *m; + +/* Compute A=L*Q */ +/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] + , &i__2, &ierr); + +/* Copy L to WORK(IR) and zero out above it */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], &ldwrkr, + (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + + ldwrkr], &ldwrkr, (ftnlen)1); + +/* Generate Q in A */ +/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in WORK(IR) */ +/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__2, &ierr); + +/* Generate right vectors bidiagonalizing L */ +/* (Workspace: need M*M + 4*M-1, prefer M*M + 3*M + (M-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup], & + work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing right */ +/* singular vectors of L in WORK(IR) */ +/* (Workspace: need M*M + BDSPAC) */ + + dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], &work[ + ir], &ldwrkr, dum, &c__1, dum, &c__1, &work[iwork] + , info, (ftnlen)1); + iu = ie + *m; + +/* Multiply right singular vectors of L in WORK(IR) by Q */ +/* in A, storing result in WORK(IU) and copying to A */ +/* (Workspace: need M*M + 2*M, prefer M*M + M*N + M) */ + + i__2 = *n; + i__3 = chunk; + for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += + i__3) { +/* Computing MIN */ + i__4 = *n - i__ + 1; + blk = min(i__4,chunk); + dgemm_((char *)"N", (char *)"N", m, &blk, m, &c_b79, &work[ir], & + ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b57, & + work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, &blk, &work[iu], &ldwrku, &a[i__ * + a_dim1 + 1], lda, (ftnlen)1); +/* L30: */ + } + + } else { + +/* Insufficient workspace for a fast algorithm */ + + ie = 1; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize A */ +/* (Workspace: need 3*M + N, prefer 3*M + (M + N)*NB) */ + + i__3 = *lwork - iwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__3, &ierr); + +/* Generate right vectors bidiagonalizing A */ +/* (Workspace: need 4*M, prefer 3*M + M*NB) */ + + i__3 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], & + work[iwork], &i__3, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing right */ +/* singular vectors of A in A */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"L", m, n, &c__0, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, dum, &c__1, dum, &c__1, &work[ + iwork], info, (ftnlen)1); + + } + + } else if (wntvo && wntuas) { + +/* Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O') */ +/* M right singular vectors to be overwritten on A and */ +/* M left singular vectors to be computed in U */ + +/* Computing MAX */ + i__3 = *m << 2; + if (*lwork >= *m * *m + max(i__3,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + ir = 1; +/* Computing MAX */ + i__3 = wrkbl, i__2 = *lda * *n + *m; + if (*lwork >= max(i__3,i__2) + *lda * *m) { + +/* WORK(IU) is LDA by N and WORK(IR) is LDA by M */ + + ldwrku = *lda; + chunk = *n; + ldwrkr = *lda; + } else /* if(complicated condition) */ { +/* Computing MAX */ + i__3 = wrkbl, i__2 = *lda * *n + *m; + if (*lwork >= max(i__3,i__2) + *m * *m) { + +/* WORK(IU) is LDA by N and WORK(IR) is M by M */ + + ldwrku = *lda; + chunk = *n; + ldwrkr = *m; + } else { + +/* WORK(IU) is M by CHUNK and WORK(IR) is M by M */ + + ldwrku = *m; + chunk = (*lwork - *m * *m - *m) / *m; + ldwrkr = *m; + } + } + itau = ir + ldwrkr * *m; + iwork = itau + *m; + +/* Compute A=L*Q */ +/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ + + i__3 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] + , &i__3, &ierr); + +/* Copy L to U, zeroing about above it */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( + ftnlen)1); + i__3 = *m - 1; + i__2 = *m - 1; + dlaset_((char *)"U", &i__3, &i__2, &c_b57, &c_b57, &u[(u_dim1 << + 1) + 1], ldu, (ftnlen)1); + +/* Generate Q in A */ +/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ + + i__3 = *lwork - iwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__3, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in U, copying result to WORK(IR) */ +/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ + + i__3 = *lwork - iwork + 1; + dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__3, &ierr); + dlacpy_((char *)"U", m, m, &u[u_offset], ldu, &work[ir], &ldwrkr, + (ftnlen)1); + +/* Generate right vectors bidiagonalizing L in WORK(IR) */ +/* (Workspace: need M*M + 4*M-1, prefer M*M + 3*M + (M-1)*NB) */ + + i__3 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup], & + work[iwork], &i__3, &ierr, (ftnlen)1); + +/* Generate left vectors bidiagonalizing L in U */ +/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) */ + + i__3 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], & + work[iwork], &i__3, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of L in U, and computing right */ +/* singular vectors of L in WORK(IR) */ +/* (Workspace: need M*M + BDSPAC) */ + + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ir], + &ldwrkr, &u[u_offset], ldu, dum, &c__1, &work[ + iwork], info, (ftnlen)1); + iu = ie + *m; + +/* Multiply right singular vectors of L in WORK(IR) by Q */ +/* in A, storing result in WORK(IU) and copying to A */ +/* (Workspace: need M*M + 2*M, prefer M*M + M*N + M)) */ + + i__3 = *n; + i__2 = chunk; + for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += + i__2) { +/* Computing MIN */ + i__4 = *n - i__ + 1; + blk = min(i__4,chunk); + dgemm_((char *)"N", (char *)"N", m, &blk, m, &c_b79, &work[ir], & + ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b57, & + work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, &blk, &work[iu], &ldwrku, &a[i__ * + a_dim1 + 1], lda, (ftnlen)1); +/* L40: */ + } + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *m; + +/* Compute A=L*Q */ +/* (Workspace: need 2*M, prefer M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] + , &i__2, &ierr); + +/* Copy L to U, zeroing out above it */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( + ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 << + 1) + 1], ldu, (ftnlen)1); + +/* Generate Q in A */ +/* (Workspace: need 2*M, prefer M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in U */ +/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__2, &ierr); + +/* Multiply right vectors bidiagonalizing L by Q in A */ +/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, &work[ + itaup], &a[a_offset], lda, &work[iwork], &i__2, & + ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + +/* Generate left vectors bidiagonalizing L in U */ +/* (Workspace: need 4*M, prefer 3*M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], & + work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of A in U and computing right */ +/* singular vectors of A in A */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); + + } + + } else if (wntvs) { + + if (wntun) { + +/* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */ +/* M right singular vectors to be computed in VT and */ +/* no left singular vectors to be computed */ + +/* Computing MAX */ + i__2 = *m << 2; + if (*lwork >= *m * *m + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + ir = 1; + if (*lwork >= wrkbl + *lda * *m) { + +/* WORK(IR) is LDA by M */ + + ldwrkr = *lda; + } else { + +/* WORK(IR) is M by M */ + + ldwrkr = *m; + } + itau = ir + ldwrkr * *m; + iwork = itau + *m; + +/* Compute A=L*Q */ +/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + +/* Copy L to WORK(IR), zeroing out above it */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], & + ldwrkr, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + + ldwrkr], &ldwrkr, (ftnlen)1); + +/* Generate Q in A */ +/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in WORK(IR) */ +/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Generate right vectors bidiagonalizing L in */ +/* WORK(IR) */ +/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + (M-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing right */ +/* singular vectors of L in WORK(IR) */ +/* (Workspace: need M*M + BDSPAC) */ + + dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], & + work[ir], &ldwrkr, dum, &c__1, dum, &c__1, & + work[iwork], info, (ftnlen)1); + +/* Multiply right singular vectors of L in WORK(IR) by */ +/* Q in A, storing result in VT */ +/* (Workspace: need M*M) */ + + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[ir], &ldwrkr, + &a[a_offset], lda, &c_b57, &vt[vt_offset], + ldvt, (ftnlen)1, (ftnlen)1); + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *m; + +/* Compute A=L*Q */ +/* (Workspace: need 2*M, prefer M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + +/* Copy result to VT */ + + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + +/* Generate Q in VT */ +/* (Workspace: need 2*M, prefer M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Zero out above L in A */ + + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 + << 1) + 1], lda, (ftnlen)1); + +/* Bidiagonalize L in A */ +/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Multiply right vectors bidiagonalizing L by Q in VT */ +/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & + work[itaup], &vt[vt_offset], ldvt, &work[ + iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing right */ +/* singular vectors of A in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", m, n, &c__0, &c__0, &s[1], &work[ie], & + vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, & + work[iwork], info, (ftnlen)1); + + } + + } else if (wntuo) { + +/* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */ +/* M right singular vectors to be computed in VT and */ +/* M left singular vectors to be overwritten on A */ + +/* Computing MAX */ + i__2 = *m << 2; + if (*lwork >= (*m << 1) * *m + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + iu = 1; + if (*lwork >= wrkbl + (*lda << 1) * *m) { + +/* WORK(IU) is LDA by M and WORK(IR) is LDA by M */ + + ldwrku = *lda; + ir = iu + ldwrku * *m; + ldwrkr = *lda; + } else if (*lwork >= wrkbl + (*lda + *m) * *m) { + +/* WORK(IU) is LDA by M and WORK(IR) is M by M */ + + ldwrku = *lda; + ir = iu + ldwrku * *m; + ldwrkr = *m; + } else { + +/* WORK(IU) is M by M and WORK(IR) is M by M */ + + ldwrku = *m; + ir = iu + ldwrku * *m; + ldwrkr = *m; + } + itau = ir + ldwrkr * *m; + iwork = itau + *m; + +/* Compute A=L*Q */ +/* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + +/* Copy L to WORK(IU), zeroing out below it */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + ldwrku], &ldwrku, (ftnlen)1); + +/* Generate Q in A */ +/* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in WORK(IU), copying result to */ +/* WORK(IR) */ +/* (Workspace: need 2*M*M + 4*M, */ +/* prefer 2*M*M+3*M+2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &work[ir], & + ldwrkr, (ftnlen)1); + +/* Generate right bidiagonalizing vectors in WORK(IU) */ +/* (Workspace: need 2*M*M + 4*M-1, */ +/* prefer 2*M*M+3*M+(M-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + +/* Generate left bidiagonalizing vectors in WORK(IR) */ +/* (Workspace: need 2*M*M + 4*M, prefer 2*M*M + 3*M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &work[ir], &ldwrkr, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of L in WORK(IR) and computing */ +/* right singular vectors of L in WORK(IU) */ +/* (Workspace: need 2*M*M + BDSPAC) */ + + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ + iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1, + &work[iwork], info, (ftnlen)1); + +/* Multiply right singular vectors of L in WORK(IU) by */ +/* Q in A, storing result in VT */ +/* (Workspace: need M*M) */ + + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, + &a[a_offset], lda, &c_b57, &vt[vt_offset], + ldvt, (ftnlen)1, (ftnlen)1); + +/* Copy left singular vectors of L to A */ +/* (Workspace: need M*M) */ + + dlacpy_((char *)"F", m, m, &work[ir], &ldwrkr, &a[a_offset], + lda, (ftnlen)1); + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *m; + +/* Compute A=L*Q, copying result to VT */ +/* (Workspace: need 2*M, prefer M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + +/* Generate Q in VT */ +/* (Workspace: need 2*M, prefer M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Zero out above L in A */ + + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 + << 1) + 1], lda, (ftnlen)1); + +/* Bidiagonalize L in A */ +/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Multiply right vectors bidiagonalizing L by Q in VT */ +/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & + work[itaup], &vt[vt_offset], ldvt, &work[ + iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + +/* Generate left bidiagonalizing vectors of L in A */ +/* (Workspace: need 4*M, prefer 3*M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, compute left */ +/* singular vectors of A in A and compute right */ +/* singular vectors of A in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &a[a_offset], lda, dum, & + c__1, &work[iwork], info, (ftnlen)1); + + } + + } else if (wntuas) { + +/* Path 6t(N much larger than M, JOBU='S' or 'A', */ +/* JOBVT='S') */ +/* M right singular vectors to be computed in VT and */ +/* M left singular vectors to be computed in U */ + +/* Computing MAX */ + i__2 = *m << 2; + if (*lwork >= *m * *m + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + iu = 1; + if (*lwork >= wrkbl + *lda * *m) { + +/* WORK(IU) is LDA by N */ + + ldwrku = *lda; + } else { + +/* WORK(IU) is LDA by M */ + + ldwrku = *m; + } + itau = iu + ldwrku * *m; + iwork = itau + *m; + +/* Compute A=L*Q */ +/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + +/* Copy L to WORK(IU), zeroing out above it */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + ldwrku], &ldwrku, (ftnlen)1); + +/* Generate Q in A */ +/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in WORK(IU), copying result to U */ +/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &u[u_offset], + ldu, (ftnlen)1); + +/* Generate right bidiagonalizing vectors in WORK(IU) */ +/* (Workspace: need M*M + 4*M-1, */ +/* prefer M*M+3*M+(M-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + +/* Generate left bidiagonalizing vectors in U */ +/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of L in U and computing right */ +/* singular vectors of L in WORK(IU) */ +/* (Workspace: need M*M + BDSPAC) */ + + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ + iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); + +/* Multiply right singular vectors of L in WORK(IU) by */ +/* Q in A, storing result in VT */ +/* (Workspace: need M*M) */ + + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, + &a[a_offset], lda, &c_b57, &vt[vt_offset], + ldvt, (ftnlen)1, (ftnlen)1); + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *m; + +/* Compute A=L*Q, copying result to VT */ +/* (Workspace: need 2*M, prefer M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + +/* Generate Q in VT */ +/* (Workspace: need 2*M, prefer M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + +/* Copy L to U, zeroing out above it */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 + << 1) + 1], ldu, (ftnlen)1); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in U */ +/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Multiply right bidiagonalizing vectors in U by Q */ +/* in VT */ +/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, & + work[itaup], &vt[vt_offset], ldvt, &work[ + iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + +/* Generate left bidiagonalizing vectors in U */ +/* (Workspace: need 4*M, prefer 3*M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of A in U and computing right */ +/* singular vectors of A in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &u[u_offset], ldu, dum, & + c__1, &work[iwork], info, (ftnlen)1); + + } + + } + + } else if (wntva) { + + if (wntun) { + +/* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */ +/* N right singular vectors to be computed in VT and */ +/* no left singular vectors to be computed */ + +/* Computing MAX */ + i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); + if (*lwork >= *m * *m + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + ir = 1; + if (*lwork >= wrkbl + *lda * *m) { + +/* WORK(IR) is LDA by M */ + + ldwrkr = *lda; + } else { + +/* WORK(IR) is M by M */ + + ldwrkr = *m; + } + itau = ir + ldwrkr * *m; + iwork = itau + *m; + +/* Compute A=L*Q, copying result to VT */ +/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + +/* Copy L to WORK(IR), zeroing out above it */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], & + ldwrkr, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + + ldwrkr], &ldwrkr, (ftnlen)1); + +/* Generate Q in VT */ +/* (Workspace: need M*M + M + N, prefer M*M + M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in WORK(IR) */ +/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Generate right bidiagonalizing vectors in WORK(IR) */ +/* (Workspace: need M*M + 4*M-1, */ +/* prefer M*M+3*M+(M-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing right */ +/* singular vectors of L in WORK(IR) */ +/* (Workspace: need M*M + BDSPAC) */ + + dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], & + work[ir], &ldwrkr, dum, &c__1, dum, &c__1, & + work[iwork], info, (ftnlen)1); + +/* Multiply right singular vectors of L in WORK(IR) by */ +/* Q in VT, storing result in A */ +/* (Workspace: need M*M) */ + + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[ir], &ldwrkr, + &vt[vt_offset], ldvt, &c_b57, &a[a_offset], + lda, (ftnlen)1, (ftnlen)1); + +/* Copy right singular vectors of A from A to VT */ + + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *m; + +/* Compute A=L*Q, copying result to VT */ +/* (Workspace: need 2*M, prefer M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + +/* Generate Q in VT */ +/* (Workspace: need M + N, prefer M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Zero out above L in A */ + + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 + << 1) + 1], lda, (ftnlen)1); + +/* Bidiagonalize L in A */ +/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Multiply right bidiagonalizing vectors in A by Q */ +/* in VT */ +/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & + work[itaup], &vt[vt_offset], ldvt, &work[ + iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing right */ +/* singular vectors of A in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", m, n, &c__0, &c__0, &s[1], &work[ie], & + vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, & + work[iwork], info, (ftnlen)1); + + } + + } else if (wntuo) { + +/* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */ +/* N right singular vectors to be computed in VT and */ +/* M left singular vectors to be overwritten on A */ + +/* Computing MAX */ + i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); + if (*lwork >= (*m << 1) * *m + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + iu = 1; + if (*lwork >= wrkbl + (*lda << 1) * *m) { + +/* WORK(IU) is LDA by M and WORK(IR) is LDA by M */ + + ldwrku = *lda; + ir = iu + ldwrku * *m; + ldwrkr = *lda; + } else if (*lwork >= wrkbl + (*lda + *m) * *m) { + +/* WORK(IU) is LDA by M and WORK(IR) is M by M */ + + ldwrku = *lda; + ir = iu + ldwrku * *m; + ldwrkr = *m; + } else { + +/* WORK(IU) is M by M and WORK(IR) is M by M */ + + ldwrku = *m; + ir = iu + ldwrku * *m; + ldwrkr = *m; + } + itau = ir + ldwrkr * *m; + iwork = itau + *m; + +/* Compute A=L*Q, copying result to VT */ +/* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + +/* Generate Q in VT */ +/* (Workspace: need 2*M*M + M + N, prefer 2*M*M + M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + +/* Copy L to WORK(IU), zeroing out above it */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + ldwrku], &ldwrku, (ftnlen)1); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in WORK(IU), copying result to */ +/* WORK(IR) */ +/* (Workspace: need 2*M*M + 4*M, */ +/* prefer 2*M*M+3*M+2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &work[ir], & + ldwrkr, (ftnlen)1); + +/* Generate right bidiagonalizing vectors in WORK(IU) */ +/* (Workspace: need 2*M*M + 4*M-1, */ +/* prefer 2*M*M+3*M+(M-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + +/* Generate left bidiagonalizing vectors in WORK(IR) */ +/* (Workspace: need 2*M*M + 4*M, prefer 2*M*M + 3*M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &work[ir], &ldwrkr, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of L in WORK(IR) and computing */ +/* right singular vectors of L in WORK(IU) */ +/* (Workspace: need 2*M*M + BDSPAC) */ + + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ + iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1, + &work[iwork], info, (ftnlen)1); + +/* Multiply right singular vectors of L in WORK(IU) by */ +/* Q in VT, storing result in A */ +/* (Workspace: need M*M) */ + + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, + &vt[vt_offset], ldvt, &c_b57, &a[a_offset], + lda, (ftnlen)1, (ftnlen)1); + +/* Copy right singular vectors of A from A to VT */ + + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + +/* Copy left singular vectors of A from WORK(IR) to A */ + + dlacpy_((char *)"F", m, m, &work[ir], &ldwrkr, &a[a_offset], + lda, (ftnlen)1); + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *m; + +/* Compute A=L*Q, copying result to VT */ +/* (Workspace: need 2*M, prefer M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + +/* Generate Q in VT */ +/* (Workspace: need M + N, prefer M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Zero out above L in A */ + + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 + << 1) + 1], lda, (ftnlen)1); + +/* Bidiagonalize L in A */ +/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Multiply right bidiagonalizing vectors in A by Q */ +/* in VT */ +/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & + work[itaup], &vt[vt_offset], ldvt, &work[ + iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + +/* Generate left bidiagonalizing vectors in A */ +/* (Workspace: need 4*M, prefer 3*M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of A in A and computing right */ +/* singular vectors of A in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &a[a_offset], lda, dum, & + c__1, &work[iwork], info, (ftnlen)1); + + } + + } else if (wntuas) { + +/* Path 9t(N much larger than M, JOBU='S' or 'A', */ +/* JOBVT='A') */ +/* N right singular vectors to be computed in VT and */ +/* M left singular vectors to be computed in U */ + +/* Computing MAX */ + i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); + if (*lwork >= *m * *m + max(i__2,bdspac)) { + +/* Sufficient workspace for a fast algorithm */ + + iu = 1; + if (*lwork >= wrkbl + *lda * *m) { + +/* WORK(IU) is LDA by M */ + + ldwrku = *lda; + } else { + +/* WORK(IU) is M by M */ + + ldwrku = *m; + } + itau = iu + ldwrku * *m; + iwork = itau + *m; + +/* Compute A=L*Q, copying result to VT */ +/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + +/* Generate Q in VT */ +/* (Workspace: need M*M + M + N, prefer M*M + M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + +/* Copy L to WORK(IU), zeroing out above it */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + ldwrku], &ldwrku, (ftnlen)1); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in WORK(IU), copying result to U */ +/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &u[u_offset], + ldu, (ftnlen)1); + +/* Generate right bidiagonalizing vectors in WORK(IU) */ +/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + (M-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + +/* Generate left bidiagonalizing vectors in U */ +/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of L in U and computing right */ +/* singular vectors of L in WORK(IU) */ +/* (Workspace: need M*M + BDSPAC) */ + + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ + iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); + +/* Multiply right singular vectors of L in WORK(IU) by */ +/* Q in VT, storing result in A */ +/* (Workspace: need M*M) */ + + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, + &vt[vt_offset], ldvt, &c_b57, &a[a_offset], + lda, (ftnlen)1, (ftnlen)1); + +/* Copy right singular vectors of A from A to VT */ + + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + + } else { + +/* Insufficient workspace for a fast algorithm */ + + itau = 1; + iwork = itau + *m; + +/* Compute A=L*Q, copying result to VT */ +/* (Workspace: need 2*M, prefer M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + +/* Generate Q in VT */ +/* (Workspace: need M + N, prefer M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + +/* Copy L to U, zeroing out above it */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 + << 1) + 1], ldu, (ftnlen)1); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize L in U */ +/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + +/* Multiply right bidiagonalizing vectors in U by Q */ +/* in VT */ +/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ + + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, & + work[itaup], &vt[vt_offset], ldvt, &work[ + iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + +/* Generate left bidiagonalizing vectors in U */ +/* (Workspace: need 4*M, prefer 3*M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; + +/* Perform bidiagonal QR iteration, computing left */ +/* singular vectors of A in U and computing right */ +/* singular vectors of A in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &u[u_offset], ldu, dum, & + c__1, &work[iwork], info, (ftnlen)1); + + } + + } + + } + + } else { + +/* N .LT. MNTHR */ + +/* Path 10t(N greater than M, but not much larger) */ +/* Reduce to bidiagonal form without LQ decomposition */ + + ie = 1; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; + +/* Bidiagonalize A */ +/* (Workspace: need 3*M + N, prefer 3*M + (M + N)*NB) */ + + i__2 = *lwork - iwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & + work[itaup], &work[iwork], &i__2, &ierr); + if (wntuas) { + +/* If left singular vectors desired in U, copy result to U */ +/* and generate left bidiagonalizing vectors in U */ +/* (Workspace: need 4*M-1, prefer 3*M + (M-1)*NB) */ + + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( + ftnlen)1); + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[ + iwork], &i__2, &ierr, (ftnlen)1); + } + if (wntvas) { + +/* If right singular vectors desired in VT, copy result to */ +/* VT and generate right bidiagonalizing vectors in VT */ +/* (Workspace: need 3*M + NRVT, prefer 3*M + NRVT*NB) */ + + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, ( + ftnlen)1); + if (wntva) { + nrvt = *n; + } + if (wntvs) { + nrvt = *m; + } + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", &nrvt, n, m, &vt[vt_offset], ldvt, &work[itaup], + &work[iwork], &i__2, &ierr, (ftnlen)1); + } + if (wntuo) { + +/* If left singular vectors desired in A, generate left */ +/* bidiagonalizing vectors in A */ +/* (Workspace: need 4*M-1, prefer 3*M + (M-1)*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, n, &a[a_offset], lda, &work[itauq], &work[ + iwork], &i__2, &ierr, (ftnlen)1); + } + if (wntvo) { + +/* If right singular vectors desired in A, generate right */ +/* bidiagonalizing vectors in A */ +/* (Workspace: need 4*M, prefer 3*M + M*NB) */ + + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], &work[ + iwork], &i__2, &ierr, (ftnlen)1); + } + iwork = ie + *m; + if (wntuas || wntuo) { + nru = *m; + } + if (wntun) { + nru = 0; + } + if (wntvas || wntvo) { + ncvt = *n; + } + if (wntvn) { + ncvt = 0; + } + if (! wntuo && ! wntvo) { + +/* Perform bidiagonal QR iteration, if desired, computing */ +/* left singular vectors in U and computing right singular */ +/* vectors in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); + } else if (! wntuo && wntvo) { + +/* Perform bidiagonal QR iteration, if desired, computing */ +/* left singular vectors in U and computing right singular */ +/* vectors in A */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[ + iwork], info, (ftnlen)1); + } else { + +/* Perform bidiagonal QR iteration, if desired, computing */ +/* left singular vectors in A and computing right singular */ +/* vectors in VT */ +/* (Workspace: need BDSPAC) */ + + dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & + work[iwork], info, (ftnlen)1); + } + + } + + } + +/* If DBDSQR failed to converge, copy unconverged superdiagonals */ +/* to WORK( 2:MINMN ) */ + + if (*info != 0) { + if (ie > 2) { + i__2 = minmn - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + work[i__ + 1] = work[i__ + ie - 1]; +/* L50: */ + } + } + if (ie < 2) { + for (i__ = minmn - 1; i__ >= 1; --i__) { + work[i__ + 1] = work[i__ + ie - 1]; +/* L60: */ + } + } + } + +/* Undo scaling if necessary */ + + if (iscl == 1) { + if (anrm > bignum) { + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & + minmn, &ierr, (ftnlen)1); + } + if (*info != 0 && anrm > bignum) { + i__2 = minmn - 1; + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &i__2, &c__1, &work[2], + &minmn, &ierr, (ftnlen)1); + } + if (anrm < smlnum) { + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & + minmn, &ierr, (ftnlen)1); + } + if (*info != 0 && anrm < smlnum) { + i__2 = minmn - 1; + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &i__2, &c__1, &work[2], + &minmn, &ierr, (ftnlen)1); + } + } + +/* Return optimal workspace in WORK(1) */ + + work[1] = (doublereal) maxwrk; + + return 0; + +/* End of DGESVD */ + +} /* dgesvd_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgetf2.cpp b/lib/linalg/dgetf2.cpp new file mode 100644 index 0000000000..0cb6b57a2f --- /dev/null +++ b/lib/linalg/dgetf2.cpp @@ -0,0 +1,266 @@ +/* fortran/dgetf2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static doublereal c_b8 = -1.; + +/* > \brief \b DGETF2 computes the LU factorization of a general m-by-n matrix using partial pivoting with row + interchanges (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGETF2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGETF2( M, N, A, LDA, IPIV, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IPIV( * ) */ +/* DOUBLE PRECISION A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGETF2 computes an LU factorization of a general m-by-n matrix A */ +/* > using partial pivoting with row interchanges. */ +/* > */ +/* > The factorization has the form */ +/* > A = P * L * U */ +/* > where P is a permutation matrix, L is lower triangular with unit */ +/* > diagonal elements (lower trapezoidal if m > n), and U is upper */ +/* > triangular (upper trapezoidal if m < n). */ +/* > */ +/* > This is the right-looking Level 2 BLAS version of the algorithm. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the m by n matrix to be factored. */ +/* > On exit, the factors L and U from the factorization */ +/* > A = P*L*U; the unit diagonal elements of L are not stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IPIV */ +/* > \verbatim */ +/* > IPIV is INTEGER array, dimension (min(M,N)) */ +/* > The pivot indices; for 1 <= i <= min(M,N), row i of the */ +/* > matrix was interchanged with row IPIV(i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -k, the k-th argument had an illegal value */ +/* > > 0: if INFO = k, U(k,k) is exactly zero. The factorization */ +/* > has been completed, but the factor U is exactly */ +/* > singular, and division by zero will occur if it is used */ +/* > to solve a system of equations. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dgetf2_(integer *m, integer *n, doublereal *a, integer * + lda, integer *ipiv, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + doublereal d__1; + + /* Local variables */ + integer i__, j, jp; + extern /* Subroutine */ int dger_(integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *), dscal_(integer *, doublereal *, doublereal *, integer + *); + doublereal sfmin; + extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, + doublereal *, integer *); + extern doublereal dlamch_(char *, ftnlen); + extern integer idamax_(integer *, doublereal *, integer *); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + + /* Function Body */ + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*m)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGETF2", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0) { + return 0; + } + +/* Compute machine safe minimum */ + + sfmin = dlamch_((char *)"S", (ftnlen)1); + + i__1 = min(*m,*n); + for (j = 1; j <= i__1; ++j) { + +/* Find pivot and test for singularity. */ + + i__2 = *m - j + 1; + jp = j - 1 + idamax_(&i__2, &a[j + j * a_dim1], &c__1); + ipiv[j] = jp; + if (a[jp + j * a_dim1] != 0.) { + +/* Apply the interchange to columns 1:N. */ + + if (jp != j) { + dswap_(n, &a[j + a_dim1], lda, &a[jp + a_dim1], lda); + } + +/* Compute elements J+1:M of J-th column. */ + + if (j < *m) { + if ((d__1 = a[j + j * a_dim1], abs(d__1)) >= sfmin) { + i__2 = *m - j; + d__1 = 1. / a[j + j * a_dim1]; + dscal_(&i__2, &d__1, &a[j + 1 + j * a_dim1], &c__1); + } else { + i__2 = *m - j; + for (i__ = 1; i__ <= i__2; ++i__) { + a[j + i__ + j * a_dim1] /= a[j + j * a_dim1]; +/* L20: */ + } + } + } + + } else if (*info == 0) { + + *info = j; + } + + if (j < min(*m,*n)) { + +/* Update trailing submatrix. */ + + i__2 = *m - j; + i__3 = *n - j; + dger_(&i__2, &i__3, &c_b8, &a[j + 1 + j * a_dim1], &c__1, &a[j + ( + j + 1) * a_dim1], lda, &a[j + 1 + (j + 1) * a_dim1], lda); + } +/* L10: */ + } + return 0; + +/* End of DGETF2 */ + +} /* dgetf2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgetrf.cpp b/lib/linalg/dgetrf.cpp new file mode 100644 index 0000000000..eca7500a03 --- /dev/null +++ b/lib/linalg/dgetrf.cpp @@ -0,0 +1,293 @@ +/* fortran/dgetrf.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static doublereal c_b16 = 1.; +static doublereal c_b19 = -1.; + +/* > \brief \b DGETRF */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGETRF + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGETRF( M, N, A, LDA, IPIV, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IPIV( * ) */ +/* DOUBLE PRECISION A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGETRF computes an LU factorization of a general M-by-N matrix A */ +/* > using partial pivoting with row interchanges. */ +/* > */ +/* > The factorization has the form */ +/* > A = P * L * U */ +/* > where P is a permutation matrix, L is lower triangular with unit */ +/* > diagonal elements (lower trapezoidal if m > n), and U is upper */ +/* > triangular (upper trapezoidal if m < n). */ +/* > */ +/* > This is the right-looking Level 3 BLAS version of the algorithm. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the M-by-N matrix to be factored. */ +/* > On exit, the factors L and U from the factorization */ +/* > A = P*L*U; the unit diagonal elements of L are not stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IPIV */ +/* > \verbatim */ +/* > IPIV is INTEGER array, dimension (min(M,N)) */ +/* > The pivot indices; for 1 <= i <= min(M,N), row i of the */ +/* > matrix was interchanged with row IPIV(i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, U(i,i) is exactly zero. The factorization */ +/* > has been completed, but the factor U is exactly */ +/* > singular, and division by zero will occur if it is used */ +/* > to solve a system of equations. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dgetrf_(integer *m, integer *n, doublereal *a, integer * + lda, integer *ipiv, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + + /* Local variables */ + integer i__, j, jb, nb; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer iinfo; + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), xerbla_( + char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dlaswp_(integer *, doublereal *, integer *, + integer *, integer *, integer *, integer *), dgetrf2_(integer *, + integer *, doublereal *, integer *, integer *, integer *); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + + /* Function Body */ + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*m)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGETRF", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0) { + return 0; + } + +/* Determine the block size for this environment. */ + + nb = ilaenv_(&c__1, (char *)"DGETRF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen) + 1); + if (nb <= 1 || nb >= min(*m,*n)) { + +/* Use unblocked code. */ + + dgetrf2_(m, n, &a[a_offset], lda, &ipiv[1], info); + } else { + +/* Use blocked code. */ + + i__1 = min(*m,*n); + i__2 = nb; + for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { +/* Computing MIN */ + i__3 = min(*m,*n) - j + 1; + jb = min(i__3,nb); + +/* Factor diagonal and subdiagonal blocks and test for exact */ +/* singularity. */ + + i__3 = *m - j + 1; + dgetrf2_(&i__3, &jb, &a[j + j * a_dim1], lda, &ipiv[j], &iinfo); + +/* Adjust INFO and the pivot indices. */ + + if (*info == 0 && iinfo > 0) { + *info = iinfo + j - 1; + } +/* Computing MIN */ + i__4 = *m, i__5 = j + jb - 1; + i__3 = min(i__4,i__5); + for (i__ = j; i__ <= i__3; ++i__) { + ipiv[i__] = j - 1 + ipiv[i__]; +/* L10: */ + } + +/* Apply interchanges to columns 1:J-1. */ + + i__3 = j - 1; + i__4 = j + jb - 1; + dlaswp_(&i__3, &a[a_offset], lda, &j, &i__4, &ipiv[1], &c__1); + + if (j + jb <= *n) { + +/* Apply interchanges to columns J+JB:N. */ + + i__3 = *n - j - jb + 1; + i__4 = j + jb - 1; + dlaswp_(&i__3, &a[(j + jb) * a_dim1 + 1], lda, &j, &i__4, & + ipiv[1], &c__1); + +/* Compute block row of U. */ + + i__3 = *n - j - jb + 1; + dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Unit", &jb, &i__3, & + c_b16, &a[j + j * a_dim1], lda, &a[j + (j + jb) * + a_dim1], lda, (ftnlen)4, (ftnlen)5, (ftnlen)12, ( + ftnlen)4); + if (j + jb <= *m) { + +/* Update trailing submatrix. */ + + i__3 = *m - j - jb + 1; + i__4 = *n - j - jb + 1; + dgemm_((char *)"No transpose", (char *)"No transpose", &i__3, &i__4, &jb, + &c_b19, &a[j + jb + j * a_dim1], lda, &a[j + (j + + jb) * a_dim1], lda, &c_b16, &a[j + jb + (j + jb) * + a_dim1], lda, (ftnlen)12, (ftnlen)12); + } + } +/* L20: */ + } + } + return 0; + +/* End of DGETRF */ + +} /* dgetrf_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgetrf2.cpp b/lib/linalg/dgetrf2.cpp new file mode 100644 index 0000000000..94162fdca8 --- /dev/null +++ b/lib/linalg/dgetrf2.cpp @@ -0,0 +1,331 @@ +/* static/dgetrf2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static doublereal c_b13 = 1.; +static doublereal c_b16 = -1.; + +/* > \brief \b DGETRF2 */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* RECURSIVE SUBROUTINE DGETRF2( M, N, A, LDA, IPIV, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IPIV( * ) */ +/* DOUBLE PRECISION A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGETRF2 computes an LU factorization of a general M-by-N matrix A */ +/* > using partial pivoting with row interchanges. */ +/* > */ +/* > The factorization has the form */ +/* > A = P * L * U */ +/* > where P is a permutation matrix, L is lower triangular with unit */ +/* > diagonal elements (lower trapezoidal if m > n), and U is upper */ +/* > triangular (upper trapezoidal if m < n). */ +/* > */ +/* > This is the recursive version of the algorithm. It divides */ +/* > the matrix into four submatrices: */ +/* > */ +/* > [ A11 | A12 ] where A11 is n1 by n1 and A22 is n2 by n2 */ +/* > A = [ -----|----- ] with n1 = min(m,n)/2 */ +/* > [ A21 | A22 ] n2 = n-n1 */ +/* > */ +/* > [ A11 ] */ +/* > The subroutine calls itself to factor [ --- ], */ +/* > [ A12 ] */ +/* > [ A12 ] */ +/* > do the swaps on [ --- ], solve A12, update A22, */ +/* > [ A22 ] */ +/* > */ +/* > then calls itself to factor A22 and do the swaps on A21. */ +/* > */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the M-by-N matrix to be factored. */ +/* > On exit, the factors L and U from the factorization */ +/* > A = P*L*U; the unit diagonal elements of L are not stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IPIV */ +/* > \verbatim */ +/* > IPIV is INTEGER array, dimension (min(M,N)) */ +/* > The pivot indices; for 1 <= i <= min(M,N), row i of the */ +/* > matrix was interchanged with row IPIV(i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, U(i,i) is exactly zero. The factorization */ +/* > has been completed, but the factor U is exactly */ +/* > singular, and division by zero will occur if it is used */ +/* > to solve a system of equations. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dgetrf2_(integer *m, integer *n, doublereal *a, integer * + lda, integer *ipiv, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + doublereal d__1; + + /* Local variables */ + integer i__, n1, n2; + doublereal temp; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dgemm_(char *, char *, integer *, integer *, integer * + , doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer iinfo; + doublereal sfmin; + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern doublereal dlamch_(char *, ftnlen); + extern integer idamax_(integer *, doublereal *, integer *); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dlaswp_( + integer *, doublereal *, integer *, integer *, integer *, integer + *, integer *); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + + /* Function Body */ + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*m)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGETRF2", &i__1, (ftnlen)7); + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0) { + return 0; + } + if (*m == 1) { + +/* Use unblocked code for one row case */ +/* Just need to handle IPIV and INFO */ + + ipiv[1] = 1; + if (a[a_dim1 + 1] == 0.) { + *info = 1; + } + + } else if (*n == 1) { + +/* Use unblocked code for one column case */ + + +/* Compute machine safe minimum */ + + sfmin = dlamch_((char *)"S", (ftnlen)1); + +/* Find pivot and test for singularity */ + + i__ = idamax_(m, &a[a_dim1 + 1], &c__1); + ipiv[1] = i__; + if (a[i__ + a_dim1] != 0.) { + +/* Apply the interchange */ + + if (i__ != 1) { + temp = a[a_dim1 + 1]; + a[a_dim1 + 1] = a[i__ + a_dim1]; + a[i__ + a_dim1] = temp; + } + +/* Compute elements 2:M of the column */ + + if ((d__1 = a[a_dim1 + 1], abs(d__1)) >= sfmin) { + i__1 = *m - 1; + d__1 = 1. / a[a_dim1 + 1]; + dscal_(&i__1, &d__1, &a[a_dim1 + 2], &c__1); + } else { + i__1 = *m - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + a[i__ + 1 + a_dim1] /= a[a_dim1 + 1]; +/* L10: */ + } + } + + } else { + *info = 1; + } + + } else { + +/* Use recursive code */ + + n1 = min(*m,*n) / 2; + n2 = *n - n1; + +/* [ A11 ] */ +/* Factor [ --- ] */ +/* [ A21 ] */ + + dgetrf2_(m, &n1, &a[a_offset], lda, &ipiv[1], &iinfo); + if (*info == 0 && iinfo > 0) { + *info = iinfo; + } + +/* [ A12 ] */ +/* Apply interchanges to [ --- ] */ +/* [ A22 ] */ + + dlaswp_(&n2, &a[(n1 + 1) * a_dim1 + 1], lda, &c__1, &n1, &ipiv[1], & + c__1); + +/* Solve A12 */ + + dtrsm_((char *)"L", (char *)"L", (char *)"N", (char *)"U", &n1, &n2, &c_b13, &a[a_offset], lda, &a[( + n1 + 1) * a_dim1 + 1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + +/* Update A22 */ + + i__1 = *m - n1; + dgemm_((char *)"N", (char *)"N", &i__1, &n2, &n1, &c_b16, &a[n1 + 1 + a_dim1], lda, & + a[(n1 + 1) * a_dim1 + 1], lda, &c_b13, &a[n1 + 1 + (n1 + 1) * + a_dim1], lda, (ftnlen)1, (ftnlen)1); + +/* Factor A22 */ + + i__1 = *m - n1; + dgetrf2_(&i__1, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &ipiv[n1 + + 1], &iinfo); + +/* Adjust INFO and the pivot indices */ + + if (*info == 0 && iinfo > 0) { + *info = iinfo + n1; + } + i__1 = min(*m,*n); + for (i__ = n1 + 1; i__ <= i__1; ++i__) { + ipiv[i__] += n1; +/* L20: */ + } + +/* Apply interchanges to A21 */ + + i__1 = n1 + 1; + i__2 = min(*m,*n); + dlaswp_(&n1, &a[a_dim1 + 1], lda, &i__1, &i__2, &ipiv[1], &c__1); + + } + return 0; + +/* End of DGETRF2 */ + +} /* dgetrf2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgetri.cpp b/lib/linalg/dgetri.cpp new file mode 100644 index 0000000000..23178071b6 --- /dev/null +++ b/lib/linalg/dgetri.cpp @@ -0,0 +1,343 @@ +/* fortran/dgetri.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +static doublereal c_b20 = -1.; +static doublereal c_b22 = 1.; + +/* > \brief \b DGETRI */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGETRI + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDA, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IPIV( * ) */ +/* DOUBLE PRECISION A( LDA, * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGETRI computes the inverse of a matrix using the LU factorization */ +/* > computed by DGETRF. */ +/* > */ +/* > This method inverts U and then computes inv(A) by solving the system */ +/* > inv(A)*L = inv(U) for inv(A). */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the factors L and U from the factorization */ +/* > A = P*L*U as computed by DGETRF. */ +/* > On exit, if INFO = 0, the inverse of the original matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] IPIV */ +/* > \verbatim */ +/* > IPIV is INTEGER array, dimension (N) */ +/* > The pivot indices from DGETRF; for 1<=i<=N, row i of the */ +/* > matrix was interchanged with row IPIV(i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO=0, then WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= max(1,N). */ +/* > For optimal performance LWORK >= N*NB, where NB is */ +/* > the optimal blocksize returned by ILAENV. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, U(i,i) is exactly zero; the matrix is */ +/* > singular and its inverse could not be computed. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dgetri_(integer *n, doublereal *a, integer *lda, integer + *ipiv, doublereal *work, integer *lwork, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, j, jb, nb, jj, jp, nn, iws; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), + dgemv_(char *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, ftnlen); + integer nbmin; + extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, + doublereal *, integer *), dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), xerbla_( + char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + integer ldwork; + extern /* Subroutine */ int dtrtri_(char *, char *, integer *, doublereal + *, integer *, integer *, ftnlen, ftnlen); + integer lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + --work; + + /* Function Body */ + *info = 0; + nb = ilaenv_(&c__1, (char *)"DGETRI", (char *)" ", n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( + ftnlen)1); + lwkopt = *n * nb; + work[1] = (doublereal) lwkopt; + lquery = *lwork == -1; + if (*n < 0) { + *info = -1; + } else if (*lda < max(1,*n)) { + *info = -3; + } else if (*lwork < max(1,*n) && ! lquery) { + *info = -6; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGETRI", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* Form inv(U). If INFO > 0 from DTRTRI, then U is singular, */ +/* and the inverse is not computed. */ + + dtrtri_((char *)"Upper", (char *)"Non-unit", n, &a[a_offset], lda, info, (ftnlen)5, ( + ftnlen)8); + if (*info > 0) { + return 0; + } + + nbmin = 2; + ldwork = *n; + if (nb > 1 && nb < *n) { +/* Computing MAX */ + i__1 = ldwork * nb; + iws = max(i__1,1); + if (*lwork < iws) { + nb = *lwork / ldwork; +/* Computing MAX */ + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DGETRI", (char *)" ", n, &c_n1, &c_n1, & + c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } else { + iws = *n; + } + +/* Solve the equation inv(A)*L = inv(U) for inv(A). */ + + if (nb < nbmin || nb >= *n) { + +/* Use unblocked code. */ + + for (j = *n; j >= 1; --j) { + +/* Copy current column of L to WORK and replace with zeros. */ + + i__1 = *n; + for (i__ = j + 1; i__ <= i__1; ++i__) { + work[i__] = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = 0.; +/* L10: */ + } + +/* Compute current column of inv(A). */ + + if (j < *n) { + i__1 = *n - j; + dgemv_((char *)"No transpose", n, &i__1, &c_b20, &a[(j + 1) * a_dim1 + + 1], lda, &work[j + 1], &c__1, &c_b22, &a[j * a_dim1 + + 1], &c__1, (ftnlen)12); + } +/* L20: */ + } + } else { + +/* Use blocked code. */ + + nn = (*n - 1) / nb * nb + 1; + i__1 = -nb; + for (j = nn; i__1 < 0 ? j >= 1 : j <= 1; j += i__1) { +/* Computing MIN */ + i__2 = nb, i__3 = *n - j + 1; + jb = min(i__2,i__3); + +/* Copy current block column of L to WORK and replace with */ +/* zeros. */ + + i__2 = j + jb - 1; + for (jj = j; jj <= i__2; ++jj) { + i__3 = *n; + for (i__ = jj + 1; i__ <= i__3; ++i__) { + work[i__ + (jj - j) * ldwork] = a[i__ + jj * a_dim1]; + a[i__ + jj * a_dim1] = 0.; +/* L30: */ + } +/* L40: */ + } + +/* Compute current block column of inv(A). */ + + if (j + jb <= *n) { + i__2 = *n - j - jb + 1; + dgemm_((char *)"No transpose", (char *)"No transpose", n, &jb, &i__2, &c_b20, + &a[(j + jb) * a_dim1 + 1], lda, &work[j + jb], & + ldwork, &c_b22, &a[j * a_dim1 + 1], lda, (ftnlen)12, ( + ftnlen)12); + } + dtrsm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, &jb, &c_b22, & + work[j], &ldwork, &a[j * a_dim1 + 1], lda, (ftnlen)5, ( + ftnlen)5, (ftnlen)12, (ftnlen)4); +/* L50: */ + } + } + +/* Apply column interchanges. */ + + for (j = *n - 1; j >= 1; --j) { + jp = ipiv[j]; + if (jp != j) { + dswap_(n, &a[j * a_dim1 + 1], &c__1, &a[jp * a_dim1 + 1], &c__1); + } +/* L60: */ + } + + work[1] = (doublereal) iws; + return 0; + +/* End of DGETRI */ + +} /* dgetri_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dgetrs.cpp b/lib/linalg/dgetrs.cpp new file mode 100644 index 0000000000..4df18e8650 --- /dev/null +++ b/lib/linalg/dgetrs.cpp @@ -0,0 +1,272 @@ +/* fortran/dgetrs.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static doublereal c_b12 = 1.; +static integer c_n1 = -1; + +/* > \brief \b DGETRS */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DGETRS + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DGETRS( TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER TRANS */ +/* INTEGER INFO, LDA, LDB, N, NRHS */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IPIV( * ) */ +/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DGETRS solves a system of linear equations */ +/* > A * X = B or A**T * X = B */ +/* > with a general N-by-N matrix A using the LU factorization computed */ +/* > by DGETRF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > Specifies the form of the system of equations: */ +/* > = 'N': A * X = B (No transpose) */ +/* > = 'T': A**T* X = B (Transpose) */ +/* > = 'C': A**T* X = B (Conjugate transpose = Transpose) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NRHS */ +/* > \verbatim */ +/* > NRHS is INTEGER */ +/* > The number of right hand sides, i.e., the number of columns */ +/* > of the matrix B. NRHS >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > The factors L and U from the factorization A = P*L*U */ +/* > as computed by DGETRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] IPIV */ +/* > \verbatim */ +/* > IPIV is INTEGER array, dimension (N) */ +/* > The pivot indices from DGETRF; for 1<=i<=N, row i of the */ +/* > matrix was interchanged with row IPIV(i). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ +/* > On entry, the right hand side matrix B. */ +/* > On exit, the solution matrix X. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dgetrs_(char *trans, integer *n, integer *nrhs, + doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * + ldb, integer *info, ftnlen trans_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + + /* Local variables */ + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), xerbla_( + char *, integer *, ftnlen), dlaswp_(integer *, doublereal *, + integer *, integer *, integer *, integer *, integer *); + logical notran; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + *info = 0; + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_( + trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } else if (*ldb < max(1,*n)) { + *info = -8; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DGETRS", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0 || *nrhs == 0) { + return 0; + } + + if (notran) { + +/* Solve A * X = B. */ + +/* Apply row interchanges to the right hand sides. */ + + dlaswp_(nrhs, &b[b_offset], ldb, &c__1, n, &ipiv[1], &c__1); + +/* Solve L*X = B, overwriting B with X. */ + + dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, nrhs, &c_b12, &a[ + a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)12, (ftnlen)4); + +/* Solve U*X = B, overwriting B with X. */ + + dtrsm_((char *)"Left", (char *)"Upper", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b12, & + a[a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)12, (ftnlen)8); + } else { + +/* Solve A**T * X = B. */ + +/* Solve U**T *X = B, overwriting B with X. */ + + dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b12, &a[ + a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)9, (ftnlen)8); + +/* Solve L**T *X = B, overwriting B with X. */ + + dtrsm_((char *)"Left", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, nrhs, &c_b12, &a[ + a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)9, (ftnlen)4); + +/* Apply row interchanges to the solution vectors. */ + + dlaswp_(nrhs, &b[b_offset], ldb, &c__1, n, &ipiv[1], &c_n1); + } + + return 0; + +/* End of DGETRS */ + +} /* dgetrs_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/disnan.cpp b/lib/linalg/disnan.cpp new file mode 100644 index 0000000000..9e5bc1094e --- /dev/null +++ b/lib/linalg/disnan.cpp @@ -0,0 +1,14 @@ + +#include + +extern "C" { + +#include "lmp_f2c.h" + +logical disnan_(const doublereal *din) +{ + if (!din) return TRUE_; + + return std::isnan(*din) ? TRUE_ : FALSE_; +} +} diff --git a/lib/linalg/dlabad.cpp b/lib/linalg/dlabad.cpp new file mode 100644 index 0000000000..96eb6efcca --- /dev/null +++ b/lib/linalg/dlabad.cpp @@ -0,0 +1,128 @@ +/* fortran/dlabad.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLABAD */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLABAD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLABAD( SMALL, LARGE ) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION LARGE, SMALL */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLABAD takes as input the values computed by DLAMCH for underflow and */ +/* > overflow, and returns the square root of each of these values if the */ +/* > log of LARGE is sufficiently large. This subroutine is intended to */ +/* > identify machines with a large exponent range, such as the Crays, and */ +/* > redefine the underflow and overflow limits to be the square roots of */ +/* > the values computed by DLAMCH. This subroutine is needed because */ +/* > DLAMCH does not compensate for poor arithmetic in the upper half of */ +/* > the exponent range, as is found on a Cray. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in,out] SMALL */ +/* > \verbatim */ +/* > SMALL is DOUBLE PRECISION */ +/* > On entry, the underflow threshold as computed by DLAMCH. */ +/* > On exit, if LOG10(LARGE) is sufficiently large, the square */ +/* > root of SMALL, otherwise unchanged. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] LARGE */ +/* > \verbatim */ +/* > LARGE is DOUBLE PRECISION */ +/* > On entry, the overflow threshold as computed by DLAMCH. */ +/* > On exit, if LOG10(LARGE) is sufficiently large, the square */ +/* > root of LARGE, otherwise unchanged. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int dlabad_(doublereal *small, doublereal *large) +{ + /* Builtin functions */ + double d_lg10(doublereal *), sqrt(doublereal); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* If it looks like we're on a Cray, take the square root of */ +/* SMALL and LARGE to avoid overflow and underflow problems. */ + + if (d_lg10(large) > 2e3) { + *small = sqrt(*small); + *large = sqrt(*large); + } + + return 0; + +/* End of DLABAD */ + +} /* dlabad_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlabrd.cpp b/lib/linalg/dlabrd.cpp new file mode 100644 index 0000000000..5775cc7bc1 --- /dev/null +++ b/lib/linalg/dlabrd.cpp @@ -0,0 +1,532 @@ +/* fortran/dlabrd.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b4 = -1.; +static doublereal c_b5 = 1.; +static integer c__1 = 1; +static doublereal c_b16 = 0.; + +/* > \brief \b DLABRD reduces the first nb rows and columns of a general matrix to a bidiagonal form. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLABRD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLABRD( M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX, Y, */ +/* LDY ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER LDA, LDX, LDY, M, N, NB */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAUP( * ), */ +/* $ TAUQ( * ), X( LDX, * ), Y( LDY, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLABRD reduces the first NB rows and columns of a real general */ +/* > m by n matrix A to upper or lower bidiagonal form by an orthogonal */ +/* > transformation Q**T * A * P, and returns the matrices X and Y which */ +/* > are needed to apply the transformation to the unreduced part of A. */ +/* > */ +/* > If m >= n, A is reduced to upper bidiagonal form; if m < n, to lower */ +/* > bidiagonal form. */ +/* > */ +/* > This is an auxiliary routine called by DGEBRD */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows in the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns in the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NB */ +/* > \verbatim */ +/* > NB is INTEGER */ +/* > The number of leading rows and columns of A to be reduced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the m by n general matrix to be reduced. */ +/* > On exit, the first NB rows and columns of the matrix are */ +/* > overwritten; the rest of the array is unchanged. */ +/* > If m >= n, elements on and below the diagonal in the first NB */ +/* > columns, with the array TAUQ, represent the orthogonal */ +/* > matrix Q as a product of elementary reflectors; and */ +/* > elements above the diagonal in the first NB rows, with the */ +/* > array TAUP, represent the orthogonal matrix P as a product */ +/* > of elementary reflectors. */ +/* > If m < n, elements below the diagonal in the first NB */ +/* > columns, with the array TAUQ, represent the orthogonal */ +/* > matrix Q as a product of elementary reflectors, and */ +/* > elements on and above the diagonal in the first NB rows, */ +/* > with the array TAUP, represent the orthogonal matrix P as */ +/* > a product of elementary reflectors. */ +/* > See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (NB) */ +/* > The diagonal elements of the first NB rows and columns of */ +/* > the reduced matrix. D(i) = A(i,i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (NB) */ +/* > The off-diagonal elements of the first NB rows and columns of */ +/* > the reduced matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAUQ */ +/* > \verbatim */ +/* > TAUQ is DOUBLE PRECISION array, dimension (NB) */ +/* > The scalar factors of the elementary reflectors which */ +/* > represent the orthogonal matrix Q. See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAUP */ +/* > \verbatim */ +/* > TAUP is DOUBLE PRECISION array, dimension (NB) */ +/* > The scalar factors of the elementary reflectors which */ +/* > represent the orthogonal matrix P. See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION array, dimension (LDX,NB) */ +/* > The m-by-nb matrix X required to update the unreduced part */ +/* > of A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDX */ +/* > \verbatim */ +/* > LDX is INTEGER */ +/* > The leading dimension of the array X. LDX >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] Y */ +/* > \verbatim */ +/* > Y is DOUBLE PRECISION array, dimension (LDY,NB) */ +/* > The n-by-nb matrix Y required to update the unreduced part */ +/* > of A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDY */ +/* > \verbatim */ +/* > LDY is INTEGER */ +/* > The leading dimension of the array Y. LDY >= max(1,N). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The matrices Q and P are represented as products of elementary */ +/* > reflectors: */ +/* > */ +/* > Q = H(1) H(2) . . . H(nb) and P = G(1) G(2) . . . G(nb) */ +/* > */ +/* > Each H(i) and G(i) has the form: */ +/* > */ +/* > H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T */ +/* > */ +/* > where tauq and taup are real scalars, and v and u are real vectors. */ +/* > */ +/* > If m >= n, v(1:i-1) = 0, v(i) = 1, and v(i:m) is stored on exit in */ +/* > A(i:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+1:n) is stored on exit in */ +/* > A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i). */ +/* > */ +/* > If m < n, v(1:i) = 0, v(i+1) = 1, and v(i+1:m) is stored on exit in */ +/* > A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i:n) is stored on exit in */ +/* > A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i). */ +/* > */ +/* > The elements of the vectors v and u together form the m-by-nb matrix */ +/* > V and the nb-by-n matrix U**T which are needed, with X and Y, to apply */ +/* > the transformation to the unreduced part of the matrix, using a block */ +/* > update of the form: A := A - V*Y**T - X*U**T. */ +/* > */ +/* > The contents of A on exit are illustrated by the following examples */ +/* > with nb = 2: */ +/* > */ +/* > m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): */ +/* > */ +/* > ( 1 1 u1 u1 u1 ) ( 1 u1 u1 u1 u1 u1 ) */ +/* > ( v1 1 1 u2 u2 ) ( 1 1 u2 u2 u2 u2 ) */ +/* > ( v1 v2 a a a ) ( v1 1 a a a a ) */ +/* > ( v1 v2 a a a ) ( v1 v2 a a a a ) */ +/* > ( v1 v2 a a a ) ( v1 v2 a a a a ) */ +/* > ( v1 v2 a a a ) */ +/* > */ +/* > where a denotes an element of the original matrix which is unchanged, */ +/* > vi denotes an element of the vector defining H(i), and ui an element */ +/* > of the vector defining G(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlabrd_(integer *m, integer *n, integer *nb, doublereal * + a, integer *lda, doublereal *d__, doublereal *e, doublereal *tauq, + doublereal *taup, doublereal *x, integer *ldx, doublereal *y, integer + *ldy) +{ + /* System generated locals */ + integer a_dim1, a_offset, x_dim1, x_offset, y_dim1, y_offset, i__1, i__2, + i__3; + + /* Local variables */ + integer i__; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dgemv_(char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen), dlarfg_(integer *, doublereal *, + doublereal *, integer *, doublereal *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick return if possible */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --d__; + --e; + --tauq; + --taup; + x_dim1 = *ldx; + x_offset = 1 + x_dim1; + x -= x_offset; + y_dim1 = *ldy; + y_offset = 1 + y_dim1; + y -= y_offset; + + /* Function Body */ + if (*m <= 0 || *n <= 0) { + return 0; + } + + if (*m >= *n) { + +/* Reduce to upper bidiagonal form */ + + i__1 = *nb; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Update A(i:m,i) */ + + i__2 = *m - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + a_dim1], lda, + &y[i__ + y_dim1], ldy, &c_b5, &a[i__ + i__ * a_dim1], & + c__1, (ftnlen)12); + i__2 = *m - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + x_dim1], ldx, + &a[i__ * a_dim1 + 1], &c__1, &c_b5, &a[i__ + i__ * + a_dim1], &c__1, (ftnlen)12); + +/* Generate reflection Q(i) to annihilate A(i+1:m,i) */ + + i__2 = *m - i__ + 1; +/* Computing MIN */ + i__3 = i__ + 1; + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3,*m) + i__ * + a_dim1], &c__1, &tauq[i__]); + d__[i__] = a[i__ + i__ * a_dim1]; + if (i__ < *n) { + a[i__ + i__ * a_dim1] = 1.; + +/* Compute Y(i+1:n,i) */ + + i__2 = *m - i__ + 1; + i__3 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + (i__ + 1) * + a_dim1], lda, &a[i__ + i__ * a_dim1], &c__1, &c_b16, & + y[i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)9); + i__2 = *m - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + a_dim1], + lda, &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ * + y_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *n - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + 1 + + y_dim1], ldy, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[ + i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)12); + i__2 = *m - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &x[i__ + x_dim1], + ldx, &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ * + y_dim1 + 1], &c__1, (ftnlen)9); + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[(i__ + 1) * + a_dim1 + 1], lda, &y[i__ * y_dim1 + 1], &c__1, &c_b5, + &y[i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)9); + i__2 = *n - i__; + dscal_(&i__2, &tauq[i__], &y[i__ + 1 + i__ * y_dim1], &c__1); + +/* Update A(i,i+1:n) */ + + i__2 = *n - i__; + dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &y[i__ + 1 + + y_dim1], ldy, &a[i__ + a_dim1], lda, &c_b5, &a[i__ + ( + i__ + 1) * a_dim1], lda, (ftnlen)12); + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[(i__ + 1) * + a_dim1 + 1], lda, &x[i__ + x_dim1], ldx, &c_b5, &a[ + i__ + (i__ + 1) * a_dim1], lda, (ftnlen)9); + +/* Generate reflection P(i) to annihilate A(i,i+2:n) */ + + i__2 = *n - i__; +/* Computing MIN */ + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + (i__ + 1) * a_dim1], &a[i__ + min( + i__3,*n) * a_dim1], lda, &taup[i__]); + e[i__] = a[i__ + (i__ + 1) * a_dim1]; + a[i__ + (i__ + 1) * a_dim1] = 1.; + +/* Compute X(i+1:m,i) */ + + i__2 = *m - i__; + i__3 = *n - i__; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + (i__ + + 1) * a_dim1], lda, &a[i__ + (i__ + 1) * a_dim1], + lda, &c_b16, &x[i__ + 1 + i__ * x_dim1], &c__1, ( + ftnlen)12); + i__2 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__, &c_b5, &y[i__ + 1 + y_dim1], + ldy, &a[i__ + (i__ + 1) * a_dim1], lda, &c_b16, &x[ + i__ * x_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *m - i__; + dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &a[i__ + 1 + + a_dim1], lda, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ + i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[(i__ + 1) * + a_dim1 + 1], lda, &a[i__ + (i__ + 1) * a_dim1], lda, & + c_b16, &x[i__ * x_dim1 + 1], &c__1, (ftnlen)12); + i__2 = *m - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + 1 + + x_dim1], ldx, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ + i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + i__2 = *m - i__; + dscal_(&i__2, &taup[i__], &x[i__ + 1 + i__ * x_dim1], &c__1); + } +/* L10: */ + } + } else { + +/* Reduce to lower bidiagonal form */ + + i__1 = *nb; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Update A(i,i:n) */ + + i__2 = *n - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + y_dim1], ldy, + &a[i__ + a_dim1], lda, &c_b5, &a[i__ + i__ * a_dim1], + lda, (ftnlen)12); + i__2 = i__ - 1; + i__3 = *n - i__ + 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[i__ * a_dim1 + 1], + lda, &x[i__ + x_dim1], ldx, &c_b5, &a[i__ + i__ * a_dim1], + lda, (ftnlen)9); + +/* Generate reflection P(i) to annihilate A(i,i+1:n) */ + + i__2 = *n - i__ + 1; +/* Computing MIN */ + i__3 = i__ + 1; + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3,*n) * + a_dim1], lda, &taup[i__]); + d__[i__] = a[i__ + i__ * a_dim1]; + if (i__ < *m) { + a[i__ + i__ * a_dim1] = 1.; + +/* Compute X(i+1:m,i) */ + + i__2 = *m - i__; + i__3 = *n - i__ + 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + i__ * + a_dim1], lda, &a[i__ + i__ * a_dim1], lda, &c_b16, & + x[i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + i__2 = *n - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &y[i__ + y_dim1], + ldy, &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ * + x_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *m - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + 1 + + a_dim1], lda, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ + i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + i__2 = i__ - 1; + i__3 = *n - i__ + 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ * a_dim1 + + 1], lda, &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ * + x_dim1 + 1], &c__1, (ftnlen)12); + i__2 = *m - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + 1 + + x_dim1], ldx, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ + i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + i__2 = *m - i__; + dscal_(&i__2, &taup[i__], &x[i__ + 1 + i__ * x_dim1], &c__1); + +/* Update A(i+1:m,i) */ + + i__2 = *m - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + 1 + + a_dim1], lda, &y[i__ + y_dim1], ldy, &c_b5, &a[i__ + + 1 + i__ * a_dim1], &c__1, (ftnlen)12); + i__2 = *m - i__; + dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &x[i__ + 1 + + x_dim1], ldx, &a[i__ * a_dim1 + 1], &c__1, &c_b5, &a[ + i__ + 1 + i__ * a_dim1], &c__1, (ftnlen)12); + +/* Generate reflection Q(i) to annihilate A(i+2:m,i) */ + + i__2 = *m - i__; +/* Computing MIN */ + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*m) + + i__ * a_dim1], &c__1, &tauq[i__]); + e[i__] = a[i__ + 1 + i__ * a_dim1]; + a[i__ + 1 + i__ * a_dim1] = 1.; + +/* Compute Y(i+1:n,i) */ + + i__2 = *m - i__; + i__3 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + (i__ + + 1) * a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, + &c_b16, &y[i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)9); + i__2 = *m - i__; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + a_dim1], + lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[ + i__ * y_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *n - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + 1 + + y_dim1], ldy, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[ + i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)12); + i__2 = *m - i__; + dgemv_((char *)"Transpose", &i__2, &i__, &c_b5, &x[i__ + 1 + x_dim1], + ldx, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[ + i__ * y_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *n - i__; + dgemv_((char *)"Transpose", &i__, &i__2, &c_b4, &a[(i__ + 1) * a_dim1 + + 1], lda, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[i__ + + 1 + i__ * y_dim1], &c__1, (ftnlen)9); + i__2 = *n - i__; + dscal_(&i__2, &tauq[i__], &y[i__ + 1 + i__ * y_dim1], &c__1); + } +/* L20: */ + } + } + return 0; + +/* End of DLABRD */ + +} /* dlabrd_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlacn2.cpp b/lib/linalg/dlacn2.cpp new file mode 100644 index 0000000000..befb0b4e52 --- /dev/null +++ b/lib/linalg/dlacn2.cpp @@ -0,0 +1,364 @@ +/* fortran/dlacn2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matr +ix-vector products. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLACN2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLACN2( N, V, X, ISGN, EST, KASE, ISAVE ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER KASE, N */ +/* DOUBLE PRECISION EST */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER ISGN( * ), ISAVE( 3 ) */ +/* DOUBLE PRECISION V( * ), X( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLACN2 estimates the 1-norm of a square, real matrix A. */ +/* > Reverse communication is used for evaluating matrix-vector products. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix. N >= 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] V */ +/* > \verbatim */ +/* > V is DOUBLE PRECISION array, dimension (N) */ +/* > On the final return, V = A*W, where EST = norm(V)/norm(W) */ +/* > (W is not returned). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION array, dimension (N) */ +/* > On an intermediate return, X should be overwritten by */ +/* > A * X, if KASE=1, */ +/* > A**T * X, if KASE=2, */ +/* > and DLACN2 must be re-called with all the other parameters */ +/* > unchanged. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] ISGN */ +/* > \verbatim */ +/* > ISGN is INTEGER array, dimension (N) */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] EST */ +/* > \verbatim */ +/* > EST is DOUBLE PRECISION */ +/* > On entry with KASE = 1 or 2 and ISAVE(1) = 3, EST should be */ +/* > unchanged from the previous call to DLACN2. */ +/* > On exit, EST is an estimate (a lower bound) for norm(A). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] KASE */ +/* > \verbatim */ +/* > KASE is INTEGER */ +/* > On the initial call to DLACN2, KASE should be 0. */ +/* > On an intermediate return, KASE will be 1 or 2, indicating */ +/* > whether X should be overwritten by A * X or A**T * X. */ +/* > On the final return from DLACN2, KASE will again be 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] ISAVE */ +/* > \verbatim */ +/* > ISAVE is INTEGER array, dimension (3) */ +/* > ISAVE is used to save variables between calls to DLACN2 */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Originally named SONEST, dated March 16, 1988. */ +/* > */ +/* > This is a thread safe version of DLACON, which uses the array ISAVE */ +/* > in place of a SAVE statement, as follows: */ +/* > */ +/* > DLACON DLACN2 */ +/* > JUMP ISAVE(1) */ +/* > J ISAVE(2) */ +/* > ITER ISAVE(3) */ +/* > \endverbatim */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Nick Higham, University of Manchester */ + +/* > \par References: */ +/* ================ */ +/* > */ +/* > N.J. Higham, "FORTRAN codes for estimating the one-norm of */ +/* > a real or complex matrix, with applications to condition estimation", */ +/* > ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988. */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlacn2_(integer *n, doublereal *v, doublereal *x, + integer *isgn, doublereal *est, integer *kase, integer *isave) +{ + /* System generated locals */ + integer i__1; + doublereal d__1; + + /* Builtin functions */ + integer i_dnnt(doublereal *); + + /* Local variables */ + integer i__; + doublereal xs, temp; + extern doublereal dasum_(integer *, doublereal *, integer *); + integer jlast; + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); + extern integer idamax_(integer *, doublereal *, integer *); + doublereal altsgn, estold; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --isave; + --isgn; + --x; + --v; + + /* Function Body */ + if (*kase == 0) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + x[i__] = 1. / (doublereal) (*n); +/* L10: */ + } + *kase = 1; + isave[1] = 1; + return 0; + } + + switch (isave[1]) { + case 1: goto L20; + case 2: goto L40; + case 3: goto L70; + case 4: goto L110; + case 5: goto L140; + } + +/* ................ ENTRY (ISAVE( 1 ) = 1) */ +/* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY A*X. */ + +L20: + if (*n == 1) { + v[1] = x[1]; + *est = abs(v[1]); +/* ... QUIT */ + goto L150; + } + *est = dasum_(n, &x[1], &c__1); + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + if (x[i__] >= 0.) { + x[i__] = 1.; + } else { + x[i__] = -1.; + } + isgn[i__] = i_dnnt(&x[i__]); +/* L30: */ + } + *kase = 2; + isave[1] = 2; + return 0; + +/* ................ ENTRY (ISAVE( 1 ) = 2) */ +/* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X. */ + +L40: + isave[2] = idamax_(n, &x[1], &c__1); + isave[3] = 2; + +/* MAIN LOOP - ITERATIONS 2,3,...,ITMAX. */ + +L50: + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + x[i__] = 0.; +/* L60: */ + } + x[isave[2]] = 1.; + *kase = 1; + isave[1] = 3; + return 0; + +/* ................ ENTRY (ISAVE( 1 ) = 3) */ +/* X HAS BEEN OVERWRITTEN BY A*X. */ + +L70: + dcopy_(n, &x[1], &c__1, &v[1], &c__1); + estold = *est; + *est = dasum_(n, &v[1], &c__1); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + if (x[i__] >= 0.) { + xs = 1.; + } else { + xs = -1.; + } + if (i_dnnt(&xs) != isgn[i__]) { + goto L90; + } +/* L80: */ + } +/* REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED. */ + goto L120; + +L90: +/* TEST FOR CYCLING. */ + if (*est <= estold) { + goto L120; + } + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + if (x[i__] >= 0.) { + x[i__] = 1.; + } else { + x[i__] = -1.; + } + isgn[i__] = i_dnnt(&x[i__]); +/* L100: */ + } + *kase = 2; + isave[1] = 4; + return 0; + +/* ................ ENTRY (ISAVE( 1 ) = 4) */ +/* X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X. */ + +L110: + jlast = isave[2]; + isave[2] = idamax_(n, &x[1], &c__1); + if (x[jlast] != (d__1 = x[isave[2]], abs(d__1)) && isave[3] < 5) { + ++isave[3]; + goto L50; + } + +/* ITERATION COMPLETE. FINAL STAGE. */ + +L120: + altsgn = 1.; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + x[i__] = altsgn * ((doublereal) (i__ - 1) / (doublereal) (*n - 1) + + 1.); + altsgn = -altsgn; +/* L130: */ + } + *kase = 1; + isave[1] = 5; + return 0; + +/* ................ ENTRY (ISAVE( 1 ) = 5) */ +/* X HAS BEEN OVERWRITTEN BY A*X. */ + +L140: + temp = dasum_(n, &x[1], &c__1) / (doublereal) (*n * 3) * 2.; + if (temp > *est) { + dcopy_(n, &x[1], &c__1, &v[1], &c__1); + *est = temp; + } + +L150: + *kase = 0; + return 0; + +/* End of DLACN2 */ + +} /* dlacn2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlacpy.cpp b/lib/linalg/dlacpy.cpp new file mode 100644 index 0000000000..b1e62a5336 --- /dev/null +++ b/lib/linalg/dlacpy.cpp @@ -0,0 +1,200 @@ +/* fortran/dlacpy.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLACPY copies all or part of one two-dimensional array to another. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLACPY + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLACPY( UPLO, M, N, A, LDA, B, LDB ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER LDA, LDB, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLACPY copies all or part of a two-dimensional matrix A to another */ +/* > matrix B. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies the part of the matrix A to be copied to B. */ +/* > = 'U': Upper triangular part */ +/* > = 'L': Lower triangular part */ +/* > Otherwise: All of the matrix A */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > The m by n matrix A. If UPLO = 'U', only the upper triangle */ +/* > or trapezoid is accessed; if UPLO = 'L', only the lower */ +/* > triangle or trapezoid is accessed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB,N) */ +/* > On exit, B = A in the locations specified by UPLO. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >= max(1,M). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int dlacpy_(char *uplo, integer *m, integer *n, doublereal * + a, integer *lda, doublereal *b, integer *ldb, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; + + /* Local variables */ + integer i__, j; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = min(j,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; +/* L10: */ + } +/* L20: */ + } + } else if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = j; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; +/* L30: */ + } +/* L40: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; +/* L50: */ + } +/* L60: */ + } + } + return 0; + +/* End of DLACPY */ + +} /* dlacpy_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dladiv.cpp b/lib/linalg/dladiv.cpp new file mode 100644 index 0000000000..7ffd5485cc --- /dev/null +++ b/lib/linalg/dladiv.cpp @@ -0,0 +1,277 @@ +/* fortran/dladiv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLADIV performs complex division in real arithmetic, avoiding unnecessary overflow. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLADIV + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLADIV( A, B, C, D, P, Q ) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION A, B, C, D, P, Q */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLADIV performs complex division in real arithmetic */ +/* > */ +/* > a + i*b */ +/* > p + i*q = --------- */ +/* > c + i*d */ +/* > */ +/* > The algorithm is due to Michael Baudin and Robert L. Smith */ +/* > and can be found in the paper */ +/* > (char *)"A Robust Complex Division in Scilab" */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION */ +/* > The scalars a, b, c, and d in the above expression. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] P */ +/* > \verbatim */ +/* > P is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[out] Q */ +/* > \verbatim */ +/* > Q is DOUBLE PRECISION */ +/* > The scalars p and q in the above expression. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int dladiv_(doublereal *a, doublereal *b, doublereal *c__, + doublereal *d__, doublereal *p, doublereal *q) +{ + /* System generated locals */ + doublereal d__1, d__2; + + /* Local variables */ + doublereal s, aa, ab, bb, cc, cd, dd, be, un, ov, eps; + extern doublereal dlamch_(char *, ftnlen); + extern /* Subroutine */ int dladiv1_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + aa = *a; + bb = *b; + cc = *c__; + dd = *d__; +/* Computing MAX */ + d__1 = abs(*a), d__2 = abs(*b); + ab = max(d__1,d__2); +/* Computing MAX */ + d__1 = abs(*c__), d__2 = abs(*d__); + cd = max(d__1,d__2); + s = 1.; + ov = dlamch_((char *)"Overflow threshold", (ftnlen)18); + un = dlamch_((char *)"Safe minimum", (ftnlen)12); + eps = dlamch_((char *)"Epsilon", (ftnlen)7); + be = 2. / (eps * eps); + if (ab >= ov * .5) { + aa *= .5; + bb *= .5; + s *= 2.; + } + if (cd >= ov * .5) { + cc *= .5; + dd *= .5; + s *= .5; + } + if (ab <= un * 2. / eps) { + aa *= be; + bb *= be; + s /= be; + } + if (cd <= un * 2. / eps) { + cc *= be; + dd *= be; + s *= be; + } + if (abs(*d__) <= abs(*c__)) { + dladiv1_(&aa, &bb, &cc, &dd, p, q); + } else { + dladiv1_(&bb, &aa, &dd, &cc, p, q); + *q = -(*q); + } + *p *= s; + *q *= s; + + return 0; + +/* End of DLADIV */ + +} /* dladiv_ */ + +/* > \ingroup doubleOTHERauxiliary */ +/* Subroutine */ int dladiv1_(doublereal *a, doublereal *b, doublereal *c__, + doublereal *d__, doublereal *p, doublereal *q) +{ + doublereal r__, t; + extern doublereal dladiv2_(doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + r__ = *d__ / *c__; + t = 1. / (*c__ + *d__ * r__); + *p = dladiv2_(a, b, c__, d__, &r__, &t); + *a = -(*a); + *q = dladiv2_(b, a, c__, d__, &r__, &t); + + return 0; + +/* End of DLADIV1 */ + +} /* dladiv1_ */ + +/* > \ingroup doubleOTHERauxiliary */ +doublereal dladiv2_(doublereal *a, doublereal *b, doublereal *c__, doublereal + *d__, doublereal *r__, doublereal *t) +{ + /* System generated locals */ + doublereal ret_val; + + /* Local variables */ + doublereal br; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Executable Statements .. */ + + if (*r__ != 0.) { + br = *b * *r__; + if (br != 0.) { + ret_val = (*a + br) * *t; + } else { + ret_val = *a * *t + *b * *t * *r__; + } + } else { + ret_val = (*a + *d__ * (*b / *c__)) * *t; + } + + return ret_val; + +/* End of DLADIV2 */ + +} /* dladiv2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlae2.cpp b/lib/linalg/dlae2.cpp new file mode 100644 index 0000000000..2a1be2816d --- /dev/null +++ b/lib/linalg/dlae2.cpp @@ -0,0 +1,210 @@ +/* fortran/dlae2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAE2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAE2( A, B, C, RT1, RT2 ) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION A, B, C, RT1, RT2 */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix */ +/* > [ A B ] */ +/* > [ B C ]. */ +/* > On return, RT1 is the eigenvalue of larger absolute value, and RT2 */ +/* > is the eigenvalue of smaller absolute value. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION */ +/* > The (1,1) element of the 2-by-2 matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION */ +/* > The (1,2) and (2,1) elements of the 2-by-2 matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION */ +/* > The (2,2) element of the 2-by-2 matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RT1 */ +/* > \verbatim */ +/* > RT1 is DOUBLE PRECISION */ +/* > The eigenvalue of larger absolute value. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RT2 */ +/* > \verbatim */ +/* > RT2 is DOUBLE PRECISION */ +/* > The eigenvalue of smaller absolute value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > RT1 is accurate to a few ulps barring over/underflow. */ +/* > */ +/* > RT2 may be inaccurate if there is massive cancellation in the */ +/* > determinant A*C-B*B; higher precision or correctly rounded or */ +/* > correctly truncated arithmetic would be needed to compute RT2 */ +/* > accurately in all cases. */ +/* > */ +/* > Overflow is possible only if RT1 is within a factor of 5 of overflow. */ +/* > Underflow is harmless if the input data is 0 or exceeds */ +/* > underflow_threshold / macheps. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlae2_(doublereal *a, doublereal *b, doublereal *c__, + doublereal *rt1, doublereal *rt2) +{ + /* System generated locals */ + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal ab, df, tb, sm, rt, adf, acmn, acmx; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Compute the eigenvalues */ + + sm = *a + *c__; + df = *a - *c__; + adf = abs(df); + tb = *b + *b; + ab = abs(tb); + if (abs(*a) > abs(*c__)) { + acmx = *a; + acmn = *c__; + } else { + acmx = *c__; + acmn = *a; + } + if (adf > ab) { +/* Computing 2nd power */ + d__1 = ab / adf; + rt = adf * sqrt(d__1 * d__1 + 1.); + } else if (adf < ab) { +/* Computing 2nd power */ + d__1 = adf / ab; + rt = ab * sqrt(d__1 * d__1 + 1.); + } else { + +/* Includes case AB=ADF=0 */ + + rt = ab * sqrt(2.); + } + if (sm < 0.) { + *rt1 = (sm - rt) * .5; + +/* Order of execution important. */ +/* To get fully accurate smaller eigenvalue, */ +/* next line needs to be executed in higher precision. */ + + *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; + } else if (sm > 0.) { + *rt1 = (sm + rt) * .5; + +/* Order of execution important. */ +/* To get fully accurate smaller eigenvalue, */ +/* next line needs to be executed in higher precision. */ + + *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; + } else { + +/* Includes case RT1 = RT2 = 0 */ + + *rt1 = rt * .5; + *rt2 = rt * -.5; + } + return 0; + +/* End of DLAE2 */ + +} /* dlae2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaed0.cpp b/lib/linalg/dlaed0.cpp new file mode 100644 index 0000000000..41b13a3cac --- /dev/null +++ b/lib/linalg/dlaed0.cpp @@ -0,0 +1,534 @@ +/* fortran/dlaed0.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__9 = 9; +static integer c__0 = 0; +static integer c__2 = 2; +static doublereal c_b23 = 1.; +static doublereal c_b24 = 0.; +static integer c__1 = 1; + +/* > \brief \b DLAED0 used by DSTEDC. Computes all eigenvalues and corresponding eigenvectors of an unreduced +symmetric tridiagonal matrix using the divide and conquer method. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAED0 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAED0( ICOMPQ, QSIZ, N, D, E, Q, LDQ, QSTORE, LDQS, */ +/* WORK, IWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER ICOMPQ, INFO, LDQ, LDQS, N, QSIZ */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IWORK( * ) */ +/* DOUBLE PRECISION D( * ), E( * ), Q( LDQ, * ), QSTORE( LDQS, * ), */ +/* $ WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAED0 computes all eigenvalues and corresponding eigenvectors of a */ +/* > symmetric tridiagonal matrix using the divide and conquer method. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ICOMPQ */ +/* > \verbatim */ +/* > ICOMPQ is INTEGER */ +/* > = 0: Compute eigenvalues only. */ +/* > = 1: Compute eigenvectors of original dense symmetric matrix */ +/* > also. On entry, Q contains the orthogonal matrix used */ +/* > to reduce the original matrix to tridiagonal form. */ +/* > = 2: Compute eigenvalues and eigenvectors of tridiagonal */ +/* > matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] QSIZ */ +/* > \verbatim */ +/* > QSIZ is INTEGER */ +/* > The dimension of the orthogonal matrix used to reduce */ +/* > the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the main diagonal of the tridiagonal matrix. */ +/* > On exit, its eigenvalues. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > The off-diagonal elements of the tridiagonal matrix. */ +/* > On exit, E has been destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Q */ +/* > \verbatim */ +/* > Q is DOUBLE PRECISION array, dimension (LDQ, N) */ +/* > On entry, Q must contain an N-by-N orthogonal matrix. */ +/* > If ICOMPQ = 0 Q is not referenced. */ +/* > If ICOMPQ = 1 On entry, Q is a subset of the columns of the */ +/* > orthogonal matrix used to reduce the full */ +/* > matrix to tridiagonal form corresponding to */ +/* > the subset of the full matrix which is being */ +/* > decomposed at this time. */ +/* > If ICOMPQ = 2 On entry, Q will be the identity matrix. */ +/* > On exit, Q contains the eigenvectors of the */ +/* > tridiagonal matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQ */ +/* > \verbatim */ +/* > LDQ is INTEGER */ +/* > The leading dimension of the array Q. If eigenvectors are */ +/* > desired, then LDQ >= max(1,N). In any case, LDQ >= 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] QSTORE */ +/* > \verbatim */ +/* > QSTORE is DOUBLE PRECISION array, dimension (LDQS, N) */ +/* > Referenced only when ICOMPQ = 1. Used to store parts of */ +/* > the eigenvector matrix when the updating matrix multiplies */ +/* > take place. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQS */ +/* > \verbatim */ +/* > LDQS is INTEGER */ +/* > The leading dimension of the array QSTORE. If ICOMPQ = 1, */ +/* > then LDQS >= max(1,N). In any case, LDQS >= 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, */ +/* > If ICOMPQ = 0 or 1, the dimension of WORK must be at least */ +/* > 1 + 3*N + 2*N*lg N + 3*N**2 */ +/* > ( lg( N ) = smallest integer k */ +/* > such that 2^k >= N ) */ +/* > If ICOMPQ = 2, the dimension of WORK must be at least */ +/* > 4*N + N**2. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, */ +/* > If ICOMPQ = 0 or 1, the dimension of IWORK must be at least */ +/* > 6 + 6*N + 5*N*lg N. */ +/* > ( lg( N ) = smallest integer k */ +/* > such that 2^k >= N ) */ +/* > If ICOMPQ = 2, the dimension of IWORK must be at least */ +/* > 3 + 5*N. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: The algorithm failed to compute an eigenvalue while */ +/* > working on the submatrix lying in rows and columns */ +/* > INFO/(N+1) through mod(INFO,N+1). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Jeff Rutter, Computer Science Division, University of California */ +/* > at Berkeley, USA */ + +/* ===================================================================== */ +/* Subroutine */ int dlaed0_(integer *icompq, integer *qsiz, integer *n, + doublereal *d__, doublereal *e, doublereal *q, integer *ldq, + doublereal *qstore, integer *ldqs, doublereal *work, integer *iwork, + integer *info) +{ + /* System generated locals */ + integer q_dim1, q_offset, qstore_dim1, qstore_offset, i__1, i__2; + doublereal d__1; + + /* Builtin functions */ + double log(doublereal); + integer pow_ii(integer *, integer *); + + /* Local variables */ + integer i__, j, k, iq, lgn, msd2, smm1, spm1, spm2; + doublereal temp; + integer curr; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer iperm; + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); + integer indxq, iwrem; + extern /* Subroutine */ int dlaed1_(integer *, doublereal *, doublereal *, + integer *, integer *, doublereal *, integer *, doublereal *, + integer *, integer *); + integer iqptr; + extern /* Subroutine */ int dlaed7_(integer *, integer *, integer *, + integer *, integer *, integer *, doublereal *, doublereal *, + integer *, integer *, doublereal *, integer *, doublereal *, + integer *, integer *, integer *, integer *, integer *, doublereal + *, doublereal *, integer *, integer *); + integer tlvls; + extern /* Subroutine */ int dlacpy_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen); + integer igivcl; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + integer igivnm, submat, curprb, subpbs, igivpt; + extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + ftnlen); + integer curlvl, matsiz, iprmpt, smlsiz; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --e; + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + qstore_dim1 = *ldqs; + qstore_offset = 1 + qstore_dim1; + qstore -= qstore_offset; + --work; + --iwork; + + /* Function Body */ + *info = 0; + + if (*icompq < 0 || *icompq > 2) { + *info = -1; + } else if (*icompq == 1 && *qsiz < max(0,*n)) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*ldq < max(1,*n)) { + *info = -7; + } else if (*ldqs < max(1,*n)) { + *info = -9; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLAED0", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + smlsiz = ilaenv_(&c__9, (char *)"DLAED0", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( + ftnlen)6, (ftnlen)1); + +/* Determine the size and placement of the submatrices, and save in */ +/* the leading elements of IWORK. */ + + iwork[1] = *n; + subpbs = 1; + tlvls = 0; +L10: + if (iwork[subpbs] > smlsiz) { + for (j = subpbs; j >= 1; --j) { + iwork[j * 2] = (iwork[j] + 1) / 2; + iwork[(j << 1) - 1] = iwork[j] / 2; +/* L20: */ + } + ++tlvls; + subpbs <<= 1; + goto L10; + } + i__1 = subpbs; + for (j = 2; j <= i__1; ++j) { + iwork[j] += iwork[j - 1]; +/* L30: */ + } + +/* Divide the matrix into SUBPBS submatrices of size at most SMLSIZ+1 */ +/* using rank-1 modifications (cuts). */ + + spm1 = subpbs - 1; + i__1 = spm1; + for (i__ = 1; i__ <= i__1; ++i__) { + submat = iwork[i__] + 1; + smm1 = submat - 1; + d__[smm1] -= (d__1 = e[smm1], abs(d__1)); + d__[submat] -= (d__1 = e[smm1], abs(d__1)); +/* L40: */ + } + + indxq = (*n << 2) + 3; + if (*icompq != 2) { + +/* Set up workspaces for eigenvalues only/accumulate new vectors */ +/* routine */ + + temp = log((doublereal) (*n)) / log(2.); + lgn = (integer) temp; + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + iprmpt = indxq + *n + 1; + iperm = iprmpt + *n * lgn; + iqptr = iperm + *n * lgn; + igivpt = iqptr + *n + 2; + igivcl = igivpt + *n * lgn; + + igivnm = 1; + iq = igivnm + (*n << 1) * lgn; +/* Computing 2nd power */ + i__1 = *n; + iwrem = iq + i__1 * i__1 + 1; + +/* Initialize pointers */ + + i__1 = subpbs; + for (i__ = 0; i__ <= i__1; ++i__) { + iwork[iprmpt + i__] = 1; + iwork[igivpt + i__] = 1; +/* L50: */ + } + iwork[iqptr] = 1; + } + +/* Solve each submatrix eigenproblem at the bottom of the divide and */ +/* conquer tree. */ + + curr = 0; + i__1 = spm1; + for (i__ = 0; i__ <= i__1; ++i__) { + if (i__ == 0) { + submat = 1; + matsiz = iwork[1]; + } else { + submat = iwork[i__] + 1; + matsiz = iwork[i__ + 1] - iwork[i__]; + } + if (*icompq == 2) { + dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &q[submat + + submat * q_dim1], ldq, &work[1], info, (ftnlen)1); + if (*info != 0) { + goto L130; + } + } else { + dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &work[iq - 1 + + iwork[iqptr + curr]], &matsiz, &work[1], info, (ftnlen)1); + if (*info != 0) { + goto L130; + } + if (*icompq == 1) { + dgemm_((char *)"N", (char *)"N", qsiz, &matsiz, &matsiz, &c_b23, &q[submat * + q_dim1 + 1], ldq, &work[iq - 1 + iwork[iqptr + curr]], + &matsiz, &c_b24, &qstore[submat * qstore_dim1 + 1], + ldqs, (ftnlen)1, (ftnlen)1); + } +/* Computing 2nd power */ + i__2 = matsiz; + iwork[iqptr + curr + 1] = iwork[iqptr + curr] + i__2 * i__2; + ++curr; + } + k = 1; + i__2 = iwork[i__ + 1]; + for (j = submat; j <= i__2; ++j) { + iwork[indxq + j] = k; + ++k; +/* L60: */ + } +/* L70: */ + } + +/* Successively merge eigensystems of adjacent submatrices */ +/* into eigensystem for the corresponding larger matrix. */ + +/* while ( SUBPBS > 1 ) */ + + curlvl = 1; +L80: + if (subpbs > 1) { + spm2 = subpbs - 2; + i__1 = spm2; + for (i__ = 0; i__ <= i__1; i__ += 2) { + if (i__ == 0) { + submat = 1; + matsiz = iwork[2]; + msd2 = iwork[1]; + curprb = 0; + } else { + submat = iwork[i__] + 1; + matsiz = iwork[i__ + 2] - iwork[i__]; + msd2 = matsiz / 2; + ++curprb; + } + +/* Merge lower order eigensystems (of size MSD2 and MATSIZ - MSD2) */ +/* into an eigensystem of size MATSIZ. */ +/* DLAED1 is used only for the full eigensystem of a tridiagonal */ +/* matrix. */ +/* DLAED7 handles the cases in which eigenvalues only or eigenvalues */ +/* and eigenvectors of a full symmetric matrix (which was reduced to */ +/* tridiagonal form) are desired. */ + + if (*icompq == 2) { + dlaed1_(&matsiz, &d__[submat], &q[submat + submat * q_dim1], + ldq, &iwork[indxq + submat], &e[submat + msd2 - 1], & + msd2, &work[1], &iwork[subpbs + 1], info); + } else { + dlaed7_(icompq, &matsiz, qsiz, &tlvls, &curlvl, &curprb, &d__[ + submat], &qstore[submat * qstore_dim1 + 1], ldqs, & + iwork[indxq + submat], &e[submat + msd2 - 1], &msd2, & + work[iq], &iwork[iqptr], &iwork[iprmpt], &iwork[iperm] + , &iwork[igivpt], &iwork[igivcl], &work[igivnm], & + work[iwrem], &iwork[subpbs + 1], info); + } + if (*info != 0) { + goto L130; + } + iwork[i__ / 2 + 1] = iwork[i__ + 2]; +/* L90: */ + } + subpbs /= 2; + ++curlvl; + goto L80; + } + +/* end while */ + +/* Re-merge the eigenvalues/vectors which were deflated at the final */ +/* merge step. */ + + if (*icompq == 1) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + j = iwork[indxq + i__]; + work[i__] = d__[j]; + dcopy_(qsiz, &qstore[j * qstore_dim1 + 1], &c__1, &q[i__ * q_dim1 + + 1], &c__1); +/* L100: */ + } + dcopy_(n, &work[1], &c__1, &d__[1], &c__1); + } else if (*icompq == 2) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + j = iwork[indxq + i__]; + work[i__] = d__[j]; + dcopy_(n, &q[j * q_dim1 + 1], &c__1, &work[*n * i__ + 1], &c__1); +/* L110: */ + } + dcopy_(n, &work[1], &c__1, &d__[1], &c__1); + dlacpy_((char *)"A", n, n, &work[*n + 1], n, &q[q_offset], ldq, (ftnlen)1); + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + j = iwork[indxq + i__]; + work[i__] = d__[j]; +/* L120: */ + } + dcopy_(n, &work[1], &c__1, &d__[1], &c__1); + } + goto L140; + +L130: + *info = submat * (*n + 1) + submat + matsiz - 1; + +L140: + return 0; + +/* End of DLAED0 */ + +} /* dlaed0_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaed1.cpp b/lib/linalg/dlaed1.cpp new file mode 100644 index 0000000000..a448e3363e --- /dev/null +++ b/lib/linalg/dlaed1.cpp @@ -0,0 +1,336 @@ +/* fortran/dlaed1.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; + +/* > \brief \b DLAED1 used by DSTEDC. Computes the updated eigensystem of a diagonal matrix after modification + by a rank-one symmetric matrix. Used when the original matrix is tridiagonal. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAED1 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAED1( N, D, Q, LDQ, INDXQ, RHO, CUTPNT, WORK, IWORK, */ +/* INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER CUTPNT, INFO, LDQ, N */ +/* DOUBLE PRECISION RHO */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER INDXQ( * ), IWORK( * ) */ +/* DOUBLE PRECISION D( * ), Q( LDQ, * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAED1 computes the updated eigensystem of a diagonal */ +/* > matrix after modification by a rank-one symmetric matrix. This */ +/* > routine is used only for the eigenproblem which requires all */ +/* > eigenvalues and eigenvectors of a tridiagonal matrix. DLAED7 handles */ +/* > the case in which eigenvalues only or eigenvalues and eigenvectors */ +/* > of a full symmetric matrix (which was reduced to tridiagonal form) */ +/* > are desired. */ +/* > */ +/* > T = Q(in) ( D(in) + RHO * Z*Z**T ) Q**T(in) = Q(out) * D(out) * Q**T(out) */ +/* > */ +/* > where Z = Q**T*u, u is a vector of length N with ones in the */ +/* > CUTPNT and CUTPNT + 1 th elements and zeros elsewhere. */ +/* > */ +/* > The eigenvectors of the original matrix are stored in Q, and the */ +/* > eigenvalues are in D. The algorithm consists of three stages: */ +/* > */ +/* > The first stage consists of deflating the size of the problem */ +/* > when there are multiple eigenvalues or if there is a zero in */ +/* > the Z vector. For each such occurrence the dimension of the */ +/* > secular equation problem is reduced by one. This stage is */ +/* > performed by the routine DLAED2. */ +/* > */ +/* > The second stage consists of calculating the updated */ +/* > eigenvalues. This is done by finding the roots of the secular */ +/* > equation via the routine DLAED4 (as called by DLAED3). */ +/* > This routine also calculates the eigenvectors of the current */ +/* > problem. */ +/* > */ +/* > The final stage consists of computing the updated eigenvectors */ +/* > directly using the updated eigenvalues. The eigenvectors for */ +/* > the current problem are multiplied with the eigenvectors from */ +/* > the overall problem. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the eigenvalues of the rank-1-perturbed matrix. */ +/* > On exit, the eigenvalues of the repaired matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Q */ +/* > \verbatim */ +/* > Q is DOUBLE PRECISION array, dimension (LDQ,N) */ +/* > On entry, the eigenvectors of the rank-1-perturbed matrix. */ +/* > On exit, the eigenvectors of the repaired tridiagonal matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQ */ +/* > \verbatim */ +/* > LDQ is INTEGER */ +/* > The leading dimension of the array Q. LDQ >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] INDXQ */ +/* > \verbatim */ +/* > INDXQ is INTEGER array, dimension (N) */ +/* > On entry, the permutation which separately sorts the two */ +/* > subproblems in D into ascending order. */ +/* > On exit, the permutation which will reintegrate the */ +/* > subproblems back into sorted order, */ +/* > i.e. D( INDXQ( I = 1, N ) ) will be in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > The subdiagonal entry used to create the rank-1 modification. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CUTPNT */ +/* > \verbatim */ +/* > CUTPNT is INTEGER */ +/* > The location of the last eigenvalue in the leading sub-matrix. */ +/* > min(1,N) <= CUTPNT <= N/2. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (4*N + N**2) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension (4*N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: if INFO = 1, an eigenvalue did not converge */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Jeff Rutter, Computer Science Division, University of California */ +/* > at Berkeley, USA \n */ +/* > Modified by Francoise Tisseur, University of Tennessee */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlaed1_(integer *n, doublereal *d__, doublereal *q, + integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, + doublereal *work, integer *iwork, integer *info) +{ + /* System generated locals */ + integer q_dim1, q_offset, i__1, i__2; + + /* Local variables */ + integer i__, k, n1, n2, is, iw, iz, iq2, zpp1, indx, indxc; + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); + integer indxp; + extern /* Subroutine */ int dlaed2_(integer *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *, integer *, integer *, integer *), dlaed3_(integer *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, doublereal *, doublereal *, integer *, integer *, + doublereal *, doublereal *, integer *); + integer idlmda; + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen); + integer coltyp; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + --indxq; + --work; + --iwork; + + /* Function Body */ + *info = 0; + + if (*n < 0) { + *info = -1; + } else if (*ldq < max(1,*n)) { + *info = -4; + } else /* if(complicated condition) */ { +/* Computing MIN */ + i__1 = 1, i__2 = *n / 2; + if (min(i__1,i__2) > *cutpnt || *n / 2 < *cutpnt) { + *info = -7; + } + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLAED1", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* The following values are integer pointers which indicate */ +/* the portion of the workspace */ +/* used by a particular array in DLAED2 and DLAED3. */ + + iz = 1; + idlmda = iz + *n; + iw = idlmda + *n; + iq2 = iw + *n; + + indx = 1; + indxc = indx + *n; + coltyp = indxc + *n; + indxp = coltyp + *n; + + +/* Form the z-vector which consists of the last row of Q_1 and the */ +/* first row of Q_2. */ + + dcopy_(cutpnt, &q[*cutpnt + q_dim1], ldq, &work[iz], &c__1); + zpp1 = *cutpnt + 1; + i__1 = *n - *cutpnt; + dcopy_(&i__1, &q[zpp1 + zpp1 * q_dim1], ldq, &work[iz + *cutpnt], &c__1); + +/* Deflate eigenvalues. */ + + dlaed2_(&k, n, cutpnt, &d__[1], &q[q_offset], ldq, &indxq[1], rho, &work[ + iz], &work[idlmda], &work[iw], &work[iq2], &iwork[indx], &iwork[ + indxc], &iwork[indxp], &iwork[coltyp], info); + + if (*info != 0) { + goto L20; + } + +/* Solve Secular Equation. */ + + if (k != 0) { + is = (iwork[coltyp] + iwork[coltyp + 1]) * *cutpnt + (iwork[coltyp + + 1] + iwork[coltyp + 2]) * (*n - *cutpnt) + iq2; + dlaed3_(&k, n, cutpnt, &d__[1], &q[q_offset], ldq, rho, &work[idlmda], + &work[iq2], &iwork[indxc], &iwork[coltyp], &work[iw], &work[ + is], info); + if (*info != 0) { + goto L20; + } + +/* Prepare the INDXQ sorting permutation. */ + + n1 = k; + n2 = *n - k; + dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + indxq[i__] = i__; +/* L10: */ + } + } + +L20: + return 0; + +/* End of DLAED1 */ + +} /* dlaed1_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaed2.cpp b/lib/linalg/dlaed2.cpp new file mode 100644 index 0000000000..746c07ba33 --- /dev/null +++ b/lib/linalg/dlaed2.cpp @@ -0,0 +1,646 @@ +/* fortran/dlaed2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b3 = -1.; +static integer c__1 = 1; + +/* > \brief \b DLAED2 used by DSTEDC. Merges eigenvalues and deflates secular equation. Used when the original + matrix is tridiagonal. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAED2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAED2( K, N, N1, D, Q, LDQ, INDXQ, RHO, Z, DLAMDA, W, */ +/* Q2, INDX, INDXC, INDXP, COLTYP, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDQ, N, N1 */ +/* DOUBLE PRECISION RHO */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER COLTYP( * ), INDX( * ), INDXC( * ), INDXP( * ), */ +/* $ INDXQ( * ) */ +/* DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), Q2( * ), */ +/* $ W( * ), Z( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAED2 merges the two sets of eigenvalues together into a single */ +/* > sorted set. Then it tries to deflate the size of the problem. */ +/* > There are two ways in which deflation can occur: when two or more */ +/* > eigenvalues are close together or if there is a tiny entry in the */ +/* > Z vector. For each such occurrence the order of the related secular */ +/* > equation problem is reduced by one. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[out] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of non-deflated eigenvalues, and the order of the */ +/* > related secular equation. 0 <= K <=N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N1 */ +/* > \verbatim */ +/* > N1 is INTEGER */ +/* > The location of the last eigenvalue in the leading sub-matrix. */ +/* > min(1,N) <= N1 <= N/2. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, D contains the eigenvalues of the two submatrices to */ +/* > be combined. */ +/* > On exit, D contains the trailing (N-K) updated eigenvalues */ +/* > (those which were deflated) sorted into increasing order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Q */ +/* > \verbatim */ +/* > Q is DOUBLE PRECISION array, dimension (LDQ, N) */ +/* > On entry, Q contains the eigenvectors of two submatrices in */ +/* > the two square blocks with corners at (1,1), (N1,N1) */ +/* > and (N1+1, N1+1), (N,N). */ +/* > On exit, Q contains the trailing (N-K) updated eigenvectors */ +/* > (those which were deflated) in its last N-K columns. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQ */ +/* > \verbatim */ +/* > LDQ is INTEGER */ +/* > The leading dimension of the array Q. LDQ >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] INDXQ */ +/* > \verbatim */ +/* > INDXQ is INTEGER array, dimension (N) */ +/* > The permutation which separately sorts the two sub-problems */ +/* > in D into ascending order. Note that elements in the second */ +/* > half of this permutation must first have N1 added to their */ +/* > values. Destroyed on exit. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > On entry, the off-diagonal element associated with the rank-1 */ +/* > cut which originally split the two submatrices which are now */ +/* > being recombined. */ +/* > On exit, RHO has been modified to the value required by */ +/* > DLAED3. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, Z contains the updating vector (the last */ +/* > row of the first sub-eigenvector matrix and the first row of */ +/* > the second sub-eigenvector matrix). */ +/* > On exit, the contents of Z have been destroyed by the updating */ +/* > process. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DLAMDA */ +/* > \verbatim */ +/* > DLAMDA is DOUBLE PRECISION array, dimension (N) */ +/* > A copy of the first K eigenvalues which will be used by */ +/* > DLAED3 to form the secular equation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] W */ +/* > \verbatim */ +/* > W is DOUBLE PRECISION array, dimension (N) */ +/* > The first k values of the final deflation-altered z-vector */ +/* > which will be passed to DLAED3. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] Q2 */ +/* > \verbatim */ +/* > Q2 is DOUBLE PRECISION array, dimension (N1**2+(N-N1)**2) */ +/* > A copy of the first K eigenvectors which will be used by */ +/* > DLAED3 in a matrix multiply (DGEMM) to solve for the new */ +/* > eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INDX */ +/* > \verbatim */ +/* > INDX is INTEGER array, dimension (N) */ +/* > The permutation used to sort the contents of DLAMDA into */ +/* > ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INDXC */ +/* > \verbatim */ +/* > INDXC is INTEGER array, dimension (N) */ +/* > The permutation used to arrange the columns of the deflated */ +/* > Q matrix into three groups: the first group contains non-zero */ +/* > elements only at and above N1, the second contains */ +/* > non-zero elements only below N1, and the third is dense. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INDXP */ +/* > \verbatim */ +/* > INDXP is INTEGER array, dimension (N) */ +/* > The permutation used to place deflated values of D at the end */ +/* > of the array. INDXP(1:K) points to the nondeflated D-values */ +/* > and INDXP(K+1:N) points to the deflated eigenvalues. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] COLTYP */ +/* > \verbatim */ +/* > COLTYP is INTEGER array, dimension (N) */ +/* > During execution, a label which will indicate which of the */ +/* > following types a column in the Q2 matrix is: */ +/* > 1 : non-zero in the upper half only; */ +/* > 2 : dense; */ +/* > 3 : non-zero in the lower half only; */ +/* > 4 : deflated. */ +/* > On exit, COLTYP(i) is the number of columns of type i, */ +/* > for i=1 to 4 only. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Jeff Rutter, Computer Science Division, University of California */ +/* > at Berkeley, USA \n */ +/* > Modified by Francoise Tisseur, University of Tennessee */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlaed2_(integer *k, integer *n, integer *n1, doublereal * + d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, + doublereal *z__, doublereal *dlamda, doublereal *w, doublereal *q2, + integer *indx, integer *indxc, integer *indxp, integer *coltyp, + integer *info) +{ + /* System generated locals */ + integer q_dim1, q_offset, i__1, i__2; + doublereal d__1, d__2, d__3, d__4; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal c__; + integer i__, j; + doublereal s, t; + integer k2, n2, ct, nj, pj, js, iq1, iq2, n1p1; + doublereal eps, tau, tol; + integer psm[4], imax, jmax; + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *); + integer ctot[4]; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dcopy_(integer *, doublereal *, integer *, doublereal + *, integer *); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); + extern integer idamax_(integer *, doublereal *, integer *); + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), dlacpy_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Arrays .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + --indxq; + --z__; + --dlamda; + --w; + --q2; + --indx; + --indxc; + --indxp; + --coltyp; + + /* Function Body */ + *info = 0; + + if (*n < 0) { + *info = -2; + } else if (*ldq < max(1,*n)) { + *info = -6; + } else /* if(complicated condition) */ { +/* Computing MIN */ + i__1 = 1, i__2 = *n / 2; + if (min(i__1,i__2) > *n1 || *n / 2 < *n1) { + *info = -3; + } + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLAED2", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + n2 = *n - *n1; + n1p1 = *n1 + 1; + + if (*rho < 0.) { + dscal_(&n2, &c_b3, &z__[n1p1], &c__1); + } + +/* Normalize z so that norm(z) = 1. Since z is the concatenation of */ +/* two normalized vectors, norm2(z) = sqrt(2). */ + + t = 1. / sqrt(2.); + dscal_(n, &t, &z__[1], &c__1); + +/* RHO = ABS( norm(z)**2 * RHO ) */ + + *rho = (d__1 = *rho * 2., abs(d__1)); + +/* Sort the eigenvalues into increasing order */ + + i__1 = *n; + for (i__ = n1p1; i__ <= i__1; ++i__) { + indxq[i__] += *n1; +/* L10: */ + } + +/* re-integrate the deflated parts from the last pass */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dlamda[i__] = d__[indxq[i__]]; +/* L20: */ + } + dlamrg_(n1, &n2, &dlamda[1], &c__1, &c__1, &indxc[1]); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + indx[i__] = indxq[indxc[i__]]; +/* L30: */ + } + +/* Calculate the allowable deflation tolerance */ + + imax = idamax_(n, &z__[1], &c__1); + jmax = idamax_(n, &d__[1], &c__1); + eps = dlamch_((char *)"Epsilon", (ftnlen)7); +/* Computing MAX */ + d__3 = (d__1 = d__[jmax], abs(d__1)), d__4 = (d__2 = z__[imax], abs(d__2)) + ; + tol = eps * 8. * max(d__3,d__4); + +/* If the rank-1 modifier is small enough, no more needs to be done */ +/* except to reorganize Q so that its columns correspond with the */ +/* elements in D. */ + + if (*rho * (d__1 = z__[imax], abs(d__1)) <= tol) { + *k = 0; + iq2 = 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__ = indx[j]; + dcopy_(n, &q[i__ * q_dim1 + 1], &c__1, &q2[iq2], &c__1); + dlamda[j] = d__[i__]; + iq2 += *n; +/* L40: */ + } + dlacpy_((char *)"A", n, n, &q2[1], n, &q[q_offset], ldq, (ftnlen)1); + dcopy_(n, &dlamda[1], &c__1, &d__[1], &c__1); + goto L190; + } + +/* If there are multiple eigenvalues then the problem deflates. Here */ +/* the number of equal eigenvalues are found. As each equal */ +/* eigenvalue is found, an elementary reflector is computed to rotate */ +/* the corresponding eigensubspace so that the corresponding */ +/* components of Z are zero in this new basis. */ + + i__1 = *n1; + for (i__ = 1; i__ <= i__1; ++i__) { + coltyp[i__] = 1; +/* L50: */ + } + i__1 = *n; + for (i__ = n1p1; i__ <= i__1; ++i__) { + coltyp[i__] = 3; +/* L60: */ + } + + + *k = 0; + k2 = *n + 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + nj = indx[j]; + if (*rho * (d__1 = z__[nj], abs(d__1)) <= tol) { + +/* Deflate due to small z component. */ + + --k2; + coltyp[nj] = 4; + indxp[k2] = nj; + if (j == *n) { + goto L100; + } + } else { + pj = nj; + goto L80; + } +/* L70: */ + } +L80: + ++j; + nj = indx[j]; + if (j > *n) { + goto L100; + } + if (*rho * (d__1 = z__[nj], abs(d__1)) <= tol) { + +/* Deflate due to small z component. */ + + --k2; + coltyp[nj] = 4; + indxp[k2] = nj; + } else { + +/* Check if eigenvalues are close enough to allow deflation. */ + + s = z__[pj]; + c__ = z__[nj]; + +/* Find sqrt(a**2+b**2) without overflow or */ +/* destructive underflow. */ + + tau = dlapy2_(&c__, &s); + t = d__[nj] - d__[pj]; + c__ /= tau; + s = -s / tau; + if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { + +/* Deflation is possible. */ + + z__[nj] = tau; + z__[pj] = 0.; + if (coltyp[nj] != coltyp[pj]) { + coltyp[nj] = 2; + } + coltyp[pj] = 4; + drot_(n, &q[pj * q_dim1 + 1], &c__1, &q[nj * q_dim1 + 1], &c__1, & + c__, &s); +/* Computing 2nd power */ + d__1 = c__; +/* Computing 2nd power */ + d__2 = s; + t = d__[pj] * (d__1 * d__1) + d__[nj] * (d__2 * d__2); +/* Computing 2nd power */ + d__1 = s; +/* Computing 2nd power */ + d__2 = c__; + d__[nj] = d__[pj] * (d__1 * d__1) + d__[nj] * (d__2 * d__2); + d__[pj] = t; + --k2; + i__ = 1; +L90: + if (k2 + i__ <= *n) { + if (d__[pj] < d__[indxp[k2 + i__]]) { + indxp[k2 + i__ - 1] = indxp[k2 + i__]; + indxp[k2 + i__] = pj; + ++i__; + goto L90; + } else { + indxp[k2 + i__ - 1] = pj; + } + } else { + indxp[k2 + i__ - 1] = pj; + } + pj = nj; + } else { + ++(*k); + dlamda[*k] = d__[pj]; + w[*k] = z__[pj]; + indxp[*k] = pj; + pj = nj; + } + } + goto L80; +L100: + +/* Record the last eigenvalue. */ + + ++(*k); + dlamda[*k] = d__[pj]; + w[*k] = z__[pj]; + indxp[*k] = pj; + +/* Count up the total number of the various types of columns, then */ +/* form a permutation which positions the four column types into */ +/* four uniform groups (although one or more of these groups may be */ +/* empty). */ + + for (j = 1; j <= 4; ++j) { + ctot[j - 1] = 0; +/* L110: */ + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + ct = coltyp[j]; + ++ctot[ct - 1]; +/* L120: */ + } + +/* PSM(*) = Position in SubMatrix (of types 1 through 4) */ + + psm[0] = 1; + psm[1] = ctot[0] + 1; + psm[2] = psm[1] + ctot[1]; + psm[3] = psm[2] + ctot[2]; + *k = *n - ctot[3]; + +/* Fill out the INDXC array so that the permutation which it induces */ +/* will place all type-1 columns first, all type-2 columns next, */ +/* then all type-3's, and finally all type-4's. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + js = indxp[j]; + ct = coltyp[js]; + indx[psm[ct - 1]] = js; + indxc[psm[ct - 1]] = j; + ++psm[ct - 1]; +/* L130: */ + } + +/* Sort the eigenvalues and corresponding eigenvectors into DLAMDA */ +/* and Q2 respectively. The eigenvalues/vectors which were not */ +/* deflated go into the first K slots of DLAMDA and Q2 respectively, */ +/* while those which were deflated go into the last N - K slots. */ + + i__ = 1; + iq1 = 1; + iq2 = (ctot[0] + ctot[1]) * *n1 + 1; + i__1 = ctot[0]; + for (j = 1; j <= i__1; ++j) { + js = indx[i__]; + dcopy_(n1, &q[js * q_dim1 + 1], &c__1, &q2[iq1], &c__1); + z__[i__] = d__[js]; + ++i__; + iq1 += *n1; +/* L140: */ + } + + i__1 = ctot[1]; + for (j = 1; j <= i__1; ++j) { + js = indx[i__]; + dcopy_(n1, &q[js * q_dim1 + 1], &c__1, &q2[iq1], &c__1); + dcopy_(&n2, &q[*n1 + 1 + js * q_dim1], &c__1, &q2[iq2], &c__1); + z__[i__] = d__[js]; + ++i__; + iq1 += *n1; + iq2 += n2; +/* L150: */ + } + + i__1 = ctot[2]; + for (j = 1; j <= i__1; ++j) { + js = indx[i__]; + dcopy_(&n2, &q[*n1 + 1 + js * q_dim1], &c__1, &q2[iq2], &c__1); + z__[i__] = d__[js]; + ++i__; + iq2 += n2; +/* L160: */ + } + + iq1 = iq2; + i__1 = ctot[3]; + for (j = 1; j <= i__1; ++j) { + js = indx[i__]; + dcopy_(n, &q[js * q_dim1 + 1], &c__1, &q2[iq2], &c__1); + iq2 += *n; + z__[i__] = d__[js]; + ++i__; +/* L170: */ + } + +/* The deflated eigenvalues and their corresponding vectors go back */ +/* into the last N - K slots of D and Q respectively. */ + + if (*k < *n) { + dlacpy_((char *)"A", n, &ctot[3], &q2[iq1], n, &q[(*k + 1) * q_dim1 + 1], ldq, + (ftnlen)1); + i__1 = *n - *k; + dcopy_(&i__1, &z__[*k + 1], &c__1, &d__[*k + 1], &c__1); + } + +/* Copy CTOT into COLTYP for referencing in DLAED3. */ + + for (j = 1; j <= 4; ++j) { + coltyp[j] = ctot[j - 1]; +/* L180: */ + } + +L190: + return 0; + +/* End of DLAED2 */ + +} /* dlaed2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaed3.cpp b/lib/linalg/dlaed3.cpp new file mode 100644 index 0000000000..e56c3fb41b --- /dev/null +++ b/lib/linalg/dlaed3.cpp @@ -0,0 +1,437 @@ +/* fortran/dlaed3.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static doublereal c_b22 = 1.; +static doublereal c_b23 = 0.; + +/* > \brief \b DLAED3 used by DSTEDC. Finds the roots of the secular equation and updates the eigenvectors. Us +ed when the original matrix is tridiagonal. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAED3 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAED3( K, N, N1, D, Q, LDQ, RHO, DLAMDA, Q2, INDX, */ +/* CTOT, W, S, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDQ, N, N1 */ +/* DOUBLE PRECISION RHO */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER CTOT( * ), INDX( * ) */ +/* DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), Q2( * ), */ +/* $ S( * ), W( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAED3 finds the roots of the secular equation, as defined by the */ +/* > values in D, W, and RHO, between 1 and K. It makes the */ +/* > appropriate calls to DLAED4 and then updates the eigenvectors by */ +/* > multiplying the matrix of eigenvectors of the pair of eigensystems */ +/* > being combined by the matrix of eigenvectors of the K-by-K system */ +/* > which is solved here. */ +/* > */ +/* > This code makes very mild assumptions about floating point */ +/* > arithmetic. It will work on machines with a guard digit in */ +/* > add/subtract, or on those binary machines without guard digits */ +/* > which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. */ +/* > It could conceivably fail on hexadecimal or decimal machines */ +/* > without guard digits, but we know of none. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of terms in the rational function to be solved by */ +/* > DLAED4. K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of rows and columns in the Q matrix. */ +/* > N >= K (deflation may result in N>K). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N1 */ +/* > \verbatim */ +/* > N1 is INTEGER */ +/* > The location of the last eigenvalue in the leading submatrix. */ +/* > min(1,N) <= N1 <= N/2. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > D(I) contains the updated eigenvalues for */ +/* > 1 <= I <= K. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] Q */ +/* > \verbatim */ +/* > Q is DOUBLE PRECISION array, dimension (LDQ,N) */ +/* > Initially the first K columns are used as workspace. */ +/* > On output the columns 1 to K contain */ +/* > the updated eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQ */ +/* > \verbatim */ +/* > LDQ is INTEGER */ +/* > The leading dimension of the array Q. LDQ >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > The value of the parameter in the rank one update equation. */ +/* > RHO >= 0 required. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DLAMDA */ +/* > \verbatim */ +/* > DLAMDA is DOUBLE PRECISION array, dimension (K) */ +/* > The first K elements of this array contain the old roots */ +/* > of the deflated updating problem. These are the poles */ +/* > of the secular equation. May be changed on output by */ +/* > having lowest order bit set to zero on Cray X-MP, Cray Y-MP, */ +/* > Cray-2, or Cray C-90, as described above. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Q2 */ +/* > \verbatim */ +/* > Q2 is DOUBLE PRECISION array, dimension (LDQ2*N) */ +/* > The first K columns of this matrix contain the non-deflated */ +/* > eigenvectors for the split problem. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INDX */ +/* > \verbatim */ +/* > INDX is INTEGER array, dimension (N) */ +/* > The permutation used to arrange the columns of the deflated */ +/* > Q matrix into three groups (see DLAED2). */ +/* > The rows of the eigenvectors found by DLAED4 must be likewise */ +/* > permuted before the matrix multiply can take place. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CTOT */ +/* > \verbatim */ +/* > CTOT is INTEGER array, dimension (4) */ +/* > A count of the total number of the various types of columns */ +/* > in Q, as described in INDX. The fourth column type is any */ +/* > column which has been deflated. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] W */ +/* > \verbatim */ +/* > W is DOUBLE PRECISION array, dimension (K) */ +/* > The first K elements of this array contain the components */ +/* > of the deflation-adjusted updating vector. Destroyed on */ +/* > output. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION array, dimension (N1 + 1)*K */ +/* > Will contain the eigenvectors of the repaired matrix which */ +/* > will be multiplied by the previously accumulated eigenvectors */ +/* > to update the system. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: if INFO = 1, an eigenvalue did not converge */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Jeff Rutter, Computer Science Division, University of California */ +/* > at Berkeley, USA \n */ +/* > Modified by Francoise Tisseur, University of Tennessee */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlaed3_(integer *k, integer *n, integer *n1, doublereal * + d__, doublereal *q, integer *ldq, doublereal *rho, doublereal *dlamda, + doublereal *q2, integer *indx, integer *ctot, doublereal *w, + doublereal *s, integer *info) +{ + /* System generated locals */ + integer q_dim1, q_offset, i__1, i__2; + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal), d_sign(doublereal *, doublereal *); + + /* Local variables */ + integer i__, j, n2, n12, ii, n23, iq2; + doublereal temp; + extern doublereal dnrm2_(integer *, doublereal *, integer *); + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer + *), dlaed4_(integer *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *); + extern doublereal dlamc3_(doublereal *, doublereal *); + extern /* Subroutine */ int dlacpy_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen), xerbla_(char *, integer *, + ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + --dlamda; + --q2; + --indx; + --ctot; + --w; + --s; + + /* Function Body */ + *info = 0; + + if (*k < 0) { + *info = -1; + } else if (*n < *k) { + *info = -2; + } else if (*ldq < max(1,*n)) { + *info = -6; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLAED3", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*k == 0) { + return 0; + } + +/* Modify values DLAMDA(i) to make sure all DLAMDA(i)-DLAMDA(j) can */ +/* be computed with high relative accuracy (barring over/underflow). */ +/* This is a problem on machines without a guard digit in */ +/* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). */ +/* The following code replaces DLAMDA(I) by 2*DLAMDA(I)-DLAMDA(I), */ +/* which on any of these machines zeros out the bottommost */ +/* bit of DLAMDA(I) if it is 1; this makes the subsequent */ +/* subtractions DLAMDA(I)-DLAMDA(J) unproblematic when cancellation */ +/* occurs. On binary machines with a guard digit (almost all */ +/* machines) it does not change DLAMDA(I) at all. On hexadecimal */ +/* and decimal machines with a guard digit, it slightly */ +/* changes the bottommost bits of DLAMDA(I). It does not account */ +/* for hexadecimal or decimal machines without guard digits */ +/* (we know of none). We use a subroutine call to compute */ +/* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating */ +/* this code. */ + + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + dlamda[i__] = dlamc3_(&dlamda[i__], &dlamda[i__]) - dlamda[i__]; +/* L10: */ + } + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dlaed4_(k, &j, &dlamda[1], &w[1], &q[j * q_dim1 + 1], rho, &d__[j], + info); + +/* If the zero finder fails, the computation is terminated. */ + + if (*info != 0) { + goto L120; + } +/* L20: */ + } + + if (*k == 1) { + goto L110; + } + if (*k == 2) { + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + w[1] = q[j * q_dim1 + 1]; + w[2] = q[j * q_dim1 + 2]; + ii = indx[1]; + q[j * q_dim1 + 1] = w[ii]; + ii = indx[2]; + q[j * q_dim1 + 2] = w[ii]; +/* L30: */ + } + goto L110; + } + +/* Compute updated W. */ + + dcopy_(k, &w[1], &c__1, &s[1], &c__1); + +/* Initialize W(I) = Q(I,I) */ + + i__1 = *ldq + 1; + dcopy_(k, &q[q_offset], &i__1, &w[1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); +/* L40: */ + } + i__2 = *k; + for (i__ = j + 1; i__ <= i__2; ++i__) { + w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); +/* L50: */ + } +/* L60: */ + } + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + d__1 = sqrt(-w[i__]); + w[i__] = d_sign(&d__1, &s[i__]); +/* L70: */ + } + +/* Compute eigenvectors of the modified rank-1 modification. */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *k; + for (i__ = 1; i__ <= i__2; ++i__) { + s[i__] = w[i__] / q[i__ + j * q_dim1]; +/* L80: */ + } + temp = dnrm2_(k, &s[1], &c__1); + i__2 = *k; + for (i__ = 1; i__ <= i__2; ++i__) { + ii = indx[i__]; + q[i__ + j * q_dim1] = s[ii] / temp; +/* L90: */ + } +/* L100: */ + } + +/* Compute the updated eigenvectors. */ + +L110: + + n2 = *n - *n1; + n12 = ctot[1] + ctot[2]; + n23 = ctot[2] + ctot[3]; + + dlacpy_((char *)"A", &n23, k, &q[ctot[1] + 1 + q_dim1], ldq, &s[1], &n23, (ftnlen) + 1); + iq2 = *n1 * n12 + 1; + if (n23 != 0) { + dgemm_((char *)"N", (char *)"N", &n2, k, &n23, &c_b22, &q2[iq2], &n2, &s[1], &n23, & + c_b23, &q[*n1 + 1 + q_dim1], ldq, (ftnlen)1, (ftnlen)1); + } else { + dlaset_((char *)"A", &n2, k, &c_b23, &c_b23, &q[*n1 + 1 + q_dim1], ldq, ( + ftnlen)1); + } + + dlacpy_((char *)"A", &n12, k, &q[q_offset], ldq, &s[1], &n12, (ftnlen)1); + if (n12 != 0) { + dgemm_((char *)"N", (char *)"N", n1, k, &n12, &c_b22, &q2[1], n1, &s[1], &n12, &c_b23, + &q[q_offset], ldq, (ftnlen)1, (ftnlen)1); + } else { + dlaset_((char *)"A", n1, k, &c_b23, &c_b23, &q[q_dim1 + 1], ldq, (ftnlen)1); + } + + +L120: + return 0; + +/* End of DLAED3 */ + +} /* dlaed3_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaed4.cpp b/lib/linalg/dlaed4.cpp new file mode 100644 index 0000000000..5cc622887d --- /dev/null +++ b/lib/linalg/dlaed4.cpp @@ -0,0 +1,1036 @@ +/* fortran/dlaed4.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLAED4 used by DSTEDC. Finds a single root of the secular equation. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAED4 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAED4( N, I, D, Z, DELTA, RHO, DLAM, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER I, INFO, N */ +/* DOUBLE PRECISION DLAM, RHO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( * ), DELTA( * ), Z( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > This subroutine computes the I-th updated eigenvalue of a symmetric */ +/* > rank-one modification to a diagonal matrix whose elements are */ +/* > given in the array d, and that */ +/* > */ +/* > D(i) < D(j) for i < j */ +/* > */ +/* > and that RHO > 0. This is arranged by the calling routine, and is */ +/* > no loss in generality. The rank-one modified system is thus */ +/* > */ +/* > diag( D ) + RHO * Z * Z_transpose. */ +/* > */ +/* > where we assume the Euclidean norm of Z is 1. */ +/* > */ +/* > The method consists of approximating the rational functions in the */ +/* > secular equation by simpler interpolating rational functions. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The length of all arrays. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] I */ +/* > \verbatim */ +/* > I is INTEGER */ +/* > The index of the eigenvalue to be computed. 1 <= I <= N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > The original eigenvalues. It is assumed that they are in */ +/* > order, D(I) < D(J) for I < J. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension (N) */ +/* > The components of the updating vector. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DELTA */ +/* > \verbatim */ +/* > DELTA is DOUBLE PRECISION array, dimension (N) */ +/* > If N > 2, DELTA contains (D(j) - lambda_I) in its j-th */ +/* > component. If N = 1, then DELTA(1) = 1. If N = 2, see DLAED5 */ +/* > for detail. The vector DELTA contains the information necessary */ +/* > to construct the eigenvectors by DLAED3 and DLAED9. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > The scalar in the symmetric updating formula. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DLAM */ +/* > \verbatim */ +/* > DLAM is DOUBLE PRECISION */ +/* > The computed lambda_I, the I-th updated eigenvalue. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > > 0: if INFO = 1, the updating process failed. */ +/* > \endverbatim */ + +/* > \par Internal Parameters: */ +/* ========================= */ +/* > */ +/* > \verbatim */ +/* > Logical variable ORGATI (origin-at-i?) is used for distinguishing */ +/* > whether D(i) or D(i+1) is treated as the origin. */ +/* > */ +/* > ORGATI = .true. origin at i */ +/* > ORGATI = .false. origin at i+1 */ +/* > */ +/* > Logical variable SWTCH3 (switch-for-3-poles?) is for noting */ +/* > if we are working with THREE poles! */ +/* > */ +/* > MAXIT is the maximum number of iterations allowed for each */ +/* > eigenvalue. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ren-Cang Li, Computer Science Division, University of California */ +/* > at Berkeley, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlaed4_(integer *n, integer *i__, doublereal *d__, + doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam, + integer *info) +{ + /* System generated locals */ + integer i__1; + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal a, b, c__; + integer j; + doublereal w; + integer ii; + doublereal dw, zz[3]; + integer ip1; + doublereal del, eta, phi, eps, tau, psi; + integer iim1, iip1; + doublereal dphi, dpsi; + integer iter; + doublereal temp, prew, temp1, dltlb, dltub, midpt; + integer niter; + logical swtch; + extern /* Subroutine */ int dlaed5_(integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *), dlaed6_(integer *, + logical *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *); + logical swtch3; + extern doublereal dlamch_(char *, ftnlen); + logical orgati; + doublereal erretm, rhoinv; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Local Arrays .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Since this routine is called in an inner loop, we do no argument */ +/* checking. */ + +/* Quick return for N=1 and 2. */ + + /* Parameter adjustments */ + --delta; + --z__; + --d__; + + /* Function Body */ + *info = 0; + if (*n == 1) { + +/* Presumably, I=1 upon entry */ + + *dlam = d__[1] + *rho * z__[1] * z__[1]; + delta[1] = 1.; + return 0; + } + if (*n == 2) { + dlaed5_(i__, &d__[1], &z__[1], &delta[1], rho, dlam); + return 0; + } + +/* Compute machine epsilon */ + + eps = dlamch_((char *)"Epsilon", (ftnlen)7); + rhoinv = 1. / *rho; + +/* The case I = N */ + + if (*i__ == *n) { + +/* Initialize some basic variables */ + + ii = *n - 1; + niter = 1; + +/* Calculate initial guess */ + + midpt = *rho / 2.; + +/* If ||Z||_2 is not one, then TEMP should be set to */ +/* RHO * ||Z||_2^2 / TWO */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] = d__[j] - d__[*i__] - midpt; +/* L10: */ + } + + psi = 0.; + i__1 = *n - 2; + for (j = 1; j <= i__1; ++j) { + psi += z__[j] * z__[j] / delta[j]; +/* L20: */ + } + + c__ = rhoinv + psi; + w = c__ + z__[ii] * z__[ii] / delta[ii] + z__[*n] * z__[*n] / delta[* + n]; + + if (w <= 0.) { + temp = z__[*n - 1] * z__[*n - 1] / (d__[*n] - d__[*n - 1] + *rho) + + z__[*n] * z__[*n] / *rho; + if (c__ <= temp) { + tau = *rho; + } else { + del = d__[*n] - d__[*n - 1]; + a = -c__ * del + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n] + ; + b = z__[*n] * z__[*n] * del; + if (a < 0.) { + tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a); + } else { + tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); + } + } + +/* It can be proved that */ +/* D(N)+RHO/2 <= LAMBDA(N) < D(N)+TAU <= D(N)+RHO */ + + dltlb = midpt; + dltub = *rho; + } else { + del = d__[*n] - d__[*n - 1]; + a = -c__ * del + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n]; + b = z__[*n] * z__[*n] * del; + if (a < 0.) { + tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a); + } else { + tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); + } + +/* It can be proved that */ +/* D(N) < D(N)+TAU < LAMBDA(N) < D(N)+RHO/2 */ + + dltlb = 0.; + dltub = midpt; + } + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] = d__[j] - d__[*i__] - tau; +/* L30: */ + } + +/* Evaluate PSI and the derivative DPSI */ + + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = ii; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / delta[j]; + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; +/* L40: */ + } + erretm = abs(erretm); + +/* Evaluate PHI and the derivative DPHI */ + + temp = z__[*n] / delta[*n]; + phi = z__[*n] * temp; + dphi = temp * temp; + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi + + dphi); + + w = rhoinv + phi + psi; + +/* Test for convergence */ + + if (abs(w) <= eps * erretm) { + *dlam = d__[*i__] + tau; + goto L250; + } + + if (w <= 0.) { + dltlb = max(dltlb,tau); + } else { + dltub = min(dltub,tau); + } + +/* Calculate the new step */ + + ++niter; + c__ = w - delta[*n - 1] * dpsi - delta[*n] * dphi; + a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * ( + dpsi + dphi); + b = delta[*n - 1] * delta[*n] * w; + if (c__ < 0.) { + c__ = abs(c__); + } + if (c__ == 0.) { +/* ETA = B/A */ +/* ETA = RHO - TAU */ +/* ETA = DLTUB - TAU */ + +/* Update proposed by Li, Ren-Cang: */ + eta = -w / (dpsi + dphi); + } else if (a >= 0.) { + eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ + * 2.); + } else { + eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) + ); + } + +/* Note, eta should be positive if w is negative, and */ +/* eta should be negative otherwise. However, */ +/* if for some reason caused by roundoff, eta*w > 0, */ +/* we simply use one Newton step instead. This way */ +/* will guarantee eta*w < 0. */ + + if (w * eta > 0.) { + eta = -w / (dpsi + dphi); + } + temp = tau + eta; + if (temp > dltub || temp < dltlb) { + if (w < 0.) { + eta = (dltub - tau) / 2.; + } else { + eta = (dltlb - tau) / 2.; + } + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] -= eta; +/* L50: */ + } + + tau += eta; + +/* Evaluate PSI and the derivative DPSI */ + + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = ii; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / delta[j]; + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; +/* L60: */ + } + erretm = abs(erretm); + +/* Evaluate PHI and the derivative DPHI */ + + temp = z__[*n] / delta[*n]; + phi = z__[*n] * temp; + dphi = temp * temp; + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi + + dphi); + + w = rhoinv + phi + psi; + +/* Main loop to update the values of the array DELTA */ + + iter = niter + 1; + + for (niter = iter; niter <= 30; ++niter) { + +/* Test for convergence */ + + if (abs(w) <= eps * erretm) { + *dlam = d__[*i__] + tau; + goto L250; + } + + if (w <= 0.) { + dltlb = max(dltlb,tau); + } else { + dltub = min(dltub,tau); + } + +/* Calculate the new step */ + + c__ = w - delta[*n - 1] * dpsi - delta[*n] * dphi; + a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * + (dpsi + dphi); + b = delta[*n - 1] * delta[*n] * w; + if (a >= 0.) { + eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( + c__ * 2.); + } else { + eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))); + } + +/* Note, eta should be positive if w is negative, and */ +/* eta should be negative otherwise. However, */ +/* if for some reason caused by roundoff, eta*w > 0, */ +/* we simply use one Newton step instead. This way */ +/* will guarantee eta*w < 0. */ + + if (w * eta > 0.) { + eta = -w / (dpsi + dphi); + } + temp = tau + eta; + if (temp > dltub || temp < dltlb) { + if (w < 0.) { + eta = (dltub - tau) / 2.; + } else { + eta = (dltlb - tau) / 2.; + } + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] -= eta; +/* L70: */ + } + + tau += eta; + +/* Evaluate PSI and the derivative DPSI */ + + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = ii; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / delta[j]; + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; +/* L80: */ + } + erretm = abs(erretm); + +/* Evaluate PHI and the derivative DPHI */ + + temp = z__[*n] / delta[*n]; + phi = z__[*n] * temp; + dphi = temp * temp; + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * ( + dpsi + dphi); + + w = rhoinv + phi + psi; +/* L90: */ + } + +/* Return with INFO = 1, NITER = MAXIT and not converged */ + + *info = 1; + *dlam = d__[*i__] + tau; + goto L250; + +/* End for the case I = N */ + + } else { + +/* The case for I < N */ + + niter = 1; + ip1 = *i__ + 1; + +/* Calculate initial guess */ + + del = d__[ip1] - d__[*i__]; + midpt = del / 2.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] = d__[j] - d__[*i__] - midpt; +/* L100: */ + } + + psi = 0.; + i__1 = *i__ - 1; + for (j = 1; j <= i__1; ++j) { + psi += z__[j] * z__[j] / delta[j]; +/* L110: */ + } + + phi = 0.; + i__1 = *i__ + 2; + for (j = *n; j >= i__1; --j) { + phi += z__[j] * z__[j] / delta[j]; +/* L120: */ + } + c__ = rhoinv + psi + phi; + w = c__ + z__[*i__] * z__[*i__] / delta[*i__] + z__[ip1] * z__[ip1] / + delta[ip1]; + + if (w > 0.) { + +/* d(i)< the ith eigenvalue < (d(i)+d(i+1))/2 */ + +/* We choose d(i) as origin. */ + + orgati = TRUE_; + a = c__ * del + z__[*i__] * z__[*i__] + z__[ip1] * z__[ip1]; + b = z__[*i__] * z__[*i__] * del; + if (a > 0.) { + tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))); + } else { + tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( + c__ * 2.); + } + dltlb = 0.; + dltub = midpt; + } else { + +/* (d(i)+d(i+1))/2 <= the ith eigenvalue < d(i+1) */ + +/* We choose d(i+1) as origin. */ + + orgati = FALSE_; + a = c__ * del - z__[*i__] * z__[*i__] - z__[ip1] * z__[ip1]; + b = z__[ip1] * z__[ip1] * del; + if (a < 0.) { + tau = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs( + d__1)))); + } else { + tau = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / + (c__ * 2.); + } + dltlb = -midpt; + dltub = 0.; + } + + if (orgati) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] = d__[j] - d__[*i__] - tau; +/* L130: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] = d__[j] - d__[ip1] - tau; +/* L140: */ + } + } + if (orgati) { + ii = *i__; + } else { + ii = *i__ + 1; + } + iim1 = ii - 1; + iip1 = ii + 1; + +/* Evaluate PSI and the derivative DPSI */ + + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = iim1; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / delta[j]; + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; +/* L150: */ + } + erretm = abs(erretm); + +/* Evaluate PHI and the derivative DPHI */ + + dphi = 0.; + phi = 0.; + i__1 = iip1; + for (j = *n; j >= i__1; --j) { + temp = z__[j] / delta[j]; + phi += z__[j] * temp; + dphi += temp * temp; + erretm += phi; +/* L160: */ + } + + w = rhoinv + phi + psi; + +/* W is the value of the secular function with */ +/* its ii-th element removed. */ + + swtch3 = FALSE_; + if (orgati) { + if (w < 0.) { + swtch3 = TRUE_; + } + } else { + if (w > 0.) { + swtch3 = TRUE_; + } + } + if (ii == 1 || ii == *n) { + swtch3 = FALSE_; + } + + temp = z__[ii] / delta[ii]; + dw = dpsi + dphi + temp * temp; + temp = z__[ii] * temp; + w += temp; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + + abs(tau) * dw; + +/* Test for convergence */ + + if (abs(w) <= eps * erretm) { + if (orgati) { + *dlam = d__[*i__] + tau; + } else { + *dlam = d__[ip1] + tau; + } + goto L250; + } + + if (w <= 0.) { + dltlb = max(dltlb,tau); + } else { + dltub = min(dltub,tau); + } + +/* Calculate the new step */ + + ++niter; + if (! swtch3) { + if (orgati) { +/* Computing 2nd power */ + d__1 = z__[*i__] / delta[*i__]; + c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * (d__1 * + d__1); + } else { +/* Computing 2nd power */ + d__1 = z__[ip1] / delta[ip1]; + c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * (d__1 * + d__1); + } + a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] * + dw; + b = delta[*i__] * delta[ip1] * w; + if (c__ == 0.) { + if (a == 0.) { + if (orgati) { + a = z__[*i__] * z__[*i__] + delta[ip1] * delta[ip1] * + (dpsi + dphi); + } else { + a = z__[ip1] * z__[ip1] + delta[*i__] * delta[*i__] * + (dpsi + dphi); + } + } + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( + c__ * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))); + } + } else { + +/* Interpolation using THREE most relevant poles */ + + temp = rhoinv + psi + phi; + if (orgati) { + temp1 = z__[iim1] / delta[iim1]; + temp1 *= temp1; + c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] - d__[ + iip1]) * temp1; + zz[0] = z__[iim1] * z__[iim1]; + zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + dphi); + } else { + temp1 = z__[iip1] / delta[iip1]; + temp1 *= temp1; + c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] - d__[ + iim1]) * temp1; + zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - temp1)); + zz[2] = z__[iip1] * z__[iip1]; + } + zz[1] = z__[ii] * z__[ii]; + dlaed6_(&niter, &orgati, &c__, &delta[iim1], zz, &w, &eta, info); + if (*info != 0) { + goto L250; + } + } + +/* Note, eta should be positive if w is negative, and */ +/* eta should be negative otherwise. However, */ +/* if for some reason caused by roundoff, eta*w > 0, */ +/* we simply use one Newton step instead. This way */ +/* will guarantee eta*w < 0. */ + + if (w * eta >= 0.) { + eta = -w / dw; + } + temp = tau + eta; + if (temp > dltub || temp < dltlb) { + if (w < 0.) { + eta = (dltub - tau) / 2.; + } else { + eta = (dltlb - tau) / 2.; + } + } + + prew = w; + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] -= eta; +/* L180: */ + } + +/* Evaluate PSI and the derivative DPSI */ + + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = iim1; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / delta[j]; + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; +/* L190: */ + } + erretm = abs(erretm); + +/* Evaluate PHI and the derivative DPHI */ + + dphi = 0.; + phi = 0.; + i__1 = iip1; + for (j = *n; j >= i__1; --j) { + temp = z__[j] / delta[j]; + phi += z__[j] * temp; + dphi += temp * temp; + erretm += phi; +/* L200: */ + } + + temp = z__[ii] / delta[ii]; + dw = dpsi + dphi + temp * temp; + temp = z__[ii] * temp; + w = rhoinv + phi + psi + temp; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + ( + d__1 = tau + eta, abs(d__1)) * dw; + + swtch = FALSE_; + if (orgati) { + if (-w > abs(prew) / 10.) { + swtch = TRUE_; + } + } else { + if (w > abs(prew) / 10.) { + swtch = TRUE_; + } + } + + tau += eta; + +/* Main loop to update the values of the array DELTA */ + + iter = niter + 1; + + for (niter = iter; niter <= 30; ++niter) { + +/* Test for convergence */ + + if (abs(w) <= eps * erretm) { + if (orgati) { + *dlam = d__[*i__] + tau; + } else { + *dlam = d__[ip1] + tau; + } + goto L250; + } + + if (w <= 0.) { + dltlb = max(dltlb,tau); + } else { + dltub = min(dltub,tau); + } + +/* Calculate the new step */ + + if (! swtch3) { + if (! swtch) { + if (orgati) { +/* Computing 2nd power */ + d__1 = z__[*i__] / delta[*i__]; + c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * ( + d__1 * d__1); + } else { +/* Computing 2nd power */ + d__1 = z__[ip1] / delta[ip1]; + c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * + (d__1 * d__1); + } + } else { + temp = z__[ii] / delta[ii]; + if (orgati) { + dpsi += temp * temp; + } else { + dphi += temp * temp; + } + c__ = w - delta[*i__] * dpsi - delta[ip1] * dphi; + } + a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] + * dw; + b = delta[*i__] * delta[ip1] * w; + if (c__ == 0.) { + if (a == 0.) { + if (! swtch) { + if (orgati) { + a = z__[*i__] * z__[*i__] + delta[ip1] * + delta[ip1] * (dpsi + dphi); + } else { + a = z__[ip1] * z__[ip1] + delta[*i__] * delta[ + *i__] * (dpsi + dphi); + } + } else { + a = delta[*i__] * delta[*i__] * dpsi + delta[ip1] + * delta[ip1] * dphi; + } + } + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) + / (c__ * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, + abs(d__1)))); + } + } else { + +/* Interpolation using THREE most relevant poles */ + + temp = rhoinv + psi + phi; + if (swtch) { + c__ = temp - delta[iim1] * dpsi - delta[iip1] * dphi; + zz[0] = delta[iim1] * delta[iim1] * dpsi; + zz[2] = delta[iip1] * delta[iip1] * dphi; + } else { + if (orgati) { + temp1 = z__[iim1] / delta[iim1]; + temp1 *= temp1; + c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] + - d__[iip1]) * temp1; + zz[0] = z__[iim1] * z__[iim1]; + zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + + dphi); + } else { + temp1 = z__[iip1] / delta[iip1]; + temp1 *= temp1; + c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] + - d__[iim1]) * temp1; + zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - + temp1)); + zz[2] = z__[iip1] * z__[iip1]; + } + } + dlaed6_(&niter, &orgati, &c__, &delta[iim1], zz, &w, &eta, + info); + if (*info != 0) { + goto L250; + } + } + +/* Note, eta should be positive if w is negative, and */ +/* eta should be negative otherwise. However, */ +/* if for some reason caused by roundoff, eta*w > 0, */ +/* we simply use one Newton step instead. This way */ +/* will guarantee eta*w < 0. */ + + if (w * eta >= 0.) { + eta = -w / dw; + } + temp = tau + eta; + if (temp > dltub || temp < dltlb) { + if (w < 0.) { + eta = (dltub - tau) / 2.; + } else { + eta = (dltlb - tau) / 2.; + } + } + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] -= eta; +/* L210: */ + } + + tau += eta; + prew = w; + +/* Evaluate PSI and the derivative DPSI */ + + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = iim1; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / delta[j]; + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; +/* L220: */ + } + erretm = abs(erretm); + +/* Evaluate PHI and the derivative DPHI */ + + dphi = 0.; + phi = 0.; + i__1 = iip1; + for (j = *n; j >= i__1; --j) { + temp = z__[j] / delta[j]; + phi += z__[j] * temp; + dphi += temp * temp; + erretm += phi; +/* L230: */ + } + + temp = z__[ii] / delta[ii]; + dw = dpsi + dphi + temp * temp; + temp = z__[ii] * temp; + w = rhoinv + phi + psi + temp; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + + abs(tau) * dw; + if (w * prew > 0. && abs(w) > abs(prew) / 10.) { + swtch = ! swtch; + } + +/* L240: */ + } + +/* Return with INFO = 1, NITER = MAXIT and not converged */ + + *info = 1; + if (orgati) { + *dlam = d__[*i__] + tau; + } else { + *dlam = d__[ip1] + tau; + } + + } + +L250: + + return 0; + +/* End of DLAED4 */ + +} /* dlaed4_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaed5.cpp b/lib/linalg/dlaed5.cpp new file mode 100644 index 0000000000..14e8a429ee --- /dev/null +++ b/lib/linalg/dlaed5.cpp @@ -0,0 +1,219 @@ +/* fortran/dlaed5.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLAED5 used by DSTEDC. Solves the 2-by-2 secular equation. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAED5 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAED5( I, D, Z, DELTA, RHO, DLAM ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER I */ +/* DOUBLE PRECISION DLAM, RHO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( 2 ), DELTA( 2 ), Z( 2 ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > This subroutine computes the I-th eigenvalue of a symmetric rank-one */ +/* > modification of a 2-by-2 diagonal matrix */ +/* > */ +/* > diag( D ) + RHO * Z * transpose(Z) . */ +/* > */ +/* > The diagonal elements in the array D are assumed to satisfy */ +/* > */ +/* > D(i) < D(j) for i < j . */ +/* > */ +/* > We also assume RHO > 0 and that the Euclidean norm of the vector */ +/* > Z is one. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] I */ +/* > \verbatim */ +/* > I is INTEGER */ +/* > The index of the eigenvalue to be computed. I = 1 or I = 2. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (2) */ +/* > The original eigenvalues. We assume D(1) < D(2). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension (2) */ +/* > The components of the updating vector. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DELTA */ +/* > \verbatim */ +/* > DELTA is DOUBLE PRECISION array, dimension (2) */ +/* > The vector DELTA contains the information necessary */ +/* > to construct the eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > The scalar in the symmetric updating formula. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DLAM */ +/* > \verbatim */ +/* > DLAM is DOUBLE PRECISION */ +/* > The computed lambda_I, the I-th updated eigenvalue. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ren-Cang Li, Computer Science Division, University of California */ +/* > at Berkeley, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlaed5_(integer *i__, doublereal *d__, doublereal *z__, + doublereal *delta, doublereal *rho, doublereal *dlam) +{ + /* System generated locals */ + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal b, c__, w, del, tau, temp; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --delta; + --z__; + --d__; + + /* Function Body */ + del = d__[2] - d__[1]; + if (*i__ == 1) { + w = *rho * 2. * (z__[2] * z__[2] - z__[1] * z__[1]) / del + 1.; + if (w > 0.) { + b = del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); + c__ = *rho * z__[1] * z__[1] * del; + +/* B > ZERO, always */ + + tau = c__ * 2. / (b + sqrt((d__1 = b * b - c__ * 4., abs(d__1)))); + *dlam = d__[1] + tau; + delta[1] = -z__[1] / tau; + delta[2] = z__[2] / (del - tau); + } else { + b = -del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); + c__ = *rho * z__[2] * z__[2] * del; + if (b > 0.) { + tau = c__ * -2. / (b + sqrt(b * b + c__ * 4.)); + } else { + tau = (b - sqrt(b * b + c__ * 4.)) / 2.; + } + *dlam = d__[2] + tau; + delta[1] = -z__[1] / (del + tau); + delta[2] = -z__[2] / tau; + } + temp = sqrt(delta[1] * delta[1] + delta[2] * delta[2]); + delta[1] /= temp; + delta[2] /= temp; + } else { + +/* Now I=2 */ + + b = -del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); + c__ = *rho * z__[2] * z__[2] * del; + if (b > 0.) { + tau = (b + sqrt(b * b + c__ * 4.)) / 2.; + } else { + tau = c__ * 2. / (-b + sqrt(b * b + c__ * 4.)); + } + *dlam = d__[2] + tau; + delta[1] = -z__[1] / (del + tau); + delta[2] = -z__[2] / tau; + temp = sqrt(delta[1] * delta[1] + delta[2] * delta[2]); + delta[1] /= temp; + delta[2] /= temp; + } + return 0; + +/* End of DLAED5 */ + +} /* dlaed5_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaed6.cpp b/lib/linalg/dlaed6.cpp new file mode 100644 index 0000000000..7a855780f0 --- /dev/null +++ b/lib/linalg/dlaed6.cpp @@ -0,0 +1,463 @@ +/* fortran/dlaed6.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLAED6 used by DSTEDC. Computes one Newton step in solution of the secular equation. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAED6 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAED6( KNITER, ORGATI, RHO, D, Z, FINIT, TAU, INFO ) */ + +/* .. Scalar Arguments .. */ +/* LOGICAL ORGATI */ +/* INTEGER INFO, KNITER */ +/* DOUBLE PRECISION FINIT, RHO, TAU */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( 3 ), Z( 3 ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAED6 computes the positive or negative root (closest to the origin) */ +/* > of */ +/* > z(1) z(2) z(3) */ +/* > f(x) = rho + --------- + ---------- + --------- */ +/* > d(1)-x d(2)-x d(3)-x */ +/* > */ +/* > It is assumed that */ +/* > */ +/* > if ORGATI = .true. the root is between d(2) and d(3); */ +/* > otherwise it is between d(1) and d(2) */ +/* > */ +/* > This routine will be called by DLAED4 when necessary. In most cases, */ +/* > the root sought is the smallest in magnitude, though it might not be */ +/* > in some extremely rare situations. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] KNITER */ +/* > \verbatim */ +/* > KNITER is INTEGER */ +/* > Refer to DLAED4 for its significance. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ORGATI */ +/* > \verbatim */ +/* > ORGATI is LOGICAL */ +/* > If ORGATI is true, the needed root is between d(2) and */ +/* > d(3); otherwise it is between d(1) and d(2). See */ +/* > DLAED4 for further details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > Refer to the equation f(x) above. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (3) */ +/* > D satisfies d(1) < d(2) < d(3). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension (3) */ +/* > Each of the elements in z must be positive. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] FINIT */ +/* > \verbatim */ +/* > FINIT is DOUBLE PRECISION */ +/* > The value of f at 0. It is more accurate than the one */ +/* > evaluated inside this routine (if someone wants to do */ +/* > so). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION */ +/* > The root of the equation f(x). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > > 0: if INFO = 1, failure to converge */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > 10/02/03: This version has a few statements commented out for thread */ +/* > safety (machine parameters are computed on each entry). SJH. */ +/* > */ +/* > 05/10/06: Modified from a new version of Ren-Cang Li, use */ +/* > Gragg-Thornton-Warner cubic convergent scheme for better stability. */ +/* > \endverbatim */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ren-Cang Li, Computer Science Division, University of California */ +/* > at Berkeley, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlaed6_(integer *kniter, logical *orgati, doublereal * + rho, doublereal *d__, doublereal *z__, doublereal *finit, doublereal * + tau, integer *info) +{ + /* System generated locals */ + integer i__1; + doublereal d__1, d__2, d__3, d__4; + + /* Builtin functions */ + double sqrt(doublereal), log(doublereal), pow_di(doublereal *, integer *); + + /* Local variables */ + doublereal a, b, c__, f; + integer i__; + doublereal fc, df, ddf, lbd, eta, ubd, eps, base; + integer iter; + doublereal temp, temp1, temp2, temp3, temp4; + logical scale; + integer niter; + doublereal small1, small2, sminv1, sminv2; + extern doublereal dlamch_(char *, ftnlen); + doublereal dscale[3], sclfac, zscale[3], erretm, sclinv; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Local Arrays .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --z__; + --d__; + + /* Function Body */ + *info = 0; + + if (*orgati) { + lbd = d__[2]; + ubd = d__[3]; + } else { + lbd = d__[1]; + ubd = d__[2]; + } + if (*finit < 0.) { + lbd = 0.; + } else { + ubd = 0.; + } + + niter = 1; + *tau = 0.; + if (*kniter == 2) { + if (*orgati) { + temp = (d__[3] - d__[2]) / 2.; + c__ = *rho + z__[1] / (d__[1] - d__[2] - temp); + a = c__ * (d__[2] + d__[3]) + z__[2] + z__[3]; + b = c__ * d__[2] * d__[3] + z__[2] * d__[3] + z__[3] * d__[2]; + } else { + temp = (d__[1] - d__[2]) / 2.; + c__ = *rho + z__[3] / (d__[3] - d__[2] - temp); + a = c__ * (d__[1] + d__[2]) + z__[1] + z__[2]; + b = c__ * d__[1] * d__[2] + z__[1] * d__[2] + z__[2] * d__[1]; + } +/* Computing MAX */ + d__1 = abs(a), d__2 = abs(b), d__1 = max(d__1,d__2), d__2 = abs(c__); + temp = max(d__1,d__2); + a /= temp; + b /= temp; + c__ /= temp; + if (c__ == 0.) { + *tau = b / a; + } else if (a <= 0.) { + *tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( + c__ * 2.); + } else { + *tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)) + )); + } + if (*tau < lbd || *tau > ubd) { + *tau = (lbd + ubd) / 2.; + } + if (d__[1] == *tau || d__[2] == *tau || d__[3] == *tau) { + *tau = 0.; + } else { + temp = *finit + *tau * z__[1] / (d__[1] * (d__[1] - *tau)) + *tau + * z__[2] / (d__[2] * (d__[2] - *tau)) + *tau * z__[3] / ( + d__[3] * (d__[3] - *tau)); + if (temp <= 0.) { + lbd = *tau; + } else { + ubd = *tau; + } + if (abs(*finit) <= abs(temp)) { + *tau = 0.; + } + } + } + +/* get machine parameters for possible scaling to avoid overflow */ + +/* modified by Sven: parameters SMALL1, SMINV1, SMALL2, */ +/* SMINV2, EPS are not SAVEd anymore between one call to the */ +/* others but recomputed at each call */ + + eps = dlamch_((char *)"Epsilon", (ftnlen)7); + base = dlamch_((char *)"Base", (ftnlen)4); + i__1 = (integer) (log(dlamch_((char *)"SafMin", (ftnlen)6)) / log(base) / 3.); + small1 = pow_di(&base, &i__1); + sminv1 = 1. / small1; + small2 = small1 * small1; + sminv2 = sminv1 * sminv1; + +/* Determine if scaling of inputs necessary to avoid overflow */ +/* when computing 1/TEMP**3 */ + + if (*orgati) { +/* Computing MIN */ + d__3 = (d__1 = d__[2] - *tau, abs(d__1)), d__4 = (d__2 = d__[3] - * + tau, abs(d__2)); + temp = min(d__3,d__4); + } else { +/* Computing MIN */ + d__3 = (d__1 = d__[1] - *tau, abs(d__1)), d__4 = (d__2 = d__[2] - * + tau, abs(d__2)); + temp = min(d__3,d__4); + } + scale = FALSE_; + if (temp <= small1) { + scale = TRUE_; + if (temp <= small2) { + +/* Scale up by power of radix nearest 1/SAFMIN**(2/3) */ + + sclfac = sminv2; + sclinv = small2; + } else { + +/* Scale up by power of radix nearest 1/SAFMIN**(1/3) */ + + sclfac = sminv1; + sclinv = small1; + } + +/* Scaling up safe because D, Z, TAU scaled elsewhere to be O(1) */ + + for (i__ = 1; i__ <= 3; ++i__) { + dscale[i__ - 1] = d__[i__] * sclfac; + zscale[i__ - 1] = z__[i__] * sclfac; +/* L10: */ + } + *tau *= sclfac; + lbd *= sclfac; + ubd *= sclfac; + } else { + +/* Copy D and Z to DSCALE and ZSCALE */ + + for (i__ = 1; i__ <= 3; ++i__) { + dscale[i__ - 1] = d__[i__]; + zscale[i__ - 1] = z__[i__]; +/* L20: */ + } + } + + fc = 0.; + df = 0.; + ddf = 0.; + for (i__ = 1; i__ <= 3; ++i__) { + temp = 1. / (dscale[i__ - 1] - *tau); + temp1 = zscale[i__ - 1] * temp; + temp2 = temp1 * temp; + temp3 = temp2 * temp; + fc += temp1 / dscale[i__ - 1]; + df += temp2; + ddf += temp3; +/* L30: */ + } + f = *finit + *tau * fc; + + if (abs(f) <= 0.) { + goto L60; + } + if (f <= 0.) { + lbd = *tau; + } else { + ubd = *tau; + } + +/* Iteration begins -- Use Gragg-Thornton-Warner cubic convergent */ +/* scheme */ + +/* It is not hard to see that */ + +/* 1) Iterations will go up monotonically */ +/* if FINIT < 0; */ + +/* 2) Iterations will go down monotonically */ +/* if FINIT > 0. */ + + iter = niter + 1; + + for (niter = iter; niter <= 40; ++niter) { + + if (*orgati) { + temp1 = dscale[1] - *tau; + temp2 = dscale[2] - *tau; + } else { + temp1 = dscale[0] - *tau; + temp2 = dscale[1] - *tau; + } + a = (temp1 + temp2) * f - temp1 * temp2 * df; + b = temp1 * temp2 * f; + c__ = f - (temp1 + temp2) * df + temp1 * temp2 * ddf; +/* Computing MAX */ + d__1 = abs(a), d__2 = abs(b), d__1 = max(d__1,d__2), d__2 = abs(c__); + temp = max(d__1,d__2); + a /= temp; + b /= temp; + c__ /= temp; + if (c__ == 0.) { + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ + * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) + ); + } + if (f * eta >= 0.) { + eta = -f / df; + } + + *tau += eta; + if (*tau < lbd || *tau > ubd) { + *tau = (lbd + ubd) / 2.; + } + + fc = 0.; + erretm = 0.; + df = 0.; + ddf = 0.; + for (i__ = 1; i__ <= 3; ++i__) { + if (dscale[i__ - 1] - *tau != 0.) { + temp = 1. / (dscale[i__ - 1] - *tau); + temp1 = zscale[i__ - 1] * temp; + temp2 = temp1 * temp; + temp3 = temp2 * temp; + temp4 = temp1 / dscale[i__ - 1]; + fc += temp4; + erretm += abs(temp4); + df += temp2; + ddf += temp3; + } else { + goto L60; + } +/* L40: */ + } + f = *finit + *tau * fc; + erretm = (abs(*finit) + abs(*tau) * erretm) * 8. + abs(*tau) * df; + if (abs(f) <= eps * 4. * erretm || ubd - lbd <= eps * 4. * abs(*tau)) + { + goto L60; + } + if (f <= 0.) { + lbd = *tau; + } else { + ubd = *tau; + } +/* L50: */ + } + *info = 1; +L60: + +/* Undo scaling */ + + if (scale) { + *tau *= sclinv; + } + return 0; + +/* End of DLAED6 */ + +} /* dlaed6_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaed7.cpp b/lib/linalg/dlaed7.cpp new file mode 100644 index 0000000000..367bf37a46 --- /dev/null +++ b/lib/linalg/dlaed7.cpp @@ -0,0 +1,483 @@ +/* fortran/dlaed7.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__2 = 2; +static integer c__1 = 1; +static doublereal c_b10 = 1.; +static doublereal c_b11 = 0.; +static integer c_n1 = -1; + +/* > \brief \b DLAED7 used by DSTEDC. Computes the updated eigensystem of a diagonal matrix after modification + by a rank-one symmetric matrix. Used when the original matrix is dense. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAED7 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAED7( ICOMPQ, N, QSIZ, TLVLS, CURLVL, CURPBM, D, Q, */ +/* LDQ, INDXQ, RHO, CUTPNT, QSTORE, QPTR, PRMPTR, */ +/* PERM, GIVPTR, GIVCOL, GIVNUM, WORK, IWORK, */ +/* INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER CURLVL, CURPBM, CUTPNT, ICOMPQ, INFO, LDQ, N, */ +/* $ QSIZ, TLVLS */ +/* DOUBLE PRECISION RHO */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER GIVCOL( 2, * ), GIVPTR( * ), INDXQ( * ), */ +/* $ IWORK( * ), PERM( * ), PRMPTR( * ), QPTR( * ) */ +/* DOUBLE PRECISION D( * ), GIVNUM( 2, * ), Q( LDQ, * ), */ +/* $ QSTORE( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAED7 computes the updated eigensystem of a diagonal */ +/* > matrix after modification by a rank-one symmetric matrix. This */ +/* > routine is used only for the eigenproblem which requires all */ +/* > eigenvalues and optionally eigenvectors of a dense symmetric matrix */ +/* > that has been reduced to tridiagonal form. DLAED1 handles */ +/* > the case in which all eigenvalues and eigenvectors of a symmetric */ +/* > tridiagonal matrix are desired. */ +/* > */ +/* > T = Q(in) ( D(in) + RHO * Z*Z**T ) Q**T(in) = Q(out) * D(out) * Q**T(out) */ +/* > */ +/* > where Z = Q**Tu, u is a vector of length N with ones in the */ +/* > CUTPNT and CUTPNT + 1 th elements and zeros elsewhere. */ +/* > */ +/* > The eigenvectors of the original matrix are stored in Q, and the */ +/* > eigenvalues are in D. The algorithm consists of three stages: */ +/* > */ +/* > The first stage consists of deflating the size of the problem */ +/* > when there are multiple eigenvalues or if there is a zero in */ +/* > the Z vector. For each such occurrence the dimension of the */ +/* > secular equation problem is reduced by one. This stage is */ +/* > performed by the routine DLAED8. */ +/* > */ +/* > The second stage consists of calculating the updated */ +/* > eigenvalues. This is done by finding the roots of the secular */ +/* > equation via the routine DLAED4 (as called by DLAED9). */ +/* > This routine also calculates the eigenvectors of the current */ +/* > problem. */ +/* > */ +/* > The final stage consists of computing the updated eigenvectors */ +/* > directly using the updated eigenvalues. The eigenvectors for */ +/* > the current problem are multiplied with the eigenvectors from */ +/* > the overall problem. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ICOMPQ */ +/* > \verbatim */ +/* > ICOMPQ is INTEGER */ +/* > = 0: Compute eigenvalues only. */ +/* > = 1: Compute eigenvectors of original dense symmetric matrix */ +/* > also. On entry, Q contains the orthogonal matrix used */ +/* > to reduce the original matrix to tridiagonal form. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] QSIZ */ +/* > \verbatim */ +/* > QSIZ is INTEGER */ +/* > The dimension of the orthogonal matrix used to reduce */ +/* > the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TLVLS */ +/* > \verbatim */ +/* > TLVLS is INTEGER */ +/* > The total number of merging levels in the overall divide and */ +/* > conquer tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CURLVL */ +/* > \verbatim */ +/* > CURLVL is INTEGER */ +/* > The current level in the overall merge routine, */ +/* > 0 <= CURLVL <= TLVLS. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CURPBM */ +/* > \verbatim */ +/* > CURPBM is INTEGER */ +/* > The current problem in the current level in the overall */ +/* > merge routine (counting from upper left to lower right). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the eigenvalues of the rank-1-perturbed matrix. */ +/* > On exit, the eigenvalues of the repaired matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Q */ +/* > \verbatim */ +/* > Q is DOUBLE PRECISION array, dimension (LDQ, N) */ +/* > On entry, the eigenvectors of the rank-1-perturbed matrix. */ +/* > On exit, the eigenvectors of the repaired tridiagonal matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQ */ +/* > \verbatim */ +/* > LDQ is INTEGER */ +/* > The leading dimension of the array Q. LDQ >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INDXQ */ +/* > \verbatim */ +/* > INDXQ is INTEGER array, dimension (N) */ +/* > The permutation which will reintegrate the subproblem just */ +/* > solved back into sorted order, i.e., D( INDXQ( I = 1, N ) ) */ +/* > will be in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > The subdiagonal element used to create the rank-1 */ +/* > modification. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CUTPNT */ +/* > \verbatim */ +/* > CUTPNT is INTEGER */ +/* > Contains the location of the last eigenvalue in the leading */ +/* > sub-matrix. min(1,N) <= CUTPNT <= N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] QSTORE */ +/* > \verbatim */ +/* > QSTORE is DOUBLE PRECISION array, dimension (N**2+1) */ +/* > Stores eigenvectors of submatrices encountered during */ +/* > divide and conquer, packed together. QPTR points to */ +/* > beginning of the submatrices. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] QPTR */ +/* > \verbatim */ +/* > QPTR is INTEGER array, dimension (N+2) */ +/* > List of indices pointing to beginning of submatrices stored */ +/* > in QSTORE. The submatrices are numbered starting at the */ +/* > bottom left of the divide and conquer tree, from left to */ +/* > right and bottom to top. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PRMPTR */ +/* > \verbatim */ +/* > PRMPTR is INTEGER array, dimension (N lg N) */ +/* > Contains a list of pointers which indicate where in PERM a */ +/* > level's permutation is stored. PRMPTR(i+1) - PRMPTR(i) */ +/* > indicates the size of the permutation and also the size of */ +/* > the full, non-deflated problem. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PERM */ +/* > \verbatim */ +/* > PERM is INTEGER array, dimension (N lg N) */ +/* > Contains the permutations (from deflation and sorting) to be */ +/* > applied to each eigenblock. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVPTR */ +/* > \verbatim */ +/* > GIVPTR is INTEGER array, dimension (N lg N) */ +/* > Contains a list of pointers which indicate where in GIVCOL a */ +/* > level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i) */ +/* > indicates the number of Givens rotations. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVCOL */ +/* > \verbatim */ +/* > GIVCOL is INTEGER array, dimension (2, N lg N) */ +/* > Each pair of numbers indicates a pair of columns to take place */ +/* > in a Givens rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVNUM */ +/* > \verbatim */ +/* > GIVNUM is DOUBLE PRECISION array, dimension (2, N lg N) */ +/* > Each number indicates the S value to be used in the */ +/* > corresponding Givens rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (3*N+2*QSIZ*N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension (4*N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: if INFO = 1, an eigenvalue did not converge */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Jeff Rutter, Computer Science Division, University of California */ +/* > at Berkeley, USA */ + +/* ===================================================================== */ +/* Subroutine */ int dlaed7_(integer *icompq, integer *n, integer *qsiz, + integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, + doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer + *cutpnt, doublereal *qstore, integer *qptr, integer *prmptr, integer * + perm, integer *givptr, integer *givcol, doublereal *givnum, + doublereal *work, integer *iwork, integer *info) +{ + /* System generated locals */ + integer q_dim1, q_offset, i__1, i__2; + + /* Builtin functions */ + integer pow_ii(integer *, integer *); + + /* Local variables */ + integer i__, k, n1, n2, is, iw, iz, iq2, ptr, ldq2, indx, curr; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer indxc, indxp; + extern /* Subroutine */ int dlaed8_(integer *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, integer *, + doublereal *, integer *, integer *, integer *), dlaed9_(integer *, + integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + integer *, integer *), dlaeda_(integer *, integer *, integer *, + integer *, integer *, integer *, integer *, integer *, doublereal + *, doublereal *, integer *, doublereal *, doublereal *, integer *) + ; + integer idlmda; + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen); + integer coltyp; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + --indxq; + --qstore; + --qptr; + --prmptr; + --perm; + --givptr; + givcol -= 3; + givnum -= 3; + --work; + --iwork; + + /* Function Body */ + *info = 0; + + if (*icompq < 0 || *icompq > 1) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*icompq == 1 && *qsiz < *n) { + *info = -3; + } else if (*ldq < max(1,*n)) { + *info = -9; + } else if (min(1,*n) > *cutpnt || *n < *cutpnt) { + *info = -12; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLAED7", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* The following values are for bookkeeping purposes only. They are */ +/* integer pointers which indicate the portion of the workspace */ +/* used by a particular array in DLAED8 and DLAED9. */ + + if (*icompq == 1) { + ldq2 = *qsiz; + } else { + ldq2 = *n; + } + + iz = 1; + idlmda = iz + *n; + iw = idlmda + *n; + iq2 = iw + *n; + is = iq2 + *n * ldq2; + + indx = 1; + indxc = indx + *n; + coltyp = indxc + *n; + indxp = coltyp + *n; + +/* Form the z-vector which consists of the last row of Q_1 and the */ +/* first row of Q_2. */ + + ptr = pow_ii(&c__2, tlvls) + 1; + i__1 = *curlvl - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = *tlvls - i__; + ptr += pow_ii(&c__2, &i__2); +/* L10: */ + } + curr = ptr + *curpbm; + dlaeda_(n, tlvls, curlvl, curpbm, &prmptr[1], &perm[1], &givptr[1], & + givcol[3], &givnum[3], &qstore[1], &qptr[1], &work[iz], &work[iz + + *n], info); + +/* When solving the final problem, we no longer need the stored data, */ +/* so we will overwrite the data from this level onto the previously */ +/* used storage space. */ + + if (*curlvl == *tlvls) { + qptr[curr] = 1; + prmptr[curr] = 1; + givptr[curr] = 1; + } + +/* Sort and Deflate eigenvalues. */ + + dlaed8_(icompq, &k, n, qsiz, &d__[1], &q[q_offset], ldq, &indxq[1], rho, + cutpnt, &work[iz], &work[idlmda], &work[iq2], &ldq2, &work[iw], & + perm[prmptr[curr]], &givptr[curr + 1], &givcol[(givptr[curr] << 1) + + 1], &givnum[(givptr[curr] << 1) + 1], &iwork[indxp], &iwork[ + indx], info); + prmptr[curr + 1] = prmptr[curr] + *n; + givptr[curr + 1] += givptr[curr]; + +/* Solve Secular Equation. */ + + if (k != 0) { + dlaed9_(&k, &c__1, &k, n, &d__[1], &work[is], &k, rho, &work[idlmda], + &work[iw], &qstore[qptr[curr]], &k, info); + if (*info != 0) { + goto L30; + } + if (*icompq == 1) { + dgemm_((char *)"N", (char *)"N", qsiz, &k, &k, &c_b10, &work[iq2], &ldq2, &qstore[ + qptr[curr]], &k, &c_b11, &q[q_offset], ldq, (ftnlen)1, ( + ftnlen)1); + } +/* Computing 2nd power */ + i__1 = k; + qptr[curr + 1] = qptr[curr] + i__1 * i__1; + +/* Prepare the INDXQ sorting permutation. */ + + n1 = k; + n2 = *n - k; + dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); + } else { + qptr[curr + 1] = qptr[curr]; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + indxq[i__] = i__; +/* L20: */ + } + } + +L30: + return 0; + +/* End of DLAED7 */ + +} /* dlaed7_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaed8.cpp b/lib/linalg/dlaed8.cpp new file mode 100644 index 0000000000..263bea75d5 --- /dev/null +++ b/lib/linalg/dlaed8.cpp @@ -0,0 +1,610 @@ +/* fortran/dlaed8.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b3 = -1.; +static integer c__1 = 1; + +/* > \brief \b DLAED8 used by DSTEDC. Merges eigenvalues and deflates secular equation. Used when the original + matrix is dense. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAED8 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAED8( ICOMPQ, K, N, QSIZ, D, Q, LDQ, INDXQ, RHO, */ +/* CUTPNT, Z, DLAMDA, Q2, LDQ2, W, PERM, GIVPTR, */ +/* GIVCOL, GIVNUM, INDXP, INDX, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER CUTPNT, GIVPTR, ICOMPQ, INFO, K, LDQ, LDQ2, N, */ +/* $ QSIZ */ +/* DOUBLE PRECISION RHO */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER GIVCOL( 2, * ), INDX( * ), INDXP( * ), */ +/* $ INDXQ( * ), PERM( * ) */ +/* DOUBLE PRECISION D( * ), DLAMDA( * ), GIVNUM( 2, * ), */ +/* $ Q( LDQ, * ), Q2( LDQ2, * ), W( * ), Z( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAED8 merges the two sets of eigenvalues together into a single */ +/* > sorted set. Then it tries to deflate the size of the problem. */ +/* > There are two ways in which deflation can occur: when two or more */ +/* > eigenvalues are close together or if there is a tiny element in the */ +/* > Z vector. For each such occurrence the order of the related secular */ +/* > equation problem is reduced by one. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ICOMPQ */ +/* > \verbatim */ +/* > ICOMPQ is INTEGER */ +/* > = 0: Compute eigenvalues only. */ +/* > = 1: Compute eigenvectors of original dense symmetric matrix */ +/* > also. On entry, Q contains the orthogonal matrix used */ +/* > to reduce the original matrix to tridiagonal form. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of non-deflated eigenvalues, and the order of the */ +/* > related secular equation. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] QSIZ */ +/* > \verbatim */ +/* > QSIZ is INTEGER */ +/* > The dimension of the orthogonal matrix used to reduce */ +/* > the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the eigenvalues of the two submatrices to be */ +/* > combined. On exit, the trailing (N-K) updated eigenvalues */ +/* > (those which were deflated) sorted into increasing order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Q */ +/* > \verbatim */ +/* > Q is DOUBLE PRECISION array, dimension (LDQ,N) */ +/* > If ICOMPQ = 0, Q is not referenced. Otherwise, */ +/* > on entry, Q contains the eigenvectors of the partially solved */ +/* > system which has been previously updated in matrix */ +/* > multiplies with other partially solved eigensystems. */ +/* > On exit, Q contains the trailing (N-K) updated eigenvectors */ +/* > (those which were deflated) in its last N-K columns. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQ */ +/* > \verbatim */ +/* > LDQ is INTEGER */ +/* > The leading dimension of the array Q. LDQ >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INDXQ */ +/* > \verbatim */ +/* > INDXQ is INTEGER array, dimension (N) */ +/* > The permutation which separately sorts the two sub-problems */ +/* > in D into ascending order. Note that elements in the second */ +/* > half of this permutation must first have CUTPNT added to */ +/* > their values in order to be accurate. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > On entry, the off-diagonal element associated with the rank-1 */ +/* > cut which originally split the two submatrices which are now */ +/* > being recombined. */ +/* > On exit, RHO has been modified to the value required by */ +/* > DLAED3. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CUTPNT */ +/* > \verbatim */ +/* > CUTPNT is INTEGER */ +/* > The location of the last eigenvalue in the leading */ +/* > sub-matrix. min(1,N) <= CUTPNT <= N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, Z contains the updating vector (the last row of */ +/* > the first sub-eigenvector matrix and the first row of the */ +/* > second sub-eigenvector matrix). */ +/* > On exit, the contents of Z are destroyed by the updating */ +/* > process. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DLAMDA */ +/* > \verbatim */ +/* > DLAMDA is DOUBLE PRECISION array, dimension (N) */ +/* > A copy of the first K eigenvalues which will be used by */ +/* > DLAED3 to form the secular equation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] Q2 */ +/* > \verbatim */ +/* > Q2 is DOUBLE PRECISION array, dimension (LDQ2,N) */ +/* > If ICOMPQ = 0, Q2 is not referenced. Otherwise, */ +/* > a copy of the first K eigenvectors which will be used by */ +/* > DLAED7 in a matrix multiply (DGEMM) to update the new */ +/* > eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQ2 */ +/* > \verbatim */ +/* > LDQ2 is INTEGER */ +/* > The leading dimension of the array Q2. LDQ2 >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] W */ +/* > \verbatim */ +/* > W is DOUBLE PRECISION array, dimension (N) */ +/* > The first k values of the final deflation-altered z-vector and */ +/* > will be passed to DLAED3. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] PERM */ +/* > \verbatim */ +/* > PERM is INTEGER array, dimension (N) */ +/* > The permutations (from deflation and sorting) to be applied */ +/* > to each eigenblock. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVPTR */ +/* > \verbatim */ +/* > GIVPTR is INTEGER */ +/* > The number of Givens rotations which took place in this */ +/* > subproblem. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVCOL */ +/* > \verbatim */ +/* > GIVCOL is INTEGER array, dimension (2, N) */ +/* > Each pair of numbers indicates a pair of columns to take place */ +/* > in a Givens rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVNUM */ +/* > \verbatim */ +/* > GIVNUM is DOUBLE PRECISION array, dimension (2, N) */ +/* > Each number indicates the S value to be used in the */ +/* > corresponding Givens rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INDXP */ +/* > \verbatim */ +/* > INDXP is INTEGER array, dimension (N) */ +/* > The permutation used to place deflated values of D at the end */ +/* > of the array. INDXP(1:K) points to the nondeflated D-values */ +/* > and INDXP(K+1:N) points to the deflated eigenvalues. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INDX */ +/* > \verbatim */ +/* > INDX is INTEGER array, dimension (N) */ +/* > The permutation used to sort the contents of D into ascending */ +/* > order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Jeff Rutter, Computer Science Division, University of California */ +/* > at Berkeley, USA */ + +/* ===================================================================== */ +/* Subroutine */ int dlaed8_(integer *icompq, integer *k, integer *n, integer + *qsiz, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, + doublereal *rho, integer *cutpnt, doublereal *z__, doublereal *dlamda, + doublereal *q2, integer *ldq2, doublereal *w, integer *perm, integer + *givptr, integer *givcol, doublereal *givnum, integer *indxp, integer + *indx, integer *info) +{ + /* System generated locals */ + integer q_dim1, q_offset, q2_dim1, q2_offset, i__1; + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal c__; + integer i__, j; + doublereal s, t; + integer k2, n1, n2, jp, n1p1; + doublereal eps, tau, tol; + integer jlam, imax, jmax; + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *), dscal_( + integer *, doublereal *, doublereal *, integer *), dcopy_(integer + *, doublereal *, integer *, doublereal *, integer *); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); + extern integer idamax_(integer *, doublereal *, integer *); + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), dlacpy_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ + +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + --indxq; + --z__; + --dlamda; + q2_dim1 = *ldq2; + q2_offset = 1 + q2_dim1; + q2 -= q2_offset; + --w; + --perm; + givcol -= 3; + givnum -= 3; + --indxp; + --indx; + + /* Function Body */ + *info = 0; + + if (*icompq < 0 || *icompq > 1) { + *info = -1; + } else if (*n < 0) { + *info = -3; + } else if (*icompq == 1 && *qsiz < *n) { + *info = -4; + } else if (*ldq < max(1,*n)) { + *info = -7; + } else if (*cutpnt < min(1,*n) || *cutpnt > *n) { + *info = -10; + } else if (*ldq2 < max(1,*n)) { + *info = -14; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLAED8", &i__1, (ftnlen)6); + return 0; + } + +/* Need to initialize GIVPTR to O here in case of quick exit */ +/* to prevent an unspecified code behavior (usually sigfault) */ +/* when IWORK array on entry to *stedc is not zeroed */ +/* (or at least some IWORK entries which used in *laed7 for GIVPTR). */ + + *givptr = 0; + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + n1 = *cutpnt; + n2 = *n - n1; + n1p1 = n1 + 1; + + if (*rho < 0.) { + dscal_(&n2, &c_b3, &z__[n1p1], &c__1); + } + +/* Normalize z so that norm(z) = 1 */ + + t = 1. / sqrt(2.); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + indx[j] = j; +/* L10: */ + } + dscal_(n, &t, &z__[1], &c__1); + *rho = (d__1 = *rho * 2., abs(d__1)); + +/* Sort the eigenvalues into increasing order */ + + i__1 = *n; + for (i__ = *cutpnt + 1; i__ <= i__1; ++i__) { + indxq[i__] += *cutpnt; +/* L20: */ + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dlamda[i__] = d__[indxq[i__]]; + w[i__] = z__[indxq[i__]]; +/* L30: */ + } + i__ = 1; + j = *cutpnt + 1; + dlamrg_(&n1, &n2, &dlamda[1], &c__1, &c__1, &indx[1]); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + d__[i__] = dlamda[indx[i__]]; + z__[i__] = w[indx[i__]]; +/* L40: */ + } + +/* Calculate the allowable deflation tolerance */ + + imax = idamax_(n, &z__[1], &c__1); + jmax = idamax_(n, &d__[1], &c__1); + eps = dlamch_((char *)"Epsilon", (ftnlen)7); + tol = eps * 8. * (d__1 = d__[jmax], abs(d__1)); + +/* If the rank-1 modifier is small enough, no more needs to be done */ +/* except to reorganize Q so that its columns correspond with the */ +/* elements in D. */ + + if (*rho * (d__1 = z__[imax], abs(d__1)) <= tol) { + *k = 0; + if (*icompq == 0) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + perm[j] = indxq[indx[j]]; +/* L50: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + perm[j] = indxq[indx[j]]; + dcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + + 1], &c__1); +/* L60: */ + } + dlacpy_((char *)"A", qsiz, n, &q2[q2_dim1 + 1], ldq2, &q[q_dim1 + 1], ldq, + (ftnlen)1); + } + return 0; + } + +/* If there are multiple eigenvalues then the problem deflates. Here */ +/* the number of equal eigenvalues are found. As each equal */ +/* eigenvalue is found, an elementary reflector is computed to rotate */ +/* the corresponding eigensubspace so that the corresponding */ +/* components of Z are zero in this new basis. */ + + *k = 0; + k2 = *n + 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { + +/* Deflate due to small z component. */ + + --k2; + indxp[k2] = j; + if (j == *n) { + goto L110; + } + } else { + jlam = j; + goto L80; + } +/* L70: */ + } +L80: + ++j; + if (j > *n) { + goto L100; + } + if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { + +/* Deflate due to small z component. */ + + --k2; + indxp[k2] = j; + } else { + +/* Check if eigenvalues are close enough to allow deflation. */ + + s = z__[jlam]; + c__ = z__[j]; + +/* Find sqrt(a**2+b**2) without overflow or */ +/* destructive underflow. */ + + tau = dlapy2_(&c__, &s); + t = d__[j] - d__[jlam]; + c__ /= tau; + s = -s / tau; + if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { + +/* Deflation is possible. */ + + z__[j] = tau; + z__[jlam] = 0.; + +/* Record the appropriate Givens rotation */ + + ++(*givptr); + givcol[(*givptr << 1) + 1] = indxq[indx[jlam]]; + givcol[(*givptr << 1) + 2] = indxq[indx[j]]; + givnum[(*givptr << 1) + 1] = c__; + givnum[(*givptr << 1) + 2] = s; + if (*icompq == 1) { + drot_(qsiz, &q[indxq[indx[jlam]] * q_dim1 + 1], &c__1, &q[ + indxq[indx[j]] * q_dim1 + 1], &c__1, &c__, &s); + } + t = d__[jlam] * c__ * c__ + d__[j] * s * s; + d__[j] = d__[jlam] * s * s + d__[j] * c__ * c__; + d__[jlam] = t; + --k2; + i__ = 1; +L90: + if (k2 + i__ <= *n) { + if (d__[jlam] < d__[indxp[k2 + i__]]) { + indxp[k2 + i__ - 1] = indxp[k2 + i__]; + indxp[k2 + i__] = jlam; + ++i__; + goto L90; + } else { + indxp[k2 + i__ - 1] = jlam; + } + } else { + indxp[k2 + i__ - 1] = jlam; + } + jlam = j; + } else { + ++(*k); + w[*k] = z__[jlam]; + dlamda[*k] = d__[jlam]; + indxp[*k] = jlam; + jlam = j; + } + } + goto L80; +L100: + +/* Record the last eigenvalue. */ + + ++(*k); + w[*k] = z__[jlam]; + dlamda[*k] = d__[jlam]; + indxp[*k] = jlam; + +L110: + +/* Sort the eigenvalues and corresponding eigenvectors into DLAMDA */ +/* and Q2 respectively. The eigenvalues/vectors which were not */ +/* deflated go into the first K slots of DLAMDA and Q2 respectively, */ +/* while those which were deflated go into the last N - K slots. */ + + if (*icompq == 0) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + jp = indxp[j]; + dlamda[j] = d__[jp]; + perm[j] = indxq[indx[jp]]; +/* L120: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + jp = indxp[j]; + dlamda[j] = d__[jp]; + perm[j] = indxq[indx[jp]]; + dcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1] + , &c__1); +/* L130: */ + } + } + +/* The deflated eigenvalues and their corresponding vectors go back */ +/* into the last N - K slots of D and Q respectively. */ + + if (*k < *n) { + if (*icompq == 0) { + i__1 = *n - *k; + dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); + } else { + i__1 = *n - *k; + dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); + i__1 = *n - *k; + dlacpy_((char *)"A", qsiz, &i__1, &q2[(*k + 1) * q2_dim1 + 1], ldq2, &q[(* + k + 1) * q_dim1 + 1], ldq, (ftnlen)1); + } + } + + return 0; + +/* End of DLAED8 */ + +} /* dlaed8_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaed9.cpp b/lib/linalg/dlaed9.cpp new file mode 100644 index 0000000000..f74b8f5bc0 --- /dev/null +++ b/lib/linalg/dlaed9.cpp @@ -0,0 +1,370 @@ +/* fortran/dlaed9.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DLAED9 used by DSTEDC. Finds the roots of the secular equation and updates the eigenvectors. Us +ed when the original matrix is dense. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAED9 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAED9( K, KSTART, KSTOP, N, D, Q, LDQ, RHO, DLAMDA, W, */ +/* S, LDS, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, KSTART, KSTOP, LDQ, LDS, N */ +/* DOUBLE PRECISION RHO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), S( LDS, * ), */ +/* $ W( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAED9 finds the roots of the secular equation, as defined by the */ +/* > values in D, Z, and RHO, between KSTART and KSTOP. It makes the */ +/* > appropriate calls to DLAED4 and then stores the new matrix of */ +/* > eigenvectors for use in calculating the next level of Z vectors. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of terms in the rational function to be solved by */ +/* > DLAED4. K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] KSTART */ +/* > \verbatim */ +/* > KSTART is INTEGER */ +/* > \endverbatim */ +/* > */ +/* > \param[in] KSTOP */ +/* > \verbatim */ +/* > KSTOP is INTEGER */ +/* > The updated eigenvalues Lambda(I), KSTART <= I <= KSTOP */ +/* > are to be computed. 1 <= KSTART <= KSTOP <= K. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of rows and columns in the Q matrix. */ +/* > N >= K (delation may result in N > K). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > D(I) contains the updated eigenvalues */ +/* > for KSTART <= I <= KSTOP. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] Q */ +/* > \verbatim */ +/* > Q is DOUBLE PRECISION array, dimension (LDQ,N) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQ */ +/* > \verbatim */ +/* > LDQ is INTEGER */ +/* > The leading dimension of the array Q. LDQ >= max( 1, N ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > The value of the parameter in the rank one update equation. */ +/* > RHO >= 0 required. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DLAMDA */ +/* > \verbatim */ +/* > DLAMDA is DOUBLE PRECISION array, dimension (K) */ +/* > The first K elements of this array contain the old roots */ +/* > of the deflated updating problem. These are the poles */ +/* > of the secular equation. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] W */ +/* > \verbatim */ +/* > W is DOUBLE PRECISION array, dimension (K) */ +/* > The first K elements of this array contain the components */ +/* > of the deflation-adjusted updating vector. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION array, dimension (LDS, K) */ +/* > Will contain the eigenvectors of the repaired matrix which */ +/* > will be stored for subsequent Z vector calculation and */ +/* > multiplied by the previously accumulated eigenvectors */ +/* > to update the system. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDS */ +/* > \verbatim */ +/* > LDS is INTEGER */ +/* > The leading dimension of S. LDS >= max( 1, K ). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: if INFO = 1, an eigenvalue did not converge */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Jeff Rutter, Computer Science Division, University of California */ +/* > at Berkeley, USA */ + +/* ===================================================================== */ +/* Subroutine */ int dlaed9_(integer *k, integer *kstart, integer *kstop, + integer *n, doublereal *d__, doublereal *q, integer *ldq, doublereal * + rho, doublereal *dlamda, doublereal *w, doublereal *s, integer *lds, + integer *info) +{ + /* System generated locals */ + integer q_dim1, q_offset, s_dim1, s_offset, i__1, i__2; + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal), d_sign(doublereal *, doublereal *); + + /* Local variables */ + integer i__, j; + doublereal temp; + extern doublereal dnrm2_(integer *, doublereal *, integer *); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *), dlaed4_(integer *, integer *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *); + extern doublereal dlamc3_(doublereal *, doublereal *); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + --dlamda; + --w; + s_dim1 = *lds; + s_offset = 1 + s_dim1; + s -= s_offset; + + /* Function Body */ + *info = 0; + + if (*k < 0) { + *info = -1; + } else if (*kstart < 1 || *kstart > max(1,*k)) { + *info = -2; + } else if (max(1,*kstop) < *kstart || *kstop > max(1,*k)) { + *info = -3; + } else if (*n < *k) { + *info = -4; + } else if (*ldq < max(1,*k)) { + *info = -7; + } else if (*lds < max(1,*k)) { + *info = -12; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLAED9", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*k == 0) { + return 0; + } + +/* Modify values DLAMDA(i) to make sure all DLAMDA(i)-DLAMDA(j) can */ +/* be computed with high relative accuracy (barring over/underflow). */ +/* This is a problem on machines without a guard digit in */ +/* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). */ +/* The following code replaces DLAMDA(I) by 2*DLAMDA(I)-DLAMDA(I), */ +/* which on any of these machines zeros out the bottommost */ +/* bit of DLAMDA(I) if it is 1; this makes the subsequent */ +/* subtractions DLAMDA(I)-DLAMDA(J) unproblematic when cancellation */ +/* occurs. On binary machines with a guard digit (almost all */ +/* machines) it does not change DLAMDA(I) at all. On hexadecimal */ +/* and decimal machines with a guard digit, it slightly */ +/* changes the bottommost bits of DLAMDA(I). It does not account */ +/* for hexadecimal or decimal machines without guard digits */ +/* (we know of none). We use a subroutine call to compute */ +/* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating */ +/* this code. */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dlamda[i__] = dlamc3_(&dlamda[i__], &dlamda[i__]) - dlamda[i__]; +/* L10: */ + } + + i__1 = *kstop; + for (j = *kstart; j <= i__1; ++j) { + dlaed4_(k, &j, &dlamda[1], &w[1], &q[j * q_dim1 + 1], rho, &d__[j], + info); + +/* If the zero finder fails, the computation is terminated. */ + + if (*info != 0) { + goto L120; + } +/* L20: */ + } + + if (*k == 1 || *k == 2) { + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = *k; + for (j = 1; j <= i__2; ++j) { + s[j + i__ * s_dim1] = q[j + i__ * q_dim1]; +/* L30: */ + } +/* L40: */ + } + goto L120; + } + +/* Compute updated W. */ + + dcopy_(k, &w[1], &c__1, &s[s_offset], &c__1); + +/* Initialize W(I) = Q(I,I) */ + + i__1 = *ldq + 1; + dcopy_(k, &q[q_offset], &i__1, &w[1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); +/* L50: */ + } + i__2 = *k; + for (i__ = j + 1; i__ <= i__2; ++i__) { + w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); +/* L60: */ + } +/* L70: */ + } + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + d__1 = sqrt(-w[i__]); + w[i__] = d_sign(&d__1, &s[i__ + s_dim1]); +/* L80: */ + } + +/* Compute eigenvectors of the modified rank-1 modification. */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *k; + for (i__ = 1; i__ <= i__2; ++i__) { + q[i__ + j * q_dim1] = w[i__] / q[i__ + j * q_dim1]; +/* L90: */ + } + temp = dnrm2_(k, &q[j * q_dim1 + 1], &c__1); + i__2 = *k; + for (i__ = 1; i__ <= i__2; ++i__) { + s[i__ + j * s_dim1] = q[i__ + j * q_dim1] / temp; +/* L100: */ + } +/* L110: */ + } + +L120: + return 0; + +/* End of DLAED9 */ + +} /* dlaed9_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaeda.cpp b/lib/linalg/dlaeda.cpp new file mode 100644 index 0000000000..f487609f82 --- /dev/null +++ b/lib/linalg/dlaeda.cpp @@ -0,0 +1,386 @@ +/* fortran/dlaeda.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__2 = 2; +static integer c__1 = 1; +static doublereal c_b24 = 1.; +static doublereal c_b26 = 0.; + +/* > \brief \b DLAEDA used by DSTEDC. Computes the Z vector determining the rank-one modification of the diago +nal matrix. Used when the original matrix is dense. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAEDA + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAEDA( N, TLVLS, CURLVL, CURPBM, PRMPTR, PERM, GIVPTR, */ +/* GIVCOL, GIVNUM, Q, QPTR, Z, ZTEMP, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER CURLVL, CURPBM, INFO, N, TLVLS */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER GIVCOL( 2, * ), GIVPTR( * ), PERM( * ), */ +/* $ PRMPTR( * ), QPTR( * ) */ +/* DOUBLE PRECISION GIVNUM( 2, * ), Q( * ), Z( * ), ZTEMP( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAEDA computes the Z vector corresponding to the merge step in the */ +/* > CURLVLth step of the merge process with TLVLS steps for the CURPBMth */ +/* > problem. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TLVLS */ +/* > \verbatim */ +/* > TLVLS is INTEGER */ +/* > The total number of merging levels in the overall divide and */ +/* > conquer tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CURLVL */ +/* > \verbatim */ +/* > CURLVL is INTEGER */ +/* > The current level in the overall merge routine, */ +/* > 0 <= curlvl <= tlvls. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CURPBM */ +/* > \verbatim */ +/* > CURPBM is INTEGER */ +/* > The current problem in the current level in the overall */ +/* > merge routine (counting from upper left to lower right). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PRMPTR */ +/* > \verbatim */ +/* > PRMPTR is INTEGER array, dimension (N lg N) */ +/* > Contains a list of pointers which indicate where in PERM a */ +/* > level's permutation is stored. PRMPTR(i+1) - PRMPTR(i) */ +/* > indicates the size of the permutation and incidentally the */ +/* > size of the full, non-deflated problem. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PERM */ +/* > \verbatim */ +/* > PERM is INTEGER array, dimension (N lg N) */ +/* > Contains the permutations (from deflation and sorting) to be */ +/* > applied to each eigenblock. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVPTR */ +/* > \verbatim */ +/* > GIVPTR is INTEGER array, dimension (N lg N) */ +/* > Contains a list of pointers which indicate where in GIVCOL a */ +/* > level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i) */ +/* > indicates the number of Givens rotations. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVCOL */ +/* > \verbatim */ +/* > GIVCOL is INTEGER array, dimension (2, N lg N) */ +/* > Each pair of numbers indicates a pair of columns to take place */ +/* > in a Givens rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVNUM */ +/* > \verbatim */ +/* > GIVNUM is DOUBLE PRECISION array, dimension (2, N lg N) */ +/* > Each number indicates the S value to be used in the */ +/* > corresponding Givens rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Q */ +/* > \verbatim */ +/* > Q is DOUBLE PRECISION array, dimension (N**2) */ +/* > Contains the square eigenblocks from previous levels, the */ +/* > starting positions for blocks are given by QPTR. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] QPTR */ +/* > \verbatim */ +/* > QPTR is INTEGER array, dimension (N+2) */ +/* > Contains a list of pointers which indicate where in Q an */ +/* > eigenblock is stored. SQRT( QPTR(i+1) - QPTR(i) ) indicates */ +/* > the size of the block. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension (N) */ +/* > On output this vector contains the updating vector (the last */ +/* > row of the first sub-eigenvector matrix and the first row of */ +/* > the second sub-eigenvector matrix). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] ZTEMP */ +/* > \verbatim */ +/* > ZTEMP is DOUBLE PRECISION array, dimension (N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Jeff Rutter, Computer Science Division, University of California */ +/* > at Berkeley, USA */ + +/* ===================================================================== */ +/* Subroutine */ int dlaeda_(integer *n, integer *tlvls, integer *curlvl, + integer *curpbm, integer *prmptr, integer *perm, integer *givptr, + integer *givcol, doublereal *givnum, doublereal *q, integer *qptr, + doublereal *z__, doublereal *ztemp, integer *info) +{ + /* System generated locals */ + integer i__1, i__2, i__3; + + /* Builtin functions */ + integer pow_ii(integer *, integer *); + double sqrt(doublereal); + + /* Local variables */ + integer i__, k, mid, ptr; + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *); + integer curr, bsiz1, bsiz2, psiz1, psiz2, zptr1; + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen), dcopy_(integer *, + doublereal *, integer *, doublereal *, integer *), xerbla_(char *, + integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --ztemp; + --z__; + --qptr; + --q; + givnum -= 3; + givcol -= 3; + --givptr; + --perm; + --prmptr; + + /* Function Body */ + *info = 0; + + if (*n < 0) { + *info = -1; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLAEDA", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* Determine location of first number in second half. */ + + mid = *n / 2 + 1; + +/* Gather last/first rows of appropriate eigenblocks into center of Z */ + + ptr = 1; + +/* Determine location of lowest level subproblem in the full storage */ +/* scheme */ + + i__1 = *curlvl - 1; + curr = ptr + *curpbm * pow_ii(&c__2, curlvl) + pow_ii(&c__2, &i__1) - 1; + +/* Determine size of these matrices. We add HALF to the value of */ +/* the SQRT in case the machine underestimates one of these square */ +/* roots. */ + + bsiz1 = (integer) (sqrt((doublereal) (qptr[curr + 1] - qptr[curr])) + .5); + bsiz2 = (integer) (sqrt((doublereal) (qptr[curr + 2] - qptr[curr + 1])) + + .5); + i__1 = mid - bsiz1 - 1; + for (k = 1; k <= i__1; ++k) { + z__[k] = 0.; +/* L10: */ + } + dcopy_(&bsiz1, &q[qptr[curr] + bsiz1 - 1], &bsiz1, &z__[mid - bsiz1], & + c__1); + dcopy_(&bsiz2, &q[qptr[curr + 1]], &bsiz2, &z__[mid], &c__1); + i__1 = *n; + for (k = mid + bsiz2; k <= i__1; ++k) { + z__[k] = 0.; +/* L20: */ + } + +/* Loop through remaining levels 1 -> CURLVL applying the Givens */ +/* rotations and permutation and then multiplying the center matrices */ +/* against the current Z. */ + + ptr = pow_ii(&c__2, tlvls) + 1; + i__1 = *curlvl - 1; + for (k = 1; k <= i__1; ++k) { + i__2 = *curlvl - k; + i__3 = *curlvl - k - 1; + curr = ptr + *curpbm * pow_ii(&c__2, &i__2) + pow_ii(&c__2, &i__3) - + 1; + psiz1 = prmptr[curr + 1] - prmptr[curr]; + psiz2 = prmptr[curr + 2] - prmptr[curr + 1]; + zptr1 = mid - psiz1; + +/* Apply Givens at CURR and CURR+1 */ + + i__2 = givptr[curr + 1] - 1; + for (i__ = givptr[curr]; i__ <= i__2; ++i__) { + drot_(&c__1, &z__[zptr1 + givcol[(i__ << 1) + 1] - 1], &c__1, & + z__[zptr1 + givcol[(i__ << 1) + 2] - 1], &c__1, &givnum[( + i__ << 1) + 1], &givnum[(i__ << 1) + 2]); +/* L30: */ + } + i__2 = givptr[curr + 2] - 1; + for (i__ = givptr[curr + 1]; i__ <= i__2; ++i__) { + drot_(&c__1, &z__[mid - 1 + givcol[(i__ << 1) + 1]], &c__1, &z__[ + mid - 1 + givcol[(i__ << 1) + 2]], &c__1, &givnum[(i__ << + 1) + 1], &givnum[(i__ << 1) + 2]); +/* L40: */ + } + psiz1 = prmptr[curr + 1] - prmptr[curr]; + psiz2 = prmptr[curr + 2] - prmptr[curr + 1]; + i__2 = psiz1 - 1; + for (i__ = 0; i__ <= i__2; ++i__) { + ztemp[i__ + 1] = z__[zptr1 + perm[prmptr[curr] + i__] - 1]; +/* L50: */ + } + i__2 = psiz2 - 1; + for (i__ = 0; i__ <= i__2; ++i__) { + ztemp[psiz1 + i__ + 1] = z__[mid + perm[prmptr[curr + 1] + i__] - + 1]; +/* L60: */ + } + +/* Multiply Blocks at CURR and CURR+1 */ + +/* Determine size of these matrices. We add HALF to the value of */ +/* the SQRT in case the machine underestimates one of these */ +/* square roots. */ + + bsiz1 = (integer) (sqrt((doublereal) (qptr[curr + 1] - qptr[curr])) + + .5); + bsiz2 = (integer) (sqrt((doublereal) (qptr[curr + 2] - qptr[curr + 1]) + ) + .5); + if (bsiz1 > 0) { + dgemv_((char *)"T", &bsiz1, &bsiz1, &c_b24, &q[qptr[curr]], &bsiz1, & + ztemp[1], &c__1, &c_b26, &z__[zptr1], &c__1, (ftnlen)1); + } + i__2 = psiz1 - bsiz1; + dcopy_(&i__2, &ztemp[bsiz1 + 1], &c__1, &z__[zptr1 + bsiz1], &c__1); + if (bsiz2 > 0) { + dgemv_((char *)"T", &bsiz2, &bsiz2, &c_b24, &q[qptr[curr + 1]], &bsiz2, & + ztemp[psiz1 + 1], &c__1, &c_b26, &z__[mid], &c__1, ( + ftnlen)1); + } + i__2 = psiz2 - bsiz2; + dcopy_(&i__2, &ztemp[psiz1 + bsiz2 + 1], &c__1, &z__[mid + bsiz2], & + c__1); + + i__2 = *tlvls - k; + ptr += pow_ii(&c__2, &i__2); +/* L70: */ + } + + return 0; + +/* End of DLAEDA */ + +} /* dlaeda_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaev2.cpp b/lib/linalg/dlaev2.cpp new file mode 100644 index 0000000000..32f4eb5424 --- /dev/null +++ b/lib/linalg/dlaev2.cpp @@ -0,0 +1,263 @@ +/* fortran/dlaev2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLAEV2 computes the eigenvalues and eigenvectors of a 2-by-2 symmetric/Hermitian matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAEV2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAEV2( A, B, C, RT1, RT2, CS1, SN1 ) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION A, B, C, CS1, RT1, RT2, SN1 */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAEV2 computes the eigendecomposition of a 2-by-2 symmetric matrix */ +/* > [ A B ] */ +/* > [ B C ]. */ +/* > On return, RT1 is the eigenvalue of larger absolute value, RT2 is the */ +/* > eigenvalue of smaller absolute value, and (CS1,SN1) is the unit right */ +/* > eigenvector for RT1, giving the decomposition */ +/* > */ +/* > [ CS1 SN1 ] [ A B ] [ CS1 -SN1 ] = [ RT1 0 ] */ +/* > [-SN1 CS1 ] [ B C ] [ SN1 CS1 ] [ 0 RT2 ]. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION */ +/* > The (1,1) element of the 2-by-2 matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION */ +/* > The (1,2) element and the conjugate of the (2,1) element of */ +/* > the 2-by-2 matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION */ +/* > The (2,2) element of the 2-by-2 matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RT1 */ +/* > \verbatim */ +/* > RT1 is DOUBLE PRECISION */ +/* > The eigenvalue of larger absolute value. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RT2 */ +/* > \verbatim */ +/* > RT2 is DOUBLE PRECISION */ +/* > The eigenvalue of smaller absolute value. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] CS1 */ +/* > \verbatim */ +/* > CS1 is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[out] SN1 */ +/* > \verbatim */ +/* > SN1 is DOUBLE PRECISION */ +/* > The vector (CS1, SN1) is a unit right eigenvector for RT1. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > RT1 is accurate to a few ulps barring over/underflow. */ +/* > */ +/* > RT2 may be inaccurate if there is massive cancellation in the */ +/* > determinant A*C-B*B; higher precision or correctly rounded or */ +/* > correctly truncated arithmetic would be needed to compute RT2 */ +/* > accurately in all cases. */ +/* > */ +/* > CS1 and SN1 are accurate to a few ulps barring over/underflow. */ +/* > */ +/* > Overflow is possible only if RT1 is within a factor of 5 of overflow. */ +/* > Underflow is harmless if the input data is 0 or exceeds */ +/* > underflow_threshold / macheps. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlaev2_(doublereal *a, doublereal *b, doublereal *c__, + doublereal *rt1, doublereal *rt2, doublereal *cs1, doublereal *sn1) +{ + /* System generated locals */ + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal ab, df, cs, ct, tb, sm, tn, rt, adf, acs; + integer sgn1, sgn2; + doublereal acmn, acmx; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Compute the eigenvalues */ + + sm = *a + *c__; + df = *a - *c__; + adf = abs(df); + tb = *b + *b; + ab = abs(tb); + if (abs(*a) > abs(*c__)) { + acmx = *a; + acmn = *c__; + } else { + acmx = *c__; + acmn = *a; + } + if (adf > ab) { +/* Computing 2nd power */ + d__1 = ab / adf; + rt = adf * sqrt(d__1 * d__1 + 1.); + } else if (adf < ab) { +/* Computing 2nd power */ + d__1 = adf / ab; + rt = ab * sqrt(d__1 * d__1 + 1.); + } else { + +/* Includes case AB=ADF=0 */ + + rt = ab * sqrt(2.); + } + if (sm < 0.) { + *rt1 = (sm - rt) * .5; + sgn1 = -1; + +/* Order of execution important. */ +/* To get fully accurate smaller eigenvalue, */ +/* next line needs to be executed in higher precision. */ + + *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; + } else if (sm > 0.) { + *rt1 = (sm + rt) * .5; + sgn1 = 1; + +/* Order of execution important. */ +/* To get fully accurate smaller eigenvalue, */ +/* next line needs to be executed in higher precision. */ + + *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; + } else { + +/* Includes case RT1 = RT2 = 0 */ + + *rt1 = rt * .5; + *rt2 = rt * -.5; + sgn1 = 1; + } + +/* Compute the eigenvector */ + + if (df >= 0.) { + cs = df + rt; + sgn2 = 1; + } else { + cs = df - rt; + sgn2 = -1; + } + acs = abs(cs); + if (acs > ab) { + ct = -tb / cs; + *sn1 = 1. / sqrt(ct * ct + 1.); + *cs1 = ct * *sn1; + } else { + if (ab == 0.) { + *cs1 = 1.; + *sn1 = 0.; + } else { + tn = -cs / tb; + *cs1 = 1. / sqrt(tn * tn + 1.); + *sn1 = tn * *cs1; + } + } + if (sgn1 == sgn2) { + tn = *cs1; + *cs1 = -(*sn1); + *sn1 = tn; + } + return 0; + +/* End of DLAEV2 */ + +} /* dlaev2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlals0.cpp b/lib/linalg/dlals0.cpp new file mode 100644 index 0000000000..ce36d7d553 --- /dev/null +++ b/lib/linalg/dlals0.cpp @@ -0,0 +1,602 @@ +/* fortran/dlals0.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b5 = -1.; +static integer c__1 = 1; +static doublereal c_b11 = 1.; +static doublereal c_b13 = 0.; +static integer c__0 = 0; + +/* > \brief \b DLALS0 applies back multiplying factors in solving the least squares problem using divide and c +onquer SVD approach. Used by sgelsd. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLALS0 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX, */ +/* PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, */ +/* POLES, DIFL, DIFR, Z, K, C, S, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER GIVPTR, ICOMPQ, INFO, K, LDB, LDBX, LDGCOL, */ +/* $ LDGNUM, NL, NR, NRHS, SQRE */ +/* DOUBLE PRECISION C, S */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER GIVCOL( LDGCOL, * ), PERM( * ) */ +/* DOUBLE PRECISION B( LDB, * ), BX( LDBX, * ), DIFL( * ), */ +/* $ DIFR( LDGNUM, * ), GIVNUM( LDGNUM, * ), */ +/* $ POLES( LDGNUM, * ), WORK( * ), Z( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLALS0 applies back the multiplying factors of either the left or the */ +/* > right singular vector matrix of a diagonal matrix appended by a row */ +/* > to the right hand side matrix B in solving the least squares problem */ +/* > using the divide-and-conquer SVD approach. */ +/* > */ +/* > For the left singular vector matrix, three types of orthogonal */ +/* > matrices are involved: */ +/* > */ +/* > (1L) Givens rotations: the number of such rotations is GIVPTR; the */ +/* > pairs of columns/rows they were applied to are stored in GIVCOL; */ +/* > and the C- and S-values of these rotations are stored in GIVNUM. */ +/* > */ +/* > (2L) Permutation. The (NL+1)-st row of B is to be moved to the first */ +/* > row, and for J=2:N, PERM(J)-th row of B is to be moved to the */ +/* > J-th row. */ +/* > */ +/* > (3L) The left singular vector matrix of the remaining matrix. */ +/* > */ +/* > For the right singular vector matrix, four types of orthogonal */ +/* > matrices are involved: */ +/* > */ +/* > (1R) The right singular vector matrix of the remaining matrix. */ +/* > */ +/* > (2R) If SQRE = 1, one extra Givens rotation to generate the right */ +/* > null space. */ +/* > */ +/* > (3R) The inverse transformation of (2L). */ +/* > */ +/* > (4R) The inverse transformation of (1L). */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ICOMPQ */ +/* > \verbatim */ +/* > ICOMPQ is INTEGER */ +/* > Specifies whether singular vectors are to be computed in */ +/* > factored form: */ +/* > = 0: Left singular vector matrix. */ +/* > = 1: Right singular vector matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NL */ +/* > \verbatim */ +/* > NL is INTEGER */ +/* > The row dimension of the upper block. NL >= 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NR */ +/* > \verbatim */ +/* > NR is INTEGER */ +/* > The row dimension of the lower block. NR >= 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] SQRE */ +/* > \verbatim */ +/* > SQRE is INTEGER */ +/* > = 0: the lower block is an NR-by-NR square matrix. */ +/* > = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */ +/* > */ +/* > The bidiagonal matrix has row dimension N = NL + NR + 1, */ +/* > and column dimension M = N + SQRE. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NRHS */ +/* > \verbatim */ +/* > NRHS is INTEGER */ +/* > The number of columns of B and BX. NRHS must be at least 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension ( LDB, NRHS ) */ +/* > On input, B contains the right hand sides of the least */ +/* > squares problem in rows 1 through M. On output, B contains */ +/* > the solution X in rows 1 through N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of B. LDB must be at least */ +/* > max(1,MAX( M, N ) ). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] BX */ +/* > \verbatim */ +/* > BX is DOUBLE PRECISION array, dimension ( LDBX, NRHS ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDBX */ +/* > \verbatim */ +/* > LDBX is INTEGER */ +/* > The leading dimension of BX. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PERM */ +/* > \verbatim */ +/* > PERM is INTEGER array, dimension ( N ) */ +/* > The permutations (from deflation and sorting) applied */ +/* > to the two blocks. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVPTR */ +/* > \verbatim */ +/* > GIVPTR is INTEGER */ +/* > The number of Givens rotations which took place in this */ +/* > subproblem. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVCOL */ +/* > \verbatim */ +/* > GIVCOL is INTEGER array, dimension ( LDGCOL, 2 ) */ +/* > Each pair of numbers indicates a pair of rows/columns */ +/* > involved in a Givens rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDGCOL */ +/* > \verbatim */ +/* > LDGCOL is INTEGER */ +/* > The leading dimension of GIVCOL, must be at least N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVNUM */ +/* > \verbatim */ +/* > GIVNUM is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ +/* > Each number indicates the C or S value used in the */ +/* > corresponding Givens rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDGNUM */ +/* > \verbatim */ +/* > LDGNUM is INTEGER */ +/* > The leading dimension of arrays DIFR, POLES and */ +/* > GIVNUM, must be at least K. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] POLES */ +/* > \verbatim */ +/* > POLES is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ +/* > On entry, POLES(1:K, 1) contains the new singular */ +/* > values obtained from solving the secular equation, and */ +/* > POLES(1:K, 2) is an array containing the poles in the secular */ +/* > equation. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIFL */ +/* > \verbatim */ +/* > DIFL is DOUBLE PRECISION array, dimension ( K ). */ +/* > On entry, DIFL(I) is the distance between I-th updated */ +/* > (undeflated) singular value and the I-th (undeflated) old */ +/* > singular value. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIFR */ +/* > \verbatim */ +/* > DIFR is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ). */ +/* > On entry, DIFR(I, 1) contains the distances between I-th */ +/* > updated (undeflated) singular value and the I+1-th */ +/* > (undeflated) old singular value. And DIFR(I, 2) is the */ +/* > normalizing factor for the I-th right singular vector. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension ( K ) */ +/* > Contain the components of the deflation-adjusted updating row */ +/* > vector. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > Contains the dimension of the non-deflated matrix, */ +/* > This is the order of the related secular equation. 1 <= K <=N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION */ +/* > C contains garbage if SQRE =0 and the C-value of a Givens */ +/* > rotation related to the right null space if SQRE = 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION */ +/* > S contains garbage if SQRE =0 and the S-value of a Givens */ +/* > rotation related to the right null space if SQRE = 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension ( K ) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ming Gu and Ren-Cang Li, Computer Science Division, University of */ +/* > California at Berkeley, USA \n */ +/* > Osni Marques, LBNL/NERSC, USA \n */ + +/* ===================================================================== */ +/* Subroutine */ int dlals0_(integer *icompq, integer *nl, integer *nr, + integer *sqre, integer *nrhs, doublereal *b, integer *ldb, doublereal + *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, + integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal * + poles, doublereal *difl, doublereal *difr, doublereal *z__, integer * + k, doublereal *c__, doublereal *s, doublereal *work, integer *info) +{ + /* System generated locals */ + integer givcol_dim1, givcol_offset, b_dim1, b_offset, bx_dim1, bx_offset, + difr_dim1, difr_offset, givnum_dim1, givnum_offset, poles_dim1, + poles_offset, i__1, i__2; + doublereal d__1; + + /* Local variables */ + integer i__, j, m, n; + doublereal dj; + integer nlp1; + doublereal temp; + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *); + extern doublereal dnrm2_(integer *, doublereal *, integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); + doublereal diflj, difrj, dsigj; + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen), dcopy_(integer *, + doublereal *, integer *, doublereal *, integer *); + extern doublereal dlamc3_(doublereal *, doublereal *); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dlacpy_(char *, integer *, integer + *, doublereal *, integer *, doublereal *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); + doublereal dsigjp; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + bx_dim1 = *ldbx; + bx_offset = 1 + bx_dim1; + bx -= bx_offset; + --perm; + givcol_dim1 = *ldgcol; + givcol_offset = 1 + givcol_dim1; + givcol -= givcol_offset; + difr_dim1 = *ldgnum; + difr_offset = 1 + difr_dim1; + difr -= difr_offset; + poles_dim1 = *ldgnum; + poles_offset = 1 + poles_dim1; + poles -= poles_offset; + givnum_dim1 = *ldgnum; + givnum_offset = 1 + givnum_dim1; + givnum -= givnum_offset; + --difl; + --z__; + --work; + + /* Function Body */ + *info = 0; + n = *nl + *nr + 1; + + if (*icompq < 0 || *icompq > 1) { + *info = -1; + } else if (*nl < 1) { + *info = -2; + } else if (*nr < 1) { + *info = -3; + } else if (*sqre < 0 || *sqre > 1) { + *info = -4; + } else if (*nrhs < 1) { + *info = -5; + } else if (*ldb < n) { + *info = -7; + } else if (*ldbx < n) { + *info = -9; + } else if (*givptr < 0) { + *info = -11; + } else if (*ldgcol < n) { + *info = -13; + } else if (*ldgnum < n) { + *info = -15; + } else if (*k < 1) { + *info = -20; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLALS0", &i__1, (ftnlen)6); + return 0; + } + + m = n + *sqre; + nlp1 = *nl + 1; + + if (*icompq == 0) { + +/* Apply back orthogonal transformations from the left. */ + +/* Step (1L): apply back the Givens rotations performed. */ + + i__1 = *givptr; + for (i__ = 1; i__ <= i__1; ++i__) { + drot_(nrhs, &b[givcol[i__ + (givcol_dim1 << 1)] + b_dim1], ldb, & + b[givcol[i__ + givcol_dim1] + b_dim1], ldb, &givnum[i__ + + (givnum_dim1 << 1)], &givnum[i__ + givnum_dim1]); +/* L10: */ + } + +/* Step (2L): permute rows of B. */ + + dcopy_(nrhs, &b[nlp1 + b_dim1], ldb, &bx[bx_dim1 + 1], ldbx); + i__1 = n; + for (i__ = 2; i__ <= i__1; ++i__) { + dcopy_(nrhs, &b[perm[i__] + b_dim1], ldb, &bx[i__ + bx_dim1], + ldbx); +/* L20: */ + } + +/* Step (3L): apply the inverse of the left singular vector */ +/* matrix to BX. */ + + if (*k == 1) { + dcopy_(nrhs, &bx[bx_offset], ldbx, &b[b_offset], ldb); + if (z__[1] < 0.) { + dscal_(nrhs, &c_b5, &b[b_offset], ldb); + } + } else { + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + diflj = difl[j]; + dj = poles[j + poles_dim1]; + dsigj = -poles[j + (poles_dim1 << 1)]; + if (j < *k) { + difrj = -difr[j + difr_dim1]; + dsigjp = -poles[j + 1 + (poles_dim1 << 1)]; + } + if (z__[j] == 0. || poles[j + (poles_dim1 << 1)] == 0.) { + work[j] = 0.; + } else { + work[j] = -poles[j + (poles_dim1 << 1)] * z__[j] / diflj / + (poles[j + (poles_dim1 << 1)] + dj); + } + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + if (z__[i__] == 0. || poles[i__ + (poles_dim1 << 1)] == + 0.) { + work[i__] = 0.; + } else { + work[i__] = poles[i__ + (poles_dim1 << 1)] * z__[i__] + / (dlamc3_(&poles[i__ + (poles_dim1 << 1)], & + dsigj) - diflj) / (poles[i__ + (poles_dim1 << + 1)] + dj); + } +/* L30: */ + } + i__2 = *k; + for (i__ = j + 1; i__ <= i__2; ++i__) { + if (z__[i__] == 0. || poles[i__ + (poles_dim1 << 1)] == + 0.) { + work[i__] = 0.; + } else { + work[i__] = poles[i__ + (poles_dim1 << 1)] * z__[i__] + / (dlamc3_(&poles[i__ + (poles_dim1 << 1)], & + dsigjp) + difrj) / (poles[i__ + (poles_dim1 << + 1)] + dj); + } +/* L40: */ + } + work[1] = -1.; + temp = dnrm2_(k, &work[1], &c__1); + dgemv_((char *)"T", k, nrhs, &c_b11, &bx[bx_offset], ldbx, &work[1], & + c__1, &c_b13, &b[j + b_dim1], ldb, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &temp, &c_b11, &c__1, nrhs, &b[j + + b_dim1], ldb, info, (ftnlen)1); +/* L50: */ + } + } + +/* Move the deflated rows of BX to B also. */ + + if (*k < max(m,n)) { + i__1 = n - *k; + dlacpy_((char *)"A", &i__1, nrhs, &bx[*k + 1 + bx_dim1], ldbx, &b[*k + 1 + + b_dim1], ldb, (ftnlen)1); + } + } else { + +/* Apply back the right orthogonal transformations. */ + +/* Step (1R): apply back the new right singular vector matrix */ +/* to B. */ + + if (*k == 1) { + dcopy_(nrhs, &b[b_offset], ldb, &bx[bx_offset], ldbx); + } else { + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dsigj = poles[j + (poles_dim1 << 1)]; + if (z__[j] == 0.) { + work[j] = 0.; + } else { + work[j] = -z__[j] / difl[j] / (dsigj + poles[j + + poles_dim1]) / difr[j + (difr_dim1 << 1)]; + } + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + if (z__[j] == 0.) { + work[i__] = 0.; + } else { + d__1 = -poles[i__ + 1 + (poles_dim1 << 1)]; + work[i__] = z__[j] / (dlamc3_(&dsigj, &d__1) - difr[ + i__ + difr_dim1]) / (dsigj + poles[i__ + + poles_dim1]) / difr[i__ + (difr_dim1 << 1)]; + } +/* L60: */ + } + i__2 = *k; + for (i__ = j + 1; i__ <= i__2; ++i__) { + if (z__[j] == 0.) { + work[i__] = 0.; + } else { + d__1 = -poles[i__ + (poles_dim1 << 1)]; + work[i__] = z__[j] / (dlamc3_(&dsigj, &d__1) - difl[ + i__]) / (dsigj + poles[i__ + poles_dim1]) / + difr[i__ + (difr_dim1 << 1)]; + } +/* L70: */ + } + dgemv_((char *)"T", k, nrhs, &c_b11, &b[b_offset], ldb, &work[1], & + c__1, &c_b13, &bx[j + bx_dim1], ldbx, (ftnlen)1); +/* L80: */ + } + } + +/* Step (2R): if SQRE = 1, apply back the rotation that is */ +/* related to the right null space of the subproblem. */ + + if (*sqre == 1) { + dcopy_(nrhs, &b[m + b_dim1], ldb, &bx[m + bx_dim1], ldbx); + drot_(nrhs, &bx[bx_dim1 + 1], ldbx, &bx[m + bx_dim1], ldbx, c__, + s); + } + if (*k < max(m,n)) { + i__1 = n - *k; + dlacpy_((char *)"A", &i__1, nrhs, &b[*k + 1 + b_dim1], ldb, &bx[*k + 1 + + bx_dim1], ldbx, (ftnlen)1); + } + +/* Step (3R): permute rows of B. */ + + dcopy_(nrhs, &bx[bx_dim1 + 1], ldbx, &b[nlp1 + b_dim1], ldb); + if (*sqre == 1) { + dcopy_(nrhs, &bx[m + bx_dim1], ldbx, &b[m + b_dim1], ldb); + } + i__1 = n; + for (i__ = 2; i__ <= i__1; ++i__) { + dcopy_(nrhs, &bx[i__ + bx_dim1], ldbx, &b[perm[i__] + b_dim1], + ldb); +/* L90: */ + } + +/* Step (4R): apply back the Givens rotations performed. */ + + for (i__ = *givptr; i__ >= 1; --i__) { + d__1 = -givnum[i__ + givnum_dim1]; + drot_(nrhs, &b[givcol[i__ + (givcol_dim1 << 1)] + b_dim1], ldb, & + b[givcol[i__ + givcol_dim1] + b_dim1], ldb, &givnum[i__ + + (givnum_dim1 << 1)], &d__1); +/* L100: */ + } + } + + return 0; + +/* End of DLALS0 */ + +} /* dlals0_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlalsa.cpp b/lib/linalg/dlalsa.cpp new file mode 100644 index 0000000000..7c09a46de3 --- /dev/null +++ b/lib/linalg/dlalsa.cpp @@ -0,0 +1,598 @@ +/* fortran/dlalsa.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b7 = 1.; +static doublereal c_b8 = 0.; +static integer c__2 = 2; + +/* > \brief \b DLALSA computes the SVD of the coefficient matrix in compact form. Used by sgelsd. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLALSA + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLALSA( ICOMPQ, SMLSIZ, N, NRHS, B, LDB, BX, LDBX, U, */ +/* LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR, */ +/* GIVCOL, LDGCOL, PERM, GIVNUM, C, S, WORK, */ +/* IWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER ICOMPQ, INFO, LDB, LDBX, LDGCOL, LDU, N, NRHS, */ +/* $ SMLSIZ */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ), */ +/* $ K( * ), PERM( LDGCOL, * ) */ +/* DOUBLE PRECISION B( LDB, * ), BX( LDBX, * ), C( * ), */ +/* $ DIFL( LDU, * ), DIFR( LDU, * ), */ +/* $ GIVNUM( LDU, * ), POLES( LDU, * ), S( * ), */ +/* $ U( LDU, * ), VT( LDU, * ), WORK( * ), */ +/* $ Z( LDU, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLALSA is an itermediate step in solving the least squares problem */ +/* > by computing the SVD of the coefficient matrix in compact form (The */ +/* > singular vectors are computed as products of simple orthorgonal */ +/* > matrices.). */ +/* > */ +/* > If ICOMPQ = 0, DLALSA applies the inverse of the left singular vector */ +/* > matrix of an upper bidiagonal matrix to the right hand side; and if */ +/* > ICOMPQ = 1, DLALSA applies the right singular vector matrix to the */ +/* > right hand side. The singular vector matrices were generated in */ +/* > compact form by DLALSA. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ICOMPQ */ +/* > \verbatim */ +/* > ICOMPQ is INTEGER */ +/* > Specifies whether the left or the right singular vector */ +/* > matrix is involved. */ +/* > = 0: Left singular vector matrix */ +/* > = 1: Right singular vector matrix */ +/* > \endverbatim */ +/* > */ +/* > \param[in] SMLSIZ */ +/* > \verbatim */ +/* > SMLSIZ is INTEGER */ +/* > The maximum size of the subproblems at the bottom of the */ +/* > computation tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The row and column dimensions of the upper bidiagonal matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NRHS */ +/* > \verbatim */ +/* > NRHS is INTEGER */ +/* > The number of columns of B and BX. NRHS must be at least 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension ( LDB, NRHS ) */ +/* > On input, B contains the right hand sides of the least */ +/* > squares problem in rows 1 through M. */ +/* > On output, B contains the solution X in rows 1 through N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of B in the calling subprogram. */ +/* > LDB must be at least max(1,MAX( M, N ) ). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] BX */ +/* > \verbatim */ +/* > BX is DOUBLE PRECISION array, dimension ( LDBX, NRHS ) */ +/* > On exit, the result of applying the left or right singular */ +/* > vector matrix to B. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDBX */ +/* > \verbatim */ +/* > LDBX is INTEGER */ +/* > The leading dimension of BX. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] U */ +/* > \verbatim */ +/* > U is DOUBLE PRECISION array, dimension ( LDU, SMLSIZ ). */ +/* > On entry, U contains the left singular vector matrices of all */ +/* > subproblems at the bottom level. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDU */ +/* > \verbatim */ +/* > LDU is INTEGER, LDU = > N. */ +/* > The leading dimension of arrays U, VT, DIFL, DIFR, */ +/* > POLES, GIVNUM, and Z. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] VT */ +/* > \verbatim */ +/* > VT is DOUBLE PRECISION array, dimension ( LDU, SMLSIZ+1 ). */ +/* > On entry, VT**T contains the right singular vector matrices of */ +/* > all subproblems at the bottom level. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER array, dimension ( N ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIFL */ +/* > \verbatim */ +/* > DIFL is DOUBLE PRECISION array, dimension ( LDU, NLVL ). */ +/* > where NLVL = INT(log_2 (N/(SMLSIZ+1))) + 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIFR */ +/* > \verbatim */ +/* > DIFR is DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ). */ +/* > On entry, DIFL(*, I) and DIFR(*, 2 * I -1) record */ +/* > distances between singular values on the I-th level and */ +/* > singular values on the (I -1)-th level, and DIFR(*, 2 * I) */ +/* > record the normalizing factors of the right singular vectors */ +/* > matrices of subproblems on I-th level. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension ( LDU, NLVL ). */ +/* > On entry, Z(1, I) contains the components of the deflation- */ +/* > adjusted updating row vector for subproblems on the I-th */ +/* > level. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] POLES */ +/* > \verbatim */ +/* > POLES is DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ). */ +/* > On entry, POLES(*, 2 * I -1: 2 * I) contains the new and old */ +/* > singular values involved in the secular equations on the I-th */ +/* > level. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVPTR */ +/* > \verbatim */ +/* > GIVPTR is INTEGER array, dimension ( N ). */ +/* > On entry, GIVPTR( I ) records the number of Givens */ +/* > rotations performed on the I-th problem on the computation */ +/* > tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVCOL */ +/* > \verbatim */ +/* > GIVCOL is INTEGER array, dimension ( LDGCOL, 2 * NLVL ). */ +/* > On entry, for each I, GIVCOL(*, 2 * I - 1: 2 * I) records the */ +/* > locations of Givens rotations performed on the I-th level on */ +/* > the computation tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDGCOL */ +/* > \verbatim */ +/* > LDGCOL is INTEGER, LDGCOL = > N. */ +/* > The leading dimension of arrays GIVCOL and PERM. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PERM */ +/* > \verbatim */ +/* > PERM is INTEGER array, dimension ( LDGCOL, NLVL ). */ +/* > On entry, PERM(*, I) records permutations done on the I-th */ +/* > level of the computation tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVNUM */ +/* > \verbatim */ +/* > GIVNUM is DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ). */ +/* > On entry, GIVNUM(*, 2 *I -1 : 2 * I) records the C- and S- */ +/* > values of Givens rotations performed on the I-th level on the */ +/* > computation tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension ( N ). */ +/* > On entry, if the I-th subproblem is not square, */ +/* > C( I ) contains the C-value of a Givens rotation related to */ +/* > the right null space of the I-th subproblem. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION array, dimension ( N ). */ +/* > On entry, if the I-th subproblem is not square, */ +/* > S( I ) contains the S-value of a Givens rotation related to */ +/* > the right null space of the I-th subproblem. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension (3*N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ming Gu and Ren-Cang Li, Computer Science Division, University of */ +/* > California at Berkeley, USA \n */ +/* > Osni Marques, LBNL/NERSC, USA \n */ + +/* ===================================================================== */ +/* Subroutine */ int dlalsa_(integer *icompq, integer *smlsiz, integer *n, + integer *nrhs, doublereal *b, integer *ldb, doublereal *bx, integer * + ldbx, doublereal *u, integer *ldu, doublereal *vt, integer *k, + doublereal *difl, doublereal *difr, doublereal *z__, doublereal * + poles, integer *givptr, integer *givcol, integer *ldgcol, integer * + perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal * + work, integer *iwork, integer *info) +{ + /* System generated locals */ + integer givcol_dim1, givcol_offset, perm_dim1, perm_offset, b_dim1, + b_offset, bx_dim1, bx_offset, difl_dim1, difl_offset, difr_dim1, + difr_offset, givnum_dim1, givnum_offset, poles_dim1, poles_offset, + u_dim1, u_offset, vt_dim1, vt_offset, z_dim1, z_offset, i__1, + i__2; + + /* Builtin functions */ + integer pow_ii(integer *, integer *); + + /* Local variables */ + integer i__, j, i1, ic, lf, nd, ll, nl, nr, im1, nlf, nrf, lvl, ndb1, + nlp1, lvl2, nrp1, nlvl, sqre; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer inode, ndiml, ndimr; + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *), dlals0_(integer *, integer *, integer *, + integer *, integer *, doublereal *, integer *, doublereal *, + integer *, integer *, integer *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, doublereal *, doublereal *, + integer *), dlasdt_(integer *, integer *, integer *, integer *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + bx_dim1 = *ldbx; + bx_offset = 1 + bx_dim1; + bx -= bx_offset; + givnum_dim1 = *ldu; + givnum_offset = 1 + givnum_dim1; + givnum -= givnum_offset; + poles_dim1 = *ldu; + poles_offset = 1 + poles_dim1; + poles -= poles_offset; + z_dim1 = *ldu; + z_offset = 1 + z_dim1; + z__ -= z_offset; + difr_dim1 = *ldu; + difr_offset = 1 + difr_dim1; + difr -= difr_offset; + difl_dim1 = *ldu; + difl_offset = 1 + difl_dim1; + difl -= difl_offset; + vt_dim1 = *ldu; + vt_offset = 1 + vt_dim1; + vt -= vt_offset; + u_dim1 = *ldu; + u_offset = 1 + u_dim1; + u -= u_offset; + --k; + --givptr; + perm_dim1 = *ldgcol; + perm_offset = 1 + perm_dim1; + perm -= perm_offset; + givcol_dim1 = *ldgcol; + givcol_offset = 1 + givcol_dim1; + givcol -= givcol_offset; + --c__; + --s; + --work; + --iwork; + + /* Function Body */ + *info = 0; + + if (*icompq < 0 || *icompq > 1) { + *info = -1; + } else if (*smlsiz < 3) { + *info = -2; + } else if (*n < *smlsiz) { + *info = -3; + } else if (*nrhs < 1) { + *info = -4; + } else if (*ldb < *n) { + *info = -6; + } else if (*ldbx < *n) { + *info = -8; + } else if (*ldu < *n) { + *info = -10; + } else if (*ldgcol < *n) { + *info = -19; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLALSA", &i__1, (ftnlen)6); + return 0; + } + +/* Book-keeping and setting up the computation tree. */ + + inode = 1; + ndiml = inode + *n; + ndimr = ndiml + *n; + + dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], + smlsiz); + +/* The following code applies back the left singular vector factors. */ +/* For applying back the right singular vector factors, go to 50. */ + + if (*icompq == 1) { + goto L50; + } + +/* The nodes on the bottom level of the tree were solved */ +/* by DLASDQ. The corresponding left and right singular vector */ +/* matrices are in explicit form. First apply back the left */ +/* singular vector matrices. */ + + ndb1 = (nd + 1) / 2; + i__1 = nd; + for (i__ = ndb1; i__ <= i__1; ++i__) { + +/* IC : center row of each node */ +/* NL : number of rows of left subproblem */ +/* NR : number of rows of right subproblem */ +/* NLF: starting row of the left subproblem */ +/* NRF: starting row of the right subproblem */ + + i1 = i__ - 1; + ic = iwork[inode + i1]; + nl = iwork[ndiml + i1]; + nr = iwork[ndimr + i1]; + nlf = ic - nl; + nrf = ic + 1; + dgemm_((char *)"T", (char *)"N", &nl, nrhs, &nl, &c_b7, &u[nlf + u_dim1], ldu, &b[nlf + + b_dim1], ldb, &c_b8, &bx[nlf + bx_dim1], ldbx, (ftnlen)1, ( + ftnlen)1); + dgemm_((char *)"T", (char *)"N", &nr, nrhs, &nr, &c_b7, &u[nrf + u_dim1], ldu, &b[nrf + + b_dim1], ldb, &c_b8, &bx[nrf + bx_dim1], ldbx, (ftnlen)1, ( + ftnlen)1); +/* L10: */ + } + +/* Next copy the rows of B that correspond to unchanged rows */ +/* in the bidiagonal matrix to BX. */ + + i__1 = nd; + for (i__ = 1; i__ <= i__1; ++i__) { + ic = iwork[inode + i__ - 1]; + dcopy_(nrhs, &b[ic + b_dim1], ldb, &bx[ic + bx_dim1], ldbx); +/* L20: */ + } + +/* Finally go through the left singular vector matrices of all */ +/* the other subproblems bottom-up on the tree. */ + + j = pow_ii(&c__2, &nlvl); + sqre = 0; + + for (lvl = nlvl; lvl >= 1; --lvl) { + lvl2 = (lvl << 1) - 1; + +/* find the first node LF and last node LL on */ +/* the current level LVL */ + + if (lvl == 1) { + lf = 1; + ll = 1; + } else { + i__1 = lvl - 1; + lf = pow_ii(&c__2, &i__1); + ll = (lf << 1) - 1; + } + i__1 = ll; + for (i__ = lf; i__ <= i__1; ++i__) { + im1 = i__ - 1; + ic = iwork[inode + im1]; + nl = iwork[ndiml + im1]; + nr = iwork[ndimr + im1]; + nlf = ic - nl; + nrf = ic + 1; + --j; + dlals0_(icompq, &nl, &nr, &sqre, nrhs, &bx[nlf + bx_dim1], ldbx, & + b[nlf + b_dim1], ldb, &perm[nlf + lvl * perm_dim1], & + givptr[j], &givcol[nlf + lvl2 * givcol_dim1], ldgcol, & + givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * + poles_dim1], &difl[nlf + lvl * difl_dim1], &difr[nlf + + lvl2 * difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[ + j], &s[j], &work[1], info); +/* L30: */ + } +/* L40: */ + } + goto L90; + +/* ICOMPQ = 1: applying back the right singular vector factors. */ + +L50: + +/* First now go through the right singular vector matrices of all */ +/* the tree nodes top-down. */ + + j = 0; + i__1 = nlvl; + for (lvl = 1; lvl <= i__1; ++lvl) { + lvl2 = (lvl << 1) - 1; + +/* Find the first node LF and last node LL on */ +/* the current level LVL. */ + + if (lvl == 1) { + lf = 1; + ll = 1; + } else { + i__2 = lvl - 1; + lf = pow_ii(&c__2, &i__2); + ll = (lf << 1) - 1; + } + i__2 = lf; + for (i__ = ll; i__ >= i__2; --i__) { + im1 = i__ - 1; + ic = iwork[inode + im1]; + nl = iwork[ndiml + im1]; + nr = iwork[ndimr + im1]; + nlf = ic - nl; + nrf = ic + 1; + if (i__ == ll) { + sqre = 0; + } else { + sqre = 1; + } + ++j; + dlals0_(icompq, &nl, &nr, &sqre, nrhs, &b[nlf + b_dim1], ldb, &bx[ + nlf + bx_dim1], ldbx, &perm[nlf + lvl * perm_dim1], & + givptr[j], &givcol[nlf + lvl2 * givcol_dim1], ldgcol, & + givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * + poles_dim1], &difl[nlf + lvl * difl_dim1], &difr[nlf + + lvl2 * difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[ + j], &s[j], &work[1], info); +/* L60: */ + } +/* L70: */ + } + +/* The nodes on the bottom level of the tree were solved */ +/* by DLASDQ. The corresponding right singular vector */ +/* matrices are in explicit form. Apply them back. */ + + ndb1 = (nd + 1) / 2; + i__1 = nd; + for (i__ = ndb1; i__ <= i__1; ++i__) { + i1 = i__ - 1; + ic = iwork[inode + i1]; + nl = iwork[ndiml + i1]; + nr = iwork[ndimr + i1]; + nlp1 = nl + 1; + if (i__ == nd) { + nrp1 = nr; + } else { + nrp1 = nr + 1; + } + nlf = ic - nl; + nrf = ic + 1; + dgemm_((char *)"T", (char *)"N", &nlp1, nrhs, &nlp1, &c_b7, &vt[nlf + vt_dim1], ldu, & + b[nlf + b_dim1], ldb, &c_b8, &bx[nlf + bx_dim1], ldbx, ( + ftnlen)1, (ftnlen)1); + dgemm_((char *)"T", (char *)"N", &nrp1, nrhs, &nrp1, &c_b7, &vt[nrf + vt_dim1], ldu, & + b[nrf + b_dim1], ldb, &c_b8, &bx[nrf + bx_dim1], ldbx, ( + ftnlen)1, (ftnlen)1); +/* L80: */ + } + +L90: + + return 0; + +/* End of DLALSA */ + +} /* dlalsa_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlalsd.cpp b/lib/linalg/dlalsd.cpp new file mode 100644 index 0000000000..07c3ca57f0 --- /dev/null +++ b/lib/linalg/dlalsd.cpp @@ -0,0 +1,632 @@ +/* fortran/dlalsd.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static doublereal c_b6 = 0.; +static integer c__0 = 0; +static doublereal c_b11 = 1.; + +/* > \brief \b DLALSD uses the singular value decomposition of A to solve the least squares problem. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLALSD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, */ +/* RANK, WORK, IWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDB, N, NRHS, RANK, SMLSIZ */ +/* DOUBLE PRECISION RCOND */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IWORK( * ) */ +/* DOUBLE PRECISION B( LDB, * ), D( * ), E( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLALSD uses the singular value decomposition of A to solve the least */ +/* > squares problem of finding X to minimize the Euclidean norm of each */ +/* > column of A*X-B, where A is N-by-N upper bidiagonal, and X and B */ +/* > are N-by-NRHS. The solution X overwrites B. */ +/* > */ +/* > The singular values of A smaller than RCOND times the largest */ +/* > singular value are treated as zero in solving the least squares */ +/* > problem; in this case a minimum norm solution is returned. */ +/* > The actual singular values are returned in D in ascending order. */ +/* > */ +/* > This code makes very mild assumptions about floating point */ +/* > arithmetic. It will work on machines with a guard digit in */ +/* > add/subtract, or on those binary machines without guard digits */ +/* > which subtract like the Cray XMP, Cray YMP, Cray C 90, or Cray 2. */ +/* > It could conceivably fail on hexadecimal or decimal machines */ +/* > without guard digits, but we know of none. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': D and E define an upper bidiagonal matrix. */ +/* > = 'L': D and E define a lower bidiagonal matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] SMLSIZ */ +/* > \verbatim */ +/* > SMLSIZ is INTEGER */ +/* > The maximum size of the subproblems at the bottom of the */ +/* > computation tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The dimension of the bidiagonal matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NRHS */ +/* > \verbatim */ +/* > NRHS is INTEGER */ +/* > The number of columns of B. NRHS must be at least 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry D contains the main diagonal of the bidiagonal */ +/* > matrix. On exit, if INFO = 0, D contains its singular values. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > Contains the super-diagonal entries of the bidiagonal matrix. */ +/* > On exit, E has been destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ +/* > On input, B contains the right hand sides of the least */ +/* > squares problem. On output, B contains the solution X. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of B in the calling subprogram. */ +/* > LDB must be at least max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RCOND */ +/* > \verbatim */ +/* > RCOND is DOUBLE PRECISION */ +/* > The singular values of A less than or equal to RCOND times */ +/* > the largest singular value are treated as zero in solving */ +/* > the least squares problem. If RCOND is negative, */ +/* > machine precision is used instead. */ +/* > For example, if diag(S)*X=B were the least squares problem, */ +/* > where diag(S) is a diagonal matrix of singular values, the */ +/* > solution would be X(i) = B(i) / S(i) if S(i) is greater than */ +/* > RCOND*max(S), and X(i) = 0 if S(i) is less than or equal to */ +/* > RCOND*max(S). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RANK */ +/* > \verbatim */ +/* > RANK is INTEGER */ +/* > The number of singular values of A greater than RCOND times */ +/* > the largest singular value. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension at least */ +/* > (9*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS + (SMLSIZ+1)**2), */ +/* > where NLVL = max(0, INT(log_2 (N/(SMLSIZ+1))) + 1). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension at least */ +/* > (3*N*NLVL + 11*N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: The algorithm failed to compute a singular value while */ +/* > working on the submatrix lying in rows and columns */ +/* > INFO/(N+1) through MOD(INFO,N+1). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ming Gu and Ren-Cang Li, Computer Science Division, University of */ +/* > California at Berkeley, USA \n */ +/* > Osni Marques, LBNL/NERSC, USA \n */ + +/* ===================================================================== */ +/* Subroutine */ int dlalsd_(char *uplo, integer *smlsiz, integer *n, integer + *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, + doublereal *rcond, integer *rank, doublereal *work, integer *iwork, + integer *info, ftnlen uplo_len) +{ + /* System generated locals */ + integer b_dim1, b_offset, i__1, i__2; + doublereal d__1; + + /* Builtin functions */ + double log(doublereal), d_sign(doublereal *, doublereal *); + + /* Local variables */ + integer c__, i__, j, k; + doublereal r__; + integer s, u, z__; + doublereal cs; + integer bx; + doublereal sn; + integer st, vt, nm1, st1; + doublereal eps; + integer iwk; + doublereal tol; + integer difl, difr; + doublereal rcnd; + integer perm, nsub; + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *); + integer nlvl, sqre, bxst; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer + *); + integer poles, sizei, nsize, nwork, icmpq1, icmpq2; + extern doublereal dlamch_(char *, ftnlen); + extern /* Subroutine */ int dlasda_(integer *, integer *, integer *, + integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *, integer *, integer *, integer *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *), dlalsa_(integer *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *, integer *, integer *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + integer *, integer *), dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen); + extern integer idamax_(integer *, doublereal *, integer *); + extern /* Subroutine */ int dlasdq_(char *, integer *, integer *, integer + *, integer *, integer *, doublereal *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, ftnlen), dlacpy_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), dlartg_(doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *), dlaset_(char *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); + integer givcol; + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, + ftnlen); + extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, + integer *, ftnlen); + doublereal orgnrm; + integer givnum, givptr, smlszp; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --e; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + --work; + --iwork; + + /* Function Body */ + *info = 0; + + if (*n < 0) { + *info = -3; + } else if (*nrhs < 1) { + *info = -4; + } else if (*ldb < 1 || *ldb < *n) { + *info = -8; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLALSD", &i__1, (ftnlen)6); + return 0; + } + + eps = dlamch_((char *)"Epsilon", (ftnlen)7); + +/* Set up the tolerance. */ + + if (*rcond <= 0. || *rcond >= 1.) { + rcnd = eps; + } else { + rcnd = *rcond; + } + + *rank = 0; + +/* Quick return if possible. */ + + if (*n == 0) { + return 0; + } else if (*n == 1) { + if (d__[1] == 0.) { + dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &b[b_offset], ldb, ( + ftnlen)1); + } else { + *rank = 1; + dlascl_((char *)"G", &c__0, &c__0, &d__[1], &c_b11, &c__1, nrhs, &b[ + b_offset], ldb, info, (ftnlen)1); + d__[1] = abs(d__[1]); + } + return 0; + } + +/* Rotate the matrix if it is lower bidiagonal. */ + + if (*(unsigned char *)uplo == 'L') { + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); + d__[i__] = r__; + e[i__] = sn * d__[i__ + 1]; + d__[i__ + 1] = cs * d__[i__ + 1]; + if (*nrhs == 1) { + drot_(&c__1, &b[i__ + b_dim1], &c__1, &b[i__ + 1 + b_dim1], & + c__1, &cs, &sn); + } else { + work[(i__ << 1) - 1] = cs; + work[i__ * 2] = sn; + } +/* L10: */ + } + if (*nrhs > 1) { + i__1 = *nrhs; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = *n - 1; + for (j = 1; j <= i__2; ++j) { + cs = work[(j << 1) - 1]; + sn = work[j * 2]; + drot_(&c__1, &b[j + i__ * b_dim1], &c__1, &b[j + 1 + i__ * + b_dim1], &c__1, &cs, &sn); +/* L20: */ + } +/* L30: */ + } + } + } + +/* Scale. */ + + nm1 = *n - 1; + orgnrm = dlanst_((char *)"M", n, &d__[1], &e[1], (ftnlen)1); + if (orgnrm == 0.) { + dlaset_((char *)"A", n, nrhs, &c_b6, &c_b6, &b[b_offset], ldb, (ftnlen)1); + return 0; + } + + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, &c__1, &d__[1], n, info, ( + ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, &nm1, &c__1, &e[1], &nm1, + info, (ftnlen)1); + +/* If N is smaller than the minimum divide size SMLSIZ, then solve */ +/* the problem with another solver. */ + + if (*n <= *smlsiz) { + nwork = *n * *n + 1; + dlaset_((char *)"A", n, n, &c_b6, &c_b11, &work[1], n, (ftnlen)1); + dlasdq_((char *)"U", &c__0, n, n, &c__0, nrhs, &d__[1], &e[1], &work[1], n, & + work[1], n, &b[b_offset], ldb, &work[nwork], info, (ftnlen)1); + if (*info != 0) { + return 0; + } + tol = rcnd * (d__1 = d__[idamax_(n, &d__[1], &c__1)], abs(d__1)); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + if (d__[i__] <= tol) { + dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &b[i__ + b_dim1], ldb, + (ftnlen)1); + } else { + dlascl_((char *)"G", &c__0, &c__0, &d__[i__], &c_b11, &c__1, nrhs, &b[ + i__ + b_dim1], ldb, info, (ftnlen)1); + ++(*rank); + } +/* L40: */ + } + dgemm_((char *)"T", (char *)"N", n, nrhs, n, &c_b11, &work[1], n, &b[b_offset], ldb, & + c_b6, &work[nwork], n, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"A", n, nrhs, &work[nwork], n, &b[b_offset], ldb, (ftnlen)1); + +/* Unscale. */ + + dlascl_((char *)"G", &c__0, &c__0, &c_b11, &orgnrm, n, &c__1, &d__[1], n, + info, (ftnlen)1); + dlasrt_((char *)"D", n, &d__[1], info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, nrhs, &b[b_offset], + ldb, info, (ftnlen)1); + + return 0; + } + +/* Book-keeping and setting up some constants. */ + + nlvl = (integer) (log((doublereal) (*n) / (doublereal) (*smlsiz + 1)) / + log(2.)) + 1; + + smlszp = *smlsiz + 1; + + u = 1; + vt = *smlsiz * *n + 1; + difl = vt + smlszp * *n; + difr = difl + nlvl * *n; + z__ = difr + (nlvl * *n << 1); + c__ = z__ + nlvl * *n; + s = c__ + *n; + poles = s + *n; + givnum = poles + (nlvl << 1) * *n; + bx = givnum + (nlvl << 1) * *n; + nwork = bx + *n * *nrhs; + + sizei = *n + 1; + k = sizei + *n; + givptr = k + *n; + perm = givptr + *n; + givcol = perm + nlvl * *n; + iwk = givcol + (nlvl * *n << 1); + + st = 1; + sqre = 0; + icmpq1 = 1; + icmpq2 = 0; + nsub = 0; + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + if ((d__1 = d__[i__], abs(d__1)) < eps) { + d__[i__] = d_sign(&eps, &d__[i__]); + } +/* L50: */ + } + + i__1 = nm1; + for (i__ = 1; i__ <= i__1; ++i__) { + if ((d__1 = e[i__], abs(d__1)) < eps || i__ == nm1) { + ++nsub; + iwork[nsub] = st; + +/* Subproblem found. First determine its size and then */ +/* apply divide and conquer on it. */ + + if (i__ < nm1) { + +/* A subproblem with E(I) small for I < NM1. */ + + nsize = i__ - st + 1; + iwork[sizei + nsub - 1] = nsize; + } else if ((d__1 = e[i__], abs(d__1)) >= eps) { + +/* A subproblem with E(NM1) not too small but I = NM1. */ + + nsize = *n - st + 1; + iwork[sizei + nsub - 1] = nsize; + } else { + +/* A subproblem with E(NM1) small. This implies an */ +/* 1-by-1 subproblem at D(N), which is not solved */ +/* explicitly. */ + + nsize = i__ - st + 1; + iwork[sizei + nsub - 1] = nsize; + ++nsub; + iwork[nsub] = *n; + iwork[sizei + nsub - 1] = 1; + dcopy_(nrhs, &b[*n + b_dim1], ldb, &work[bx + nm1], n); + } + st1 = st - 1; + if (nsize == 1) { + +/* This is a 1-by-1 subproblem and is not solved */ +/* explicitly. */ + + dcopy_(nrhs, &b[st + b_dim1], ldb, &work[bx + st1], n); + } else if (nsize <= *smlsiz) { + +/* This is a small subproblem and is solved by DLASDQ. */ + + dlaset_((char *)"A", &nsize, &nsize, &c_b6, &c_b11, &work[vt + st1], + n, (ftnlen)1); + dlasdq_((char *)"U", &c__0, &nsize, &nsize, &c__0, nrhs, &d__[st], &e[ + st], &work[vt + st1], n, &work[nwork], n, &b[st + + b_dim1], ldb, &work[nwork], info, (ftnlen)1); + if (*info != 0) { + return 0; + } + dlacpy_((char *)"A", &nsize, nrhs, &b[st + b_dim1], ldb, &work[bx + + st1], n, (ftnlen)1); + } else { + +/* A large problem. Solve it using divide and conquer. */ + + dlasda_(&icmpq1, smlsiz, &nsize, &sqre, &d__[st], &e[st], & + work[u + st1], n, &work[vt + st1], &iwork[k + st1], & + work[difl + st1], &work[difr + st1], &work[z__ + st1], + &work[poles + st1], &iwork[givptr + st1], &iwork[ + givcol + st1], n, &iwork[perm + st1], &work[givnum + + st1], &work[c__ + st1], &work[s + st1], &work[nwork], + &iwork[iwk], info); + if (*info != 0) { + return 0; + } + bxst = bx + st1; + dlalsa_(&icmpq2, smlsiz, &nsize, nrhs, &b[st + b_dim1], ldb, & + work[bxst], n, &work[u + st1], n, &work[vt + st1], & + iwork[k + st1], &work[difl + st1], &work[difr + st1], + &work[z__ + st1], &work[poles + st1], &iwork[givptr + + st1], &iwork[givcol + st1], n, &iwork[perm + st1], & + work[givnum + st1], &work[c__ + st1], &work[s + st1], + &work[nwork], &iwork[iwk], info); + if (*info != 0) { + return 0; + } + } + st = i__ + 1; + } +/* L60: */ + } + +/* Apply the singular values and treat the tiny ones as zero. */ + + tol = rcnd * (d__1 = d__[idamax_(n, &d__[1], &c__1)], abs(d__1)); + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Some of the elements in D can be negative because 1-by-1 */ +/* subproblems were not solved explicitly. */ + + if ((d__1 = d__[i__], abs(d__1)) <= tol) { + dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &work[bx + i__ - 1], n, ( + ftnlen)1); + } else { + ++(*rank); + dlascl_((char *)"G", &c__0, &c__0, &d__[i__], &c_b11, &c__1, nrhs, &work[ + bx + i__ - 1], n, info, (ftnlen)1); + } + d__[i__] = (d__1 = d__[i__], abs(d__1)); +/* L70: */ + } + +/* Now apply back the right singular vectors. */ + + icmpq2 = 1; + i__1 = nsub; + for (i__ = 1; i__ <= i__1; ++i__) { + st = iwork[i__]; + st1 = st - 1; + nsize = iwork[sizei + i__ - 1]; + bxst = bx + st1; + if (nsize == 1) { + dcopy_(nrhs, &work[bxst], n, &b[st + b_dim1], ldb); + } else if (nsize <= *smlsiz) { + dgemm_((char *)"T", (char *)"N", &nsize, nrhs, &nsize, &c_b11, &work[vt + st1], n, + &work[bxst], n, &c_b6, &b[st + b_dim1], ldb, (ftnlen)1, ( + ftnlen)1); + } else { + dlalsa_(&icmpq2, smlsiz, &nsize, nrhs, &work[bxst], n, &b[st + + b_dim1], ldb, &work[u + st1], n, &work[vt + st1], &iwork[ + k + st1], &work[difl + st1], &work[difr + st1], &work[z__ + + st1], &work[poles + st1], &iwork[givptr + st1], &iwork[ + givcol + st1], n, &iwork[perm + st1], &work[givnum + st1], + &work[c__ + st1], &work[s + st1], &work[nwork], &iwork[ + iwk], info); + if (*info != 0) { + return 0; + } + } +/* L80: */ + } + +/* Unscale and sort the singular values. */ + + dlascl_((char *)"G", &c__0, &c__0, &c_b11, &orgnrm, n, &c__1, &d__[1], n, info, ( + ftnlen)1); + dlasrt_((char *)"D", n, &d__[1], info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + + return 0; + +/* End of DLALSD */ + +} /* dlalsd_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlamch.cpp b/lib/linalg/dlamch.cpp new file mode 100644 index 0000000000..3d616d95d2 --- /dev/null +++ b/lib/linalg/dlamch.cpp @@ -0,0 +1,45 @@ + +#include +#include + +extern "C" { + +#include "lmp_f2c.h" + +// undefine conflicting f2c macros +#undef min +#undef max + +doublereal dlamch_(const char *cmach) +{ + if (!cmach) return 0.0; + char select = toupper(*cmach); + + // BLAS assumes rounding not truncation => epsilon is half + const double eps = 0.5 * std::numeric_limits::epsilon(); + if (select == 'E') return eps; + + double min = std::numeric_limits::min(); + const double max = std::numeric_limits::max(); + double small = 1.0 / max; + if (small >= min) min = small * (1.0 + eps); + if (select == 'S') return min; + + const double radix = std::numeric_limits::radix; + if (select == 'B') return radix; + + if (select == 'P') return eps * radix; + + if (select == 'N') return std::numeric_limits::digits; + + if (select == 'M') return std::numeric_limits::min_exponent; + + if (select == 'U') return min; + + if (select == 'L') return std::numeric_limits::max_exponent; + + if (select == 'O') return max; + + return 0.0; +} +} diff --git a/lib/linalg/dlamrg.cpp b/lib/linalg/dlamrg.cpp new file mode 100644 index 0000000000..581a64fba7 --- /dev/null +++ b/lib/linalg/dlamrg.cpp @@ -0,0 +1,206 @@ +/* fortran/dlamrg.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLAMRG creates a permutation list to merge the entries of two independently sorted sets into a +single set sorted in ascending order. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAMRG + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAMRG( N1, N2, A, DTRD1, DTRD2, INDEX ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER DTRD1, DTRD2, N1, N2 */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER INDEX( * ) */ +/* DOUBLE PRECISION A( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAMRG will create a permutation list which will merge the elements */ +/* > of A (which is composed of two independently sorted sets) into a */ +/* > single set which is sorted in ascending order. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N1 */ +/* > \verbatim */ +/* > N1 is INTEGER */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N2 */ +/* > \verbatim */ +/* > N2 is INTEGER */ +/* > These arguments contain the respective lengths of the two */ +/* > sorted lists to be merged. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (N1+N2) */ +/* > The first N1 elements of A contain a list of numbers which */ +/* > are sorted in either ascending or descending order. Likewise */ +/* > for the final N2 elements. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DTRD1 */ +/* > \verbatim */ +/* > DTRD1 is INTEGER */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DTRD2 */ +/* > \verbatim */ +/* > DTRD2 is INTEGER */ +/* > These are the strides to be taken through the array A. */ +/* > Allowable strides are 1 and -1. They indicate whether a */ +/* > subset of A is sorted in ascending (DTRDx = 1) or descending */ +/* > (DTRDx = -1) order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INDEX */ +/* > \verbatim */ +/* > INDEX is INTEGER array, dimension (N1+N2) */ +/* > On exit this array will contain a permutation such that */ +/* > if B( I ) = A( INDEX( I ) ) for I=1,N1+N2, then B will be */ +/* > sorted in ascending order. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dlamrg_(integer *n1, integer *n2, doublereal *a, integer + *dtrd1, integer *dtrd2, integer *index) +{ + /* System generated locals */ + integer i__1; + + /* Local variables */ + integer i__, ind1, ind2, n1sv, n2sv; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --index; + --a; + + /* Function Body */ + n1sv = *n1; + n2sv = *n2; + if (*dtrd1 > 0) { + ind1 = 1; + } else { + ind1 = *n1; + } + if (*dtrd2 > 0) { + ind2 = *n1 + 1; + } else { + ind2 = *n1 + *n2; + } + i__ = 1; +/* while ( (N1SV > 0) & (N2SV > 0) ) */ +L10: + if (n1sv > 0 && n2sv > 0) { + if (a[ind1] <= a[ind2]) { + index[i__] = ind1; + ++i__; + ind1 += *dtrd1; + --n1sv; + } else { + index[i__] = ind2; + ++i__; + ind2 += *dtrd2; + --n2sv; + } + goto L10; + } +/* end while */ + if (n1sv == 0) { + i__1 = n2sv; + for (n1sv = 1; n1sv <= i__1; ++n1sv) { + index[i__] = ind2; + ++i__; + ind2 += *dtrd2; +/* L20: */ + } + } else { +/* N2SV .EQ. 0 */ + i__1 = n1sv; + for (n2sv = 1; n2sv <= i__1; ++n2sv) { + index[i__] = ind1; + ++i__; + ind1 += *dtrd1; +/* L30: */ + } + } + + return 0; + +/* End of DLAMRG */ + +} /* dlamrg_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlange.cpp b/lib/linalg/dlange.cpp new file mode 100644 index 0000000000..1ccc6fae2b --- /dev/null +++ b/lib/linalg/dlange.cpp @@ -0,0 +1,277 @@ +/* fortran/dlange.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute +value of any element of a general rectangular matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLANGE + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* DOUBLE PRECISION FUNCTION DLANGE( NORM, M, N, A, LDA, WORK ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER NORM */ +/* INTEGER LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLANGE returns the value of the one norm, or the Frobenius norm, or */ +/* > the infinity norm, or the element of largest absolute value of a */ +/* > real matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \return DLANGE */ +/* > \verbatim */ +/* > */ +/* > DLANGE = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ +/* > ( */ +/* > ( norm1(A), NORM = '1', 'O' or 'o' */ +/* > ( */ +/* > ( normI(A), NORM = 'I' or 'i' */ +/* > ( */ +/* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ +/* > */ +/* > where norm1 denotes the one norm of a matrix (maximum column sum), */ +/* > normI denotes the infinity norm of a matrix (maximum row sum) and */ +/* > normF denotes the Frobenius norm of a matrix (square root of sum of */ +/* > squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] NORM */ +/* > \verbatim */ +/* > NORM is CHARACTER*1 */ +/* > Specifies the value to be returned in DLANGE as described */ +/* > above. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. When M = 0, */ +/* > DLANGE is set to zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. When N = 0, */ +/* > DLANGE is set to zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > The m by n matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(M,1). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ +/* > where LWORK >= M when NORM = 'I'; otherwise, WORK is not */ +/* > referenced. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGEauxiliary */ + +/* ===================================================================== */ +doublereal dlange_(char *norm, integer *m, integer *n, doublereal *a, integer + *lda, doublereal *work, ftnlen norm_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + doublereal ret_val, d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + integer i__, j; + doublereal sum, temp, scale; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + doublereal value; + extern logical disnan_(doublereal *); + extern /* Subroutine */ int dlassq_(integer *, doublereal *, integer *, + doublereal *, doublereal *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --work; + + /* Function Body */ + if (min(*m,*n) == 0) { + value = 0.; + } else if (lsame_(norm, (char *)"M", (ftnlen)1, (ftnlen)1)) { + +/* Find max(abs(A(i,j))). */ + + value = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = (d__1 = a[i__ + j * a_dim1], abs(d__1)); + if (value < temp || disnan_(&temp)) { + value = temp; + } +/* L10: */ + } +/* L20: */ + } + } else if (lsame_(norm, (char *)"O", (ftnlen)1, (ftnlen)1) || *(unsigned char *) + norm == '1') { + +/* Find norm1(A). */ + + value = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = 0.; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + sum += (d__1 = a[i__ + j * a_dim1], abs(d__1)); +/* L30: */ + } + if (value < sum || disnan_(&sum)) { + value = sum; + } +/* L40: */ + } + } else if (lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1)) { + +/* Find normI(A). */ + + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + work[i__] = 0.; +/* L50: */ + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)); +/* L60: */ + } +/* L70: */ + } + value = 0.; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = work[i__]; + if (value < temp || disnan_(&temp)) { + value = temp; + } +/* L80: */ + } + } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", ( + ftnlen)1, (ftnlen)1)) { + +/* Find normF(A). */ + + scale = 0.; + sum = 1.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + dlassq_(m, &a[j * a_dim1 + 1], &c__1, &scale, &sum); +/* L90: */ + } + value = scale * sqrt(sum); + } + + ret_val = value; + return ret_val; + +/* End of DLANGE */ + +} /* dlange_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlanst.cpp b/lib/linalg/dlanst.cpp new file mode 100644 index 0000000000..8a71bcd12d --- /dev/null +++ b/lib/linalg/dlanst.cpp @@ -0,0 +1,239 @@ +/* fortran/dlanst.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DLANST returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele +ment of largest absolute value of a real symmetric tridiagonal matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLANST + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* DOUBLE PRECISION FUNCTION DLANST( NORM, N, D, E ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER NORM */ +/* INTEGER N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( * ), E( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLANST returns the value of the one norm, or the Frobenius norm, or */ +/* > the infinity norm, or the element of largest absolute value of a */ +/* > real symmetric tridiagonal matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \return DLANST */ +/* > \verbatim */ +/* > */ +/* > DLANST = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ +/* > ( */ +/* > ( norm1(A), NORM = '1', 'O' or 'o' */ +/* > ( */ +/* > ( normI(A), NORM = 'I' or 'i' */ +/* > ( */ +/* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ +/* > */ +/* > where norm1 denotes the one norm of a matrix (maximum column sum), */ +/* > normI denotes the infinity norm of a matrix (maximum row sum) and */ +/* > normF denotes the Frobenius norm of a matrix (square root of sum of */ +/* > squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] NORM */ +/* > \verbatim */ +/* > NORM is CHARACTER*1 */ +/* > Specifies the value to be returned in DLANST as described */ +/* > above. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. When N = 0, DLANST is */ +/* > set to zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > The diagonal elements of A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > The (n-1) sub-diagonal or super-diagonal elements of A. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +doublereal dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e, + ftnlen norm_len) +{ + /* System generated locals */ + integer i__1; + doublereal ret_val, d__1, d__2, d__3; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + integer i__; + doublereal sum, scale; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + doublereal anorm; + extern logical disnan_(doublereal *); + extern /* Subroutine */ int dlassq_(integer *, doublereal *, integer *, + doublereal *, doublereal *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --e; + --d__; + + /* Function Body */ + if (*n <= 0) { + anorm = 0.; + } else if (lsame_(norm, (char *)"M", (ftnlen)1, (ftnlen)1)) { + +/* Find max(abs(A(i,j))). */ + + anorm = (d__1 = d__[*n], abs(d__1)); + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + sum = (d__1 = d__[i__], abs(d__1)); + if (anorm < sum || disnan_(&sum)) { + anorm = sum; + } + sum = (d__1 = e[i__], abs(d__1)); + if (anorm < sum || disnan_(&sum)) { + anorm = sum; + } +/* L10: */ + } + } else if (lsame_(norm, (char *)"O", (ftnlen)1, (ftnlen)1) || *(unsigned char *) + norm == '1' || lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1)) { + +/* Find norm1(A). */ + + if (*n == 1) { + anorm = abs(d__[1]); + } else { + anorm = abs(d__[1]) + abs(e[1]); + sum = (d__1 = e[*n - 1], abs(d__1)) + (d__2 = d__[*n], abs(d__2)); + if (anorm < sum || disnan_(&sum)) { + anorm = sum; + } + i__1 = *n - 1; + for (i__ = 2; i__ <= i__1; ++i__) { + sum = (d__1 = d__[i__], abs(d__1)) + (d__2 = e[i__], abs(d__2) + ) + (d__3 = e[i__ - 1], abs(d__3)); + if (anorm < sum || disnan_(&sum)) { + anorm = sum; + } +/* L20: */ + } + } + } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", ( + ftnlen)1, (ftnlen)1)) { + +/* Find normF(A). */ + + scale = 0.; + sum = 1.; + if (*n > 1) { + i__1 = *n - 1; + dlassq_(&i__1, &e[1], &c__1, &scale, &sum); + sum *= 2; + } + dlassq_(n, &d__[1], &c__1, &scale, &sum); + anorm = scale * sqrt(sum); + } + + ret_val = anorm; + return ret_val; + +/* End of DLANST */ + +} /* dlanst_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlansy.cpp b/lib/linalg/dlansy.cpp new file mode 100644 index 0000000000..1c5a1fa24c --- /dev/null +++ b/lib/linalg/dlansy.cpp @@ -0,0 +1,317 @@ +/* fortran/dlansy.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele +ment of largest absolute value of a real symmetric matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLANSY + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* DOUBLE PRECISION FUNCTION DLANSY( NORM, UPLO, N, A, LDA, WORK ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER NORM, UPLO */ +/* INTEGER LDA, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLANSY returns the value of the one norm, or the Frobenius norm, or */ +/* > the infinity norm, or the element of largest absolute value of a */ +/* > real symmetric matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \return DLANSY */ +/* > \verbatim */ +/* > */ +/* > DLANSY = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ +/* > ( */ +/* > ( norm1(A), NORM = '1', 'O' or 'o' */ +/* > ( */ +/* > ( normI(A), NORM = 'I' or 'i' */ +/* > ( */ +/* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ +/* > */ +/* > where norm1 denotes the one norm of a matrix (maximum column sum), */ +/* > normI denotes the infinity norm of a matrix (maximum row sum) and */ +/* > normF denotes the Frobenius norm of a matrix (square root of sum of */ +/* > squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] NORM */ +/* > \verbatim */ +/* > NORM is CHARACTER*1 */ +/* > Specifies the value to be returned in DLANSY as described */ +/* > above. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies whether the upper or lower triangular part of the */ +/* > symmetric matrix A is to be referenced. */ +/* > = 'U': Upper triangular part of A is referenced */ +/* > = 'L': Lower triangular part of A is referenced */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. When N = 0, DLANSY is */ +/* > set to zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > The symmetric matrix A. If UPLO = 'U', the leading n by n */ +/* > upper triangular part of A contains the upper triangular part */ +/* > of the matrix A, and the strictly lower triangular part of A */ +/* > is not referenced. If UPLO = 'L', the leading n by n lower */ +/* > triangular part of A contains the lower triangular part of */ +/* > the matrix A, and the strictly upper triangular part of A is */ +/* > not referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(N,1). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ +/* > where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ +/* > WORK is not referenced. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleSYauxiliary */ + +/* ===================================================================== */ +doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer + *lda, doublereal *work, ftnlen norm_len, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + doublereal ret_val, d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + integer i__, j; + doublereal sum, absa, scale; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + doublereal value; + extern logical disnan_(doublereal *); + extern /* Subroutine */ int dlassq_(integer *, doublereal *, integer *, + doublereal *, doublereal *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --work; + + /* Function Body */ + if (*n == 0) { + value = 0.; + } else if (lsame_(norm, (char *)"M", (ftnlen)1, (ftnlen)1)) { + +/* Find max(abs(A(i,j))). */ + + value = 0.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + sum = (d__1 = a[i__ + j * a_dim1], abs(d__1)); + if (value < sum || disnan_(&sum)) { + value = sum; + } +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + sum = (d__1 = a[i__ + j * a_dim1], abs(d__1)); + if (value < sum || disnan_(&sum)) { + value = sum; + } +/* L30: */ + } +/* L40: */ + } + } + } else if (lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"O", ( + ftnlen)1, (ftnlen)1) || *(unsigned char *)norm == '1') { + +/* Find normI(A) ( = norm1(A), since A is symmetric). */ + + value = 0.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = 0.; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + absa = (d__1 = a[i__ + j * a_dim1], abs(d__1)); + sum += absa; + work[i__] += absa; +/* L50: */ + } + work[j] = sum + (d__1 = a[j + j * a_dim1], abs(d__1)); +/* L60: */ + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + sum = work[i__]; + if (value < sum || disnan_(&sum)) { + value = sum; + } +/* L70: */ + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + work[i__] = 0.; +/* L80: */ + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = work[j] + (d__1 = a[j + j * a_dim1], abs(d__1)); + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + absa = (d__1 = a[i__ + j * a_dim1], abs(d__1)); + sum += absa; + work[i__] += absa; +/* L90: */ + } + if (value < sum || disnan_(&sum)) { + value = sum; + } +/* L100: */ + } + } + } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", ( + ftnlen)1, (ftnlen)1)) { + +/* Find normF(A). */ + + scale = 0.; + sum = 1.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 2; j <= i__1; ++j) { + i__2 = j - 1; + dlassq_(&i__2, &a[j * a_dim1 + 1], &c__1, &scale, &sum); +/* L110: */ + } + } else { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + i__2 = *n - j; + dlassq_(&i__2, &a[j + 1 + j * a_dim1], &c__1, &scale, &sum); +/* L120: */ + } + } + sum *= 2; + i__1 = *lda + 1; + dlassq_(n, &a[a_offset], &i__1, &scale, &sum); + value = scale * sqrt(sum); + } + + ret_val = value; + return ret_val; + +/* End of DLANSY */ + +} /* dlansy_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlapy2.cpp b/lib/linalg/dlapy2.cpp new file mode 100644 index 0000000000..6a5443d8df --- /dev/null +++ b/lib/linalg/dlapy2.cpp @@ -0,0 +1,150 @@ +/* fortran/dlapy2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLAPY2 returns sqrt(x2+y2). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAPY2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* DOUBLE PRECISION FUNCTION DLAPY2( X, Y ) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION X, Y */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary */ +/* > overflow and unnecessary underflow. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Y */ +/* > \verbatim */ +/* > Y is DOUBLE PRECISION */ +/* > X and Y specify the values x and y. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +doublereal dlapy2_(doublereal *x, doublereal *y) +{ + /* System generated locals */ + doublereal ret_val, d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + logical x_is_nan__, y_is_nan__; + doublereal w, z__, xabs, yabs; + extern doublereal dlamch_(char *, ftnlen); + extern logical disnan_(doublereal *); + doublereal hugeval; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + x_is_nan__ = disnan_(x); + y_is_nan__ = disnan_(y); + if (x_is_nan__) { + ret_val = *x; + } + if (y_is_nan__) { + ret_val = *y; + } + hugeval = dlamch_((char *)"Overflow", (ftnlen)8); + + if (! (x_is_nan__ || y_is_nan__)) { + xabs = abs(*x); + yabs = abs(*y); + w = max(xabs,yabs); + z__ = min(xabs,yabs); + if (z__ == 0. || w > hugeval) { + ret_val = w; + } else { +/* Computing 2nd power */ + d__1 = z__ / w; + ret_val = w * sqrt(d__1 * d__1 + 1.); + } + } + return ret_val; + +/* End of DLAPY2 */ + +} /* dlapy2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlapy3.cpp b/lib/linalg/dlapy3.cpp new file mode 100644 index 0000000000..528afbf3d8 --- /dev/null +++ b/lib/linalg/dlapy3.cpp @@ -0,0 +1,149 @@ +/* fortran/dlapy3.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLAPY3 returns sqrt(x2+y2+z2). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAPY3 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z ) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION X, Y, Z */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause */ +/* > unnecessary overflow and unnecessary underflow. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Y */ +/* > \verbatim */ +/* > Y is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION */ +/* > X, Y and Z specify the values x, y and z. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +doublereal dlapy3_(doublereal *x, doublereal *y, doublereal *z__) +{ + /* System generated locals */ + doublereal ret_val, d__1, d__2, d__3; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal w, xabs, yabs, zabs; + extern doublereal dlamch_(char *, ftnlen); + doublereal hugeval; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + hugeval = dlamch_((char *)"Overflow", (ftnlen)8); + xabs = abs(*x); + yabs = abs(*y); + zabs = abs(*z__); +/* Computing MAX */ + d__1 = max(xabs,yabs); + w = max(d__1,zabs); + if (w == 0. || w > hugeval) { +/* W can be zero for max(0,nan,0) */ +/* adding all three entries together will make sure */ +/* NaN will not disappear. */ + ret_val = xabs + yabs + zabs; + } else { +/* Computing 2nd power */ + d__1 = xabs / w; +/* Computing 2nd power */ + d__2 = yabs / w; +/* Computing 2nd power */ + d__3 = zabs / w; + ret_val = w * sqrt(d__1 * d__1 + d__2 * d__2 + d__3 * d__3); + } + return ret_val; + +/* End of DLAPY3 */ + +} /* dlapy3_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlarf.cpp b/lib/linalg/dlarf.cpp new file mode 100644 index 0000000000..5534559e63 --- /dev/null +++ b/lib/linalg/dlarf.cpp @@ -0,0 +1,275 @@ +/* fortran/dlarf.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b4 = 1.; +static doublereal c_b5 = 0.; +static integer c__1 = 1; + +/* > \brief \b DLARF applies an elementary reflector to a general rectangular matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLARF + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE */ +/* INTEGER INCV, LDC, M, N */ +/* DOUBLE PRECISION TAU */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION C( LDC, * ), V( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLARF applies a real elementary reflector H to a real m by n matrix */ +/* > C, from either the left or the right. H is represented in the form */ +/* > */ +/* > H = I - tau * v * v**T */ +/* > */ +/* > where tau is a real scalar and v is a real vector. */ +/* > */ +/* > If tau = 0, then H is taken to be the unit matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': form H * C */ +/* > = 'R': form C * H */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] V */ +/* > \verbatim */ +/* > V is DOUBLE PRECISION array, dimension */ +/* > (1 + (M-1)*abs(INCV)) if SIDE = 'L' */ +/* > or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */ +/* > The vector v in the representation of H. V is not used if */ +/* > TAU = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCV */ +/* > \verbatim */ +/* > INCV is INTEGER */ +/* > The increment between elements of v. INCV <> 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION */ +/* > The value tau in the representation of H. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ +/* > On entry, the m by n matrix C. */ +/* > On exit, C is overwritten by the matrix H * C if SIDE = 'L', */ +/* > or C * H if SIDE = 'R'. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension */ +/* > (N) if SIDE = 'L' */ +/* > or (M) if SIDE = 'R' */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int dlarf_(char *side, integer *m, integer *n, doublereal *v, + integer *incv, doublereal *tau, doublereal *c__, integer *ldc, + doublereal *work, ftnlen side_len) +{ + /* System generated locals */ + integer c_dim1, c_offset; + doublereal d__1; + + /* Local variables */ + integer i__; + logical applyleft; + extern /* Subroutine */ int dger_(integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen); + integer lastc, lastv; + extern integer iladlc_(integer *, integer *, doublereal *, integer *), + iladlr_(integer *, integer *, doublereal *, integer *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --v; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + applyleft = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + lastv = 0; + lastc = 0; + if (*tau != 0.) { +/* Set up variables for scanning V. LASTV begins pointing to the end */ +/* of V. */ + if (applyleft) { + lastv = *m; + } else { + lastv = *n; + } + if (*incv > 0) { + i__ = (lastv - 1) * *incv + 1; + } else { + i__ = 1; + } +/* Look for the last non-zero row in V. */ + while(lastv > 0 && v[i__] == 0.) { + --lastv; + i__ -= *incv; + } + if (applyleft) { +/* Scan for the last non-zero column in C(1:lastv,:). */ + lastc = iladlc_(&lastv, n, &c__[c_offset], ldc); + } else { +/* Scan for the last non-zero row in C(:,1:lastv). */ + lastc = iladlr_(m, &lastv, &c__[c_offset], ldc); + } + } +/* Note that lastc.eq.0 renders the BLAS operations null; no special */ +/* case is needed at this level. */ + if (applyleft) { + +/* Form H * C */ + + if (lastv > 0) { + +/* w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1) */ + + dgemv_((char *)"Transpose", &lastv, &lastc, &c_b4, &c__[c_offset], ldc, & + v[1], incv, &c_b5, &work[1], &c__1, (ftnlen)9); + +/* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**T */ + + d__1 = -(*tau); + dger_(&lastv, &lastc, &d__1, &v[1], incv, &work[1], &c__1, &c__[ + c_offset], ldc); + } + } else { + +/* Form C * H */ + + if (lastv > 0) { + +/* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */ + + dgemv_((char *)"No transpose", &lastc, &lastv, &c_b4, &c__[c_offset], ldc, + &v[1], incv, &c_b5, &work[1], &c__1, (ftnlen)12); + +/* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**T */ + + d__1 = -(*tau); + dger_(&lastc, &lastv, &d__1, &work[1], &c__1, &v[1], incv, &c__[ + c_offset], ldc); + } + } + return 0; + +/* End of DLARF */ + +} /* dlarf_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlarfb.cpp b/lib/linalg/dlarfb.cpp new file mode 100644 index 0000000000..df15d11900 --- /dev/null +++ b/lib/linalg/dlarfb.cpp @@ -0,0 +1,886 @@ +/* fortran/dlarfb.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static doublereal c_b14 = 1.; +static doublereal c_b25 = -1.; + +/* > \brief \b DLARFB applies a block reflector or its transpose to a general rectangular matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLARFB + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, */ +/* T, LDT, C, LDC, WORK, LDWORK ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER DIRECT, SIDE, STOREV, TRANS */ +/* INTEGER K, LDC, LDT, LDV, LDWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION C( LDC, * ), T( LDT, * ), V( LDV, * ), */ +/* $ WORK( LDWORK, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLARFB applies a real block reflector H or its transpose H**T to a */ +/* > real m by n matrix C, from either the left or the right. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply H or H**T from the Left */ +/* > = 'R': apply H or H**T from the Right */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': apply H (No transpose) */ +/* > = 'T': apply H**T (Transpose) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIRECT */ +/* > \verbatim */ +/* > DIRECT is CHARACTER*1 */ +/* > Indicates how H is formed from a product of elementary */ +/* > reflectors */ +/* > = 'F': H = H(1) H(2) . . . H(k) (Forward) */ +/* > = 'B': H = H(k) . . . H(2) H(1) (Backward) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] STOREV */ +/* > \verbatim */ +/* > STOREV is CHARACTER*1 */ +/* > Indicates how the vectors which define the elementary */ +/* > reflectors are stored: */ +/* > = 'C': Columnwise */ +/* > = 'R': Rowwise */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The order of the matrix T (= the number of elementary */ +/* > reflectors whose product defines the block reflector). */ +/* > If SIDE = 'L', M >= K >= 0; */ +/* > if SIDE = 'R', N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] V */ +/* > \verbatim */ +/* > V is DOUBLE PRECISION array, dimension */ +/* > (LDV,K) if STOREV = 'C' */ +/* > (LDV,M) if STOREV = 'R' and SIDE = 'L' */ +/* > (LDV,N) if STOREV = 'R' and SIDE = 'R' */ +/* > The matrix V. See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDV */ +/* > \verbatim */ +/* > LDV is INTEGER */ +/* > The leading dimension of the array V. */ +/* > If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */ +/* > if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */ +/* > if STOREV = 'R', LDV >= K. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] T */ +/* > \verbatim */ +/* > T is DOUBLE PRECISION array, dimension (LDT,K) */ +/* > The triangular k by k matrix T in the representation of the */ +/* > block reflector. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDT */ +/* > \verbatim */ +/* > LDT is INTEGER */ +/* > The leading dimension of the array T. LDT >= K. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ +/* > On entry, the m by n matrix C. */ +/* > On exit, C is overwritten by H*C or H**T*C or C*H or C*H**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (LDWORK,K) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDWORK */ +/* > \verbatim */ +/* > LDWORK is INTEGER */ +/* > The leading dimension of the array WORK. */ +/* > If SIDE = 'L', LDWORK >= max(1,N); */ +/* > if SIDE = 'R', LDWORK >= max(1,M). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The shape of the matrix V and the storage of the vectors which define */ +/* > the H(i) is best illustrated by the following example with n = 5 and */ +/* > k = 3. The elements equal to 1 are not stored; the corresponding */ +/* > array elements are modified but restored on exit. The rest of the */ +/* > array is not used. */ +/* > */ +/* > DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ +/* > */ +/* > V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) */ +/* > ( v1 1 ) ( 1 v2 v2 v2 ) */ +/* > ( v1 v2 1 ) ( 1 v3 v3 ) */ +/* > ( v1 v2 v3 ) */ +/* > ( v1 v2 v3 ) */ +/* > */ +/* > DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ +/* > */ +/* > V = ( v1 v2 v3 ) V = ( v1 v1 1 ) */ +/* > ( v1 v2 v3 ) ( v2 v2 v2 1 ) */ +/* > ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) */ +/* > ( 1 v3 ) */ +/* > ( 1 ) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlarfb_(char *side, char *trans, char *direct, char * + storev, integer *m, integer *n, integer *k, doublereal *v, integer * + ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc, + doublereal *work, integer *ldwork, ftnlen side_len, ftnlen trans_len, + ftnlen direct_len, ftnlen storev_len) +{ + /* System generated locals */ + integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, + work_offset, i__1, i__2; + + /* Local variables */ + integer i__, j; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *), dtrmm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + char transt[1]; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick return if possible */ + + /* Parameter adjustments */ + v_dim1 = *ldv; + v_offset = 1 + v_dim1; + v -= v_offset; + t_dim1 = *ldt; + t_offset = 1 + t_dim1; + t -= t_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + work_dim1 = *ldwork; + work_offset = 1 + work_dim1; + work -= work_offset; + + /* Function Body */ + if (*m <= 0 || *n <= 0) { + return 0; + } + + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + *(unsigned char *)transt = 'T'; + } else { + *(unsigned char *)transt = 'N'; + } + + if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { + + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + +/* Let V = ( V1 ) (first K rows) */ +/* ( V2 ) */ +/* where V1 is unit lower triangular. */ + + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Form H * C or H**T * C where C = ( C1 ) */ +/* ( C2 ) */ + +/* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) */ + +/* W := C1**T */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], + &c__1); +/* L10: */ + } + +/* W := W * V1 */ + + dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*m > *k) { + +/* W := W + C2**T * V2 */ + + i__1 = *m - *k; + dgemm_((char *)"Transpose", (char *)"No transpose", n, k, &i__1, &c_b14, & + c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + v_dim1], + ldv, &c_b14, &work[work_offset], ldwork, (ftnlen) + 9, (ftnlen)12); + } + +/* W := W * T**T or W * T */ + + dtrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - V * W**T */ + + if (*m > *k) { + +/* C2 := C2 - V2 * W**T */ + + i__1 = *m - *k; + dgemm_((char *)"No transpose", (char *)"Transpose", &i__1, n, k, &c_b25, & + v[*k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc, ( + ftnlen)12, (ftnlen)9); + } + +/* W := W * V1**T */ + + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & + v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) + 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + +/* C1 := C1 - W**T */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; +/* L20: */ + } +/* L30: */ + } + + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + +/* Form C * H or C * H**T where C = ( C1 C2 ) */ + +/* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ + +/* W := C1 */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * + work_dim1 + 1], &c__1); +/* L40: */ + } + +/* W := W * V1 */ + + dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*n > *k) { + +/* W := W + C2 * V2 */ + + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, & + c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + + 1 + v_dim1], ldv, &c_b14, &work[work_offset], + ldwork, (ftnlen)12, (ftnlen)12); + } + +/* W := W * T or W * T**T */ + + dtrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - W * V**T */ + + if (*n > *k) { + +/* C2 := C2 - W * V2**T */ + + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"Transpose", m, &i__1, k, &c_b25, & + work[work_offset], ldwork, &v[*k + 1 + v_dim1], + ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, ( + ftnlen)12, (ftnlen)9); + } + +/* W := W * V1**T */ + + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & + v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) + 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + +/* C1 := C1 - W */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; +/* L50: */ + } +/* L60: */ + } + } + + } else { + +/* Let V = ( V1 ) */ +/* ( V2 ) (last K rows) */ +/* where V2 is unit upper triangular. */ + + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Form H * C or H**T * C where C = ( C1 ) */ +/* ( C2 ) */ + +/* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) */ + +/* W := C2**T */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * + work_dim1 + 1], &c__1); +/* L70: */ + } + +/* W := W * V2 */ + + dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, + &v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*m > *k) { + +/* W := W + C1**T * V1 */ + + i__1 = *m - *k; + dgemm_((char *)"Transpose", (char *)"No transpose", n, k, &i__1, &c_b14, & + c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & + work[work_offset], ldwork, (ftnlen)9, (ftnlen)12); + } + +/* W := W * T**T or W * T */ + + dtrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - V * W**T */ + + if (*m > *k) { + +/* C1 := C1 - V1 * W**T */ + + i__1 = *m - *k; + dgemm_((char *)"No transpose", (char *)"Transpose", &i__1, n, k, &c_b25, & + v[v_offset], ldv, &work[work_offset], ldwork, & + c_b14, &c__[c_offset], ldc, (ftnlen)12, (ftnlen)9) + ; + } + +/* W := W * V2**T */ + + dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & + v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + +/* C2 := C2 - W**T */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[*m - *k + j + i__ * c_dim1] -= work[i__ + j * + work_dim1]; +/* L80: */ + } +/* L90: */ + } + + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + +/* Form C * H or C * H**T where C = ( C1 C2 ) */ + +/* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ + +/* W := C2 */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ + j * work_dim1 + 1], &c__1); +/* L100: */ + } + +/* W := W * V2 */ + + dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, + &v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*n > *k) { + +/* W := W + C1 * V1 */ + + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, & + c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, & + c_b14, &work[work_offset], ldwork, (ftnlen)12, ( + ftnlen)12); + } + +/* W := W * T or W * T**T */ + + dtrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - W * V**T */ + + if (*n > *k) { + +/* C1 := C1 - W * V1**T */ + + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"Transpose", m, &i__1, k, &c_b25, & + work[work_offset], ldwork, &v[v_offset], ldv, & + c_b14, &c__[c_offset], ldc, (ftnlen)12, (ftnlen)9) + ; + } + +/* W := W * V2**T */ + + dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & + v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + +/* C2 := C2 - W */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + (*n - *k + j) * c_dim1] -= work[i__ + j * + work_dim1]; +/* L110: */ + } +/* L120: */ + } + } + } + + } else if (lsame_(storev, (char *)"R", (ftnlen)1, (ftnlen)1)) { + + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + +/* Let V = ( V1 V2 ) (V1: first K columns) */ +/* where V1 is unit upper triangular. */ + + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Form H * C or H**T * C where C = ( C1 ) */ +/* ( C2 ) */ + +/* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) */ + +/* W := C1**T */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], + &c__1); +/* L130: */ + } + +/* W := W * V1**T */ + + dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & + v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) + 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + if (*m > *k) { + +/* W := W + C2**T * V2**T */ + + i__1 = *m - *k; + dgemm_((char *)"Transpose", (char *)"Transpose", n, k, &i__1, &c_b14, & + c__[*k + 1 + c_dim1], ldc, &v[(*k + 1) * v_dim1 + + 1], ldv, &c_b14, &work[work_offset], ldwork, ( + ftnlen)9, (ftnlen)9); + } + +/* W := W * T**T or W * T */ + + dtrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - V**T * W**T */ + + if (*m > *k) { + +/* C2 := C2 - V2**T * W**T */ + + i__1 = *m - *k; + dgemm_((char *)"Transpose", (char *)"Transpose", &i__1, n, k, &c_b25, &v[( + *k + 1) * v_dim1 + 1], ldv, &work[work_offset], + ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc, ( + ftnlen)9, (ftnlen)9); + } + +/* W := W * V1 */ + + dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + +/* C1 := C1 - W**T */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; +/* L140: */ + } +/* L150: */ + } + + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + +/* Form C * H or C * H**T where C = ( C1 C2 ) */ + +/* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) */ + +/* W := C1 */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * + work_dim1 + 1], &c__1); +/* L160: */ + } + +/* W := W * V1**T */ + + dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & + v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) + 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + if (*n > *k) { + +/* W := W + C2 * V2**T */ + + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"Transpose", m, k, &i__1, &c_b14, & + c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + 1) * + v_dim1 + 1], ldv, &c_b14, &work[work_offset], + ldwork, (ftnlen)12, (ftnlen)9); + } + +/* W := W * T or W * T**T */ + + dtrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - W * V */ + + if (*n > *k) { + +/* C2 := C2 - W * V2 */ + + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, & + c_b25, &work[work_offset], ldwork, &v[(*k + 1) * + v_dim1 + 1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 + + 1], ldc, (ftnlen)12, (ftnlen)12); + } + +/* W := W * V1 */ + + dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + +/* C1 := C1 - W */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; +/* L170: */ + } +/* L180: */ + } + + } + + } else { + +/* Let V = ( V1 V2 ) (V2: last K columns) */ +/* where V2 is unit lower triangular. */ + + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Form H * C or H**T * C where C = ( C1 ) */ +/* ( C2 ) */ + +/* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) */ + +/* W := C2**T */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * + work_dim1 + 1], &c__1); +/* L190: */ + } + +/* W := W * V2**T */ + + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & + v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[work_offset] + , ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + if (*m > *k) { + +/* W := W + C1**T * V1**T */ + + i__1 = *m - *k; + dgemm_((char *)"Transpose", (char *)"Transpose", n, k, &i__1, &c_b14, & + c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & + work[work_offset], ldwork, (ftnlen)9, (ftnlen)9); + } + +/* W := W * T**T or W * T */ + + dtrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - V**T * W**T */ + + if (*m > *k) { + +/* C1 := C1 - V1**T * W**T */ + + i__1 = *m - *k; + dgemm_((char *)"Transpose", (char *)"Transpose", &i__1, n, k, &c_b25, &v[ + v_offset], ldv, &work[work_offset], ldwork, & + c_b14, &c__[c_offset], ldc, (ftnlen)9, (ftnlen)9); + } + +/* W := W * V2 */ + + dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, + &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 12, (ftnlen)4); + +/* C2 := C2 - W**T */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[*m - *k + j + i__ * c_dim1] -= work[i__ + j * + work_dim1]; +/* L200: */ + } +/* L210: */ + } + + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + +/* Form C * H or C * H' where C = ( C1 C2 ) */ + +/* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) */ + +/* W := C2 */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ + j * work_dim1 + 1], &c__1); +/* L220: */ + } + +/* W := W * V2**T */ + + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & + v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[work_offset] + , ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + if (*n > *k) { + +/* W := W + C1 * V1**T */ + + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"Transpose", m, k, &i__1, &c_b14, & + c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & + work[work_offset], ldwork, (ftnlen)12, (ftnlen)9); + } + +/* W := W * T or W * T**T */ + + dtrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - W * V */ + + if (*n > *k) { + +/* C1 := C1 - W * V1 */ + + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, & + c_b25, &work[work_offset], ldwork, &v[v_offset], + ldv, &c_b14, &c__[c_offset], ldc, (ftnlen)12, ( + ftnlen)12); + } + +/* W := W * V2 */ + + dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, + &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 12, (ftnlen)4); + +/* C1 := C1 - W */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + (*n - *k + j) * c_dim1] -= work[i__ + j * + work_dim1]; +/* L230: */ + } +/* L240: */ + } + + } + + } + } + + return 0; + +/* End of DLARFB */ + +} /* dlarfb_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlarfg.cpp b/lib/linalg/dlarfg.cpp new file mode 100644 index 0000000000..cb544ccf18 --- /dev/null +++ b/lib/linalg/dlarfg.cpp @@ -0,0 +1,240 @@ +/* fortran/dlarfg.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLARFG generates an elementary reflector (Householder matrix). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLARFG + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX, N */ +/* DOUBLE PRECISION ALPHA, TAU */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION X( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLARFG generates a real elementary reflector H of order n, such */ +/* > that */ +/* > */ +/* > H * ( alpha ) = ( beta ), H**T * H = I. */ +/* > ( x ) ( 0 ) */ +/* > */ +/* > where alpha and beta are scalars, and x is an (n-1)-element real */ +/* > vector. H is represented in the form */ +/* > */ +/* > H = I - tau * ( 1 ) * ( 1 v**T ) , */ +/* > ( v ) */ +/* > */ +/* > where tau is a real scalar and v is a real (n-1)-element */ +/* > vector. */ +/* > */ +/* > If the elements of x are all zero, then tau = 0 and H is taken to be */ +/* > the unit matrix. */ +/* > */ +/* > Otherwise 1 <= tau <= 2. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the elementary reflector. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION */ +/* > On entry, the value alpha. */ +/* > On exit, it is overwritten with the value beta. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION array, dimension */ +/* > (1+(N-2)*abs(INCX)) */ +/* > On entry, the vector x. */ +/* > On exit, it is overwritten with the vector v. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > The increment between elements of X. INCX > 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION */ +/* > The value tau. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int dlarfg_(integer *n, doublereal *alpha, doublereal *x, + integer *incx, doublereal *tau) +{ + /* System generated locals */ + integer i__1; + doublereal d__1; + + /* Builtin functions */ + double d_sign(doublereal *, doublereal *); + + /* Local variables */ + integer j, knt; + doublereal beta; + extern doublereal dnrm2_(integer *, doublereal *, integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); + doublereal xnorm; + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); + doublereal safmin, rsafmn; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --x; + + /* Function Body */ + if (*n <= 1) { + *tau = 0.; + return 0; + } + + i__1 = *n - 1; + xnorm = dnrm2_(&i__1, &x[1], incx); + + if (xnorm == 0.) { + +/* H = I */ + + *tau = 0.; + } else { + +/* general case */ + + d__1 = dlapy2_(alpha, &xnorm); + beta = -d_sign(&d__1, alpha); + safmin = dlamch_((char *)"S", (ftnlen)1) / dlamch_((char *)"E", (ftnlen)1); + knt = 0; + if (abs(beta) < safmin) { + +/* XNORM, BETA may be inaccurate; scale X and recompute them */ + + rsafmn = 1. / safmin; +L10: + ++knt; + i__1 = *n - 1; + dscal_(&i__1, &rsafmn, &x[1], incx); + beta *= rsafmn; + *alpha *= rsafmn; + if (abs(beta) < safmin && knt < 20) { + goto L10; + } + +/* New BETA is at most 1, at least SAFMIN */ + + i__1 = *n - 1; + xnorm = dnrm2_(&i__1, &x[1], incx); + d__1 = dlapy2_(alpha, &xnorm); + beta = -d_sign(&d__1, alpha); + } + *tau = (beta - *alpha) / beta; + i__1 = *n - 1; + d__1 = 1. / (*alpha - beta); + dscal_(&i__1, &d__1, &x[1], incx); + +/* If ALPHA is subnormal, it may lose relative accuracy */ + + i__1 = knt; + for (j = 1; j <= i__1; ++j) { + beta *= safmin; +/* L20: */ + } + *alpha = beta; + } + + return 0; + +/* End of DLARFG */ + +} /* dlarfg_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlarft.cpp b/lib/linalg/dlarft.cpp new file mode 100644 index 0000000000..220c9f0082 --- /dev/null +++ b/lib/linalg/dlarft.cpp @@ -0,0 +1,417 @@ +/* static/dlarft.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static doublereal c_b7 = 1.; + +/* > \brief \b DLARFT forms the triangular factor T of a block reflector H = I - vtvH */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLARFT + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER DIRECT, STOREV */ +/* INTEGER K, LDT, LDV, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLARFT forms the triangular factor T of a real block reflector H */ +/* > of order n, which is defined as a product of k elementary reflectors. */ +/* > */ +/* > If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */ +/* > */ +/* > If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */ +/* > */ +/* > If STOREV = 'C', the vector which defines the elementary reflector */ +/* > H(i) is stored in the i-th column of the array V, and */ +/* > */ +/* > H = I - V * T * V**T */ +/* > */ +/* > If STOREV = 'R', the vector which defines the elementary reflector */ +/* > H(i) is stored in the i-th row of the array V, and */ +/* > */ +/* > H = I - V**T * T * V */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] DIRECT */ +/* > \verbatim */ +/* > DIRECT is CHARACTER*1 */ +/* > Specifies the order in which the elementary reflectors are */ +/* > multiplied to form the block reflector: */ +/* > = 'F': H = H(1) H(2) . . . H(k) (Forward) */ +/* > = 'B': H = H(k) . . . H(2) H(1) (Backward) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] STOREV */ +/* > \verbatim */ +/* > STOREV is CHARACTER*1 */ +/* > Specifies how the vectors which define the elementary */ +/* > reflectors are stored (see also Further Details): */ +/* > = 'C': columnwise */ +/* > = 'R': rowwise */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the block reflector H. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The order of the triangular factor T (= the number of */ +/* > elementary reflectors). K >= 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] V */ +/* > \verbatim */ +/* > V is DOUBLE PRECISION array, dimension */ +/* > (LDV,K) if STOREV = 'C' */ +/* > (LDV,N) if STOREV = 'R' */ +/* > The matrix V. See further details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDV */ +/* > \verbatim */ +/* > LDV is INTEGER */ +/* > The leading dimension of the array V. */ +/* > If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] T */ +/* > \verbatim */ +/* > T is DOUBLE PRECISION array, dimension (LDT,K) */ +/* > The k by k triangular factor T of the block reflector. */ +/* > If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */ +/* > lower triangular. The rest of the array is not used. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDT */ +/* > \verbatim */ +/* > LDT is INTEGER */ +/* > The leading dimension of the array T. LDT >= K. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The shape of the matrix V and the storage of the vectors which define */ +/* > the H(i) is best illustrated by the following example with n = 5 and */ +/* > k = 3. The elements equal to 1 are not stored. */ +/* > */ +/* > DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ +/* > */ +/* > V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) */ +/* > ( v1 1 ) ( 1 v2 v2 v2 ) */ +/* > ( v1 v2 1 ) ( 1 v3 v3 ) */ +/* > ( v1 v2 v3 ) */ +/* > ( v1 v2 v3 ) */ +/* > */ +/* > DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ +/* > */ +/* > V = ( v1 v2 v3 ) V = ( v1 v1 1 ) */ +/* > ( v1 v2 v3 ) ( v2 v2 v2 1 ) */ +/* > ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) */ +/* > ( 1 v3 ) */ +/* > ( 1 ) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlarft_(char *direct, char *storev, integer *n, integer * + k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, + integer *ldt, ftnlen direct_len, ftnlen storev_len) +{ + /* System generated locals */ + integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3; + doublereal d__1; + + /* Local variables */ + integer i__, j, prevlastv; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen); + integer lastv; + extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick return if possible */ + + /* Parameter adjustments */ + v_dim1 = *ldv; + v_offset = 1 + v_dim1; + v -= v_offset; + --tau; + t_dim1 = *ldt; + t_offset = 1 + t_dim1; + t -= t_offset; + + /* Function Body */ + if (*n == 0) { + return 0; + } + + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + prevlastv = *n; + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + prevlastv = max(i__,prevlastv); + if (tau[i__] == 0.) { + +/* H(i) = I */ + + i__2 = i__; + for (j = 1; j <= i__2; ++j) { + t[j + i__ * t_dim1] = 0.; + } + } else { + +/* general case */ + + if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { +/* Skip any trailing zeros. */ + i__2 = i__ + 1; + for (lastv = *n; lastv >= i__2; --lastv) { + if (v[lastv + i__ * v_dim1] != 0.) { + goto L219; + } + } +L219: + i__2 = i__ - 1; + for (j = 1; j <= i__2; ++j) { + t[j + i__ * t_dim1] = -tau[i__] * v[i__ + j * v_dim1]; + } + j = min(lastv,prevlastv); + +/* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i) */ + + i__2 = j - i__; + i__3 = i__ - 1; + d__1 = -tau[i__]; + dgemv_((char *)"Transpose", &i__2, &i__3, &d__1, &v[i__ + 1 + + v_dim1], ldv, &v[i__ + 1 + i__ * v_dim1], &c__1, & + c_b7, &t[i__ * t_dim1 + 1], &c__1, (ftnlen)9); + } else { +/* Skip any trailing zeros. */ + i__2 = i__ + 1; + for (lastv = *n; lastv >= i__2; --lastv) { + if (v[i__ + lastv * v_dim1] != 0.) { + goto L235; + } + } +L235: + i__2 = i__ - 1; + for (j = 1; j <= i__2; ++j) { + t[j + i__ * t_dim1] = -tau[i__] * v[j + i__ * v_dim1]; + } + j = min(lastv,prevlastv); + +/* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T */ + + i__2 = i__ - 1; + i__3 = j - i__; + d__1 = -tau[i__]; + dgemv_((char *)"No transpose", &i__2, &i__3, &d__1, &v[(i__ + 1) * + v_dim1 + 1], ldv, &v[i__ + (i__ + 1) * v_dim1], + ldv, &c_b7, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) + 12); + } + +/* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */ + + i__2 = i__ - 1; + dtrmv_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", &i__2, &t[ + t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) + 5, (ftnlen)12, (ftnlen)8); + t[i__ + i__ * t_dim1] = tau[i__]; + if (i__ > 1) { + prevlastv = max(prevlastv,lastv); + } else { + prevlastv = lastv; + } + } + } + } else { + prevlastv = 1; + for (i__ = *k; i__ >= 1; --i__) { + if (tau[i__] == 0.) { + +/* H(i) = I */ + + i__1 = *k; + for (j = i__; j <= i__1; ++j) { + t[j + i__ * t_dim1] = 0.; + } + } else { + +/* general case */ + + if (i__ < *k) { + if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { +/* Skip any leading zeros. */ + i__1 = i__ - 1; + for (lastv = 1; lastv <= i__1; ++lastv) { + if (v[lastv + i__ * v_dim1] != 0.) { + goto L280; + } + } +L280: + i__1 = *k; + for (j = i__ + 1; j <= i__1; ++j) { + t[j + i__ * t_dim1] = -tau[i__] * v[*n - *k + i__ + + j * v_dim1]; + } + j = max(lastv,prevlastv); + +/* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i) */ + + i__1 = *n - *k + i__ - j; + i__2 = *k - i__; + d__1 = -tau[i__]; + dgemv_((char *)"Transpose", &i__1, &i__2, &d__1, &v[j + (i__ + + 1) * v_dim1], ldv, &v[j + i__ * v_dim1], & + c__1, &c_b7, &t[i__ + 1 + i__ * t_dim1], & + c__1, (ftnlen)9); + } else { +/* Skip any leading zeros. */ + i__1 = i__ - 1; + for (lastv = 1; lastv <= i__1; ++lastv) { + if (v[i__ + lastv * v_dim1] != 0.) { + goto L296; + } + } +L296: + i__1 = *k; + for (j = i__ + 1; j <= i__1; ++j) { + t[j + i__ * t_dim1] = -tau[i__] * v[j + (*n - *k + + i__) * v_dim1]; + } + j = max(lastv,prevlastv); + +/* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T */ + + i__1 = *k - i__; + i__2 = *n - *k + i__ - j; + d__1 = -tau[i__]; + dgemv_((char *)"No transpose", &i__1, &i__2, &d__1, &v[i__ + + 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], + ldv, &c_b7, &t[i__ + 1 + i__ * t_dim1], &c__1, + (ftnlen)12); + } + +/* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */ + + i__1 = *k - i__; + dtrmv_((char *)"Lower", (char *)"No transpose", (char *)"Non-unit", &i__1, &t[i__ + + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * + t_dim1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)8) + ; + if (i__ > 1) { + prevlastv = min(prevlastv,lastv); + } else { + prevlastv = lastv; + } + } + t[i__ + i__ * t_dim1] = tau[i__]; + } + } + } + return 0; + +/* End of DLARFT */ + +} /* dlarft_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlartg.cpp b/lib/linalg/dlartg.cpp new file mode 100644 index 0000000000..118d7865f6 --- /dev/null +++ b/lib/linalg/dlartg.cpp @@ -0,0 +1,258 @@ +/* fortran/dlartg.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLARTG generates a plane rotation with real cosine and real sine. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLARTG + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLARTG( F, G, CS, SN, R ) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION CS, F, G, R, SN */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLARTG generate a plane rotation so that */ +/* > */ +/* > [ CS SN ] . [ F ] = [ R ] where CS**2 + SN**2 = 1. */ +/* > [ -SN CS ] [ G ] [ 0 ] */ +/* > */ +/* > This is a slower, more accurate version of the BLAS1 routine DROTG, */ +/* > with the following other differences: */ +/* > F and G are unchanged on return. */ +/* > If G=0, then CS=1 and SN=0. */ +/* > If F=0 and (G .ne. 0), then CS=0 and SN=1 without doing any */ +/* > floating point operations (saves work in DBDSQR when */ +/* > there are zeros on the diagonal). */ +/* > */ +/* > If F exceeds G in magnitude, CS will be positive. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] F */ +/* > \verbatim */ +/* > F is DOUBLE PRECISION */ +/* > The first component of vector to be rotated. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] G */ +/* > \verbatim */ +/* > G is DOUBLE PRECISION */ +/* > The second component of vector to be rotated. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] CS */ +/* > \verbatim */ +/* > CS is DOUBLE PRECISION */ +/* > The cosine of the rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] SN */ +/* > \verbatim */ +/* > SN is DOUBLE PRECISION */ +/* > The sine of the rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] R */ +/* > \verbatim */ +/* > R is DOUBLE PRECISION */ +/* > The nonzero component of the rotated vector. */ +/* > */ +/* > This version has a few statements commented out for thread safety */ +/* > (machine parameters are computed on each entry). 10 feb 03, SJH. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \date December 2016 */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int dlartg_(doublereal *f, doublereal *g, doublereal *cs, + doublereal *sn, doublereal *r__) +{ + /* System generated locals */ + integer i__1; + doublereal d__1, d__2; + + /* Builtin functions */ + double log(doublereal), pow_di(doublereal *, integer *), sqrt(doublereal); + + /* Local variables */ + integer i__; + doublereal f1, g1, eps, scale; + integer count; + doublereal safmn2, safmx2; + extern doublereal dlamch_(char *, ftnlen); + doublereal safmin; + + +/* -- LAPACK auxiliary routine (version 3.7.0) -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ +/* December 2016 */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* LOGICAL FIRST */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Save statement .. */ +/* SAVE FIRST, SAFMX2, SAFMIN, SAFMN2 */ +/* .. */ +/* .. Data statements .. */ +/* DATA FIRST / .TRUE. / */ +/* .. */ +/* .. Executable Statements .. */ + +/* IF( FIRST ) THEN */ + safmin = dlamch_((char *)"S", (ftnlen)1); + eps = dlamch_((char *)"E", (ftnlen)1); + d__1 = dlamch_((char *)"B", (ftnlen)1); + i__1 = (integer) (log(safmin / eps) / log(dlamch_((char *)"B", (ftnlen)1)) / 2.); + safmn2 = pow_di(&d__1, &i__1); + safmx2 = 1. / safmn2; +/* FIRST = .FALSE. */ +/* END IF */ + if (*g == 0.) { + *cs = 1.; + *sn = 0.; + *r__ = *f; + } else if (*f == 0.) { + *cs = 0.; + *sn = 1.; + *r__ = *g; + } else { + f1 = *f; + g1 = *g; +/* Computing MAX */ + d__1 = abs(f1), d__2 = abs(g1); + scale = max(d__1,d__2); + if (scale >= safmx2) { + count = 0; +L10: + ++count; + f1 *= safmn2; + g1 *= safmn2; +/* Computing MAX */ + d__1 = abs(f1), d__2 = abs(g1); + scale = max(d__1,d__2); + if (scale >= safmx2) { + goto L10; + } +/* Computing 2nd power */ + d__1 = f1; +/* Computing 2nd power */ + d__2 = g1; + *r__ = sqrt(d__1 * d__1 + d__2 * d__2); + *cs = f1 / *r__; + *sn = g1 / *r__; + i__1 = count; + for (i__ = 1; i__ <= i__1; ++i__) { + *r__ *= safmx2; +/* L20: */ + } + } else if (scale <= safmn2) { + count = 0; +L30: + ++count; + f1 *= safmx2; + g1 *= safmx2; +/* Computing MAX */ + d__1 = abs(f1), d__2 = abs(g1); + scale = max(d__1,d__2); + if (scale <= safmn2) { + goto L30; + } +/* Computing 2nd power */ + d__1 = f1; +/* Computing 2nd power */ + d__2 = g1; + *r__ = sqrt(d__1 * d__1 + d__2 * d__2); + *cs = f1 / *r__; + *sn = g1 / *r__; + i__1 = count; + for (i__ = 1; i__ <= i__1; ++i__) { + *r__ *= safmn2; +/* L40: */ + } + } else { +/* Computing 2nd power */ + d__1 = f1; +/* Computing 2nd power */ + d__2 = g1; + *r__ = sqrt(d__1 * d__1 + d__2 * d__2); + *cs = f1 / *r__; + *sn = g1 / *r__; + } + if (abs(*f) > abs(*g) && *cs < 0.) { + *cs = -(*cs); + *sn = -(*sn); + *r__ = -(*r__); + } + } + return 0; + +/* End of DLARTG */ + +} /* dlartg_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlas2.cpp b/lib/linalg/dlas2.cpp new file mode 100644 index 0000000000..e3a53a9bac --- /dev/null +++ b/lib/linalg/dlas2.cpp @@ -0,0 +1,212 @@ +/* fortran/dlas2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLAS2 computes singular values of a 2-by-2 triangular matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLAS2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLAS2( F, G, H, SSMIN, SSMAX ) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION F, G, H, SSMAX, SSMIN */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLAS2 computes the singular values of the 2-by-2 matrix */ +/* > [ F G ] */ +/* > [ 0 H ]. */ +/* > On return, SSMIN is the smaller singular value and SSMAX is the */ +/* > larger singular value. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] F */ +/* > \verbatim */ +/* > F is DOUBLE PRECISION */ +/* > The (1,1) element of the 2-by-2 matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] G */ +/* > \verbatim */ +/* > G is DOUBLE PRECISION */ +/* > The (1,2) element of the 2-by-2 matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] H */ +/* > \verbatim */ +/* > H is DOUBLE PRECISION */ +/* > The (2,2) element of the 2-by-2 matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] SSMIN */ +/* > \verbatim */ +/* > SSMIN is DOUBLE PRECISION */ +/* > The smaller singular value. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] SSMAX */ +/* > \verbatim */ +/* > SSMAX is DOUBLE PRECISION */ +/* > The larger singular value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Barring over/underflow, all output quantities are correct to within */ +/* > a few units in the last place (ulps), even in the absence of a guard */ +/* > digit in addition/subtraction. */ +/* > */ +/* > In IEEE arithmetic, the code works correctly if one matrix element is */ +/* > infinite. */ +/* > */ +/* > Overflow will not occur unless the largest singular value itself */ +/* > overflows, or is within a few ulps of overflow. (On machines with */ +/* > partial overflow, like the Cray, overflow may occur if the largest */ +/* > singular value is within a factor of 2 of overflow.) */ +/* > */ +/* > Underflow is harmless if underflow is gradual. Otherwise, results */ +/* > may correspond to a matrix modified by perturbations of size near */ +/* > the underflow threshold. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlas2_(doublereal *f, doublereal *g, doublereal *h__, + doublereal *ssmin, doublereal *ssmax) +{ + /* System generated locals */ + doublereal d__1, d__2; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal c__, fa, ga, ha, as, at, au, fhmn, fhmx; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ==================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + fa = abs(*f); + ga = abs(*g); + ha = abs(*h__); + fhmn = min(fa,ha); + fhmx = max(fa,ha); + if (fhmn == 0.) { + *ssmin = 0.; + if (fhmx == 0.) { + *ssmax = ga; + } else { +/* Computing 2nd power */ + d__1 = min(fhmx,ga) / max(fhmx,ga); + *ssmax = max(fhmx,ga) * sqrt(d__1 * d__1 + 1.); + } + } else { + if (ga < fhmx) { + as = fhmn / fhmx + 1.; + at = (fhmx - fhmn) / fhmx; +/* Computing 2nd power */ + d__1 = ga / fhmx; + au = d__1 * d__1; + c__ = 2. / (sqrt(as * as + au) + sqrt(at * at + au)); + *ssmin = fhmn * c__; + *ssmax = fhmx / c__; + } else { + au = fhmx / ga; + if (au == 0.) { + +/* Avoid possible harmful underflow if exponent range */ +/* asymmetric (true SSMIN may not underflow even if */ +/* AU underflows) */ + + *ssmin = fhmn * fhmx / ga; + *ssmax = ga; + } else { + as = fhmn / fhmx + 1.; + at = (fhmx - fhmn) / fhmx; +/* Computing 2nd power */ + d__1 = as * au; +/* Computing 2nd power */ + d__2 = at * au; + c__ = 1. / (sqrt(d__1 * d__1 + 1.) + sqrt(d__2 * d__2 + 1.)); + *ssmin = fhmn * c__ * au; + *ssmin += *ssmin; + *ssmax = ga / (c__ + c__); + } + } + } + return 0; + +/* End of DLAS2 */ + +} /* dlas2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlascl.cpp b/lib/linalg/dlascl.cpp new file mode 100644 index 0000000000..932e1c63cb --- /dev/null +++ b/lib/linalg/dlascl.cpp @@ -0,0 +1,448 @@ +/* fortran/dlascl.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASCL + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER TYPE */ +/* INTEGER INFO, KL, KU, LDA, M, N */ +/* DOUBLE PRECISION CFROM, CTO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASCL multiplies the M by N real matrix A by the real scalar */ +/* > CTO/CFROM. This is done without over/underflow as long as the final */ +/* > result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that */ +/* > A may be full, upper triangular, lower triangular, upper Hessenberg, */ +/* > or banded. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] TYPE */ +/* > \verbatim */ +/* > TYPE is CHARACTER*1 */ +/* > TYPE indices the storage type of the input matrix. */ +/* > = 'G': A is a full matrix. */ +/* > = 'L': A is a lower triangular matrix. */ +/* > = 'U': A is an upper triangular matrix. */ +/* > = 'H': A is an upper Hessenberg matrix. */ +/* > = 'B': A is a symmetric band matrix with lower bandwidth KL */ +/* > and upper bandwidth KU and with the only the lower */ +/* > half stored. */ +/* > = 'Q': A is a symmetric band matrix with lower bandwidth KL */ +/* > and upper bandwidth KU and with the only the upper */ +/* > half stored. */ +/* > = 'Z': A is a band matrix with lower bandwidth KL and upper */ +/* > bandwidth KU. See DGBTRF for storage details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] KL */ +/* > \verbatim */ +/* > KL is INTEGER */ +/* > The lower bandwidth of A. Referenced only if TYPE = 'B', */ +/* > 'Q' or 'Z'. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] KU */ +/* > \verbatim */ +/* > KU is INTEGER */ +/* > The upper bandwidth of A. Referenced only if TYPE = 'B', */ +/* > 'Q' or 'Z'. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CFROM */ +/* > \verbatim */ +/* > CFROM is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CTO */ +/* > \verbatim */ +/* > CTO is DOUBLE PRECISION */ +/* > */ +/* > The matrix A is multiplied by CTO/CFROM. A(I,J) is computed */ +/* > without over/underflow if the final result CTO*A(I,J)/CFROM */ +/* > can be represented without over/underflow. CFROM must be */ +/* > nonzero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > The matrix to be multiplied by CTO/CFROM. See TYPE for the */ +/* > storage type. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > If TYPE = 'G', 'L', 'U', 'H', LDA >= max(1,M); */ +/* > TYPE = 'B', LDA >= KL+1; */ +/* > TYPE = 'Q', LDA >= KU+1; */ +/* > TYPE = 'Z', LDA >= 2*KL+KU+1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > 0 - successful exit */ +/* > <0 - if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int dlascl_(char *type__, integer *kl, integer *ku, + doublereal *cfrom, doublereal *cto, integer *m, integer *n, + doublereal *a, integer *lda, integer *info, ftnlen type_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + + /* Local variables */ + integer i__, j, k1, k2, k3, k4; + doublereal mul, cto1; + logical done; + doublereal ctoc; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer itype; + doublereal cfrom1; + extern doublereal dlamch_(char *, ftnlen); + doublereal cfromc; + extern logical disnan_(doublereal *); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + doublereal bignum, smlnum; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + + if (lsame_(type__, (char *)"G", (ftnlen)1, (ftnlen)1)) { + itype = 0; + } else if (lsame_(type__, (char *)"L", (ftnlen)1, (ftnlen)1)) { + itype = 1; + } else if (lsame_(type__, (char *)"U", (ftnlen)1, (ftnlen)1)) { + itype = 2; + } else if (lsame_(type__, (char *)"H", (ftnlen)1, (ftnlen)1)) { + itype = 3; + } else if (lsame_(type__, (char *)"B", (ftnlen)1, (ftnlen)1)) { + itype = 4; + } else if (lsame_(type__, (char *)"Q", (ftnlen)1, (ftnlen)1)) { + itype = 5; + } else if (lsame_(type__, (char *)"Z", (ftnlen)1, (ftnlen)1)) { + itype = 6; + } else { + itype = -1; + } + + if (itype == -1) { + *info = -1; + } else if (*cfrom == 0. || disnan_(cfrom)) { + *info = -4; + } else if (disnan_(cto)) { + *info = -5; + } else if (*m < 0) { + *info = -6; + } else if (*n < 0 || itype == 4 && *n != *m || itype == 5 && *n != *m) { + *info = -7; + } else if (itype <= 3 && *lda < max(1,*m)) { + *info = -9; + } else if (itype >= 4) { +/* Computing MAX */ + i__1 = *m - 1; + if (*kl < 0 || *kl > max(i__1,0)) { + *info = -2; + } else /* if(complicated condition) */ { +/* Computing MAX */ + i__1 = *n - 1; + if (*ku < 0 || *ku > max(i__1,0) || (itype == 4 || itype == 5) && + *kl != *ku) { + *info = -3; + } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < * + ku + 1 || itype == 6 && *lda < (*kl << 1) + *ku + 1) { + *info = -9; + } + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLASCL", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0 || *m == 0) { + return 0; + } + +/* Get machine parameters */ + + smlnum = dlamch_((char *)"S", (ftnlen)1); + bignum = 1. / smlnum; + + cfromc = *cfrom; + ctoc = *cto; + +L10: + cfrom1 = cfromc * smlnum; + if (cfrom1 == cfromc) { +/* CFROMC is an inf. Multiply by a correctly signed zero for */ +/* finite CTOC, or a NaN if CTOC is infinite. */ + mul = ctoc / cfromc; + done = TRUE_; + cto1 = ctoc; + } else { + cto1 = ctoc / bignum; + if (cto1 == ctoc) { +/* CTOC is either 0 or an inf. In both cases, CTOC itself */ +/* serves as the correct multiplication factor. */ + mul = ctoc; + done = TRUE_; + cfromc = 1.; + } else if (abs(cfrom1) > abs(ctoc) && ctoc != 0.) { + mul = smlnum; + done = FALSE_; + cfromc = cfrom1; + } else if (abs(cto1) > abs(cfromc)) { + mul = bignum; + done = FALSE_; + ctoc = cto1; + } else { + mul = ctoc / cfromc; + done = TRUE_; + if (mul == 1.) { + return 0; + } + } + } + + if (itype == 0) { + +/* Full matrix */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] *= mul; +/* L20: */ + } +/* L30: */ + } + + } else if (itype == 1) { + +/* Lower triangular matrix */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = j; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] *= mul; +/* L40: */ + } +/* L50: */ + } + + } else if (itype == 2) { + +/* Upper triangular matrix */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = min(j,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] *= mul; +/* L60: */ + } +/* L70: */ + } + + } else if (itype == 3) { + +/* Upper Hessenberg matrix */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { +/* Computing MIN */ + i__3 = j + 1; + i__2 = min(i__3,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] *= mul; +/* L80: */ + } +/* L90: */ + } + + } else if (itype == 4) { + +/* Lower half of a symmetric band matrix */ + + k3 = *kl + 1; + k4 = *n + 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { +/* Computing MIN */ + i__3 = k3, i__4 = k4 - j; + i__2 = min(i__3,i__4); + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] *= mul; +/* L100: */ + } +/* L110: */ + } + + } else if (itype == 5) { + +/* Upper half of a symmetric band matrix */ + + k1 = *ku + 2; + k3 = *ku + 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { +/* Computing MAX */ + i__2 = k1 - j; + i__3 = k3; + for (i__ = max(i__2,1); i__ <= i__3; ++i__) { + a[i__ + j * a_dim1] *= mul; +/* L120: */ + } +/* L130: */ + } + + } else if (itype == 6) { + +/* Band matrix */ + + k1 = *kl + *ku + 2; + k2 = *kl + 1; + k3 = (*kl << 1) + *ku + 1; + k4 = *kl + *ku + 1 + *m; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { +/* Computing MAX */ + i__3 = k1 - j; +/* Computing MIN */ + i__4 = k3, i__5 = k4 - j; + i__2 = min(i__4,i__5); + for (i__ = max(i__3,k2); i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] *= mul; +/* L140: */ + } +/* L150: */ + } + + } + + if (! done) { + goto L10; + } + + return 0; + +/* End of DLASCL */ + +} /* dlascl_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasd4.cpp b/lib/linalg/dlasd4.cpp new file mode 100644 index 0000000000..b0d8d1f7fe --- /dev/null +++ b/lib/linalg/dlasd4.cpp @@ -0,0 +1,1198 @@ +/* fortran/dlasd4.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASD4 computes the square root of the i-th updated eigenvalue of a positive symmetric rank-one + modification to a positive diagonal matrix. Used by dbdsdc. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASD4 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASD4( N, I, D, Z, DELTA, RHO, SIGMA, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER I, INFO, N */ +/* DOUBLE PRECISION RHO, SIGMA */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( * ), DELTA( * ), WORK( * ), Z( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > This subroutine computes the square root of the I-th updated */ +/* > eigenvalue of a positive symmetric rank-one modification to */ +/* > a positive diagonal matrix whose entries are given as the squares */ +/* > of the corresponding entries in the array d, and that */ +/* > */ +/* > 0 <= D(i) < D(j) for i < j */ +/* > */ +/* > and that RHO > 0. This is arranged by the calling routine, and is */ +/* > no loss in generality. The rank-one modified system is thus */ +/* > */ +/* > diag( D ) * diag( D ) + RHO * Z * Z_transpose. */ +/* > */ +/* > where we assume the Euclidean norm of Z is 1. */ +/* > */ +/* > The method consists of approximating the rational functions in the */ +/* > secular equation by simpler interpolating rational functions. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The length of all arrays. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] I */ +/* > \verbatim */ +/* > I is INTEGER */ +/* > The index of the eigenvalue to be computed. 1 <= I <= N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension ( N ) */ +/* > The original eigenvalues. It is assumed that they are in */ +/* > order, 0 <= D(I) < D(J) for I < J. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension ( N ) */ +/* > The components of the updating vector. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DELTA */ +/* > \verbatim */ +/* > DELTA is DOUBLE PRECISION array, dimension ( N ) */ +/* > If N .ne. 1, DELTA contains (D(j) - sigma_I) in its j-th */ +/* > component. If N = 1, then DELTA(1) = 1. The vector DELTA */ +/* > contains the information necessary to construct the */ +/* > (singular) eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > The scalar in the symmetric updating formula. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] SIGMA */ +/* > \verbatim */ +/* > SIGMA is DOUBLE PRECISION */ +/* > The computed sigma_I, the I-th updated eigenvalue. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension ( N ) */ +/* > If N .ne. 1, WORK contains (D(j) + sigma_I) in its j-th */ +/* > component. If N = 1, then WORK( 1 ) = 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > > 0: if INFO = 1, the updating process failed. */ +/* > \endverbatim */ + +/* > \par Internal Parameters: */ +/* ========================= */ +/* > */ +/* > \verbatim */ +/* > Logical variable ORGATI (origin-at-i?) is used for distinguishing */ +/* > whether D(i) or D(i+1) is treated as the origin. */ +/* > */ +/* > ORGATI = .true. origin at i */ +/* > ORGATI = .false. origin at i+1 */ +/* > */ +/* > Logical variable SWTCH3 (switch-for-3-poles?) is for noting */ +/* > if we are working with THREE poles! */ +/* > */ +/* > MAXIT is the maximum number of iterations allowed for each */ +/* > eigenvalue. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ren-Cang Li, Computer Science Division, University of California */ +/* > at Berkeley, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlasd4_(integer *n, integer *i__, doublereal *d__, + doublereal *z__, doublereal *delta, doublereal *rho, doublereal * + sigma, doublereal *work, integer *info) +{ + /* System generated locals */ + integer i__1; + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal a, b, c__; + integer j; + doublereal w, dd[3]; + integer ii; + doublereal dw, zz[3]; + integer ip1; + doublereal sq2, eta, phi, eps, tau, psi; + integer iim1, iip1; + doublereal tau2, dphi, sglb, dpsi, sgub; + integer iter; + doublereal temp, prew, temp1, temp2, dtiim, delsq, dtiip; + integer niter; + doublereal dtisq; + logical swtch; + doublereal dtnsq; + extern /* Subroutine */ int dlaed6_(integer *, logical *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *) + , dlasd5_(integer *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); + doublereal delsq2, dtnsq1; + logical swtch3; + extern doublereal dlamch_(char *, ftnlen); + logical orgati; + doublereal erretm, dtipsq, rhoinv; + logical geomavg; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Local Arrays .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Since this routine is called in an inner loop, we do no argument */ +/* checking. */ + +/* Quick return for N=1 and 2. */ + + /* Parameter adjustments */ + --work; + --delta; + --z__; + --d__; + + /* Function Body */ + *info = 0; + if (*n == 1) { + +/* Presumably, I=1 upon entry */ + + *sigma = sqrt(d__[1] * d__[1] + *rho * z__[1] * z__[1]); + delta[1] = 1.; + work[1] = 1.; + return 0; + } + if (*n == 2) { + dlasd5_(i__, &d__[1], &z__[1], &delta[1], rho, sigma, &work[1]); + return 0; + } + +/* Compute machine epsilon */ + + eps = dlamch_((char *)"Epsilon", (ftnlen)7); + rhoinv = 1. / *rho; + tau2 = 0.; + +/* The case I = N */ + + if (*i__ == *n) { + +/* Initialize some basic variables */ + + ii = *n - 1; + niter = 1; + +/* Calculate initial guess */ + + temp = *rho / 2.; + +/* If ||Z||_2 is not one, then TEMP should be set to */ +/* RHO * ||Z||_2^2 / TWO */ + + temp1 = temp / (d__[*n] + sqrt(d__[*n] * d__[*n] + temp)); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + work[j] = d__[j] + d__[*n] + temp1; + delta[j] = d__[j] - d__[*n] - temp1; +/* L10: */ + } + + psi = 0.; + i__1 = *n - 2; + for (j = 1; j <= i__1; ++j) { + psi += z__[j] * z__[j] / (delta[j] * work[j]); +/* L20: */ + } + + c__ = rhoinv + psi; + w = c__ + z__[ii] * z__[ii] / (delta[ii] * work[ii]) + z__[*n] * z__[* + n] / (delta[*n] * work[*n]); + + if (w <= 0.) { + temp1 = sqrt(d__[*n] * d__[*n] + *rho); + temp = z__[*n - 1] * z__[*n - 1] / ((d__[*n - 1] + temp1) * (d__[* + n] - d__[*n - 1] + *rho / (d__[*n] + temp1))) + z__[*n] * + z__[*n] / *rho; + +/* The following TAU2 is to approximate */ +/* SIGMA_n^2 - D( N )*D( N ) */ + + if (c__ <= temp) { + tau = *rho; + } else { + delsq = (d__[*n] - d__[*n - 1]) * (d__[*n] + d__[*n - 1]); + a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[* + n]; + b = z__[*n] * z__[*n] * delsq; + if (a < 0.) { + tau2 = b * 2. / (sqrt(a * a + b * 4. * c__) - a); + } else { + tau2 = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); + } + tau = tau2 / (d__[*n] + sqrt(d__[*n] * d__[*n] + tau2)); + } + +/* It can be proved that */ +/* D(N)^2+RHO/2 <= SIGMA_n^2 < D(N)^2+TAU2 <= D(N)^2+RHO */ + + } else { + delsq = (d__[*n] - d__[*n - 1]) * (d__[*n] + d__[*n - 1]); + a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n]; + b = z__[*n] * z__[*n] * delsq; + +/* The following TAU2 is to approximate */ +/* SIGMA_n^2 - D( N )*D( N ) */ + + if (a < 0.) { + tau2 = b * 2. / (sqrt(a * a + b * 4. * c__) - a); + } else { + tau2 = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); + } + tau = tau2 / (d__[*n] + sqrt(d__[*n] * d__[*n] + tau2)); + +/* It can be proved that */ +/* D(N)^2 < D(N)^2+TAU2 < SIGMA(N)^2 < D(N)^2+RHO/2 */ + + } + +/* The following TAU is to approximate SIGMA_n - D( N ) */ + +/* TAU = TAU2 / ( D( N )+SQRT( D( N )*D( N )+TAU2 ) ) */ + + *sigma = d__[*n] + tau; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] = d__[j] - d__[*n] - tau; + work[j] = d__[j] + d__[*n] + tau; +/* L30: */ + } + +/* Evaluate PSI and the derivative DPSI */ + + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = ii; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / (delta[j] * work[j]); + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; +/* L40: */ + } + erretm = abs(erretm); + +/* Evaluate PHI and the derivative DPHI */ + + temp = z__[*n] / (delta[*n] * work[*n]); + phi = z__[*n] * temp; + dphi = temp * temp; + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv; +/* $ + ABS( TAU2 )*( DPSI+DPHI ) */ + + w = rhoinv + phi + psi; + +/* Test for convergence */ + + if (abs(w) <= eps * erretm) { + goto L240; + } + +/* Calculate the new step */ + + ++niter; + dtnsq1 = work[*n - 1] * delta[*n - 1]; + dtnsq = work[*n] * delta[*n]; + c__ = w - dtnsq1 * dpsi - dtnsq * dphi; + a = (dtnsq + dtnsq1) * w - dtnsq * dtnsq1 * (dpsi + dphi); + b = dtnsq * dtnsq1 * w; + if (c__ < 0.) { + c__ = abs(c__); + } + if (c__ == 0.) { + eta = *rho - *sigma * *sigma; + } else if (a >= 0.) { + eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ + * 2.); + } else { + eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) + ); + } + +/* Note, eta should be positive if w is negative, and */ +/* eta should be negative otherwise. However, */ +/* if for some reason caused by roundoff, eta*w > 0, */ +/* we simply use one Newton step instead. This way */ +/* will guarantee eta*w < 0. */ + + if (w * eta > 0.) { + eta = -w / (dpsi + dphi); + } + temp = eta - dtnsq; + if (temp > *rho) { + eta = *rho + dtnsq; + } + + eta /= *sigma + sqrt(eta + *sigma * *sigma); + tau += eta; + *sigma += eta; + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] -= eta; + work[j] += eta; +/* L50: */ + } + +/* Evaluate PSI and the derivative DPSI */ + + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = ii; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / (work[j] * delta[j]); + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; +/* L60: */ + } + erretm = abs(erretm); + +/* Evaluate PHI and the derivative DPHI */ + + tau2 = work[*n] * delta[*n]; + temp = z__[*n] / tau2; + phi = z__[*n] * temp; + dphi = temp * temp; + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv; +/* $ + ABS( TAU2 )*( DPSI+DPHI ) */ + + w = rhoinv + phi + psi; + +/* Main loop to update the values of the array DELTA */ + + iter = niter + 1; + + for (niter = iter; niter <= 400; ++niter) { + +/* Test for convergence */ + + if (abs(w) <= eps * erretm) { + goto L240; + } + +/* Calculate the new step */ + + dtnsq1 = work[*n - 1] * delta[*n - 1]; + dtnsq = work[*n] * delta[*n]; + c__ = w - dtnsq1 * dpsi - dtnsq * dphi; + a = (dtnsq + dtnsq1) * w - dtnsq1 * dtnsq * (dpsi + dphi); + b = dtnsq1 * dtnsq * w; + if (a >= 0.) { + eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( + c__ * 2.); + } else { + eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))); + } + +/* Note, eta should be positive if w is negative, and */ +/* eta should be negative otherwise. However, */ +/* if for some reason caused by roundoff, eta*w > 0, */ +/* we simply use one Newton step instead. This way */ +/* will guarantee eta*w < 0. */ + + if (w * eta > 0.) { + eta = -w / (dpsi + dphi); + } + temp = eta - dtnsq; + if (temp <= 0.) { + eta /= 2.; + } + + eta /= *sigma + sqrt(eta + *sigma * *sigma); + tau += eta; + *sigma += eta; + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] -= eta; + work[j] += eta; +/* L70: */ + } + +/* Evaluate PSI and the derivative DPSI */ + + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = ii; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / (work[j] * delta[j]); + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; +/* L80: */ + } + erretm = abs(erretm); + +/* Evaluate PHI and the derivative DPHI */ + + tau2 = work[*n] * delta[*n]; + temp = z__[*n] / tau2; + phi = z__[*n] * temp; + dphi = temp * temp; + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv; +/* $ + ABS( TAU2 )*( DPSI+DPHI ) */ + + w = rhoinv + phi + psi; +/* L90: */ + } + +/* Return with INFO = 1, NITER = MAXIT and not converged */ + + *info = 1; + goto L240; + +/* End for the case I = N */ + + } else { + +/* The case for I < N */ + + niter = 1; + ip1 = *i__ + 1; + +/* Calculate initial guess */ + + delsq = (d__[ip1] - d__[*i__]) * (d__[ip1] + d__[*i__]); + delsq2 = delsq / 2.; + sq2 = sqrt((d__[*i__] * d__[*i__] + d__[ip1] * d__[ip1]) / 2.); + temp = delsq2 / (d__[*i__] + sq2); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + work[j] = d__[j] + d__[*i__] + temp; + delta[j] = d__[j] - d__[*i__] - temp; +/* L100: */ + } + + psi = 0.; + i__1 = *i__ - 1; + for (j = 1; j <= i__1; ++j) { + psi += z__[j] * z__[j] / (work[j] * delta[j]); +/* L110: */ + } + + phi = 0.; + i__1 = *i__ + 2; + for (j = *n; j >= i__1; --j) { + phi += z__[j] * z__[j] / (work[j] * delta[j]); +/* L120: */ + } + c__ = rhoinv + psi + phi; + w = c__ + z__[*i__] * z__[*i__] / (work[*i__] * delta[*i__]) + z__[ + ip1] * z__[ip1] / (work[ip1] * delta[ip1]); + + geomavg = FALSE_; + if (w > 0.) { + +/* d(i)^2 < the ith sigma^2 < (d(i)^2+d(i+1)^2)/2 */ + +/* We choose d(i) as origin. */ + + orgati = TRUE_; + ii = *i__; + sglb = 0.; + sgub = delsq2 / (d__[*i__] + sq2); + a = c__ * delsq + z__[*i__] * z__[*i__] + z__[ip1] * z__[ip1]; + b = z__[*i__] * z__[*i__] * delsq; + if (a > 0.) { + tau2 = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))); + } else { + tau2 = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / + (c__ * 2.); + } + +/* TAU2 now is an estimation of SIGMA^2 - D( I )^2. The */ +/* following, however, is the corresponding estimation of */ +/* SIGMA - D( I ). */ + + tau = tau2 / (d__[*i__] + sqrt(d__[*i__] * d__[*i__] + tau2)); + temp = sqrt(eps); + if (d__[*i__] <= temp * d__[ip1] && (d__1 = z__[*i__], abs(d__1)) + <= temp && d__[*i__] > 0.) { +/* Computing MIN */ + d__1 = d__[*i__] * 10.; + tau = min(d__1,sgub); + geomavg = TRUE_; + } + } else { + +/* (d(i)^2+d(i+1)^2)/2 <= the ith sigma^2 < d(i+1)^2/2 */ + +/* We choose d(i+1) as origin. */ + + orgati = FALSE_; + ii = ip1; + sglb = -delsq2 / (d__[ii] + sq2); + sgub = 0.; + a = c__ * delsq - z__[*i__] * z__[*i__] - z__[ip1] * z__[ip1]; + b = z__[ip1] * z__[ip1] * delsq; + if (a < 0.) { + tau2 = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs( + d__1)))); + } else { + tau2 = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / + (c__ * 2.); + } + +/* TAU2 now is an estimation of SIGMA^2 - D( IP1 )^2. The */ +/* following, however, is the corresponding estimation of */ +/* SIGMA - D( IP1 ). */ + + tau = tau2 / (d__[ip1] + sqrt((d__1 = d__[ip1] * d__[ip1] + tau2, + abs(d__1)))); + } + + *sigma = d__[ii] + tau; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + work[j] = d__[j] + d__[ii] + tau; + delta[j] = d__[j] - d__[ii] - tau; +/* L130: */ + } + iim1 = ii - 1; + iip1 = ii + 1; + +/* Evaluate PSI and the derivative DPSI */ + + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = iim1; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / (work[j] * delta[j]); + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; +/* L150: */ + } + erretm = abs(erretm); + +/* Evaluate PHI and the derivative DPHI */ + + dphi = 0.; + phi = 0.; + i__1 = iip1; + for (j = *n; j >= i__1; --j) { + temp = z__[j] / (work[j] * delta[j]); + phi += z__[j] * temp; + dphi += temp * temp; + erretm += phi; +/* L160: */ + } + + w = rhoinv + phi + psi; + +/* W is the value of the secular function with */ +/* its ii-th element removed. */ + + swtch3 = FALSE_; + if (orgati) { + if (w < 0.) { + swtch3 = TRUE_; + } + } else { + if (w > 0.) { + swtch3 = TRUE_; + } + } + if (ii == 1 || ii == *n) { + swtch3 = FALSE_; + } + + temp = z__[ii] / (work[ii] * delta[ii]); + dw = dpsi + dphi + temp * temp; + temp = z__[ii] * temp; + w += temp; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.; +/* $ + ABS( TAU2 )*DW */ + +/* Test for convergence */ + + if (abs(w) <= eps * erretm) { + goto L240; + } + + if (w <= 0.) { + sglb = max(sglb,tau); + } else { + sgub = min(sgub,tau); + } + +/* Calculate the new step */ + + ++niter; + if (! swtch3) { + dtipsq = work[ip1] * delta[ip1]; + dtisq = work[*i__] * delta[*i__]; + if (orgati) { +/* Computing 2nd power */ + d__1 = z__[*i__] / dtisq; + c__ = w - dtipsq * dw + delsq * (d__1 * d__1); + } else { +/* Computing 2nd power */ + d__1 = z__[ip1] / dtipsq; + c__ = w - dtisq * dw - delsq * (d__1 * d__1); + } + a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; + b = dtipsq * dtisq * w; + if (c__ == 0.) { + if (a == 0.) { + if (orgati) { + a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (dpsi + + dphi); + } else { + a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + + dphi); + } + } + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( + c__ * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))); + } + } else { + +/* Interpolation using THREE most relevant poles */ + + dtiim = work[iim1] * delta[iim1]; + dtiip = work[iip1] * delta[iip1]; + temp = rhoinv + psi + phi; + if (orgati) { + temp1 = z__[iim1] / dtiim; + temp1 *= temp1; + c__ = temp - dtiip * (dpsi + dphi) - (d__[iim1] - d__[iip1]) * + (d__[iim1] + d__[iip1]) * temp1; + zz[0] = z__[iim1] * z__[iim1]; + if (dpsi < temp1) { + zz[2] = dtiip * dtiip * dphi; + } else { + zz[2] = dtiip * dtiip * (dpsi - temp1 + dphi); + } + } else { + temp1 = z__[iip1] / dtiip; + temp1 *= temp1; + c__ = temp - dtiim * (dpsi + dphi) - (d__[iip1] - d__[iim1]) * + (d__[iim1] + d__[iip1]) * temp1; + if (dphi < temp1) { + zz[0] = dtiim * dtiim * dpsi; + } else { + zz[0] = dtiim * dtiim * (dpsi + (dphi - temp1)); + } + zz[2] = z__[iip1] * z__[iip1]; + } + zz[1] = z__[ii] * z__[ii]; + dd[0] = dtiim; + dd[1] = delta[ii] * work[ii]; + dd[2] = dtiip; + dlaed6_(&niter, &orgati, &c__, dd, zz, &w, &eta, info); + + if (*info != 0) { + +/* If INFO is not 0, i.e., DLAED6 failed, switch back */ +/* to 2 pole interpolation. */ + + swtch3 = FALSE_; + *info = 0; + dtipsq = work[ip1] * delta[ip1]; + dtisq = work[*i__] * delta[*i__]; + if (orgati) { +/* Computing 2nd power */ + d__1 = z__[*i__] / dtisq; + c__ = w - dtipsq * dw + delsq * (d__1 * d__1); + } else { +/* Computing 2nd power */ + d__1 = z__[ip1] / dtipsq; + c__ = w - dtisq * dw - delsq * (d__1 * d__1); + } + a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; + b = dtipsq * dtisq * w; + if (c__ == 0.) { + if (a == 0.) { + if (orgati) { + a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * ( + dpsi + dphi); + } else { + a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + + dphi); + } + } + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) + / (c__ * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, + abs(d__1)))); + } + } + } + +/* Note, eta should be positive if w is negative, and */ +/* eta should be negative otherwise. However, */ +/* if for some reason caused by roundoff, eta*w > 0, */ +/* we simply use one Newton step instead. This way */ +/* will guarantee eta*w < 0. */ + + if (w * eta >= 0.) { + eta = -w / dw; + } + + eta /= *sigma + sqrt(*sigma * *sigma + eta); + temp = tau + eta; + if (temp > sgub || temp < sglb) { + if (w < 0.) { + eta = (sgub - tau) / 2.; + } else { + eta = (sglb - tau) / 2.; + } + if (geomavg) { + if (w < 0.) { + if (tau > 0.) { + eta = sqrt(sgub * tau) - tau; + } + } else { + if (sglb > 0.) { + eta = sqrt(sglb * tau) - tau; + } + } + } + } + + prew = w; + + tau += eta; + *sigma += eta; + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + work[j] += eta; + delta[j] -= eta; +/* L170: */ + } + +/* Evaluate PSI and the derivative DPSI */ + + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = iim1; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / (work[j] * delta[j]); + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; +/* L180: */ + } + erretm = abs(erretm); + +/* Evaluate PHI and the derivative DPHI */ + + dphi = 0.; + phi = 0.; + i__1 = iip1; + for (j = *n; j >= i__1; --j) { + temp = z__[j] / (work[j] * delta[j]); + phi += z__[j] * temp; + dphi += temp * temp; + erretm += phi; +/* L190: */ + } + + tau2 = work[ii] * delta[ii]; + temp = z__[ii] / tau2; + dw = dpsi + dphi + temp * temp; + temp = z__[ii] * temp; + w = rhoinv + phi + psi + temp; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.; +/* $ + ABS( TAU2 )*DW */ + + swtch = FALSE_; + if (orgati) { + if (-w > abs(prew) / 10.) { + swtch = TRUE_; + } + } else { + if (w > abs(prew) / 10.) { + swtch = TRUE_; + } + } + +/* Main loop to update the values of the array DELTA and WORK */ + + iter = niter + 1; + + for (niter = iter; niter <= 400; ++niter) { + +/* Test for convergence */ + + if (abs(w) <= eps * erretm) { +/* $ .OR. (SGUB-SGLB).LE.EIGHT*ABS(SGUB+SGLB) ) THEN */ + goto L240; + } + + if (w <= 0.) { + sglb = max(sglb,tau); + } else { + sgub = min(sgub,tau); + } + +/* Calculate the new step */ + + if (! swtch3) { + dtipsq = work[ip1] * delta[ip1]; + dtisq = work[*i__] * delta[*i__]; + if (! swtch) { + if (orgati) { +/* Computing 2nd power */ + d__1 = z__[*i__] / dtisq; + c__ = w - dtipsq * dw + delsq * (d__1 * d__1); + } else { +/* Computing 2nd power */ + d__1 = z__[ip1] / dtipsq; + c__ = w - dtisq * dw - delsq * (d__1 * d__1); + } + } else { + temp = z__[ii] / (work[ii] * delta[ii]); + if (orgati) { + dpsi += temp * temp; + } else { + dphi += temp * temp; + } + c__ = w - dtisq * dpsi - dtipsq * dphi; + } + a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; + b = dtipsq * dtisq * w; + if (c__ == 0.) { + if (a == 0.) { + if (! swtch) { + if (orgati) { + a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * + (dpsi + dphi); + } else { + a = z__[ip1] * z__[ip1] + dtisq * dtisq * ( + dpsi + dphi); + } + } else { + a = dtisq * dtisq * dpsi + dtipsq * dtipsq * dphi; + } + } + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) + / (c__ * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, + abs(d__1)))); + } + } else { + +/* Interpolation using THREE most relevant poles */ + + dtiim = work[iim1] * delta[iim1]; + dtiip = work[iip1] * delta[iip1]; + temp = rhoinv + psi + phi; + if (swtch) { + c__ = temp - dtiim * dpsi - dtiip * dphi; + zz[0] = dtiim * dtiim * dpsi; + zz[2] = dtiip * dtiip * dphi; + } else { + if (orgati) { + temp1 = z__[iim1] / dtiim; + temp1 *= temp1; + temp2 = (d__[iim1] - d__[iip1]) * (d__[iim1] + d__[ + iip1]) * temp1; + c__ = temp - dtiip * (dpsi + dphi) - temp2; + zz[0] = z__[iim1] * z__[iim1]; + if (dpsi < temp1) { + zz[2] = dtiip * dtiip * dphi; + } else { + zz[2] = dtiip * dtiip * (dpsi - temp1 + dphi); + } + } else { + temp1 = z__[iip1] / dtiip; + temp1 *= temp1; + temp2 = (d__[iip1] - d__[iim1]) * (d__[iim1] + d__[ + iip1]) * temp1; + c__ = temp - dtiim * (dpsi + dphi) - temp2; + if (dphi < temp1) { + zz[0] = dtiim * dtiim * dpsi; + } else { + zz[0] = dtiim * dtiim * (dpsi + (dphi - temp1)); + } + zz[2] = z__[iip1] * z__[iip1]; + } + } + dd[0] = dtiim; + dd[1] = delta[ii] * work[ii]; + dd[2] = dtiip; + dlaed6_(&niter, &orgati, &c__, dd, zz, &w, &eta, info); + + if (*info != 0) { + +/* If INFO is not 0, i.e., DLAED6 failed, switch */ +/* back to two pole interpolation */ + + swtch3 = FALSE_; + *info = 0; + dtipsq = work[ip1] * delta[ip1]; + dtisq = work[*i__] * delta[*i__]; + if (! swtch) { + if (orgati) { +/* Computing 2nd power */ + d__1 = z__[*i__] / dtisq; + c__ = w - dtipsq * dw + delsq * (d__1 * d__1); + } else { +/* Computing 2nd power */ + d__1 = z__[ip1] / dtipsq; + c__ = w - dtisq * dw - delsq * (d__1 * d__1); + } + } else { + temp = z__[ii] / (work[ii] * delta[ii]); + if (orgati) { + dpsi += temp * temp; + } else { + dphi += temp * temp; + } + c__ = w - dtisq * dpsi - dtipsq * dphi; + } + a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; + b = dtipsq * dtisq * w; + if (c__ == 0.) { + if (a == 0.) { + if (! swtch) { + if (orgati) { + a = z__[*i__] * z__[*i__] + dtipsq * + dtipsq * (dpsi + dphi); + } else { + a = z__[ip1] * z__[ip1] + dtisq * dtisq * + (dpsi + dphi); + } + } else { + a = dtisq * dtisq * dpsi + dtipsq * dtipsq * + dphi; + } + } + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))) / (c__ * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, + abs(d__1)))); + } + } + } + +/* Note, eta should be positive if w is negative, and */ +/* eta should be negative otherwise. However, */ +/* if for some reason caused by roundoff, eta*w > 0, */ +/* we simply use one Newton step instead. This way */ +/* will guarantee eta*w < 0. */ + + if (w * eta >= 0.) { + eta = -w / dw; + } + + eta /= *sigma + sqrt(*sigma * *sigma + eta); + temp = tau + eta; + if (temp > sgub || temp < sglb) { + if (w < 0.) { + eta = (sgub - tau) / 2.; + } else { + eta = (sglb - tau) / 2.; + } + if (geomavg) { + if (w < 0.) { + if (tau > 0.) { + eta = sqrt(sgub * tau) - tau; + } + } else { + if (sglb > 0.) { + eta = sqrt(sglb * tau) - tau; + } + } + } + } + + prew = w; + + tau += eta; + *sigma += eta; + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + work[j] += eta; + delta[j] -= eta; +/* L200: */ + } + +/* Evaluate PSI and the derivative DPSI */ + + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = iim1; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / (work[j] * delta[j]); + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; +/* L210: */ + } + erretm = abs(erretm); + +/* Evaluate PHI and the derivative DPHI */ + + dphi = 0.; + phi = 0.; + i__1 = iip1; + for (j = *n; j >= i__1; --j) { + temp = z__[j] / (work[j] * delta[j]); + phi += z__[j] * temp; + dphi += temp * temp; + erretm += phi; +/* L220: */ + } + + tau2 = work[ii] * delta[ii]; + temp = z__[ii] / tau2; + dw = dpsi + dphi + temp * temp; + temp = z__[ii] * temp; + w = rhoinv + phi + psi + temp; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.; +/* $ + ABS( TAU2 )*DW */ + + if (w * prew > 0. && abs(w) > abs(prew) / 10.) { + swtch = ! swtch; + } + +/* L230: */ + } + +/* Return with INFO = 1, NITER = MAXIT and not converged */ + + *info = 1; + + } + +L240: + return 0; + +/* End of DLASD4 */ + +} /* dlasd4_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasd5.cpp b/lib/linalg/dlasd5.cpp new file mode 100644 index 0000000000..a789475cad --- /dev/null +++ b/lib/linalg/dlasd5.cpp @@ -0,0 +1,264 @@ +/* fortran/dlasd5.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASD5 computes the square root of the i-th eigenvalue of a positive symmetric rank-one modific +ation of a 2-by-2 diagonal matrix. Used by sbdsdc. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASD5 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASD5( I, D, Z, DELTA, RHO, DSIGMA, WORK ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER I */ +/* DOUBLE PRECISION DSIGMA, RHO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( 2 ), DELTA( 2 ), WORK( 2 ), Z( 2 ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > This subroutine computes the square root of the I-th eigenvalue */ +/* > of a positive symmetric rank-one modification of a 2-by-2 diagonal */ +/* > matrix */ +/* > */ +/* > diag( D ) * diag( D ) + RHO * Z * transpose(Z) . */ +/* > */ +/* > The diagonal entries in the array D are assumed to satisfy */ +/* > */ +/* > 0 <= D(i) < D(j) for i < j . */ +/* > */ +/* > We also assume RHO > 0 and that the Euclidean norm of the vector */ +/* > Z is one. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] I */ +/* > \verbatim */ +/* > I is INTEGER */ +/* > The index of the eigenvalue to be computed. I = 1 or I = 2. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension ( 2 ) */ +/* > The original eigenvalues. We assume 0 <= D(1) < D(2). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension ( 2 ) */ +/* > The components of the updating vector. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DELTA */ +/* > \verbatim */ +/* > DELTA is DOUBLE PRECISION array, dimension ( 2 ) */ +/* > Contains (D(j) - sigma_I) in its j-th component. */ +/* > The vector DELTA contains the information necessary */ +/* > to construct the eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > The scalar in the symmetric updating formula. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DSIGMA */ +/* > \verbatim */ +/* > DSIGMA is DOUBLE PRECISION */ +/* > The computed sigma_I, the I-th updated eigenvalue. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension ( 2 ) */ +/* > WORK contains (D(j) + sigma_I) in its j-th component. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ren-Cang Li, Computer Science Division, University of California */ +/* > at Berkeley, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlasd5_(integer *i__, doublereal *d__, doublereal *z__, + doublereal *delta, doublereal *rho, doublereal *dsigma, doublereal * + work) +{ + /* System generated locals */ + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal b, c__, w, del, tau, delsq; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --work; + --delta; + --z__; + --d__; + + /* Function Body */ + del = d__[2] - d__[1]; + delsq = del * (d__[2] + d__[1]); + if (*i__ == 1) { + w = *rho * 4. * (z__[2] * z__[2] / (d__[1] + d__[2] * 3.) - z__[1] * + z__[1] / (d__[1] * 3. + d__[2])) / del + 1.; + if (w > 0.) { + b = delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); + c__ = *rho * z__[1] * z__[1] * delsq; + +/* B > ZERO, always */ + +/* The following TAU is DSIGMA * DSIGMA - D( 1 ) * D( 1 ) */ + + tau = c__ * 2. / (b + sqrt((d__1 = b * b - c__ * 4., abs(d__1)))); + +/* The following TAU is DSIGMA - D( 1 ) */ + + tau /= d__[1] + sqrt(d__[1] * d__[1] + tau); + *dsigma = d__[1] + tau; + delta[1] = -tau; + delta[2] = del - tau; + work[1] = d__[1] * 2. + tau; + work[2] = d__[1] + tau + d__[2]; +/* DELTA( 1 ) = -Z( 1 ) / TAU */ +/* DELTA( 2 ) = Z( 2 ) / ( DEL-TAU ) */ + } else { + b = -delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); + c__ = *rho * z__[2] * z__[2] * delsq; + +/* The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 ) */ + + if (b > 0.) { + tau = c__ * -2. / (b + sqrt(b * b + c__ * 4.)); + } else { + tau = (b - sqrt(b * b + c__ * 4.)) / 2.; + } + +/* The following TAU is DSIGMA - D( 2 ) */ + + tau /= d__[2] + sqrt((d__1 = d__[2] * d__[2] + tau, abs(d__1))); + *dsigma = d__[2] + tau; + delta[1] = -(del + tau); + delta[2] = -tau; + work[1] = d__[1] + tau + d__[2]; + work[2] = d__[2] * 2. + tau; +/* DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) */ +/* DELTA( 2 ) = -Z( 2 ) / TAU */ + } +/* TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) */ +/* DELTA( 1 ) = DELTA( 1 ) / TEMP */ +/* DELTA( 2 ) = DELTA( 2 ) / TEMP */ + } else { + +/* Now I=2 */ + + b = -delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); + c__ = *rho * z__[2] * z__[2] * delsq; + +/* The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 ) */ + + if (b > 0.) { + tau = (b + sqrt(b * b + c__ * 4.)) / 2.; + } else { + tau = c__ * 2. / (-b + sqrt(b * b + c__ * 4.)); + } + +/* The following TAU is DSIGMA - D( 2 ) */ + + tau /= d__[2] + sqrt(d__[2] * d__[2] + tau); + *dsigma = d__[2] + tau; + delta[1] = -(del + tau); + delta[2] = -tau; + work[1] = d__[1] + tau + d__[2]; + work[2] = d__[2] * 2. + tau; +/* DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) */ +/* DELTA( 2 ) = -Z( 2 ) / TAU */ +/* TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) */ +/* DELTA( 1 ) = DELTA( 1 ) / TEMP */ +/* DELTA( 2 ) = DELTA( 2 ) / TEMP */ + } + return 0; + +/* End of DLASD5 */ + +} /* dlasd5_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasd6.cpp b/lib/linalg/dlasd6.cpp new file mode 100644 index 0000000000..d3b6cddd86 --- /dev/null +++ b/lib/linalg/dlasd6.cpp @@ -0,0 +1,514 @@ +/* fortran/dlasd6.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__0 = 0; +static doublereal c_b7 = 1.; +static integer c__1 = 1; +static integer c_n1 = -1; + +/* > \brief \b DLASD6 computes the SVD of an updated upper bidiagonal matrix obtained by merging two smaller o +nes by appending a row. Used by sbdsdc. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASD6 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASD6( ICOMPQ, NL, NR, SQRE, D, VF, VL, ALPHA, BETA, */ +/* IDXQ, PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, */ +/* LDGNUM, POLES, DIFL, DIFR, Z, K, C, S, WORK, */ +/* IWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL, */ +/* $ NR, SQRE */ +/* DOUBLE PRECISION ALPHA, BETA, C, S */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER GIVCOL( LDGCOL, * ), IDXQ( * ), IWORK( * ), */ +/* $ PERM( * ) */ +/* DOUBLE PRECISION D( * ), DIFL( * ), DIFR( * ), */ +/* $ GIVNUM( LDGNUM, * ), POLES( LDGNUM, * ), */ +/* $ VF( * ), VL( * ), WORK( * ), Z( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASD6 computes the SVD of an updated upper bidiagonal matrix B */ +/* > obtained by merging two smaller ones by appending a row. This */ +/* > routine is used only for the problem which requires all singular */ +/* > values and optionally singular vector matrices in factored form. */ +/* > B is an N-by-M matrix with N = NL + NR + 1 and M = N + SQRE. */ +/* > A related subroutine, DLASD1, handles the case in which all singular */ +/* > values and singular vectors of the bidiagonal matrix are desired. */ +/* > */ +/* > DLASD6 computes the SVD as follows: */ +/* > */ +/* > ( D1(in) 0 0 0 ) */ +/* > B = U(in) * ( Z1**T a Z2**T b ) * VT(in) */ +/* > ( 0 0 D2(in) 0 ) */ +/* > */ +/* > = U(out) * ( D(out) 0) * VT(out) */ +/* > */ +/* > where Z**T = (Z1**T a Z2**T b) = u**T VT**T, and u is a vector of dimension M */ +/* > with ALPHA and BETA in the NL+1 and NL+2 th entries and zeros */ +/* > elsewhere; and the entry b is empty if SQRE = 0. */ +/* > */ +/* > The singular values of B can be computed using D1, D2, the first */ +/* > components of all the right singular vectors of the lower block, and */ +/* > the last components of all the right singular vectors of the upper */ +/* > block. These components are stored and updated in VF and VL, */ +/* > respectively, in DLASD6. Hence U and VT are not explicitly */ +/* > referenced. */ +/* > */ +/* > The singular values are stored in D. The algorithm consists of two */ +/* > stages: */ +/* > */ +/* > The first stage consists of deflating the size of the problem */ +/* > when there are multiple singular values or if there is a zero */ +/* > in the Z vector. For each such occurrence the dimension of the */ +/* > secular equation problem is reduced by one. This stage is */ +/* > performed by the routine DLASD7. */ +/* > */ +/* > The second stage consists of calculating the updated */ +/* > singular values. This is done by finding the roots of the */ +/* > secular equation via the routine DLASD4 (as called by DLASD8). */ +/* > This routine also updates VF and VL and computes the distances */ +/* > between the updated singular values and the old singular */ +/* > values. */ +/* > */ +/* > DLASD6 is called from DLASDA. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ICOMPQ */ +/* > \verbatim */ +/* > ICOMPQ is INTEGER */ +/* > Specifies whether singular vectors are to be computed in */ +/* > factored form: */ +/* > = 0: Compute singular values only. */ +/* > = 1: Compute singular vectors in factored form as well. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NL */ +/* > \verbatim */ +/* > NL is INTEGER */ +/* > The row dimension of the upper block. NL >= 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NR */ +/* > \verbatim */ +/* > NR is INTEGER */ +/* > The row dimension of the lower block. NR >= 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] SQRE */ +/* > \verbatim */ +/* > SQRE is INTEGER */ +/* > = 0: the lower block is an NR-by-NR square matrix. */ +/* > = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */ +/* > */ +/* > The bidiagonal matrix has row dimension N = NL + NR + 1, */ +/* > and column dimension M = N + SQRE. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension ( NL+NR+1 ). */ +/* > On entry D(1:NL,1:NL) contains the singular values of the */ +/* > upper block, and D(NL+2:N) contains the singular values */ +/* > of the lower block. On exit D(1:N) contains the singular */ +/* > values of the modified matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] VF */ +/* > \verbatim */ +/* > VF is DOUBLE PRECISION array, dimension ( M ) */ +/* > On entry, VF(1:NL+1) contains the first components of all */ +/* > right singular vectors of the upper block; and VF(NL+2:M) */ +/* > contains the first components of all right singular vectors */ +/* > of the lower block. On exit, VF contains the first components */ +/* > of all right singular vectors of the bidiagonal matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] VL */ +/* > \verbatim */ +/* > VL is DOUBLE PRECISION array, dimension ( M ) */ +/* > On entry, VL(1:NL+1) contains the last components of all */ +/* > right singular vectors of the upper block; and VL(NL+2:M) */ +/* > contains the last components of all right singular vectors of */ +/* > the lower block. On exit, VL contains the last components of */ +/* > all right singular vectors of the bidiagonal matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION */ +/* > Contains the diagonal element associated with the added row. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] BETA */ +/* > \verbatim */ +/* > BETA is DOUBLE PRECISION */ +/* > Contains the off-diagonal element associated with the added */ +/* > row. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] IDXQ */ +/* > \verbatim */ +/* > IDXQ is INTEGER array, dimension ( N ) */ +/* > This contains the permutation which will reintegrate the */ +/* > subproblem just solved back into sorted order, i.e. */ +/* > D( IDXQ( I = 1, N ) ) will be in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] PERM */ +/* > \verbatim */ +/* > PERM is INTEGER array, dimension ( N ) */ +/* > The permutations (from deflation and sorting) to be applied */ +/* > to each block. Not referenced if ICOMPQ = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVPTR */ +/* > \verbatim */ +/* > GIVPTR is INTEGER */ +/* > The number of Givens rotations which took place in this */ +/* > subproblem. Not referenced if ICOMPQ = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVCOL */ +/* > \verbatim */ +/* > GIVCOL is INTEGER array, dimension ( LDGCOL, 2 ) */ +/* > Each pair of numbers indicates a pair of columns to take place */ +/* > in a Givens rotation. Not referenced if ICOMPQ = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDGCOL */ +/* > \verbatim */ +/* > LDGCOL is INTEGER */ +/* > leading dimension of GIVCOL, must be at least N. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVNUM */ +/* > \verbatim */ +/* > GIVNUM is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ +/* > Each number indicates the C or S value to be used in the */ +/* > corresponding Givens rotation. Not referenced if ICOMPQ = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDGNUM */ +/* > \verbatim */ +/* > LDGNUM is INTEGER */ +/* > The leading dimension of GIVNUM and POLES, must be at least N. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] POLES */ +/* > \verbatim */ +/* > POLES is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ +/* > On exit, POLES(1,*) is an array containing the new singular */ +/* > values obtained from solving the secular equation, and */ +/* > POLES(2,*) is an array containing the poles in the secular */ +/* > equation. Not referenced if ICOMPQ = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DIFL */ +/* > \verbatim */ +/* > DIFL is DOUBLE PRECISION array, dimension ( N ) */ +/* > On exit, DIFL(I) is the distance between I-th updated */ +/* > (undeflated) singular value and the I-th (undeflated) old */ +/* > singular value. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DIFR */ +/* > \verbatim */ +/* > DIFR is DOUBLE PRECISION array, */ +/* > dimension ( LDDIFR, 2 ) if ICOMPQ = 1 and */ +/* > dimension ( K ) if ICOMPQ = 0. */ +/* > On exit, DIFR(I,1) = D(I) - DSIGMA(I+1), DIFR(K,1) is not */ +/* > defined and will not be referenced. */ +/* > */ +/* > If ICOMPQ = 1, DIFR(1:K,2) is an array containing the */ +/* > normalizing factors for the right singular vector matrix. */ +/* > */ +/* > See DLASD8 for details on DIFL and DIFR. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension ( M ) */ +/* > The first elements of this array contain the components */ +/* > of the deflation-adjusted updating row vector. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > Contains the dimension of the non-deflated matrix, */ +/* > This is the order of the related secular equation. 1 <= K <=N. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION */ +/* > C contains garbage if SQRE =0 and the C-value of a Givens */ +/* > rotation related to the right null space if SQRE = 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION */ +/* > S contains garbage if SQRE =0 and the S-value of a Givens */ +/* > rotation related to the right null space if SQRE = 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension ( 4 * M ) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension ( 3 * N ) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: if INFO = 1, a singular value did not converge */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ming Gu and Huan Ren, Computer Science Division, University of */ +/* > California at Berkeley, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlasd6_(integer *icompq, integer *nl, integer *nr, + integer *sqre, doublereal *d__, doublereal *vf, doublereal *vl, + doublereal *alpha, doublereal *beta, integer *idxq, integer *perm, + integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, + integer *ldgnum, doublereal *poles, doublereal *difl, doublereal * + difr, doublereal *z__, integer *k, doublereal *c__, doublereal *s, + doublereal *work, integer *iwork, integer *info) +{ + /* System generated locals */ + integer givcol_dim1, givcol_offset, givnum_dim1, givnum_offset, + poles_dim1, poles_offset, i__1; + doublereal d__1, d__2; + + /* Local variables */ + integer i__, m, n, n1, n2, iw, idx, idxc, idxp, ivfw, ivlw; + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *), dlasd7_(integer *, integer *, integer *, + integer *, integer *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, integer *, + integer *, integer *, integer *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *), dlasd8_( + integer *, integer *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, doublereal *, + doublereal *, integer *), dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dlamrg_(integer *, integer *, + doublereal *, integer *, integer *, integer *); + integer isigma; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + doublereal orgnrm; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --vf; + --vl; + --idxq; + --perm; + givcol_dim1 = *ldgcol; + givcol_offset = 1 + givcol_dim1; + givcol -= givcol_offset; + poles_dim1 = *ldgnum; + poles_offset = 1 + poles_dim1; + poles -= poles_offset; + givnum_dim1 = *ldgnum; + givnum_offset = 1 + givnum_dim1; + givnum -= givnum_offset; + --difl; + --difr; + --z__; + --work; + --iwork; + + /* Function Body */ + *info = 0; + n = *nl + *nr + 1; + m = n + *sqre; + + if (*icompq < 0 || *icompq > 1) { + *info = -1; + } else if (*nl < 1) { + *info = -2; + } else if (*nr < 1) { + *info = -3; + } else if (*sqre < 0 || *sqre > 1) { + *info = -4; + } else if (*ldgcol < n) { + *info = -14; + } else if (*ldgnum < n) { + *info = -16; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLASD6", &i__1, (ftnlen)6); + return 0; + } + +/* The following values are for bookkeeping purposes only. They are */ +/* integer pointers which indicate the portion of the workspace */ +/* used by a particular array in DLASD7 and DLASD8. */ + + isigma = 1; + iw = isigma + n; + ivfw = iw + m; + ivlw = ivfw + m; + + idx = 1; + idxc = idx + n; + idxp = idxc + n; + +/* Scale. */ + +/* Computing MAX */ + d__1 = abs(*alpha), d__2 = abs(*beta); + orgnrm = max(d__1,d__2); + d__[*nl + 1] = 0.; + i__1 = n; + for (i__ = 1; i__ <= i__1; ++i__) { + if ((d__1 = d__[i__], abs(d__1)) > orgnrm) { + orgnrm = (d__1 = d__[i__], abs(d__1)); + } +/* L10: */ + } + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b7, &n, &c__1, &d__[1], &n, info, ( + ftnlen)1); + *alpha /= orgnrm; + *beta /= orgnrm; + +/* Sort and Deflate singular values. */ + + dlasd7_(icompq, nl, nr, sqre, k, &d__[1], &z__[1], &work[iw], &vf[1], & + work[ivfw], &vl[1], &work[ivlw], alpha, beta, &work[isigma], & + iwork[idx], &iwork[idxp], &idxq[1], &perm[1], givptr, &givcol[ + givcol_offset], ldgcol, &givnum[givnum_offset], ldgnum, c__, s, + info); + +/* Solve Secular Equation, compute DIFL, DIFR, and update VF, VL. */ + + dlasd8_(icompq, k, &d__[1], &z__[1], &vf[1], &vl[1], &difl[1], &difr[1], + ldgnum, &work[isigma], &work[iw], info); + +/* Report the possible convergence failure. */ + + if (*info != 0) { + return 0; + } + +/* Save the poles if ICOMPQ = 1. */ + + if (*icompq == 1) { + dcopy_(k, &d__[1], &c__1, &poles[poles_dim1 + 1], &c__1); + dcopy_(k, &work[isigma], &c__1, &poles[(poles_dim1 << 1) + 1], &c__1); + } + +/* Unscale. */ + + dlascl_((char *)"G", &c__0, &c__0, &c_b7, &orgnrm, &n, &c__1, &d__[1], &n, info, ( + ftnlen)1); + +/* Prepare the IDXQ sorting permutation. */ + + n1 = *k; + n2 = n - *k; + dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &idxq[1]); + + return 0; + +/* End of DLASD6 */ + +} /* dlasd6_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasd7.cpp b/lib/linalg/dlasd7.cpp new file mode 100644 index 0000000000..29169c7a84 --- /dev/null +++ b/lib/linalg/dlasd7.cpp @@ -0,0 +1,663 @@ +/* fortran/dlasd7.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DLASD7 merges the two sets of singular values together into a single sorted set. Then it tries +to deflate the size of the problem. Used by sbdsdc. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASD7 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASD7( ICOMPQ, NL, NR, SQRE, K, D, Z, ZW, VF, VFW, VL, */ +/* VLW, ALPHA, BETA, DSIGMA, IDX, IDXP, IDXQ, */ +/* PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, */ +/* C, S, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL, */ +/* $ NR, SQRE */ +/* DOUBLE PRECISION ALPHA, BETA, C, S */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER GIVCOL( LDGCOL, * ), IDX( * ), IDXP( * ), */ +/* $ IDXQ( * ), PERM( * ) */ +/* DOUBLE PRECISION D( * ), DSIGMA( * ), GIVNUM( LDGNUM, * ), */ +/* $ VF( * ), VFW( * ), VL( * ), VLW( * ), Z( * ), */ +/* $ ZW( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASD7 merges the two sets of singular values together into a single */ +/* > sorted set. Then it tries to deflate the size of the problem. There */ +/* > are two ways in which deflation can occur: when two or more singular */ +/* > values are close together or if there is a tiny entry in the Z */ +/* > vector. For each such occurrence the order of the related */ +/* > secular equation problem is reduced by one. */ +/* > */ +/* > DLASD7 is called from DLASD6. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ICOMPQ */ +/* > \verbatim */ +/* > ICOMPQ is INTEGER */ +/* > Specifies whether singular vectors are to be computed */ +/* > in compact form, as follows: */ +/* > = 0: Compute singular values only. */ +/* > = 1: Compute singular vectors of upper */ +/* > bidiagonal matrix in compact form. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NL */ +/* > \verbatim */ +/* > NL is INTEGER */ +/* > The row dimension of the upper block. NL >= 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NR */ +/* > \verbatim */ +/* > NR is INTEGER */ +/* > The row dimension of the lower block. NR >= 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] SQRE */ +/* > \verbatim */ +/* > SQRE is INTEGER */ +/* > = 0: the lower block is an NR-by-NR square matrix. */ +/* > = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */ +/* > */ +/* > The bidiagonal matrix has */ +/* > N = NL + NR + 1 rows and */ +/* > M = N + SQRE >= N columns. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > Contains the dimension of the non-deflated matrix, this is */ +/* > the order of the related secular equation. 1 <= K <=N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension ( N ) */ +/* > On entry D contains the singular values of the two submatrices */ +/* > to be combined. On exit D contains the trailing (N-K) updated */ +/* > singular values (those which were deflated) sorted into */ +/* > increasing order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension ( M ) */ +/* > On exit Z contains the updating row vector in the secular */ +/* > equation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] ZW */ +/* > \verbatim */ +/* > ZW is DOUBLE PRECISION array, dimension ( M ) */ +/* > Workspace for Z. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] VF */ +/* > \verbatim */ +/* > VF is DOUBLE PRECISION array, dimension ( M ) */ +/* > On entry, VF(1:NL+1) contains the first components of all */ +/* > right singular vectors of the upper block; and VF(NL+2:M) */ +/* > contains the first components of all right singular vectors */ +/* > of the lower block. On exit, VF contains the first components */ +/* > of all right singular vectors of the bidiagonal matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] VFW */ +/* > \verbatim */ +/* > VFW is DOUBLE PRECISION array, dimension ( M ) */ +/* > Workspace for VF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] VL */ +/* > \verbatim */ +/* > VL is DOUBLE PRECISION array, dimension ( M ) */ +/* > On entry, VL(1:NL+1) contains the last components of all */ +/* > right singular vectors of the upper block; and VL(NL+2:M) */ +/* > contains the last components of all right singular vectors */ +/* > of the lower block. On exit, VL contains the last components */ +/* > of all right singular vectors of the bidiagonal matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] VLW */ +/* > \verbatim */ +/* > VLW is DOUBLE PRECISION array, dimension ( M ) */ +/* > Workspace for VL. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION */ +/* > Contains the diagonal element associated with the added row. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is DOUBLE PRECISION */ +/* > Contains the off-diagonal element associated with the added */ +/* > row. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DSIGMA */ +/* > \verbatim */ +/* > DSIGMA is DOUBLE PRECISION array, dimension ( N ) */ +/* > Contains a copy of the diagonal elements (K-1 singular values */ +/* > and one zero) in the secular equation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IDX */ +/* > \verbatim */ +/* > IDX is INTEGER array, dimension ( N ) */ +/* > This will contain the permutation used to sort the contents of */ +/* > D into ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IDXP */ +/* > \verbatim */ +/* > IDXP is INTEGER array, dimension ( N ) */ +/* > This will contain the permutation used to place deflated */ +/* > values of D at the end of the array. On output IDXP(2:K) */ +/* > points to the nondeflated D-values and IDXP(K+1:N) */ +/* > points to the deflated singular values. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] IDXQ */ +/* > \verbatim */ +/* > IDXQ is INTEGER array, dimension ( N ) */ +/* > This contains the permutation which separately sorts the two */ +/* > sub-problems in D into ascending order. Note that entries in */ +/* > the first half of this permutation must first be moved one */ +/* > position backward; and entries in the second half */ +/* > must first have NL+1 added to their values. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] PERM */ +/* > \verbatim */ +/* > PERM is INTEGER array, dimension ( N ) */ +/* > The permutations (from deflation and sorting) to be applied */ +/* > to each singular block. Not referenced if ICOMPQ = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVPTR */ +/* > \verbatim */ +/* > GIVPTR is INTEGER */ +/* > The number of Givens rotations which took place in this */ +/* > subproblem. Not referenced if ICOMPQ = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVCOL */ +/* > \verbatim */ +/* > GIVCOL is INTEGER array, dimension ( LDGCOL, 2 ) */ +/* > Each pair of numbers indicates a pair of columns to take place */ +/* > in a Givens rotation. Not referenced if ICOMPQ = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDGCOL */ +/* > \verbatim */ +/* > LDGCOL is INTEGER */ +/* > The leading dimension of GIVCOL, must be at least N. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVNUM */ +/* > \verbatim */ +/* > GIVNUM is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ +/* > Each number indicates the C or S value to be used in the */ +/* > corresponding Givens rotation. Not referenced if ICOMPQ = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDGNUM */ +/* > \verbatim */ +/* > LDGNUM is INTEGER */ +/* > The leading dimension of GIVNUM, must be at least N. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION */ +/* > C contains garbage if SQRE =0 and the C-value of a Givens */ +/* > rotation related to the right null space if SQRE = 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION */ +/* > S contains garbage if SQRE =0 and the S-value of a Givens */ +/* > rotation related to the right null space if SQRE = 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ming Gu and Huan Ren, Computer Science Division, University of */ +/* > California at Berkeley, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlasd7_(integer *icompq, integer *nl, integer *nr, + integer *sqre, integer *k, doublereal *d__, doublereal *z__, + doublereal *zw, doublereal *vf, doublereal *vfw, doublereal *vl, + doublereal *vlw, doublereal *alpha, doublereal *beta, doublereal * + dsigma, integer *idx, integer *idxp, integer *idxq, integer *perm, + integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, + integer *ldgnum, doublereal *c__, doublereal *s, integer *info) +{ + /* System generated locals */ + integer givcol_dim1, givcol_offset, givnum_dim1, givnum_offset, i__1; + doublereal d__1, d__2; + + /* Local variables */ + integer i__, j, m, n, k2; + doublereal z1; + integer jp; + doublereal eps, tau, tol; + integer nlp1, nlp2, idxi, idxj; + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *); + integer idxjp; + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); + integer jprev; + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen); + doublereal hlftol; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ + +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --z__; + --zw; + --vf; + --vfw; + --vl; + --vlw; + --dsigma; + --idx; + --idxp; + --idxq; + --perm; + givcol_dim1 = *ldgcol; + givcol_offset = 1 + givcol_dim1; + givcol -= givcol_offset; + givnum_dim1 = *ldgnum; + givnum_offset = 1 + givnum_dim1; + givnum -= givnum_offset; + + /* Function Body */ + *info = 0; + n = *nl + *nr + 1; + m = n + *sqre; + + if (*icompq < 0 || *icompq > 1) { + *info = -1; + } else if (*nl < 1) { + *info = -2; + } else if (*nr < 1) { + *info = -3; + } else if (*sqre < 0 || *sqre > 1) { + *info = -4; + } else if (*ldgcol < n) { + *info = -22; + } else if (*ldgnum < n) { + *info = -24; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLASD7", &i__1, (ftnlen)6); + return 0; + } + + nlp1 = *nl + 1; + nlp2 = *nl + 2; + if (*icompq == 1) { + *givptr = 0; + } + +/* Generate the first part of the vector Z and move the singular */ +/* values in the first part of D one position backward. */ + + z1 = *alpha * vl[nlp1]; + vl[nlp1] = 0.; + tau = vf[nlp1]; + for (i__ = *nl; i__ >= 1; --i__) { + z__[i__ + 1] = *alpha * vl[i__]; + vl[i__] = 0.; + vf[i__ + 1] = vf[i__]; + d__[i__ + 1] = d__[i__]; + idxq[i__ + 1] = idxq[i__] + 1; +/* L10: */ + } + vf[1] = tau; + +/* Generate the second part of the vector Z. */ + + i__1 = m; + for (i__ = nlp2; i__ <= i__1; ++i__) { + z__[i__] = *beta * vf[i__]; + vf[i__] = 0.; +/* L20: */ + } + +/* Sort the singular values into increasing order */ + + i__1 = n; + for (i__ = nlp2; i__ <= i__1; ++i__) { + idxq[i__] += nlp1; +/* L30: */ + } + +/* DSIGMA, IDXC, IDXC, and ZW are used as storage space. */ + + i__1 = n; + for (i__ = 2; i__ <= i__1; ++i__) { + dsigma[i__] = d__[idxq[i__]]; + zw[i__] = z__[idxq[i__]]; + vfw[i__] = vf[idxq[i__]]; + vlw[i__] = vl[idxq[i__]]; +/* L40: */ + } + + dlamrg_(nl, nr, &dsigma[2], &c__1, &c__1, &idx[2]); + + i__1 = n; + for (i__ = 2; i__ <= i__1; ++i__) { + idxi = idx[i__] + 1; + d__[i__] = dsigma[idxi]; + z__[i__] = zw[idxi]; + vf[i__] = vfw[idxi]; + vl[i__] = vlw[idxi]; +/* L50: */ + } + +/* Calculate the allowable deflation tolerance */ + + eps = dlamch_((char *)"Epsilon", (ftnlen)7); +/* Computing MAX */ + d__1 = abs(*alpha), d__2 = abs(*beta); + tol = max(d__1,d__2); +/* Computing MAX */ + d__2 = (d__1 = d__[n], abs(d__1)); + tol = eps * 64. * max(d__2,tol); + +/* There are 2 kinds of deflation -- first a value in the z-vector */ +/* is small, second two (or more) singular values are very close */ +/* together (their difference is small). */ + +/* If the value in the z-vector is small, we simply permute the */ +/* array so that the corresponding singular value is moved to the */ +/* end. */ + +/* If two values in the D-vector are close, we perform a two-sided */ +/* rotation designed to make one of the corresponding z-vector */ +/* entries zero, and then permute the array so that the deflated */ +/* singular value is moved to the end. */ + +/* If there are multiple singular values then the problem deflates. */ +/* Here the number of equal singular values are found. As each equal */ +/* singular value is found, an elementary reflector is computed to */ +/* rotate the corresponding singular subspace so that the */ +/* corresponding components of Z are zero in this new basis. */ + + *k = 1; + k2 = n + 1; + i__1 = n; + for (j = 2; j <= i__1; ++j) { + if ((d__1 = z__[j], abs(d__1)) <= tol) { + +/* Deflate due to small z component. */ + + --k2; + idxp[k2] = j; + if (j == n) { + goto L100; + } + } else { + jprev = j; + goto L70; + } +/* L60: */ + } +L70: + j = jprev; +L80: + ++j; + if (j > n) { + goto L90; + } + if ((d__1 = z__[j], abs(d__1)) <= tol) { + +/* Deflate due to small z component. */ + + --k2; + idxp[k2] = j; + } else { + +/* Check if singular values are close enough to allow deflation. */ + + if ((d__1 = d__[j] - d__[jprev], abs(d__1)) <= tol) { + +/* Deflation is possible. */ + + *s = z__[jprev]; + *c__ = z__[j]; + +/* Find sqrt(a**2+b**2) without overflow or */ +/* destructive underflow. */ + + tau = dlapy2_(c__, s); + z__[j] = tau; + z__[jprev] = 0.; + *c__ /= tau; + *s = -(*s) / tau; + +/* Record the appropriate Givens rotation */ + + if (*icompq == 1) { + ++(*givptr); + idxjp = idxq[idx[jprev] + 1]; + idxj = idxq[idx[j] + 1]; + if (idxjp <= nlp1) { + --idxjp; + } + if (idxj <= nlp1) { + --idxj; + } + givcol[*givptr + (givcol_dim1 << 1)] = idxjp; + givcol[*givptr + givcol_dim1] = idxj; + givnum[*givptr + (givnum_dim1 << 1)] = *c__; + givnum[*givptr + givnum_dim1] = *s; + } + drot_(&c__1, &vf[jprev], &c__1, &vf[j], &c__1, c__, s); + drot_(&c__1, &vl[jprev], &c__1, &vl[j], &c__1, c__, s); + --k2; + idxp[k2] = jprev; + jprev = j; + } else { + ++(*k); + zw[*k] = z__[jprev]; + dsigma[*k] = d__[jprev]; + idxp[*k] = jprev; + jprev = j; + } + } + goto L80; +L90: + +/* Record the last singular value. */ + + ++(*k); + zw[*k] = z__[jprev]; + dsigma[*k] = d__[jprev]; + idxp[*k] = jprev; + +L100: + +/* Sort the singular values into DSIGMA. The singular values which */ +/* were not deflated go into the first K slots of DSIGMA, except */ +/* that DSIGMA(1) is treated separately. */ + + i__1 = n; + for (j = 2; j <= i__1; ++j) { + jp = idxp[j]; + dsigma[j] = d__[jp]; + vfw[j] = vf[jp]; + vlw[j] = vl[jp]; +/* L110: */ + } + if (*icompq == 1) { + i__1 = n; + for (j = 2; j <= i__1; ++j) { + jp = idxp[j]; + perm[j] = idxq[idx[jp] + 1]; + if (perm[j] <= nlp1) { + --perm[j]; + } +/* L120: */ + } + } + +/* The deflated singular values go back into the last N - K slots of */ +/* D. */ + + i__1 = n - *k; + dcopy_(&i__1, &dsigma[*k + 1], &c__1, &d__[*k + 1], &c__1); + +/* Determine DSIGMA(1), DSIGMA(2), Z(1), VF(1), VL(1), VF(M), and */ +/* VL(M). */ + + dsigma[1] = 0.; + hlftol = tol / 2.; + if (abs(dsigma[2]) <= hlftol) { + dsigma[2] = hlftol; + } + if (m > n) { + z__[1] = dlapy2_(&z1, &z__[m]); + if (z__[1] <= tol) { + *c__ = 1.; + *s = 0.; + z__[1] = tol; + } else { + *c__ = z1 / z__[1]; + *s = -z__[m] / z__[1]; + } + drot_(&c__1, &vf[m], &c__1, &vf[1], &c__1, c__, s); + drot_(&c__1, &vl[m], &c__1, &vl[1], &c__1, c__, s); + } else { + if (abs(z1) <= tol) { + z__[1] = tol; + } else { + z__[1] = z1; + } + } + +/* Restore Z, VF, and VL. */ + + i__1 = *k - 1; + dcopy_(&i__1, &zw[2], &c__1, &z__[2], &c__1); + i__1 = n - 1; + dcopy_(&i__1, &vfw[2], &c__1, &vf[2], &c__1); + i__1 = n - 1; + dcopy_(&i__1, &vlw[2], &c__1, &vl[2], &c__1); + + return 0; + +/* End of DLASD7 */ + +} /* dlasd7_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasd8.cpp b/lib/linalg/dlasd8.cpp new file mode 100644 index 0000000000..b95d5b11cc --- /dev/null +++ b/lib/linalg/dlasd8.cpp @@ -0,0 +1,419 @@ +/* fortran/dlasd8.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c__0 = 0; +static doublereal c_b8 = 1.; + +/* > \brief \b DLASD8 finds the square roots of the roots of the secular equation, and stores, for each elemen +t in D, the distance to its two nearest poles. Used by sbdsdc. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASD8 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASD8( ICOMPQ, K, D, Z, VF, VL, DIFL, DIFR, LDDIFR, */ +/* DSIGMA, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER ICOMPQ, INFO, K, LDDIFR */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( * ), DIFL( * ), DIFR( LDDIFR, * ), */ +/* $ DSIGMA( * ), VF( * ), VL( * ), WORK( * ), */ +/* $ Z( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASD8 finds the square roots of the roots of the secular equation, */ +/* > as defined by the values in DSIGMA and Z. It makes the appropriate */ +/* > calls to DLASD4, and stores, for each element in D, the distance */ +/* > to its two nearest poles (elements in DSIGMA). It also updates */ +/* > the arrays VF and VL, the first and last components of all the */ +/* > right singular vectors of the original bidiagonal matrix. */ +/* > */ +/* > DLASD8 is called from DLASD6. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ICOMPQ */ +/* > \verbatim */ +/* > ICOMPQ is INTEGER */ +/* > Specifies whether singular vectors are to be computed in */ +/* > factored form in the calling routine: */ +/* > = 0: Compute singular values only. */ +/* > = 1: Compute singular vectors in factored form as well. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of terms in the rational function to be solved */ +/* > by DLASD4. K >= 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension ( K ) */ +/* > On output, D contains the updated singular values. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension ( K ) */ +/* > On entry, the first K elements of this array contain the */ +/* > components of the deflation-adjusted updating row vector. */ +/* > On exit, Z is updated. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] VF */ +/* > \verbatim */ +/* > VF is DOUBLE PRECISION array, dimension ( K ) */ +/* > On entry, VF contains information passed through DBEDE8. */ +/* > On exit, VF contains the first K components of the first */ +/* > components of all right singular vectors of the bidiagonal */ +/* > matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] VL */ +/* > \verbatim */ +/* > VL is DOUBLE PRECISION array, dimension ( K ) */ +/* > On entry, VL contains information passed through DBEDE8. */ +/* > On exit, VL contains the first K components of the last */ +/* > components of all right singular vectors of the bidiagonal */ +/* > matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DIFL */ +/* > \verbatim */ +/* > DIFL is DOUBLE PRECISION array, dimension ( K ) */ +/* > On exit, DIFL(I) = D(I) - DSIGMA(I). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DIFR */ +/* > \verbatim */ +/* > DIFR is DOUBLE PRECISION array, */ +/* > dimension ( LDDIFR, 2 ) if ICOMPQ = 1 and */ +/* > dimension ( K ) if ICOMPQ = 0. */ +/* > On exit, DIFR(I,1) = D(I) - DSIGMA(I+1), DIFR(K,1) is not */ +/* > defined and will not be referenced. */ +/* > */ +/* > If ICOMPQ = 1, DIFR(1:K,2) is an array containing the */ +/* > normalizing factors for the right singular vector matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDDIFR */ +/* > \verbatim */ +/* > LDDIFR is INTEGER */ +/* > The leading dimension of DIFR, must be at least K. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DSIGMA */ +/* > \verbatim */ +/* > DSIGMA is DOUBLE PRECISION array, dimension ( K ) */ +/* > On entry, the first K elements of this array contain the old */ +/* > roots of the deflated updating problem. These are the poles */ +/* > of the secular equation. */ +/* > On exit, the elements of DSIGMA may be very slightly altered */ +/* > in value. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (3*K) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: if INFO = 1, a singular value did not converge */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ming Gu and Huan Ren, Computer Science Division, University of */ +/* > California at Berkeley, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlasd8_(integer *icompq, integer *k, doublereal *d__, + doublereal *z__, doublereal *vf, doublereal *vl, doublereal *difl, + doublereal *difr, integer *lddifr, doublereal *dsigma, doublereal * + work, integer *info) +{ + /* System generated locals */ + integer difr_dim1, difr_offset, i__1, i__2; + doublereal d__1, d__2; + + /* Builtin functions */ + double sqrt(doublereal), d_sign(doublereal *, doublereal *); + + /* Local variables */ + integer i__, j; + doublereal dj, rho; + integer iwk1, iwk2, iwk3; + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, + integer *); + doublereal temp; + extern doublereal dnrm2_(integer *, doublereal *, integer *); + integer iwk2i, iwk3i; + doublereal diflj, difrj, dsigj; + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); + extern doublereal dlamc3_(doublereal *, doublereal *); + extern /* Subroutine */ int dlasd4_(integer *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *), dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dlaset_(char *, integer *, integer + *, doublereal *, doublereal *, doublereal *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); + doublereal dsigjp; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --z__; + --vf; + --vl; + --difl; + difr_dim1 = *lddifr; + difr_offset = 1 + difr_dim1; + difr -= difr_offset; + --dsigma; + --work; + + /* Function Body */ + *info = 0; + + if (*icompq < 0 || *icompq > 1) { + *info = -1; + } else if (*k < 1) { + *info = -2; + } else if (*lddifr < *k) { + *info = -9; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLASD8", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*k == 1) { + d__[1] = abs(z__[1]); + difl[1] = d__[1]; + if (*icompq == 1) { + difl[2] = 1.; + difr[(difr_dim1 << 1) + 1] = 1.; + } + return 0; + } + +/* Modify values DSIGMA(i) to make sure all DSIGMA(i)-DSIGMA(j) can */ +/* be computed with high relative accuracy (barring over/underflow). */ +/* This is a problem on machines without a guard digit in */ +/* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). */ +/* The following code replaces DSIGMA(I) by 2*DSIGMA(I)-DSIGMA(I), */ +/* which on any of these machines zeros out the bottommost */ +/* bit of DSIGMA(I) if it is 1; this makes the subsequent */ +/* subtractions DSIGMA(I)-DSIGMA(J) unproblematic when cancellation */ +/* occurs. On binary machines with a guard digit (almost all */ +/* machines) it does not change DSIGMA(I) at all. On hexadecimal */ +/* and decimal machines with a guard digit, it slightly */ +/* changes the bottommost bits of DSIGMA(I). It does not account */ +/* for hexadecimal or decimal machines without guard digits */ +/* (we know of none). We use a subroutine call to compute */ +/* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating */ +/* this code. */ + + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + dsigma[i__] = dlamc3_(&dsigma[i__], &dsigma[i__]) - dsigma[i__]; +/* L10: */ + } + +/* Book keeping. */ + + iwk1 = 1; + iwk2 = iwk1 + *k; + iwk3 = iwk2 + *k; + iwk2i = iwk2 - 1; + iwk3i = iwk3 - 1; + +/* Normalize Z. */ + + rho = dnrm2_(k, &z__[1], &c__1); + dlascl_((char *)"G", &c__0, &c__0, &rho, &c_b8, k, &c__1, &z__[1], k, info, ( + ftnlen)1); + rho *= rho; + +/* Initialize WORK(IWK3). */ + + dlaset_((char *)"A", k, &c__1, &c_b8, &c_b8, &work[iwk3], k, (ftnlen)1); + +/* Compute the updated singular values, the arrays DIFL, DIFR, */ +/* and the updated Z. */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dlasd4_(k, &j, &dsigma[1], &z__[1], &work[iwk1], &rho, &d__[j], &work[ + iwk2], info); + +/* If the root finder fails, report the convergence failure. */ + + if (*info != 0) { + return 0; + } + work[iwk3i + j] = work[iwk3i + j] * work[j] * work[iwk2i + j]; + difl[j] = -work[j]; + difr[j + difr_dim1] = -work[j + 1]; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + work[iwk3i + i__] = work[iwk3i + i__] * work[i__] * work[iwk2i + + i__] / (dsigma[i__] - dsigma[j]) / (dsigma[i__] + dsigma[ + j]); +/* L20: */ + } + i__2 = *k; + for (i__ = j + 1; i__ <= i__2; ++i__) { + work[iwk3i + i__] = work[iwk3i + i__] * work[i__] * work[iwk2i + + i__] / (dsigma[i__] - dsigma[j]) / (dsigma[i__] + dsigma[ + j]); +/* L30: */ + } +/* L40: */ + } + +/* Compute updated Z. */ + + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + d__2 = sqrt((d__1 = work[iwk3i + i__], abs(d__1))); + z__[i__] = d_sign(&d__2, &z__[i__]); +/* L50: */ + } + +/* Update VF and VL. */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + diflj = difl[j]; + dj = d__[j]; + dsigj = -dsigma[j]; + if (j < *k) { + difrj = -difr[j + difr_dim1]; + dsigjp = -dsigma[j + 1]; + } + work[j] = -z__[j] / diflj / (dsigma[j] + dj); + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + work[i__] = z__[i__] / (dlamc3_(&dsigma[i__], &dsigj) - diflj) / ( + dsigma[i__] + dj); +/* L60: */ + } + i__2 = *k; + for (i__ = j + 1; i__ <= i__2; ++i__) { + work[i__] = z__[i__] / (dlamc3_(&dsigma[i__], &dsigjp) + difrj) / + (dsigma[i__] + dj); +/* L70: */ + } + temp = dnrm2_(k, &work[1], &c__1); + work[iwk2i + j] = ddot_(k, &work[1], &c__1, &vf[1], &c__1) / temp; + work[iwk3i + j] = ddot_(k, &work[1], &c__1, &vl[1], &c__1) / temp; + if (*icompq == 1) { + difr[j + (difr_dim1 << 1)] = temp; + } +/* L80: */ + } + + dcopy_(k, &work[iwk2], &c__1, &vf[1], &c__1); + dcopy_(k, &work[iwk3], &c__1, &vl[1], &c__1); + + return 0; + +/* End of DLASD8 */ + +} /* dlasd8_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasda.cpp b/lib/linalg/dlasda.cpp new file mode 100644 index 0000000000..a63dc14dec --- /dev/null +++ b/lib/linalg/dlasda.cpp @@ -0,0 +1,624 @@ +/* fortran/dlasda.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__0 = 0; +static doublereal c_b11 = 0.; +static doublereal c_b12 = 1.; +static integer c__1 = 1; +static integer c__2 = 2; + +/* > \brief \b DLASDA computes the singular value decomposition (SVD) of a real upper bidiagonal matrix with d +iagonal d and off-diagonal e. Used by sbdsdc. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASDA + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASDA( ICOMPQ, SMLSIZ, N, SQRE, D, E, U, LDU, VT, K, */ +/* DIFL, DIFR, Z, POLES, GIVPTR, GIVCOL, LDGCOL, */ +/* PERM, GIVNUM, C, S, WORK, IWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER ICOMPQ, INFO, LDGCOL, LDU, N, SMLSIZ, SQRE */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ), */ +/* $ K( * ), PERM( LDGCOL, * ) */ +/* DOUBLE PRECISION C( * ), D( * ), DIFL( LDU, * ), DIFR( LDU, * ), */ +/* $ E( * ), GIVNUM( LDU, * ), POLES( LDU, * ), */ +/* $ S( * ), U( LDU, * ), VT( LDU, * ), WORK( * ), */ +/* $ Z( LDU, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Using a divide and conquer approach, DLASDA computes the singular */ +/* > value decomposition (SVD) of a real upper bidiagonal N-by-M matrix */ +/* > B with diagonal D and offdiagonal E, where M = N + SQRE. The */ +/* > algorithm computes the singular values in the SVD B = U * S * VT. */ +/* > The orthogonal matrices U and VT are optionally computed in */ +/* > compact form. */ +/* > */ +/* > A related subroutine, DLASD0, computes the singular values and */ +/* > the singular vectors in explicit form. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ICOMPQ */ +/* > \verbatim */ +/* > ICOMPQ is INTEGER */ +/* > Specifies whether singular vectors are to be computed */ +/* > in compact form, as follows */ +/* > = 0: Compute singular values only. */ +/* > = 1: Compute singular vectors of upper bidiagonal */ +/* > matrix in compact form. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] SMLSIZ */ +/* > \verbatim */ +/* > SMLSIZ is INTEGER */ +/* > The maximum size of the subproblems at the bottom of the */ +/* > computation tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The row dimension of the upper bidiagonal matrix. This is */ +/* > also the dimension of the main diagonal array D. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] SQRE */ +/* > \verbatim */ +/* > SQRE is INTEGER */ +/* > Specifies the column dimension of the bidiagonal matrix. */ +/* > = 0: The bidiagonal matrix has column dimension M = N; */ +/* > = 1: The bidiagonal matrix has column dimension M = N + 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension ( N ) */ +/* > On entry D contains the main diagonal of the bidiagonal */ +/* > matrix. On exit D, if INFO = 0, contains its singular values. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension ( M-1 ) */ +/* > Contains the subdiagonal entries of the bidiagonal matrix. */ +/* > On exit, E has been destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] U */ +/* > \verbatim */ +/* > U is DOUBLE PRECISION array, */ +/* > dimension ( LDU, SMLSIZ ) if ICOMPQ = 1, and not referenced */ +/* > if ICOMPQ = 0. If ICOMPQ = 1, on exit, U contains the left */ +/* > singular vector matrices of all subproblems at the bottom */ +/* > level. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDU */ +/* > \verbatim */ +/* > LDU is INTEGER, LDU = > N. */ +/* > The leading dimension of arrays U, VT, DIFL, DIFR, POLES, */ +/* > GIVNUM, and Z. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] VT */ +/* > \verbatim */ +/* > VT is DOUBLE PRECISION array, */ +/* > dimension ( LDU, SMLSIZ+1 ) if ICOMPQ = 1, and not referenced */ +/* > if ICOMPQ = 0. If ICOMPQ = 1, on exit, VT**T contains the right */ +/* > singular vector matrices of all subproblems at the bottom */ +/* > level. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] K */ +/* > \verbatim */ +/* > K is INTEGER array, */ +/* > dimension ( N ) if ICOMPQ = 1 and dimension 1 if ICOMPQ = 0. */ +/* > If ICOMPQ = 1, on exit, K(I) is the dimension of the I-th */ +/* > secular equation on the computation tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DIFL */ +/* > \verbatim */ +/* > DIFL is DOUBLE PRECISION array, dimension ( LDU, NLVL ), */ +/* > where NLVL = floor(log_2 (N/SMLSIZ))). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DIFR */ +/* > \verbatim */ +/* > DIFR is DOUBLE PRECISION array, */ +/* > dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1 and */ +/* > dimension ( N ) if ICOMPQ = 0. */ +/* > If ICOMPQ = 1, on exit, DIFL(1:N, I) and DIFR(1:N, 2 * I - 1) */ +/* > record distances between singular values on the I-th */ +/* > level and singular values on the (I -1)-th level, and */ +/* > DIFR(1:N, 2 * I ) contains the normalizing factors for */ +/* > the right singular vector matrix. See DLASD8 for details. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, */ +/* > dimension ( LDU, NLVL ) if ICOMPQ = 1 and */ +/* > dimension ( N ) if ICOMPQ = 0. */ +/* > The first K elements of Z(1, I) contain the components of */ +/* > the deflation-adjusted updating row vector for subproblems */ +/* > on the I-th level. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] POLES */ +/* > \verbatim */ +/* > POLES is DOUBLE PRECISION array, */ +/* > dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1, and not referenced */ +/* > if ICOMPQ = 0. If ICOMPQ = 1, on exit, POLES(1, 2*I - 1) and */ +/* > POLES(1, 2*I) contain the new and old singular values */ +/* > involved in the secular equations on the I-th level. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVPTR */ +/* > \verbatim */ +/* > GIVPTR is INTEGER array, */ +/* > dimension ( N ) if ICOMPQ = 1, and not referenced if */ +/* > ICOMPQ = 0. If ICOMPQ = 1, on exit, GIVPTR( I ) records */ +/* > the number of Givens rotations performed on the I-th */ +/* > problem on the computation tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVCOL */ +/* > \verbatim */ +/* > GIVCOL is INTEGER array, */ +/* > dimension ( LDGCOL, 2 * NLVL ) if ICOMPQ = 1, and not */ +/* > referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I, */ +/* > GIVCOL(1, 2 *I - 1) and GIVCOL(1, 2 *I) record the locations */ +/* > of Givens rotations performed on the I-th level on the */ +/* > computation tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDGCOL */ +/* > \verbatim */ +/* > LDGCOL is INTEGER, LDGCOL = > N. */ +/* > The leading dimension of arrays GIVCOL and PERM. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] PERM */ +/* > \verbatim */ +/* > PERM is INTEGER array, */ +/* > dimension ( LDGCOL, NLVL ) if ICOMPQ = 1, and not referenced */ +/* > if ICOMPQ = 0. If ICOMPQ = 1, on exit, PERM(1, I) records */ +/* > permutations done on the I-th level of the computation tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVNUM */ +/* > \verbatim */ +/* > GIVNUM is DOUBLE PRECISION array, */ +/* > dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1, and not */ +/* > referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I, */ +/* > GIVNUM(1, 2 *I - 1) and GIVNUM(1, 2 *I) record the C- and S- */ +/* > values of Givens rotations performed on the I-th level on */ +/* > the computation tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, */ +/* > dimension ( N ) if ICOMPQ = 1, and dimension 1 if ICOMPQ = 0. */ +/* > If ICOMPQ = 1 and the I-th subproblem is not square, on exit, */ +/* > C( I ) contains the C-value of a Givens rotation related to */ +/* > the right null space of the I-th subproblem. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION array, dimension ( N ) if */ +/* > ICOMPQ = 1, and dimension 1 if ICOMPQ = 0. If ICOMPQ = 1 */ +/* > and the I-th subproblem is not square, on exit, S( I ) */ +/* > contains the S-value of a Givens rotation related to */ +/* > the right null space of the I-th subproblem. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension */ +/* > (6 * N + (SMLSIZ + 1)*(SMLSIZ + 1)). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension (7*N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: if INFO = 1, a singular value did not converge */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ming Gu and Huan Ren, Computer Science Division, University of */ +/* > California at Berkeley, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlasda_(integer *icompq, integer *smlsiz, integer *n, + integer *sqre, doublereal *d__, doublereal *e, doublereal *u, integer + *ldu, doublereal *vt, integer *k, doublereal *difl, doublereal *difr, + doublereal *z__, doublereal *poles, integer *givptr, integer *givcol, + integer *ldgcol, integer *perm, doublereal *givnum, doublereal *c__, + doublereal *s, doublereal *work, integer *iwork, integer *info) +{ + /* System generated locals */ + integer givcol_dim1, givcol_offset, perm_dim1, perm_offset, difl_dim1, + difl_offset, difr_dim1, difr_offset, givnum_dim1, givnum_offset, + poles_dim1, poles_offset, u_dim1, u_offset, vt_dim1, vt_offset, + z_dim1, z_offset, i__1, i__2; + + /* Builtin functions */ + integer pow_ii(integer *, integer *); + + /* Local variables */ + integer i__, j, m, i1, ic, lf, nd, ll, nl, vf, nr, vl, im1, ncc, nlf, nrf, + vfi, iwk, vli, lvl, nru, ndb1, nlp1, lvl2, nrp1; + doublereal beta; + integer idxq, nlvl; + doublereal alpha; + integer inode, ndiml, ndimr, idxqi, itemp; + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); + integer sqrei; + extern /* Subroutine */ int dlasd6_(integer *, integer *, integer *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *, integer *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, integer *, integer *); + integer nwork1, nwork2; + extern /* Subroutine */ int dlasdq_(char *, integer *, integer *, integer + *, integer *, integer *, doublereal *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, ftnlen), dlasdt_(integer *, integer *, + integer *, integer *, integer *, integer *, integer *), dlaset_( + char *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen), xerbla_(char *, integer *, + ftnlen); + integer smlszp; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --e; + givnum_dim1 = *ldu; + givnum_offset = 1 + givnum_dim1; + givnum -= givnum_offset; + poles_dim1 = *ldu; + poles_offset = 1 + poles_dim1; + poles -= poles_offset; + z_dim1 = *ldu; + z_offset = 1 + z_dim1; + z__ -= z_offset; + difr_dim1 = *ldu; + difr_offset = 1 + difr_dim1; + difr -= difr_offset; + difl_dim1 = *ldu; + difl_offset = 1 + difl_dim1; + difl -= difl_offset; + vt_dim1 = *ldu; + vt_offset = 1 + vt_dim1; + vt -= vt_offset; + u_dim1 = *ldu; + u_offset = 1 + u_dim1; + u -= u_offset; + --k; + --givptr; + perm_dim1 = *ldgcol; + perm_offset = 1 + perm_dim1; + perm -= perm_offset; + givcol_dim1 = *ldgcol; + givcol_offset = 1 + givcol_dim1; + givcol -= givcol_offset; + --c__; + --s; + --work; + --iwork; + + /* Function Body */ + *info = 0; + + if (*icompq < 0 || *icompq > 1) { + *info = -1; + } else if (*smlsiz < 3) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*sqre < 0 || *sqre > 1) { + *info = -4; + } else if (*ldu < *n + *sqre) { + *info = -8; + } else if (*ldgcol < *n) { + *info = -17; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLASDA", &i__1, (ftnlen)6); + return 0; + } + + m = *n + *sqre; + +/* If the input matrix is too small, call DLASDQ to find the SVD. */ + + if (*n <= *smlsiz) { + if (*icompq == 0) { + dlasdq_((char *)"U", sqre, n, &c__0, &c__0, &c__0, &d__[1], &e[1], &vt[ + vt_offset], ldu, &u[u_offset], ldu, &u[u_offset], ldu, & + work[1], info, (ftnlen)1); + } else { + dlasdq_((char *)"U", sqre, n, &m, n, &c__0, &d__[1], &e[1], &vt[vt_offset] + , ldu, &u[u_offset], ldu, &u[u_offset], ldu, &work[1], + info, (ftnlen)1); + } + return 0; + } + +/* Book-keeping and set up the computation tree. */ + + inode = 1; + ndiml = inode + *n; + ndimr = ndiml + *n; + idxq = ndimr + *n; + iwk = idxq + *n; + + ncc = 0; + nru = 0; + + smlszp = *smlsiz + 1; + vf = 1; + vl = vf + m; + nwork1 = vl + m; + nwork2 = nwork1 + smlszp * smlszp; + + dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], + smlsiz); + +/* for the nodes on bottom level of the tree, solve */ +/* their subproblems by DLASDQ. */ + + ndb1 = (nd + 1) / 2; + i__1 = nd; + for (i__ = ndb1; i__ <= i__1; ++i__) { + +/* IC : center row of each node */ +/* NL : number of rows of left subproblem */ +/* NR : number of rows of right subproblem */ +/* NLF: starting row of the left subproblem */ +/* NRF: starting row of the right subproblem */ + + i1 = i__ - 1; + ic = iwork[inode + i1]; + nl = iwork[ndiml + i1]; + nlp1 = nl + 1; + nr = iwork[ndimr + i1]; + nlf = ic - nl; + nrf = ic + 1; + idxqi = idxq + nlf - 2; + vfi = vf + nlf - 1; + vli = vl + nlf - 1; + sqrei = 1; + if (*icompq == 0) { + dlaset_((char *)"A", &nlp1, &nlp1, &c_b11, &c_b12, &work[nwork1], &smlszp, + (ftnlen)1); + dlasdq_((char *)"U", &sqrei, &nl, &nlp1, &nru, &ncc, &d__[nlf], &e[nlf], & + work[nwork1], &smlszp, &work[nwork2], &nl, &work[nwork2], + &nl, &work[nwork2], info, (ftnlen)1); + itemp = nwork1 + nl * smlszp; + dcopy_(&nlp1, &work[nwork1], &c__1, &work[vfi], &c__1); + dcopy_(&nlp1, &work[itemp], &c__1, &work[vli], &c__1); + } else { + dlaset_((char *)"A", &nl, &nl, &c_b11, &c_b12, &u[nlf + u_dim1], ldu, ( + ftnlen)1); + dlaset_((char *)"A", &nlp1, &nlp1, &c_b11, &c_b12, &vt[nlf + vt_dim1], + ldu, (ftnlen)1); + dlasdq_((char *)"U", &sqrei, &nl, &nlp1, &nl, &ncc, &d__[nlf], &e[nlf], & + vt[nlf + vt_dim1], ldu, &u[nlf + u_dim1], ldu, &u[nlf + + u_dim1], ldu, &work[nwork1], info, (ftnlen)1); + dcopy_(&nlp1, &vt[nlf + vt_dim1], &c__1, &work[vfi], &c__1); + dcopy_(&nlp1, &vt[nlf + nlp1 * vt_dim1], &c__1, &work[vli], &c__1) + ; + } + if (*info != 0) { + return 0; + } + i__2 = nl; + for (j = 1; j <= i__2; ++j) { + iwork[idxqi + j] = j; +/* L10: */ + } + if (i__ == nd && *sqre == 0) { + sqrei = 0; + } else { + sqrei = 1; + } + idxqi += nlp1; + vfi += nlp1; + vli += nlp1; + nrp1 = nr + sqrei; + if (*icompq == 0) { + dlaset_((char *)"A", &nrp1, &nrp1, &c_b11, &c_b12, &work[nwork1], &smlszp, + (ftnlen)1); + dlasdq_((char *)"U", &sqrei, &nr, &nrp1, &nru, &ncc, &d__[nrf], &e[nrf], & + work[nwork1], &smlszp, &work[nwork2], &nr, &work[nwork2], + &nr, &work[nwork2], info, (ftnlen)1); + itemp = nwork1 + (nrp1 - 1) * smlszp; + dcopy_(&nrp1, &work[nwork1], &c__1, &work[vfi], &c__1); + dcopy_(&nrp1, &work[itemp], &c__1, &work[vli], &c__1); + } else { + dlaset_((char *)"A", &nr, &nr, &c_b11, &c_b12, &u[nrf + u_dim1], ldu, ( + ftnlen)1); + dlaset_((char *)"A", &nrp1, &nrp1, &c_b11, &c_b12, &vt[nrf + vt_dim1], + ldu, (ftnlen)1); + dlasdq_((char *)"U", &sqrei, &nr, &nrp1, &nr, &ncc, &d__[nrf], &e[nrf], & + vt[nrf + vt_dim1], ldu, &u[nrf + u_dim1], ldu, &u[nrf + + u_dim1], ldu, &work[nwork1], info, (ftnlen)1); + dcopy_(&nrp1, &vt[nrf + vt_dim1], &c__1, &work[vfi], &c__1); + dcopy_(&nrp1, &vt[nrf + nrp1 * vt_dim1], &c__1, &work[vli], &c__1) + ; + } + if (*info != 0) { + return 0; + } + i__2 = nr; + for (j = 1; j <= i__2; ++j) { + iwork[idxqi + j] = j; +/* L20: */ + } +/* L30: */ + } + +/* Now conquer each subproblem bottom-up. */ + + j = pow_ii(&c__2, &nlvl); + for (lvl = nlvl; lvl >= 1; --lvl) { + lvl2 = (lvl << 1) - 1; + +/* Find the first node LF and last node LL on */ +/* the current level LVL. */ + + if (lvl == 1) { + lf = 1; + ll = 1; + } else { + i__1 = lvl - 1; + lf = pow_ii(&c__2, &i__1); + ll = (lf << 1) - 1; + } + i__1 = ll; + for (i__ = lf; i__ <= i__1; ++i__) { + im1 = i__ - 1; + ic = iwork[inode + im1]; + nl = iwork[ndiml + im1]; + nr = iwork[ndimr + im1]; + nlf = ic - nl; + nrf = ic + 1; + if (i__ == ll) { + sqrei = *sqre; + } else { + sqrei = 1; + } + vfi = vf + nlf - 1; + vli = vl + nlf - 1; + idxqi = idxq + nlf - 1; + alpha = d__[ic]; + beta = e[ic]; + if (*icompq == 0) { + dlasd6_(icompq, &nl, &nr, &sqrei, &d__[nlf], &work[vfi], & + work[vli], &alpha, &beta, &iwork[idxqi], &perm[ + perm_offset], &givptr[1], &givcol[givcol_offset], + ldgcol, &givnum[givnum_offset], ldu, &poles[ + poles_offset], &difl[difl_offset], &difr[difr_offset], + &z__[z_offset], &k[1], &c__[1], &s[1], &work[nwork1], + &iwork[iwk], info); + } else { + --j; + dlasd6_(icompq, &nl, &nr, &sqrei, &d__[nlf], &work[vfi], & + work[vli], &alpha, &beta, &iwork[idxqi], &perm[nlf + + lvl * perm_dim1], &givptr[j], &givcol[nlf + lvl2 * + givcol_dim1], ldgcol, &givnum[nlf + lvl2 * + givnum_dim1], ldu, &poles[nlf + lvl2 * poles_dim1], & + difl[nlf + lvl * difl_dim1], &difr[nlf + lvl2 * + difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[j], + &s[j], &work[nwork1], &iwork[iwk], info); + } + if (*info != 0) { + return 0; + } +/* L40: */ + } +/* L50: */ + } + + return 0; + +/* End of DLASDA */ + +} /* dlasda_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasdq.cpp b/lib/linalg/dlasdq.cpp new file mode 100644 index 0000000000..efb468cef4 --- /dev/null +++ b/lib/linalg/dlasdq.cpp @@ -0,0 +1,486 @@ +/* fortran/dlasdq.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DLASDQ computes the SVD of a real bidiagonal matrix with diagonal d and off-diagonal e. Used by + sbdsdc. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASDQ + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASDQ( UPLO, SQRE, N, NCVT, NRU, NCC, D, E, VT, LDVT, */ +/* U, LDU, C, LDC, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU, SQRE */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION C( LDC, * ), D( * ), E( * ), U( LDU, * ), */ +/* $ VT( LDVT, * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASDQ computes the singular value decomposition (SVD) of a real */ +/* > (upper or lower) bidiagonal matrix with diagonal D and offdiagonal */ +/* > E, accumulating the transformations if desired. Letting B denote */ +/* > the input bidiagonal matrix, the algorithm computes orthogonal */ +/* > matrices Q and P such that B = Q * S * P**T (P**T denotes the transpose */ +/* > of P). The singular values S are overwritten on D. */ +/* > */ +/* > The input matrix U is changed to U * Q if desired. */ +/* > The input matrix VT is changed to P**T * VT if desired. */ +/* > The input matrix C is changed to Q**T * C if desired. */ +/* > */ +/* > See "Computing Small Singular Values of Bidiagonal Matrices With */ +/* > Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan, */ +/* > LAPACK Working Note #3, for a detailed description of the algorithm. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the input bidiagonal matrix */ +/* > is upper or lower bidiagonal, and whether it is square are */ +/* > not. */ +/* > UPLO = 'U' or 'u' B is upper bidiagonal. */ +/* > UPLO = 'L' or 'l' B is lower bidiagonal. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] SQRE */ +/* > \verbatim */ +/* > SQRE is INTEGER */ +/* > = 0: then the input matrix is N-by-N. */ +/* > = 1: then the input matrix is N-by-(N+1) if UPLU = 'U' and */ +/* > (N+1)-by-N if UPLU = 'L'. */ +/* > */ +/* > The bidiagonal matrix has */ +/* > N = NL + NR + 1 rows and */ +/* > M = N + SQRE >= N columns. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the number of rows and columns */ +/* > in the matrix. N must be at least 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NCVT */ +/* > \verbatim */ +/* > NCVT is INTEGER */ +/* > On entry, NCVT specifies the number of columns of */ +/* > the matrix VT. NCVT must be at least 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NRU */ +/* > \verbatim */ +/* > NRU is INTEGER */ +/* > On entry, NRU specifies the number of rows of */ +/* > the matrix U. NRU must be at least 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NCC */ +/* > \verbatim */ +/* > NCC is INTEGER */ +/* > On entry, NCC specifies the number of columns of */ +/* > the matrix C. NCC must be at least 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, D contains the diagonal entries of the */ +/* > bidiagonal matrix whose SVD is desired. On normal exit, */ +/* > D contains the singular values in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array. */ +/* > dimension is (N-1) if SQRE = 0 and N if SQRE = 1. */ +/* > On entry, the entries of E contain the offdiagonal entries */ +/* > of the bidiagonal matrix whose SVD is desired. On normal */ +/* > exit, E will contain 0. If the algorithm does not converge, */ +/* > D and E will contain the diagonal and superdiagonal entries */ +/* > of a bidiagonal matrix orthogonally equivalent to the one */ +/* > given as input. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] VT */ +/* > \verbatim */ +/* > VT is DOUBLE PRECISION array, dimension (LDVT, NCVT) */ +/* > On entry, contains a matrix which on exit has been */ +/* > premultiplied by P**T, dimension N-by-NCVT if SQRE = 0 */ +/* > and (N+1)-by-NCVT if SQRE = 1 (not referenced if NCVT=0). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDVT */ +/* > \verbatim */ +/* > LDVT is INTEGER */ +/* > On entry, LDVT specifies the leading dimension of VT as */ +/* > declared in the calling (sub) program. LDVT must be at */ +/* > least 1. If NCVT is nonzero LDVT must also be at least N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] U */ +/* > \verbatim */ +/* > U is DOUBLE PRECISION array, dimension (LDU, N) */ +/* > On entry, contains a matrix which on exit has been */ +/* > postmultiplied by Q, dimension NRU-by-N if SQRE = 0 */ +/* > and NRU-by-(N+1) if SQRE = 1 (not referenced if NRU=0). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDU */ +/* > \verbatim */ +/* > LDU is INTEGER */ +/* > On entry, LDU specifies the leading dimension of U as */ +/* > declared in the calling (sub) program. LDU must be at */ +/* > least max( 1, NRU ) . */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension (LDC, NCC) */ +/* > On entry, contains an N-by-NCC matrix which on exit */ +/* > has been premultiplied by Q**T dimension N-by-NCC if SQRE = 0 */ +/* > and (N+1)-by-NCC if SQRE = 1 (not referenced if NCC=0). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > On entry, LDC specifies the leading dimension of C as */ +/* > declared in the calling (sub) program. LDC must be at */ +/* > least 1. If NCC is nonzero, LDC must also be at least N. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (4*N) */ +/* > Workspace. Only referenced if one of NCVT, NRU, or NCC is */ +/* > nonzero, and if N is at least 2. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > On exit, a value of 0 indicates a successful exit. */ +/* > If INFO < 0, argument number -INFO is illegal. */ +/* > If INFO > 0, the algorithm did not converge, and INFO */ +/* > specifies how many superdiagonals did not converge. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ming Gu and Huan Ren, Computer Science Division, University of */ +/* > California at Berkeley, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlasdq_(char *uplo, integer *sqre, integer *n, integer * + ncvt, integer *nru, integer *ncc, doublereal *d__, doublereal *e, + doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, + doublereal *c__, integer *ldc, doublereal *work, integer *info, + ftnlen uplo_len) +{ + /* System generated locals */ + integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, + i__2; + + /* Local variables */ + integer i__, j; + doublereal r__, cs, sn; + integer np1, isub; + doublereal smin; + integer sqre1; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dlasr_(char *, char *, char *, integer *, + integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen, ftnlen), dswap_(integer *, doublereal *, integer * + , doublereal *, integer *); + integer iuplo; + extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *), xerbla_(char *, + integer *, ftnlen), dbdsqr_(char *, integer *, integer *, integer + *, integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen); + logical rotate; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --e; + vt_dim1 = *ldvt; + vt_offset = 1 + vt_dim1; + vt -= vt_offset; + u_dim1 = *ldu; + u_offset = 1 + u_dim1; + u -= u_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + iuplo = 0; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + iuplo = 1; + } + if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + iuplo = 2; + } + if (iuplo == 0) { + *info = -1; + } else if (*sqre < 0 || *sqre > 1) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*ncvt < 0) { + *info = -4; + } else if (*nru < 0) { + *info = -5; + } else if (*ncc < 0) { + *info = -6; + } else if (*ncvt == 0 && *ldvt < 1 || *ncvt > 0 && *ldvt < max(1,*n)) { + *info = -10; + } else if (*ldu < max(1,*nru)) { + *info = -12; + } else if (*ncc == 0 && *ldc < 1 || *ncc > 0 && *ldc < max(1,*n)) { + *info = -14; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLASDQ", &i__1, (ftnlen)6); + return 0; + } + if (*n == 0) { + return 0; + } + +/* ROTATE is true if any singular vectors desired, false otherwise */ + + rotate = *ncvt > 0 || *nru > 0 || *ncc > 0; + np1 = *n + 1; + sqre1 = *sqre; + +/* If matrix non-square upper bidiagonal, rotate to be lower */ +/* bidiagonal. The rotations are on the right. */ + + if (iuplo == 1 && sqre1 == 1) { + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); + d__[i__] = r__; + e[i__] = sn * d__[i__ + 1]; + d__[i__ + 1] = cs * d__[i__ + 1]; + if (rotate) { + work[i__] = cs; + work[*n + i__] = sn; + } +/* L10: */ + } + dlartg_(&d__[*n], &e[*n], &cs, &sn, &r__); + d__[*n] = r__; + e[*n] = 0.; + if (rotate) { + work[*n] = cs; + work[*n + *n] = sn; + } + iuplo = 2; + sqre1 = 0; + +/* Update singular vectors if desired. */ + + if (*ncvt > 0) { + dlasr_((char *)"L", (char *)"V", (char *)"F", &np1, ncvt, &work[1], &work[np1], &vt[ + vt_offset], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + } + +/* If matrix lower bidiagonal, rotate to be upper bidiagonal */ +/* by applying Givens rotations on the left. */ + + if (iuplo == 2) { + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); + d__[i__] = r__; + e[i__] = sn * d__[i__ + 1]; + d__[i__ + 1] = cs * d__[i__ + 1]; + if (rotate) { + work[i__] = cs; + work[*n + i__] = sn; + } +/* L20: */ + } + +/* If matrix (N+1)-by-N lower bidiagonal, one additional */ +/* rotation is needed. */ + + if (sqre1 == 1) { + dlartg_(&d__[*n], &e[*n], &cs, &sn, &r__); + d__[*n] = r__; + if (rotate) { + work[*n] = cs; + work[*n + *n] = sn; + } + } + +/* Update singular vectors if desired. */ + + if (*nru > 0) { + if (sqre1 == 0) { + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, n, &work[1], &work[np1], &u[ + u_offset], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } else { + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &np1, &work[1], &work[np1], &u[ + u_offset], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + } + if (*ncc > 0) { + if (sqre1 == 0) { + dlasr_((char *)"L", (char *)"V", (char *)"F", n, ncc, &work[1], &work[np1], &c__[ + c_offset], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } else { + dlasr_((char *)"L", (char *)"V", (char *)"F", &np1, ncc, &work[1], &work[np1], &c__[ + c_offset], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + } + } + +/* Call DBDSQR to compute the SVD of the reduced real */ +/* N-by-N upper bidiagonal matrix. */ + + dbdsqr_((char *)"U", n, ncvt, nru, ncc, &d__[1], &e[1], &vt[vt_offset], ldvt, &u[ + u_offset], ldu, &c__[c_offset], ldc, &work[1], info, (ftnlen)1); + +/* Sort the singular values into ascending order (insertion sort on */ +/* singular values, but only one transposition per singular vector) */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Scan for smallest D(I). */ + + isub = i__; + smin = d__[i__]; + i__2 = *n; + for (j = i__ + 1; j <= i__2; ++j) { + if (d__[j] < smin) { + isub = j; + smin = d__[j]; + } +/* L30: */ + } + if (isub != i__) { + +/* Swap singular values and vectors. */ + + d__[isub] = d__[i__]; + d__[i__] = smin; + if (*ncvt > 0) { + dswap_(ncvt, &vt[isub + vt_dim1], ldvt, &vt[i__ + vt_dim1], + ldvt); + } + if (*nru > 0) { + dswap_(nru, &u[isub * u_dim1 + 1], &c__1, &u[i__ * u_dim1 + 1] + , &c__1); + } + if (*ncc > 0) { + dswap_(ncc, &c__[isub + c_dim1], ldc, &c__[i__ + c_dim1], ldc) + ; + } + } +/* L40: */ + } + + return 0; + +/* End of DLASDQ */ + +} /* dlasdq_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasdt.cpp b/lib/linalg/dlasdt.cpp new file mode 100644 index 0000000000..0e507af8f2 --- /dev/null +++ b/lib/linalg/dlasdt.cpp @@ -0,0 +1,209 @@ +/* fortran/dlasdt.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASDT creates a tree of subproblems for bidiagonal divide and conquer. Used by sbdsdc. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASDT + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASDT( N, LVL, ND, INODE, NDIML, NDIMR, MSUB ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER LVL, MSUB, N, ND */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER INODE( * ), NDIML( * ), NDIMR( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASDT creates a tree of subproblems for bidiagonal divide and */ +/* > conquer. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, the number of diagonal elements of the */ +/* > bidiagonal matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] LVL */ +/* > \verbatim */ +/* > LVL is INTEGER */ +/* > On exit, the number of levels on the computation tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] ND */ +/* > \verbatim */ +/* > ND is INTEGER */ +/* > On exit, the number of nodes on the tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INODE */ +/* > \verbatim */ +/* > INODE is INTEGER array, dimension ( N ) */ +/* > On exit, centers of subproblems. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] NDIML */ +/* > \verbatim */ +/* > NDIML is INTEGER array, dimension ( N ) */ +/* > On exit, row dimensions of left children. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] NDIMR */ +/* > \verbatim */ +/* > NDIMR is INTEGER array, dimension ( N ) */ +/* > On exit, row dimensions of right children. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] MSUB */ +/* > \verbatim */ +/* > MSUB is INTEGER */ +/* > On entry, the maximum row dimension each subproblem at the */ +/* > bottom of the tree can be of. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Ming Gu and Huan Ren, Computer Science Division, University of */ +/* > California at Berkeley, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlasdt_(integer *n, integer *lvl, integer *nd, integer * + inode, integer *ndiml, integer *ndimr, integer *msub) +{ + /* System generated locals */ + integer i__1, i__2; + + /* Builtin functions */ + double log(doublereal); + + /* Local variables */ + integer i__, il, ir, maxn; + doublereal temp; + integer nlvl, llst, ncrnt; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Find the number of levels on the tree. */ + + /* Parameter adjustments */ + --ndimr; + --ndiml; + --inode; + + /* Function Body */ + maxn = max(1,*n); + temp = log((doublereal) maxn / (doublereal) (*msub + 1)) / log(2.); + *lvl = (integer) temp + 1; + + i__ = *n / 2; + inode[1] = i__ + 1; + ndiml[1] = i__; + ndimr[1] = *n - i__ - 1; + il = 0; + ir = 1; + llst = 1; + i__1 = *lvl - 1; + for (nlvl = 1; nlvl <= i__1; ++nlvl) { + +/* Constructing the tree at (NLVL+1)-st level. The number of */ +/* nodes created on this level is LLST * 2. */ + + i__2 = llst - 1; + for (i__ = 0; i__ <= i__2; ++i__) { + il += 2; + ir += 2; + ncrnt = llst + i__; + ndiml[il] = ndiml[ncrnt] / 2; + ndimr[il] = ndiml[ncrnt] - ndiml[il] - 1; + inode[il] = inode[ncrnt] - ndimr[il] - 1; + ndiml[ir] = ndimr[ncrnt] / 2; + ndimr[ir] = ndimr[ncrnt] - ndiml[ir] - 1; + inode[ir] = inode[ncrnt] + ndiml[ir] + 1; +/* L10: */ + } + llst <<= 1; +/* L20: */ + } + *nd = (llst << 1) - 1; + + return 0; + +/* End of DLASDT */ + +} /* dlasdt_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaset.cpp b/lib/linalg/dlaset.cpp new file mode 100644 index 0000000000..072bbf1500 --- /dev/null +++ b/lib/linalg/dlaset.cpp @@ -0,0 +1,229 @@ +/* fortran/dlaset.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given val +ues. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASET + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASET( UPLO, M, N, ALPHA, BETA, A, LDA ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER LDA, M, N */ +/* DOUBLE PRECISION ALPHA, BETA */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASET initializes an m-by-n matrix A to BETA on the diagonal and */ +/* > ALPHA on the offdiagonals. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies the part of the matrix A to be set. */ +/* > = 'U': Upper triangular part is set; the strictly lower */ +/* > triangular part of A is not changed. */ +/* > = 'L': Lower triangular part is set; the strictly upper */ +/* > triangular part of A is not changed. */ +/* > Otherwise: All of the matrix A is set. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION */ +/* > The constant to which the offdiagonal elements are to be set. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is DOUBLE PRECISION */ +/* > The constant to which the diagonal elements are to be set. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On exit, the leading m-by-n submatrix of A is set as follows: */ +/* > */ +/* > if UPLO = 'U', A(i,j) = ALPHA, 1<=i<=j-1, 1<=j<=n, */ +/* > if UPLO = 'L', A(i,j) = ALPHA, j+1<=i<=m, 1<=j<=n, */ +/* > otherwise, A(i,j) = ALPHA, 1<=i<=m, 1<=j<=n, i.ne.j, */ +/* > */ +/* > and, for all UPLO, A(i,i) = BETA, 1<=i<=min(m,n). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int dlaset_(char *uplo, integer *m, integer *n, doublereal * + alpha, doublereal *beta, doublereal *a, integer *lda, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, j; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + +/* Set the strictly upper triangular or trapezoidal part of the */ +/* array to ALPHA. */ + + i__1 = *n; + for (j = 2; j <= i__1; ++j) { +/* Computing MIN */ + i__3 = j - 1; + i__2 = min(i__3,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = *alpha; +/* L10: */ + } +/* L20: */ + } + + } else if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Set the strictly lower triangular or trapezoidal part of the */ +/* array to ALPHA. */ + + i__1 = min(*m,*n); + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = j + 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = *alpha; +/* L30: */ + } +/* L40: */ + } + + } else { + +/* Set the leading m-by-n submatrix to ALPHA. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = *alpha; +/* L50: */ + } +/* L60: */ + } + } + +/* Set the first min(M,N) diagonal elements to BETA. */ + + i__1 = min(*m,*n); + for (i__ = 1; i__ <= i__1; ++i__) { + a[i__ + i__ * a_dim1] = *beta; +/* L70: */ + } + + return 0; + +/* End of DLASET */ + +} /* dlaset_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasq1.cpp b/lib/linalg/dlasq1.cpp new file mode 100644 index 0000000000..090f680525 --- /dev/null +++ b/lib/linalg/dlasq1.cpp @@ -0,0 +1,298 @@ +/* fortran/dlasq1.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c__2 = 2; +static integer c__0 = 0; + +/* > \brief \b DLASQ1 computes the singular values of a real square bidiagonal matrix. Used by sbdsqr. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASQ1 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASQ1( N, D, E, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( * ), E( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASQ1 computes the singular values of a real N-by-N bidiagonal */ +/* > matrix with diagonal D and off-diagonal E. The singular values */ +/* > are computed to high relative accuracy, in the absence of */ +/* > denormalization, underflow and overflow. The algorithm was first */ +/* > presented in */ +/* > */ +/* > (char *)"Accurate singular values and differential qd algorithms" by K. V. */ +/* > Fernando and B. N. Parlett, Numer. Math., Vol-67, No. 2, pp. 191-230, */ +/* > 1994, */ +/* > */ +/* > and the present implementation is described in "An implementation of */ +/* > the dqds Algorithm (Positive Case)", LAPACK Working Note. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of rows and columns in the matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, D contains the diagonal elements of the */ +/* > bidiagonal matrix whose SVD is desired. On normal exit, */ +/* > D contains the singular values in decreasing order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, elements E(1:N-1) contain the off-diagonal elements */ +/* > of the bidiagonal matrix whose SVD is desired. */ +/* > On exit, E is overwritten. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (4*N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: the algorithm failed */ +/* > = 1, a split was marked by a positive value in E */ +/* > = 2, current block of Z not diagonalized after 100*N */ +/* > iterations (in inner while loop) On exit D and E */ +/* > represent a matrix with the same singular values */ +/* > which the calling subroutine could use to finish the */ +/* > computation, or even feed back into DLASQ1 */ +/* > = 3, termination criterion of outer while loop not met */ +/* > (program created more than N unreduced blocks) */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dlasq1_(integer *n, doublereal *d__, doublereal *e, + doublereal *work, integer *info) +{ + /* System generated locals */ + integer i__1, i__2; + doublereal d__1, d__2, d__3; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + integer i__; + doublereal eps; + extern /* Subroutine */ int dlas2_(doublereal *, doublereal *, doublereal + *, doublereal *, doublereal *); + doublereal scale; + integer iinfo; + doublereal sigmn; + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); + doublereal sigmx; + extern /* Subroutine */ int dlasq2_(integer *, doublereal *, integer *); + extern doublereal dlamch_(char *, ftnlen); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen); + doublereal safmin; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dlasrt_( + char *, integer *, doublereal *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --work; + --e; + --d__; + + /* Function Body */ + *info = 0; + if (*n < 0) { + *info = -1; + i__1 = -(*info); + xerbla_((char *)"DLASQ1", &i__1, (ftnlen)6); + return 0; + } else if (*n == 0) { + return 0; + } else if (*n == 1) { + d__[1] = abs(d__[1]); + return 0; + } else if (*n == 2) { + dlas2_(&d__[1], &e[1], &d__[2], &sigmn, &sigmx); + d__[1] = sigmx; + d__[2] = sigmn; + return 0; + } + +/* Estimate the largest singular value. */ + + sigmx = 0.; + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + d__[i__] = (d__1 = d__[i__], abs(d__1)); +/* Computing MAX */ + d__2 = sigmx, d__3 = (d__1 = e[i__], abs(d__1)); + sigmx = max(d__2,d__3); +/* L10: */ + } + d__[*n] = (d__1 = d__[*n], abs(d__1)); + +/* Early return if SIGMX is zero (matrix is already diagonal). */ + + if (sigmx == 0.) { + dlasrt_((char *)"D", n, &d__[1], &iinfo, (ftnlen)1); + return 0; + } + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { +/* Computing MAX */ + d__1 = sigmx, d__2 = d__[i__]; + sigmx = max(d__1,d__2); +/* L20: */ + } + +/* Copy D and E into WORK (in the Z format) and scale (squaring the */ +/* input data makes scaling by a power of the radix pointless). */ + + eps = dlamch_((char *)"Precision", (ftnlen)9); + safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); + scale = sqrt(eps / safmin); + dcopy_(n, &d__[1], &c__1, &work[1], &c__2); + i__1 = *n - 1; + dcopy_(&i__1, &e[1], &c__1, &work[2], &c__2); + i__1 = (*n << 1) - 1; + i__2 = (*n << 1) - 1; + dlascl_((char *)"G", &c__0, &c__0, &sigmx, &scale, &i__1, &c__1, &work[1], &i__2, + &iinfo, (ftnlen)1); + +/* Compute the q's and e's. */ + + i__1 = (*n << 1) - 1; + for (i__ = 1; i__ <= i__1; ++i__) { +/* Computing 2nd power */ + d__1 = work[i__]; + work[i__] = d__1 * d__1; +/* L30: */ + } + work[*n * 2] = 0.; + + dlasq2_(n, &work[1], info); + + if (*info == 0) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + d__[i__] = sqrt(work[i__]); +/* L40: */ + } + dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &d__[1], n, & + iinfo, (ftnlen)1); + } else if (*info == 2) { + +/* Maximum number of iterations exceeded. Move data from WORK */ +/* into D and E so the calling subroutine can try to finish */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + d__[i__] = sqrt(work[(i__ << 1) - 1]); + e[i__] = sqrt(work[i__ * 2]); + } + dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &d__[1], n, & + iinfo, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &e[1], n, &iinfo, + (ftnlen)1); + } + + return 0; + +/* End of DLASQ1 */ + +} /* dlasq1_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasq2.cpp b/lib/linalg/dlasq2.cpp new file mode 100644 index 0000000000..a6362ecfdf --- /dev/null +++ b/lib/linalg/dlasq2.cpp @@ -0,0 +1,716 @@ +/* fortran/dlasq2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c__2 = 2; +static integer c__10 = 10; +static integer c__3 = 3; +static integer c__4 = 4; + +/* > \brief \b DLASQ2 computes all the eigenvalues of the symmetric positive definite tridiagonal matrix assoc +iated with the qd Array Z to high relative accuracy. Used by sbdsqr and sstegr. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASQ2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASQ2( N, Z, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION Z( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASQ2 computes all the eigenvalues of the symmetric positive */ +/* > definite tridiagonal matrix associated with the qd array Z to high */ +/* > relative accuracy are computed to high relative accuracy, in the */ +/* > absence of denormalization, underflow and overflow. */ +/* > */ +/* > To see the relation of Z to the tridiagonal matrix, let L be a */ +/* > unit lower bidiagonal matrix with subdiagonals Z(2,4,6,,..) and */ +/* > let U be an upper bidiagonal matrix with 1's above and diagonal */ +/* > Z(1,3,5,,..). The tridiagonal is L*U or, if you prefer, the */ +/* > symmetric tridiagonal to which it is similar. */ +/* > */ +/* > Note : DLASQ2 defines a logical variable, IEEE, which is true */ +/* > on machines which follow ieee-754 floating-point standard in their */ +/* > handling of infinities and NaNs, and false otherwise. This variable */ +/* > is passed to DLASQ3. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of rows and columns in the matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension ( 4*N ) */ +/* > On entry Z holds the qd array. On exit, entries 1 to N hold */ +/* > the eigenvalues in decreasing order, Z( 2*N+1 ) holds the */ +/* > trace, and Z( 2*N+2 ) holds the sum of the eigenvalues. If */ +/* > N > 2, then Z( 2*N+3 ) holds the iteration count, Z( 2*N+4 ) */ +/* > holds NDIVS/NIN^2, and Z( 2*N+5 ) holds the percentage of */ +/* > shifts that failed. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if the i-th argument is a scalar and had an illegal */ +/* > value, then INFO = -i, if the i-th argument is an */ +/* > array and the j-entry had an illegal value, then */ +/* > INFO = -(i*100+j) */ +/* > > 0: the algorithm failed */ +/* > = 1, a split was marked by a positive value in E */ +/* > = 2, current block of Z not diagonalized after 100*N */ +/* > iterations (in inner while loop). On exit Z holds */ +/* > a qd array with the same eigenvalues as the given Z. */ +/* > = 3, termination criterion of outer while loop not met */ +/* > (program created more than N unreduced blocks) */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Local Variables: I0:N0 defines a current unreduced segment of Z. */ +/* > The shifts are accumulated in SIGMA. Iteration count is in ITER. */ +/* > Ping-pong is controlled by PP (alternates between 0 and 1). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlasq2_(integer *n, doublereal *z__, integer *info) +{ + /* System generated locals */ + integer i__1, i__2, i__3; + doublereal d__1, d__2; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal d__, e, g; + integer k; + doublereal s, t; + integer i0, i1, i4, n0, n1; + doublereal dn; + integer pp; + doublereal dn1, dn2, dee, eps, tau, tol; + integer ipn4; + doublereal tol2; + logical ieee; + integer nbig; + doublereal dmin__, emin, emax; + integer kmin, ndiv, iter; + doublereal qmin, temp, qmax, zmax; + integer splt; + doublereal dmin1, dmin2; + integer nfail; + doublereal desig, trace, sigma; + integer iinfo; + doublereal tempe, tempq; + integer ttype; + extern /* Subroutine */ int dlasq3_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + integer *, integer *, integer *, logical *, integer *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); + extern doublereal dlamch_(char *, ftnlen); + doublereal deemin; + integer iwhila, iwhilb; + doublereal oldemn, safmin; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, + integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments. */ +/* (in case DLASQ2 is not called by DLASQ1) */ + + /* Parameter adjustments */ + --z__; + + /* Function Body */ + *info = 0; + eps = dlamch_((char *)"Precision", (ftnlen)9); + safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); + tol = eps * 100.; +/* Computing 2nd power */ + d__1 = tol; + tol2 = d__1 * d__1; + + if (*n < 0) { + *info = -1; + xerbla_((char *)"DLASQ2", &c__1, (ftnlen)6); + return 0; + } else if (*n == 0) { + return 0; + } else if (*n == 1) { + +/* 1-by-1 case. */ + + if (z__[1] < 0.) { + *info = -201; + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + } + return 0; + } else if (*n == 2) { + +/* 2-by-2 case. */ + + if (z__[1] < 0.) { + *info = -201; + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + return 0; + } else if (z__[2] < 0.) { + *info = -202; + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + return 0; + } else if (z__[3] < 0.) { + *info = -203; + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + return 0; + } else if (z__[3] > z__[1]) { + d__ = z__[3]; + z__[3] = z__[1]; + z__[1] = d__; + } + z__[5] = z__[1] + z__[2] + z__[3]; + if (z__[2] > z__[3] * tol2) { + t = (z__[1] - z__[3] + z__[2]) * .5; + s = z__[3] * (z__[2] / t); + if (s <= t) { + s = z__[3] * (z__[2] / (t * (sqrt(s / t + 1.) + 1.))); + } else { + s = z__[3] * (z__[2] / (t + sqrt(t) * sqrt(t + s))); + } + t = z__[1] + (s + z__[2]); + z__[3] *= z__[1] / t; + z__[1] = t; + } + z__[2] = z__[3]; + z__[6] = z__[2] + z__[1]; + return 0; + } + +/* Check for negative data and compute sums of q's and e's. */ + + z__[*n * 2] = 0.; + emin = z__[2]; + qmax = 0.; + zmax = 0.; + d__ = 0.; + e = 0.; + + i__1 = *n - 1 << 1; + for (k = 1; k <= i__1; k += 2) { + if (z__[k] < 0.) { + *info = -(k + 200); + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + return 0; + } else if (z__[k + 1] < 0.) { + *info = -(k + 201); + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + return 0; + } + d__ += z__[k]; + e += z__[k + 1]; +/* Computing MAX */ + d__1 = qmax, d__2 = z__[k]; + qmax = max(d__1,d__2); +/* Computing MIN */ + d__1 = emin, d__2 = z__[k + 1]; + emin = min(d__1,d__2); +/* Computing MAX */ + d__1 = max(qmax,zmax), d__2 = z__[k + 1]; + zmax = max(d__1,d__2); +/* L10: */ + } + if (z__[(*n << 1) - 1] < 0.) { + *info = -((*n << 1) + 199); + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + return 0; + } + d__ += z__[(*n << 1) - 1]; +/* Computing MAX */ + d__1 = qmax, d__2 = z__[(*n << 1) - 1]; + qmax = max(d__1,d__2); + zmax = max(qmax,zmax); + +/* Check for diagonality. */ + + if (e == 0.) { + i__1 = *n; + for (k = 2; k <= i__1; ++k) { + z__[k] = z__[(k << 1) - 1]; +/* L20: */ + } + dlasrt_((char *)"D", n, &z__[1], &iinfo, (ftnlen)1); + z__[(*n << 1) - 1] = d__; + return 0; + } + + trace = d__ + e; + +/* Check for zero data. */ + + if (trace == 0.) { + z__[(*n << 1) - 1] = 0.; + return 0; + } + +/* Check whether the machine is IEEE conformable. */ + + ieee = ilaenv_(&c__10, (char *)"DLASQ2", (char *)"N", &c__1, &c__2, &c__3, &c__4, (ftnlen) + 6, (ftnlen)1) == 1; + +/* Rearrange data for locality: Z=(q1,qq1,e1,ee1,q2,qq2,e2,ee2,...). */ + + for (k = *n << 1; k >= 2; k += -2) { + z__[k * 2] = 0.; + z__[(k << 1) - 1] = z__[k]; + z__[(k << 1) - 2] = 0.; + z__[(k << 1) - 3] = z__[k - 1]; +/* L30: */ + } + + i0 = 1; + n0 = *n; + +/* Reverse the qd-array, if warranted. */ + + if (z__[(i0 << 2) - 3] * 1.5 < z__[(n0 << 2) - 3]) { + ipn4 = i0 + n0 << 2; + i__1 = i0 + n0 - 1 << 1; + for (i4 = i0 << 2; i4 <= i__1; i4 += 4) { + temp = z__[i4 - 3]; + z__[i4 - 3] = z__[ipn4 - i4 - 3]; + z__[ipn4 - i4 - 3] = temp; + temp = z__[i4 - 1]; + z__[i4 - 1] = z__[ipn4 - i4 - 5]; + z__[ipn4 - i4 - 5] = temp; +/* L40: */ + } + } + +/* Initial split checking via dqd and Li's test. */ + + pp = 0; + + for (k = 1; k <= 2; ++k) { + + d__ = z__[(n0 << 2) + pp - 3]; + i__1 = (i0 << 2) + pp; + for (i4 = (n0 - 1 << 2) + pp; i4 >= i__1; i4 += -4) { + if (z__[i4 - 1] <= tol2 * d__) { + z__[i4 - 1] = -0.; + d__ = z__[i4 - 3]; + } else { + d__ = z__[i4 - 3] * (d__ / (d__ + z__[i4 - 1])); + } +/* L50: */ + } + +/* dqd maps Z to ZZ plus Li's test. */ + + emin = z__[(i0 << 2) + pp + 1]; + d__ = z__[(i0 << 2) + pp - 3]; + i__1 = (n0 - 1 << 2) + pp; + for (i4 = (i0 << 2) + pp; i4 <= i__1; i4 += 4) { + z__[i4 - (pp << 1) - 2] = d__ + z__[i4 - 1]; + if (z__[i4 - 1] <= tol2 * d__) { + z__[i4 - 1] = -0.; + z__[i4 - (pp << 1) - 2] = d__; + z__[i4 - (pp << 1)] = 0.; + d__ = z__[i4 + 1]; + } else if (safmin * z__[i4 + 1] < z__[i4 - (pp << 1) - 2] && + safmin * z__[i4 - (pp << 1) - 2] < z__[i4 + 1]) { + temp = z__[i4 + 1] / z__[i4 - (pp << 1) - 2]; + z__[i4 - (pp << 1)] = z__[i4 - 1] * temp; + d__ *= temp; + } else { + z__[i4 - (pp << 1)] = z__[i4 + 1] * (z__[i4 - 1] / z__[i4 - ( + pp << 1) - 2]); + d__ = z__[i4 + 1] * (d__ / z__[i4 - (pp << 1) - 2]); + } +/* Computing MIN */ + d__1 = emin, d__2 = z__[i4 - (pp << 1)]; + emin = min(d__1,d__2); +/* L60: */ + } + z__[(n0 << 2) - pp - 2] = d__; + +/* Now find qmax. */ + + qmax = z__[(i0 << 2) - pp - 2]; + i__1 = (n0 << 2) - pp - 2; + for (i4 = (i0 << 2) - pp + 2; i4 <= i__1; i4 += 4) { +/* Computing MAX */ + d__1 = qmax, d__2 = z__[i4]; + qmax = max(d__1,d__2); +/* L70: */ + } + +/* Prepare for the next iteration on K. */ + + pp = 1 - pp; +/* L80: */ + } + +/* Initialise variables to pass to DLASQ3. */ + + ttype = 0; + dmin1 = 0.; + dmin2 = 0.; + dn = 0.; + dn1 = 0.; + dn2 = 0.; + g = 0.; + tau = 0.; + + iter = 2; + nfail = 0; + ndiv = n0 - i0 << 1; + + i__1 = *n + 1; + for (iwhila = 1; iwhila <= i__1; ++iwhila) { + if (n0 < 1) { + goto L170; + } + +/* While array unfinished do */ + +/* E(N0) holds the value of SIGMA when submatrix in I0:N0 */ +/* splits from the rest of the array, but is negated. */ + + desig = 0.; + if (n0 == *n) { + sigma = 0.; + } else { + sigma = -z__[(n0 << 2) - 1]; + } + if (sigma < 0.) { + *info = 1; + return 0; + } + +/* Find last unreduced submatrix's top index I0, find QMAX and */ +/* EMIN. Find Gershgorin-type bound if Q's much greater than E's. */ + + emax = 0.; + if (n0 > i0) { + emin = (d__1 = z__[(n0 << 2) - 5], abs(d__1)); + } else { + emin = 0.; + } + qmin = z__[(n0 << 2) - 3]; + qmax = qmin; + for (i4 = n0 << 2; i4 >= 8; i4 += -4) { + if (z__[i4 - 5] <= 0.) { + goto L100; + } + if (qmin >= emax * 4.) { +/* Computing MIN */ + d__1 = qmin, d__2 = z__[i4 - 3]; + qmin = min(d__1,d__2); +/* Computing MAX */ + d__1 = emax, d__2 = z__[i4 - 5]; + emax = max(d__1,d__2); + } +/* Computing MAX */ + d__1 = qmax, d__2 = z__[i4 - 7] + z__[i4 - 5]; + qmax = max(d__1,d__2); +/* Computing MIN */ + d__1 = emin, d__2 = z__[i4 - 5]; + emin = min(d__1,d__2); +/* L90: */ + } + i4 = 4; + +L100: + i0 = i4 / 4; + pp = 0; + + if (n0 - i0 > 1) { + dee = z__[(i0 << 2) - 3]; + deemin = dee; + kmin = i0; + i__2 = (n0 << 2) - 3; + for (i4 = (i0 << 2) + 1; i4 <= i__2; i4 += 4) { + dee = z__[i4] * (dee / (dee + z__[i4 - 2])); + if (dee <= deemin) { + deemin = dee; + kmin = (i4 + 3) / 4; + } +/* L110: */ + } + if (kmin - i0 << 1 < n0 - kmin && deemin <= z__[(n0 << 2) - 3] * + .5) { + ipn4 = i0 + n0 << 2; + pp = 2; + i__2 = i0 + n0 - 1 << 1; + for (i4 = i0 << 2; i4 <= i__2; i4 += 4) { + temp = z__[i4 - 3]; + z__[i4 - 3] = z__[ipn4 - i4 - 3]; + z__[ipn4 - i4 - 3] = temp; + temp = z__[i4 - 2]; + z__[i4 - 2] = z__[ipn4 - i4 - 2]; + z__[ipn4 - i4 - 2] = temp; + temp = z__[i4 - 1]; + z__[i4 - 1] = z__[ipn4 - i4 - 5]; + z__[ipn4 - i4 - 5] = temp; + temp = z__[i4]; + z__[i4] = z__[ipn4 - i4 - 4]; + z__[ipn4 - i4 - 4] = temp; +/* L120: */ + } + } + } + +/* Put -(initial shift) into DMIN. */ + +/* Computing MAX */ + d__1 = 0., d__2 = qmin - sqrt(qmin) * 2. * sqrt(emax); + dmin__ = -max(d__1,d__2); + +/* Now I0:N0 is unreduced. */ +/* PP = 0 for ping, PP = 1 for pong. */ +/* PP = 2 indicates that flipping was applied to the Z array and */ +/* and that the tests for deflation upon entry in DLASQ3 */ +/* should not be performed. */ + + nbig = (n0 - i0 + 1) * 100; + i__2 = nbig; + for (iwhilb = 1; iwhilb <= i__2; ++iwhilb) { + if (i0 > n0) { + goto L150; + } + +/* While submatrix unfinished take a good dqds step. */ + + dlasq3_(&i0, &n0, &z__[1], &pp, &dmin__, &sigma, &desig, &qmax, & + nfail, &iter, &ndiv, &ieee, &ttype, &dmin1, &dmin2, &dn, & + dn1, &dn2, &g, &tau); + + pp = 1 - pp; + +/* When EMIN is very small check for splits. */ + + if (pp == 0 && n0 - i0 >= 3) { + if (z__[n0 * 4] <= tol2 * qmax || z__[(n0 << 2) - 1] <= tol2 * + sigma) { + splt = i0 - 1; + qmax = z__[(i0 << 2) - 3]; + emin = z__[(i0 << 2) - 1]; + oldemn = z__[i0 * 4]; + i__3 = n0 - 3 << 2; + for (i4 = i0 << 2; i4 <= i__3; i4 += 4) { + if (z__[i4] <= tol2 * z__[i4 - 3] || z__[i4 - 1] <= + tol2 * sigma) { + z__[i4 - 1] = -sigma; + splt = i4 / 4; + qmax = 0.; + emin = z__[i4 + 3]; + oldemn = z__[i4 + 4]; + } else { +/* Computing MAX */ + d__1 = qmax, d__2 = z__[i4 + 1]; + qmax = max(d__1,d__2); +/* Computing MIN */ + d__1 = emin, d__2 = z__[i4 - 1]; + emin = min(d__1,d__2); +/* Computing MIN */ + d__1 = oldemn, d__2 = z__[i4]; + oldemn = min(d__1,d__2); + } +/* L130: */ + } + z__[(n0 << 2) - 1] = emin; + z__[n0 * 4] = oldemn; + i0 = splt + 1; + } + } + +/* L140: */ + } + + *info = 2; + +/* Maximum number of iterations exceeded, restore the shift */ +/* SIGMA and place the new d's and e's in a qd array. */ +/* This might need to be done for several blocks */ + + i1 = i0; + n1 = n0; +L145: + tempq = z__[(i0 << 2) - 3]; + z__[(i0 << 2) - 3] += sigma; + i__2 = n0; + for (k = i0 + 1; k <= i__2; ++k) { + tempe = z__[(k << 2) - 5]; + z__[(k << 2) - 5] *= tempq / z__[(k << 2) - 7]; + tempq = z__[(k << 2) - 3]; + z__[(k << 2) - 3] = z__[(k << 2) - 3] + sigma + tempe - z__[(k << + 2) - 5]; + } + +/* Prepare to do this on the previous block if there is one */ + + if (i1 > 1) { + n1 = i1 - 1; + while(i1 >= 2 && z__[(i1 << 2) - 5] >= 0.) { + --i1; + } + sigma = -z__[(n1 << 2) - 1]; + goto L145; + } + i__2 = *n; + for (k = 1; k <= i__2; ++k) { + z__[(k << 1) - 1] = z__[(k << 2) - 3]; + +/* Only the block 1..N0 is unfinished. The rest of the e's */ +/* must be essentially zero, although sometimes other data */ +/* has been stored in them. */ + + if (k < n0) { + z__[k * 2] = z__[(k << 2) - 1]; + } else { + z__[k * 2] = 0.; + } + } + return 0; + +/* end IWHILB */ + +L150: + +/* L160: */ + ; + } + + *info = 3; + return 0; + +/* end IWHILA */ + +L170: + +/* Move q's to the front. */ + + i__1 = *n; + for (k = 2; k <= i__1; ++k) { + z__[k] = z__[(k << 2) - 3]; +/* L180: */ + } + +/* Sort and compute sum of eigenvalues. */ + + dlasrt_((char *)"D", n, &z__[1], &iinfo, (ftnlen)1); + + e = 0.; + for (k = *n; k >= 1; --k) { + e += z__[k]; +/* L190: */ + } + +/* Store trace, sum(eigenvalues) and information on performance. */ + + z__[(*n << 1) + 1] = trace; + z__[(*n << 1) + 2] = e; + z__[(*n << 1) + 3] = (doublereal) iter; +/* Computing 2nd power */ + i__1 = *n; + z__[(*n << 1) + 4] = (doublereal) ndiv / (doublereal) (i__1 * i__1); + z__[(*n << 1) + 5] = nfail * 100. / (doublereal) iter; + return 0; + +/* End of DLASQ2 */ + +} /* dlasq2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasq3.cpp b/lib/linalg/dlasq3.cpp new file mode 100644 index 0000000000..e5974545a6 --- /dev/null +++ b/lib/linalg/dlasq3.cpp @@ -0,0 +1,475 @@ +/* fortran/dlasq3.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASQ3 checks for deflation, computes a shift and calls dqds. Used by sbdsqr. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASQ3 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASQ3( I0, N0, Z, PP, DMIN, SIGMA, DESIG, QMAX, NFAIL, */ +/* ITER, NDIV, IEEE, TTYPE, DMIN1, DMIN2, DN, DN1, */ +/* DN2, G, TAU ) */ + +/* .. Scalar Arguments .. */ +/* LOGICAL IEEE */ +/* INTEGER I0, ITER, N0, NDIV, NFAIL, PP */ +/* DOUBLE PRECISION DESIG, DMIN, DMIN1, DMIN2, DN, DN1, DN2, G, */ +/* $ QMAX, SIGMA, TAU */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION Z( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASQ3 checks for deflation, computes a shift (TAU) and calls dqds. */ +/* > In case of failure it changes shifts, and tries again until output */ +/* > is positive. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] I0 */ +/* > \verbatim */ +/* > I0 is INTEGER */ +/* > First index. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] N0 */ +/* > \verbatim */ +/* > N0 is INTEGER */ +/* > Last index. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension ( 4*N0 ) */ +/* > Z holds the qd array. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] PP */ +/* > \verbatim */ +/* > PP is INTEGER */ +/* > PP=0 for ping, PP=1 for pong. */ +/* > PP=2 indicates that flipping was applied to the Z array */ +/* > and that the initial tests for deflation should not be */ +/* > performed. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DMIN */ +/* > \verbatim */ +/* > DMIN is DOUBLE PRECISION */ +/* > Minimum value of d. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] SIGMA */ +/* > \verbatim */ +/* > SIGMA is DOUBLE PRECISION */ +/* > Sum of shifts used in current segment. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DESIG */ +/* > \verbatim */ +/* > DESIG is DOUBLE PRECISION */ +/* > Lower order part of SIGMA */ +/* > \endverbatim */ +/* > */ +/* > \param[in] QMAX */ +/* > \verbatim */ +/* > QMAX is DOUBLE PRECISION */ +/* > Maximum value of q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] NFAIL */ +/* > \verbatim */ +/* > NFAIL is INTEGER */ +/* > Increment NFAIL by 1 each time the shift was too big. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] ITER */ +/* > \verbatim */ +/* > ITER is INTEGER */ +/* > Increment ITER by 1 for each iteration. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] NDIV */ +/* > \verbatim */ +/* > NDIV is INTEGER */ +/* > Increment NDIV by 1 for each division. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] IEEE */ +/* > \verbatim */ +/* > IEEE is LOGICAL */ +/* > Flag for IEEE or non IEEE arithmetic (passed to DLASQ5). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] TTYPE */ +/* > \verbatim */ +/* > TTYPE is INTEGER */ +/* > Shift type. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DMIN1 */ +/* > \verbatim */ +/* > DMIN1 is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DMIN2 */ +/* > \verbatim */ +/* > DMIN2 is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DN */ +/* > \verbatim */ +/* > DN is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DN1 */ +/* > \verbatim */ +/* > DN1 is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DN2 */ +/* > \verbatim */ +/* > DN2 is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] G */ +/* > \verbatim */ +/* > G is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION */ +/* > */ +/* > These are passed as arguments in order to save their values */ +/* > between calls to DLASQ3. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dlasq3_(integer *i0, integer *n0, doublereal *z__, + integer *pp, doublereal *dmin__, doublereal *sigma, doublereal *desig, + doublereal *qmax, integer *nfail, integer *iter, integer *ndiv, + logical *ieee, integer *ttype, doublereal *dmin1, doublereal *dmin2, + doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *g, + doublereal *tau) +{ + /* System generated locals */ + integer i__1; + doublereal d__1, d__2; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal s, t; + integer j4, nn; + doublereal eps, tol; + integer n0in, ipn4; + doublereal tol2, temp; + extern /* Subroutine */ int dlasq4_(integer *, integer *, doublereal *, + integer *, integer *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *), dlasq5_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, logical * + , doublereal *), dlasq6_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *); + extern doublereal dlamch_(char *, ftnlen); + extern logical disnan_(doublereal *); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Function .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --z__; + + /* Function Body */ + n0in = *n0; + eps = dlamch_((char *)"Precision", (ftnlen)9); + tol = eps * 100.; +/* Computing 2nd power */ + d__1 = tol; + tol2 = d__1 * d__1; + +/* Check for deflation. */ + +L10: + + if (*n0 < *i0) { + return 0; + } + if (*n0 == *i0) { + goto L20; + } + nn = (*n0 << 2) + *pp; + if (*n0 == *i0 + 1) { + goto L40; + } + +/* Check whether E(N0-1) is negligible, 1 eigenvalue. */ + + if (z__[nn - 5] > tol2 * (*sigma + z__[nn - 3]) && z__[nn - (*pp << 1) - + 4] > tol2 * z__[nn - 7]) { + goto L30; + } + +L20: + + z__[(*n0 << 2) - 3] = z__[(*n0 << 2) + *pp - 3] + *sigma; + --(*n0); + goto L10; + +/* Check whether E(N0-2) is negligible, 2 eigenvalues. */ + +L30: + + if (z__[nn - 9] > tol2 * *sigma && z__[nn - (*pp << 1) - 8] > tol2 * z__[ + nn - 11]) { + goto L50; + } + +L40: + + if (z__[nn - 3] > z__[nn - 7]) { + s = z__[nn - 3]; + z__[nn - 3] = z__[nn - 7]; + z__[nn - 7] = s; + } + t = (z__[nn - 7] - z__[nn - 3] + z__[nn - 5]) * .5; + if (z__[nn - 5] > z__[nn - 3] * tol2 && t != 0.) { + s = z__[nn - 3] * (z__[nn - 5] / t); + if (s <= t) { + s = z__[nn - 3] * (z__[nn - 5] / (t * (sqrt(s / t + 1.) + 1.))); + } else { + s = z__[nn - 3] * (z__[nn - 5] / (t + sqrt(t) * sqrt(t + s))); + } + t = z__[nn - 7] + (s + z__[nn - 5]); + z__[nn - 3] *= z__[nn - 7] / t; + z__[nn - 7] = t; + } + z__[(*n0 << 2) - 7] = z__[nn - 7] + *sigma; + z__[(*n0 << 2) - 3] = z__[nn - 3] + *sigma; + *n0 += -2; + goto L10; + +L50: + if (*pp == 2) { + *pp = 0; + } + +/* Reverse the qd-array, if warranted. */ + + if (*dmin__ <= 0. || *n0 < n0in) { + if (z__[(*i0 << 2) + *pp - 3] * 1.5 < z__[(*n0 << 2) + *pp - 3]) { + ipn4 = *i0 + *n0 << 2; + i__1 = *i0 + *n0 - 1 << 1; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + temp = z__[j4 - 3]; + z__[j4 - 3] = z__[ipn4 - j4 - 3]; + z__[ipn4 - j4 - 3] = temp; + temp = z__[j4 - 2]; + z__[j4 - 2] = z__[ipn4 - j4 - 2]; + z__[ipn4 - j4 - 2] = temp; + temp = z__[j4 - 1]; + z__[j4 - 1] = z__[ipn4 - j4 - 5]; + z__[ipn4 - j4 - 5] = temp; + temp = z__[j4]; + z__[j4] = z__[ipn4 - j4 - 4]; + z__[ipn4 - j4 - 4] = temp; +/* L60: */ + } + if (*n0 - *i0 <= 4) { + z__[(*n0 << 2) + *pp - 1] = z__[(*i0 << 2) + *pp - 1]; + z__[(*n0 << 2) - *pp] = z__[(*i0 << 2) - *pp]; + } +/* Computing MIN */ + d__1 = *dmin2, d__2 = z__[(*n0 << 2) + *pp - 1]; + *dmin2 = min(d__1,d__2); +/* Computing MIN */ + d__1 = z__[(*n0 << 2) + *pp - 1], d__2 = z__[(*i0 << 2) + *pp - 1] + , d__1 = min(d__1,d__2), d__2 = z__[(*i0 << 2) + *pp + 3]; + z__[(*n0 << 2) + *pp - 1] = min(d__1,d__2); +/* Computing MIN */ + d__1 = z__[(*n0 << 2) - *pp], d__2 = z__[(*i0 << 2) - *pp], d__1 = + min(d__1,d__2), d__2 = z__[(*i0 << 2) - *pp + 4]; + z__[(*n0 << 2) - *pp] = min(d__1,d__2); +/* Computing MAX */ + d__1 = *qmax, d__2 = z__[(*i0 << 2) + *pp - 3], d__1 = max(d__1, + d__2), d__2 = z__[(*i0 << 2) + *pp + 1]; + *qmax = max(d__1,d__2); + *dmin__ = -0.; + } + } + +/* Choose a shift. */ + + dlasq4_(i0, n0, &z__[1], pp, &n0in, dmin__, dmin1, dmin2, dn, dn1, dn2, + tau, ttype, g); + +/* Call dqds until DMIN > 0. */ + +L70: + + dlasq5_(i0, n0, &z__[1], pp, tau, sigma, dmin__, dmin1, dmin2, dn, dn1, + dn2, ieee, &eps); + + *ndiv += *n0 - *i0 + 2; + ++(*iter); + +/* Check status. */ + + if (*dmin__ >= 0. && *dmin1 >= 0.) { + +/* Success. */ + + goto L90; + + } else if (*dmin__ < 0. && *dmin1 > 0. && z__[(*n0 - 1 << 2) - *pp] < tol + * (*sigma + *dn1) && abs(*dn) < tol * *sigma) { + +/* Convergence hidden by negative DN. */ + + z__[(*n0 - 1 << 2) - *pp + 2] = 0.; + *dmin__ = 0.; + goto L90; + } else if (*dmin__ < 0.) { + +/* TAU too big. Select new TAU and try again. */ + + ++(*nfail); + if (*ttype < -22) { + +/* Failed twice. Play it safe. */ + + *tau = 0.; + } else if (*dmin1 > 0.) { + +/* Late failure. Gives excellent shift. */ + + *tau = (*tau + *dmin__) * (1. - eps * 2.); + *ttype += -11; + } else { + +/* Early failure. Divide by 4. */ + + *tau *= .25; + *ttype += -12; + } + goto L70; + } else if (disnan_(dmin__)) { + +/* NaN. */ + + if (*tau == 0.) { + goto L80; + } else { + *tau = 0.; + goto L70; + } + } else { + +/* Possible underflow. Play it safe. */ + + goto L80; + } + +/* Risk of underflow. */ + +L80: + dlasq6_(i0, n0, &z__[1], pp, dmin__, dmin1, dmin2, dn, dn1, dn2); + *ndiv += *n0 - *i0 + 2; + ++(*iter); + *tau = 0.; + +L90: + if (*tau < *sigma) { + *desig += *tau; + t = *sigma + *desig; + *desig -= t - *sigma; + } else { + t = *sigma + *tau; + *desig = *sigma - (t - *tau) + *desig; + } + *sigma = t; + + return 0; + +/* End of DLASQ3 */ + +} /* dlasq3_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasq4.cpp b/lib/linalg/dlasq4.cpp new file mode 100644 index 0000000000..4841ada1d2 --- /dev/null +++ b/lib/linalg/dlasq4.cpp @@ -0,0 +1,501 @@ +/* fortran/dlasq4.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASQ4 computes an approximation to the smallest eigenvalue using values of d from the previous + transform. Used by sbdsqr. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASQ4 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN, */ +/* DN1, DN2, TAU, TTYPE, G ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER I0, N0, N0IN, PP, TTYPE */ +/* DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DN1, DN2, G, TAU */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION Z( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASQ4 computes an approximation TAU to the smallest eigenvalue */ +/* > using values of d from the previous transform. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] I0 */ +/* > \verbatim */ +/* > I0 is INTEGER */ +/* > First index. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N0 */ +/* > \verbatim */ +/* > N0 is INTEGER */ +/* > Last index. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension ( 4*N0 ) */ +/* > Z holds the qd array. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PP */ +/* > \verbatim */ +/* > PP is INTEGER */ +/* > PP=0 for ping, PP=1 for pong. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N0IN */ +/* > \verbatim */ +/* > N0IN is INTEGER */ +/* > The value of N0 at start of EIGTEST. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DMIN */ +/* > \verbatim */ +/* > DMIN is DOUBLE PRECISION */ +/* > Minimum value of d. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DMIN1 */ +/* > \verbatim */ +/* > DMIN1 is DOUBLE PRECISION */ +/* > Minimum value of d, excluding D( N0 ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DMIN2 */ +/* > \verbatim */ +/* > DMIN2 is DOUBLE PRECISION */ +/* > Minimum value of d, excluding D( N0 ) and D( N0-1 ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DN */ +/* > \verbatim */ +/* > DN is DOUBLE PRECISION */ +/* > d(N) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DN1 */ +/* > \verbatim */ +/* > DN1 is DOUBLE PRECISION */ +/* > d(N-1) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DN2 */ +/* > \verbatim */ +/* > DN2 is DOUBLE PRECISION */ +/* > d(N-2) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION */ +/* > This is the shift. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TTYPE */ +/* > \verbatim */ +/* > TTYPE is INTEGER */ +/* > Shift type. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] G */ +/* > \verbatim */ +/* > G is DOUBLE PRECISION */ +/* > G is passed as an argument in order to save its value between */ +/* > calls to DLASQ4. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > CNST1 = 9/16 */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlasq4_(integer *i0, integer *n0, doublereal *z__, + integer *pp, integer *n0in, doublereal *dmin__, doublereal *dmin1, + doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, + doublereal *tau, integer *ttype, doublereal *g) +{ + /* System generated locals */ + integer i__1; + doublereal d__1, d__2; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal s, a2, b1, b2; + integer i4, nn, np; + doublereal gam, gap1, gap2; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* A negative DMIN forces the shift to take that absolute value */ +/* TTYPE records the type of shift. */ + + /* Parameter adjustments */ + --z__; + + /* Function Body */ + if (*dmin__ <= 0.) { + *tau = -(*dmin__); + *ttype = -1; + return 0; + } + + nn = (*n0 << 2) + *pp; + if (*n0in == *n0) { + +/* No eigenvalues deflated. */ + + if (*dmin__ == *dn || *dmin__ == *dn1) { + + b1 = sqrt(z__[nn - 3]) * sqrt(z__[nn - 5]); + b2 = sqrt(z__[nn - 7]) * sqrt(z__[nn - 9]); + a2 = z__[nn - 7] + z__[nn - 5]; + +/* Cases 2 and 3. */ + + if (*dmin__ == *dn && *dmin1 == *dn1) { + gap2 = *dmin2 - a2 - *dmin2 * .25; + if (gap2 > 0. && gap2 > b2) { + gap1 = a2 - *dn - b2 / gap2 * b2; + } else { + gap1 = a2 - *dn - (b1 + b2); + } + if (gap1 > 0. && gap1 > b1) { +/* Computing MAX */ + d__1 = *dn - b1 / gap1 * b1, d__2 = *dmin__ * .5; + s = max(d__1,d__2); + *ttype = -2; + } else { + s = 0.; + if (*dn > b1) { + s = *dn - b1; + } + if (a2 > b1 + b2) { +/* Computing MIN */ + d__1 = s, d__2 = a2 - (b1 + b2); + s = min(d__1,d__2); + } +/* Computing MAX */ + d__1 = s, d__2 = *dmin__ * .333; + s = max(d__1,d__2); + *ttype = -3; + } + } else { + +/* Case 4. */ + + *ttype = -4; + s = *dmin__ * .25; + if (*dmin__ == *dn) { + gam = *dn; + a2 = 0.; + if (z__[nn - 5] > z__[nn - 7]) { + return 0; + } + b2 = z__[nn - 5] / z__[nn - 7]; + np = nn - 9; + } else { + np = nn - (*pp << 1); + gam = *dn1; + if (z__[np - 4] > z__[np - 2]) { + return 0; + } + a2 = z__[np - 4] / z__[np - 2]; + if (z__[nn - 9] > z__[nn - 11]) { + return 0; + } + b2 = z__[nn - 9] / z__[nn - 11]; + np = nn - 13; + } + +/* Approximate contribution to norm squared from I < NN-1. */ + + a2 += b2; + i__1 = (*i0 << 2) - 1 + *pp; + for (i4 = np; i4 >= i__1; i4 += -4) { + if (b2 == 0.) { + goto L20; + } + b1 = b2; + if (z__[i4] > z__[i4 - 2]) { + return 0; + } + b2 *= z__[i4] / z__[i4 - 2]; + a2 += b2; + if (max(b2,b1) * 100. < a2 || .563 < a2) { + goto L20; + } +/* L10: */ + } +L20: + a2 *= 1.05; + +/* Rayleigh quotient residual bound. */ + + if (a2 < .563) { + s = gam * (1. - sqrt(a2)) / (a2 + 1.); + } + } + } else if (*dmin__ == *dn2) { + +/* Case 5. */ + + *ttype = -5; + s = *dmin__ * .25; + +/* Compute contribution to norm squared from I > NN-2. */ + + np = nn - (*pp << 1); + b1 = z__[np - 2]; + b2 = z__[np - 6]; + gam = *dn2; + if (z__[np - 8] > b2 || z__[np - 4] > b1) { + return 0; + } + a2 = z__[np - 8] / b2 * (z__[np - 4] / b1 + 1.); + +/* Approximate contribution to norm squared from I < NN-2. */ + + if (*n0 - *i0 > 2) { + b2 = z__[nn - 13] / z__[nn - 15]; + a2 += b2; + i__1 = (*i0 << 2) - 1 + *pp; + for (i4 = nn - 17; i4 >= i__1; i4 += -4) { + if (b2 == 0.) { + goto L40; + } + b1 = b2; + if (z__[i4] > z__[i4 - 2]) { + return 0; + } + b2 *= z__[i4] / z__[i4 - 2]; + a2 += b2; + if (max(b2,b1) * 100. < a2 || .563 < a2) { + goto L40; + } +/* L30: */ + } +L40: + a2 *= 1.05; + } + + if (a2 < .563) { + s = gam * (1. - sqrt(a2)) / (a2 + 1.); + } + } else { + +/* Case 6, no information to guide us. */ + + if (*ttype == -6) { + *g += (1. - *g) * .333; + } else if (*ttype == -18) { + *g = .083250000000000005; + } else { + *g = .25; + } + s = *g * *dmin__; + *ttype = -6; + } + + } else if (*n0in == *n0 + 1) { + +/* One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN. */ + + if (*dmin1 == *dn1 && *dmin2 == *dn2) { + +/* Cases 7 and 8. */ + + *ttype = -7; + s = *dmin1 * .333; + if (z__[nn - 5] > z__[nn - 7]) { + return 0; + } + b1 = z__[nn - 5] / z__[nn - 7]; + b2 = b1; + if (b2 == 0.) { + goto L60; + } + i__1 = (*i0 << 2) - 1 + *pp; + for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) { + a2 = b1; + if (z__[i4] > z__[i4 - 2]) { + return 0; + } + b1 *= z__[i4] / z__[i4 - 2]; + b2 += b1; + if (max(b1,a2) * 100. < b2) { + goto L60; + } +/* L50: */ + } +L60: + b2 = sqrt(b2 * 1.05); +/* Computing 2nd power */ + d__1 = b2; + a2 = *dmin1 / (d__1 * d__1 + 1.); + gap2 = *dmin2 * .5 - a2; + if (gap2 > 0. && gap2 > b2 * a2) { +/* Computing MAX */ + d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2); + s = max(d__1,d__2); + } else { +/* Computing MAX */ + d__1 = s, d__2 = a2 * (1. - b2 * 1.01); + s = max(d__1,d__2); + *ttype = -8; + } + } else { + +/* Case 9. */ + + s = *dmin1 * .25; + if (*dmin1 == *dn1) { + s = *dmin1 * .5; + } + *ttype = -9; + } + + } else if (*n0in == *n0 + 2) { + +/* Two eigenvalues deflated. Use DMIN2, DN2 for DMIN and DN. */ + +/* Cases 10 and 11. */ + + if (*dmin2 == *dn2 && z__[nn - 5] * 2. < z__[nn - 7]) { + *ttype = -10; + s = *dmin2 * .333; + if (z__[nn - 5] > z__[nn - 7]) { + return 0; + } + b1 = z__[nn - 5] / z__[nn - 7]; + b2 = b1; + if (b2 == 0.) { + goto L80; + } + i__1 = (*i0 << 2) - 1 + *pp; + for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) { + if (z__[i4] > z__[i4 - 2]) { + return 0; + } + b1 *= z__[i4] / z__[i4 - 2]; + b2 += b1; + if (b1 * 100. < b2) { + goto L80; + } +/* L70: */ + } +L80: + b2 = sqrt(b2 * 1.05); +/* Computing 2nd power */ + d__1 = b2; + a2 = *dmin2 / (d__1 * d__1 + 1.); + gap2 = z__[nn - 7] + z__[nn - 9] - sqrt(z__[nn - 11]) * sqrt(z__[ + nn - 9]) - a2; + if (gap2 > 0. && gap2 > b2 * a2) { +/* Computing MAX */ + d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2); + s = max(d__1,d__2); + } else { +/* Computing MAX */ + d__1 = s, d__2 = a2 * (1. - b2 * 1.01); + s = max(d__1,d__2); + } + } else { + s = *dmin2 * .25; + *ttype = -11; + } + } else if (*n0in > *n0 + 2) { + +/* Case 12, more than two eigenvalues deflated. No information. */ + + s = 0.; + *ttype = -12; + } + + *tau = s; + return 0; + +/* End of DLASQ4 */ + +} /* dlasq4_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasq5.cpp b/lib/linalg/dlasq5.cpp new file mode 100644 index 0000000000..13ae0ed20c --- /dev/null +++ b/lib/linalg/dlasq5.cpp @@ -0,0 +1,480 @@ +/* fortran/dlasq5.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASQ5 computes one dqds transform in ping-pong form. Used by sbdsqr and sstegr. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASQ5 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, SIGMA, DMIN, DMIN1, DMIN2, DN, */ +/* DNM1, DNM2, IEEE, EPS ) */ + +/* .. Scalar Arguments .. */ +/* LOGICAL IEEE */ +/* INTEGER I0, N0, PP */ +/* DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU, SIGMA, EPS */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION Z( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASQ5 computes one dqds transform in ping-pong form, one */ +/* > version for IEEE machines another for non IEEE machines. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] I0 */ +/* > \verbatim */ +/* > I0 is INTEGER */ +/* > First index. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N0 */ +/* > \verbatim */ +/* > N0 is INTEGER */ +/* > Last index. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension ( 4*N ) */ +/* > Z holds the qd array. EMIN is stored in Z(4*N0) to avoid */ +/* > an extra argument. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PP */ +/* > \verbatim */ +/* > PP is INTEGER */ +/* > PP=0 for ping, PP=1 for pong. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION */ +/* > This is the shift. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] SIGMA */ +/* > \verbatim */ +/* > SIGMA is DOUBLE PRECISION */ +/* > This is the accumulated shift up to this step. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DMIN */ +/* > \verbatim */ +/* > DMIN is DOUBLE PRECISION */ +/* > Minimum value of d. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DMIN1 */ +/* > \verbatim */ +/* > DMIN1 is DOUBLE PRECISION */ +/* > Minimum value of d, excluding D( N0 ). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DMIN2 */ +/* > \verbatim */ +/* > DMIN2 is DOUBLE PRECISION */ +/* > Minimum value of d, excluding D( N0 ) and D( N0-1 ). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DN */ +/* > \verbatim */ +/* > DN is DOUBLE PRECISION */ +/* > d(N0), the last value of d. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DNM1 */ +/* > \verbatim */ +/* > DNM1 is DOUBLE PRECISION */ +/* > d(N0-1). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DNM2 */ +/* > \verbatim */ +/* > DNM2 is DOUBLE PRECISION */ +/* > d(N0-2). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] IEEE */ +/* > \verbatim */ +/* > IEEE is LOGICAL */ +/* > Flag for IEEE or non IEEE arithmetic. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] EPS */ +/* > \verbatim */ +/* > EPS is DOUBLE PRECISION */ +/* > This is the value of epsilon used. */ +/* > \endverbatim */ +/* > */ +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dlasq5_(integer *i0, integer *n0, doublereal *z__, + integer *pp, doublereal *tau, doublereal *sigma, doublereal *dmin__, + doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal * + dnm1, doublereal *dnm2, logical *ieee, doublereal *eps) +{ + /* System generated locals */ + integer i__1; + doublereal d__1, d__2; + + /* Local variables */ + doublereal d__; + integer j4, j4p2; + doublereal emin, temp, dthresh; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameter .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --z__; + + /* Function Body */ + if (*n0 - *i0 - 1 <= 0) { + return 0; + } + + dthresh = *eps * (*sigma + *tau); + if (*tau < dthresh * .5) { + *tau = 0.; + } + if (*tau != 0.) { + j4 = (*i0 << 2) + *pp - 3; + emin = z__[j4 + 4]; + d__ = z__[j4] - *tau; + *dmin__ = d__; + *dmin1 = -z__[j4]; + + if (*ieee) { + +/* Code for IEEE arithmetic. */ + + if (*pp == 0) { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 2] = d__ + z__[j4 - 1]; + temp = z__[j4 + 1] / z__[j4 - 2]; + d__ = d__ * temp - *tau; + *dmin__ = min(*dmin__,d__); + z__[j4] = z__[j4 - 1] * temp; +/* Computing MIN */ + d__1 = z__[j4]; + emin = min(d__1,emin); +/* L10: */ + } + } else { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 3] = d__ + z__[j4]; + temp = z__[j4 + 2] / z__[j4 - 3]; + d__ = d__ * temp - *tau; + *dmin__ = min(*dmin__,d__); + z__[j4 - 1] = z__[j4] * temp; +/* Computing MIN */ + d__1 = z__[j4 - 1]; + emin = min(d__1,emin); +/* L20: */ + } + } + +/* Unroll last two steps. */ + + *dnm2 = d__; + *dmin2 = *dmin__; + j4 = (*n0 - 2 << 2) - *pp; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm2 + z__[j4p2]; + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; + *dmin__ = min(*dmin__,*dnm1); + + *dmin1 = *dmin__; + j4 += 4; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm1 + z__[j4p2]; + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; + *dmin__ = min(*dmin__,*dn); + + } else { + +/* Code for non IEEE arithmetic. */ + + if (*pp == 0) { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 2] = d__ + z__[j4 - 1]; + if (d__ < 0.) { + return 0; + } else { + z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); + d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]) - *tau; + } + *dmin__ = min(*dmin__,d__); +/* Computing MIN */ + d__1 = emin, d__2 = z__[j4]; + emin = min(d__1,d__2); +/* L30: */ + } + } else { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 3] = d__ + z__[j4]; + if (d__ < 0.) { + return 0; + } else { + z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); + d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]) - *tau; + } + *dmin__ = min(*dmin__,d__); +/* Computing MIN */ + d__1 = emin, d__2 = z__[j4 - 1]; + emin = min(d__1,d__2); +/* L40: */ + } + } + +/* Unroll last two steps. */ + + *dnm2 = d__; + *dmin2 = *dmin__; + j4 = (*n0 - 2 << 2) - *pp; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm2 + z__[j4p2]; + if (*dnm2 < 0.) { + return 0; + } else { + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; + } + *dmin__ = min(*dmin__,*dnm1); + + *dmin1 = *dmin__; + j4 += 4; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm1 + z__[j4p2]; + if (*dnm1 < 0.) { + return 0; + } else { + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; + } + *dmin__ = min(*dmin__,*dn); + + } + } else { +/* This is the version that sets d's to zero if they are small enough */ + j4 = (*i0 << 2) + *pp - 3; + emin = z__[j4 + 4]; + d__ = z__[j4] - *tau; + *dmin__ = d__; + *dmin1 = -z__[j4]; + if (*ieee) { + +/* Code for IEEE arithmetic. */ + + if (*pp == 0) { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 2] = d__ + z__[j4 - 1]; + temp = z__[j4 + 1] / z__[j4 - 2]; + d__ = d__ * temp - *tau; + if (d__ < dthresh) { + d__ = 0.; + } + *dmin__ = min(*dmin__,d__); + z__[j4] = z__[j4 - 1] * temp; +/* Computing MIN */ + d__1 = z__[j4]; + emin = min(d__1,emin); +/* L50: */ + } + } else { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 3] = d__ + z__[j4]; + temp = z__[j4 + 2] / z__[j4 - 3]; + d__ = d__ * temp - *tau; + if (d__ < dthresh) { + d__ = 0.; + } + *dmin__ = min(*dmin__,d__); + z__[j4 - 1] = z__[j4] * temp; +/* Computing MIN */ + d__1 = z__[j4 - 1]; + emin = min(d__1,emin); +/* L60: */ + } + } + +/* Unroll last two steps. */ + + *dnm2 = d__; + *dmin2 = *dmin__; + j4 = (*n0 - 2 << 2) - *pp; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm2 + z__[j4p2]; + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; + *dmin__ = min(*dmin__,*dnm1); + + *dmin1 = *dmin__; + j4 += 4; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm1 + z__[j4p2]; + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; + *dmin__ = min(*dmin__,*dn); + + } else { + +/* Code for non IEEE arithmetic. */ + + if (*pp == 0) { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 2] = d__ + z__[j4 - 1]; + if (d__ < 0.) { + return 0; + } else { + z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); + d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]) - *tau; + } + if (d__ < dthresh) { + d__ = 0.; + } + *dmin__ = min(*dmin__,d__); +/* Computing MIN */ + d__1 = emin, d__2 = z__[j4]; + emin = min(d__1,d__2); +/* L70: */ + } + } else { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 3] = d__ + z__[j4]; + if (d__ < 0.) { + return 0; + } else { + z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); + d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]) - *tau; + } + if (d__ < dthresh) { + d__ = 0.; + } + *dmin__ = min(*dmin__,d__); +/* Computing MIN */ + d__1 = emin, d__2 = z__[j4 - 1]; + emin = min(d__1,d__2); +/* L80: */ + } + } + +/* Unroll last two steps. */ + + *dnm2 = d__; + *dmin2 = *dmin__; + j4 = (*n0 - 2 << 2) - *pp; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm2 + z__[j4p2]; + if (*dnm2 < 0.) { + return 0; + } else { + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; + } + *dmin__ = min(*dmin__,*dnm1); + + *dmin1 = *dmin__; + j4 += 4; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm1 + z__[j4p2]; + if (*dnm1 < 0.) { + return 0; + } else { + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; + } + *dmin__ = min(*dmin__,*dn); + + } + } + + z__[j4 + 2] = *dn; + z__[(*n0 << 2) - *pp] = emin; + return 0; + +/* End of DLASQ5 */ + +} /* dlasq5_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasq6.cpp b/lib/linalg/dlasq6.cpp new file mode 100644 index 0000000000..b06e9ad028 --- /dev/null +++ b/lib/linalg/dlasq6.cpp @@ -0,0 +1,291 @@ +/* fortran/dlasq6.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASQ6 computes one dqd transform in ping-pong form. Used by sbdsqr and sstegr. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASQ6 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN, */ +/* DNM1, DNM2 ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER I0, N0, PP */ +/* DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2 */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION Z( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASQ6 computes one dqd (shift equal to zero) transform in */ +/* > ping-pong form, with protection against underflow and overflow. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] I0 */ +/* > \verbatim */ +/* > I0 is INTEGER */ +/* > First index. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N0 */ +/* > \verbatim */ +/* > N0 is INTEGER */ +/* > Last index. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension ( 4*N ) */ +/* > Z holds the qd array. EMIN is stored in Z(4*N0) to avoid */ +/* > an extra argument. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PP */ +/* > \verbatim */ +/* > PP is INTEGER */ +/* > PP=0 for ping, PP=1 for pong. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DMIN */ +/* > \verbatim */ +/* > DMIN is DOUBLE PRECISION */ +/* > Minimum value of d. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DMIN1 */ +/* > \verbatim */ +/* > DMIN1 is DOUBLE PRECISION */ +/* > Minimum value of d, excluding D( N0 ). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DMIN2 */ +/* > \verbatim */ +/* > DMIN2 is DOUBLE PRECISION */ +/* > Minimum value of d, excluding D( N0 ) and D( N0-1 ). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DN */ +/* > \verbatim */ +/* > DN is DOUBLE PRECISION */ +/* > d(N0), the last value of d. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DNM1 */ +/* > \verbatim */ +/* > DNM1 is DOUBLE PRECISION */ +/* > d(N0-1). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DNM2 */ +/* > \verbatim */ +/* > DNM2 is DOUBLE PRECISION */ +/* > d(N0-2). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dlasq6_(integer *i0, integer *n0, doublereal *z__, + integer *pp, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, + doublereal *dn, doublereal *dnm1, doublereal *dnm2) +{ + /* System generated locals */ + integer i__1; + doublereal d__1, d__2; + + /* Local variables */ + doublereal d__; + integer j4, j4p2; + doublereal emin, temp; + extern doublereal dlamch_(char *, ftnlen); + doublereal safmin; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameter .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Function .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --z__; + + /* Function Body */ + if (*n0 - *i0 - 1 <= 0) { + return 0; + } + + safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); + j4 = (*i0 << 2) + *pp - 3; + emin = z__[j4 + 4]; + d__ = z__[j4]; + *dmin__ = d__; + + if (*pp == 0) { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 2] = d__ + z__[j4 - 1]; + if (z__[j4 - 2] == 0.) { + z__[j4] = 0.; + d__ = z__[j4 + 1]; + *dmin__ = d__; + emin = 0.; + } else if (safmin * z__[j4 + 1] < z__[j4 - 2] && safmin * z__[j4 + - 2] < z__[j4 + 1]) { + temp = z__[j4 + 1] / z__[j4 - 2]; + z__[j4] = z__[j4 - 1] * temp; + d__ *= temp; + } else { + z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); + d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]); + } + *dmin__ = min(*dmin__,d__); +/* Computing MIN */ + d__1 = emin, d__2 = z__[j4]; + emin = min(d__1,d__2); +/* L10: */ + } + } else { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 3] = d__ + z__[j4]; + if (z__[j4 - 3] == 0.) { + z__[j4 - 1] = 0.; + d__ = z__[j4 + 2]; + *dmin__ = d__; + emin = 0.; + } else if (safmin * z__[j4 + 2] < z__[j4 - 3] && safmin * z__[j4 + - 3] < z__[j4 + 2]) { + temp = z__[j4 + 2] / z__[j4 - 3]; + z__[j4 - 1] = z__[j4] * temp; + d__ *= temp; + } else { + z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); + d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]); + } + *dmin__ = min(*dmin__,d__); +/* Computing MIN */ + d__1 = emin, d__2 = z__[j4 - 1]; + emin = min(d__1,d__2); +/* L20: */ + } + } + +/* Unroll last two steps. */ + + *dnm2 = d__; + *dmin2 = *dmin__; + j4 = (*n0 - 2 << 2) - *pp; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm2 + z__[j4p2]; + if (z__[j4 - 2] == 0.) { + z__[j4] = 0.; + *dnm1 = z__[j4p2 + 2]; + *dmin__ = *dnm1; + emin = 0.; + } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < + z__[j4p2 + 2]) { + temp = z__[j4p2 + 2] / z__[j4 - 2]; + z__[j4] = z__[j4p2] * temp; + *dnm1 = *dnm2 * temp; + } else { + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]); + } + *dmin__ = min(*dmin__,*dnm1); + + *dmin1 = *dmin__; + j4 += 4; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm1 + z__[j4p2]; + if (z__[j4 - 2] == 0.) { + z__[j4] = 0.; + *dn = z__[j4p2 + 2]; + *dmin__ = *dn; + emin = 0.; + } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < + z__[j4p2 + 2]) { + temp = z__[j4p2 + 2] / z__[j4 - 2]; + z__[j4] = z__[j4p2] * temp; + *dn = *dnm1 * temp; + } else { + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]); + } + *dmin__ = min(*dmin__,*dn); + + z__[j4 + 2] = *dn; + z__[(*n0 << 2) - *pp] = emin; + return 0; + +/* End of DLASQ6 */ + +} /* dlasq6_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasr.cpp b/lib/linalg/dlasr.cpp new file mode 100644 index 0000000000..c4de2f85a9 --- /dev/null +++ b/lib/linalg/dlasr.cpp @@ -0,0 +1,536 @@ +/* fortran/dlasr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASR applies a sequence of plane rotations to a general rectangular matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER DIRECT, PIVOT, SIDE */ +/* INTEGER LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), C( * ), S( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASR applies a sequence of plane rotations to a real matrix A, */ +/* > from either the left or the right. */ +/* > */ +/* > When SIDE = 'L', the transformation takes the form */ +/* > */ +/* > A := P*A */ +/* > */ +/* > and when SIDE = 'R', the transformation takes the form */ +/* > */ +/* > A := A*P**T */ +/* > */ +/* > where P is an orthogonal matrix consisting of a sequence of z plane */ +/* > rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R', */ +/* > and P**T is the transpose of P. */ +/* > */ +/* > When DIRECT = 'F' (Forward sequence), then */ +/* > */ +/* > P = P(z-1) * ... * P(2) * P(1) */ +/* > */ +/* > and when DIRECT = 'B' (Backward sequence), then */ +/* > */ +/* > P = P(1) * P(2) * ... * P(z-1) */ +/* > */ +/* > where P(k) is a plane rotation matrix defined by the 2-by-2 rotation */ +/* > */ +/* > R(k) = ( c(k) s(k) ) */ +/* > = ( -s(k) c(k) ). */ +/* > */ +/* > When PIVOT = 'V' (Variable pivot), the rotation is performed */ +/* > for the plane (k,k+1), i.e., P(k) has the form */ +/* > */ +/* > P(k) = ( 1 ) */ +/* > ( ... ) */ +/* > ( 1 ) */ +/* > ( c(k) s(k) ) */ +/* > ( -s(k) c(k) ) */ +/* > ( 1 ) */ +/* > ( ... ) */ +/* > ( 1 ) */ +/* > */ +/* > where R(k) appears as a rank-2 modification to the identity matrix in */ +/* > rows and columns k and k+1. */ +/* > */ +/* > When PIVOT = 'T' (Top pivot), the rotation is performed for the */ +/* > plane (1,k+1), so P(k) has the form */ +/* > */ +/* > P(k) = ( c(k) s(k) ) */ +/* > ( 1 ) */ +/* > ( ... ) */ +/* > ( 1 ) */ +/* > ( -s(k) c(k) ) */ +/* > ( 1 ) */ +/* > ( ... ) */ +/* > ( 1 ) */ +/* > */ +/* > where R(k) appears in rows and columns 1 and k+1. */ +/* > */ +/* > Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is */ +/* > performed for the plane (k,z), giving P(k) the form */ +/* > */ +/* > P(k) = ( 1 ) */ +/* > ( ... ) */ +/* > ( 1 ) */ +/* > ( c(k) s(k) ) */ +/* > ( 1 ) */ +/* > ( ... ) */ +/* > ( 1 ) */ +/* > ( -s(k) c(k) ) */ +/* > */ +/* > where R(k) appears in rows and columns k and z. The rotations are */ +/* > performed without ever forming P(k) explicitly. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > Specifies whether the plane rotation matrix P is applied to */ +/* > A on the left or the right. */ +/* > = 'L': Left, compute A := P*A */ +/* > = 'R': Right, compute A:= A*P**T */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PIVOT */ +/* > \verbatim */ +/* > PIVOT is CHARACTER*1 */ +/* > Specifies the plane for which P(k) is a plane rotation */ +/* > matrix. */ +/* > = 'V': Variable pivot, the plane (k,k+1) */ +/* > = 'T': Top pivot, the plane (1,k+1) */ +/* > = 'B': Bottom pivot, the plane (k,z) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIRECT */ +/* > \verbatim */ +/* > DIRECT is CHARACTER*1 */ +/* > Specifies whether P is a forward or backward sequence of */ +/* > plane rotations. */ +/* > = 'F': Forward, P = P(z-1)*...*P(2)*P(1) */ +/* > = 'B': Backward, P = P(1)*P(2)*...*P(z-1) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. If m <= 1, an immediate */ +/* > return is effected. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. If n <= 1, an */ +/* > immediate return is effected. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension */ +/* > (M-1) if SIDE = 'L' */ +/* > (N-1) if SIDE = 'R' */ +/* > The cosines c(k) of the plane rotations. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION array, dimension */ +/* > (M-1) if SIDE = 'L' */ +/* > (N-1) if SIDE = 'R' */ +/* > The sines s(k) of the plane rotations. The 2-by-2 plane */ +/* > rotation part of the matrix P(k), R(k), has the form */ +/* > R(k) = ( c(k) s(k) ) */ +/* > ( -s(k) c(k) ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > The M-by-N matrix A. On exit, A is overwritten by P*A if */ +/* > SIDE = 'L' or by A*P**T if SIDE = 'R'. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int dlasr_(char *side, char *pivot, char *direct, integer *m, + integer *n, doublereal *c__, doublereal *s, doublereal *a, integer * + lda, ftnlen side_len, ftnlen pivot_len, ftnlen direct_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + + /* Local variables */ + integer i__, j, info; + doublereal temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + doublereal ctemp, stemp; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters */ + + /* Parameter adjustments */ + --c__; + --s; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + info = 0; + if (! (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) || lsame_(side, (char *)"R", ( + ftnlen)1, (ftnlen)1))) { + info = 1; + } else if (! (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1) || lsame_(pivot, + (char *)"T", (ftnlen)1, (ftnlen)1) || lsame_(pivot, (char *)"B", (ftnlen)1, ( + ftnlen)1))) { + info = 2; + } else if (! (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(direct, + (char *)"B", (ftnlen)1, (ftnlen)1))) { + info = 3; + } else if (*m < 0) { + info = 4; + } else if (*n < 0) { + info = 5; + } else if (*lda < max(1,*m)) { + info = 9; + } + if (info != 0) { + xerbla_((char *)"DLASR ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0) { + return 0; + } + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Form P * A */ + + if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *m - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = a[j + 1 + i__ * a_dim1]; + a[j + 1 + i__ * a_dim1] = ctemp * temp - stemp * + a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = stemp * temp + ctemp * a[j + + i__ * a_dim1]; +/* L10: */ + } + } +/* L20: */ + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *m - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = a[j + 1 + i__ * a_dim1]; + a[j + 1 + i__ * a_dim1] = ctemp * temp - stemp * + a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = stemp * temp + ctemp * a[j + + i__ * a_dim1]; +/* L30: */ + } + } +/* L40: */ + } + } + } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *m; + for (j = 2; j <= i__1; ++j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = ctemp * temp - stemp * a[ + i__ * a_dim1 + 1]; + a[i__ * a_dim1 + 1] = stemp * temp + ctemp * a[ + i__ * a_dim1 + 1]; +/* L50: */ + } + } +/* L60: */ + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *m; j >= 2; --j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = ctemp * temp - stemp * a[ + i__ * a_dim1 + 1]; + a[i__ * a_dim1 + 1] = stemp * temp + ctemp * a[ + i__ * a_dim1 + 1]; +/* L70: */ + } + } +/* L80: */ + } + } + } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *m - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = stemp * a[*m + i__ * a_dim1] + + ctemp * temp; + a[*m + i__ * a_dim1] = ctemp * a[*m + i__ * + a_dim1] - stemp * temp; +/* L90: */ + } + } +/* L100: */ + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *m - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = stemp * a[*m + i__ * a_dim1] + + ctemp * temp; + a[*m + i__ * a_dim1] = ctemp * a[*m + i__ * + a_dim1] - stemp * temp; +/* L110: */ + } + } +/* L120: */ + } + } + } + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + +/* Form A * P**T */ + + if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = a[i__ + (j + 1) * a_dim1]; + a[i__ + (j + 1) * a_dim1] = ctemp * temp - stemp * + a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = stemp * temp + ctemp * a[ + i__ + j * a_dim1]; +/* L130: */ + } + } +/* L140: */ + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *n - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = a[i__ + (j + 1) * a_dim1]; + a[i__ + (j + 1) * a_dim1] = ctemp * temp - stemp * + a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = stemp * temp + ctemp * a[ + i__ + j * a_dim1]; +/* L150: */ + } + } +/* L160: */ + } + } + } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 2; j <= i__1; ++j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = ctemp * temp - stemp * a[ + i__ + a_dim1]; + a[i__ + a_dim1] = stemp * temp + ctemp * a[i__ + + a_dim1]; +/* L170: */ + } + } +/* L180: */ + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *n; j >= 2; --j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = ctemp * temp - stemp * a[ + i__ + a_dim1]; + a[i__ + a_dim1] = stemp * temp + ctemp * a[i__ + + a_dim1]; +/* L190: */ + } + } +/* L200: */ + } + } + } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = stemp * a[i__ + *n * a_dim1] + + ctemp * temp; + a[i__ + *n * a_dim1] = ctemp * a[i__ + *n * + a_dim1] - stemp * temp; +/* L210: */ + } + } +/* L220: */ + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *n - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = stemp * a[i__ + *n * a_dim1] + + ctemp * temp; + a[i__ + *n * a_dim1] = ctemp * a[i__ + *n * + a_dim1] - stemp * temp; +/* L230: */ + } + } +/* L240: */ + } + } + } + } + + return 0; + +/* End of DLASR */ + +} /* dlasr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasrt.cpp b/lib/linalg/dlasrt.cpp new file mode 100644 index 0000000000..8c0eec5f2e --- /dev/null +++ b/lib/linalg/dlasrt.cpp @@ -0,0 +1,352 @@ +/* fortran/dlasrt.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASRT sorts numbers in increasing or decreasing order. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASRT + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASRT( ID, N, D, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER ID */ +/* INTEGER INFO, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Sort the numbers in D in increasing order (if ID = 'I') or */ +/* > in decreasing order (if ID = 'D' ). */ +/* > */ +/* > Use Quick Sort, reverting to Insertion sort on arrays of */ +/* > size <= 20. Dimension of STACK limits N to about 2**32. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ID */ +/* > \verbatim */ +/* > ID is CHARACTER*1 */ +/* > = 'I': sort D in increasing order; */ +/* > = 'D': sort D in decreasing order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The length of the array D. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the array to be sorted. */ +/* > On exit, D has been sorted into increasing order */ +/* > (D(1) <= ... <= D(N) ) or into decreasing order */ +/* > (D(1) >= ... >= D(N) ), depending on ID. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dlasrt_(char *id, integer *n, doublereal *d__, integer * + info, ftnlen id_len) +{ + /* System generated locals */ + integer i__1, i__2; + + /* Local variables */ + integer i__, j; + doublereal d1, d2, d3; + integer dir; + doublereal tmp; + integer endd; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer stack[64] /* was [2][32] */; + doublereal dmnmx; + integer start; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + integer stkpnt; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Local Arrays .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + + /* Function Body */ + *info = 0; + dir = -1; + if (lsame_(id, (char *)"D", (ftnlen)1, (ftnlen)1)) { + dir = 0; + } else if (lsame_(id, (char *)"I", (ftnlen)1, (ftnlen)1)) { + dir = 1; + } + if (dir == -1) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLASRT", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n <= 1) { + return 0; + } + + stkpnt = 1; + stack[0] = 1; + stack[1] = *n; +L10: + start = stack[(stkpnt << 1) - 2]; + endd = stack[(stkpnt << 1) - 1]; + --stkpnt; + if (endd - start <= 20 && endd - start > 0) { + +/* Do Insertion sort on D( START:ENDD ) */ + + if (dir == 0) { + +/* Sort into decreasing order */ + + i__1 = endd; + for (i__ = start + 1; i__ <= i__1; ++i__) { + i__2 = start + 1; + for (j = i__; j >= i__2; --j) { + if (d__[j] > d__[j - 1]) { + dmnmx = d__[j]; + d__[j] = d__[j - 1]; + d__[j - 1] = dmnmx; + } else { + goto L30; + } +/* L20: */ + } +L30: + ; + } + + } else { + +/* Sort into increasing order */ + + i__1 = endd; + for (i__ = start + 1; i__ <= i__1; ++i__) { + i__2 = start + 1; + for (j = i__; j >= i__2; --j) { + if (d__[j] < d__[j - 1]) { + dmnmx = d__[j]; + d__[j] = d__[j - 1]; + d__[j - 1] = dmnmx; + } else { + goto L50; + } +/* L40: */ + } +L50: + ; + } + + } + + } else if (endd - start > 20) { + +/* Partition D( START:ENDD ) and stack parts, largest one first */ + +/* Choose partition entry as median of 3 */ + + d1 = d__[start]; + d2 = d__[endd]; + i__ = (start + endd) / 2; + d3 = d__[i__]; + if (d1 < d2) { + if (d3 < d1) { + dmnmx = d1; + } else if (d3 < d2) { + dmnmx = d3; + } else { + dmnmx = d2; + } + } else { + if (d3 < d2) { + dmnmx = d2; + } else if (d3 < d1) { + dmnmx = d3; + } else { + dmnmx = d1; + } + } + + if (dir == 0) { + +/* Sort into decreasing order */ + + i__ = start - 1; + j = endd + 1; +L60: +L70: + --j; + if (d__[j] < dmnmx) { + goto L70; + } +L80: + ++i__; + if (d__[i__] > dmnmx) { + goto L80; + } + if (i__ < j) { + tmp = d__[i__]; + d__[i__] = d__[j]; + d__[j] = tmp; + goto L60; + } + if (j - start > endd - j - 1) { + ++stkpnt; + stack[(stkpnt << 1) - 2] = start; + stack[(stkpnt << 1) - 1] = j; + ++stkpnt; + stack[(stkpnt << 1) - 2] = j + 1; + stack[(stkpnt << 1) - 1] = endd; + } else { + ++stkpnt; + stack[(stkpnt << 1) - 2] = j + 1; + stack[(stkpnt << 1) - 1] = endd; + ++stkpnt; + stack[(stkpnt << 1) - 2] = start; + stack[(stkpnt << 1) - 1] = j; + } + } else { + +/* Sort into increasing order */ + + i__ = start - 1; + j = endd + 1; +L90: +L100: + --j; + if (d__[j] > dmnmx) { + goto L100; + } +L110: + ++i__; + if (d__[i__] < dmnmx) { + goto L110; + } + if (i__ < j) { + tmp = d__[i__]; + d__[i__] = d__[j]; + d__[j] = tmp; + goto L90; + } + if (j - start > endd - j - 1) { + ++stkpnt; + stack[(stkpnt << 1) - 2] = start; + stack[(stkpnt << 1) - 1] = j; + ++stkpnt; + stack[(stkpnt << 1) - 2] = j + 1; + stack[(stkpnt << 1) - 1] = endd; + } else { + ++stkpnt; + stack[(stkpnt << 1) - 2] = j + 1; + stack[(stkpnt << 1) - 1] = endd; + ++stkpnt; + stack[(stkpnt << 1) - 2] = start; + stack[(stkpnt << 1) - 1] = j; + } + } + } + if (stkpnt > 0) { + goto L10; + } + return 0; + +/* End of DLASRT */ + +} /* dlasrt_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlassq.cpp b/lib/linalg/dlassq.cpp new file mode 100644 index 0000000000..fe346d2247 --- /dev/null +++ b/lib/linalg/dlassq.cpp @@ -0,0 +1,191 @@ +/* fortran/dlassq.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASSQ updates a sum of squares represented in scaled form. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASSQ + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASSQ( N, X, INCX, SCALE, SUMSQ ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX, N */ +/* DOUBLE PRECISION SCALE, SUMSQ */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION X( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASSQ returns the values scl and smsq such that */ +/* > */ +/* > ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq, */ +/* > */ +/* > where x( i ) = X( 1 + ( i - 1 )*INCX ). The value of sumsq is */ +/* > assumed to be non-negative and scl returns the value */ +/* > */ +/* > scl = max( scale, abs( x( i ) ) ). */ +/* > */ +/* > scale and sumsq must be supplied in SCALE and SUMSQ and */ +/* > scl and smsq are overwritten on SCALE and SUMSQ respectively. */ +/* > */ +/* > The routine makes only one pass through the vector x. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of elements to be used from the vector X. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION array, dimension (N) */ +/* > The vector for which a scaled sum of squares is computed. */ +/* > x( i ) = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > The increment between successive values of the vector X. */ +/* > INCX > 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] SCALE */ +/* > \verbatim */ +/* > SCALE is DOUBLE PRECISION */ +/* > On entry, the value scale in the equation above. */ +/* > On exit, SCALE is overwritten with scl , the scaling factor */ +/* > for the sum of squares. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] SUMSQ */ +/* > \verbatim */ +/* > SUMSQ is DOUBLE PRECISION */ +/* > On entry, the value sumsq in the equation above. */ +/* > On exit, SUMSQ is overwritten with smsq , the basic sum of */ +/* > squares from which scl has been factored out. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \date December 2016 */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int dlassq_(integer *n, doublereal *x, integer *incx, + doublereal *scale, doublereal *sumsq) +{ + /* System generated locals */ + integer i__1, i__2; + doublereal d__1; + + /* Local variables */ + integer ix; + doublereal absxi; + extern logical disnan_(doublereal *); + + +/* -- LAPACK auxiliary routine (version 3.7.0) -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ +/* December 2016 */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --x; + + /* Function Body */ + if (*n > 0) { + i__1 = (*n - 1) * *incx + 1; + i__2 = *incx; + for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { + absxi = (d__1 = x[ix], abs(d__1)); + if (absxi > 0. || disnan_(&absxi)) { + if (*scale < absxi) { +/* Computing 2nd power */ + d__1 = *scale / absxi; + *sumsq = *sumsq * (d__1 * d__1) + 1; + *scale = absxi; + } else { +/* Computing 2nd power */ + d__1 = absxi / *scale; + *sumsq += d__1 * d__1; + } + } +/* L10: */ + } + } + return 0; + +/* End of DLASSQ */ + +} /* dlassq_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlasv2.cpp b/lib/linalg/dlasv2.cpp new file mode 100644 index 0000000000..4667b941d4 --- /dev/null +++ b/lib/linalg/dlasv2.cpp @@ -0,0 +1,356 @@ +/* fortran/dlasv2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b3 = 2.; +static doublereal c_b4 = 1.; + +/* > \brief \b DLASV2 computes the singular value decomposition of a 2-by-2 triangular matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASV2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL ) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASV2 computes the singular value decomposition of a 2-by-2 */ +/* > triangular matrix */ +/* > [ F G ] */ +/* > [ 0 H ]. */ +/* > On return, abs(SSMAX) is the larger singular value, abs(SSMIN) is the */ +/* > smaller singular value, and (CSL,SNL) and (CSR,SNR) are the left and */ +/* > right singular vectors for abs(SSMAX), giving the decomposition */ +/* > */ +/* > [ CSL SNL ] [ F G ] [ CSR -SNR ] = [ SSMAX 0 ] */ +/* > [-SNL CSL ] [ 0 H ] [ SNR CSR ] [ 0 SSMIN ]. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] F */ +/* > \verbatim */ +/* > F is DOUBLE PRECISION */ +/* > The (1,1) element of the 2-by-2 matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] G */ +/* > \verbatim */ +/* > G is DOUBLE PRECISION */ +/* > The (1,2) element of the 2-by-2 matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] H */ +/* > \verbatim */ +/* > H is DOUBLE PRECISION */ +/* > The (2,2) element of the 2-by-2 matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] SSMIN */ +/* > \verbatim */ +/* > SSMIN is DOUBLE PRECISION */ +/* > abs(SSMIN) is the smaller singular value. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] SSMAX */ +/* > \verbatim */ +/* > SSMAX is DOUBLE PRECISION */ +/* > abs(SSMAX) is the larger singular value. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] SNL */ +/* > \verbatim */ +/* > SNL is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[out] CSL */ +/* > \verbatim */ +/* > CSL is DOUBLE PRECISION */ +/* > The vector (CSL, SNL) is a unit left singular vector for the */ +/* > singular value abs(SSMAX). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] SNR */ +/* > \verbatim */ +/* > SNR is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[out] CSR */ +/* > \verbatim */ +/* > CSR is DOUBLE PRECISION */ +/* > The vector (CSR, SNR) is a unit right singular vector for the */ +/* > singular value abs(SSMAX). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Any input parameter may be aliased with any output parameter. */ +/* > */ +/* > Barring over/underflow and assuming a guard digit in subtraction, all */ +/* > output quantities are correct to within a few units in the last */ +/* > place (ulps). */ +/* > */ +/* > In IEEE arithmetic, the code works correctly if one matrix element is */ +/* > infinite. */ +/* > */ +/* > Overflow will not occur unless the largest singular value itself */ +/* > overflows or is within a few ulps of overflow. (On machines with */ +/* > partial overflow, like the Cray, overflow may occur if the largest */ +/* > singular value is within a factor of 2 of overflow.) */ +/* > */ +/* > Underflow is harmless if underflow is gradual. Otherwise, results */ +/* > may correspond to a matrix modified by perturbations of size near */ +/* > the underflow threshold. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlasv2_(doublereal *f, doublereal *g, doublereal *h__, + doublereal *ssmin, doublereal *ssmax, doublereal *snr, doublereal * + csr, doublereal *snl, doublereal *csl) +{ + /* System generated locals */ + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal), d_sign(doublereal *, doublereal *); + + /* Local variables */ + doublereal a, d__, l, m, r__, s, t, fa, ga, ha, ft, gt, ht, mm, tt, clt, + crt, slt, srt; + integer pmax; + doublereal temp; + logical swap; + doublereal tsign; + extern doublereal dlamch_(char *, ftnlen); + logical gasmal; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + ft = *f; + fa = abs(ft); + ht = *h__; + ha = abs(*h__); + +/* PMAX points to the maximum absolute element of matrix */ +/* PMAX = 1 if F largest in absolute values */ +/* PMAX = 2 if G largest in absolute values */ +/* PMAX = 3 if H largest in absolute values */ + + pmax = 1; + swap = ha > fa; + if (swap) { + pmax = 3; + temp = ft; + ft = ht; + ht = temp; + temp = fa; + fa = ha; + ha = temp; + +/* Now FA .ge. HA */ + + } + gt = *g; + ga = abs(gt); + if (ga == 0.) { + +/* Diagonal matrix */ + + *ssmin = ha; + *ssmax = fa; + clt = 1.; + crt = 1.; + slt = 0.; + srt = 0.; + } else { + gasmal = TRUE_; + if (ga > fa) { + pmax = 2; + if (fa / ga < dlamch_((char *)"EPS", (ftnlen)3)) { + +/* Case of very large GA */ + + gasmal = FALSE_; + *ssmax = ga; + if (ha > 1.) { + *ssmin = fa / (ga / ha); + } else { + *ssmin = fa / ga * ha; + } + clt = 1.; + slt = ht / gt; + srt = 1.; + crt = ft / gt; + } + } + if (gasmal) { + +/* Normal case */ + + d__ = fa - ha; + if (d__ == fa) { + +/* Copes with infinite F or H */ + + l = 1.; + } else { + l = d__ / fa; + } + +/* Note that 0 .le. L .le. 1 */ + + m = gt / ft; + +/* Note that abs(M) .le. 1/macheps */ + + t = 2. - l; + +/* Note that T .ge. 1 */ + + mm = m * m; + tt = t * t; + s = sqrt(tt + mm); + +/* Note that 1 .le. S .le. 1 + 1/macheps */ + + if (l == 0.) { + r__ = abs(m); + } else { + r__ = sqrt(l * l + mm); + } + +/* Note that 0 .le. R .le. 1 + 1/macheps */ + + a = (s + r__) * .5; + +/* Note that 1 .le. A .le. 1 + abs(M) */ + + *ssmin = ha / a; + *ssmax = fa * a; + if (mm == 0.) { + +/* Note that M is very tiny */ + + if (l == 0.) { + t = d_sign(&c_b3, &ft) * d_sign(&c_b4, >); + } else { + t = gt / d_sign(&d__, &ft) + m / t; + } + } else { + t = (m / (s + t) + m / (r__ + l)) * (a + 1.); + } + l = sqrt(t * t + 4.); + crt = 2. / l; + srt = t / l; + clt = (crt + srt * m) / a; + slt = ht / ft * srt / a; + } + } + if (swap) { + *csl = srt; + *snl = crt; + *csr = slt; + *snr = clt; + } else { + *csl = clt; + *snl = slt; + *csr = crt; + *snr = srt; + } + +/* Correct signs of SSMAX and SSMIN */ + + if (pmax == 1) { + tsign = d_sign(&c_b4, csr) * d_sign(&c_b4, csl) * d_sign(&c_b4, f); + } + if (pmax == 2) { + tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, csl) * d_sign(&c_b4, g); + } + if (pmax == 3) { + tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, snl) * d_sign(&c_b4, h__); + } + *ssmax = d_sign(ssmax, &tsign); + d__1 = tsign * d_sign(&c_b4, f) * d_sign(&c_b4, h__); + *ssmin = d_sign(ssmin, &d__1); + return 0; + +/* End of DLASV2 */ + +} /* dlasv2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlaswp.cpp b/lib/linalg/dlaswp.cpp new file mode 100644 index 0000000000..db83b75947 --- /dev/null +++ b/lib/linalg/dlaswp.cpp @@ -0,0 +1,238 @@ +/* fortran/dlaswp.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLASWP performs a series of row interchanges on a general rectangular matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLASWP + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLASWP( N, A, LDA, K1, K2, IPIV, INCX ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX, K1, K2, LDA, N */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IPIV( * ) */ +/* DOUBLE PRECISION A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLASWP performs a series of row interchanges on the matrix A. */ +/* > One row interchange is initiated for each of rows K1 through K2 of A. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the matrix of column dimension N to which the row */ +/* > interchanges will be applied. */ +/* > On exit, the permuted matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K1 */ +/* > \verbatim */ +/* > K1 is INTEGER */ +/* > The first element of IPIV for which a row interchange will */ +/* > be done. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K2 */ +/* > \verbatim */ +/* > K2 is INTEGER */ +/* > (K2-K1+1) is the number of elements of IPIV for which a row */ +/* > interchange will be done. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] IPIV */ +/* > \verbatim */ +/* > IPIV is INTEGER array, dimension (K1+(K2-K1)*abs(INCX)) */ +/* > The vector of pivot indices. Only the elements in positions */ +/* > K1 through K1+(K2-K1)*abs(INCX) of IPIV are accessed. */ +/* > IPIV(K1+(K-K1)*abs(INCX)) = L implies rows K and L are to be */ +/* > interchanged. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > The increment between successive values of IPIV. If INCX */ +/* > is negative, the pivots are applied in reverse order. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Modified by */ +/* > R. C. Whaley, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlaswp_(integer *n, doublereal *a, integer *lda, integer + *k1, integer *k2, integer *ipiv, integer *incx) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + + /* Local variables */ + integer i__, j, k, i1, i2, n32, ip, ix, ix0, inc; + doublereal temp; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Interchange row I with row IPIV(K1+(I-K1)*abs(INCX)) for each of rows */ +/* K1 through K2. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --ipiv; + + /* Function Body */ + if (*incx > 0) { + ix0 = *k1; + i1 = *k1; + i2 = *k2; + inc = 1; + } else if (*incx < 0) { + ix0 = *k1 + (*k1 - *k2) * *incx; + i1 = *k2; + i2 = *k1; + inc = -1; + } else { + return 0; + } + + n32 = *n / 32 << 5; + if (n32 != 0) { + i__1 = n32; + for (j = 1; j <= i__1; j += 32) { + ix = ix0; + i__2 = i2; + i__3 = inc; + for (i__ = i1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) + { + ip = ipiv[ix]; + if (ip != i__) { + i__4 = j + 31; + for (k = j; k <= i__4; ++k) { + temp = a[i__ + k * a_dim1]; + a[i__ + k * a_dim1] = a[ip + k * a_dim1]; + a[ip + k * a_dim1] = temp; +/* L10: */ + } + } + ix += *incx; +/* L20: */ + } +/* L30: */ + } + } + if (n32 != *n) { + ++n32; + ix = ix0; + i__1 = i2; + i__3 = inc; + for (i__ = i1; i__3 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__3) { + ip = ipiv[ix]; + if (ip != i__) { + i__2 = *n; + for (k = n32; k <= i__2; ++k) { + temp = a[i__ + k * a_dim1]; + a[i__ + k * a_dim1] = a[ip + k * a_dim1]; + a[ip + k * a_dim1] = temp; +/* L40: */ + } + } + ix += *incx; +/* L50: */ + } + } + + return 0; + +/* End of DLASWP */ + +} /* dlaswp_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlatrd.cpp b/lib/linalg/dlatrd.cpp new file mode 100644 index 0000000000..b291e1adbf --- /dev/null +++ b/lib/linalg/dlatrd.cpp @@ -0,0 +1,445 @@ +/* fortran/dlatrd.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b5 = -1.; +static doublereal c_b6 = 1.; +static integer c__1 = 1; +static doublereal c_b16 = 0.; + +/* > \brief \b DLATRD reduces the first nb rows and columns of a symmetric/Hermitian matrix A to real tridiago +nal form by an orthogonal similarity transformation. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLATRD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER LDA, LDW, N, NB */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), E( * ), TAU( * ), W( LDW, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLATRD reduces NB rows and columns of a real symmetric matrix A to */ +/* > symmetric tridiagonal form by an orthogonal similarity */ +/* > transformation Q**T * A * Q, and returns the matrices V and W which are */ +/* > needed to apply the transformation to the unreduced part of A. */ +/* > */ +/* > If UPLO = 'U', DLATRD reduces the last NB rows and columns of a */ +/* > matrix, of which the upper triangle is supplied; */ +/* > if UPLO = 'L', DLATRD reduces the first NB rows and columns of a */ +/* > matrix, of which the lower triangle is supplied. */ +/* > */ +/* > This is an auxiliary routine called by DSYTRD. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies whether the upper or lower triangular part of the */ +/* > symmetric matrix A is stored: */ +/* > = 'U': Upper triangular */ +/* > = 'L': Lower triangular */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NB */ +/* > \verbatim */ +/* > NB is INTEGER */ +/* > The number of rows and columns to be reduced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ +/* > n-by-n upper triangular part of A contains the upper */ +/* > triangular part of the matrix A, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading n-by-n lower triangular part of A contains the lower */ +/* > triangular part of the matrix A, and the strictly upper */ +/* > triangular part of A is not referenced. */ +/* > On exit: */ +/* > if UPLO = 'U', the last NB columns have been reduced to */ +/* > tridiagonal form, with the diagonal elements overwriting */ +/* > the diagonal elements of A; the elements above the diagonal */ +/* > with the array TAU, represent the orthogonal matrix Q as a */ +/* > product of elementary reflectors; */ +/* > if UPLO = 'L', the first NB columns have been reduced to */ +/* > tridiagonal form, with the diagonal elements overwriting */ +/* > the diagonal elements of A; the elements below the diagonal */ +/* > with the array TAU, represent the orthogonal matrix Q as a */ +/* > product of elementary reflectors. */ +/* > See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= (1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal */ +/* > elements of the last NB columns of the reduced matrix; */ +/* > if UPLO = 'L', E(1:nb) contains the subdiagonal elements of */ +/* > the first NB columns of the reduced matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (N-1) */ +/* > The scalar factors of the elementary reflectors, stored in */ +/* > TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'. */ +/* > See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] W */ +/* > \verbatim */ +/* > W is DOUBLE PRECISION array, dimension (LDW,NB) */ +/* > The n-by-nb matrix W required to update the unreduced part */ +/* > of A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDW */ +/* > \verbatim */ +/* > LDW is INTEGER */ +/* > The leading dimension of the array W. LDW >= max(1,N). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > If UPLO = 'U', the matrix Q is represented as a product of elementary */ +/* > reflectors */ +/* > */ +/* > Q = H(n) H(n-1) . . . H(n-nb+1). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**T */ +/* > */ +/* > where tau is a real scalar, and v is a real vector with */ +/* > v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), */ +/* > and tau in TAU(i-1). */ +/* > */ +/* > If UPLO = 'L', the matrix Q is represented as a product of elementary */ +/* > reflectors */ +/* > */ +/* > Q = H(1) H(2) . . . H(nb). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**T */ +/* > */ +/* > where tau is a real scalar, and v is a real vector with */ +/* > v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), */ +/* > and tau in TAU(i). */ +/* > */ +/* > The elements of the vectors v together form the n-by-nb matrix V */ +/* > which is needed, with W, to apply the transformation to the unreduced */ +/* > part of the matrix, using a symmetric rank-2k update of the form: */ +/* > A := A - V*W**T - W*V**T. */ +/* > */ +/* > The contents of A on exit are illustrated by the following examples */ +/* > with n = 5 and nb = 2: */ +/* > */ +/* > if UPLO = 'U': if UPLO = 'L': */ +/* > */ +/* > ( a a a v4 v5 ) ( d ) */ +/* > ( a a v4 v5 ) ( 1 d ) */ +/* > ( a 1 v5 ) ( v1 1 a ) */ +/* > ( d 1 ) ( v1 v2 a a ) */ +/* > ( d ) ( v1 v2 a a a ) */ +/* > */ +/* > where d denotes a diagonal element of the reduced matrix, a denotes */ +/* > an element of the original matrix that is unchanged, and vi denotes */ +/* > an element of the vector defining H(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlatrd_(char *uplo, integer *n, integer *nb, doublereal * + a, integer *lda, doublereal *e, doublereal *tau, doublereal *w, + integer *ldw, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, iw; + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, + integer *); + doublereal alpha; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen), daxpy_(integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *), + dsymv_(char *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen), dlarfg_(integer *, doublereal *, doublereal *, integer *, + doublereal *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick return if possible */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --e; + --tau; + w_dim1 = *ldw; + w_offset = 1 + w_dim1; + w -= w_offset; + + /* Function Body */ + if (*n <= 0) { + return 0; + } + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + +/* Reduce last NB columns of upper triangle */ + + i__1 = *n - *nb + 1; + for (i__ = *n; i__ >= i__1; --i__) { + iw = i__ - *n + *nb; + if (i__ < *n) { + +/* Update A(1:i,i) */ + + i__2 = *n - i__; + dgemv_((char *)"No transpose", &i__, &i__2, &c_b5, &a[(i__ + 1) * + a_dim1 + 1], lda, &w[i__ + (iw + 1) * w_dim1], ldw, & + c_b6, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); + i__2 = *n - i__; + dgemv_((char *)"No transpose", &i__, &i__2, &c_b5, &w[(iw + 1) * + w_dim1 + 1], ldw, &a[i__ + (i__ + 1) * a_dim1], lda, & + c_b6, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); + } + if (i__ > 1) { + +/* Generate elementary reflector H(i) to annihilate */ +/* A(1:i-2,i) */ + + i__2 = i__ - 1; + dlarfg_(&i__2, &a[i__ - 1 + i__ * a_dim1], &a[i__ * a_dim1 + + 1], &c__1, &tau[i__ - 1]); + e[i__ - 1] = a[i__ - 1 + i__ * a_dim1]; + a[i__ - 1 + i__ * a_dim1] = 1.; + +/* Compute W(1:i-1,i) */ + + i__2 = i__ - 1; + dsymv_((char *)"Upper", &i__2, &c_b6, &a[a_offset], lda, &a[i__ * + a_dim1 + 1], &c__1, &c_b16, &w[iw * w_dim1 + 1], & + c__1, (ftnlen)5); + if (i__ < *n) { + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &w[(iw + 1) * + w_dim1 + 1], ldw, &a[i__ * a_dim1 + 1], &c__1, & + c_b16, &w[i__ + 1 + iw * w_dim1], &c__1, (ftnlen) + 9); + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[(i__ + 1) * + a_dim1 + 1], lda, &w[i__ + 1 + iw * w_dim1], & + c__1, &c_b6, &w[iw * w_dim1 + 1], &c__1, (ftnlen) + 12); + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &a[(i__ + 1) * + a_dim1 + 1], lda, &a[i__ * a_dim1 + 1], &c__1, & + c_b16, &w[i__ + 1 + iw * w_dim1], &c__1, (ftnlen) + 9); + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[(iw + 1) * + w_dim1 + 1], ldw, &w[i__ + 1 + iw * w_dim1], & + c__1, &c_b6, &w[iw * w_dim1 + 1], &c__1, (ftnlen) + 12); + } + i__2 = i__ - 1; + dscal_(&i__2, &tau[i__ - 1], &w[iw * w_dim1 + 1], &c__1); + i__2 = i__ - 1; + alpha = tau[i__ - 1] * -.5 * ddot_(&i__2, &w[iw * w_dim1 + 1], + &c__1, &a[i__ * a_dim1 + 1], &c__1); + i__2 = i__ - 1; + daxpy_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &w[iw * + w_dim1 + 1], &c__1); + } + +/* L10: */ + } + } else { + +/* Reduce first NB columns of lower triangle */ + + i__1 = *nb; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Update A(i:n,i) */ + + i__2 = *n - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + a_dim1], lda, + &w[i__ + w_dim1], ldw, &c_b6, &a[i__ + i__ * a_dim1], & + c__1, (ftnlen)12); + i__2 = *n - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[i__ + w_dim1], ldw, + &a[i__ + a_dim1], lda, &c_b6, &a[i__ + i__ * a_dim1], & + c__1, (ftnlen)12); + if (i__ < *n) { + +/* Generate elementary reflector H(i) to annihilate */ +/* A(i+2:n,i) */ + + i__2 = *n - i__; +/* Computing MIN */ + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*n) + + i__ * a_dim1], &c__1, &tau[i__]); + e[i__] = a[i__ + 1 + i__ * a_dim1]; + a[i__ + 1 + i__ * a_dim1] = 1.; + +/* Compute W(i+1:n,i) */ + + i__2 = *n - i__; + dsymv_((char *)"Lower", &i__2, &c_b6, &a[i__ + 1 + (i__ + 1) * a_dim1] + , lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ + i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)5); + i__2 = *n - i__; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &w[i__ + 1 + w_dim1], + ldw, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ + i__ * w_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *n - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + + a_dim1], lda, &w[i__ * w_dim1 + 1], &c__1, &c_b6, &w[ + i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); + i__2 = *n - i__; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &a[i__ + 1 + a_dim1], + lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ + i__ * w_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *n - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[i__ + 1 + + w_dim1], ldw, &w[i__ * w_dim1 + 1], &c__1, &c_b6, &w[ + i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); + i__2 = *n - i__; + dscal_(&i__2, &tau[i__], &w[i__ + 1 + i__ * w_dim1], &c__1); + i__2 = *n - i__; + alpha = tau[i__] * -.5 * ddot_(&i__2, &w[i__ + 1 + i__ * + w_dim1], &c__1, &a[i__ + 1 + i__ * a_dim1], &c__1); + i__2 = *n - i__; + daxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &w[ + i__ + 1 + i__ * w_dim1], &c__1); + } + +/* L20: */ + } + } + + return 0; + +/* End of DLATRD */ + +} /* dlatrd_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlatrs.cpp b/lib/linalg/dlatrs.cpp new file mode 100644 index 0000000000..0b68eac917 --- /dev/null +++ b/lib/linalg/dlatrs.cpp @@ -0,0 +1,984 @@ +/* fortran/dlatrs.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static doublereal c_b46 = .5; + +/* > \brief \b DLATRS solves a triangular system of equations with the scale factor set to prevent overflow. +*/ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DLATRS + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE, */ +/* CNORM, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER DIAG, NORMIN, TRANS, UPLO */ +/* INTEGER INFO, LDA, N */ +/* DOUBLE PRECISION SCALE */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), CNORM( * ), X( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DLATRS solves one of the triangular systems */ +/* > */ +/* > A *x = s*b or A**T *x = s*b */ +/* > */ +/* > with scaling to prevent overflow. Here A is an upper or lower */ +/* > triangular matrix, A**T denotes the transpose of A, x and b are */ +/* > n-element vectors, and s is a scaling factor, usually less than */ +/* > or equal to 1, chosen so that the components of x will be less than */ +/* > the overflow threshold. If the unscaled problem will not cause */ +/* > overflow, the Level 2 BLAS routine DTRSV is called. If the matrix A */ +/* > is singular (A(j,j) = 0 for some j), then s is set to 0 and a */ +/* > non-trivial solution to A*x = 0 is returned. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies whether the matrix A is upper or lower triangular. */ +/* > = 'U': Upper triangular */ +/* > = 'L': Lower triangular */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > Specifies the operation applied to A. */ +/* > = 'N': Solve A * x = s*b (No transpose) */ +/* > = 'T': Solve A**T* x = s*b (Transpose) */ +/* > = 'C': Solve A**T* x = s*b (Conjugate transpose = Transpose) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIAG */ +/* > \verbatim */ +/* > DIAG is CHARACTER*1 */ +/* > Specifies whether or not the matrix A is unit triangular. */ +/* > = 'N': Non-unit triangular */ +/* > = 'U': Unit triangular */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NORMIN */ +/* > \verbatim */ +/* > NORMIN is CHARACTER*1 */ +/* > Specifies whether CNORM has been set or not. */ +/* > = 'Y': CNORM contains the column norms on entry */ +/* > = 'N': CNORM is not set on entry. On exit, the norms will */ +/* > be computed and stored in CNORM. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > The triangular matrix A. If UPLO = 'U', the leading n by n */ +/* > upper triangular part of the array A contains the upper */ +/* > triangular matrix, and the strictly lower triangular part of */ +/* > A is not referenced. If UPLO = 'L', the leading n by n lower */ +/* > triangular part of the array A contains the lower triangular */ +/* > matrix, and the strictly upper triangular part of A is not */ +/* > referenced. If DIAG = 'U', the diagonal elements of A are */ +/* > also not referenced and are assumed to be 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max (1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the right hand side b of the triangular system. */ +/* > On exit, X is overwritten by the solution vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] SCALE */ +/* > \verbatim */ +/* > SCALE is DOUBLE PRECISION */ +/* > The scaling factor s for the triangular system */ +/* > A * x = s*b or A**T* x = s*b. */ +/* > If SCALE = 0, the matrix A is singular or badly scaled, and */ +/* > the vector x is an exact or approximate solution to A*x = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] CNORM */ +/* > \verbatim */ +/* > CNORM is DOUBLE PRECISION array, dimension (N) */ +/* > */ +/* > If NORMIN = 'Y', CNORM is an input argument and CNORM(j) */ +/* > contains the norm of the off-diagonal part of the j-th column */ +/* > of A. If TRANS = 'N', CNORM(j) must be greater than or equal */ +/* > to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j) */ +/* > must be greater than or equal to the 1-norm. */ +/* > */ +/* > If NORMIN = 'N', CNORM is an output argument and CNORM(j) */ +/* > returns the 1-norm of the offdiagonal part of the j-th column */ +/* > of A. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -k, the k-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > A rough bound on x is computed; if that is less than overflow, DTRSV */ +/* > is called, otherwise, specific code is used which checks for possible */ +/* > overflow or divide-by-zero at every operation. */ +/* > */ +/* > A columnwise scheme is used for solving A*x = b. The basic algorithm */ +/* > if A is lower triangular is */ +/* > */ +/* > x[1:n] := b[1:n] */ +/* > for j = 1, ..., n */ +/* > x(j) := x(j) / A(j,j) */ +/* > x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j] */ +/* > end */ +/* > */ +/* > Define bounds on the components of x after j iterations of the loop: */ +/* > M(j) = bound on x[1:j] */ +/* > G(j) = bound on x[j+1:n] */ +/* > Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}. */ +/* > */ +/* > Then for iteration j+1 we have */ +/* > M(j+1) <= G(j) / | A(j+1,j+1) | */ +/* > G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] | */ +/* > <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | ) */ +/* > */ +/* > where CNORM(j+1) is greater than or equal to the infinity-norm of */ +/* > column j+1 of A, not counting the diagonal. Hence */ +/* > */ +/* > G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | ) */ +/* > 1<=i<=j */ +/* > and */ +/* > */ +/* > |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| ) */ +/* > 1<=i< j */ +/* > */ +/* > Since |x(j)| <= M(j), we use the Level 2 BLAS routine DTRSV if the */ +/* > reciprocal of the largest M(j), j=1,..,n, is larger than */ +/* > max(underflow, 1/overflow). */ +/* > */ +/* > The bound on x(j) is also used to determine when a step in the */ +/* > columnwise method can be performed without fear of overflow. If */ +/* > the computed bound is greater than a large constant, x is scaled to */ +/* > prevent overflow, but if the bound overflows, x is set to 0, x(j) to */ +/* > 1, and scale to 0, and a non-trivial solution to A*x = 0 is found. */ +/* > */ +/* > Similarly, a row-wise scheme is used to solve A**T*x = b. The basic */ +/* > algorithm for A upper triangular is */ +/* > */ +/* > for j = 1, ..., n */ +/* > x(j) := ( b(j) - A[1:j-1,j]**T * x[1:j-1] ) / A(j,j) */ +/* > end */ +/* > */ +/* > We simultaneously compute two bounds */ +/* > G(j) = bound on ( b(i) - A[1:i-1,i]**T * x[1:i-1] ), 1<=i<=j */ +/* > M(j) = bound on x(i), 1<=i<=j */ +/* > */ +/* > The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we */ +/* > add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1. */ +/* > Then the bound on x(j) is */ +/* > */ +/* > M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) | */ +/* > */ +/* > <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| ) */ +/* > 1<=i<=j */ +/* > */ +/* > and we can safely call DTRSV if 1/M(n) and 1/G(n) are both greater */ +/* > than max(underflow, 1/overflow). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dlatrs_(char *uplo, char *trans, char *diag, char * + normin, integer *n, doublereal *a, integer *lda, doublereal *x, + doublereal *scale, doublereal *cnorm, integer *info, ftnlen uplo_len, + ftnlen trans_len, ftnlen diag_len, ftnlen normin_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + doublereal d__1, d__2, d__3; + + /* Local variables */ + integer i__, j; + doublereal xj, rec, tjj; + integer jinc; + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, + integer *); + doublereal xbnd; + integer imax; + doublereal tmax, tjjs, xmax, grow, sumj; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + doublereal tscal, uscal; + extern doublereal dasum_(integer *, doublereal *, integer *); + integer jlast; + extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *); + logical upper; + extern /* Subroutine */ int dtrsv_(char *, char *, char *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen); + extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, ftnlen); + extern integer idamax_(integer *, doublereal *, integer *); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + doublereal bignum; + logical notran; + integer jfirst; + doublereal smlnum; + logical nounit; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + --cnorm; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + +/* Test the input parameters. */ + + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && ! + lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (! nounit && ! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { + *info = -3; + } else if (! lsame_(normin, (char *)"Y", (ftnlen)1, (ftnlen)1) && ! lsame_(normin, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + *info = -4; + } else if (*n < 0) { + *info = -5; + } else if (*lda < max(1,*n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DLATRS", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + *scale = 1.; + if (*n == 0) { + return 0; + } + +/* Determine machine dependent parameters to control overflow. */ + + smlnum = dlamch_((char *)"Safe minimum", (ftnlen)12) / dlamch_((char *)"Precision", ( + ftnlen)9); + bignum = 1. / smlnum; + + if (lsame_(normin, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Compute the 1-norm of each column, not including the diagonal. */ + + if (upper) { + +/* A is upper triangular. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + cnorm[j] = dasum_(&i__2, &a[j * a_dim1 + 1], &c__1); +/* L10: */ + } + } else { + +/* A is lower triangular. */ + + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + i__2 = *n - j; + cnorm[j] = dasum_(&i__2, &a[j + 1 + j * a_dim1], &c__1); +/* L20: */ + } + cnorm[*n] = 0.; + } + } + +/* Scale the column norms by TSCAL if the maximum element in CNORM is */ +/* greater than BIGNUM. */ + + imax = idamax_(n, &cnorm[1], &c__1); + tmax = cnorm[imax]; + if (tmax <= bignum) { + tscal = 1.; + } else { + +/* Avoid NaN generation if entries in CNORM exceed the */ +/* overflow threshold */ + + if (tmax <= dlamch_((char *)"Overflow", (ftnlen)8)) { +/* Case 1: All entries in CNORM are valid floating-point numbers */ + tscal = 1. / (smlnum * tmax); + dscal_(n, &tscal, &cnorm[1], &c__1); + } else { +/* Case 2: At least one column norm of A cannot be represented */ +/* as floating-point number. Find the offdiagonal entry A( I, J ) */ +/* with the largest absolute value. If this entry is not +/- Infinity, */ +/* use this value as TSCAL. */ + tmax = 0.; + if (upper) { + +/* A is upper triangular. */ + + i__1 = *n; + for (j = 2; j <= i__1; ++j) { +/* Computing MAX */ + i__2 = j - 1; + d__1 = dlange_((char *)"M", &i__2, &c__1, &a[j * a_dim1 + 1], & + c__1, &sumj, (ftnlen)1); + tmax = max(d__1,tmax); + } + } else { + +/* A is lower triangular. */ + + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { +/* Computing MAX */ + i__2 = *n - j; + d__1 = dlange_((char *)"M", &i__2, &c__1, &a[j + 1 + j * a_dim1], + &c__1, &sumj, (ftnlen)1); + tmax = max(d__1,tmax); + } + } + + if (tmax <= dlamch_((char *)"Overflow", (ftnlen)8)) { + tscal = 1. / (smlnum * tmax); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (cnorm[j] <= dlamch_((char *)"Overflow", (ftnlen)8)) { + cnorm[j] *= tscal; + } else { +/* Recompute the 1-norm without introducing Infinity */ +/* in the summation */ + cnorm[j] = 0.; + if (upper) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + cnorm[j] += tscal * (d__1 = a[i__ + j * + a_dim1], abs(d__1)); + } + } else { + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + cnorm[j] += tscal * (d__1 = a[i__ + j * + a_dim1], abs(d__1)); + } + } + } + } + } else { +/* At least one entry of A is not a valid floating-point entry. */ +/* Rely on TRSV to propagate Inf and NaN. */ + dtrsv_(uplo, trans, diag, n, &a[a_offset], lda, &x[1], &c__1, + (ftnlen)1, (ftnlen)1, (ftnlen)1); + return 0; + } + } + } + +/* Compute a bound on the computed solution vector to see if the */ +/* Level 2 BLAS routine DTRSV can be used. */ + + j = idamax_(n, &x[1], &c__1); + xmax = (d__1 = x[j], abs(d__1)); + xbnd = xmax; + if (notran) { + +/* Compute the growth in A * x = b. */ + + if (upper) { + jfirst = *n; + jlast = 1; + jinc = -1; + } else { + jfirst = 1; + jlast = *n; + jinc = 1; + } + + if (tscal != 1.) { + grow = 0.; + goto L50; + } + + if (nounit) { + +/* A is non-unit triangular. */ + +/* Compute GROW = 1/G(j) and XBND = 1/M(j). */ +/* Initially, G(0) = max{x(i), i=1,...,n}. */ + + grow = 1. / max(xbnd,smlnum); + xbnd = grow; + i__1 = jlast; + i__2 = jinc; + for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + +/* Exit the loop if the growth factor is too small. */ + + if (grow <= smlnum) { + goto L50; + } + +/* M(j) = G(j-1) / abs(A(j,j)) */ + + tjj = (d__1 = a[j + j * a_dim1], abs(d__1)); +/* Computing MIN */ + d__1 = xbnd, d__2 = min(1.,tjj) * grow; + xbnd = min(d__1,d__2); + if (tjj + cnorm[j] >= smlnum) { + +/* G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) ) */ + + grow *= tjj / (tjj + cnorm[j]); + } else { + +/* G(j) could overflow, set GROW to 0. */ + + grow = 0.; + } +/* L30: */ + } + grow = xbnd; + } else { + +/* A is unit triangular. */ + +/* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. */ + +/* Computing MIN */ + d__1 = 1., d__2 = 1. / max(xbnd,smlnum); + grow = min(d__1,d__2); + i__2 = jlast; + i__1 = jinc; + for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { + +/* Exit the loop if the growth factor is too small. */ + + if (grow <= smlnum) { + goto L50; + } + +/* G(j) = G(j-1)*( 1 + CNORM(j) ) */ + + grow *= 1. / (cnorm[j] + 1.); +/* L40: */ + } + } +L50: + + ; + } else { + +/* Compute the growth in A**T * x = b. */ + + if (upper) { + jfirst = 1; + jlast = *n; + jinc = 1; + } else { + jfirst = *n; + jlast = 1; + jinc = -1; + } + + if (tscal != 1.) { + grow = 0.; + goto L80; + } + + if (nounit) { + +/* A is non-unit triangular. */ + +/* Compute GROW = 1/G(j) and XBND = 1/M(j). */ +/* Initially, M(0) = max{x(i), i=1,...,n}. */ + + grow = 1. / max(xbnd,smlnum); + xbnd = grow; + i__1 = jlast; + i__2 = jinc; + for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + +/* Exit the loop if the growth factor is too small. */ + + if (grow <= smlnum) { + goto L80; + } + +/* G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) ) */ + + xj = cnorm[j] + 1.; +/* Computing MIN */ + d__1 = grow, d__2 = xbnd / xj; + grow = min(d__1,d__2); + +/* M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j)) */ + + tjj = (d__1 = a[j + j * a_dim1], abs(d__1)); + if (xj > tjj) { + xbnd *= tjj / xj; + } +/* L60: */ + } + grow = min(grow,xbnd); + } else { + +/* A is unit triangular. */ + +/* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. */ + +/* Computing MIN */ + d__1 = 1., d__2 = 1. / max(xbnd,smlnum); + grow = min(d__1,d__2); + i__2 = jlast; + i__1 = jinc; + for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { + +/* Exit the loop if the growth factor is too small. */ + + if (grow <= smlnum) { + goto L80; + } + +/* G(j) = ( 1 + CNORM(j) )*G(j-1) */ + + xj = cnorm[j] + 1.; + grow /= xj; +/* L70: */ + } + } +L80: + ; + } + + if (grow * tscal > smlnum) { + +/* Use the Level 2 BLAS solve if the reciprocal of the bound on */ +/* elements of X is not too small. */ + + dtrsv_(uplo, trans, diag, n, &a[a_offset], lda, &x[1], &c__1, (ftnlen) + 1, (ftnlen)1, (ftnlen)1); + } else { + +/* Use a Level 1 BLAS solve, scaling intermediate results. */ + + if (xmax > bignum) { + +/* Scale X so that its components are less than or equal to */ +/* BIGNUM in absolute value. */ + + *scale = bignum / xmax; + dscal_(n, scale, &x[1], &c__1); + xmax = bignum; + } + + if (notran) { + +/* Solve A * x = b */ + + i__1 = jlast; + i__2 = jinc; + for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + +/* Compute x(j) = b(j) / A(j,j), scaling x if necessary. */ + + xj = (d__1 = x[j], abs(d__1)); + if (nounit) { + tjjs = a[j + j * a_dim1] * tscal; + } else { + tjjs = tscal; + if (tscal == 1.) { + goto L100; + } + } + tjj = abs(tjjs); + if (tjj > smlnum) { + +/* abs(A(j,j)) > SMLNUM: */ + + if (tjj < 1.) { + if (xj > tjj * bignum) { + +/* Scale x by 1/b(j). */ + + rec = 1. / xj; + dscal_(n, &rec, &x[1], &c__1); + *scale *= rec; + xmax *= rec; + } + } + x[j] /= tjjs; + xj = (d__1 = x[j], abs(d__1)); + } else if (tjj > 0.) { + +/* 0 < abs(A(j,j)) <= SMLNUM: */ + + if (xj > tjj * bignum) { + +/* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM */ +/* to avoid overflow when dividing by A(j,j). */ + + rec = tjj * bignum / xj; + if (cnorm[j] > 1.) { + +/* Scale by 1/CNORM(j) to avoid overflow when */ +/* multiplying x(j) times column j. */ + + rec /= cnorm[j]; + } + dscal_(n, &rec, &x[1], &c__1); + *scale *= rec; + xmax *= rec; + } + x[j] /= tjjs; + xj = (d__1 = x[j], abs(d__1)); + } else { + +/* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and */ +/* scale = 0, and compute a solution to A*x = 0. */ + + i__3 = *n; + for (i__ = 1; i__ <= i__3; ++i__) { + x[i__] = 0.; +/* L90: */ + } + x[j] = 1.; + xj = 1.; + *scale = 0.; + xmax = 0.; + } +L100: + +/* Scale x if necessary to avoid overflow when adding a */ +/* multiple of column j of A. */ + + if (xj > 1.) { + rec = 1. / xj; + if (cnorm[j] > (bignum - xmax) * rec) { + +/* Scale x by 1/(2*abs(x(j))). */ + + rec *= .5; + dscal_(n, &rec, &x[1], &c__1); + *scale *= rec; + } + } else if (xj * cnorm[j] > bignum - xmax) { + +/* Scale x by 1/2. */ + + dscal_(n, &c_b46, &x[1], &c__1); + *scale *= .5; + } + + if (upper) { + if (j > 1) { + +/* Compute the update */ +/* x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j) */ + + i__3 = j - 1; + d__1 = -x[j] * tscal; + daxpy_(&i__3, &d__1, &a[j * a_dim1 + 1], &c__1, &x[1], + &c__1); + i__3 = j - 1; + i__ = idamax_(&i__3, &x[1], &c__1); + xmax = (d__1 = x[i__], abs(d__1)); + } + } else { + if (j < *n) { + +/* Compute the update */ +/* x(j+1:n) := x(j+1:n) - x(j) * A(j+1:n,j) */ + + i__3 = *n - j; + d__1 = -x[j] * tscal; + daxpy_(&i__3, &d__1, &a[j + 1 + j * a_dim1], &c__1, & + x[j + 1], &c__1); + i__3 = *n - j; + i__ = j + idamax_(&i__3, &x[j + 1], &c__1); + xmax = (d__1 = x[i__], abs(d__1)); + } + } +/* L110: */ + } + + } else { + +/* Solve A**T * x = b */ + + i__2 = jlast; + i__1 = jinc; + for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { + +/* Compute x(j) = b(j) - sum A(k,j)*x(k). */ +/* k<>j */ + + xj = (d__1 = x[j], abs(d__1)); + uscal = tscal; + rec = 1. / max(xmax,1.); + if (cnorm[j] > (bignum - xj) * rec) { + +/* If x(j) could overflow, scale x by 1/(2*XMAX). */ + + rec *= .5; + if (nounit) { + tjjs = a[j + j * a_dim1] * tscal; + } else { + tjjs = tscal; + } + tjj = abs(tjjs); + if (tjj > 1.) { + +/* Divide by A(j,j) when scaling x if A(j,j) > 1. */ + +/* Computing MIN */ + d__1 = 1., d__2 = rec * tjj; + rec = min(d__1,d__2); + uscal /= tjjs; + } + if (rec < 1.) { + dscal_(n, &rec, &x[1], &c__1); + *scale *= rec; + xmax *= rec; + } + } + + sumj = 0.; + if (uscal == 1.) { + +/* If the scaling needed for A in the dot product is 1, */ +/* call DDOT to perform the dot product. */ + + if (upper) { + i__3 = j - 1; + sumj = ddot_(&i__3, &a[j * a_dim1 + 1], &c__1, &x[1], + &c__1); + } else if (j < *n) { + i__3 = *n - j; + sumj = ddot_(&i__3, &a[j + 1 + j * a_dim1], &c__1, &x[ + j + 1], &c__1); + } + } else { + +/* Otherwise, use in-line code for the dot product. */ + + if (upper) { + i__3 = j - 1; + for (i__ = 1; i__ <= i__3; ++i__) { + sumj += a[i__ + j * a_dim1] * uscal * x[i__]; +/* L120: */ + } + } else if (j < *n) { + i__3 = *n; + for (i__ = j + 1; i__ <= i__3; ++i__) { + sumj += a[i__ + j * a_dim1] * uscal * x[i__]; +/* L130: */ + } + } + } + + if (uscal == tscal) { + +/* Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j) */ +/* was not used to scale the dotproduct. */ + + x[j] -= sumj; + xj = (d__1 = x[j], abs(d__1)); + if (nounit) { + tjjs = a[j + j * a_dim1] * tscal; + } else { + tjjs = tscal; + if (tscal == 1.) { + goto L150; + } + } + +/* Compute x(j) = x(j) / A(j,j), scaling if necessary. */ + + tjj = abs(tjjs); + if (tjj > smlnum) { + +/* abs(A(j,j)) > SMLNUM: */ + + if (tjj < 1.) { + if (xj > tjj * bignum) { + +/* Scale X by 1/abs(x(j)). */ + + rec = 1. / xj; + dscal_(n, &rec, &x[1], &c__1); + *scale *= rec; + xmax *= rec; + } + } + x[j] /= tjjs; + } else if (tjj > 0.) { + +/* 0 < abs(A(j,j)) <= SMLNUM: */ + + if (xj > tjj * bignum) { + +/* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM. */ + + rec = tjj * bignum / xj; + dscal_(n, &rec, &x[1], &c__1); + *scale *= rec; + xmax *= rec; + } + x[j] /= tjjs; + } else { + +/* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and */ +/* scale = 0, and compute a solution to A**T*x = 0. */ + + i__3 = *n; + for (i__ = 1; i__ <= i__3; ++i__) { + x[i__] = 0.; +/* L140: */ + } + x[j] = 1.; + *scale = 0.; + xmax = 0.; + } +L150: + ; + } else { + +/* Compute x(j) := x(j) / A(j,j) - sumj if the dot */ +/* product has already been divided by 1/A(j,j). */ + + x[j] = x[j] / tjjs - sumj; + } +/* Computing MAX */ + d__2 = xmax, d__3 = (d__1 = x[j], abs(d__1)); + xmax = max(d__2,d__3); +/* L160: */ + } + } + *scale /= tscal; + } + +/* Scale the column norms by 1/TSCAL for return. */ + + if (tscal != 1.) { + d__1 = 1. / tscal; + dscal_(n, &d__1, &cnorm[1], &c__1); + } + + return 0; + +/* End of DLATRS */ + +} /* dlatrs_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dnrm2.cpp b/lib/linalg/dnrm2.cpp new file mode 100644 index 0000000000..6ebf2d935e --- /dev/null +++ b/lib/linalg/dnrm2.cpp @@ -0,0 +1,169 @@ +/* fortran/dnrm2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DNRM2 */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* DOUBLE PRECISION FUNCTION DNRM2(N,X,INCX) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION X(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DNRM2 returns the euclidean norm of a vector via the function */ +/* > name, so that */ +/* > */ +/* > DNRM2 := sqrt( x'*x ) */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of DX */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \date December 2016 */ + +/* > \ingroup double_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > -- This version written on 25-October-1982. */ +/* > Modified on 14-October-1993 to inline the call to DLASSQ. */ +/* > Sven Hammarling, Nag Ltd. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +doublereal dnrm2_(integer *n, doublereal *x, integer *incx) +{ + /* System generated locals */ + integer i__1, i__2; + doublereal ret_val, d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + integer ix; + doublereal ssq, norm, scale, absxi; + + +/* -- Reference BLAS level1 routine (version 3.7.0) -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ +/* December 2016 */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + /* Parameter adjustments */ + --x; + + /* Function Body */ + if (*n < 1 || *incx < 1) { + norm = 0.; + } else if (*n == 1) { + norm = abs(x[1]); + } else { + scale = 0.; + ssq = 1.; +/* The following loop is equivalent to this call to the LAPACK */ +/* auxiliary routine: */ +/* CALL DLASSQ( N, X, INCX, SCALE, SSQ ) */ + + i__1 = (*n - 1) * *incx + 1; + i__2 = *incx; + for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { + if (x[ix] != 0.) { + absxi = (d__1 = x[ix], abs(d__1)); + if (scale < absxi) { +/* Computing 2nd power */ + d__1 = scale / absxi; + ssq = ssq * (d__1 * d__1) + 1.; + scale = absxi; + } else { +/* Computing 2nd power */ + d__1 = absxi / scale; + ssq += d__1 * d__1; + } + } +/* L10: */ + } + norm = scale * sqrt(ssq); + } + + ret_val = norm; + return ret_val; + +/* End of DNRM2. */ + +} /* dnrm2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dorg2l.cpp b/lib/linalg/dorg2l.cpp new file mode 100644 index 0000000000..5705f3b630 --- /dev/null +++ b/lib/linalg/dorg2l.cpp @@ -0,0 +1,252 @@ +/* fortran/dorg2l.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DORG2L generates all or part of the orthogonal matrix Q from a QL factorization determined by s +geqlf (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORG2L + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORG2L( M, N, K, A, LDA, TAU, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORG2L generates an m by n real matrix Q with orthonormal columns, */ +/* > which is defined as the last n columns of a product of k elementary */ +/* > reflectors of order m */ +/* > */ +/* > Q = H(k) . . . H(2) H(1) */ +/* > */ +/* > as returned by DGEQLF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix Q. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix Q. M >= N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines the */ +/* > matrix Q. N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the (n-k+i)-th column must contain the vector which */ +/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ +/* > returned by DGEQLF in the last k columns of its array */ +/* > argument A. */ +/* > On exit, the m by n matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The first dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DGEQLF. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument has an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dorg2l_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + doublereal d__1; + + /* Local variables */ + integer i__, j, l, ii; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dlarf_(char *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + ftnlen), xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < 0 || *n > *m) { + *info = -2; + } else if (*k < 0 || *k > *n) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORG2L", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n <= 0) { + return 0; + } + +/* Initialise columns 1:n-k to columns of the unit matrix */ + + i__1 = *n - *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (l = 1; l <= i__2; ++l) { + a[l + j * a_dim1] = 0.; +/* L10: */ + } + a[*m - *n + j + j * a_dim1] = 1.; +/* L20: */ + } + + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + ii = *n - *k + i__; + +/* Apply H(i) to A(1:m-k+i,1:n-k+i) from the left */ + + a[*m - *n + ii + ii * a_dim1] = 1.; + i__2 = *m - *n + ii; + i__3 = ii - 1; + dlarf_((char *)"Left", &i__2, &i__3, &a[ii * a_dim1 + 1], &c__1, &tau[i__], & + a[a_offset], lda, &work[1], (ftnlen)4); + i__2 = *m - *n + ii - 1; + d__1 = -tau[i__]; + dscal_(&i__2, &d__1, &a[ii * a_dim1 + 1], &c__1); + a[*m - *n + ii + ii * a_dim1] = 1. - tau[i__]; + +/* Set A(m-k+i+1:m,n-k+i) to zero */ + + i__2 = *m; + for (l = *m - *n + ii + 1; l <= i__2; ++l) { + a[l + ii * a_dim1] = 0.; +/* L30: */ + } +/* L40: */ + } + return 0; + +/* End of DORG2L */ + +} /* dorg2l_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dorg2r.cpp b/lib/linalg/dorg2r.cpp new file mode 100644 index 0000000000..90ebed3963 --- /dev/null +++ b/lib/linalg/dorg2r.cpp @@ -0,0 +1,255 @@ +/* fortran/dorg2r.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DORG2R generates all or part of the orthogonal matrix Q from a QR factorization determined by s +geqrf (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORG2R + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORG2R( M, N, K, A, LDA, TAU, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORG2R generates an m by n real matrix Q with orthonormal columns, */ +/* > which is defined as the first n columns of a product of k elementary */ +/* > reflectors of order m */ +/* > */ +/* > Q = H(1) H(2) . . . H(k) */ +/* > */ +/* > as returned by DGEQRF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix Q. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix Q. M >= N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines the */ +/* > matrix Q. N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the i-th column must contain the vector which */ +/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ +/* > returned by DGEQRF in the first k columns of its array */ +/* > argument A. */ +/* > On exit, the m-by-n matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The first dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DGEQRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument has an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dorg2r_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + doublereal d__1; + + /* Local variables */ + integer i__, j, l; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dlarf_(char *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + ftnlen), xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < 0 || *n > *m) { + *info = -2; + } else if (*k < 0 || *k > *n) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORG2R", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n <= 0) { + return 0; + } + +/* Initialise columns k+1:n to columns of the unit matrix */ + + i__1 = *n; + for (j = *k + 1; j <= i__1; ++j) { + i__2 = *m; + for (l = 1; l <= i__2; ++l) { + a[l + j * a_dim1] = 0.; +/* L10: */ + } + a[j + j * a_dim1] = 1.; +/* L20: */ + } + + for (i__ = *k; i__ >= 1; --i__) { + +/* Apply H(i) to A(i:m,i:n) from the left */ + + if (i__ < *n) { + a[i__ + i__ * a_dim1] = 1.; + i__1 = *m - i__ + 1; + i__2 = *n - i__; + dlarf_((char *)"Left", &i__1, &i__2, &a[i__ + i__ * a_dim1], &c__1, &tau[ + i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], ( + ftnlen)4); + } + if (i__ < *m) { + i__1 = *m - i__; + d__1 = -tau[i__]; + dscal_(&i__1, &d__1, &a[i__ + 1 + i__ * a_dim1], &c__1); + } + a[i__ + i__ * a_dim1] = 1. - tau[i__]; + +/* Set A(1:i-1,i) to zero */ + + i__1 = i__ - 1; + for (l = 1; l <= i__1; ++l) { + a[l + i__ * a_dim1] = 0.; +/* L30: */ + } +/* L40: */ + } + return 0; + +/* End of DORG2R */ + +} /* dorg2r_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dorgbr.cpp b/lib/linalg/dorgbr.cpp new file mode 100644 index 0000000000..4991344c01 --- /dev/null +++ b/lib/linalg/dorgbr.cpp @@ -0,0 +1,404 @@ +/* fortran/dorgbr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c_n1 = -1; + +/* > \brief \b DORGBR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORGBR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORGBR( VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER VECT */ +/* INTEGER INFO, K, LDA, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORGBR generates one of the real orthogonal matrices Q or P**T */ +/* > determined by DGEBRD when reducing a real matrix A to bidiagonal */ +/* > form: A = Q * B * P**T. Q and P**T are defined as products of */ +/* > elementary reflectors H(i) or G(i) respectively. */ +/* > */ +/* > If VECT = 'Q', A is assumed to have been an M-by-K matrix, and Q */ +/* > is of order M: */ +/* > if m >= k, Q = H(1) H(2) . . . H(k) and DORGBR returns the first n */ +/* > columns of Q, where m >= n >= k; */ +/* > if m < k, Q = H(1) H(2) . . . H(m-1) and DORGBR returns Q as an */ +/* > M-by-M matrix. */ +/* > */ +/* > If VECT = 'P', A is assumed to have been a K-by-N matrix, and P**T */ +/* > is of order N: */ +/* > if k < n, P**T = G(k) . . . G(2) G(1) and DORGBR returns the first m */ +/* > rows of P**T, where n >= m >= k; */ +/* > if k >= n, P**T = G(n-1) . . . G(2) G(1) and DORGBR returns P**T as */ +/* > an N-by-N matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] VECT */ +/* > \verbatim */ +/* > VECT is CHARACTER*1 */ +/* > Specifies whether the matrix Q or the matrix P**T is */ +/* > required, as defined in the transformation applied by DGEBRD: */ +/* > = 'Q': generate Q; */ +/* > = 'P': generate P**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix Q or P**T to be returned. */ +/* > M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix Q or P**T to be returned. */ +/* > N >= 0. */ +/* > If VECT = 'Q', M >= N >= min(M,K); */ +/* > if VECT = 'P', N >= M >= min(N,K). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > If VECT = 'Q', the number of columns in the original M-by-K */ +/* > matrix reduced by DGEBRD. */ +/* > If VECT = 'P', the number of rows in the original K-by-N */ +/* > matrix reduced by DGEBRD. */ +/* > K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the vectors which define the elementary reflectors, */ +/* > as returned by DGEBRD. */ +/* > On exit, the M-by-N matrix Q or P**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension */ +/* > (min(M,K)) if VECT = 'Q' */ +/* > (min(N,K)) if VECT = 'P' */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i) or G(i), which determines Q or P**T, as */ +/* > returned by DGEBRD in its array argument TAUQ or TAUP. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= max(1,min(M,N)). */ +/* > For optimum performance LWORK >= min(M,N)*NB, where NB */ +/* > is the optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleGBcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dorgbr_(char *vect, integer *m, integer *n, integer *k, + doublereal *a, integer *lda, doublereal *tau, doublereal *work, + integer *lwork, integer *info, ftnlen vect_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, j, mn; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo; + logical wantq; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dorglq_( + integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *), dorgqr_( + integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *); + integer lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + wantq = lsame_(vect, (char *)"Q", (ftnlen)1, (ftnlen)1); + mn = min(*m,*n); + lquery = *lwork == -1; + if (! wantq && ! lsame_(vect, (char *)"P", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*m < 0) { + *info = -2; + } else if (*n < 0 || wantq && (*n > *m || *n < min(*m,*k)) || ! wantq && ( + *m > *n || *m < min(*n,*k))) { + *info = -3; + } else if (*k < 0) { + *info = -4; + } else if (*lda < max(1,*m)) { + *info = -6; + } else if (*lwork < max(1,mn) && ! lquery) { + *info = -9; + } + + if (*info == 0) { + work[1] = 1.; + if (wantq) { + if (*m >= *k) { + dorgqr_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], &c_n1, + &iinfo); + } else { + if (*m > 1) { + i__1 = *m - 1; + i__2 = *m - 1; + i__3 = *m - 1; + dorgqr_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], & + work[1], &c_n1, &iinfo); + } + } + } else { + if (*k < *n) { + dorglq_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], &c_n1, + &iinfo); + } else { + if (*n > 1) { + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + dorglq_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], & + work[1], &c_n1, &iinfo); + } + } + } + lwkopt = (integer) work[1]; + lwkopt = max(lwkopt,mn); + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORGBR", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + work[1] = (doublereal) lwkopt; + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0) { + work[1] = 1.; + return 0; + } + + if (wantq) { + +/* Form Q, determined by a call to DGEBRD to reduce an m-by-k */ +/* matrix */ + + if (*m >= *k) { + +/* If m >= k, assume m >= n >= k */ + + dorgqr_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, & + iinfo); + + } else { + +/* If m < k, assume m = n */ + +/* Shift the vectors which define the elementary reflectors one */ +/* column to the right, and set the first row and column of Q */ +/* to those of the unit matrix */ + + for (j = *m; j >= 2; --j) { + a[j * a_dim1 + 1] = 0.; + i__1 = *m; + for (i__ = j + 1; i__ <= i__1; ++i__) { + a[i__ + j * a_dim1] = a[i__ + (j - 1) * a_dim1]; +/* L10: */ + } +/* L20: */ + } + a[a_dim1 + 1] = 1.; + i__1 = *m; + for (i__ = 2; i__ <= i__1; ++i__) { + a[i__ + a_dim1] = 0.; +/* L30: */ + } + if (*m > 1) { + +/* Form Q(2:m,2:m) */ + + i__1 = *m - 1; + i__2 = *m - 1; + i__3 = *m - 1; + dorgqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[ + 1], &work[1], lwork, &iinfo); + } + } + } else { + +/* Form P**T, determined by a call to DGEBRD to reduce a k-by-n */ +/* matrix */ + + if (*k < *n) { + +/* If k < n, assume k <= m <= n */ + + dorglq_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, & + iinfo); + + } else { + +/* If k >= n, assume m = n */ + +/* Shift the vectors which define the elementary reflectors one */ +/* row downward, and set the first row and column of P**T to */ +/* those of the unit matrix */ + + a[a_dim1 + 1] = 1.; + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + a[i__ + a_dim1] = 0.; +/* L40: */ + } + i__1 = *n; + for (j = 2; j <= i__1; ++j) { + for (i__ = j - 1; i__ >= 2; --i__) { + a[i__ + j * a_dim1] = a[i__ - 1 + j * a_dim1]; +/* L50: */ + } + a[j * a_dim1 + 1] = 0.; +/* L60: */ + } + if (*n > 1) { + +/* Form P**T(2:n,2:n) */ + + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + dorglq_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[ + 1], &work[1], lwork, &iinfo); + } + } + } + work[1] = (doublereal) lwkopt; + return 0; + +/* End of DORGBR */ + +} /* dorgbr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dorgl2.cpp b/lib/linalg/dorgl2.cpp new file mode 100644 index 0000000000..a2cce985f3 --- /dev/null +++ b/lib/linalg/dorgl2.cpp @@ -0,0 +1,254 @@ +/* fortran/dorgl2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DORGL2 */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORGL2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORGL2( M, N, K, A, LDA, TAU, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORGL2 generates an m by n real matrix Q with orthonormal rows, */ +/* > which is defined as the first m rows of a product of k elementary */ +/* > reflectors of order n */ +/* > */ +/* > Q = H(k) . . . H(2) H(1) */ +/* > */ +/* > as returned by DGELQF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix Q. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix Q. N >= M. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines the */ +/* > matrix Q. M >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the i-th row must contain the vector which defines */ +/* > the elementary reflector H(i), for i = 1,2,...,k, as returned */ +/* > by DGELQF in the first k rows of its array argument A. */ +/* > On exit, the m-by-n matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The first dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DGELQF. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (M) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument has an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dorgl2_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + doublereal d__1; + + /* Local variables */ + integer i__, j, l; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dlarf_(char *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + ftnlen), xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < *m) { + *info = -2; + } else if (*k < 0 || *k > *m) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORGL2", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*m <= 0) { + return 0; + } + + if (*k < *m) { + +/* Initialise rows k+1:m to rows of the unit matrix */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (l = *k + 1; l <= i__2; ++l) { + a[l + j * a_dim1] = 0.; +/* L10: */ + } + if (j > *k && j <= *m) { + a[j + j * a_dim1] = 1.; + } +/* L20: */ + } + } + + for (i__ = *k; i__ >= 1; --i__) { + +/* Apply H(i) to A(i:m,i:n) from the right */ + + if (i__ < *n) { + if (i__ < *m) { + a[i__ + i__ * a_dim1] = 1.; + i__1 = *m - i__; + i__2 = *n - i__ + 1; + dlarf_((char *)"Right", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, & + tau[i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1], ( + ftnlen)5); + } + i__1 = *n - i__; + d__1 = -tau[i__]; + dscal_(&i__1, &d__1, &a[i__ + (i__ + 1) * a_dim1], lda); + } + a[i__ + i__ * a_dim1] = 1. - tau[i__]; + +/* Set A(i,1:i-1) to zero */ + + i__1 = i__ - 1; + for (l = 1; l <= i__1; ++l) { + a[i__ + l * a_dim1] = 0.; +/* L30: */ + } +/* L40: */ + } + return 0; + +/* End of DORGL2 */ + +} /* dorgl2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dorglq.cpp b/lib/linalg/dorglq.cpp new file mode 100644 index 0000000000..3dc2d1986c --- /dev/null +++ b/lib/linalg/dorglq.cpp @@ -0,0 +1,366 @@ +/* fortran/dorglq.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__3 = 3; +static integer c__2 = 2; + +/* > \brief \b DORGLQ */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORGLQ + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDA, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORGLQ generates an M-by-N real matrix Q with orthonormal rows, */ +/* > which is defined as the first M rows of a product of K elementary */ +/* > reflectors of order N */ +/* > */ +/* > Q = H(k) . . . H(2) H(1) */ +/* > */ +/* > as returned by DGELQF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix Q. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix Q. N >= M. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines the */ +/* > matrix Q. M >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the i-th row must contain the vector which defines */ +/* > the elementary reflector H(i), for i = 1,2,...,k, as returned */ +/* > by DGELQF in the first k rows of its array argument A. */ +/* > On exit, the M-by-N matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The first dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DGELQF. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= max(1,M). */ +/* > For optimum performance LWORK >= M*NB, where NB is */ +/* > the optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument has an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dorglq_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, + integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo; + extern /* Subroutine */ int dorgl2_(integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *), + dlarfb_(char *, char *, char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen, ftnlen), dlarft_(char *, char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + integer ldwork, lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + nb = ilaenv_(&c__1, (char *)"DORGLQ", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + lwkopt = max(1,*m) * nb; + work[1] = (doublereal) lwkopt; + lquery = *lwork == -1; + if (*m < 0) { + *info = -1; + } else if (*n < *m) { + *info = -2; + } else if (*k < 0 || *k > *m) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } else if (*lwork < max(1,*m) && ! lquery) { + *info = -8; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORGLQ", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*m <= 0) { + work[1] = 1.; + return 0; + } + + nbmin = 2; + nx = 0; + iws = *m; + if (nb > 1 && nb < *k) { + +/* Determine when to cross over from blocked to unblocked code. */ + +/* Computing MAX */ + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGLQ", (char *)" ", m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *k) { + +/* Determine if workspace is large enough for blocked code. */ + + ldwork = *m; + iws = ldwork * nb; + if (*lwork < iws) { + +/* Not enough workspace to use optimal NB: reduce NB and */ +/* determine the minimum value of NB. */ + + nb = *lwork / ldwork; +/* Computing MAX */ + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORGLQ", (char *)" ", m, n, k, &c_n1, + (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } + } + + if (nb >= nbmin && nb < *k && nx < *k) { + +/* Use blocked code after the last block. */ +/* The first kk rows are handled by the block method. */ + + ki = (*k - nx - 1) / nb * nb; +/* Computing MIN */ + i__1 = *k, i__2 = ki + nb; + kk = min(i__1,i__2); + +/* Set A(kk+1:m,1:kk) to zero. */ + + i__1 = kk; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = kk + 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = 0.; +/* L10: */ + } +/* L20: */ + } + } else { + kk = 0; + } + +/* Use unblocked code for the last or only block. */ + + if (kk < *m) { + i__1 = *m - kk; + i__2 = *n - kk; + i__3 = *k - kk; + dorgl2_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & + tau[kk + 1], &work[1], &iinfo); + } + + if (kk > 0) { + +/* Use blocked code */ + + i__1 = -nb; + for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { +/* Computing MIN */ + i__2 = nb, i__3 = *k - i__ + 1; + ib = min(i__2,i__3); + if (i__ + ib <= *m) { + +/* Form the triangular factor of the block reflector */ +/* H = H(i) H(i+1) . . . H(i+ib-1) */ + + i__2 = *n - i__ + 1; + dlarft_((char *)"Forward", (char *)"Rowwise", &i__2, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, + (ftnlen)7); + +/* Apply H**T to A(i+ib:m,i:n) from the right */ + + i__2 = *m - i__ - ib + 1; + i__3 = *n - i__ + 1; + dlarfb_((char *)"Right", (char *)"Transpose", (char *)"Forward", (char *)"Rowwise", &i__2, & + i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & + ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[ib + + 1], &ldwork, (ftnlen)5, (ftnlen)9, (ftnlen)7, (ftnlen) + 7); + } + +/* Apply H**T to columns i:n of current block */ + + i__2 = *n - i__ + 1; + dorgl2_(&ib, &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & + work[1], &iinfo); + +/* Set columns 1:i-1 of current block to zero */ + + i__2 = i__ - 1; + for (j = 1; j <= i__2; ++j) { + i__3 = i__ + ib - 1; + for (l = i__; l <= i__3; ++l) { + a[l + j * a_dim1] = 0.; +/* L30: */ + } +/* L40: */ + } +/* L50: */ + } + } + + work[1] = (doublereal) iws; + return 0; + +/* End of DORGLQ */ + +} /* dorglq_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dorgql.cpp b/lib/linalg/dorgql.cpp new file mode 100644 index 0000000000..22a9b05b4b --- /dev/null +++ b/lib/linalg/dorgql.cpp @@ -0,0 +1,376 @@ +/* fortran/dorgql.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__3 = 3; +static integer c__2 = 2; + +/* > \brief \b DORGQL */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORGQL + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDA, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORGQL generates an M-by-N real matrix Q with orthonormal columns, */ +/* > which is defined as the last N columns of a product of K elementary */ +/* > reflectors of order M */ +/* > */ +/* > Q = H(k) . . . H(2) H(1) */ +/* > */ +/* > as returned by DGEQLF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix Q. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix Q. M >= N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines the */ +/* > matrix Q. N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the (n-k+i)-th column must contain the vector which */ +/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ +/* > returned by DGEQLF in the last k columns of its array */ +/* > argument A. */ +/* > On exit, the M-by-N matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The first dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DGEQLF. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= max(1,N). */ +/* > For optimum performance LWORK >= N*NB, where NB is the */ +/* > optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument has an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dorgql_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, + integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + + /* Local variables */ + integer i__, j, l, ib, nb, kk, nx, iws, nbmin, iinfo; + extern /* Subroutine */ int dorg2l_(integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *), + dlarfb_(char *, char *, char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen, ftnlen), dlarft_(char *, char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + integer ldwork, lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + lquery = *lwork == -1; + if (*m < 0) { + *info = -1; + } else if (*n < 0 || *n > *m) { + *info = -2; + } else if (*k < 0 || *k > *n) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } + + if (*info == 0) { + if (*n == 0) { + lwkopt = 1; + } else { + nb = ilaenv_(&c__1, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, ( + ftnlen)1); + lwkopt = *n * nb; + } + work[1] = (doublereal) lwkopt; + + if (*lwork < max(1,*n) && ! lquery) { + *info = -8; + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORGQL", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n <= 0) { + return 0; + } + + nbmin = 2; + nx = 0; + iws = *n; + if (nb > 1 && nb < *k) { + +/* Determine when to cross over from blocked to unblocked code. */ + +/* Computing MAX */ + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *k) { + +/* Determine if workspace is large enough for blocked code. */ + + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { + +/* Not enough workspace to use optimal NB: reduce NB and */ +/* determine the minimum value of NB. */ + + nb = *lwork / ldwork; +/* Computing MAX */ + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, + (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } + } + + if (nb >= nbmin && nb < *k && nx < *k) { + +/* Use blocked code after the first block. */ +/* The last kk columns are handled by the block method. */ + +/* Computing MIN */ + i__1 = *k, i__2 = (*k - nx + nb - 1) / nb * nb; + kk = min(i__1,i__2); + +/* Set A(m-kk+1:m,1:n-kk) to zero. */ + + i__1 = *n - kk; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = *m - kk + 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = 0.; +/* L10: */ + } +/* L20: */ + } + } else { + kk = 0; + } + +/* Use unblocked code for the first or only block. */ + + i__1 = *m - kk; + i__2 = *n - kk; + i__3 = *k - kk; + dorg2l_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &iinfo) + ; + + if (kk > 0) { + +/* Use blocked code */ + + i__1 = *k; + i__2 = nb; + for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += + i__2) { +/* Computing MIN */ + i__3 = nb, i__4 = *k - i__ + 1; + ib = min(i__3,i__4); + if (*n - *k + i__ > 1) { + +/* Form the triangular factor of the block reflector */ +/* H = H(i+ib-1) . . . H(i+1) H(i) */ + + i__3 = *m - *k + i__ + ib - 1; + dlarft_((char *)"Backward", (char *)"Columnwise", &i__3, &ib, &a[(*n - *k + + i__) * a_dim1 + 1], lda, &tau[i__], &work[1], &ldwork, + (ftnlen)8, (ftnlen)10); + +/* Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left */ + + i__3 = *m - *k + i__ + ib - 1; + i__4 = *n - *k + i__ - 1; + dlarfb_((char *)"Left", (char *)"No transpose", (char *)"Backward", (char *)"Columnwise", & + i__3, &i__4, &ib, &a[(*n - *k + i__) * a_dim1 + 1], + lda, &work[1], &ldwork, &a[a_offset], lda, &work[ib + + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen)8, ( + ftnlen)10); + } + +/* Apply H to rows 1:m-k+i+ib-1 of current block */ + + i__3 = *m - *k + i__ + ib - 1; + dorg2l_(&i__3, &ib, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, & + tau[i__], &work[1], &iinfo); + +/* Set rows m-k+i+ib:m of current block to zero */ + + i__3 = *n - *k + i__ + ib - 1; + for (j = *n - *k + i__; j <= i__3; ++j) { + i__4 = *m; + for (l = *m - *k + i__ + ib; l <= i__4; ++l) { + a[l + j * a_dim1] = 0.; +/* L30: */ + } +/* L40: */ + } +/* L50: */ + } + } + + work[1] = (doublereal) iws; + return 0; + +/* End of DORGQL */ + +} /* dorgql_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dorgqr.cpp b/lib/linalg/dorgqr.cpp new file mode 100644 index 0000000000..30f175f707 --- /dev/null +++ b/lib/linalg/dorgqr.cpp @@ -0,0 +1,367 @@ +/* fortran/dorgqr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__3 = 3; +static integer c__2 = 2; + +/* > \brief \b DORGQR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORGQR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDA, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORGQR generates an M-by-N real matrix Q with orthonormal columns, */ +/* > which is defined as the first N columns of a product of K elementary */ +/* > reflectors of order M */ +/* > */ +/* > Q = H(1) H(2) . . . H(k) */ +/* > */ +/* > as returned by DGEQRF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix Q. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix Q. M >= N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines the */ +/* > matrix Q. N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the i-th column must contain the vector which */ +/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ +/* > returned by DGEQRF in the first k columns of its array */ +/* > argument A. */ +/* > On exit, the M-by-N matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The first dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DGEQRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= max(1,N). */ +/* > For optimum performance LWORK >= N*NB, where NB is the */ +/* > optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument has an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dorgqr_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, + integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo; + extern /* Subroutine */ int dorg2r_(integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *), + dlarfb_(char *, char *, char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen, ftnlen), dlarft_(char *, char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + integer ldwork, lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + nb = ilaenv_(&c__1, (char *)"DORGQR", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + lwkopt = max(1,*n) * nb; + work[1] = (doublereal) lwkopt; + lquery = *lwork == -1; + if (*m < 0) { + *info = -1; + } else if (*n < 0 || *n > *m) { + *info = -2; + } else if (*k < 0 || *k > *n) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } else if (*lwork < max(1,*n) && ! lquery) { + *info = -8; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORGQR", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n <= 0) { + work[1] = 1.; + return 0; + } + + nbmin = 2; + nx = 0; + iws = *n; + if (nb > 1 && nb < *k) { + +/* Determine when to cross over from blocked to unblocked code. */ + +/* Computing MAX */ + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGQR", (char *)" ", m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *k) { + +/* Determine if workspace is large enough for blocked code. */ + + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { + +/* Not enough workspace to use optimal NB: reduce NB and */ +/* determine the minimum value of NB. */ + + nb = *lwork / ldwork; +/* Computing MAX */ + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORGQR", (char *)" ", m, n, k, &c_n1, + (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } + } + + if (nb >= nbmin && nb < *k && nx < *k) { + +/* Use blocked code after the last block. */ +/* The first kk columns are handled by the block method. */ + + ki = (*k - nx - 1) / nb * nb; +/* Computing MIN */ + i__1 = *k, i__2 = ki + nb; + kk = min(i__1,i__2); + +/* Set A(1:kk,kk+1:n) to zero. */ + + i__1 = *n; + for (j = kk + 1; j <= i__1; ++j) { + i__2 = kk; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = 0.; +/* L10: */ + } +/* L20: */ + } + } else { + kk = 0; + } + +/* Use unblocked code for the last or only block. */ + + if (kk < *n) { + i__1 = *m - kk; + i__2 = *n - kk; + i__3 = *k - kk; + dorg2r_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & + tau[kk + 1], &work[1], &iinfo); + } + + if (kk > 0) { + +/* Use blocked code */ + + i__1 = -nb; + for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { +/* Computing MIN */ + i__2 = nb, i__3 = *k - i__ + 1; + ib = min(i__2,i__3); + if (i__ + ib <= *n) { + +/* Form the triangular factor of the block reflector */ +/* H = H(i) H(i+1) . . . H(i+ib-1) */ + + i__2 = *m - i__ + 1; + dlarft_((char *)"Forward", (char *)"Columnwise", &i__2, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, + (ftnlen)10); + +/* Apply H to A(i:m,i+ib:n) from the left */ + + i__2 = *m - i__ + 1; + i__3 = *n - i__ - ib + 1; + dlarfb_((char *)"Left", (char *)"No transpose", (char *)"Forward", (char *)"Columnwise", & + i__2, &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[ + 1], &ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, & + work[ib + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen) + 7, (ftnlen)10); + } + +/* Apply H to rows i:m of current block */ + + i__2 = *m - i__ + 1; + dorg2r_(&i__2, &ib, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & + work[1], &iinfo); + +/* Set rows 1:i-1 of current block to zero */ + + i__2 = i__ + ib - 1; + for (j = i__; j <= i__2; ++j) { + i__3 = i__ - 1; + for (l = 1; l <= i__3; ++l) { + a[l + j * a_dim1] = 0.; +/* L30: */ + } +/* L40: */ + } +/* L50: */ + } + } + + work[1] = (doublereal) iws; + return 0; + +/* End of DORGQR */ + +} /* dorgqr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dorgtr.cpp b/lib/linalg/dorgtr.cpp new file mode 100644 index 0000000000..7686c56d19 --- /dev/null +++ b/lib/linalg/dorgtr.cpp @@ -0,0 +1,331 @@ +/* fortran/dorgtr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; + +/* > \brief \b DORGTR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORGTR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDA, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORGTR generates a real orthogonal matrix Q which is defined as the */ +/* > product of n-1 elementary reflectors of order N, as returned by */ +/* > DSYTRD: */ +/* > */ +/* > if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), */ +/* > */ +/* > if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A contains elementary reflectors */ +/* > from DSYTRD; */ +/* > = 'L': Lower triangle of A contains elementary reflectors */ +/* > from DSYTRD. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix Q. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the vectors which define the elementary reflectors, */ +/* > as returned by DSYTRD. */ +/* > On exit, the N-by-N orthogonal matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (N-1) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DSYTRD. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= max(1,N-1). */ +/* > For optimum performance LWORK >= (N-1)*NB, where NB is */ +/* > the optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dorgtr_(char *uplo, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *lwork, integer *info, + ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, j, nb; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo; + logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dorgql_(integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + integer *), dorgqr_(integer *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *); + integer lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + lquery = *lwork == -1; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } else /* if(complicated condition) */ { +/* Computing MAX */ + i__1 = 1, i__2 = *n - 1; + if (*lwork < max(i__1,i__2) && ! lquery) { + *info = -7; + } + } + + if (*info == 0) { + if (upper) { + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"DORGQL", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)1); + } else { + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"DORGQR", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)1); + } +/* Computing MAX */ + i__1 = 1, i__2 = *n - 1; + lwkopt = max(i__1,i__2) * nb; + work[1] = (doublereal) lwkopt; + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORGTR", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + work[1] = 1.; + return 0; + } + + if (upper) { + +/* Q was determined by a call to DSYTRD with UPLO = 'U' */ + +/* Shift the vectors which define the elementary reflectors one */ +/* column to the left, and set the last row and column of Q to */ +/* those of the unit matrix */ + + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = a[i__ + (j + 1) * a_dim1]; +/* L10: */ + } + a[*n + j * a_dim1] = 0.; +/* L20: */ + } + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + a[i__ + *n * a_dim1] = 0.; +/* L30: */ + } + a[*n + *n * a_dim1] = 1.; + +/* Generate Q(1:n-1,1:n-1) */ + + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + dorgql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], + lwork, &iinfo); + + } else { + +/* Q was determined by a call to DSYTRD with UPLO = 'L'. */ + +/* Shift the vectors which define the elementary reflectors one */ +/* column to the right, and set the first row and column of Q to */ +/* those of the unit matrix */ + + for (j = *n; j >= 2; --j) { + a[j * a_dim1 + 1] = 0.; + i__1 = *n; + for (i__ = j + 1; i__ <= i__1; ++i__) { + a[i__ + j * a_dim1] = a[i__ + (j - 1) * a_dim1]; +/* L40: */ + } +/* L50: */ + } + a[a_dim1 + 1] = 1.; + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + a[i__ + a_dim1] = 0.; +/* L60: */ + } + if (*n > 1) { + +/* Generate Q(2:n,2:n) */ + + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + dorgqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], + &work[1], lwork, &iinfo); + } + } + work[1] = (doublereal) lwkopt; + return 0; + +/* End of DORGTR */ + +} /* dorgtr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dorm2l.cpp b/lib/linalg/dorm2l.cpp new file mode 100644 index 0000000000..6669a81614 --- /dev/null +++ b/lib/linalg/dorm2l.cpp @@ -0,0 +1,324 @@ +/* fortran/dorm2l.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DORM2L multiplies a general matrix by the orthogonal matrix from a QL factorization determined +by sgeqlf (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORM2L + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORM2L( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ +/* WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS */ +/* INTEGER INFO, K, LDA, LDC, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORM2L overwrites the general real m by n matrix C with */ +/* > */ +/* > Q * C if SIDE = 'L' and TRANS = 'N', or */ +/* > */ +/* > Q**T * C if SIDE = 'L' and TRANS = 'T', or */ +/* > */ +/* > C * Q if SIDE = 'R' and TRANS = 'N', or */ +/* > */ +/* > C * Q**T if SIDE = 'R' and TRANS = 'T', */ +/* > */ +/* > where Q is a real orthogonal matrix defined as the product of k */ +/* > elementary reflectors */ +/* > */ +/* > Q = H(k) . . . H(2) H(1) */ +/* > */ +/* > as returned by DGEQLF. Q is of order m if SIDE = 'L' and of order n */ +/* > if SIDE = 'R'. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q or Q**T from the Left */ +/* > = 'R': apply Q or Q**T from the Right */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': apply Q (No transpose) */ +/* > = 'T': apply Q**T (Transpose) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines */ +/* > the matrix Q. */ +/* > If SIDE = 'L', M >= K >= 0; */ +/* > if SIDE = 'R', N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,K) */ +/* > The i-th column must contain the vector which defines the */ +/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ +/* > DGEQLF in the last k columns of its array argument A. */ +/* > A is modified by the routine but restored on exit. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > If SIDE = 'L', LDA >= max(1,M); */ +/* > if SIDE = 'R', LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DGEQLF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ +/* > On entry, the m by n matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension */ +/* > (N) if SIDE = 'L', */ +/* > (M) if SIDE = 'R' */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dorm2l_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *info, ftnlen side_len, + ftnlen trans_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; + + /* Local variables */ + integer i__, i1, i2, i3, mi, ni, nq; + doublereal aii; + logical left; + extern /* Subroutine */ int dlarf_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + logical notran; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + +/* NQ is the order of Q */ + + if (left) { + nq = *m; + } else { + nq = *n; + } + if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*m < 0) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*k < 0 || *k > nq) { + *info = -5; + } else if (*lda < max(1,nq)) { + *info = -7; + } else if (*ldc < max(1,*m)) { + *info = -10; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORM2L", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0 || *k == 0) { + return 0; + } + + if (left && notran || ! left && ! notran) { + i1 = 1; + i2 = *k; + i3 = 1; + } else { + i1 = *k; + i2 = 1; + i3 = -1; + } + + if (left) { + ni = *n; + } else { + mi = *m; + } + + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + if (left) { + +/* H(i) is applied to C(1:m-k+i,1:n) */ + + mi = *m - *k + i__; + } else { + +/* H(i) is applied to C(1:m,1:n-k+i) */ + + ni = *n - *k + i__; + } + +/* Apply H(i) */ + + aii = a[nq - *k + i__ + i__ * a_dim1]; + a[nq - *k + i__ + i__ * a_dim1] = 1.; + dlarf_(side, &mi, &ni, &a[i__ * a_dim1 + 1], &c__1, &tau[i__], &c__[ + c_offset], ldc, &work[1], (ftnlen)1); + a[nq - *k + i__ + i__ * a_dim1] = aii; +/* L10: */ + } + return 0; + +/* End of DORM2L */ + +} /* dorm2l_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dorm2r.cpp b/lib/linalg/dorm2r.cpp new file mode 100644 index 0000000000..13a74e8fe1 --- /dev/null +++ b/lib/linalg/dorm2r.cpp @@ -0,0 +1,328 @@ +/* fortran/dorm2r.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined +by sgeqrf (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORM2R + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ +/* WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS */ +/* INTEGER INFO, K, LDA, LDC, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORM2R overwrites the general real m by n matrix C with */ +/* > */ +/* > Q * C if SIDE = 'L' and TRANS = 'N', or */ +/* > */ +/* > Q**T* C if SIDE = 'L' and TRANS = 'T', or */ +/* > */ +/* > C * Q if SIDE = 'R' and TRANS = 'N', or */ +/* > */ +/* > C * Q**T if SIDE = 'R' and TRANS = 'T', */ +/* > */ +/* > where Q is a real orthogonal matrix defined as the product of k */ +/* > elementary reflectors */ +/* > */ +/* > Q = H(1) H(2) . . . H(k) */ +/* > */ +/* > as returned by DGEQRF. Q is of order m if SIDE = 'L' and of order n */ +/* > if SIDE = 'R'. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q or Q**T from the Left */ +/* > = 'R': apply Q or Q**T from the Right */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': apply Q (No transpose) */ +/* > = 'T': apply Q**T (Transpose) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines */ +/* > the matrix Q. */ +/* > If SIDE = 'L', M >= K >= 0; */ +/* > if SIDE = 'R', N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,K) */ +/* > The i-th column must contain the vector which defines the */ +/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ +/* > DGEQRF in the first k columns of its array argument A. */ +/* > A is modified by the routine but restored on exit. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > If SIDE = 'L', LDA >= max(1,M); */ +/* > if SIDE = 'R', LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DGEQRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ +/* > On entry, the m by n matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension */ +/* > (N) if SIDE = 'L', */ +/* > (M) if SIDE = 'R' */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dorm2r_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *info, ftnlen side_len, + ftnlen trans_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; + + /* Local variables */ + integer i__, i1, i2, i3, ic, jc, mi, ni, nq; + doublereal aii; + logical left; + extern /* Subroutine */ int dlarf_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + logical notran; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + +/* NQ is the order of Q */ + + if (left) { + nq = *m; + } else { + nq = *n; + } + if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*m < 0) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*k < 0 || *k > nq) { + *info = -5; + } else if (*lda < max(1,nq)) { + *info = -7; + } else if (*ldc < max(1,*m)) { + *info = -10; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORM2R", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0 || *k == 0) { + return 0; + } + + if (left && ! notran || ! left && notran) { + i1 = 1; + i2 = *k; + i3 = 1; + } else { + i1 = *k; + i2 = 1; + i3 = -1; + } + + if (left) { + ni = *n; + jc = 1; + } else { + mi = *m; + ic = 1; + } + + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + if (left) { + +/* H(i) is applied to C(i:m,1:n) */ + + mi = *m - i__ + 1; + ic = i__; + } else { + +/* H(i) is applied to C(1:m,i:n) */ + + ni = *n - i__ + 1; + jc = i__; + } + +/* Apply H(i) */ + + aii = a[i__ + i__ * a_dim1]; + a[i__ + i__ * a_dim1] = 1.; + dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &tau[i__], &c__[ + ic + jc * c_dim1], ldc, &work[1], (ftnlen)1); + a[i__ + i__ * a_dim1] = aii; +/* L10: */ + } + return 0; + +/* End of DORM2R */ + +} /* dorm2r_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dormbr.cpp b/lib/linalg/dormbr.cpp new file mode 100644 index 0000000000..e00ec3ecb0 --- /dev/null +++ b/lib/linalg/dormbr.cpp @@ -0,0 +1,464 @@ +/* fortran/dormbr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; + +/* > \brief \b DORMBR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORMBR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORMBR( VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C, */ +/* LDC, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS, VECT */ +/* INTEGER INFO, K, LDA, LDC, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > If VECT = 'Q', DORMBR overwrites the general real M-by-N matrix C */ +/* > with */ +/* > SIDE = 'L' SIDE = 'R' */ +/* > TRANS = 'N': Q * C C * Q */ +/* > TRANS = 'T': Q**T * C C * Q**T */ +/* > */ +/* > If VECT = 'P', DORMBR overwrites the general real M-by-N matrix C */ +/* > with */ +/* > SIDE = 'L' SIDE = 'R' */ +/* > TRANS = 'N': P * C C * P */ +/* > TRANS = 'T': P**T * C C * P**T */ +/* > */ +/* > Here Q and P**T are the orthogonal matrices determined by DGEBRD when */ +/* > reducing a real matrix A to bidiagonal form: A = Q * B * P**T. Q and */ +/* > P**T are defined as products of elementary reflectors H(i) and G(i) */ +/* > respectively. */ +/* > */ +/* > Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the */ +/* > order of the orthogonal matrix Q or P**T that is applied. */ +/* > */ +/* > If VECT = 'Q', A is assumed to have been an NQ-by-K matrix: */ +/* > if nq >= k, Q = H(1) H(2) . . . H(k); */ +/* > if nq < k, Q = H(1) H(2) . . . H(nq-1). */ +/* > */ +/* > If VECT = 'P', A is assumed to have been a K-by-NQ matrix: */ +/* > if k < nq, P = G(1) G(2) . . . G(k); */ +/* > if k >= nq, P = G(1) G(2) . . . G(nq-1). */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] VECT */ +/* > \verbatim */ +/* > VECT is CHARACTER*1 */ +/* > = 'Q': apply Q or Q**T; */ +/* > = 'P': apply P or P**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q, Q**T, P or P**T from the Left; */ +/* > = 'R': apply Q, Q**T, P or P**T from the Right. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': No transpose, apply Q or P; */ +/* > = 'T': Transpose, apply Q**T or P**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > If VECT = 'Q', the number of columns in the original */ +/* > matrix reduced by DGEBRD. */ +/* > If VECT = 'P', the number of rows in the original */ +/* > matrix reduced by DGEBRD. */ +/* > K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension */ +/* > (LDA,min(nq,K)) if VECT = 'Q' */ +/* > (LDA,nq) if VECT = 'P' */ +/* > The vectors which define the elementary reflectors H(i) and */ +/* > G(i), whose products determine the matrices Q and P, as */ +/* > returned by DGEBRD. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > If VECT = 'Q', LDA >= max(1,nq); */ +/* > if VECT = 'P', LDA >= max(1,min(nq,K)). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (min(nq,K)) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i) or G(i) which determines Q or P, as returned */ +/* > by DGEBRD in the array argument TAUQ or TAUP. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ +/* > On entry, the M-by-N matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q */ +/* > or P*C or P**T*C or C*P or C*P**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > If SIDE = 'L', LWORK >= max(1,N); */ +/* > if SIDE = 'R', LWORK >= max(1,M). */ +/* > For optimum performance LWORK >= N*NB if SIDE = 'L', and */ +/* > LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ +/* > blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dormbr_(char *vect, char *side, char *trans, integer *m, + integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, + doublereal *c__, integer *ldc, doublereal *work, integer *lwork, + integer *info, ftnlen vect_len, ftnlen side_len, ftnlen trans_len) +{ + /* System generated locals */ + address a__1[2]; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2]; + char ch__1[2]; + + /* Builtin functions */ + /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + + /* Local variables */ + integer i1, i2, nb, mi, ni, nq, nw; + logical left; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dormlq_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + logical notran; + extern /* Subroutine */ int dormqr_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + logical applyq; + char transt[1]; + integer lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + applyq = lsame_(vect, (char *)"Q", (ftnlen)1, (ftnlen)1); + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + +/* NQ is the order of Q or P and NW is the minimum dimension of WORK */ + + if (left) { + nq = *m; + nw = max(1,*n); + } else { + nq = *n; + nw = max(1,*m); + } + if (! applyq && ! lsame_(vect, (char *)"P", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + *info = -3; + } else if (*m < 0) { + *info = -4; + } else if (*n < 0) { + *info = -5; + } else if (*k < 0) { + *info = -6; + } else /* if(complicated condition) */ { +/* Computing MAX */ + i__1 = 1, i__2 = min(nq,*k); + if (applyq && *lda < max(1,nq) || ! applyq && *lda < max(i__1,i__2)) { + *info = -8; + } else if (*ldc < max(1,*m)) { + *info = -11; + } else if (*lwork < nw && ! lquery) { + *info = -13; + } + } + + if (*info == 0) { + if (applyq) { + if (left) { +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = *m - 1; + i__2 = *m - 1; + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &i__1, n, &i__2, &c_n1, ( + ftnlen)6, (ftnlen)2); + } else { +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = *n - 1; + i__2 = *n - 1; + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &i__1, &i__2, &c_n1, ( + ftnlen)6, (ftnlen)2); + } + } else { + if (left) { +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = *m - 1; + i__2 = *m - 1; + nb = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, &i__1, n, &i__2, &c_n1, ( + ftnlen)6, (ftnlen)2); + } else { +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = *n - 1; + i__2 = *n - 1; + nb = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, m, &i__1, &i__2, &c_n1, ( + ftnlen)6, (ftnlen)2); + } + } + lwkopt = nw * nb; + work[1] = (doublereal) lwkopt; + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORMBR", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + work[1] = 1.; + if (*m == 0 || *n == 0) { + return 0; + } + + if (applyq) { + +/* Apply Q */ + + if (nq >= *k) { + +/* Q was determined by a call to DGEBRD with nq >= k */ + + dormqr_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen)1, ( + ftnlen)1); + } else if (nq > 1) { + +/* Q was determined by a call to DGEBRD with nq < k */ + + if (left) { + mi = *m - 1; + ni = *n; + i1 = 2; + i2 = 1; + } else { + mi = *m; + ni = *n - 1; + i1 = 1; + i2 = 2; + } + i__1 = nq - 1; + dormqr_(side, trans, &mi, &ni, &i__1, &a[a_dim1 + 2], lda, &tau[1] + , &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, ( + ftnlen)1, (ftnlen)1); + } + } else { + +/* Apply P */ + + if (notran) { + *(unsigned char *)transt = 'T'; + } else { + *(unsigned char *)transt = 'N'; + } + if (nq > *k) { + +/* P was determined by a call to DGEBRD with nq > k */ + + dormlq_(side, transt, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen)1, ( + ftnlen)1); + } else if (nq > 1) { + +/* P was determined by a call to DGEBRD with nq <= k */ + + if (left) { + mi = *m - 1; + ni = *n; + i1 = 2; + i2 = 1; + } else { + mi = *m; + ni = *n - 1; + i1 = 1; + i2 = 2; + } + i__1 = nq - 1; + dormlq_(side, transt, &mi, &ni, &i__1, &a[(a_dim1 << 1) + 1], lda, + &tau[1], &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, & + iinfo, (ftnlen)1, (ftnlen)1); + } + } + work[1] = (doublereal) lwkopt; + return 0; + +/* End of DORMBR */ + +} /* dormbr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dorml2.cpp b/lib/linalg/dorml2.cpp new file mode 100644 index 0000000000..9085a5a0ce --- /dev/null +++ b/lib/linalg/dorml2.cpp @@ -0,0 +1,324 @@ +/* fortran/dorml2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DORML2 multiplies a general matrix by the orthogonal matrix from a LQ factorization determined +by sgelqf (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORML2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ +/* WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS */ +/* INTEGER INFO, K, LDA, LDC, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORML2 overwrites the general real m by n matrix C with */ +/* > */ +/* > Q * C if SIDE = 'L' and TRANS = 'N', or */ +/* > */ +/* > Q**T* C if SIDE = 'L' and TRANS = 'T', or */ +/* > */ +/* > C * Q if SIDE = 'R' and TRANS = 'N', or */ +/* > */ +/* > C * Q**T if SIDE = 'R' and TRANS = 'T', */ +/* > */ +/* > where Q is a real orthogonal matrix defined as the product of k */ +/* > elementary reflectors */ +/* > */ +/* > Q = H(k) . . . H(2) H(1) */ +/* > */ +/* > as returned by DGELQF. Q is of order m if SIDE = 'L' and of order n */ +/* > if SIDE = 'R'. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q or Q**T from the Left */ +/* > = 'R': apply Q or Q**T from the Right */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': apply Q (No transpose) */ +/* > = 'T': apply Q**T (Transpose) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines */ +/* > the matrix Q. */ +/* > If SIDE = 'L', M >= K >= 0; */ +/* > if SIDE = 'R', N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension */ +/* > (LDA,M) if SIDE = 'L', */ +/* > (LDA,N) if SIDE = 'R' */ +/* > The i-th row must contain the vector which defines the */ +/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ +/* > DGELQF in the first k rows of its array argument A. */ +/* > A is modified by the routine but restored on exit. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,K). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DGELQF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ +/* > On entry, the m by n matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension */ +/* > (N) if SIDE = 'L', */ +/* > (M) if SIDE = 'R' */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dorml2_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *info, ftnlen side_len, + ftnlen trans_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; + + /* Local variables */ + integer i__, i1, i2, i3, ic, jc, mi, ni, nq; + doublereal aii; + logical left; + extern /* Subroutine */ int dlarf_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + logical notran; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + +/* NQ is the order of Q */ + + if (left) { + nq = *m; + } else { + nq = *n; + } + if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*m < 0) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*k < 0 || *k > nq) { + *info = -5; + } else if (*lda < max(1,*k)) { + *info = -7; + } else if (*ldc < max(1,*m)) { + *info = -10; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORML2", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0 || *k == 0) { + return 0; + } + + if (left && notran || ! left && ! notran) { + i1 = 1; + i2 = *k; + i3 = 1; + } else { + i1 = *k; + i2 = 1; + i3 = -1; + } + + if (left) { + ni = *n; + jc = 1; + } else { + mi = *m; + ic = 1; + } + + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + if (left) { + +/* H(i) is applied to C(i:m,1:n) */ + + mi = *m - i__ + 1; + ic = i__; + } else { + +/* H(i) is applied to C(1:m,i:n) */ + + ni = *n - i__ + 1; + jc = i__; + } + +/* Apply H(i) */ + + aii = a[i__ + i__ * a_dim1]; + a[i__ + i__ * a_dim1] = 1.; + dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], lda, &tau[i__], &c__[ + ic + jc * c_dim1], ldc, &work[1], (ftnlen)1); + a[i__ + i__ * a_dim1] = aii; +/* L10: */ + } + return 0; + +/* End of DORML2 */ + +} /* dorml2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dormlq.cpp b/lib/linalg/dormlq.cpp new file mode 100644 index 0000000000..e5ed90a9fa --- /dev/null +++ b/lib/linalg/dormlq.cpp @@ -0,0 +1,424 @@ +/* fortran/dormlq.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +static integer c__65 = 65; + +/* > \brief \b DORMLQ */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORMLQ + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORMLQ( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ +/* WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS */ +/* INTEGER INFO, K, LDA, LDC, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORMLQ overwrites the general real M-by-N matrix C with */ +/* > */ +/* > SIDE = 'L' SIDE = 'R' */ +/* > TRANS = 'N': Q * C C * Q */ +/* > TRANS = 'T': Q**T * C C * Q**T */ +/* > */ +/* > where Q is a real orthogonal matrix defined as the product of k */ +/* > elementary reflectors */ +/* > */ +/* > Q = H(k) . . . H(2) H(1) */ +/* > */ +/* > as returned by DGELQF. Q is of order M if SIDE = 'L' and of order N */ +/* > if SIDE = 'R'. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q or Q**T from the Left; */ +/* > = 'R': apply Q or Q**T from the Right. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': No transpose, apply Q; */ +/* > = 'T': Transpose, apply Q**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines */ +/* > the matrix Q. */ +/* > If SIDE = 'L', M >= K >= 0; */ +/* > if SIDE = 'R', N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension */ +/* > (LDA,M) if SIDE = 'L', */ +/* > (LDA,N) if SIDE = 'R' */ +/* > The i-th row must contain the vector which defines the */ +/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ +/* > DGELQF in the first k rows of its array argument A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,K). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DGELQF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ +/* > On entry, the M-by-N matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > If SIDE = 'L', LWORK >= max(1,N); */ +/* > if SIDE = 'R', LWORK >= max(1,M). */ +/* > For good performance, LWORK should generally be larger. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dormlq_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info, + ftnlen side_len, ftnlen trans_len) +{ + /* System generated locals */ + address a__1[2]; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, + i__5; + char ch__1[2]; + + /* Builtin functions */ + /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + + /* Local variables */ + integer i__, i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iwt; + logical left; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nbmin, iinfo; + extern /* Subroutine */ int dorml2_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen), dlarfb_(char + *, char *, char *, char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + logical notran; + integer ldwork; + char transt[1]; + integer lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + +/* NQ is the order of Q and NW is the minimum dimension of WORK */ + + if (left) { + nq = *m; + nw = max(1,*n); + } else { + nq = *n; + nw = max(1,*m); + } + if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*m < 0) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*k < 0 || *k > nq) { + *info = -5; + } else if (*lda < max(1,*k)) { + *info = -7; + } else if (*ldc < max(1,*m)) { + *info = -10; + } else if (*lwork < nw && ! lquery) { + *info = -12; + } + + if (*info == 0) { + +/* Compute the workspace requirements */ + +/* Computing MIN */ +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nb = min(i__1,i__2); + lwkopt = nw * nb + 4160; + work[1] = (doublereal) lwkopt; + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORMLQ", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0 || *k == 0) { + work[1] = 1.; + return 0; + } + + nbmin = 2; + ldwork = nw; + if (nb > 1 && nb < *k) { + if (*lwork < lwkopt) { + nb = (*lwork - 4160) / ldwork; +/* Computing MAX */ +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMLQ", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nbmin = max(i__1,i__2); + } + } + + if (nb < nbmin || nb >= *k) { + +/* Use unblocked code */ + + dorml2_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + } else { + +/* Use blocked code */ + + iwt = nw * nb + 1; + if (left && notran || ! left && ! notran) { + i1 = 1; + i2 = *k; + i3 = nb; + } else { + i1 = (*k - 1) / nb * nb + 1; + i2 = 1; + i3 = -nb; + } + + if (left) { + ni = *n; + jc = 1; + } else { + mi = *m; + ic = 1; + } + + if (notran) { + *(unsigned char *)transt = 'T'; + } else { + *(unsigned char *)transt = 'N'; + } + + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { +/* Computing MIN */ + i__4 = nb, i__5 = *k - i__ + 1; + ib = min(i__4,i__5); + +/* Form the triangular factor of the block reflector */ +/* H = H(i) H(i+1) . . . H(i+ib-1) */ + + i__4 = nq - i__ + 1; + dlarft_((char *)"Forward", (char *)"Rowwise", &i__4, &ib, &a[i__ + i__ * a_dim1], + lda, &tau[i__], &work[iwt], &c__65, (ftnlen)7, (ftnlen)7); + if (left) { + +/* H or H**T is applied to C(i:m,1:n) */ + + mi = *m - i__ + 1; + ic = i__; + } else { + +/* H or H**T is applied to C(1:m,i:n) */ + + ni = *n - i__ + 1; + jc = i__; + } + +/* Apply H or H**T */ + + dlarfb_(side, transt, (char *)"Forward", (char *)"Rowwise", &mi, &ni, &ib, &a[i__ + + i__ * a_dim1], lda, &work[iwt], &c__65, &c__[ic + jc * + c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen)1, ( + ftnlen)7, (ftnlen)7); +/* L10: */ + } + } + work[1] = (doublereal) lwkopt; + return 0; + +/* End of DORMLQ */ + +} /* dormlq_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dormql.cpp b/lib/linalg/dormql.cpp new file mode 100644 index 0000000000..735f9e3d2b --- /dev/null +++ b/lib/linalg/dormql.cpp @@ -0,0 +1,416 @@ +/* fortran/dormql.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +static integer c__65 = 65; + +/* > \brief \b DORMQL */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORMQL + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORMQL( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ +/* WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS */ +/* INTEGER INFO, K, LDA, LDC, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORMQL overwrites the general real M-by-N matrix C with */ +/* > */ +/* > SIDE = 'L' SIDE = 'R' */ +/* > TRANS = 'N': Q * C C * Q */ +/* > TRANS = 'T': Q**T * C C * Q**T */ +/* > */ +/* > where Q is a real orthogonal matrix defined as the product of k */ +/* > elementary reflectors */ +/* > */ +/* > Q = H(k) . . . H(2) H(1) */ +/* > */ +/* > as returned by DGEQLF. Q is of order M if SIDE = 'L' and of order N */ +/* > if SIDE = 'R'. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q or Q**T from the Left; */ +/* > = 'R': apply Q or Q**T from the Right. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': No transpose, apply Q; */ +/* > = 'T': Transpose, apply Q**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines */ +/* > the matrix Q. */ +/* > If SIDE = 'L', M >= K >= 0; */ +/* > if SIDE = 'R', N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,K) */ +/* > The i-th column must contain the vector which defines the */ +/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ +/* > DGEQLF in the last k columns of its array argument A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > If SIDE = 'L', LDA >= max(1,M); */ +/* > if SIDE = 'R', LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DGEQLF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ +/* > On entry, the M-by-N matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > If SIDE = 'L', LWORK >= max(1,N); */ +/* > if SIDE = 'R', LWORK >= max(1,M). */ +/* > For good performance, LWORK should generally be larger. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dormql_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info, + ftnlen side_len, ftnlen trans_len) +{ + /* System generated locals */ + address a__1[2]; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, + i__5; + char ch__1[2]; + + /* Builtin functions */ + /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + + /* Local variables */ + integer i__, i1, i2, i3, ib, nb, mi, ni, nq, nw, iwt; + logical left; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nbmin, iinfo; + extern /* Subroutine */ int dorm2l_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen), dlarfb_(char + *, char *, char *, char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + logical notran; + integer ldwork, lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + +/* NQ is the order of Q and NW is the minimum dimension of WORK */ + + if (left) { + nq = *m; + nw = max(1,*n); + } else { + nq = *n; + nw = max(1,*m); + } + if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*m < 0) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*k < 0 || *k > nq) { + *info = -5; + } else if (*lda < max(1,nq)) { + *info = -7; + } else if (*ldc < max(1,*m)) { + *info = -10; + } else if (*lwork < nw && ! lquery) { + *info = -12; + } + + if (*info == 0) { + +/* Compute the workspace requirements */ + + if (*m == 0 || *n == 0) { + lwkopt = 1; + } else { +/* Computing MIN */ +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMQL", ch__1, m, n, k, &c_n1, + (ftnlen)6, (ftnlen)2); + nb = min(i__1,i__2); + lwkopt = nw * nb + 4160; + } + work[1] = (doublereal) lwkopt; + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORMQL", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0) { + return 0; + } + + nbmin = 2; + ldwork = nw; + if (nb > 1 && nb < *k) { + if (*lwork < lwkopt) { + nb = (*lwork - 4160) / ldwork; +/* Computing MAX */ +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMQL", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nbmin = max(i__1,i__2); + } + } + + if (nb < nbmin || nb >= *k) { + +/* Use unblocked code */ + + dorm2l_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + } else { + +/* Use blocked code */ + + iwt = nw * nb + 1; + if (left && notran || ! left && ! notran) { + i1 = 1; + i2 = *k; + i3 = nb; + } else { + i1 = (*k - 1) / nb * nb + 1; + i2 = 1; + i3 = -nb; + } + + if (left) { + ni = *n; + } else { + mi = *m; + } + + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { +/* Computing MIN */ + i__4 = nb, i__5 = *k - i__ + 1; + ib = min(i__4,i__5); + +/* Form the triangular factor of the block reflector */ +/* H = H(i+ib-1) . . . H(i+1) H(i) */ + + i__4 = nq - *k + i__ + ib - 1; + dlarft_((char *)"Backward", (char *)"Columnwise", &i__4, &ib, &a[i__ * a_dim1 + 1] + , lda, &tau[i__], &work[iwt], &c__65, (ftnlen)8, (ftnlen) + 10); + if (left) { + +/* H or H**T is applied to C(1:m-k+i+ib-1,1:n) */ + + mi = *m - *k + i__ + ib - 1; + } else { + +/* H or H**T is applied to C(1:m,1:n-k+i+ib-1) */ + + ni = *n - *k + i__ + ib - 1; + } + +/* Apply H or H**T */ + + dlarfb_(side, trans, (char *)"Backward", (char *)"Columnwise", &mi, &ni, &ib, &a[ + i__ * a_dim1 + 1], lda, &work[iwt], &c__65, &c__[c_offset] + , ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen)1, (ftnlen)8, + (ftnlen)10); +/* L10: */ + } + } + work[1] = (doublereal) lwkopt; + return 0; + +/* End of DORMQL */ + +} /* dormql_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dormqr.cpp b/lib/linalg/dormqr.cpp new file mode 100644 index 0000000000..7fce43b587 --- /dev/null +++ b/lib/linalg/dormqr.cpp @@ -0,0 +1,417 @@ +/* fortran/dormqr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +static integer c__65 = 65; + +/* > \brief \b DORMQR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORMQR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ +/* WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS */ +/* INTEGER INFO, K, LDA, LDC, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORMQR overwrites the general real M-by-N matrix C with */ +/* > */ +/* > SIDE = 'L' SIDE = 'R' */ +/* > TRANS = 'N': Q * C C * Q */ +/* > TRANS = 'T': Q**T * C C * Q**T */ +/* > */ +/* > where Q is a real orthogonal matrix defined as the product of k */ +/* > elementary reflectors */ +/* > */ +/* > Q = H(1) H(2) . . . H(k) */ +/* > */ +/* > as returned by DGEQRF. Q is of order M if SIDE = 'L' and of order N */ +/* > if SIDE = 'R'. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q or Q**T from the Left; */ +/* > = 'R': apply Q or Q**T from the Right. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': No transpose, apply Q; */ +/* > = 'T': Transpose, apply Q**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines */ +/* > the matrix Q. */ +/* > If SIDE = 'L', M >= K >= 0; */ +/* > if SIDE = 'R', N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,K) */ +/* > The i-th column must contain the vector which defines the */ +/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ +/* > DGEQRF in the first k columns of its array argument A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > If SIDE = 'L', LDA >= max(1,M); */ +/* > if SIDE = 'R', LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DGEQRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ +/* > On entry, the M-by-N matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > If SIDE = 'L', LWORK >= max(1,N); */ +/* > if SIDE = 'R', LWORK >= max(1,M). */ +/* > For good performance, LWORK should generally be larger. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dormqr_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info, + ftnlen side_len, ftnlen trans_len) +{ + /* System generated locals */ + address a__1[2]; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, + i__5; + char ch__1[2]; + + /* Builtin functions */ + /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + + /* Local variables */ + integer i__, i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iwt; + logical left; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nbmin, iinfo; + extern /* Subroutine */ int dorm2r_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen), dlarfb_(char + *, char *, char *, char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + logical notran; + integer ldwork, lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + +/* NQ is the order of Q and NW is the minimum dimension of WORK */ + + if (left) { + nq = *m; + nw = max(1,*n); + } else { + nq = *n; + nw = max(1,*m); + } + if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*m < 0) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*k < 0 || *k > nq) { + *info = -5; + } else if (*lda < max(1,nq)) { + *info = -7; + } else if (*ldc < max(1,*m)) { + *info = -10; + } else if (*lwork < nw && ! lquery) { + *info = -12; + } + + if (*info == 0) { + +/* Compute the workspace requirements */ + +/* Computing MIN */ +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nb = min(i__1,i__2); + lwkopt = nw * nb + 4160; + work[1] = (doublereal) lwkopt; + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DORMQR", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0 || *k == 0) { + work[1] = 1.; + return 0; + } + + nbmin = 2; + ldwork = nw; + if (nb > 1 && nb < *k) { + if (*lwork < lwkopt) { + nb = (*lwork - 4160) / ldwork; +/* Computing MAX */ +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMQR", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nbmin = max(i__1,i__2); + } + } + + if (nb < nbmin || nb >= *k) { + +/* Use unblocked code */ + + dorm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + } else { + +/* Use blocked code */ + + iwt = nw * nb + 1; + if (left && ! notran || ! left && notran) { + i1 = 1; + i2 = *k; + i3 = nb; + } else { + i1 = (*k - 1) / nb * nb + 1; + i2 = 1; + i3 = -nb; + } + + if (left) { + ni = *n; + jc = 1; + } else { + mi = *m; + ic = 1; + } + + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { +/* Computing MIN */ + i__4 = nb, i__5 = *k - i__ + 1; + ib = min(i__4,i__5); + +/* Form the triangular factor of the block reflector */ +/* H = H(i) H(i+1) . . . H(i+ib-1) */ + + i__4 = nq - i__ + 1; + dlarft_((char *)"Forward", (char *)"Columnwise", &i__4, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[iwt], &c__65, (ftnlen)7, ( + ftnlen)10); + if (left) { + +/* H or H**T is applied to C(i:m,1:n) */ + + mi = *m - i__ + 1; + ic = i__; + } else { + +/* H or H**T is applied to C(1:m,i:n) */ + + ni = *n - i__ + 1; + jc = i__; + } + +/* Apply H or H**T */ + + dlarfb_(side, trans, (char *)"Forward", (char *)"Columnwise", &mi, &ni, &ib, &a[ + i__ + i__ * a_dim1], lda, &work[iwt], &c__65, &c__[ic + + jc * c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen) + 1, (ftnlen)7, (ftnlen)10); +/* L10: */ + } + } + work[1] = (doublereal) lwkopt; + return 0; + +/* End of DORMQR */ + +} /* dormqr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dormtr.cpp b/lib/linalg/dormtr.cpp new file mode 100644 index 0000000000..d917e95b06 --- /dev/null +++ b/lib/linalg/dormtr.cpp @@ -0,0 +1,396 @@ +/* fortran/dormtr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; + +/* > \brief \b DORMTR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DORMTR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DORMTR( SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, */ +/* WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS, UPLO */ +/* INTEGER INFO, LDA, LDC, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DORMTR overwrites the general real M-by-N matrix C with */ +/* > */ +/* > SIDE = 'L' SIDE = 'R' */ +/* > TRANS = 'N': Q * C C * Q */ +/* > TRANS = 'T': Q**T * C C * Q**T */ +/* > */ +/* > where Q is a real orthogonal matrix of order nq, with nq = m if */ +/* > SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of */ +/* > nq-1 elementary reflectors, as returned by DSYTRD: */ +/* > */ +/* > if UPLO = 'U', Q = H(nq-1) . . . H(2) H(1); */ +/* > */ +/* > if UPLO = 'L', Q = H(1) H(2) . . . H(nq-1). */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q or Q**T from the Left; */ +/* > = 'R': apply Q or Q**T from the Right. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A contains elementary reflectors */ +/* > from DSYTRD; */ +/* > = 'L': Lower triangle of A contains elementary reflectors */ +/* > from DSYTRD. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': No transpose, apply Q; */ +/* > = 'T': Transpose, apply Q**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension */ +/* > (LDA,M) if SIDE = 'L' */ +/* > (LDA,N) if SIDE = 'R' */ +/* > The vectors which define the elementary reflectors, as */ +/* > returned by DSYTRD. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > LDA >= max(1,M) if SIDE = 'L'; LDA >= max(1,N) if SIDE = 'R'. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension */ +/* > (M-1) if SIDE = 'L' */ +/* > (N-1) if SIDE = 'R' */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by DSYTRD. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ +/* > On entry, the M-by-N matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > If SIDE = 'L', LWORK >= max(1,N); */ +/* > if SIDE = 'R', LWORK >= max(1,M). */ +/* > For optimum performance LWORK >= N*NB if SIDE = 'L', and */ +/* > LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ +/* > blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dormtr_(char *side, char *uplo, char *trans, integer *m, + integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info, + ftnlen side_len, ftnlen uplo_len, ftnlen trans_len) +{ + /* System generated locals */ + address a__1[2]; + integer a_dim1, a_offset, c_dim1, c_offset, i__1[2], i__2, i__3; + char ch__1[2]; + + /* Builtin functions */ + /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + + /* Local variables */ + integer i1, i2, nb, mi, ni, nq, nw; + logical left; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo; + logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dormql_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen), + dormqr_(char *, char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, integer *, ftnlen, ftnlen); + integer lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + +/* NQ is the order of Q and NW is the minimum dimension of WORK */ + + if (left) { + nq = *m; + nw = max(1,*n); + } else { + nq = *n; + nw = max(1,*m); + } + if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1)) { + *info = -3; + } else if (*m < 0) { + *info = -4; + } else if (*n < 0) { + *info = -5; + } else if (*lda < max(1,nq)) { + *info = -7; + } else if (*ldc < max(1,*m)) { + *info = -10; + } else if (*lwork < nw && ! lquery) { + *info = -12; + } + + if (*info == 0) { + if (upper) { + if (left) { +/* Writing concatenation */ + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *m - 1; + i__3 = *m - 1; + nb = ilaenv_(&c__1, (char *)"DORMQL", ch__1, &i__2, n, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } else { +/* Writing concatenation */ + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"DORMQL", ch__1, m, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } + } else { + if (left) { +/* Writing concatenation */ + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *m - 1; + i__3 = *m - 1; + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &i__2, n, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } else { +/* Writing concatenation */ + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } + } + lwkopt = nw * nb; + work[1] = (doublereal) lwkopt; + } + + if (*info != 0) { + i__2 = -(*info); + xerbla_((char *)"DORMTR", &i__2, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0 || nq == 1) { + work[1] = 1.; + return 0; + } + + if (left) { + mi = *m - 1; + ni = *n; + } else { + mi = *m; + ni = *n - 1; + } + + if (upper) { + +/* Q was determined by a call to DSYTRD with UPLO = 'U' */ + + i__2 = nq - 1; + dormql_(side, trans, &mi, &ni, &i__2, &a[(a_dim1 << 1) + 1], lda, & + tau[1], &c__[c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen) + 1, (ftnlen)1); + } else { + +/* Q was determined by a call to DSYTRD with UPLO = 'L' */ + + if (left) { + i1 = 2; + i2 = 1; + } else { + i1 = 1; + i2 = 2; + } + i__2 = nq - 1; + dormqr_(side, trans, &mi, &ni, &i__2, &a[a_dim1 + 2], lda, &tau[1], & + c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, (ftnlen) + 1, (ftnlen)1); + } + work[1] = (doublereal) lwkopt; + return 0; + +/* End of DORMTR */ + +} /* dormtr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dposv.cpp b/lib/linalg/dposv.cpp new file mode 100644 index 0000000000..6981ea843d --- /dev/null +++ b/lib/linalg/dposv.cpp @@ -0,0 +1,232 @@ +/* fortran/dposv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief DPOSV computes the solution to system of linear equations A * X = B for PO matrices */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DPOSV + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DPOSV( UPLO, N, NRHS, A, LDA, B, LDB, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDA, LDB, N, NRHS */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DPOSV computes the solution to a real system of linear equations */ +/* > A * X = B, */ +/* > where A is an N-by-N symmetric positive definite matrix and X and B */ +/* > are N-by-NRHS matrices. */ +/* > */ +/* > The Cholesky decomposition is used to factor A as */ +/* > A = U**T* U, if UPLO = 'U', or */ +/* > A = L * L**T, if UPLO = 'L', */ +/* > where U is an upper triangular matrix and L is a lower triangular */ +/* > matrix. The factored form of A is then used to solve the system of */ +/* > equations A * X = B. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A is stored; */ +/* > = 'L': Lower triangle of A is stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of linear equations, i.e., the order of the */ +/* > matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NRHS */ +/* > \verbatim */ +/* > NRHS is INTEGER */ +/* > The number of right hand sides, i.e., the number of columns */ +/* > of the matrix B. NRHS >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ +/* > N-by-N upper triangular part of A contains the upper */ +/* > triangular part of the matrix A, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading N-by-N lower triangular part of A contains the lower */ +/* > triangular part of the matrix A, and the strictly upper */ +/* > triangular part of A is not referenced. */ +/* > */ +/* > On exit, if INFO = 0, the factor U or L from the Cholesky */ +/* > factorization A = U**T*U or A = L*L**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ +/* > On entry, the N-by-NRHS right hand side matrix B. */ +/* > On exit, if INFO = 0, the N-by-NRHS solution matrix X. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, the leading minor of order i of A is not */ +/* > positive definite, so the factorization could not be */ +/* > completed, and the solution has not been computed. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doublePOsolve */ + +/* ===================================================================== */ +/* Subroutine */ int dposv_(char *uplo, integer *n, integer *nrhs, doublereal + *a, integer *lda, doublereal *b, integer *ldb, integer *info, ftnlen + uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + + /* Local variables */ + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dpotrf_( + char *, integer *, doublereal *, integer *, integer *, ftnlen), + dpotrs_(char *, integer *, integer *, doublereal *, integer *, + doublereal *, integer *, integer *, ftnlen); + + +/* -- LAPACK driver routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + *info = 0; + if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( + ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } else if (*ldb < max(1,*n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DPOSV ", &i__1, (ftnlen)6); + return 0; + } + +/* Compute the Cholesky factorization A = U**T*U or A = L*L**T. */ + + dpotrf_(uplo, n, &a[a_offset], lda, info, (ftnlen)1); + if (*info == 0) { + +/* Solve the system A*X = B, overwriting B with X. */ + + dpotrs_(uplo, n, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info, ( + ftnlen)1); + + } + return 0; + +/* End of DPOSV */ + +} /* dposv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dpotf2.cpp b/lib/linalg/dpotf2.cpp new file mode 100644 index 0000000000..e32a52c97c --- /dev/null +++ b/lib/linalg/dpotf2.cpp @@ -0,0 +1,294 @@ +/* fortran/dpotf2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static doublereal c_b10 = -1.; +static doublereal c_b12 = 1.; + +/* > \brief \b DPOTF2 computes the Cholesky factorization of a symmetric/Hermitian positive definite matrix (u +nblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DPOTF2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DPOTF2( UPLO, N, A, LDA, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDA, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DPOTF2 computes the Cholesky factorization of a real symmetric */ +/* > positive definite matrix A. */ +/* > */ +/* > The factorization has the form */ +/* > A = U**T * U , if UPLO = 'U', or */ +/* > A = L * L**T, if UPLO = 'L', */ +/* > where U is an upper triangular matrix and L is lower triangular. */ +/* > */ +/* > This is the unblocked version of the algorithm, calling Level 2 BLAS. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies whether the upper or lower triangular part of the */ +/* > symmetric matrix A is stored. */ +/* > = 'U': Upper triangular */ +/* > = 'L': Lower triangular */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ +/* > n by n upper triangular part of A contains the upper */ +/* > triangular part of the matrix A, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading n by n lower triangular part of A contains the lower */ +/* > triangular part of the matrix A, and the strictly upper */ +/* > triangular part of A is not referenced. */ +/* > */ +/* > On exit, if INFO = 0, the factor U or L from the Cholesky */ +/* > factorization A = U**T *U or A = L*L**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -k, the k-th argument had an illegal value */ +/* > > 0: if INFO = k, the leading minor of order k is not */ +/* > positive definite, and the factorization could not be */ +/* > completed. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doublePOcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dpotf2_(char *uplo, integer *n, doublereal *a, integer * + lda, integer *info, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + integer j; + doublereal ajj; + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, + integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen); + logical upper; + extern logical disnan_(doublereal *); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DPOTF2", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + if (upper) { + +/* Compute the Cholesky factorization A = U**T *U. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + +/* Compute U(J,J) and test for non-positive-definiteness. */ + + i__2 = j - 1; + ajj = a[j + j * a_dim1] - ddot_(&i__2, &a[j * a_dim1 + 1], &c__1, + &a[j * a_dim1 + 1], &c__1); + if (ajj <= 0. || disnan_(&ajj)) { + a[j + j * a_dim1] = ajj; + goto L30; + } + ajj = sqrt(ajj); + a[j + j * a_dim1] = ajj; + +/* Compute elements J+1:N of row J. */ + + if (j < *n) { + i__2 = j - 1; + i__3 = *n - j; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b10, &a[(j + 1) * a_dim1 + + 1], lda, &a[j * a_dim1 + 1], &c__1, &c_b12, &a[j + ( + j + 1) * a_dim1], lda, (ftnlen)9); + i__2 = *n - j; + d__1 = 1. / ajj; + dscal_(&i__2, &d__1, &a[j + (j + 1) * a_dim1], lda); + } +/* L10: */ + } + } else { + +/* Compute the Cholesky factorization A = L*L**T. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + +/* Compute L(J,J) and test for non-positive-definiteness. */ + + i__2 = j - 1; + ajj = a[j + j * a_dim1] - ddot_(&i__2, &a[j + a_dim1], lda, &a[j + + a_dim1], lda); + if (ajj <= 0. || disnan_(&ajj)) { + a[j + j * a_dim1] = ajj; + goto L30; + } + ajj = sqrt(ajj); + a[j + j * a_dim1] = ajj; + +/* Compute elements J+1:N of column J. */ + + if (j < *n) { + i__2 = *n - j; + i__3 = j - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b10, &a[j + 1 + + a_dim1], lda, &a[j + a_dim1], lda, &c_b12, &a[j + 1 + + j * a_dim1], &c__1, (ftnlen)12); + i__2 = *n - j; + d__1 = 1. / ajj; + dscal_(&i__2, &d__1, &a[j + 1 + j * a_dim1], &c__1); + } +/* L20: */ + } + } + goto L40; + +L30: + *info = j; + +L40: + return 0; + +/* End of DPOTF2 */ + +} /* dpotf2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dpotrf.cpp b/lib/linalg/dpotrf.cpp new file mode 100644 index 0000000000..cd343efd77 --- /dev/null +++ b/lib/linalg/dpotrf.cpp @@ -0,0 +1,322 @@ +/* fortran/dpotrf.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static doublereal c_b13 = -1.; +static doublereal c_b14 = 1.; + +/* > \brief \b DPOTRF */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DPOTRF + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DPOTRF( UPLO, N, A, LDA, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDA, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DPOTRF computes the Cholesky factorization of a real symmetric */ +/* > positive definite matrix A. */ +/* > */ +/* > The factorization has the form */ +/* > A = U**T * U, if UPLO = 'U', or */ +/* > A = L * L**T, if UPLO = 'L', */ +/* > where U is an upper triangular matrix and L is lower triangular. */ +/* > */ +/* > This is the block version of the algorithm, calling Level 3 BLAS. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A is stored; */ +/* > = 'L': Lower triangle of A is stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ +/* > N-by-N upper triangular part of A contains the upper */ +/* > triangular part of the matrix A, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading N-by-N lower triangular part of A contains the lower */ +/* > triangular part of the matrix A, and the strictly upper */ +/* > triangular part of A is not referenced. */ +/* > */ +/* > On exit, if INFO = 0, the factor U or L from the Cholesky */ +/* > factorization A = U**T*U or A = L*L**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, the leading minor of order i is not */ +/* > positive definite, and the factorization could not be */ +/* > completed. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doublePOcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dpotrf_(char *uplo, integer *n, doublereal *a, integer * + lda, integer *info, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + + /* Local variables */ + integer j, jb, nb; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + logical upper; + extern /* Subroutine */ int dsyrk_(char *, char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, doublereal *, + integer *, ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dpotrf2_(char *, integer *, doublereal *, + integer *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DPOTRF", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* Determine the block size for this environment. */ + + nb = ilaenv_(&c__1, (char *)"DPOTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( + ftnlen)1); + if (nb <= 1 || nb >= *n) { + +/* Use unblocked code. */ + + dpotrf2_(uplo, n, &a[a_offset], lda, info, (ftnlen)1); + } else { + +/* Use blocked code. */ + + if (upper) { + +/* Compute the Cholesky factorization A = U**T*U. */ + + i__1 = *n; + i__2 = nb; + for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + +/* Update and factorize the current diagonal block and test */ +/* for non-positive-definiteness. */ + +/* Computing MIN */ + i__3 = nb, i__4 = *n - j + 1; + jb = min(i__3,i__4); + i__3 = j - 1; + dsyrk_((char *)"Upper", (char *)"Transpose", &jb, &i__3, &c_b13, &a[j * + a_dim1 + 1], lda, &c_b14, &a[j + j * a_dim1], lda, ( + ftnlen)5, (ftnlen)9); + dpotrf2_((char *)"Upper", &jb, &a[j + j * a_dim1], lda, info, (ftnlen) + 5); + if (*info != 0) { + goto L30; + } + if (j + jb <= *n) { + +/* Compute the current block row. */ + + i__3 = *n - j - jb + 1; + i__4 = j - 1; + dgemm_((char *)"Transpose", (char *)"No transpose", &jb, &i__3, &i__4, & + c_b13, &a[j * a_dim1 + 1], lda, &a[(j + jb) * + a_dim1 + 1], lda, &c_b14, &a[j + (j + jb) * + a_dim1], lda, (ftnlen)9, (ftnlen)12); + i__3 = *n - j - jb + 1; + dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", &jb, & + i__3, &c_b14, &a[j + j * a_dim1], lda, &a[j + (j + + jb) * a_dim1], lda, (ftnlen)4, (ftnlen)5, ( + ftnlen)9, (ftnlen)8); + } +/* L10: */ + } + + } else { + +/* Compute the Cholesky factorization A = L*L**T. */ + + i__2 = *n; + i__1 = nb; + for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { + +/* Update and factorize the current diagonal block and test */ +/* for non-positive-definiteness. */ + +/* Computing MIN */ + i__3 = nb, i__4 = *n - j + 1; + jb = min(i__3,i__4); + i__3 = j - 1; + dsyrk_((char *)"Lower", (char *)"No transpose", &jb, &i__3, &c_b13, &a[j + + a_dim1], lda, &c_b14, &a[j + j * a_dim1], lda, ( + ftnlen)5, (ftnlen)12); + dpotrf2_((char *)"Lower", &jb, &a[j + j * a_dim1], lda, info, (ftnlen) + 5); + if (*info != 0) { + goto L30; + } + if (j + jb <= *n) { + +/* Compute the current block column. */ + + i__3 = *n - j - jb + 1; + i__4 = j - 1; + dgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &jb, &i__4, & + c_b13, &a[j + jb + a_dim1], lda, &a[j + a_dim1], + lda, &c_b14, &a[j + jb + j * a_dim1], lda, ( + ftnlen)12, (ftnlen)9); + i__3 = *n - j - jb + 1; + dtrsm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Non-unit", &i__3, & + jb, &c_b14, &a[j + j * a_dim1], lda, &a[j + jb + + j * a_dim1], lda, (ftnlen)5, (ftnlen)5, (ftnlen)9, + (ftnlen)8); + } +/* L20: */ + } + } + } + goto L40; + +L30: + *info = *info + j - 1; + +L40: + return 0; + +/* End of DPOTRF */ + +} /* dpotrf_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dpotrf2.cpp b/lib/linalg/dpotrf2.cpp new file mode 100644 index 0000000000..9b882bb9e0 --- /dev/null +++ b/lib/linalg/dpotrf2.cpp @@ -0,0 +1,285 @@ +/* static/dpotrf2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b9 = 1.; +static doublereal c_b11 = -1.; + +/* > \brief \b DPOTRF2 */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* RECURSIVE SUBROUTINE DPOTRF2( UPLO, N, A, LDA, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDA, N */ +/* .. */ +/* .. Array Arguments .. */ +/* REAL A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DPOTRF2 computes the Cholesky factorization of a real symmetric */ +/* > positive definite matrix A using the recursive algorithm. */ +/* > */ +/* > The factorization has the form */ +/* > A = U**T * U, if UPLO = 'U', or */ +/* > A = L * L**T, if UPLO = 'L', */ +/* > where U is an upper triangular matrix and L is lower triangular. */ +/* > */ +/* > This is the recursive version of the algorithm. It divides */ +/* > the matrix into four submatrices: */ +/* > */ +/* > [ A11 | A12 ] where A11 is n1 by n1 and A22 is n2 by n2 */ +/* > A = [ -----|----- ] with n1 = n/2 */ +/* > [ A21 | A22 ] n2 = n-n1 */ +/* > */ +/* > The subroutine calls itself to factor A11. Update and scale A21 */ +/* > or A12, update A22 then calls itself to factor A22. */ +/* > */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A is stored; */ +/* > = 'L': Lower triangle of A is stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ +/* > N-by-N upper triangular part of A contains the upper */ +/* > triangular part of the matrix A, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading N-by-N lower triangular part of A contains the lower */ +/* > triangular part of the matrix A, and the strictly upper */ +/* > triangular part of A is not referenced. */ +/* > */ +/* > On exit, if INFO = 0, the factor U or L from the Cholesky */ +/* > factorization A = U**T*U or A = L*L**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, the leading minor of order i is not */ +/* > positive definite, and the factorization could not be */ +/* > completed. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doublePOcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dpotrf2_(char *uplo, integer *n, doublereal *a, integer * + lda, integer *info, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + integer n1, n2; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo; + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + logical upper; + extern /* Subroutine */ int dsyrk_(char *, char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, doublereal *, + integer *, ftnlen, ftnlen); + extern logical disnan_(doublereal *); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DPOTRF2", &i__1, (ftnlen)7); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* N=1 case */ + + if (*n == 1) { + +/* Test for non-positive-definiteness */ + + if (a[a_dim1 + 1] <= 0. || disnan_(&a[a_dim1 + 1])) { + *info = 1; + return 0; + } + +/* Factor */ + + a[a_dim1 + 1] = sqrt(a[a_dim1 + 1]); + +/* Use recursive code */ + + } else { + n1 = *n / 2; + n2 = *n - n1; + +/* Factor A11 */ + + dpotrf2_(uplo, &n1, &a[a_dim1 + 1], lda, &iinfo, (ftnlen)1); + if (iinfo != 0) { + *info = iinfo; + return 0; + } + +/* Compute the Cholesky factorization A = U**T*U */ + + if (upper) { + +/* Update and scale A12 */ + + dtrsm_((char *)"L", (char *)"U", (char *)"T", (char *)"N", &n1, &n2, &c_b9, &a[a_dim1 + 1], lda, & + a[(n1 + 1) * a_dim1 + 1], lda, (ftnlen)1, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + +/* Update and factor A22 */ + + dsyrk_(uplo, (char *)"T", &n2, &n1, &c_b11, &a[(n1 + 1) * a_dim1 + 1], + lda, &c_b9, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, (ftnlen) + 1, (ftnlen)1); + dpotrf2_(uplo, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &iinfo, ( + ftnlen)1); + if (iinfo != 0) { + *info = iinfo + n1; + return 0; + } + +/* Compute the Cholesky factorization A = L*L**T */ + + } else { + +/* Update and scale A21 */ + + dtrsm_((char *)"R", (char *)"L", (char *)"T", (char *)"N", &n2, &n1, &c_b9, &a[a_dim1 + 1], lda, & + a[n1 + 1 + a_dim1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + +/* Update and factor A22 */ + + dsyrk_(uplo, (char *)"N", &n2, &n1, &c_b11, &a[n1 + 1 + a_dim1], lda, & + c_b9, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, (ftnlen)1, ( + ftnlen)1); + dpotrf2_(uplo, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &iinfo, ( + ftnlen)1); + if (iinfo != 0) { + *info = iinfo + n1; + return 0; + } + } + } + return 0; + +/* End of DPOTRF2 */ + +} /* dpotrf2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dpotrs.cpp b/lib/linalg/dpotrs.cpp new file mode 100644 index 0000000000..169f851130 --- /dev/null +++ b/lib/linalg/dpotrs.cpp @@ -0,0 +1,248 @@ +/* fortran/dpotrs.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b9 = 1.; + +/* > \brief \b DPOTRS */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DPOTRS + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DPOTRS( UPLO, N, NRHS, A, LDA, B, LDB, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDA, LDB, N, NRHS */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DPOTRS solves a system of linear equations A*X = B with a symmetric */ +/* > positive definite matrix A using the Cholesky factorization */ +/* > A = U**T*U or A = L*L**T computed by DPOTRF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A is stored; */ +/* > = 'L': Lower triangle of A is stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NRHS */ +/* > \verbatim */ +/* > NRHS is INTEGER */ +/* > The number of right hand sides, i.e., the number of columns */ +/* > of the matrix B. NRHS >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > The triangular factor U or L from the Cholesky factorization */ +/* > A = U**T*U or A = L*L**T, as computed by DPOTRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ +/* > On entry, the right hand side matrix B. */ +/* > On exit, the solution matrix X. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doublePOcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dpotrs_(char *uplo, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * + info, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + + /* Local variables */ + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*nrhs < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } else if (*ldb < max(1,*n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DPOTRS", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0 || *nrhs == 0) { + return 0; + } + + if (upper) { + +/* Solve A*X = B where A = U**T *U. */ + +/* Solve U**T *X = B, overwriting B with X. */ + + dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b9, &a[ + a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)9, (ftnlen)8); + +/* Solve U*X = B, overwriting B with X. */ + + dtrsm_((char *)"Left", (char *)"Upper", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b9, & + a[a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)12, (ftnlen)8); + } else { + +/* Solve A*X = B where A = L*L**T. */ + +/* Solve L*X = B, overwriting B with X. */ + + dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b9, & + a[a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)12, (ftnlen)8); + +/* Solve L**T *X = B, overwriting B with X. */ + + dtrsm_((char *)"Left", (char *)"Lower", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b9, &a[ + a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)9, (ftnlen)8); + } + + return 0; + +/* End of DPOTRS */ + +} /* dpotrs_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/drot.cpp b/lib/linalg/drot.cpp new file mode 100644 index 0000000000..efd339cdf0 --- /dev/null +++ b/lib/linalg/drot.cpp @@ -0,0 +1,180 @@ +/* fortran/drot.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DROT */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DROT(N,DX,INCX,DY,INCY,C,S) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION C,S */ +/* INTEGER INCX,INCY,N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION DX(*),DY(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DROT applies a plane rotation. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DX */ +/* > \verbatim */ +/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of DX */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DY */ +/* > \verbatim */ +/* > DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > storage spacing between elements of DY */ +/* > \endverbatim */ +/* > */ +/* > \param[in] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, linpack, 3/11/78. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int drot_(integer *n, doublereal *dx, integer *incx, + doublereal *dy, integer *incy, doublereal *c__, doublereal *s) +{ + /* System generated locals */ + integer i__1; + + /* Local variables */ + integer i__, ix, iy; + doublereal dtemp; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ + /* Parameter adjustments */ + --dy; + --dx; + + /* Function Body */ + if (*n <= 0) { + return 0; + } + if (*incx == 1 && *incy == 1) { + +/* code for both increments equal to 1 */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp = *c__ * dx[i__] + *s * dy[i__]; + dy[i__] = *c__ * dy[i__] - *s * dx[i__]; + dx[i__] = dtemp; + } + } else { + +/* code for unequal increments or equal increments not equal */ +/* to 1 */ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp = *c__ * dx[ix] + *s * dy[iy]; + dy[iy] = *c__ * dy[iy] - *s * dx[ix]; + dx[ix] = dtemp; + ix += *incx; + iy += *incy; + } + } + return 0; + +/* End of DROT */ + +} /* drot_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/drscl.cpp b/lib/linalg/drscl.cpp new file mode 100644 index 0000000000..041c7fbba3 --- /dev/null +++ b/lib/linalg/drscl.cpp @@ -0,0 +1,200 @@ +/* fortran/drscl.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DRSCL multiplies a vector by the reciprocal of a real scalar. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DRSCL + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DRSCL( N, SA, SX, INCX ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX, N */ +/* DOUBLE PRECISION SA */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION SX( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DRSCL multiplies an n-element real vector x by the real scalar 1/a. */ +/* > This is done without overflow or underflow as long as */ +/* > the final result x/a does not overflow or underflow. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of components of the vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] SA */ +/* > \verbatim */ +/* > SA is DOUBLE PRECISION */ +/* > The scalar a which is used to divide each component of x. */ +/* > SA must be >= 0, or the subroutine will divide by zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] SX */ +/* > \verbatim */ +/* > SX is DOUBLE PRECISION array, dimension */ +/* > (1+(N-1)*abs(INCX)) */ +/* > The n-element vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > The increment between successive values of the vector SX. */ +/* > > 0: SX(1) = X(1) and SX(1+(i-1)*INCX) = x(i), 1< i<= n */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int drscl_(integer *n, doublereal *sa, doublereal *sx, + integer *incx) +{ + doublereal mul, cden; + logical done; + doublereal cnum, cden1, cnum1; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dlabad_(doublereal *, doublereal *); + extern doublereal dlamch_(char *, ftnlen); + doublereal bignum, smlnum; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick return if possible */ + + /* Parameter adjustments */ + --sx; + + /* Function Body */ + if (*n <= 0) { + return 0; + } + +/* Get machine parameters */ + + smlnum = dlamch_((char *)"S", (ftnlen)1); + bignum = 1. / smlnum; + dlabad_(&smlnum, &bignum); + +/* Initialize the denominator to SA and the numerator to 1. */ + + cden = *sa; + cnum = 1.; + +L10: + cden1 = cden * smlnum; + cnum1 = cnum / bignum; + if (abs(cden1) > abs(cnum) && cnum != 0.) { + +/* Pre-multiply X by SMLNUM if CDEN is large compared to CNUM. */ + + mul = smlnum; + done = FALSE_; + cden = cden1; + } else if (abs(cnum1) > abs(cden)) { + +/* Pre-multiply X by BIGNUM if CDEN is small compared to CNUM. */ + + mul = bignum; + done = FALSE_; + cnum = cnum1; + } else { + +/* Multiply X by CNUM / CDEN and return. */ + + mul = cnum / cden; + done = TRUE_; + } + +/* Scale the vector X by MUL */ + + dscal_(n, &mul, &sx[1], incx); + + if (! done) { + goto L10; + } + + return 0; + +/* End of DRSCL */ + +} /* drscl_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dscal.cpp b/lib/linalg/dscal.cpp new file mode 100644 index 0000000000..d1fc1d43ee --- /dev/null +++ b/lib/linalg/dscal.cpp @@ -0,0 +1,173 @@ +/* fortran/dscal.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DSCAL */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSCAL(N,DA,DX,INCX) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION DA */ +/* INTEGER INCX,N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION DX(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSCAL scales a vector by a constant. */ +/* > uses unrolled loops for increment equal to 1. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DA */ +/* > \verbatim */ +/* > DA is DOUBLE PRECISION */ +/* > On entry, DA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DX */ +/* > \verbatim */ +/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of DX */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, linpack, 3/11/78. */ +/* > modified 3/93 to return if incx .le. 0. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dscal_(integer *n, doublereal *da, doublereal *dx, + integer *incx) +{ + /* System generated locals */ + integer i__1, i__2; + + /* Local variables */ + integer i__, m, mp1, nincx; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. Parameters .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + /* Parameter adjustments */ + --dx; + + /* Function Body */ + if (*n <= 0 || *incx <= 0 || *da == 1.) { + return 0; + } + if (*incx == 1) { + +/* code for increment equal to 1 */ + + +/* clean-up loop */ + + m = *n % 5; + if (m != 0) { + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + dx[i__] = *da * dx[i__]; + } + if (*n < 5) { + return 0; + } + } + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 5) { + dx[i__] = *da * dx[i__]; + dx[i__ + 1] = *da * dx[i__ + 1]; + dx[i__ + 2] = *da * dx[i__ + 2]; + dx[i__ + 3] = *da * dx[i__ + 3]; + dx[i__ + 4] = *da * dx[i__ + 4]; + } + } else { + +/* code for increment not equal to 1 */ + + nincx = *n * *incx; + i__1 = nincx; + i__2 = *incx; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + dx[i__] = *da * dx[i__]; + } + } + return 0; + +/* End of DSCAL */ + +} /* dscal_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dstedc.cpp b/lib/linalg/dstedc.cpp new file mode 100644 index 0000000000..e71b373994 --- /dev/null +++ b/lib/linalg/dstedc.cpp @@ -0,0 +1,576 @@ +/* fortran/dstedc.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__9 = 9; +static integer c__0 = 0; +static integer c__2 = 2; +static doublereal c_b17 = 0.; +static doublereal c_b18 = 1.; +static integer c__1 = 1; + +/* > \brief \b DSTEDC */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DSTEDC + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, */ +/* LIWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER COMPZ */ +/* INTEGER INFO, LDZ, LIWORK, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IWORK( * ) */ +/* DOUBLE PRECISION D( * ), E( * ), WORK( * ), Z( LDZ, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSTEDC computes all eigenvalues and, optionally, eigenvectors of a */ +/* > symmetric tridiagonal matrix using the divide and conquer method. */ +/* > The eigenvectors of a full or band real symmetric matrix can also be */ +/* > found if DSYTRD or DSPTRD or DSBTRD has been used to reduce this */ +/* > matrix to tridiagonal form. */ +/* > */ +/* > This code makes very mild assumptions about floating point */ +/* > arithmetic. It will work on machines with a guard digit in */ +/* > add/subtract, or on those binary machines without guard digits */ +/* > which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. */ +/* > It could conceivably fail on hexadecimal or decimal machines */ +/* > without guard digits, but we know of none. See DLAED3 for details. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] COMPZ */ +/* > \verbatim */ +/* > COMPZ is CHARACTER*1 */ +/* > = 'N': Compute eigenvalues only. */ +/* > = 'I': Compute eigenvectors of tridiagonal matrix also. */ +/* > = 'V': Compute eigenvectors of original dense symmetric */ +/* > matrix also. On entry, Z contains the orthogonal */ +/* > matrix used to reduce the original matrix to */ +/* > tridiagonal form. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the diagonal elements of the tridiagonal matrix. */ +/* > On exit, if INFO = 0, the eigenvalues in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > On entry, the subdiagonal elements of the tridiagonal matrix. */ +/* > On exit, E has been destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension (LDZ,N) */ +/* > On entry, if COMPZ = 'V', then Z contains the orthogonal */ +/* > matrix used in the reduction to tridiagonal form. */ +/* > On exit, if INFO = 0, then if COMPZ = 'V', Z contains the */ +/* > orthonormal eigenvectors of the original symmetric matrix, */ +/* > and if COMPZ = 'I', Z contains the orthonormal eigenvectors */ +/* > of the symmetric tridiagonal matrix. */ +/* > If COMPZ = 'N', then Z is not referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDZ */ +/* > \verbatim */ +/* > LDZ is INTEGER */ +/* > The leading dimension of the array Z. LDZ >= 1. */ +/* > If eigenvectors are desired, then LDZ >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > If COMPZ = 'N' or N <= 1 then LWORK must be at least 1. */ +/* > If COMPZ = 'V' and N > 1 then LWORK must be at least */ +/* > ( 1 + 3*N + 2*N*lg N + 4*N**2 ), */ +/* > where lg( N ) = smallest integer k such */ +/* > that 2**k >= N. */ +/* > If COMPZ = 'I' and N > 1 then LWORK must be at least */ +/* > ( 1 + 4*N + N**2 ). */ +/* > Note that for COMPZ = 'I' or 'V', then if N is less than or */ +/* > equal to the minimum divide size, usually 25, then LWORK need */ +/* > only be max(1,2*(N-1)). */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension (MAX(1,LIWORK)) */ +/* > On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LIWORK */ +/* > \verbatim */ +/* > LIWORK is INTEGER */ +/* > The dimension of the array IWORK. */ +/* > If COMPZ = 'N' or N <= 1 then LIWORK must be at least 1. */ +/* > If COMPZ = 'V' and N > 1 then LIWORK must be at least */ +/* > ( 6 + 6*N + 5*N*lg N ). */ +/* > If COMPZ = 'I' and N > 1 then LIWORK must be at least */ +/* > ( 3 + 5*N ). */ +/* > Note that for COMPZ = 'I' or 'V', then if N is less than or */ +/* > equal to the minimum divide size, usually 25, then LIWORK */ +/* > need only be 1. */ +/* > */ +/* > If LIWORK = -1, then a workspace query is assumed; the */ +/* > routine only calculates the optimal size of the IWORK array, */ +/* > returns this value as the first entry of the IWORK array, and */ +/* > no error message related to LIWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: The algorithm failed to compute an eigenvalue while */ +/* > working on the submatrix lying in rows and columns */ +/* > INFO/(N+1) through mod(INFO,N+1). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Jeff Rutter, Computer Science Division, University of California */ +/* > at Berkeley, USA \n */ +/* > Modified by Francoise Tisseur, University of Tennessee */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dstedc_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublereal *z__, integer *ldz, doublereal *work, + integer *lwork, integer *iwork, integer *liwork, integer *info, + ftnlen compz_len) +{ + /* System generated locals */ + integer z_dim1, z_offset, i__1, i__2; + doublereal d__1, d__2; + + /* Builtin functions */ + double log(doublereal); + integer pow_ii(integer *, integer *); + double sqrt(doublereal); + + /* Local variables */ + integer i__, j, k, m; + doublereal p; + integer ii, lgn; + doublereal eps, tiny; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, + doublereal *, integer *); + integer lwmin; + extern /* Subroutine */ int dlaed0_(integer *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, integer *); + integer start; + extern doublereal dlamch_(char *, ftnlen); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dlacpy_(char *, integer *, integer + *, doublereal *, integer *, doublereal *, integer *, ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + integer finish; + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, + ftnlen); + extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, + integer *), dlasrt_(char *, integer *, doublereal *, integer *, + ftnlen); + integer liwmin, icompz; + extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + ftnlen); + doublereal orgnrm; + logical lquery; + integer smlsiz, storez, strtrw; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --e; + z_dim1 = *ldz; + z_offset = 1 + z_dim1; + z__ -= z_offset; + --work; + --iwork; + + /* Function Body */ + *info = 0; + lquery = *lwork == -1 || *liwork == -1; + + if (lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1)) { + icompz = 0; + } else if (lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1)) { + icompz = 1; + } else if (lsame_(compz, (char *)"I", (ftnlen)1, (ftnlen)1)) { + icompz = 2; + } else { + icompz = -1; + } + if (icompz < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { + *info = -6; + } + + if (*info == 0) { + +/* Compute the workspace requirements */ + + smlsiz = ilaenv_(&c__9, (char *)"DSTEDC", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( + ftnlen)6, (ftnlen)1); + if (*n <= 1 || icompz == 0) { + liwmin = 1; + lwmin = 1; + } else if (*n <= smlsiz) { + liwmin = 1; + lwmin = *n - 1 << 1; + } else { + lgn = (integer) (log((doublereal) (*n)) / log(2.)); + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + if (icompz == 1) { +/* Computing 2nd power */ + i__1 = *n; + lwmin = *n * 3 + 1 + (*n << 1) * lgn + (i__1 * i__1 << 2); + liwmin = *n * 6 + 6 + *n * 5 * lgn; + } else if (icompz == 2) { +/* Computing 2nd power */ + i__1 = *n; + lwmin = (*n << 2) + 1 + i__1 * i__1; + liwmin = *n * 5 + 3; + } + } + work[1] = (doublereal) lwmin; + iwork[1] = liwmin; + + if (*lwork < lwmin && ! lquery) { + *info = -8; + } else if (*liwork < liwmin && ! lquery) { + *info = -10; + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSTEDC", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + if (*n == 1) { + if (icompz != 0) { + z__[z_dim1 + 1] = 1.; + } + return 0; + } + +/* If the following conditional clause is removed, then the routine */ +/* will use the Divide and Conquer routine to compute only the */ +/* eigenvalues, which requires (3N + 3N**2) real workspace and */ +/* (2 + 5N + 2N lg(N)) integer workspace. */ +/* Since on many architectures DSTERF is much faster than any other */ +/* algorithm for finding eigenvalues only, it is used here */ +/* as the default. If the conditional clause is removed, then */ +/* information on the size of workspace needs to be changed. */ + +/* If COMPZ = 'N', use DSTERF to compute the eigenvalues. */ + + if (icompz == 0) { + dsterf_(n, &d__[1], &e[1], info); + goto L50; + } + +/* If N is smaller than the minimum divide size (SMLSIZ+1), then */ +/* solve the problem with another solver. */ + + if (*n <= smlsiz) { + + dsteqr_(compz, n, &d__[1], &e[1], &z__[z_offset], ldz, &work[1], info, + (ftnlen)1); + + } else { + +/* If COMPZ = 'V', the Z matrix must be stored elsewhere for later */ +/* use. */ + + if (icompz == 1) { + storez = *n * *n + 1; + } else { + storez = 1; + } + + if (icompz == 2) { + dlaset_((char *)"Full", n, n, &c_b17, &c_b18, &z__[z_offset], ldz, ( + ftnlen)4); + } + +/* Scale. */ + + orgnrm = dlanst_((char *)"M", n, &d__[1], &e[1], (ftnlen)1); + if (orgnrm == 0.) { + goto L50; + } + + eps = dlamch_((char *)"Epsilon", (ftnlen)7); + + start = 1; + +/* while ( START <= N ) */ + +L10: + if (start <= *n) { + +/* Let FINISH be the position of the next subdiagonal entry */ +/* such that E( FINISH ) <= TINY or FINISH = N if no such */ +/* subdiagonal exists. The matrix identified by the elements */ +/* between START and FINISH constitutes an independent */ +/* sub-problem. */ + + finish = start; +L20: + if (finish < *n) { + tiny = eps * sqrt((d__1 = d__[finish], abs(d__1))) * sqrt(( + d__2 = d__[finish + 1], abs(d__2))); + if ((d__1 = e[finish], abs(d__1)) > tiny) { + ++finish; + goto L20; + } + } + +/* (Sub) Problem determined. Compute its size and solve it. */ + + m = finish - start + 1; + if (m == 1) { + start = finish + 1; + goto L10; + } + if (m > smlsiz) { + +/* Scale. */ + + orgnrm = dlanst_((char *)"M", &m, &d__[start], &e[start], (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &m, &c__1, &d__[ + start], &m, info, (ftnlen)1); + i__1 = m - 1; + i__2 = m - 1; + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &i__1, &c__1, &e[ + start], &i__2, info, (ftnlen)1); + + if (icompz == 1) { + strtrw = 1; + } else { + strtrw = start; + } + dlaed0_(&icompz, n, &m, &d__[start], &e[start], &z__[strtrw + + start * z_dim1], ldz, &work[1], n, &work[storez], & + iwork[1], info); + if (*info != 0) { + *info = (*info / (m + 1) + start - 1) * (*n + 1) + *info % + (m + 1) + start - 1; + goto L50; + } + +/* Scale back. */ + + dlascl_((char *)"G", &c__0, &c__0, &c_b18, &orgnrm, &m, &c__1, &d__[ + start], &m, info, (ftnlen)1); + + } else { + if (icompz == 1) { + +/* Since QR won't update a Z matrix which is larger than */ +/* the length of D, we must solve the sub-problem in a */ +/* workspace and then multiply back into Z. */ + + dsteqr_((char *)"I", &m, &d__[start], &e[start], &work[1], &m, & + work[m * m + 1], info, (ftnlen)1); + dlacpy_((char *)"A", n, &m, &z__[start * z_dim1 + 1], ldz, &work[ + storez], n, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", n, &m, &m, &c_b18, &work[storez], n, & + work[1], &m, &c_b17, &z__[start * z_dim1 + 1], + ldz, (ftnlen)1, (ftnlen)1); + } else if (icompz == 2) { + dsteqr_((char *)"I", &m, &d__[start], &e[start], &z__[start + + start * z_dim1], ldz, &work[1], info, (ftnlen)1); + } else { + dsterf_(&m, &d__[start], &e[start], info); + } + if (*info != 0) { + *info = start * (*n + 1) + finish; + goto L50; + } + } + + start = finish + 1; + goto L10; + } + +/* endwhile */ + + if (icompz == 0) { + +/* Use Quick Sort */ + + dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); + + } else { + +/* Use Selection Sort to minimize swaps of eigenvectors */ + + i__1 = *n; + for (ii = 2; ii <= i__1; ++ii) { + i__ = ii - 1; + k = i__; + p = d__[i__]; + i__2 = *n; + for (j = ii; j <= i__2; ++j) { + if (d__[j] < p) { + k = j; + p = d__[j]; + } +/* L30: */ + } + if (k != i__) { + d__[k] = d__[i__]; + d__[i__] = p; + dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + + 1], &c__1); + } +/* L40: */ + } + } + } + +L50: + work[1] = (doublereal) lwmin; + iwork[1] = liwmin; + + return 0; + +/* End of DSTEDC */ + +} /* dstedc_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsteqr.cpp b/lib/linalg/dsteqr.cpp new file mode 100644 index 0000000000..65209d15d3 --- /dev/null +++ b/lib/linalg/dsteqr.cpp @@ -0,0 +1,704 @@ +/* fortran/dsteqr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b9 = 0.; +static doublereal c_b10 = 1.; +static integer c__0 = 0; +static integer c__1 = 1; +static integer c__2 = 2; + +/* > \brief \b DSTEQR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DSTEQR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER COMPZ */ +/* INTEGER INFO, LDZ, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( * ), E( * ), WORK( * ), Z( LDZ, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSTEQR computes all eigenvalues and, optionally, eigenvectors of a */ +/* > symmetric tridiagonal matrix using the implicit QL or QR method. */ +/* > The eigenvectors of a full or band symmetric matrix can also be found */ +/* > if DSYTRD or DSPTRD or DSBTRD has been used to reduce this matrix to */ +/* > tridiagonal form. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] COMPZ */ +/* > \verbatim */ +/* > COMPZ is CHARACTER*1 */ +/* > = 'N': Compute eigenvalues only. */ +/* > = 'V': Compute eigenvalues and eigenvectors of the original */ +/* > symmetric matrix. On entry, Z must contain the */ +/* > orthogonal matrix used to reduce the original matrix */ +/* > to tridiagonal form. */ +/* > = 'I': Compute eigenvalues and eigenvectors of the */ +/* > tridiagonal matrix. Z is initialized to the identity */ +/* > matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the diagonal elements of the tridiagonal matrix. */ +/* > On exit, if INFO = 0, the eigenvalues in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > On entry, the (n-1) subdiagonal elements of the tridiagonal */ +/* > matrix. */ +/* > On exit, E has been destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension (LDZ, N) */ +/* > On entry, if COMPZ = 'V', then Z contains the orthogonal */ +/* > matrix used in the reduction to tridiagonal form. */ +/* > On exit, if INFO = 0, then if COMPZ = 'V', Z contains the */ +/* > orthonormal eigenvectors of the original symmetric matrix, */ +/* > and if COMPZ = 'I', Z contains the orthonormal eigenvectors */ +/* > of the symmetric tridiagonal matrix. */ +/* > If COMPZ = 'N', then Z is not referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDZ */ +/* > \verbatim */ +/* > LDZ is INTEGER */ +/* > The leading dimension of the array Z. LDZ >= 1, and if */ +/* > eigenvectors are desired, then LDZ >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (max(1,2*N-2)) */ +/* > If COMPZ = 'N', then WORK is not referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: the algorithm has failed to find all the eigenvalues in */ +/* > a total of 30*N iterations; if INFO = i, then i */ +/* > elements of E have not converged to zero; on exit, D */ +/* > and E contain the elements of a symmetric tridiagonal */ +/* > matrix which is orthogonally similar to the original */ +/* > matrix. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dsteqr_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublereal *z__, integer *ldz, doublereal *work, + integer *info, ftnlen compz_len) +{ + /* System generated locals */ + integer z_dim1, z_offset, i__1, i__2; + doublereal d__1, d__2; + + /* Builtin functions */ + double sqrt(doublereal), d_sign(doublereal *, doublereal *); + + /* Local variables */ + doublereal b, c__, f, g; + integer i__, j, k, l, m; + doublereal p, r__, s; + integer l1, ii, mm, lm1, mm1, nm1; + doublereal rt1, rt2, eps; + integer lsv; + doublereal tst, eps2; + integer lend, jtot; + extern /* Subroutine */ int dlae2_(doublereal *, doublereal *, doublereal + *, doublereal *, doublereal *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dlasr_(char *, char *, char *, integer *, + integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen, ftnlen); + doublereal anorm; + extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, + doublereal *, integer *), dlaev2_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *); + integer lendm1, lendp1; + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); + integer iscale; + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dlaset_(char *, integer *, integer + *, doublereal *, doublereal *, doublereal *, integer *, ftnlen); + doublereal safmin; + extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); + doublereal safmax; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, + ftnlen); + extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, + integer *, ftnlen); + integer lendsv; + doublereal ssfmin; + integer nmaxit, icompz; + doublereal ssfmax; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --e; + z_dim1 = *ldz; + z_offset = 1 + z_dim1; + z__ -= z_offset; + --work; + + /* Function Body */ + *info = 0; + + if (lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1)) { + icompz = 0; + } else if (lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1)) { + icompz = 1; + } else if (lsame_(compz, (char *)"I", (ftnlen)1, (ftnlen)1)) { + icompz = 2; + } else { + icompz = -1; + } + if (icompz < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { + *info = -6; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSTEQR", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + if (*n == 1) { + if (icompz == 2) { + z__[z_dim1 + 1] = 1.; + } + return 0; + } + +/* Determine the unit roundoff and over/underflow thresholds. */ + + eps = dlamch_((char *)"E", (ftnlen)1); +/* Computing 2nd power */ + d__1 = eps; + eps2 = d__1 * d__1; + safmin = dlamch_((char *)"S", (ftnlen)1); + safmax = 1. / safmin; + ssfmax = sqrt(safmax) / 3.; + ssfmin = sqrt(safmin) / eps2; + +/* Compute the eigenvalues and eigenvectors of the tridiagonal */ +/* matrix. */ + + if (icompz == 2) { + dlaset_((char *)"Full", n, n, &c_b9, &c_b10, &z__[z_offset], ldz, (ftnlen)4); + } + + nmaxit = *n * 30; + jtot = 0; + +/* Determine where the matrix splits and choose QL or QR iteration */ +/* for each block, according to whether top or bottom diagonal */ +/* element is smaller. */ + + l1 = 1; + nm1 = *n - 1; + +L10: + if (l1 > *n) { + goto L160; + } + if (l1 > 1) { + e[l1 - 1] = 0.; + } + if (l1 <= nm1) { + i__1 = nm1; + for (m = l1; m <= i__1; ++m) { + tst = (d__1 = e[m], abs(d__1)); + if (tst == 0.) { + goto L30; + } + if (tst <= sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m + + 1], abs(d__2))) * eps) { + e[m] = 0.; + goto L30; + } +/* L20: */ + } + } + m = *n; + +L30: + l = l1; + lsv = l; + lend = m; + lendsv = lend; + l1 = m + 1; + if (lend == l) { + goto L10; + } + +/* Scale submatrix in rows and columns L to LEND */ + + i__1 = lend - l + 1; + anorm = dlanst_((char *)"M", &i__1, &d__[l], &e[l], (ftnlen)1); + iscale = 0; + if (anorm == 0.) { + goto L10; + } + if (anorm > ssfmax) { + iscale = 1; + i__1 = lend - l + 1; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, + info, (ftnlen)1); + i__1 = lend - l; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, + info, (ftnlen)1); + } else if (anorm < ssfmin) { + iscale = 2; + i__1 = lend - l + 1; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, + info, (ftnlen)1); + i__1 = lend - l; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, + info, (ftnlen)1); + } + +/* Choose between QL and QR iteration */ + + if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { + lend = lsv; + l = lendsv; + } + + if (lend > l) { + +/* QL Iteration */ + +/* Look for small subdiagonal element. */ + +L40: + if (l != lend) { + lendm1 = lend - 1; + i__1 = lendm1; + for (m = l; m <= i__1; ++m) { +/* Computing 2nd power */ + d__2 = (d__1 = e[m], abs(d__1)); + tst = d__2 * d__2; + if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m + + 1], abs(d__2)) + safmin) { + goto L60; + } +/* L50: */ + } + } + + m = lend; + +L60: + if (m < lend) { + e[m] = 0.; + } + p = d__[l]; + if (m == l) { + goto L80; + } + +/* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ +/* to compute its eigensystem. */ + + if (m == l + 1) { + if (icompz > 0) { + dlaev2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s); + work[l] = c__; + work[*n - 1 + l] = s; + dlasr_((char *)"R", (char *)"V", (char *)"B", n, &c__2, &work[l], &work[*n - 1 + l], & + z__[l * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + } else { + dlae2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2); + } + d__[l] = rt1; + d__[l + 1] = rt2; + e[l] = 0.; + l += 2; + if (l <= lend) { + goto L40; + } + goto L140; + } + + if (jtot == nmaxit) { + goto L140; + } + ++jtot; + +/* Form shift. */ + + g = (d__[l + 1] - p) / (e[l] * 2.); + r__ = dlapy2_(&g, &c_b10); + g = d__[m] - p + e[l] / (g + d_sign(&r__, &g)); + + s = 1.; + c__ = 1.; + p = 0.; + +/* Inner loop */ + + mm1 = m - 1; + i__1 = l; + for (i__ = mm1; i__ >= i__1; --i__) { + f = s * e[i__]; + b = c__ * e[i__]; + dlartg_(&g, &f, &c__, &s, &r__); + if (i__ != m - 1) { + e[i__ + 1] = r__; + } + g = d__[i__ + 1] - p; + r__ = (d__[i__] - g) * s + c__ * 2. * b; + p = s * r__; + d__[i__ + 1] = g + p; + g = c__ * r__ - b; + +/* If eigenvectors are desired, then save rotations. */ + + if (icompz > 0) { + work[i__] = c__; + work[*n - 1 + i__] = -s; + } + +/* L70: */ + } + +/* If eigenvectors are desired, then apply saved rotations. */ + + if (icompz > 0) { + mm = m - l + 1; + dlasr_((char *)"R", (char *)"V", (char *)"B", n, &mm, &work[l], &work[*n - 1 + l], &z__[l + * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + + d__[l] -= p; + e[l] = g; + goto L40; + +/* Eigenvalue found. */ + +L80: + d__[l] = p; + + ++l; + if (l <= lend) { + goto L40; + } + goto L140; + + } else { + +/* QR Iteration */ + +/* Look for small superdiagonal element. */ + +L90: + if (l != lend) { + lendp1 = lend + 1; + i__1 = lendp1; + for (m = l; m >= i__1; --m) { +/* Computing 2nd power */ + d__2 = (d__1 = e[m - 1], abs(d__1)); + tst = d__2 * d__2; + if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m + - 1], abs(d__2)) + safmin) { + goto L110; + } +/* L100: */ + } + } + + m = lend; + +L110: + if (m > lend) { + e[m - 1] = 0.; + } + p = d__[l]; + if (m == l) { + goto L130; + } + +/* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ +/* to compute its eigensystem. */ + + if (m == l - 1) { + if (icompz > 0) { + dlaev2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s) + ; + work[m] = c__; + work[*n - 1 + m] = s; + dlasr_((char *)"R", (char *)"V", (char *)"F", n, &c__2, &work[m], &work[*n - 1 + m], & + z__[(l - 1) * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + } else { + dlae2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2); + } + d__[l - 1] = rt1; + d__[l] = rt2; + e[l - 1] = 0.; + l += -2; + if (l >= lend) { + goto L90; + } + goto L140; + } + + if (jtot == nmaxit) { + goto L140; + } + ++jtot; + +/* Form shift. */ + + g = (d__[l - 1] - p) / (e[l - 1] * 2.); + r__ = dlapy2_(&g, &c_b10); + g = d__[m] - p + e[l - 1] / (g + d_sign(&r__, &g)); + + s = 1.; + c__ = 1.; + p = 0.; + +/* Inner loop */ + + lm1 = l - 1; + i__1 = lm1; + for (i__ = m; i__ <= i__1; ++i__) { + f = s * e[i__]; + b = c__ * e[i__]; + dlartg_(&g, &f, &c__, &s, &r__); + if (i__ != m) { + e[i__ - 1] = r__; + } + g = d__[i__] - p; + r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b; + p = s * r__; + d__[i__] = g + p; + g = c__ * r__ - b; + +/* If eigenvectors are desired, then save rotations. */ + + if (icompz > 0) { + work[i__] = c__; + work[*n - 1 + i__] = s; + } + +/* L120: */ + } + +/* If eigenvectors are desired, then apply saved rotations. */ + + if (icompz > 0) { + mm = l - m + 1; + dlasr_((char *)"R", (char *)"V", (char *)"F", n, &mm, &work[m], &work[*n - 1 + m], &z__[m + * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + + d__[l] -= p; + e[lm1] = g; + goto L90; + +/* Eigenvalue found. */ + +L130: + d__[l] = p; + + --l; + if (l >= lend) { + goto L90; + } + goto L140; + + } + +/* Undo scaling if necessary */ + +L140: + if (iscale == 1) { + i__1 = lendsv - lsv + 1; + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], + n, info, (ftnlen)1); + i__1 = lendsv - lsv; + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n, + info, (ftnlen)1); + } else if (iscale == 2) { + i__1 = lendsv - lsv + 1; + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], + n, info, (ftnlen)1); + i__1 = lendsv - lsv; + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n, + info, (ftnlen)1); + } + +/* Check for no convergence to an eigenvalue after a total */ +/* of N*MAXIT iterations. */ + + if (jtot < nmaxit) { + goto L10; + } + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + if (e[i__] != 0.) { + ++(*info); + } +/* L150: */ + } + goto L190; + +/* Order eigenvalues and eigenvectors. */ + +L160: + if (icompz == 0) { + +/* Use Quick Sort */ + + dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); + + } else { + +/* Use Selection Sort to minimize swaps of eigenvectors */ + + i__1 = *n; + for (ii = 2; ii <= i__1; ++ii) { + i__ = ii - 1; + k = i__; + p = d__[i__]; + i__2 = *n; + for (j = ii; j <= i__2; ++j) { + if (d__[j] < p) { + k = j; + p = d__[j]; + } +/* L170: */ + } + if (k != i__) { + d__[k] = d__[i__]; + d__[i__] = p; + dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], + &c__1); + } +/* L180: */ + } + } + +L190: + return 0; + +/* End of DSTEQR */ + +} /* dsteqr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsterf.cpp b/lib/linalg/dsterf.cpp new file mode 100644 index 0000000000..03172b87f3 --- /dev/null +++ b/lib/linalg/dsterf.cpp @@ -0,0 +1,534 @@ +/* fortran/dsterf.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__0 = 0; +static integer c__1 = 1; +static doublereal c_b33 = 1.; + +/* > \brief \b DSTERF */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DSTERF + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSTERF( N, D, E, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( * ), E( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSTERF computes all eigenvalues of a symmetric tridiagonal matrix */ +/* > using the Pal-Walker-Kahan variant of the QL or QR algorithm. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the n diagonal elements of the tridiagonal matrix. */ +/* > On exit, if INFO = 0, the eigenvalues in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > On entry, the (n-1) subdiagonal elements of the tridiagonal */ +/* > matrix. */ +/* > On exit, E has been destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: the algorithm failed to find all of the eigenvalues in */ +/* > a total of 30*N iterations; if INFO = i, then i */ +/* > elements of E have not converged to zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup auxOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dsterf_(integer *n, doublereal *d__, doublereal *e, + integer *info) +{ + /* System generated locals */ + integer i__1; + doublereal d__1, d__2, d__3; + + /* Builtin functions */ + double sqrt(doublereal), d_sign(doublereal *, doublereal *); + + /* Local variables */ + doublereal c__; + integer i__, l, m; + doublereal p, r__, s; + integer l1; + doublereal bb, rt1, rt2, eps, rte; + integer lsv; + doublereal eps2, oldc; + integer lend; + doublereal rmax; + integer jtot; + extern /* Subroutine */ int dlae2_(doublereal *, doublereal *, doublereal + *, doublereal *, doublereal *); + doublereal gamma, alpha, sigma, anorm; + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); + integer iscale; + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen); + doublereal oldgam, safmin; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + doublereal safmax; + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, + ftnlen); + extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, + integer *, ftnlen); + integer lendsv; + doublereal ssfmin; + integer nmaxit; + doublereal ssfmax; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --e; + --d__; + + /* Function Body */ + *info = 0; + +/* Quick return if possible */ + + if (*n < 0) { + *info = -1; + i__1 = -(*info); + xerbla_((char *)"DSTERF", &i__1, (ftnlen)6); + return 0; + } + if (*n <= 1) { + return 0; + } + +/* Determine the unit roundoff for this environment. */ + + eps = dlamch_((char *)"E", (ftnlen)1); +/* Computing 2nd power */ + d__1 = eps; + eps2 = d__1 * d__1; + safmin = dlamch_((char *)"S", (ftnlen)1); + safmax = 1. / safmin; + ssfmax = sqrt(safmax) / 3.; + ssfmin = sqrt(safmin) / eps2; + rmax = dlamch_((char *)"O", (ftnlen)1); + +/* Compute the eigenvalues of the tridiagonal matrix. */ + + nmaxit = *n * 30; + sigma = 0.; + jtot = 0; + +/* Determine where the matrix splits and choose QL or QR iteration */ +/* for each block, according to whether top or bottom diagonal */ +/* element is smaller. */ + + l1 = 1; + +L10: + if (l1 > *n) { + goto L170; + } + if (l1 > 1) { + e[l1 - 1] = 0.; + } + i__1 = *n - 1; + for (m = l1; m <= i__1; ++m) { + if ((d__3 = e[m], abs(d__3)) <= sqrt((d__1 = d__[m], abs(d__1))) * + sqrt((d__2 = d__[m + 1], abs(d__2))) * eps) { + e[m] = 0.; + goto L30; + } +/* L20: */ + } + m = *n; + +L30: + l = l1; + lsv = l; + lend = m; + lendsv = lend; + l1 = m + 1; + if (lend == l) { + goto L10; + } + +/* Scale submatrix in rows and columns L to LEND */ + + i__1 = lend - l + 1; + anorm = dlanst_((char *)"M", &i__1, &d__[l], &e[l], (ftnlen)1); + iscale = 0; + if (anorm == 0.) { + goto L10; + } + if (anorm > ssfmax) { + iscale = 1; + i__1 = lend - l + 1; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, + info, (ftnlen)1); + i__1 = lend - l; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, + info, (ftnlen)1); + } else if (anorm < ssfmin) { + iscale = 2; + i__1 = lend - l + 1; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, + info, (ftnlen)1); + i__1 = lend - l; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, + info, (ftnlen)1); + } + + i__1 = lend - 1; + for (i__ = l; i__ <= i__1; ++i__) { +/* Computing 2nd power */ + d__1 = e[i__]; + e[i__] = d__1 * d__1; +/* L40: */ + } + +/* Choose between QL and QR iteration */ + + if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { + lend = lsv; + l = lendsv; + } + + if (lend >= l) { + +/* QL Iteration */ + +/* Look for small subdiagonal element. */ + +L50: + if (l != lend) { + i__1 = lend - 1; + for (m = l; m <= i__1; ++m) { + if ((d__2 = e[m], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m + + 1], abs(d__1))) { + goto L70; + } +/* L60: */ + } + } + m = lend; + +L70: + if (m < lend) { + e[m] = 0.; + } + p = d__[l]; + if (m == l) { + goto L90; + } + +/* If remaining matrix is 2 by 2, use DLAE2 to compute its */ +/* eigenvalues. */ + + if (m == l + 1) { + rte = sqrt(e[l]); + dlae2_(&d__[l], &rte, &d__[l + 1], &rt1, &rt2); + d__[l] = rt1; + d__[l + 1] = rt2; + e[l] = 0.; + l += 2; + if (l <= lend) { + goto L50; + } + goto L150; + } + + if (jtot == nmaxit) { + goto L150; + } + ++jtot; + +/* Form shift. */ + + rte = sqrt(e[l]); + sigma = (d__[l + 1] - p) / (rte * 2.); + r__ = dlapy2_(&sigma, &c_b33); + sigma = p - rte / (sigma + d_sign(&r__, &sigma)); + + c__ = 1.; + s = 0.; + gamma = d__[m] - sigma; + p = gamma * gamma; + +/* Inner loop */ + + i__1 = l; + for (i__ = m - 1; i__ >= i__1; --i__) { + bb = e[i__]; + r__ = p + bb; + if (i__ != m - 1) { + e[i__ + 1] = s * r__; + } + oldc = c__; + c__ = p / r__; + s = bb / r__; + oldgam = gamma; + alpha = d__[i__]; + gamma = c__ * (alpha - sigma) - s * oldgam; + d__[i__ + 1] = oldgam + (alpha - gamma); + if (c__ != 0.) { + p = gamma * gamma / c__; + } else { + p = oldc * bb; + } +/* L80: */ + } + + e[l] = s * p; + d__[l] = sigma + gamma; + goto L50; + +/* Eigenvalue found. */ + +L90: + d__[l] = p; + + ++l; + if (l <= lend) { + goto L50; + } + goto L150; + + } else { + +/* QR Iteration */ + +/* Look for small superdiagonal element. */ + +L100: + i__1 = lend + 1; + for (m = l; m >= i__1; --m) { + if ((d__2 = e[m - 1], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m + - 1], abs(d__1))) { + goto L120; + } +/* L110: */ + } + m = lend; + +L120: + if (m > lend) { + e[m - 1] = 0.; + } + p = d__[l]; + if (m == l) { + goto L140; + } + +/* If remaining matrix is 2 by 2, use DLAE2 to compute its */ +/* eigenvalues. */ + + if (m == l - 1) { + rte = sqrt(e[l - 1]); + dlae2_(&d__[l], &rte, &d__[l - 1], &rt1, &rt2); + d__[l] = rt1; + d__[l - 1] = rt2; + e[l - 1] = 0.; + l += -2; + if (l >= lend) { + goto L100; + } + goto L150; + } + + if (jtot == nmaxit) { + goto L150; + } + ++jtot; + +/* Form shift. */ + + rte = sqrt(e[l - 1]); + sigma = (d__[l - 1] - p) / (rte * 2.); + r__ = dlapy2_(&sigma, &c_b33); + sigma = p - rte / (sigma + d_sign(&r__, &sigma)); + + c__ = 1.; + s = 0.; + gamma = d__[m] - sigma; + p = gamma * gamma; + +/* Inner loop */ + + i__1 = l - 1; + for (i__ = m; i__ <= i__1; ++i__) { + bb = e[i__]; + r__ = p + bb; + if (i__ != m) { + e[i__ - 1] = s * r__; + } + oldc = c__; + c__ = p / r__; + s = bb / r__; + oldgam = gamma; + alpha = d__[i__ + 1]; + gamma = c__ * (alpha - sigma) - s * oldgam; + d__[i__] = oldgam + (alpha - gamma); + if (c__ != 0.) { + p = gamma * gamma / c__; + } else { + p = oldc * bb; + } +/* L130: */ + } + + e[l - 1] = s * p; + d__[l] = sigma + gamma; + goto L100; + +/* Eigenvalue found. */ + +L140: + d__[l] = p; + + --l; + if (l >= lend) { + goto L100; + } + goto L150; + + } + +/* Undo scaling if necessary */ + +L150: + if (iscale == 1) { + i__1 = lendsv - lsv + 1; + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], + n, info, (ftnlen)1); + } + if (iscale == 2) { + i__1 = lendsv - lsv + 1; + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], + n, info, (ftnlen)1); + } + +/* Check for no convergence to an eigenvalue after a total */ +/* of N*MAXIT iterations. */ + + if (jtot < nmaxit) { + goto L10; + } + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + if (e[i__] != 0.) { + ++(*info); + } +/* L160: */ + } + goto L180; + +/* Sort eigenvalues in increasing order. */ + +L170: + dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); + +L180: + return 0; + +/* End of DSTERF */ + +} /* dsterf_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dswap.cpp b/lib/linalg/dswap.cpp new file mode 100644 index 0000000000..a1eca4fc06 --- /dev/null +++ b/lib/linalg/dswap.cpp @@ -0,0 +1,194 @@ +/* fortran/dswap.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DSWAP */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSWAP(N,DX,INCX,DY,INCY) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,INCY,N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION DX(*),DY(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSWAP interchanges two vectors. */ +/* > uses unrolled loops for increments equal to 1. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DX */ +/* > \verbatim */ +/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of DX */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] DY */ +/* > \verbatim */ +/* > DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > storage spacing between elements of DY */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, linpack, 3/11/78. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dswap_(integer *n, doublereal *dx, integer *incx, + doublereal *dy, integer *incy) +{ + /* System generated locals */ + integer i__1; + + /* Local variables */ + integer i__, m, ix, iy, mp1; + doublereal dtemp; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + /* Parameter adjustments */ + --dy; + --dx; + + /* Function Body */ + if (*n <= 0) { + return 0; + } + if (*incx == 1 && *incy == 1) { + +/* code for both increments equal to 1 */ + + +/* clean-up loop */ + + m = *n % 3; + if (m != 0) { + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp = dx[i__]; + dx[i__] = dy[i__]; + dy[i__] = dtemp; + } + if (*n < 3) { + return 0; + } + } + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 3) { + dtemp = dx[i__]; + dx[i__] = dy[i__]; + dy[i__] = dtemp; + dtemp = dx[i__ + 1]; + dx[i__ + 1] = dy[i__ + 1]; + dy[i__ + 1] = dtemp; + dtemp = dx[i__ + 2]; + dx[i__ + 2] = dy[i__ + 2]; + dy[i__ + 2] = dtemp; + } + } else { + +/* code for unequal increments or equal increments not equal */ +/* to 1 */ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp = dx[ix]; + dx[ix] = dy[iy]; + dy[iy] = dtemp; + ix += *incx; + iy += *incy; + } + } + return 0; + +/* End of DSWAP */ + +} /* dswap_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsyev.cpp b/lib/linalg/dsyev.cpp new file mode 100644 index 0000000000..603b633195 --- /dev/null +++ b/lib/linalg/dsyev.cpp @@ -0,0 +1,369 @@ +/* fortran/dsyev.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__0 = 0; +static doublereal c_b17 = 1.; + +/* > \brief DSYEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matr +ices */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DSYEV + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER JOBZ, UPLO */ +/* INTEGER INFO, LDA, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYEV computes all eigenvalues and, optionally, eigenvectors of a */ +/* > real symmetric matrix A. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] JOBZ */ +/* > \verbatim */ +/* > JOBZ is CHARACTER*1 */ +/* > = 'N': Compute eigenvalues only; */ +/* > = 'V': Compute eigenvalues and eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A is stored; */ +/* > = 'L': Lower triangle of A is stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA, N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the */ +/* > leading N-by-N upper triangular part of A contains the */ +/* > upper triangular part of the matrix A. If UPLO = 'L', */ +/* > the leading N-by-N lower triangular part of A contains */ +/* > the lower triangular part of the matrix A. */ +/* > On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ +/* > orthonormal eigenvectors of the matrix A. */ +/* > If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') */ +/* > or the upper triangle (if UPLO='U') of A, including the */ +/* > diagonal, is destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] W */ +/* > \verbatim */ +/* > W is DOUBLE PRECISION array, dimension (N) */ +/* > If INFO = 0, the eigenvalues in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The length of the array WORK. LWORK >= max(1,3*N-1). */ +/* > For optimal efficiency, LWORK >= (NB+2)*N, */ +/* > where NB is the blocksize for DSYTRD returned by ILAENV. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, the algorithm failed to converge; i */ +/* > off-diagonal elements of an intermediate tridiagonal */ +/* > form did not converge to zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleSYeigen */ + +/* ===================================================================== */ +/* Subroutine */ int dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, + integer *lda, doublereal *w, doublereal *work, integer *lwork, + integer *info, ftnlen jobz_len, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + integer nb; + doublereal eps; + integer inde; + doublereal anrm; + integer imax; + doublereal rmin, rmax; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); + doublereal sigma; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo; + logical lower, wantz; + extern doublereal dlamch_(char *, ftnlen); + integer iscale; + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen); + doublereal safmin; + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + doublereal bignum; + integer indtau; + extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, + integer *); + extern doublereal dlansy_(char *, char *, integer *, doublereal *, + integer *, doublereal *, ftnlen, ftnlen); + integer indwrk; + extern /* Subroutine */ int dorgtr_(char *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *, + ftnlen), dsteqr_(char *, integer *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen), + dsytrd_(char *, integer *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, integer *, + ftnlen); + integer llwork; + doublereal smlnum; + integer lwkopt; + logical lquery; + + +/* -- LAPACK driver routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --w; + --work; + + /* Function Body */ + wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); + lower = lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + + *info = 0; + if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + *info = -1; + } else if (! (lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } + + if (*info == 0) { + nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, + (ftnlen)1); +/* Computing MAX */ + i__1 = 1, i__2 = (nb + 2) * *n; + lwkopt = max(i__1,i__2); + work[1] = (doublereal) lwkopt; + +/* Computing MAX */ + i__1 = 1, i__2 = *n * 3 - 1; + if (*lwork < max(i__1,i__2) && ! lquery) { + *info = -8; + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYEV ", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + if (*n == 1) { + w[1] = a[a_dim1 + 1]; + work[1] = 2.; + if (wantz) { + a[a_dim1 + 1] = 1.; + } + return 0; + } + +/* Get machine constants. */ + + safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); + eps = dlamch_((char *)"Precision", (ftnlen)9); + smlnum = safmin / eps; + bignum = 1. / smlnum; + rmin = sqrt(smlnum); + rmax = sqrt(bignum); + +/* Scale matrix to allowable range, if necessary. */ + + anrm = dlansy_((char *)"M", uplo, n, &a[a_offset], lda, &work[1], (ftnlen)1, ( + ftnlen)1); + iscale = 0; + if (anrm > 0. && anrm < rmin) { + iscale = 1; + sigma = rmin / anrm; + } else if (anrm > rmax) { + iscale = 1; + sigma = rmax / anrm; + } + if (iscale == 1) { + dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, + info, (ftnlen)1); + } + +/* Call DSYTRD to reduce symmetric matrix to tridiagonal form. */ + + inde = 1; + indtau = inde + *n; + indwrk = indtau + *n; + llwork = *lwork - indwrk + 1; + dsytrd_(uplo, n, &a[a_offset], lda, &w[1], &work[inde], &work[indtau], & + work[indwrk], &llwork, &iinfo, (ftnlen)1); + +/* For eigenvalues only, call DSTERF. For eigenvectors, first call */ +/* DORGTR to generate the orthogonal matrix, then call DSTEQR. */ + + if (! wantz) { + dsterf_(n, &w[1], &work[inde], info); + } else { + dorgtr_(uplo, n, &a[a_offset], lda, &work[indtau], &work[indwrk], & + llwork, &iinfo, (ftnlen)1); + dsteqr_(jobz, n, &w[1], &work[inde], &a[a_offset], lda, &work[indtau], + info, (ftnlen)1); + } + +/* If matrix was scaled, then rescale eigenvalues appropriately. */ + + if (iscale == 1) { + if (*info == 0) { + imax = *n; + } else { + imax = *info - 1; + } + d__1 = 1. / sigma; + dscal_(&imax, &d__1, &w[1], &c__1); + } + +/* Set WORK(1) to optimal workspace size. */ + + work[1] = (doublereal) lwkopt; + + return 0; + +/* End of DSYEV */ + +} /* dsyev_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsyevd.cpp b/lib/linalg/dsyevd.cpp new file mode 100644 index 0000000000..a0e0084884 --- /dev/null +++ b/lib/linalg/dsyevd.cpp @@ -0,0 +1,440 @@ +/* fortran/dsyevd.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__0 = 0; +static doublereal c_b17 = 1.; + +/* > \brief DSYEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY mat +rices */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DSYEVD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK, */ +/* LIWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER JOBZ, UPLO */ +/* INTEGER INFO, LDA, LIWORK, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IWORK( * ) */ +/* DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYEVD computes all eigenvalues and, optionally, eigenvectors of a */ +/* > real symmetric matrix A. If eigenvectors are desired, it uses a */ +/* > divide and conquer algorithm. */ +/* > */ +/* > The divide and conquer algorithm makes very mild assumptions about */ +/* > floating point arithmetic. It will work on machines with a guard */ +/* > digit in add/subtract, or on those binary machines without guard */ +/* > digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ +/* > Cray-2. It could conceivably fail on hexadecimal or decimal machines */ +/* > without guard digits, but we know of none. */ +/* > */ +/* > Because of large use of BLAS of level 3, DSYEVD needs N**2 more */ +/* > workspace than DSYEVX. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] JOBZ */ +/* > \verbatim */ +/* > JOBZ is CHARACTER*1 */ +/* > = 'N': Compute eigenvalues only; */ +/* > = 'V': Compute eigenvalues and eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A is stored; */ +/* > = 'L': Lower triangle of A is stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA, N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the */ +/* > leading N-by-N upper triangular part of A contains the */ +/* > upper triangular part of the matrix A. If UPLO = 'L', */ +/* > the leading N-by-N lower triangular part of A contains */ +/* > the lower triangular part of the matrix A. */ +/* > On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ +/* > orthonormal eigenvectors of the matrix A. */ +/* > If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') */ +/* > or the upper triangle (if UPLO='U') of A, including the */ +/* > diagonal, is destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] W */ +/* > \verbatim */ +/* > W is DOUBLE PRECISION array, dimension (N) */ +/* > If INFO = 0, the eigenvalues in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, */ +/* > dimension (LWORK) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > If N <= 1, LWORK must be at least 1. */ +/* > If JOBZ = 'N' and N > 1, LWORK must be at least 2*N+1. */ +/* > If JOBZ = 'V' and N > 1, LWORK must be at least */ +/* > 1 + 6*N + 2*N**2. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal sizes of the WORK and IWORK */ +/* > arrays, returns these values as the first entries of the WORK */ +/* > and IWORK arrays, and no error message related to LWORK or */ +/* > LIWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension (MAX(1,LIWORK)) */ +/* > On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LIWORK */ +/* > \verbatim */ +/* > LIWORK is INTEGER */ +/* > The dimension of the array IWORK. */ +/* > If N <= 1, LIWORK must be at least 1. */ +/* > If JOBZ = 'N' and N > 1, LIWORK must be at least 1. */ +/* > If JOBZ = 'V' and N > 1, LIWORK must be at least 3 + 5*N. */ +/* > */ +/* > If LIWORK = -1, then a workspace query is assumed; the */ +/* > routine only calculates the optimal sizes of the WORK and */ +/* > IWORK arrays, returns these values as the first entries of */ +/* > the WORK and IWORK arrays, and no error message related to */ +/* > LWORK or LIWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i and JOBZ = 'N', then the algorithm failed */ +/* > to converge; i off-diagonal elements of an intermediate */ +/* > tridiagonal form did not converge to zero; */ +/* > if INFO = i and JOBZ = 'V', then the algorithm failed */ +/* > to compute an eigenvalue while working on the submatrix */ +/* > lying in rows and columns INFO/(N+1) through */ +/* > mod(INFO,N+1). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleSYeigen */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Jeff Rutter, Computer Science Division, University of California */ +/* > at Berkeley, USA \n */ +/* > Modified by Francoise Tisseur, University of Tennessee \n */ +/* > Modified description of INFO. Sven, 16 Feb 05. \n */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dsyevd_(char *jobz, char *uplo, integer *n, doublereal * + a, integer *lda, doublereal *w, doublereal *work, integer *lwork, + integer *iwork, integer *liwork, integer *info, ftnlen jobz_len, + ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal eps; + integer inde; + doublereal anrm, rmin, rmax; + integer lopt; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); + doublereal sigma; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo, lwmin, liopt; + logical lower, wantz; + integer indwk2, llwrk2; + extern doublereal dlamch_(char *, ftnlen); + integer iscale; + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dstedc_(char *, integer *, + doublereal *, doublereal *, doublereal *, integer *, doublereal *, + integer *, integer *, integer *, integer *, ftnlen), dlacpy_( + char *, integer *, integer *, doublereal *, integer *, doublereal + *, integer *, ftnlen); + doublereal safmin; + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + doublereal bignum; + integer indtau; + extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, + integer *); + extern doublereal dlansy_(char *, char *, integer *, doublereal *, + integer *, doublereal *, ftnlen, ftnlen); + integer indwrk, liwmin; + extern /* Subroutine */ int dormtr_(char *, char *, char *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen, + ftnlen), dsytrd_(char *, integer *, doublereal *, integer *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *, ftnlen); + integer llwork; + doublereal smlnum; + logical lquery; + + +/* -- LAPACK driver routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ + +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --w; + --work; + --iwork; + + /* Function Body */ + wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); + lower = lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1 || *liwork == -1; + + *info = 0; + if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + *info = -1; + } else if (! (lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } + + if (*info == 0) { + if (*n <= 1) { + liwmin = 1; + lwmin = 1; + lopt = lwmin; + liopt = liwmin; + } else { + if (wantz) { + liwmin = *n * 5 + 3; +/* Computing 2nd power */ + i__1 = *n; + lwmin = *n * 6 + 1 + (i__1 * i__1 << 1); + } else { + liwmin = 1; + lwmin = (*n << 1) + 1; + } +/* Computing MAX */ + i__1 = lwmin, i__2 = (*n << 1) + *n * ilaenv_(&c__1, (char *)"DSYTRD", + uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + lopt = max(i__1,i__2); + liopt = liwmin; + } + work[1] = (doublereal) lopt; + iwork[1] = liopt; + + if (*lwork < lwmin && ! lquery) { + *info = -8; + } else if (*liwork < liwmin && ! lquery) { + *info = -10; + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYEVD", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + if (*n == 1) { + w[1] = a[a_dim1 + 1]; + if (wantz) { + a[a_dim1 + 1] = 1.; + } + return 0; + } + +/* Get machine constants. */ + + safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); + eps = dlamch_((char *)"Precision", (ftnlen)9); + smlnum = safmin / eps; + bignum = 1. / smlnum; + rmin = sqrt(smlnum); + rmax = sqrt(bignum); + +/* Scale matrix to allowable range, if necessary. */ + + anrm = dlansy_((char *)"M", uplo, n, &a[a_offset], lda, &work[1], (ftnlen)1, ( + ftnlen)1); + iscale = 0; + if (anrm > 0. && anrm < rmin) { + iscale = 1; + sigma = rmin / anrm; + } else if (anrm > rmax) { + iscale = 1; + sigma = rmax / anrm; + } + if (iscale == 1) { + dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, + info, (ftnlen)1); + } + +/* Call DSYTRD to reduce symmetric matrix to tridiagonal form. */ + + inde = 1; + indtau = inde + *n; + indwrk = indtau + *n; + llwork = *lwork - indwrk + 1; + indwk2 = indwrk + *n * *n; + llwrk2 = *lwork - indwk2 + 1; + + dsytrd_(uplo, n, &a[a_offset], lda, &w[1], &work[inde], &work[indtau], & + work[indwrk], &llwork, &iinfo, (ftnlen)1); + +/* For eigenvalues only, call DSTERF. For eigenvectors, first call */ +/* DSTEDC to generate the eigenvector matrix, WORK(INDWRK), of the */ +/* tridiagonal matrix, then call DORMTR to multiply it by the */ +/* Householder transformations stored in A. */ + + if (! wantz) { + dsterf_(n, &w[1], &work[inde], info); + } else { + dstedc_((char *)"I", n, &w[1], &work[inde], &work[indwrk], n, &work[indwk2], & + llwrk2, &iwork[1], liwork, info, (ftnlen)1); + dormtr_((char *)"L", uplo, (char *)"N", n, n, &a[a_offset], lda, &work[indtau], &work[ + indwrk], n, &work[indwk2], &llwrk2, &iinfo, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + dlacpy_((char *)"A", n, n, &work[indwrk], n, &a[a_offset], lda, (ftnlen)1); + } + +/* If matrix was scaled, then rescale eigenvalues appropriately. */ + + if (iscale == 1) { + d__1 = 1. / sigma; + dscal_(n, &d__1, &w[1], &c__1); + } + + work[1] = (doublereal) lopt; + iwork[1] = liopt; + + return 0; + +/* End of DSYEVD */ + +} /* dsyevd_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsygs2.cpp b/lib/linalg/dsygs2.cpp new file mode 100644 index 0000000000..8b0089be28 --- /dev/null +++ b/lib/linalg/dsygs2.cpp @@ -0,0 +1,381 @@ +/* fortran/dsygs2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b6 = -1.; +static integer c__1 = 1; +static doublereal c_b27 = 1.; + +/* > \brief \b DSYGS2 reduces a symmetric definite generalized eigenproblem to standard form, using the factor +ization results obtained from spotrf (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DSYGS2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, ITYPE, LDA, LDB, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYGS2 reduces a real symmetric-definite generalized eigenproblem */ +/* > to standard form. */ +/* > */ +/* > If ITYPE = 1, the problem is A*x = lambda*B*x, */ +/* > and A is overwritten by inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T) */ +/* > */ +/* > If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or */ +/* > B*A*x = lambda*x, and A is overwritten by U*A*U**T or L**T *A*L. */ +/* > */ +/* > B must have been previously factorized as U**T *U or L*L**T by DPOTRF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ITYPE */ +/* > \verbatim */ +/* > ITYPE is INTEGER */ +/* > = 1: compute inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T); */ +/* > = 2 or 3: compute U*A*U**T or L**T *A*L. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies whether the upper or lower triangular part of the */ +/* > symmetric matrix A is stored, and how B has been factorized. */ +/* > = 'U': Upper triangular */ +/* > = 'L': Lower triangular */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrices A and B. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ +/* > n by n upper triangular part of A contains the upper */ +/* > triangular part of the matrix A, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading n by n lower triangular part of A contains the lower */ +/* > triangular part of the matrix A, and the strictly upper */ +/* > triangular part of A is not referenced. */ +/* > */ +/* > On exit, if INFO = 0, the transformed matrix, stored in the */ +/* > same format as A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB,N) */ +/* > The triangular factor from the Cholesky factorization of B, */ +/* > as returned by DPOTRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleSYcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dsygs2_(integer *itype, char *uplo, integer *n, + doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * + info, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; + doublereal d__1; + + /* Local variables */ + integer k; + doublereal ct, akk, bkk; + extern /* Subroutine */ int dsyr2_(char *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen), dscal_(integer *, doublereal *, doublereal *, + integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *); + logical upper; + extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen), dtrsv_(char *, char *, char *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (*itype < 1 || *itype > 3) { + *info = -1; + } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } else if (*ldb < max(1,*n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYGS2", &i__1, (ftnlen)6); + return 0; + } + + if (*itype == 1) { + if (upper) { + +/* Compute inv(U**T)*A*inv(U) */ + + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + +/* Update the upper triangle of A(k:n,k:n) */ + + akk = a[k + k * a_dim1]; + bkk = b[k + k * b_dim1]; +/* Computing 2nd power */ + d__1 = bkk; + akk /= d__1 * d__1; + a[k + k * a_dim1] = akk; + if (k < *n) { + i__2 = *n - k; + d__1 = 1. / bkk; + dscal_(&i__2, &d__1, &a[k + (k + 1) * a_dim1], lda); + ct = akk * -.5; + i__2 = *n - k; + daxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + ( + k + 1) * a_dim1], lda); + i__2 = *n - k; + dsyr2_(uplo, &i__2, &c_b6, &a[k + (k + 1) * a_dim1], lda, + &b[k + (k + 1) * b_dim1], ldb, &a[k + 1 + (k + 1) + * a_dim1], lda, (ftnlen)1); + i__2 = *n - k; + daxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + ( + k + 1) * a_dim1], lda); + i__2 = *n - k; + dtrsv_(uplo, (char *)"Transpose", (char *)"Non-unit", &i__2, &b[k + 1 + ( + k + 1) * b_dim1], ldb, &a[k + (k + 1) * a_dim1], + lda, (ftnlen)1, (ftnlen)9, (ftnlen)8); + } +/* L10: */ + } + } else { + +/* Compute inv(L)*A*inv(L**T) */ + + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + +/* Update the lower triangle of A(k:n,k:n) */ + + akk = a[k + k * a_dim1]; + bkk = b[k + k * b_dim1]; +/* Computing 2nd power */ + d__1 = bkk; + akk /= d__1 * d__1; + a[k + k * a_dim1] = akk; + if (k < *n) { + i__2 = *n - k; + d__1 = 1. / bkk; + dscal_(&i__2, &d__1, &a[k + 1 + k * a_dim1], &c__1); + ct = akk * -.5; + i__2 = *n - k; + daxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + + 1 + k * a_dim1], &c__1); + i__2 = *n - k; + dsyr2_(uplo, &i__2, &c_b6, &a[k + 1 + k * a_dim1], &c__1, + &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + (k + 1) + * a_dim1], lda, (ftnlen)1); + i__2 = *n - k; + daxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + + 1 + k * a_dim1], &c__1); + i__2 = *n - k; + dtrsv_(uplo, (char *)"No transpose", (char *)"Non-unit", &i__2, &b[k + 1 + + (k + 1) * b_dim1], ldb, &a[k + 1 + k * a_dim1], + &c__1, (ftnlen)1, (ftnlen)12, (ftnlen)8); + } +/* L20: */ + } + } + } else { + if (upper) { + +/* Compute U*A*U**T */ + + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + +/* Update the upper triangle of A(1:k,1:k) */ + + akk = a[k + k * a_dim1]; + bkk = b[k + k * b_dim1]; + i__2 = k - 1; + dtrmv_(uplo, (char *)"No transpose", (char *)"Non-unit", &i__2, &b[b_offset], + ldb, &a[k * a_dim1 + 1], &c__1, (ftnlen)1, (ftnlen)12, + (ftnlen)8); + ct = akk * .5; + i__2 = k - 1; + daxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + + 1], &c__1); + i__2 = k - 1; + dsyr2_(uplo, &i__2, &c_b27, &a[k * a_dim1 + 1], &c__1, &b[k * + b_dim1 + 1], &c__1, &a[a_offset], lda, (ftnlen)1); + i__2 = k - 1; + daxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + + 1], &c__1); + i__2 = k - 1; + dscal_(&i__2, &bkk, &a[k * a_dim1 + 1], &c__1); +/* Computing 2nd power */ + d__1 = bkk; + a[k + k * a_dim1] = akk * (d__1 * d__1); +/* L30: */ + } + } else { + +/* Compute L**T *A*L */ + + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + +/* Update the lower triangle of A(1:k,1:k) */ + + akk = a[k + k * a_dim1]; + bkk = b[k + k * b_dim1]; + i__2 = k - 1; + dtrmv_(uplo, (char *)"Transpose", (char *)"Non-unit", &i__2, &b[b_offset], + ldb, &a[k + a_dim1], lda, (ftnlen)1, (ftnlen)9, ( + ftnlen)8); + ct = akk * .5; + i__2 = k - 1; + daxpy_(&i__2, &ct, &b[k + b_dim1], ldb, &a[k + a_dim1], lda); + i__2 = k - 1; + dsyr2_(uplo, &i__2, &c_b27, &a[k + a_dim1], lda, &b[k + + b_dim1], ldb, &a[a_offset], lda, (ftnlen)1); + i__2 = k - 1; + daxpy_(&i__2, &ct, &b[k + b_dim1], ldb, &a[k + a_dim1], lda); + i__2 = k - 1; + dscal_(&i__2, &bkk, &a[k + a_dim1], lda); +/* Computing 2nd power */ + d__1 = bkk; + a[k + k * a_dim1] = akk * (d__1 * d__1); +/* L40: */ + } + } + } + return 0; + +/* End of DSYGS2 */ + +} /* dsygs2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsygst.cpp b/lib/linalg/dsygst.cpp new file mode 100644 index 0000000000..2f5189a6f1 --- /dev/null +++ b/lib/linalg/dsygst.cpp @@ -0,0 +1,436 @@ +/* fortran/dsygst.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static doublereal c_b14 = 1.; +static doublereal c_b16 = -.5; +static doublereal c_b19 = -1.; +static doublereal c_b52 = .5; + +/* > \brief \b DSYGST */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DSYGST + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, ITYPE, LDA, LDB, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYGST reduces a real symmetric-definite generalized eigenproblem */ +/* > to standard form. */ +/* > */ +/* > If ITYPE = 1, the problem is A*x = lambda*B*x, */ +/* > and A is overwritten by inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T) */ +/* > */ +/* > If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or */ +/* > B*A*x = lambda*x, and A is overwritten by U*A*U**T or L**T*A*L. */ +/* > */ +/* > B must have been previously factorized as U**T*U or L*L**T by DPOTRF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ITYPE */ +/* > \verbatim */ +/* > ITYPE is INTEGER */ +/* > = 1: compute inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T); */ +/* > = 2 or 3: compute U*A*U**T or L**T*A*L. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A is stored and B is factored as */ +/* > U**T*U; */ +/* > = 'L': Lower triangle of A is stored and B is factored as */ +/* > L*L**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrices A and B. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ +/* > N-by-N upper triangular part of A contains the upper */ +/* > triangular part of the matrix A, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading N-by-N lower triangular part of A contains the lower */ +/* > triangular part of the matrix A, and the strictly upper */ +/* > triangular part of A is not referenced. */ +/* > */ +/* > On exit, if INFO = 0, the transformed matrix, stored in the */ +/* > same format as A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB,N) */ +/* > The triangular factor from the Cholesky factorization of B, */ +/* > as returned by DPOTRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleSYcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dsygst_(integer *itype, char *uplo, integer *n, + doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * + info, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; + + /* Local variables */ + integer k, kb, nb; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), dsymm_( + char *, char *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, ftnlen, ftnlen); + logical upper; + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), dsygs2_( + integer *, char *, integer *, doublereal *, integer *, doublereal + *, integer *, integer *, ftnlen), dsyr2k_(char *, char *, integer + *, integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen) + , xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (*itype < 1 || *itype > 3) { + *info = -1; + } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } else if (*ldb < max(1,*n)) { + *info = -7; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYGST", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* Determine the block size for this environment. */ + + nb = ilaenv_(&c__1, (char *)"DSYGST", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( + ftnlen)1); + + if (nb <= 1 || nb >= *n) { + +/* Use unblocked code */ + + dsygs2_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, ( + ftnlen)1); + } else { + +/* Use blocked code */ + + if (*itype == 1) { + if (upper) { + +/* Compute inv(U**T)*A*inv(U) */ + + i__1 = *n; + i__2 = nb; + for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { +/* Computing MIN */ + i__3 = *n - k + 1; + kb = min(i__3,nb); + +/* Update the upper triangle of A(k:n,k:n) */ + + dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + + k * b_dim1], ldb, info, (ftnlen)1); + if (k + kb <= *n) { + i__3 = *n - k - kb + 1; + dtrsm_((char *)"Left", uplo, (char *)"Transpose", (char *)"Non-unit", &kb, & + i__3, &c_b14, &b[k + k * b_dim1], ldb, &a[k + + (k + kb) * a_dim1], lda, (ftnlen)4, (ftnlen)1, + (ftnlen)9, (ftnlen)8); + i__3 = *n - k - kb + 1; + dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b16, &a[k + k * + a_dim1], lda, &b[k + (k + kb) * b_dim1], ldb, + &c_b14, &a[k + (k + kb) * a_dim1], lda, ( + ftnlen)4, (ftnlen)1); + i__3 = *n - k - kb + 1; + dsyr2k_(uplo, (char *)"Transpose", &i__3, &kb, &c_b19, &a[k + + (k + kb) * a_dim1], lda, &b[k + (k + kb) * + b_dim1], ldb, &c_b14, &a[k + kb + (k + kb) * + a_dim1], lda, (ftnlen)1, (ftnlen)9); + i__3 = *n - k - kb + 1; + dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b16, &a[k + k * + a_dim1], lda, &b[k + (k + kb) * b_dim1], ldb, + &c_b14, &a[k + (k + kb) * a_dim1], lda, ( + ftnlen)4, (ftnlen)1); + i__3 = *n - k - kb + 1; + dtrsm_((char *)"Right", uplo, (char *)"No transpose", (char *)"Non-unit", &kb, + &i__3, &c_b14, &b[k + kb + (k + kb) * b_dim1] + , ldb, &a[k + (k + kb) * a_dim1], lda, ( + ftnlen)5, (ftnlen)1, (ftnlen)12, (ftnlen)8); + } +/* L10: */ + } + } else { + +/* Compute inv(L)*A*inv(L**T) */ + + i__2 = *n; + i__1 = nb; + for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { +/* Computing MIN */ + i__3 = *n - k + 1; + kb = min(i__3,nb); + +/* Update the lower triangle of A(k:n,k:n) */ + + dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + + k * b_dim1], ldb, info, (ftnlen)1); + if (k + kb <= *n) { + i__3 = *n - k - kb + 1; + dtrsm_((char *)"Right", uplo, (char *)"Transpose", (char *)"Non-unit", &i__3, + &kb, &c_b14, &b[k + k * b_dim1], ldb, &a[k + + kb + k * a_dim1], lda, (ftnlen)5, (ftnlen)1, ( + ftnlen)9, (ftnlen)8); + i__3 = *n - k - kb + 1; + dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b16, &a[k + k * + a_dim1], lda, &b[k + kb + k * b_dim1], ldb, & + c_b14, &a[k + kb + k * a_dim1], lda, (ftnlen) + 5, (ftnlen)1); + i__3 = *n - k - kb + 1; + dsyr2k_(uplo, (char *)"No transpose", &i__3, &kb, &c_b19, &a[ + k + kb + k * a_dim1], lda, &b[k + kb + k * + b_dim1], ldb, &c_b14, &a[k + kb + (k + kb) * + a_dim1], lda, (ftnlen)1, (ftnlen)12); + i__3 = *n - k - kb + 1; + dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b16, &a[k + k * + a_dim1], lda, &b[k + kb + k * b_dim1], ldb, & + c_b14, &a[k + kb + k * a_dim1], lda, (ftnlen) + 5, (ftnlen)1); + i__3 = *n - k - kb + 1; + dtrsm_((char *)"Left", uplo, (char *)"No transpose", (char *)"Non-unit", & + i__3, &kb, &c_b14, &b[k + kb + (k + kb) * + b_dim1], ldb, &a[k + kb + k * a_dim1], lda, ( + ftnlen)4, (ftnlen)1, (ftnlen)12, (ftnlen)8); + } +/* L20: */ + } + } + } else { + if (upper) { + +/* Compute U*A*U**T */ + + i__1 = *n; + i__2 = nb; + for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { +/* Computing MIN */ + i__3 = *n - k + 1; + kb = min(i__3,nb); + +/* Update the upper triangle of A(1:k+kb-1,1:k+kb-1) */ + + i__3 = k - 1; + dtrmm_((char *)"Left", uplo, (char *)"No transpose", (char *)"Non-unit", &i__3, & + kb, &c_b14, &b[b_offset], ldb, &a[k * a_dim1 + 1], + lda, (ftnlen)4, (ftnlen)1, (ftnlen)12, (ftnlen)8) + ; + i__3 = k - 1; + dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b52, &a[k + k * + a_dim1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, &a[ + k * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)1); + i__3 = k - 1; + dsyr2k_(uplo, (char *)"No transpose", &i__3, &kb, &c_b14, &a[k * + a_dim1 + 1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, + &a[a_offset], lda, (ftnlen)1, (ftnlen)12); + i__3 = k - 1; + dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b52, &a[k + k * + a_dim1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, &a[ + k * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)1); + i__3 = k - 1; + dtrmm_((char *)"Right", uplo, (char *)"Transpose", (char *)"Non-unit", &i__3, &kb, + &c_b14, &b[k + k * b_dim1], ldb, &a[k * a_dim1 + + 1], lda, (ftnlen)5, (ftnlen)1, (ftnlen)9, (ftnlen) + 8); + dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + + k * b_dim1], ldb, info, (ftnlen)1); +/* L30: */ + } + } else { + +/* Compute L**T*A*L */ + + i__2 = *n; + i__1 = nb; + for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { +/* Computing MIN */ + i__3 = *n - k + 1; + kb = min(i__3,nb); + +/* Update the lower triangle of A(1:k+kb-1,1:k+kb-1) */ + + i__3 = k - 1; + dtrmm_((char *)"Right", uplo, (char *)"No transpose", (char *)"Non-unit", &kb, & + i__3, &c_b14, &b[b_offset], ldb, &a[k + a_dim1], + lda, (ftnlen)5, (ftnlen)1, (ftnlen)12, (ftnlen)8); + i__3 = k - 1; + dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b52, &a[k + k * + a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[k + + a_dim1], lda, (ftnlen)4, (ftnlen)1); + i__3 = k - 1; + dsyr2k_(uplo, (char *)"Transpose", &i__3, &kb, &c_b14, &a[k + + a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[ + a_offset], lda, (ftnlen)1, (ftnlen)9); + i__3 = k - 1; + dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b52, &a[k + k * + a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[k + + a_dim1], lda, (ftnlen)4, (ftnlen)1); + i__3 = k - 1; + dtrmm_((char *)"Left", uplo, (char *)"Transpose", (char *)"Non-unit", &kb, &i__3, + &c_b14, &b[k + k * b_dim1], ldb, &a[k + a_dim1], + lda, (ftnlen)4, (ftnlen)1, (ftnlen)9, (ftnlen)8); + dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + + k * b_dim1], ldb, info, (ftnlen)1); +/* L40: */ + } + } + } + } + return 0; + +/* End of DSYGST */ + +} /* dsygst_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsygv.cpp b/lib/linalg/dsygv.cpp new file mode 100644 index 0000000000..e7078e8006 --- /dev/null +++ b/lib/linalg/dsygv.cpp @@ -0,0 +1,384 @@ +/* fortran/dsygv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static doublereal c_b16 = 1.; + +/* > \brief \b DSYGV */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DSYGV + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYGV( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, */ +/* LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER JOBZ, UPLO */ +/* INTEGER INFO, ITYPE, LDA, LDB, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), W( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYGV computes all the eigenvalues, and optionally, the eigenvectors */ +/* > of a real generalized symmetric-definite eigenproblem, of the form */ +/* > A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. */ +/* > Here A and B are assumed to be symmetric and B is also */ +/* > positive definite. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ITYPE */ +/* > \verbatim */ +/* > ITYPE is INTEGER */ +/* > Specifies the problem type to be solved: */ +/* > = 1: A*x = (lambda)*B*x */ +/* > = 2: A*B*x = (lambda)*x */ +/* > = 3: B*A*x = (lambda)*x */ +/* > \endverbatim */ +/* > */ +/* > \param[in] JOBZ */ +/* > \verbatim */ +/* > JOBZ is CHARACTER*1 */ +/* > = 'N': Compute eigenvalues only; */ +/* > = 'V': Compute eigenvalues and eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangles of A and B are stored; */ +/* > = 'L': Lower triangles of A and B are stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrices A and B. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA, N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the */ +/* > leading N-by-N upper triangular part of A contains the */ +/* > upper triangular part of the matrix A. If UPLO = 'L', */ +/* > the leading N-by-N lower triangular part of A contains */ +/* > the lower triangular part of the matrix A. */ +/* > */ +/* > On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ +/* > matrix Z of eigenvectors. The eigenvectors are normalized */ +/* > as follows: */ +/* > if ITYPE = 1 or 2, Z**T*B*Z = I; */ +/* > if ITYPE = 3, Z**T*inv(B)*Z = I. */ +/* > If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') */ +/* > or the lower triangle (if UPLO='L') of A, including the */ +/* > diagonal, is destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB, N) */ +/* > On entry, the symmetric positive definite matrix B. */ +/* > If UPLO = 'U', the leading N-by-N upper triangular part of B */ +/* > contains the upper triangular part of the matrix B. */ +/* > If UPLO = 'L', the leading N-by-N lower triangular part of B */ +/* > contains the lower triangular part of the matrix B. */ +/* > */ +/* > On exit, if INFO <= N, the part of B containing the matrix is */ +/* > overwritten by the triangular factor U or L from the Cholesky */ +/* > factorization B = U**T*U or B = L*L**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] W */ +/* > \verbatim */ +/* > W is DOUBLE PRECISION array, dimension (N) */ +/* > If INFO = 0, the eigenvalues in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The length of the array WORK. LWORK >= max(1,3*N-1). */ +/* > For optimal efficiency, LWORK >= (NB+2)*N, */ +/* > where NB is the blocksize for DSYTRD returned by ILAENV. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: DPOTRF or DSYEV returned an error code: */ +/* > <= N: if INFO = i, DSYEV failed to converge; */ +/* > i off-diagonal elements of an intermediate */ +/* > tridiagonal form did not converge to zero; */ +/* > > N: if INFO = N + i, for 1 <= i <= N, then the leading */ +/* > minor of order i of B is not positive definite. */ +/* > The factorization of B could not be completed and */ +/* > no eigenvalues or eigenvectors were computed. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleSYeigen */ + +/* ===================================================================== */ +/* Subroutine */ int dsygv_(integer *itype, char *jobz, char *uplo, integer * + n, doublereal *a, integer *lda, doublereal *b, integer *ldb, + doublereal *w, doublereal *work, integer *lwork, integer *info, + ftnlen jobz_len, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; + + /* Local variables */ + integer nb, neig; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + char trans[1]; + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + logical upper; + extern /* Subroutine */ int dsyev_(char *, char *, integer *, doublereal * + , integer *, doublereal *, doublereal *, integer *, integer *, + ftnlen, ftnlen); + logical wantz; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dpotrf_(char *, integer *, doublereal *, + integer *, integer *, ftnlen); + integer lwkmin; + extern /* Subroutine */ int dsygst_(integer *, char *, integer *, + doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen); + integer lwkopt; + logical lquery; + + +/* -- LAPACK driver routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + --w; + --work; + + /* Function Body */ + wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + + *info = 0; + if (*itype < 1 || *itype > 3) { + *info = -1; + } else if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + *info = -2; + } else if (! (upper || lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1))) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*lda < max(1,*n)) { + *info = -6; + } else if (*ldb < max(1,*n)) { + *info = -8; + } + + if (*info == 0) { +/* Computing MAX */ + i__1 = 1, i__2 = *n * 3 - 1; + lwkmin = max(i__1,i__2); + nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, + (ftnlen)1); +/* Computing MAX */ + i__1 = lwkmin, i__2 = (nb + 2) * *n; + lwkopt = max(i__1,i__2); + work[1] = (doublereal) lwkopt; + + if (*lwork < lwkmin && ! lquery) { + *info = -11; + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYGV ", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* Form a Cholesky factorization of B. */ + + dpotrf_(uplo, n, &b[b_offset], ldb, info, (ftnlen)1); + if (*info != 0) { + *info = *n + *info; + return 0; + } + +/* Transform problem to standard eigenvalue problem and solve. */ + + dsygst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, ( + ftnlen)1); + dsyev_(jobz, uplo, n, &a[a_offset], lda, &w[1], &work[1], lwork, info, ( + ftnlen)1, (ftnlen)1); + + if (wantz) { + +/* Backtransform eigenvectors to the original problem. */ + + neig = *n; + if (*info > 0) { + neig = *info - 1; + } + if (*itype == 1 || *itype == 2) { + +/* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; */ +/* backtransform eigenvectors: x = inv(L)**T*y or inv(U)*y */ + + if (upper) { + *(unsigned char *)trans = 'N'; + } else { + *(unsigned char *)trans = 'T'; + } + + dtrsm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, &neig, &c_b16, &b[ + b_offset], ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, ( + ftnlen)1, (ftnlen)8); + + } else if (*itype == 3) { + +/* For B*A*x=(lambda)*x; */ +/* backtransform eigenvectors: x = L*y or U**T*y */ + + if (upper) { + *(unsigned char *)trans = 'T'; + } else { + *(unsigned char *)trans = 'N'; + } + + dtrmm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, &neig, &c_b16, &b[ + b_offset], ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, ( + ftnlen)1, (ftnlen)8); + } + } + + work[1] = (doublereal) lwkopt; + return 0; + +/* End of DSYGV */ + +} /* dsygv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsygvd.cpp b/lib/linalg/dsygvd.cpp new file mode 100644 index 0000000000..80513dfdcc --- /dev/null +++ b/lib/linalg/dsygvd.cpp @@ -0,0 +1,445 @@ +/* fortran/dsygvd.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b11 = 1.; + +/* > \brief \b DSYGVD */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DSYGVD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYGVD( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, */ +/* LWORK, IWORK, LIWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER JOBZ, UPLO */ +/* INTEGER INFO, ITYPE, LDA, LDB, LIWORK, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IWORK( * ) */ +/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), W( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYGVD computes all the eigenvalues, and optionally, the eigenvectors */ +/* > of a real generalized symmetric-definite eigenproblem, of the form */ +/* > A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. Here A and */ +/* > B are assumed to be symmetric and B is also positive definite. */ +/* > If eigenvectors are desired, it uses a divide and conquer algorithm. */ +/* > */ +/* > The divide and conquer algorithm makes very mild assumptions about */ +/* > floating point arithmetic. It will work on machines with a guard */ +/* > digit in add/subtract, or on those binary machines without guard */ +/* > digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ +/* > Cray-2. It could conceivably fail on hexadecimal or decimal machines */ +/* > without guard digits, but we know of none. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ITYPE */ +/* > \verbatim */ +/* > ITYPE is INTEGER */ +/* > Specifies the problem type to be solved: */ +/* > = 1: A*x = (lambda)*B*x */ +/* > = 2: A*B*x = (lambda)*x */ +/* > = 3: B*A*x = (lambda)*x */ +/* > \endverbatim */ +/* > */ +/* > \param[in] JOBZ */ +/* > \verbatim */ +/* > JOBZ is CHARACTER*1 */ +/* > = 'N': Compute eigenvalues only; */ +/* > = 'V': Compute eigenvalues and eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangles of A and B are stored; */ +/* > = 'L': Lower triangles of A and B are stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrices A and B. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA, N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the */ +/* > leading N-by-N upper triangular part of A contains the */ +/* > upper triangular part of the matrix A. If UPLO = 'L', */ +/* > the leading N-by-N lower triangular part of A contains */ +/* > the lower triangular part of the matrix A. */ +/* > */ +/* > On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ +/* > matrix Z of eigenvectors. The eigenvectors are normalized */ +/* > as follows: */ +/* > if ITYPE = 1 or 2, Z**T*B*Z = I; */ +/* > if ITYPE = 3, Z**T*inv(B)*Z = I. */ +/* > If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') */ +/* > or the lower triangle (if UPLO='L') of A, including the */ +/* > diagonal, is destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB, N) */ +/* > On entry, the symmetric matrix B. If UPLO = 'U', the */ +/* > leading N-by-N upper triangular part of B contains the */ +/* > upper triangular part of the matrix B. If UPLO = 'L', */ +/* > the leading N-by-N lower triangular part of B contains */ +/* > the lower triangular part of the matrix B. */ +/* > */ +/* > On exit, if INFO <= N, the part of B containing the matrix is */ +/* > overwritten by the triangular factor U or L from the Cholesky */ +/* > factorization B = U**T*U or B = L*L**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] W */ +/* > \verbatim */ +/* > W is DOUBLE PRECISION array, dimension (N) */ +/* > If INFO = 0, the eigenvalues in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > If N <= 1, LWORK >= 1. */ +/* > If JOBZ = 'N' and N > 1, LWORK >= 2*N+1. */ +/* > If JOBZ = 'V' and N > 1, LWORK >= 1 + 6*N + 2*N**2. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal sizes of the WORK and IWORK */ +/* > arrays, returns these values as the first entries of the WORK */ +/* > and IWORK arrays, and no error message related to LWORK or */ +/* > LIWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension (MAX(1,LIWORK)) */ +/* > On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LIWORK */ +/* > \verbatim */ +/* > LIWORK is INTEGER */ +/* > The dimension of the array IWORK. */ +/* > If N <= 1, LIWORK >= 1. */ +/* > If JOBZ = 'N' and N > 1, LIWORK >= 1. */ +/* > If JOBZ = 'V' and N > 1, LIWORK >= 3 + 5*N. */ +/* > */ +/* > If LIWORK = -1, then a workspace query is assumed; the */ +/* > routine only calculates the optimal sizes of the WORK and */ +/* > IWORK arrays, returns these values as the first entries of */ +/* > the WORK and IWORK arrays, and no error message related to */ +/* > LWORK or LIWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: DPOTRF or DSYEVD returned an error code: */ +/* > <= N: if INFO = i and JOBZ = 'N', then the algorithm */ +/* > failed to converge; i off-diagonal elements of an */ +/* > intermediate tridiagonal form did not converge to */ +/* > zero; */ +/* > if INFO = i and JOBZ = 'V', then the algorithm */ +/* > failed to compute an eigenvalue while working on */ +/* > the submatrix lying in rows and columns INFO/(N+1) */ +/* > through mod(INFO,N+1); */ +/* > > N: if INFO = N + i, for 1 <= i <= N, then the leading */ +/* > minor of order i of B is not positive definite. */ +/* > The factorization of B could not be completed and */ +/* > no eigenvalues or eigenvectors were computed. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleSYeigen */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Modified so that no backsubstitution is performed if DSYEVD fails to */ +/* > converge (NEIG in old code could be greater than N causing out of */ +/* > bounds reference to A - reported by Ralf Meyer). Also corrected the */ +/* > description of INFO and the test on ITYPE. Sven, 16 Feb 05. */ +/* > \endverbatim */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dsygvd_(integer *itype, char *jobz, char *uplo, integer * + n, doublereal *a, integer *lda, doublereal *b, integer *ldb, + doublereal *w, doublereal *work, integer *lwork, integer *iwork, + integer *liwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1; + doublereal d__1, d__2; + + /* Local variables */ + integer lopt; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + integer lwmin; + char trans[1]; + integer liopt; + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + logical upper, wantz; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dpotrf_( + char *, integer *, doublereal *, integer *, integer *, ftnlen); + integer liwmin; + extern /* Subroutine */ int dsyevd_(char *, char *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen), dsygst_(integer *, char *, + integer *, doublereal *, integer *, doublereal *, integer *, + integer *, ftnlen); + logical lquery; + + +/* -- LAPACK driver routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + --w; + --work; + --iwork; + + /* Function Body */ + wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1 || *liwork == -1; + + *info = 0; + if (*n <= 1) { + liwmin = 1; + lwmin = 1; + } else if (wantz) { + liwmin = *n * 5 + 3; +/* Computing 2nd power */ + i__1 = *n; + lwmin = *n * 6 + 1 + (i__1 * i__1 << 1); + } else { + liwmin = 1; + lwmin = (*n << 1) + 1; + } + lopt = lwmin; + liopt = liwmin; + if (*itype < 1 || *itype > 3) { + *info = -1; + } else if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + *info = -2; + } else if (! (upper || lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1))) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*lda < max(1,*n)) { + *info = -6; + } else if (*ldb < max(1,*n)) { + *info = -8; + } + + if (*info == 0) { + work[1] = (doublereal) lopt; + iwork[1] = liopt; + + if (*lwork < lwmin && ! lquery) { + *info = -11; + } else if (*liwork < liwmin && ! lquery) { + *info = -13; + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYGVD", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* Form a Cholesky factorization of B. */ + + dpotrf_(uplo, n, &b[b_offset], ldb, info, (ftnlen)1); + if (*info != 0) { + *info = *n + *info; + return 0; + } + +/* Transform problem to standard eigenvalue problem and solve. */ + + dsygst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, ( + ftnlen)1); + dsyevd_(jobz, uplo, n, &a[a_offset], lda, &w[1], &work[1], lwork, &iwork[ + 1], liwork, info, (ftnlen)1, (ftnlen)1); +/* Computing MAX */ + d__1 = (doublereal) lopt; + lopt = (integer) max(d__1,work[1]); +/* Computing MAX */ + d__1 = (doublereal) liopt, d__2 = (doublereal) iwork[1]; + liopt = (integer) max(d__1,d__2); + + if (wantz && *info == 0) { + +/* Backtransform eigenvectors to the original problem. */ + + if (*itype == 1 || *itype == 2) { + +/* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; */ +/* backtransform eigenvectors: x = inv(L)**T*y or inv(U)*y */ + + if (upper) { + *(unsigned char *)trans = 'N'; + } else { + *(unsigned char *)trans = 'T'; + } + + dtrsm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, n, &c_b11, &b[b_offset] + , ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, + (ftnlen)8); + + } else if (*itype == 3) { + +/* For B*A*x=(lambda)*x; */ +/* backtransform eigenvectors: x = L*y or U**T*y */ + + if (upper) { + *(unsigned char *)trans = 'T'; + } else { + *(unsigned char *)trans = 'N'; + } + + dtrmm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, n, &c_b11, &b[b_offset] + , ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, + (ftnlen)8); + } + } + + work[1] = (doublereal) lopt; + iwork[1] = liopt; + + return 0; + +/* End of DSYGVD */ + +} /* dsygvd_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsymm.cpp b/lib/linalg/dsymm.cpp new file mode 100644 index 0000000000..223551570d --- /dev/null +++ b/lib/linalg/dsymm.cpp @@ -0,0 +1,440 @@ +/* fortran/dsymm.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DSYMM */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION ALPHA,BETA */ +/* INTEGER LDA,LDB,LDC,M,N */ +/* CHARACTER SIDE,UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYMM performs one of the matrix-matrix operations */ +/* > */ +/* > C := alpha*A*B + beta*C, */ +/* > */ +/* > or */ +/* > */ +/* > C := alpha*B*A + beta*C, */ +/* > */ +/* > where alpha and beta are scalars, A is a symmetric matrix and B and */ +/* > C are m by n matrices. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > On entry, SIDE specifies whether the symmetric matrix A */ +/* > appears on the left or right in the operation as follows: */ +/* > */ +/* > SIDE = 'L' or 'l' C := alpha*A*B + beta*C, */ +/* > */ +/* > SIDE = 'R' or 'r' C := alpha*B*A + beta*C, */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the upper or lower */ +/* > triangular part of the symmetric matrix A is to be */ +/* > referenced as follows: */ +/* > */ +/* > UPLO = 'U' or 'u' Only the upper triangular part of the */ +/* > symmetric matrix is to be referenced. */ +/* > */ +/* > UPLO = 'L' or 'l' Only the lower triangular part of the */ +/* > symmetric matrix is to be referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > On entry, M specifies the number of rows of the matrix C. */ +/* > M must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the number of columns of the matrix C. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION. */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is */ +/* > m when SIDE = 'L' or 'l' and is n otherwise. */ +/* > Before entry with SIDE = 'L' or 'l', the m by m part of */ +/* > the array A must contain the symmetric matrix, such that */ +/* > when UPLO = 'U' or 'u', the leading m by m upper triangular */ +/* > part of the array A must contain the upper triangular part */ +/* > of the symmetric matrix and the strictly lower triangular */ +/* > part of A is not referenced, and when UPLO = 'L' or 'l', */ +/* > the leading m by m lower triangular part of the array A */ +/* > must contain the lower triangular part of the symmetric */ +/* > matrix and the strictly upper triangular part of A is not */ +/* > referenced. */ +/* > Before entry with SIDE = 'R' or 'r', the n by n part of */ +/* > the array A must contain the symmetric matrix, such that */ +/* > when UPLO = 'U' or 'u', the leading n by n upper triangular */ +/* > part of the array A must contain the upper triangular part */ +/* > of the symmetric matrix and the strictly lower triangular */ +/* > part of A is not referenced, and when UPLO = 'L' or 'l', */ +/* > the leading n by n lower triangular part of the array A */ +/* > must contain the lower triangular part of the symmetric */ +/* > matrix and the strictly upper triangular part of A is not */ +/* > referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. When SIDE = 'L' or 'l' then */ +/* > LDA must be at least max( 1, m ), otherwise LDA must be at */ +/* > least max( 1, n ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension ( LDB, N ) */ +/* > Before entry, the leading m by n part of the array B must */ +/* > contain the matrix B. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > On entry, LDB specifies the first dimension of B as declared */ +/* > in the calling (sub) program. LDB must be at least */ +/* > max( 1, m ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is DOUBLE PRECISION. */ +/* > On entry, BETA specifies the scalar beta. When BETA is */ +/* > supplied as zero then C need not be set on input. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension ( LDC, N ) */ +/* > Before entry, the leading m by n part of the array C must */ +/* > contain the matrix C, except when beta is zero, in which */ +/* > case C need not be set on entry. */ +/* > On exit, the array C is overwritten by the m by n updated */ +/* > matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > On entry, LDC specifies the first dimension of C as declared */ +/* > in the calling (sub) program. LDC must be at least */ +/* > max( 1, m ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level3 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 3 Blas routine. */ +/* > */ +/* > -- Written on 8-February-1989. */ +/* > Jack Dongarra, Argonne National Laboratory. */ +/* > Iain Duff, AERE Harwell. */ +/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ +/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dsymm_(char *side, char *uplo, integer *m, integer *n, + doublereal *alpha, doublereal *a, integer *lda, doublereal *b, + integer *ldb, doublereal *beta, doublereal *c__, integer *ldc, ftnlen + side_len, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3; + + /* Local variables */ + integer i__, j, k, info; + doublereal temp1, temp2; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nrowa; + logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level3 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Parameters .. */ +/* .. */ + +/* Set NROWA as the number of rows of A. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + nrowa = *m; + } else { + nrowa = *n; + } + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + +/* Test the input parameters. */ + + info = 0; + if (! lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) && ! lsame_(side, (char *)"R", ( + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 2; + } else if (*m < 0) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*lda < max(1,nrowa)) { + info = 7; + } else if (*ldb < max(1,*m)) { + info = 9; + } else if (*ldc < max(1,*m)) { + info = 12; + } + if (info != 0) { + xerbla_((char *)"DSYMM ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.) { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + return 0; + } + +/* Start the operations. */ + + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Form C := alpha*A*B + beta*C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp1 = *alpha * b[i__ + j * b_dim1]; + temp2 = 0.; + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; + temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; +/* L50: */ + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + + *alpha * temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * a[i__ + i__ * a_dim1] + *alpha * + temp2; + } +/* L60: */ + } +/* L70: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + temp1 = *alpha * b[i__ + j * b_dim1]; + temp2 = 0.; + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; + temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; +/* L80: */ + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + + *alpha * temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * a[i__ + i__ * a_dim1] + *alpha * + temp2; + } +/* L90: */ + } +/* L100: */ + } + } + } else { + +/* Form C := alpha*B*A + beta*C. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * a[j + j * a_dim1]; + if (*beta == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = temp1 * b[i__ + j * b_dim1]; +/* L110: */ + } + } else { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * b[i__ + j * b_dim1]; +/* L120: */ + } + } + i__2 = j - 1; + for (k = 1; k <= i__2; ++k) { + if (upper) { + temp1 = *alpha * a[k + j * a_dim1]; + } else { + temp1 = *alpha * a[j + k * a_dim1]; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; +/* L130: */ + } +/* L140: */ + } + i__2 = *n; + for (k = j + 1; k <= i__2; ++k) { + if (upper) { + temp1 = *alpha * a[j + k * a_dim1]; + } else { + temp1 = *alpha * a[k + j * a_dim1]; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; +/* L150: */ + } +/* L160: */ + } +/* L170: */ + } + } + + return 0; + +/* End of DSYMM */ + +} /* dsymm_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsymv.cpp b/lib/linalg/dsymv.cpp new file mode 100644 index 0000000000..4dc77ad743 --- /dev/null +++ b/lib/linalg/dsymv.cpp @@ -0,0 +1,388 @@ +/* fortran/dsymv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DSYMV */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION ALPHA,BETA */ +/* INTEGER INCX,INCY,LDA,N */ +/* CHARACTER UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A(LDA,*),X(*),Y(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYMV performs the matrix-vector operation */ +/* > */ +/* > y := alpha*A*x + beta*y, */ +/* > */ +/* > where alpha and beta are scalars, x and y are n element vectors and */ +/* > A is an n by n symmetric matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the upper or lower */ +/* > triangular part of the array A is to be referenced as */ +/* > follows: */ +/* > */ +/* > UPLO = 'U' or 'u' Only the upper triangular part of A */ +/* > is to be referenced. */ +/* > */ +/* > UPLO = 'L' or 'l' Only the lower triangular part of A */ +/* > is to be referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION. */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension ( LDA, N ) */ +/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ +/* > upper triangular part of the array A must contain the upper */ +/* > triangular part of the symmetric matrix and the strictly */ +/* > lower triangular part of A is not referenced. */ +/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ +/* > lower triangular part of the array A must contain the lower */ +/* > triangular part of the symmetric matrix and the strictly */ +/* > upper triangular part of A is not referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. LDA must be at least */ +/* > max( 1, n ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array X must contain the n */ +/* > element vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is DOUBLE PRECISION. */ +/* > On entry, BETA specifies the scalar beta. When BETA is */ +/* > supplied as zero then Y need not be set on input. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Y */ +/* > \verbatim */ +/* > Y is DOUBLE PRECISION array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCY ) ). */ +/* > Before entry, the incremented array Y must contain the n */ +/* > element vector y. On exit, Y is overwritten by the updated */ +/* > vector y. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > On entry, INCY specifies the increment for the elements of */ +/* > Y. INCY must not be zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dsymv_(char *uplo, integer *n, doublereal *alpha, + doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal + *beta, doublereal *y, integer *incy, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + + /* Local variables */ + integer i__, j, ix, iy, jx, jy, kx, ky, info; + doublereal temp1, temp2; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + --y; + + /* Function Body */ + info = 0; + if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (*n < 0) { + info = 2; + } else if (*lda < max(1,*n)) { + info = 5; + } else if (*incx == 0) { + info = 7; + } else if (*incy == 0) { + info = 10; + } + if (info != 0) { + xerbla_((char *)"DSYMV ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0 || *alpha == 0. && *beta == 1.) { + return 0; + } + +/* Set up the start points in X and Y. */ + + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (*n - 1) * *incx; + } + if (*incy > 0) { + ky = 1; + } else { + ky = 1 - (*n - 1) * *incy; + } + +/* Start the operations. In this version the elements of A are */ +/* accessed sequentially with one pass through the triangular part */ +/* of A. */ + +/* First form y := beta*y. */ + + if (*beta != 1.) { + if (*incy == 1) { + if (*beta == 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = 0.; +/* L10: */ + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = *beta * y[i__]; +/* L20: */ + } + } + } else { + iy = ky; + if (*beta == 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = 0.; + iy += *incy; +/* L30: */ + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = *beta * y[iy]; + iy += *incy; +/* L40: */ + } + } + } + } + if (*alpha == 0.) { + return 0; + } + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + +/* Form y when A is stored in upper triangle. */ + + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * x[j]; + temp2 = 0.; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + y[i__] += temp1 * a[i__ + j * a_dim1]; + temp2 += a[i__ + j * a_dim1] * x[i__]; +/* L50: */ + } + y[j] = y[j] + temp1 * a[j + j * a_dim1] + *alpha * temp2; +/* L60: */ + } + } else { + jx = kx; + jy = ky; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * x[jx]; + temp2 = 0.; + ix = kx; + iy = ky; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + y[iy] += temp1 * a[i__ + j * a_dim1]; + temp2 += a[i__ + j * a_dim1] * x[ix]; + ix += *incx; + iy += *incy; +/* L70: */ + } + y[jy] = y[jy] + temp1 * a[j + j * a_dim1] + *alpha * temp2; + jx += *incx; + jy += *incy; +/* L80: */ + } + } + } else { + +/* Form y when A is stored in lower triangle. */ + + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * x[j]; + temp2 = 0.; + y[j] += temp1 * a[j + j * a_dim1]; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + y[i__] += temp1 * a[i__ + j * a_dim1]; + temp2 += a[i__ + j * a_dim1] * x[i__]; +/* L90: */ + } + y[j] += *alpha * temp2; +/* L100: */ + } + } else { + jx = kx; + jy = ky; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * x[jx]; + temp2 = 0.; + y[jy] += temp1 * a[j + j * a_dim1]; + ix = jx; + iy = jy; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + iy += *incy; + y[iy] += temp1 * a[i__ + j * a_dim1]; + temp2 += a[i__ + j * a_dim1] * x[ix]; +/* L110: */ + } + y[jy] += *alpha * temp2; + jx += *incx; + jy += *incy; +/* L120: */ + } + } + } + + return 0; + +/* End of DSYMV */ + +} /* dsymv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsyr2.cpp b/lib/linalg/dsyr2.cpp new file mode 100644 index 0000000000..f017821e1d --- /dev/null +++ b/lib/linalg/dsyr2.cpp @@ -0,0 +1,347 @@ +/* fortran/dsyr2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DSYR2 */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYR2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION ALPHA */ +/* INTEGER INCX,INCY,LDA,N */ +/* CHARACTER UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A(LDA,*),X(*),Y(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYR2 performs the symmetric rank 2 operation */ +/* > */ +/* > A := alpha*x*y**T + alpha*y*x**T + A, */ +/* > */ +/* > where alpha is a scalar, x and y are n element vectors and A is an n */ +/* > by n symmetric matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the upper or lower */ +/* > triangular part of the array A is to be referenced as */ +/* > follows: */ +/* > */ +/* > UPLO = 'U' or 'u' Only the upper triangular part of A */ +/* > is to be referenced. */ +/* > */ +/* > UPLO = 'L' or 'l' Only the lower triangular part of A */ +/* > is to be referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION. */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array X must contain the n */ +/* > element vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Y */ +/* > \verbatim */ +/* > Y is DOUBLE PRECISION array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCY ) ). */ +/* > Before entry, the incremented array Y must contain the n */ +/* > element vector y. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > On entry, INCY specifies the increment for the elements of */ +/* > Y. INCY must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension ( LDA, N ) */ +/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ +/* > upper triangular part of the array A must contain the upper */ +/* > triangular part of the symmetric matrix and the strictly */ +/* > lower triangular part of A is not referenced. On exit, the */ +/* > upper triangular part of the array A is overwritten by the */ +/* > upper triangular part of the updated matrix. */ +/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ +/* > lower triangular part of the array A must contain the lower */ +/* > triangular part of the symmetric matrix and the strictly */ +/* > upper triangular part of A is not referenced. On exit, the */ +/* > lower triangular part of the array A is overwritten by the */ +/* > lower triangular part of the updated matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. LDA must be at least */ +/* > max( 1, n ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dsyr2_(char *uplo, integer *n, doublereal *alpha, + doublereal *x, integer *incx, doublereal *y, integer *incy, + doublereal *a, integer *lda, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + + /* Local variables */ + integer i__, j, ix, iy, jx, jy, kx, ky, info; + doublereal temp1, temp2; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --x; + --y; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + info = 0; + if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (*n < 0) { + info = 2; + } else if (*incx == 0) { + info = 5; + } else if (*incy == 0) { + info = 7; + } else if (*lda < max(1,*n)) { + info = 9; + } + if (info != 0) { + xerbla_((char *)"DSYR2 ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0 || *alpha == 0.) { + return 0; + } + +/* Set up the start points in X and Y if the increments are not both */ +/* unity. */ + + if (*incx != 1 || *incy != 1) { + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (*n - 1) * *incx; + } + if (*incy > 0) { + ky = 1; + } else { + ky = 1 - (*n - 1) * *incy; + } + jx = kx; + jy = ky; + } + +/* Start the operations. In this version the elements of A are */ +/* accessed sequentially with one pass through the triangular part */ +/* of A. */ + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + +/* Form A when A is stored in the upper triangle. */ + + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[j] != 0. || y[j] != 0.) { + temp1 = *alpha * y[j]; + temp2 = *alpha * x[j]; + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[i__] * + temp1 + y[i__] * temp2; +/* L10: */ + } + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0. || y[jy] != 0.) { + temp1 = *alpha * y[jy]; + temp2 = *alpha * x[jx]; + ix = kx; + iy = ky; + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[ix] * + temp1 + y[iy] * temp2; + ix += *incx; + iy += *incy; +/* L30: */ + } + } + jx += *incx; + jy += *incy; +/* L40: */ + } + } + } else { + +/* Form A when A is stored in the lower triangle. */ + + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[j] != 0. || y[j] != 0.) { + temp1 = *alpha * y[j]; + temp2 = *alpha * x[j]; + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[i__] * + temp1 + y[i__] * temp2; +/* L50: */ + } + } +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0. || y[jy] != 0.) { + temp1 = *alpha * y[jy]; + temp2 = *alpha * x[jx]; + ix = jx; + iy = jy; + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[ix] * + temp1 + y[iy] * temp2; + ix += *incx; + iy += *incy; +/* L70: */ + } + } + jx += *incx; + jy += *incy; +/* L80: */ + } + } + } + + return 0; + +/* End of DSYR2 */ + +} /* dsyr2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsyr2k.cpp b/lib/linalg/dsyr2k.cpp new file mode 100644 index 0000000000..33d32b3440 --- /dev/null +++ b/lib/linalg/dsyr2k.cpp @@ -0,0 +1,485 @@ +/* fortran/dsyr2k.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DSYR2K */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION ALPHA,BETA */ +/* INTEGER K,LDA,LDB,LDC,N */ +/* CHARACTER TRANS,UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYR2K performs one of the symmetric rank 2k operations */ +/* > */ +/* > C := alpha*A*B**T + alpha*B*A**T + beta*C, */ +/* > */ +/* > or */ +/* > */ +/* > C := alpha*A**T*B + alpha*B**T*A + beta*C, */ +/* > */ +/* > where alpha and beta are scalars, C is an n by n symmetric matrix */ +/* > and A and B are n by k matrices in the first case and k by n */ +/* > matrices in the second case. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the upper or lower */ +/* > triangular part of the array C is to be referenced as */ +/* > follows: */ +/* > */ +/* > UPLO = 'U' or 'u' Only the upper triangular part of C */ +/* > is to be referenced. */ +/* > */ +/* > UPLO = 'L' or 'l' Only the lower triangular part of C */ +/* > is to be referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > On entry, TRANS specifies the operation to be performed as */ +/* > follows: */ +/* > */ +/* > TRANS = 'N' or 'n' C := alpha*A*B**T + alpha*B*A**T + */ +/* > beta*C. */ +/* > */ +/* > TRANS = 'T' or 't' C := alpha*A**T*B + alpha*B**T*A + */ +/* > beta*C. */ +/* > */ +/* > TRANS = 'C' or 'c' C := alpha*A**T*B + alpha*B**T*A + */ +/* > beta*C. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix C. N must be */ +/* > at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > On entry with TRANS = 'N' or 'n', K specifies the number */ +/* > of columns of the matrices A and B, and on entry with */ +/* > TRANS = 'T' or 't' or 'C' or 'c', K specifies the number */ +/* > of rows of the matrices A and B. K must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION. */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is */ +/* > k when TRANS = 'N' or 'n', and is n otherwise. */ +/* > Before entry with TRANS = 'N' or 'n', the leading n by k */ +/* > part of the array A must contain the matrix A, otherwise */ +/* > the leading k by n part of the array A must contain the */ +/* > matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. When TRANS = 'N' or 'n' */ +/* > then LDA must be at least max( 1, n ), otherwise LDA must */ +/* > be at least max( 1, k ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension ( LDB, kb ), where kb is */ +/* > k when TRANS = 'N' or 'n', and is n otherwise. */ +/* > Before entry with TRANS = 'N' or 'n', the leading n by k */ +/* > part of the array B must contain the matrix B, otherwise */ +/* > the leading k by n part of the array B must contain the */ +/* > matrix B. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > On entry, LDB specifies the first dimension of B as declared */ +/* > in the calling (sub) program. When TRANS = 'N' or 'n' */ +/* > then LDB must be at least max( 1, n ), otherwise LDB must */ +/* > be at least max( 1, k ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is DOUBLE PRECISION. */ +/* > On entry, BETA specifies the scalar beta. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension ( LDC, N ) */ +/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ +/* > upper triangular part of the array C must contain the upper */ +/* > triangular part of the symmetric matrix and the strictly */ +/* > lower triangular part of C is not referenced. On exit, the */ +/* > upper triangular part of the array C is overwritten by the */ +/* > upper triangular part of the updated matrix. */ +/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ +/* > lower triangular part of the array C must contain the lower */ +/* > triangular part of the symmetric matrix and the strictly */ +/* > upper triangular part of C is not referenced. On exit, the */ +/* > lower triangular part of the array C is overwritten by the */ +/* > lower triangular part of the updated matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > On entry, LDC specifies the first dimension of C as declared */ +/* > in the calling (sub) program. LDC must be at least */ +/* > max( 1, n ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level3 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 3 Blas routine. */ +/* > */ +/* > */ +/* > -- Written on 8-February-1989. */ +/* > Jack Dongarra, Argonne National Laboratory. */ +/* > Iain Duff, AERE Harwell. */ +/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ +/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dsyr2k_(char *uplo, char *trans, integer *n, integer *k, + doublereal *alpha, doublereal *a, integer *lda, doublereal *b, + integer *ldb, doublereal *beta, doublereal *c__, integer *ldc, ftnlen + uplo_len, ftnlen trans_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3; + + /* Local variables */ + integer i__, j, l, info; + doublereal temp1, temp2; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nrowa; + logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level3 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Parameters .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + nrowa = *n; + } else { + nrowa = *k; + } + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + + info = 0; + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; + } else if (*n < 0) { + info = 3; + } else if (*k < 0) { + info = 4; + } else if (*lda < max(1,nrowa)) { + info = 7; + } else if (*ldb < max(1,nrowa)) { + info = 9; + } else if (*ldc < max(1,*n)) { + info = 12; + } + if (info != 0) { + xerbla_((char *)"DSYR2K", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.) { + if (upper) { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + } else { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; +/* L50: */ + } +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L70: */ + } +/* L80: */ + } + } + } + return 0; + } + +/* Start the operations. */ + + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form C := alpha*A*B**T + alpha*B*A**T + C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; +/* L90: */ + } + } else if (*beta != 1.) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L100: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0. || b[j + l * b_dim1] != 0.) { + temp1 = *alpha * b[j + l * b_dim1]; + temp2 = *alpha * a[j + l * a_dim1]; + i__3 = j; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] = c__[i__ + j * c_dim1] + a[ + i__ + l * a_dim1] * temp1 + b[i__ + l * + b_dim1] * temp2; +/* L110: */ + } + } +/* L120: */ + } +/* L130: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; +/* L140: */ + } + } else if (*beta != 1.) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L150: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0. || b[j + l * b_dim1] != 0.) { + temp1 = *alpha * b[j + l * b_dim1]; + temp2 = *alpha * a[j + l * a_dim1]; + i__3 = *n; + for (i__ = j; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] = c__[i__ + j * c_dim1] + a[ + i__ + l * a_dim1] * temp1 + b[i__ + l * + b_dim1] * temp2; +/* L160: */ + } + } +/* L170: */ + } +/* L180: */ + } + } + } else { + +/* Form C := alpha*A**T*B + alpha*B**T*A + C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + temp1 = 0.; + temp2 = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp1 += a[l + i__ * a_dim1] * b[l + j * b_dim1]; + temp2 += b[l + i__ * b_dim1] * a[l + j * a_dim1]; +/* L190: */ + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = *alpha * temp1 + *alpha * + temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + *alpha * temp1 + *alpha * temp2; + } +/* L200: */ + } +/* L210: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + temp1 = 0.; + temp2 = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp1 += a[l + i__ * a_dim1] * b[l + j * b_dim1]; + temp2 += b[l + i__ * b_dim1] * a[l + j * a_dim1]; +/* L220: */ + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = *alpha * temp1 + *alpha * + temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + *alpha * temp1 + *alpha * temp2; + } +/* L230: */ + } +/* L240: */ + } + } + } + + return 0; + +/* End of DSYR2K */ + +} /* dsyr2k_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsyrk.cpp b/lib/linalg/dsyrk.cpp new file mode 100644 index 0000000000..28dc601121 --- /dev/null +++ b/lib/linalg/dsyrk.cpp @@ -0,0 +1,445 @@ +/* fortran/dsyrk.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DSYRK */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION ALPHA,BETA */ +/* INTEGER K,LDA,LDC,N */ +/* CHARACTER TRANS,UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A(LDA,*),C(LDC,*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYRK performs one of the symmetric rank k operations */ +/* > */ +/* > C := alpha*A*A**T + beta*C, */ +/* > */ +/* > or */ +/* > */ +/* > C := alpha*A**T*A + beta*C, */ +/* > */ +/* > where alpha and beta are scalars, C is an n by n symmetric matrix */ +/* > and A is an n by k matrix in the first case and a k by n matrix */ +/* > in the second case. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the upper or lower */ +/* > triangular part of the array C is to be referenced as */ +/* > follows: */ +/* > */ +/* > UPLO = 'U' or 'u' Only the upper triangular part of C */ +/* > is to be referenced. */ +/* > */ +/* > UPLO = 'L' or 'l' Only the lower triangular part of C */ +/* > is to be referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > On entry, TRANS specifies the operation to be performed as */ +/* > follows: */ +/* > */ +/* > TRANS = 'N' or 'n' C := alpha*A*A**T + beta*C. */ +/* > */ +/* > TRANS = 'T' or 't' C := alpha*A**T*A + beta*C. */ +/* > */ +/* > TRANS = 'C' or 'c' C := alpha*A**T*A + beta*C. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix C. N must be */ +/* > at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > On entry with TRANS = 'N' or 'n', K specifies the number */ +/* > of columns of the matrix A, and on entry with */ +/* > TRANS = 'T' or 't' or 'C' or 'c', K specifies the number */ +/* > of rows of the matrix A. K must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION. */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is */ +/* > k when TRANS = 'N' or 'n', and is n otherwise. */ +/* > Before entry with TRANS = 'N' or 'n', the leading n by k */ +/* > part of the array A must contain the matrix A, otherwise */ +/* > the leading k by n part of the array A must contain the */ +/* > matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. When TRANS = 'N' or 'n' */ +/* > then LDA must be at least max( 1, n ), otherwise LDA must */ +/* > be at least max( 1, k ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is DOUBLE PRECISION. */ +/* > On entry, BETA specifies the scalar beta. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension ( LDC, N ) */ +/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ +/* > upper triangular part of the array C must contain the upper */ +/* > triangular part of the symmetric matrix and the strictly */ +/* > lower triangular part of C is not referenced. On exit, the */ +/* > upper triangular part of the array C is overwritten by the */ +/* > upper triangular part of the updated matrix. */ +/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ +/* > lower triangular part of the array C must contain the lower */ +/* > triangular part of the symmetric matrix and the strictly */ +/* > upper triangular part of C is not referenced. On exit, the */ +/* > lower triangular part of the array C is overwritten by the */ +/* > lower triangular part of the updated matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > On entry, LDC specifies the first dimension of C as declared */ +/* > in the calling (sub) program. LDC must be at least */ +/* > max( 1, n ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level3 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 3 Blas routine. */ +/* > */ +/* > -- Written on 8-February-1989. */ +/* > Jack Dongarra, Argonne National Laboratory. */ +/* > Iain Duff, AERE Harwell. */ +/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ +/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dsyrk_(char *uplo, char *trans, integer *n, integer *k, + doublereal *alpha, doublereal *a, integer *lda, doublereal *beta, + doublereal *c__, integer *ldc, ftnlen uplo_len, ftnlen trans_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, j, l, info; + doublereal temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nrowa; + logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level3 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Parameters .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + nrowa = *n; + } else { + nrowa = *k; + } + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + + info = 0; + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; + } else if (*n < 0) { + info = 3; + } else if (*k < 0) { + info = 4; + } else if (*lda < max(1,nrowa)) { + info = 7; + } else if (*ldc < max(1,*n)) { + info = 10; + } + if (info != 0) { + xerbla_((char *)"DSYRK ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.) { + if (upper) { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L30: */ + } +/* L40: */ + } + } + } else { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; +/* L50: */ + } +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L70: */ + } +/* L80: */ + } + } + } + return 0; + } + +/* Start the operations. */ + + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form C := alpha*A*A**T + beta*C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; +/* L90: */ + } + } else if (*beta != 1.) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L100: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0.) { + temp = *alpha * a[j + l * a_dim1]; + i__3 = j; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L110: */ + } + } +/* L120: */ + } +/* L130: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; +/* L140: */ + } + } else if (*beta != 1.) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; +/* L150: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0.) { + temp = *alpha * a[j + l * a_dim1]; + i__3 = *n; + for (i__ = j; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; +/* L160: */ + } + } +/* L170: */ + } +/* L180: */ + } + } + } else { + +/* Form C := alpha*A**T*A + beta*C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; +/* L190: */ + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L200: */ + } +/* L210: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + temp = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; +/* L220: */ + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } +/* L230: */ + } +/* L240: */ + } + } + } + + return 0; + +/* End of DSYRK */ + +} /* dsyrk_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsytd2.cpp b/lib/linalg/dsytd2.cpp new file mode 100644 index 0000000000..4035fd0d58 --- /dev/null +++ b/lib/linalg/dsytd2.cpp @@ -0,0 +1,389 @@ +/* fortran/dsytd2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static doublereal c_b8 = 0.; +static doublereal c_b14 = -1.; + +/* > \brief \b DSYTD2 reduces a symmetric matrix to real symmetric tridiagonal form by an orthogonal similarit +y transformation (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DSYTD2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYTD2( UPLO, N, A, LDA, D, E, TAU, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDA, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAU( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYTD2 reduces a real symmetric matrix A to symmetric tridiagonal */ +/* > form T by an orthogonal similarity transformation: Q**T * A * Q = T. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies whether the upper or lower triangular part of the */ +/* > symmetric matrix A is stored: */ +/* > = 'U': Upper triangular */ +/* > = 'L': Lower triangular */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ +/* > n-by-n upper triangular part of A contains the upper */ +/* > triangular part of the matrix A, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading n-by-n lower triangular part of A contains the lower */ +/* > triangular part of the matrix A, and the strictly upper */ +/* > triangular part of A is not referenced. */ +/* > On exit, if UPLO = 'U', the diagonal and first superdiagonal */ +/* > of A are overwritten by the corresponding elements of the */ +/* > tridiagonal matrix T, and the elements above the first */ +/* > superdiagonal, with the array TAU, represent the orthogonal */ +/* > matrix Q as a product of elementary reflectors; if UPLO */ +/* > = 'L', the diagonal and first subdiagonal of A are over- */ +/* > written by the corresponding elements of the tridiagonal */ +/* > matrix T, and the elements below the first subdiagonal, with */ +/* > the array TAU, represent the orthogonal matrix Q as a product */ +/* > of elementary reflectors. See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > The diagonal elements of the tridiagonal matrix T: */ +/* > D(i) = A(i,i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > The off-diagonal elements of the tridiagonal matrix T: */ +/* > E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (N-1) */ +/* > The scalar factors of the elementary reflectors (see Further */ +/* > Details). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleSYcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > If UPLO = 'U', the matrix Q is represented as a product of elementary */ +/* > reflectors */ +/* > */ +/* > Q = H(n-1) . . . H(2) H(1). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**T */ +/* > */ +/* > where tau is a real scalar, and v is a real vector with */ +/* > v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in */ +/* > A(1:i-1,i+1), and tau in TAU(i). */ +/* > */ +/* > If UPLO = 'L', the matrix Q is represented as a product of elementary */ +/* > reflectors */ +/* > */ +/* > Q = H(1) H(2) . . . H(n-1). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**T */ +/* > */ +/* > where tau is a real scalar, and v is a real vector with */ +/* > v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), */ +/* > and tau in TAU(i). */ +/* > */ +/* > The contents of A on exit are illustrated by the following examples */ +/* > with n = 5: */ +/* > */ +/* > if UPLO = 'U': if UPLO = 'L': */ +/* > */ +/* > ( d e v2 v3 v4 ) ( d ) */ +/* > ( d e v3 v4 ) ( e d ) */ +/* > ( d e v4 ) ( v1 e d ) */ +/* > ( d e ) ( v1 v2 e d ) */ +/* > ( d ) ( v1 v2 v3 e d ) */ +/* > */ +/* > where d and e denote diagonal and off-diagonal elements of T, and vi */ +/* > denotes an element of the vector defining H(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dsytd2_(char *uplo, integer *n, doublereal *a, integer * + lda, doublereal *d__, doublereal *e, doublereal *tau, integer *info, + ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__; + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, + integer *); + doublereal taui; + extern /* Subroutine */ int dsyr2_(char *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen); + doublereal alpha; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *); + logical upper; + extern /* Subroutine */ int dsymv_(char *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen), dlarfg_(integer *, doublereal *, + doublereal *, integer *, doublereal *), xerbla_(char *, integer * + , ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --d__; + --e; + --tau; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYTD2", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n <= 0) { + return 0; + } + + if (upper) { + +/* Reduce the upper triangle of A */ + + for (i__ = *n - 1; i__ >= 1; --i__) { + +/* Generate elementary reflector H(i) = I - tau * v * v**T */ +/* to annihilate A(1:i-1,i+1) */ + + dlarfg_(&i__, &a[i__ + (i__ + 1) * a_dim1], &a[(i__ + 1) * a_dim1 + + 1], &c__1, &taui); + e[i__] = a[i__ + (i__ + 1) * a_dim1]; + + if (taui != 0.) { + +/* Apply H(i) from both sides to A(1:i,1:i) */ + + a[i__ + (i__ + 1) * a_dim1] = 1.; + +/* Compute x := tau * A * v storing x in TAU(1:i) */ + + dsymv_(uplo, &i__, &taui, &a[a_offset], lda, &a[(i__ + 1) * + a_dim1 + 1], &c__1, &c_b8, &tau[1], &c__1, (ftnlen)1); + +/* Compute w := x - 1/2 * tau * (x**T * v) * v */ + + alpha = taui * -.5 * ddot_(&i__, &tau[1], &c__1, &a[(i__ + 1) + * a_dim1 + 1], &c__1); + daxpy_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[ + 1], &c__1); + +/* Apply the transformation as a rank-2 update: */ +/* A := A - v * w**T - w * v**T */ + + dsyr2_(uplo, &i__, &c_b14, &a[(i__ + 1) * a_dim1 + 1], &c__1, + &tau[1], &c__1, &a[a_offset], lda, (ftnlen)1); + + a[i__ + (i__ + 1) * a_dim1] = e[i__]; + } + d__[i__ + 1] = a[i__ + 1 + (i__ + 1) * a_dim1]; + tau[i__] = taui; +/* L10: */ + } + d__[1] = a[a_dim1 + 1]; + } else { + +/* Reduce the lower triangle of A */ + + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Generate elementary reflector H(i) = I - tau * v * v**T */ +/* to annihilate A(i+2:n,i) */ + + i__2 = *n - i__; +/* Computing MIN */ + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*n) + i__ * + a_dim1], &c__1, &taui); + e[i__] = a[i__ + 1 + i__ * a_dim1]; + + if (taui != 0.) { + +/* Apply H(i) from both sides to A(i+1:n,i+1:n) */ + + a[i__ + 1 + i__ * a_dim1] = 1.; + +/* Compute x := tau * A * v storing y in TAU(i:n-1) */ + + i__2 = *n - i__; + dsymv_(uplo, &i__2, &taui, &a[i__ + 1 + (i__ + 1) * a_dim1], + lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b8, &tau[ + i__], &c__1, (ftnlen)1); + +/* Compute w := x - 1/2 * tau * (x**T * v) * v */ + + i__2 = *n - i__; + alpha = taui * -.5 * ddot_(&i__2, &tau[i__], &c__1, &a[i__ + + 1 + i__ * a_dim1], &c__1); + i__2 = *n - i__; + daxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[ + i__], &c__1); + +/* Apply the transformation as a rank-2 update: */ +/* A := A - v * w**T - w * v**T */ + + i__2 = *n - i__; + dsyr2_(uplo, &i__2, &c_b14, &a[i__ + 1 + i__ * a_dim1], &c__1, + &tau[i__], &c__1, &a[i__ + 1 + (i__ + 1) * a_dim1], + lda, (ftnlen)1); + + a[i__ + 1 + i__ * a_dim1] = e[i__]; + } + d__[i__] = a[i__ + i__ * a_dim1]; + tau[i__] = taui; +/* L20: */ + } + d__[*n] = a[*n + *n * a_dim1]; + } + + return 0; + +/* End of DSYTD2 */ + +} /* dsytd2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dsytrd.cpp b/lib/linalg/dsytrd.cpp new file mode 100644 index 0000000000..190dd8b1ac --- /dev/null +++ b/lib/linalg/dsytrd.cpp @@ -0,0 +1,454 @@ +/* fortran/dsytrd.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__3 = 3; +static integer c__2 = 2; +static doublereal c_b22 = -1.; +static doublereal c_b23 = 1.; + +/* > \brief \b DSYTRD */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DSYTRD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DSYTRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDA, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAU( * ), */ +/* $ WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DSYTRD reduces a real symmetric matrix A to real symmetric */ +/* > tridiagonal form T by an orthogonal similarity transformation: */ +/* > Q**T * A * Q = T. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A is stored; */ +/* > = 'L': Lower triangle of A is stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ +/* > N-by-N upper triangular part of A contains the upper */ +/* > triangular part of the matrix A, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading N-by-N lower triangular part of A contains the lower */ +/* > triangular part of the matrix A, and the strictly upper */ +/* > triangular part of A is not referenced. */ +/* > On exit, if UPLO = 'U', the diagonal and first superdiagonal */ +/* > of A are overwritten by the corresponding elements of the */ +/* > tridiagonal matrix T, and the elements above the first */ +/* > superdiagonal, with the array TAU, represent the orthogonal */ +/* > matrix Q as a product of elementary reflectors; if UPLO */ +/* > = 'L', the diagonal and first subdiagonal of A are over- */ +/* > written by the corresponding elements of the tridiagonal */ +/* > matrix T, and the elements below the first subdiagonal, with */ +/* > the array TAU, represent the orthogonal matrix Q as a product */ +/* > of elementary reflectors. See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > The diagonal elements of the tridiagonal matrix T: */ +/* > D(i) = A(i,i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > The off-diagonal elements of the tridiagonal matrix T: */ +/* > E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is DOUBLE PRECISION array, dimension (N-1) */ +/* > The scalar factors of the elementary reflectors (see Further */ +/* > Details). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= 1. */ +/* > For optimum performance LWORK >= N*NB, where NB is the */ +/* > optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleSYcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > If UPLO = 'U', the matrix Q is represented as a product of elementary */ +/* > reflectors */ +/* > */ +/* > Q = H(n-1) . . . H(2) H(1). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**T */ +/* > */ +/* > where tau is a real scalar, and v is a real vector with */ +/* > v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in */ +/* > A(1:i-1,i+1), and tau in TAU(i). */ +/* > */ +/* > If UPLO = 'L', the matrix Q is represented as a product of elementary */ +/* > reflectors */ +/* > */ +/* > Q = H(1) H(2) . . . H(n-1). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**T */ +/* > */ +/* > where tau is a real scalar, and v is a real vector with */ +/* > v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), */ +/* > and tau in TAU(i). */ +/* > */ +/* > The contents of A on exit are illustrated by the following examples */ +/* > with n = 5: */ +/* > */ +/* > if UPLO = 'U': if UPLO = 'L': */ +/* > */ +/* > ( d e v2 v3 v4 ) ( d ) */ +/* > ( d e v3 v4 ) ( e d ) */ +/* > ( d e v4 ) ( v1 e d ) */ +/* > ( d e ) ( v1 v2 e d ) */ +/* > ( d ) ( v1 v2 v3 e d ) */ +/* > */ +/* > where d and e denote diagonal and off-diagonal elements of T, and vi */ +/* > denotes an element of the vector defining H(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dsytrd_(char *uplo, integer *n, doublereal *a, integer * + lda, doublereal *d__, doublereal *e, doublereal *tau, doublereal * + work, integer *lwork, integer *info, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, j, nb, kk, nx, iws; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nbmin, iinfo; + logical upper; + extern /* Subroutine */ int dsytd2_(char *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), dsyr2k_(char *, char *, integer *, integer *, doublereal + *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen), dlatrd_(char *, + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, integer *, ftnlen), xerbla_(char *, + integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + integer ldwork, lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --d__; + --e; + --tau; + --work; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } else if (*lwork < 1 && ! lquery) { + *info = -9; + } + + if (*info == 0) { + +/* Determine the block size. */ + + nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, + (ftnlen)1); + lwkopt = *n * nb; + work[1] = (doublereal) lwkopt; + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DSYTRD", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + work[1] = 1.; + return 0; + } + + nx = *n; + iws = 1; + if (nb > 1 && nb < *n) { + +/* Determine when to cross over from blocked to unblocked code */ +/* (last block is always handled by unblocked code). */ + +/* Computing MAX */ + i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, & + c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *n) { + +/* Determine if workspace is large enough for blocked code. */ + + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { + +/* Not enough workspace to use optimal NB: determine the */ +/* minimum value of NB, and reduce NB or force use of */ +/* unblocked code by setting NX = N. */ + +/* Computing MAX */ + i__1 = *lwork / ldwork; + nb = max(i__1,1); + nbmin = ilaenv_(&c__2, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, + (ftnlen)6, (ftnlen)1); + if (nb < nbmin) { + nx = *n; + } + } + } else { + nx = *n; + } + } else { + nb = 1; + } + + if (upper) { + +/* Reduce the upper triangle of A. */ +/* Columns 1:kk are handled by the unblocked method. */ + + kk = *n - (*n - nx + nb - 1) / nb * nb; + i__1 = kk + 1; + i__2 = -nb; + for (i__ = *n - nb + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += + i__2) { + +/* Reduce columns i:i+nb-1 to tridiagonal form and form the */ +/* matrix W which is needed to update the unreduced part of */ +/* the matrix */ + + i__3 = i__ + nb - 1; + dlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], & + work[1], &ldwork, (ftnlen)1); + +/* Update the unreduced submatrix A(1:i-1,1:i-1), using an */ +/* update of the form: A := A - V*W**T - W*V**T */ + + i__3 = i__ - 1; + dsyr2k_(uplo, (char *)"No transpose", &i__3, &nb, &c_b22, &a[i__ * a_dim1 + + 1], lda, &work[1], &ldwork, &c_b23, &a[a_offset], lda, ( + ftnlen)1, (ftnlen)12); + +/* Copy superdiagonal elements back into A, and diagonal */ +/* elements into D */ + + i__3 = i__ + nb - 1; + for (j = i__; j <= i__3; ++j) { + a[j - 1 + j * a_dim1] = e[j - 1]; + d__[j] = a[j + j * a_dim1]; +/* L10: */ + } +/* L20: */ + } + +/* Use unblocked code to reduce the last or only block */ + + dsytd2_(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo, + (ftnlen)1); + } else { + +/* Reduce the lower triangle of A */ + + i__2 = *n - nx; + i__1 = nb; + for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { + +/* Reduce columns i:i+nb-1 to tridiagonal form and form the */ +/* matrix W which is needed to update the unreduced part of */ +/* the matrix */ + + i__3 = *n - i__ + 1; + dlatrd_(uplo, &i__3, &nb, &a[i__ + i__ * a_dim1], lda, &e[i__], & + tau[i__], &work[1], &ldwork, (ftnlen)1); + +/* Update the unreduced submatrix A(i+ib:n,i+ib:n), using */ +/* an update of the form: A := A - V*W**T - W*V**T */ + + i__3 = *n - i__ - nb + 1; + dsyr2k_(uplo, (char *)"No transpose", &i__3, &nb, &c_b22, &a[i__ + nb + + i__ * a_dim1], lda, &work[nb + 1], &ldwork, &c_b23, &a[ + i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)1, (ftnlen) + 12); + +/* Copy subdiagonal elements back into A, and diagonal */ +/* elements into D */ + + i__3 = i__ + nb - 1; + for (j = i__; j <= i__3; ++j) { + a[j + 1 + j * a_dim1] = e[j]; + d__[j] = a[j + j * a_dim1]; +/* L30: */ + } +/* L40: */ + } + +/* Use unblocked code to reduce the last or only block */ + + i__1 = *n - i__ + 1; + dsytd2_(uplo, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], + &tau[i__], &iinfo, (ftnlen)1); + } + + work[1] = (doublereal) lwkopt; + return 0; + +/* End of DSYTRD */ + +} /* dsytrd_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dtrmm.cpp b/lib/linalg/dtrmm.cpp new file mode 100644 index 0000000000..ffb6a1ad6b --- /dev/null +++ b/lib/linalg/dtrmm.cpp @@ -0,0 +1,527 @@ +/* fortran/dtrmm.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DTRMM */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION ALPHA */ +/* INTEGER LDA,LDB,M,N */ +/* CHARACTER DIAG,SIDE,TRANSA,UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A(LDA,*),B(LDB,*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DTRMM performs one of the matrix-matrix operations */ +/* > */ +/* > B := alpha*op( A )*B, or B := alpha*B*op( A ), */ +/* > */ +/* > where alpha is a scalar, B is an m by n matrix, A is a unit, or */ +/* > non-unit, upper or lower triangular matrix and op( A ) is one of */ +/* > */ +/* > op( A ) = A or op( A ) = A**T. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > On entry, SIDE specifies whether op( A ) multiplies B from */ +/* > the left or right as follows: */ +/* > */ +/* > SIDE = 'L' or 'l' B := alpha*op( A )*B. */ +/* > */ +/* > SIDE = 'R' or 'r' B := alpha*B*op( A ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the matrix A is an upper or */ +/* > lower triangular matrix as follows: */ +/* > */ +/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ +/* > */ +/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANSA */ +/* > \verbatim */ +/* > TRANSA is CHARACTER*1 */ +/* > On entry, TRANSA specifies the form of op( A ) to be used in */ +/* > the matrix multiplication as follows: */ +/* > */ +/* > TRANSA = 'N' or 'n' op( A ) = A. */ +/* > */ +/* > TRANSA = 'T' or 't' op( A ) = A**T. */ +/* > */ +/* > TRANSA = 'C' or 'c' op( A ) = A**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIAG */ +/* > \verbatim */ +/* > DIAG is CHARACTER*1 */ +/* > On entry, DIAG specifies whether or not A is unit triangular */ +/* > as follows: */ +/* > */ +/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ +/* > */ +/* > DIAG = 'N' or 'n' A is not assumed to be unit */ +/* > triangular. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > On entry, M specifies the number of rows of B. M must be at */ +/* > least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the number of columns of B. N must be */ +/* > at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION. */ +/* > On entry, ALPHA specifies the scalar alpha. When alpha is */ +/* > zero then A is not referenced and B need not be set before */ +/* > entry. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension ( LDA, k ), where k is m */ +/* > when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. */ +/* > Before entry with UPLO = 'U' or 'u', the leading k by k */ +/* > upper triangular part of the array A must contain the upper */ +/* > triangular matrix and the strictly lower triangular part of */ +/* > A is not referenced. */ +/* > Before entry with UPLO = 'L' or 'l', the leading k by k */ +/* > lower triangular part of the array A must contain the lower */ +/* > triangular matrix and the strictly upper triangular part of */ +/* > A is not referenced. */ +/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ +/* > A are not referenced either, but are assumed to be unity. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. When SIDE = 'L' or 'l' then */ +/* > LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' */ +/* > then LDA must be at least max( 1, n ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension ( LDB, N ) */ +/* > Before entry, the leading m by n part of the array B must */ +/* > contain the matrix B, and on exit is overwritten by the */ +/* > transformed matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > On entry, LDB specifies the first dimension of B as declared */ +/* > in the calling (sub) program. LDB must be at least */ +/* > max( 1, m ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level3 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 3 Blas routine. */ +/* > */ +/* > -- Written on 8-February-1989. */ +/* > Jack Dongarra, Argonne National Laboratory. */ +/* > Iain Duff, AERE Harwell. */ +/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ +/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dtrmm_(char *side, char *uplo, char *transa, char *diag, + integer *m, integer *n, doublereal *alpha, doublereal *a, integer * + lda, doublereal *b, integer *ldb, ftnlen side_len, ftnlen uplo_len, + ftnlen transa_len, ftnlen diag_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, j, k, info; + doublereal temp; + logical lside; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nrowa; + logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + logical nounit; + + +/* -- Reference BLAS level3 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Parameters .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + lside = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + if (lside) { + nrowa = *m; + } else { + nrowa = *n; + } + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + + info = 0; + if (! lside && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 2; + } else if (! lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 3; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 4; + } else if (*m < 0) { + info = 5; + } else if (*n < 0) { + info = 6; + } else if (*lda < max(1,nrowa)) { + info = 9; + } else if (*ldb < max(1,*m)) { + info = 11; + } + if (info != 0) { + xerbla_((char *)"DTRMM ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = 0.; +/* L10: */ + } +/* L20: */ + } + return 0; + } + +/* Start the operations. */ + + if (lside) { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form B := alpha*A*B. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (k = 1; k <= i__2; ++k) { + if (b[k + j * b_dim1] != 0.) { + temp = *alpha * b[k + j * b_dim1]; + i__3 = k - 1; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] += temp * a[i__ + k * + a_dim1]; +/* L30: */ + } + if (nounit) { + temp *= a[k + k * a_dim1]; + } + b[k + j * b_dim1] = temp; + } +/* L40: */ + } +/* L50: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (k = *m; k >= 1; --k) { + if (b[k + j * b_dim1] != 0.) { + temp = *alpha * b[k + j * b_dim1]; + b[k + j * b_dim1] = temp; + if (nounit) { + b[k + j * b_dim1] *= a[k + k * a_dim1]; + } + i__2 = *m; + for (i__ = k + 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] += temp * a[i__ + k * + a_dim1]; +/* L60: */ + } + } +/* L70: */ + } +/* L80: */ + } + } + } else { + +/* Form B := alpha*A**T*B. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + temp = b[i__ + j * b_dim1]; + if (nounit) { + temp *= a[i__ + i__ * a_dim1]; + } + i__2 = i__ - 1; + for (k = 1; k <= i__2; ++k) { + temp += a[k + i__ * a_dim1] * b[k + j * b_dim1]; +/* L90: */ + } + b[i__ + j * b_dim1] = *alpha * temp; +/* L100: */ + } +/* L110: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = b[i__ + j * b_dim1]; + if (nounit) { + temp *= a[i__ + i__ * a_dim1]; + } + i__3 = *m; + for (k = i__ + 1; k <= i__3; ++k) { + temp += a[k + i__ * a_dim1] * b[k + j * b_dim1]; +/* L120: */ + } + b[i__ + j * b_dim1] = *alpha * temp; +/* L130: */ + } +/* L140: */ + } + } + } + } else { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form B := alpha*B*A. */ + + if (upper) { + for (j = *n; j >= 1; --j) { + temp = *alpha; + if (nounit) { + temp *= a[j + j * a_dim1]; + } + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; +/* L150: */ + } + i__1 = j - 1; + for (k = 1; k <= i__1; ++k) { + if (a[k + j * a_dim1] != 0.) { + temp = *alpha * a[k + j * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] += temp * b[i__ + k * + b_dim1]; +/* L160: */ + } + } +/* L170: */ + } +/* L180: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = *alpha; + if (nounit) { + temp *= a[j + j * a_dim1]; + } + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; +/* L190: */ + } + i__2 = *n; + for (k = j + 1; k <= i__2; ++k) { + if (a[k + j * a_dim1] != 0.) { + temp = *alpha * a[k + j * a_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] += temp * b[i__ + k * + b_dim1]; +/* L200: */ + } + } +/* L210: */ + } +/* L220: */ + } + } + } else { + +/* Form B := alpha*B*A**T. */ + + if (upper) { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + i__2 = k - 1; + for (j = 1; j <= i__2; ++j) { + if (a[j + k * a_dim1] != 0.) { + temp = *alpha * a[j + k * a_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] += temp * b[i__ + k * + b_dim1]; +/* L230: */ + } + } +/* L240: */ + } + temp = *alpha; + if (nounit) { + temp *= a[k + k * a_dim1]; + } + if (temp != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; +/* L250: */ + } + } +/* L260: */ + } + } else { + for (k = *n; k >= 1; --k) { + i__1 = *n; + for (j = k + 1; j <= i__1; ++j) { + if (a[j + k * a_dim1] != 0.) { + temp = *alpha * a[j + k * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] += temp * b[i__ + k * + b_dim1]; +/* L270: */ + } + } +/* L280: */ + } + temp = *alpha; + if (nounit) { + temp *= a[k + k * a_dim1]; + } + if (temp != 1.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; +/* L290: */ + } + } +/* L300: */ + } + } + } + } + + return 0; + +/* End of DTRMM */ + +} /* dtrmm_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dtrmv.cpp b/lib/linalg/dtrmv.cpp new file mode 100644 index 0000000000..77dbf2f66f --- /dev/null +++ b/lib/linalg/dtrmv.cpp @@ -0,0 +1,415 @@ +/* fortran/dtrmv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DTRMV */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,LDA,N */ +/* CHARACTER DIAG,TRANS,UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A(LDA,*),X(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DTRMV performs one of the matrix-vector operations */ +/* > */ +/* > x := A*x, or x := A**T*x, */ +/* > */ +/* > where x is an n element vector and A is an n by n unit, or non-unit, */ +/* > upper or lower triangular matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the matrix is an upper or */ +/* > lower triangular matrix as follows: */ +/* > */ +/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ +/* > */ +/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > On entry, TRANS specifies the operation to be performed as */ +/* > follows: */ +/* > */ +/* > TRANS = 'N' or 'n' x := A*x. */ +/* > */ +/* > TRANS = 'T' or 't' x := A**T*x. */ +/* > */ +/* > TRANS = 'C' or 'c' x := A**T*x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIAG */ +/* > \verbatim */ +/* > DIAG is CHARACTER*1 */ +/* > On entry, DIAG specifies whether or not A is unit */ +/* > triangular as follows: */ +/* > */ +/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ +/* > */ +/* > DIAG = 'N' or 'n' A is not assumed to be unit */ +/* > triangular. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension ( LDA, N ) */ +/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ +/* > upper triangular part of the array A must contain the upper */ +/* > triangular matrix and the strictly lower triangular part of */ +/* > A is not referenced. */ +/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ +/* > lower triangular part of the array A must contain the lower */ +/* > triangular matrix and the strictly upper triangular part of */ +/* > A is not referenced. */ +/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ +/* > A are not referenced either, but are assumed to be unity. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. LDA must be at least */ +/* > max( 1, n ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array X must contain the n */ +/* > element vector x. On exit, X is overwritten with the */ +/* > transformed vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dtrmv_(char *uplo, char *trans, char *diag, integer *n, + doublereal *a, integer *lda, doublereal *x, integer *incx, ftnlen + uplo_len, ftnlen trans_len, ftnlen diag_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + + /* Local variables */ + integer i__, j, ix, jx, kx, info; + doublereal temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + logical nounit; + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + + /* Function Body */ + info = 0; + if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*lda < max(1,*n)) { + info = 6; + } else if (*incx == 0) { + info = 8; + } + if (info != 0) { + xerbla_((char *)"DTRMV ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0) { + return 0; + } + + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + +/* Set up the start point in X if the increment is not unity. This */ +/* will be ( N - 1 )*INCX too small for descending loops. */ + + if (*incx <= 0) { + kx = 1 - (*n - 1) * *incx; + } else if (*incx != 1) { + kx = 1; + } + +/* Start the operations. In this version the elements of A are */ +/* accessed sequentially with one pass through A. */ + + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form x := A*x. */ + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[j] != 0.) { + temp = x[j]; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + x[i__] += temp * a[i__ + j * a_dim1]; +/* L10: */ + } + if (nounit) { + x[j] *= a[j + j * a_dim1]; + } + } +/* L20: */ + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0.) { + temp = x[jx]; + ix = kx; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + x[ix] += temp * a[i__ + j * a_dim1]; + ix += *incx; +/* L30: */ + } + if (nounit) { + x[jx] *= a[j + j * a_dim1]; + } + } + jx += *incx; +/* L40: */ + } + } + } else { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + if (x[j] != 0.) { + temp = x[j]; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + x[i__] += temp * a[i__ + j * a_dim1]; +/* L50: */ + } + if (nounit) { + x[j] *= a[j + j * a_dim1]; + } + } +/* L60: */ + } + } else { + kx += (*n - 1) * *incx; + jx = kx; + for (j = *n; j >= 1; --j) { + if (x[jx] != 0.) { + temp = x[jx]; + ix = kx; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + x[ix] += temp * a[i__ + j * a_dim1]; + ix -= *incx; +/* L70: */ + } + if (nounit) { + x[jx] *= a[j + j * a_dim1]; + } + } + jx -= *incx; +/* L80: */ + } + } + } + } else { + +/* Form x := A**T*x. */ + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + temp = x[j]; + if (nounit) { + temp *= a[j + j * a_dim1]; + } + for (i__ = j - 1; i__ >= 1; --i__) { + temp += a[i__ + j * a_dim1] * x[i__]; +/* L90: */ + } + x[j] = temp; +/* L100: */ + } + } else { + jx = kx + (*n - 1) * *incx; + for (j = *n; j >= 1; --j) { + temp = x[jx]; + ix = jx; + if (nounit) { + temp *= a[j + j * a_dim1]; + } + for (i__ = j - 1; i__ >= 1; --i__) { + ix -= *incx; + temp += a[i__ + j * a_dim1] * x[ix]; +/* L110: */ + } + x[jx] = temp; + jx -= *incx; +/* L120: */ + } + } + } else { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = x[j]; + if (nounit) { + temp *= a[j + j * a_dim1]; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + temp += a[i__ + j * a_dim1] * x[i__]; +/* L130: */ + } + x[j] = temp; +/* L140: */ + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = x[jx]; + ix = jx; + if (nounit) { + temp *= a[j + j * a_dim1]; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + temp += a[i__ + j * a_dim1] * x[ix]; +/* L150: */ + } + x[jx] = temp; + jx += *incx; +/* L160: */ + } + } + } + } + + return 0; + +/* End of DTRMV */ + +} /* dtrmv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dtrsm.cpp b/lib/linalg/dtrsm.cpp new file mode 100644 index 0000000000..488da4ecdc --- /dev/null +++ b/lib/linalg/dtrsm.cpp @@ -0,0 +1,565 @@ +/* fortran/dtrsm.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DTRSM */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION ALPHA */ +/* INTEGER LDA,LDB,M,N */ +/* CHARACTER DIAG,SIDE,TRANSA,UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A(LDA,*),B(LDB,*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DTRSM solves one of the matrix equations */ +/* > */ +/* > op( A )*X = alpha*B, or X*op( A ) = alpha*B, */ +/* > */ +/* > where alpha is a scalar, X and B are m by n matrices, A is a unit, or */ +/* > non-unit, upper or lower triangular matrix and op( A ) is one of */ +/* > */ +/* > op( A ) = A or op( A ) = A**T. */ +/* > */ +/* > The matrix X is overwritten on B. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > On entry, SIDE specifies whether op( A ) appears on the left */ +/* > or right of X as follows: */ +/* > */ +/* > SIDE = 'L' or 'l' op( A )*X = alpha*B. */ +/* > */ +/* > SIDE = 'R' or 'r' X*op( A ) = alpha*B. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the matrix A is an upper or */ +/* > lower triangular matrix as follows: */ +/* > */ +/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ +/* > */ +/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANSA */ +/* > \verbatim */ +/* > TRANSA is CHARACTER*1 */ +/* > On entry, TRANSA specifies the form of op( A ) to be used in */ +/* > the matrix multiplication as follows: */ +/* > */ +/* > TRANSA = 'N' or 'n' op( A ) = A. */ +/* > */ +/* > TRANSA = 'T' or 't' op( A ) = A**T. */ +/* > */ +/* > TRANSA = 'C' or 'c' op( A ) = A**T. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIAG */ +/* > \verbatim */ +/* > DIAG is CHARACTER*1 */ +/* > On entry, DIAG specifies whether or not A is unit triangular */ +/* > as follows: */ +/* > */ +/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ +/* > */ +/* > DIAG = 'N' or 'n' A is not assumed to be unit */ +/* > triangular. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > On entry, M specifies the number of rows of B. M must be at */ +/* > least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the number of columns of B. N must be */ +/* > at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION. */ +/* > On entry, ALPHA specifies the scalar alpha. When alpha is */ +/* > zero then A is not referenced and B need not be set before */ +/* > entry. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension ( LDA, k ), */ +/* > where k is m when SIDE = 'L' or 'l' */ +/* > and k is n when SIDE = 'R' or 'r'. */ +/* > Before entry with UPLO = 'U' or 'u', the leading k by k */ +/* > upper triangular part of the array A must contain the upper */ +/* > triangular matrix and the strictly lower triangular part of */ +/* > A is not referenced. */ +/* > Before entry with UPLO = 'L' or 'l', the leading k by k */ +/* > lower triangular part of the array A must contain the lower */ +/* > triangular matrix and the strictly upper triangular part of */ +/* > A is not referenced. */ +/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ +/* > A are not referenced either, but are assumed to be unity. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. When SIDE = 'L' or 'l' then */ +/* > LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' */ +/* > then LDA must be at least max( 1, n ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension ( LDB, N ) */ +/* > Before entry, the leading m by n part of the array B must */ +/* > contain the right-hand side matrix B, and on exit is */ +/* > overwritten by the solution matrix X. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > On entry, LDB specifies the first dimension of B as declared */ +/* > in the calling (sub) program. LDB must be at least */ +/* > max( 1, m ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level3 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 3 Blas routine. */ +/* > */ +/* > */ +/* > -- Written on 8-February-1989. */ +/* > Jack Dongarra, Argonne National Laboratory. */ +/* > Iain Duff, AERE Harwell. */ +/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ +/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int dtrsm_(char *side, char *uplo, char *transa, char *diag, + integer *m, integer *n, doublereal *alpha, doublereal *a, integer * + lda, doublereal *b, integer *ldb, ftnlen side_len, ftnlen uplo_len, + ftnlen transa_len, ftnlen diag_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, j, k, info; + doublereal temp; + logical lside; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nrowa; + logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + logical nounit; + + +/* -- Reference BLAS level3 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Parameters .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + lside = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + if (lside) { + nrowa = *m; + } else { + nrowa = *n; + } + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + + info = 0; + if (! lside && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 2; + } else if (! lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 3; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 4; + } else if (*m < 0) { + info = 5; + } else if (*n < 0) { + info = 6; + } else if (*lda < max(1,nrowa)) { + info = 9; + } else if (*ldb < max(1,*m)) { + info = 11; + } + if (info != 0) { + xerbla_((char *)"DTRSM ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (*alpha == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = 0.; +/* L10: */ + } +/* L20: */ + } + return 0; + } + +/* Start the operations. */ + + if (lside) { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form B := alpha*inv( A )*B. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L30: */ + } + } + for (k = *m; k >= 1; --k) { + if (b[k + j * b_dim1] != 0.) { + if (nounit) { + b[k + j * b_dim1] /= a[k + k * a_dim1]; + } + i__2 = k - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ + i__ + k * a_dim1]; +/* L40: */ + } + } +/* L50: */ + } +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L70: */ + } + } + i__2 = *m; + for (k = 1; k <= i__2; ++k) { + if (b[k + j * b_dim1] != 0.) { + if (nounit) { + b[k + j * b_dim1] /= a[k + k * a_dim1]; + } + i__3 = *m; + for (i__ = k + 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ + i__ + k * a_dim1]; +/* L80: */ + } + } +/* L90: */ + } +/* L100: */ + } + } + } else { + +/* Form B := alpha*inv( A**T )*B. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = *alpha * b[i__ + j * b_dim1]; + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; +/* L110: */ + } + if (nounit) { + temp /= a[i__ + i__ * a_dim1]; + } + b[i__ + j * b_dim1] = temp; +/* L120: */ + } +/* L130: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + temp = *alpha * b[i__ + j * b_dim1]; + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; +/* L140: */ + } + if (nounit) { + temp /= a[i__ + i__ * a_dim1]; + } + b[i__ + j * b_dim1] = temp; +/* L150: */ + } +/* L160: */ + } + } + } + } else { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form B := alpha*B*inv( A ). */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L170: */ + } + } + i__2 = j - 1; + for (k = 1; k <= i__2; ++k) { + if (a[k + j * a_dim1] != 0.) { + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ + i__ + k * b_dim1]; +/* L180: */ + } + } +/* L190: */ + } + if (nounit) { + temp = 1. / a[j + j * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; +/* L200: */ + } + } +/* L210: */ + } + } else { + for (j = *n; j >= 1; --j) { + if (*alpha != 1.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; +/* L220: */ + } + } + i__1 = *n; + for (k = j + 1; k <= i__1; ++k) { + if (a[k + j * a_dim1] != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ + i__ + k * b_dim1]; +/* L230: */ + } + } +/* L240: */ + } + if (nounit) { + temp = 1. / a[j + j * a_dim1]; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; +/* L250: */ + } + } +/* L260: */ + } + } + } else { + +/* Form B := alpha*B*inv( A**T ). */ + + if (upper) { + for (k = *n; k >= 1; --k) { + if (nounit) { + temp = 1. / a[k + k * a_dim1]; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; +/* L270: */ + } + } + i__1 = k - 1; + for (j = 1; j <= i__1; ++j) { + if (a[j + k * a_dim1] != 0.) { + temp = a[j + k * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= temp * b[i__ + k * + b_dim1]; +/* L280: */ + } + } +/* L290: */ + } + if (*alpha != 1.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] + ; +/* L300: */ + } + } +/* L310: */ + } + } else { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + if (nounit) { + temp = 1. / a[k + k * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; +/* L320: */ + } + } + i__2 = *n; + for (j = k + 1; j <= i__2; ++j) { + if (a[j + k * a_dim1] != 0.) { + temp = a[j + k * a_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= temp * b[i__ + k * + b_dim1]; +/* L330: */ + } + } +/* L340: */ + } + if (*alpha != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] + ; +/* L350: */ + } + } +/* L360: */ + } + } + } + } + + return 0; + +/* End of DTRSM */ + +} /* dtrsm_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dtrsv.cpp b/lib/linalg/dtrsv.cpp new file mode 100644 index 0000000000..58b85f9206 --- /dev/null +++ b/lib/linalg/dtrsv.cpp @@ -0,0 +1,411 @@ +/* fortran/dtrsv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DTRSV */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,LDA,N */ +/* CHARACTER DIAG,TRANS,UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A(LDA,*),X(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DTRSV solves one of the systems of equations */ +/* > */ +/* > A*x = b, or A**T*x = b, */ +/* > */ +/* > where b and x are n element vectors and A is an n by n unit, or */ +/* > non-unit, upper or lower triangular matrix. */ +/* > */ +/* > No test for singularity or near-singularity is included in this */ +/* > routine. Such tests must be performed before calling this routine. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the matrix is an upper or */ +/* > lower triangular matrix as follows: */ +/* > */ +/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ +/* > */ +/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > On entry, TRANS specifies the equations to be solved as */ +/* > follows: */ +/* > */ +/* > TRANS = 'N' or 'n' A*x = b. */ +/* > */ +/* > TRANS = 'T' or 't' A**T*x = b. */ +/* > */ +/* > TRANS = 'C' or 'c' A**T*x = b. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIAG */ +/* > \verbatim */ +/* > DIAG is CHARACTER*1 */ +/* > On entry, DIAG specifies whether or not A is unit */ +/* > triangular as follows: */ +/* > */ +/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ +/* > */ +/* > DIAG = 'N' or 'n' A is not assumed to be unit */ +/* > triangular. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension ( LDA, N ) */ +/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ +/* > upper triangular part of the array A must contain the upper */ +/* > triangular matrix and the strictly lower triangular part of */ +/* > A is not referenced. */ +/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ +/* > lower triangular part of the array A must contain the lower */ +/* > triangular matrix and the strictly upper triangular part of */ +/* > A is not referenced. */ +/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ +/* > A are not referenced either, but are assumed to be unity. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. LDA must be at least */ +/* > max( 1, n ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] X */ +/* > \verbatim */ +/* > X is DOUBLE PRECISION array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array X must contain the n */ +/* > element right-hand side vector b. On exit, X is overwritten */ +/* > with the solution vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > */ +/* > Level 2 Blas routine. */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup double_blas_level1 */ + +/* ===================================================================== */ +/* Subroutine */ int dtrsv_(char *uplo, char *trans, char *diag, integer *n, + doublereal *a, integer *lda, doublereal *x, integer *incx, ftnlen + uplo_len, ftnlen trans_len, ftnlen diag_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + + /* Local variables */ + integer i__, j, ix, jx, kx, info; + doublereal temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + logical nounit; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + + /* Function Body */ + info = 0; + if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*lda < max(1,*n)) { + info = 6; + } else if (*incx == 0) { + info = 8; + } + if (info != 0) { + xerbla_((char *)"DTRSV ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0) { + return 0; + } + + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + +/* Set up the start point in X if the increment is not unity. This */ +/* will be ( N - 1 )*INCX too small for descending loops. */ + + if (*incx <= 0) { + kx = 1 - (*n - 1) * *incx; + } else if (*incx != 1) { + kx = 1; + } + +/* Start the operations. In this version the elements of A are */ +/* accessed sequentially with one pass through A. */ + + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form x := inv( A )*x. */ + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + if (x[j] != 0.) { + if (nounit) { + x[j] /= a[j + j * a_dim1]; + } + temp = x[j]; + for (i__ = j - 1; i__ >= 1; --i__) { + x[i__] -= temp * a[i__ + j * a_dim1]; +/* L10: */ + } + } +/* L20: */ + } + } else { + jx = kx + (*n - 1) * *incx; + for (j = *n; j >= 1; --j) { + if (x[jx] != 0.) { + if (nounit) { + x[jx] /= a[j + j * a_dim1]; + } + temp = x[jx]; + ix = jx; + for (i__ = j - 1; i__ >= 1; --i__) { + ix -= *incx; + x[ix] -= temp * a[i__ + j * a_dim1]; +/* L30: */ + } + } + jx -= *incx; +/* L40: */ + } + } + } else { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[j] != 0.) { + if (nounit) { + x[j] /= a[j + j * a_dim1]; + } + temp = x[j]; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + x[i__] -= temp * a[i__ + j * a_dim1]; +/* L50: */ + } + } +/* L60: */ + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0.) { + if (nounit) { + x[jx] /= a[j + j * a_dim1]; + } + temp = x[jx]; + ix = jx; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + x[ix] -= temp * a[i__ + j * a_dim1]; +/* L70: */ + } + } + jx += *incx; +/* L80: */ + } + } + } + } else { + +/* Form x := inv( A**T )*x. */ + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = x[j]; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + temp -= a[i__ + j * a_dim1] * x[i__]; +/* L90: */ + } + if (nounit) { + temp /= a[j + j * a_dim1]; + } + x[j] = temp; +/* L100: */ + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = x[jx]; + ix = kx; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + temp -= a[i__ + j * a_dim1] * x[ix]; + ix += *incx; +/* L110: */ + } + if (nounit) { + temp /= a[j + j * a_dim1]; + } + x[jx] = temp; + jx += *incx; +/* L120: */ + } + } + } else { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + temp = x[j]; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + temp -= a[i__ + j * a_dim1] * x[i__]; +/* L130: */ + } + if (nounit) { + temp /= a[j + j * a_dim1]; + } + x[j] = temp; +/* L140: */ + } + } else { + kx += (*n - 1) * *incx; + jx = kx; + for (j = *n; j >= 1; --j) { + temp = x[jx]; + ix = kx; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + temp -= a[i__ + j * a_dim1] * x[ix]; + ix -= *incx; +/* L150: */ + } + if (nounit) { + temp /= a[j + j * a_dim1]; + } + x[jx] = temp; + jx -= *incx; +/* L160: */ + } + } + } + } + + return 0; + +/* End of DTRSV */ + +} /* dtrsv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dtrti2.cpp b/lib/linalg/dtrti2.cpp new file mode 100644 index 0000000000..f159e31b0d --- /dev/null +++ b/lib/linalg/dtrti2.cpp @@ -0,0 +1,258 @@ +/* fortran/dtrti2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b DTRTI2 computes the inverse of a triangular matrix (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DTRTI2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DTRTI2( UPLO, DIAG, N, A, LDA, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER DIAG, UPLO */ +/* INTEGER INFO, LDA, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DTRTI2 computes the inverse of a real upper or lower triangular */ +/* > matrix. */ +/* > */ +/* > This is the Level 2 BLAS version of the algorithm. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies whether the matrix A is upper or lower triangular. */ +/* > = 'U': Upper triangular */ +/* > = 'L': Lower triangular */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIAG */ +/* > \verbatim */ +/* > DIAG is CHARACTER*1 */ +/* > Specifies whether or not the matrix A is unit triangular. */ +/* > = 'N': Non-unit triangular */ +/* > = 'U': Unit triangular */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the triangular matrix A. If UPLO = 'U', the */ +/* > leading n by n upper triangular part of the array A contains */ +/* > the upper triangular matrix, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading n by n lower triangular part of the array A contains */ +/* > the lower triangular matrix, and the strictly upper */ +/* > triangular part of A is not referenced. If DIAG = 'U', the */ +/* > diagonal elements of A are also not referenced and are */ +/* > assumed to be 1. */ +/* > */ +/* > On exit, the (triangular) inverse of the original matrix, in */ +/* > the same storage format. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -k, the k-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dtrti2_(char *uplo, char *diag, integer *n, doublereal * + a, integer *lda, integer *info, ftnlen uplo_len, ftnlen diag_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + + /* Local variables */ + integer j; + doublereal ajj; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + logical upper; + extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + logical nounit; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! nounit && ! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DTRTI2", &i__1, (ftnlen)6); + return 0; + } + + if (upper) { + +/* Compute inverse of upper triangular matrix. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (nounit) { + a[j + j * a_dim1] = 1. / a[j + j * a_dim1]; + ajj = -a[j + j * a_dim1]; + } else { + ajj = -1.; + } + +/* Compute elements 1:j-1 of j-th column. */ + + i__2 = j - 1; + dtrmv_((char *)"Upper", (char *)"No transpose", diag, &i__2, &a[a_offset], lda, & + a[j * a_dim1 + 1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen) + 1); + i__2 = j - 1; + dscal_(&i__2, &ajj, &a[j * a_dim1 + 1], &c__1); +/* L10: */ + } + } else { + +/* Compute inverse of lower triangular matrix. */ + + for (j = *n; j >= 1; --j) { + if (nounit) { + a[j + j * a_dim1] = 1. / a[j + j * a_dim1]; + ajj = -a[j + j * a_dim1]; + } else { + ajj = -1.; + } + if (j < *n) { + +/* Compute elements j+1:n of j-th column. */ + + i__1 = *n - j; + dtrmv_((char *)"Lower", (char *)"No transpose", diag, &i__1, &a[j + 1 + (j + + 1) * a_dim1], lda, &a[j + 1 + j * a_dim1], &c__1, ( + ftnlen)5, (ftnlen)12, (ftnlen)1); + i__1 = *n - j; + dscal_(&i__1, &ajj, &a[j + 1 + j * a_dim1], &c__1); + } +/* L20: */ + } + } + + return 0; + +/* End of DTRTI2 */ + +} /* dtrti2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dtrtri.cpp b/lib/linalg/dtrtri.cpp new file mode 100644 index 0000000000..faecb3dd69 --- /dev/null +++ b/lib/linalg/dtrtri.cpp @@ -0,0 +1,321 @@ +/* fortran/dtrtri.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +static doublereal c_b18 = 1.; +static doublereal c_b22 = -1.; + +/* > \brief \b DTRTRI */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download DTRTRI + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE DTRTRI( UPLO, DIAG, N, A, LDA, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER DIAG, UPLO */ +/* INTEGER INFO, LDA, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DTRTRI computes the inverse of a real upper or lower triangular */ +/* > matrix A. */ +/* > */ +/* > This is the Level 3 BLAS version of the algorithm. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': A is upper triangular; */ +/* > = 'L': A is lower triangular. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIAG */ +/* > \verbatim */ +/* > DIAG is CHARACTER*1 */ +/* > = 'N': A is non-unit triangular; */ +/* > = 'U': A is unit triangular. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > On entry, the triangular matrix A. If UPLO = 'U', the */ +/* > leading N-by-N upper triangular part of the array A contains */ +/* > the upper triangular matrix, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading N-by-N lower triangular part of the array A contains */ +/* > the lower triangular matrix, and the strictly upper */ +/* > triangular part of A is not referenced. If DIAG = 'U', the */ +/* > diagonal elements of A are also not referenced and are */ +/* > assumed to be 1. */ +/* > On exit, the (triangular) inverse of the original matrix, in */ +/* > the same storage format. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, A(i,i) is exactly zero. The triangular */ +/* > matrix is singular and its inverse can not be computed. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup doubleOTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int dtrtri_(char *uplo, char *diag, integer *n, doublereal * + a, integer *lda, integer *info, ftnlen uplo_len, ftnlen diag_len) +{ + /* System generated locals */ + address a__1[2]; + integer a_dim1, a_offset, i__1, i__2[2], i__3, i__4, i__5; + char ch__1[2]; + + /* Builtin functions */ + /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + + /* Local variables */ + integer j, jb, nb, nn; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), dtrsm_( + char *, char *, char *, char *, integer *, integer *, doublereal * + , doublereal *, integer *, doublereal *, integer *, ftnlen, + ftnlen, ftnlen, ftnlen); + logical upper; + extern /* Subroutine */ int dtrti2_(char *, char *, integer *, doublereal + *, integer *, integer *, ftnlen, ftnlen), xerbla_(char *, integer + *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + logical nounit; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! nounit && ! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"DTRTRI", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* Check for singularity if non-unit. */ + + if (nounit) { + i__1 = *n; + for (*info = 1; *info <= i__1; ++(*info)) { + if (a[*info + *info * a_dim1] == 0.) { + return 0; + } +/* L10: */ + } + *info = 0; + } + +/* Determine the block size for this environment. */ + +/* Writing concatenation */ + i__2[0] = 1, a__1[0] = uplo; + i__2[1] = 1, a__1[1] = diag; + s_cat(ch__1, a__1, i__2, &c__2, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DTRTRI", ch__1, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( + ftnlen)2); + if (nb <= 1 || nb >= *n) { + +/* Use unblocked code */ + + dtrti2_(uplo, diag, n, &a[a_offset], lda, info, (ftnlen)1, (ftnlen)1); + } else { + +/* Use blocked code */ + + if (upper) { + +/* Compute inverse of upper triangular matrix */ + + i__1 = *n; + i__3 = nb; + for (j = 1; i__3 < 0 ? j >= i__1 : j <= i__1; j += i__3) { +/* Computing MIN */ + i__4 = nb, i__5 = *n - j + 1; + jb = min(i__4,i__5); + +/* Compute rows 1:j-1 of current block column */ + + i__4 = j - 1; + dtrmm_((char *)"Left", (char *)"Upper", (char *)"No transpose", diag, &i__4, &jb, & + c_b18, &a[a_offset], lda, &a[j * a_dim1 + 1], lda, ( + ftnlen)4, (ftnlen)5, (ftnlen)12, (ftnlen)1); + i__4 = j - 1; + dtrsm_((char *)"Right", (char *)"Upper", (char *)"No transpose", diag, &i__4, &jb, & + c_b22, &a[j + j * a_dim1], lda, &a[j * a_dim1 + 1], + lda, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)1); + +/* Compute inverse of current diagonal block */ + + dtrti2_((char *)"Upper", diag, &jb, &a[j + j * a_dim1], lda, info, ( + ftnlen)5, (ftnlen)1); +/* L20: */ + } + } else { + +/* Compute inverse of lower triangular matrix */ + + nn = (*n - 1) / nb * nb + 1; + i__3 = -nb; + for (j = nn; i__3 < 0 ? j >= 1 : j <= 1; j += i__3) { +/* Computing MIN */ + i__1 = nb, i__4 = *n - j + 1; + jb = min(i__1,i__4); + if (j + jb <= *n) { + +/* Compute rows j+jb:n of current block column */ + + i__1 = *n - j - jb + 1; + dtrmm_((char *)"Left", (char *)"Lower", (char *)"No transpose", diag, &i__1, &jb, + &c_b18, &a[j + jb + (j + jb) * a_dim1], lda, &a[j + + jb + j * a_dim1], lda, (ftnlen)4, (ftnlen)5, ( + ftnlen)12, (ftnlen)1); + i__1 = *n - j - jb + 1; + dtrsm_((char *)"Right", (char *)"Lower", (char *)"No transpose", diag, &i__1, &jb, + &c_b22, &a[j + j * a_dim1], lda, &a[j + jb + j * + a_dim1], lda, (ftnlen)5, (ftnlen)5, (ftnlen)12, ( + ftnlen)1); + } + +/* Compute inverse of current diagonal block */ + + dtrti2_((char *)"Lower", diag, &jb, &a[j + j * a_dim1], lda, info, ( + ftnlen)5, (ftnlen)1); +/* L30: */ + } + } + } + + return 0; + +/* End of DTRTRI */ + +} /* dtrtri_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dznrm2.cpp b/lib/linalg/dznrm2.cpp new file mode 100644 index 0000000000..ec71aa201b --- /dev/null +++ b/lib/linalg/dznrm2.cpp @@ -0,0 +1,183 @@ +/* fortran/dznrm2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DZNRM2 */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* DOUBLE PRECISION FUNCTION DZNRM2(N,X,INCX) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 X(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > DZNRM2 returns the euclidean norm of a vector via the function */ +/* > name, so that */ +/* > */ +/* > DZNRM2 := sqrt( x**H*x ) */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 array, dimension (N) */ +/* > complex vector with N elements */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of X */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \date December 2016 */ + +/* > \ingroup double_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > -- This version written on 25-October-1982. */ +/* > Modified on 14-October-1993 to inline the call to ZLASSQ. */ +/* > Sven Hammarling, Nag Ltd. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +doublereal dznrm2_(integer *n, doublecomplex *x, integer *incx) +{ + /* System generated locals */ + integer i__1, i__2, i__3; + doublereal ret_val, d__1; + + /* Builtin functions */ + double d_imag(doublecomplex *), sqrt(doublereal); + + /* Local variables */ + integer ix; + doublereal ssq, temp, norm, scale; + + +/* -- Reference BLAS level1 routine (version 3.7.0) -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ +/* December 2016 */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + /* Parameter adjustments */ + --x; + + /* Function Body */ + if (*n < 1 || *incx < 1) { + norm = 0.; + } else { + scale = 0.; + ssq = 1.; +/* The following loop is equivalent to this call to the LAPACK */ +/* auxiliary routine: */ +/* CALL ZLASSQ( N, X, INCX, SCALE, SSQ ) */ + + i__1 = (*n - 1) * *incx + 1; + i__2 = *incx; + for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { + i__3 = ix; + if (x[i__3].r != 0.) { + i__3 = ix; + temp = (d__1 = x[i__3].r, abs(d__1)); + if (scale < temp) { +/* Computing 2nd power */ + d__1 = scale / temp; + ssq = ssq * (d__1 * d__1) + 1.; + scale = temp; + } else { +/* Computing 2nd power */ + d__1 = temp / scale; + ssq += d__1 * d__1; + } + } + if (d_imag(&x[ix]) != 0.) { + temp = (d__1 = d_imag(&x[ix]), abs(d__1)); + if (scale < temp) { +/* Computing 2nd power */ + d__1 = scale / temp; + ssq = ssq * (d__1 * d__1) + 1.; + scale = temp; + } else { +/* Computing 2nd power */ + d__1 = temp / scale; + ssq += d__1 * d__1; + } + } +/* L10: */ + } + norm = scale * sqrt(ssq); + } + + ret_val = norm; + return ret_val; + +/* End of DZNRM2. */ + +} /* dznrm2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dasum.f b/lib/linalg/fortran/dasum.f similarity index 100% rename from lib/linalg/dasum.f rename to lib/linalg/fortran/dasum.f diff --git a/lib/linalg/daxpy.f b/lib/linalg/fortran/daxpy.f similarity index 100% rename from lib/linalg/daxpy.f rename to lib/linalg/fortran/daxpy.f diff --git a/lib/linalg/dbdsqr.f b/lib/linalg/fortran/dbdsqr.f similarity index 100% rename from lib/linalg/dbdsqr.f rename to lib/linalg/fortran/dbdsqr.f diff --git a/lib/linalg/dcabs1.f b/lib/linalg/fortran/dcabs1.f similarity index 100% rename from lib/linalg/dcabs1.f rename to lib/linalg/fortran/dcabs1.f diff --git a/lib/linalg/dcopy.f b/lib/linalg/fortran/dcopy.f similarity index 100% rename from lib/linalg/dcopy.f rename to lib/linalg/fortran/dcopy.f diff --git a/lib/linalg/ddot.f b/lib/linalg/fortran/ddot.f similarity index 100% rename from lib/linalg/ddot.f rename to lib/linalg/fortran/ddot.f diff --git a/lib/linalg/dgebd2.f b/lib/linalg/fortran/dgebd2.f similarity index 100% rename from lib/linalg/dgebd2.f rename to lib/linalg/fortran/dgebd2.f diff --git a/lib/linalg/dgebrd.f b/lib/linalg/fortran/dgebrd.f similarity index 100% rename from lib/linalg/dgebrd.f rename to lib/linalg/fortran/dgebrd.f diff --git a/lib/linalg/dgecon.f b/lib/linalg/fortran/dgecon.f similarity index 100% rename from lib/linalg/dgecon.f rename to lib/linalg/fortran/dgecon.f diff --git a/lib/linalg/dgelq2.f b/lib/linalg/fortran/dgelq2.f similarity index 100% rename from lib/linalg/dgelq2.f rename to lib/linalg/fortran/dgelq2.f diff --git a/lib/linalg/dgelqf.f b/lib/linalg/fortran/dgelqf.f similarity index 100% rename from lib/linalg/dgelqf.f rename to lib/linalg/fortran/dgelqf.f diff --git a/lib/linalg/dgelsd.f b/lib/linalg/fortran/dgelsd.f similarity index 100% rename from lib/linalg/dgelsd.f rename to lib/linalg/fortran/dgelsd.f diff --git a/lib/linalg/dgelss.f b/lib/linalg/fortran/dgelss.f similarity index 100% rename from lib/linalg/dgelss.f rename to lib/linalg/fortran/dgelss.f diff --git a/lib/linalg/dgemm.f b/lib/linalg/fortran/dgemm.f similarity index 100% rename from lib/linalg/dgemm.f rename to lib/linalg/fortran/dgemm.f diff --git a/lib/linalg/dgemv.f b/lib/linalg/fortran/dgemv.f similarity index 100% rename from lib/linalg/dgemv.f rename to lib/linalg/fortran/dgemv.f diff --git a/lib/linalg/dgeqr2.f b/lib/linalg/fortran/dgeqr2.f similarity index 100% rename from lib/linalg/dgeqr2.f rename to lib/linalg/fortran/dgeqr2.f diff --git a/lib/linalg/dgeqrf.f b/lib/linalg/fortran/dgeqrf.f similarity index 100% rename from lib/linalg/dgeqrf.f rename to lib/linalg/fortran/dgeqrf.f diff --git a/lib/linalg/dger.f b/lib/linalg/fortran/dger.f similarity index 100% rename from lib/linalg/dger.f rename to lib/linalg/fortran/dger.f diff --git a/lib/linalg/dgesv.f b/lib/linalg/fortran/dgesv.f similarity index 100% rename from lib/linalg/dgesv.f rename to lib/linalg/fortran/dgesv.f diff --git a/lib/linalg/dgesvd.f b/lib/linalg/fortran/dgesvd.f similarity index 100% rename from lib/linalg/dgesvd.f rename to lib/linalg/fortran/dgesvd.f diff --git a/lib/linalg/dgetf2.f b/lib/linalg/fortran/dgetf2.f similarity index 100% rename from lib/linalg/dgetf2.f rename to lib/linalg/fortran/dgetf2.f diff --git a/lib/linalg/dgetrf.f b/lib/linalg/fortran/dgetrf.f similarity index 100% rename from lib/linalg/dgetrf.f rename to lib/linalg/fortran/dgetrf.f diff --git a/lib/linalg/dgetrf2.f b/lib/linalg/fortran/dgetrf2.f similarity index 100% rename from lib/linalg/dgetrf2.f rename to lib/linalg/fortran/dgetrf2.f diff --git a/lib/linalg/dgetri.f b/lib/linalg/fortran/dgetri.f similarity index 100% rename from lib/linalg/dgetri.f rename to lib/linalg/fortran/dgetri.f diff --git a/lib/linalg/dgetrs.f b/lib/linalg/fortran/dgetrs.f similarity index 100% rename from lib/linalg/dgetrs.f rename to lib/linalg/fortran/dgetrs.f diff --git a/lib/linalg/disnan.f b/lib/linalg/fortran/disnan.f similarity index 100% rename from lib/linalg/disnan.f rename to lib/linalg/fortran/disnan.f diff --git a/lib/linalg/dlabad.f b/lib/linalg/fortran/dlabad.f similarity index 100% rename from lib/linalg/dlabad.f rename to lib/linalg/fortran/dlabad.f diff --git a/lib/linalg/dlabrd.f b/lib/linalg/fortran/dlabrd.f similarity index 100% rename from lib/linalg/dlabrd.f rename to lib/linalg/fortran/dlabrd.f diff --git a/lib/linalg/dlacn2.f b/lib/linalg/fortran/dlacn2.f similarity index 100% rename from lib/linalg/dlacn2.f rename to lib/linalg/fortran/dlacn2.f diff --git a/lib/linalg/dlacpy.f b/lib/linalg/fortran/dlacpy.f similarity index 100% rename from lib/linalg/dlacpy.f rename to lib/linalg/fortran/dlacpy.f diff --git a/lib/linalg/dladiv.f b/lib/linalg/fortran/dladiv.f similarity index 100% rename from lib/linalg/dladiv.f rename to lib/linalg/fortran/dladiv.f diff --git a/lib/linalg/dlae2.f b/lib/linalg/fortran/dlae2.f similarity index 100% rename from lib/linalg/dlae2.f rename to lib/linalg/fortran/dlae2.f diff --git a/lib/linalg/dlaed0.f b/lib/linalg/fortran/dlaed0.f similarity index 100% rename from lib/linalg/dlaed0.f rename to lib/linalg/fortran/dlaed0.f diff --git a/lib/linalg/dlaed1.f b/lib/linalg/fortran/dlaed1.f similarity index 100% rename from lib/linalg/dlaed1.f rename to lib/linalg/fortran/dlaed1.f diff --git a/lib/linalg/dlaed2.f b/lib/linalg/fortran/dlaed2.f similarity index 100% rename from lib/linalg/dlaed2.f rename to lib/linalg/fortran/dlaed2.f diff --git a/lib/linalg/dlaed3.f b/lib/linalg/fortran/dlaed3.f similarity index 100% rename from lib/linalg/dlaed3.f rename to lib/linalg/fortran/dlaed3.f diff --git a/lib/linalg/dlaed4.f b/lib/linalg/fortran/dlaed4.f similarity index 100% rename from lib/linalg/dlaed4.f rename to lib/linalg/fortran/dlaed4.f diff --git a/lib/linalg/dlaed5.f b/lib/linalg/fortran/dlaed5.f similarity index 100% rename from lib/linalg/dlaed5.f rename to lib/linalg/fortran/dlaed5.f diff --git a/lib/linalg/dlaed6.f b/lib/linalg/fortran/dlaed6.f similarity index 100% rename from lib/linalg/dlaed6.f rename to lib/linalg/fortran/dlaed6.f diff --git a/lib/linalg/dlaed7.f b/lib/linalg/fortran/dlaed7.f similarity index 100% rename from lib/linalg/dlaed7.f rename to lib/linalg/fortran/dlaed7.f diff --git a/lib/linalg/dlaed8.f b/lib/linalg/fortran/dlaed8.f similarity index 100% rename from lib/linalg/dlaed8.f rename to lib/linalg/fortran/dlaed8.f diff --git a/lib/linalg/dlaed9.f b/lib/linalg/fortran/dlaed9.f similarity index 100% rename from lib/linalg/dlaed9.f rename to lib/linalg/fortran/dlaed9.f diff --git a/lib/linalg/dlaeda.f b/lib/linalg/fortran/dlaeda.f similarity index 100% rename from lib/linalg/dlaeda.f rename to lib/linalg/fortran/dlaeda.f diff --git a/lib/linalg/dlaev2.f b/lib/linalg/fortran/dlaev2.f similarity index 100% rename from lib/linalg/dlaev2.f rename to lib/linalg/fortran/dlaev2.f diff --git a/lib/linalg/dlaisnan.f b/lib/linalg/fortran/dlaisnan.f similarity index 100% rename from lib/linalg/dlaisnan.f rename to lib/linalg/fortran/dlaisnan.f diff --git a/lib/linalg/dlals0.f b/lib/linalg/fortran/dlals0.f similarity index 100% rename from lib/linalg/dlals0.f rename to lib/linalg/fortran/dlals0.f diff --git a/lib/linalg/dlalsa.f b/lib/linalg/fortran/dlalsa.f similarity index 100% rename from lib/linalg/dlalsa.f rename to lib/linalg/fortran/dlalsa.f diff --git a/lib/linalg/dlalsd.f b/lib/linalg/fortran/dlalsd.f similarity index 100% rename from lib/linalg/dlalsd.f rename to lib/linalg/fortran/dlalsd.f diff --git a/lib/linalg/dlamch.f b/lib/linalg/fortran/dlamch.f similarity index 100% rename from lib/linalg/dlamch.f rename to lib/linalg/fortran/dlamch.f diff --git a/lib/linalg/dlamrg.f b/lib/linalg/fortran/dlamrg.f similarity index 100% rename from lib/linalg/dlamrg.f rename to lib/linalg/fortran/dlamrg.f diff --git a/lib/linalg/dlange.f b/lib/linalg/fortran/dlange.f similarity index 100% rename from lib/linalg/dlange.f rename to lib/linalg/fortran/dlange.f diff --git a/lib/linalg/dlanst.f b/lib/linalg/fortran/dlanst.f similarity index 100% rename from lib/linalg/dlanst.f rename to lib/linalg/fortran/dlanst.f diff --git a/lib/linalg/dlansy.f b/lib/linalg/fortran/dlansy.f similarity index 100% rename from lib/linalg/dlansy.f rename to lib/linalg/fortran/dlansy.f diff --git a/lib/linalg/dlapy2.f b/lib/linalg/fortran/dlapy2.f similarity index 100% rename from lib/linalg/dlapy2.f rename to lib/linalg/fortran/dlapy2.f diff --git a/lib/linalg/dlapy3.f b/lib/linalg/fortran/dlapy3.f similarity index 100% rename from lib/linalg/dlapy3.f rename to lib/linalg/fortran/dlapy3.f diff --git a/lib/linalg/dlarf.f b/lib/linalg/fortran/dlarf.f similarity index 100% rename from lib/linalg/dlarf.f rename to lib/linalg/fortran/dlarf.f diff --git a/lib/linalg/dlarfb.f b/lib/linalg/fortran/dlarfb.f similarity index 100% rename from lib/linalg/dlarfb.f rename to lib/linalg/fortran/dlarfb.f diff --git a/lib/linalg/dlarfg.f b/lib/linalg/fortran/dlarfg.f similarity index 100% rename from lib/linalg/dlarfg.f rename to lib/linalg/fortran/dlarfg.f diff --git a/lib/linalg/dlarft.f b/lib/linalg/fortran/dlarft.f similarity index 100% rename from lib/linalg/dlarft.f rename to lib/linalg/fortran/dlarft.f diff --git a/lib/linalg/dlartg.f b/lib/linalg/fortran/dlartg.f similarity index 100% rename from lib/linalg/dlartg.f rename to lib/linalg/fortran/dlartg.f diff --git a/lib/linalg/dlas2.f b/lib/linalg/fortran/dlas2.f similarity index 100% rename from lib/linalg/dlas2.f rename to lib/linalg/fortran/dlas2.f diff --git a/lib/linalg/dlascl.f b/lib/linalg/fortran/dlascl.f similarity index 100% rename from lib/linalg/dlascl.f rename to lib/linalg/fortran/dlascl.f diff --git a/lib/linalg/dlasd4.f b/lib/linalg/fortran/dlasd4.f similarity index 100% rename from lib/linalg/dlasd4.f rename to lib/linalg/fortran/dlasd4.f diff --git a/lib/linalg/dlasd5.f b/lib/linalg/fortran/dlasd5.f similarity index 100% rename from lib/linalg/dlasd5.f rename to lib/linalg/fortran/dlasd5.f diff --git a/lib/linalg/dlasd6.f b/lib/linalg/fortran/dlasd6.f similarity index 100% rename from lib/linalg/dlasd6.f rename to lib/linalg/fortran/dlasd6.f diff --git a/lib/linalg/dlasd7.f b/lib/linalg/fortran/dlasd7.f similarity index 100% rename from lib/linalg/dlasd7.f rename to lib/linalg/fortran/dlasd7.f diff --git a/lib/linalg/dlasd8.f b/lib/linalg/fortran/dlasd8.f similarity index 100% rename from lib/linalg/dlasd8.f rename to lib/linalg/fortran/dlasd8.f diff --git a/lib/linalg/dlasda.f b/lib/linalg/fortran/dlasda.f similarity index 100% rename from lib/linalg/dlasda.f rename to lib/linalg/fortran/dlasda.f diff --git a/lib/linalg/dlasdq.f b/lib/linalg/fortran/dlasdq.f similarity index 100% rename from lib/linalg/dlasdq.f rename to lib/linalg/fortran/dlasdq.f diff --git a/lib/linalg/dlasdt.f b/lib/linalg/fortran/dlasdt.f similarity index 100% rename from lib/linalg/dlasdt.f rename to lib/linalg/fortran/dlasdt.f diff --git a/lib/linalg/dlaset.f b/lib/linalg/fortran/dlaset.f similarity index 100% rename from lib/linalg/dlaset.f rename to lib/linalg/fortran/dlaset.f diff --git a/lib/linalg/dlasq1.f b/lib/linalg/fortran/dlasq1.f similarity index 100% rename from lib/linalg/dlasq1.f rename to lib/linalg/fortran/dlasq1.f diff --git a/lib/linalg/dlasq2.f b/lib/linalg/fortran/dlasq2.f similarity index 100% rename from lib/linalg/dlasq2.f rename to lib/linalg/fortran/dlasq2.f diff --git a/lib/linalg/dlasq3.f b/lib/linalg/fortran/dlasq3.f similarity index 100% rename from lib/linalg/dlasq3.f rename to lib/linalg/fortran/dlasq3.f diff --git a/lib/linalg/dlasq4.f b/lib/linalg/fortran/dlasq4.f similarity index 100% rename from lib/linalg/dlasq4.f rename to lib/linalg/fortran/dlasq4.f diff --git a/lib/linalg/dlasq5.f b/lib/linalg/fortran/dlasq5.f similarity index 100% rename from lib/linalg/dlasq5.f rename to lib/linalg/fortran/dlasq5.f diff --git a/lib/linalg/dlasq6.f b/lib/linalg/fortran/dlasq6.f similarity index 100% rename from lib/linalg/dlasq6.f rename to lib/linalg/fortran/dlasq6.f diff --git a/lib/linalg/dlasr.f b/lib/linalg/fortran/dlasr.f similarity index 100% rename from lib/linalg/dlasr.f rename to lib/linalg/fortran/dlasr.f diff --git a/lib/linalg/dlasrt.f b/lib/linalg/fortran/dlasrt.f similarity index 100% rename from lib/linalg/dlasrt.f rename to lib/linalg/fortran/dlasrt.f diff --git a/lib/linalg/dlassq.f b/lib/linalg/fortran/dlassq.f similarity index 100% rename from lib/linalg/dlassq.f rename to lib/linalg/fortran/dlassq.f diff --git a/lib/linalg/dlasv2.f b/lib/linalg/fortran/dlasv2.f similarity index 100% rename from lib/linalg/dlasv2.f rename to lib/linalg/fortran/dlasv2.f diff --git a/lib/linalg/dlaswp.f b/lib/linalg/fortran/dlaswp.f similarity index 100% rename from lib/linalg/dlaswp.f rename to lib/linalg/fortran/dlaswp.f diff --git a/lib/linalg/dlatrd.f b/lib/linalg/fortran/dlatrd.f similarity index 100% rename from lib/linalg/dlatrd.f rename to lib/linalg/fortran/dlatrd.f diff --git a/lib/linalg/dlatrs.f b/lib/linalg/fortran/dlatrs.f similarity index 100% rename from lib/linalg/dlatrs.f rename to lib/linalg/fortran/dlatrs.f diff --git a/lib/linalg/dnrm2.f b/lib/linalg/fortran/dnrm2.f similarity index 100% rename from lib/linalg/dnrm2.f rename to lib/linalg/fortran/dnrm2.f diff --git a/lib/linalg/dorg2l.f b/lib/linalg/fortran/dorg2l.f similarity index 100% rename from lib/linalg/dorg2l.f rename to lib/linalg/fortran/dorg2l.f diff --git a/lib/linalg/dorg2r.f b/lib/linalg/fortran/dorg2r.f similarity index 100% rename from lib/linalg/dorg2r.f rename to lib/linalg/fortran/dorg2r.f diff --git a/lib/linalg/dorgbr.f b/lib/linalg/fortran/dorgbr.f similarity index 100% rename from lib/linalg/dorgbr.f rename to lib/linalg/fortran/dorgbr.f diff --git a/lib/linalg/dorgl2.f b/lib/linalg/fortran/dorgl2.f similarity index 100% rename from lib/linalg/dorgl2.f rename to lib/linalg/fortran/dorgl2.f diff --git a/lib/linalg/dorglq.f b/lib/linalg/fortran/dorglq.f similarity index 100% rename from lib/linalg/dorglq.f rename to lib/linalg/fortran/dorglq.f diff --git a/lib/linalg/dorgql.f b/lib/linalg/fortran/dorgql.f similarity index 100% rename from lib/linalg/dorgql.f rename to lib/linalg/fortran/dorgql.f diff --git a/lib/linalg/dorgqr.f b/lib/linalg/fortran/dorgqr.f similarity index 100% rename from lib/linalg/dorgqr.f rename to lib/linalg/fortran/dorgqr.f diff --git a/lib/linalg/dorgtr.f b/lib/linalg/fortran/dorgtr.f similarity index 100% rename from lib/linalg/dorgtr.f rename to lib/linalg/fortran/dorgtr.f diff --git a/lib/linalg/dorm2l.f b/lib/linalg/fortran/dorm2l.f similarity index 100% rename from lib/linalg/dorm2l.f rename to lib/linalg/fortran/dorm2l.f diff --git a/lib/linalg/dorm2r.f b/lib/linalg/fortran/dorm2r.f similarity index 100% rename from lib/linalg/dorm2r.f rename to lib/linalg/fortran/dorm2r.f diff --git a/lib/linalg/dormbr.f b/lib/linalg/fortran/dormbr.f similarity index 100% rename from lib/linalg/dormbr.f rename to lib/linalg/fortran/dormbr.f diff --git a/lib/linalg/dorml2.f b/lib/linalg/fortran/dorml2.f similarity index 100% rename from lib/linalg/dorml2.f rename to lib/linalg/fortran/dorml2.f diff --git a/lib/linalg/dormlq.f b/lib/linalg/fortran/dormlq.f similarity index 100% rename from lib/linalg/dormlq.f rename to lib/linalg/fortran/dormlq.f diff --git a/lib/linalg/dormql.f b/lib/linalg/fortran/dormql.f similarity index 100% rename from lib/linalg/dormql.f rename to lib/linalg/fortran/dormql.f diff --git a/lib/linalg/dormqr.f b/lib/linalg/fortran/dormqr.f similarity index 100% rename from lib/linalg/dormqr.f rename to lib/linalg/fortran/dormqr.f diff --git a/lib/linalg/dormtr.f b/lib/linalg/fortran/dormtr.f similarity index 100% rename from lib/linalg/dormtr.f rename to lib/linalg/fortran/dormtr.f diff --git a/lib/linalg/dposv.f b/lib/linalg/fortran/dposv.f similarity index 100% rename from lib/linalg/dposv.f rename to lib/linalg/fortran/dposv.f diff --git a/lib/linalg/dpotf2.f b/lib/linalg/fortran/dpotf2.f similarity index 100% rename from lib/linalg/dpotf2.f rename to lib/linalg/fortran/dpotf2.f diff --git a/lib/linalg/dpotrf.f b/lib/linalg/fortran/dpotrf.f similarity index 100% rename from lib/linalg/dpotrf.f rename to lib/linalg/fortran/dpotrf.f diff --git a/lib/linalg/dpotrf2.f b/lib/linalg/fortran/dpotrf2.f similarity index 100% rename from lib/linalg/dpotrf2.f rename to lib/linalg/fortran/dpotrf2.f diff --git a/lib/linalg/dpotrs.f b/lib/linalg/fortran/dpotrs.f similarity index 100% rename from lib/linalg/dpotrs.f rename to lib/linalg/fortran/dpotrs.f diff --git a/lib/linalg/drot.f b/lib/linalg/fortran/drot.f similarity index 100% rename from lib/linalg/drot.f rename to lib/linalg/fortran/drot.f diff --git a/lib/linalg/drscl.f b/lib/linalg/fortran/drscl.f similarity index 100% rename from lib/linalg/drscl.f rename to lib/linalg/fortran/drscl.f diff --git a/lib/linalg/dscal.f b/lib/linalg/fortran/dscal.f similarity index 100% rename from lib/linalg/dscal.f rename to lib/linalg/fortran/dscal.f diff --git a/lib/linalg/dstedc.f b/lib/linalg/fortran/dstedc.f similarity index 100% rename from lib/linalg/dstedc.f rename to lib/linalg/fortran/dstedc.f diff --git a/lib/linalg/dsteqr.f b/lib/linalg/fortran/dsteqr.f similarity index 100% rename from lib/linalg/dsteqr.f rename to lib/linalg/fortran/dsteqr.f diff --git a/lib/linalg/dsterf.f b/lib/linalg/fortran/dsterf.f similarity index 100% rename from lib/linalg/dsterf.f rename to lib/linalg/fortran/dsterf.f diff --git a/lib/linalg/dswap.f b/lib/linalg/fortran/dswap.f similarity index 100% rename from lib/linalg/dswap.f rename to lib/linalg/fortran/dswap.f diff --git a/lib/linalg/dsyev.f b/lib/linalg/fortran/dsyev.f similarity index 100% rename from lib/linalg/dsyev.f rename to lib/linalg/fortran/dsyev.f diff --git a/lib/linalg/dsyevd.f b/lib/linalg/fortran/dsyevd.f similarity index 100% rename from lib/linalg/dsyevd.f rename to lib/linalg/fortran/dsyevd.f diff --git a/lib/linalg/dsygs2.f b/lib/linalg/fortran/dsygs2.f similarity index 100% rename from lib/linalg/dsygs2.f rename to lib/linalg/fortran/dsygs2.f diff --git a/lib/linalg/dsygst.f b/lib/linalg/fortran/dsygst.f similarity index 100% rename from lib/linalg/dsygst.f rename to lib/linalg/fortran/dsygst.f diff --git a/lib/linalg/dsygv.f b/lib/linalg/fortran/dsygv.f similarity index 100% rename from lib/linalg/dsygv.f rename to lib/linalg/fortran/dsygv.f diff --git a/lib/linalg/dsygvd.f b/lib/linalg/fortran/dsygvd.f similarity index 100% rename from lib/linalg/dsygvd.f rename to lib/linalg/fortran/dsygvd.f diff --git a/lib/linalg/dsymm.f b/lib/linalg/fortran/dsymm.f similarity index 100% rename from lib/linalg/dsymm.f rename to lib/linalg/fortran/dsymm.f diff --git a/lib/linalg/dsymv.f b/lib/linalg/fortran/dsymv.f similarity index 100% rename from lib/linalg/dsymv.f rename to lib/linalg/fortran/dsymv.f diff --git a/lib/linalg/dsyr2.f b/lib/linalg/fortran/dsyr2.f similarity index 100% rename from lib/linalg/dsyr2.f rename to lib/linalg/fortran/dsyr2.f diff --git a/lib/linalg/dsyr2k.f b/lib/linalg/fortran/dsyr2k.f similarity index 100% rename from lib/linalg/dsyr2k.f rename to lib/linalg/fortran/dsyr2k.f diff --git a/lib/linalg/dsyrk.f b/lib/linalg/fortran/dsyrk.f similarity index 100% rename from lib/linalg/dsyrk.f rename to lib/linalg/fortran/dsyrk.f diff --git a/lib/linalg/dsytd2.f b/lib/linalg/fortran/dsytd2.f similarity index 100% rename from lib/linalg/dsytd2.f rename to lib/linalg/fortran/dsytd2.f diff --git a/lib/linalg/dsytrd.f b/lib/linalg/fortran/dsytrd.f similarity index 100% rename from lib/linalg/dsytrd.f rename to lib/linalg/fortran/dsytrd.f diff --git a/lib/linalg/dtrmm.f b/lib/linalg/fortran/dtrmm.f similarity index 100% rename from lib/linalg/dtrmm.f rename to lib/linalg/fortran/dtrmm.f diff --git a/lib/linalg/dtrmv.f b/lib/linalg/fortran/dtrmv.f similarity index 100% rename from lib/linalg/dtrmv.f rename to lib/linalg/fortran/dtrmv.f diff --git a/lib/linalg/dtrsm.f b/lib/linalg/fortran/dtrsm.f similarity index 100% rename from lib/linalg/dtrsm.f rename to lib/linalg/fortran/dtrsm.f diff --git a/lib/linalg/dtrsv.f b/lib/linalg/fortran/dtrsv.f similarity index 100% rename from lib/linalg/dtrsv.f rename to lib/linalg/fortran/dtrsv.f diff --git a/lib/linalg/dtrti2.f b/lib/linalg/fortran/dtrti2.f similarity index 100% rename from lib/linalg/dtrti2.f rename to lib/linalg/fortran/dtrti2.f diff --git a/lib/linalg/dtrtri.f b/lib/linalg/fortran/dtrtri.f similarity index 100% rename from lib/linalg/dtrtri.f rename to lib/linalg/fortran/dtrtri.f diff --git a/lib/linalg/dznrm2.f b/lib/linalg/fortran/dznrm2.f similarity index 100% rename from lib/linalg/dznrm2.f rename to lib/linalg/fortran/dznrm2.f diff --git a/lib/linalg/idamax.f b/lib/linalg/fortran/idamax.f similarity index 100% rename from lib/linalg/idamax.f rename to lib/linalg/fortran/idamax.f diff --git a/lib/linalg/ieeeck.f b/lib/linalg/fortran/ieeeck.f similarity index 100% rename from lib/linalg/ieeeck.f rename to lib/linalg/fortran/ieeeck.f diff --git a/lib/linalg/iladlc.f b/lib/linalg/fortran/iladlc.f similarity index 100% rename from lib/linalg/iladlc.f rename to lib/linalg/fortran/iladlc.f diff --git a/lib/linalg/iladlr.f b/lib/linalg/fortran/iladlr.f similarity index 100% rename from lib/linalg/iladlr.f rename to lib/linalg/fortran/iladlr.f diff --git a/lib/linalg/ilaenv.f b/lib/linalg/fortran/ilaenv.f similarity index 100% rename from lib/linalg/ilaenv.f rename to lib/linalg/fortran/ilaenv.f diff --git a/lib/linalg/ilazlc.f b/lib/linalg/fortran/ilazlc.f similarity index 100% rename from lib/linalg/ilazlc.f rename to lib/linalg/fortran/ilazlc.f diff --git a/lib/linalg/ilazlr.f b/lib/linalg/fortran/ilazlr.f similarity index 100% rename from lib/linalg/ilazlr.f rename to lib/linalg/fortran/ilazlr.f diff --git a/lib/linalg/iparmq.f b/lib/linalg/fortran/iparmq.f similarity index 100% rename from lib/linalg/iparmq.f rename to lib/linalg/fortran/iparmq.f diff --git a/lib/linalg/lsame.f b/lib/linalg/fortran/lsame.f similarity index 100% rename from lib/linalg/lsame.f rename to lib/linalg/fortran/lsame.f diff --git a/lib/linalg/xerbla.f b/lib/linalg/fortran/xerbla.f similarity index 100% rename from lib/linalg/xerbla.f rename to lib/linalg/fortran/xerbla.f diff --git a/lib/linalg/zaxpy.f b/lib/linalg/fortran/zaxpy.f similarity index 100% rename from lib/linalg/zaxpy.f rename to lib/linalg/fortran/zaxpy.f diff --git a/lib/linalg/zcopy.f b/lib/linalg/fortran/zcopy.f similarity index 100% rename from lib/linalg/zcopy.f rename to lib/linalg/fortran/zcopy.f diff --git a/lib/linalg/zdotc.f b/lib/linalg/fortran/zdotc.f similarity index 100% rename from lib/linalg/zdotc.f rename to lib/linalg/fortran/zdotc.f diff --git a/lib/linalg/zdrot.f b/lib/linalg/fortran/zdrot.f similarity index 100% rename from lib/linalg/zdrot.f rename to lib/linalg/fortran/zdrot.f diff --git a/lib/linalg/zdscal.f b/lib/linalg/fortran/zdscal.f similarity index 100% rename from lib/linalg/zdscal.f rename to lib/linalg/fortran/zdscal.f diff --git a/lib/linalg/zgemm.f b/lib/linalg/fortran/zgemm.f similarity index 100% rename from lib/linalg/zgemm.f rename to lib/linalg/fortran/zgemm.f diff --git a/lib/linalg/zgemv.f b/lib/linalg/fortran/zgemv.f similarity index 100% rename from lib/linalg/zgemv.f rename to lib/linalg/fortran/zgemv.f diff --git a/lib/linalg/zgerc.f b/lib/linalg/fortran/zgerc.f similarity index 100% rename from lib/linalg/zgerc.f rename to lib/linalg/fortran/zgerc.f diff --git a/lib/linalg/zheev.f b/lib/linalg/fortran/zheev.f similarity index 100% rename from lib/linalg/zheev.f rename to lib/linalg/fortran/zheev.f diff --git a/lib/linalg/zheevd.f b/lib/linalg/fortran/zheevd.f similarity index 100% rename from lib/linalg/zheevd.f rename to lib/linalg/fortran/zheevd.f diff --git a/lib/linalg/zhemv.f b/lib/linalg/fortran/zhemv.f similarity index 100% rename from lib/linalg/zhemv.f rename to lib/linalg/fortran/zhemv.f diff --git a/lib/linalg/zher2.f b/lib/linalg/fortran/zher2.f similarity index 100% rename from lib/linalg/zher2.f rename to lib/linalg/fortran/zher2.f diff --git a/lib/linalg/zher2k.f b/lib/linalg/fortran/zher2k.f similarity index 100% rename from lib/linalg/zher2k.f rename to lib/linalg/fortran/zher2k.f diff --git a/lib/linalg/zhetd2.f b/lib/linalg/fortran/zhetd2.f similarity index 100% rename from lib/linalg/zhetd2.f rename to lib/linalg/fortran/zhetd2.f diff --git a/lib/linalg/zhetrd.f b/lib/linalg/fortran/zhetrd.f similarity index 100% rename from lib/linalg/zhetrd.f rename to lib/linalg/fortran/zhetrd.f diff --git a/lib/linalg/zhpr.f b/lib/linalg/fortran/zhpr.f similarity index 100% rename from lib/linalg/zhpr.f rename to lib/linalg/fortran/zhpr.f diff --git a/lib/linalg/zlacgv.f b/lib/linalg/fortran/zlacgv.f similarity index 100% rename from lib/linalg/zlacgv.f rename to lib/linalg/fortran/zlacgv.f diff --git a/lib/linalg/zlacpy.f b/lib/linalg/fortran/zlacpy.f similarity index 100% rename from lib/linalg/zlacpy.f rename to lib/linalg/fortran/zlacpy.f diff --git a/lib/linalg/zlacrm.f b/lib/linalg/fortran/zlacrm.f similarity index 100% rename from lib/linalg/zlacrm.f rename to lib/linalg/fortran/zlacrm.f diff --git a/lib/linalg/zladiv.f b/lib/linalg/fortran/zladiv.f similarity index 100% rename from lib/linalg/zladiv.f rename to lib/linalg/fortran/zladiv.f diff --git a/lib/linalg/zlaed0.f b/lib/linalg/fortran/zlaed0.f similarity index 100% rename from lib/linalg/zlaed0.f rename to lib/linalg/fortran/zlaed0.f diff --git a/lib/linalg/zlaed7.f b/lib/linalg/fortran/zlaed7.f similarity index 100% rename from lib/linalg/zlaed7.f rename to lib/linalg/fortran/zlaed7.f diff --git a/lib/linalg/zlaed8.f b/lib/linalg/fortran/zlaed8.f similarity index 100% rename from lib/linalg/zlaed8.f rename to lib/linalg/fortran/zlaed8.f diff --git a/lib/linalg/zlanhe.f b/lib/linalg/fortran/zlanhe.f similarity index 100% rename from lib/linalg/zlanhe.f rename to lib/linalg/fortran/zlanhe.f diff --git a/lib/linalg/zlarf.f b/lib/linalg/fortran/zlarf.f similarity index 100% rename from lib/linalg/zlarf.f rename to lib/linalg/fortran/zlarf.f diff --git a/lib/linalg/zlarfb.f b/lib/linalg/fortran/zlarfb.f similarity index 100% rename from lib/linalg/zlarfb.f rename to lib/linalg/fortran/zlarfb.f diff --git a/lib/linalg/zlarfg.f b/lib/linalg/fortran/zlarfg.f similarity index 100% rename from lib/linalg/zlarfg.f rename to lib/linalg/fortran/zlarfg.f diff --git a/lib/linalg/zlarft.f b/lib/linalg/fortran/zlarft.f similarity index 100% rename from lib/linalg/zlarft.f rename to lib/linalg/fortran/zlarft.f diff --git a/lib/linalg/zlascl.f b/lib/linalg/fortran/zlascl.f similarity index 100% rename from lib/linalg/zlascl.f rename to lib/linalg/fortran/zlascl.f diff --git a/lib/linalg/zlaset.f b/lib/linalg/fortran/zlaset.f similarity index 100% rename from lib/linalg/zlaset.f rename to lib/linalg/fortran/zlaset.f diff --git a/lib/linalg/zlasr.f b/lib/linalg/fortran/zlasr.f similarity index 100% rename from lib/linalg/zlasr.f rename to lib/linalg/fortran/zlasr.f diff --git a/lib/linalg/zlassq.f b/lib/linalg/fortran/zlassq.f similarity index 100% rename from lib/linalg/zlassq.f rename to lib/linalg/fortran/zlassq.f diff --git a/lib/linalg/zlatrd.f b/lib/linalg/fortran/zlatrd.f similarity index 100% rename from lib/linalg/zlatrd.f rename to lib/linalg/fortran/zlatrd.f diff --git a/lib/linalg/zpptrf.f b/lib/linalg/fortran/zpptrf.f similarity index 100% rename from lib/linalg/zpptrf.f rename to lib/linalg/fortran/zpptrf.f diff --git a/lib/linalg/zpptri.f b/lib/linalg/fortran/zpptri.f similarity index 100% rename from lib/linalg/zpptri.f rename to lib/linalg/fortran/zpptri.f diff --git a/lib/linalg/zscal.f b/lib/linalg/fortran/zscal.f similarity index 100% rename from lib/linalg/zscal.f rename to lib/linalg/fortran/zscal.f diff --git a/lib/linalg/zstedc.f b/lib/linalg/fortran/zstedc.f similarity index 100% rename from lib/linalg/zstedc.f rename to lib/linalg/fortran/zstedc.f diff --git a/lib/linalg/zsteqr.f b/lib/linalg/fortran/zsteqr.f similarity index 100% rename from lib/linalg/zsteqr.f rename to lib/linalg/fortran/zsteqr.f diff --git a/lib/linalg/zswap.f b/lib/linalg/fortran/zswap.f similarity index 100% rename from lib/linalg/zswap.f rename to lib/linalg/fortran/zswap.f diff --git a/lib/linalg/ztpmv.f b/lib/linalg/fortran/ztpmv.f similarity index 100% rename from lib/linalg/ztpmv.f rename to lib/linalg/fortran/ztpmv.f diff --git a/lib/linalg/ztpsv.f b/lib/linalg/fortran/ztpsv.f similarity index 100% rename from lib/linalg/ztpsv.f rename to lib/linalg/fortran/ztpsv.f diff --git a/lib/linalg/ztptri.f b/lib/linalg/fortran/ztptri.f similarity index 100% rename from lib/linalg/ztptri.f rename to lib/linalg/fortran/ztptri.f diff --git a/lib/linalg/ztrmm.f b/lib/linalg/fortran/ztrmm.f similarity index 100% rename from lib/linalg/ztrmm.f rename to lib/linalg/fortran/ztrmm.f diff --git a/lib/linalg/ztrmv.f b/lib/linalg/fortran/ztrmv.f similarity index 100% rename from lib/linalg/ztrmv.f rename to lib/linalg/fortran/ztrmv.f diff --git a/lib/linalg/zung2l.f b/lib/linalg/fortran/zung2l.f similarity index 100% rename from lib/linalg/zung2l.f rename to lib/linalg/fortran/zung2l.f diff --git a/lib/linalg/zung2r.f b/lib/linalg/fortran/zung2r.f similarity index 100% rename from lib/linalg/zung2r.f rename to lib/linalg/fortran/zung2r.f diff --git a/lib/linalg/zungl2.f b/lib/linalg/fortran/zungl2.f similarity index 100% rename from lib/linalg/zungl2.f rename to lib/linalg/fortran/zungl2.f diff --git a/lib/linalg/zungql.f b/lib/linalg/fortran/zungql.f similarity index 100% rename from lib/linalg/zungql.f rename to lib/linalg/fortran/zungql.f diff --git a/lib/linalg/zungqr.f b/lib/linalg/fortran/zungqr.f similarity index 100% rename from lib/linalg/zungqr.f rename to lib/linalg/fortran/zungqr.f diff --git a/lib/linalg/zungtr.f b/lib/linalg/fortran/zungtr.f similarity index 100% rename from lib/linalg/zungtr.f rename to lib/linalg/fortran/zungtr.f diff --git a/lib/linalg/zunm2l.f b/lib/linalg/fortran/zunm2l.f similarity index 100% rename from lib/linalg/zunm2l.f rename to lib/linalg/fortran/zunm2l.f diff --git a/lib/linalg/zunm2r.f b/lib/linalg/fortran/zunm2r.f similarity index 100% rename from lib/linalg/zunm2r.f rename to lib/linalg/fortran/zunm2r.f diff --git a/lib/linalg/zunmql.f b/lib/linalg/fortran/zunmql.f similarity index 100% rename from lib/linalg/zunmql.f rename to lib/linalg/fortran/zunmql.f diff --git a/lib/linalg/zunmqr.f b/lib/linalg/fortran/zunmqr.f similarity index 100% rename from lib/linalg/zunmqr.f rename to lib/linalg/fortran/zunmqr.f diff --git a/lib/linalg/zunmtr.f b/lib/linalg/fortran/zunmtr.f similarity index 100% rename from lib/linalg/zunmtr.f rename to lib/linalg/fortran/zunmtr.f diff --git a/lib/linalg/idamax.cpp b/lib/linalg/idamax.cpp new file mode 100644 index 0000000000..edcf861435 --- /dev/null +++ b/lib/linalg/idamax.cpp @@ -0,0 +1,161 @@ +/* fortran/idamax.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b IDAMAX */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* INTEGER FUNCTION IDAMAX(N,DX,INCX) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION DX(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > IDAMAX finds the index of the first element having maximum absolute value. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DX */ +/* > \verbatim */ +/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of DX */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup aux_blas */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, linpack, 3/11/78. */ +/* > modified 3/93 to return if incx .le. 0. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +integer idamax_(integer *n, doublereal *dx, integer *incx) +{ + /* System generated locals */ + integer ret_val, i__1; + doublereal d__1; + + /* Local variables */ + integer i__, ix; + doublereal dmax__; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + /* Parameter adjustments */ + --dx; + + /* Function Body */ + ret_val = 0; + if (*n < 1 || *incx <= 0) { + return ret_val; + } + ret_val = 1; + if (*n == 1) { + return ret_val; + } + if (*incx == 1) { + +/* code for increment equal to 1 */ + + dmax__ = abs(dx[1]); + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + if ((d__1 = dx[i__], abs(d__1)) > dmax__) { + ret_val = i__; + dmax__ = (d__1 = dx[i__], abs(d__1)); + } + } + } else { + +/* code for increment not equal to 1 */ + + ix = 1; + dmax__ = abs(dx[1]); + ix += *incx; + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + if ((d__1 = dx[ix], abs(d__1)) > dmax__) { + ret_val = i__; + dmax__ = (d__1 = dx[ix], abs(d__1)); + } + ix += *incx; + } + } + return ret_val; + +/* End of IDAMAX */ + +} /* idamax_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/ieeeck.cpp b/lib/linalg/ieeeck.cpp new file mode 100644 index 0000000000..16626acf9d --- /dev/null +++ b/lib/linalg/ieeeck.cpp @@ -0,0 +1,228 @@ +/* fortran/ieeeck.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b IEEECK */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download IEEECK + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER ISPEC */ +/* REAL ONE, ZERO */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > IEEECK is called from the ILAENV to verify that Infinity and */ +/* > possibly NaN arithmetic is safe (i.e. will not trap). */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ISPEC */ +/* > \verbatim */ +/* > ISPEC is INTEGER */ +/* > Specifies whether to test just for infinity arithmetic */ +/* > or whether to test for infinity and NaN arithmetic. */ +/* > = 0: Verify infinity arithmetic only. */ +/* > = 1: Verify infinity and NaN arithmetic. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ZERO */ +/* > \verbatim */ +/* > ZERO is REAL */ +/* > Must contain the value 0.0 */ +/* > This is passed to prevent the compiler from optimizing */ +/* > away this code. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ONE */ +/* > \verbatim */ +/* > ONE is REAL */ +/* > Must contain the value 1.0 */ +/* > This is passed to prevent the compiler from optimizing */ +/* > away this code. */ +/* > */ +/* > RETURN VALUE: INTEGER */ +/* > = 0: Arithmetic failed to produce the correct answers */ +/* > = 1: Arithmetic produced the correct answers */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +integer ieeeck_(integer *ispec, real *zero, real *one) +{ + /* System generated locals */ + integer ret_val; + + /* Local variables */ + real nan1, nan2, nan3, nan4, nan5, nan6, neginf, posinf, negzro, newzro; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Executable Statements .. */ + ret_val = 1; + + posinf = *one / *zero; + if (posinf <= *one) { + ret_val = 0; + return ret_val; + } + + neginf = -(*one) / *zero; + if (neginf >= *zero) { + ret_val = 0; + return ret_val; + } + + negzro = *one / (neginf + *one); + if (negzro != *zero) { + ret_val = 0; + return ret_val; + } + + neginf = *one / negzro; + if (neginf >= *zero) { + ret_val = 0; + return ret_val; + } + + newzro = negzro + *zero; + if (newzro != *zero) { + ret_val = 0; + return ret_val; + } + + posinf = *one / newzro; + if (posinf <= *one) { + ret_val = 0; + return ret_val; + } + + neginf *= posinf; + if (neginf >= *zero) { + ret_val = 0; + return ret_val; + } + + posinf *= posinf; + if (posinf <= *one) { + ret_val = 0; + return ret_val; + } + + + + +/* Return if we were only asked to check infinity arithmetic */ + + if (*ispec == 0) { + return ret_val; + } + + nan1 = posinf + neginf; + + nan2 = posinf / neginf; + + nan3 = posinf / posinf; + + nan4 = posinf * *zero; + + nan5 = neginf * negzro; + + nan6 = nan5 * *zero; + + if (nan1 == nan1) { + ret_val = 0; + return ret_val; + } + + if (nan2 == nan2) { + ret_val = 0; + return ret_val; + } + + if (nan3 == nan3) { + ret_val = 0; + return ret_val; + } + + if (nan4 == nan4) { + ret_val = 0; + return ret_val; + } + + if (nan5 == nan5) { + ret_val = 0; + return ret_val; + } + + if (nan6 == nan6) { + ret_val = 0; + return ret_val; + } + + return ret_val; +} /* ieeeck_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/iladlc.cpp b/lib/linalg/iladlc.cpp new file mode 100644 index 0000000000..21b05e970a --- /dev/null +++ b/lib/linalg/iladlc.cpp @@ -0,0 +1,150 @@ +/* fortran/iladlc.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ILADLC scans a matrix for its last non-zero column. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ILADLC + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* INTEGER FUNCTION ILADLC( M, N, A, LDA ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER M, N, LDA */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ILADLC scans A for its last non-zero column. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > The m by n matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +integer iladlc_(integer *m, integer *n, doublereal *a, integer *lda) +{ + /* System generated locals */ + integer a_dim1, a_offset, ret_val, i__1; + + /* Local variables */ + integer i__; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick test for the common case where one corner is non-zero. */ + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + if (*n == 0) { + ret_val = *n; + } else if (a[*n * a_dim1 + 1] != 0. || a[*m + *n * a_dim1] != 0.) { + ret_val = *n; + } else { +/* Now scan each column from the end, returning with the first non-zero. */ + for (ret_val = *n; ret_val >= 1; --ret_val) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + if (a[i__ + ret_val * a_dim1] != 0.) { + return ret_val; + } + } + } + } + return ret_val; +} /* iladlc_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/iladlr.cpp b/lib/linalg/iladlr.cpp new file mode 100644 index 0000000000..a301b66170 --- /dev/null +++ b/lib/linalg/iladlr.cpp @@ -0,0 +1,151 @@ +/* fortran/iladlr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ILADLR scans a matrix for its last non-zero row. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ILADLR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* INTEGER FUNCTION ILADLR( M, N, A, LDA ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER M, N, LDA */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ILADLR scans A for its last non-zero row. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ +/* > The m by n matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* ===================================================================== */ +integer iladlr_(integer *m, integer *n, doublereal *a, integer *lda) +{ + /* System generated locals */ + integer a_dim1, a_offset, ret_val, i__1; + + /* Local variables */ + integer i__, j; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick test for the common case where one corner is non-zero. */ + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + if (*m == 0) { + ret_val = *m; + } else if (a[*m + a_dim1] != 0. || a[*m + *n * a_dim1] != 0.) { + ret_val = *m; + } else { +/* Scan up each column tracking the last zero row seen. */ + ret_val = 0; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__ = *m; + while(a[max(i__,1) + j * a_dim1] == 0. && i__ >= 1) { + --i__; + } + ret_val = max(ret_val,i__); + } + } + return ret_val; +} /* iladlr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/ilaenv.cpp b/lib/linalg/ilaenv.cpp new file mode 100644 index 0000000000..0e9a051222 --- /dev/null +++ b/lib/linalg/ilaenv.cpp @@ -0,0 +1,845 @@ +/* fortran/ilaenv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static real c_b176 = (float)0.; +static real c_b177 = (float)1.; +static integer c__0 = 0; + +/* > \brief \b ILAENV */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ILAENV + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER*( * ) NAME, OPTS */ +/* INTEGER ISPEC, N1, N2, N3, N4 */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ILAENV is called from the LAPACK routines to choose problem-dependent */ +/* > parameters for the local environment. See ISPEC for a description of */ +/* > the parameters. */ +/* > */ +/* > ILAENV returns an INTEGER */ +/* > if ILAENV >= 0: ILAENV returns the value of the parameter specified by ISPEC */ +/* > if ILAENV < 0: if ILAENV = -k, the k-th argument had an illegal value. */ +/* > */ +/* > This version provides a set of parameters which should give good, */ +/* > but not optimal, performance on many of the currently available */ +/* > computers. Users are encouraged to modify this subroutine to set */ +/* > the tuning parameters for their particular machine using the option */ +/* > and problem size information in the arguments. */ +/* > */ +/* > This routine will not function correctly if it is converted to all */ +/* > lower case. Converting it to all upper case is allowed. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ISPEC */ +/* > \verbatim */ +/* > ISPEC is INTEGER */ +/* > Specifies the parameter to be returned as the value of */ +/* > ILAENV. */ +/* > = 1: the optimal blocksize; if this value is 1, an unblocked */ +/* > algorithm will give the best performance. */ +/* > = 2: the minimum block size for which the block routine */ +/* > should be used; if the usable block size is less than */ +/* > this value, an unblocked routine should be used. */ +/* > = 3: the crossover point (in a block routine, for N less */ +/* > than this value, an unblocked routine should be used) */ +/* > = 4: the number of shifts, used in the nonsymmetric */ +/* > eigenvalue routines (DEPRECATED) */ +/* > = 5: the minimum column dimension for blocking to be used; */ +/* > rectangular blocks must have dimension at least k by m, */ +/* > where k is given by ILAENV(2,...) and m by ILAENV(5,...) */ +/* > = 6: the crossover point for the SVD (when reducing an m by n */ +/* > matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds */ +/* > this value, a QR factorization is used first to reduce */ +/* > the matrix to a triangular form.) */ +/* > = 7: the number of processors */ +/* > = 8: the crossover point for the multishift QR method */ +/* > for nonsymmetric eigenvalue problems (DEPRECATED) */ +/* > = 9: maximum size of the subproblems at the bottom of the */ +/* > computation tree in the divide-and-conquer algorithm */ +/* > (used by xGELSD and xGESDD) */ +/* > =10: ieee infinity and NaN arithmetic can be trusted not to trap */ +/* > =11: infinity arithmetic can be trusted not to trap */ +/* > 12 <= ISPEC <= 17: */ +/* > xHSEQR or related subroutines, */ +/* > see IPARMQ for detailed explanation */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NAME */ +/* > \verbatim */ +/* > NAME is CHARACTER*(*) */ +/* > The name of the calling subroutine, in either upper case or */ +/* > lower case. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] OPTS */ +/* > \verbatim */ +/* > OPTS is CHARACTER*(*) */ +/* > The character options to the subroutine NAME, concatenated */ +/* > into a single character string. For example, UPLO = 'U', */ +/* > TRANS = 'T', and DIAG = 'N' for a triangular routine would */ +/* > be specified as OPTS = 'UTN'. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N1 */ +/* > \verbatim */ +/* > N1 is INTEGER */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N2 */ +/* > \verbatim */ +/* > N2 is INTEGER */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N3 */ +/* > \verbatim */ +/* > N3 is INTEGER */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N4 */ +/* > \verbatim */ +/* > N4 is INTEGER */ +/* > Problem dimensions for the subroutine NAME; these may not all */ +/* > be required. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The following conventions have been used when calling ILAENV from the */ +/* > LAPACK routines: */ +/* > 1) OPTS is a concatenation of all of the character options to */ +/* > subroutine NAME, in the same order that they appear in the */ +/* > argument list for NAME, even if they are not used in determining */ +/* > the value of the parameter specified by ISPEC. */ +/* > 2) The problem dimensions N1, N2, N3, N4 are specified in the order */ +/* > that they appear in the argument list for NAME. N1 is used */ +/* > first, N2 second, and so on, and unused problem dimensions are */ +/* > passed a value of -1. */ +/* > 3) The parameter value returned by ILAENV is checked for validity in */ +/* > the calling subroutine. For example, ILAENV is used to retrieve */ +/* > the optimal blocksize for STRTRI as follows: */ +/* > */ +/* > NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 ) */ +/* > IF( NB.LE.1 ) NB = MAX( 1, N ) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, + integer *n2, integer *n3, integer *n4, ftnlen name_len, ftnlen + opts_len) +{ + /* System generated locals */ + integer ret_val, i__1, i__2, i__3; + + /* Builtin functions */ + /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); + integer i_len(char *, ftnlen), s_cmp(char *, char *, ftnlen, ftnlen); + + /* Local variables */ + logical twostage; + integer i__; + char c1[1], c2[2], c3[3], c4[2]; + integer ic, nb, iz, nx; + logical cname; + integer nbmin; + logical sname; + extern integer ieeeck_(integer *, real *, real *); + char subnam[16]; + extern integer iparmq_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + switch (*ispec) { + case 1: goto L10; + case 2: goto L10; + case 3: goto L10; + case 4: goto L80; + case 5: goto L90; + case 6: goto L100; + case 7: goto L110; + case 8: goto L120; + case 9: goto L130; + case 10: goto L140; + case 11: goto L150; + case 12: goto L160; + case 13: goto L160; + case 14: goto L160; + case 15: goto L160; + case 16: goto L160; + case 17: goto L160; + } + +/* Invalid value for ISPEC */ + + ret_val = -1; + return ret_val; + +L10: + +/* Convert NAME to upper case if the first character is lower case. */ + + ret_val = 1; + s_copy(subnam, name__, (ftnlen)16, name_len); + ic = *(unsigned char *)subnam; + iz = 'Z'; + if (iz == 90 || iz == 122) { + +/* ASCII character set */ + + if (ic >= 97 && ic <= 122) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 97 && ic <= 122) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } +/* L20: */ + } + } + + } else if (iz == 233 || iz == 169) { + +/* EBCDIC character set */ + + if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 && + ic <= 169) { + *(unsigned char *)subnam = (char) (ic + 64); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= + 162 && ic <= 169) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); + } +/* L30: */ + } + } + + } else if (iz == 218 || iz == 250) { + +/* Prime machines: ASCII+128 */ + + if (ic >= 225 && ic <= 250) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 225 && ic <= 250) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } +/* L40: */ + } + } + } + + *(unsigned char *)c1 = *(unsigned char *)subnam; + sname = *(unsigned char *)c1 == 'S' || *(unsigned char *)c1 == 'D'; + cname = *(unsigned char *)c1 == 'C' || *(unsigned char *)c1 == 'Z'; + if (! (cname || sname)) { + return ret_val; + } + s_copy(c2, subnam + 1, (ftnlen)2, (ftnlen)2); + s_copy(c3, subnam + 3, (ftnlen)3, (ftnlen)3); + s_copy(c4, c3 + 1, (ftnlen)2, (ftnlen)2); + twostage = i_len(subnam, (ftnlen)16) >= 11 && *(unsigned char *)&subnam[ + 10] == '2'; + + switch (*ispec) { + case 1: goto L50; + case 2: goto L60; + case 3: goto L70; + } + +L50: + +/* ISPEC = 1: block size */ + +/* In these examples, separate code is provided for setting NB for */ +/* real and complex. We assume that NB will take the same value in */ +/* single or double precision. */ + + nb = 1; + + if (s_cmp(subnam + 1, (char *)"LAORH", (ftnlen)5, (ftnlen)5) == 0) { + +/* This is for *LAORHR_GETRFNP routine */ + + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (s_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, + (char *)"RQF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"LQF", (ftnlen) + 3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) + == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, (char *)"QR ", (ftnlen)3, (ftnlen)3) == 0) { + if (*n3 == 1) { + if (sname) { +/* M*N */ + if (*n1 * *n2 <= 131072 || *n1 <= 8192) { + nb = *n1; + } else { + nb = 32768 / *n2; + } + } else { + if (*n1 * *n2 <= 131072 || *n1 <= 8192) { + nb = *n1; + } else { + nb = 32768 / *n2; + } + } + } else { + if (sname) { + nb = 1; + } else { + nb = 1; + } + } + } else if (s_cmp(c3, (char *)"LQ ", (ftnlen)3, (ftnlen)3) == 0) { + if (*n3 == 2) { + if (sname) { +/* M*N */ + if (*n1 * *n2 <= 131072 || *n1 <= 8192) { + nb = *n1; + } else { + nb = 32768 / *n2; + } + } else { + if (*n1 * *n2 <= 131072 || *n1 <= 8192) { + nb = *n1; + } else { + nb = 32768 / *n2; + } + } + } else { + if (sname) { + nb = 1; + } else { + nb = 1; + } + } + } else if (s_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (s_cmp(c2, (char *)"PO", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } + } else if (s_cmp(c2, (char *)"SY", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + if (twostage) { + nb = 192; + } else { + nb = 64; + } + } else { + if (twostage) { + nb = 192; + } else { + nb = 64; + } + } + } else if (sname && s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + nb = 32; + } else if (sname && s_cmp(c3, (char *)"GST", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } + } else if (cname && s_cmp(c2, (char *)"HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (twostage) { + nb = 192; + } else { + nb = 64; + } + } else if (s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + nb = 32; + } else if (s_cmp(c3, (char *)"GST", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } + } else if (sname && s_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } + } else if (cname && s_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } + } else if (s_cmp(c2, (char *)"GB", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + if (*n4 <= 64) { + nb = 1; + } else { + nb = 32; + } + } else { + if (*n4 <= 64) { + nb = 1; + } else { + nb = 32; + } + } + } + } else if (s_cmp(c2, (char *)"PB", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + if (*n2 <= 64) { + nb = 1; + } else { + nb = 32; + } + } else { + if (*n2 <= 64) { + nb = 1; + } else { + nb = 32; + } + } + } + } else if (s_cmp(c2, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (s_cmp(c3, (char *)"EVC", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (s_cmp(c3, (char *)"SYL", (ftnlen)3, (ftnlen)3) == 0) { +/* The upper bound is to prevent overly aggressive scaling. */ + if (sname) { +/* Computing MIN */ +/* Computing MAX */ + i__2 = 48, i__3 = (min(*n1,*n2) << 4) / 100; + i__1 = max(i__2,i__3); + nb = min(i__1,240); + } else { +/* Computing MIN */ +/* Computing MAX */ + i__2 = 24, i__3 = (min(*n1,*n2) << 3) / 100; + i__1 = max(i__2,i__3); + nb = min(i__1,80); + } + } + } else if (s_cmp(c2, (char *)"LA", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"UUM", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (s_cmp(c3, (char *)"TRS", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } + } else if (sname && s_cmp(c2, (char *)"ST", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"EBZ", (ftnlen)3, (ftnlen)3) == 0) { + nb = 1; + } + } else if (s_cmp(c2, (char *)"GG", (ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + if (s_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } + } + ret_val = nb; + return ret_val; + +L60: + +/* ISPEC = 2: minimum block size */ + + nbmin = 2; + if (s_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"RQF", ( + ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"LQF", (ftnlen)3, ( + ftnlen)3) == 0 || s_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) + { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } + } else if (s_cmp(c2, (char *)"SY", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 8; + } else { + nbmin = 8; + } + } else if (sname && s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + nbmin = 2; + } + } else if (cname && s_cmp(c2, (char *)"HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + nbmin = 2; + } + } else if (sname && s_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } + } else if (cname && s_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } + } else if (s_cmp(c2, (char *)"GG", (ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + if (s_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { + nbmin = 2; + } + } + ret_val = nbmin; + return ret_val; + +L70: + +/* ISPEC = 3: crossover point */ + + nx = 0; + if (s_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"RQF", ( + ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"LQF", (ftnlen)3, ( + ftnlen)3) == 0 || s_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) + { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } else if (s_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } else if (s_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } + } else if (s_cmp(c2, (char *)"SY", (ftnlen)2, (ftnlen)2) == 0) { + if (sname && s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + nx = 32; + } + } else if (cname && s_cmp(c2, (char *)"HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + nx = 32; + } + } else if (sname && s_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nx = 128; + } + } + } else if (cname && s_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nx = 128; + } + } + } else if (s_cmp(c2, (char *)"GG", (ftnlen)2, (ftnlen)2) == 0) { + nx = 128; + if (s_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { + nx = 128; + } + } + ret_val = nx; + return ret_val; + +L80: + +/* ISPEC = 4: number of shifts (used by xHSEQR) */ + + ret_val = 6; + return ret_val; + +L90: + +/* ISPEC = 5: minimum column dimension (not used) */ + + ret_val = 2; + return ret_val; + +L100: + +/* ISPEC = 6: crossover point for SVD (used by xGELSS and xGESVD) */ + + ret_val = (integer) ((real) min(*n1,*n2) * (float)1.6); + return ret_val; + +L110: + +/* ISPEC = 7: number of processors (not used) */ + + ret_val = 1; + return ret_val; + +L120: + +/* ISPEC = 8: crossover point for multishift (used by xHSEQR) */ + + ret_val = 50; + return ret_val; + +L130: + +/* ISPEC = 9: maximum size of the subproblems at the bottom of the */ +/* computation tree in the divide-and-conquer algorithm */ +/* (used by xGELSD and xGESDD) */ + + ret_val = 25; + return ret_val; + +L140: + +/* ISPEC = 10: ieee and infinity NaN arithmetic can be trusted not to trap */ + +/* ILAENV = 0 */ + ret_val = 1; + if (ret_val == 1) { + ret_val = ieeeck_(&c__1, &c_b176, &c_b177); + } + return ret_val; + +L150: + +/* ISPEC = 11: ieee infinity arithmetic can be trusted not to trap */ + +/* ILAENV = 0 */ + ret_val = 1; + if (ret_val == 1) { + ret_val = ieeeck_(&c__0, &c_b176, &c_b177); + } + return ret_val; + +L160: + +/* 12 <= ISPEC <= 17: xHSEQR or related subroutines. */ + + ret_val = iparmq_(ispec, name__, opts, n1, n2, n3, n4, name_len, opts_len) + ; + return ret_val; + +/* End of ILAENV */ + +} /* ilaenv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/ilazlc.cpp b/lib/linalg/ilazlc.cpp new file mode 100644 index 0000000000..309c9e5edb --- /dev/null +++ b/lib/linalg/ilazlc.cpp @@ -0,0 +1,156 @@ +/* fortran/ilazlc.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ILAZLC scans a matrix for its last non-zero column. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ILAZLC + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* INTEGER FUNCTION ILAZLC( M, N, A, LDA ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER M, N, LDA */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ILAZLC scans A for its last non-zero column. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > The m by n matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* ===================================================================== */ +integer ilazlc_(integer *m, integer *n, doublecomplex *a, integer *lda) +{ + /* System generated locals */ + integer a_dim1, a_offset, ret_val, i__1, i__2; + + /* Local variables */ + integer i__; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick test for the common case where one corner is non-zero. */ + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + if (*n == 0) { + ret_val = *n; + } else /* if(complicated condition) */ { + i__1 = *n * a_dim1 + 1; + i__2 = *m + *n * a_dim1; + if (a[i__1].r != 0. || a[i__1].i != 0. || (a[i__2].r != 0. || a[i__2] + .i != 0.)) { + ret_val = *n; + } else { +/* Now scan each column from the end, returning with the first non-zero. */ + for (ret_val = *n; ret_val >= 1; --ret_val) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + ret_val * a_dim1; + if (a[i__2].r != 0. || a[i__2].i != 0.) { + return ret_val; + } + } + } + } + } + return ret_val; +} /* ilazlc_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/ilazlr.cpp b/lib/linalg/ilazlr.cpp new file mode 100644 index 0000000000..8ca4fd8029 --- /dev/null +++ b/lib/linalg/ilazlr.cpp @@ -0,0 +1,159 @@ +/* fortran/ilazlr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ILAZLR scans a matrix for its last non-zero row. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ILAZLR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* INTEGER FUNCTION ILAZLR( M, N, A, LDA ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER M, N, LDA */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ILAZLR scans A for its last non-zero row. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > The m by n matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* ===================================================================== */ +integer ilazlr_(integer *m, integer *n, doublecomplex *a, integer *lda) +{ + /* System generated locals */ + integer a_dim1, a_offset, ret_val, i__1, i__2; + + /* Local variables */ + integer i__, j; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick test for the common case where one corner is non-zero. */ + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + if (*m == 0) { + ret_val = *m; + } else /* if(complicated condition) */ { + i__1 = *m + a_dim1; + i__2 = *m + *n * a_dim1; + if (a[i__1].r != 0. || a[i__1].i != 0. || (a[i__2].r != 0. || a[i__2] + .i != 0.)) { + ret_val = *m; + } else { +/* Scan up each column tracking the last zero row seen. */ + ret_val = 0; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__ = *m; + for(;;) { /* while(complicated condition) */ + i__2 = max(i__,1) + j * a_dim1; + if (!(a[i__2].r == 0. && a[i__2].i == 0. && i__ >= 1)) + break; + --i__; + } + ret_val = max(ret_val,i__); + } + } + } + return ret_val; +} /* ilazlr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/iparmq.cpp b/lib/linalg/iparmq.cpp new file mode 100644 index 0000000000..12f3b7f7f6 --- /dev/null +++ b/lib/linalg/iparmq.cpp @@ -0,0 +1,449 @@ +/* fortran/iparmq.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b IPARMQ */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download IPARMQ + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER IHI, ILO, ISPEC, LWORK, N */ +/* CHARACTER NAME*( * ), OPTS*( * ) */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > This program sets problem and machine dependent parameters */ +/* > useful for xHSEQR and related subroutines for eigenvalue */ +/* > problems. It is called whenever */ +/* > IPARMQ is called with 12 <= ISPEC <= 16 */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] ISPEC */ +/* > \verbatim */ +/* > ISPEC is INTEGER */ +/* > ISPEC specifies which tunable parameter IPARMQ should */ +/* > return. */ +/* > */ +/* > ISPEC=12: (INMIN) Matrices of order nmin or less */ +/* > are sent directly to xLAHQR, the implicit */ +/* > double shift QR algorithm. NMIN must be */ +/* > at least 11. */ +/* > */ +/* > ISPEC=13: (INWIN) Size of the deflation window. */ +/* > This is best set greater than or equal to */ +/* > the number of simultaneous shifts NS. */ +/* > Larger matrices benefit from larger deflation */ +/* > windows. */ +/* > */ +/* > ISPEC=14: (INIBL) Determines when to stop nibbling and */ +/* > invest in an (expensive) multi-shift QR sweep. */ +/* > If the aggressive early deflation subroutine */ +/* > finds LD converged eigenvalues from an order */ +/* > NW deflation window and LD > (NW*NIBBLE)/100, */ +/* > then the next QR sweep is skipped and early */ +/* > deflation is applied immediately to the */ +/* > remaining active diagonal block. Setting */ +/* > IPARMQ(ISPEC=14) = 0 causes TTQRE to skip a */ +/* > multi-shift QR sweep whenever early deflation */ +/* > finds a converged eigenvalue. Setting */ +/* > IPARMQ(ISPEC=14) greater than or equal to 100 */ +/* > prevents TTQRE from skipping a multi-shift */ +/* > QR sweep. */ +/* > */ +/* > ISPEC=15: (NSHFTS) The number of simultaneous shifts in */ +/* > a multi-shift QR iteration. */ +/* > */ +/* > ISPEC=16: (IACC22) IPARMQ is set to 0, 1 or 2 with the */ +/* > following meanings. */ +/* > 0: During the multi-shift QR/QZ sweep, */ +/* > blocked eigenvalue reordering, blocked */ +/* > Hessenberg-triangular reduction, */ +/* > reflections and/or rotations are not */ +/* > accumulated when updating the */ +/* > far-from-diagonal matrix entries. */ +/* > 1: During the multi-shift QR/QZ sweep, */ +/* > blocked eigenvalue reordering, blocked */ +/* > Hessenberg-triangular reduction, */ +/* > reflections and/or rotations are */ +/* > accumulated, and matrix-matrix */ +/* > multiplication is used to update the */ +/* > far-from-diagonal matrix entries. */ +/* > 2: During the multi-shift QR/QZ sweep, */ +/* > blocked eigenvalue reordering, blocked */ +/* > Hessenberg-triangular reduction, */ +/* > reflections and/or rotations are */ +/* > accumulated, and 2-by-2 block structure */ +/* > is exploited during matrix-matrix */ +/* > multiplies. */ +/* > (If xTRMM is slower than xGEMM, then */ +/* > IPARMQ(ISPEC=16)=1 may be more efficient than */ +/* > IPARMQ(ISPEC=16)=2 despite the greater level of */ +/* > arithmetic work implied by the latter choice.) */ +/* > */ +/* > ISPEC=17: (ICOST) An estimate of the relative cost of flops */ +/* > within the near-the-diagonal shift chase compared */ +/* > to flops within the BLAS calls of a QZ sweep. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NAME */ +/* > \verbatim */ +/* > NAME is CHARACTER string */ +/* > Name of the calling subroutine */ +/* > \endverbatim */ +/* > */ +/* > \param[in] OPTS */ +/* > \verbatim */ +/* > OPTS is CHARACTER string */ +/* > This is a concatenation of the string arguments to */ +/* > TTQRE. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > N is the order of the Hessenberg matrix H. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ILO */ +/* > \verbatim */ +/* > ILO is INTEGER */ +/* > \endverbatim */ +/* > */ +/* > \param[in] IHI */ +/* > \verbatim */ +/* > IHI is INTEGER */ +/* > It is assumed that H is already upper triangular */ +/* > in rows and columns 1:ILO-1 and IHI+1:N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The amount of workspace available. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup OTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Little is known about how best to choose these parameters. */ +/* > It is possible to use different values of the parameters */ +/* > for each of CHSEQR, DHSEQR, SHSEQR and ZHSEQR. */ +/* > */ +/* > It is probably best to choose different parameters for */ +/* > different matrices and different parameters at different */ +/* > times during the iteration, but this has not been */ +/* > implemented --- yet. */ +/* > */ +/* > */ +/* > The best choices of most of the parameters depend */ +/* > in an ill-understood way on the relative execution */ +/* > rate of xLAQR3 and xLAQR5 and on the nature of each */ +/* > particular eigenvalue problem. Experiment may be the */ +/* > only practical way to determine which choices are most */ +/* > effective. */ +/* > */ +/* > Following is a list of default values supplied by IPARMQ. */ +/* > These defaults may be adjusted in order to attain better */ +/* > performance in any particular computational environment. */ +/* > */ +/* > IPARMQ(ISPEC=12) The xLAHQR vs xLAQR0 crossover point. */ +/* > Default: 75. (Must be at least 11.) */ +/* > */ +/* > IPARMQ(ISPEC=13) Recommended deflation window size. */ +/* > This depends on ILO, IHI and NS, the */ +/* > number of simultaneous shifts returned */ +/* > by IPARMQ(ISPEC=15). The default for */ +/* > (IHI-ILO+1) <= 500 is NS. The default */ +/* > for (IHI-ILO+1) > 500 is 3*NS/2. */ +/* > */ +/* > IPARMQ(ISPEC=14) Nibble crossover point. Default: 14. */ +/* > */ +/* > IPARMQ(ISPEC=15) Number of simultaneous shifts, NS. */ +/* > a multi-shift QR iteration. */ +/* > */ +/* > If IHI-ILO+1 is ... */ +/* > */ +/* > greater than ...but less ... the */ +/* > or equal to ... than default is */ +/* > */ +/* > 0 30 NS = 2+ */ +/* > 30 60 NS = 4+ */ +/* > 60 150 NS = 10 */ +/* > 150 590 NS = ** */ +/* > 590 3000 NS = 64 */ +/* > 3000 6000 NS = 128 */ +/* > 6000 infinity NS = 256 */ +/* > */ +/* > (+) By default matrices of this order are */ +/* > passed to the implicit double shift routine */ +/* > xLAHQR. See IPARMQ(ISPEC=12) above. These */ +/* > values of NS are used only in case of a rare */ +/* > xLAHQR failure. */ +/* > */ +/* > (**) The asterisks (**) indicate an ad-hoc */ +/* > function increasing from 10 to 64. */ +/* > */ +/* > IPARMQ(ISPEC=16) Select structured matrix multiply. */ +/* > (See ISPEC=16 above for details.) */ +/* > Default: 3. */ +/* > */ +/* > IPARMQ(ISPEC=17) Relative cost heuristic for blocksize selection. */ +/* > Expressed as a percentage. */ +/* > Default: 10. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer + *ilo, integer *ihi, integer *lwork, ftnlen name_len, ftnlen opts_len) +{ + /* System generated locals */ + integer ret_val, i__1, i__2; + real r__1; + + /* Builtin functions */ + double log(doublereal); + integer i_nint(real *); + /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); + integer s_cmp(char *, char *, ftnlen, ftnlen); + + /* Local variables */ + integer i__, ic, nh, ns, iz; + char subnam[6]; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ + +/* ================================================================ */ +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + if (*ispec == 15 || *ispec == 13 || *ispec == 16) { + +/* ==== Set the number simultaneous shifts ==== */ + + nh = *ihi - *ilo + 1; + ns = 2; + if (nh >= 30) { + ns = 4; + } + if (nh >= 60) { + ns = 10; + } + if (nh >= 150) { +/* Computing MAX */ + r__1 = log((real) nh) / log((float)2.); + i__1 = 10, i__2 = nh / i_nint(&r__1); + ns = max(i__1,i__2); + } + if (nh >= 590) { + ns = 64; + } + if (nh >= 3000) { + ns = 128; + } + if (nh >= 6000) { + ns = 256; + } +/* Computing MAX */ + i__1 = 2, i__2 = ns - ns % 2; + ns = max(i__1,i__2); + } + + if (*ispec == 12) { + + +/* ===== Matrices of order smaller than NMIN get sent */ +/* . to xLAHQR, the classic double shift algorithm. */ +/* . This must be at least 11. ==== */ + + ret_val = 75; + + } else if (*ispec == 14) { + +/* ==== INIBL: skip a multi-shift qr iteration and */ +/* . whenever aggressive early deflation finds */ +/* . at least (NIBBLE*(window size)/100) deflations. ==== */ + + ret_val = 14; + + } else if (*ispec == 15) { + +/* ==== NSHFTS: The number of simultaneous shifts ===== */ + + ret_val = ns; + + } else if (*ispec == 13) { + +/* ==== NW: deflation window size. ==== */ + + if (nh <= 500) { + ret_val = ns; + } else { + ret_val = ns * 3 / 2; + } + + } else if (*ispec == 16) { + +/* ==== IACC22: Whether to accumulate reflections */ +/* . before updating the far-from-diagonal elements */ +/* . and whether to use 2-by-2 block structure while */ +/* . doing it. A small amount of work could be saved */ +/* . by making this choice dependent also upon the */ +/* . NH=IHI-ILO+1. */ + + +/* Convert NAME to upper case if the first character is lower case. */ + + ret_val = 0; + s_copy(subnam, name__, (ftnlen)6, name_len); + ic = *(unsigned char *)subnam; + iz = 'Z'; + if (iz == 90 || iz == 122) { + +/* ASCII character set */ + + if (ic >= 97 && ic <= 122) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 97 && ic <= 122) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } + } + } + + } else if (iz == 233 || iz == 169) { + +/* EBCDIC character set */ + + if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 + && ic <= 169) { + *(unsigned char *)subnam = (char) (ic + 64); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || + ic >= 162 && ic <= 169) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); + } + } + } + + } else if (iz == 218 || iz == 250) { + +/* Prime machines: ASCII+128 */ + + if (ic >= 225 && ic <= 250) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 225 && ic <= 250) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } + } + } + } + + if (s_cmp(subnam + 1, (char *)"GGHRD", (ftnlen)5, (ftnlen)5) == 0 || s_cmp( + subnam + 1, (char *)"GGHD3", (ftnlen)5, (ftnlen)5) == 0) { + ret_val = 1; + if (nh >= 14) { + ret_val = 2; + } + } else if (s_cmp(subnam + 3, (char *)"EXC", (ftnlen)3, (ftnlen)3) == 0) { + if (nh >= 14) { + ret_val = 1; + } + if (nh >= 14) { + ret_val = 2; + } + } else if (s_cmp(subnam + 1, (char *)"HSEQR", (ftnlen)5, (ftnlen)5) == 0 || + s_cmp(subnam + 1, (char *)"LAQR", (ftnlen)4, (ftnlen)4) == 0) { + if (ns >= 14) { + ret_val = 1; + } + if (ns >= 14) { + ret_val = 2; + } + } + + } else if (*ispec == 17) { + +/* === Relative cost of near-the-diagonal chase vs */ +/* BLAS updates === */ + + ret_val = 10; + } else { +/* ===== invalid value of ispec ===== */ + ret_val = -1; + + } + +/* ==== End of IPARMQ ==== */ + + return ret_val; +} /* iparmq_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/lmp_f2c.h b/lib/linalg/lmp_f2c.h new file mode 100644 index 0000000000..0b1ebac99c --- /dev/null +++ b/lib/linalg/lmp_f2c.h @@ -0,0 +1,223 @@ +/* f2c.h -- Standard Fortran to C header file */ + +/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." + + - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ + +#ifndef F2C_INCLUDE +#define F2C_INCLUDE + +typedef int integer; +typedef unsigned int uinteger; +typedef char *address; +typedef short int shortint; +typedef float real; +typedef double doublereal; +typedef struct { real r, i; } complex; +typedef struct { doublereal r, i; } doublecomplex; +typedef long int logical; +typedef short int shortlogical; +typedef char logical1; +typedef char integer1; +#ifdef INTEGER_STAR_8 /* Adjust for integer*8. */ +typedef long long longint; /* system-dependent */ +typedef unsigned long long ulongint; /* system-dependent */ +#define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) +#define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) +#endif + +#define TRUE_ (1) +#define FALSE_ (0) + +/* Extern is for use with -E */ +#ifndef Extern +#define Extern extern +#endif + +/* I/O stuff */ + +#ifdef f2c_i2 +/* for -i2 */ +typedef short flag; +typedef short ftnlen; +typedef short ftnint; +#else +typedef long int flag; +typedef long int ftnlen; +typedef long int ftnint; +#endif + +/*external read, write*/ +typedef struct +{ flag cierr; + ftnint ciunit; + flag ciend; + char *cifmt; + ftnint cirec; +} cilist; + +/*internal read, write*/ +typedef struct +{ flag icierr; + char *iciunit; + flag iciend; + char *icifmt; + ftnint icirlen; + ftnint icirnum; +} icilist; + +/*open*/ +typedef struct +{ flag oerr; + ftnint ounit; + char *ofnm; + ftnlen ofnmlen; + char *osta; + char *oacc; + char *ofm; + ftnint orl; + char *oblnk; +} olist; + +/*close*/ +typedef struct +{ flag cerr; + ftnint cunit; + char *csta; +} cllist; + +/*rewind, backspace, endfile*/ +typedef struct +{ flag aerr; + ftnint aunit; +} alist; + +/* inquire */ +typedef struct +{ flag inerr; + ftnint inunit; + char *infile; + ftnlen infilen; + ftnint *inex; /*parameters in standard's order*/ + ftnint *inopen; + ftnint *innum; + ftnint *innamed; + char *inname; + ftnlen innamlen; + char *inacc; + ftnlen inacclen; + char *inseq; + ftnlen inseqlen; + char *indir; + ftnlen indirlen; + char *infmt; + ftnlen infmtlen; + char *inform; + ftnint informlen; + char *inunf; + ftnlen inunflen; + ftnint *inrecl; + ftnint *innrec; + char *inblank; + ftnlen inblanklen; +} inlist; + +#define VOID void + +union Multitype { /* for multiple entry points */ + integer1 g; + shortint h; + integer i; + /* longint j; */ + real r; + doublereal d; + complex c; + doublecomplex z; + }; + +typedef union Multitype Multitype; + +/*typedef long int Long;*/ /* No longer used; formerly in Namelist */ + +struct Vardesc { /* for Namelist */ + char *name; + char *addr; + ftnlen *dims; + int type; + }; +typedef struct Vardesc Vardesc; + +struct Namelist { + char *name; + Vardesc **vars; + int nvars; + }; +typedef struct Namelist Namelist; + +#define abs(x) ((x) >= 0 ? (x) : -(x)) +#define dabs(x) (doublereal)abs(x) +#define min(a,b) ((a) <= (b) ? (a) : (b)) +#define max(a,b) ((a) >= (b) ? (a) : (b)) +#define dmin(a,b) (doublereal)min(a,b) +#define dmax(a,b) (doublereal)max(a,b) +#define bit_test(a,b) ((a) >> (b) & 1) +#define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) +#define bit_set(a,b) ((a) | ((uinteger)1 << (b))) + +/* procedure parameter types for -A and -C++ */ + +#define F2C_proc_par_types 1 +#ifdef __cplusplus +typedef int /* Unknown procedure type */ (*U_fp)(...); +typedef shortint (*J_fp)(...); +typedef integer (*I_fp)(...); +typedef real (*R_fp)(...); +typedef doublereal (*D_fp)(...), (*E_fp)(...); +typedef /* Complex */ VOID (*C_fp)(...); +typedef /* Double Complex */ VOID (*Z_fp)(...); +typedef logical (*L_fp)(...); +typedef shortlogical (*K_fp)(...); +typedef /* Character */ VOID (*H_fp)(...); +typedef /* Subroutine */ int (*S_fp)(...); +#else +typedef int /* Unknown procedure type */ (*U_fp)(); +typedef shortint (*J_fp)(); +typedef integer (*I_fp)(); +typedef real (*R_fp)(); +typedef doublereal (*D_fp)(), (*E_fp)(); +typedef /* Complex */ VOID (*C_fp)(); +typedef /* Double Complex */ VOID (*Z_fp)(); +typedef logical (*L_fp)(); +typedef shortlogical (*K_fp)(); +typedef /* Character */ VOID (*H_fp)(); +typedef /* Subroutine */ int (*S_fp)(); +#endif +/* E_fp is for real functions when -R is not specified */ +typedef VOID C_f; /* complex function */ +typedef VOID H_f; /* character function */ +typedef VOID Z_f; /* double complex function */ +typedef doublereal E_f; /* real function with -R not specified */ + +/* undef any lower-case symbols that your C compiler predefines, e.g.: */ + +#ifndef Skip_f2c_Undefs +#undef cray +#undef gcos +#undef mc68010 +#undef mc68020 +#undef mips +#undef pdp11 +#undef sgi +#undef sparc +#undef sun +#undef sun2 +#undef sun3 +#undef sun4 +#undef u370 +#undef u3b +#undef u3b2 +#undef u3b5 +#undef unix +#undef vax +#endif +#endif diff --git a/lib/linalg/lsame.cpp b/lib/linalg/lsame.cpp new file mode 100644 index 0000000000..dcb89e3d00 --- /dev/null +++ b/lib/linalg/lsame.cpp @@ -0,0 +1,17 @@ + +#include + +extern "C" { + +#include "lmp_f2c.h" + +logical lsame_(const char *a, const char *b) +{ + char ua, ub; + if (!a || !b) return FALSE_; + + ua = toupper(*a); + ub = toupper(*b); + return (ua == ub) ? TRUE_ : FALSE_; +} +} diff --git a/lib/linalg/static/README b/lib/linalg/static/README new file mode 100644 index 0000000000..c06337c2dd --- /dev/null +++ b/lib/linalg/static/README @@ -0,0 +1,5 @@ +The C++ files in this folder are direct C++ implementations of their +Fortran equivalents using the C++ runtime. +. +The Fortran files in this folder are modified from their +original versions, so that f2c can correctly translate them. diff --git a/lib/linalg/static/dgetrf2.f b/lib/linalg/static/dgetrf2.f new file mode 100644 index 0000000000..e3d2aac299 --- /dev/null +++ b/lib/linalg/static/dgetrf2.f @@ -0,0 +1,269 @@ +*> \brief \b DGETRF2 +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* RECURSIVE SUBROUTINE DGETRF2( M, N, A, LDA, IPIV, INFO ) +* +* .. Scalar Arguments .. +* INTEGER INFO, LDA, M, N +* .. +* .. Array Arguments .. +* INTEGER IPIV( * ) +* DOUBLE PRECISION A( LDA, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DGETRF2 computes an LU factorization of a general M-by-N matrix A +*> using partial pivoting with row interchanges. +*> +*> The factorization has the form +*> A = P * L * U +*> where P is a permutation matrix, L is lower triangular with unit +*> diagonal elements (lower trapezoidal if m > n), and U is upper +*> triangular (upper trapezoidal if m < n). +*> +*> This is the recursive version of the algorithm. It divides +*> the matrix into four submatrices: +*> +*> [ A11 | A12 ] where A11 is n1 by n1 and A22 is n2 by n2 +*> A = [ -----|----- ] with n1 = min(m,n)/2 +*> [ A21 | A22 ] n2 = n-n1 +*> +*> [ A11 ] +*> The subroutine calls itself to factor [ --- ], +*> [ A12 ] +*> [ A12 ] +*> do the swaps on [ --- ], solve A12, update A22, +*> [ A22 ] +*> +*> then calls itself to factor A22 and do the swaps on A21. +*> +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> The number of rows of the matrix A. M >= 0. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The number of columns of the matrix A. N >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension (LDA,N) +*> On entry, the M-by-N matrix to be factored. +*> On exit, the factors L and U from the factorization +*> A = P*L*U; the unit diagonal elements of L are not stored. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,M). +*> \endverbatim +*> +*> \param[out] IPIV +*> \verbatim +*> IPIV is INTEGER array, dimension (min(M,N)) +*> The pivot indices; for 1 <= i <= min(M,N), row i of the +*> matrix was interchanged with row IPIV(i). +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument had an illegal value +*> > 0: if INFO = i, U(i,i) is exactly zero. The factorization +*> has been completed, but the factor U is exactly +*> singular, and division by zero will occur if it is used +*> to solve a system of equations. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \ingroup doubleGEcomputational +* +* ===================================================================== + SUBROUTINE DGETRF2( M, N, A, LDA, IPIV, INFO ) +* +* -- LAPACK computational routine -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + INTEGER INFO, LDA, M, N +* .. +* .. Array Arguments .. + INTEGER IPIV( * ) + DOUBLE PRECISION A( LDA, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + DOUBLE PRECISION SFMIN, TEMP + INTEGER I, IINFO, N1, N2 +* .. +* .. External Functions .. + DOUBLE PRECISION DLAMCH + INTEGER IDAMAX + EXTERNAL DLAMCH, IDAMAX +* .. +* .. External Subroutines .. + EXTERNAL DGEMM, DSCAL, DLASWP, DTRSM, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, MIN +* .. +* .. Executable Statements .. +* +* Test the input parameters +* + INFO = 0 + IF( M.LT.0 ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( LDA.LT.MAX( 1, M ) ) THEN + INFO = -4 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DGETRF2', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( M.EQ.0 .OR. N.EQ.0 ) + $ RETURN + + IF ( M.EQ.1 ) THEN +* +* Use unblocked code for one row case +* Just need to handle IPIV and INFO +* + IPIV( 1 ) = 1 + IF ( A(1,1).EQ.ZERO ) + $ INFO = 1 +* + ELSE IF( N.EQ.1 ) THEN +* +* Use unblocked code for one column case +* +* +* Compute machine safe minimum +* + SFMIN = DLAMCH('S') +* +* Find pivot and test for singularity +* + I = IDAMAX( M, A( 1, 1 ), 1 ) + IPIV( 1 ) = I + IF( A( I, 1 ).NE.ZERO ) THEN +* +* Apply the interchange +* + IF( I.NE.1 ) THEN + TEMP = A( 1, 1 ) + A( 1, 1 ) = A( I, 1 ) + A( I, 1 ) = TEMP + END IF +* +* Compute elements 2:M of the column +* + IF( ABS(A( 1, 1 )) .GE. SFMIN ) THEN + CALL DSCAL( M-1, ONE / A( 1, 1 ), A( 2, 1 ), 1 ) + ELSE + DO 10 I = 1, M-1 + A( 1+I, 1 ) = A( 1+I, 1 ) / A( 1, 1 ) + 10 CONTINUE + END IF +* + ELSE + INFO = 1 + END IF +* + ELSE +* +* Use recursive code +* + N1 = MIN( M, N ) / 2 + N2 = N-N1 +* +* [ A11 ] +* Factor [ --- ] +* [ A21 ] +* + CALL DGETRF2( M, N1, A, LDA, IPIV, IINFO ) + + IF ( INFO.EQ.0 .AND. IINFO.GT.0 ) + $ INFO = IINFO +* +* [ A12 ] +* Apply interchanges to [ --- ] +* [ A22 ] +* + CALL DLASWP( N2, A( 1, N1+1 ), LDA, 1, N1, IPIV, 1 ) +* +* Solve A12 +* + CALL DTRSM( 'L', 'L', 'N', 'U', N1, N2, ONE, A, LDA, + $ A( 1, N1+1 ), LDA ) +* +* Update A22 +* + CALL DGEMM( 'N', 'N', M-N1, N2, N1, -ONE, A( N1+1, 1 ), LDA, + $ A( 1, N1+1 ), LDA, ONE, A( N1+1, N1+1 ), LDA ) +* +* Factor A22 +* + CALL DGETRF2( M-N1, N2, A( N1+1, N1+1 ), LDA, IPIV( N1+1 ), + $ IINFO ) +* +* Adjust INFO and the pivot indices +* + IF ( INFO.EQ.0 .AND. IINFO.GT.0 ) + $ INFO = IINFO + N1 + DO 20 I = N1+1, MIN( M, N ) + IPIV( I ) = IPIV( I ) + N1 + 20 CONTINUE +* +* Apply interchanges to A21 +* + CALL DLASWP( N1, A( 1, 1 ), LDA, N1+1, MIN( M, N), IPIV, 1 ) +* + END IF + RETURN +* +* End of DGETRF2 +* + END diff --git a/lib/linalg/static/disnan.cpp b/lib/linalg/static/disnan.cpp new file mode 100644 index 0000000000..9e5bc1094e --- /dev/null +++ b/lib/linalg/static/disnan.cpp @@ -0,0 +1,14 @@ + +#include + +extern "C" { + +#include "lmp_f2c.h" + +logical disnan_(const doublereal *din) +{ + if (!din) return TRUE_; + + return std::isnan(*din) ? TRUE_ : FALSE_; +} +} diff --git a/lib/linalg/static/dlamch.cpp b/lib/linalg/static/dlamch.cpp new file mode 100644 index 0000000000..3d616d95d2 --- /dev/null +++ b/lib/linalg/static/dlamch.cpp @@ -0,0 +1,45 @@ + +#include +#include + +extern "C" { + +#include "lmp_f2c.h" + +// undefine conflicting f2c macros +#undef min +#undef max + +doublereal dlamch_(const char *cmach) +{ + if (!cmach) return 0.0; + char select = toupper(*cmach); + + // BLAS assumes rounding not truncation => epsilon is half + const double eps = 0.5 * std::numeric_limits::epsilon(); + if (select == 'E') return eps; + + double min = std::numeric_limits::min(); + const double max = std::numeric_limits::max(); + double small = 1.0 / max; + if (small >= min) min = small * (1.0 + eps); + if (select == 'S') return min; + + const double radix = std::numeric_limits::radix; + if (select == 'B') return radix; + + if (select == 'P') return eps * radix; + + if (select == 'N') return std::numeric_limits::digits; + + if (select == 'M') return std::numeric_limits::min_exponent; + + if (select == 'U') return min; + + if (select == 'L') return std::numeric_limits::max_exponent; + + if (select == 'O') return max; + + return 0.0; +} +} diff --git a/lib/linalg/static/dlarft.f b/lib/linalg/static/dlarft.f new file mode 100644 index 0000000000..e92c927971 --- /dev/null +++ b/lib/linalg/static/dlarft.f @@ -0,0 +1,327 @@ +*> \brief \b DLARFT forms the triangular factor T of a block reflector H = I - vtvH +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DLARFT + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) +* +* .. Scalar Arguments .. +* CHARACTER DIRECT, STOREV +* INTEGER K, LDT, LDV, N +* .. +* .. Array Arguments .. +* DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DLARFT forms the triangular factor T of a real block reflector H +*> of order n, which is defined as a product of k elementary reflectors. +*> +*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; +*> +*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. +*> +*> If STOREV = 'C', the vector which defines the elementary reflector +*> H(i) is stored in the i-th column of the array V, and +*> +*> H = I - V * T * V**T +*> +*> If STOREV = 'R', the vector which defines the elementary reflector +*> H(i) is stored in the i-th row of the array V, and +*> +*> H = I - V**T * T * V +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] DIRECT +*> \verbatim +*> DIRECT is CHARACTER*1 +*> Specifies the order in which the elementary reflectors are +*> multiplied to form the block reflector: +*> = 'F': H = H(1) H(2) . . . H(k) (Forward) +*> = 'B': H = H(k) . . . H(2) H(1) (Backward) +*> \endverbatim +*> +*> \param[in] STOREV +*> \verbatim +*> STOREV is CHARACTER*1 +*> Specifies how the vectors which define the elementary +*> reflectors are stored (see also Further Details): +*> = 'C': columnwise +*> = 'R': rowwise +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the block reflector H. N >= 0. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> The order of the triangular factor T (= the number of +*> elementary reflectors). K >= 1. +*> \endverbatim +*> +*> \param[in] V +*> \verbatim +*> V is DOUBLE PRECISION array, dimension +*> (LDV,K) if STOREV = 'C' +*> (LDV,N) if STOREV = 'R' +*> The matrix V. See further details. +*> \endverbatim +*> +*> \param[in] LDV +*> \verbatim +*> LDV is INTEGER +*> The leading dimension of the array V. +*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is DOUBLE PRECISION array, dimension (K) +*> TAU(i) must contain the scalar factor of the elementary +*> reflector H(i). +*> \endverbatim +*> +*> \param[out] T +*> \verbatim +*> T is DOUBLE PRECISION array, dimension (LDT,K) +*> The k by k triangular factor T of the block reflector. +*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is +*> lower triangular. The rest of the array is not used. +*> \endverbatim +*> +*> \param[in] LDT +*> \verbatim +*> LDT is INTEGER +*> The leading dimension of the array T. LDT >= K. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \ingroup doubleOTHERauxiliary +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> The shape of the matrix V and the storage of the vectors which define +*> the H(i) is best illustrated by the following example with n = 5 and +*> k = 3. The elements equal to 1 are not stored. +*> +*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': +*> +*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) +*> ( v1 1 ) ( 1 v2 v2 v2 ) +*> ( v1 v2 1 ) ( 1 v3 v3 ) +*> ( v1 v2 v3 ) +*> ( v1 v2 v3 ) +*> +*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': +*> +*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) +*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) +*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) +*> ( 1 v3 ) +*> ( 1 ) +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) +* +* -- LAPACK auxiliary routine -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + CHARACTER DIRECT, STOREV + INTEGER K, LDT, LDV, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + INTEGER I, J, PREVLASTV, LASTV +* .. +* .. External Subroutines .. + EXTERNAL DGEMV, DTRMV +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. Executable Statements .. +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* + IF( LSAME( DIRECT, 'F' ) ) THEN + PREVLASTV = N + DO I = 1, K + PREVLASTV = MAX( I, PREVLASTV ) + IF( TAU( I ).EQ.ZERO ) THEN +* +* H(i) = I +* + DO J = 1, I + T( J, I ) = ZERO + END DO + ELSE +* +* general case +* + IF( LSAME( STOREV, 'C' ) ) THEN +* Skip any trailing zeros. + DO LASTV = N, I+1, -1 + IF( V( LASTV, I ).NE.ZERO ) GOTO 219 + END DO + 219 CONTINUE + DO J = 1, I-1 + T( J, I ) = -TAU( I ) * V( I , J ) + END DO + J = MIN( LASTV, PREVLASTV ) +* +* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i) +* + CALL DGEMV( 'Transpose', J-I, I-1, -TAU( I ), + $ V( I+1, 1 ), LDV, V( I+1, I ), 1, ONE, + $ T( 1, I ), 1 ) + ELSE +* Skip any trailing zeros. + DO LASTV = N, I+1, -1 + IF( V( I, LASTV ).NE.ZERO ) GOTO 235 + END DO + 235 CONTINUE + DO J = 1, I-1 + T( J, I ) = -TAU( I ) * V( J , I ) + END DO + J = MIN( LASTV, PREVLASTV ) +* +* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T +* + CALL DGEMV( 'No transpose', I-1, J-I, -TAU( I ), + $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, ONE, + $ T( 1, I ), 1 ) + END IF +* +* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) +* + CALL DTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, + $ LDT, T( 1, I ), 1 ) + T( I, I ) = TAU( I ) + IF( I.GT.1 ) THEN + PREVLASTV = MAX( PREVLASTV, LASTV ) + ELSE + PREVLASTV = LASTV + END IF + END IF + END DO + ELSE + PREVLASTV = 1 + DO I = K, 1, -1 + IF( TAU( I ).EQ.ZERO ) THEN +* +* H(i) = I +* + DO J = I, K + T( J, I ) = ZERO + END DO + ELSE +* +* general case +* + IF( I.LT.K ) THEN + IF( LSAME( STOREV, 'C' ) ) THEN +* Skip any leading zeros. + DO LASTV = 1, I-1 + IF( V( LASTV, I ).NE.ZERO ) GOTO 280 + END DO + 280 CONTINUE + DO J = I+1, K + T( J, I ) = -TAU( I ) * V( N-K+I , J ) + END DO + J = MAX( LASTV, PREVLASTV ) +* +* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i) +* + CALL DGEMV( 'Transpose', N-K+I-J, K-I, -TAU( I ), + $ V( J, I+1 ), LDV, V( J, I ), 1, ONE, + $ T( I+1, I ), 1 ) + ELSE +* Skip any leading zeros. + DO LASTV = 1, I-1 + IF( V( I, LASTV ).NE.ZERO ) GOTO 296 + END DO + 296 CONTINUE + DO J = I+1, K + T( J, I ) = -TAU( I ) * V( J, N-K+I ) + END DO + J = MAX( LASTV, PREVLASTV ) +* +* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T +* + CALL DGEMV( 'No transpose', K-I, N-K+I-J, + $ -TAU( I ), V( I+1, J ), LDV, V( I, J ), LDV, + $ ONE, T( I+1, I ), 1 ) + END IF +* +* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) +* + CALL DTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, + $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) + IF( I.GT.1 ) THEN + PREVLASTV = MIN( PREVLASTV, LASTV ) + ELSE + PREVLASTV = LASTV + END IF + END IF + T( I, I ) = TAU( I ) + END IF + END DO + END IF + RETURN +* +* End of DLARFT +* + END diff --git a/lib/linalg/static/dpotrf2.f b/lib/linalg/static/dpotrf2.f new file mode 100644 index 0000000000..ba827635a8 --- /dev/null +++ b/lib/linalg/static/dpotrf2.f @@ -0,0 +1,234 @@ +*> \brief \b DPOTRF2 +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition: +* =========== +* +* RECURSIVE SUBROUTINE DPOTRF2( UPLO, N, A, LDA, INFO ) +* +* .. Scalar Arguments .. +* CHARACTER UPLO +* INTEGER INFO, LDA, N +* .. +* .. Array Arguments .. +* REAL A( LDA, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DPOTRF2 computes the Cholesky factorization of a real symmetric +*> positive definite matrix A using the recursive algorithm. +*> +*> The factorization has the form +*> A = U**T * U, if UPLO = 'U', or +*> A = L * L**T, if UPLO = 'L', +*> where U is an upper triangular matrix and L is lower triangular. +*> +*> This is the recursive version of the algorithm. It divides +*> the matrix into four submatrices: +*> +*> [ A11 | A12 ] where A11 is n1 by n1 and A22 is n2 by n2 +*> A = [ -----|----- ] with n1 = n/2 +*> [ A21 | A22 ] n2 = n-n1 +*> +*> The subroutine calls itself to factor A11. Update and scale A21 +*> or A12, update A22 then calls itself to factor A22. +*> +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] UPLO +*> \verbatim +*> UPLO is CHARACTER*1 +*> = 'U': Upper triangle of A is stored; +*> = 'L': Lower triangle of A is stored. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrix A. N >= 0. +*> \endverbatim +*> +*> \param[in,out] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension (LDA,N) +*> On entry, the symmetric matrix A. If UPLO = 'U', the leading +*> N-by-N upper triangular part of A contains the upper +*> triangular part of the matrix A, and the strictly lower +*> triangular part of A is not referenced. If UPLO = 'L', the +*> leading N-by-N lower triangular part of A contains the lower +*> triangular part of the matrix A, and the strictly upper +*> triangular part of A is not referenced. +*> +*> On exit, if INFO = 0, the factor U or L from the Cholesky +*> factorization A = U**T*U or A = L*L**T. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= max(1,N). +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> = 0: successful exit +*> < 0: if INFO = -i, the i-th argument had an illegal value +*> > 0: if INFO = i, the leading minor of order i is not +*> positive definite, and the factorization could not be +*> completed. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \ingroup doublePOcomputational +* +* ===================================================================== + SUBROUTINE DPOTRF2( UPLO, N, A, LDA, INFO ) +* +* -- LAPACK computational routine -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + CHARACTER UPLO + INTEGER INFO, LDA, N +* .. +* .. Array Arguments .. + DOUBLE PRECISION A( LDA, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + DOUBLE PRECISION ONE, ZERO + PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) +* .. +* .. Local Scalars .. + LOGICAL UPPER + INTEGER N1, N2, IINFO +* .. +* .. External Functions .. + LOGICAL LSAME, DISNAN + EXTERNAL LSAME, DISNAN +* .. +* .. External Subroutines .. + EXTERNAL DSYRK, DTRSM, XERBLA +* .. +* .. Intrinsic Functions .. + INTRINSIC MAX, SQRT +* .. +* .. Executable Statements .. +* +* Test the input parameters +* + INFO = 0 + UPPER = LSAME( UPLO, 'U' ) + IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN + INFO = -1 + ELSE IF( N.LT.0 ) THEN + INFO = -2 + ELSE IF( LDA.LT.MAX( 1, N ) ) THEN + INFO = -4 + END IF + IF( INFO.NE.0 ) THEN + CALL XERBLA( 'DPOTRF2', -INFO ) + RETURN + END IF +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* +* N=1 case +* + IF( N.EQ.1 ) THEN +* +* Test for non-positive-definiteness +* + IF( A( 1, 1 ).LE.ZERO.OR.DISNAN( A( 1, 1 ) ) ) THEN + INFO = 1 + RETURN + END IF +* +* Factor +* + A( 1, 1 ) = SQRT( A( 1, 1 ) ) +* +* Use recursive code +* + ELSE + N1 = N/2 + N2 = N-N1 +* +* Factor A11 +* + CALL DPOTRF2( UPLO, N1, A( 1, 1 ), LDA, IINFO ) + IF ( IINFO.NE.0 ) THEN + INFO = IINFO + RETURN + END IF +* +* Compute the Cholesky factorization A = U**T*U +* + IF( UPPER ) THEN +* +* Update and scale A12 +* + CALL DTRSM( 'L', 'U', 'T', 'N', N1, N2, ONE, + $ A( 1, 1 ), LDA, A( 1, N1+1 ), LDA ) +* +* Update and factor A22 +* + CALL DSYRK( UPLO, 'T', N2, N1, -ONE, A( 1, N1+1 ), LDA, + $ ONE, A( N1+1, N1+1 ), LDA ) + CALL DPOTRF2( UPLO, N2, A( N1+1, N1+1 ), LDA, IINFO ) + IF ( IINFO.NE.0 ) THEN + INFO = IINFO + N1 + RETURN + END IF +* +* Compute the Cholesky factorization A = L*L**T +* + ELSE +* +* Update and scale A21 +* + CALL DTRSM( 'R', 'L', 'T', 'N', N2, N1, ONE, + $ A( 1, 1 ), LDA, A( N1+1, 1 ), LDA ) +* +* Update and factor A22 +* + CALL DSYRK( UPLO, 'N', N2, N1, -ONE, A( N1+1, 1 ), LDA, + $ ONE, A( N1+1, N1+1 ), LDA ) + CALL DPOTRF2( UPLO, N2, A( N1+1, N1+1 ), LDA, IINFO ) + IF ( IINFO.NE.0 ) THEN + INFO = IINFO + N1 + RETURN + END IF + END IF + END IF + RETURN +* +* End of DPOTRF2 +* + END diff --git a/lib/linalg/static/lsame.cpp b/lib/linalg/static/lsame.cpp new file mode 100644 index 0000000000..dcb89e3d00 --- /dev/null +++ b/lib/linalg/static/lsame.cpp @@ -0,0 +1,17 @@ + +#include + +extern "C" { + +#include "lmp_f2c.h" + +logical lsame_(const char *a, const char *b) +{ + char ua, ub; + if (!a || !b) return FALSE_; + + ua = toupper(*a); + ub = toupper(*b); + return (ua == ub) ? TRUE_ : FALSE_; +} +} diff --git a/lib/linalg/static/xerbla.cpp b/lib/linalg/static/xerbla.cpp new file mode 100644 index 0000000000..cf2f7b1c69 --- /dev/null +++ b/lib/linalg/static/xerbla.cpp @@ -0,0 +1,30 @@ + +#include +#include + +class LinalgException : public std::exception { + std::string message; + + public: + LinalgException() = delete; + + explicit LinalgException(const std::string &msg) { message = msg; } + const char *what() const noexcept override { return message.c_str(); } +}; + +extern "C" { + +#include "lmp_f2c.h" + +integer xerbla_(const char *srname, integer *info) +{ + std::string mesg = " ** On entry to "; + for (int i = 0; i < 1024; ++i) { + if ((srname[i] == '\0') || (srname[i] == ' ')) break; + mesg.push_back(srname[i]); + } + mesg += " parameter number " + std::to_string(*info) + " had an illegal value\n"; + throw LinalgException(mesg); + return 0; +} +} diff --git a/lib/linalg/static/zlarft.f b/lib/linalg/static/zlarft.f new file mode 100644 index 0000000000..b59ba93213 --- /dev/null +++ b/lib/linalg/static/zlarft.f @@ -0,0 +1,328 @@ +*> \brief \b ZLARFT forms the triangular factor T of a block reflector H = I - vtvH +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLARFT + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) +* +* .. Scalar Arguments .. +* CHARACTER DIRECT, STOREV +* INTEGER K, LDT, LDV, N +* .. +* .. Array Arguments .. +* COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLARFT forms the triangular factor T of a complex block reflector H +*> of order n, which is defined as a product of k elementary reflectors. +*> +*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; +*> +*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. +*> +*> If STOREV = 'C', the vector which defines the elementary reflector +*> H(i) is stored in the i-th column of the array V, and +*> +*> H = I - V * T * V**H +*> +*> If STOREV = 'R', the vector which defines the elementary reflector +*> H(i) is stored in the i-th row of the array V, and +*> +*> H = I - V**H * T * V +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] DIRECT +*> \verbatim +*> DIRECT is CHARACTER*1 +*> Specifies the order in which the elementary reflectors are +*> multiplied to form the block reflector: +*> = 'F': H = H(1) H(2) . . . H(k) (Forward) +*> = 'B': H = H(k) . . . H(2) H(1) (Backward) +*> \endverbatim +*> +*> \param[in] STOREV +*> \verbatim +*> STOREV is CHARACTER*1 +*> Specifies how the vectors which define the elementary +*> reflectors are stored (see also Further Details): +*> = 'C': columnwise +*> = 'R': rowwise +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the block reflector H. N >= 0. +*> \endverbatim +*> +*> \param[in] K +*> \verbatim +*> K is INTEGER +*> The order of the triangular factor T (= the number of +*> elementary reflectors). K >= 1. +*> \endverbatim +*> +*> \param[in] V +*> \verbatim +*> V is COMPLEX*16 array, dimension +*> (LDV,K) if STOREV = 'C' +*> (LDV,N) if STOREV = 'R' +*> The matrix V. See further details. +*> \endverbatim +*> +*> \param[in] LDV +*> \verbatim +*> LDV is INTEGER +*> The leading dimension of the array V. +*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. +*> \endverbatim +*> +*> \param[in] TAU +*> \verbatim +*> TAU is COMPLEX*16 array, dimension (K) +*> TAU(i) must contain the scalar factor of the elementary +*> reflector H(i). +*> \endverbatim +*> +*> \param[out] T +*> \verbatim +*> T is COMPLEX*16 array, dimension (LDT,K) +*> The k by k triangular factor T of the block reflector. +*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is +*> lower triangular. The rest of the array is not used. +*> \endverbatim +*> +*> \param[in] LDT +*> \verbatim +*> LDT is INTEGER +*> The leading dimension of the array T. LDT >= K. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \ingroup complex16OTHERauxiliary +* +*> \par Further Details: +* ===================== +*> +*> \verbatim +*> +*> The shape of the matrix V and the storage of the vectors which define +*> the H(i) is best illustrated by the following example with n = 5 and +*> k = 3. The elements equal to 1 are not stored. +*> +*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': +*> +*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) +*> ( v1 1 ) ( 1 v2 v2 v2 ) +*> ( v1 v2 1 ) ( 1 v3 v3 ) +*> ( v1 v2 v3 ) +*> ( v1 v2 v3 ) +*> +*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': +*> +*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) +*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) +*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) +*> ( 1 v3 ) +*> ( 1 ) +*> \endverbatim +*> +* ===================================================================== + SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) +* +* -- LAPACK auxiliary routine -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* +* .. Scalar Arguments .. + CHARACTER DIRECT, STOREV + INTEGER K, LDT, LDV, N +* .. +* .. Array Arguments .. + COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) +* .. +* +* ===================================================================== +* +* .. Parameters .. + COMPLEX*16 ONE, ZERO + PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), + $ ZERO = ( 0.0D+0, 0.0D+0 ) ) +* .. +* .. Local Scalars .. + INTEGER I, J, PREVLASTV, LASTV +* .. +* .. External Subroutines .. + EXTERNAL ZGEMV, ZTRMV, ZGEMM +* .. +* .. External Functions .. + LOGICAL LSAME + EXTERNAL LSAME +* .. +* .. Executable Statements .. +* +* Quick return if possible +* + IF( N.EQ.0 ) + $ RETURN +* + IF( LSAME( DIRECT, 'F' ) ) THEN + PREVLASTV = N + DO I = 1, K + PREVLASTV = MAX( PREVLASTV, I ) + IF( TAU( I ).EQ.ZERO ) THEN +* +* H(i) = I +* + DO J = 1, I + T( J, I ) = ZERO + END DO + ELSE +* +* general case +* + IF( LSAME( STOREV, 'C' ) ) THEN +* Skip any trailing zeros. + DO LASTV = N, I+1, -1 + IF( V( LASTV, I ).NE.ZERO ) GOTO 220 + END DO + 220 CONTINUE + DO J = 1, I-1 + T( J, I ) = -TAU( I ) * CONJG( V( I , J ) ) + END DO + J = MIN( LASTV, PREVLASTV ) +* +* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) +* + CALL ZGEMV( 'Conjugate transpose', J-I, I-1, + $ -TAU( I ), V( I+1, 1 ), LDV, + $ V( I+1, I ), 1, ONE, T( 1, I ), 1 ) + ELSE +* Skip any trailing zeros. + DO LASTV = N, I+1, -1 + IF( V( I, LASTV ).NE.ZERO ) GOTO 236 + END DO + 236 CONTINUE + DO J = 1, I-1 + T( J, I ) = -TAU( I ) * V( J , I ) + END DO + J = MIN( LASTV, PREVLASTV ) +* +* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H +* + CALL ZGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ), + $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, + $ ONE, T( 1, I ), LDT ) + END IF +* +* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) +* + CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, + $ LDT, T( 1, I ), 1 ) + T( I, I ) = TAU( I ) + IF( I.GT.1 ) THEN + PREVLASTV = MAX( PREVLASTV, LASTV ) + ELSE + PREVLASTV = LASTV + END IF + END IF + END DO + ELSE + PREVLASTV = 1 + DO I = K, 1, -1 + IF( TAU( I ).EQ.ZERO ) THEN +* +* H(i) = I +* + DO J = I, K + T( J, I ) = ZERO + END DO + ELSE +* +* general case +* + IF( I.LT.K ) THEN + IF( LSAME( STOREV, 'C' ) ) THEN +* Skip any leading zeros. + DO LASTV = 1, I-1 + IF( V( LASTV, I ).NE.ZERO ) GOTO 281 + END DO + 281 CONTINUE + DO J = I+1, K + T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) ) + END DO + J = MAX( LASTV, PREVLASTV ) +* +* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) +* + CALL ZGEMV( 'Conjugate transpose', N-K+I-J, K-I, + $ -TAU( I ), V( J, I+1 ), LDV, V( J, I ), + $ 1, ONE, T( I+1, I ), 1 ) + ELSE +* Skip any leading zeros. + DO LASTV = 1, I-1 + IF( V( I, LASTV ).NE.ZERO ) GOTO 297 + END DO + 297 CONTINUE + DO J = I+1, K + T( J, I ) = -TAU( I ) * V( J, N-K+I ) + END DO + J = MAX( LASTV, PREVLASTV ) +* +* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H +* + CALL ZGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ), + $ V( I+1, J ), LDV, V( I, J ), LDV, + $ ONE, T( I+1, I ), LDT ) + END IF +* +* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) +* + CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, + $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) + IF( I.GT.1 ) THEN + PREVLASTV = MIN( PREVLASTV, LASTV ) + ELSE + PREVLASTV = LASTV + END IF + END IF + T( I, I ) = TAU( I ) + END IF + END DO + END IF + RETURN +* +* End of ZLARFT +* + END diff --git a/lib/linalg/xerbla.cpp b/lib/linalg/xerbla.cpp new file mode 100644 index 0000000000..cf2f7b1c69 --- /dev/null +++ b/lib/linalg/xerbla.cpp @@ -0,0 +1,30 @@ + +#include +#include + +class LinalgException : public std::exception { + std::string message; + + public: + LinalgException() = delete; + + explicit LinalgException(const std::string &msg) { message = msg; } + const char *what() const noexcept override { return message.c_str(); } +}; + +extern "C" { + +#include "lmp_f2c.h" + +integer xerbla_(const char *srname, integer *info) +{ + std::string mesg = " ** On entry to "; + for (int i = 0; i < 1024; ++i) { + if ((srname[i] == '\0') || (srname[i] == ' ')) break; + mesg.push_back(srname[i]); + } + mesg += " parameter number " + std::to_string(*info) + " had an illegal value\n"; + throw LinalgException(mesg); + return 0; +} +} diff --git a/lib/linalg/zaxpy.cpp b/lib/linalg/zaxpy.cpp new file mode 100644 index 0000000000..2788743a40 --- /dev/null +++ b/lib/linalg/zaxpy.cpp @@ -0,0 +1,191 @@ +/* fortran/zaxpy.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZAXPY */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZAXPY(N,ZA,ZX,INCX,ZY,INCY) */ + +/* .. Scalar Arguments .. */ +/* COMPLEX*16 ZA */ +/* INTEGER INCX,INCY,N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 ZX(*),ZY(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZAXPY constant times a vector plus a vector. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ZA */ +/* > \verbatim */ +/* > ZA is COMPLEX*16 */ +/* > On entry, ZA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ZX */ +/* > \verbatim */ +/* > ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of ZX */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] ZY */ +/* > \verbatim */ +/* > ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > storage spacing between elements of ZY */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, 3/11/78. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zaxpy_(integer *n, doublecomplex *za, doublecomplex *zx, + integer *incx, doublecomplex *zy, integer *incy) +{ + /* System generated locals */ + integer i__1, i__2, i__3, i__4; + doublecomplex z__1, z__2; + + /* Local variables */ + integer i__, ix, iy; + extern doublereal dcabs1_(doublecomplex *); + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ + /* Parameter adjustments */ + --zy; + --zx; + + /* Function Body */ + if (*n <= 0) { + return 0; + } + if (dcabs1_(za) == 0.) { + return 0; + } + if (*incx == 1 && *incy == 1) { + +/* code for both increments equal to 1 */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + i__4 = i__; + z__2.r = za->r * zx[i__4].r - za->i * zx[i__4].i, z__2.i = za->r * + zx[i__4].i + za->i * zx[i__4].r; + z__1.r = zy[i__3].r + z__2.r, z__1.i = zy[i__3].i + z__2.i; + zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; + } + } else { + +/* code for unequal increments or equal increments */ +/* not equal to 1 */ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + i__3 = iy; + i__4 = ix; + z__2.r = za->r * zx[i__4].r - za->i * zx[i__4].i, z__2.i = za->r * + zx[i__4].i + za->i * zx[i__4].r; + z__1.r = zy[i__3].r + z__2.r, z__1.i = zy[i__3].i + z__2.i; + zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; + ix += *incx; + iy += *incy; + } + } + + return 0; + +/* End of ZAXPY */ + +} /* zaxpy_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zcopy.cpp b/lib/linalg/zcopy.cpp new file mode 100644 index 0000000000..357bd961a0 --- /dev/null +++ b/lib/linalg/zcopy.cpp @@ -0,0 +1,168 @@ +/* fortran/zcopy.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZCOPY */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZCOPY(N,ZX,INCX,ZY,INCY) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,INCY,N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 ZX(*),ZY(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZCOPY copies a vector, x, to a vector, y. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ZX */ +/* > \verbatim */ +/* > ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of ZX */ +/* > \endverbatim */ +/* > */ +/* > \param[out] ZY */ +/* > \verbatim */ +/* > ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > storage spacing between elements of ZY */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, linpack, 4/11/78. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zcopy_(integer *n, doublecomplex *zx, integer *incx, + doublecomplex *zy, integer *incy) +{ + /* System generated locals */ + integer i__1, i__2, i__3; + + /* Local variables */ + integer i__, ix, iy; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ + /* Parameter adjustments */ + --zy; + --zx; + + /* Function Body */ + if (*n <= 0) { + return 0; + } + if (*incx == 1 && *incy == 1) { + +/* code for both increments equal to 1 */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + zy[i__2].r = zx[i__3].r, zy[i__2].i = zx[i__3].i; + } + } else { + +/* code for unequal increments or equal increments */ +/* not equal to 1 */ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + i__3 = ix; + zy[i__2].r = zx[i__3].r, zy[i__2].i = zx[i__3].i; + ix += *incx; + iy += *incy; + } + } + return 0; + +/* End of ZCOPY */ + +} /* zcopy_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zdotc.cpp b/lib/linalg/zdotc.cpp new file mode 100644 index 0000000000..943f923bea --- /dev/null +++ b/lib/linalg/zdotc.cpp @@ -0,0 +1,186 @@ +/* fortran/zdotc.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZDOTC */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* COMPLEX*16 FUNCTION ZDOTC(N,ZX,INCX,ZY,INCY) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,INCY,N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 ZX(*),ZY(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZDOTC forms the dot product of two complex vectors */ +/* > ZDOTC = X^H * Y */ +/* > */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ZX */ +/* > \verbatim */ +/* > ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of ZX */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ZY */ +/* > \verbatim */ +/* > ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > storage spacing between elements of ZY */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, 3/11/78. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Double Complex */ VOID zdotc_(doublecomplex * ret_val, integer *n, + doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy) +{ + /* System generated locals */ + integer i__1, i__2; + doublecomplex z__1, z__2, z__3; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, ix, iy; + doublecomplex ztemp; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + /* Parameter adjustments */ + --zy; + --zx; + + /* Function Body */ + ztemp.r = 0., ztemp.i = 0.; + ret_val->r = 0., ret_val->i = 0.; + if (*n <= 0) { + return ; + } + if (*incx == 1 && *incy == 1) { + +/* code for both increments equal to 1 */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + d_cnjg(&z__3, &zx[i__]); + i__2 = i__; + z__2.r = z__3.r * zy[i__2].r - z__3.i * zy[i__2].i, z__2.i = + z__3.r * zy[i__2].i + z__3.i * zy[i__2].r; + z__1.r = ztemp.r + z__2.r, z__1.i = ztemp.i + z__2.i; + ztemp.r = z__1.r, ztemp.i = z__1.i; + } + } else { + +/* code for unequal increments or equal increments */ +/* not equal to 1 */ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + d_cnjg(&z__3, &zx[ix]); + i__2 = iy; + z__2.r = z__3.r * zy[i__2].r - z__3.i * zy[i__2].i, z__2.i = + z__3.r * zy[i__2].i + z__3.i * zy[i__2].r; + z__1.r = ztemp.r + z__2.r, z__1.i = ztemp.i + z__2.i; + ztemp.r = z__1.r, ztemp.i = z__1.i; + ix += *incx; + iy += *incy; + } + } + ret_val->r = ztemp.r, ret_val->i = ztemp.i; + return ; + +/* End of ZDOTC */ + +} /* zdotc_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zdrot.cpp b/lib/linalg/zdrot.cpp new file mode 100644 index 0000000000..c6ec16b053 --- /dev/null +++ b/lib/linalg/zdrot.cpp @@ -0,0 +1,213 @@ +/* fortran/zdrot.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZDROT */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZDROT( N, ZX, INCX, ZY, INCY, C, S ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX, INCY, N */ +/* DOUBLE PRECISION C, S */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 ZX( * ), ZY( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Applies a plane rotation, where the cos and sin (c and s) are real */ +/* > and the vectors cx and cy are complex. */ +/* > jack dongarra, linpack, 3/11/78. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the vectors cx and cy. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] ZX */ +/* > \verbatim */ +/* > ZX is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( N - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array ZX must contain the n */ +/* > element vector cx. On exit, ZX is overwritten by the updated */ +/* > vector cx. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > ZX. INCX must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] ZY */ +/* > \verbatim */ +/* > ZY is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( N - 1 )*abs( INCY ) ). */ +/* > Before entry, the incremented array ZY must contain the n */ +/* > element vector cy. On exit, ZY is overwritten by the updated */ +/* > vector cy. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > On entry, INCY specifies the increment for the elements of */ +/* > ZY. INCY must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION */ +/* > On entry, C specifies the cosine, cos. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION */ +/* > On entry, S specifies the sine, sin. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level1 */ + +/* ===================================================================== */ +/* Subroutine */ int zdrot_(integer *n, doublecomplex *zx, integer *incx, + doublecomplex *zy, integer *incy, doublereal *c__, doublereal *s) +{ + /* System generated locals */ + integer i__1, i__2, i__3, i__4; + doublecomplex z__1, z__2, z__3; + + /* Local variables */ + integer i__, ix, iy; + doublecomplex ctemp; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --zy; + --zx; + + /* Function Body */ + if (*n <= 0) { + return 0; + } + if (*incx == 1 && *incy == 1) { + +/* code for both increments equal to 1 */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + z__2.r = *c__ * zx[i__2].r, z__2.i = *c__ * zx[i__2].i; + i__3 = i__; + z__3.r = *s * zy[i__3].r, z__3.i = *s * zy[i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + ctemp.r = z__1.r, ctemp.i = z__1.i; + i__2 = i__; + i__3 = i__; + z__2.r = *c__ * zy[i__3].r, z__2.i = *c__ * zy[i__3].i; + i__4 = i__; + z__3.r = *s * zx[i__4].r, z__3.i = *s * zx[i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; + zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; + i__2 = i__; + zx[i__2].r = ctemp.r, zx[i__2].i = ctemp.i; + } + } else { + +/* code for unequal increments or equal increments not equal */ +/* to 1 */ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ix; + z__2.r = *c__ * zx[i__2].r, z__2.i = *c__ * zx[i__2].i; + i__3 = iy; + z__3.r = *s * zy[i__3].r, z__3.i = *s * zy[i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + ctemp.r = z__1.r, ctemp.i = z__1.i; + i__2 = iy; + i__3 = iy; + z__2.r = *c__ * zy[i__3].r, z__2.i = *c__ * zy[i__3].i; + i__4 = ix; + z__3.r = *s * zx[i__4].r, z__3.i = *s * zx[i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; + zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; + i__2 = ix; + zx[i__2].r = ctemp.r, zx[i__2].i = ctemp.i; + ix += *incx; + iy += *incy; + } + } + return 0; + +/* End of ZDROT */ + +} /* zdrot_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zdscal.cpp b/lib/linalg/zdscal.cpp new file mode 100644 index 0000000000..c7c6406782 --- /dev/null +++ b/lib/linalg/zdscal.cpp @@ -0,0 +1,169 @@ +/* fortran/zdscal.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZDSCAL */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZDSCAL(N,DA,ZX,INCX) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION DA */ +/* INTEGER INCX,N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 ZX(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZDSCAL scales a vector by a constant. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DA */ +/* > \verbatim */ +/* > DA is DOUBLE PRECISION */ +/* > On entry, DA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] ZX */ +/* > \verbatim */ +/* > ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of ZX */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, 3/11/78. */ +/* > modified 3/93 to return if incx .le. 0. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zdscal_(integer *n, doublereal *da, doublecomplex *zx, + integer *incx) +{ + /* System generated locals */ + integer i__1, i__2, i__3, i__4; + doublereal d__1, d__2; + doublecomplex z__1; + + /* Builtin functions */ + double d_imag(doublecomplex *); + + /* Local variables */ + integer i__, nincx; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. Parameters .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + /* Parameter adjustments */ + --zx; + + /* Function Body */ + if (*n <= 0 || *incx <= 0 || *da == 1.) { + return 0; + } + if (*incx == 1) { + +/* code for increment equal to 1 */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + d__1 = *da * zx[i__3].r; + d__2 = *da * d_imag(&zx[i__]); + z__1.r = d__1, z__1.i = d__2; + zx[i__2].r = z__1.r, zx[i__2].i = z__1.i; + } + } else { + +/* code for increment not equal to 1 */ + + nincx = *n * *incx; + i__1 = nincx; + i__2 = *incx; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__3 = i__; + i__4 = i__; + d__1 = *da * zx[i__4].r; + d__2 = *da * d_imag(&zx[i__]); + z__1.r = d__1, z__1.i = d__2; + zx[i__3].r = z__1.r, zx[i__3].i = z__1.i; + } + } + return 0; + +/* End of ZDSCAL */ + +} /* zdscal_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zgemm.cpp b/lib/linalg/zgemm.cpp new file mode 100644 index 0000000000..92434e720f --- /dev/null +++ b/lib/linalg/zgemm.cpp @@ -0,0 +1,763 @@ +/* fortran/zgemm.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZGEMM */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) */ + +/* .. Scalar Arguments .. */ +/* COMPLEX*16 ALPHA,BETA */ +/* INTEGER K,LDA,LDB,LDC,M,N */ +/* CHARACTER TRANSA,TRANSB */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZGEMM performs one of the matrix-matrix operations */ +/* > */ +/* > C := alpha*op( A )*op( B ) + beta*C, */ +/* > */ +/* > where op( X ) is one of */ +/* > */ +/* > op( X ) = X or op( X ) = X**T or op( X ) = X**H, */ +/* > */ +/* > alpha and beta are scalars, and A, B and C are matrices, with op( A ) */ +/* > an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] TRANSA */ +/* > \verbatim */ +/* > TRANSA is CHARACTER*1 */ +/* > On entry, TRANSA specifies the form of op( A ) to be used in */ +/* > the matrix multiplication as follows: */ +/* > */ +/* > TRANSA = 'N' or 'n', op( A ) = A. */ +/* > */ +/* > TRANSA = 'T' or 't', op( A ) = A**T. */ +/* > */ +/* > TRANSA = 'C' or 'c', op( A ) = A**H. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANSB */ +/* > \verbatim */ +/* > TRANSB is CHARACTER*1 */ +/* > On entry, TRANSB specifies the form of op( B ) to be used in */ +/* > the matrix multiplication as follows: */ +/* > */ +/* > TRANSB = 'N' or 'n', op( B ) = B. */ +/* > */ +/* > TRANSB = 'T' or 't', op( B ) = B**T. */ +/* > */ +/* > TRANSB = 'C' or 'c', op( B ) = B**H. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > On entry, M specifies the number of rows of the matrix */ +/* > op( A ) and of the matrix C. M must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the number of columns of the matrix */ +/* > op( B ) and the number of columns of the matrix C. N must be */ +/* > at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > On entry, K specifies the number of columns of the matrix */ +/* > op( A ) and the number of rows of the matrix op( B ). K must */ +/* > be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is COMPLEX*16 */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension ( LDA, ka ), where ka is */ +/* > k when TRANSA = 'N' or 'n', and is m otherwise. */ +/* > Before entry with TRANSA = 'N' or 'n', the leading m by k */ +/* > part of the array A must contain the matrix A, otherwise */ +/* > the leading k by m part of the array A must contain the */ +/* > matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. When TRANSA = 'N' or 'n' then */ +/* > LDA must be at least max( 1, m ), otherwise LDA must be at */ +/* > least max( 1, k ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] B */ +/* > \verbatim */ +/* > B is COMPLEX*16 array, dimension ( LDB, kb ), where kb is */ +/* > n when TRANSB = 'N' or 'n', and is k otherwise. */ +/* > Before entry with TRANSB = 'N' or 'n', the leading k by n */ +/* > part of the array B must contain the matrix B, otherwise */ +/* > the leading n by k part of the array B must contain the */ +/* > matrix B. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > On entry, LDB specifies the first dimension of B as declared */ +/* > in the calling (sub) program. When TRANSB = 'N' or 'n' then */ +/* > LDB must be at least max( 1, k ), otherwise LDB must be at */ +/* > least max( 1, n ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is COMPLEX*16 */ +/* > On entry, BETA specifies the scalar beta. When BETA is */ +/* > supplied as zero then C need not be set on input. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is COMPLEX*16 array, dimension ( LDC, N ) */ +/* > Before entry, the leading m by n part of the array C must */ +/* > contain the matrix C, except when beta is zero, in which */ +/* > case C need not be set on entry. */ +/* > On exit, the array C is overwritten by the m by n matrix */ +/* > ( alpha*op( A )*op( B ) + beta*C ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > On entry, LDC specifies the first dimension of C as declared */ +/* > in the calling (sub) program. LDC must be at least */ +/* > max( 1, m ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level3 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 3 Blas routine. */ +/* > */ +/* > -- Written on 8-February-1989. */ +/* > Jack Dongarra, Argonne National Laboratory. */ +/* > Iain Duff, AERE Harwell. */ +/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ +/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zgemm_(char *transa, char *transb, integer *m, integer * + n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, + doublecomplex *b, integer *ldb, doublecomplex *beta, doublecomplex * + c__, integer *ldc, ftnlen transa_len, ftnlen transb_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3, i__4, i__5, i__6; + doublecomplex z__1, z__2, z__3, z__4; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, l, info; + logical nota, notb; + doublecomplex temp; + logical conja, conjb; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nrowa, nrowb; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level3 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Parameters .. */ +/* .. */ + +/* Set NOTA and NOTB as true if A and B respectively are not */ +/* conjugated or transposed, set CONJA and CONJB as true if A and */ +/* B respectively are to be transposed but not conjugated and set */ +/* NROWA and NROWB as the number of rows of A and B respectively. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + nota = lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1); + notb = lsame_(transb, (char *)"N", (ftnlen)1, (ftnlen)1); + conja = lsame_(transa, (char *)"C", (ftnlen)1, (ftnlen)1); + conjb = lsame_(transb, (char *)"C", (ftnlen)1, (ftnlen)1); + if (nota) { + nrowa = *m; + } else { + nrowa = *k; + } + if (notb) { + nrowb = *k; + } else { + nrowb = *n; + } + +/* Test the input parameters. */ + + info = 0; + if (! nota && ! conja && ! lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! notb && ! conjb && ! lsame_(transb, (char *)"T", (ftnlen)1, (ftnlen) + 1)) { + info = 2; + } else if (*m < 0) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*k < 0) { + info = 5; + } else if (*lda < max(1,nrowa)) { + info = 8; + } else if (*ldb < max(1,nrowb)) { + info = 10; + } else if (*ldc < max(1,*m)) { + info = 13; + } + if (info != 0) { + xerbla_((char *)"ZGEMM ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || (alpha->r == 0. && alpha->i == 0. || *k == 0) && + (beta->r == 1. && beta->i == 0.)) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (alpha->r == 0. && alpha->i == 0.) { + if (beta->r == 0. && beta->i == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__1.i = beta->r * c__[i__4].i + beta->i * c__[ + i__4].r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L30: */ + } +/* L40: */ + } + } + return 0; + } + +/* Start the operations. */ + + if (notb) { + if (nota) { + +/* Form C := alpha*A*B + beta*C. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (beta->r == 0. && beta->i == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; +/* L50: */ + } + } else if (beta->r != 1. || beta->i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__1.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L60: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + i__3 = l + j * b_dim1; + z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, + z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3] + .r; + temp.r = z__1.r, temp.i = z__1.i; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + l * a_dim1; + z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, + z__2.i = temp.r * a[i__6].i + temp.i * a[i__6] + .r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + + z__2.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; +/* L70: */ + } +/* L80: */ + } +/* L90: */ + } + } else if (conja) { + +/* Form C := alpha*A**H*B + beta*C. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + d_cnjg(&z__3, &a[l + i__ * a_dim1]); + i__4 = l + j * b_dim1; + z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] + .r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L100: */ + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * + temp.r; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__3.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } +/* L110: */ + } +/* L120: */ + } + } else { + +/* Form C := alpha*A**T*B + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + i__4 = l + i__ * a_dim1; + i__5 = l + j * b_dim1; + z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * b[i__5] + .i, z__2.i = a[i__4].r * b[i__5].i + a[i__4] + .i * b[i__5].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L130: */ + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * + temp.r; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__3.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } +/* L140: */ + } +/* L150: */ + } + } + } else if (nota) { + if (conjb) { + +/* Form C := alpha*A*B**H + beta*C. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (beta->r == 0. && beta->i == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; +/* L160: */ + } + } else if (beta->r != 1. || beta->i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__1.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L170: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + d_cnjg(&z__2, &b[j + l * b_dim1]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + l * a_dim1; + z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, + z__2.i = temp.r * a[i__6].i + temp.i * a[i__6] + .r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + + z__2.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; +/* L180: */ + } +/* L190: */ + } +/* L200: */ + } + } else { + +/* Form C := alpha*A*B**T + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (beta->r == 0. && beta->i == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; +/* L210: */ + } + } else if (beta->r != 1. || beta->i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__1.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L220: */ + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + i__3 = j + l * b_dim1; + z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, + z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3] + .r; + temp.r = z__1.r, temp.i = z__1.i; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + l * a_dim1; + z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, + z__2.i = temp.r * a[i__6].i + temp.i * a[i__6] + .r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + + z__2.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; +/* L230: */ + } +/* L240: */ + } +/* L250: */ + } + } + } else if (conja) { + if (conjb) { + +/* Form C := alpha*A**H*B**H + beta*C. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + d_cnjg(&z__3, &a[l + i__ * a_dim1]); + d_cnjg(&z__4, &b[j + l * b_dim1]); + z__2.r = z__3.r * z__4.r - z__3.i * z__4.i, z__2.i = + z__3.r * z__4.i + z__3.i * z__4.r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L260: */ + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * + temp.r; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__3.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } +/* L270: */ + } +/* L280: */ + } + } else { + +/* Form C := alpha*A**H*B**T + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + d_cnjg(&z__3, &a[l + i__ * a_dim1]); + i__4 = j + l * b_dim1; + z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] + .r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L290: */ + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * + temp.r; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__3.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } +/* L300: */ + } +/* L310: */ + } + } + } else { + if (conjb) { + +/* Form C := alpha*A**T*B**H + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + i__4 = l + i__ * a_dim1; + d_cnjg(&z__3, &b[j + l * b_dim1]); + z__2.r = a[i__4].r * z__3.r - a[i__4].i * z__3.i, + z__2.i = a[i__4].r * z__3.i + a[i__4].i * + z__3.r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L320: */ + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * + temp.r; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__3.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } +/* L330: */ + } +/* L340: */ + } + } else { + +/* Form C := alpha*A**T*B**T + beta*C */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + i__4 = l + i__ * a_dim1; + i__5 = j + l * b_dim1; + z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * b[i__5] + .i, z__2.i = a[i__4].r * b[i__5].i + a[i__4] + .i * b[i__5].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L350: */ + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * + temp.r; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__3.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } +/* L360: */ + } +/* L370: */ + } + } + } + + return 0; + +/* End of ZGEMM */ + +} /* zgemm_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zgemv.cpp b/lib/linalg/zgemv.cpp new file mode 100644 index 0000000000..9524445dba --- /dev/null +++ b/lib/linalg/zgemv.cpp @@ -0,0 +1,477 @@ +/* fortran/zgemv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZGEMV */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) */ + +/* .. Scalar Arguments .. */ +/* COMPLEX*16 ALPHA,BETA */ +/* INTEGER INCX,INCY,LDA,M,N */ +/* CHARACTER TRANS */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A(LDA,*),X(*),Y(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZGEMV performs one of the matrix-vector operations */ +/* > */ +/* > y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y, or */ +/* > */ +/* > y := alpha*A**H*x + beta*y, */ +/* > */ +/* > where alpha and beta are scalars, x and y are vectors and A is an */ +/* > m by n matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > On entry, TRANS specifies the operation to be performed as */ +/* > follows: */ +/* > */ +/* > TRANS = 'N' or 'n' y := alpha*A*x + beta*y. */ +/* > */ +/* > TRANS = 'T' or 't' y := alpha*A**T*x + beta*y. */ +/* > */ +/* > TRANS = 'C' or 'c' y := alpha*A**H*x + beta*y. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > On entry, M specifies the number of rows of the matrix A. */ +/* > M must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the number of columns of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is COMPLEX*16 */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension ( LDA, N ) */ +/* > Before entry, the leading m by n part of the array A must */ +/* > contain the matrix of coefficients. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. LDA must be at least */ +/* > max( 1, m ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' */ +/* > and at least */ +/* > ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. */ +/* > Before entry, the incremented array X must contain the */ +/* > vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is COMPLEX*16 */ +/* > On entry, BETA specifies the scalar beta. When BETA is */ +/* > supplied as zero then Y need not be set on input. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Y */ +/* > \verbatim */ +/* > Y is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' */ +/* > and at least */ +/* > ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. */ +/* > Before entry with BETA non-zero, the incremented array Y */ +/* > must contain the vector y. On exit, Y is overwritten by the */ +/* > updated vector y. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > On entry, INCY specifies the increment for the elements of */ +/* > Y. INCY must not be zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zgemv_(char *trans, integer *m, integer *n, + doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * + x, integer *incx, doublecomplex *beta, doublecomplex *y, integer * + incy, ftnlen trans_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1, z__2, z__3; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, ix, iy, jx, jy, kx, ky, info; + doublecomplex temp; + integer lenx, leny; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + logical noconj; + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + --y; + + /* Function Body */ + info = 0; + if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"T", ( + ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1) + ) { + info = 1; + } else if (*m < 0) { + info = 2; + } else if (*n < 0) { + info = 3; + } else if (*lda < max(1,*m)) { + info = 6; + } else if (*incx == 0) { + info = 8; + } else if (*incy == 0) { + info = 11; + } + if (info != 0) { + xerbla_((char *)"ZGEMV ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || alpha->r == 0. && alpha->i == 0. && (beta->r == + 1. && beta->i == 0.)) { + return 0; + } + + noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); + +/* Set LENX and LENY, the lengths of the vectors x and y, and set */ +/* up the start points in X and Y. */ + + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + lenx = *n; + leny = *m; + } else { + lenx = *m; + leny = *n; + } + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (lenx - 1) * *incx; + } + if (*incy > 0) { + ky = 1; + } else { + ky = 1 - (leny - 1) * *incy; + } + +/* Start the operations. In this version the elements of A are */ +/* accessed sequentially with one pass through A. */ + +/* First form y := beta*y. */ + + if (beta->r != 1. || beta->i != 0.) { + if (*incy == 1) { + if (beta->r == 0. && beta->i == 0.) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + y[i__2].r = 0., y[i__2].i = 0.; +/* L10: */ + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] + .r; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; +/* L20: */ + } + } + } else { + iy = ky; + if (beta->r == 0. && beta->i == 0.) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + y[i__2].r = 0., y[i__2].i = 0.; + iy += *incy; +/* L30: */ + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + i__3 = iy; + z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] + .r; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + iy += *incy; +/* L40: */ + } + } + } + } + if (alpha->r == 0. && alpha->i == 0.) { + return 0; + } + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form y := alpha*A*x + y. */ + + jx = kx; + if (*incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = + alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, z__2.i = + temp.r * a[i__5].i + temp.i * a[i__5].r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; +/* L50: */ + } + jx += *incx; +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = + alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + iy = ky; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = iy; + i__4 = iy; + i__5 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, z__2.i = + temp.r * a[i__5].i + temp.i * a[i__5].r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + iy += *incy; +/* L70: */ + } + jx += *incx; +/* L80: */ + } + } + } else { + +/* Form y := alpha*A**T*x + y or y := alpha*A**H*x + y. */ + + jy = ky; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp.r = 0., temp.i = 0.; + if (noconj) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4] + .i, z__2.i = a[i__3].r * x[i__4].i + a[i__3] + .i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L90: */ + } + } else { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3] + .r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L100: */ + } + } + i__2 = jy; + i__3 = jy; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, z__2.i = + alpha->r * temp.i + alpha->i * temp.r; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + jy += *incy; +/* L110: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp.r = 0., temp.i = 0.; + ix = kx; + if (noconj) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = ix; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4] + .i, z__2.i = a[i__3].r * x[i__4].i + a[i__3] + .i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix += *incx; +/* L120: */ + } + } else { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3] + .r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix += *incx; +/* L130: */ + } + } + i__2 = jy; + i__3 = jy; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, z__2.i = + alpha->r * temp.i + alpha->i * temp.r; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + jy += *incy; +/* L140: */ + } + } + } + + return 0; + +/* End of ZGEMV */ + +} /* zgemv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zgerc.cpp b/lib/linalg/zgerc.cpp new file mode 100644 index 0000000000..db1e60a2eb --- /dev/null +++ b/lib/linalg/zgerc.cpp @@ -0,0 +1,289 @@ +/* fortran/zgerc.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZGERC */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZGERC(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) */ + +/* .. Scalar Arguments .. */ +/* COMPLEX*16 ALPHA */ +/* INTEGER INCX,INCY,LDA,M,N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A(LDA,*),X(*),Y(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZGERC performs the rank 1 operation */ +/* > */ +/* > A := alpha*x*y**H + A, */ +/* > */ +/* > where alpha is a scalar, x is an m element vector, y is an n element */ +/* > vector and A is an m by n matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > On entry, M specifies the number of rows of the matrix A. */ +/* > M must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the number of columns of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is COMPLEX*16 */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( m - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array X must contain the m */ +/* > element vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Y */ +/* > \verbatim */ +/* > Y is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCY ) ). */ +/* > Before entry, the incremented array Y must contain the n */ +/* > element vector y. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > On entry, INCY specifies the increment for the elements of */ +/* > Y. INCY must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension ( LDA, N ) */ +/* > Before entry, the leading m by n part of the array A must */ +/* > contain the matrix of coefficients. On exit, A is */ +/* > overwritten by the updated matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. LDA must be at least */ +/* > max( 1, m ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zgerc_(integer *m, integer *n, doublecomplex *alpha, + doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, + doublecomplex *a, integer *lda) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1, z__2; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, ix, jy, kx, info; + doublecomplex temp; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --x; + --y; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + info = 0; + if (*m < 0) { + info = 1; + } else if (*n < 0) { + info = 2; + } else if (*incx == 0) { + info = 5; + } else if (*incy == 0) { + info = 7; + } else if (*lda < max(1,*m)) { + info = 9; + } + if (info != 0) { + xerbla_((char *)"ZGERC ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0 || alpha->r == 0. && alpha->i == 0.) { + return 0; + } + +/* Start the operations. In this version the elements of A are */ +/* accessed sequentially with one pass through A. */ + + if (*incy > 0) { + jy = 1; + } else { + jy = 1 - (*n - 1) * *incy; + } + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jy; + if (y[i__2].r != 0. || y[i__2].i != 0.) { + d_cnjg(&z__2, &y[jy]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = i__; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, z__2.i = + x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L10: */ + } + } + jy += *incy; +/* L20: */ + } + } else { + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (*m - 1) * *incx; + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jy; + if (y[i__2].r != 0. || y[i__2].i != 0.) { + d_cnjg(&z__2, &y[jy]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + ix = kx; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = ix; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, z__2.i = + x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + ix += *incx; +/* L30: */ + } + } + jy += *incy; +/* L40: */ + } + } + + return 0; + +/* End of ZGERC */ + +} /* zgerc_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zheev.cpp b/lib/linalg/zheev.cpp new file mode 100644 index 0000000000..f421e49090 --- /dev/null +++ b/lib/linalg/zheev.cpp @@ -0,0 +1,379 @@ +/* fortran/zheev.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__0 = 0; +static doublereal c_b18 = 1.; + +/* > \brief ZHEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matr +ices */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZHEEV + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZHEEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, */ +/* INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER JOBZ, UPLO */ +/* INTEGER INFO, LDA, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION RWORK( * ), W( * ) */ +/* COMPLEX*16 A( LDA, * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZHEEV computes all eigenvalues and, optionally, eigenvectors of a */ +/* > complex Hermitian matrix A. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] JOBZ */ +/* > \verbatim */ +/* > JOBZ is CHARACTER*1 */ +/* > = 'N': Compute eigenvalues only; */ +/* > = 'V': Compute eigenvalues and eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A is stored; */ +/* > = 'L': Lower triangle of A is stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA, N) */ +/* > On entry, the Hermitian matrix A. If UPLO = 'U', the */ +/* > leading N-by-N upper triangular part of A contains the */ +/* > upper triangular part of the matrix A. If UPLO = 'L', */ +/* > the leading N-by-N lower triangular part of A contains */ +/* > the lower triangular part of the matrix A. */ +/* > On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ +/* > orthonormal eigenvectors of the matrix A. */ +/* > If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') */ +/* > or the upper triangle (if UPLO='U') of A, including the */ +/* > diagonal, is destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] W */ +/* > \verbatim */ +/* > W is DOUBLE PRECISION array, dimension (N) */ +/* > If INFO = 0, the eigenvalues in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The length of the array WORK. LWORK >= max(1,2*N-1). */ +/* > For optimal efficiency, LWORK >= (NB+1)*N, */ +/* > where NB is the blocksize for ZHETRD returned by ILAENV. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RWORK */ +/* > \verbatim */ +/* > RWORK is DOUBLE PRECISION array, dimension (max(1, 3*N-2)) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, the algorithm failed to converge; i */ +/* > off-diagonal elements of an intermediate tridiagonal */ +/* > form did not converge to zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16HEeigen */ + +/* ===================================================================== */ +/* Subroutine */ int zheev_(char *jobz, char *uplo, integer *n, doublecomplex + *a, integer *lda, doublereal *w, doublecomplex *work, integer *lwork, + doublereal *rwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + integer nb; + doublereal eps; + integer inde; + doublereal anrm; + integer imax; + doublereal rmin, rmax; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); + doublereal sigma; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo; + logical lower, wantz; + extern doublereal dlamch_(char *, ftnlen); + integer iscale; + doublereal safmin; + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + doublereal bignum; + extern doublereal zlanhe_(char *, char *, integer *, doublecomplex *, + integer *, doublereal *, ftnlen, ftnlen); + integer indtau; + extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, + integer *), zlascl_(char *, integer *, integer *, doublereal *, + doublereal *, integer *, integer *, doublecomplex *, integer *, + integer *, ftnlen); + integer indwrk; + extern /* Subroutine */ int zhetrd_(char *, integer *, doublecomplex *, + integer *, doublereal *, doublereal *, doublecomplex *, + doublecomplex *, integer *, integer *, ftnlen); + integer llwork; + doublereal smlnum; + integer lwkopt; + logical lquery; + extern /* Subroutine */ int zsteqr_(char *, integer *, doublereal *, + doublereal *, doublecomplex *, integer *, doublereal *, integer *, + ftnlen), zungtr_(char *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, integer *, ftnlen); + + +/* -- LAPACK driver routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --w; + --work; + --rwork; + + /* Function Body */ + wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); + lower = lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + + *info = 0; + if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + *info = -1; + } else if (! (lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } + + if (*info == 0) { + nb = ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, + (ftnlen)1); +/* Computing MAX */ + i__1 = 1, i__2 = (nb + 1) * *n; + lwkopt = max(i__1,i__2); + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + +/* Computing MAX */ + i__1 = 1, i__2 = (*n << 1) - 1; + if (*lwork < max(i__1,i__2) && ! lquery) { + *info = -8; + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZHEEV ", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + if (*n == 1) { + i__1 = a_dim1 + 1; + w[1] = a[i__1].r; + work[1].r = 1., work[1].i = 0.; + if (wantz) { + i__1 = a_dim1 + 1; + a[i__1].r = 1., a[i__1].i = 0.; + } + return 0; + } + +/* Get machine constants. */ + + safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); + eps = dlamch_((char *)"Precision", (ftnlen)9); + smlnum = safmin / eps; + bignum = 1. / smlnum; + rmin = sqrt(smlnum); + rmax = sqrt(bignum); + +/* Scale matrix to allowable range, if necessary. */ + + anrm = zlanhe_((char *)"M", uplo, n, &a[a_offset], lda, &rwork[1], (ftnlen)1, ( + ftnlen)1); + iscale = 0; + if (anrm > 0. && anrm < rmin) { + iscale = 1; + sigma = rmin / anrm; + } else if (anrm > rmax) { + iscale = 1; + sigma = rmax / anrm; + } + if (iscale == 1) { + zlascl_(uplo, &c__0, &c__0, &c_b18, &sigma, n, n, &a[a_offset], lda, + info, (ftnlen)1); + } + +/* Call ZHETRD to reduce Hermitian matrix to tridiagonal form. */ + + inde = 1; + indtau = 1; + indwrk = indtau + *n; + llwork = *lwork - indwrk + 1; + zhetrd_(uplo, n, &a[a_offset], lda, &w[1], &rwork[inde], &work[indtau], & + work[indwrk], &llwork, &iinfo, (ftnlen)1); + +/* For eigenvalues only, call DSTERF. For eigenvectors, first call */ +/* ZUNGTR to generate the unitary matrix, then call ZSTEQR. */ + + if (! wantz) { + dsterf_(n, &w[1], &rwork[inde], info); + } else { + zungtr_(uplo, n, &a[a_offset], lda, &work[indtau], &work[indwrk], & + llwork, &iinfo, (ftnlen)1); + indwrk = inde + *n; + zsteqr_(jobz, n, &w[1], &rwork[inde], &a[a_offset], lda, &rwork[ + indwrk], info, (ftnlen)1); + } + +/* If matrix was scaled, then rescale eigenvalues appropriately. */ + + if (iscale == 1) { + if (*info == 0) { + imax = *n; + } else { + imax = *info - 1; + } + d__1 = 1. / sigma; + dscal_(&imax, &d__1, &w[1], &c__1); + } + +/* Set WORK(1) to optimal complex workspace size. */ + + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + + return 0; + +/* End of ZHEEV */ + +} /* zheev_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zheevd.cpp b/lib/linalg/zheevd.cpp new file mode 100644 index 0000000000..c340c17718 --- /dev/null +++ b/lib/linalg/zheevd.cpp @@ -0,0 +1,486 @@ +/* fortran/zheevd.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__0 = 0; +static doublereal c_b18 = 1.; + +/* > \brief ZHEEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE mat +rices */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZHEEVD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZHEEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, */ +/* LRWORK, IWORK, LIWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER JOBZ, UPLO */ +/* INTEGER INFO, LDA, LIWORK, LRWORK, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IWORK( * ) */ +/* DOUBLE PRECISION RWORK( * ), W( * ) */ +/* COMPLEX*16 A( LDA, * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZHEEVD computes all eigenvalues and, optionally, eigenvectors of a */ +/* > complex Hermitian matrix A. If eigenvectors are desired, it uses a */ +/* > divide and conquer algorithm. */ +/* > */ +/* > The divide and conquer algorithm makes very mild assumptions about */ +/* > floating point arithmetic. It will work on machines with a guard */ +/* > digit in add/subtract, or on those binary machines without guard */ +/* > digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ +/* > Cray-2. It could conceivably fail on hexadecimal or decimal machines */ +/* > without guard digits, but we know of none. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] JOBZ */ +/* > \verbatim */ +/* > JOBZ is CHARACTER*1 */ +/* > = 'N': Compute eigenvalues only; */ +/* > = 'V': Compute eigenvalues and eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A is stored; */ +/* > = 'L': Lower triangle of A is stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA, N) */ +/* > On entry, the Hermitian matrix A. If UPLO = 'U', the */ +/* > leading N-by-N upper triangular part of A contains the */ +/* > upper triangular part of the matrix A. If UPLO = 'L', */ +/* > the leading N-by-N lower triangular part of A contains */ +/* > the lower triangular part of the matrix A. */ +/* > On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ +/* > orthonormal eigenvectors of the matrix A. */ +/* > If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') */ +/* > or the upper triangle (if UPLO='U') of A, including the */ +/* > diagonal, is destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] W */ +/* > \verbatim */ +/* > W is DOUBLE PRECISION array, dimension (N) */ +/* > If INFO = 0, the eigenvalues in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The length of the array WORK. */ +/* > If N <= 1, LWORK must be at least 1. */ +/* > If JOBZ = 'N' and N > 1, LWORK must be at least N + 1. */ +/* > If JOBZ = 'V' and N > 1, LWORK must be at least 2*N + N**2. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal sizes of the WORK, RWORK and */ +/* > IWORK arrays, returns these values as the first entries of */ +/* > the WORK, RWORK and IWORK arrays, and no error message */ +/* > related to LWORK or LRWORK or LIWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RWORK */ +/* > \verbatim */ +/* > RWORK is DOUBLE PRECISION array, */ +/* > dimension (LRWORK) */ +/* > On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LRWORK */ +/* > \verbatim */ +/* > LRWORK is INTEGER */ +/* > The dimension of the array RWORK. */ +/* > If N <= 1, LRWORK must be at least 1. */ +/* > If JOBZ = 'N' and N > 1, LRWORK must be at least N. */ +/* > If JOBZ = 'V' and N > 1, LRWORK must be at least */ +/* > 1 + 5*N + 2*N**2. */ +/* > */ +/* > If LRWORK = -1, then a workspace query is assumed; the */ +/* > routine only calculates the optimal sizes of the WORK, RWORK */ +/* > and IWORK arrays, returns these values as the first entries */ +/* > of the WORK, RWORK and IWORK arrays, and no error message */ +/* > related to LWORK or LRWORK or LIWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension (MAX(1,LIWORK)) */ +/* > On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LIWORK */ +/* > \verbatim */ +/* > LIWORK is INTEGER */ +/* > The dimension of the array IWORK. */ +/* > If N <= 1, LIWORK must be at least 1. */ +/* > If JOBZ = 'N' and N > 1, LIWORK must be at least 1. */ +/* > If JOBZ = 'V' and N > 1, LIWORK must be at least 3 + 5*N. */ +/* > */ +/* > If LIWORK = -1, then a workspace query is assumed; the */ +/* > routine only calculates the optimal sizes of the WORK, RWORK */ +/* > and IWORK arrays, returns these values as the first entries */ +/* > of the WORK, RWORK and IWORK arrays, and no error message */ +/* > related to LWORK or LRWORK or LIWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i and JOBZ = 'N', then the algorithm failed */ +/* > to converge; i off-diagonal elements of an intermediate */ +/* > tridiagonal form did not converge to zero; */ +/* > if INFO = i and JOBZ = 'V', then the algorithm failed */ +/* > to compute an eigenvalue while working on the submatrix */ +/* > lying in rows and columns INFO/(N+1) through */ +/* > mod(INFO,N+1). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16HEeigen */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > Modified description of INFO. Sven, 16 Feb 05. */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Jeff Rutter, Computer Science Division, University of California */ +/* > at Berkeley, USA */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zheevd_(char *jobz, char *uplo, integer *n, + doublecomplex *a, integer *lda, doublereal *w, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, + integer *liwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal eps; + integer inde; + doublereal anrm; + integer imax; + doublereal rmin, rmax; + integer lopt; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); + doublereal sigma; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo, lwmin, liopt; + logical lower; + integer llrwk, lropt; + logical wantz; + integer indwk2, llwrk2; + extern doublereal dlamch_(char *, ftnlen); + integer iscale; + doublereal safmin; + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + doublereal bignum; + extern doublereal zlanhe_(char *, char *, integer *, doublecomplex *, + integer *, doublereal *, ftnlen, ftnlen); + integer indtau; + extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, + integer *), zlascl_(char *, integer *, integer *, doublereal *, + doublereal *, integer *, integer *, doublecomplex *, integer *, + integer *, ftnlen), zstedc_(char *, integer *, doublereal *, + doublereal *, doublecomplex *, integer *, doublecomplex *, + integer *, doublereal *, integer *, integer *, integer *, integer + *, ftnlen); + integer indrwk, indwrk, liwmin; + extern /* Subroutine */ int zhetrd_(char *, integer *, doublecomplex *, + integer *, doublereal *, doublereal *, doublecomplex *, + doublecomplex *, integer *, integer *, ftnlen), zlacpy_(char *, + integer *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, ftnlen); + integer lrwmin, llwork; + doublereal smlnum; + logical lquery; + extern /* Subroutine */ int zunmtr_(char *, char *, char *, integer *, + integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, integer *, + ftnlen, ftnlen, ftnlen); + + +/* -- LAPACK driver routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --w; + --work; + --rwork; + --iwork; + + /* Function Body */ + wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); + lower = lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1 || *lrwork == -1 || *liwork == -1; + + *info = 0; + if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + *info = -1; + } else if (! (lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } else if (*lda < max(1,*n)) { + *info = -5; + } + + if (*info == 0) { + if (*n <= 1) { + lwmin = 1; + lrwmin = 1; + liwmin = 1; + lopt = lwmin; + lropt = lrwmin; + liopt = liwmin; + } else { + if (wantz) { + lwmin = (*n << 1) + *n * *n; +/* Computing 2nd power */ + i__1 = *n; + lrwmin = *n * 5 + 1 + (i__1 * i__1 << 1); + liwmin = *n * 5 + 3; + } else { + lwmin = *n + 1; + lrwmin = *n; + liwmin = 1; + } +/* Computing MAX */ + i__1 = lwmin, i__2 = *n + *n * ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, & + c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + lopt = max(i__1,i__2); + lropt = lrwmin; + liopt = liwmin; + } + work[1].r = (doublereal) lopt, work[1].i = 0.; + rwork[1] = (doublereal) lropt; + iwork[1] = liopt; + + if (*lwork < lwmin && ! lquery) { + *info = -8; + } else if (*lrwork < lrwmin && ! lquery) { + *info = -10; + } else if (*liwork < liwmin && ! lquery) { + *info = -12; + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZHEEVD", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + if (*n == 1) { + i__1 = a_dim1 + 1; + w[1] = a[i__1].r; + if (wantz) { + i__1 = a_dim1 + 1; + a[i__1].r = 1., a[i__1].i = 0.; + } + return 0; + } + +/* Get machine constants. */ + + safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); + eps = dlamch_((char *)"Precision", (ftnlen)9); + smlnum = safmin / eps; + bignum = 1. / smlnum; + rmin = sqrt(smlnum); + rmax = sqrt(bignum); + +/* Scale matrix to allowable range, if necessary. */ + + anrm = zlanhe_((char *)"M", uplo, n, &a[a_offset], lda, &rwork[1], (ftnlen)1, ( + ftnlen)1); + iscale = 0; + if (anrm > 0. && anrm < rmin) { + iscale = 1; + sigma = rmin / anrm; + } else if (anrm > rmax) { + iscale = 1; + sigma = rmax / anrm; + } + if (iscale == 1) { + zlascl_(uplo, &c__0, &c__0, &c_b18, &sigma, n, n, &a[a_offset], lda, + info, (ftnlen)1); + } + +/* Call ZHETRD to reduce Hermitian matrix to tridiagonal form. */ + + inde = 1; + indtau = 1; + indwrk = indtau + *n; + indrwk = inde + *n; + indwk2 = indwrk + *n * *n; + llwork = *lwork - indwrk + 1; + llwrk2 = *lwork - indwk2 + 1; + llrwk = *lrwork - indrwk + 1; + zhetrd_(uplo, n, &a[a_offset], lda, &w[1], &rwork[inde], &work[indtau], & + work[indwrk], &llwork, &iinfo, (ftnlen)1); + +/* For eigenvalues only, call DSTERF. For eigenvectors, first call */ +/* ZSTEDC to generate the eigenvector matrix, WORK(INDWRK), of the */ +/* tridiagonal matrix, then call ZUNMTR to multiply it to the */ +/* Householder transformations represented as Householder vectors in */ +/* A. */ + + if (! wantz) { + dsterf_(n, &w[1], &rwork[inde], info); + } else { + zstedc_((char *)"I", n, &w[1], &rwork[inde], &work[indwrk], n, &work[indwk2], + &llwrk2, &rwork[indrwk], &llrwk, &iwork[1], liwork, info, ( + ftnlen)1); + zunmtr_((char *)"L", uplo, (char *)"N", n, n, &a[a_offset], lda, &work[indtau], &work[ + indwrk], n, &work[indwk2], &llwrk2, &iinfo, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + zlacpy_((char *)"A", n, n, &work[indwrk], n, &a[a_offset], lda, (ftnlen)1); + } + +/* If matrix was scaled, then rescale eigenvalues appropriately. */ + + if (iscale == 1) { + if (*info == 0) { + imax = *n; + } else { + imax = *info - 1; + } + d__1 = 1. / sigma; + dscal_(&imax, &d__1, &w[1], &c__1); + } + + work[1].r = (doublereal) lopt, work[1].i = 0.; + rwork[1] = (doublereal) lropt; + iwork[1] = liopt; + + return 0; + +/* End of ZHEEVD */ + +} /* zheevd_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zhemv.cpp b/lib/linalg/zhemv.cpp new file mode 100644 index 0000000000..f965dcfcdf --- /dev/null +++ b/lib/linalg/zhemv.cpp @@ -0,0 +1,508 @@ +/* fortran/zhemv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZHEMV */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZHEMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) */ + +/* .. Scalar Arguments .. */ +/* COMPLEX*16 ALPHA,BETA */ +/* INTEGER INCX,INCY,LDA,N */ +/* CHARACTER UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A(LDA,*),X(*),Y(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZHEMV performs the matrix-vector operation */ +/* > */ +/* > y := alpha*A*x + beta*y, */ +/* > */ +/* > where alpha and beta are scalars, x and y are n element vectors and */ +/* > A is an n by n hermitian matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the upper or lower */ +/* > triangular part of the array A is to be referenced as */ +/* > follows: */ +/* > */ +/* > UPLO = 'U' or 'u' Only the upper triangular part of A */ +/* > is to be referenced. */ +/* > */ +/* > UPLO = 'L' or 'l' Only the lower triangular part of A */ +/* > is to be referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is COMPLEX*16 */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension ( LDA, N ) */ +/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ +/* > upper triangular part of the array A must contain the upper */ +/* > triangular part of the hermitian matrix and the strictly */ +/* > lower triangular part of A is not referenced. */ +/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ +/* > lower triangular part of the array A must contain the lower */ +/* > triangular part of the hermitian matrix and the strictly */ +/* > upper triangular part of A is not referenced. */ +/* > Note that the imaginary parts of the diagonal elements need */ +/* > not be set and are assumed to be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. LDA must be at least */ +/* > max( 1, n ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array X must contain the n */ +/* > element vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is COMPLEX*16 */ +/* > On entry, BETA specifies the scalar beta. When BETA is */ +/* > supplied as zero then Y need not be set on input. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Y */ +/* > \verbatim */ +/* > Y is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCY ) ). */ +/* > Before entry, the incremented array Y must contain the n */ +/* > element vector y. On exit, Y is overwritten by the updated */ +/* > vector y. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > On entry, INCY specifies the increment for the elements of */ +/* > Y. INCY must not be zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zhemv_(char *uplo, integer *n, doublecomplex *alpha, + doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, + doublecomplex *beta, doublecomplex *y, integer *incy, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + doublereal d__1; + doublecomplex z__1, z__2, z__3, z__4; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, ix, iy, jx, jy, kx, ky, info; + doublecomplex temp1, temp2; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + --y; + + /* Function Body */ + info = 0; + if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (*n < 0) { + info = 2; + } else if (*lda < max(1,*n)) { + info = 5; + } else if (*incx == 0) { + info = 7; + } else if (*incy == 0) { + info = 10; + } + if (info != 0) { + xerbla_((char *)"ZHEMV ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0 || alpha->r == 0. && alpha->i == 0. && (beta->r == 1. && + beta->i == 0.)) { + return 0; + } + +/* Set up the start points in X and Y. */ + + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (*n - 1) * *incx; + } + if (*incy > 0) { + ky = 1; + } else { + ky = 1 - (*n - 1) * *incy; + } + +/* Start the operations. In this version the elements of A are */ +/* accessed sequentially with one pass through the triangular part */ +/* of A. */ + +/* First form y := beta*y. */ + + if (beta->r != 1. || beta->i != 0.) { + if (*incy == 1) { + if (beta->r == 0. && beta->i == 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + y[i__2].r = 0., y[i__2].i = 0.; +/* L10: */ + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] + .r; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; +/* L20: */ + } + } + } else { + iy = ky; + if (beta->r == 0. && beta->i == 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + y[i__2].r = 0., y[i__2].i = 0.; + iy += *incy; +/* L30: */ + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + i__3 = iy; + z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] + .r; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + iy += *incy; +/* L40: */ + } + } + } + } + if (alpha->r == 0. && alpha->i == 0.) { + return 0; + } + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + +/* Form y when A is stored in upper triangle. */ + + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = + alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = i__ + j * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] + .r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = + z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; +/* L50: */ + } + i__2 = j; + i__3 = j; + i__4 = j + j * a_dim1; + d__1 = a[i__4].r; + z__3.r = d__1 * temp1.r, z__3.i = d__1 * temp1.i; + z__2.r = y[i__3].r + z__3.r, z__2.i = y[i__3].i + z__3.i; + z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, z__4.i = + alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; +/* L60: */ + } + } else { + jx = kx; + jy = ky; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = + alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + ix = kx; + iy = ky; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = iy; + i__4 = iy; + i__5 = i__ + j * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] + .r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = + z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; + ix += *incx; + iy += *incy; +/* L70: */ + } + i__2 = jy; + i__3 = jy; + i__4 = j + j * a_dim1; + d__1 = a[i__4].r; + z__3.r = d__1 * temp1.r, z__3.i = d__1 * temp1.i; + z__2.r = y[i__3].r + z__3.r, z__2.i = y[i__3].i + z__3.i; + z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, z__4.i = + alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + jx += *incx; + jy += *incy; +/* L80: */ + } + } + } else { + +/* Form y when A is stored in lower triangle. */ + + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = + alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + i__2 = j; + i__3 = j; + i__4 = j + j * a_dim1; + d__1 = a[i__4].r; + z__2.r = d__1 * temp1.r, z__2.i = d__1 * temp1.i; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = i__ + j * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] + .r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = + z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; +/* L90: */ + } + i__2 = j; + i__3 = j; + z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, z__2.i = + alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; +/* L100: */ + } + } else { + jx = kx; + jy = ky; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = + alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + i__2 = jy; + i__3 = jy; + i__4 = j + j * a_dim1; + d__1 = a[i__4].r; + z__2.r = d__1 * temp1.r, z__2.i = d__1 * temp1.i; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + ix = jx; + iy = jy; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + iy += *incy; + i__3 = iy; + i__4 = iy; + i__5 = i__ + j * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] + .r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = + z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; +/* L110: */ + } + i__2 = jy; + i__3 = jy; + z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, z__2.i = + alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + jx += *incx; + jy += *incy; +/* L120: */ + } + } + } + + return 0; + +/* End of ZHEMV */ + +} /* zhemv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zher2.cpp b/lib/linalg/zher2.cpp new file mode 100644 index 0000000000..2f77acd257 --- /dev/null +++ b/lib/linalg/zher2.cpp @@ -0,0 +1,519 @@ +/* fortran/zher2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZHER2 */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZHER2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) */ + +/* .. Scalar Arguments .. */ +/* COMPLEX*16 ALPHA */ +/* INTEGER INCX,INCY,LDA,N */ +/* CHARACTER UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A(LDA,*),X(*),Y(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZHER2 performs the hermitian rank 2 operation */ +/* > */ +/* > A := alpha*x*y**H + conjg( alpha )*y*x**H + A, */ +/* > */ +/* > where alpha is a scalar, x and y are n element vectors and A is an n */ +/* > by n hermitian matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the upper or lower */ +/* > triangular part of the array A is to be referenced as */ +/* > follows: */ +/* > */ +/* > UPLO = 'U' or 'u' Only the upper triangular part of A */ +/* > is to be referenced. */ +/* > */ +/* > UPLO = 'L' or 'l' Only the lower triangular part of A */ +/* > is to be referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is COMPLEX*16 */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array X must contain the n */ +/* > element vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Y */ +/* > \verbatim */ +/* > Y is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCY ) ). */ +/* > Before entry, the incremented array Y must contain the n */ +/* > element vector y. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > On entry, INCY specifies the increment for the elements of */ +/* > Y. INCY must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension ( LDA, N ) */ +/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ +/* > upper triangular part of the array A must contain the upper */ +/* > triangular part of the hermitian matrix and the strictly */ +/* > lower triangular part of A is not referenced. On exit, the */ +/* > upper triangular part of the array A is overwritten by the */ +/* > upper triangular part of the updated matrix. */ +/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ +/* > lower triangular part of the array A must contain the lower */ +/* > triangular part of the hermitian matrix and the strictly */ +/* > upper triangular part of A is not referenced. On exit, the */ +/* > lower triangular part of the array A is overwritten by the */ +/* > lower triangular part of the updated matrix. */ +/* > Note that the imaginary parts of the diagonal elements need */ +/* > not be set, they are assumed to be zero, and on exit they */ +/* > are set to zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. LDA must be at least */ +/* > max( 1, n ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zher2_(char *uplo, integer *n, doublecomplex *alpha, + doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, + doublecomplex *a, integer *lda, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5, i__6; + doublereal d__1; + doublecomplex z__1, z__2, z__3, z__4; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, ix, iy, jx, jy, kx, ky, info; + doublecomplex temp1, temp2; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --x; + --y; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + info = 0; + if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (*n < 0) { + info = 2; + } else if (*incx == 0) { + info = 5; + } else if (*incy == 0) { + info = 7; + } else if (*lda < max(1,*n)) { + info = 9; + } + if (info != 0) { + xerbla_((char *)"ZHER2 ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0 || alpha->r == 0. && alpha->i == 0.) { + return 0; + } + +/* Set up the start points in X and Y if the increments are not both */ +/* unity. */ + + if (*incx != 1 || *incy != 1) { + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (*n - 1) * *incx; + } + if (*incy > 0) { + ky = 1; + } else { + ky = 1 - (*n - 1) * *incy; + } + jx = kx; + jy = ky; + } + +/* Start the operations. In this version the elements of A are */ +/* accessed sequentially with one pass through the triangular part */ +/* of A. */ + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + +/* Form A when A is stored in the upper triangle. */ + + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + i__3 = j; + if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || + y[i__3].i != 0.)) { + d_cnjg(&z__2, &y[j]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + i__2 = j; + z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] + .r; + d_cnjg(&z__1, &z__2); + temp2.r = z__1.r, temp2.i = z__1.i; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = i__; + z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, + z__3.i = x[i__5].r * temp1.i + x[i__5].i * + temp1.r; + z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + + z__3.i; + i__6 = i__; + z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, + z__4.i = y[i__6].r * temp2.i + y[i__6].i * + temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L10: */ + } + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + i__4 = j; + z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, + z__2.i = x[i__4].r * temp1.i + x[i__4].i * + temp1.r; + i__5 = j; + z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, + z__3.i = y[i__5].r * temp2.i + y[i__5].i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + d__1 = a[i__3].r + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + } else { + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + i__3 = jy; + if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || + y[i__3].i != 0.)) { + d_cnjg(&z__2, &y[jy]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + i__2 = jx; + z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] + .r; + d_cnjg(&z__1, &z__2); + temp2.r = z__1.r, temp2.i = z__1.i; + ix = kx; + iy = ky; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = ix; + z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, + z__3.i = x[i__5].r * temp1.i + x[i__5].i * + temp1.r; + z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + + z__3.i; + i__6 = iy; + z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, + z__4.i = y[i__6].r * temp2.i + y[i__6].i * + temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + ix += *incx; + iy += *incy; +/* L30: */ + } + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + i__4 = jx; + z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, + z__2.i = x[i__4].r * temp1.i + x[i__4].i * + temp1.r; + i__5 = jy; + z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, + z__3.i = y[i__5].r * temp2.i + y[i__5].i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + d__1 = a[i__3].r + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + } else { + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } + jx += *incx; + jy += *incy; +/* L40: */ + } + } + } else { + +/* Form A when A is stored in the lower triangle. */ + + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + i__3 = j; + if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || + y[i__3].i != 0.)) { + d_cnjg(&z__2, &y[j]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + i__2 = j; + z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] + .r; + d_cnjg(&z__1, &z__2); + temp2.r = z__1.r, temp2.i = z__1.i; + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + i__4 = j; + z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, + z__2.i = x[i__4].r * temp1.i + x[i__4].i * + temp1.r; + i__5 = j; + z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, + z__3.i = y[i__5].r * temp2.i + y[i__5].i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + d__1 = a[i__3].r + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = i__; + z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, + z__3.i = x[i__5].r * temp1.i + x[i__5].i * + temp1.r; + z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + + z__3.i; + i__6 = i__; + z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, + z__4.i = y[i__6].r * temp2.i + y[i__6].i * + temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L50: */ + } + } else { + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + i__3 = jy; + if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || + y[i__3].i != 0.)) { + d_cnjg(&z__2, &y[jy]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + i__2 = jx; + z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] + .r; + d_cnjg(&z__1, &z__2); + temp2.r = z__1.r, temp2.i = z__1.i; + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + i__4 = jx; + z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, + z__2.i = x[i__4].r * temp1.i + x[i__4].i * + temp1.r; + i__5 = jy; + z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, + z__3.i = y[i__5].r * temp2.i + y[i__5].i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + d__1 = a[i__3].r + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + ix = jx; + iy = jy; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + iy += *incy; + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = ix; + z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, + z__3.i = x[i__5].r * temp1.i + x[i__5].i * + temp1.r; + z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + + z__3.i; + i__6 = iy; + z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, + z__4.i = y[i__6].r * temp2.i + y[i__6].i * + temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L70: */ + } + } else { + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } + jx += *incx; + jy += *incy; +/* L80: */ + } + } + } + + return 0; + +/* End of ZHER2 */ + +} /* zher2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zher2k.cpp b/lib/linalg/zher2k.cpp new file mode 100644 index 0000000000..1b94010d33 --- /dev/null +++ b/lib/linalg/zher2k.cpp @@ -0,0 +1,750 @@ +/* fortran/zher2k.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZHER2K */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZHER2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) */ + +/* .. Scalar Arguments .. */ +/* COMPLEX*16 ALPHA */ +/* DOUBLE PRECISION BETA */ +/* INTEGER K,LDA,LDB,LDC,N */ +/* CHARACTER TRANS,UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZHER2K performs one of the hermitian rank 2k operations */ +/* > */ +/* > C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C, */ +/* > */ +/* > or */ +/* > */ +/* > C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C, */ +/* > */ +/* > where alpha and beta are scalars with beta real, C is an n by n */ +/* > hermitian matrix and A and B are n by k matrices in the first case */ +/* > and k by n matrices in the second case. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the upper or lower */ +/* > triangular part of the array C is to be referenced as */ +/* > follows: */ +/* > */ +/* > UPLO = 'U' or 'u' Only the upper triangular part of C */ +/* > is to be referenced. */ +/* > */ +/* > UPLO = 'L' or 'l' Only the lower triangular part of C */ +/* > is to be referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > On entry, TRANS specifies the operation to be performed as */ +/* > follows: */ +/* > */ +/* > TRANS = 'N' or 'n' C := alpha*A*B**H + */ +/* > conjg( alpha )*B*A**H + */ +/* > beta*C. */ +/* > */ +/* > TRANS = 'C' or 'c' C := alpha*A**H*B + */ +/* > conjg( alpha )*B**H*A + */ +/* > beta*C. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix C. N must be */ +/* > at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > On entry with TRANS = 'N' or 'n', K specifies the number */ +/* > of columns of the matrices A and B, and on entry with */ +/* > TRANS = 'C' or 'c', K specifies the number of rows of the */ +/* > matrices A and B. K must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is COMPLEX*16 . */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension ( LDA, ka ), where ka is */ +/* > k when TRANS = 'N' or 'n', and is n otherwise. */ +/* > Before entry with TRANS = 'N' or 'n', the leading n by k */ +/* > part of the array A must contain the matrix A, otherwise */ +/* > the leading k by n part of the array A must contain the */ +/* > matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. When TRANS = 'N' or 'n' */ +/* > then LDA must be at least max( 1, n ), otherwise LDA must */ +/* > be at least max( 1, k ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] B */ +/* > \verbatim */ +/* > B is COMPLEX*16 array, dimension ( LDB, kb ), where kb is */ +/* > k when TRANS = 'N' or 'n', and is n otherwise. */ +/* > Before entry with TRANS = 'N' or 'n', the leading n by k */ +/* > part of the array B must contain the matrix B, otherwise */ +/* > the leading k by n part of the array B must contain the */ +/* > matrix B. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > On entry, LDB specifies the first dimension of B as declared */ +/* > in the calling (sub) program. When TRANS = 'N' or 'n' */ +/* > then LDB must be at least max( 1, n ), otherwise LDB must */ +/* > be at least max( 1, k ). */ +/* > Unchanged on exit. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is DOUBLE PRECISION . */ +/* > On entry, BETA specifies the scalar beta. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is COMPLEX*16 array, dimension ( LDC, N ) */ +/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ +/* > upper triangular part of the array C must contain the upper */ +/* > triangular part of the hermitian matrix and the strictly */ +/* > lower triangular part of C is not referenced. On exit, the */ +/* > upper triangular part of the array C is overwritten by the */ +/* > upper triangular part of the updated matrix. */ +/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ +/* > lower triangular part of the array C must contain the lower */ +/* > triangular part of the hermitian matrix and the strictly */ +/* > upper triangular part of C is not referenced. On exit, the */ +/* > lower triangular part of the array C is overwritten by the */ +/* > lower triangular part of the updated matrix. */ +/* > Note that the imaginary parts of the diagonal elements need */ +/* > not be set, they are assumed to be zero, and on exit they */ +/* > are set to zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > On entry, LDC specifies the first dimension of C as declared */ +/* > in the calling (sub) program. LDC must be at least */ +/* > max( 1, n ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level3 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 3 Blas routine. */ +/* > */ +/* > -- Written on 8-February-1989. */ +/* > Jack Dongarra, Argonne National Laboratory. */ +/* > Iain Duff, AERE Harwell. */ +/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ +/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ +/* > */ +/* > -- Modified 8-Nov-93 to set C(J,J) to DBLE( C(J,J) ) when BETA = 1. */ +/* > Ed Anderson, Cray Research Inc. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zher2k_(char *uplo, char *trans, integer *n, integer *k, + doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * + b, integer *ldb, doublereal *beta, doublecomplex *c__, integer *ldc, + ftnlen uplo_len, ftnlen trans_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3, i__4, i__5, i__6, i__7; + doublereal d__1; + doublecomplex z__1, z__2, z__3, z__4, z__5, z__6; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, l, info; + doublecomplex temp1, temp2; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nrowa; + logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level3 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Parameters .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + + /* Function Body */ + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + nrowa = *n; + } else { + nrowa = *k; + } + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + + info = 0; + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"C", (ftnlen)1, (ftnlen)1)) { + info = 2; + } else if (*n < 0) { + info = 3; + } else if (*k < 0) { + info = 4; + } else if (*lda < max(1,nrowa)) { + info = 7; + } else if (*ldb < max(1,nrowa)) { + info = 9; + } else if (*ldc < max(1,*n)) { + info = 12; + } + if (info != 0) { + xerbla_((char *)"ZHER2K", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0 || (alpha->r == 0. && alpha->i == 0. || *k == 0) && *beta == + 1.) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (alpha->r == 0. && alpha->i == 0.) { + if (upper) { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; +/* L10: */ + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ + i__4].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L30: */ + } + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; +/* L40: */ + } + } + } else { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; +/* L50: */ + } +/* L60: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ + i__4].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L70: */ + } +/* L80: */ + } + } + } + return 0; + } + +/* Start the operations. */ + + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form C := alpha*A*B**H + conjg( alpha )*B*A**H + */ +/* C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; +/* L90: */ + } + } else if (*beta != 1.) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ + i__4].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L100: */ + } + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } else { + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + i__3 = j + l * a_dim1; + i__4 = j + l * b_dim1; + if (a[i__3].r != 0. || a[i__3].i != 0. || (b[i__4].r != + 0. || b[i__4].i != 0.)) { + d_cnjg(&z__2, &b[j + l * b_dim1]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * + z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + i__3 = j + l * a_dim1; + z__2.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, + z__2.i = alpha->r * a[i__3].i + alpha->i * a[ + i__3].r; + d_cnjg(&z__1, &z__2); + temp2.r = z__1.r, temp2.i = z__1.i; + i__3 = j - 1; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + l * a_dim1; + z__3.r = a[i__6].r * temp1.r - a[i__6].i * + temp1.i, z__3.i = a[i__6].r * temp1.i + a[ + i__6].i * temp1.r; + z__2.r = c__[i__5].r + z__3.r, z__2.i = c__[i__5] + .i + z__3.i; + i__7 = i__ + l * b_dim1; + z__4.r = b[i__7].r * temp2.r - b[i__7].i * + temp2.i, z__4.i = b[i__7].r * temp2.i + b[ + i__7].i * temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + + z__4.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; +/* L110: */ + } + i__3 = j + j * c_dim1; + i__4 = j + j * c_dim1; + i__5 = j + l * a_dim1; + z__2.r = a[i__5].r * temp1.r - a[i__5].i * temp1.i, + z__2.i = a[i__5].r * temp1.i + a[i__5].i * + temp1.r; + i__6 = j + l * b_dim1; + z__3.r = b[i__6].r * temp2.r - b[i__6].i * temp2.i, + z__3.i = b[i__6].r * temp2.i + b[i__6].i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + d__1 = c__[i__4].r + z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } +/* L120: */ + } +/* L130: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; +/* L140: */ + } + } else if (*beta != 1.) { + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ + i__4].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L150: */ + } + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } else { + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + i__3 = j + l * a_dim1; + i__4 = j + l * b_dim1; + if (a[i__3].r != 0. || a[i__3].i != 0. || (b[i__4].r != + 0. || b[i__4].i != 0.)) { + d_cnjg(&z__2, &b[j + l * b_dim1]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * + z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + i__3 = j + l * a_dim1; + z__2.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, + z__2.i = alpha->r * a[i__3].i + alpha->i * a[ + i__3].r; + d_cnjg(&z__1, &z__2); + temp2.r = z__1.r, temp2.i = z__1.i; + i__3 = *n; + for (i__ = j + 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + l * a_dim1; + z__3.r = a[i__6].r * temp1.r - a[i__6].i * + temp1.i, z__3.i = a[i__6].r * temp1.i + a[ + i__6].i * temp1.r; + z__2.r = c__[i__5].r + z__3.r, z__2.i = c__[i__5] + .i + z__3.i; + i__7 = i__ + l * b_dim1; + z__4.r = b[i__7].r * temp2.r - b[i__7].i * + temp2.i, z__4.i = b[i__7].r * temp2.i + b[ + i__7].i * temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + + z__4.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; +/* L160: */ + } + i__3 = j + j * c_dim1; + i__4 = j + j * c_dim1; + i__5 = j + l * a_dim1; + z__2.r = a[i__5].r * temp1.r - a[i__5].i * temp1.i, + z__2.i = a[i__5].r * temp1.i + a[i__5].i * + temp1.r; + i__6 = j + l * b_dim1; + z__3.r = b[i__6].r * temp2.r - b[i__6].i * temp2.i, + z__3.i = b[i__6].r * temp2.i + b[i__6].i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + d__1 = c__[i__4].r + z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } +/* L170: */ + } +/* L180: */ + } + } + } else { + +/* Form C := alpha*A**H*B + conjg( alpha )*B**H*A + */ +/* C. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + temp1.r = 0., temp1.i = 0.; + temp2.r = 0., temp2.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + d_cnjg(&z__3, &a[l + i__ * a_dim1]); + i__4 = l + j * b_dim1; + z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] + .r; + z__1.r = temp1.r + z__2.r, z__1.i = temp1.i + z__2.i; + temp1.r = z__1.r, temp1.i = z__1.i; + d_cnjg(&z__3, &b[l + i__ * b_dim1]); + i__4 = l + j * a_dim1; + z__2.r = z__3.r * a[i__4].r - z__3.i * a[i__4].i, + z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4] + .r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; +/* L190: */ + } + if (i__ == j) { + if (*beta == 0.) { + i__3 = j + j * c_dim1; + z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__2.i = alpha->r * temp1.i + alpha->i * + temp1.r; + d_cnjg(&z__4, alpha); + z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, + z__3.i = z__4.r * temp2.i + z__4.i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + d__1 = z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } else { + i__3 = j + j * c_dim1; + i__4 = j + j * c_dim1; + z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__2.i = alpha->r * temp1.i + alpha->i * + temp1.r; + d_cnjg(&z__4, alpha); + z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, + z__3.i = z__4.r * temp2.i + z__4.i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + d__1 = *beta * c__[i__4].r + z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } + } else { + if (*beta == 0.) { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__2.i = alpha->r * temp1.i + alpha->i * + temp1.r; + d_cnjg(&z__4, alpha); + z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, + z__3.i = z__4.r * temp2.i + z__4.i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__3.r = *beta * c__[i__4].r, z__3.i = *beta * + c__[i__4].i; + z__4.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__4.i = alpha->r * temp1.i + alpha->i * + temp1.r; + z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + + z__4.i; + d_cnjg(&z__6, alpha); + z__5.r = z__6.r * temp2.r - z__6.i * temp2.i, + z__5.i = z__6.r * temp2.i + z__6.i * + temp2.r; + z__1.r = z__2.r + z__5.r, z__1.i = z__2.i + + z__5.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } +/* L200: */ + } +/* L210: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + temp1.r = 0., temp1.i = 0.; + temp2.r = 0., temp2.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + d_cnjg(&z__3, &a[l + i__ * a_dim1]); + i__4 = l + j * b_dim1; + z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] + .r; + z__1.r = temp1.r + z__2.r, z__1.i = temp1.i + z__2.i; + temp1.r = z__1.r, temp1.i = z__1.i; + d_cnjg(&z__3, &b[l + i__ * b_dim1]); + i__4 = l + j * a_dim1; + z__2.r = z__3.r * a[i__4].r - z__3.i * a[i__4].i, + z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4] + .r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; +/* L220: */ + } + if (i__ == j) { + if (*beta == 0.) { + i__3 = j + j * c_dim1; + z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__2.i = alpha->r * temp1.i + alpha->i * + temp1.r; + d_cnjg(&z__4, alpha); + z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, + z__3.i = z__4.r * temp2.i + z__4.i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + d__1 = z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } else { + i__3 = j + j * c_dim1; + i__4 = j + j * c_dim1; + z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__2.i = alpha->r * temp1.i + alpha->i * + temp1.r; + d_cnjg(&z__4, alpha); + z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, + z__3.i = z__4.r * temp2.i + z__4.i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + d__1 = *beta * c__[i__4].r + z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } + } else { + if (*beta == 0.) { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__2.i = alpha->r * temp1.i + alpha->i * + temp1.r; + d_cnjg(&z__4, alpha); + z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, + z__3.i = z__4.r * temp2.i + z__4.i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__3.r = *beta * c__[i__4].r, z__3.i = *beta * + c__[i__4].i; + z__4.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__4.i = alpha->r * temp1.i + alpha->i * + temp1.r; + z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + + z__4.i; + d_cnjg(&z__6, alpha); + z__5.r = z__6.r * temp2.r - z__6.i * temp2.i, + z__5.i = z__6.r * temp2.i + z__6.i * + temp2.r; + z__1.r = z__2.r + z__5.r, z__1.i = z__2.i + + z__5.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } +/* L230: */ + } +/* L240: */ + } + } + } + + return 0; + +/* End of ZHER2K */ + +} /* zher2k_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zhetd2.cpp b/lib/linalg/zhetd2.cpp new file mode 100644 index 0000000000..c6c59ad6d5 --- /dev/null +++ b/lib/linalg/zhetd2.cpp @@ -0,0 +1,439 @@ +/* fortran/zhetd2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublecomplex c_b2 = {0.,0.}; +static integer c__1 = 1; + +/* > \brief \b ZHETD2 reduces a Hermitian matrix to real symmetric tridiagonal form by an unitary similarity t +ransformation (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZHETD2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZHETD2( UPLO, N, A, LDA, D, E, TAU, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDA, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( * ), E( * ) */ +/* COMPLEX*16 A( LDA, * ), TAU( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZHETD2 reduces a complex Hermitian matrix A to real symmetric */ +/* > tridiagonal form T by a unitary similarity transformation: */ +/* > Q**H * A * Q = T. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies whether the upper or lower triangular part of the */ +/* > Hermitian matrix A is stored: */ +/* > = 'U': Upper triangular */ +/* > = 'L': Lower triangular */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > On entry, the Hermitian matrix A. If UPLO = 'U', the leading */ +/* > n-by-n upper triangular part of A contains the upper */ +/* > triangular part of the matrix A, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading n-by-n lower triangular part of A contains the lower */ +/* > triangular part of the matrix A, and the strictly upper */ +/* > triangular part of A is not referenced. */ +/* > On exit, if UPLO = 'U', the diagonal and first superdiagonal */ +/* > of A are overwritten by the corresponding elements of the */ +/* > tridiagonal matrix T, and the elements above the first */ +/* > superdiagonal, with the array TAU, represent the unitary */ +/* > matrix Q as a product of elementary reflectors; if UPLO */ +/* > = 'L', the diagonal and first subdiagonal of A are over- */ +/* > written by the corresponding elements of the tridiagonal */ +/* > matrix T, and the elements below the first subdiagonal, with */ +/* > the array TAU, represent the unitary matrix Q as a product */ +/* > of elementary reflectors. See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > The diagonal elements of the tridiagonal matrix T: */ +/* > D(i) = A(i,i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > The off-diagonal elements of the tridiagonal matrix T: */ +/* > E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (N-1) */ +/* > The scalar factors of the elementary reflectors (see Further */ +/* > Details). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16HEcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > If UPLO = 'U', the matrix Q is represented as a product of elementary */ +/* > reflectors */ +/* > */ +/* > Q = H(n-1) . . . H(2) H(1). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**H */ +/* > */ +/* > where tau is a complex scalar, and v is a complex vector with */ +/* > v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in */ +/* > A(1:i-1,i+1), and tau in TAU(i). */ +/* > */ +/* > If UPLO = 'L', the matrix Q is represented as a product of elementary */ +/* > reflectors */ +/* > */ +/* > Q = H(1) H(2) . . . H(n-1). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**H */ +/* > */ +/* > where tau is a complex scalar, and v is a complex vector with */ +/* > v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), */ +/* > and tau in TAU(i). */ +/* > */ +/* > The contents of A on exit are illustrated by the following examples */ +/* > with n = 5: */ +/* > */ +/* > if UPLO = 'U': if UPLO = 'L': */ +/* > */ +/* > ( d e v2 v3 v4 ) ( d ) */ +/* > ( d e v3 v4 ) ( e d ) */ +/* > ( d e v4 ) ( v1 e d ) */ +/* > ( d e ) ( v1 v2 e d ) */ +/* > ( d ) ( v1 v2 v3 e d ) */ +/* > */ +/* > where d and e denote diagonal and off-diagonal elements of T, and vi */ +/* > denotes an element of the vector defining H(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zhetd2_(char *uplo, integer *n, doublecomplex *a, + integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, + integer *info, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + doublereal d__1; + doublecomplex z__1, z__2, z__3, z__4; + + /* Local variables */ + integer i__; + doublecomplex taui; + extern /* Subroutine */ int zher2_(char *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen); + doublecomplex alpha; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *); + extern /* Subroutine */ int zhemv_(char *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, ftnlen); + logical upper; + extern /* Subroutine */ int zaxpy_(integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *), xerbla_( + char *, integer *, ftnlen), zlarfg_(integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --d__; + --e; + --tau; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZHETD2", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n <= 0) { + return 0; + } + + if (upper) { + +/* Reduce the upper triangle of A */ + + i__1 = *n + *n * a_dim1; + i__2 = *n + *n * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + for (i__ = *n - 1; i__ >= 1; --i__) { + +/* Generate elementary reflector H(i) = I - tau * v * v**H */ +/* to annihilate A(1:i-1,i+1) */ + + i__1 = i__ + (i__ + 1) * a_dim1; + alpha.r = a[i__1].r, alpha.i = a[i__1].i; + zlarfg_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &taui); + e[i__] = alpha.r; + + if (taui.r != 0. || taui.i != 0.) { + +/* Apply H(i) from both sides to A(1:i,1:i) */ + + i__1 = i__ + (i__ + 1) * a_dim1; + a[i__1].r = 1., a[i__1].i = 0.; + +/* Compute x := tau * A * v storing x in TAU(1:i) */ + + zhemv_(uplo, &i__, &taui, &a[a_offset], lda, &a[(i__ + 1) * + a_dim1 + 1], &c__1, &c_b2, &tau[1], &c__1, (ftnlen)1); + +/* Compute w := x - 1/2 * tau * (x**H * v) * v */ + + z__3.r = -.5, z__3.i = -0.; + z__2.r = z__3.r * taui.r - z__3.i * taui.i, z__2.i = z__3.r * + taui.i + z__3.i * taui.r; + zdotc_(&z__4, &i__, &tau[1], &c__1, &a[(i__ + 1) * a_dim1 + 1] + , &c__1); + z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * + z__4.i + z__2.i * z__4.r; + alpha.r = z__1.r, alpha.i = z__1.i; + zaxpy_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[ + 1], &c__1); + +/* Apply the transformation as a rank-2 update: */ +/* A := A - v * w**H - w * v**H */ + + z__1.r = -1., z__1.i = -0.; + zher2_(uplo, &i__, &z__1, &a[(i__ + 1) * a_dim1 + 1], &c__1, & + tau[1], &c__1, &a[a_offset], lda, (ftnlen)1); + + } else { + i__1 = i__ + i__ * a_dim1; + i__2 = i__ + i__ * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + } + i__1 = i__ + (i__ + 1) * a_dim1; + i__2 = i__; + a[i__1].r = e[i__2], a[i__1].i = 0.; + i__1 = i__ + 1 + (i__ + 1) * a_dim1; + d__[i__ + 1] = a[i__1].r; + i__1 = i__; + tau[i__1].r = taui.r, tau[i__1].i = taui.i; +/* L10: */ + } + i__1 = a_dim1 + 1; + d__[1] = a[i__1].r; + } else { + +/* Reduce the lower triangle of A */ + + i__1 = a_dim1 + 1; + i__2 = a_dim1 + 1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Generate elementary reflector H(i) = I - tau * v * v**H */ +/* to annihilate A(i+2:n,i) */ + + i__2 = i__ + 1 + i__ * a_dim1; + alpha.r = a[i__2].r, alpha.i = a[i__2].i; + i__2 = *n - i__; +/* Computing MIN */ + i__3 = i__ + 2; + zlarfg_(&i__2, &alpha, &a[min(i__3,*n) + i__ * a_dim1], &c__1, & + taui); + e[i__] = alpha.r; + + if (taui.r != 0. || taui.i != 0.) { + +/* Apply H(i) from both sides to A(i+1:n,i+1:n) */ + + i__2 = i__ + 1 + i__ * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; + +/* Compute x := tau * A * v storing y in TAU(i:n-1) */ + + i__2 = *n - i__; + zhemv_(uplo, &i__2, &taui, &a[i__ + 1 + (i__ + 1) * a_dim1], + lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b2, &tau[ + i__], &c__1, (ftnlen)1); + +/* Compute w := x - 1/2 * tau * (x**H * v) * v */ + + z__3.r = -.5, z__3.i = -0.; + z__2.r = z__3.r * taui.r - z__3.i * taui.i, z__2.i = z__3.r * + taui.i + z__3.i * taui.r; + i__2 = *n - i__; + zdotc_(&z__4, &i__2, &tau[i__], &c__1, &a[i__ + 1 + i__ * + a_dim1], &c__1); + z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * + z__4.i + z__2.i * z__4.r; + alpha.r = z__1.r, alpha.i = z__1.i; + i__2 = *n - i__; + zaxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[ + i__], &c__1); + +/* Apply the transformation as a rank-2 update: */ +/* A := A - v * w**H - w * v**H */ + + i__2 = *n - i__; + z__1.r = -1., z__1.i = -0.; + zher2_(uplo, &i__2, &z__1, &a[i__ + 1 + i__ * a_dim1], &c__1, + &tau[i__], &c__1, &a[i__ + 1 + (i__ + 1) * a_dim1], + lda, (ftnlen)1); + + } else { + i__2 = i__ + 1 + (i__ + 1) * a_dim1; + i__3 = i__ + 1 + (i__ + 1) * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } + i__2 = i__ + 1 + i__ * a_dim1; + i__3 = i__; + a[i__2].r = e[i__3], a[i__2].i = 0.; + i__2 = i__ + i__ * a_dim1; + d__[i__] = a[i__2].r; + i__2 = i__; + tau[i__2].r = taui.r, tau[i__2].i = taui.i; +/* L20: */ + } + i__1 = *n + *n * a_dim1; + d__[*n] = a[i__1].r; + } + + return 0; + +/* End of ZHETD2 */ + +} /* zhetd2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zhetrd.cpp b/lib/linalg/zhetrd.cpp new file mode 100644 index 0000000000..e1c8481bbb --- /dev/null +++ b/lib/linalg/zhetrd.cpp @@ -0,0 +1,463 @@ +/* fortran/zhetrd.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__3 = 3; +static integer c__2 = 2; +static doublereal c_b23 = 1.; + +/* > \brief \b ZHETRD */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZHETRD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZHETRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDA, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( * ), E( * ) */ +/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZHETRD reduces a complex Hermitian matrix A to real symmetric */ +/* > tridiagonal form T by a unitary similarity transformation: */ +/* > Q**H * A * Q = T. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A is stored; */ +/* > = 'L': Lower triangle of A is stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > On entry, the Hermitian matrix A. If UPLO = 'U', the leading */ +/* > N-by-N upper triangular part of A contains the upper */ +/* > triangular part of the matrix A, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading N-by-N lower triangular part of A contains the lower */ +/* > triangular part of the matrix A, and the strictly upper */ +/* > triangular part of A is not referenced. */ +/* > On exit, if UPLO = 'U', the diagonal and first superdiagonal */ +/* > of A are overwritten by the corresponding elements of the */ +/* > tridiagonal matrix T, and the elements above the first */ +/* > superdiagonal, with the array TAU, represent the unitary */ +/* > matrix Q as a product of elementary reflectors; if UPLO */ +/* > = 'L', the diagonal and first subdiagonal of A are over- */ +/* > written by the corresponding elements of the tridiagonal */ +/* > matrix T, and the elements below the first subdiagonal, with */ +/* > the array TAU, represent the unitary matrix Q as a product */ +/* > of elementary reflectors. See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > The diagonal elements of the tridiagonal matrix T: */ +/* > D(i) = A(i,i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > The off-diagonal elements of the tridiagonal matrix T: */ +/* > E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (N-1) */ +/* > The scalar factors of the elementary reflectors (see Further */ +/* > Details). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= 1. */ +/* > For optimum performance LWORK >= N*NB, where NB is the */ +/* > optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16HEcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > If UPLO = 'U', the matrix Q is represented as a product of elementary */ +/* > reflectors */ +/* > */ +/* > Q = H(n-1) . . . H(2) H(1). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**H */ +/* > */ +/* > where tau is a complex scalar, and v is a complex vector with */ +/* > v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in */ +/* > A(1:i-1,i+1), and tau in TAU(i). */ +/* > */ +/* > If UPLO = 'L', the matrix Q is represented as a product of elementary */ +/* > reflectors */ +/* > */ +/* > Q = H(1) H(2) . . . H(n-1). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**H */ +/* > */ +/* > where tau is a complex scalar, and v is a complex vector with */ +/* > v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), */ +/* > and tau in TAU(i). */ +/* > */ +/* > The contents of A on exit are illustrated by the following examples */ +/* > with n = 5: */ +/* > */ +/* > if UPLO = 'U': if UPLO = 'L': */ +/* > */ +/* > ( d e v2 v3 v4 ) ( d ) */ +/* > ( d e v3 v4 ) ( e d ) */ +/* > ( d e v4 ) ( v1 e d ) */ +/* > ( d e ) ( v1 v2 e d ) */ +/* > ( d ) ( v1 v2 v3 e d ) */ +/* > */ +/* > where d and e denote diagonal and off-diagonal elements of T, and vi */ +/* > denotes an element of the vector defining H(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zhetrd_(char *uplo, integer *n, doublecomplex *a, + integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, + doublecomplex *work, integer *lwork, integer *info, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1; + + /* Local variables */ + integer i__, j, nb, kk, nx, iws; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nbmin, iinfo; + logical upper; + extern /* Subroutine */ int zhetd2_(char *, integer *, doublecomplex *, + integer *, doublereal *, doublereal *, doublecomplex *, integer *, + ftnlen), zher2k_(char *, char *, integer *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *, doublereal *, doublecomplex *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlatrd_(char *, integer *, integer *, + doublecomplex *, integer *, doublereal *, doublecomplex *, + doublecomplex *, integer *, ftnlen); + integer ldwork, lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --d__; + --e; + --tau; + --work; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } else if (*lwork < 1 && ! lquery) { + *info = -9; + } + + if (*info == 0) { + +/* Determine the block size. */ + + nb = ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, + (ftnlen)1); + lwkopt = *n * nb; + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZHETRD", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + work[1].r = 1., work[1].i = 0.; + return 0; + } + + nx = *n; + iws = 1; + if (nb > 1 && nb < *n) { + +/* Determine when to cross over from blocked to unblocked code */ +/* (last block is always handled by unblocked code). */ + +/* Computing MAX */ + i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, & + c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *n) { + +/* Determine if workspace is large enough for blocked code. */ + + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { + +/* Not enough workspace to use optimal NB: determine the */ +/* minimum value of NB, and reduce NB or force use of */ +/* unblocked code by setting NX = N. */ + +/* Computing MAX */ + i__1 = *lwork / ldwork; + nb = max(i__1,1); + nbmin = ilaenv_(&c__2, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, + (ftnlen)6, (ftnlen)1); + if (nb < nbmin) { + nx = *n; + } + } + } else { + nx = *n; + } + } else { + nb = 1; + } + + if (upper) { + +/* Reduce the upper triangle of A. */ +/* Columns 1:kk are handled by the unblocked method. */ + + kk = *n - (*n - nx + nb - 1) / nb * nb; + i__1 = kk + 1; + i__2 = -nb; + for (i__ = *n - nb + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += + i__2) { + +/* Reduce columns i:i+nb-1 to tridiagonal form and form the */ +/* matrix W which is needed to update the unreduced part of */ +/* the matrix */ + + i__3 = i__ + nb - 1; + zlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], & + work[1], &ldwork, (ftnlen)1); + +/* Update the unreduced submatrix A(1:i-1,1:i-1), using an */ +/* update of the form: A := A - V*W**H - W*V**H */ + + i__3 = i__ - 1; + z__1.r = -1., z__1.i = -0.; + zher2k_(uplo, (char *)"No transpose", &i__3, &nb, &z__1, &a[i__ * a_dim1 + + 1], lda, &work[1], &ldwork, &c_b23, &a[a_offset], lda, ( + ftnlen)1, (ftnlen)12); + +/* Copy superdiagonal elements back into A, and diagonal */ +/* elements into D */ + + i__3 = i__ + nb - 1; + for (j = i__; j <= i__3; ++j) { + i__4 = j - 1 + j * a_dim1; + i__5 = j - 1; + a[i__4].r = e[i__5], a[i__4].i = 0.; + i__4 = j + j * a_dim1; + d__[j] = a[i__4].r; +/* L10: */ + } +/* L20: */ + } + +/* Use unblocked code to reduce the last or only block */ + + zhetd2_(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo, + (ftnlen)1); + } else { + +/* Reduce the lower triangle of A */ + + i__2 = *n - nx; + i__1 = nb; + for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { + +/* Reduce columns i:i+nb-1 to tridiagonal form and form the */ +/* matrix W which is needed to update the unreduced part of */ +/* the matrix */ + + i__3 = *n - i__ + 1; + zlatrd_(uplo, &i__3, &nb, &a[i__ + i__ * a_dim1], lda, &e[i__], & + tau[i__], &work[1], &ldwork, (ftnlen)1); + +/* Update the unreduced submatrix A(i+nb:n,i+nb:n), using */ +/* an update of the form: A := A - V*W**H - W*V**H */ + + i__3 = *n - i__ - nb + 1; + z__1.r = -1., z__1.i = -0.; + zher2k_(uplo, (char *)"No transpose", &i__3, &nb, &z__1, &a[i__ + nb + + i__ * a_dim1], lda, &work[nb + 1], &ldwork, &c_b23, &a[ + i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)1, (ftnlen) + 12); + +/* Copy subdiagonal elements back into A, and diagonal */ +/* elements into D */ + + i__3 = i__ + nb - 1; + for (j = i__; j <= i__3; ++j) { + i__4 = j + 1 + j * a_dim1; + i__5 = j; + a[i__4].r = e[i__5], a[i__4].i = 0.; + i__4 = j + j * a_dim1; + d__[j] = a[i__4].r; +/* L30: */ + } +/* L40: */ + } + +/* Use unblocked code to reduce the last or only block */ + + i__1 = *n - i__ + 1; + zhetd2_(uplo, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], + &tau[i__], &iinfo, (ftnlen)1); + } + + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + return 0; + +/* End of ZHETRD */ + +} /* zhetrd_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zhpr.cpp b/lib/linalg/zhpr.cpp new file mode 100644 index 0000000000..f3c36d5826 --- /dev/null +++ b/lib/linalg/zhpr.cpp @@ -0,0 +1,405 @@ +/* fortran/zhpr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZHPR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZHPR(UPLO,N,ALPHA,X,INCX,AP) */ + +/* .. Scalar Arguments .. */ +/* DOUBLE PRECISION ALPHA */ +/* INTEGER INCX,N */ +/* CHARACTER UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 AP(*),X(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZHPR performs the hermitian rank 1 operation */ +/* > */ +/* > A := alpha*x*x**H + A, */ +/* > */ +/* > where alpha is a real scalar, x is an n element vector and A is an */ +/* > n by n hermitian matrix, supplied in packed form. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the upper or lower */ +/* > triangular part of the matrix A is supplied in the packed */ +/* > array AP as follows: */ +/* > */ +/* > UPLO = 'U' or 'u' The upper triangular part of A is */ +/* > supplied in AP. */ +/* > */ +/* > UPLO = 'L' or 'l' The lower triangular part of A is */ +/* > supplied in AP. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is DOUBLE PRECISION. */ +/* > On entry, ALPHA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array X must contain the n */ +/* > element vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] AP */ +/* > \verbatim */ +/* > AP is COMPLEX*16 array, dimension at least */ +/* > ( ( n*( n + 1 ) )/2 ). */ +/* > Before entry with UPLO = 'U' or 'u', the array AP must */ +/* > contain the upper triangular part of the hermitian matrix */ +/* > packed sequentially, column by column, so that AP( 1 ) */ +/* > contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 ) */ +/* > and a( 2, 2 ) respectively, and so on. On exit, the array */ +/* > AP is overwritten by the upper triangular part of the */ +/* > updated matrix. */ +/* > Before entry with UPLO = 'L' or 'l', the array AP must */ +/* > contain the lower triangular part of the hermitian matrix */ +/* > packed sequentially, column by column, so that AP( 1 ) */ +/* > contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 ) */ +/* > and a( 3, 1 ) respectively, and so on. On exit, the array */ +/* > AP is overwritten by the lower triangular part of the */ +/* > updated matrix. */ +/* > Note that the imaginary parts of the diagonal elements need */ +/* > not be set, they are assumed to be zero, and on exit they */ +/* > are set to zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zhpr_(char *uplo, integer *n, doublereal *alpha, + doublecomplex *x, integer *incx, doublecomplex *ap, ftnlen uplo_len) +{ + /* System generated locals */ + integer i__1, i__2, i__3, i__4, i__5; + doublereal d__1; + doublecomplex z__1, z__2; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, k, kk, ix, jx, kx, info; + doublecomplex temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --ap; + --x; + + /* Function Body */ + info = 0; + if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (*n < 0) { + info = 2; + } else if (*incx == 0) { + info = 5; + } + if (info != 0) { + xerbla_((char *)"ZHPR ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0 || *alpha == 0.) { + return 0; + } + +/* Set the start point in X if the increment is not unity. */ + + if (*incx <= 0) { + kx = 1 - (*n - 1) * *incx; + } else if (*incx != 1) { + kx = 1; + } + +/* Start the operations. In this version the elements of the array AP */ +/* are accessed sequentially with one pass through AP. */ + + kk = 1; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + +/* Form A when upper triangle is stored in AP. */ + + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + d_cnjg(&z__2, &x[j]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + k = kk; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = k; + i__4 = k; + i__5 = i__; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * + temp.r; + z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + + z__2.i; + ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; + ++k; +/* L10: */ + } + i__2 = kk + j - 1; + i__3 = kk + j - 1; + i__4 = j; + z__1.r = x[i__4].r * temp.r - x[i__4].i * temp.i, z__1.i = + x[i__4].r * temp.i + x[i__4].i * temp.r; + d__1 = ap[i__3].r + z__1.r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + } else { + i__2 = kk + j - 1; + i__3 = kk + j - 1; + d__1 = ap[i__3].r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + } + kk += j; +/* L20: */ + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + d_cnjg(&z__2, &x[jx]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix = kx; + i__2 = kk + j - 2; + for (k = kk; k <= i__2; ++k) { + i__3 = k; + i__4 = k; + i__5 = ix; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * + temp.r; + z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + + z__2.i; + ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; + ix += *incx; +/* L30: */ + } + i__2 = kk + j - 1; + i__3 = kk + j - 1; + i__4 = jx; + z__1.r = x[i__4].r * temp.r - x[i__4].i * temp.i, z__1.i = + x[i__4].r * temp.i + x[i__4].i * temp.r; + d__1 = ap[i__3].r + z__1.r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + } else { + i__2 = kk + j - 1; + i__3 = kk + j - 1; + d__1 = ap[i__3].r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + } + jx += *incx; + kk += j; +/* L40: */ + } + } + } else { + +/* Form A when lower triangle is stored in AP. */ + + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + d_cnjg(&z__2, &x[j]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = kk; + i__3 = kk; + i__4 = j; + z__1.r = temp.r * x[i__4].r - temp.i * x[i__4].i, z__1.i = + temp.r * x[i__4].i + temp.i * x[i__4].r; + d__1 = ap[i__3].r + z__1.r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + k = kk + 1; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = k; + i__4 = k; + i__5 = i__; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * + temp.r; + z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + + z__2.i; + ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; + ++k; +/* L50: */ + } + } else { + i__2 = kk; + i__3 = kk; + d__1 = ap[i__3].r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + } + kk = kk + *n - j + 1; +/* L60: */ + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + d_cnjg(&z__2, &x[jx]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = kk; + i__3 = kk; + i__4 = jx; + z__1.r = temp.r * x[i__4].r - temp.i * x[i__4].i, z__1.i = + temp.r * x[i__4].i + temp.i * x[i__4].r; + d__1 = ap[i__3].r + z__1.r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + ix = jx; + i__2 = kk + *n - j; + for (k = kk + 1; k <= i__2; ++k) { + ix += *incx; + i__3 = k; + i__4 = k; + i__5 = ix; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * + temp.r; + z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + + z__2.i; + ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; +/* L70: */ + } + } else { + i__2 = kk; + i__3 = kk; + d__1 = ap[i__3].r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + } + jx += *incx; + kk = kk + *n - j + 1; +/* L80: */ + } + } + } + + return 0; + +/* End of ZHPR */ + +} /* zhpr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlacgv.cpp b/lib/linalg/zlacgv.cpp new file mode 100644 index 0000000000..46c1c5c0ce --- /dev/null +++ b/lib/linalg/zlacgv.cpp @@ -0,0 +1,157 @@ +/* fortran/zlacgv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZLACGV conjugates a complex vector. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLACGV + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLACGV( N, X, INCX ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 X( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLACGV conjugates a complex vector of length N. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The length of the vector X. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 array, dimension */ +/* > (1+(N-1)*abs(INCX)) */ +/* > On entry, the vector of length N to be conjugated. */ +/* > On exit, X is overwritten with conjg(X). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > The spacing between successive elements of X. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int zlacgv_(integer *n, doublecomplex *x, integer *incx) +{ + /* System generated locals */ + integer i__1, i__2; + doublecomplex z__1; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, ioff; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --x; + + /* Function Body */ + if (*incx == 1) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + d_cnjg(&z__1, &x[i__]); + x[i__2].r = z__1.r, x[i__2].i = z__1.i; +/* L10: */ + } + } else { + ioff = 1; + if (*incx < 0) { + ioff = 1 - (*n - 1) * *incx; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ioff; + d_cnjg(&z__1, &x[ioff]); + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + ioff += *incx; +/* L20: */ + } + } + return 0; + +/* End of ZLACGV */ + +} /* zlacgv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlacpy.cpp b/lib/linalg/zlacpy.cpp new file mode 100644 index 0000000000..1cb52d4c0a --- /dev/null +++ b/lib/linalg/zlacpy.cpp @@ -0,0 +1,210 @@ +/* fortran/zlacpy.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZLACPY copies all or part of one two-dimensional array to another. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLACPY + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLACPY( UPLO, M, N, A, LDA, B, LDB ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER LDA, LDB, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ), B( LDB, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLACPY copies all or part of a two-dimensional matrix A to another */ +/* > matrix B. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies the part of the matrix A to be copied to B. */ +/* > = 'U': Upper triangular part */ +/* > = 'L': Lower triangular part */ +/* > Otherwise: All of the matrix A */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > The m by n matrix A. If UPLO = 'U', only the upper trapezium */ +/* > is accessed; if UPLO = 'L', only the lower trapezium is */ +/* > accessed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] B */ +/* > \verbatim */ +/* > B is COMPLEX*16 array, dimension (LDB,N) */ +/* > On exit, B = A in the locations specified by UPLO. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >= max(1,M). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int zlacpy_(char *uplo, integer *m, integer *n, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; + + /* Local variables */ + integer i__, j; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = min(j,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * a_dim1; + b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; +/* L10: */ + } +/* L20: */ + } + + } else if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * a_dim1; + b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; +/* L30: */ + } +/* L40: */ + } + + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * a_dim1; + b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; +/* L50: */ + } +/* L60: */ + } + } + + return 0; + +/* End of ZLACPY */ + +} /* zlacpy_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlacrm.cpp b/lib/linalg/zlacrm.cpp new file mode 100644 index 0000000000..e993f79aa5 --- /dev/null +++ b/lib/linalg/zlacrm.cpp @@ -0,0 +1,258 @@ +/* fortran/zlacrm.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b6 = 1.; +static doublereal c_b7 = 0.; + +/* > \brief \b ZLACRM multiplies a complex matrix by a square real matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLACRM + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLACRM( M, N, A, LDA, B, LDB, C, LDC, RWORK ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER LDA, LDB, LDC, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION B( LDB, * ), RWORK( * ) */ +/* COMPLEX*16 A( LDA, * ), C( LDC, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLACRM performs a very simple matrix-matrix multiplication: */ +/* > C := A * B, */ +/* > where A is M by N and complex; B is N by N and real; */ +/* > C is M by N and complex. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A and of the matrix C. */ +/* > M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns and rows of the matrix B and */ +/* > the number of columns of the matrix C. */ +/* > N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA, N) */ +/* > On entry, A contains the M by N matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >=max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] B */ +/* > \verbatim */ +/* > B is DOUBLE PRECISION array, dimension (LDB, N) */ +/* > On entry, B contains the N by N matrix B. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > The leading dimension of the array B. LDB >=max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] C */ +/* > \verbatim */ +/* > C is COMPLEX*16 array, dimension (LDC, N) */ +/* > On exit, C contains the M by N matrix C. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >=max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RWORK */ +/* > \verbatim */ +/* > RWORK is DOUBLE PRECISION array, dimension (2*M*N) */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int zlacrm_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublereal *b, integer *ldb, doublecomplex *c__, + integer *ldc, doublereal *rwork) +{ + /* System generated locals */ + integer b_dim1, b_offset, a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, + i__3, i__4, i__5; + doublereal d__1; + doublecomplex z__1; + + /* Builtin functions */ + double d_imag(doublecomplex *); + + /* Local variables */ + integer i__, j, l; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick return if possible. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --rwork; + + /* Function Body */ + if (*m == 0 || *n == 0) { + return 0; + } + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + rwork[(j - 1) * *m + i__] = a[i__3].r; +/* L10: */ + } +/* L20: */ + } + + l = *m * *n + 1; + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b6, &rwork[1], m, &b[b_offset], ldb, &c_b7, & + rwork[l], m, (ftnlen)1, (ftnlen)1); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = l + (j - 1) * *m + i__ - 1; + c__[i__3].r = rwork[i__4], c__[i__3].i = 0.; +/* L30: */ + } +/* L40: */ + } + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + rwork[(j - 1) * *m + i__] = d_imag(&a[i__ + j * a_dim1]); +/* L50: */ + } +/* L60: */ + } + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b6, &rwork[1], m, &b[b_offset], ldb, &c_b7, & + rwork[l], m, (ftnlen)1, (ftnlen)1); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + d__1 = c__[i__4].r; + i__5 = l + (j - 1) * *m + i__ - 1; + z__1.r = d__1, z__1.i = rwork[i__5]; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L70: */ + } +/* L80: */ + } + + return 0; + +/* End of ZLACRM */ + +} /* zlacrm_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zladiv.cpp b/lib/linalg/zladiv.cpp new file mode 100644 index 0000000000..6e80b3371a --- /dev/null +++ b/lib/linalg/zladiv.cpp @@ -0,0 +1,132 @@ +/* fortran/zladiv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZLADIV performs complex division in real arithmetic, avoiding unnecessary overflow. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLADIV + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* COMPLEX*16 FUNCTION ZLADIV( X, Y ) */ + +/* .. Scalar Arguments .. */ +/* COMPLEX*16 X, Y */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLADIV := X / Y, where X and Y are complex. The computation of X / Y */ +/* > will not overflow on an intermediary step unless the results */ +/* > overflows. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Y */ +/* > \verbatim */ +/* > Y is COMPLEX*16 */ +/* > The complex scalars X and Y. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* ===================================================================== */ +/* Double Complex */ VOID zladiv_(doublecomplex * ret_val, doublecomplex *x, + doublecomplex *y) +{ + /* System generated locals */ + doublereal d__1, d__2, d__3, d__4; + doublecomplex z__1; + + /* Builtin functions */ + double d_imag(doublecomplex *); + + /* Local variables */ + doublereal zi, zr; + extern /* Subroutine */ int dladiv_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + d__1 = x->r; + d__2 = d_imag(x); + d__3 = y->r; + d__4 = d_imag(y); + dladiv_(&d__1, &d__2, &d__3, &d__4, &zr, &zi); + z__1.r = zr, z__1.i = zi; + ret_val->r = z__1.r, ret_val->i = z__1.i; + + return ; + +/* End of ZLADIV */ + +} /* zladiv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlaed0.cpp b/lib/linalg/zlaed0.cpp new file mode 100644 index 0000000000..680dd85054 --- /dev/null +++ b/lib/linalg/zlaed0.cpp @@ -0,0 +1,458 @@ +/* fortran/zlaed0.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__9 = 9; +static integer c__0 = 0; +static integer c__2 = 2; +static integer c__1 = 1; + +/* > \brief \b ZLAED0 used by ZSTEDC. Computes all eigenvalues and corresponding eigenvectors of an unreduced +symmetric tridiagonal matrix using the divide and conquer method. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLAED0 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLAED0( QSIZ, N, D, E, Q, LDQ, QSTORE, LDQS, RWORK, */ +/* IWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, LDQ, LDQS, N, QSIZ */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IWORK( * ) */ +/* DOUBLE PRECISION D( * ), E( * ), RWORK( * ) */ +/* COMPLEX*16 Q( LDQ, * ), QSTORE( LDQS, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Using the divide and conquer method, ZLAED0 computes all eigenvalues */ +/* > of a symmetric tridiagonal matrix which is one diagonal block of */ +/* > those from reducing a dense or band Hermitian matrix and */ +/* > corresponding eigenvectors of the dense or band matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] QSIZ */ +/* > \verbatim */ +/* > QSIZ is INTEGER */ +/* > The dimension of the unitary matrix used to reduce */ +/* > the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the diagonal elements of the tridiagonal matrix. */ +/* > On exit, the eigenvalues in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > On entry, the off-diagonal elements of the tridiagonal matrix. */ +/* > On exit, E has been destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Q */ +/* > \verbatim */ +/* > Q is COMPLEX*16 array, dimension (LDQ,N) */ +/* > On entry, Q must contain an QSIZ x N matrix whose columns */ +/* > unitarily orthonormal. It is a part of the unitary matrix */ +/* > that reduces the full dense Hermitian matrix to a */ +/* > (reducible) symmetric tridiagonal matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQ */ +/* > \verbatim */ +/* > LDQ is INTEGER */ +/* > The leading dimension of the array Q. LDQ >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, */ +/* > the dimension of IWORK must be at least */ +/* > 6 + 6*N + 5*N*lg N */ +/* > ( lg( N ) = smallest integer k */ +/* > such that 2^k >= N ) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RWORK */ +/* > \verbatim */ +/* > RWORK is DOUBLE PRECISION array, */ +/* > dimension (1 + 3*N + 2*N*lg N + 3*N**2) */ +/* > ( lg( N ) = smallest integer k */ +/* > such that 2^k >= N ) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] QSTORE */ +/* > \verbatim */ +/* > QSTORE is COMPLEX*16 array, dimension (LDQS, N) */ +/* > Used to store parts of */ +/* > the eigenvector matrix when the updating matrix multiplies */ +/* > take place. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQS */ +/* > \verbatim */ +/* > LDQS is INTEGER */ +/* > The leading dimension of the array QSTORE. */ +/* > LDQS >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: The algorithm failed to compute an eigenvalue while */ +/* > working on the submatrix lying in rows and columns */ +/* > INFO/(N+1) through mod(INFO,N+1). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zlaed0_(integer *qsiz, integer *n, doublereal *d__, + doublereal *e, doublecomplex *q, integer *ldq, doublecomplex *qstore, + integer *ldqs, doublereal *rwork, integer *iwork, integer *info) +{ + /* System generated locals */ + integer q_dim1, q_offset, qstore_dim1, qstore_offset, i__1, i__2; + doublereal d__1; + + /* Builtin functions */ + double log(doublereal); + integer pow_ii(integer *, integer *); + + /* Local variables */ + integer i__, j, k, ll, iq, lgn, msd2, smm1, spm1, spm2; + doublereal temp; + integer curr, iperm; + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); + integer indxq, iwrem, iqptr, tlvls; + extern /* Subroutine */ int zcopy_(integer *, doublecomplex *, integer *, + doublecomplex *, integer *), zlaed7_(integer *, integer *, + integer *, integer *, integer *, integer *, doublereal *, + doublecomplex *, integer *, doublereal *, integer *, doublereal *, + integer *, integer *, integer *, integer *, integer *, + doublereal *, doublecomplex *, doublereal *, integer *, integer *) + ; + integer igivcl; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlacrm_(integer *, integer *, doublecomplex *, + integer *, doublereal *, integer *, doublecomplex *, integer *, + doublereal *); + integer igivnm, submat, curprb, subpbs, igivpt; + extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + ftnlen); + integer curlvl, matsiz, iprmpt, smlsiz; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* Warning: N could be as big as QSIZ! */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --e; + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + qstore_dim1 = *ldqs; + qstore_offset = 1 + qstore_dim1; + qstore -= qstore_offset; + --rwork; + --iwork; + + /* Function Body */ + *info = 0; + +/* IF( ICOMPQ .LT. 0 .OR. ICOMPQ .GT. 2 ) THEN */ +/* INFO = -1 */ +/* ELSE IF( ( ICOMPQ .EQ. 1 ) .AND. ( QSIZ .LT. MAX( 0, N ) ) ) */ +/* $ THEN */ + if (*qsiz < max(0,*n)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*ldq < max(1,*n)) { + *info = -6; + } else if (*ldqs < max(1,*n)) { + *info = -8; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZLAED0", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + smlsiz = ilaenv_(&c__9, (char *)"ZLAED0", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( + ftnlen)6, (ftnlen)1); + +/* Determine the size and placement of the submatrices, and save in */ +/* the leading elements of IWORK. */ + + iwork[1] = *n; + subpbs = 1; + tlvls = 0; +L10: + if (iwork[subpbs] > smlsiz) { + for (j = subpbs; j >= 1; --j) { + iwork[j * 2] = (iwork[j] + 1) / 2; + iwork[(j << 1) - 1] = iwork[j] / 2; +/* L20: */ + } + ++tlvls; + subpbs <<= 1; + goto L10; + } + i__1 = subpbs; + for (j = 2; j <= i__1; ++j) { + iwork[j] += iwork[j - 1]; +/* L30: */ + } + +/* Divide the matrix into SUBPBS submatrices of size at most SMLSIZ+1 */ +/* using rank-1 modifications (cuts). */ + + spm1 = subpbs - 1; + i__1 = spm1; + for (i__ = 1; i__ <= i__1; ++i__) { + submat = iwork[i__] + 1; + smm1 = submat - 1; + d__[smm1] -= (d__1 = e[smm1], abs(d__1)); + d__[submat] -= (d__1 = e[smm1], abs(d__1)); +/* L40: */ + } + + indxq = (*n << 2) + 3; + +/* Set up workspaces for eigenvalues only/accumulate new vectors */ +/* routine */ + + temp = log((doublereal) (*n)) / log(2.); + lgn = (integer) temp; + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + iprmpt = indxq + *n + 1; + iperm = iprmpt + *n * lgn; + iqptr = iperm + *n * lgn; + igivpt = iqptr + *n + 2; + igivcl = igivpt + *n * lgn; + + igivnm = 1; + iq = igivnm + (*n << 1) * lgn; +/* Computing 2nd power */ + i__1 = *n; + iwrem = iq + i__1 * i__1 + 1; +/* Initialize pointers */ + i__1 = subpbs; + for (i__ = 0; i__ <= i__1; ++i__) { + iwork[iprmpt + i__] = 1; + iwork[igivpt + i__] = 1; +/* L50: */ + } + iwork[iqptr] = 1; + +/* Solve each submatrix eigenproblem at the bottom of the divide and */ +/* conquer tree. */ + + curr = 0; + i__1 = spm1; + for (i__ = 0; i__ <= i__1; ++i__) { + if (i__ == 0) { + submat = 1; + matsiz = iwork[1]; + } else { + submat = iwork[i__] + 1; + matsiz = iwork[i__ + 1] - iwork[i__]; + } + ll = iq - 1 + iwork[iqptr + curr]; + dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &rwork[ll], &matsiz, & + rwork[1], info, (ftnlen)1); + zlacrm_(qsiz, &matsiz, &q[submat * q_dim1 + 1], ldq, &rwork[ll], & + matsiz, &qstore[submat * qstore_dim1 + 1], ldqs, &rwork[iwrem] + ); +/* Computing 2nd power */ + i__2 = matsiz; + iwork[iqptr + curr + 1] = iwork[iqptr + curr] + i__2 * i__2; + ++curr; + if (*info > 0) { + *info = submat * (*n + 1) + submat + matsiz - 1; + return 0; + } + k = 1; + i__2 = iwork[i__ + 1]; + for (j = submat; j <= i__2; ++j) { + iwork[indxq + j] = k; + ++k; +/* L60: */ + } +/* L70: */ + } + +/* Successively merge eigensystems of adjacent submatrices */ +/* into eigensystem for the corresponding larger matrix. */ + +/* while ( SUBPBS > 1 ) */ + + curlvl = 1; +L80: + if (subpbs > 1) { + spm2 = subpbs - 2; + i__1 = spm2; + for (i__ = 0; i__ <= i__1; i__ += 2) { + if (i__ == 0) { + submat = 1; + matsiz = iwork[2]; + msd2 = iwork[1]; + curprb = 0; + } else { + submat = iwork[i__] + 1; + matsiz = iwork[i__ + 2] - iwork[i__]; + msd2 = matsiz / 2; + ++curprb; + } + +/* Merge lower order eigensystems (of size MSD2 and MATSIZ - MSD2) */ +/* into an eigensystem of size MATSIZ. ZLAED7 handles the case */ +/* when the eigenvectors of a full or band Hermitian matrix (which */ +/* was reduced to tridiagonal form) are desired. */ + +/* I am free to use Q as a valuable working space until Loop 150. */ + + zlaed7_(&matsiz, &msd2, qsiz, &tlvls, &curlvl, &curprb, &d__[ + submat], &qstore[submat * qstore_dim1 + 1], ldqs, &e[ + submat + msd2 - 1], &iwork[indxq + submat], &rwork[iq], & + iwork[iqptr], &iwork[iprmpt], &iwork[iperm], &iwork[ + igivpt], &iwork[igivcl], &rwork[igivnm], &q[submat * + q_dim1 + 1], &rwork[iwrem], &iwork[subpbs + 1], info); + if (*info > 0) { + *info = submat * (*n + 1) + submat + matsiz - 1; + return 0; + } + iwork[i__ / 2 + 1] = iwork[i__ + 2]; +/* L90: */ + } + subpbs /= 2; + ++curlvl; + goto L80; + } + +/* end while */ + +/* Re-merge the eigenvalues/vectors which were deflated at the final */ +/* merge step. */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + j = iwork[indxq + i__]; + rwork[i__] = d__[j]; + zcopy_(qsiz, &qstore[j * qstore_dim1 + 1], &c__1, &q[i__ * q_dim1 + 1] + , &c__1); +/* L100: */ + } + dcopy_(n, &rwork[1], &c__1, &d__[1], &c__1); + + return 0; + +/* End of ZLAED0 */ + +} /* zlaed0_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlaed7.cpp b/lib/linalg/zlaed7.cpp new file mode 100644 index 0000000000..9c06a0c334 --- /dev/null +++ b/lib/linalg/zlaed7.cpp @@ -0,0 +1,456 @@ +/* fortran/zlaed7.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__2 = 2; +static integer c__1 = 1; +static integer c_n1 = -1; + +/* > \brief \b ZLAED7 used by ZSTEDC. Computes the updated eigensystem of a diagonal matrix after modification + by a rank-one symmetric matrix. Used when the original matrix is dense. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLAED7 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLAED7( N, CUTPNT, QSIZ, TLVLS, CURLVL, CURPBM, D, Q, */ +/* LDQ, RHO, INDXQ, QSTORE, QPTR, PRMPTR, PERM, */ +/* GIVPTR, GIVCOL, GIVNUM, WORK, RWORK, IWORK, */ +/* INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER CURLVL, CURPBM, CUTPNT, INFO, LDQ, N, QSIZ, */ +/* $ TLVLS */ +/* DOUBLE PRECISION RHO */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER GIVCOL( 2, * ), GIVPTR( * ), INDXQ( * ), */ +/* $ IWORK( * ), PERM( * ), PRMPTR( * ), QPTR( * ) */ +/* DOUBLE PRECISION D( * ), GIVNUM( 2, * ), QSTORE( * ), RWORK( * ) */ +/* COMPLEX*16 Q( LDQ, * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLAED7 computes the updated eigensystem of a diagonal */ +/* > matrix after modification by a rank-one symmetric matrix. This */ +/* > routine is used only for the eigenproblem which requires all */ +/* > eigenvalues and optionally eigenvectors of a dense or banded */ +/* > Hermitian matrix that has been reduced to tridiagonal form. */ +/* > */ +/* > T = Q(in) ( D(in) + RHO * Z*Z**H ) Q**H(in) = Q(out) * D(out) * Q**H(out) */ +/* > */ +/* > where Z = Q**Hu, u is a vector of length N with ones in the */ +/* > CUTPNT and CUTPNT + 1 th elements and zeros elsewhere. */ +/* > */ +/* > The eigenvectors of the original matrix are stored in Q, and the */ +/* > eigenvalues are in D. The algorithm consists of three stages: */ +/* > */ +/* > The first stage consists of deflating the size of the problem */ +/* > when there are multiple eigenvalues or if there is a zero in */ +/* > the Z vector. For each such occurrence the dimension of the */ +/* > secular equation problem is reduced by one. This stage is */ +/* > performed by the routine DLAED2. */ +/* > */ +/* > The second stage consists of calculating the updated */ +/* > eigenvalues. This is done by finding the roots of the secular */ +/* > equation via the routine DLAED4 (as called by SLAED3). */ +/* > This routine also calculates the eigenvectors of the current */ +/* > problem. */ +/* > */ +/* > The final stage consists of computing the updated eigenvectors */ +/* > directly using the updated eigenvalues. The eigenvectors for */ +/* > the current problem are multiplied with the eigenvectors from */ +/* > the overall problem. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CUTPNT */ +/* > \verbatim */ +/* > CUTPNT is INTEGER */ +/* > Contains the location of the last eigenvalue in the leading */ +/* > sub-matrix. min(1,N) <= CUTPNT <= N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] QSIZ */ +/* > \verbatim */ +/* > QSIZ is INTEGER */ +/* > The dimension of the unitary matrix used to reduce */ +/* > the full matrix to tridiagonal form. QSIZ >= N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TLVLS */ +/* > \verbatim */ +/* > TLVLS is INTEGER */ +/* > The total number of merging levels in the overall divide and */ +/* > conquer tree. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CURLVL */ +/* > \verbatim */ +/* > CURLVL is INTEGER */ +/* > The current level in the overall merge routine, */ +/* > 0 <= curlvl <= tlvls. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CURPBM */ +/* > \verbatim */ +/* > CURPBM is INTEGER */ +/* > The current problem in the current level in the overall */ +/* > merge routine (counting from upper left to lower right). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the eigenvalues of the rank-1-perturbed matrix. */ +/* > On exit, the eigenvalues of the repaired matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Q */ +/* > \verbatim */ +/* > Q is COMPLEX*16 array, dimension (LDQ,N) */ +/* > On entry, the eigenvectors of the rank-1-perturbed matrix. */ +/* > On exit, the eigenvectors of the repaired tridiagonal matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQ */ +/* > \verbatim */ +/* > LDQ is INTEGER */ +/* > The leading dimension of the array Q. LDQ >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > Contains the subdiagonal element used to create the rank-1 */ +/* > modification. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INDXQ */ +/* > \verbatim */ +/* > INDXQ is INTEGER array, dimension (N) */ +/* > This contains the permutation which will reintegrate the */ +/* > subproblem just solved back into sorted order, */ +/* > ie. D( INDXQ( I = 1, N ) ) will be in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension (4*N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RWORK */ +/* > \verbatim */ +/* > RWORK is DOUBLE PRECISION array, */ +/* > dimension (3*N+2*QSIZ*N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (QSIZ*N) */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] QSTORE */ +/* > \verbatim */ +/* > QSTORE is DOUBLE PRECISION array, dimension (N**2+1) */ +/* > Stores eigenvectors of submatrices encountered during */ +/* > divide and conquer, packed together. QPTR points to */ +/* > beginning of the submatrices. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] QPTR */ +/* > \verbatim */ +/* > QPTR is INTEGER array, dimension (N+2) */ +/* > List of indices pointing to beginning of submatrices stored */ +/* > in QSTORE. The submatrices are numbered starting at the */ +/* > bottom left of the divide and conquer tree, from left to */ +/* > right and bottom to top. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PRMPTR */ +/* > \verbatim */ +/* > PRMPTR is INTEGER array, dimension (N lg N) */ +/* > Contains a list of pointers which indicate where in PERM a */ +/* > level's permutation is stored. PRMPTR(i+1) - PRMPTR(i) */ +/* > indicates the size of the permutation and also the size of */ +/* > the full, non-deflated problem. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PERM */ +/* > \verbatim */ +/* > PERM is INTEGER array, dimension (N lg N) */ +/* > Contains the permutations (from deflation and sorting) to be */ +/* > applied to each eigenblock. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVPTR */ +/* > \verbatim */ +/* > GIVPTR is INTEGER array, dimension (N lg N) */ +/* > Contains a list of pointers which indicate where in GIVCOL a */ +/* > level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i) */ +/* > indicates the number of Givens rotations. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVCOL */ +/* > \verbatim */ +/* > GIVCOL is INTEGER array, dimension (2, N lg N) */ +/* > Each pair of numbers indicates a pair of columns to take place */ +/* > in a Givens rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] GIVNUM */ +/* > \verbatim */ +/* > GIVNUM is DOUBLE PRECISION array, dimension (2, N lg N) */ +/* > Each number indicates the S value to be used in the */ +/* > corresponding Givens rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: if INFO = 1, an eigenvalue did not converge */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zlaed7_(integer *n, integer *cutpnt, integer *qsiz, + integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, + doublecomplex *q, integer *ldq, doublereal *rho, integer *indxq, + doublereal *qstore, integer *qptr, integer *prmptr, integer *perm, + integer *givptr, integer *givcol, doublereal *givnum, doublecomplex * + work, doublereal *rwork, integer *iwork, integer *info) +{ + /* System generated locals */ + integer q_dim1, q_offset, i__1, i__2; + + /* Builtin functions */ + integer pow_ii(integer *, integer *); + + /* Local variables */ + integer i__, k, n1, n2, iq, iw, iz, ptr, indx, curr, indxc, indxp; + extern /* Subroutine */ int dlaed9_(integer *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, integer *), + zlaed8_(integer *, integer *, integer *, doublecomplex *, integer + *, doublereal *, doublereal *, integer *, doublereal *, + doublereal *, doublecomplex *, integer *, doublereal *, integer *, + integer *, integer *, integer *, integer *, integer *, + doublereal *, integer *), dlaeda_(integer *, integer *, integer *, + integer *, integer *, integer *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, doublereal *, + integer *); + integer idlmda; + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen), zlacrm_(integer *, integer *, doublecomplex *, integer *, + doublereal *, integer *, doublecomplex *, integer *, doublereal * + ); + integer coltyp; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + --indxq; + --qstore; + --qptr; + --prmptr; + --perm; + --givptr; + givcol -= 3; + givnum -= 3; + --work; + --rwork; + --iwork; + + /* Function Body */ + *info = 0; + +/* IF( ICOMPQ.LT.0 .OR. ICOMPQ.GT.1 ) THEN */ +/* INFO = -1 */ +/* ELSE IF( N.LT.0 ) THEN */ + if (*n < 0) { + *info = -1; + } else if (min(1,*n) > *cutpnt || *n < *cutpnt) { + *info = -2; + } else if (*qsiz < *n) { + *info = -3; + } else if (*ldq < max(1,*n)) { + *info = -9; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZLAED7", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* The following values are for bookkeeping purposes only. They are */ +/* integer pointers which indicate the portion of the workspace */ +/* used by a particular array in DLAED2 and SLAED3. */ + + iz = 1; + idlmda = iz + *n; + iw = idlmda + *n; + iq = iw + *n; + + indx = 1; + indxc = indx + *n; + coltyp = indxc + *n; + indxp = coltyp + *n; + +/* Form the z-vector which consists of the last row of Q_1 and the */ +/* first row of Q_2. */ + + ptr = pow_ii(&c__2, tlvls) + 1; + i__1 = *curlvl - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = *tlvls - i__; + ptr += pow_ii(&c__2, &i__2); +/* L10: */ + } + curr = ptr + *curpbm; + dlaeda_(n, tlvls, curlvl, curpbm, &prmptr[1], &perm[1], &givptr[1], & + givcol[3], &givnum[3], &qstore[1], &qptr[1], &rwork[iz], &rwork[ + iz + *n], info); + +/* When solving the final problem, we no longer need the stored data, */ +/* so we will overwrite the data from this level onto the previously */ +/* used storage space. */ + + if (*curlvl == *tlvls) { + qptr[curr] = 1; + prmptr[curr] = 1; + givptr[curr] = 1; + } + +/* Sort and Deflate eigenvalues. */ + + zlaed8_(&k, n, qsiz, &q[q_offset], ldq, &d__[1], rho, cutpnt, &rwork[iz], + &rwork[idlmda], &work[1], qsiz, &rwork[iw], &iwork[indxp], &iwork[ + indx], &indxq[1], &perm[prmptr[curr]], &givptr[curr + 1], &givcol[ + (givptr[curr] << 1) + 1], &givnum[(givptr[curr] << 1) + 1], info); + prmptr[curr + 1] = prmptr[curr] + *n; + givptr[curr + 1] += givptr[curr]; + +/* Solve Secular Equation. */ + + if (k != 0) { + dlaed9_(&k, &c__1, &k, n, &d__[1], &rwork[iq], &k, rho, &rwork[idlmda] + , &rwork[iw], &qstore[qptr[curr]], &k, info); + zlacrm_(qsiz, &k, &work[1], qsiz, &qstore[qptr[curr]], &k, &q[ + q_offset], ldq, &rwork[iq]); +/* Computing 2nd power */ + i__1 = k; + qptr[curr + 1] = qptr[curr] + i__1 * i__1; + if (*info != 0) { + return 0; + } + +/* Prepare the INDXQ sorting premutation. */ + + n1 = k; + n2 = *n - k; + dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); + } else { + qptr[curr + 1] = qptr[curr]; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + indxq[i__] = i__; +/* L20: */ + } + } + + return 0; + +/* End of ZLAED7 */ + +} /* zlaed7_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlaed8.cpp b/lib/linalg/zlaed8.cpp new file mode 100644 index 0000000000..00f4db857b --- /dev/null +++ b/lib/linalg/zlaed8.cpp @@ -0,0 +1,569 @@ +/* fortran/zlaed8.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b3 = -1.; +static integer c__1 = 1; + +/* > \brief \b ZLAED8 used by ZSTEDC. Merges eigenvalues and deflates secular equation. Used when the original + matrix is dense. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLAED8 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLAED8( K, N, QSIZ, Q, LDQ, D, RHO, CUTPNT, Z, DLAMDA, */ +/* Q2, LDQ2, W, INDXP, INDX, INDXQ, PERM, GIVPTR, */ +/* GIVCOL, GIVNUM, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER CUTPNT, GIVPTR, INFO, K, LDQ, LDQ2, N, QSIZ */ +/* DOUBLE PRECISION RHO */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER GIVCOL( 2, * ), INDX( * ), INDXP( * ), */ +/* $ INDXQ( * ), PERM( * ) */ +/* DOUBLE PRECISION D( * ), DLAMDA( * ), GIVNUM( 2, * ), W( * ), */ +/* $ Z( * ) */ +/* COMPLEX*16 Q( LDQ, * ), Q2( LDQ2, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLAED8 merges the two sets of eigenvalues together into a single */ +/* > sorted set. Then it tries to deflate the size of the problem. */ +/* > There are two ways in which deflation can occur: when two or more */ +/* > eigenvalues are close together or if there is a tiny element in the */ +/* > Z vector. For each such occurrence the order of the related secular */ +/* > equation problem is reduced by one. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[out] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > Contains the number of non-deflated eigenvalues. */ +/* > This is the order of the related secular equation. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] QSIZ */ +/* > \verbatim */ +/* > QSIZ is INTEGER */ +/* > The dimension of the unitary matrix used to reduce */ +/* > the dense or band matrix to tridiagonal form. */ +/* > QSIZ >= N if ICOMPQ = 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Q */ +/* > \verbatim */ +/* > Q is COMPLEX*16 array, dimension (LDQ,N) */ +/* > On entry, Q contains the eigenvectors of the partially solved */ +/* > system which has been previously updated in matrix */ +/* > multiplies with other partially solved eigensystems. */ +/* > On exit, Q contains the trailing (N-K) updated eigenvectors */ +/* > (those which were deflated) in its last N-K columns. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQ */ +/* > \verbatim */ +/* > LDQ is INTEGER */ +/* > The leading dimension of the array Q. LDQ >= max( 1, N ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, D contains the eigenvalues of the two submatrices to */ +/* > be combined. On exit, D contains the trailing (N-K) updated */ +/* > eigenvalues (those which were deflated) sorted into increasing */ +/* > order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] RHO */ +/* > \verbatim */ +/* > RHO is DOUBLE PRECISION */ +/* > Contains the off diagonal element associated with the rank-1 */ +/* > cut which originally split the two submatrices which are now */ +/* > being recombined. RHO is modified during the computation to */ +/* > the value required by DLAED3. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CUTPNT */ +/* > \verbatim */ +/* > CUTPNT is INTEGER */ +/* > Contains the location of the last eigenvalue in the leading */ +/* > sub-matrix. MIN(1,N) <= CUTPNT <= N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] Z */ +/* > \verbatim */ +/* > Z is DOUBLE PRECISION array, dimension (N) */ +/* > On input this vector contains the updating vector (the last */ +/* > row of the first sub-eigenvector matrix and the first row of */ +/* > the second sub-eigenvector matrix). The contents of Z are */ +/* > destroyed during the updating process. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] DLAMDA */ +/* > \verbatim */ +/* > DLAMDA is DOUBLE PRECISION array, dimension (N) */ +/* > Contains a copy of the first K eigenvalues which will be used */ +/* > by DLAED3 to form the secular equation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] Q2 */ +/* > \verbatim */ +/* > Q2 is COMPLEX*16 array, dimension (LDQ2,N) */ +/* > If ICOMPQ = 0, Q2 is not referenced. Otherwise, */ +/* > Contains a copy of the first K eigenvectors which will be used */ +/* > by DLAED7 in a matrix multiply (DGEMM) to update the new */ +/* > eigenvectors. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDQ2 */ +/* > \verbatim */ +/* > LDQ2 is INTEGER */ +/* > The leading dimension of the array Q2. LDQ2 >= max( 1, N ). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] W */ +/* > \verbatim */ +/* > W is DOUBLE PRECISION array, dimension (N) */ +/* > This will hold the first k values of the final */ +/* > deflation-altered z-vector and will be passed to DLAED3. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INDXP */ +/* > \verbatim */ +/* > INDXP is INTEGER array, dimension (N) */ +/* > This will contain the permutation used to place deflated */ +/* > values of D at the end of the array. On output INDXP(1:K) */ +/* > points to the nondeflated D-values and INDXP(K+1:N) */ +/* > points to the deflated eigenvalues. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INDX */ +/* > \verbatim */ +/* > INDX is INTEGER array, dimension (N) */ +/* > This will contain the permutation used to sort the contents of */ +/* > D into ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INDXQ */ +/* > \verbatim */ +/* > INDXQ is INTEGER array, dimension (N) */ +/* > This contains the permutation which separately sorts the two */ +/* > sub-problems in D into ascending order. Note that elements in */ +/* > the second half of this permutation must first have CUTPNT */ +/* > added to their values in order to be accurate. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] PERM */ +/* > \verbatim */ +/* > PERM is INTEGER array, dimension (N) */ +/* > Contains the permutations (from deflation and sorting) to be */ +/* > applied to each eigenblock. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVPTR */ +/* > \verbatim */ +/* > GIVPTR is INTEGER */ +/* > Contains the number of Givens rotations which took place in */ +/* > this subproblem. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVCOL */ +/* > \verbatim */ +/* > GIVCOL is INTEGER array, dimension (2, N) */ +/* > Each pair of numbers indicates a pair of columns to take place */ +/* > in a Givens rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] GIVNUM */ +/* > \verbatim */ +/* > GIVNUM is DOUBLE PRECISION array, dimension (2, N) */ +/* > Each number indicates the S value to be used in the */ +/* > corresponding Givens rotation. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zlaed8_(integer *k, integer *n, integer *qsiz, + doublecomplex *q, integer *ldq, doublereal *d__, doublereal *rho, + integer *cutpnt, doublereal *z__, doublereal *dlamda, doublecomplex * + q2, integer *ldq2, doublereal *w, integer *indxp, integer *indx, + integer *indxq, integer *perm, integer *givptr, integer *givcol, + doublereal *givnum, integer *info) +{ + /* System generated locals */ + integer q_dim1, q_offset, q2_dim1, q2_offset, i__1; + doublereal d__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + doublereal c__; + integer i__, j; + doublereal s, t; + integer k2, n1, n2, jp, n1p1; + doublereal eps, tau, tol; + integer jlam, imax, jmax; + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dcopy_(integer *, doublereal *, integer *, doublereal + *, integer *), zdrot_(integer *, doublecomplex *, integer *, + doublecomplex *, integer *, doublereal *, doublereal *), zcopy_( + integer *, doublecomplex *, integer *, doublecomplex *, integer *) + ; + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); + extern integer idamax_(integer *, doublereal *, integer *); + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen), zlacpy_(char *, integer *, integer *, doublecomplex *, + integer *, doublecomplex *, integer *, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + q_dim1 = *ldq; + q_offset = 1 + q_dim1; + q -= q_offset; + --d__; + --z__; + --dlamda; + q2_dim1 = *ldq2; + q2_offset = 1 + q2_dim1; + q2 -= q2_offset; + --w; + --indxp; + --indx; + --indxq; + --perm; + givcol -= 3; + givnum -= 3; + + /* Function Body */ + *info = 0; + + if (*n < 0) { + *info = -2; + } else if (*qsiz < *n) { + *info = -3; + } else if (*ldq < max(1,*n)) { + *info = -5; + } else if (*cutpnt < min(1,*n) || *cutpnt > *n) { + *info = -8; + } else if (*ldq2 < max(1,*n)) { + *info = -12; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZLAED8", &i__1, (ftnlen)6); + return 0; + } + +/* Need to initialize GIVPTR to O here in case of quick exit */ +/* to prevent an unspecified code behavior (usually sigfault) */ +/* when IWORK array on entry to *stedc is not zeroed */ +/* (or at least some IWORK entries which used in *laed7 for GIVPTR). */ + + *givptr = 0; + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + n1 = *cutpnt; + n2 = *n - n1; + n1p1 = n1 + 1; + + if (*rho < 0.) { + dscal_(&n2, &c_b3, &z__[n1p1], &c__1); + } + +/* Normalize z so that norm(z) = 1 */ + + t = 1. / sqrt(2.); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + indx[j] = j; +/* L10: */ + } + dscal_(n, &t, &z__[1], &c__1); + *rho = (d__1 = *rho * 2., abs(d__1)); + +/* Sort the eigenvalues into increasing order */ + + i__1 = *n; + for (i__ = *cutpnt + 1; i__ <= i__1; ++i__) { + indxq[i__] += *cutpnt; +/* L20: */ + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dlamda[i__] = d__[indxq[i__]]; + w[i__] = z__[indxq[i__]]; +/* L30: */ + } + i__ = 1; + j = *cutpnt + 1; + dlamrg_(&n1, &n2, &dlamda[1], &c__1, &c__1, &indx[1]); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + d__[i__] = dlamda[indx[i__]]; + z__[i__] = w[indx[i__]]; +/* L40: */ + } + +/* Calculate the allowable deflation tolerance */ + + imax = idamax_(n, &z__[1], &c__1); + jmax = idamax_(n, &d__[1], &c__1); + eps = dlamch_((char *)"Epsilon", (ftnlen)7); + tol = eps * 8. * (d__1 = d__[jmax], abs(d__1)); + +/* If the rank-1 modifier is small enough, no more needs to be done */ +/* -- except to reorganize Q so that its columns correspond with the */ +/* elements in D. */ + + if (*rho * (d__1 = z__[imax], abs(d__1)) <= tol) { + *k = 0; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + perm[j] = indxq[indx[j]]; + zcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1] + , &c__1); +/* L50: */ + } + zlacpy_((char *)"A", qsiz, n, &q2[q2_dim1 + 1], ldq2, &q[q_dim1 + 1], ldq, ( + ftnlen)1); + return 0; + } + +/* If there are multiple eigenvalues then the problem deflates. Here */ +/* the number of equal eigenvalues are found. As each equal */ +/* eigenvalue is found, an elementary reflector is computed to rotate */ +/* the corresponding eigensubspace so that the corresponding */ +/* components of Z are zero in this new basis. */ + + *k = 0; + k2 = *n + 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { + +/* Deflate due to small z component. */ + + --k2; + indxp[k2] = j; + if (j == *n) { + goto L100; + } + } else { + jlam = j; + goto L70; + } +/* L60: */ + } +L70: + ++j; + if (j > *n) { + goto L90; + } + if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { + +/* Deflate due to small z component. */ + + --k2; + indxp[k2] = j; + } else { + +/* Check if eigenvalues are close enough to allow deflation. */ + + s = z__[jlam]; + c__ = z__[j]; + +/* Find sqrt(a**2+b**2) without overflow or */ +/* destructive underflow. */ + + tau = dlapy2_(&c__, &s); + t = d__[j] - d__[jlam]; + c__ /= tau; + s = -s / tau; + if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { + +/* Deflation is possible. */ + + z__[j] = tau; + z__[jlam] = 0.; + +/* Record the appropriate Givens rotation */ + + ++(*givptr); + givcol[(*givptr << 1) + 1] = indxq[indx[jlam]]; + givcol[(*givptr << 1) + 2] = indxq[indx[j]]; + givnum[(*givptr << 1) + 1] = c__; + givnum[(*givptr << 1) + 2] = s; + zdrot_(qsiz, &q[indxq[indx[jlam]] * q_dim1 + 1], &c__1, &q[indxq[ + indx[j]] * q_dim1 + 1], &c__1, &c__, &s); + t = d__[jlam] * c__ * c__ + d__[j] * s * s; + d__[j] = d__[jlam] * s * s + d__[j] * c__ * c__; + d__[jlam] = t; + --k2; + i__ = 1; +L80: + if (k2 + i__ <= *n) { + if (d__[jlam] < d__[indxp[k2 + i__]]) { + indxp[k2 + i__ - 1] = indxp[k2 + i__]; + indxp[k2 + i__] = jlam; + ++i__; + goto L80; + } else { + indxp[k2 + i__ - 1] = jlam; + } + } else { + indxp[k2 + i__ - 1] = jlam; + } + jlam = j; + } else { + ++(*k); + w[*k] = z__[jlam]; + dlamda[*k] = d__[jlam]; + indxp[*k] = jlam; + jlam = j; + } + } + goto L70; +L90: + +/* Record the last eigenvalue. */ + + ++(*k); + w[*k] = z__[jlam]; + dlamda[*k] = d__[jlam]; + indxp[*k] = jlam; + +L100: + +/* Sort the eigenvalues and corresponding eigenvectors into DLAMDA */ +/* and Q2 respectively. The eigenvalues/vectors which were not */ +/* deflated go into the first K slots of DLAMDA and Q2 respectively, */ +/* while those which were deflated go into the last N - K slots. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + jp = indxp[j]; + dlamda[j] = d__[jp]; + perm[j] = indxq[indx[jp]]; + zcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1], & + c__1); +/* L110: */ + } + +/* The deflated eigenvalues and their corresponding vectors go back */ +/* into the last N - K slots of D and Q respectively. */ + + if (*k < *n) { + i__1 = *n - *k; + dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); + i__1 = *n - *k; + zlacpy_((char *)"A", qsiz, &i__1, &q2[(*k + 1) * q2_dim1 + 1], ldq2, &q[(*k + + 1) * q_dim1 + 1], ldq, (ftnlen)1); + } + + return 0; + +/* End of ZLAED8 */ + +} /* zlaed8_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlanhe.cpp b/lib/linalg/zlanhe.cpp new file mode 100644 index 0000000000..2522e8d500 --- /dev/null +++ b/lib/linalg/zlanhe.cpp @@ -0,0 +1,348 @@ +/* fortran/zlanhe.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b ZLANHE returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele +ment of largest absolute value of a complex Hermitian matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLANHE + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* DOUBLE PRECISION FUNCTION ZLANHE( NORM, UPLO, N, A, LDA, WORK ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER NORM, UPLO */ +/* INTEGER LDA, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION WORK( * ) */ +/* COMPLEX*16 A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLANHE returns the value of the one norm, or the Frobenius norm, or */ +/* > the infinity norm, or the element of largest absolute value of a */ +/* > complex hermitian matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \return ZLANHE */ +/* > \verbatim */ +/* > */ +/* > ZLANHE = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ +/* > ( */ +/* > ( norm1(A), NORM = '1', 'O' or 'o' */ +/* > ( */ +/* > ( normI(A), NORM = 'I' or 'i' */ +/* > ( */ +/* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ +/* > */ +/* > where norm1 denotes the one norm of a matrix (maximum column sum), */ +/* > normI denotes the infinity norm of a matrix (maximum row sum) and */ +/* > normF denotes the Frobenius norm of a matrix (square root of sum of */ +/* > squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] NORM */ +/* > \verbatim */ +/* > NORM is CHARACTER*1 */ +/* > Specifies the value to be returned in ZLANHE as described */ +/* > above. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies whether the upper or lower triangular part of the */ +/* > hermitian matrix A is to be referenced. */ +/* > = 'U': Upper triangular part of A is referenced */ +/* > = 'L': Lower triangular part of A is referenced */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. When N = 0, ZLANHE is */ +/* > set to zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > The hermitian matrix A. If UPLO = 'U', the leading n by n */ +/* > upper triangular part of A contains the upper triangular part */ +/* > of the matrix A, and the strictly lower triangular part of A */ +/* > is not referenced. If UPLO = 'L', the leading n by n lower */ +/* > triangular part of A contains the lower triangular part of */ +/* > the matrix A, and the strictly upper triangular part of A is */ +/* > not referenced. Note that the imaginary parts of the diagonal */ +/* > elements need not be set and are assumed to be zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(N,1). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ +/* > where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ +/* > WORK is not referenced. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16HEauxiliary */ + +/* ===================================================================== */ +doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, + integer *lda, doublereal *work, ftnlen norm_len, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2; + doublereal ret_val, d__1; + + /* Builtin functions */ + double z_abs(doublecomplex *), sqrt(doublereal); + + /* Local variables */ + integer i__, j; + doublereal sum, absa, scale; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + doublereal value; + extern logical disnan_(doublereal *); + extern /* Subroutine */ int zlassq_(integer *, doublecomplex *, integer *, + doublereal *, doublereal *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --work; + + /* Function Body */ + if (*n == 0) { + value = 0.; + } else if (lsame_(norm, (char *)"M", (ftnlen)1, (ftnlen)1)) { + +/* Find max(abs(A(i,j))). */ + + value = 0.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + sum = z_abs(&a[i__ + j * a_dim1]); + if (value < sum || disnan_(&sum)) { + value = sum; + } +/* L10: */ + } + i__2 = j + j * a_dim1; + sum = (d__1 = a[i__2].r, abs(d__1)); + if (value < sum || disnan_(&sum)) { + value = sum; + } +/* L20: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j + j * a_dim1; + sum = (d__1 = a[i__2].r, abs(d__1)); + if (value < sum || disnan_(&sum)) { + value = sum; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + sum = z_abs(&a[i__ + j * a_dim1]); + if (value < sum || disnan_(&sum)) { + value = sum; + } +/* L30: */ + } +/* L40: */ + } + } + } else if (lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"O", ( + ftnlen)1, (ftnlen)1) || *(unsigned char *)norm == '1') { + +/* Find normI(A) ( = norm1(A), since A is hermitian). */ + + value = 0.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = 0.; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + absa = z_abs(&a[i__ + j * a_dim1]); + sum += absa; + work[i__] += absa; +/* L50: */ + } + i__2 = j + j * a_dim1; + work[j] = sum + (d__1 = a[i__2].r, abs(d__1)); +/* L60: */ + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + sum = work[i__]; + if (value < sum || disnan_(&sum)) { + value = sum; + } +/* L70: */ + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + work[i__] = 0.; +/* L80: */ + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j + j * a_dim1; + sum = work[j] + (d__1 = a[i__2].r, abs(d__1)); + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + absa = z_abs(&a[i__ + j * a_dim1]); + sum += absa; + work[i__] += absa; +/* L90: */ + } + if (value < sum || disnan_(&sum)) { + value = sum; + } +/* L100: */ + } + } + } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", ( + ftnlen)1, (ftnlen)1)) { + +/* Find normF(A). */ + + scale = 0.; + sum = 1.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 2; j <= i__1; ++j) { + i__2 = j - 1; + zlassq_(&i__2, &a[j * a_dim1 + 1], &c__1, &scale, &sum); +/* L110: */ + } + } else { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + i__2 = *n - j; + zlassq_(&i__2, &a[j + 1 + j * a_dim1], &c__1, &scale, &sum); +/* L120: */ + } + } + sum *= 2; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + i__ * a_dim1; + if (a[i__2].r != 0.) { + i__2 = i__ + i__ * a_dim1; + absa = (d__1 = a[i__2].r, abs(d__1)); + if (scale < absa) { +/* Computing 2nd power */ + d__1 = scale / absa; + sum = sum * (d__1 * d__1) + 1.; + scale = absa; + } else { +/* Computing 2nd power */ + d__1 = absa / scale; + sum += d__1 * d__1; + } + } +/* L130: */ + } + value = scale * sqrt(sum); + } + + ret_val = value; + return ret_val; + +/* End of ZLANHE */ + +} /* zlanhe_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlarf.cpp b/lib/linalg/zlarf.cpp new file mode 100644 index 0000000000..453644e7d9 --- /dev/null +++ b/lib/linalg/zlarf.cpp @@ -0,0 +1,283 @@ +/* fortran/zlarf.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublecomplex c_b1 = {1.,0.}; +static doublecomplex c_b2 = {0.,0.}; +static integer c__1 = 1; + +/* > \brief \b ZLARF applies an elementary reflector to a general rectangular matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLARF + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE */ +/* INTEGER INCV, LDC, M, N */ +/* COMPLEX*16 TAU */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLARF applies a complex elementary reflector H to a complex M-by-N */ +/* > matrix C, from either the left or the right. H is represented in the */ +/* > form */ +/* > */ +/* > H = I - tau * v * v**H */ +/* > */ +/* > where tau is a complex scalar and v is a complex vector. */ +/* > */ +/* > If tau = 0, then H is taken to be the unit matrix. */ +/* > */ +/* > To apply H**H, supply conjg(tau) instead */ +/* > tau. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': form H * C */ +/* > = 'R': form C * H */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] V */ +/* > \verbatim */ +/* > V is COMPLEX*16 array, dimension */ +/* > (1 + (M-1)*abs(INCV)) if SIDE = 'L' */ +/* > or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */ +/* > The vector v in the representation of H. V is not used if */ +/* > TAU = 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCV */ +/* > \verbatim */ +/* > INCV is INTEGER */ +/* > The increment between elements of v. INCV <> 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 */ +/* > The value tau in the representation of H. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is COMPLEX*16 array, dimension (LDC,N) */ +/* > On entry, the M-by-N matrix C. */ +/* > On exit, C is overwritten by the matrix H * C if SIDE = 'L', */ +/* > or C * H if SIDE = 'R'. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension */ +/* > (N) if SIDE = 'L' */ +/* > or (M) if SIDE = 'R' */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int zlarf_(char *side, integer *m, integer *n, doublecomplex + *v, integer *incv, doublecomplex *tau, doublecomplex *c__, integer * + ldc, doublecomplex *work, ftnlen side_len) +{ + /* System generated locals */ + integer c_dim1, c_offset, i__1; + doublecomplex z__1; + + /* Local variables */ + integer i__; + logical applyleft; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer lastc; + extern /* Subroutine */ int zgerc_(integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *), zgemv_(char *, integer *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *, doublecomplex *, doublecomplex *, integer *, ftnlen); + integer lastv; + extern integer ilazlc_(integer *, integer *, doublecomplex *, integer *), + ilazlr_(integer *, integer *, doublecomplex *, integer *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --v; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + applyleft = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + lastv = 0; + lastc = 0; + if (tau->r != 0. || tau->i != 0.) { +/* Set up variables for scanning V. LASTV begins pointing to the end */ +/* of V. */ + if (applyleft) { + lastv = *m; + } else { + lastv = *n; + } + if (*incv > 0) { + i__ = (lastv - 1) * *incv + 1; + } else { + i__ = 1; + } +/* Look for the last non-zero row in V. */ + for(;;) { /* while(complicated condition) */ + i__1 = i__; + if (!(lastv > 0 && (v[i__1].r == 0. && v[i__1].i == 0.))) + break; + --lastv; + i__ -= *incv; + } + if (applyleft) { +/* Scan for the last non-zero column in C(1:lastv,:). */ + lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc); + } else { +/* Scan for the last non-zero row in C(:,1:lastv). */ + lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc); + } + } +/* Note that lastc.eq.0 renders the BLAS operations null; no special */ +/* case is needed at this level. */ + if (applyleft) { + +/* Form H * C */ + + if (lastv > 0) { + +/* w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1) */ + + zgemv_((char *)"Conjugate transpose", &lastv, &lastc, &c_b1, &c__[ + c_offset], ldc, &v[1], incv, &c_b2, &work[1], &c__1, ( + ftnlen)19); + +/* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H */ + + z__1.r = -tau->r, z__1.i = -tau->i; + zgerc_(&lastv, &lastc, &z__1, &v[1], incv, &work[1], &c__1, &c__[ + c_offset], ldc); + } + } else { + +/* Form C * H */ + + if (lastv > 0) { + +/* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */ + + zgemv_((char *)"No transpose", &lastc, &lastv, &c_b1, &c__[c_offset], ldc, + &v[1], incv, &c_b2, &work[1], &c__1, (ftnlen)12); + +/* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H */ + + z__1.r = -tau->r, z__1.i = -tau->i; + zgerc_(&lastc, &lastv, &z__1, &work[1], &c__1, &v[1], incv, &c__[ + c_offset], ldc); + } + } + return 0; + +/* End of ZLARF */ + +} /* zlarf_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlarfb.cpp b/lib/linalg/zlarfb.cpp new file mode 100644 index 0000000000..0ea0c17bd4 --- /dev/null +++ b/lib/linalg/zlarfb.cpp @@ -0,0 +1,949 @@ +/* fortran/zlarfb.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublecomplex c_b1 = {1.,0.}; +static integer c__1 = 1; + +/* > \brief \b ZLARFB applies a block reflector or its conjugate-transpose to a general rectangular matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLARFB + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, */ +/* T, LDT, C, LDC, WORK, LDWORK ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER DIRECT, SIDE, STOREV, TRANS */ +/* INTEGER K, LDC, LDT, LDV, LDWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 C( LDC, * ), T( LDT, * ), V( LDV, * ), */ +/* $ WORK( LDWORK, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLARFB applies a complex block reflector H or its transpose H**H to a */ +/* > complex M-by-N matrix C, from either the left or the right. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply H or H**H from the Left */ +/* > = 'R': apply H or H**H from the Right */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': apply H (No transpose) */ +/* > = 'C': apply H**H (Conjugate transpose) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIRECT */ +/* > \verbatim */ +/* > DIRECT is CHARACTER*1 */ +/* > Indicates how H is formed from a product of elementary */ +/* > reflectors */ +/* > = 'F': H = H(1) H(2) . . . H(k) (Forward) */ +/* > = 'B': H = H(k) . . . H(2) H(1) (Backward) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] STOREV */ +/* > \verbatim */ +/* > STOREV is CHARACTER*1 */ +/* > Indicates how the vectors which define the elementary */ +/* > reflectors are stored: */ +/* > = 'C': Columnwise */ +/* > = 'R': Rowwise */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The order of the matrix T (= the number of elementary */ +/* > reflectors whose product defines the block reflector). */ +/* > If SIDE = 'L', M >= K >= 0; */ +/* > if SIDE = 'R', N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] V */ +/* > \verbatim */ +/* > V is COMPLEX*16 array, dimension */ +/* > (LDV,K) if STOREV = 'C' */ +/* > (LDV,M) if STOREV = 'R' and SIDE = 'L' */ +/* > (LDV,N) if STOREV = 'R' and SIDE = 'R' */ +/* > See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDV */ +/* > \verbatim */ +/* > LDV is INTEGER */ +/* > The leading dimension of the array V. */ +/* > If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */ +/* > if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */ +/* > if STOREV = 'R', LDV >= K. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] T */ +/* > \verbatim */ +/* > T is COMPLEX*16 array, dimension (LDT,K) */ +/* > The triangular K-by-K matrix T in the representation of the */ +/* > block reflector. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDT */ +/* > \verbatim */ +/* > LDT is INTEGER */ +/* > The leading dimension of the array T. LDT >= K. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is COMPLEX*16 array, dimension (LDC,N) */ +/* > On entry, the M-by-N matrix C. */ +/* > On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (LDWORK,K) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDWORK */ +/* > \verbatim */ +/* > LDWORK is INTEGER */ +/* > The leading dimension of the array WORK. */ +/* > If SIDE = 'L', LDWORK >= max(1,N); */ +/* > if SIDE = 'R', LDWORK >= max(1,M). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The shape of the matrix V and the storage of the vectors which define */ +/* > the H(i) is best illustrated by the following example with n = 5 and */ +/* > k = 3. The elements equal to 1 are not stored; the corresponding */ +/* > array elements are modified but restored on exit. The rest of the */ +/* > array is not used. */ +/* > */ +/* > DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ +/* > */ +/* > V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) */ +/* > ( v1 1 ) ( 1 v2 v2 v2 ) */ +/* > ( v1 v2 1 ) ( 1 v3 v3 ) */ +/* > ( v1 v2 v3 ) */ +/* > ( v1 v2 v3 ) */ +/* > */ +/* > DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ +/* > */ +/* > V = ( v1 v2 v3 ) V = ( v1 v1 1 ) */ +/* > ( v1 v2 v3 ) ( v2 v2 v2 1 ) */ +/* > ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) */ +/* > ( 1 v3 ) */ +/* > ( 1 ) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zlarfb_(char *side, char *trans, char *direct, char * + storev, integer *m, integer *n, integer *k, doublecomplex *v, integer + *ldv, doublecomplex *t, integer *ldt, doublecomplex *c__, integer * + ldc, doublecomplex *work, integer *ldwork, ftnlen side_len, ftnlen + trans_len, ftnlen direct_len, ftnlen storev_len) +{ + /* System generated locals */ + integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, + work_offset, i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1, z__2; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int zgemm_(char *, char *, integer *, integer *, + integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen), zcopy_(integer *, doublecomplex *, + integer *, doublecomplex *, integer *), ztrmm_(char *, char *, + char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, + ftnlen, ftnlen, ftnlen), zlacgv_(integer *, doublecomplex *, + integer *); + char transt[1]; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick return if possible */ + + /* Parameter adjustments */ + v_dim1 = *ldv; + v_offset = 1 + v_dim1; + v -= v_offset; + t_dim1 = *ldt; + t_offset = 1 + t_dim1; + t -= t_offset; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + work_dim1 = *ldwork; + work_offset = 1 + work_dim1; + work -= work_offset; + + /* Function Body */ + if (*m <= 0 || *n <= 0) { + return 0; + } + + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + *(unsigned char *)transt = 'C'; + } else { + *(unsigned char *)transt = 'N'; + } + + if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { + + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + +/* Let V = ( V1 ) (first K rows) */ +/* ( V2 ) */ +/* where V1 is unit lower triangular. */ + + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Form H * C or H**H * C where C = ( C1 ) */ +/* ( C2 ) */ + +/* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) */ + +/* W := C1**H */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], + &c__1); + zlacgv_(n, &work[j * work_dim1 + 1], &c__1); +/* L10: */ + } + +/* W := W * V1 */ + + ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*m > *k) { + +/* W := W + C2**H * V2 */ + + i__1 = *m - *k; + zgemm_((char *)"Conjugate transpose", (char *)"No transpose", n, k, &i__1, + &c_b1, &c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + + v_dim1], ldv, &c_b1, &work[work_offset], ldwork, ( + ftnlen)19, (ftnlen)12); + } + +/* W := W * T**H or W * T */ + + ztrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - V * W**H */ + + if (*m > *k) { + +/* C2 := C2 - V2 * W**H */ + + i__1 = *m - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", &i__1, n, k, + &z__1, &v[*k + 1 + v_dim1], ldv, &work[ + work_offset], ldwork, &c_b1, &c__[*k + 1 + c_dim1] + , ldc, (ftnlen)12, (ftnlen)19); + } + +/* W := W * V1**H */ + + ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", n, k, + &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, + (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); + +/* C1 := C1 - W**H */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = j + i__ * c_dim1; + i__4 = j + i__ * c_dim1; + d_cnjg(&z__2, &work[i__ + j * work_dim1]); + z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - + z__2.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L20: */ + } +/* L30: */ + } + + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + +/* Form C * H or C * H**H where C = ( C1 C2 ) */ + +/* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ + +/* W := C1 */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * + work_dim1 + 1], &c__1); +/* L40: */ + } + +/* W := W * V1 */ + + ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*n > *k) { + +/* W := W + C2 * V2 */ + + i__1 = *n - *k; + zgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, &c_b1, + &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + 1 + + v_dim1], ldv, &c_b1, &work[work_offset], ldwork, ( + ftnlen)12, (ftnlen)12); + } + +/* W := W * T or W * T**H */ + + ztrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - W * V**H */ + + if (*n > *k) { + +/* C2 := C2 - W * V2**H */ + + i__1 = *n - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, &i__1, k, + &z__1, &work[work_offset], ldwork, &v[*k + 1 + + v_dim1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 1], + ldc, (ftnlen)12, (ftnlen)19); + } + +/* W := W * V1**H */ + + ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", m, k, + &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, + (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); + +/* C1 := C1 - W */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * work_dim1; + z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ + i__4].i - work[i__5].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L50: */ + } +/* L60: */ + } + } + + } else { + +/* Let V = ( V1 ) */ +/* ( V2 ) (last K rows) */ +/* where V2 is unit upper triangular. */ + + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Form H * C or H**H * C where C = ( C1 ) */ +/* ( C2 ) */ + +/* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) */ + +/* W := C2**H */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * + work_dim1 + 1], &c__1); + zlacgv_(n, &work[j * work_dim1 + 1], &c__1); +/* L70: */ + } + +/* W := W * V2 */ + + ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, + &v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*m > *k) { + +/* W := W + C1**H * V1 */ + + i__1 = *m - *k; + zgemm_((char *)"Conjugate transpose", (char *)"No transpose", n, k, &i__1, + &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv, & + c_b1, &work[work_offset], ldwork, (ftnlen)19, ( + ftnlen)12); + } + +/* W := W * T**H or W * T */ + + ztrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - V * W**H */ + + if (*m > *k) { + +/* C1 := C1 - V1 * W**H */ + + i__1 = *m - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", &i__1, n, k, + &z__1, &v[v_offset], ldv, &work[work_offset], + ldwork, &c_b1, &c__[c_offset], ldc, (ftnlen)12, ( + ftnlen)19); + } + +/* W := W * V2**H */ + + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", n, k, + &c_b1, &v[*m - *k + 1 + v_dim1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 19, (ftnlen)4); + +/* C2 := C2 - W**H */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = *m - *k + j + i__ * c_dim1; + i__4 = *m - *k + j + i__ * c_dim1; + d_cnjg(&z__2, &work[i__ + j * work_dim1]); + z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - + z__2.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L80: */ + } +/* L90: */ + } + + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + +/* Form C * H or C * H**H where C = ( C1 C2 ) */ + +/* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ + +/* W := C2 */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ + j * work_dim1 + 1], &c__1); +/* L100: */ + } + +/* W := W * V2 */ + + ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, + &v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*n > *k) { + +/* W := W + C1 * V1 */ + + i__1 = *n - *k; + zgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, &c_b1, + &c__[c_offset], ldc, &v[v_offset], ldv, &c_b1, & + work[work_offset], ldwork, (ftnlen)12, (ftnlen)12) + ; + } + +/* W := W * T or W * T**H */ + + ztrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - W * V**H */ + + if (*n > *k) { + +/* C1 := C1 - W * V1**H */ + + i__1 = *n - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, &i__1, k, + &z__1, &work[work_offset], ldwork, &v[v_offset], + ldv, &c_b1, &c__[c_offset], ldc, (ftnlen)12, ( + ftnlen)19); + } + +/* W := W * V2**H */ + + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", m, k, + &c_b1, &v[*n - *k + 1 + v_dim1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 19, (ftnlen)4); + +/* C2 := C2 - W */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + (*n - *k + j) * c_dim1; + i__4 = i__ + (*n - *k + j) * c_dim1; + i__5 = i__ + j * work_dim1; + z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ + i__4].i - work[i__5].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L110: */ + } +/* L120: */ + } + } + } + + } else if (lsame_(storev, (char *)"R", (ftnlen)1, (ftnlen)1)) { + + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + +/* Let V = ( V1 V2 ) (V1: first K columns) */ +/* where V1 is unit upper triangular. */ + + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Form H * C or H**H * C where C = ( C1 ) */ +/* ( C2 ) */ + +/* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) */ + +/* W := C1**H */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], + &c__1); + zlacgv_(n, &work[j * work_dim1 + 1], &c__1); +/* L130: */ + } + +/* W := W * V1**H */ + + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", n, k, + &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, + (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); + if (*m > *k) { + +/* W := W + C2**H * V2**H */ + + i__1 = *m - *k; + zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", n, k, + &i__1, &c_b1, &c__[*k + 1 + c_dim1], ldc, &v[(*k + + 1) * v_dim1 + 1], ldv, &c_b1, &work[work_offset] + , ldwork, (ftnlen)19, (ftnlen)19); + } + +/* W := W * T**H or W * T */ + + ztrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - V**H * W**H */ + + if (*m > *k) { + +/* C2 := C2 - V2**H * W**H */ + + i__1 = *m - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", & + i__1, n, k, &z__1, &v[(*k + 1) * v_dim1 + 1], ldv, + &work[work_offset], ldwork, &c_b1, &c__[*k + 1 + + c_dim1], ldc, (ftnlen)19, (ftnlen)19); + } + +/* W := W * V1 */ + + ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + +/* C1 := C1 - W**H */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = j + i__ * c_dim1; + i__4 = j + i__ * c_dim1; + d_cnjg(&z__2, &work[i__ + j * work_dim1]); + z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - + z__2.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L140: */ + } +/* L150: */ + } + + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + +/* Form C * H or C * H**H where C = ( C1 C2 ) */ + +/* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) */ + +/* W := C1 */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * + work_dim1 + 1], &c__1); +/* L160: */ + } + +/* W := W * V1**H */ + + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", m, k, + &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, + (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); + if (*n > *k) { + +/* W := W + C2 * V2**H */ + + i__1 = *n - *k; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, k, &i__1, + &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + + 1) * v_dim1 + 1], ldv, &c_b1, &work[work_offset] + , ldwork, (ftnlen)12, (ftnlen)19); + } + +/* W := W * T or W * T**H */ + + ztrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - W * V */ + + if (*n > *k) { + +/* C2 := C2 - W * V2 */ + + i__1 = *n - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, &z__1, + &work[work_offset], ldwork, &v[(*k + 1) * v_dim1 + + 1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 1], + ldc, (ftnlen)12, (ftnlen)12); + } + +/* W := W * V1 */ + + ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + +/* C1 := C1 - W */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * work_dim1; + z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ + i__4].i - work[i__5].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L170: */ + } +/* L180: */ + } + + } + + } else { + +/* Let V = ( V1 V2 ) (V2: last K columns) */ +/* where V2 is unit lower triangular. */ + + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Form H * C or H**H * C where C = ( C1 ) */ +/* ( C2 ) */ + +/* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) */ + +/* W := C2**H */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * + work_dim1 + 1], &c__1); + zlacgv_(n, &work[j * work_dim1 + 1], &c__1); +/* L190: */ + } + +/* W := W * V2**H */ + + ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", n, k, + &c_b1, &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 19, (ftnlen)4); + if (*m > *k) { + +/* W := W + C1**H * V1**H */ + + i__1 = *m - *k; + zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", n, k, + &i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], + ldv, &c_b1, &work[work_offset], ldwork, (ftnlen) + 19, (ftnlen)19); + } + +/* W := W * T**H or W * T */ + + ztrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - V**H * W**H */ + + if (*m > *k) { + +/* C1 := C1 - V1**H * W**H */ + + i__1 = *m - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", & + i__1, n, k, &z__1, &v[v_offset], ldv, &work[ + work_offset], ldwork, &c_b1, &c__[c_offset], ldc, + (ftnlen)19, (ftnlen)19); + } + +/* W := W * V2 */ + + ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, + &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 12, (ftnlen)4); + +/* C2 := C2 - W**H */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = *m - *k + j + i__ * c_dim1; + i__4 = *m - *k + j + i__ * c_dim1; + d_cnjg(&z__2, &work[i__ + j * work_dim1]); + z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - + z__2.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L200: */ + } +/* L210: */ + } + + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + +/* Form C * H or C * H**H where C = ( C1 C2 ) */ + +/* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) */ + +/* W := C2 */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ + j * work_dim1 + 1], &c__1); +/* L220: */ + } + +/* W := W * V2**H */ + + ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", m, k, + &c_b1, &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 19, (ftnlen)4); + if (*n > *k) { + +/* W := W + C1 * V1**H */ + + i__1 = *n - *k; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, k, &i__1, + &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv, & + c_b1, &work[work_offset], ldwork, (ftnlen)12, ( + ftnlen)19); + } + +/* W := W * T or W * T**H */ + + ztrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); + +/* C := C - W * V */ + + if (*n > *k) { + +/* C1 := C1 - W * V1 */ + + i__1 = *n - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, &z__1, + &work[work_offset], ldwork, &v[v_offset], ldv, & + c_b1, &c__[c_offset], ldc, (ftnlen)12, (ftnlen)12) + ; + } + +/* W := W * V2 */ + + ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, + &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 12, (ftnlen)4); + +/* C1 := C1 - W */ + + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + (*n - *k + j) * c_dim1; + i__4 = i__ + (*n - *k + j) * c_dim1; + i__5 = i__ + j * work_dim1; + z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ + i__4].i - work[i__5].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; +/* L230: */ + } +/* L240: */ + } + + } + + } + } + + return 0; + +/* End of ZLARFB */ + +} /* zlarfb_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlarfg.cpp b/lib/linalg/zlarfg.cpp new file mode 100644 index 0000000000..e3d58be892 --- /dev/null +++ b/lib/linalg/zlarfg.cpp @@ -0,0 +1,261 @@ +/* fortran/zlarfg.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublecomplex c_b5 = {1.,0.}; + +/* > \brief \b ZLARFG generates an elementary reflector (Householder matrix). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLARFG + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX, N */ +/* COMPLEX*16 ALPHA, TAU */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 X( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLARFG generates a complex elementary reflector H of order n, such */ +/* > that */ +/* > */ +/* > H**H * ( alpha ) = ( beta ), H**H * H = I. */ +/* > ( x ) ( 0 ) */ +/* > */ +/* > where alpha and beta are scalars, with beta real, and x is an */ +/* > (n-1)-element complex vector. H is represented in the form */ +/* > */ +/* > H = I - tau * ( 1 ) * ( 1 v**H ) , */ +/* > ( v ) */ +/* > */ +/* > where tau is a complex scalar and v is a complex (n-1)-element */ +/* > vector. Note that H is not hermitian. */ +/* > */ +/* > If the elements of x are all zero and alpha is real, then tau = 0 */ +/* > and H is taken to be the unit matrix. */ +/* > */ +/* > Otherwise 1 <= real(tau) <= 2 and abs(tau-1) <= 1 . */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the elementary reflector. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] ALPHA */ +/* > \verbatim */ +/* > ALPHA is COMPLEX*16 */ +/* > On entry, the value alpha. */ +/* > On exit, it is overwritten with the value beta. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 array, dimension */ +/* > (1+(N-2)*abs(INCX)) */ +/* > On entry, the vector x. */ +/* > On exit, it is overwritten with the vector v. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > The increment between elements of X. INCX > 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 */ +/* > The value tau. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int zlarfg_(integer *n, doublecomplex *alpha, doublecomplex * + x, integer *incx, doublecomplex *tau) +{ + /* System generated locals */ + integer i__1; + doublereal d__1, d__2; + doublecomplex z__1, z__2; + + /* Builtin functions */ + double d_imag(doublecomplex *), d_sign(doublereal *, doublereal *); + + /* Local variables */ + integer j, knt; + doublereal beta, alphi, alphr; + extern /* Subroutine */ int zscal_(integer *, doublecomplex *, + doublecomplex *, integer *); + doublereal xnorm; + extern doublereal dlapy3_(doublereal *, doublereal *, doublereal *), + dznrm2_(integer *, doublecomplex *, integer *), dlamch_(char *, + ftnlen); + doublereal safmin; + extern /* Subroutine */ int zdscal_(integer *, doublereal *, + doublecomplex *, integer *); + doublereal rsafmn; + extern /* Double Complex */ VOID zladiv_(doublecomplex *, doublecomplex *, + doublecomplex *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --x; + + /* Function Body */ + if (*n <= 0) { + tau->r = 0., tau->i = 0.; + return 0; + } + + i__1 = *n - 1; + xnorm = dznrm2_(&i__1, &x[1], incx); + alphr = alpha->r; + alphi = d_imag(alpha); + + if (xnorm == 0. && alphi == 0.) { + +/* H = I */ + + tau->r = 0., tau->i = 0.; + } else { + +/* general case */ + + d__1 = dlapy3_(&alphr, &alphi, &xnorm); + beta = -d_sign(&d__1, &alphr); + safmin = dlamch_((char *)"S", (ftnlen)1) / dlamch_((char *)"E", (ftnlen)1); + rsafmn = 1. / safmin; + + knt = 0; + if (abs(beta) < safmin) { + +/* XNORM, BETA may be inaccurate; scale X and recompute them */ + +L10: + ++knt; + i__1 = *n - 1; + zdscal_(&i__1, &rsafmn, &x[1], incx); + beta *= rsafmn; + alphi *= rsafmn; + alphr *= rsafmn; + if (abs(beta) < safmin && knt < 20) { + goto L10; + } + +/* New BETA is at most 1, at least SAFMIN */ + + i__1 = *n - 1; + xnorm = dznrm2_(&i__1, &x[1], incx); + z__1.r = alphr, z__1.i = alphi; + alpha->r = z__1.r, alpha->i = z__1.i; + d__1 = dlapy3_(&alphr, &alphi, &xnorm); + beta = -d_sign(&d__1, &alphr); + } + d__1 = (beta - alphr) / beta; + d__2 = -alphi / beta; + z__1.r = d__1, z__1.i = d__2; + tau->r = z__1.r, tau->i = z__1.i; + z__2.r = alpha->r - beta, z__2.i = alpha->i; + zladiv_(&z__1, &c_b5, &z__2); + alpha->r = z__1.r, alpha->i = z__1.i; + i__1 = *n - 1; + zscal_(&i__1, alpha, &x[1], incx); + +/* If ALPHA is subnormal, it may lose relative accuracy */ + + i__1 = knt; + for (j = 1; j <= i__1; ++j) { + beta *= safmin; +/* L20: */ + } + alpha->r = beta, alpha->i = 0.; + } + + return 0; + +/* End of ZLARFG */ + +} /* zlarfg_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlarft.cpp b/lib/linalg/zlarft.cpp new file mode 100644 index 0000000000..d907f6792d --- /dev/null +++ b/lib/linalg/zlarft.cpp @@ -0,0 +1,465 @@ +/* static/zlarft.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublecomplex c_b1 = {1.,0.}; +static integer c__1 = 1; + +/* > \brief \b ZLARFT forms the triangular factor T of a block reflector H = I - vtvH */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLARFT + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER DIRECT, STOREV */ +/* INTEGER K, LDT, LDV, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLARFT forms the triangular factor T of a complex block reflector H */ +/* > of order n, which is defined as a product of k elementary reflectors. */ +/* > */ +/* > If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */ +/* > */ +/* > If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */ +/* > */ +/* > If STOREV = 'C', the vector which defines the elementary reflector */ +/* > H(i) is stored in the i-th column of the array V, and */ +/* > */ +/* > H = I - V * T * V**H */ +/* > */ +/* > If STOREV = 'R', the vector which defines the elementary reflector */ +/* > H(i) is stored in the i-th row of the array V, and */ +/* > */ +/* > H = I - V**H * T * V */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] DIRECT */ +/* > \verbatim */ +/* > DIRECT is CHARACTER*1 */ +/* > Specifies the order in which the elementary reflectors are */ +/* > multiplied to form the block reflector: */ +/* > = 'F': H = H(1) H(2) . . . H(k) (Forward) */ +/* > = 'B': H = H(k) . . . H(2) H(1) (Backward) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] STOREV */ +/* > \verbatim */ +/* > STOREV is CHARACTER*1 */ +/* > Specifies how the vectors which define the elementary */ +/* > reflectors are stored (see also Further Details): */ +/* > = 'C': columnwise */ +/* > = 'R': rowwise */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the block reflector H. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The order of the triangular factor T (= the number of */ +/* > elementary reflectors). K >= 1. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] V */ +/* > \verbatim */ +/* > V is COMPLEX*16 array, dimension */ +/* > (LDV,K) if STOREV = 'C' */ +/* > (LDV,N) if STOREV = 'R' */ +/* > The matrix V. See further details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDV */ +/* > \verbatim */ +/* > LDV is INTEGER */ +/* > The leading dimension of the array V. */ +/* > If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] T */ +/* > \verbatim */ +/* > T is COMPLEX*16 array, dimension (LDT,K) */ +/* > The k by k triangular factor T of the block reflector. */ +/* > If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */ +/* > lower triangular. The rest of the array is not used. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDT */ +/* > \verbatim */ +/* > LDT is INTEGER */ +/* > The leading dimension of the array T. LDT >= K. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The shape of the matrix V and the storage of the vectors which define */ +/* > the H(i) is best illustrated by the following example with n = 5 and */ +/* > k = 3. The elements equal to 1 are not stored. */ +/* > */ +/* > DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ +/* > */ +/* > V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) */ +/* > ( v1 1 ) ( 1 v2 v2 v2 ) */ +/* > ( v1 v2 1 ) ( 1 v3 v3 ) */ +/* > ( v1 v2 v3 ) */ +/* > ( v1 v2 v3 ) */ +/* > */ +/* > DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ +/* > */ +/* > V = ( v1 v2 v3 ) V = ( v1 v1 1 ) */ +/* > ( v1 v2 v3 ) ( v2 v2 v2 1 ) */ +/* > ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) */ +/* > ( 1 v3 ) */ +/* > ( 1 ) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zlarft_(char *direct, char *storev, integer *n, integer * + k, doublecomplex *v, integer *ldv, doublecomplex *tau, doublecomplex * + t, integer *ldt, ftnlen direct_len, ftnlen storev_len) +{ + /* System generated locals */ + integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1, z__2, z__3; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, prevlastv; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int zgemm_(char *, char *, integer *, integer *, + integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen), zgemv_(char *, integer *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *, doublecomplex *, doublecomplex *, integer *, ftnlen); + integer lastv; + extern /* Subroutine */ int ztrmv_(char *, char *, char *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, + ftnlen, ftnlen); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick return if possible */ + + /* Parameter adjustments */ + v_dim1 = *ldv; + v_offset = 1 + v_dim1; + v -= v_offset; + --tau; + t_dim1 = *ldt; + t_offset = 1 + t_dim1; + t -= t_offset; + + /* Function Body */ + if (*n == 0) { + return 0; + } + + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + prevlastv = *n; + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + prevlastv = max(prevlastv,i__); + i__2 = i__; + if (tau[i__2].r == 0. && tau[i__2].i == 0.) { + +/* H(i) = I */ + + i__2 = i__; + for (j = 1; j <= i__2; ++j) { + i__3 = j + i__ * t_dim1; + t[i__3].r = 0., t[i__3].i = 0.; + } + } else { + +/* general case */ + + if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { +/* Skip any trailing zeros. */ + i__2 = i__ + 1; + for (lastv = *n; lastv >= i__2; --lastv) { + i__3 = lastv + i__ * v_dim1; + if (v[i__3].r != 0. || v[i__3].i != 0.) { + goto L220; + } + } +L220: + i__2 = i__ - 1; + for (j = 1; j <= i__2; ++j) { + i__3 = j + i__ * t_dim1; + i__4 = i__; + z__2.r = -tau[i__4].r, z__2.i = -tau[i__4].i; + d_cnjg(&z__3, &v[i__ + j * v_dim1]); + z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, z__1.i = + z__2.r * z__3.i + z__2.i * z__3.r; + t[i__3].r = z__1.r, t[i__3].i = z__1.i; + } + j = min(lastv,prevlastv); + +/* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) */ + + i__2 = j - i__; + i__3 = i__ - 1; + i__4 = i__; + z__1.r = -tau[i__4].r, z__1.i = -tau[i__4].i; + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &z__1, &v[i__ + + 1 + v_dim1], ldv, &v[i__ + 1 + i__ * v_dim1], & + c__1, &c_b1, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) + 19); + } else { +/* Skip any trailing zeros. */ + i__2 = i__ + 1; + for (lastv = *n; lastv >= i__2; --lastv) { + i__3 = i__ + lastv * v_dim1; + if (v[i__3].r != 0. || v[i__3].i != 0.) { + goto L236; + } + } +L236: + i__2 = i__ - 1; + for (j = 1; j <= i__2; ++j) { + i__3 = j + i__ * t_dim1; + i__4 = i__; + z__2.r = -tau[i__4].r, z__2.i = -tau[i__4].i; + i__5 = j + i__ * v_dim1; + z__1.r = z__2.r * v[i__5].r - z__2.i * v[i__5].i, + z__1.i = z__2.r * v[i__5].i + z__2.i * v[i__5] + .r; + t[i__3].r = z__1.r, t[i__3].i = z__1.i; + } + j = min(lastv,prevlastv); + +/* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H */ + + i__2 = i__ - 1; + i__3 = j - i__; + i__4 = i__; + z__1.r = -tau[i__4].r, z__1.i = -tau[i__4].i; + zgemm_((char *)"N", (char *)"C", &i__2, &c__1, &i__3, &z__1, &v[(i__ + 1) + * v_dim1 + 1], ldv, &v[i__ + (i__ + 1) * v_dim1], + ldv, &c_b1, &t[i__ * t_dim1 + 1], ldt, (ftnlen)1, + (ftnlen)1); + } + +/* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */ + + i__2 = i__ - 1; + ztrmv_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", &i__2, &t[ + t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) + 5, (ftnlen)12, (ftnlen)8); + i__2 = i__ + i__ * t_dim1; + i__3 = i__; + t[i__2].r = tau[i__3].r, t[i__2].i = tau[i__3].i; + if (i__ > 1) { + prevlastv = max(prevlastv,lastv); + } else { + prevlastv = lastv; + } + } + } + } else { + prevlastv = 1; + for (i__ = *k; i__ >= 1; --i__) { + i__1 = i__; + if (tau[i__1].r == 0. && tau[i__1].i == 0.) { + +/* H(i) = I */ + + i__1 = *k; + for (j = i__; j <= i__1; ++j) { + i__2 = j + i__ * t_dim1; + t[i__2].r = 0., t[i__2].i = 0.; + } + } else { + +/* general case */ + + if (i__ < *k) { + if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { +/* Skip any leading zeros. */ + i__1 = i__ - 1; + for (lastv = 1; lastv <= i__1; ++lastv) { + i__2 = lastv + i__ * v_dim1; + if (v[i__2].r != 0. || v[i__2].i != 0.) { + goto L281; + } + } +L281: + i__1 = *k; + for (j = i__ + 1; j <= i__1; ++j) { + i__2 = j + i__ * t_dim1; + i__3 = i__; + z__2.r = -tau[i__3].r, z__2.i = -tau[i__3].i; + d_cnjg(&z__3, &v[*n - *k + i__ + j * v_dim1]); + z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, + z__1.i = z__2.r * z__3.i + z__2.i * + z__3.r; + t[i__2].r = z__1.r, t[i__2].i = z__1.i; + } + j = max(lastv,prevlastv); + +/* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) */ + + i__1 = *n - *k + i__ - j; + i__2 = *k - i__; + i__3 = i__; + z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i; + zgemv_((char *)"Conjugate transpose", &i__1, &i__2, &z__1, &v[ + j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * + v_dim1], &c__1, &c_b1, &t[i__ + 1 + i__ * + t_dim1], &c__1, (ftnlen)19); + } else { +/* Skip any leading zeros. */ + i__1 = i__ - 1; + for (lastv = 1; lastv <= i__1; ++lastv) { + i__2 = i__ + lastv * v_dim1; + if (v[i__2].r != 0. || v[i__2].i != 0.) { + goto L297; + } + } +L297: + i__1 = *k; + for (j = i__ + 1; j <= i__1; ++j) { + i__2 = j + i__ * t_dim1; + i__3 = i__; + z__2.r = -tau[i__3].r, z__2.i = -tau[i__3].i; + i__4 = j + (*n - *k + i__) * v_dim1; + z__1.r = z__2.r * v[i__4].r - z__2.i * v[i__4].i, + z__1.i = z__2.r * v[i__4].i + z__2.i * v[ + i__4].r; + t[i__2].r = z__1.r, t[i__2].i = z__1.i; + } + j = max(lastv,prevlastv); + +/* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H */ + + i__1 = *k - i__; + i__2 = *n - *k + i__ - j; + i__3 = i__; + z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i; + zgemm_((char *)"N", (char *)"C", &i__1, &c__1, &i__2, &z__1, &v[i__ + + 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], + ldv, &c_b1, &t[i__ + 1 + i__ * t_dim1], ldt, ( + ftnlen)1, (ftnlen)1); + } + +/* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */ + + i__1 = *k - i__; + ztrmv_((char *)"Lower", (char *)"No transpose", (char *)"Non-unit", &i__1, &t[i__ + + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * + t_dim1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)8) + ; + if (i__ > 1) { + prevlastv = min(prevlastv,lastv); + } else { + prevlastv = lastv; + } + } + i__1 = i__ + i__ * t_dim1; + i__2 = i__; + t[i__1].r = tau[i__2].r, t[i__1].i = tau[i__2].i; + } + } + } + return 0; + +/* End of ZLARFT */ + +} /* zlarft_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlascl.cpp b/lib/linalg/zlascl.cpp new file mode 100644 index 0000000000..337dd64793 --- /dev/null +++ b/lib/linalg/zlascl.cpp @@ -0,0 +1,470 @@ +/* fortran/zlascl.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLASCL + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER TYPE */ +/* INTEGER INFO, KL, KU, LDA, M, N */ +/* DOUBLE PRECISION CFROM, CTO */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLASCL multiplies the M by N complex matrix A by the real scalar */ +/* > CTO/CFROM. This is done without over/underflow as long as the final */ +/* > result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that */ +/* > A may be full, upper triangular, lower triangular, upper Hessenberg, */ +/* > or banded. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] TYPE */ +/* > \verbatim */ +/* > TYPE is CHARACTER*1 */ +/* > TYPE indices the storage type of the input matrix. */ +/* > = 'G': A is a full matrix. */ +/* > = 'L': A is a lower triangular matrix. */ +/* > = 'U': A is an upper triangular matrix. */ +/* > = 'H': A is an upper Hessenberg matrix. */ +/* > = 'B': A is a symmetric band matrix with lower bandwidth KL */ +/* > and upper bandwidth KU and with the only the lower */ +/* > half stored. */ +/* > = 'Q': A is a symmetric band matrix with lower bandwidth KL */ +/* > and upper bandwidth KU and with the only the upper */ +/* > half stored. */ +/* > = 'Z': A is a band matrix with lower bandwidth KL and upper */ +/* > bandwidth KU. See ZGBTRF for storage details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] KL */ +/* > \verbatim */ +/* > KL is INTEGER */ +/* > The lower bandwidth of A. Referenced only if TYPE = 'B', */ +/* > 'Q' or 'Z'. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] KU */ +/* > \verbatim */ +/* > KU is INTEGER */ +/* > The upper bandwidth of A. Referenced only if TYPE = 'B', */ +/* > 'Q' or 'Z'. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CFROM */ +/* > \verbatim */ +/* > CFROM is DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in] CTO */ +/* > \verbatim */ +/* > CTO is DOUBLE PRECISION */ +/* > */ +/* > The matrix A is multiplied by CTO/CFROM. A(I,J) is computed */ +/* > without over/underflow if the final result CTO*A(I,J)/CFROM */ +/* > can be represented without over/underflow. CFROM must be */ +/* > nonzero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > The matrix to be multiplied by CTO/CFROM. See TYPE for the */ +/* > storage type. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > If TYPE = 'G', 'L', 'U', 'H', LDA >= max(1,M); */ +/* > TYPE = 'B', LDA >= KL+1; */ +/* > TYPE = 'Q', LDA >= KU+1; */ +/* > TYPE = 'Z', LDA >= 2*KL+KU+1. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > 0 - successful exit */ +/* > <0 - if INFO = -i, the i-th argument had an illegal value. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int zlascl_(char *type__, integer *kl, integer *ku, + doublereal *cfrom, doublereal *cto, integer *m, integer *n, + doublecomplex *a, integer *lda, integer *info, ftnlen type_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1; + + /* Local variables */ + integer i__, j, k1, k2, k3, k4; + doublereal mul, cto1; + logical done; + doublereal ctoc; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer itype; + doublereal cfrom1; + extern doublereal dlamch_(char *, ftnlen); + doublereal cfromc; + extern logical disnan_(doublereal *); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + doublereal bignum, smlnum; + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + *info = 0; + + if (lsame_(type__, (char *)"G", (ftnlen)1, (ftnlen)1)) { + itype = 0; + } else if (lsame_(type__, (char *)"L", (ftnlen)1, (ftnlen)1)) { + itype = 1; + } else if (lsame_(type__, (char *)"U", (ftnlen)1, (ftnlen)1)) { + itype = 2; + } else if (lsame_(type__, (char *)"H", (ftnlen)1, (ftnlen)1)) { + itype = 3; + } else if (lsame_(type__, (char *)"B", (ftnlen)1, (ftnlen)1)) { + itype = 4; + } else if (lsame_(type__, (char *)"Q", (ftnlen)1, (ftnlen)1)) { + itype = 5; + } else if (lsame_(type__, (char *)"Z", (ftnlen)1, (ftnlen)1)) { + itype = 6; + } else { + itype = -1; + } + + if (itype == -1) { + *info = -1; + } else if (*cfrom == 0. || disnan_(cfrom)) { + *info = -4; + } else if (disnan_(cto)) { + *info = -5; + } else if (*m < 0) { + *info = -6; + } else if (*n < 0 || itype == 4 && *n != *m || itype == 5 && *n != *m) { + *info = -7; + } else if (itype <= 3 && *lda < max(1,*m)) { + *info = -9; + } else if (itype >= 4) { +/* Computing MAX */ + i__1 = *m - 1; + if (*kl < 0 || *kl > max(i__1,0)) { + *info = -2; + } else /* if(complicated condition) */ { +/* Computing MAX */ + i__1 = *n - 1; + if (*ku < 0 || *ku > max(i__1,0) || (itype == 4 || itype == 5) && + *kl != *ku) { + *info = -3; + } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < * + ku + 1 || itype == 6 && *lda < (*kl << 1) + *ku + 1) { + *info = -9; + } + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZLASCL", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0 || *m == 0) { + return 0; + } + +/* Get machine parameters */ + + smlnum = dlamch_((char *)"S", (ftnlen)1); + bignum = 1. / smlnum; + + cfromc = *cfrom; + ctoc = *cto; + +L10: + cfrom1 = cfromc * smlnum; + if (cfrom1 == cfromc) { +/* CFROMC is an inf. Multiply by a correctly signed zero for */ +/* finite CTOC, or a NaN if CTOC is infinite. */ + mul = ctoc / cfromc; + done = TRUE_; + cto1 = ctoc; + } else { + cto1 = ctoc / bignum; + if (cto1 == ctoc) { +/* CTOC is either 0 or an inf. In both cases, CTOC itself */ +/* serves as the correct multiplication factor. */ + mul = ctoc; + done = TRUE_; + cfromc = 1.; + } else if (abs(cfrom1) > abs(ctoc) && ctoc != 0.) { + mul = smlnum; + done = FALSE_; + cfromc = cfrom1; + } else if (abs(cto1) > abs(cfromc)) { + mul = bignum; + done = FALSE_; + ctoc = cto1; + } else { + mul = ctoc / cfromc; + done = TRUE_; + if (mul == 1.) { + return 0; + } + } + } + + if (itype == 0) { + +/* Full matrix */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L20: */ + } +/* L30: */ + } + + } else if (itype == 1) { + +/* Lower triangular matrix */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L40: */ + } +/* L50: */ + } + + } else if (itype == 2) { + +/* Upper triangular matrix */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = min(j,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L60: */ + } +/* L70: */ + } + + } else if (itype == 3) { + +/* Upper Hessenberg matrix */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { +/* Computing MIN */ + i__3 = j + 1; + i__2 = min(i__3,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L80: */ + } +/* L90: */ + } + + } else if (itype == 4) { + +/* Lower half of a symmetric band matrix */ + + k3 = *kl + 1; + k4 = *n + 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { +/* Computing MIN */ + i__3 = k3, i__4 = k4 - j; + i__2 = min(i__3,i__4); + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L100: */ + } +/* L110: */ + } + + } else if (itype == 5) { + +/* Upper half of a symmetric band matrix */ + + k1 = *ku + 2; + k3 = *ku + 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { +/* Computing MAX */ + i__2 = k1 - j; + i__3 = k3; + for (i__ = max(i__2,1); i__ <= i__3; ++i__) { + i__2 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; +/* L120: */ + } +/* L130: */ + } + + } else if (itype == 6) { + +/* Band matrix */ + + k1 = *kl + *ku + 2; + k2 = *kl + 1; + k3 = (*kl << 1) + *ku + 1; + k4 = *kl + *ku + 1 + *m; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { +/* Computing MAX */ + i__3 = k1 - j; +/* Computing MIN */ + i__4 = k3, i__5 = k4 - j; + i__2 = min(i__4,i__5); + for (i__ = max(i__3,k2); i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L140: */ + } +/* L150: */ + } + + } + + if (! done) { + goto L10; + } + + return 0; + +/* End of ZLASCL */ + +} /* zlascl_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlaset.cpp b/lib/linalg/zlaset.cpp new file mode 100644 index 0000000000..e402ea02fe --- /dev/null +++ b/lib/linalg/zlaset.cpp @@ -0,0 +1,240 @@ +/* fortran/zlaset.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given val +ues. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLASET + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLASET( UPLO, M, N, ALPHA, BETA, A, LDA ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER LDA, M, N */ +/* COMPLEX*16 ALPHA, BETA */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLASET initializes a 2-D array A to BETA on the diagonal and */ +/* > ALPHA on the offdiagonals. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies the part of the matrix A to be set. */ +/* > = 'U': Upper triangular part is set. The lower triangle */ +/* > is unchanged. */ +/* > = 'L': Lower triangular part is set. The upper triangle */ +/* > is unchanged. */ +/* > Otherwise: All of the matrix A is set. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > On entry, M specifies the number of rows of A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the number of columns of A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is COMPLEX*16 */ +/* > All the offdiagonal array elements are set to ALPHA. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] BETA */ +/* > \verbatim */ +/* > BETA is COMPLEX*16 */ +/* > All the diagonal array elements are set to BETA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > On entry, the m by n matrix A. */ +/* > On exit, A(i,j) = ALPHA, 1 <= i <= m, 1 <= j <= n, i.ne.j; */ +/* > A(i,i) = BETA , 1 <= i <= min(m,n) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int zlaset_(char *uplo, integer *m, integer *n, + doublecomplex *alpha, doublecomplex *beta, doublecomplex *a, integer * + lda, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + + /* Local variables */ + integer i__, j; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + +/* Set the diagonal to BETA and the strictly upper triangular */ +/* part of the array to ALPHA. */ + + i__1 = *n; + for (j = 2; j <= i__1; ++j) { +/* Computing MIN */ + i__3 = j - 1; + i__2 = min(i__3,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + a[i__3].r = alpha->r, a[i__3].i = alpha->i; +/* L10: */ + } +/* L20: */ + } + i__1 = min(*n,*m); + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + i__ * a_dim1; + a[i__2].r = beta->r, a[i__2].i = beta->i; +/* L30: */ + } + + } else if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Set the diagonal to BETA and the strictly lower triangular */ +/* part of the array to ALPHA. */ + + i__1 = min(*m,*n); + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + a[i__3].r = alpha->r, a[i__3].i = alpha->i; +/* L40: */ + } +/* L50: */ + } + i__1 = min(*n,*m); + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + i__ * a_dim1; + a[i__2].r = beta->r, a[i__2].i = beta->i; +/* L60: */ + } + + } else { + +/* Set the array to BETA on the diagonal and ALPHA on the */ +/* offdiagonal. */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + a[i__3].r = alpha->r, a[i__3].i = alpha->i; +/* L70: */ + } +/* L80: */ + } + i__1 = min(*m,*n); + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + i__ * a_dim1; + a[i__2].r = beta->r, a[i__2].i = beta->i; +/* L90: */ + } + } + + return 0; + +/* End of ZLASET */ + +} /* zlaset_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlasr.cpp b/lib/linalg/zlasr.cpp new file mode 100644 index 0000000000..23d68bf82f --- /dev/null +++ b/lib/linalg/zlasr.cpp @@ -0,0 +1,694 @@ +/* fortran/zlasr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZLASR applies a sequence of plane rotations to a general rectangular matrix. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLASR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER DIRECT, PIVOT, SIDE */ +/* INTEGER LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION C( * ), S( * ) */ +/* COMPLEX*16 A( LDA, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLASR applies a sequence of real plane rotations to a complex matrix */ +/* > A, from either the left or the right. */ +/* > */ +/* > When SIDE = 'L', the transformation takes the form */ +/* > */ +/* > A := P*A */ +/* > */ +/* > and when SIDE = 'R', the transformation takes the form */ +/* > */ +/* > A := A*P**T */ +/* > */ +/* > where P is an orthogonal matrix consisting of a sequence of z plane */ +/* > rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R', */ +/* > and P**T is the transpose of P. */ +/* > */ +/* > When DIRECT = 'F' (Forward sequence), then */ +/* > */ +/* > P = P(z-1) * ... * P(2) * P(1) */ +/* > */ +/* > and when DIRECT = 'B' (Backward sequence), then */ +/* > */ +/* > P = P(1) * P(2) * ... * P(z-1) */ +/* > */ +/* > where P(k) is a plane rotation matrix defined by the 2-by-2 rotation */ +/* > */ +/* > R(k) = ( c(k) s(k) ) */ +/* > = ( -s(k) c(k) ). */ +/* > */ +/* > When PIVOT = 'V' (Variable pivot), the rotation is performed */ +/* > for the plane (k,k+1), i.e., P(k) has the form */ +/* > */ +/* > P(k) = ( 1 ) */ +/* > ( ... ) */ +/* > ( 1 ) */ +/* > ( c(k) s(k) ) */ +/* > ( -s(k) c(k) ) */ +/* > ( 1 ) */ +/* > ( ... ) */ +/* > ( 1 ) */ +/* > */ +/* > where R(k) appears as a rank-2 modification to the identity matrix in */ +/* > rows and columns k and k+1. */ +/* > */ +/* > When PIVOT = 'T' (Top pivot), the rotation is performed for the */ +/* > plane (1,k+1), so P(k) has the form */ +/* > */ +/* > P(k) = ( c(k) s(k) ) */ +/* > ( 1 ) */ +/* > ( ... ) */ +/* > ( 1 ) */ +/* > ( -s(k) c(k) ) */ +/* > ( 1 ) */ +/* > ( ... ) */ +/* > ( 1 ) */ +/* > */ +/* > where R(k) appears in rows and columns 1 and k+1. */ +/* > */ +/* > Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is */ +/* > performed for the plane (k,z), giving P(k) the form */ +/* > */ +/* > P(k) = ( 1 ) */ +/* > ( ... ) */ +/* > ( 1 ) */ +/* > ( c(k) s(k) ) */ +/* > ( 1 ) */ +/* > ( ... ) */ +/* > ( 1 ) */ +/* > ( -s(k) c(k) ) */ +/* > */ +/* > where R(k) appears in rows and columns k and z. The rotations are */ +/* > performed without ever forming P(k) explicitly. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > Specifies whether the plane rotation matrix P is applied to */ +/* > A on the left or the right. */ +/* > = 'L': Left, compute A := P*A */ +/* > = 'R': Right, compute A:= A*P**T */ +/* > \endverbatim */ +/* > */ +/* > \param[in] PIVOT */ +/* > \verbatim */ +/* > PIVOT is CHARACTER*1 */ +/* > Specifies the plane for which P(k) is a plane rotation */ +/* > matrix. */ +/* > = 'V': Variable pivot, the plane (k,k+1) */ +/* > = 'T': Top pivot, the plane (1,k+1) */ +/* > = 'B': Bottom pivot, the plane (k,z) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIRECT */ +/* > \verbatim */ +/* > DIRECT is CHARACTER*1 */ +/* > Specifies whether P is a forward or backward sequence of */ +/* > plane rotations. */ +/* > = 'F': Forward, P = P(z-1)*...*P(2)*P(1) */ +/* > = 'B': Backward, P = P(1)*P(2)*...*P(z-1) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix A. If m <= 1, an immediate */ +/* > return is effected. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix A. If n <= 1, an */ +/* > immediate return is effected. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] C */ +/* > \verbatim */ +/* > C is DOUBLE PRECISION array, dimension */ +/* > (M-1) if SIDE = 'L' */ +/* > (N-1) if SIDE = 'R' */ +/* > The cosines c(k) of the plane rotations. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] S */ +/* > \verbatim */ +/* > S is DOUBLE PRECISION array, dimension */ +/* > (M-1) if SIDE = 'L' */ +/* > (N-1) if SIDE = 'R' */ +/* > The sines s(k) of the plane rotations. The 2-by-2 plane */ +/* > rotation part of the matrix P(k), R(k), has the form */ +/* > R(k) = ( c(k) s(k) ) */ +/* > ( -s(k) c(k) ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > The M-by-N matrix A. On exit, A is overwritten by P*A if */ +/* > SIDE = 'R' or by A*P**T if SIDE = 'L'. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int zlasr_(char *side, char *pivot, char *direct, integer *m, + integer *n, doublereal *c__, doublereal *s, doublecomplex *a, + integer *lda, ftnlen side_len, ftnlen pivot_len, ftnlen direct_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + doublecomplex z__1, z__2, z__3; + + /* Local variables */ + integer i__, j, info; + doublecomplex temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + doublereal ctemp, stemp; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters */ + + /* Parameter adjustments */ + --c__; + --s; + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + + /* Function Body */ + info = 0; + if (! (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) || lsame_(side, (char *)"R", ( + ftnlen)1, (ftnlen)1))) { + info = 1; + } else if (! (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1) || lsame_(pivot, + (char *)"T", (ftnlen)1, (ftnlen)1) || lsame_(pivot, (char *)"B", (ftnlen)1, ( + ftnlen)1))) { + info = 2; + } else if (! (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(direct, + (char *)"B", (ftnlen)1, (ftnlen)1))) { + info = 3; + } else if (*m < 0) { + info = 4; + } else if (*n < 0) { + info = 5; + } else if (*lda < max(1,*m)) { + info = 9; + } + if (info != 0) { + xerbla_((char *)"ZLASR ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0) { + return 0; + } + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + +/* Form P * A */ + + if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *m - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = j + 1 + i__ * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + i__3 = j + 1 + i__ * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__4 = j + i__ * a_dim1; + z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ + i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = j + i__ * a_dim1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__4 = j + i__ * a_dim1; + z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ + i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L10: */ + } + } +/* L20: */ + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *m - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = j + 1 + i__ * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + i__2 = j + 1 + i__ * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__3 = j + i__ * a_dim1; + z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ + i__3].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = j + i__ * a_dim1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__3 = j + i__ * a_dim1; + z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ + i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; +/* L30: */ + } + } +/* L40: */ + } + } + } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *m; + for (j = 2; j <= i__1; ++j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = j + i__ * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + i__3 = j + i__ * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__4 = i__ * a_dim1 + 1; + z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ + i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = i__ * a_dim1 + 1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__4 = i__ * a_dim1 + 1; + z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ + i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L50: */ + } + } +/* L60: */ + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *m; j >= 2; --j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = j + i__ * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + i__2 = j + i__ * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__3 = i__ * a_dim1 + 1; + z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ + i__3].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = i__ * a_dim1 + 1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__3 = i__ * a_dim1 + 1; + z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ + i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; +/* L70: */ + } + } +/* L80: */ + } + } + } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *m - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = j + i__ * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + i__3 = j + i__ * a_dim1; + i__4 = *m + i__ * a_dim1; + z__2.r = stemp * a[i__4].r, z__2.i = stemp * a[ + i__4].i; + z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = *m + i__ * a_dim1; + i__4 = *m + i__ * a_dim1; + z__2.r = ctemp * a[i__4].r, z__2.i = ctemp * a[ + i__4].i; + z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L90: */ + } + } +/* L100: */ + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *m - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = j + i__ * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + i__2 = j + i__ * a_dim1; + i__3 = *m + i__ * a_dim1; + z__2.r = stemp * a[i__3].r, z__2.i = stemp * a[ + i__3].i; + z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = *m + i__ * a_dim1; + i__3 = *m + i__ * a_dim1; + z__2.r = ctemp * a[i__3].r, z__2.i = ctemp * a[ + i__3].i; + z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; +/* L110: */ + } + } +/* L120: */ + } + } + } + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + +/* Form A * P**T */ + + if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + (j + 1) * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + i__3 = i__ + (j + 1) * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__4 = i__ + j * a_dim1; + z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ + i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = i__ + j * a_dim1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__4 = i__ + j * a_dim1; + z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ + i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L130: */ + } + } +/* L140: */ + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *n - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + (j + 1) * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + i__2 = i__ + (j + 1) * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__3 = i__ + j * a_dim1; + z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ + i__3].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = i__ + j * a_dim1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__3 = i__ + j * a_dim1; + z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ + i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; +/* L150: */ + } + } +/* L160: */ + } + } + } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 2; j <= i__1; ++j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + i__3 = i__ + j * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__4 = i__ + a_dim1; + z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ + i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = i__ + a_dim1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__4 = i__ + a_dim1; + z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ + i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L170: */ + } + } +/* L180: */ + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *n; j >= 2; --j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + j * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + i__2 = i__ + j * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__3 = i__ + a_dim1; + z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ + i__3].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = i__ + a_dim1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__3 = i__ + a_dim1; + z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ + i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; +/* L190: */ + } + } +/* L200: */ + } + } + } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + i__3 = i__ + j * a_dim1; + i__4 = i__ + *n * a_dim1; + z__2.r = stemp * a[i__4].r, z__2.i = stemp * a[ + i__4].i; + z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = i__ + *n * a_dim1; + i__4 = i__ + *n * a_dim1; + z__2.r = ctemp * a[i__4].r, z__2.i = ctemp * a[ + i__4].i; + z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; +/* L210: */ + } + } +/* L220: */ + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *n - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + j * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + i__2 = i__ + j * a_dim1; + i__3 = i__ + *n * a_dim1; + z__2.r = stemp * a[i__3].r, z__2.i = stemp * a[ + i__3].i; + z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = i__ + *n * a_dim1; + i__3 = i__ + *n * a_dim1; + z__2.r = ctemp * a[i__3].r, z__2.i = ctemp * a[ + i__3].i; + z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; +/* L230: */ + } + } +/* L240: */ + } + } + } + } + + return 0; + +/* End of ZLASR */ + +} /* zlasr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlassq.cpp b/lib/linalg/zlassq.cpp new file mode 100644 index 0000000000..1fa44450fe --- /dev/null +++ b/lib/linalg/zlassq.cpp @@ -0,0 +1,212 @@ +/* fortran/zlassq.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZLASSQ updates a sum of squares represented in scaled form. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLASSQ + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLASSQ( N, X, INCX, SCALE, SUMSQ ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX, N */ +/* DOUBLE PRECISION SCALE, SUMSQ */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 X( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLASSQ returns the values scl and ssq such that */ +/* > */ +/* > ( scl**2 )*ssq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq, */ +/* > */ +/* > where x( i ) = abs( X( 1 + ( i - 1 )*INCX ) ). The value of sumsq is */ +/* > assumed to be at least unity and the value of ssq will then satisfy */ +/* > */ +/* > 1.0 .le. ssq .le. ( sumsq + 2*n ). */ +/* > */ +/* > scale is assumed to be non-negative and scl returns the value */ +/* > */ +/* > scl = max( scale, abs( real( x( i ) ) ), abs( aimag( x( i ) ) ) ), */ +/* > i */ +/* > */ +/* > scale and sumsq must be supplied in SCALE and SUMSQ respectively. */ +/* > SCALE and SUMSQ are overwritten by scl and ssq respectively. */ +/* > */ +/* > The routine makes only one pass through the vector X. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of elements to be used from the vector X. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 array, dimension (N) */ +/* > The vector x as described above. */ +/* > x( i ) = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > The increment between successive values of the vector X. */ +/* > INCX > 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] SCALE */ +/* > \verbatim */ +/* > SCALE is DOUBLE PRECISION */ +/* > On entry, the value scale in the equation above. */ +/* > On exit, SCALE is overwritten with the value scl . */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] SUMSQ */ +/* > \verbatim */ +/* > SUMSQ is DOUBLE PRECISION */ +/* > On entry, the value sumsq in the equation above. */ +/* > On exit, SUMSQ is overwritten with the value ssq . */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \date December 2016 */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* ===================================================================== */ +/* Subroutine */ int zlassq_(integer *n, doublecomplex *x, integer *incx, + doublereal *scale, doublereal *sumsq) +{ + /* System generated locals */ + integer i__1, i__2, i__3; + doublereal d__1; + + /* Builtin functions */ + double d_imag(doublecomplex *); + + /* Local variables */ + integer ix; + doublereal temp1; + extern logical disnan_(doublereal *); + + +/* -- LAPACK auxiliary routine (version 3.7.0) -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ +/* December 2016 */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + + /* Parameter adjustments */ + --x; + + /* Function Body */ + if (*n > 0) { + i__1 = (*n - 1) * *incx + 1; + i__2 = *incx; + for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { + i__3 = ix; + temp1 = (d__1 = x[i__3].r, abs(d__1)); + if (temp1 > 0. || disnan_(&temp1)) { + if (*scale < temp1) { +/* Computing 2nd power */ + d__1 = *scale / temp1; + *sumsq = *sumsq * (d__1 * d__1) + 1; + *scale = temp1; + } else { +/* Computing 2nd power */ + d__1 = temp1 / *scale; + *sumsq += d__1 * d__1; + } + } + temp1 = (d__1 = d_imag(&x[ix]), abs(d__1)); + if (temp1 > 0. || disnan_(&temp1)) { + if (*scale < temp1) { +/* Computing 2nd power */ + d__1 = *scale / temp1; + *sumsq = *sumsq * (d__1 * d__1) + 1; + *scale = temp1; + } else { +/* Computing 2nd power */ + d__1 = temp1 / *scale; + *sumsq += d__1 * d__1; + } + } +/* L10: */ + } + } + + return 0; + +/* End of ZLASSQ */ + +} /* zlassq_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zlatrd.cpp b/lib/linalg/zlatrd.cpp new file mode 100644 index 0000000000..eaa0fc1826 --- /dev/null +++ b/lib/linalg/zlatrd.cpp @@ -0,0 +1,509 @@ +/* fortran/zlatrd.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublecomplex c_b1 = {0.,0.}; +static doublecomplex c_b2 = {1.,0.}; +static integer c__1 = 1; + +/* > \brief \b ZLATRD reduces the first nb rows and columns of a symmetric/Hermitian matrix A to real tridiago +nal form by an unitary similarity transformation. */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZLATRD + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER LDA, LDW, N, NB */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION E( * ) */ +/* COMPLEX*16 A( LDA, * ), TAU( * ), W( LDW, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZLATRD reduces NB rows and columns of a complex Hermitian matrix A to */ +/* > Hermitian tridiagonal form by a unitary similarity */ +/* > transformation Q**H * A * Q, and returns the matrices V and W which are */ +/* > needed to apply the transformation to the unreduced part of A. */ +/* > */ +/* > If UPLO = 'U', ZLATRD reduces the last NB rows and columns of a */ +/* > matrix, of which the upper triangle is supplied; */ +/* > if UPLO = 'L', ZLATRD reduces the first NB rows and columns of a */ +/* > matrix, of which the lower triangle is supplied. */ +/* > */ +/* > This is an auxiliary routine called by ZHETRD. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > Specifies whether the upper or lower triangular part of the */ +/* > Hermitian matrix A is stored: */ +/* > = 'U': Upper triangular */ +/* > = 'L': Lower triangular */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] NB */ +/* > \verbatim */ +/* > NB is INTEGER */ +/* > The number of rows and columns to be reduced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > On entry, the Hermitian matrix A. If UPLO = 'U', the leading */ +/* > n-by-n upper triangular part of A contains the upper */ +/* > triangular part of the matrix A, and the strictly lower */ +/* > triangular part of A is not referenced. If UPLO = 'L', the */ +/* > leading n-by-n lower triangular part of A contains the lower */ +/* > triangular part of the matrix A, and the strictly upper */ +/* > triangular part of A is not referenced. */ +/* > On exit: */ +/* > if UPLO = 'U', the last NB columns have been reduced to */ +/* > tridiagonal form, with the diagonal elements overwriting */ +/* > the diagonal elements of A; the elements above the diagonal */ +/* > with the array TAU, represent the unitary matrix Q as a */ +/* > product of elementary reflectors; */ +/* > if UPLO = 'L', the first NB columns have been reduced to */ +/* > tridiagonal form, with the diagonal elements overwriting */ +/* > the diagonal elements of A; the elements below the diagonal */ +/* > with the array TAU, represent the unitary matrix Q as a */ +/* > product of elementary reflectors. */ +/* > See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal */ +/* > elements of the last NB columns of the reduced matrix; */ +/* > if UPLO = 'L', E(1:nb) contains the subdiagonal elements of */ +/* > the first NB columns of the reduced matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (N-1) */ +/* > The scalar factors of the elementary reflectors, stored in */ +/* > TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'. */ +/* > See Further Details. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] W */ +/* > \verbatim */ +/* > W is COMPLEX*16 array, dimension (LDW,NB) */ +/* > The n-by-nb matrix W required to update the unreduced part */ +/* > of A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDW */ +/* > \verbatim */ +/* > LDW is INTEGER */ +/* > The leading dimension of the array W. LDW >= max(1,N). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERauxiliary */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > If UPLO = 'U', the matrix Q is represented as a product of elementary */ +/* > reflectors */ +/* > */ +/* > Q = H(n) H(n-1) . . . H(n-nb+1). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**H */ +/* > */ +/* > where tau is a complex scalar, and v is a complex vector with */ +/* > v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), */ +/* > and tau in TAU(i-1). */ +/* > */ +/* > If UPLO = 'L', the matrix Q is represented as a product of elementary */ +/* > reflectors */ +/* > */ +/* > Q = H(1) H(2) . . . H(nb). */ +/* > */ +/* > Each H(i) has the form */ +/* > */ +/* > H(i) = I - tau * v * v**H */ +/* > */ +/* > where tau is a complex scalar, and v is a complex vector with */ +/* > v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), */ +/* > and tau in TAU(i). */ +/* > */ +/* > The elements of the vectors v together form the n-by-nb matrix V */ +/* > which is needed, with W, to apply the transformation to the unreduced */ +/* > part of the matrix, using a Hermitian rank-2k update of the form: */ +/* > A := A - V*W**H - W*V**H. */ +/* > */ +/* > The contents of A on exit are illustrated by the following examples */ +/* > with n = 5 and nb = 2: */ +/* > */ +/* > if UPLO = 'U': if UPLO = 'L': */ +/* > */ +/* > ( a a a v4 v5 ) ( d ) */ +/* > ( a a v4 v5 ) ( 1 d ) */ +/* > ( a 1 v5 ) ( v1 1 a ) */ +/* > ( d 1 ) ( v1 v2 a a ) */ +/* > ( d ) ( v1 v2 a a a ) */ +/* > */ +/* > where d denotes a diagonal element of the reduced matrix, a denotes */ +/* > an element of the original matrix that is unchanged, and vi denotes */ +/* > an element of the vector defining H(i). */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zlatrd_(char *uplo, integer *n, integer *nb, + doublecomplex *a, integer *lda, doublereal *e, doublecomplex *tau, + doublecomplex *w, integer *ldw, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3; + doublereal d__1; + doublecomplex z__1, z__2, z__3, z__4; + + /* Local variables */ + integer i__, iw; + doublecomplex alpha; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int zscal_(integer *, doublecomplex *, + doublecomplex *, integer *); + extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *); + extern /* Subroutine */ int zgemv_(char *, integer *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *, doublecomplex *, doublecomplex *, integer *, ftnlen), + zhemv_(char *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, ftnlen), zaxpy_(integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *), zlarfg_(integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *), zlacgv_(integer *, doublecomplex *, + integer *); + + +/* -- LAPACK auxiliary routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Quick return if possible */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --e; + --tau; + w_dim1 = *ldw; + w_offset = 1 + w_dim1; + w -= w_offset; + + /* Function Body */ + if (*n <= 0) { + return 0; + } + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + +/* Reduce last NB columns of upper triangle */ + + i__1 = *n - *nb + 1; + for (i__ = *n; i__ >= i__1; --i__) { + iw = i__ - *n + *nb; + if (i__ < *n) { + +/* Update A(1:i,i) */ + + i__2 = i__ + i__ * a_dim1; + i__3 = i__ + i__ * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + i__2 = *n - i__; + zlacgv_(&i__2, &w[i__ + (iw + 1) * w_dim1], ldw); + i__2 = *n - i__; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__, &i__2, &z__1, &a[(i__ + 1) * + a_dim1 + 1], lda, &w[i__ + (iw + 1) * w_dim1], ldw, & + c_b2, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); + i__2 = *n - i__; + zlacgv_(&i__2, &w[i__ + (iw + 1) * w_dim1], ldw); + i__2 = *n - i__; + zlacgv_(&i__2, &a[i__ + (i__ + 1) * a_dim1], lda); + i__2 = *n - i__; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__, &i__2, &z__1, &w[(iw + 1) * + w_dim1 + 1], ldw, &a[i__ + (i__ + 1) * a_dim1], lda, & + c_b2, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); + i__2 = *n - i__; + zlacgv_(&i__2, &a[i__ + (i__ + 1) * a_dim1], lda); + i__2 = i__ + i__ * a_dim1; + i__3 = i__ + i__ * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } + if (i__ > 1) { + +/* Generate elementary reflector H(i) to annihilate */ +/* A(1:i-2,i) */ + + i__2 = i__ - 1 + i__ * a_dim1; + alpha.r = a[i__2].r, alpha.i = a[i__2].i; + i__2 = i__ - 1; + zlarfg_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &tau[i__ + - 1]); + e[i__ - 1] = alpha.r; + i__2 = i__ - 1 + i__ * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; + +/* Compute W(1:i-1,i) */ + + i__2 = i__ - 1; + zhemv_((char *)"Upper", &i__2, &c_b2, &a[a_offset], lda, &a[i__ * + a_dim1 + 1], &c__1, &c_b1, &w[iw * w_dim1 + 1], &c__1, + (ftnlen)5); + if (i__ < *n) { + i__2 = i__ - 1; + i__3 = *n - i__; + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &w[(iw + + 1) * w_dim1 + 1], ldw, &a[i__ * a_dim1 + 1], & + c__1, &c_b1, &w[i__ + 1 + iw * w_dim1], &c__1, ( + ftnlen)19); + i__2 = i__ - 1; + i__3 = *n - i__; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[(i__ + 1) * + a_dim1 + 1], lda, &w[i__ + 1 + iw * w_dim1], & + c__1, &c_b2, &w[iw * w_dim1 + 1], &c__1, (ftnlen) + 12); + i__2 = i__ - 1; + i__3 = *n - i__; + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &a[( + i__ + 1) * a_dim1 + 1], lda, &a[i__ * a_dim1 + 1], + &c__1, &c_b1, &w[i__ + 1 + iw * w_dim1], &c__1, ( + ftnlen)19); + i__2 = i__ - 1; + i__3 = *n - i__; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[(iw + 1) * + w_dim1 + 1], ldw, &w[i__ + 1 + iw * w_dim1], & + c__1, &c_b2, &w[iw * w_dim1 + 1], &c__1, (ftnlen) + 12); + } + i__2 = i__ - 1; + zscal_(&i__2, &tau[i__ - 1], &w[iw * w_dim1 + 1], &c__1); + z__3.r = -.5, z__3.i = -0.; + i__2 = i__ - 1; + z__2.r = z__3.r * tau[i__2].r - z__3.i * tau[i__2].i, z__2.i = + z__3.r * tau[i__2].i + z__3.i * tau[i__2].r; + i__3 = i__ - 1; + zdotc_(&z__4, &i__3, &w[iw * w_dim1 + 1], &c__1, &a[i__ * + a_dim1 + 1], &c__1); + z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * + z__4.i + z__2.i * z__4.r; + alpha.r = z__1.r, alpha.i = z__1.i; + i__2 = i__ - 1; + zaxpy_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &w[iw * + w_dim1 + 1], &c__1); + } + +/* L10: */ + } + } else { + +/* Reduce first NB columns of lower triangle */ + + i__1 = *nb; + for (i__ = 1; i__ <= i__1; ++i__) { + +/* Update A(i:n,i) */ + + i__2 = i__ + i__ * a_dim1; + i__3 = i__ + i__ * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + i__2 = i__ - 1; + zlacgv_(&i__2, &w[i__ + w_dim1], ldw); + i__2 = *n - i__ + 1; + i__3 = i__ - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[i__ + a_dim1], lda, + &w[i__ + w_dim1], ldw, &c_b2, &a[i__ + i__ * a_dim1], & + c__1, (ftnlen)12); + i__2 = i__ - 1; + zlacgv_(&i__2, &w[i__ + w_dim1], ldw); + i__2 = i__ - 1; + zlacgv_(&i__2, &a[i__ + a_dim1], lda); + i__2 = *n - i__ + 1; + i__3 = i__ - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[i__ + w_dim1], ldw, + &a[i__ + a_dim1], lda, &c_b2, &a[i__ + i__ * a_dim1], & + c__1, (ftnlen)12); + i__2 = i__ - 1; + zlacgv_(&i__2, &a[i__ + a_dim1], lda); + i__2 = i__ + i__ * a_dim1; + i__3 = i__ + i__ * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + if (i__ < *n) { + +/* Generate elementary reflector H(i) to annihilate */ +/* A(i+2:n,i) */ + + i__2 = i__ + 1 + i__ * a_dim1; + alpha.r = a[i__2].r, alpha.i = a[i__2].i; + i__2 = *n - i__; +/* Computing MIN */ + i__3 = i__ + 2; + zlarfg_(&i__2, &alpha, &a[min(i__3,*n) + i__ * a_dim1], &c__1, + &tau[i__]); + e[i__] = alpha.r; + i__2 = i__ + 1 + i__ * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; + +/* Compute W(i+1:n,i) */ + + i__2 = *n - i__; + zhemv_((char *)"Lower", &i__2, &c_b2, &a[i__ + 1 + (i__ + 1) * a_dim1] + , lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b1, &w[ + i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)5); + i__2 = *n - i__; + i__3 = i__ - 1; + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &w[i__ + 1 + + w_dim1], ldw, &a[i__ + 1 + i__ * a_dim1], &c__1, & + c_b1, &w[i__ * w_dim1 + 1], &c__1, (ftnlen)19); + i__2 = *n - i__; + i__3 = i__ - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[i__ + 1 + + a_dim1], lda, &w[i__ * w_dim1 + 1], &c__1, &c_b2, &w[ + i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); + i__2 = *n - i__; + i__3 = i__ - 1; + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &a[i__ + 1 + + a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, & + c_b1, &w[i__ * w_dim1 + 1], &c__1, (ftnlen)19); + i__2 = *n - i__; + i__3 = i__ - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[i__ + 1 + + w_dim1], ldw, &w[i__ * w_dim1 + 1], &c__1, &c_b2, &w[ + i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); + i__2 = *n - i__; + zscal_(&i__2, &tau[i__], &w[i__ + 1 + i__ * w_dim1], &c__1); + z__3.r = -.5, z__3.i = -0.; + i__2 = i__; + z__2.r = z__3.r * tau[i__2].r - z__3.i * tau[i__2].i, z__2.i = + z__3.r * tau[i__2].i + z__3.i * tau[i__2].r; + i__3 = *n - i__; + zdotc_(&z__4, &i__3, &w[i__ + 1 + i__ * w_dim1], &c__1, &a[ + i__ + 1 + i__ * a_dim1], &c__1); + z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * + z__4.i + z__2.i * z__4.r; + alpha.r = z__1.r, alpha.i = z__1.i; + i__2 = *n - i__; + zaxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &w[ + i__ + 1 + i__ * w_dim1], &c__1); + } + +/* L20: */ + } + } + + return 0; + +/* End of ZLATRD */ + +} /* zlatrd_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zpptrf.cpp b/lib/linalg/zpptrf.cpp new file mode 100644 index 0000000000..ebf3b7df9a --- /dev/null +++ b/lib/linalg/zpptrf.cpp @@ -0,0 +1,301 @@ +/* fortran/zpptrf.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static doublereal c_b16 = -1.; + +/* > \brief \b ZPPTRF */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZPPTRF + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZPPTRF( UPLO, N, AP, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 AP( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZPPTRF computes the Cholesky factorization of a complex Hermitian */ +/* > positive definite matrix A stored in packed format. */ +/* > */ +/* > The factorization has the form */ +/* > A = U**H * U, if UPLO = 'U', or */ +/* > A = L * L**H, if UPLO = 'L', */ +/* > where U is an upper triangular matrix and L is lower triangular. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A is stored; */ +/* > = 'L': Lower triangle of A is stored. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] AP */ +/* > \verbatim */ +/* > AP is COMPLEX*16 array, dimension (N*(N+1)/2) */ +/* > On entry, the upper or lower triangle of the Hermitian matrix */ +/* > A, packed columnwise in a linear array. The j-th column of A */ +/* > is stored in the array AP as follows: */ +/* > if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ +/* > if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ +/* > See below for further details. */ +/* > */ +/* > On exit, if INFO = 0, the triangular factor U or L from the */ +/* > Cholesky factorization A = U**H*U or A = L*L**H, in the same */ +/* > storage format as A. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, the leading minor of order i is not */ +/* > positive definite, and the factorization could not be */ +/* > completed. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > The packed storage scheme is illustrated by the following example */ +/* > when N = 4, UPLO = 'U': */ +/* > */ +/* > Two-dimensional storage of the Hermitian matrix A: */ +/* > */ +/* > a11 a12 a13 a14 */ +/* > a22 a23 a24 */ +/* > a33 a34 (aij = conjg(aji)) */ +/* > a44 */ +/* > */ +/* > Packed storage of the upper triangle of A: */ +/* > */ +/* > AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ] */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zpptrf_(char *uplo, integer *n, doublecomplex *ap, + integer *info, ftnlen uplo_len) +{ + /* System generated locals */ + integer i__1, i__2, i__3; + doublereal d__1; + doublecomplex z__1; + + /* Builtin functions */ + double sqrt(doublereal); + + /* Local variables */ + integer j, jc, jj; + doublereal ajj; + extern /* Subroutine */ int zhpr_(char *, integer *, doublereal *, + doublecomplex *, integer *, doublecomplex *, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *); + logical upper; + extern /* Subroutine */ int ztpsv_(char *, char *, char *, integer *, + doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen), zdscal_(integer *, + doublereal *, doublecomplex *, integer *); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --ap; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZPPTRF", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + if (upper) { + +/* Compute the Cholesky factorization A = U**H * U. */ + + jj = 0; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + jc = jj + 1; + jj += j; + +/* Compute elements 1:J-1 of column J. */ + + if (j > 1) { + i__2 = j - 1; + ztpsv_((char *)"Upper", (char *)"Conjugate transpose", (char *)"Non-unit", &i__2, &ap[ + 1], &ap[jc], &c__1, (ftnlen)5, (ftnlen)19, (ftnlen)8); + } + +/* Compute U(J,J) and test for non-positive-definiteness. */ + + i__2 = jj; + i__3 = j - 1; + zdotc_(&z__1, &i__3, &ap[jc], &c__1, &ap[jc], &c__1); + ajj = ap[i__2].r - z__1.r; + if (ajj <= 0.) { + i__2 = jj; + ap[i__2].r = ajj, ap[i__2].i = 0.; + goto L30; + } + i__2 = jj; + d__1 = sqrt(ajj); + ap[i__2].r = d__1, ap[i__2].i = 0.; +/* L10: */ + } + } else { + +/* Compute the Cholesky factorization A = L * L**H. */ + + jj = 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + +/* Compute L(J,J) and test for non-positive-definiteness. */ + + i__2 = jj; + ajj = ap[i__2].r; + if (ajj <= 0.) { + i__2 = jj; + ap[i__2].r = ajj, ap[i__2].i = 0.; + goto L30; + } + ajj = sqrt(ajj); + i__2 = jj; + ap[i__2].r = ajj, ap[i__2].i = 0.; + +/* Compute elements J+1:N of column J and update the trailing */ +/* submatrix. */ + + if (j < *n) { + i__2 = *n - j; + d__1 = 1. / ajj; + zdscal_(&i__2, &d__1, &ap[jj + 1], &c__1); + i__2 = *n - j; + zhpr_((char *)"Lower", &i__2, &c_b16, &ap[jj + 1], &c__1, &ap[jj + *n + - j + 1], (ftnlen)5); + jj = jj + *n - j + 1; + } +/* L20: */ + } + } + goto L40; + +L30: + *info = j; + +L40: + return 0; + +/* End of ZPPTRF */ + +} /* zpptrf_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zpptri.cpp b/lib/linalg/zpptri.cpp new file mode 100644 index 0000000000..fc11e435b1 --- /dev/null +++ b/lib/linalg/zpptri.cpp @@ -0,0 +1,248 @@ +/* fortran/zpptri.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublereal c_b8 = 1.; +static integer c__1 = 1; + +/* > \brief \b ZPPTRI */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZPPTRI + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZPPTRI( UPLO, N, AP, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 AP( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZPPTRI computes the inverse of a complex Hermitian positive definite */ +/* > matrix A using the Cholesky factorization A = U**H*U or A = L*L**H */ +/* > computed by ZPPTRF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangular factor is stored in AP; */ +/* > = 'L': Lower triangular factor is stored in AP. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] AP */ +/* > \verbatim */ +/* > AP is COMPLEX*16 array, dimension (N*(N+1)/2) */ +/* > On entry, the triangular factor U or L from the Cholesky */ +/* > factorization A = U**H*U or A = L*L**H, packed columnwise as */ +/* > a linear array. The j-th column of U or L is stored in the */ +/* > array AP as follows: */ +/* > if UPLO = 'U', AP(i + (j-1)*j/2) = U(i,j) for 1<=i<=j; */ +/* > if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = L(i,j) for j<=i<=n. */ +/* > */ +/* > On exit, the upper or lower triangle of the (Hermitian) */ +/* > inverse of A, overwriting the input factor U or L. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, the (i,i) element of the factor U or L is */ +/* > zero, and the inverse could not be computed. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zpptri_(char *uplo, integer *n, doublecomplex *ap, + integer *info, ftnlen uplo_len) +{ + /* System generated locals */ + integer i__1, i__2, i__3; + doublereal d__1; + doublecomplex z__1; + + /* Local variables */ + integer j, jc, jj; + doublereal ajj; + integer jjn; + extern /* Subroutine */ int zhpr_(char *, integer *, doublereal *, + doublecomplex *, integer *, doublecomplex *, ftnlen); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *); + logical upper; + extern /* Subroutine */ int ztpmv_(char *, char *, char *, integer *, + doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen), zdscal_(integer *, + doublereal *, doublecomplex *, integer *), ztptri_(char *, char *, + integer *, doublecomplex *, integer *, ftnlen, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --ap; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZPPTRI", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + +/* Invert the triangular Cholesky factor U or L. */ + + ztptri_(uplo, (char *)"Non-unit", n, &ap[1], info, (ftnlen)1, (ftnlen)8); + if (*info > 0) { + return 0; + } + if (upper) { + +/* Compute the product inv(U) * inv(U)**H. */ + + jj = 0; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + jc = jj + 1; + jj += j; + if (j > 1) { + i__2 = j - 1; + zhpr_((char *)"Upper", &i__2, &c_b8, &ap[jc], &c__1, &ap[1], (ftnlen) + 5); + } + i__2 = jj; + ajj = ap[i__2].r; + zdscal_(&j, &ajj, &ap[jc], &c__1); +/* L10: */ + } + + } else { + +/* Compute the product inv(L)**H * inv(L). */ + + jj = 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + jjn = jj + *n - j + 1; + i__2 = jj; + i__3 = *n - j + 1; + zdotc_(&z__1, &i__3, &ap[jj], &c__1, &ap[jj], &c__1); + d__1 = z__1.r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + if (j < *n) { + i__2 = *n - j; + ztpmv_((char *)"Lower", (char *)"Conjugate transpose", (char *)"Non-unit", &i__2, &ap[ + jjn], &ap[jj + 1], &c__1, (ftnlen)5, (ftnlen)19, ( + ftnlen)8); + } + jj = jjn; +/* L20: */ + } + } + + return 0; + +/* End of ZPPTRI */ + +} /* zpptri_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zscal.cpp b/lib/linalg/zscal.cpp new file mode 100644 index 0000000000..5985adebaf --- /dev/null +++ b/lib/linalg/zscal.cpp @@ -0,0 +1,162 @@ +/* fortran/zscal.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZSCAL */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZSCAL(N,ZA,ZX,INCX) */ + +/* .. Scalar Arguments .. */ +/* COMPLEX*16 ZA */ +/* INTEGER INCX,N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 ZX(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZSCAL scales a vector by a constant. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ZA */ +/* > \verbatim */ +/* > ZA is COMPLEX*16 */ +/* > On entry, ZA specifies the scalar alpha. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] ZX */ +/* > \verbatim */ +/* > ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of ZX */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, 3/11/78. */ +/* > modified 3/93 to return if incx .le. 0. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zscal_(integer *n, doublecomplex *za, doublecomplex *zx, + integer *incx) +{ + /* System generated locals */ + integer i__1, i__2, i__3, i__4; + doublecomplex z__1; + + /* Local variables */ + integer i__, nincx; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. Parameters .. */ +/* .. */ + /* Parameter adjustments */ + --zx; + + /* Function Body */ + if (*n <= 0 || *incx <= 0 || za->r == 1. && za->i == 0.) { + return 0; + } + if (*incx == 1) { + +/* code for increment equal to 1 */ + + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + z__1.r = za->r * zx[i__3].r - za->i * zx[i__3].i, z__1.i = za->r * + zx[i__3].i + za->i * zx[i__3].r; + zx[i__2].r = z__1.r, zx[i__2].i = z__1.i; + } + } else { + +/* code for increment not equal to 1 */ + + nincx = *n * *incx; + i__1 = nincx; + i__2 = *incx; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__3 = i__; + i__4 = i__; + z__1.r = za->r * zx[i__4].r - za->i * zx[i__4].i, z__1.i = za->r * + zx[i__4].i + za->i * zx[i__4].r; + zx[i__3].r = z__1.r, zx[i__3].i = z__1.i; + } + } + return 0; + +/* End of ZSCAL */ + +} /* zscal_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zstedc.cpp b/lib/linalg/zstedc.cpp new file mode 100644 index 0000000000..fb52b344b1 --- /dev/null +++ b/lib/linalg/zstedc.cpp @@ -0,0 +1,590 @@ +/* fortran/zstedc.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__9 = 9; +static integer c__0 = 0; +static integer c__2 = 2; +static doublereal c_b17 = 0.; +static doublereal c_b18 = 1.; +static integer c__1 = 1; + +/* > \brief \b ZSTEDC */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZSTEDC + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, */ +/* LRWORK, IWORK, LIWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER COMPZ */ +/* INTEGER INFO, LDZ, LIWORK, LRWORK, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* INTEGER IWORK( * ) */ +/* DOUBLE PRECISION D( * ), E( * ), RWORK( * ) */ +/* COMPLEX*16 WORK( * ), Z( LDZ, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZSTEDC computes all eigenvalues and, optionally, eigenvectors of a */ +/* > symmetric tridiagonal matrix using the divide and conquer method. */ +/* > The eigenvectors of a full or band complex Hermitian matrix can also */ +/* > be found if ZHETRD or ZHPTRD or ZHBTRD has been used to reduce this */ +/* > matrix to tridiagonal form. */ +/* > */ +/* > This code makes very mild assumptions about floating point */ +/* > arithmetic. It will work on machines with a guard digit in */ +/* > add/subtract, or on those binary machines without guard digits */ +/* > which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. */ +/* > It could conceivably fail on hexadecimal or decimal machines */ +/* > without guard digits, but we know of none. See DLAED3 for details. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] COMPZ */ +/* > \verbatim */ +/* > COMPZ is CHARACTER*1 */ +/* > = 'N': Compute eigenvalues only. */ +/* > = 'I': Compute eigenvectors of tridiagonal matrix also. */ +/* > = 'V': Compute eigenvectors of original Hermitian matrix */ +/* > also. On entry, Z contains the unitary matrix used */ +/* > to reduce the original matrix to tridiagonal form. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the diagonal elements of the tridiagonal matrix. */ +/* > On exit, if INFO = 0, the eigenvalues in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > On entry, the subdiagonal elements of the tridiagonal matrix. */ +/* > On exit, E has been destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Z */ +/* > \verbatim */ +/* > Z is COMPLEX*16 array, dimension (LDZ,N) */ +/* > On entry, if COMPZ = 'V', then Z contains the unitary */ +/* > matrix used in the reduction to tridiagonal form. */ +/* > On exit, if INFO = 0, then if COMPZ = 'V', Z contains the */ +/* > orthonormal eigenvectors of the original Hermitian matrix, */ +/* > and if COMPZ = 'I', Z contains the orthonormal eigenvectors */ +/* > of the symmetric tridiagonal matrix. */ +/* > If COMPZ = 'N', then Z is not referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDZ */ +/* > \verbatim */ +/* > LDZ is INTEGER */ +/* > The leading dimension of the array Z. LDZ >= 1. */ +/* > If eigenvectors are desired, then LDZ >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > If COMPZ = 'N' or 'I', or N <= 1, LWORK must be at least 1. */ +/* > If COMPZ = 'V' and N > 1, LWORK must be at least N*N. */ +/* > Note that for COMPZ = 'V', then if N is less than or */ +/* > equal to the minimum divide size, usually 25, then LWORK need */ +/* > only be 1. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal sizes of the WORK, RWORK and */ +/* > IWORK arrays, returns these values as the first entries of */ +/* > the WORK, RWORK and IWORK arrays, and no error message */ +/* > related to LWORK or LRWORK or LIWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] RWORK */ +/* > \verbatim */ +/* > RWORK is DOUBLE PRECISION array, dimension (MAX(1,LRWORK)) */ +/* > On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LRWORK */ +/* > \verbatim */ +/* > LRWORK is INTEGER */ +/* > The dimension of the array RWORK. */ +/* > If COMPZ = 'N' or N <= 1, LRWORK must be at least 1. */ +/* > If COMPZ = 'V' and N > 1, LRWORK must be at least */ +/* > 1 + 3*N + 2*N*lg N + 4*N**2 , */ +/* > where lg( N ) = smallest integer k such */ +/* > that 2**k >= N. */ +/* > If COMPZ = 'I' and N > 1, LRWORK must be at least */ +/* > 1 + 4*N + 2*N**2 . */ +/* > Note that for COMPZ = 'I' or 'V', then if N is less than or */ +/* > equal to the minimum divide size, usually 25, then LRWORK */ +/* > need only be max(1,2*(N-1)). */ +/* > */ +/* > If LRWORK = -1, then a workspace query is assumed; the */ +/* > routine only calculates the optimal sizes of the WORK, RWORK */ +/* > and IWORK arrays, returns these values as the first entries */ +/* > of the WORK, RWORK and IWORK arrays, and no error message */ +/* > related to LWORK or LRWORK or LIWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] IWORK */ +/* > \verbatim */ +/* > IWORK is INTEGER array, dimension (MAX(1,LIWORK)) */ +/* > On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LIWORK */ +/* > \verbatim */ +/* > LIWORK is INTEGER */ +/* > The dimension of the array IWORK. */ +/* > If COMPZ = 'N' or N <= 1, LIWORK must be at least 1. */ +/* > If COMPZ = 'V' or N > 1, LIWORK must be at least */ +/* > 6 + 6*N + 5*N*lg N. */ +/* > If COMPZ = 'I' or N > 1, LIWORK must be at least */ +/* > 3 + 5*N . */ +/* > Note that for COMPZ = 'I' or 'V', then if N is less than or */ +/* > equal to the minimum divide size, usually 25, then LIWORK */ +/* > need only be 1. */ +/* > */ +/* > If LIWORK = -1, then a workspace query is assumed; the */ +/* > routine only calculates the optimal sizes of the WORK, RWORK */ +/* > and IWORK arrays, returns these values as the first entries */ +/* > of the WORK, RWORK and IWORK arrays, and no error message */ +/* > related to LWORK or LRWORK or LIWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit. */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ +/* > > 0: The algorithm failed to compute an eigenvalue while */ +/* > working on the submatrix lying in rows and columns */ +/* > INFO/(N+1) through mod(INFO,N+1). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* > \par Contributors: */ +/* ================== */ +/* > */ +/* > Jeff Rutter, Computer Science Division, University of California */ +/* > at Berkeley, USA */ + +/* ===================================================================== */ +/* Subroutine */ int zstedc_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublecomplex *z__, integer *ldz, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, + integer *liwork, integer *info, ftnlen compz_len) +{ + /* System generated locals */ + integer z_dim1, z_offset, i__1, i__2, i__3, i__4; + doublereal d__1, d__2; + + /* Builtin functions */ + double log(doublereal); + integer pow_ii(integer *, integer *); + double sqrt(doublereal); + + /* Local variables */ + integer i__, j, k, m; + doublereal p; + integer ii, ll, lgn; + doublereal eps, tiny; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer lwmin, start; + extern /* Subroutine */ int zswap_(integer *, doublecomplex *, integer *, + doublecomplex *, integer *), zlaed0_(integer *, integer *, + doublereal *, doublereal *, doublecomplex *, integer *, + doublecomplex *, integer *, doublereal *, integer *, integer *); + extern doublereal dlamch_(char *, ftnlen); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dstedc_(char *, integer *, + doublereal *, doublereal *, doublereal *, integer *, doublereal *, + integer *, integer *, integer *, integer *, ftnlen), dlaset_( + char *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen), xerbla_(char *, integer *, + ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + integer finish; + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, + ftnlen); + extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, + integer *), zlacrm_(integer *, integer *, doublecomplex *, + integer *, doublereal *, integer *, doublecomplex *, integer *, + doublereal *); + integer liwmin, icompz; + extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + ftnlen), zlacpy_(char *, integer *, integer *, doublecomplex *, + integer *, doublecomplex *, integer *, ftnlen); + doublereal orgnrm; + integer lrwmin; + logical lquery; + integer smlsiz; + extern /* Subroutine */ int zsteqr_(char *, integer *, doublereal *, + doublereal *, doublecomplex *, integer *, doublereal *, integer *, + ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --e; + z_dim1 = *ldz; + z_offset = 1 + z_dim1; + z__ -= z_offset; + --work; + --rwork; + --iwork; + + /* Function Body */ + *info = 0; + lquery = *lwork == -1 || *lrwork == -1 || *liwork == -1; + + if (lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1)) { + icompz = 0; + } else if (lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1)) { + icompz = 1; + } else if (lsame_(compz, (char *)"I", (ftnlen)1, (ftnlen)1)) { + icompz = 2; + } else { + icompz = -1; + } + if (icompz < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { + *info = -6; + } + + if (*info == 0) { + +/* Compute the workspace requirements */ + + smlsiz = ilaenv_(&c__9, (char *)"ZSTEDC", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( + ftnlen)6, (ftnlen)1); + if (*n <= 1 || icompz == 0) { + lwmin = 1; + liwmin = 1; + lrwmin = 1; + } else if (*n <= smlsiz) { + lwmin = 1; + liwmin = 1; + lrwmin = *n - 1 << 1; + } else if (icompz == 1) { + lgn = (integer) (log((doublereal) (*n)) / log(2.)); + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + lwmin = *n * *n; +/* Computing 2nd power */ + i__1 = *n; + lrwmin = *n * 3 + 1 + (*n << 1) * lgn + (i__1 * i__1 << 2); + liwmin = *n * 6 + 6 + *n * 5 * lgn; + } else if (icompz == 2) { + lwmin = 1; +/* Computing 2nd power */ + i__1 = *n; + lrwmin = (*n << 2) + 1 + (i__1 * i__1 << 1); + liwmin = *n * 5 + 3; + } + work[1].r = (doublereal) lwmin, work[1].i = 0.; + rwork[1] = (doublereal) lrwmin; + iwork[1] = liwmin; + + if (*lwork < lwmin && ! lquery) { + *info = -8; + } else if (*lrwork < lrwmin && ! lquery) { + *info = -10; + } else if (*liwork < liwmin && ! lquery) { + *info = -12; + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZSTEDC", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + if (*n == 1) { + if (icompz != 0) { + i__1 = z_dim1 + 1; + z__[i__1].r = 1., z__[i__1].i = 0.; + } + return 0; + } + +/* If the following conditional clause is removed, then the routine */ +/* will use the Divide and Conquer routine to compute only the */ +/* eigenvalues, which requires (3N + 3N**2) real workspace and */ +/* (2 + 5N + 2N lg(N)) integer workspace. */ +/* Since on many architectures DSTERF is much faster than any other */ +/* algorithm for finding eigenvalues only, it is used here */ +/* as the default. If the conditional clause is removed, then */ +/* information on the size of workspace needs to be changed. */ + +/* If COMPZ = 'N', use DSTERF to compute the eigenvalues. */ + + if (icompz == 0) { + dsterf_(n, &d__[1], &e[1], info); + goto L70; + } + +/* If N is smaller than the minimum divide size (SMLSIZ+1), then */ +/* solve the problem with another solver. */ + + if (*n <= smlsiz) { + + zsteqr_(compz, n, &d__[1], &e[1], &z__[z_offset], ldz, &rwork[1], + info, (ftnlen)1); + + } else { + +/* If COMPZ = 'I', we simply call DSTEDC instead. */ + + if (icompz == 2) { + dlaset_((char *)"Full", n, n, &c_b17, &c_b18, &rwork[1], n, (ftnlen)4); + ll = *n * *n + 1; + i__1 = *lrwork - ll + 1; + dstedc_((char *)"I", n, &d__[1], &e[1], &rwork[1], n, &rwork[ll], &i__1, & + iwork[1], liwork, info, (ftnlen)1); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * z_dim1; + i__4 = (j - 1) * *n + i__; + z__[i__3].r = rwork[i__4], z__[i__3].i = 0.; +/* L10: */ + } +/* L20: */ + } + goto L70; + } + +/* From now on, only option left to be handled is COMPZ = 'V', */ +/* i.e. ICOMPZ = 1. */ + +/* Scale. */ + + orgnrm = dlanst_((char *)"M", n, &d__[1], &e[1], (ftnlen)1); + if (orgnrm == 0.) { + goto L70; + } + + eps = dlamch_((char *)"Epsilon", (ftnlen)7); + + start = 1; + +/* while ( START <= N ) */ + +L30: + if (start <= *n) { + +/* Let FINISH be the position of the next subdiagonal entry */ +/* such that E( FINISH ) <= TINY or FINISH = N if no such */ +/* subdiagonal exists. The matrix identified by the elements */ +/* between START and FINISH constitutes an independent */ +/* sub-problem. */ + + finish = start; +L40: + if (finish < *n) { + tiny = eps * sqrt((d__1 = d__[finish], abs(d__1))) * sqrt(( + d__2 = d__[finish + 1], abs(d__2))); + if ((d__1 = e[finish], abs(d__1)) > tiny) { + ++finish; + goto L40; + } + } + +/* (Sub) Problem determined. Compute its size and solve it. */ + + m = finish - start + 1; + if (m > smlsiz) { + +/* Scale. */ + + orgnrm = dlanst_((char *)"M", &m, &d__[start], &e[start], (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &m, &c__1, &d__[ + start], &m, info, (ftnlen)1); + i__1 = m - 1; + i__2 = m - 1; + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &i__1, &c__1, &e[ + start], &i__2, info, (ftnlen)1); + + zlaed0_(n, &m, &d__[start], &e[start], &z__[start * z_dim1 + + 1], ldz, &work[1], n, &rwork[1], &iwork[1], info); + if (*info > 0) { + *info = (*info / (m + 1) + start - 1) * (*n + 1) + *info % + (m + 1) + start - 1; + goto L70; + } + +/* Scale back. */ + + dlascl_((char *)"G", &c__0, &c__0, &c_b18, &orgnrm, &m, &c__1, &d__[ + start], &m, info, (ftnlen)1); + + } else { + dsteqr_((char *)"I", &m, &d__[start], &e[start], &rwork[1], &m, & + rwork[m * m + 1], info, (ftnlen)1); + zlacrm_(n, &m, &z__[start * z_dim1 + 1], ldz, &rwork[1], &m, & + work[1], n, &rwork[m * m + 1]); + zlacpy_((char *)"A", n, &m, &work[1], n, &z__[start * z_dim1 + 1], + ldz, (ftnlen)1); + if (*info > 0) { + *info = start * (*n + 1) + finish; + goto L70; + } + } + + start = finish + 1; + goto L30; + } + +/* endwhile */ + + +/* Use Selection Sort to minimize swaps of eigenvectors */ + + i__1 = *n; + for (ii = 2; ii <= i__1; ++ii) { + i__ = ii - 1; + k = i__; + p = d__[i__]; + i__2 = *n; + for (j = ii; j <= i__2; ++j) { + if (d__[j] < p) { + k = j; + p = d__[j]; + } +/* L50: */ + } + if (k != i__) { + d__[k] = d__[i__]; + d__[i__] = p; + zswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], + &c__1); + } +/* L60: */ + } + } + +L70: + work[1].r = (doublereal) lwmin, work[1].i = 0.; + rwork[1] = (doublereal) lrwmin; + iwork[1] = liwmin; + + return 0; + +/* End of ZSTEDC */ + +} /* zstedc_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zsteqr.cpp b/lib/linalg/zsteqr.cpp new file mode 100644 index 0000000000..21cb31cc10 --- /dev/null +++ b/lib/linalg/zsteqr.cpp @@ -0,0 +1,706 @@ +/* fortran/zsteqr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublecomplex c_b1 = {0.,0.}; +static doublecomplex c_b2 = {1.,0.}; +static integer c__0 = 0; +static integer c__1 = 1; +static integer c__2 = 2; +static doublereal c_b41 = 1.; + +/* > \brief \b ZSTEQR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZSTEQR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER COMPZ */ +/* INTEGER INFO, LDZ, N */ +/* .. */ +/* .. Array Arguments .. */ +/* DOUBLE PRECISION D( * ), E( * ), WORK( * ) */ +/* COMPLEX*16 Z( LDZ, * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZSTEQR computes all eigenvalues and, optionally, eigenvectors of a */ +/* > symmetric tridiagonal matrix using the implicit QL or QR method. */ +/* > The eigenvectors of a full or band complex Hermitian matrix can also */ +/* > be found if ZHETRD or ZHPTRD or ZHBTRD has been used to reduce this */ +/* > matrix to tridiagonal form. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] COMPZ */ +/* > \verbatim */ +/* > COMPZ is CHARACTER*1 */ +/* > = 'N': Compute eigenvalues only. */ +/* > = 'V': Compute eigenvalues and eigenvectors of the original */ +/* > Hermitian matrix. On entry, Z must contain the */ +/* > unitary matrix used to reduce the original matrix */ +/* > to tridiagonal form. */ +/* > = 'I': Compute eigenvalues and eigenvectors of the */ +/* > tridiagonal matrix. Z is initialized to the identity */ +/* > matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] D */ +/* > \verbatim */ +/* > D is DOUBLE PRECISION array, dimension (N) */ +/* > On entry, the diagonal elements of the tridiagonal matrix. */ +/* > On exit, if INFO = 0, the eigenvalues in ascending order. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] E */ +/* > \verbatim */ +/* > E is DOUBLE PRECISION array, dimension (N-1) */ +/* > On entry, the (n-1) subdiagonal elements of the tridiagonal */ +/* > matrix. */ +/* > On exit, E has been destroyed. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] Z */ +/* > \verbatim */ +/* > Z is COMPLEX*16 array, dimension (LDZ, N) */ +/* > On entry, if COMPZ = 'V', then Z contains the unitary */ +/* > matrix used in the reduction to tridiagonal form. */ +/* > On exit, if INFO = 0, then if COMPZ = 'V', Z contains the */ +/* > orthonormal eigenvectors of the original Hermitian matrix, */ +/* > and if COMPZ = 'I', Z contains the orthonormal eigenvectors */ +/* > of the symmetric tridiagonal matrix. */ +/* > If COMPZ = 'N', then Z is not referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDZ */ +/* > \verbatim */ +/* > LDZ is INTEGER */ +/* > The leading dimension of the array Z. LDZ >= 1, and if */ +/* > eigenvectors are desired, then LDZ >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is DOUBLE PRECISION array, dimension (max(1,2*N-2)) */ +/* > If COMPZ = 'N', then WORK is not referenced. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: the algorithm has failed to find all the eigenvalues in */ +/* > a total of 30*N iterations; if INFO = i, then i */ +/* > elements of E have not converged to zero; on exit, D */ +/* > and E contain the elements of a symmetric tridiagonal */ +/* > matrix which is unitarily similar to the original */ +/* > matrix. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zsteqr_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublecomplex *z__, integer *ldz, doublereal *work, + integer *info, ftnlen compz_len) +{ + /* System generated locals */ + integer z_dim1, z_offset, i__1, i__2; + doublereal d__1, d__2; + + /* Builtin functions */ + double sqrt(doublereal), d_sign(doublereal *, doublereal *); + + /* Local variables */ + doublereal b, c__, f, g; + integer i__, j, k, l, m; + doublereal p, r__, s; + integer l1, ii, mm, lm1, mm1, nm1; + doublereal rt1, rt2, eps; + integer lsv; + doublereal tst, eps2; + integer lend, jtot; + extern /* Subroutine */ int dlae2_(doublereal *, doublereal *, doublereal + *, doublereal *, doublereal *); + extern logical lsame_(char *, char *, ftnlen, ftnlen); + doublereal anorm; + extern /* Subroutine */ int zlasr_(char *, char *, char *, integer *, + integer *, doublereal *, doublereal *, doublecomplex *, integer *, + ftnlen, ftnlen, ftnlen), zswap_(integer *, doublecomplex *, + integer *, doublecomplex *, integer *), dlaev2_(doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *); + integer lendm1, lendp1; + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); + integer iscale; + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen); + doublereal safmin; + extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); + doublereal safmax; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, + ftnlen); + extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, + integer *, ftnlen); + integer lendsv; + doublereal ssfmin; + integer nmaxit, icompz; + doublereal ssfmax; + extern /* Subroutine */ int zlaset_(char *, integer *, integer *, + doublecomplex *, doublecomplex *, doublecomplex *, integer *, + ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --d__; + --e; + z_dim1 = *ldz; + z_offset = 1 + z_dim1; + z__ -= z_offset; + --work; + + /* Function Body */ + *info = 0; + + if (lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1)) { + icompz = 0; + } else if (lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1)) { + icompz = 1; + } else if (lsame_(compz, (char *)"I", (ftnlen)1, (ftnlen)1)) { + icompz = 2; + } else { + icompz = -1; + } + if (icompz < 0) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { + *info = -6; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZSTEQR", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + return 0; + } + + if (*n == 1) { + if (icompz == 2) { + i__1 = z_dim1 + 1; + z__[i__1].r = 1., z__[i__1].i = 0.; + } + return 0; + } + +/* Determine the unit roundoff and over/underflow thresholds. */ + + eps = dlamch_((char *)"E", (ftnlen)1); +/* Computing 2nd power */ + d__1 = eps; + eps2 = d__1 * d__1; + safmin = dlamch_((char *)"S", (ftnlen)1); + safmax = 1. / safmin; + ssfmax = sqrt(safmax) / 3.; + ssfmin = sqrt(safmin) / eps2; + +/* Compute the eigenvalues and eigenvectors of the tridiagonal */ +/* matrix. */ + + if (icompz == 2) { + zlaset_((char *)"Full", n, n, &c_b1, &c_b2, &z__[z_offset], ldz, (ftnlen)4); + } + + nmaxit = *n * 30; + jtot = 0; + +/* Determine where the matrix splits and choose QL or QR iteration */ +/* for each block, according to whether top or bottom diagonal */ +/* element is smaller. */ + + l1 = 1; + nm1 = *n - 1; + +L10: + if (l1 > *n) { + goto L160; + } + if (l1 > 1) { + e[l1 - 1] = 0.; + } + if (l1 <= nm1) { + i__1 = nm1; + for (m = l1; m <= i__1; ++m) { + tst = (d__1 = e[m], abs(d__1)); + if (tst == 0.) { + goto L30; + } + if (tst <= sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m + + 1], abs(d__2))) * eps) { + e[m] = 0.; + goto L30; + } +/* L20: */ + } + } + m = *n; + +L30: + l = l1; + lsv = l; + lend = m; + lendsv = lend; + l1 = m + 1; + if (lend == l) { + goto L10; + } + +/* Scale submatrix in rows and columns L to LEND */ + + i__1 = lend - l + 1; + anorm = dlanst_((char *)"I", &i__1, &d__[l], &e[l], (ftnlen)1); + iscale = 0; + if (anorm == 0.) { + goto L10; + } + if (anorm > ssfmax) { + iscale = 1; + i__1 = lend - l + 1; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, + info, (ftnlen)1); + i__1 = lend - l; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, + info, (ftnlen)1); + } else if (anorm < ssfmin) { + iscale = 2; + i__1 = lend - l + 1; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, + info, (ftnlen)1); + i__1 = lend - l; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, + info, (ftnlen)1); + } + +/* Choose between QL and QR iteration */ + + if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { + lend = lsv; + l = lendsv; + } + + if (lend > l) { + +/* QL Iteration */ + +/* Look for small subdiagonal element. */ + +L40: + if (l != lend) { + lendm1 = lend - 1; + i__1 = lendm1; + for (m = l; m <= i__1; ++m) { +/* Computing 2nd power */ + d__2 = (d__1 = e[m], abs(d__1)); + tst = d__2 * d__2; + if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m + + 1], abs(d__2)) + safmin) { + goto L60; + } +/* L50: */ + } + } + + m = lend; + +L60: + if (m < lend) { + e[m] = 0.; + } + p = d__[l]; + if (m == l) { + goto L80; + } + +/* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ +/* to compute its eigensystem. */ + + if (m == l + 1) { + if (icompz > 0) { + dlaev2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s); + work[l] = c__; + work[*n - 1 + l] = s; + zlasr_((char *)"R", (char *)"V", (char *)"B", n, &c__2, &work[l], &work[*n - 1 + l], & + z__[l * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + } else { + dlae2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2); + } + d__[l] = rt1; + d__[l + 1] = rt2; + e[l] = 0.; + l += 2; + if (l <= lend) { + goto L40; + } + goto L140; + } + + if (jtot == nmaxit) { + goto L140; + } + ++jtot; + +/* Form shift. */ + + g = (d__[l + 1] - p) / (e[l] * 2.); + r__ = dlapy2_(&g, &c_b41); + g = d__[m] - p + e[l] / (g + d_sign(&r__, &g)); + + s = 1.; + c__ = 1.; + p = 0.; + +/* Inner loop */ + + mm1 = m - 1; + i__1 = l; + for (i__ = mm1; i__ >= i__1; --i__) { + f = s * e[i__]; + b = c__ * e[i__]; + dlartg_(&g, &f, &c__, &s, &r__); + if (i__ != m - 1) { + e[i__ + 1] = r__; + } + g = d__[i__ + 1] - p; + r__ = (d__[i__] - g) * s + c__ * 2. * b; + p = s * r__; + d__[i__ + 1] = g + p; + g = c__ * r__ - b; + +/* If eigenvectors are desired, then save rotations. */ + + if (icompz > 0) { + work[i__] = c__; + work[*n - 1 + i__] = -s; + } + +/* L70: */ + } + +/* If eigenvectors are desired, then apply saved rotations. */ + + if (icompz > 0) { + mm = m - l + 1; + zlasr_((char *)"R", (char *)"V", (char *)"B", n, &mm, &work[l], &work[*n - 1 + l], &z__[l + * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + + d__[l] -= p; + e[l] = g; + goto L40; + +/* Eigenvalue found. */ + +L80: + d__[l] = p; + + ++l; + if (l <= lend) { + goto L40; + } + goto L140; + + } else { + +/* QR Iteration */ + +/* Look for small superdiagonal element. */ + +L90: + if (l != lend) { + lendp1 = lend + 1; + i__1 = lendp1; + for (m = l; m >= i__1; --m) { +/* Computing 2nd power */ + d__2 = (d__1 = e[m - 1], abs(d__1)); + tst = d__2 * d__2; + if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m + - 1], abs(d__2)) + safmin) { + goto L110; + } +/* L100: */ + } + } + + m = lend; + +L110: + if (m > lend) { + e[m - 1] = 0.; + } + p = d__[l]; + if (m == l) { + goto L130; + } + +/* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ +/* to compute its eigensystem. */ + + if (m == l - 1) { + if (icompz > 0) { + dlaev2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s) + ; + work[m] = c__; + work[*n - 1 + m] = s; + zlasr_((char *)"R", (char *)"V", (char *)"F", n, &c__2, &work[m], &work[*n - 1 + m], & + z__[(l - 1) * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + } else { + dlae2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2); + } + d__[l - 1] = rt1; + d__[l] = rt2; + e[l - 1] = 0.; + l += -2; + if (l >= lend) { + goto L90; + } + goto L140; + } + + if (jtot == nmaxit) { + goto L140; + } + ++jtot; + +/* Form shift. */ + + g = (d__[l - 1] - p) / (e[l - 1] * 2.); + r__ = dlapy2_(&g, &c_b41); + g = d__[m] - p + e[l - 1] / (g + d_sign(&r__, &g)); + + s = 1.; + c__ = 1.; + p = 0.; + +/* Inner loop */ + + lm1 = l - 1; + i__1 = lm1; + for (i__ = m; i__ <= i__1; ++i__) { + f = s * e[i__]; + b = c__ * e[i__]; + dlartg_(&g, &f, &c__, &s, &r__); + if (i__ != m) { + e[i__ - 1] = r__; + } + g = d__[i__] - p; + r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b; + p = s * r__; + d__[i__] = g + p; + g = c__ * r__ - b; + +/* If eigenvectors are desired, then save rotations. */ + + if (icompz > 0) { + work[i__] = c__; + work[*n - 1 + i__] = s; + } + +/* L120: */ + } + +/* If eigenvectors are desired, then apply saved rotations. */ + + if (icompz > 0) { + mm = l - m + 1; + zlasr_((char *)"R", (char *)"V", (char *)"F", n, &mm, &work[m], &work[*n - 1 + m], &z__[m + * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + + d__[l] -= p; + e[lm1] = g; + goto L90; + +/* Eigenvalue found. */ + +L130: + d__[l] = p; + + --l; + if (l >= lend) { + goto L90; + } + goto L140; + + } + +/* Undo scaling if necessary */ + +L140: + if (iscale == 1) { + i__1 = lendsv - lsv + 1; + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], + n, info, (ftnlen)1); + i__1 = lendsv - lsv; + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n, + info, (ftnlen)1); + } else if (iscale == 2) { + i__1 = lendsv - lsv + 1; + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], + n, info, (ftnlen)1); + i__1 = lendsv - lsv; + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n, + info, (ftnlen)1); + } + +/* Check for no convergence to an eigenvalue after a total */ +/* of N*MAXIT iterations. */ + + if (jtot == nmaxit) { + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + if (e[i__] != 0.) { + ++(*info); + } +/* L150: */ + } + return 0; + } + goto L10; + +/* Order eigenvalues and eigenvectors. */ + +L160: + if (icompz == 0) { + +/* Use Quick Sort */ + + dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); + + } else { + +/* Use Selection Sort to minimize swaps of eigenvectors */ + + i__1 = *n; + for (ii = 2; ii <= i__1; ++ii) { + i__ = ii - 1; + k = i__; + p = d__[i__]; + i__2 = *n; + for (j = ii; j <= i__2; ++j) { + if (d__[j] < p) { + k = j; + p = d__[j]; + } +/* L170: */ + } + if (k != i__) { + d__[k] = d__[i__]; + d__[i__] = p; + zswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], + &c__1); + } +/* L180: */ + } + } + return 0; + +/* End of ZSTEQR */ + +} /* zsteqr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zswap.cpp b/lib/linalg/zswap.cpp new file mode 100644 index 0000000000..d00bb044fd --- /dev/null +++ b/lib/linalg/zswap.cpp @@ -0,0 +1,176 @@ +/* fortran/zswap.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZSWAP */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZSWAP(N,ZX,INCX,ZY,INCY) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,INCY,N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 ZX(*),ZY(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZSWAP interchanges two vectors. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > number of elements in input vector(s) */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] ZX */ +/* > \verbatim */ +/* > ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > storage spacing between elements of ZX */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] ZY */ +/* > \verbatim */ +/* > ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCY */ +/* > \verbatim */ +/* > INCY is INTEGER */ +/* > storage spacing between elements of ZY */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level1 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > jack dongarra, 3/11/78. */ +/* > modified 12/3/93, array(1) declarations changed to array(*) */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int zswap_(integer *n, doublecomplex *zx, integer *incx, + doublecomplex *zy, integer *incy) +{ + /* System generated locals */ + integer i__1, i__2, i__3; + + /* Local variables */ + integer i__, ix, iy; + doublecomplex ztemp; + + +/* -- Reference BLAS level1 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ + /* Parameter adjustments */ + --zy; + --zx; + + /* Function Body */ + if (*n <= 0) { + return 0; + } + if (*incx == 1 && *incy == 1) { + +/* code for both increments equal to 1 */ + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + ztemp.r = zx[i__2].r, ztemp.i = zx[i__2].i; + i__2 = i__; + i__3 = i__; + zx[i__2].r = zy[i__3].r, zx[i__2].i = zy[i__3].i; + i__2 = i__; + zy[i__2].r = ztemp.r, zy[i__2].i = ztemp.i; + } + } else { + +/* code for unequal increments or equal increments not equal */ +/* to 1 */ + + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ix; + ztemp.r = zx[i__2].r, ztemp.i = zx[i__2].i; + i__2 = ix; + i__3 = iy; + zx[i__2].r = zy[i__3].r, zx[i__2].i = zy[i__3].i; + i__2 = iy; + zy[i__2].r = ztemp.r, zy[i__2].i = ztemp.i; + ix += *incx; + iy += *incy; + } + } + return 0; + +/* End of ZSWAP */ + +} /* zswap_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/ztpmv.cpp b/lib/linalg/ztpmv.cpp new file mode 100644 index 0000000000..a29145d6bd --- /dev/null +++ b/lib/linalg/ztpmv.cpp @@ -0,0 +1,639 @@ +/* fortran/ztpmv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZTPMV */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,N */ +/* CHARACTER DIAG,TRANS,UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 AP(*),X(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZTPMV performs one of the matrix-vector operations */ +/* > */ +/* > x := A*x, or x := A**T*x, or x := A**H*x, */ +/* > */ +/* > where x is an n element vector and A is an n by n unit, or non-unit, */ +/* > upper or lower triangular matrix, supplied in packed form. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the matrix is an upper or */ +/* > lower triangular matrix as follows: */ +/* > */ +/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ +/* > */ +/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > On entry, TRANS specifies the operation to be performed as */ +/* > follows: */ +/* > */ +/* > TRANS = 'N' or 'n' x := A*x. */ +/* > */ +/* > TRANS = 'T' or 't' x := A**T*x. */ +/* > */ +/* > TRANS = 'C' or 'c' x := A**H*x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIAG */ +/* > \verbatim */ +/* > DIAG is CHARACTER*1 */ +/* > On entry, DIAG specifies whether or not A is unit */ +/* > triangular as follows: */ +/* > */ +/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ +/* > */ +/* > DIAG = 'N' or 'n' A is not assumed to be unit */ +/* > triangular. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] AP */ +/* > \verbatim */ +/* > AP is COMPLEX*16 array, dimension at least */ +/* > ( ( n*( n + 1 ) )/2 ). */ +/* > Before entry with UPLO = 'U' or 'u', the array AP must */ +/* > contain the upper triangular matrix packed sequentially, */ +/* > column by column, so that AP( 1 ) contains a( 1, 1 ), */ +/* > AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 ) */ +/* > respectively, and so on. */ +/* > Before entry with UPLO = 'L' or 'l', the array AP must */ +/* > contain the lower triangular matrix packed sequentially, */ +/* > column by column, so that AP( 1 ) contains a( 1, 1 ), */ +/* > AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 ) */ +/* > respectively, and so on. */ +/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ +/* > A are not referenced, but are assumed to be unity. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array X must contain the n */ +/* > element vector x. On exit, X is overwritten with the */ +/* > transformed vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int ztpmv_(char *uplo, char *trans, char *diag, integer *n, + doublecomplex *ap, doublecomplex *x, integer *incx, ftnlen uplo_len, + ftnlen trans_len, ftnlen diag_len) +{ + /* System generated locals */ + integer i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1, z__2, z__3; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, k, kk, ix, jx, kx, info; + doublecomplex temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + logical noconj, nounit; + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --x; + --ap; + + /* Function Body */ + info = 0; + if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*incx == 0) { + info = 7; + } + if (info != 0) { + xerbla_((char *)"ZTPMV ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0) { + return 0; + } + + noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + +/* Set up the start point in X if the increment is not unity. This */ +/* will be ( N - 1 )*INCX too small for descending loops. */ + + if (*incx <= 0) { + kx = 1 - (*n - 1) * *incx; + } else if (*incx != 1) { + kx = 1; + } + +/* Start the operations. In this version the elements of AP are */ +/* accessed sequentially with one pass through AP. */ + + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form x:= A*x. */ + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + kk = 1; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + k = kk; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = k; + z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] + .i, z__2.i = temp.r * ap[i__5].i + temp.i + * ap[i__5].r; + z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + + z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; + ++k; +/* L10: */ + } + if (nounit) { + i__2 = j; + i__3 = j; + i__4 = kk + j - 1; + z__1.r = x[i__3].r * ap[i__4].r - x[i__3].i * ap[ + i__4].i, z__1.i = x[i__3].r * ap[i__4].i + + x[i__3].i * ap[i__4].r; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + } + kk += j; +/* L20: */ + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = kx; + i__2 = kk + j - 2; + for (k = kk; k <= i__2; ++k) { + i__3 = ix; + i__4 = ix; + i__5 = k; + z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] + .i, z__2.i = temp.r * ap[i__5].i + temp.i + * ap[i__5].r; + z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + + z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; + ix += *incx; +/* L30: */ + } + if (nounit) { + i__2 = jx; + i__3 = jx; + i__4 = kk + j - 1; + z__1.r = x[i__3].r * ap[i__4].r - x[i__3].i * ap[ + i__4].i, z__1.i = x[i__3].r * ap[i__4].i + + x[i__3].i * ap[i__4].r; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + } + jx += *incx; + kk += j; +/* L40: */ + } + } + } else { + kk = *n * (*n + 1) / 2; + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + k = kk; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + i__2 = i__; + i__3 = i__; + i__4 = k; + z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4] + .i, z__2.i = temp.r * ap[i__4].i + temp.i + * ap[i__4].r; + z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + + z__2.i; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + --k; +/* L50: */ + } + if (nounit) { + i__1 = j; + i__2 = j; + i__3 = kk - *n + j; + z__1.r = x[i__2].r * ap[i__3].r - x[i__2].i * ap[ + i__3].i, z__1.i = x[i__2].r * ap[i__3].i + + x[i__2].i * ap[i__3].r; + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + } + kk -= *n - j + 1; +/* L60: */ + } + } else { + kx += (*n - 1) * *incx; + jx = kx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = kx; + i__1 = kk - (*n - (j + 1)); + for (k = kk; k >= i__1; --k) { + i__2 = ix; + i__3 = ix; + i__4 = k; + z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4] + .i, z__2.i = temp.r * ap[i__4].i + temp.i + * ap[i__4].r; + z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + + z__2.i; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + ix -= *incx; +/* L70: */ + } + if (nounit) { + i__1 = jx; + i__2 = jx; + i__3 = kk - *n + j; + z__1.r = x[i__2].r * ap[i__3].r - x[i__2].i * ap[ + i__3].i, z__1.i = x[i__2].r * ap[i__3].i + + x[i__2].i * ap[i__3].r; + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + } + jx -= *incx; + kk -= *n - j + 1; +/* L80: */ + } + } + } + } else { + +/* Form x := A**T*x or x := A**H*x. */ + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + kk = *n * (*n + 1) / 2; + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + k = kk - 1; + if (noconj) { + if (nounit) { + i__1 = kk; + z__1.r = temp.r * ap[i__1].r - temp.i * ap[i__1] + .i, z__1.i = temp.r * ap[i__1].i + temp.i + * ap[i__1].r; + temp.r = z__1.r, temp.i = z__1.i; + } + for (i__ = j - 1; i__ >= 1; --i__) { + i__1 = k; + i__2 = i__; + z__2.r = ap[i__1].r * x[i__2].r - ap[i__1].i * x[ + i__2].i, z__2.i = ap[i__1].r * x[i__2].i + + ap[i__1].i * x[i__2].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + --k; +/* L90: */ + } + } else { + if (nounit) { + d_cnjg(&z__2, &ap[kk]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + for (i__ = j - 1; i__ >= 1; --i__) { + d_cnjg(&z__3, &ap[k]); + i__1 = i__; + z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, + z__2.i = z__3.r * x[i__1].i + z__3.i * x[ + i__1].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + --k; +/* L100: */ + } + } + i__1 = j; + x[i__1].r = temp.r, x[i__1].i = temp.i; + kk -= j; +/* L110: */ + } + } else { + jx = kx + (*n - 1) * *incx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = jx; + if (noconj) { + if (nounit) { + i__1 = kk; + z__1.r = temp.r * ap[i__1].r - temp.i * ap[i__1] + .i, z__1.i = temp.r * ap[i__1].i + temp.i + * ap[i__1].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__1 = kk - j + 1; + for (k = kk - 1; k >= i__1; --k) { + ix -= *incx; + i__2 = k; + i__3 = ix; + z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[ + i__3].i, z__2.i = ap[i__2].r * x[i__3].i + + ap[i__2].i * x[i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L120: */ + } + } else { + if (nounit) { + d_cnjg(&z__2, &ap[kk]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__1 = kk - j + 1; + for (k = kk - 1; k >= i__1; --k) { + ix -= *incx; + d_cnjg(&z__3, &ap[k]); + i__2 = ix; + z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, + z__2.i = z__3.r * x[i__2].i + z__3.i * x[ + i__2].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L130: */ + } + } + i__1 = jx; + x[i__1].r = temp.r, x[i__1].i = temp.i; + jx -= *incx; + kk -= j; +/* L140: */ + } + } + } else { + kk = 1; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + k = kk + 1; + if (noconj) { + if (nounit) { + i__2 = kk; + z__1.r = temp.r * ap[i__2].r - temp.i * ap[i__2] + .i, z__1.i = temp.r * ap[i__2].i + temp.i + * ap[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = k; + i__4 = i__; + z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ + i__4].i, z__2.i = ap[i__3].r * x[i__4].i + + ap[i__3].i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ++k; +/* L150: */ + } + } else { + if (nounit) { + d_cnjg(&z__2, &ap[kk]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + d_cnjg(&z__3, &ap[k]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[ + i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ++k; +/* L160: */ + } + } + i__2 = j; + x[i__2].r = temp.r, x[i__2].i = temp.i; + kk += *n - j + 1; +/* L170: */ + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = jx; + if (noconj) { + if (nounit) { + i__2 = kk; + z__1.r = temp.r * ap[i__2].r - temp.i * ap[i__2] + .i, z__1.i = temp.r * ap[i__2].i + temp.i + * ap[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = kk + *n - j; + for (k = kk + 1; k <= i__2; ++k) { + ix += *incx; + i__3 = k; + i__4 = ix; + z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ + i__4].i, z__2.i = ap[i__3].r * x[i__4].i + + ap[i__3].i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L180: */ + } + } else { + if (nounit) { + d_cnjg(&z__2, &ap[kk]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = kk + *n - j; + for (k = kk + 1; k <= i__2; ++k) { + ix += *incx; + d_cnjg(&z__3, &ap[k]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[ + i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L190: */ + } + } + i__2 = jx; + x[i__2].r = temp.r, x[i__2].i = temp.i; + jx += *incx; + kk += *n - j + 1; +/* L200: */ + } + } + } + } + + return 0; + +/* End of ZTPMV */ + +} /* ztpmv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/ztpsv.cpp b/lib/linalg/ztpsv.cpp new file mode 100644 index 0000000000..7e7e64d721 --- /dev/null +++ b/lib/linalg/ztpsv.cpp @@ -0,0 +1,607 @@ +/* fortran/ztpsv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZTPSV */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,N */ +/* CHARACTER DIAG,TRANS,UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 AP(*),X(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZTPSV solves one of the systems of equations */ +/* > */ +/* > A*x = b, or A**T*x = b, or A**H*x = b, */ +/* > */ +/* > where b and x are n element vectors and A is an n by n unit, or */ +/* > non-unit, upper or lower triangular matrix, supplied in packed form. */ +/* > */ +/* > No test for singularity or near-singularity is included in this */ +/* > routine. Such tests must be performed before calling this routine. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the matrix is an upper or */ +/* > lower triangular matrix as follows: */ +/* > */ +/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ +/* > */ +/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > On entry, TRANS specifies the equations to be solved as */ +/* > follows: */ +/* > */ +/* > TRANS = 'N' or 'n' A*x = b. */ +/* > */ +/* > TRANS = 'T' or 't' A**T*x = b. */ +/* > */ +/* > TRANS = 'C' or 'c' A**H*x = b. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIAG */ +/* > \verbatim */ +/* > DIAG is CHARACTER*1 */ +/* > On entry, DIAG specifies whether or not A is unit */ +/* > triangular as follows: */ +/* > */ +/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ +/* > */ +/* > DIAG = 'N' or 'n' A is not assumed to be unit */ +/* > triangular. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] AP */ +/* > \verbatim */ +/* > AP is COMPLEX*16 array, dimension at least */ +/* > ( ( n*( n + 1 ) )/2 ). */ +/* > Before entry with UPLO = 'U' or 'u', the array AP must */ +/* > contain the upper triangular matrix packed sequentially, */ +/* > column by column, so that AP( 1 ) contains a( 1, 1 ), */ +/* > AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 ) */ +/* > respectively, and so on. */ +/* > Before entry with UPLO = 'L' or 'l', the array AP must */ +/* > contain the lower triangular matrix packed sequentially, */ +/* > column by column, so that AP( 1 ) contains a( 1, 1 ), */ +/* > AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 ) */ +/* > respectively, and so on. */ +/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ +/* > A are not referenced, but are assumed to be unity. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array X must contain the n */ +/* > element right-hand side vector b. On exit, X is overwritten */ +/* > with the solution vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int ztpsv_(char *uplo, char *trans, char *diag, integer *n, + doublecomplex *ap, doublecomplex *x, integer *incx, ftnlen uplo_len, + ftnlen trans_len, ftnlen diag_len) +{ + /* System generated locals */ + integer i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1, z__2, z__3; + + /* Builtin functions */ + void z_div(doublecomplex *, doublecomplex *, doublecomplex *), d_cnjg( + doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, k, kk, ix, jx, kx, info; + doublecomplex temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + logical noconj, nounit; + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --x; + --ap; + + /* Function Body */ + info = 0; + if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*incx == 0) { + info = 7; + } + if (info != 0) { + xerbla_((char *)"ZTPSV ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0) { + return 0; + } + + noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + +/* Set up the start point in X if the increment is not unity. This */ +/* will be ( N - 1 )*INCX too small for descending loops. */ + + if (*incx <= 0) { + kx = 1 - (*n - 1) * *incx; + } else if (*incx != 1) { + kx = 1; + } + +/* Start the operations. In this version the elements of AP are */ +/* accessed sequentially with one pass through AP. */ + + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form x := inv( A )*x. */ + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + kk = *n * (*n + 1) / 2; + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + if (nounit) { + i__1 = j; + z_div(&z__1, &x[j], &ap[kk]); + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + k = kk - 1; + for (i__ = j - 1; i__ >= 1; --i__) { + i__1 = i__; + i__2 = i__; + i__3 = k; + z__2.r = temp.r * ap[i__3].r - temp.i * ap[i__3] + .i, z__2.i = temp.r * ap[i__3].i + temp.i + * ap[i__3].r; + z__1.r = x[i__2].r - z__2.r, z__1.i = x[i__2].i - + z__2.i; + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + --k; +/* L10: */ + } + } + kk -= j; +/* L20: */ + } + } else { + jx = kx + (*n - 1) * *incx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + if (nounit) { + i__1 = jx; + z_div(&z__1, &x[jx], &ap[kk]); + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = jx; + i__1 = kk - j + 1; + for (k = kk - 1; k >= i__1; --k) { + ix -= *incx; + i__2 = ix; + i__3 = ix; + i__4 = k; + z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4] + .i, z__2.i = temp.r * ap[i__4].i + temp.i + * ap[i__4].r; + z__1.r = x[i__3].r - z__2.r, z__1.i = x[i__3].i - + z__2.i; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; +/* L30: */ + } + } + jx -= *incx; + kk -= j; +/* L40: */ + } + } + } else { + kk = 1; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + if (nounit) { + i__2 = j; + z_div(&z__1, &x[j], &ap[kk]); + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + k = kk + 1; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = k; + z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] + .i, z__2.i = temp.r * ap[i__5].i + temp.i + * ap[i__5].r; + z__1.r = x[i__4].r - z__2.r, z__1.i = x[i__4].i - + z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; + ++k; +/* L50: */ + } + } + kk += *n - j + 1; +/* L60: */ + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + if (nounit) { + i__2 = jx; + z_div(&z__1, &x[jx], &ap[kk]); + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = jx; + i__2 = kk + *n - j; + for (k = kk + 1; k <= i__2; ++k) { + ix += *incx; + i__3 = ix; + i__4 = ix; + i__5 = k; + z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] + .i, z__2.i = temp.r * ap[i__5].i + temp.i + * ap[i__5].r; + z__1.r = x[i__4].r - z__2.r, z__1.i = x[i__4].i - + z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; +/* L70: */ + } + } + jx += *incx; + kk += *n - j + 1; +/* L80: */ + } + } + } + } else { + +/* Form x := inv( A**T )*x or x := inv( A**H )*x. */ + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + kk = 1; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + k = kk; + if (noconj) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = k; + i__4 = i__; + z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ + i__4].i, z__2.i = ap[i__3].r * x[i__4].i + + ap[i__3].i * x[i__4].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ++k; +/* L90: */ + } + if (nounit) { + z_div(&z__1, &temp, &ap[kk + j - 1]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + d_cnjg(&z__3, &ap[k]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[ + i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ++k; +/* L100: */ + } + if (nounit) { + d_cnjg(&z__2, &ap[kk + j - 1]); + z_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__2 = j; + x[i__2].r = temp.r, x[i__2].i = temp.i; + kk += j; +/* L110: */ + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = kx; + if (noconj) { + i__2 = kk + j - 2; + for (k = kk; k <= i__2; ++k) { + i__3 = k; + i__4 = ix; + z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ + i__4].i, z__2.i = ap[i__3].r * x[i__4].i + + ap[i__3].i * x[i__4].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix += *incx; +/* L120: */ + } + if (nounit) { + z_div(&z__1, &temp, &ap[kk + j - 1]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__2 = kk + j - 2; + for (k = kk; k <= i__2; ++k) { + d_cnjg(&z__3, &ap[k]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[ + i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix += *incx; +/* L130: */ + } + if (nounit) { + d_cnjg(&z__2, &ap[kk + j - 1]); + z_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__2 = jx; + x[i__2].r = temp.r, x[i__2].i = temp.i; + jx += *incx; + kk += j; +/* L140: */ + } + } + } else { + kk = *n * (*n + 1) / 2; + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + k = kk; + if (noconj) { + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + i__2 = k; + i__3 = i__; + z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[ + i__3].i, z__2.i = ap[i__2].r * x[i__3].i + + ap[i__2].i * x[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + --k; +/* L150: */ + } + if (nounit) { + z_div(&z__1, &temp, &ap[kk - *n + j]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + d_cnjg(&z__3, &ap[k]); + i__2 = i__; + z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, + z__2.i = z__3.r * x[i__2].i + z__3.i * x[ + i__2].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + --k; +/* L160: */ + } + if (nounit) { + d_cnjg(&z__2, &ap[kk - *n + j]); + z_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__1 = j; + x[i__1].r = temp.r, x[i__1].i = temp.i; + kk -= *n - j + 1; +/* L170: */ + } + } else { + kx += (*n - 1) * *incx; + jx = kx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = kx; + if (noconj) { + i__1 = kk - (*n - (j + 1)); + for (k = kk; k >= i__1; --k) { + i__2 = k; + i__3 = ix; + z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[ + i__3].i, z__2.i = ap[i__2].r * x[i__3].i + + ap[i__2].i * x[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix -= *incx; +/* L180: */ + } + if (nounit) { + z_div(&z__1, &temp, &ap[kk - *n + j]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__1 = kk - (*n - (j + 1)); + for (k = kk; k >= i__1; --k) { + d_cnjg(&z__3, &ap[k]); + i__2 = ix; + z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, + z__2.i = z__3.r * x[i__2].i + z__3.i * x[ + i__2].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix -= *incx; +/* L190: */ + } + if (nounit) { + d_cnjg(&z__2, &ap[kk - *n + j]); + z_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__1 = jx; + x[i__1].r = temp.r, x[i__1].i = temp.i; + jx -= *incx; + kk -= *n - j + 1; +/* L200: */ + } + } + } + } + + return 0; + +/* End of ZTPSV */ + +} /* ztpsv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/ztptri.cpp b/lib/linalg/ztptri.cpp new file mode 100644 index 0000000000..c781cb964f --- /dev/null +++ b/lib/linalg/ztptri.cpp @@ -0,0 +1,308 @@ +/* fortran/ztptri.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static doublecomplex c_b1 = {1.,0.}; +static integer c__1 = 1; + +/* > \brief \b ZTPTRI */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZTPTRI + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZTPTRI( UPLO, DIAG, N, AP, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER DIAG, UPLO */ +/* INTEGER INFO, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 AP( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZTPTRI computes the inverse of a complex upper or lower triangular */ +/* > matrix A stored in packed format. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': A is upper triangular; */ +/* > = 'L': A is lower triangular. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIAG */ +/* > \verbatim */ +/* > DIAG is CHARACTER*1 */ +/* > = 'N': A is non-unit triangular; */ +/* > = 'U': A is unit triangular. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix A. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] AP */ +/* > \verbatim */ +/* > AP is COMPLEX*16 array, dimension (N*(N+1)/2) */ +/* > On entry, the upper or lower triangular matrix A, stored */ +/* > columnwise in a linear array. The j-th column of A is stored */ +/* > in the array AP as follows: */ +/* > if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ +/* > if UPLO = 'L', AP(i + (j-1)*((2*n-j)/2) = A(i,j) for j<=i<=n. */ +/* > See below for further details. */ +/* > On exit, the (triangular) inverse of the original matrix, in */ +/* > the same packed storage format. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > > 0: if INFO = i, A(i,i) is exactly zero. The triangular */ +/* > matrix is singular and its inverse can not be computed. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > A triangular matrix A can be transferred to packed storage using one */ +/* > of the following program segments: */ +/* > */ +/* > UPLO = 'U': UPLO = 'L': */ +/* > */ +/* > JC = 1 JC = 1 */ +/* > DO 2 J = 1, N DO 2 J = 1, N */ +/* > DO 1 I = 1, J DO 1 I = J, N */ +/* > AP(JC+I-1) = A(I,J) AP(JC+I-J) = A(I,J) */ +/* > 1 CONTINUE 1 CONTINUE */ +/* > JC = JC + J JC = JC + N - J + 1 */ +/* > 2 CONTINUE 2 CONTINUE */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int ztptri_(char *uplo, char *diag, integer *n, + doublecomplex *ap, integer *info, ftnlen uplo_len, ftnlen diag_len) +{ + /* System generated locals */ + integer i__1, i__2; + doublecomplex z__1; + + /* Builtin functions */ + void z_div(doublecomplex *, doublecomplex *, doublecomplex *); + + /* Local variables */ + integer j, jc, jj; + doublecomplex ajj; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int zscal_(integer *, doublecomplex *, + doublecomplex *, integer *); + logical upper; + extern /* Subroutine */ int ztpmv_(char *, char *, char *, integer *, + doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + integer jclast; + logical nounit; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + --ap; + + /* Function Body */ + *info = 0; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! nounit && ! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*n < 0) { + *info = -3; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZTPTRI", &i__1, (ftnlen)6); + return 0; + } + +/* Check for singularity if non-unit. */ + + if (nounit) { + if (upper) { + jj = 0; + i__1 = *n; + for (*info = 1; *info <= i__1; ++(*info)) { + jj += *info; + i__2 = jj; + if (ap[i__2].r == 0. && ap[i__2].i == 0.) { + return 0; + } +/* L10: */ + } + } else { + jj = 1; + i__1 = *n; + for (*info = 1; *info <= i__1; ++(*info)) { + i__2 = jj; + if (ap[i__2].r == 0. && ap[i__2].i == 0.) { + return 0; + } + jj = jj + *n - *info + 1; +/* L20: */ + } + } + *info = 0; + } + + if (upper) { + +/* Compute inverse of upper triangular matrix. */ + + jc = 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (nounit) { + i__2 = jc + j - 1; + z_div(&z__1, &c_b1, &ap[jc + j - 1]); + ap[i__2].r = z__1.r, ap[i__2].i = z__1.i; + i__2 = jc + j - 1; + z__1.r = -ap[i__2].r, z__1.i = -ap[i__2].i; + ajj.r = z__1.r, ajj.i = z__1.i; + } else { + z__1.r = -1., z__1.i = -0.; + ajj.r = z__1.r, ajj.i = z__1.i; + } + +/* Compute elements 1:j-1 of j-th column. */ + + i__2 = j - 1; + ztpmv_((char *)"Upper", (char *)"No transpose", diag, &i__2, &ap[1], &ap[jc], & + c__1, (ftnlen)5, (ftnlen)12, (ftnlen)1); + i__2 = j - 1; + zscal_(&i__2, &ajj, &ap[jc], &c__1); + jc += j; +/* L30: */ + } + + } else { + +/* Compute inverse of lower triangular matrix. */ + + jc = *n * (*n + 1) / 2; + for (j = *n; j >= 1; --j) { + if (nounit) { + i__1 = jc; + z_div(&z__1, &c_b1, &ap[jc]); + ap[i__1].r = z__1.r, ap[i__1].i = z__1.i; + i__1 = jc; + z__1.r = -ap[i__1].r, z__1.i = -ap[i__1].i; + ajj.r = z__1.r, ajj.i = z__1.i; + } else { + z__1.r = -1., z__1.i = -0.; + ajj.r = z__1.r, ajj.i = z__1.i; + } + if (j < *n) { + +/* Compute elements j+1:n of j-th column. */ + + i__1 = *n - j; + ztpmv_((char *)"Lower", (char *)"No transpose", diag, &i__1, &ap[jclast], &ap[ + jc + 1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)1); + i__1 = *n - j; + zscal_(&i__1, &ajj, &ap[jc + 1], &c__1); + } + jclast = jc; + jc = jc - *n + j - 2; +/* L40: */ + } + } + + return 0; + +/* End of ZTPTRI */ + +} /* ztptri_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/ztrmm.cpp b/lib/linalg/ztrmm.cpp new file mode 100644 index 0000000000..cd71371d5b --- /dev/null +++ b/lib/linalg/ztrmm.cpp @@ -0,0 +1,762 @@ +/* fortran/ztrmm.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZTRMM */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) */ + +/* .. Scalar Arguments .. */ +/* COMPLEX*16 ALPHA */ +/* INTEGER LDA,LDB,M,N */ +/* CHARACTER DIAG,SIDE,TRANSA,UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A(LDA,*),B(LDB,*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZTRMM performs one of the matrix-matrix operations */ +/* > */ +/* > B := alpha*op( A )*B, or B := alpha*B*op( A ) */ +/* > */ +/* > where alpha is a scalar, B is an m by n matrix, A is a unit, or */ +/* > non-unit, upper or lower triangular matrix and op( A ) is one of */ +/* > */ +/* > op( A ) = A or op( A ) = A**T or op( A ) = A**H. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > On entry, SIDE specifies whether op( A ) multiplies B from */ +/* > the left or right as follows: */ +/* > */ +/* > SIDE = 'L' or 'l' B := alpha*op( A )*B. */ +/* > */ +/* > SIDE = 'R' or 'r' B := alpha*B*op( A ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the matrix A is an upper or */ +/* > lower triangular matrix as follows: */ +/* > */ +/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ +/* > */ +/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANSA */ +/* > \verbatim */ +/* > TRANSA is CHARACTER*1 */ +/* > On entry, TRANSA specifies the form of op( A ) to be used in */ +/* > the matrix multiplication as follows: */ +/* > */ +/* > TRANSA = 'N' or 'n' op( A ) = A. */ +/* > */ +/* > TRANSA = 'T' or 't' op( A ) = A**T. */ +/* > */ +/* > TRANSA = 'C' or 'c' op( A ) = A**H. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIAG */ +/* > \verbatim */ +/* > DIAG is CHARACTER*1 */ +/* > On entry, DIAG specifies whether or not A is unit triangular */ +/* > as follows: */ +/* > */ +/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ +/* > */ +/* > DIAG = 'N' or 'n' A is not assumed to be unit */ +/* > triangular. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > On entry, M specifies the number of rows of B. M must be at */ +/* > least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the number of columns of B. N must be */ +/* > at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] ALPHA */ +/* > \verbatim */ +/* > ALPHA is COMPLEX*16 */ +/* > On entry, ALPHA specifies the scalar alpha. When alpha is */ +/* > zero then A is not referenced and B need not be set before */ +/* > entry. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension ( LDA, k ), where k is m */ +/* > when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. */ +/* > Before entry with UPLO = 'U' or 'u', the leading k by k */ +/* > upper triangular part of the array A must contain the upper */ +/* > triangular matrix and the strictly lower triangular part of */ +/* > A is not referenced. */ +/* > Before entry with UPLO = 'L' or 'l', the leading k by k */ +/* > lower triangular part of the array A must contain the lower */ +/* > triangular matrix and the strictly upper triangular part of */ +/* > A is not referenced. */ +/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ +/* > A are not referenced either, but are assumed to be unity. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. When SIDE = 'L' or 'l' then */ +/* > LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' */ +/* > then LDA must be at least max( 1, n ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] B */ +/* > \verbatim */ +/* > B is COMPLEX*16 array, dimension ( LDB, N ). */ +/* > Before entry, the leading m by n part of the array B must */ +/* > contain the matrix B, and on exit is overwritten by the */ +/* > transformed matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDB */ +/* > \verbatim */ +/* > LDB is INTEGER */ +/* > On entry, LDB specifies the first dimension of B as declared */ +/* > in the calling (sub) program. LDB must be at least */ +/* > max( 1, m ). */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level3 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 3 Blas routine. */ +/* > */ +/* > -- Written on 8-February-1989. */ +/* > Jack Dongarra, Argonne National Laboratory. */ +/* > Iain Duff, AERE Harwell. */ +/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ +/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int ztrmm_(char *side, char *uplo, char *transa, char *diag, + integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, + integer *lda, doublecomplex *b, integer *ldb, ftnlen side_len, ftnlen + uplo_len, ftnlen transa_len, ftnlen diag_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4, i__5, + i__6; + doublecomplex z__1, z__2, z__3; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, k, info; + doublecomplex temp; + logical lside; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nrowa; + logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + logical noconj, nounit; + + +/* -- Reference BLAS level3 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. Parameters .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + b_dim1 = *ldb; + b_offset = 1 + b_dim1; + b -= b_offset; + + /* Function Body */ + lside = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + if (lside) { + nrowa = *m; + } else { + nrowa = *n; + } + noconj = lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1); + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + + info = 0; + if (! lside && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + info = 2; + } else if (! lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 3; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 4; + } else if (*m < 0) { + info = 5; + } else if (*n < 0) { + info = 6; + } else if (*lda < max(1,nrowa)) { + info = 9; + } else if (*ldb < max(1,*m)) { + info = 11; + } + if (info != 0) { + xerbla_((char *)"ZTRMM ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*m == 0 || *n == 0) { + return 0; + } + +/* And when alpha.eq.zero. */ + + if (alpha->r == 0. && alpha->i == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + b[i__3].r = 0., b[i__3].i = 0.; +/* L10: */ + } +/* L20: */ + } + return 0; + } + +/* Start the operations. */ + + if (lside) { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form B := alpha*A*B. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (k = 1; k <= i__2; ++k) { + i__3 = k + j * b_dim1; + if (b[i__3].r != 0. || b[i__3].i != 0.) { + i__3 = k + j * b_dim1; + z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3] + .i, z__1.i = alpha->r * b[i__3].i + + alpha->i * b[i__3].r; + temp.r = z__1.r, temp.i = z__1.i; + i__3 = k - 1; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * b_dim1; + i__5 = i__ + j * b_dim1; + i__6 = i__ + k * a_dim1; + z__2.r = temp.r * a[i__6].r - temp.i * a[i__6] + .i, z__2.i = temp.r * a[i__6].i + + temp.i * a[i__6].r; + z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5] + .i + z__2.i; + b[i__4].r = z__1.r, b[i__4].i = z__1.i; +/* L30: */ + } + if (nounit) { + i__3 = k + k * a_dim1; + z__1.r = temp.r * a[i__3].r - temp.i * a[i__3] + .i, z__1.i = temp.r * a[i__3].i + + temp.i * a[i__3].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__3 = k + j * b_dim1; + b[i__3].r = temp.r, b[i__3].i = temp.i; + } +/* L40: */ + } +/* L50: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (k = *m; k >= 1; --k) { + i__2 = k + j * b_dim1; + if (b[i__2].r != 0. || b[i__2].i != 0.) { + i__2 = k + j * b_dim1; + z__1.r = alpha->r * b[i__2].r - alpha->i * b[i__2] + .i, z__1.i = alpha->r * b[i__2].i + + alpha->i * b[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = k + j * b_dim1; + b[i__2].r = temp.r, b[i__2].i = temp.i; + if (nounit) { + i__2 = k + j * b_dim1; + i__3 = k + j * b_dim1; + i__4 = k + k * a_dim1; + z__1.r = b[i__3].r * a[i__4].r - b[i__3].i * + a[i__4].i, z__1.i = b[i__3].r * a[ + i__4].i + b[i__3].i * a[i__4].r; + b[i__2].r = z__1.r, b[i__2].i = z__1.i; + } + i__2 = *m; + for (i__ = k + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + i__5 = i__ + k * a_dim1; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5] + .i, z__2.i = temp.r * a[i__5].i + + temp.i * a[i__5].r; + z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4] + .i + z__2.i; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; +/* L60: */ + } + } +/* L70: */ + } +/* L80: */ + } + } + } else { + +/* Form B := alpha*A**T*B or B := alpha*A**H*B. */ + + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + i__2 = i__ + j * b_dim1; + temp.r = b[i__2].r, temp.i = b[i__2].i; + if (noconj) { + if (nounit) { + i__2 = i__ + i__ * a_dim1; + z__1.r = temp.r * a[i__2].r - temp.i * a[i__2] + .i, z__1.i = temp.r * a[i__2].i + + temp.i * a[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = i__ - 1; + for (k = 1; k <= i__2; ++k) { + i__3 = k + i__ * a_dim1; + i__4 = k + j * b_dim1; + z__2.r = a[i__3].r * b[i__4].r - a[i__3].i * + b[i__4].i, z__2.i = a[i__3].r * b[ + i__4].i + a[i__3].i * b[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L90: */ + } + } else { + if (nounit) { + d_cnjg(&z__2, &a[i__ + i__ * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = i__ - 1; + for (k = 1; k <= i__2; ++k) { + d_cnjg(&z__3, &a[k + i__ * a_dim1]); + i__3 = k + j * b_dim1; + z__2.r = z__3.r * b[i__3].r - z__3.i * b[i__3] + .i, z__2.i = z__3.r * b[i__3].i + + z__3.i * b[i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L100: */ + } + } + i__2 = i__ + j * b_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + b[i__2].r = z__1.r, b[i__2].i = z__1.i; +/* L110: */ + } +/* L120: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + temp.r = b[i__3].r, temp.i = b[i__3].i; + if (noconj) { + if (nounit) { + i__3 = i__ + i__ * a_dim1; + z__1.r = temp.r * a[i__3].r - temp.i * a[i__3] + .i, z__1.i = temp.r * a[i__3].i + + temp.i * a[i__3].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__3 = *m; + for (k = i__ + 1; k <= i__3; ++k) { + i__4 = k + i__ * a_dim1; + i__5 = k + j * b_dim1; + z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * + b[i__5].i, z__2.i = a[i__4].r * b[ + i__5].i + a[i__4].i * b[i__5].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L130: */ + } + } else { + if (nounit) { + d_cnjg(&z__2, &a[i__ + i__ * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__3 = *m; + for (k = i__ + 1; k <= i__3; ++k) { + d_cnjg(&z__3, &a[k + i__ * a_dim1]); + i__4 = k + j * b_dim1; + z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4] + .i, z__2.i = z__3.r * b[i__4].i + + z__3.i * b[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L140: */ + } + } + i__3 = i__ + j * b_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; +/* L150: */ + } +/* L160: */ + } + } + } + } else { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form B := alpha*B*A. */ + + if (upper) { + for (j = *n; j >= 1; --j) { + temp.r = alpha->r, temp.i = alpha->i; + if (nounit) { + i__1 = j + j * a_dim1; + z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, + z__1.i = temp.r * a[i__1].i + temp.i * a[i__1] + .r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + j * b_dim1; + i__3 = i__ + j * b_dim1; + z__1.r = temp.r * b[i__3].r - temp.i * b[i__3].i, + z__1.i = temp.r * b[i__3].i + temp.i * b[i__3] + .r; + b[i__2].r = z__1.r, b[i__2].i = z__1.i; +/* L170: */ + } + i__1 = j - 1; + for (k = 1; k <= i__1; ++k) { + i__2 = k + j * a_dim1; + if (a[i__2].r != 0. || a[i__2].i != 0.) { + i__2 = k + j * a_dim1; + z__1.r = alpha->r * a[i__2].r - alpha->i * a[i__2] + .i, z__1.i = alpha->r * a[i__2].i + + alpha->i * a[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + i__5 = i__ + k * b_dim1; + z__2.r = temp.r * b[i__5].r - temp.i * b[i__5] + .i, z__2.i = temp.r * b[i__5].i + + temp.i * b[i__5].r; + z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4] + .i + z__2.i; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; +/* L180: */ + } + } +/* L190: */ + } +/* L200: */ + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp.r = alpha->r, temp.i = alpha->i; + if (nounit) { + i__2 = j + j * a_dim1; + z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, + z__1.i = temp.r * a[i__2].i + temp.i * a[i__2] + .r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + z__1.r = temp.r * b[i__4].r - temp.i * b[i__4].i, + z__1.i = temp.r * b[i__4].i + temp.i * b[i__4] + .r; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; +/* L210: */ + } + i__2 = *n; + for (k = j + 1; k <= i__2; ++k) { + i__3 = k + j * a_dim1; + if (a[i__3].r != 0. || a[i__3].i != 0.) { + i__3 = k + j * a_dim1; + z__1.r = alpha->r * a[i__3].r - alpha->i * a[i__3] + .i, z__1.i = alpha->r * a[i__3].i + + alpha->i * a[i__3].r; + temp.r = z__1.r, temp.i = z__1.i; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * b_dim1; + i__5 = i__ + j * b_dim1; + i__6 = i__ + k * b_dim1; + z__2.r = temp.r * b[i__6].r - temp.i * b[i__6] + .i, z__2.i = temp.r * b[i__6].i + + temp.i * b[i__6].r; + z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5] + .i + z__2.i; + b[i__4].r = z__1.r, b[i__4].i = z__1.i; +/* L220: */ + } + } +/* L230: */ + } +/* L240: */ + } + } + } else { + +/* Form B := alpha*B*A**T or B := alpha*B*A**H. */ + + if (upper) { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + i__2 = k - 1; + for (j = 1; j <= i__2; ++j) { + i__3 = j + k * a_dim1; + if (a[i__3].r != 0. || a[i__3].i != 0.) { + if (noconj) { + i__3 = j + k * a_dim1; + z__1.r = alpha->r * a[i__3].r - alpha->i * a[ + i__3].i, z__1.i = alpha->r * a[i__3] + .i + alpha->i * a[i__3].r; + temp.r = z__1.r, temp.i = z__1.i; + } else { + d_cnjg(&z__2, &a[j + k * a_dim1]); + z__1.r = alpha->r * z__2.r - alpha->i * + z__2.i, z__1.i = alpha->r * z__2.i + + alpha->i * z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * b_dim1; + i__5 = i__ + j * b_dim1; + i__6 = i__ + k * b_dim1; + z__2.r = temp.r * b[i__6].r - temp.i * b[i__6] + .i, z__2.i = temp.r * b[i__6].i + + temp.i * b[i__6].r; + z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5] + .i + z__2.i; + b[i__4].r = z__1.r, b[i__4].i = z__1.i; +/* L250: */ + } + } +/* L260: */ + } + temp.r = alpha->r, temp.i = alpha->i; + if (nounit) { + if (noconj) { + i__2 = k + k * a_dim1; + z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, + z__1.i = temp.r * a[i__2].i + temp.i * a[ + i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } else { + d_cnjg(&z__2, &a[k + k * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + } + if (temp.r != 1. || temp.i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + k * b_dim1; + i__4 = i__ + k * b_dim1; + z__1.r = temp.r * b[i__4].r - temp.i * b[i__4].i, + z__1.i = temp.r * b[i__4].i + temp.i * b[ + i__4].r; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; +/* L270: */ + } + } +/* L280: */ + } + } else { + for (k = *n; k >= 1; --k) { + i__1 = *n; + for (j = k + 1; j <= i__1; ++j) { + i__2 = j + k * a_dim1; + if (a[i__2].r != 0. || a[i__2].i != 0.) { + if (noconj) { + i__2 = j + k * a_dim1; + z__1.r = alpha->r * a[i__2].r - alpha->i * a[ + i__2].i, z__1.i = alpha->r * a[i__2] + .i + alpha->i * a[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } else { + d_cnjg(&z__2, &a[j + k * a_dim1]); + z__1.r = alpha->r * z__2.r - alpha->i * + z__2.i, z__1.i = alpha->r * z__2.i + + alpha->i * z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + i__5 = i__ + k * b_dim1; + z__2.r = temp.r * b[i__5].r - temp.i * b[i__5] + .i, z__2.i = temp.r * b[i__5].i + + temp.i * b[i__5].r; + z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4] + .i + z__2.i; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; +/* L290: */ + } + } +/* L300: */ + } + temp.r = alpha->r, temp.i = alpha->i; + if (nounit) { + if (noconj) { + i__1 = k + k * a_dim1; + z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, + z__1.i = temp.r * a[i__1].i + temp.i * a[ + i__1].r; + temp.r = z__1.r, temp.i = z__1.i; + } else { + d_cnjg(&z__2, &a[k + k * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + } + if (temp.r != 1. || temp.i != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + k * b_dim1; + i__3 = i__ + k * b_dim1; + z__1.r = temp.r * b[i__3].r - temp.i * b[i__3].i, + z__1.i = temp.r * b[i__3].i + temp.i * b[ + i__3].r; + b[i__2].r = z__1.r, b[i__2].i = z__1.i; +/* L310: */ + } + } +/* L320: */ + } + } + } + } + + return 0; + +/* End of ZTRMM */ + +} /* ztrmm_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/ztrmv.cpp b/lib/linalg/ztrmv.cpp new file mode 100644 index 0000000000..ffc55b16fe --- /dev/null +++ b/lib/linalg/ztrmv.cpp @@ -0,0 +1,624 @@ +/* fortran/ztrmv.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZTRMV */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INCX,LDA,N */ +/* CHARACTER DIAG,TRANS,UPLO */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A(LDA,*),X(*) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZTRMV performs one of the matrix-vector operations */ +/* > */ +/* > x := A*x, or x := A**T*x, or x := A**H*x, */ +/* > */ +/* > where x is an n element vector and A is an n by n unit, or non-unit, */ +/* > upper or lower triangular matrix. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > On entry, UPLO specifies whether the matrix is an upper or */ +/* > lower triangular matrix as follows: */ +/* > */ +/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ +/* > */ +/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > On entry, TRANS specifies the operation to be performed as */ +/* > follows: */ +/* > */ +/* > TRANS = 'N' or 'n' x := A*x. */ +/* > */ +/* > TRANS = 'T' or 't' x := A**T*x. */ +/* > */ +/* > TRANS = 'C' or 'c' x := A**H*x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] DIAG */ +/* > \verbatim */ +/* > DIAG is CHARACTER*1 */ +/* > On entry, DIAG specifies whether or not A is unit */ +/* > triangular as follows: */ +/* > */ +/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ +/* > */ +/* > DIAG = 'N' or 'n' A is not assumed to be unit */ +/* > triangular. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > On entry, N specifies the order of the matrix A. */ +/* > N must be at least zero. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension ( LDA, N ). */ +/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ +/* > upper triangular part of the array A must contain the upper */ +/* > triangular matrix and the strictly lower triangular part of */ +/* > A is not referenced. */ +/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ +/* > lower triangular part of the array A must contain the lower */ +/* > triangular matrix and the strictly upper triangular part of */ +/* > A is not referenced. */ +/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ +/* > A are not referenced either, but are assumed to be unity. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > On entry, LDA specifies the first dimension of A as declared */ +/* > in the calling (sub) program. LDA must be at least */ +/* > max( 1, n ). */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] X */ +/* > \verbatim */ +/* > X is COMPLEX*16 array, dimension at least */ +/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ +/* > Before entry, the incremented array X must contain the n */ +/* > element vector x. On exit, X is overwritten with the */ +/* > transformed vector x. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] INCX */ +/* > \verbatim */ +/* > INCX is INTEGER */ +/* > On entry, INCX specifies the increment for the elements of */ +/* > X. INCX must not be zero. */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16_blas_level2 */ + +/* > \par Further Details: */ +/* ===================== */ +/* > */ +/* > \verbatim */ +/* > */ +/* > Level 2 Blas routine. */ +/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ +/* > */ +/* > -- Written on 22-October-1986. */ +/* > Jack Dongarra, Argonne National Lab. */ +/* > Jeremy Du Croz, Nag Central Office. */ +/* > Sven Hammarling, Nag Central Office. */ +/* > Richard Hanson, Sandia National Labs. */ +/* > \endverbatim */ +/* > */ +/* ===================================================================== */ +/* Subroutine */ int ztrmv_(char *uplo, char *trans, char *diag, integer *n, + doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, + ftnlen uplo_len, ftnlen trans_len, ftnlen diag_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + doublecomplex z__1, z__2, z__3; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, ix, jx, kx, info; + doublecomplex temp; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + logical noconj, nounit; + + +/* -- Reference BLAS level2 routine -- */ +/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ + +/* Test the input parameters. */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --x; + + /* Function Body */ + info = 0; + if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 3; + } else if (*n < 0) { + info = 4; + } else if (*lda < max(1,*n)) { + info = 6; + } else if (*incx == 0) { + info = 8; + } + if (info != 0) { + xerbla_((char *)"ZTRMV ", &info, (ftnlen)6); + return 0; + } + +/* Quick return if possible. */ + + if (*n == 0) { + return 0; + } + + noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); + nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); + +/* Set up the start point in X if the increment is not unity. This */ +/* will be ( N - 1 )*INCX too small for descending loops. */ + + if (*incx <= 0) { + kx = 1 - (*n - 1) * *incx; + } else if (*incx != 1) { + kx = 1; + } + +/* Start the operations. In this version the elements of A are */ +/* accessed sequentially with one pass through A. */ + + if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { + +/* Form x := A*x. */ + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, + z__2.i = temp.r * a[i__5].i + temp.i * a[ + i__5].r; + z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + + z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; +/* L10: */ + } + if (nounit) { + i__2 = j; + i__3 = j; + i__4 = j + j * a_dim1; + z__1.r = x[i__3].r * a[i__4].r - x[i__3].i * a[ + i__4].i, z__1.i = x[i__3].r * a[i__4].i + + x[i__3].i * a[i__4].r; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + } +/* L20: */ + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = kx; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = ix; + i__4 = ix; + i__5 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, + z__2.i = temp.r * a[i__5].i + temp.i * a[ + i__5].r; + z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + + z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; + ix += *incx; +/* L30: */ + } + if (nounit) { + i__2 = jx; + i__3 = jx; + i__4 = j + j * a_dim1; + z__1.r = x[i__3].r * a[i__4].r - x[i__3].i * a[ + i__4].i, z__1.i = x[i__3].r * a[i__4].i + + x[i__3].i * a[i__4].r; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + } + jx += *incx; +/* L40: */ + } + } + } else { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + i__2 = i__; + i__3 = i__; + i__4 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__4].r - temp.i * a[i__4].i, + z__2.i = temp.r * a[i__4].i + temp.i * a[ + i__4].r; + z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + + z__2.i; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; +/* L50: */ + } + if (nounit) { + i__1 = j; + i__2 = j; + i__3 = j + j * a_dim1; + z__1.r = x[i__2].r * a[i__3].r - x[i__2].i * a[ + i__3].i, z__1.i = x[i__2].r * a[i__3].i + + x[i__2].i * a[i__3].r; + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + } +/* L60: */ + } + } else { + kx += (*n - 1) * *incx; + jx = kx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = kx; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + i__2 = ix; + i__3 = ix; + i__4 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__4].r - temp.i * a[i__4].i, + z__2.i = temp.r * a[i__4].i + temp.i * a[ + i__4].r; + z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + + z__2.i; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + ix -= *incx; +/* L70: */ + } + if (nounit) { + i__1 = jx; + i__2 = jx; + i__3 = j + j * a_dim1; + z__1.r = x[i__2].r * a[i__3].r - x[i__2].i * a[ + i__3].i, z__1.i = x[i__2].r * a[i__3].i + + x[i__2].i * a[i__3].r; + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + } + jx -= *incx; +/* L80: */ + } + } + } + } else { + +/* Form x := A**T*x or x := A**H*x. */ + + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + if (noconj) { + if (nounit) { + i__1 = j + j * a_dim1; + z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, + z__1.i = temp.r * a[i__1].i + temp.i * a[ + i__1].r; + temp.r = z__1.r, temp.i = z__1.i; + } + for (i__ = j - 1; i__ >= 1; --i__) { + i__1 = i__ + j * a_dim1; + i__2 = i__; + z__2.r = a[i__1].r * x[i__2].r - a[i__1].i * x[ + i__2].i, z__2.i = a[i__1].r * x[i__2].i + + a[i__1].i * x[i__2].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L90: */ + } + } else { + if (nounit) { + d_cnjg(&z__2, &a[j + j * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + for (i__ = j - 1; i__ >= 1; --i__) { + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__1 = i__; + z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, + z__2.i = z__3.r * x[i__1].i + z__3.i * x[ + i__1].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L100: */ + } + } + i__1 = j; + x[i__1].r = temp.r, x[i__1].i = temp.i; +/* L110: */ + } + } else { + jx = kx + (*n - 1) * *incx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = jx; + if (noconj) { + if (nounit) { + i__1 = j + j * a_dim1; + z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, + z__1.i = temp.r * a[i__1].i + temp.i * a[ + i__1].r; + temp.r = z__1.r, temp.i = z__1.i; + } + for (i__ = j - 1; i__ >= 1; --i__) { + ix -= *incx; + i__1 = i__ + j * a_dim1; + i__2 = ix; + z__2.r = a[i__1].r * x[i__2].r - a[i__1].i * x[ + i__2].i, z__2.i = a[i__1].r * x[i__2].i + + a[i__1].i * x[i__2].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L120: */ + } + } else { + if (nounit) { + d_cnjg(&z__2, &a[j + j * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + for (i__ = j - 1; i__ >= 1; --i__) { + ix -= *incx; + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__1 = ix; + z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, + z__2.i = z__3.r * x[i__1].i + z__3.i * x[ + i__1].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L130: */ + } + } + i__1 = jx; + x[i__1].r = temp.r, x[i__1].i = temp.i; + jx -= *incx; +/* L140: */ + } + } + } else { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + if (noconj) { + if (nounit) { + i__2 = j + j * a_dim1; + z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, + z__1.i = temp.r * a[i__2].i + temp.i * a[ + i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[ + i__4].i, z__2.i = a[i__3].r * x[i__4].i + + a[i__3].i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L150: */ + } + } else { + if (nounit) { + d_cnjg(&z__2, &a[j + j * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[ + i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L160: */ + } + } + i__2 = j; + x[i__2].r = temp.r, x[i__2].i = temp.i; +/* L170: */ + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = jx; + if (noconj) { + if (nounit) { + i__2 = j + j * a_dim1; + z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, + z__1.i = temp.r * a[i__2].i + temp.i * a[ + i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + i__3 = i__ + j * a_dim1; + i__4 = ix; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[ + i__4].i, z__2.i = a[i__3].r * x[i__4].i + + a[i__3].i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L180: */ + } + } else { + if (nounit) { + d_cnjg(&z__2, &a[j + j * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[ + i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; +/* L190: */ + } + } + i__2 = jx; + x[i__2].r = temp.r, x[i__2].i = temp.i; + jx += *incx; +/* L200: */ + } + } + } + } + + return 0; + +/* End of ZTRMV */ + +} /* ztrmv_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zung2l.cpp b/lib/linalg/zung2l.cpp new file mode 100644 index 0000000000..45c03e5c78 --- /dev/null +++ b/lib/linalg/zung2l.cpp @@ -0,0 +1,262 @@ +/* fortran/zung2l.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b ZUNG2L generates all or part of the unitary matrix Q from a QL factorization determined by cgeq +lf (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZUNG2L + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZUNG2L( M, N, K, A, LDA, TAU, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZUNG2L generates an m by n complex matrix Q with orthonormal columns, */ +/* > which is defined as the last n columns of a product of k elementary */ +/* > reflectors of order m */ +/* > */ +/* > Q = H(k) . . . H(2) H(1) */ +/* > */ +/* > as returned by ZGEQLF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix Q. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix Q. M >= N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines the */ +/* > matrix Q. N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > On entry, the (n-k+i)-th column must contain the vector which */ +/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ +/* > returned by ZGEQLF in the last k columns of its array */ +/* > argument A. */ +/* > On exit, the m-by-n matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The first dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by ZGEQLF. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument has an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zung2l_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + doublecomplex z__1; + + /* Local variables */ + integer i__, j, l, ii; + extern /* Subroutine */ int zscal_(integer *, doublecomplex *, + doublecomplex *, integer *), zlarf_(char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, + ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < 0 || *n > *m) { + *info = -2; + } else if (*k < 0 || *k > *n) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZUNG2L", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n <= 0) { + return 0; + } + +/* Initialise columns 1:n-k to columns of the unit matrix */ + + i__1 = *n - *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (l = 1; l <= i__2; ++l) { + i__3 = l + j * a_dim1; + a[i__3].r = 0., a[i__3].i = 0.; +/* L10: */ + } + i__2 = *m - *n + j + j * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; +/* L20: */ + } + + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + ii = *n - *k + i__; + +/* Apply H(i) to A(1:m-k+i,1:n-k+i) from the left */ + + i__2 = *m - *n + ii + ii * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; + i__2 = *m - *n + ii; + i__3 = ii - 1; + zlarf_((char *)"Left", &i__2, &i__3, &a[ii * a_dim1 + 1], &c__1, &tau[i__], & + a[a_offset], lda, &work[1], (ftnlen)4); + i__2 = *m - *n + ii - 1; + i__3 = i__; + z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i; + zscal_(&i__2, &z__1, &a[ii * a_dim1 + 1], &c__1); + i__2 = *m - *n + ii + ii * a_dim1; + i__3 = i__; + z__1.r = 1. - tau[i__3].r, z__1.i = 0. - tau[i__3].i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + +/* Set A(m-k+i+1:m,n-k+i) to zero */ + + i__2 = *m; + for (l = *m - *n + ii + 1; l <= i__2; ++l) { + i__3 = l + ii * a_dim1; + a[i__3].r = 0., a[i__3].i = 0.; +/* L30: */ + } +/* L40: */ + } + return 0; + +/* End of ZUNG2L */ + +} /* zung2l_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zung2r.cpp b/lib/linalg/zung2r.cpp new file mode 100644 index 0000000000..4bd9202caa --- /dev/null +++ b/lib/linalg/zung2r.cpp @@ -0,0 +1,264 @@ +/* fortran/zung2r.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b ZUNG2R */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZUNG2R + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZUNG2R( M, N, K, A, LDA, TAU, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZUNG2R generates an m by n complex matrix Q with orthonormal columns, */ +/* > which is defined as the first n columns of a product of k elementary */ +/* > reflectors of order m */ +/* > */ +/* > Q = H(1) H(2) . . . H(k) */ +/* > */ +/* > as returned by ZGEQRF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix Q. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix Q. M >= N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines the */ +/* > matrix Q. N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > On entry, the i-th column must contain the vector which */ +/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ +/* > returned by ZGEQRF in the first k columns of its array */ +/* > argument A. */ +/* > On exit, the m by n matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The first dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by ZGEQRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (N) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument has an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zung2r_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + doublecomplex z__1; + + /* Local variables */ + integer i__, j, l; + extern /* Subroutine */ int zscal_(integer *, doublecomplex *, + doublecomplex *, integer *), zlarf_(char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, + ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < 0 || *n > *m) { + *info = -2; + } else if (*k < 0 || *k > *n) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZUNG2R", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*n <= 0) { + return 0; + } + +/* Initialise columns k+1:n to columns of the unit matrix */ + + i__1 = *n; + for (j = *k + 1; j <= i__1; ++j) { + i__2 = *m; + for (l = 1; l <= i__2; ++l) { + i__3 = l + j * a_dim1; + a[i__3].r = 0., a[i__3].i = 0.; +/* L10: */ + } + i__2 = j + j * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; +/* L20: */ + } + + for (i__ = *k; i__ >= 1; --i__) { + +/* Apply H(i) to A(i:m,i:n) from the left */ + + if (i__ < *n) { + i__1 = i__ + i__ * a_dim1; + a[i__1].r = 1., a[i__1].i = 0.; + i__1 = *m - i__ + 1; + i__2 = *n - i__; + zlarf_((char *)"Left", &i__1, &i__2, &a[i__ + i__ * a_dim1], &c__1, &tau[ + i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], ( + ftnlen)4); + } + if (i__ < *m) { + i__1 = *m - i__; + i__2 = i__; + z__1.r = -tau[i__2].r, z__1.i = -tau[i__2].i; + zscal_(&i__1, &z__1, &a[i__ + 1 + i__ * a_dim1], &c__1); + } + i__1 = i__ + i__ * a_dim1; + i__2 = i__; + z__1.r = 1. - tau[i__2].r, z__1.i = 0. - tau[i__2].i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + +/* Set A(1:i-1,i) to zero */ + + i__1 = i__ - 1; + for (l = 1; l <= i__1; ++l) { + i__2 = l + i__ * a_dim1; + a[i__2].r = 0., a[i__2].i = 0.; +/* L30: */ + } +/* L40: */ + } + return 0; + +/* End of ZUNG2R */ + +} /* zung2r_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zungl2.cpp b/lib/linalg/zungl2.cpp new file mode 100644 index 0000000000..bd40069fd6 --- /dev/null +++ b/lib/linalg/zungl2.cpp @@ -0,0 +1,273 @@ +/* fortran/zungl2.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b ZUNGL2 generates all or part of the unitary matrix Q from an LQ factorization determined by cge +lqf (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZUNGL2 + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZUNGL2( M, N, K, A, LDA, TAU, WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDA, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZUNGL2 generates an m-by-n complex matrix Q with orthonormal rows, */ +/* > which is defined as the first m rows of a product of k elementary */ +/* > reflectors of order n */ +/* > */ +/* > Q = H(k)**H . . . H(2)**H H(1)**H */ +/* > */ +/* > as returned by ZGELQF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix Q. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix Q. N >= M. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines the */ +/* > matrix Q. M >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > On entry, the i-th row must contain the vector which defines */ +/* > the elementary reflector H(i), for i = 1,2,...,k, as returned */ +/* > by ZGELQF in the first k rows of its array argument A. */ +/* > On exit, the m by n matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The first dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by ZGELQF. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (M) */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument has an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zungl2_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3; + doublecomplex z__1, z__2; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, j, l; + extern /* Subroutine */ int zscal_(integer *, doublecomplex *, + doublecomplex *, integer *), zlarf_(char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, + ftnlen), zlacgv_(integer *, doublecomplex *, integer *); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + if (*m < 0) { + *info = -1; + } else if (*n < *m) { + *info = -2; + } else if (*k < 0 || *k > *m) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZUNGL2", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*m <= 0) { + return 0; + } + + if (*k < *m) { + +/* Initialise rows k+1:m to rows of the unit matrix */ + + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (l = *k + 1; l <= i__2; ++l) { + i__3 = l + j * a_dim1; + a[i__3].r = 0., a[i__3].i = 0.; +/* L10: */ + } + if (j > *k && j <= *m) { + i__2 = j + j * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; + } +/* L20: */ + } + } + + for (i__ = *k; i__ >= 1; --i__) { + +/* Apply H(i)**H to A(i:m,i:n) from the right */ + + if (i__ < *n) { + i__1 = *n - i__; + zlacgv_(&i__1, &a[i__ + (i__ + 1) * a_dim1], lda); + if (i__ < *m) { + i__1 = i__ + i__ * a_dim1; + a[i__1].r = 1., a[i__1].i = 0.; + i__1 = *m - i__; + i__2 = *n - i__ + 1; + d_cnjg(&z__1, &tau[i__]); + zlarf_((char *)"Right", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, & + z__1, &a[i__ + 1 + i__ * a_dim1], lda, &work[1], ( + ftnlen)5); + } + i__1 = *n - i__; + i__2 = i__; + z__1.r = -tau[i__2].r, z__1.i = -tau[i__2].i; + zscal_(&i__1, &z__1, &a[i__ + (i__ + 1) * a_dim1], lda); + i__1 = *n - i__; + zlacgv_(&i__1, &a[i__ + (i__ + 1) * a_dim1], lda); + } + i__1 = i__ + i__ * a_dim1; + d_cnjg(&z__2, &tau[i__]); + z__1.r = 1. - z__2.r, z__1.i = 0. - z__2.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; + +/* Set A(i,1:i-1) to zero */ + + i__1 = i__ - 1; + for (l = 1; l <= i__1; ++l) { + i__2 = i__ + l * a_dim1; + a[i__2].r = 0., a[i__2].i = 0.; +/* L30: */ + } +/* L40: */ + } + return 0; + +/* End of ZUNGL2 */ + +} /* zungl2_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zungql.cpp b/lib/linalg/zungql.cpp new file mode 100644 index 0000000000..006c4859eb --- /dev/null +++ b/lib/linalg/zungql.cpp @@ -0,0 +1,381 @@ +/* fortran/zungql.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__3 = 3; +static integer c__2 = 2; + +/* > \brief \b ZUNGQL */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZUNGQL + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZUNGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDA, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZUNGQL generates an M-by-N complex matrix Q with orthonormal columns, */ +/* > which is defined as the last N columns of a product of K elementary */ +/* > reflectors of order M */ +/* > */ +/* > Q = H(k) . . . H(2) H(1) */ +/* > */ +/* > as returned by ZGEQLF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix Q. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix Q. M >= N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines the */ +/* > matrix Q. N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > On entry, the (n-k+i)-th column must contain the vector which */ +/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ +/* > returned by ZGEQLF in the last k columns of its array */ +/* > argument A. */ +/* > On exit, the M-by-N matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The first dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by ZGEQLF. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= max(1,N). */ +/* > For optimum performance LWORK >= N*NB, where NB is the */ +/* > optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument has an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zungql_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *lwork, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; + + /* Local variables */ + integer i__, j, l, ib, nb, kk, nx, iws, nbmin, iinfo; + extern /* Subroutine */ int zung2l_(integer *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, + integer *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + integer ldwork; + extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen); + logical lquery; + integer lwkopt; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + lquery = *lwork == -1; + if (*m < 0) { + *info = -1; + } else if (*n < 0 || *n > *m) { + *info = -2; + } else if (*k < 0 || *k > *n) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } + + if (*info == 0) { + if (*n == 0) { + lwkopt = 1; + } else { + nb = ilaenv_(&c__1, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, ( + ftnlen)1); + lwkopt = *n * nb; + } + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + + if (*lwork < max(1,*n) && ! lquery) { + *info = -8; + } + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZUNGQL", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n <= 0) { + return 0; + } + + nbmin = 2; + nx = 0; + iws = *n; + if (nb > 1 && nb < *k) { + +/* Determine when to cross over from blocked to unblocked code. */ + +/* Computing MAX */ + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *k) { + +/* Determine if workspace is large enough for blocked code. */ + + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { + +/* Not enough workspace to use optimal NB: reduce NB and */ +/* determine the minimum value of NB. */ + + nb = *lwork / ldwork; +/* Computing MAX */ + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, + (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } + } + + if (nb >= nbmin && nb < *k && nx < *k) { + +/* Use blocked code after the first block. */ +/* The last kk columns are handled by the block method. */ + +/* Computing MIN */ + i__1 = *k, i__2 = (*k - nx + nb - 1) / nb * nb; + kk = min(i__1,i__2); + +/* Set A(m-kk+1:m,1:n-kk) to zero. */ + + i__1 = *n - kk; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = *m - kk + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + a[i__3].r = 0., a[i__3].i = 0.; +/* L10: */ + } +/* L20: */ + } + } else { + kk = 0; + } + +/* Use unblocked code for the first or only block. */ + + i__1 = *m - kk; + i__2 = *n - kk; + i__3 = *k - kk; + zung2l_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &iinfo) + ; + + if (kk > 0) { + +/* Use blocked code */ + + i__1 = *k; + i__2 = nb; + for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += + i__2) { +/* Computing MIN */ + i__3 = nb, i__4 = *k - i__ + 1; + ib = min(i__3,i__4); + if (*n - *k + i__ > 1) { + +/* Form the triangular factor of the block reflector */ +/* H = H(i+ib-1) . . . H(i+1) H(i) */ + + i__3 = *m - *k + i__ + ib - 1; + zlarft_((char *)"Backward", (char *)"Columnwise", &i__3, &ib, &a[(*n - *k + + i__) * a_dim1 + 1], lda, &tau[i__], &work[1], &ldwork, + (ftnlen)8, (ftnlen)10); + +/* Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left */ + + i__3 = *m - *k + i__ + ib - 1; + i__4 = *n - *k + i__ - 1; + zlarfb_((char *)"Left", (char *)"No transpose", (char *)"Backward", (char *)"Columnwise", & + i__3, &i__4, &ib, &a[(*n - *k + i__) * a_dim1 + 1], + lda, &work[1], &ldwork, &a[a_offset], lda, &work[ib + + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen)8, ( + ftnlen)10); + } + +/* Apply H to rows 1:m-k+i+ib-1 of current block */ + + i__3 = *m - *k + i__ + ib - 1; + zung2l_(&i__3, &ib, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, & + tau[i__], &work[1], &iinfo); + +/* Set rows m-k+i+ib:m of current block to zero */ + + i__3 = *n - *k + i__ + ib - 1; + for (j = *n - *k + i__; j <= i__3; ++j) { + i__4 = *m; + for (l = *m - *k + i__ + ib; l <= i__4; ++l) { + i__5 = l + j * a_dim1; + a[i__5].r = 0., a[i__5].i = 0.; +/* L30: */ + } +/* L40: */ + } +/* L50: */ + } + } + + work[1].r = (doublereal) iws, work[1].i = 0.; + return 0; + +/* End of ZUNGQL */ + +} /* zungql_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zungqr.cpp b/lib/linalg/zungqr.cpp new file mode 100644 index 0000000000..7ce6a2a40d --- /dev/null +++ b/lib/linalg/zungqr.cpp @@ -0,0 +1,372 @@ +/* fortran/zungqr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__3 = 3; +static integer c__2 = 2; + +/* > \brief \b ZUNGQR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZUNGQR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZUNGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* INTEGER INFO, K, LDA, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZUNGQR generates an M-by-N complex matrix Q with orthonormal columns, */ +/* > which is defined as the first N columns of a product of K elementary */ +/* > reflectors of order M */ +/* > */ +/* > Q = H(1) H(2) . . . H(k) */ +/* > */ +/* > as returned by ZGEQRF. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix Q. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix Q. M >= N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines the */ +/* > matrix Q. N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > On entry, the i-th column must contain the vector which */ +/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ +/* > returned by ZGEQRF in the first k columns of its array */ +/* > argument A. */ +/* > On exit, the M-by-N matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The first dimension of the array A. LDA >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by ZGEQRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= max(1,N). */ +/* > For optimum performance LWORK >= N*NB, where NB is the */ +/* > optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument has an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zungqr_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *lwork, integer *info) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + + /* Local variables */ + integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo; + extern /* Subroutine */ int zung2r_(integer *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, + integer *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + integer ldwork; + extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen); + integer lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + nb = ilaenv_(&c__1, (char *)"ZUNGQR", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + lwkopt = max(1,*n) * nb; + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + lquery = *lwork == -1; + if (*m < 0) { + *info = -1; + } else if (*n < 0 || *n > *m) { + *info = -2; + } else if (*k < 0 || *k > *n) { + *info = -3; + } else if (*lda < max(1,*m)) { + *info = -5; + } else if (*lwork < max(1,*n) && ! lquery) { + *info = -8; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZUNGQR", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n <= 0) { + work[1].r = 1., work[1].i = 0.; + return 0; + } + + nbmin = 2; + nx = 0; + iws = *n; + if (nb > 1 && nb < *k) { + +/* Determine when to cross over from blocked to unblocked code. */ + +/* Computing MAX */ + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"ZUNGQR", (char *)" ", m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *k) { + +/* Determine if workspace is large enough for blocked code. */ + + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { + +/* Not enough workspace to use optimal NB: reduce NB and */ +/* determine the minimum value of NB. */ + + nb = *lwork / ldwork; +/* Computing MAX */ + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNGQR", (char *)" ", m, n, k, &c_n1, + (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } + } + + if (nb >= nbmin && nb < *k && nx < *k) { + +/* Use blocked code after the last block. */ +/* The first kk columns are handled by the block method. */ + + ki = (*k - nx - 1) / nb * nb; +/* Computing MIN */ + i__1 = *k, i__2 = ki + nb; + kk = min(i__1,i__2); + +/* Set A(1:kk,kk+1:n) to zero. */ + + i__1 = *n; + for (j = kk + 1; j <= i__1; ++j) { + i__2 = kk; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + a[i__3].r = 0., a[i__3].i = 0.; +/* L10: */ + } +/* L20: */ + } + } else { + kk = 0; + } + +/* Use unblocked code for the last or only block. */ + + if (kk < *n) { + i__1 = *m - kk; + i__2 = *n - kk; + i__3 = *k - kk; + zung2r_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & + tau[kk + 1], &work[1], &iinfo); + } + + if (kk > 0) { + +/* Use blocked code */ + + i__1 = -nb; + for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { +/* Computing MIN */ + i__2 = nb, i__3 = *k - i__ + 1; + ib = min(i__2,i__3); + if (i__ + ib <= *n) { + +/* Form the triangular factor of the block reflector */ +/* H = H(i) H(i+1) . . . H(i+ib-1) */ + + i__2 = *m - i__ + 1; + zlarft_((char *)"Forward", (char *)"Columnwise", &i__2, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, + (ftnlen)10); + +/* Apply H to A(i:m,i+ib:n) from the left */ + + i__2 = *m - i__ + 1; + i__3 = *n - i__ - ib + 1; + zlarfb_((char *)"Left", (char *)"No transpose", (char *)"Forward", (char *)"Columnwise", & + i__2, &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[ + 1], &ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, & + work[ib + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen) + 7, (ftnlen)10); + } + +/* Apply H to rows i:m of current block */ + + i__2 = *m - i__ + 1; + zung2r_(&i__2, &ib, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & + work[1], &iinfo); + +/* Set rows 1:i-1 of current block to zero */ + + i__2 = i__ + ib - 1; + for (j = i__; j <= i__2; ++j) { + i__3 = i__ - 1; + for (l = 1; l <= i__3; ++l) { + i__4 = l + j * a_dim1; + a[i__4].r = 0., a[i__4].i = 0.; +/* L30: */ + } +/* L40: */ + } +/* L50: */ + } + } + + work[1].r = (doublereal) iws, work[1].i = 0.; + return 0; + +/* End of ZUNGQR */ + +} /* zungqr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zungtr.cpp b/lib/linalg/zungtr.cpp new file mode 100644 index 0000000000..c8f42b6e21 --- /dev/null +++ b/lib/linalg/zungtr.cpp @@ -0,0 +1,342 @@ +/* fortran/zungtr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; + +/* > \brief \b ZUNGTR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZUNGTR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZUNGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER UPLO */ +/* INTEGER INFO, LDA, LWORK, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZUNGTR generates a complex unitary matrix Q which is defined as the */ +/* > product of n-1 elementary reflectors of order N, as returned by */ +/* > ZHETRD: */ +/* > */ +/* > if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), */ +/* > */ +/* > if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A contains elementary reflectors */ +/* > from ZHETRD; */ +/* > = 'L': Lower triangle of A contains elementary reflectors */ +/* > from ZHETRD. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The order of the matrix Q. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,N) */ +/* > On entry, the vectors which define the elementary reflectors, */ +/* > as returned by ZHETRD. */ +/* > On exit, the N-by-N unitary matrix Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. LDA >= N. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (N-1) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by ZHETRD. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. LWORK >= N-1. */ +/* > For optimum performance LWORK >= (N-1)*NB, where NB is */ +/* > the optimal blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zungtr_(char *uplo, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, + integer *info, ftnlen uplo_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, i__1, i__2, i__3, i__4; + + /* Local variables */ + integer i__, j, nb; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo; + logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + integer lwkopt; + logical lquery; + extern /* Subroutine */ int zungql_(integer *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, integer *), zungqr_(integer *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, integer *); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + --work; + + /* Function Body */ + *info = 0; + lquery = *lwork == -1; + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (*n < 0) { + *info = -2; + } else if (*lda < max(1,*n)) { + *info = -4; + } else /* if(complicated condition) */ { +/* Computing MAX */ + i__1 = 1, i__2 = *n - 1; + if (*lwork < max(i__1,i__2) && ! lquery) { + *info = -7; + } + } + + if (*info == 0) { + if (upper) { + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"ZUNGQL", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)1); + } else { + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"ZUNGQR", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)1); + } +/* Computing MAX */ + i__1 = 1, i__2 = *n - 1; + lwkopt = max(i__1,i__2) * nb; + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZUNGTR", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*n == 0) { + work[1].r = 1., work[1].i = 0.; + return 0; + } + + if (upper) { + +/* Q was determined by a call to ZHETRD with UPLO = 'U' */ + +/* Shift the vectors which define the elementary reflectors one */ +/* column to the left, and set the last row and column of Q to */ +/* those of the unit matrix */ + + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + (j + 1) * a_dim1; + a[i__3].r = a[i__4].r, a[i__3].i = a[i__4].i; +/* L10: */ + } + i__2 = *n + j * a_dim1; + a[i__2].r = 0., a[i__2].i = 0.; +/* L20: */ + } + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + *n * a_dim1; + a[i__2].r = 0., a[i__2].i = 0.; +/* L30: */ + } + i__1 = *n + *n * a_dim1; + a[i__1].r = 1., a[i__1].i = 0.; + +/* Generate Q(1:n-1,1:n-1) */ + + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + zungql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], + lwork, &iinfo); + + } else { + +/* Q was determined by a call to ZHETRD with UPLO = 'L'. */ + +/* Shift the vectors which define the elementary reflectors one */ +/* column to the right, and set the first row and column of Q to */ +/* those of the unit matrix */ + + for (j = *n; j >= 2; --j) { + i__1 = j * a_dim1 + 1; + a[i__1].r = 0., a[i__1].i = 0.; + i__1 = *n; + for (i__ = j + 1; i__ <= i__1; ++i__) { + i__2 = i__ + j * a_dim1; + i__3 = i__ + (j - 1) * a_dim1; + a[i__2].r = a[i__3].r, a[i__2].i = a[i__3].i; +/* L40: */ + } +/* L50: */ + } + i__1 = a_dim1 + 1; + a[i__1].r = 1., a[i__1].i = 0.; + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + i__2 = i__ + a_dim1; + a[i__2].r = 0., a[i__2].i = 0.; +/* L60: */ + } + if (*n > 1) { + +/* Generate Q(2:n,2:n) */ + + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + zungqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], + &work[1], lwork, &iinfo); + } + } + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + return 0; + +/* End of ZUNGTR */ + +} /* zungtr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zunm2l.cpp b/lib/linalg/zunm2l.cpp new file mode 100644 index 0000000000..d7fc940517 --- /dev/null +++ b/lib/linalg/zunm2l.cpp @@ -0,0 +1,339 @@ +/* fortran/zunm2l.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b ZUNM2L multiplies a general matrix by the unitary matrix from a QL factorization determined by +cgeqlf (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZUNM2L + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZUNM2L( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ +/* WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS */ +/* INTEGER INFO, K, LDA, LDC, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZUNM2L overwrites the general complex m-by-n matrix C with */ +/* > */ +/* > Q * C if SIDE = 'L' and TRANS = 'N', or */ +/* > */ +/* > Q**H* C if SIDE = 'L' and TRANS = 'C', or */ +/* > */ +/* > C * Q if SIDE = 'R' and TRANS = 'N', or */ +/* > */ +/* > C * Q**H if SIDE = 'R' and TRANS = 'C', */ +/* > */ +/* > where Q is a complex unitary matrix defined as the product of k */ +/* > elementary reflectors */ +/* > */ +/* > Q = H(k) . . . H(2) H(1) */ +/* > */ +/* > as returned by ZGEQLF. Q is of order m if SIDE = 'L' and of order n */ +/* > if SIDE = 'R'. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q or Q**H from the Left */ +/* > = 'R': apply Q or Q**H from the Right */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': apply Q (No transpose) */ +/* > = 'C': apply Q**H (Conjugate transpose) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines */ +/* > the matrix Q. */ +/* > If SIDE = 'L', M >= K >= 0; */ +/* > if SIDE = 'R', N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,K) */ +/* > The i-th column must contain the vector which defines the */ +/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ +/* > ZGEQLF in the last k columns of its array argument A. */ +/* > A is modified by the routine but restored on exit. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > If SIDE = 'L', LDA >= max(1,M); */ +/* > if SIDE = 'R', LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by ZGEQLF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is COMPLEX*16 array, dimension (LDC,N) */ +/* > On entry, the m-by-n matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension */ +/* > (N) if SIDE = 'L', */ +/* > (M) if SIDE = 'R' */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zunm2l_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info, + ftnlen side_len, ftnlen trans_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; + doublecomplex z__1; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, i1, i2, i3, mi, ni, nq; + doublecomplex aii; + logical left; + doublecomplex taui; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarf_(char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, + ftnlen); + logical notran; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + +/* NQ is the order of Q */ + + if (left) { + nq = *m; + } else { + nq = *n; + } + if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! notran && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*m < 0) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*k < 0 || *k > nq) { + *info = -5; + } else if (*lda < max(1,nq)) { + *info = -7; + } else if (*ldc < max(1,*m)) { + *info = -10; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZUNM2L", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0 || *k == 0) { + return 0; + } + + if (left && notran || ! left && ! notran) { + i1 = 1; + i2 = *k; + i3 = 1; + } else { + i1 = *k; + i2 = 1; + i3 = -1; + } + + if (left) { + ni = *n; + } else { + mi = *m; + } + + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + if (left) { + +/* H(i) or H(i)**H is applied to C(1:m-k+i,1:n) */ + + mi = *m - *k + i__; + } else { + +/* H(i) or H(i)**H is applied to C(1:m,1:n-k+i) */ + + ni = *n - *k + i__; + } + +/* Apply H(i) or H(i)**H */ + + if (notran) { + i__3 = i__; + taui.r = tau[i__3].r, taui.i = tau[i__3].i; + } else { + d_cnjg(&z__1, &tau[i__]); + taui.r = z__1.r, taui.i = z__1.i; + } + i__3 = nq - *k + i__ + i__ * a_dim1; + aii.r = a[i__3].r, aii.i = a[i__3].i; + i__3 = nq - *k + i__ + i__ * a_dim1; + a[i__3].r = 1., a[i__3].i = 0.; + zlarf_(side, &mi, &ni, &a[i__ * a_dim1 + 1], &c__1, &taui, &c__[ + c_offset], ldc, &work[1], (ftnlen)1); + i__3 = nq - *k + i__ + i__ * a_dim1; + a[i__3].r = aii.r, a[i__3].i = aii.i; +/* L10: */ + } + return 0; + +/* End of ZUNM2L */ + +} /* zunm2l_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zunm2r.cpp b/lib/linalg/zunm2r.cpp new file mode 100644 index 0000000000..56ad0d944a --- /dev/null +++ b/lib/linalg/zunm2r.cpp @@ -0,0 +1,343 @@ +/* fortran/zunm2r.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; + +/* > \brief \b ZUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by +cgeqrf (unblocked algorithm). */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZUNM2R + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZUNM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ +/* WORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS */ +/* INTEGER INFO, K, LDA, LDC, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZUNM2R overwrites the general complex m-by-n matrix C with */ +/* > */ +/* > Q * C if SIDE = 'L' and TRANS = 'N', or */ +/* > */ +/* > Q**H* C if SIDE = 'L' and TRANS = 'C', or */ +/* > */ +/* > C * Q if SIDE = 'R' and TRANS = 'N', or */ +/* > */ +/* > C * Q**H if SIDE = 'R' and TRANS = 'C', */ +/* > */ +/* > where Q is a complex unitary matrix defined as the product of k */ +/* > elementary reflectors */ +/* > */ +/* > Q = H(1) H(2) . . . H(k) */ +/* > */ +/* > as returned by ZGEQRF. Q is of order m if SIDE = 'L' and of order n */ +/* > if SIDE = 'R'. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q or Q**H from the Left */ +/* > = 'R': apply Q or Q**H from the Right */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': apply Q (No transpose) */ +/* > = 'C': apply Q**H (Conjugate transpose) */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines */ +/* > the matrix Q. */ +/* > If SIDE = 'L', M >= K >= 0; */ +/* > if SIDE = 'R', N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,K) */ +/* > The i-th column must contain the vector which defines the */ +/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ +/* > ZGEQRF in the first k columns of its array argument A. */ +/* > A is modified by the routine but restored on exit. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > If SIDE = 'L', LDA >= max(1,M); */ +/* > if SIDE = 'R', LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by ZGEQRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is COMPLEX*16 array, dimension (LDC,N) */ +/* > On entry, the m-by-n matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension */ +/* > (N) if SIDE = 'L', */ +/* > (M) if SIDE = 'R' */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zunm2r_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info, + ftnlen side_len, ftnlen trans_len) +{ + /* System generated locals */ + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; + doublecomplex z__1; + + /* Builtin functions */ + void d_cnjg(doublecomplex *, doublecomplex *); + + /* Local variables */ + integer i__, i1, i2, i3, ic, jc, mi, ni, nq; + doublecomplex aii; + logical left; + doublecomplex taui; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarf_(char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, + ftnlen); + logical notran; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + +/* NQ is the order of Q */ + + if (left) { + nq = *m; + } else { + nq = *n; + } + if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! notran && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*m < 0) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*k < 0 || *k > nq) { + *info = -5; + } else if (*lda < max(1,nq)) { + *info = -7; + } else if (*ldc < max(1,*m)) { + *info = -10; + } + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZUNM2R", &i__1, (ftnlen)6); + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0 || *k == 0) { + return 0; + } + + if (left && ! notran || ! left && notran) { + i1 = 1; + i2 = *k; + i3 = 1; + } else { + i1 = *k; + i2 = 1; + i3 = -1; + } + + if (left) { + ni = *n; + jc = 1; + } else { + mi = *m; + ic = 1; + } + + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + if (left) { + +/* H(i) or H(i)**H is applied to C(i:m,1:n) */ + + mi = *m - i__ + 1; + ic = i__; + } else { + +/* H(i) or H(i)**H is applied to C(1:m,i:n) */ + + ni = *n - i__ + 1; + jc = i__; + } + +/* Apply H(i) or H(i)**H */ + + if (notran) { + i__3 = i__; + taui.r = tau[i__3].r, taui.i = tau[i__3].i; + } else { + d_cnjg(&z__1, &tau[i__]); + taui.r = z__1.r, taui.i = z__1.i; + } + i__3 = i__ + i__ * a_dim1; + aii.r = a[i__3].r, aii.i = a[i__3].i; + i__3 = i__ + i__ * a_dim1; + a[i__3].r = 1., a[i__3].i = 0.; + zlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &taui, &c__[ic + + jc * c_dim1], ldc, &work[1], (ftnlen)1); + i__3 = i__ + i__ * a_dim1; + a[i__3].r = aii.r, a[i__3].i = aii.i; +/* L10: */ + } + return 0; + +/* End of ZUNM2R */ + +} /* zunm2r_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zunmql.cpp b/lib/linalg/zunmql.cpp new file mode 100644 index 0000000000..c7e6134831 --- /dev/null +++ b/lib/linalg/zunmql.cpp @@ -0,0 +1,419 @@ +/* fortran/zunmql.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +static integer c__65 = 65; + +/* > \brief \b ZUNMQL */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZUNMQL + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZUNMQL( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ +/* WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS */ +/* INTEGER INFO, K, LDA, LDC, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZUNMQL overwrites the general complex M-by-N matrix C with */ +/* > */ +/* > SIDE = 'L' SIDE = 'R' */ +/* > TRANS = 'N': Q * C C * Q */ +/* > TRANS = 'C': Q**H * C C * Q**H */ +/* > */ +/* > where Q is a complex unitary matrix defined as the product of k */ +/* > elementary reflectors */ +/* > */ +/* > Q = H(k) . . . H(2) H(1) */ +/* > */ +/* > as returned by ZGEQLF. Q is of order M if SIDE = 'L' and of order N */ +/* > if SIDE = 'R'. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q or Q**H from the Left; */ +/* > = 'R': apply Q or Q**H from the Right. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': No transpose, apply Q; */ +/* > = 'C': Conjugate transpose, apply Q**H. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines */ +/* > the matrix Q. */ +/* > If SIDE = 'L', M >= K >= 0; */ +/* > if SIDE = 'R', N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,K) */ +/* > The i-th column must contain the vector which defines the */ +/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ +/* > ZGEQLF in the last k columns of its array argument A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > If SIDE = 'L', LDA >= max(1,M); */ +/* > if SIDE = 'R', LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by ZGEQLF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is COMPLEX*16 array, dimension (LDC,N) */ +/* > On entry, the M-by-N matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > If SIDE = 'L', LWORK >= max(1,N); */ +/* > if SIDE = 'R', LWORK >= max(1,M). */ +/* > For good performance, LWORK should generally be larger. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zunmql_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, + integer *info, ftnlen side_len, ftnlen trans_len) +{ + /* System generated locals */ + address a__1[2]; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, + i__5; + char ch__1[2]; + + /* Builtin functions */ + /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + + /* Local variables */ + integer i__, i1, i2, i3, ib, nb, mi, ni, nq, nw, iwt; + logical left; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nbmin, iinfo; + extern /* Subroutine */ int zunm2l_(char *, char *, integer *, integer *, + integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, + integer *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + logical notran; + integer ldwork; + extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen); + integer lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + +/* NQ is the order of Q and NW is the minimum dimension of WORK */ + + if (left) { + nq = *m; + nw = max(1,*n); + } else { + nq = *n; + nw = max(1,*m); + } + if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! notran && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*m < 0) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*k < 0 || *k > nq) { + *info = -5; + } else if (*lda < max(1,nq)) { + *info = -7; + } else if (*ldc < max(1,*m)) { + *info = -10; + } else if (*lwork < nw && ! lquery) { + *info = -12; + } + + if (*info == 0) { + +/* Compute the workspace requirements */ + + if (*m == 0 || *n == 0) { + lwkopt = 1; + } else { +/* Computing MIN */ +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, m, n, k, &c_n1, + (ftnlen)6, (ftnlen)2); + nb = min(i__1,i__2); + lwkopt = nw * nb + 4160; + } + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZUNMQL", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0) { + return 0; + } + + nbmin = 2; + ldwork = nw; + if (nb > 1 && nb < *k) { + if (*lwork < lwkopt) { + nb = (*lwork - 4160) / ldwork; +/* Computing MAX */ +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNMQL", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nbmin = max(i__1,i__2); + } + } + + if (nb < nbmin || nb >= *k) { + +/* Use unblocked code */ + + zunm2l_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + } else { + +/* Use blocked code */ + + iwt = nw * nb + 1; + if (left && notran || ! left && ! notran) { + i1 = 1; + i2 = *k; + i3 = nb; + } else { + i1 = (*k - 1) / nb * nb + 1; + i2 = 1; + i3 = -nb; + } + + if (left) { + ni = *n; + } else { + mi = *m; + } + + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { +/* Computing MIN */ + i__4 = nb, i__5 = *k - i__ + 1; + ib = min(i__4,i__5); + +/* Form the triangular factor of the block reflector */ +/* H = H(i+ib-1) . . . H(i+1) H(i) */ + + i__4 = nq - *k + i__ + ib - 1; + zlarft_((char *)"Backward", (char *)"Columnwise", &i__4, &ib, &a[i__ * a_dim1 + 1] + , lda, &tau[i__], &work[iwt], &c__65, (ftnlen)8, (ftnlen) + 10); + if (left) { + +/* H or H**H is applied to C(1:m-k+i+ib-1,1:n) */ + + mi = *m - *k + i__ + ib - 1; + } else { + +/* H or H**H is applied to C(1:m,1:n-k+i+ib-1) */ + + ni = *n - *k + i__ + ib - 1; + } + +/* Apply H or H**H */ + + zlarfb_(side, trans, (char *)"Backward", (char *)"Columnwise", &mi, &ni, &ib, &a[ + i__ * a_dim1 + 1], lda, &work[iwt], &c__65, &c__[c_offset] + , ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen)1, (ftnlen)8, + (ftnlen)10); +/* L10: */ + } + } + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + return 0; + +/* End of ZUNMQL */ + +} /* zunmql_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zunmqr.cpp b/lib/linalg/zunmqr.cpp new file mode 100644 index 0000000000..dc127fe1aa --- /dev/null +++ b/lib/linalg/zunmqr.cpp @@ -0,0 +1,420 @@ +/* fortran/zunmqr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; +static integer c__65 = 65; + +/* > \brief \b ZUNMQR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZUNMQR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZUNMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ +/* WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS */ +/* INTEGER INFO, K, LDA, LDC, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZUNMQR overwrites the general complex M-by-N matrix C with */ +/* > */ +/* > SIDE = 'L' SIDE = 'R' */ +/* > TRANS = 'N': Q * C C * Q */ +/* > TRANS = 'C': Q**H * C C * Q**H */ +/* > */ +/* > where Q is a complex unitary matrix defined as the product of k */ +/* > elementary reflectors */ +/* > */ +/* > Q = H(1) H(2) . . . H(k) */ +/* > */ +/* > as returned by ZGEQRF. Q is of order M if SIDE = 'L' and of order N */ +/* > if SIDE = 'R'. */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q or Q**H from the Left; */ +/* > = 'R': apply Q or Q**H from the Right. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': No transpose, apply Q; */ +/* > = 'C': Conjugate transpose, apply Q**H. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] K */ +/* > \verbatim */ +/* > K is INTEGER */ +/* > The number of elementary reflectors whose product defines */ +/* > the matrix Q. */ +/* > If SIDE = 'L', M >= K >= 0; */ +/* > if SIDE = 'R', N >= K >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension (LDA,K) */ +/* > The i-th column must contain the vector which defines the */ +/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ +/* > ZGEQRF in the first k columns of its array argument A. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > If SIDE = 'L', LDA >= max(1,M); */ +/* > if SIDE = 'R', LDA >= max(1,N). */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension (K) */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by ZGEQRF. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is COMPLEX*16 array, dimension (LDC,N) */ +/* > On entry, the M-by-N matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > If SIDE = 'L', LWORK >= max(1,N); */ +/* > if SIDE = 'R', LWORK >= max(1,M). */ +/* > For good performance, LWORK should generally be larger. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zunmqr_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, + integer *info, ftnlen side_len, ftnlen trans_len) +{ + /* System generated locals */ + address a__1[2]; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, + i__5; + char ch__1[2]; + + /* Builtin functions */ + /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + + /* Local variables */ + integer i__, i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iwt; + logical left; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer nbmin, iinfo; + extern /* Subroutine */ int zunm2r_(char *, char *, integer *, integer *, + integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, + integer *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + logical notran; + integer ldwork; + extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen); + integer lwkopt; + logical lquery; + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Parameters .. */ +/* .. */ +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + +/* NQ is the order of Q and NW is the minimum dimension of WORK */ + + if (left) { + nq = *m; + nw = max(1,*n); + } else { + nq = *n; + nw = max(1,*m); + } + if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! notran && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (*m < 0) { + *info = -3; + } else if (*n < 0) { + *info = -4; + } else if (*k < 0 || *k > nq) { + *info = -5; + } else if (*lda < max(1,nq)) { + *info = -7; + } else if (*ldc < max(1,*m)) { + *info = -10; + } else if (*lwork < nw && ! lquery) { + *info = -12; + } + + if (*info == 0) { + +/* Compute the workspace requirements */ + +/* Computing MIN */ +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nb = min(i__1,i__2); + lwkopt = nw * nb + 4160; + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + } + + if (*info != 0) { + i__1 = -(*info); + xerbla_((char *)"ZUNMQR", &i__1, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0 || *k == 0) { + work[1].r = 1., work[1].i = 0.; + return 0; + } + + nbmin = 2; + ldwork = nw; + if (nb > 1 && nb < *k) { + if (*lwork < lwkopt) { + nb = (*lwork - 4160) / ldwork; +/* Computing MAX */ +/* Writing concatenation */ + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNMQR", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nbmin = max(i__1,i__2); + } + } + + if (nb < nbmin || nb >= *k) { + +/* Use unblocked code */ + + zunm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + } else { + +/* Use blocked code */ + + iwt = nw * nb + 1; + if (left && ! notran || ! left && notran) { + i1 = 1; + i2 = *k; + i3 = nb; + } else { + i1 = (*k - 1) / nb * nb + 1; + i2 = 1; + i3 = -nb; + } + + if (left) { + ni = *n; + jc = 1; + } else { + mi = *m; + ic = 1; + } + + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { +/* Computing MIN */ + i__4 = nb, i__5 = *k - i__ + 1; + ib = min(i__4,i__5); + +/* Form the triangular factor of the block reflector */ +/* H = H(i) H(i+1) . . . H(i+ib-1) */ + + i__4 = nq - i__ + 1; + zlarft_((char *)"Forward", (char *)"Columnwise", &i__4, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[iwt], &c__65, (ftnlen)7, ( + ftnlen)10); + if (left) { + +/* H or H**H is applied to C(i:m,1:n) */ + + mi = *m - i__ + 1; + ic = i__; + } else { + +/* H or H**H is applied to C(1:m,i:n) */ + + ni = *n - i__ + 1; + jc = i__; + } + +/* Apply H or H**H */ + + zlarfb_(side, trans, (char *)"Forward", (char *)"Columnwise", &mi, &ni, &ib, &a[ + i__ + i__ * a_dim1], lda, &work[iwt], &c__65, &c__[ic + + jc * c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen) + 1, (ftnlen)7, (ftnlen)10); +/* L10: */ + } + } + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + return 0; + +/* End of ZUNMQR */ + +} /* zunmqr_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/zunmtr.cpp b/lib/linalg/zunmtr.cpp new file mode 100644 index 0000000000..ab5e7eacb8 --- /dev/null +++ b/lib/linalg/zunmtr.cpp @@ -0,0 +1,397 @@ +/* fortran/zunmtr.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* Table of constant values */ + +static integer c__1 = 1; +static integer c_n1 = -1; +static integer c__2 = 2; + +/* > \brief \b ZUNMTR */ + +/* =========== DOCUMENTATION =========== */ + +/* Online html documentation available at */ +/* http://www.netlib.org/lapack/explore-html/ */ + +/* > \htmlonly */ +/* > Download ZUNMTR + dependencies */ +/* > */ +/* > [TGZ] */ +/* > */ +/* > [ZIP] */ +/* > */ +/* > [TXT] */ +/* > \endhtmlonly */ + +/* Definition: */ +/* =========== */ + +/* SUBROUTINE ZUNMTR( SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, */ +/* WORK, LWORK, INFO ) */ + +/* .. Scalar Arguments .. */ +/* CHARACTER SIDE, TRANS, UPLO */ +/* INTEGER INFO, LDA, LDC, LWORK, M, N */ +/* .. */ +/* .. Array Arguments .. */ +/* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ +/* .. */ + + +/* > \par Purpose: */ +/* ============= */ +/* > */ +/* > \verbatim */ +/* > */ +/* > ZUNMTR overwrites the general complex M-by-N matrix C with */ +/* > */ +/* > SIDE = 'L' SIDE = 'R' */ +/* > TRANS = 'N': Q * C C * Q */ +/* > TRANS = 'C': Q**H * C C * Q**H */ +/* > */ +/* > where Q is a complex unitary matrix of order nq, with nq = m if */ +/* > SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of */ +/* > nq-1 elementary reflectors, as returned by ZHETRD: */ +/* > */ +/* > if UPLO = 'U', Q = H(nq-1) . . . H(2) H(1); */ +/* > */ +/* > if UPLO = 'L', Q = H(1) H(2) . . . H(nq-1). */ +/* > \endverbatim */ + +/* Arguments: */ +/* ========== */ + +/* > \param[in] SIDE */ +/* > \verbatim */ +/* > SIDE is CHARACTER*1 */ +/* > = 'L': apply Q or Q**H from the Left; */ +/* > = 'R': apply Q or Q**H from the Right. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] UPLO */ +/* > \verbatim */ +/* > UPLO is CHARACTER*1 */ +/* > = 'U': Upper triangle of A contains elementary reflectors */ +/* > from ZHETRD; */ +/* > = 'L': Lower triangle of A contains elementary reflectors */ +/* > from ZHETRD. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TRANS */ +/* > \verbatim */ +/* > TRANS is CHARACTER*1 */ +/* > = 'N': No transpose, apply Q; */ +/* > = 'C': Conjugate transpose, apply Q**H. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] M */ +/* > \verbatim */ +/* > M is INTEGER */ +/* > The number of rows of the matrix C. M >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] N */ +/* > \verbatim */ +/* > N is INTEGER */ +/* > The number of columns of the matrix C. N >= 0. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is COMPLEX*16 array, dimension */ +/* > (LDA,M) if SIDE = 'L' */ +/* > (LDA,N) if SIDE = 'R' */ +/* > The vectors which define the elementary reflectors, as */ +/* > returned by ZHETRD. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDA */ +/* > \verbatim */ +/* > LDA is INTEGER */ +/* > The leading dimension of the array A. */ +/* > LDA >= max(1,M) if SIDE = 'L'; LDA >= max(1,N) if SIDE = 'R'. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] TAU */ +/* > \verbatim */ +/* > TAU is COMPLEX*16 array, dimension */ +/* > (M-1) if SIDE = 'L' */ +/* > (N-1) if SIDE = 'R' */ +/* > TAU(i) must contain the scalar factor of the elementary */ +/* > reflector H(i), as returned by ZHETRD. */ +/* > \endverbatim */ +/* > */ +/* > \param[in,out] C */ +/* > \verbatim */ +/* > C is COMPLEX*16 array, dimension (LDC,N) */ +/* > On entry, the M-by-N matrix C. */ +/* > On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LDC */ +/* > \verbatim */ +/* > LDC is INTEGER */ +/* > The leading dimension of the array C. LDC >= max(1,M). */ +/* > \endverbatim */ +/* > */ +/* > \param[out] WORK */ +/* > \verbatim */ +/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ +/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ +/* > \endverbatim */ +/* > */ +/* > \param[in] LWORK */ +/* > \verbatim */ +/* > LWORK is INTEGER */ +/* > The dimension of the array WORK. */ +/* > If SIDE = 'L', LWORK >= max(1,N); */ +/* > if SIDE = 'R', LWORK >= max(1,M). */ +/* > For optimum performance LWORK >= N*NB if SIDE = 'L', and */ +/* > LWORK >=M*NB if SIDE = 'R', where NB is the optimal */ +/* > blocksize. */ +/* > */ +/* > If LWORK = -1, then a workspace query is assumed; the routine */ +/* > only calculates the optimal size of the WORK array, returns */ +/* > this value as the first entry of the WORK array, and no error */ +/* > message related to LWORK is issued by XERBLA. */ +/* > \endverbatim */ +/* > */ +/* > \param[out] INFO */ +/* > \verbatim */ +/* > INFO is INTEGER */ +/* > = 0: successful exit */ +/* > < 0: if INFO = -i, the i-th argument had an illegal value */ +/* > \endverbatim */ + +/* Authors: */ +/* ======== */ + +/* > \author Univ. of Tennessee */ +/* > \author Univ. of California Berkeley */ +/* > \author Univ. of Colorado Denver */ +/* > \author NAG Ltd. */ + +/* > \ingroup complex16OTHERcomputational */ + +/* ===================================================================== */ +/* Subroutine */ int zunmtr_(char *side, char *uplo, char *trans, integer *m, + integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, + integer *info, ftnlen side_len, ftnlen uplo_len, ftnlen trans_len) +{ + /* System generated locals */ + address a__1[2]; + integer a_dim1, a_offset, c_dim1, c_offset, i__1[2], i__2, i__3; + char ch__1[2]; + + /* Builtin functions */ + /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + + /* Local variables */ + integer i1, i2, nb, mi, ni, nq, nw; + logical left; + extern logical lsame_(char *, char *, ftnlen, ftnlen); + integer iinfo; + logical upper; + extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + integer lwkopt; + logical lquery; + extern /* Subroutine */ int zunmql_(char *, char *, integer *, integer *, + integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, integer *, + ftnlen, ftnlen), zunmqr_(char *, char *, integer *, integer *, + integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, integer *, + ftnlen, ftnlen); + + +/* -- LAPACK computational routine -- */ +/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ +/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* .. Array Arguments .. */ +/* .. */ + +/* ===================================================================== */ + +/* .. Local Scalars .. */ +/* .. */ +/* .. External Functions .. */ +/* .. */ +/* .. External Subroutines .. */ +/* .. */ +/* .. Intrinsic Functions .. */ +/* .. */ +/* .. Executable Statements .. */ + +/* Test the input arguments */ + + /* Parameter adjustments */ + a_dim1 = *lda; + a_offset = 1 + a_dim1; + a -= a_offset; + --tau; + c_dim1 = *ldc; + c_offset = 1 + c_dim1; + c__ -= c_offset; + --work; + + /* Function Body */ + *info = 0; + left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); + upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); + lquery = *lwork == -1; + +/* NQ is the order of Q and NW is the minimum dimension of WORK */ + + if (left) { + nq = *m; + nw = max(1,*n); + } else { + nq = *n; + nw = max(1,*m); + } + if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + *info = -1; + } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + *info = -2; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"C", (ftnlen)1, (ftnlen)1)) { + *info = -3; + } else if (*m < 0) { + *info = -4; + } else if (*n < 0) { + *info = -5; + } else if (*lda < max(1,nq)) { + *info = -7; + } else if (*ldc < max(1,*m)) { + *info = -10; + } else if (*lwork < nw && ! lquery) { + *info = -12; + } + + if (*info == 0) { + if (upper) { + if (left) { +/* Writing concatenation */ + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *m - 1; + i__3 = *m - 1; + nb = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, &i__2, n, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } else { +/* Writing concatenation */ + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, m, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } + } else { + if (left) { +/* Writing concatenation */ + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *m - 1; + i__3 = *m - 1; + nb = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, &i__2, n, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } else { +/* Writing concatenation */ + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, m, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } + } + lwkopt = nw * nb; + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + } + + if (*info != 0) { + i__2 = -(*info); + xerbla_((char *)"ZUNMTR", &i__2, (ftnlen)6); + return 0; + } else if (lquery) { + return 0; + } + +/* Quick return if possible */ + + if (*m == 0 || *n == 0 || nq == 1) { + work[1].r = 1., work[1].i = 0.; + return 0; + } + + if (left) { + mi = *m - 1; + ni = *n; + } else { + mi = *m; + ni = *n - 1; + } + + if (upper) { + +/* Q was determined by a call to ZHETRD with UPLO = 'U' */ + + i__2 = nq - 1; + zunmql_(side, trans, &mi, &ni, &i__2, &a[(a_dim1 << 1) + 1], lda, & + tau[1], &c__[c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen) + 1, (ftnlen)1); + } else { + +/* Q was determined by a call to ZHETRD with UPLO = 'L' */ + + if (left) { + i1 = 2; + i2 = 1; + } else { + i1 = 1; + i2 = 2; + } + i__2 = nq - 1; + zunmqr_(side, trans, &mi, &ni, &i__2, &a[a_dim1 + 2], lda, &tau[1], & + c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, (ftnlen) + 1, (ftnlen)1); + } + work[1].r = (doublereal) lwkopt, work[1].i = 0.; + return 0; + +/* End of ZUNMTR */ + +} /* zunmtr_ */ + +#ifdef __cplusplus + } +#endif From b0e8ec47da492c031a61c8024bc4496e3a60ff3c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 13:45:13 -0500 Subject: [PATCH 24/47] update manual for linalg being C++ now. --- doc/src/Build_extras.rst | 42 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/doc/src/Build_extras.rst b/doc/src/Build_extras.rst index 910dccbb8a..8f400519f1 100644 --- a/doc/src/Build_extras.rst +++ b/doc/src/Build_extras.rst @@ -858,11 +858,11 @@ library. .. code-block:: bash - $ make lib-latte # print help message - $ make lib-latte args="-b" # download and build in lib/latte/LATTE-master - $ make lib-latte args="-p $HOME/latte" # use existing LATTE installation in $HOME/latte - $ make lib-latte args="-b -m gfortran" # download and build in lib/latte and - # copy Makefile.lammps.gfortran to Makefile.lammps + $ make lib-latte # print help message + $ make lib-latte args="-b" # download and build in lib/latte/LATTE-master + $ make lib-latte args="-p $HOME/latte" # use existing LATTE installation in $HOME/latte + $ make lib-latte args="-b -m gfortran" # download and build in lib/latte and + # copy Makefile.lammps.gfortran to Makefile.lammps Note that 3 symbolic (soft) links, ``includelink`` and ``liblink`` and ``filelink.o``, are created in ``lib/latte`` to point to @@ -1208,10 +1208,10 @@ The ATC package requires the MANYBODY package also be installed. .. code-block:: bash - $ make lib-linalg # print help message - $ make lib-linalg args="-m serial" # build with GNU Fortran compiler (settings as with "make serial") - $ make lib-linalg args="-m mpi" # build with default MPI Fortran compiler (settings as with "make mpi") - $ make lib-linalg args="-m gfortran" # build with GNU Fortran compiler + $ make lib-linalg # print help message + $ make lib-linalg args="-m serial" # build with GNU C++ compiler (settings as with "make serial") + $ make lib-linalg args="-m mpi" # build with default MPI C++ compiler (settings as with "make mpi") + $ make lib-linalg args="-m g++" # build with GNU C++ compiler ---------- @@ -1259,10 +1259,10 @@ AWPMD package .. code-block:: bash - $ make lib-linalg # print help message - $ make lib-linalg args="-m serial" # build with GNU Fortran compiler (settings as with "make serial") - $ make lib-linalg args="-m mpi" # build with default MPI Fortran compiler (settings as with "make mpi") - $ make lib-linalg args="-m gfortran" # build with GNU Fortran compiler + $ make lib-linalg # print help message + $ make lib-linalg args="-m serial" # build with GNU C++ compiler (settings as with "make serial") + $ make lib-linalg args="-m mpi" # build with default MPI C++ compiler (settings as with "make mpi") + $ make lib-linalg args="-m g++" # build with GNU C++ compiler ---------- @@ -1363,10 +1363,10 @@ This package depends on the KSPACE package. .. code-block:: bash - $ make lib-linalg # print help message - $ make lib-linalg args="-m serial" # build with GNU Fortran compiler (settings as with "make serial") - $ make lib-linalg args="-m mpi" # build with default MPI Fortran compiler (settings as with "make mpi") - $ make lib-linalg args="-m gfortran" # build with GNU Fortran compiler + $ make lib-linalg # print help message + $ make lib-linalg args="-m serial" # build with GNU C++ compiler (settings as with "make serial") + $ make lib-linalg args="-m mpi" # build with default MPI C++ compiler (settings as with "make mpi") + $ make lib-linalg args="-m g++" # build with GNU C++ compiler The package itself is activated with ``make yes-KSPACE`` and ``make yes-ELECTRODE`` @@ -1447,10 +1447,10 @@ ML-POD package .. code-block:: bash - $ make lib-linalg # print help message - $ make lib-linalg args="-m serial" # build with GNU Fortran compiler (settings as with "make serial") - $ make lib-linalg args="-m mpi" # build with default MPI Fortran compiler (settings as with "make mpi") - $ make lib-linalg args="-m gfortran" # build with GNU Fortran compiler + $ make lib-linalg # print help message + $ make lib-linalg args="-m serial" # build with GNU C++ compiler (settings as with "make serial") + $ make lib-linalg args="-m mpi" # build with default MPI C++ compiler (settings as with "make mpi") + $ make lib-linalg args="-m g++" # build with GNU C++ compiler The package itself is activated with ``make yes-ML-POD``. From 52fb2e8156da0583d83cfc0e896bb361b11a51bb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 13:45:40 -0500 Subject: [PATCH 25/47] don't need to link to Fortran runtime with linalg anymore --- lib/atc/Makefile.lammps.linalg | 2 +- lib/awpmd/Makefile.lammps.linalg | 2 +- lib/electrode/Makefile.lammps.linalg | 2 +- lib/mlpod/Makefile.lammps.linalg | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/atc/Makefile.lammps.linalg b/lib/atc/Makefile.lammps.linalg index 930ee6357b..ddbab36648 100644 --- a/lib/atc/Makefile.lammps.linalg +++ b/lib/atc/Makefile.lammps.linalg @@ -1,6 +1,6 @@ # Settings that the LAMMPS build will import when this package library is used atc_SYSINC = -atc_SYSLIB = -llinalg -lgfortran +atc_SYSLIB = -llinalg atc_SYSPATH = -L../../lib/linalg$(LIBOBJDIR) diff --git a/lib/awpmd/Makefile.lammps.linalg b/lib/awpmd/Makefile.lammps.linalg index 1d986da5d7..ce10c3ffa0 100644 --- a/lib/awpmd/Makefile.lammps.linalg +++ b/lib/awpmd/Makefile.lammps.linalg @@ -1,5 +1,5 @@ # Settings that the LAMMPS build will import when this package library is used awpmd_SYSINC = -awpmd_SYSLIB = -llinalg -lgfortran +awpmd_SYSLIB = -llinalg awpmd_SYSPATH = -L../../lib/linalg$(LIBOBJDIR) diff --git a/lib/electrode/Makefile.lammps.linalg b/lib/electrode/Makefile.lammps.linalg index e82066110e..0e03dd9bd7 100644 --- a/lib/electrode/Makefile.lammps.linalg +++ b/lib/electrode/Makefile.lammps.linalg @@ -1,5 +1,5 @@ # Settings that the LAMMPS build will import when this package library is used electrode_SYSINC = -electrode_SYSLIB = -llinalg -lgfortran +electrode_SYSLIB = -llinalg electrode_SYSPATH = -L../../lib/linalg$(LIBOBJDIR) diff --git a/lib/mlpod/Makefile.lammps.linalg b/lib/mlpod/Makefile.lammps.linalg index cb4d78df99..f37381464d 100644 --- a/lib/mlpod/Makefile.lammps.linalg +++ b/lib/mlpod/Makefile.lammps.linalg @@ -1,5 +1,5 @@ # Settings that the LAMMPS build will import when this package library is used mlpod_SYSINC = -mlpod_SYSLIB = -llinalg -lgfortran +mlpod_SYSLIB = -llinalg mlpod_SYSPATH = -L../../lib/linalg$(LIBOBJDIR) From 119fae3b8cc03989f2f15b332545359d07012244 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 13:45:58 -0500 Subject: [PATCH 26/47] remove unused code --- lib/linalg/Makefile.g++ | 5 ----- lib/linalg/Makefile.mpi | 5 ----- 2 files changed, 10 deletions(-) diff --git a/lib/linalg/Makefile.g++ b/lib/linalg/Makefile.g++ index b1e18e8fd3..eb482b11b8 100644 --- a/lib/linalg/Makefile.g++ +++ b/lib/linalg/Makefile.g++ @@ -8,8 +8,6 @@ SHELL = /bin/sh SRC = $(wildcard *.cpp) -FILES = $(SRC) Makefile.* README - # ------ DEFINITIONS ------ LIB = liblinalg.a @@ -40,6 +38,3 @@ lib: $(OBJ) clean: -rm -f *.o *~ $(LIB) -tar: - -tar -czvf ../linalg.tar.gz $(FILES) - diff --git a/lib/linalg/Makefile.mpi b/lib/linalg/Makefile.mpi index 567653cebc..d0542d73fb 100644 --- a/lib/linalg/Makefile.mpi +++ b/lib/linalg/Makefile.mpi @@ -8,8 +8,6 @@ SHELL = /bin/sh SRC = $(wildcard *.cpp) -FILES = $(SRC) Makefile.* README - # ------ DEFINITIONS ------ LIB = liblinalg.a @@ -40,6 +38,3 @@ lib: $(OBJ) clean: -rm -f *.o *~ $(LIB) -tar: - -tar -czvf ../linalg.tar.gz $(FILES) - From a894cbfbb7006fd54af5b74b52dbfbec35fa464e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 13:46:08 -0500 Subject: [PATCH 27/47] update linalg README --- lib/linalg/README | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/linalg/README b/lib/linalg/README index e3b817cacc..68f17d9986 100644 --- a/lib/linalg/README +++ b/lib/linalg/README @@ -1,7 +1,10 @@ This directory has generic BLAS and LAPACK source files needed by the ATC, AWPMD, ELECTRODE, LATTE, and ML-POD packages (and possibly by other packages) in the future that can be used instead of platform or vendor -optimized BLAS/LAPACK library. +optimized BLAS/LAPACK library. For increased portability, the +BLAS/LAPACK source files have been translated to C++ with f2c. A few +subroutines using Fortran runtime functions have been re-implemented +in C++. Please see the convert.sh script for how the conversion was done. Note that this is an *incomplete* subset of full BLAS/LAPACK. @@ -20,7 +23,7 @@ can do it manually by following the instructions below. Build the library using one of the provided Makefile.* files or create your own, specific to your compiler and system. For example: -make -f Makefile.gfortran +make -f Makefile.g++ When you are done building this library, one file should exist in this directory: From 1e8b2ad5a07fd32e63b55d7d52e1264829b96bb4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 13:47:11 -0500 Subject: [PATCH 28/47] whitespace fixes --- lib/linalg/dasum.cpp | 68 +- lib/linalg/daxpy.cpp | 88 +- lib/linalg/dbdsqr.cpp | 796 ++++---- lib/linalg/dcabs1.cpp | 16 +- lib/linalg/dcopy.cpp | 92 +- lib/linalg/ddot.cpp | 86 +- lib/linalg/dgebd2.cpp | 174 +- lib/linalg/dgebrd.cpp | 166 +- lib/linalg/dgecon.cpp | 112 +- lib/linalg/dgelq2.cpp | 68 +- lib/linalg/dgelqf.cpp | 140 +- lib/linalg/dgelsd.cpp | 586 +++--- lib/linalg/dgelss.cpp | 906 ++++----- lib/linalg/dgemm.cpp | 266 +-- lib/linalg/dgemv.cpp | 216 +-- lib/linalg/dgeqr2.cpp | 68 +- lib/linalg/dgeqrf.cpp | 156 +- lib/linalg/dger.cpp | 100 +- lib/linalg/dgesv.cpp | 46 +- lib/linalg/dgesvd.cpp | 4106 ++++++++++++++++++++-------------------- lib/linalg/dgetf2.cpp | 100 +- lib/linalg/dgetrf.cpp | 136 +- lib/linalg/dgetrf2.cpp | 158 +- lib/linalg/dgetri.cpp | 172 +- lib/linalg/dgetrs.cpp | 80 +- lib/linalg/dlabad.cpp | 20 +- lib/linalg/dlabrd.cpp | 392 ++-- lib/linalg/dlacn2.cpp | 112 +- lib/linalg/dlacpy.cpp | 60 +- lib/linalg/dladiv.cpp | 80 +- lib/linalg/dlae2.cpp | 50 +- lib/linalg/dlaed0.cpp | 336 ++-- lib/linalg/dlaed1.cpp | 102 +- lib/linalg/dlaed2.cpp | 294 +-- lib/linalg/dlaed3.cpp | 148 +- lib/linalg/dlaed4.cpp | 1150 +++++------ lib/linalg/dlaed5.cpp | 92 +- lib/linalg/dlaed6.cpp | 312 +-- lib/linalg/dlaed7.cpp | 148 +- lib/linalg/dlaed8.cpp | 276 +-- lib/linalg/dlaed9.cpp | 118 +- lib/linalg/dlaeda.cpp | 158 +- lib/linalg/dlaev2.cpp | 92 +- lib/linalg/dlals0.cpp | 354 ++-- lib/linalg/dlalsa.cpp | 274 +-- lib/linalg/dlalsd.cpp | 436 ++--- lib/linalg/dlamrg.cpp | 78 +- lib/linalg/dlange.cpp | 130 +- lib/linalg/dlanst.cpp | 106 +- lib/linalg/dlansy.cpp | 194 +- lib/linalg/dlapy2.cpp | 40 +- lib/linalg/dlapy3.cpp | 26 +- lib/linalg/dlarf.cpp | 102 +- lib/linalg/dlarfb.cpp | 648 +++---- lib/linalg/dlarfg.cpp | 90 +- lib/linalg/dlarft.cpp | 282 +-- lib/linalg/dlartg.cpp | 140 +- lib/linalg/dlas2.cpp | 82 +- lib/linalg/dlascl.cpp | 256 +-- lib/linalg/dlasd4.cpp | 1364 ++++++------- lib/linalg/dlasd5.cpp | 102 +- lib/linalg/dlasd6.cpp | 106 +- lib/linalg/dlasd7.cpp | 258 +-- lib/linalg/dlasd8.cpp | 168 +- lib/linalg/dlasda.cpp | 364 ++-- lib/linalg/dlasdq.cpp | 252 +-- lib/linalg/dlasdt.cpp | 44 +- lib/linalg/dlaset.cpp | 64 +- lib/linalg/dlasq1.cpp | 110 +- lib/linalg/dlasq2.cpp | 586 +++--- lib/linalg/dlasq3.cpp | 222 +-- lib/linalg/dlasq4.cpp | 430 ++--- lib/linalg/dlasq5.cpp | 444 ++--- lib/linalg/dlasq6.cpp | 152 +- lib/linalg/dlasr.cpp | 450 ++--- lib/linalg/dlasrt.cpp | 272 +-- lib/linalg/dlassq.cpp | 50 +- lib/linalg/dlasv2.cpp | 178 +- lib/linalg/dlaswp.cpp | 108 +- lib/linalg/dlatrd.cpp | 270 +-- lib/linalg/dlatrs.cpp | 760 ++++---- lib/linalg/dnrm2.cpp | 56 +- lib/linalg/dorg2l.cpp | 80 +- lib/linalg/dorg2r.cpp | 88 +- lib/linalg/dorgbr.cpp | 214 +-- lib/linalg/dorgl2.cpp | 98 +- lib/linalg/dorglq.cpp | 176 +- lib/linalg/dorgql.cpp | 188 +- lib/linalg/dorgqr.cpp | 176 +- lib/linalg/dorgtr.cpp | 164 +- lib/linalg/dorm2l.cpp | 94 +- lib/linalg/dorm2r.cpp | 102 +- lib/linalg/dormbr.cpp | 258 +-- lib/linalg/dorml2.cpp | 102 +- lib/linalg/dormlq.cpp | 208 +- lib/linalg/dormql.cpp | 198 +- lib/linalg/dormqr.cpp | 200 +- lib/linalg/dormtr.cpp | 196 +- lib/linalg/dposv.cpp | 50 +- lib/linalg/dpotf2.cpp | 134 +- lib/linalg/dpotrf.cpp | 180 +- lib/linalg/dpotrf2.cpp | 122 +- lib/linalg/dpotrs.cpp | 70 +- lib/linalg/drot.cpp | 66 +- lib/linalg/drscl.cpp | 44 +- lib/linalg/dscal.cpp | 72 +- lib/linalg/dstedc.cpp | 374 ++-- lib/linalg/dsteqr.cpp | 566 +++--- lib/linalg/dsterf.cpp | 402 ++-- lib/linalg/dswap.cpp | 104 +- lib/linalg/dsyev.cpp | 142 +- lib/linalg/dsyevd.cpp | 176 +- lib/linalg/dsygs2.cpp | 272 +-- lib/linalg/dsygst.cpp | 352 ++-- lib/linalg/dsygv.cpp | 148 +- lib/linalg/dsygvd.cpp | 142 +- lib/linalg/dsymm.cpp | 258 +-- lib/linalg/dsymv.cpp | 242 +-- lib/linalg/dsyr2.cpp | 196 +- lib/linalg/dsyr2k.cpp | 334 ++-- lib/linalg/dsyrk.cpp | 306 +-- lib/linalg/dsytd2.cpp | 156 +- lib/linalg/dsytrd.cpp | 186 +- lib/linalg/dtrmm.cpp | 418 ++-- lib/linalg/dtrmv.cpp | 314 +-- lib/linalg/dtrsm.cpp | 474 ++--- lib/linalg/dtrsv.cpp | 314 +-- lib/linalg/dtrti2.cpp | 104 +- lib/linalg/dtrtri.cpp | 152 +- lib/linalg/dznrm2.cpp | 80 +- lib/linalg/idamax.cpp | 58 +- lib/linalg/ieeeck.cpp | 74 +- lib/linalg/iladlc.cpp | 36 +- lib/linalg/iladlr.cpp | 38 +- lib/linalg/ilaenv.cpp | 872 ++++----- lib/linalg/ilazlc.cpp | 50 +- lib/linalg/ilazlr.cpp | 56 +- lib/linalg/iparmq.cpp | 206 +- lib/linalg/lmp_f2c.h | 170 +- lib/linalg/zaxpy.cpp | 84 +- lib/linalg/zcopy.cpp | 66 +- lib/linalg/zdotc.cpp | 78 +- lib/linalg/zdrot.cpp | 114 +- lib/linalg/zdscal.cpp | 62 +- lib/linalg/zgemm.cpp | 790 ++++---- lib/linalg/zgemv.cpp | 382 ++-- lib/linalg/zgerc.cpp | 140 +- lib/linalg/zheev.cpp | 148 +- lib/linalg/zheevd.cpp | 212 +-- lib/linalg/zhemv.cpp | 470 ++--- lib/linalg/zher2.cpp | 524 ++--- lib/linalg/zher2k.cpp | 840 ++++---- lib/linalg/zhetd2.cpp | 252 +-- lib/linalg/zhetrd.cpp | 206 +- lib/linalg/zhpr.cpp | 346 ++-- lib/linalg/zlacgv.cpp | 50 +- lib/linalg/zlacpy.cpp | 76 +- lib/linalg/zlacrm.cpp | 86 +- lib/linalg/zladiv.cpp | 24 +- lib/linalg/zlaed0.cpp | 224 +-- lib/linalg/zlaed7.cpp | 132 +- lib/linalg/zlaed8.cpp | 232 +-- lib/linalg/zlanhe.cpp | 244 +-- lib/linalg/zlarf.cpp | 110 +- lib/linalg/zlarfb.cpp | 764 ++++---- lib/linalg/zlarfg.cpp | 112 +- lib/linalg/zlarft.cpp | 372 ++-- lib/linalg/zlascl.cpp | 298 +-- lib/linalg/zlaset.cpp | 102 +- lib/linalg/zlasr.cpp | 762 ++++---- lib/linalg/zlassq.cpp | 74 +- lib/linalg/zlatrd.cpp | 396 ++-- lib/linalg/zpptrf.cpp | 140 +- lib/linalg/zpptri.cpp | 114 +- lib/linalg/zscal.cpp | 58 +- lib/linalg/zstedc.cpp | 364 ++-- lib/linalg/zsteqr.cpp | 576 +++--- lib/linalg/zswap.cpp | 82 +- lib/linalg/ztpmv.cpp | 760 ++++---- lib/linalg/ztpsv.cpp | 692 +++---- lib/linalg/ztptri.cpp | 174 +- lib/linalg/ztrmm.cpp | 876 ++++----- lib/linalg/ztrmv.cpp | 714 +++---- lib/linalg/zung2l.cpp | 102 +- lib/linalg/zung2r.cpp | 110 +- lib/linalg/zungl2.cpp | 130 +- lib/linalg/zungql.cpp | 198 +- lib/linalg/zungqr.cpp | 186 +- lib/linalg/zungtr.cpp | 188 +- lib/linalg/zunm2l.cpp | 116 +- lib/linalg/zunm2r.cpp | 124 +- lib/linalg/zunmql.cpp | 202 +- lib/linalg/zunmqr.cpp | 204 +- lib/linalg/zunmtr.cpp | 198 +- 194 files changed, 24511 insertions(+), 24511 deletions(-) diff --git a/lib/linalg/dasum.cpp b/lib/linalg/dasum.cpp index 0119bed6fd..93e40126c0 100644 --- a/lib/linalg/dasum.cpp +++ b/lib/linalg/dasum.cpp @@ -1,13 +1,13 @@ /* fortran/dasum.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -118,7 +118,7 @@ doublereal dasum_(integer *n, doublereal *dx, integer *incx) ret_val = 0.; dtemp = 0.; if (*n <= 0 || *incx <= 0) { - return ret_val; + return ret_val; } if (*incx == 1) { /* code for increment equal to 1 */ @@ -126,35 +126,35 @@ doublereal dasum_(integer *n, doublereal *dx, integer *incx) /* clean-up loop */ - m = *n % 6; - if (m != 0) { - i__1 = m; - for (i__ = 1; i__ <= i__1; ++i__) { - dtemp += (d__1 = dx[i__], abs(d__1)); - } - if (*n < 6) { - ret_val = dtemp; - return ret_val; - } - } - mp1 = m + 1; - i__1 = *n; - for (i__ = mp1; i__ <= i__1; i__ += 6) { - dtemp = dtemp + (d__1 = dx[i__], abs(d__1)) + (d__2 = dx[i__ + 1], - abs(d__2)) + (d__3 = dx[i__ + 2], abs(d__3)) + (d__4 = - dx[i__ + 3], abs(d__4)) + (d__5 = dx[i__ + 4], abs(d__5)) - + (d__6 = dx[i__ + 5], abs(d__6)); - } + m = *n % 6; + if (m != 0) { + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp += (d__1 = dx[i__], abs(d__1)); + } + if (*n < 6) { + ret_val = dtemp; + return ret_val; + } + } + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 6) { + dtemp = dtemp + (d__1 = dx[i__], abs(d__1)) + (d__2 = dx[i__ + 1], + abs(d__2)) + (d__3 = dx[i__ + 2], abs(d__3)) + (d__4 = + dx[i__ + 3], abs(d__4)) + (d__5 = dx[i__ + 4], abs(d__5)) + + (d__6 = dx[i__ + 5], abs(d__6)); + } } else { /* code for increment not equal to 1 */ - nincx = *n * *incx; - i__1 = nincx; - i__2 = *incx; - for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { - dtemp += (d__1 = dx[i__], abs(d__1)); - } + nincx = *n * *incx; + i__1 = nincx; + i__2 = *incx; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + dtemp += (d__1 = dx[i__], abs(d__1)); + } } ret_val = dtemp; return ret_val; @@ -164,5 +164,5 @@ doublereal dasum_(integer *n, doublereal *dx, integer *incx) } /* dasum_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/daxpy.cpp b/lib/linalg/daxpy.cpp index d89cd6e9c4..54105d1426 100644 --- a/lib/linalg/daxpy.cpp +++ b/lib/linalg/daxpy.cpp @@ -1,13 +1,13 @@ /* fortran/daxpy.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -102,8 +102,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int daxpy_(integer *n, doublereal *da, doublereal *dx, - integer *incx, doublereal *dy, integer *incy) +/* Subroutine */ int daxpy_(integer *n, doublereal *da, doublereal *dx, + integer *incx, doublereal *dy, integer *incy) { /* System generated locals */ integer i__1; @@ -133,10 +133,10 @@ extern "C" { /* Function Body */ if (*n <= 0) { - return 0; + return 0; } if (*da == 0.) { - return 0; + return 0; } if (*incx == 1 && *incy == 1) { @@ -145,43 +145,43 @@ extern "C" { /* clean-up loop */ - m = *n % 4; - if (m != 0) { - i__1 = m; - for (i__ = 1; i__ <= i__1; ++i__) { - dy[i__] += *da * dx[i__]; - } - } - if (*n < 4) { - return 0; - } - mp1 = m + 1; - i__1 = *n; - for (i__ = mp1; i__ <= i__1; i__ += 4) { - dy[i__] += *da * dx[i__]; - dy[i__ + 1] += *da * dx[i__ + 1]; - dy[i__ + 2] += *da * dx[i__ + 2]; - dy[i__ + 3] += *da * dx[i__ + 3]; - } + m = *n % 4; + if (m != 0) { + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + dy[i__] += *da * dx[i__]; + } + } + if (*n < 4) { + return 0; + } + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 4) { + dy[i__] += *da * dx[i__]; + dy[i__ + 1] += *da * dx[i__ + 1]; + dy[i__ + 2] += *da * dx[i__ + 2]; + dy[i__ + 3] += *da * dx[i__ + 3]; + } } else { /* code for unequal increments or equal increments */ /* not equal to 1 */ - ix = 1; - iy = 1; - if (*incx < 0) { - ix = (-(*n) + 1) * *incx + 1; - } - if (*incy < 0) { - iy = (-(*n) + 1) * *incy + 1; - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - dy[iy] += *da * dx[ix]; - ix += *incx; - iy += *incy; - } + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dy[iy] += *da * dx[ix]; + ix += *incx; + iy += *incy; + } } return 0; @@ -190,5 +190,5 @@ extern "C" { } /* daxpy_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dbdsqr.cpp b/lib/linalg/dbdsqr.cpp index 78c996dc2b..5f5c1b1d6f 100644 --- a/lib/linalg/dbdsqr.cpp +++ b/lib/linalg/dbdsqr.cpp @@ -1,13 +1,13 @@ /* fortran/dbdsqr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -264,18 +264,18 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dbdsqr_(char *uplo, integer *n, integer *ncvt, integer * - nru, integer *ncc, doublereal *d__, doublereal *e, doublereal *vt, - integer *ldvt, doublereal *u, integer *ldu, doublereal *c__, integer * - ldc, doublereal *work, integer *info, ftnlen uplo_len) + nru, integer *ncc, doublereal *d__, doublereal *e, doublereal *vt, + integer *ldvt, doublereal *u, integer *ldu, doublereal *c__, integer * + ldc, doublereal *work, integer *info, ftnlen uplo_len) { /* System generated locals */ - integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, - i__2; + integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, + i__2; doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ double pow_dd(doublereal *, doublereal *), sqrt(doublereal), d_sign( - doublereal *, doublereal *); + doublereal *, doublereal *); /* Local variables */ integer iterdivn; @@ -294,30 +294,30 @@ f"> */ doublereal cosl; integer isub, iter; doublereal unfl, sinl, cosr, smin, smax, sinr; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *), dlas2_( - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *), dscal_(integer *, doublereal *, doublereal *, - integer *); + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *), dlas2_( + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *), dscal_(integer *, doublereal *, doublereal *, + integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal oldcs; - extern /* Subroutine */ int dlasr_(char *, char *, char *, integer *, - integer *, doublereal *, doublereal *, doublereal *, integer *, - ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dlasr_(char *, char *, char *, integer *, + integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen, ftnlen); integer oldll; doublereal shift, sigmn, oldsn; - extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, + doublereal *, integer *); doublereal sminl, sigmx; logical lower; extern /* Subroutine */ int dlasq1_(integer *, doublereal *, doublereal *, - doublereal *, integer *), dlasv2_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *); + doublereal *, integer *), dlasv2_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); extern doublereal dlamch_(char *, ftnlen); - extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *), xerbla_(char *, - integer *, ftnlen); + extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *), xerbla_(char *, + integer *, ftnlen); doublereal sminoa, thresh; logical rotate; doublereal tolmul; @@ -366,32 +366,32 @@ f"> */ *info = 0; lower = lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1); if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lower) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*ncvt < 0) { - *info = -3; + *info = -3; } else if (*nru < 0) { - *info = -4; + *info = -4; } else if (*ncc < 0) { - *info = -5; + *info = -5; } else if (*ncvt == 0 && *ldvt < 1 || *ncvt > 0 && *ldvt < max(1,*n)) { - *info = -9; + *info = -9; } else if (*ldu < max(1,*nru)) { - *info = -11; + *info = -11; } else if (*ncc == 0 && *ldc < 1 || *ncc > 0 && *ldc < max(1,*n)) { - *info = -13; + *info = -13; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DBDSQR", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DBDSQR", &i__1, (ftnlen)6); + return 0; } if (*n == 0) { - return 0; + return 0; } if (*n == 1) { - goto L160; + goto L160; } /* ROTATE is true if any singular vectors desired, false otherwise */ @@ -401,14 +401,14 @@ f"> */ /* If no singular vectors desired, use qd algorithm */ if (! rotate) { - dlasq1_(n, &d__[1], &e[1], &work[1], info); + dlasq1_(n, &d__[1], &e[1], &work[1], info); /* If INFO equals 2, dqds didn't finish, try to finish */ - if (*info != 2) { - return 0; - } - *info = 0; + if (*info != 2) { + return 0; + } + *info = 0; } nm1 = *n - 1; @@ -425,27 +425,27 @@ f"> */ /* by applying Givens rotations on the left */ if (lower) { - i__1 = *n - 1; - for (i__ = 1; i__ <= i__1; ++i__) { - dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); - d__[i__] = r__; - e[i__] = sn * d__[i__ + 1]; - d__[i__ + 1] = cs * d__[i__ + 1]; - work[i__] = cs; - work[nm1 + i__] = sn; + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); + d__[i__] = r__; + e[i__] = sn * d__[i__ + 1]; + d__[i__ + 1] = cs * d__[i__ + 1]; + work[i__] = cs; + work[nm1 + i__] = sn; /* L10: */ - } + } /* Update singular vectors if desired */ - if (*nru > 0) { - dlasr_((char *)"R", (char *)"V", (char *)"F", nru, n, &work[1], &work[*n], &u[u_offset], - ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } - if (*ncc > 0) { - dlasr_((char *)"L", (char *)"V", (char *)"F", n, ncc, &work[1], &work[*n], &c__[c_offset], - ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } + if (*nru > 0) { + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, n, &work[1], &work[*n], &u[u_offset], + ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + if (*ncc > 0) { + dlasr_((char *)"L", (char *)"V", (char *)"F", n, ncc, &work[1], &work[*n], &c__[c_offset], + ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } } /* Compute singular values to relative accuracy TOL */ @@ -465,15 +465,15 @@ f"> */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ - d__2 = smax, d__3 = (d__1 = d__[i__], abs(d__1)); - smax = max(d__2,d__3); + d__2 = smax, d__3 = (d__1 = d__[i__], abs(d__1)); + smax = max(d__2,d__3); /* L20: */ } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ - d__2 = smax, d__3 = (d__1 = e[i__], abs(d__1)); - smax = max(d__2,d__3); + d__2 = smax, d__3 = (d__1 = e[i__], abs(d__1)); + smax = max(d__2,d__3); /* L30: */ } sminl = 0.; @@ -481,33 +481,33 @@ f"> */ /* Relative accuracy desired */ - sminoa = abs(d__[1]); - if (sminoa == 0.) { - goto L50; - } - mu = sminoa; - i__1 = *n; - for (i__ = 2; i__ <= i__1; ++i__) { - mu = (d__2 = d__[i__], abs(d__2)) * (mu / (mu + (d__1 = e[i__ - 1] - , abs(d__1)))); - sminoa = min(sminoa,mu); - if (sminoa == 0.) { - goto L50; - } + sminoa = abs(d__[1]); + if (sminoa == 0.) { + goto L50; + } + mu = sminoa; + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + mu = (d__2 = d__[i__], abs(d__2)) * (mu / (mu + (d__1 = e[i__ - 1] + , abs(d__1)))); + sminoa = min(sminoa,mu); + if (sminoa == 0.) { + goto L50; + } /* L40: */ - } + } L50: - sminoa /= sqrt((doublereal) (*n)); + sminoa /= sqrt((doublereal) (*n)); /* Computing MAX */ - d__1 = tol * sminoa, d__2 = *n * (*n * unfl) * 6; - thresh = max(d__1,d__2); + d__1 = tol * sminoa, d__2 = *n * (*n * unfl) * 6; + thresh = max(d__1,d__2); } else { /* Absolute accuracy desired */ /* Computing MAX */ - d__1 = abs(tol) * smax, d__2 = *n * (*n * unfl) * 6; - thresh = max(d__1,d__2); + d__1 = abs(tol) * smax, d__2 = *n * (*n * unfl) * 6; + thresh = max(d__1,d__2); } /* Prepare for main iteration loop for the singular values */ @@ -531,39 +531,39 @@ L60: /* Check for convergence or exceeding iteration count */ if (m <= 1) { - goto L160; + goto L160; } if (iter >= *n) { - iter -= *n; - ++iterdivn; - if (iterdivn >= maxitdivn) { - goto L200; - } + iter -= *n; + ++iterdivn; + if (iterdivn >= maxitdivn) { + goto L200; + } } /* Find diagonal block of matrix to work on */ if (tol < 0. && (d__1 = d__[m], abs(d__1)) <= thresh) { - d__[m] = 0.; + d__[m] = 0.; } smax = (d__1 = d__[m], abs(d__1)); smin = smax; i__1 = m - 1; for (lll = 1; lll <= i__1; ++lll) { - ll = m - lll; - abss = (d__1 = d__[ll], abs(d__1)); - abse = (d__1 = e[ll], abs(d__1)); - if (tol < 0. && abss <= thresh) { - d__[ll] = 0.; - } - if (abse <= thresh) { - goto L80; - } - smin = min(smin,abss); + ll = m - lll; + abss = (d__1 = d__[ll], abs(d__1)); + abse = (d__1 = e[ll], abs(d__1)); + if (tol < 0. && abss <= thresh) { + d__[ll] = 0.; + } + if (abse <= thresh) { + goto L80; + } + smin = min(smin,abss); /* Computing MAX */ - d__1 = max(smax,abss); - smax = max(d__1,abse); + d__1 = max(smax,abss); + smax = max(d__1,abse); /* L70: */ } ll = 0; @@ -577,8 +577,8 @@ L80: /* Convergence of bottom singular value, return to top of loop */ - --m; - goto L60; + --m; + goto L60; } L90: ++ll; @@ -589,45 +589,45 @@ L90: /* 2 by 2 block, handle separately */ - dlasv2_(&d__[m - 1], &e[m - 1], &d__[m], &sigmn, &sigmx, &sinr, &cosr, - &sinl, &cosl); - d__[m - 1] = sigmx; - e[m - 1] = 0.; - d__[m] = sigmn; + dlasv2_(&d__[m - 1], &e[m - 1], &d__[m], &sigmn, &sigmx, &sinr, &cosr, + &sinl, &cosl); + d__[m - 1] = sigmx; + e[m - 1] = 0.; + d__[m] = sigmn; /* Compute singular vectors, if desired */ - if (*ncvt > 0) { - drot_(ncvt, &vt[m - 1 + vt_dim1], ldvt, &vt[m + vt_dim1], ldvt, & - cosr, &sinr); - } - if (*nru > 0) { - drot_(nru, &u[(m - 1) * u_dim1 + 1], &c__1, &u[m * u_dim1 + 1], & - c__1, &cosl, &sinl); - } - if (*ncc > 0) { - drot_(ncc, &c__[m - 1 + c_dim1], ldc, &c__[m + c_dim1], ldc, & - cosl, &sinl); - } - m += -2; - goto L60; + if (*ncvt > 0) { + drot_(ncvt, &vt[m - 1 + vt_dim1], ldvt, &vt[m + vt_dim1], ldvt, & + cosr, &sinr); + } + if (*nru > 0) { + drot_(nru, &u[(m - 1) * u_dim1 + 1], &c__1, &u[m * u_dim1 + 1], & + c__1, &cosl, &sinl); + } + if (*ncc > 0) { + drot_(ncc, &c__[m - 1 + c_dim1], ldc, &c__[m + c_dim1], ldc, & + cosl, &sinl); + } + m += -2; + goto L60; } /* If working on new submatrix, choose shift direction */ /* (from larger end diagonal element towards smaller) */ if (ll > oldm || m < oldll) { - if ((d__1 = d__[ll], abs(d__1)) >= (d__2 = d__[m], abs(d__2))) { + if ((d__1 = d__[ll], abs(d__1)) >= (d__2 = d__[m], abs(d__2))) { /* Chase bulge from top (big end) to bottom (small end) */ - idir = 1; - } else { + idir = 1; + } else { /* Chase bulge from bottom (big end) to top (small end) */ - idir = 2; - } + idir = 2; + } } /* Apply convergence tests */ @@ -637,63 +637,63 @@ L90: /* Run convergence test in forward direction */ /* First apply standard test to bottom of matrix */ - if ((d__2 = e[m - 1], abs(d__2)) <= abs(tol) * (d__1 = d__[m], abs( - d__1)) || tol < 0. && (d__3 = e[m - 1], abs(d__3)) <= thresh) - { - e[m - 1] = 0.; - goto L60; - } + if ((d__2 = e[m - 1], abs(d__2)) <= abs(tol) * (d__1 = d__[m], abs( + d__1)) || tol < 0. && (d__3 = e[m - 1], abs(d__3)) <= thresh) + { + e[m - 1] = 0.; + goto L60; + } - if (tol >= 0.) { + if (tol >= 0.) { /* If relative accuracy desired, */ /* apply convergence criterion forward */ - mu = (d__1 = d__[ll], abs(d__1)); - sminl = mu; - i__1 = m - 1; - for (lll = ll; lll <= i__1; ++lll) { - if ((d__1 = e[lll], abs(d__1)) <= tol * mu) { - e[lll] = 0.; - goto L60; - } - mu = (d__2 = d__[lll + 1], abs(d__2)) * (mu / (mu + (d__1 = e[ - lll], abs(d__1)))); - sminl = min(sminl,mu); + mu = (d__1 = d__[ll], abs(d__1)); + sminl = mu; + i__1 = m - 1; + for (lll = ll; lll <= i__1; ++lll) { + if ((d__1 = e[lll], abs(d__1)) <= tol * mu) { + e[lll] = 0.; + goto L60; + } + mu = (d__2 = d__[lll + 1], abs(d__2)) * (mu / (mu + (d__1 = e[ + lll], abs(d__1)))); + sminl = min(sminl,mu); /* L100: */ - } - } + } + } } else { /* Run convergence test in backward direction */ /* First apply standard test to top of matrix */ - if ((d__2 = e[ll], abs(d__2)) <= abs(tol) * (d__1 = d__[ll], abs(d__1) - ) || tol < 0. && (d__3 = e[ll], abs(d__3)) <= thresh) { - e[ll] = 0.; - goto L60; - } + if ((d__2 = e[ll], abs(d__2)) <= abs(tol) * (d__1 = d__[ll], abs(d__1) + ) || tol < 0. && (d__3 = e[ll], abs(d__3)) <= thresh) { + e[ll] = 0.; + goto L60; + } - if (tol >= 0.) { + if (tol >= 0.) { /* If relative accuracy desired, */ /* apply convergence criterion backward */ - mu = (d__1 = d__[m], abs(d__1)); - sminl = mu; - i__1 = ll; - for (lll = m - 1; lll >= i__1; --lll) { - if ((d__1 = e[lll], abs(d__1)) <= tol * mu) { - e[lll] = 0.; - goto L60; - } - mu = (d__2 = d__[lll], abs(d__2)) * (mu / (mu + (d__1 = e[lll] - , abs(d__1)))); - sminl = min(sminl,mu); + mu = (d__1 = d__[m], abs(d__1)); + sminl = mu; + i__1 = ll; + for (lll = m - 1; lll >= i__1; --lll) { + if ((d__1 = e[lll], abs(d__1)) <= tol * mu) { + e[lll] = 0.; + goto L60; + } + mu = (d__2 = d__[lll], abs(d__2)) * (mu / (mu + (d__1 = e[lll] + , abs(d__1)))); + sminl = min(sminl,mu); /* L110: */ - } - } + } + } } oldll = ll; oldm = m; @@ -707,28 +707,28 @@ L90: /* Use a zero shift to avoid loss of relative accuracy */ - shift = 0.; + shift = 0.; } else { /* Compute the shift from 2-by-2 block at end of matrix */ - if (idir == 1) { - sll = (d__1 = d__[ll], abs(d__1)); - dlas2_(&d__[m - 1], &e[m - 1], &d__[m], &shift, &r__); - } else { - sll = (d__1 = d__[m], abs(d__1)); - dlas2_(&d__[ll], &e[ll], &d__[ll + 1], &shift, &r__); - } + if (idir == 1) { + sll = (d__1 = d__[ll], abs(d__1)); + dlas2_(&d__[m - 1], &e[m - 1], &d__[m], &shift, &r__); + } else { + sll = (d__1 = d__[m], abs(d__1)); + dlas2_(&d__[ll], &e[ll], &d__[ll + 1], &shift, &r__); + } /* Test if shift negligible, and if so set to zero */ - if (sll > 0.) { + if (sll > 0.) { /* Computing 2nd power */ - d__1 = shift / sll; - if (d__1 * d__1 < eps) { - shift = 0.; - } - } + d__1 = shift / sll; + if (d__1 * d__1 < eps) { + shift = 0.; + } + } } /* Increment iteration count */ @@ -738,234 +738,234 @@ L90: /* If SHIFT = 0, do simplified QR iteration */ if (shift == 0.) { - if (idir == 1) { + if (idir == 1) { /* Chase bulge from top to bottom */ /* Save cosines and sines for later singular vector updates */ - cs = 1.; - oldcs = 1.; - i__1 = m - 1; - for (i__ = ll; i__ <= i__1; ++i__) { - d__1 = d__[i__] * cs; - dlartg_(&d__1, &e[i__], &cs, &sn, &r__); - if (i__ > ll) { - e[i__ - 1] = oldsn * r__; - } - d__1 = oldcs * r__; - d__2 = d__[i__ + 1] * sn; - dlartg_(&d__1, &d__2, &oldcs, &oldsn, &d__[i__]); - work[i__ - ll + 1] = cs; - work[i__ - ll + 1 + nm1] = sn; - work[i__ - ll + 1 + nm12] = oldcs; - work[i__ - ll + 1 + nm13] = oldsn; + cs = 1.; + oldcs = 1.; + i__1 = m - 1; + for (i__ = ll; i__ <= i__1; ++i__) { + d__1 = d__[i__] * cs; + dlartg_(&d__1, &e[i__], &cs, &sn, &r__); + if (i__ > ll) { + e[i__ - 1] = oldsn * r__; + } + d__1 = oldcs * r__; + d__2 = d__[i__ + 1] * sn; + dlartg_(&d__1, &d__2, &oldcs, &oldsn, &d__[i__]); + work[i__ - ll + 1] = cs; + work[i__ - ll + 1 + nm1] = sn; + work[i__ - ll + 1 + nm12] = oldcs; + work[i__ - ll + 1 + nm13] = oldsn; /* L120: */ - } - h__ = d__[m] * cs; - d__[m] = h__ * oldcs; - e[m - 1] = h__ * oldsn; + } + h__ = d__[m] * cs; + d__[m] = h__ * oldcs; + e[m - 1] = h__ * oldsn; /* Update singular vectors */ - if (*ncvt > 0) { - i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncvt, &work[1], &work[*n], &vt[ - ll + vt_dim1], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } - if (*nru > 0) { - i__1 = m - ll + 1; - dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &i__1, &work[nm12 + 1], &work[nm13 - + 1], &u[ll * u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, - (ftnlen)1); - } - if (*ncc > 0) { - i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncc, &work[nm12 + 1], &work[nm13 - + 1], &c__[ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); - } + if (*ncvt > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncvt, &work[1], &work[*n], &vt[ + ll + vt_dim1], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + if (*nru > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &i__1, &work[nm12 + 1], &work[nm13 + + 1], &u[ll * u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + } + if (*ncc > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncc, &work[nm12 + 1], &work[nm13 + + 1], &c__[ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + } /* Test convergence */ - if ((d__1 = e[m - 1], abs(d__1)) <= thresh) { - e[m - 1] = 0.; - } + if ((d__1 = e[m - 1], abs(d__1)) <= thresh) { + e[m - 1] = 0.; + } - } else { + } else { /* Chase bulge from bottom to top */ /* Save cosines and sines for later singular vector updates */ - cs = 1.; - oldcs = 1.; - i__1 = ll + 1; - for (i__ = m; i__ >= i__1; --i__) { - d__1 = d__[i__] * cs; - dlartg_(&d__1, &e[i__ - 1], &cs, &sn, &r__); - if (i__ < m) { - e[i__] = oldsn * r__; - } - d__1 = oldcs * r__; - d__2 = d__[i__ - 1] * sn; - dlartg_(&d__1, &d__2, &oldcs, &oldsn, &d__[i__]); - work[i__ - ll] = cs; - work[i__ - ll + nm1] = -sn; - work[i__ - ll + nm12] = oldcs; - work[i__ - ll + nm13] = -oldsn; + cs = 1.; + oldcs = 1.; + i__1 = ll + 1; + for (i__ = m; i__ >= i__1; --i__) { + d__1 = d__[i__] * cs; + dlartg_(&d__1, &e[i__ - 1], &cs, &sn, &r__); + if (i__ < m) { + e[i__] = oldsn * r__; + } + d__1 = oldcs * r__; + d__2 = d__[i__ - 1] * sn; + dlartg_(&d__1, &d__2, &oldcs, &oldsn, &d__[i__]); + work[i__ - ll] = cs; + work[i__ - ll + nm1] = -sn; + work[i__ - ll + nm12] = oldcs; + work[i__ - ll + nm13] = -oldsn; /* L130: */ - } - h__ = d__[ll] * cs; - d__[ll] = h__ * oldcs; - e[ll] = h__ * oldsn; + } + h__ = d__[ll] * cs; + d__[ll] = h__ * oldcs; + e[ll] = h__ * oldsn; /* Update singular vectors */ - if (*ncvt > 0) { - i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncvt, &work[nm12 + 1], &work[ - nm13 + 1], &vt[ll + vt_dim1], ldvt, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - } - if (*nru > 0) { - i__1 = m - ll + 1; - dlasr_((char *)"R", (char *)"V", (char *)"B", nru, &i__1, &work[1], &work[*n], &u[ll * - u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } - if (*ncc > 0) { - i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncc, &work[1], &work[*n], &c__[ - ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } + if (*ncvt > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncvt, &work[nm12 + 1], &work[ + nm13 + 1], &vt[ll + vt_dim1], ldvt, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + } + if (*nru > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"R", (char *)"V", (char *)"B", nru, &i__1, &work[1], &work[*n], &u[ll * + u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + if (*ncc > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncc, &work[1], &work[*n], &c__[ + ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } /* Test convergence */ - if ((d__1 = e[ll], abs(d__1)) <= thresh) { - e[ll] = 0.; - } - } + if ((d__1 = e[ll], abs(d__1)) <= thresh) { + e[ll] = 0.; + } + } } else { /* Use nonzero shift */ - if (idir == 1) { + if (idir == 1) { /* Chase bulge from top to bottom */ /* Save cosines and sines for later singular vector updates */ - f = ((d__1 = d__[ll], abs(d__1)) - shift) * (d_sign(&c_b49, &d__[ - ll]) + shift / d__[ll]); - g = e[ll]; - i__1 = m - 1; - for (i__ = ll; i__ <= i__1; ++i__) { - dlartg_(&f, &g, &cosr, &sinr, &r__); - if (i__ > ll) { - e[i__ - 1] = r__; - } - f = cosr * d__[i__] + sinr * e[i__]; - e[i__] = cosr * e[i__] - sinr * d__[i__]; - g = sinr * d__[i__ + 1]; - d__[i__ + 1] = cosr * d__[i__ + 1]; - dlartg_(&f, &g, &cosl, &sinl, &r__); - d__[i__] = r__; - f = cosl * e[i__] + sinl * d__[i__ + 1]; - d__[i__ + 1] = cosl * d__[i__ + 1] - sinl * e[i__]; - if (i__ < m - 1) { - g = sinl * e[i__ + 1]; - e[i__ + 1] = cosl * e[i__ + 1]; - } - work[i__ - ll + 1] = cosr; - work[i__ - ll + 1 + nm1] = sinr; - work[i__ - ll + 1 + nm12] = cosl; - work[i__ - ll + 1 + nm13] = sinl; + f = ((d__1 = d__[ll], abs(d__1)) - shift) * (d_sign(&c_b49, &d__[ + ll]) + shift / d__[ll]); + g = e[ll]; + i__1 = m - 1; + for (i__ = ll; i__ <= i__1; ++i__) { + dlartg_(&f, &g, &cosr, &sinr, &r__); + if (i__ > ll) { + e[i__ - 1] = r__; + } + f = cosr * d__[i__] + sinr * e[i__]; + e[i__] = cosr * e[i__] - sinr * d__[i__]; + g = sinr * d__[i__ + 1]; + d__[i__ + 1] = cosr * d__[i__ + 1]; + dlartg_(&f, &g, &cosl, &sinl, &r__); + d__[i__] = r__; + f = cosl * e[i__] + sinl * d__[i__ + 1]; + d__[i__ + 1] = cosl * d__[i__ + 1] - sinl * e[i__]; + if (i__ < m - 1) { + g = sinl * e[i__ + 1]; + e[i__ + 1] = cosl * e[i__ + 1]; + } + work[i__ - ll + 1] = cosr; + work[i__ - ll + 1 + nm1] = sinr; + work[i__ - ll + 1 + nm12] = cosl; + work[i__ - ll + 1 + nm13] = sinl; /* L140: */ - } - e[m - 1] = f; + } + e[m - 1] = f; /* Update singular vectors */ - if (*ncvt > 0) { - i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncvt, &work[1], &work[*n], &vt[ - ll + vt_dim1], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } - if (*nru > 0) { - i__1 = m - ll + 1; - dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &i__1, &work[nm12 + 1], &work[nm13 - + 1], &u[ll * u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, - (ftnlen)1); - } - if (*ncc > 0) { - i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncc, &work[nm12 + 1], &work[nm13 - + 1], &c__[ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); - } + if (*ncvt > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncvt, &work[1], &work[*n], &vt[ + ll + vt_dim1], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + if (*nru > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &i__1, &work[nm12 + 1], &work[nm13 + + 1], &u[ll * u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + } + if (*ncc > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncc, &work[nm12 + 1], &work[nm13 + + 1], &c__[ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + } /* Test convergence */ - if ((d__1 = e[m - 1], abs(d__1)) <= thresh) { - e[m - 1] = 0.; - } + if ((d__1 = e[m - 1], abs(d__1)) <= thresh) { + e[m - 1] = 0.; + } - } else { + } else { /* Chase bulge from bottom to top */ /* Save cosines and sines for later singular vector updates */ - f = ((d__1 = d__[m], abs(d__1)) - shift) * (d_sign(&c_b49, &d__[m] - ) + shift / d__[m]); - g = e[m - 1]; - i__1 = ll + 1; - for (i__ = m; i__ >= i__1; --i__) { - dlartg_(&f, &g, &cosr, &sinr, &r__); - if (i__ < m) { - e[i__] = r__; - } - f = cosr * d__[i__] + sinr * e[i__ - 1]; - e[i__ - 1] = cosr * e[i__ - 1] - sinr * d__[i__]; - g = sinr * d__[i__ - 1]; - d__[i__ - 1] = cosr * d__[i__ - 1]; - dlartg_(&f, &g, &cosl, &sinl, &r__); - d__[i__] = r__; - f = cosl * e[i__ - 1] + sinl * d__[i__ - 1]; - d__[i__ - 1] = cosl * d__[i__ - 1] - sinl * e[i__ - 1]; - if (i__ > ll + 1) { - g = sinl * e[i__ - 2]; - e[i__ - 2] = cosl * e[i__ - 2]; - } - work[i__ - ll] = cosr; - work[i__ - ll + nm1] = -sinr; - work[i__ - ll + nm12] = cosl; - work[i__ - ll + nm13] = -sinl; + f = ((d__1 = d__[m], abs(d__1)) - shift) * (d_sign(&c_b49, &d__[m] + ) + shift / d__[m]); + g = e[m - 1]; + i__1 = ll + 1; + for (i__ = m; i__ >= i__1; --i__) { + dlartg_(&f, &g, &cosr, &sinr, &r__); + if (i__ < m) { + e[i__] = r__; + } + f = cosr * d__[i__] + sinr * e[i__ - 1]; + e[i__ - 1] = cosr * e[i__ - 1] - sinr * d__[i__]; + g = sinr * d__[i__ - 1]; + d__[i__ - 1] = cosr * d__[i__ - 1]; + dlartg_(&f, &g, &cosl, &sinl, &r__); + d__[i__] = r__; + f = cosl * e[i__ - 1] + sinl * d__[i__ - 1]; + d__[i__ - 1] = cosl * d__[i__ - 1] - sinl * e[i__ - 1]; + if (i__ > ll + 1) { + g = sinl * e[i__ - 2]; + e[i__ - 2] = cosl * e[i__ - 2]; + } + work[i__ - ll] = cosr; + work[i__ - ll + nm1] = -sinr; + work[i__ - ll + nm12] = cosl; + work[i__ - ll + nm13] = -sinl; /* L150: */ - } - e[ll] = f; + } + e[ll] = f; /* Test convergence */ - if ((d__1 = e[ll], abs(d__1)) <= thresh) { - e[ll] = 0.; - } + if ((d__1 = e[ll], abs(d__1)) <= thresh) { + e[ll] = 0.; + } /* Update singular vectors if desired */ - if (*ncvt > 0) { - i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncvt, &work[nm12 + 1], &work[ - nm13 + 1], &vt[ll + vt_dim1], ldvt, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - } - if (*nru > 0) { - i__1 = m - ll + 1; - dlasr_((char *)"R", (char *)"V", (char *)"B", nru, &i__1, &work[1], &work[*n], &u[ll * - u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } - if (*ncc > 0) { - i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncc, &work[1], &work[*n], &c__[ - ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } - } + if (*ncvt > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncvt, &work[nm12 + 1], &work[ + nm13 + 1], &vt[ll + vt_dim1], ldvt, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + } + if (*nru > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"R", (char *)"V", (char *)"B", nru, &i__1, &work[1], &work[*n], &u[ll * + u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + if (*ncc > 0) { + i__1 = m - ll + 1; + dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncc, &work[1], &work[*n], &c__[ + ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + } } /* QR iteration finished, go back and check convergence */ @@ -977,15 +977,15 @@ L90: L160: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - if (d__[i__] < 0.) { - d__[i__] = -d__[i__]; + if (d__[i__] < 0.) { + d__[i__] = -d__[i__]; /* Change sign of singular vectors, if desired */ - if (*ncvt > 0) { - dscal_(ncvt, &c_b72, &vt[i__ + vt_dim1], ldvt); - } - } + if (*ncvt > 0) { + dscal_(ncvt, &c_b72, &vt[i__ + vt_dim1], ldvt); + } + } /* L170: */ } @@ -997,35 +997,35 @@ L160: /* Scan for smallest D(I) */ - isub = 1; - smin = d__[1]; - i__2 = *n + 1 - i__; - for (j = 2; j <= i__2; ++j) { - if (d__[j] <= smin) { - isub = j; - smin = d__[j]; - } + isub = 1; + smin = d__[1]; + i__2 = *n + 1 - i__; + for (j = 2; j <= i__2; ++j) { + if (d__[j] <= smin) { + isub = j; + smin = d__[j]; + } /* L180: */ - } - if (isub != *n + 1 - i__) { + } + if (isub != *n + 1 - i__) { /* Swap singular values and vectors */ - d__[isub] = d__[*n + 1 - i__]; - d__[*n + 1 - i__] = smin; - if (*ncvt > 0) { - dswap_(ncvt, &vt[isub + vt_dim1], ldvt, &vt[*n + 1 - i__ + - vt_dim1], ldvt); - } - if (*nru > 0) { - dswap_(nru, &u[isub * u_dim1 + 1], &c__1, &u[(*n + 1 - i__) * - u_dim1 + 1], &c__1); - } - if (*ncc > 0) { - dswap_(ncc, &c__[isub + c_dim1], ldc, &c__[*n + 1 - i__ + - c_dim1], ldc); - } - } + d__[isub] = d__[*n + 1 - i__]; + d__[*n + 1 - i__] = smin; + if (*ncvt > 0) { + dswap_(ncvt, &vt[isub + vt_dim1], ldvt, &vt[*n + 1 - i__ + + vt_dim1], ldvt); + } + if (*nru > 0) { + dswap_(nru, &u[isub * u_dim1 + 1], &c__1, &u[(*n + 1 - i__) * + u_dim1 + 1], &c__1); + } + if (*ncc > 0) { + dswap_(ncc, &c__[isub + c_dim1], ldc, &c__[*n + 1 - i__ + + c_dim1], ldc); + } + } /* L190: */ } goto L220; @@ -1036,9 +1036,9 @@ L200: *info = 0; i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { - if (e[i__] != 0.) { - ++(*info); - } + if (e[i__] != 0.) { + ++(*info); + } /* L210: */ } L220: @@ -1049,5 +1049,5 @@ L220: } /* dbdsqr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dcabs1.cpp b/lib/linalg/dcabs1.cpp index 2733be3c74..bdaf645a57 100644 --- a/lib/linalg/dcabs1.cpp +++ b/lib/linalg/dcabs1.cpp @@ -1,13 +1,13 @@ /* fortran/dcabs1.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -88,5 +88,5 @@ doublereal dcabs1_(doublecomplex *z__) } /* dcabs1_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dcopy.cpp b/lib/linalg/dcopy.cpp index 52fe214e90..dceb6ad727 100644 --- a/lib/linalg/dcopy.cpp +++ b/lib/linalg/dcopy.cpp @@ -1,13 +1,13 @@ /* fortran/dcopy.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -95,8 +95,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dcopy_(integer *n, doublereal *dx, integer *incx, - doublereal *dy, integer *incy) +/* Subroutine */ int dcopy_(integer *n, doublereal *dx, integer *incx, + doublereal *dy, integer *incy) { /* System generated locals */ integer i__1; @@ -126,7 +126,7 @@ extern "C" { /* Function Body */ if (*n <= 0) { - return 0; + return 0; } if (*incx == 1 && *incy == 1) { @@ -135,46 +135,46 @@ extern "C" { /* clean-up loop */ - m = *n % 7; - if (m != 0) { - i__1 = m; - for (i__ = 1; i__ <= i__1; ++i__) { - dy[i__] = dx[i__]; - } - if (*n < 7) { - return 0; - } - } - mp1 = m + 1; - i__1 = *n; - for (i__ = mp1; i__ <= i__1; i__ += 7) { - dy[i__] = dx[i__]; - dy[i__ + 1] = dx[i__ + 1]; - dy[i__ + 2] = dx[i__ + 2]; - dy[i__ + 3] = dx[i__ + 3]; - dy[i__ + 4] = dx[i__ + 4]; - dy[i__ + 5] = dx[i__ + 5]; - dy[i__ + 6] = dx[i__ + 6]; - } + m = *n % 7; + if (m != 0) { + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + dy[i__] = dx[i__]; + } + if (*n < 7) { + return 0; + } + } + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 7) { + dy[i__] = dx[i__]; + dy[i__ + 1] = dx[i__ + 1]; + dy[i__ + 2] = dx[i__ + 2]; + dy[i__ + 3] = dx[i__ + 3]; + dy[i__ + 4] = dx[i__ + 4]; + dy[i__ + 5] = dx[i__ + 5]; + dy[i__ + 6] = dx[i__ + 6]; + } } else { /* code for unequal increments or equal increments */ /* not equal to 1 */ - ix = 1; - iy = 1; - if (*incx < 0) { - ix = (-(*n) + 1) * *incx + 1; - } - if (*incy < 0) { - iy = (-(*n) + 1) * *incy + 1; - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - dy[iy] = dx[ix]; - ix += *incx; - iy += *incy; - } + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dy[iy] = dx[ix]; + ix += *incx; + iy += *incy; + } } return 0; @@ -183,5 +183,5 @@ extern "C" { } /* dcopy_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/ddot.cpp b/lib/linalg/ddot.cpp index 3f57f45459..e2319f6803 100644 --- a/lib/linalg/ddot.cpp +++ b/lib/linalg/ddot.cpp @@ -1,13 +1,13 @@ /* fortran/ddot.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -95,8 +95,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -doublereal ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, - integer *incy) +doublereal ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, + integer *incy) { /* System generated locals */ integer i__1; @@ -130,7 +130,7 @@ doublereal ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, ret_val = 0.; dtemp = 0.; if (*n <= 0) { - return ret_val; + return ret_val; } if (*incx == 1 && *incy == 1) { @@ -139,43 +139,43 @@ doublereal ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, /* clean-up loop */ - m = *n % 5; - if (m != 0) { - i__1 = m; - for (i__ = 1; i__ <= i__1; ++i__) { - dtemp += dx[i__] * dy[i__]; - } - if (*n < 5) { - ret_val = dtemp; - return ret_val; - } - } - mp1 = m + 1; - i__1 = *n; - for (i__ = mp1; i__ <= i__1; i__ += 5) { - dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1] + - dx[i__ + 2] * dy[i__ + 2] + dx[i__ + 3] * dy[i__ + 3] + - dx[i__ + 4] * dy[i__ + 4]; - } + m = *n % 5; + if (m != 0) { + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp += dx[i__] * dy[i__]; + } + if (*n < 5) { + ret_val = dtemp; + return ret_val; + } + } + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 5) { + dtemp = dtemp + dx[i__] * dy[i__] + dx[i__ + 1] * dy[i__ + 1] + + dx[i__ + 2] * dy[i__ + 2] + dx[i__ + 3] * dy[i__ + 3] + + dx[i__ + 4] * dy[i__ + 4]; + } } else { /* code for unequal increments or equal increments */ /* not equal to 1 */ - ix = 1; - iy = 1; - if (*incx < 0) { - ix = (-(*n) + 1) * *incx + 1; - } - if (*incy < 0) { - iy = (-(*n) + 1) * *incy + 1; - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - dtemp += dx[ix] * dy[iy]; - ix += *incx; - iy += *incy; - } + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp += dx[ix] * dy[iy]; + ix += *incx; + iy += *incy; + } } ret_val = dtemp; return ret_val; @@ -185,5 +185,5 @@ doublereal ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, } /* ddot_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgebd2.cpp b/lib/linalg/dgebd2.cpp index 399cd3ca6e..8c95869e21 100644 --- a/lib/linalg/dgebd2.cpp +++ b/lib/linalg/dgebd2.cpp @@ -1,13 +1,13 @@ /* fortran/dgebd2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -210,19 +210,19 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dgebd2_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * - taup, doublereal *work, integer *info) + lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * + taup, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__; - extern /* Subroutine */ int dlarf_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, ftnlen), dlarfg_(integer *, doublereal *, - doublereal *, integer *, doublereal *), xerbla_(char *, integer *, - ftnlen); + extern /* Subroutine */ int dlarf_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen), dlarfg_(integer *, doublereal *, + doublereal *, integer *, doublereal *), xerbla_(char *, integer *, + ftnlen); /* -- LAPACK computational routine -- */ @@ -261,126 +261,126 @@ f"> */ /* Function Body */ *info = 0; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*m)) { - *info = -4; + *info = -4; } if (*info < 0) { - i__1 = -(*info); - xerbla_((char *)"DGEBD2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGEBD2", &i__1, (ftnlen)6); + return 0; } if (*m >= *n) { /* Reduce to upper bidiagonal form */ - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) to annihilate A(i+1:m,i) */ - i__2 = *m - i__ + 1; + i__2 = *m - i__ + 1; /* Computing MIN */ - i__3 = i__ + 1; - dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3,*m) + i__ * - a_dim1], &c__1, &tauq[i__]); - d__[i__] = a[i__ + i__ * a_dim1]; - a[i__ + i__ * a_dim1] = 1.; + i__3 = i__ + 1; + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3,*m) + i__ * + a_dim1], &c__1, &tauq[i__]); + d__[i__] = a[i__ + i__ * a_dim1]; + a[i__ + i__ * a_dim1] = 1.; /* Apply H(i) to A(i:m,i+1:n) from the left */ - if (i__ < *n) { - i__2 = *m - i__ + 1; - i__3 = *n - i__; - dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, & - tauq[i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1] - , (ftnlen)4); - } - a[i__ + i__ * a_dim1] = d__[i__]; + if (i__ < *n) { + i__2 = *m - i__ + 1; + i__3 = *n - i__; + dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, & + tauq[i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1] + , (ftnlen)4); + } + a[i__ + i__ * a_dim1] = d__[i__]; - if (i__ < *n) { + if (i__ < *n) { /* Generate elementary reflector G(i) to annihilate */ /* A(i,i+2:n) */ - i__2 = *n - i__; + i__2 = *n - i__; /* Computing MIN */ - i__3 = i__ + 2; - dlarfg_(&i__2, &a[i__ + (i__ + 1) * a_dim1], &a[i__ + min( - i__3,*n) * a_dim1], lda, &taup[i__]); - e[i__] = a[i__ + (i__ + 1) * a_dim1]; - a[i__ + (i__ + 1) * a_dim1] = 1.; + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + (i__ + 1) * a_dim1], &a[i__ + min( + i__3,*n) * a_dim1], lda, &taup[i__]); + e[i__] = a[i__ + (i__ + 1) * a_dim1]; + a[i__ + (i__ + 1) * a_dim1] = 1.; /* Apply G(i) to A(i+1:m,i+1:n) from the right */ - i__2 = *m - i__; - i__3 = *n - i__; - dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + (i__ + 1) * a_dim1], - lda, &taup[i__], &a[i__ + 1 + (i__ + 1) * a_dim1], - lda, &work[1], (ftnlen)5); - a[i__ + (i__ + 1) * a_dim1] = e[i__]; - } else { - taup[i__] = 0.; - } + i__2 = *m - i__; + i__3 = *n - i__; + dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + (i__ + 1) * a_dim1], + lda, &taup[i__], &a[i__ + 1 + (i__ + 1) * a_dim1], + lda, &work[1], (ftnlen)5); + a[i__ + (i__ + 1) * a_dim1] = e[i__]; + } else { + taup[i__] = 0.; + } /* L10: */ - } + } } else { /* Reduce to lower bidiagonal form */ - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector G(i) to annihilate A(i,i+1:n) */ - i__2 = *n - i__ + 1; + i__2 = *n - i__ + 1; /* Computing MIN */ - i__3 = i__ + 1; - dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3,*n) * - a_dim1], lda, &taup[i__]); - d__[i__] = a[i__ + i__ * a_dim1]; - a[i__ + i__ * a_dim1] = 1.; + i__3 = i__ + 1; + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3,*n) * + a_dim1], lda, &taup[i__]); + d__[i__] = a[i__ + i__ * a_dim1]; + a[i__ + i__ * a_dim1] = 1.; /* Apply G(i) to A(i+1:m,i:n) from the right */ - if (i__ < *m) { - i__2 = *m - i__; - i__3 = *n - i__ + 1; - dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, & - taup[i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1], - (ftnlen)5); - } - a[i__ + i__ * a_dim1] = d__[i__]; + if (i__ < *m) { + i__2 = *m - i__; + i__3 = *n - i__ + 1; + dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, & + taup[i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1], + (ftnlen)5); + } + a[i__ + i__ * a_dim1] = d__[i__]; - if (i__ < *m) { + if (i__ < *m) { /* Generate elementary reflector H(i) to annihilate */ /* A(i+2:m,i) */ - i__2 = *m - i__; + i__2 = *m - i__; /* Computing MIN */ - i__3 = i__ + 2; - dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*m) + - i__ * a_dim1], &c__1, &tauq[i__]); - e[i__] = a[i__ + 1 + i__ * a_dim1]; - a[i__ + 1 + i__ * a_dim1] = 1.; + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*m) + + i__ * a_dim1], &c__1, &tauq[i__]); + e[i__] = a[i__ + 1 + i__ * a_dim1]; + a[i__ + 1 + i__ * a_dim1] = 1.; /* Apply H(i) to A(i+1:m,i+1:n) from the left */ - i__2 = *m - i__; - i__3 = *n - i__; - dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + 1 + i__ * a_dim1], & - c__1, &tauq[i__], &a[i__ + 1 + (i__ + 1) * a_dim1], - lda, &work[1], (ftnlen)4); - a[i__ + 1 + i__ * a_dim1] = e[i__]; - } else { - tauq[i__] = 0.; - } + i__2 = *m - i__; + i__3 = *n - i__; + dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + 1 + i__ * a_dim1], & + c__1, &tauq[i__], &a[i__ + 1 + (i__ + 1) * a_dim1], + lda, &work[1], (ftnlen)4); + a[i__ + 1 + i__ * a_dim1] = e[i__]; + } else { + tauq[i__] = 0.; + } /* L20: */ - } + } } return 0; @@ -389,5 +389,5 @@ f"> */ } /* dgebd2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgebrd.cpp b/lib/linalg/dgebrd.cpp index 84827afcfd..0be33bde5c 100644 --- a/lib/linalg/dgebrd.cpp +++ b/lib/linalg/dgebrd.cpp @@ -1,13 +1,13 @@ /* fortran/dgebrd.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -230,26 +230,26 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dgebrd_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * - taup, doublereal *work, integer *lwork, integer *info) + lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * + taup, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j, nb, nx, ws; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); integer nbmin, iinfo, minmn; - extern /* Subroutine */ int dgebd2_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *), dlabrd_(integer *, integer *, integer * - , doublereal *, integer *, doublereal *, doublereal *, doublereal - *, doublereal *, doublereal *, integer *, doublereal *, integer *) - , xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dgebd2_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *), dlabrd_(integer *, integer *, integer * + , doublereal *, integer *, doublereal *, doublereal *, doublereal + *, doublereal *, doublereal *, integer *, doublereal *, integer *) + , xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); integer ldwrkx, ldwrky, lwkopt; logical lquery; @@ -293,38 +293,38 @@ f"> */ *info = 0; /* Computing MAX */ i__1 = 1, i__2 = ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, ( - ftnlen)6, (ftnlen)1); + ftnlen)6, (ftnlen)1); nb = max(i__1,i__2); lwkopt = (*m + *n) * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*m)) { - *info = -4; + *info = -4; } else /* if(complicated condition) */ { /* Computing MAX */ - i__1 = max(1,*m); - if (*lwork < max(i__1,*n) && ! lquery) { - *info = -10; - } + i__1 = max(1,*m); + if (*lwork < max(i__1,*n) && ! lquery) { + *info = -10; + } } if (*info < 0) { - i__1 = -(*info); - xerbla_((char *)"DGEBRD", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGEBRD", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ minmn = min(*m,*n); if (minmn == 0) { - work[1] = 1.; - return 0; + work[1] = 1.; + return 0; } ws = max(*m,*n); @@ -336,31 +336,31 @@ f"> */ /* Set the crossover point NX. */ /* Computing MAX */ - i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); + i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); /* Determine when to switch from blocked to unblocked code. */ - if (nx < minmn) { - ws = (*m + *n) * nb; - if (*lwork < ws) { + if (nx < minmn) { + ws = (*m + *n) * nb; + if (*lwork < ws) { /* Not enough work space for the optimal NB, consider using */ /* a smaller block size. */ - nbmin = ilaenv_(&c__2, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, ( - ftnlen)6, (ftnlen)1); - if (*lwork >= (*m + *n) * nbmin) { - nb = *lwork / (*m + *n); - } else { - nb = 1; - nx = minmn; - } - } - } + nbmin = ilaenv_(&c__2, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, ( + ftnlen)6, (ftnlen)1); + if (*lwork >= (*m + *n) * nbmin) { + nb = *lwork / (*m + *n); + } else { + nb = 1; + nx = minmn; + } + } + } } else { - nx = minmn; + nx = minmn; } i__1 = minmn - nx; @@ -371,45 +371,45 @@ f"> */ /* the matrices X and Y which are needed to update the unreduced */ /* part of the matrix */ - i__3 = *m - i__ + 1; - i__4 = *n - i__ + 1; - dlabrd_(&i__3, &i__4, &nb, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[ - i__], &tauq[i__], &taup[i__], &work[1], &ldwrkx, &work[ldwrkx - * nb + 1], &ldwrky); + i__3 = *m - i__ + 1; + i__4 = *n - i__ + 1; + dlabrd_(&i__3, &i__4, &nb, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[ + i__], &tauq[i__], &taup[i__], &work[1], &ldwrkx, &work[ldwrkx + * nb + 1], &ldwrky); /* Update the trailing submatrix A(i+nb:m,i+nb:n), using an update */ /* of the form A := A - V*Y**T - X*U**T */ - i__3 = *m - i__ - nb + 1; - i__4 = *n - i__ - nb + 1; - dgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &i__4, &nb, &c_b21, &a[i__ - + nb + i__ * a_dim1], lda, &work[ldwrkx * nb + nb + 1], & - ldwrky, &c_b22, &a[i__ + nb + (i__ + nb) * a_dim1], lda, ( - ftnlen)12, (ftnlen)9); - i__3 = *m - i__ - nb + 1; - i__4 = *n - i__ - nb + 1; - dgemm_((char *)"No transpose", (char *)"No transpose", &i__3, &i__4, &nb, &c_b21, & - work[nb + 1], &ldwrkx, &a[i__ + (i__ + nb) * a_dim1], lda, & - c_b22, &a[i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)12, ( - ftnlen)12); + i__3 = *m - i__ - nb + 1; + i__4 = *n - i__ - nb + 1; + dgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &i__4, &nb, &c_b21, &a[i__ + + nb + i__ * a_dim1], lda, &work[ldwrkx * nb + nb + 1], & + ldwrky, &c_b22, &a[i__ + nb + (i__ + nb) * a_dim1], lda, ( + ftnlen)12, (ftnlen)9); + i__3 = *m - i__ - nb + 1; + i__4 = *n - i__ - nb + 1; + dgemm_((char *)"No transpose", (char *)"No transpose", &i__3, &i__4, &nb, &c_b21, & + work[nb + 1], &ldwrkx, &a[i__ + (i__ + nb) * a_dim1], lda, & + c_b22, &a[i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)12, ( + ftnlen)12); /* Copy diagonal and off-diagonal elements of B back into A */ - if (*m >= *n) { - i__3 = i__ + nb - 1; - for (j = i__; j <= i__3; ++j) { - a[j + j * a_dim1] = d__[j]; - a[j + (j + 1) * a_dim1] = e[j]; + if (*m >= *n) { + i__3 = i__ + nb - 1; + for (j = i__; j <= i__3; ++j) { + a[j + j * a_dim1] = d__[j]; + a[j + (j + 1) * a_dim1] = e[j]; /* L10: */ - } - } else { - i__3 = i__ + nb - 1; - for (j = i__; j <= i__3; ++j) { - a[j + j * a_dim1] = d__[j]; - a[j + 1 + j * a_dim1] = e[j]; + } + } else { + i__3 = i__ + nb - 1; + for (j = i__; j <= i__3; ++j) { + a[j + j * a_dim1] = d__[j]; + a[j + 1 + j * a_dim1] = e[j]; /* L20: */ - } - } + } + } /* L30: */ } @@ -418,7 +418,7 @@ f"> */ i__2 = *m - i__ + 1; i__1 = *n - i__ + 1; dgebd2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], & - tauq[i__], &taup[i__], &work[1], &iinfo); + tauq[i__], &taup[i__], &work[1], &iinfo); work[1] = (doublereal) ws; return 0; @@ -427,5 +427,5 @@ f"> */ } /* dgebrd_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgecon.cpp b/lib/linalg/dgecon.cpp index 07a305d74f..76a0186cc8 100644 --- a/lib/linalg/dgecon.cpp +++ b/lib/linalg/dgecon.cpp @@ -1,13 +1,13 @@ /* fortran/dgecon.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -144,8 +144,8 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dgecon_(char *norm, integer *n, doublereal *a, integer * - lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * - iwork, integer *info, ftnlen norm_len) + lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * + iwork, integer *info, ftnlen norm_len) { /* System generated locals */ integer a_dim1, a_offset, i__1; @@ -159,16 +159,16 @@ f"> */ doublereal scale; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer isave[3]; - extern /* Subroutine */ int drscl_(integer *, doublereal *, doublereal *, - integer *), dlacn2_(integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *); + extern /* Subroutine */ int drscl_(integer *, doublereal *, doublereal *, + integer *), dlacn2_(integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *); extern doublereal dlamch_(char *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); doublereal ainvnm; - extern /* Subroutine */ int dlatrs_(char *, char *, char *, char *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dlatrs_(char *, char *, char *, char *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); logical onenrm; char normin[1]; doublereal smlnum; @@ -211,30 +211,30 @@ f"> */ /* Function Body */ *info = 0; onenrm = *(unsigned char *)norm == '1' || lsame_(norm, (char *)"O", (ftnlen)1, ( - ftnlen)1); + ftnlen)1); if (! onenrm && ! lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*n)) { - *info = -4; + *info = -4; } else if (*anorm < 0.) { - *info = -5; + *info = -5; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGECON", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGECON", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ *rcond = 0.; if (*n == 0) { - *rcond = 1.; - return 0; + *rcond = 1.; + return 0; } else if (*anorm == 0.) { - return 0; + return 0; } smlnum = dlamch_((char *)"Safe minimum", (ftnlen)12); @@ -244,61 +244,61 @@ f"> */ ainvnm = 0.; *(unsigned char *)normin = 'N'; if (onenrm) { - kase1 = 1; + kase1 = 1; } else { - kase1 = 2; + kase1 = 2; } kase = 0; L10: dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { - if (kase == kase1) { + if (kase == kase1) { /* Multiply by inv(L). */ - dlatrs_((char *)"Lower", (char *)"No transpose", (char *)"Unit", normin, n, &a[a_offset], - lda, &work[1], &sl, &work[(*n << 1) + 1], info, (ftnlen)5, - (ftnlen)12, (ftnlen)4, (ftnlen)1); + dlatrs_((char *)"Lower", (char *)"No transpose", (char *)"Unit", normin, n, &a[a_offset], + lda, &work[1], &sl, &work[(*n << 1) + 1], info, (ftnlen)5, + (ftnlen)12, (ftnlen)4, (ftnlen)1); /* Multiply by inv(U). */ - dlatrs_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", normin, n, &a[ - a_offset], lda, &work[1], &su, &work[*n * 3 + 1], info, ( - ftnlen)5, (ftnlen)12, (ftnlen)8, (ftnlen)1); - } else { + dlatrs_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", normin, n, &a[ + a_offset], lda, &work[1], &su, &work[*n * 3 + 1], info, ( + ftnlen)5, (ftnlen)12, (ftnlen)8, (ftnlen)1); + } else { /* Multiply by inv(U**T). */ - dlatrs_((char *)"Upper", (char *)"Transpose", (char *)"Non-unit", normin, n, &a[a_offset], - lda, &work[1], &su, &work[*n * 3 + 1], info, (ftnlen)5, ( - ftnlen)9, (ftnlen)8, (ftnlen)1); + dlatrs_((char *)"Upper", (char *)"Transpose", (char *)"Non-unit", normin, n, &a[a_offset], + lda, &work[1], &su, &work[*n * 3 + 1], info, (ftnlen)5, ( + ftnlen)9, (ftnlen)8, (ftnlen)1); /* Multiply by inv(L**T). */ - dlatrs_((char *)"Lower", (char *)"Transpose", (char *)"Unit", normin, n, &a[a_offset], - lda, &work[1], &sl, &work[(*n << 1) + 1], info, (ftnlen)5, - (ftnlen)9, (ftnlen)4, (ftnlen)1); - } + dlatrs_((char *)"Lower", (char *)"Transpose", (char *)"Unit", normin, n, &a[a_offset], + lda, &work[1], &sl, &work[(*n << 1) + 1], info, (ftnlen)5, + (ftnlen)9, (ftnlen)4, (ftnlen)1); + } /* Divide X by 1/(SL*SU) if doing so will not cause overflow. */ - scale = sl * su; - *(unsigned char *)normin = 'Y'; - if (scale != 1.) { - ix = idamax_(n, &work[1], &c__1); - if (scale < (d__1 = work[ix], abs(d__1)) * smlnum || scale == 0.) - { - goto L20; - } - drscl_(n, &scale, &work[1], &c__1); - } - goto L10; + scale = sl * su; + *(unsigned char *)normin = 'Y'; + if (scale != 1.) { + ix = idamax_(n, &work[1], &c__1); + if (scale < (d__1 = work[ix], abs(d__1)) * smlnum || scale == 0.) + { + goto L20; + } + drscl_(n, &scale, &work[1], &c__1); + } + goto L10; } /* Compute the estimate of the reciprocal condition number. */ if (ainvnm != 0.) { - *rcond = 1. / ainvnm / *anorm; + *rcond = 1. / ainvnm / *anorm; } L20: @@ -309,5 +309,5 @@ L20: } /* dgecon_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgelq2.cpp b/lib/linalg/dgelq2.cpp index 6000253184..fec5ae2c50 100644 --- a/lib/linalg/dgelq2.cpp +++ b/lib/linalg/dgelq2.cpp @@ -1,13 +1,13 @@ /* fortran/dgelq2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -147,7 +147,7 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dgelq2_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *tau, doublereal *work, integer *info) + lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -155,11 +155,11 @@ f"> */ /* Local variables */ integer i__, k; doublereal aii; - extern /* Subroutine */ int dlarf_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, ftnlen), dlarfg_(integer *, doublereal *, - doublereal *, integer *, doublereal *), xerbla_(char *, integer *, - ftnlen); + extern /* Subroutine */ int dlarf_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen), dlarfg_(integer *, doublereal *, + doublereal *, integer *, doublereal *), xerbla_(char *, integer *, + ftnlen); /* -- LAPACK computational routine -- */ @@ -195,16 +195,16 @@ f"> */ /* Function Body */ *info = 0; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*m)) { - *info = -4; + *info = -4; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGELQ2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGELQ2", &i__1, (ftnlen)6); + return 0; } k = min(*m,*n); @@ -214,24 +214,24 @@ f"> */ /* Generate elementary reflector H(i) to annihilate A(i,i+1:n) */ - i__2 = *n - i__ + 1; + i__2 = *n - i__ + 1; /* Computing MIN */ - i__3 = i__ + 1; - dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3,*n) * a_dim1] - , lda, &tau[i__]); - if (i__ < *m) { + i__3 = i__ + 1; + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3,*n) * a_dim1] + , lda, &tau[i__]); + if (i__ < *m) { /* Apply H(i) to A(i+1:m,i:n) from the right */ - aii = a[i__ + i__ * a_dim1]; - a[i__ + i__ * a_dim1] = 1.; - i__2 = *m - i__; - i__3 = *n - i__ + 1; - dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[ - i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1], (ftnlen) - 5); - a[i__ + i__ * a_dim1] = aii; - } + aii = a[i__ + i__ * a_dim1]; + a[i__ + i__ * a_dim1] = 1.; + i__2 = *m - i__; + i__3 = *n - i__ + 1; + dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[ + i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1], (ftnlen) + 5); + a[i__ + i__ * a_dim1] = aii; + } /* L10: */ } return 0; @@ -241,5 +241,5 @@ f"> */ } /* dgelq2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgelqf.cpp b/lib/linalg/dgelqf.cpp index ede5b8198b..f6e60e5bcf 100644 --- a/lib/linalg/dgelqf.cpp +++ b/lib/linalg/dgelqf.cpp @@ -1,13 +1,13 @@ /* fortran/dgelqf.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -167,23 +167,23 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dgelqf_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) + lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, k, ib, nb, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int dgelq2_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *), dlarfb_(char *, - char *, char *, char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, - ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dgelq2_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *), dlarfb_(char *, + char *, char *, char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; @@ -221,33 +221,33 @@ f"> */ /* Function Body */ *info = 0; nb = ilaenv_(&c__1, (char *)"DGELQF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen) - 1); + 1); lwkopt = *m * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*m)) { - *info = -4; + *info = -4; } else if (*lwork < max(1,*m) && ! lquery) { - *info = -7; + *info = -7; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGELQF", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGELQF", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ k = min(*m,*n); if (k == 0) { - work[1] = 1.; - return 0; + work[1] = 1.; + return 0; } nbmin = 2; @@ -258,79 +258,79 @@ f"> */ /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DGELQF", (char *)" ", m, n, &c_n1, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); - if (nx < k) { + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DGELQF", (char *)" ", m, n, &c_n1, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < k) { /* Determine if workspace is large enough for blocked code. */ - ldwork = *m; - iws = ldwork * nb; - if (*lwork < iws) { + ldwork = *m; + iws = ldwork * nb; + if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ - nb = *lwork / ldwork; + nb = *lwork / ldwork; /* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DGELQF", (char *)" ", m, n, &c_n1, & - c_n1, (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); - } - } + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DGELQF", (char *)" ", m, n, &c_n1, & + c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } } if (nb >= nbmin && nb < k && nx < k) { /* Use blocked code initially */ - i__1 = k - nx; - i__2 = nb; - for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__1 = k - nx; + i__2 = nb; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ - i__3 = k - i__ + 1; - ib = min(i__3,nb); + i__3 = k - i__ + 1; + ib = min(i__3,nb); /* Compute the LQ factorization of the current block */ /* A(i:i+ib-1,i:n) */ - i__3 = *n - i__ + 1; - dgelq2_(&ib, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ - 1], &iinfo); - if (i__ + ib <= *m) { + i__3 = *n - i__ + 1; + dgelq2_(&ib, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ + 1], &iinfo); + if (i__ + ib <= *m) { /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__3 = *n - i__ + 1; - dlarft_((char *)"Forward", (char *)"Rowwise", &i__3, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, - (ftnlen)7); + i__3 = *n - i__ + 1; + dlarft_((char *)"Forward", (char *)"Rowwise", &i__3, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, + (ftnlen)7); /* Apply H to A(i+ib:m,i:n) from the right */ - i__3 = *m - i__ - ib + 1; - i__4 = *n - i__ + 1; - dlarfb_((char *)"Right", (char *)"No transpose", (char *)"Forward", (char *)"Rowwise", &i__3, - &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & - ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[ib + - 1], &ldwork, (ftnlen)5, (ftnlen)12, (ftnlen)7, ( - ftnlen)7); - } + i__3 = *m - i__ - ib + 1; + i__4 = *n - i__ + 1; + dlarfb_((char *)"Right", (char *)"No transpose", (char *)"Forward", (char *)"Rowwise", &i__3, + &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & + ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[ib + + 1], &ldwork, (ftnlen)5, (ftnlen)12, (ftnlen)7, ( + ftnlen)7); + } /* L10: */ - } + } } else { - i__ = 1; + i__ = 1; } /* Use unblocked code to factor the last or only block. */ if (i__ <= k) { - i__2 = *m - i__ + 1; - i__1 = *n - i__ + 1; - dgelq2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1] - , &iinfo); + i__2 = *m - i__ + 1; + i__1 = *n - i__ + 1; + dgelq2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1] + , &iinfo); } work[1] = (doublereal) iws; @@ -341,5 +341,5 @@ f"> */ } /* dgelqf_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgelsd.cpp b/lib/linalg/dgelsd.cpp index 7a74d30ef2..ffe7446f85 100644 --- a/lib/linalg/dgelsd.cpp +++ b/lib/linalg/dgelsd.cpp @@ -1,13 +1,13 @@ /* fortran/dgelsd.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -234,10 +234,10 @@ f"> */ /* > Osni Marques, LBNL/NERSC, USA \n */ /* ===================================================================== */ -/* Subroutine */ int dgelsd_(integer *m, integer *n, integer *nrhs, - doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * - s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, - integer *iwork, integer *info) +/* Subroutine */ int dgelsd_(integer *m, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * + s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, + integer *iwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; @@ -252,39 +252,39 @@ f"> */ doublereal sfmin; integer minmn, maxmn, itaup, itauq, mnthr, nwork; extern /* Subroutine */ int dlabad_(doublereal *, doublereal *), dgebrd_( - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *, - integer *); - extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, ftnlen); - extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, integer *), - dlalsd_(char *, integer *, integer *, integer *, doublereal *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, integer *, integer *, ftnlen), dlascl_(char *, - integer *, integer *, doublereal *, doublereal *, integer *, - integer *, doublereal *, integer *, integer *, ftnlen), dgeqrf_( - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, integer *), dlacpy_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - ftnlen), dlaset_(char *, integer *, integer *, doublereal *, - doublereal *, doublereal *, integer *, ftnlen), xerbla_(char *, - integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *); + extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, ftnlen); + extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *), + dlalsd_(char *, integer *, integer *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, integer *, ftnlen), dlascl_(char *, + integer *, integer *, doublereal *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, ftnlen), dgeqrf_( + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *), dlacpy_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), dlaset_(char *, integer *, integer *, doublereal *, + doublereal *, doublereal *, integer *, ftnlen), xerbla_(char *, + integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); doublereal bignum; - extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *, - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, integer *, - ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *, + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen, ftnlen); integer wlalsd; - extern /* Subroutine */ int dormlq_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dormlq_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); integer ldwork; - extern /* Subroutine */ int dormqr_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dormqr_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); integer liwork, minwrk, maxwrk; doublereal smlnum; logical lquery; @@ -332,22 +332,22 @@ f"> */ minmn = min(*m,*n); maxmn = max(*m,*n); mnthr = ilaenv_(&c__6, (char *)"DGELSD", (char *)" ", m, n, nrhs, &c_n1, (ftnlen)6, ( - ftnlen)1); + ftnlen)1); lquery = *lwork == -1; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*nrhs < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } else if (*ldb < max(1,maxmn)) { - *info = -7; + *info = -7; } smlsiz = ilaenv_(&c__9, (char *)"DGELSD", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( - ftnlen)6, (ftnlen)1); + ftnlen)6, (ftnlen)1); /* Compute workspace. */ /* (Note: Comments in the code beginning (char *)"Workspace:" describe the */ @@ -360,151 +360,151 @@ f"> */ liwork = 1; minmn = max(1,minmn); /* Computing MAX */ - i__1 = (integer) (log((doublereal) minmn / (doublereal) (smlsiz + 1)) / - log(2.)) + 1; + i__1 = (integer) (log((doublereal) minmn / (doublereal) (smlsiz + 1)) / + log(2.)) + 1; nlvl = max(i__1,0); if (*info == 0) { - maxwrk = 0; - liwork = minmn * 3 * nlvl + minmn * 11; - mm = *m; - if (*m >= *n && *m >= mnthr) { + maxwrk = 0; + liwork = minmn * 3 * nlvl + minmn * 11; + mm = *m; + if (*m >= *n && *m >= mnthr) { /* Path 1a - overdetermined, with many more rows than columns. */ - mm = *n; + mm = *n; /* Computing MAX */ - i__1 = maxwrk, i__2 = *n + *n * ilaenv_(&c__1, (char *)"DGEQRF", (char *)" ", m, - n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *n + *n * ilaenv_(&c__1, (char *)"DGEQRF", (char *)" ", m, + n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *n + *nrhs * ilaenv_(&c__1, (char *)"DORMQR", (char *)"LT", - m, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)2); - maxwrk = max(i__1,i__2); - } - if (*m >= *n) { + i__1 = maxwrk, i__2 = *n + *nrhs * ilaenv_(&c__1, (char *)"DORMQR", (char *)"LT", + m, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)2); + maxwrk = max(i__1,i__2); + } + if (*m >= *n) { /* Path 1 - overdetermined or exactly determined. */ /* Computing MAX */ - i__1 = maxwrk, i__2 = *n * 3 + (mm + *n) * ilaenv_(&c__1, (char *)"DGEBRD" - , (char *)" ", &mm, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *n * 3 + (mm + *n) * ilaenv_(&c__1, (char *)"DGEBRD" + , (char *)" ", &mm, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *n * 3 + *nrhs * ilaenv_(&c__1, (char *)"DORMBR", - (char *)"QLT", &mm, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)3); - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *n * 3 + *nrhs * ilaenv_(&c__1, (char *)"DORMBR", + (char *)"QLT", &mm, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *n * 3 + (*n - 1) * ilaenv_(&c__1, (char *)"DORMBR", - (char *)"PLN", n, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)3); - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *n * 3 + (*n - 1) * ilaenv_(&c__1, (char *)"DORMBR", + (char *)"PLN", n, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1,i__2); /* Computing 2nd power */ - i__1 = smlsiz + 1; - wlalsd = *n * 9 + (*n << 1) * smlsiz + (*n << 3) * nlvl + *n * * - nrhs + i__1 * i__1; + i__1 = smlsiz + 1; + wlalsd = *n * 9 + (*n << 1) * smlsiz + (*n << 3) * nlvl + *n * * + nrhs + i__1 * i__1; /* Computing MAX */ - i__1 = maxwrk, i__2 = *n * 3 + wlalsd; - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *n * 3 + wlalsd; + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = *n * 3 + mm, i__2 = *n * 3 + *nrhs, i__1 = max(i__1,i__2), - i__2 = *n * 3 + wlalsd; - minwrk = max(i__1,i__2); - } - if (*n > *m) { + i__1 = *n * 3 + mm, i__2 = *n * 3 + *nrhs, i__1 = max(i__1,i__2), + i__2 = *n * 3 + wlalsd; + minwrk = max(i__1,i__2); + } + if (*n > *m) { /* Computing 2nd power */ - i__1 = smlsiz + 1; - wlalsd = *m * 9 + (*m << 1) * smlsiz + (*m << 3) * nlvl + *m * * - nrhs + i__1 * i__1; - if (*n >= mnthr) { + i__1 = smlsiz + 1; + wlalsd = *m * 9 + (*m << 1) * smlsiz + (*m << 3) * nlvl + *m * * + nrhs + i__1 * i__1; + if (*n >= mnthr) { /* Path 2a - underdetermined, with many more columns */ /* than rows. */ - maxwrk = *m + *m * ilaenv_(&c__1, (char *)"DGELQF", (char *)" ", m, n, &c_n1, - &c_n1, (ftnlen)6, (ftnlen)1); + maxwrk = *m + *m * ilaenv_(&c__1, (char *)"DGELQF", (char *)" ", m, n, &c_n1, + &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + (*m << 1) * - ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, m, &c_n1, &c_n1, ( - ftnlen)6, (ftnlen)1); - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + (*m << 1) * + ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, m, &c_n1, &c_n1, ( + ftnlen)6, (ftnlen)1); + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + *nrhs * ilaenv_(& - c__1, (char *)"DORMBR", (char *)"QLT", m, nrhs, m, &c_n1, (ftnlen)6, ( - ftnlen)3); - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + *nrhs * ilaenv_(& + c__1, (char *)"DORMBR", (char *)"QLT", m, nrhs, m, &c_n1, (ftnlen)6, ( + ftnlen)3); + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + (*m - 1) * - ilaenv_(&c__1, (char *)"DORMBR", (char *)"PLN", m, nrhs, m, &c_n1, ( - ftnlen)6, (ftnlen)3); - maxwrk = max(i__1,i__2); - if (*nrhs > 1) { + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + (*m - 1) * + ilaenv_(&c__1, (char *)"DORMBR", (char *)"PLN", m, nrhs, m, &c_n1, ( + ftnlen)6, (ftnlen)3); + maxwrk = max(i__1,i__2); + if (*nrhs > 1) { /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + *m + *m * *nrhs; - maxwrk = max(i__1,i__2); - } else { + i__1 = maxwrk, i__2 = *m * *m + *m + *m * *nrhs; + maxwrk = max(i__1,i__2); + } else { /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 1); - maxwrk = max(i__1,i__2); - } + i__1 = maxwrk, i__2 = *m * *m + (*m << 1); + maxwrk = max(i__1,i__2); + } /* Computing MAX */ - i__1 = maxwrk, i__2 = *m + *nrhs * ilaenv_(&c__1, (char *)"DORMLQ", - (char *)"LT", n, nrhs, m, &c_n1, (ftnlen)6, (ftnlen)2); - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *m + *nrhs * ilaenv_(&c__1, (char *)"DORMLQ", + (char *)"LT", n, nrhs, m, &c_n1, (ftnlen)6, (ftnlen)2); + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + wlalsd; - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + wlalsd; + maxwrk = max(i__1,i__2); /* XXX: Ensure the Path 2a case below is triggered. The workspace */ /* calculation should use queries for all routines eventually. */ /* Computing MAX */ /* Computing MAX */ - i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = - max(i__3,*nrhs), i__4 = *n - *m * 3; - i__1 = maxwrk, i__2 = (*m << 2) + *m * *m + max(i__3,i__4); - maxwrk = max(i__1,i__2); - } else { + i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = + max(i__3,*nrhs), i__4 = *n - *m * 3; + i__1 = maxwrk, i__2 = (*m << 2) + *m * *m + max(i__3,i__4); + maxwrk = max(i__1,i__2); + } else { /* Path 2 - remaining underdetermined cases. */ - maxwrk = *m * 3 + (*n + *m) * ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, - n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + maxwrk = *m * 3 + (*n + *m) * ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, + n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * 3 + *nrhs * ilaenv_(&c__1, (char *)"DORMBR" - , (char *)"QLT", m, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)3); - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *m * 3 + *nrhs * ilaenv_(&c__1, (char *)"DORMBR" + , (char *)"QLT", m, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * 3 + *m * ilaenv_(&c__1, (char *)"DORMBR", - (char *)"PLN", n, nrhs, m, &c_n1, (ftnlen)6, (ftnlen)3); - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *m * 3 + *m * ilaenv_(&c__1, (char *)"DORMBR", + (char *)"PLN", n, nrhs, m, &c_n1, (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * 3 + wlalsd; - maxwrk = max(i__1,i__2); - } + i__1 = maxwrk, i__2 = *m * 3 + wlalsd; + maxwrk = max(i__1,i__2); + } /* Computing MAX */ - i__1 = *m * 3 + *nrhs, i__2 = *m * 3 + *m, i__1 = max(i__1,i__2), - i__2 = *m * 3 + wlalsd; - minwrk = max(i__1,i__2); - } - minwrk = min(minwrk,maxwrk); - work[1] = (doublereal) maxwrk; - iwork[1] = liwork; - if (*lwork < minwrk && ! lquery) { - *info = -12; - } + i__1 = *m * 3 + *nrhs, i__2 = *m * 3 + *m, i__1 = max(i__1,i__2), + i__2 = *m * 3 + wlalsd; + minwrk = max(i__1,i__2); + } + minwrk = min(minwrk,maxwrk); + work[1] = (doublereal) maxwrk; + iwork[1] = liwork; + if (*lwork < minwrk && ! lquery) { + *info = -12; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGELSD", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGELSD", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - goto L10; + goto L10; } /* Quick return if possible. */ if (*m == 0 || *n == 0) { - *rank = 0; - return 0; + *rank = 0; + return 0; } /* Get machine parameters. */ @@ -523,26 +523,26 @@ f"> */ /* Scale matrix norm up to SMLNUM. */ - dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, - info, (ftnlen)1); - iascl = 1; + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, + info, (ftnlen)1); + iascl = 1; } else if (anrm > bignum) { /* Scale matrix norm down to BIGNUM. */ - dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, - info, (ftnlen)1); - iascl = 2; + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, + info, (ftnlen)1); + iascl = 2; } else if (anrm == 0.) { /* Matrix all zero. Return zero solution. */ - i__1 = max(*m,*n); - dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[b_offset], ldb, (ftnlen) - 1); - dlaset_((char *)"F", &minmn, &c__1, &c_b82, &c_b82, &s[1], &c__1, (ftnlen)1); - *rank = 0; - goto L10; + i__1 = max(*m,*n); + dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[b_offset], ldb, (ftnlen) + 1); + dlaset_((char *)"F", &minmn, &c__1, &c_b82, &c_b82, &s[1], &c__1, (ftnlen)1); + *rank = 0; + goto L10; } /* Scale B if max entry outside range [SMLNUM,BIGNUM]. */ @@ -553,24 +553,24 @@ f"> */ /* Scale matrix norm up to SMLNUM. */ - dlascl_((char *)"G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - ibscl = 1; + dlascl_((char *)"G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + ibscl = 1; } else if (bnrm > bignum) { /* Scale matrix norm down to BIGNUM. */ - dlascl_((char *)"G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - ibscl = 2; + dlascl_((char *)"G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + ibscl = 2; } /* If M < N make sure certain entries of B are zero. */ if (*m < *n) { - i__1 = *n - *m; - dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[*m + 1 + b_dim1], ldb, ( - ftnlen)1); + i__1 = *n - *m; + dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[*m + 1 + b_dim1], ldb, ( + ftnlen)1); } /* Overdetermined case. */ @@ -579,227 +579,227 @@ f"> */ /* Path 1 - overdetermined or exactly determined. */ - mm = *m; - if (*m >= mnthr) { + mm = *m; + if (*m >= mnthr) { /* Path 1a - overdetermined, with many more rows than columns. */ - mm = *n; - itau = 1; - nwork = itau + *n; + mm = *n; + itau = 1; + nwork = itau + *n; /* Compute A=Q*R. */ /* (Workspace: need 2*N, prefer N+N*NB) */ - i__1 = *lwork - nwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, - info); + i__1 = *lwork - nwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, + info); /* Multiply B by transpose(Q). */ /* (Workspace: need N+NRHS, prefer N+NRHS*NB) */ - i__1 = *lwork - nwork + 1; - dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itau], &b[ - b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( - ftnlen)1); + i__1 = *lwork - nwork + 1; + dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itau], &b[ + b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( + ftnlen)1); /* Zero out below R. */ - if (*n > 1) { - i__1 = *n - 1; - i__2 = *n - 1; - dlaset_((char *)"L", &i__1, &i__2, &c_b82, &c_b82, &a[a_dim1 + 2], - lda, (ftnlen)1); - } - } + if (*n > 1) { + i__1 = *n - 1; + i__2 = *n - 1; + dlaset_((char *)"L", &i__1, &i__2, &c_b82, &c_b82, &a[a_dim1 + 2], + lda, (ftnlen)1); + } + } - ie = 1; - itauq = ie + *n; - itaup = itauq + *n; - nwork = itaup + *n; + ie = 1; + itauq = ie + *n; + itaup = itauq + *n; + nwork = itaup + *n; /* Bidiagonalize R in A. */ /* (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB) */ - i__1 = *lwork - nwork + 1; - dgebrd_(&mm, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & - work[itaup], &work[nwork], &i__1, info); + i__1 = *lwork - nwork + 1; + dgebrd_(&mm, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & + work[itaup], &work[nwork], &i__1, info); /* Multiply B by transpose of left bidiagonalizing vectors of R. */ /* (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB) */ - i__1 = *lwork - nwork + 1; - dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, &work[itauq], - &b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, &work[itauq], + &b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); /* Solve the bidiagonal least squares problem. */ - dlalsd_((char *)"U", &smlsiz, n, nrhs, &s[1], &work[ie], &b[b_offset], ldb, - rcond, rank, &work[nwork], &iwork[1], info, (ftnlen)1); - if (*info != 0) { - goto L10; - } + dlalsd_((char *)"U", &smlsiz, n, nrhs, &s[1], &work[ie], &b[b_offset], ldb, + rcond, rank, &work[nwork], &iwork[1], info, (ftnlen)1); + if (*info != 0) { + goto L10; + } /* Multiply B by right bidiagonalizing vectors of R. */ - i__1 = *lwork - nwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"N", n, nrhs, n, &a[a_offset], lda, &work[itaup], & - b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"N", n, nrhs, n, &a[a_offset], lda, &work[itaup], & + b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); } else /* if(complicated condition) */ { /* Computing MAX */ - i__1 = *m, i__2 = (*m << 1) - 4, i__1 = max(i__1,i__2), i__1 = max( - i__1,*nrhs), i__2 = *n - *m * 3, i__1 = max(i__1,i__2); - if (*n >= mnthr && *lwork >= (*m << 2) + *m * *m + max(i__1,wlalsd)) { + i__1 = *m, i__2 = (*m << 1) - 4, i__1 = max(i__1,i__2), i__1 = max( + i__1,*nrhs), i__2 = *n - *m * 3, i__1 = max(i__1,i__2); + if (*n >= mnthr && *lwork >= (*m << 2) + *m * *m + max(i__1,wlalsd)) { /* Path 2a - underdetermined, with many more columns than rows */ /* and sufficient workspace for an efficient algorithm. */ - ldwork = *m; + ldwork = *m; /* Computing MAX */ /* Computing MAX */ - i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = - max(i__3,*nrhs), i__4 = *n - *m * 3; - i__1 = (*m << 2) + *m * *lda + max(i__3,i__4), i__2 = *m * *lda + - *m + *m * *nrhs, i__1 = max(i__1,i__2), i__2 = (*m << 2) - + *m * *lda + wlalsd; - if (*lwork >= max(i__1,i__2)) { - ldwork = *lda; - } - itau = 1; - nwork = *m + 1; + i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = + max(i__3,*nrhs), i__4 = *n - *m * 3; + i__1 = (*m << 2) + *m * *lda + max(i__3,i__4), i__2 = *m * *lda + + *m + *m * *nrhs, i__1 = max(i__1,i__2), i__2 = (*m << 2) + + *m * *lda + wlalsd; + if (*lwork >= max(i__1,i__2)) { + ldwork = *lda; + } + itau = 1; + nwork = *m + 1; /* Compute A=L*Q. */ /* (Workspace: need 2*M, prefer M+M*NB) */ - i__1 = *lwork - nwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, - info); - il = nwork; + i__1 = *lwork - nwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, + info); + il = nwork; /* Copy L to WORK(IL), zeroing out above its diagonal. */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[il], &ldwork, (ftnlen) - 1); - i__1 = *m - 1; - i__2 = *m - 1; - dlaset_((char *)"U", &i__1, &i__2, &c_b82, &c_b82, &work[il + ldwork], & - ldwork, (ftnlen)1); - ie = il + ldwork * *m; - itauq = ie + *m; - itaup = itauq + *m; - nwork = itaup + *m; + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[il], &ldwork, (ftnlen) + 1); + i__1 = *m - 1; + i__2 = *m - 1; + dlaset_((char *)"U", &i__1, &i__2, &c_b82, &c_b82, &work[il + ldwork], & + ldwork, (ftnlen)1); + ie = il + ldwork * *m; + itauq = ie + *m; + itaup = itauq + *m; + nwork = itaup + *m; /* Bidiagonalize L in WORK(IL). */ /* (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB) */ - i__1 = *lwork - nwork + 1; - dgebrd_(m, m, &work[il], &ldwork, &s[1], &work[ie], &work[itauq], - &work[itaup], &work[nwork], &i__1, info); + i__1 = *lwork - nwork + 1; + dgebrd_(m, m, &work[il], &ldwork, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[nwork], &i__1, info); /* Multiply B by transpose of left bidiagonalizing vectors of L. */ /* (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB) */ - i__1 = *lwork - nwork + 1; - dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &work[il], &ldwork, &work[ - itauq], &b[b_offset], ldb, &work[nwork], &i__1, info, ( - ftnlen)1, (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &work[il], &ldwork, &work[ + itauq], &b[b_offset], ldb, &work[nwork], &i__1, info, ( + ftnlen)1, (ftnlen)1, (ftnlen)1); /* Solve the bidiagonal least squares problem. */ - dlalsd_((char *)"U", &smlsiz, m, nrhs, &s[1], &work[ie], &b[b_offset], - ldb, rcond, rank, &work[nwork], &iwork[1], info, (ftnlen) - 1); - if (*info != 0) { - goto L10; - } + dlalsd_((char *)"U", &smlsiz, m, nrhs, &s[1], &work[ie], &b[b_offset], + ldb, rcond, rank, &work[nwork], &iwork[1], info, (ftnlen) + 1); + if (*info != 0) { + goto L10; + } /* Multiply B by right bidiagonalizing vectors of L. */ - i__1 = *lwork - nwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"N", m, nrhs, m, &work[il], &ldwork, &work[ - itaup], &b[b_offset], ldb, &work[nwork], &i__1, info, ( - ftnlen)1, (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"N", m, nrhs, m, &work[il], &ldwork, &work[ + itaup], &b[b_offset], ldb, &work[nwork], &i__1, info, ( + ftnlen)1, (ftnlen)1, (ftnlen)1); /* Zero out below first M rows of B. */ - i__1 = *n - *m; - dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[*m + 1 + b_dim1], - ldb, (ftnlen)1); - nwork = itau + *m; + i__1 = *n - *m; + dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[*m + 1 + b_dim1], + ldb, (ftnlen)1); + nwork = itau + *m; /* Multiply transpose(Q) by B. */ /* (Workspace: need M+NRHS, prefer M+NRHS*NB) */ - i__1 = *lwork - nwork + 1; - dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, &work[itau], &b[ - b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( - ftnlen)1); + i__1 = *lwork - nwork + 1; + dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, &work[itau], &b[ + b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( + ftnlen)1); - } else { + } else { /* Path 2 - remaining underdetermined cases. */ - ie = 1; - itauq = ie + *m; - itaup = itauq + *m; - nwork = itaup + *m; + ie = 1; + itauq = ie + *m; + itaup = itauq + *m; + nwork = itaup + *m; /* Bidiagonalize A. */ /* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ - i__1 = *lwork - nwork + 1; - dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & - work[itaup], &work[nwork], &i__1, info); + i__1 = *lwork - nwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & + work[itaup], &work[nwork], &i__1, info); /* Multiply B by transpose of left bidiagonalizing vectors. */ /* (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB) */ - i__1 = *lwork - nwork + 1; - dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itauq] - , &b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, - (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itauq] + , &b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, + (ftnlen)1, (ftnlen)1); /* Solve the bidiagonal least squares problem. */ - dlalsd_((char *)"L", &smlsiz, m, nrhs, &s[1], &work[ie], &b[b_offset], - ldb, rcond, rank, &work[nwork], &iwork[1], info, (ftnlen) - 1); - if (*info != 0) { - goto L10; - } + dlalsd_((char *)"L", &smlsiz, m, nrhs, &s[1], &work[ie], &b[b_offset], + ldb, rcond, rank, &work[nwork], &iwork[1], info, (ftnlen) + 1); + if (*info != 0) { + goto L10; + } /* Multiply B by right bidiagonalizing vectors of A. */ - i__1 = *lwork - nwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"N", n, nrhs, m, &a[a_offset], lda, &work[itaup] - , &b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, - (ftnlen)1, (ftnlen)1); + i__1 = *lwork - nwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"N", n, nrhs, m, &a[a_offset], lda, &work[itaup] + , &b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, + (ftnlen)1, (ftnlen)1); - } + } } /* Undo scaling. */ if (iascl == 1) { - dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & - minmn, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & + minmn, info, (ftnlen)1); } else if (iascl == 2) { - dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & - minmn, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & + minmn, info, (ftnlen)1); } if (ibscl == 1) { - dlascl_((char *)"G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); } else if (ibscl == 2) { - dlascl_((char *)"G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); } L10: @@ -812,5 +812,5 @@ L10: } /* dgelsd_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgelss.cpp b/lib/linalg/dgelss.cpp index 6377208923..86036f9179 100644 --- a/lib/linalg/dgelss.cpp +++ b/lib/linalg/dgelss.cpp @@ -1,13 +1,13 @@ /* fortran/dgelss.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -196,10 +196,10 @@ f"> */ /* > \ingroup doubleGEsolve */ /* ===================================================================== */ -/* Subroutine */ int dgelss_(integer *m, integer *n, integer *nrhs, - doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * - s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, - integer *info) +/* Subroutine */ int dgelss_(integer *m, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * + s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, + integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; @@ -208,58 +208,58 @@ f"> */ /* Local variables */ integer i__, bl, ie, il, mm; doublereal dum[1], eps, thr, anrm, bnrm; - integer itau, lwork_dgebrd__, lwork_dgelqf__, lwork_dgeqrf__, - lwork_dorgbr__, lwork_dormbr__, lwork_dormlq__, lwork_dormqr__; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer itau, lwork_dgebrd__, lwork_dgelqf__, lwork_dgeqrf__, + lwork_dorgbr__, lwork_dormbr__, lwork_dormlq__, lwork_dormqr__; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); integer iascl, ibscl; - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen), drscl_(integer *, - doublereal *, doublereal *, integer *); + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen), drscl_(integer *, + doublereal *, doublereal *, integer *); integer chunk; doublereal sfmin; integer minmn; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); integer maxmn, itaup, itauq, mnthr, iwork; extern /* Subroutine */ int dlabad_(doublereal *, doublereal *), dgebrd_( - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *, - integer *); - extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, ftnlen); + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *); + extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, ftnlen); integer bdspac; - extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, integer *), - dlascl_(char *, integer *, integer *, doublereal *, doublereal *, - integer *, integer *, doublereal *, integer *, integer *, ftnlen), - dgeqrf_(integer *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, integer *), dlacpy_(char *, - integer *, integer *, doublereal *, integer *, doublereal *, - integer *, ftnlen), dlaset_(char *, integer *, integer *, - doublereal *, doublereal *, doublereal *, integer *, ftnlen), - xerbla_(char *, integer *, ftnlen), dbdsqr_(char *, integer *, - integer *, integer *, integer *, doublereal *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen), dorgbr_(char *, - integer *, integer *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, integer *, ftnlen); + extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, + integer *, integer *, doublereal *, integer *, integer *, ftnlen), + dgeqrf_(integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *), dlacpy_(char *, + integer *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen), dlaset_(char *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen), dbdsqr_(char *, integer *, + integer *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen), dorgbr_(char *, + integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *, ftnlen); doublereal bignum; - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *, - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, integer *, - ftnlen, ftnlen, ftnlen), dormlq_(char *, char *, integer *, - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, integer *, - ftnlen, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *, + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen, ftnlen), dormlq_(char *, char *, integer *, + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen); integer ldwork; - extern /* Subroutine */ int dormqr_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dormqr_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); integer minwrk, maxwrk; doublereal smlnum; logical lquery; @@ -308,15 +308,15 @@ f"> */ maxmn = max(*m,*n); lquery = *lwork == -1; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*nrhs < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } else if (*ldb < max(1,maxmn)) { - *info = -7; + *info = -7; } /* Compute workspace */ @@ -327,193 +327,193 @@ f"> */ /* following subroutine, as returned by ILAENV.) */ if (*info == 0) { - minwrk = 1; - maxwrk = 1; - if (minmn > 0) { - mm = *m; - mnthr = ilaenv_(&c__6, (char *)"DGELSS", (char *)" ", m, n, nrhs, &c_n1, (ftnlen) - 6, (ftnlen)1); - if (*m >= *n && *m >= mnthr) { + minwrk = 1; + maxwrk = 1; + if (minmn > 0) { + mm = *m; + mnthr = ilaenv_(&c__6, (char *)"DGELSS", (char *)" ", m, n, nrhs, &c_n1, (ftnlen) + 6, (ftnlen)1); + if (*m >= *n && *m >= mnthr) { /* Path 1a - overdetermined, with many more rows than */ /* columns */ /* Compute space needed for DGEQRF */ - dgeqrf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, info); - lwork_dgeqrf__ = (integer) dum[0]; + dgeqrf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, info); + lwork_dgeqrf__ = (integer) dum[0]; /* Compute space needed for DORMQR */ - dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, dum, &b[ - b_offset], ldb, dum, &c_n1, info, (ftnlen)1, (ftnlen) - 1); - lwork_dormqr__ = (integer) dum[0]; - mm = *n; + dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, dum, &b[ + b_offset], ldb, dum, &c_n1, info, (ftnlen)1, (ftnlen) + 1); + lwork_dormqr__ = (integer) dum[0]; + mm = *n; /* Computing MAX */ - i__1 = maxwrk, i__2 = *n + lwork_dgeqrf__; - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *n + lwork_dgeqrf__; + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *n + lwork_dormqr__; - maxwrk = max(i__1,i__2); - } - if (*m >= *n) { + i__1 = maxwrk, i__2 = *n + lwork_dormqr__; + maxwrk = max(i__1,i__2); + } + if (*m >= *n) { /* Path 1 - overdetermined or exactly determined */ /* Compute workspace needed for DBDSQR */ /* Computing MAX */ - i__1 = 1, i__2 = *n * 5; - bdspac = max(i__1,i__2); + i__1 = 1, i__2 = *n * 5; + bdspac = max(i__1,i__2); /* Compute space needed for DGEBRD */ - dgebrd_(&mm, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, - &c_n1, info); - lwork_dgebrd__ = (integer) dum[0]; + dgebrd_(&mm, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, + &c_n1, info); + lwork_dgebrd__ = (integer) dum[0]; /* Compute space needed for DORMBR */ - dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, dum, & - b[b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - lwork_dormbr__ = (integer) dum[0]; + dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, dum, & + b[b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + lwork_dormbr__ = (integer) dum[0]; /* Compute space needed for DORGBR */ - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, - info, (ftnlen)1); - lwork_dorgbr__ = (integer) dum[0]; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, + info, (ftnlen)1); + lwork_dorgbr__ = (integer) dum[0]; /* Compute total workspace needed */ /* Computing MAX */ - i__1 = maxwrk, i__2 = *n * 3 + lwork_dgebrd__; - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *n * 3 + lwork_dgebrd__; + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *n * 3 + lwork_dormbr__; - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *n * 3 + lwork_dormbr__; + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *n * 3 + lwork_dorgbr__; - maxwrk = max(i__1,i__2); - maxwrk = max(maxwrk,bdspac); + i__1 = maxwrk, i__2 = *n * 3 + lwork_dorgbr__; + maxwrk = max(i__1,i__2); + maxwrk = max(maxwrk,bdspac); /* Computing MAX */ - i__1 = maxwrk, i__2 = *n * *nrhs; - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *n * *nrhs; + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = *n * 3 + mm, i__2 = *n * 3 + *nrhs, i__1 = max(i__1, - i__2); - minwrk = max(i__1,bdspac); - maxwrk = max(minwrk,maxwrk); - } - if (*n > *m) { + i__1 = *n * 3 + mm, i__2 = *n * 3 + *nrhs, i__1 = max(i__1, + i__2); + minwrk = max(i__1,bdspac); + maxwrk = max(minwrk,maxwrk); + } + if (*n > *m) { /* Compute workspace needed for DBDSQR */ /* Computing MAX */ - i__1 = 1, i__2 = *m * 5; - bdspac = max(i__1,i__2); + i__1 = 1, i__2 = *m * 5; + bdspac = max(i__1,i__2); /* Computing MAX */ - i__1 = *m * 3 + *nrhs, i__2 = *m * 3 + *n, i__1 = max(i__1, - i__2); - minwrk = max(i__1,bdspac); - if (*n >= mnthr) { + i__1 = *m * 3 + *nrhs, i__2 = *m * 3 + *n, i__1 = max(i__1, + i__2); + minwrk = max(i__1,bdspac); + if (*n >= mnthr) { /* Path 2a - underdetermined, with many more columns */ /* than rows */ /* Compute space needed for DGELQF */ - dgelqf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, info); - lwork_dgelqf__ = (integer) dum[0]; + dgelqf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, info); + lwork_dgelqf__ = (integer) dum[0]; /* Compute space needed for DGEBRD */ - dgebrd_(m, m, &a[a_offset], lda, &s[1], dum, dum, dum, - dum, &c_n1, info); - lwork_dgebrd__ = (integer) dum[0]; + dgebrd_(m, m, &a[a_offset], lda, &s[1], dum, dum, dum, + dum, &c_n1, info); + lwork_dgebrd__ = (integer) dum[0]; /* Compute space needed for DORMBR */ - dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, dum, - &b[b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - lwork_dormbr__ = (integer) dum[0]; + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, dum, + &b[b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + lwork_dormbr__ = (integer) dum[0]; /* Compute space needed for DORGBR */ - dorgbr_((char *)"P", m, m, m, &a[a_offset], lda, dum, dum, &c_n1, - info, (ftnlen)1); - lwork_dorgbr__ = (integer) dum[0]; + dorgbr_((char *)"P", m, m, m, &a[a_offset], lda, dum, dum, &c_n1, + info, (ftnlen)1); + lwork_dorgbr__ = (integer) dum[0]; /* Compute space needed for DORMLQ */ - dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, dum, &b[ - b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( - ftnlen)1); - lwork_dormlq__ = (integer) dum[0]; + dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, dum, &b[ + b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( + ftnlen)1); + lwork_dormlq__ = (integer) dum[0]; /* Compute total workspace needed */ - maxwrk = *m + lwork_dgelqf__; + maxwrk = *m + lwork_dgelqf__; /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + - lwork_dgebrd__; - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + + lwork_dgebrd__; + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + - lwork_dormbr__; - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + + lwork_dormbr__; + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + - lwork_dorgbr__; - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + + lwork_dorgbr__; + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + *m + bdspac; - maxwrk = max(i__1,i__2); - if (*nrhs > 1) { + i__1 = maxwrk, i__2 = *m * *m + *m + bdspac; + maxwrk = max(i__1,i__2); + if (*nrhs > 1) { /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + *m + *m * *nrhs; - maxwrk = max(i__1,i__2); - } else { + i__1 = maxwrk, i__2 = *m * *m + *m + *m * *nrhs; + maxwrk = max(i__1,i__2); + } else { /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 1); - maxwrk = max(i__1,i__2); - } + i__1 = maxwrk, i__2 = *m * *m + (*m << 1); + maxwrk = max(i__1,i__2); + } /* Computing MAX */ - i__1 = maxwrk, i__2 = *m + lwork_dormlq__; - maxwrk = max(i__1,i__2); - } else { + i__1 = maxwrk, i__2 = *m + lwork_dormlq__; + maxwrk = max(i__1,i__2); + } else { /* Path 2 - underdetermined */ /* Compute space needed for DGEBRD */ - dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, - dum, &c_n1, info); - lwork_dgebrd__ = (integer) dum[0]; + dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, + dum, &c_n1, info); + lwork_dgebrd__ = (integer) dum[0]; /* Compute space needed for DORMBR */ - dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &a[a_offset], lda, dum, - &b[b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - lwork_dormbr__ = (integer) dum[0]; + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &a[a_offset], lda, dum, + &b[b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + lwork_dormbr__ = (integer) dum[0]; /* Compute space needed for DORGBR */ - dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, dum, dum, &c_n1, - info, (ftnlen)1); - lwork_dorgbr__ = (integer) dum[0]; - maxwrk = *m * 3 + lwork_dgebrd__; + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, dum, dum, &c_n1, + info, (ftnlen)1); + lwork_dorgbr__ = (integer) dum[0]; + maxwrk = *m * 3 + lwork_dgebrd__; /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * 3 + lwork_dormbr__; - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *m * 3 + lwork_dormbr__; + maxwrk = max(i__1,i__2); /* Computing MAX */ - i__1 = maxwrk, i__2 = *m * 3 + lwork_dorgbr__; - maxwrk = max(i__1,i__2); - maxwrk = max(maxwrk,bdspac); + i__1 = maxwrk, i__2 = *m * 3 + lwork_dorgbr__; + maxwrk = max(i__1,i__2); + maxwrk = max(maxwrk,bdspac); /* Computing MAX */ - i__1 = maxwrk, i__2 = *n * *nrhs; - maxwrk = max(i__1,i__2); - } - } - maxwrk = max(minwrk,maxwrk); - } - work[1] = (doublereal) maxwrk; + i__1 = maxwrk, i__2 = *n * *nrhs; + maxwrk = max(i__1,i__2); + } + } + maxwrk = max(minwrk,maxwrk); + } + work[1] = (doublereal) maxwrk; - if (*lwork < minwrk && ! lquery) { - *info = -12; - } + if (*lwork < minwrk && ! lquery) { + *info = -12; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGELSS", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGELSS", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { - *rank = 0; - return 0; + *rank = 0; + return 0; } /* Get machine parameters */ @@ -532,26 +532,26 @@ f"> */ /* Scale matrix norm up to SMLNUM */ - dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, - info, (ftnlen)1); - iascl = 1; + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, + info, (ftnlen)1); + iascl = 1; } else if (anrm > bignum) { /* Scale matrix norm down to BIGNUM */ - dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, - info, (ftnlen)1); - iascl = 2; + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, + info, (ftnlen)1); + iascl = 2; } else if (anrm == 0.) { /* Matrix all zero. Return zero solution. */ - i__1 = max(*m,*n); - dlaset_((char *)"F", &i__1, nrhs, &c_b46, &c_b46, &b[b_offset], ldb, (ftnlen) - 1); - dlaset_((char *)"F", &minmn, &c__1, &c_b46, &c_b46, &s[1], &minmn, (ftnlen)1); - *rank = 0; - goto L70; + i__1 = max(*m,*n); + dlaset_((char *)"F", &i__1, nrhs, &c_b46, &c_b46, &b[b_offset], ldb, (ftnlen) + 1); + dlaset_((char *)"F", &minmn, &c__1, &c_b46, &c_b46, &s[1], &minmn, (ftnlen)1); + *rank = 0; + goto L70; } /* Scale B if max element outside range [SMLNUM,BIGNUM] */ @@ -562,16 +562,16 @@ f"> */ /* Scale matrix norm up to SMLNUM */ - dlascl_((char *)"G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - ibscl = 1; + dlascl_((char *)"G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + ibscl = 1; } else if (bnrm > bignum) { /* Scale matrix norm down to BIGNUM */ - dlascl_((char *)"G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - ibscl = 2; + dlascl_((char *)"G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + ibscl = 2; } /* Overdetermined case */ @@ -580,399 +580,399 @@ f"> */ /* Path 1 - overdetermined or exactly determined */ - mm = *m; - if (*m >= mnthr) { + mm = *m; + if (*m >= mnthr) { /* Path 1a - overdetermined, with many more rows than columns */ - mm = *n; - itau = 1; - iwork = itau + *n; + mm = *n; + itau = 1; + iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need 2*N, prefer N+N*NB) */ - i__1 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__1, - info); + i__1 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__1, + info); /* Multiply B by transpose(Q) */ /* (Workspace: need N+NRHS, prefer N+NRHS*NB) */ - i__1 = *lwork - iwork + 1; - dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itau], &b[ - b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, ( - ftnlen)1); + i__1 = *lwork - iwork + 1; + dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itau], &b[ + b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, ( + ftnlen)1); /* Zero out below R */ - if (*n > 1) { - i__1 = *n - 1; - i__2 = *n - 1; - dlaset_((char *)"L", &i__1, &i__2, &c_b46, &c_b46, &a[a_dim1 + 2], - lda, (ftnlen)1); - } - } + if (*n > 1) { + i__1 = *n - 1; + i__2 = *n - 1; + dlaset_((char *)"L", &i__1, &i__2, &c_b46, &c_b46, &a[a_dim1 + 2], + lda, (ftnlen)1); + } + } - ie = 1; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + ie = 1; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in A */ /* (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB) */ - i__1 = *lwork - iwork + 1; - dgebrd_(&mm, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & - work[itaup], &work[iwork], &i__1, info); + i__1 = *lwork - iwork + 1; + dgebrd_(&mm, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & + work[itaup], &work[iwork], &i__1, info); /* Multiply B by transpose of left bidiagonalizing vectors of R */ /* (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB) */ - i__1 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, &work[itauq], - &b[b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); + i__1 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, &work[itauq], + &b[b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); /* Generate right bidiagonalizing vectors of R in A */ /* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ - i__1 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], & - i__1, info, (ftnlen)1); - iwork = ie + *n; + i__1 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], & + i__1, info, (ftnlen)1); + iwork = ie + *n; /* Perform bidiagonal QR iteration */ /* multiply B by transpose of left singular vectors */ /* compute right singular vectors in A */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, n, &c__0, nrhs, &s[1], &work[ie], &a[a_offset], lda, - dum, &c__1, &b[b_offset], ldb, &work[iwork], info, (ftnlen)1); - if (*info != 0) { - goto L70; - } + dbdsqr_((char *)"U", n, n, &c__0, nrhs, &s[1], &work[ie], &a[a_offset], lda, + dum, &c__1, &b[b_offset], ldb, &work[iwork], info, (ftnlen)1); + if (*info != 0) { + goto L70; + } /* Multiply B by reciprocals of singular values */ /* Computing MAX */ - d__1 = *rcond * s[1]; - thr = max(d__1,sfmin); - if (*rcond < 0.) { + d__1 = *rcond * s[1]; + thr = max(d__1,sfmin); + if (*rcond < 0.) { /* Computing MAX */ - d__1 = eps * s[1]; - thr = max(d__1,sfmin); - } - *rank = 0; - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - if (s[i__] > thr) { - drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); - ++(*rank); - } else { - dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1], - ldb, (ftnlen)1); - } + d__1 = eps * s[1]; + thr = max(d__1,sfmin); + } + *rank = 0; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + if (s[i__] > thr) { + drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); + ++(*rank); + } else { + dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1], + ldb, (ftnlen)1); + } /* L10: */ - } + } /* Multiply B by right singular vectors */ /* (Workspace: need N, prefer N*NRHS) */ - if (*lwork >= *ldb * *nrhs && *nrhs > 1) { - dgemm_((char *)"T", (char *)"N", n, nrhs, n, &c_b79, &a[a_offset], lda, &b[ - b_offset], ldb, &c_b46, &work[1], ldb, (ftnlen)1, (ftnlen) - 1); - dlacpy_((char *)"G", n, nrhs, &work[1], ldb, &b[b_offset], ldb, (ftnlen)1) - ; - } else if (*nrhs > 1) { - chunk = *lwork / *n; - i__1 = *nrhs; - i__2 = chunk; - for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + if (*lwork >= *ldb * *nrhs && *nrhs > 1) { + dgemm_((char *)"T", (char *)"N", n, nrhs, n, &c_b79, &a[a_offset], lda, &b[ + b_offset], ldb, &c_b46, &work[1], ldb, (ftnlen)1, (ftnlen) + 1); + dlacpy_((char *)"G", n, nrhs, &work[1], ldb, &b[b_offset], ldb, (ftnlen)1) + ; + } else if (*nrhs > 1) { + chunk = *lwork / *n; + i__1 = *nrhs; + i__2 = chunk; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ - i__3 = *nrhs - i__ + 1; - bl = min(i__3,chunk); - dgemm_((char *)"T", (char *)"N", n, &bl, n, &c_b79, &a[a_offset], lda, &b[i__ - * b_dim1 + 1], ldb, &c_b46, &work[1], n, (ftnlen)1, ( - ftnlen)1); - dlacpy_((char *)"G", n, &bl, &work[1], n, &b[i__ * b_dim1 + 1], ldb, ( - ftnlen)1); + i__3 = *nrhs - i__ + 1; + bl = min(i__3,chunk); + dgemm_((char *)"T", (char *)"N", n, &bl, n, &c_b79, &a[a_offset], lda, &b[i__ + * b_dim1 + 1], ldb, &c_b46, &work[1], n, (ftnlen)1, ( + ftnlen)1); + dlacpy_((char *)"G", n, &bl, &work[1], n, &b[i__ * b_dim1 + 1], ldb, ( + ftnlen)1); /* L20: */ - } - } else { - dgemv_((char *)"T", n, n, &c_b79, &a[a_offset], lda, &b[b_offset], &c__1, - &c_b46, &work[1], &c__1, (ftnlen)1); - dcopy_(n, &work[1], &c__1, &b[b_offset], &c__1); - } + } + } else { + dgemv_((char *)"T", n, n, &c_b79, &a[a_offset], lda, &b[b_offset], &c__1, + &c_b46, &work[1], &c__1, (ftnlen)1); + dcopy_(n, &work[1], &c__1, &b[b_offset], &c__1); + } } else /* if(complicated condition) */ { /* Computing MAX */ - i__2 = *m, i__1 = (*m << 1) - 4, i__2 = max(i__2,i__1), i__2 = max( - i__2,*nrhs), i__1 = *n - *m * 3; - if (*n >= mnthr && *lwork >= (*m << 2) + *m * *m + max(i__2,i__1)) { + i__2 = *m, i__1 = (*m << 1) - 4, i__2 = max(i__2,i__1), i__2 = max( + i__2,*nrhs), i__1 = *n - *m * 3; + if (*n >= mnthr && *lwork >= (*m << 2) + *m * *m + max(i__2,i__1)) { /* Path 2a - underdetermined, with many more columns than rows */ /* and sufficient workspace for an efficient algorithm */ - ldwork = *m; + ldwork = *m; /* Computing MAX */ /* Computing MAX */ - i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = - max(i__3,*nrhs), i__4 = *n - *m * 3; - i__2 = (*m << 2) + *m * *lda + max(i__3,i__4), i__1 = *m * *lda + - *m + *m * *nrhs; - if (*lwork >= max(i__2,i__1)) { - ldwork = *lda; - } - itau = 1; - iwork = *m + 1; + i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = + max(i__3,*nrhs), i__4 = *n - *m * 3; + i__2 = (*m << 2) + *m * *lda + max(i__3,i__4), i__1 = *m * *lda + + *m + *m * *nrhs; + if (*lwork >= max(i__2,i__1)) { + ldwork = *lda; + } + itau = 1; + iwork = *m + 1; /* Compute A=L*Q */ /* (Workspace: need 2*M, prefer M+M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, - info); - il = iwork; + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, + info); + il = iwork; /* Copy L to WORK(IL), zeroing out above it */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[il], &ldwork, (ftnlen) - 1); - i__2 = *m - 1; - i__1 = *m - 1; - dlaset_((char *)"U", &i__2, &i__1, &c_b46, &c_b46, &work[il + ldwork], & - ldwork, (ftnlen)1); - ie = il + ldwork * *m; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[il], &ldwork, (ftnlen) + 1); + i__2 = *m - 1; + i__1 = *m - 1; + dlaset_((char *)"U", &i__2, &i__1, &c_b46, &c_b46, &work[il + ldwork], & + ldwork, (ftnlen)1); + ie = il + ldwork * *m; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in WORK(IL) */ /* (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[il], &ldwork, &s[1], &work[ie], &work[itauq], - &work[itaup], &work[iwork], &i__2, info); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[il], &ldwork, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, info); /* Multiply B by transpose of left bidiagonalizing vectors of L */ /* (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &work[il], &ldwork, &work[ - itauq], &b[b_offset], ldb, &work[iwork], &i__2, info, ( - ftnlen)1, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &work[il], &ldwork, &work[ + itauq], &b[b_offset], ldb, &work[iwork], &i__2, info, ( + ftnlen)1, (ftnlen)1, (ftnlen)1); /* Generate right bidiagonalizing vectors of R in WORK(IL) */ /* (Workspace: need M*M+5*M-1, prefer M*M+4*M+(M-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[il], &ldwork, &work[itaup], &work[ - iwork], &i__2, info, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[il], &ldwork, &work[itaup], &work[ + iwork], &i__2, info, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, */ /* computing right singular vectors of L in WORK(IL) and */ /* multiplying B by transpose of left singular vectors */ /* (Workspace: need M*M+M+BDSPAC) */ - dbdsqr_((char *)"U", m, m, &c__0, nrhs, &s[1], &work[ie], &work[il], & - ldwork, &a[a_offset], lda, &b[b_offset], ldb, &work[iwork] - , info, (ftnlen)1); - if (*info != 0) { - goto L70; - } + dbdsqr_((char *)"U", m, m, &c__0, nrhs, &s[1], &work[ie], &work[il], & + ldwork, &a[a_offset], lda, &b[b_offset], ldb, &work[iwork] + , info, (ftnlen)1); + if (*info != 0) { + goto L70; + } /* Multiply B by reciprocals of singular values */ /* Computing MAX */ - d__1 = *rcond * s[1]; - thr = max(d__1,sfmin); - if (*rcond < 0.) { + d__1 = *rcond * s[1]; + thr = max(d__1,sfmin); + if (*rcond < 0.) { /* Computing MAX */ - d__1 = eps * s[1]; - thr = max(d__1,sfmin); - } - *rank = 0; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - if (s[i__] > thr) { - drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); - ++(*rank); - } else { - dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1] - , ldb, (ftnlen)1); - } + d__1 = eps * s[1]; + thr = max(d__1,sfmin); + } + *rank = 0; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + if (s[i__] > thr) { + drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); + ++(*rank); + } else { + dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1] + , ldb, (ftnlen)1); + } /* L30: */ - } - iwork = ie; + } + iwork = ie; /* Multiply B by right singular vectors of L in WORK(IL) */ /* (Workspace: need M*M+2*M, prefer M*M+M+M*NRHS) */ - if (*lwork >= *ldb * *nrhs + iwork - 1 && *nrhs > 1) { - dgemm_((char *)"T", (char *)"N", m, nrhs, m, &c_b79, &work[il], &ldwork, &b[ - b_offset], ldb, &c_b46, &work[iwork], ldb, (ftnlen)1, - (ftnlen)1); - dlacpy_((char *)"G", m, nrhs, &work[iwork], ldb, &b[b_offset], ldb, ( - ftnlen)1); - } else if (*nrhs > 1) { - chunk = (*lwork - iwork + 1) / *m; - i__2 = *nrhs; - i__1 = chunk; - for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += - i__1) { + if (*lwork >= *ldb * *nrhs + iwork - 1 && *nrhs > 1) { + dgemm_((char *)"T", (char *)"N", m, nrhs, m, &c_b79, &work[il], &ldwork, &b[ + b_offset], ldb, &c_b46, &work[iwork], ldb, (ftnlen)1, + (ftnlen)1); + dlacpy_((char *)"G", m, nrhs, &work[iwork], ldb, &b[b_offset], ldb, ( + ftnlen)1); + } else if (*nrhs > 1) { + chunk = (*lwork - iwork + 1) / *m; + i__2 = *nrhs; + i__1 = chunk; + for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += + i__1) { /* Computing MIN */ - i__3 = *nrhs - i__ + 1; - bl = min(i__3,chunk); - dgemm_((char *)"T", (char *)"N", m, &bl, m, &c_b79, &work[il], &ldwork, & - b[i__ * b_dim1 + 1], ldb, &c_b46, &work[iwork], m, - (ftnlen)1, (ftnlen)1); - dlacpy_((char *)"G", m, &bl, &work[iwork], m, &b[i__ * b_dim1 + 1] - , ldb, (ftnlen)1); + i__3 = *nrhs - i__ + 1; + bl = min(i__3,chunk); + dgemm_((char *)"T", (char *)"N", m, &bl, m, &c_b79, &work[il], &ldwork, & + b[i__ * b_dim1 + 1], ldb, &c_b46, &work[iwork], m, + (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"G", m, &bl, &work[iwork], m, &b[i__ * b_dim1 + 1] + , ldb, (ftnlen)1); /* L40: */ - } - } else { - dgemv_((char *)"T", m, m, &c_b79, &work[il], &ldwork, &b[b_dim1 + 1], - &c__1, &c_b46, &work[iwork], &c__1, (ftnlen)1); - dcopy_(m, &work[iwork], &c__1, &b[b_dim1 + 1], &c__1); - } + } + } else { + dgemv_((char *)"T", m, m, &c_b79, &work[il], &ldwork, &b[b_dim1 + 1], + &c__1, &c_b46, &work[iwork], &c__1, (ftnlen)1); + dcopy_(m, &work[iwork], &c__1, &b[b_dim1 + 1], &c__1); + } /* Zero out below first M rows of B */ - i__1 = *n - *m; - dlaset_((char *)"F", &i__1, nrhs, &c_b46, &c_b46, &b[*m + 1 + b_dim1], - ldb, (ftnlen)1); - iwork = itau + *m; + i__1 = *n - *m; + dlaset_((char *)"F", &i__1, nrhs, &c_b46, &c_b46, &b[*m + 1 + b_dim1], + ldb, (ftnlen)1); + iwork = itau + *m; /* Multiply transpose(Q) by B */ /* (Workspace: need M+NRHS, prefer M+NRHS*NB) */ - i__1 = *lwork - iwork + 1; - dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, &work[itau], &b[ - b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, ( - ftnlen)1); + i__1 = *lwork - iwork + 1; + dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, &work[itau], &b[ + b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, ( + ftnlen)1); - } else { + } else { /* Path 2 - remaining underdetermined cases */ - ie = 1; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + ie = 1; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize A */ /* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ - i__1 = *lwork - iwork + 1; - dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & - work[itaup], &work[iwork], &i__1, info); + i__1 = *lwork - iwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & + work[itaup], &work[iwork], &i__1, info); /* Multiply B by transpose of left bidiagonalizing vectors */ /* (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB) */ - i__1 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itauq] - , &b[b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, - (ftnlen)1, (ftnlen)1); + i__1 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itauq] + , &b[b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, + (ftnlen)1, (ftnlen)1); /* Generate right bidiagonalizing vectors in A */ /* (Workspace: need 4*M, prefer 3*M+M*NB) */ - i__1 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], &work[ - iwork], &i__1, info, (ftnlen)1); - iwork = ie + *m; + i__1 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], &work[ + iwork], &i__1, info, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, */ /* computing right singular vectors of A in A and */ /* multiplying B by transpose of left singular vectors */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"L", m, n, &c__0, nrhs, &s[1], &work[ie], &a[a_offset], - lda, dum, &c__1, &b[b_offset], ldb, &work[iwork], info, ( - ftnlen)1); - if (*info != 0) { - goto L70; - } + dbdsqr_((char *)"L", m, n, &c__0, nrhs, &s[1], &work[ie], &a[a_offset], + lda, dum, &c__1, &b[b_offset], ldb, &work[iwork], info, ( + ftnlen)1); + if (*info != 0) { + goto L70; + } /* Multiply B by reciprocals of singular values */ /* Computing MAX */ - d__1 = *rcond * s[1]; - thr = max(d__1,sfmin); - if (*rcond < 0.) { + d__1 = *rcond * s[1]; + thr = max(d__1,sfmin); + if (*rcond < 0.) { /* Computing MAX */ - d__1 = eps * s[1]; - thr = max(d__1,sfmin); - } - *rank = 0; - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - if (s[i__] > thr) { - drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); - ++(*rank); - } else { - dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1] - , ldb, (ftnlen)1); - } + d__1 = eps * s[1]; + thr = max(d__1,sfmin); + } + *rank = 0; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + if (s[i__] > thr) { + drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); + ++(*rank); + } else { + dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1] + , ldb, (ftnlen)1); + } /* L50: */ - } + } /* Multiply B by right singular vectors of A */ /* (Workspace: need N, prefer N*NRHS) */ - if (*lwork >= *ldb * *nrhs && *nrhs > 1) { - dgemm_((char *)"T", (char *)"N", n, nrhs, m, &c_b79, &a[a_offset], lda, &b[ - b_offset], ldb, &c_b46, &work[1], ldb, (ftnlen)1, ( - ftnlen)1); - dlacpy_((char *)"F", n, nrhs, &work[1], ldb, &b[b_offset], ldb, ( - ftnlen)1); - } else if (*nrhs > 1) { - chunk = *lwork / *n; - i__1 = *nrhs; - i__2 = chunk; - for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += - i__2) { + if (*lwork >= *ldb * *nrhs && *nrhs > 1) { + dgemm_((char *)"T", (char *)"N", n, nrhs, m, &c_b79, &a[a_offset], lda, &b[ + b_offset], ldb, &c_b46, &work[1], ldb, (ftnlen)1, ( + ftnlen)1); + dlacpy_((char *)"F", n, nrhs, &work[1], ldb, &b[b_offset], ldb, ( + ftnlen)1); + } else if (*nrhs > 1) { + chunk = *lwork / *n; + i__1 = *nrhs; + i__2 = chunk; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += + i__2) { /* Computing MIN */ - i__3 = *nrhs - i__ + 1; - bl = min(i__3,chunk); - dgemm_((char *)"T", (char *)"N", n, &bl, m, &c_b79, &a[a_offset], lda, &b[ - i__ * b_dim1 + 1], ldb, &c_b46, &work[1], n, ( - ftnlen)1, (ftnlen)1); - dlacpy_((char *)"F", n, &bl, &work[1], n, &b[i__ * b_dim1 + 1], - ldb, (ftnlen)1); + i__3 = *nrhs - i__ + 1; + bl = min(i__3,chunk); + dgemm_((char *)"T", (char *)"N", n, &bl, m, &c_b79, &a[a_offset], lda, &b[ + i__ * b_dim1 + 1], ldb, &c_b46, &work[1], n, ( + ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", n, &bl, &work[1], n, &b[i__ * b_dim1 + 1], + ldb, (ftnlen)1); /* L60: */ - } - } else { - dgemv_((char *)"T", m, n, &c_b79, &a[a_offset], lda, &b[b_offset], & - c__1, &c_b46, &work[1], &c__1, (ftnlen)1); - dcopy_(n, &work[1], &c__1, &b[b_offset], &c__1); - } - } + } + } else { + dgemv_((char *)"T", m, n, &c_b79, &a[a_offset], lda, &b[b_offset], & + c__1, &c_b46, &work[1], &c__1, (ftnlen)1); + dcopy_(n, &work[1], &c__1, &b[b_offset], &c__1); + } + } } /* Undo scaling */ if (iascl == 1) { - dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & - minmn, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & + minmn, info, (ftnlen)1); } else if (iascl == 2) { - dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & - minmn, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & + minmn, info, (ftnlen)1); } if (ibscl == 1) { - dlascl_((char *)"G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); } else if (ibscl == 2) { - dlascl_((char *)"G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); } L70: @@ -984,5 +984,5 @@ L70: } /* dgelss_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgemm.cpp b/lib/linalg/dgemm.cpp index 2f59801245..360584e254 100644 --- a/lib/linalg/dgemm.cpp +++ b/lib/linalg/dgemm.cpp @@ -1,13 +1,13 @@ /* fortran/dgemm.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -201,13 +201,13 @@ extern "C" { /* > */ /* ===================================================================== */ /* Subroutine */ int dgemm_(char *transa, char *transb, integer *m, integer * - n, integer *k, doublereal *alpha, doublereal *a, integer *lda, - doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, - integer *ldc, ftnlen transa_len, ftnlen transb_len) + n, integer *k, doublereal *alpha, doublereal *a, integer *lda, + doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, + integer *ldc, ftnlen transa_len, ftnlen transb_len) { /* System generated locals */ - integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, - i__3; + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3; /* Local variables */ integer i__, j, l, info; @@ -259,192 +259,192 @@ extern "C" { nota = lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1); notb = lsame_(transb, (char *)"N", (ftnlen)1, (ftnlen)1); if (nota) { - nrowa = *m; + nrowa = *m; } else { - nrowa = *k; + nrowa = *k; } if (notb) { - nrowb = *k; + nrowb = *k; } else { - nrowb = *n; + nrowb = *n; } /* Test the input parameters. */ info = 0; if (! nota && ! lsame_(transa, (char *)"C", (ftnlen)1, (ftnlen)1) && ! lsame_( - transa, (char *)"T", (ftnlen)1, (ftnlen)1)) { - info = 1; - } else if (! notb && ! lsame_(transb, (char *)"C", (ftnlen)1, (ftnlen)1) && ! - lsame_(transb, (char *)"T", (ftnlen)1, (ftnlen)1)) { - info = 2; + transa, (char *)"T", (ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! notb && ! lsame_(transb, (char *)"C", (ftnlen)1, (ftnlen)1) && ! + lsame_(transb, (char *)"T", (ftnlen)1, (ftnlen)1)) { + info = 2; } else if (*m < 0) { - info = 3; + info = 3; } else if (*n < 0) { - info = 4; + info = 4; } else if (*k < 0) { - info = 5; + info = 5; } else if (*lda < max(1,nrowa)) { - info = 8; + info = 8; } else if (*ldb < max(1,nrowb)) { - info = 10; + info = 10; } else if (*ldc < max(1,*m)) { - info = 13; + info = 13; } if (info != 0) { - xerbla_((char *)"DGEMM ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DGEMM ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { - return 0; + return 0; } /* And if alpha.eq.zero. */ if (*alpha == 0.) { - if (*beta == 0.) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = 0.; + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; /* L10: */ - } + } /* L20: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L30: */ - } + } /* L40: */ - } - } - return 0; + } + } + return 0; } /* Start the operations. */ if (notb) { - if (nota) { + if (nota) { /* Form C := alpha*A*B + beta*C. */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (*beta == 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; /* L50: */ - } - } else if (*beta != 1.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; + } + } else if (*beta != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L60: */ - } - } - i__2 = *k; - for (l = 1; l <= i__2; ++l) { - temp = *alpha * b[l + j * b_dim1]; - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + temp = *alpha * b[l + j * b_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; /* L70: */ - } + } /* L80: */ - } + } /* L90: */ - } - } else { + } + } else { /* Form C := alpha*A**T*B + beta*C */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - temp += a[l + i__ * a_dim1] * b[l + j * b_dim1]; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * b[l + j * b_dim1]; /* L100: */ - } - if (*beta == 0.) { - c__[i__ + j * c_dim1] = *alpha * temp; - } else { - c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ - i__ + j * c_dim1]; - } + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } /* L110: */ - } + } /* L120: */ - } - } + } + } } else { - if (nota) { + if (nota) { /* Form C := alpha*A*B**T + beta*C */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (*beta == 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; /* L130: */ - } - } else if (*beta != 1.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; + } + } else if (*beta != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L140: */ - } - } - i__2 = *k; - for (l = 1; l <= i__2; ++l) { - temp = *alpha * b[j + l * b_dim1]; - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + temp = *alpha * b[j + l * b_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; /* L150: */ - } + } /* L160: */ - } + } /* L170: */ - } - } else { + } + } else { /* Form C := alpha*A**T*B**T + beta*C */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - temp += a[l + i__ * a_dim1] * b[j + l * b_dim1]; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * b[j + l * b_dim1]; /* L180: */ - } - if (*beta == 0.) { - c__[i__ + j * c_dim1] = *alpha * temp; - } else { - c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ - i__ + j * c_dim1]; - } + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } /* L190: */ - } + } /* L200: */ - } - } + } + } } return 0; @@ -454,5 +454,5 @@ extern "C" { } /* dgemm_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgemv.cpp b/lib/linalg/dgemv.cpp index 1d121c33c0..5e82c1144c 100644 --- a/lib/linalg/dgemv.cpp +++ b/lib/linalg/dgemv.cpp @@ -1,13 +1,13 @@ /* fortran/dgemv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -170,8 +170,8 @@ extern "C" { /* > */ /* ===================================================================== */ /* Subroutine */ int dgemv_(char *trans, integer *m, integer *n, doublereal * - alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, - doublereal *beta, doublereal *y, integer *incy, ftnlen trans_len) + alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, + doublereal *beta, doublereal *y, integer *incy, ftnlen trans_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -218,50 +218,50 @@ extern "C" { /* Function Body */ info = 0; if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"T", ( - ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1) - ) { - info = 1; + ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1) + ) { + info = 1; } else if (*m < 0) { - info = 2; + info = 2; } else if (*n < 0) { - info = 3; + info = 3; } else if (*lda < max(1,*m)) { - info = 6; + info = 6; } else if (*incx == 0) { - info = 8; + info = 8; } else if (*incy == 0) { - info = 11; + info = 11; } if (info != 0) { - xerbla_((char *)"DGEMV ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DGEMV ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) { - return 0; + return 0; } /* Set LENX and LENY, the lengths of the vectors x and y, and set */ /* up the start points in X and Y. */ if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - lenx = *n; - leny = *m; + lenx = *n; + leny = *m; } else { - lenx = *m; - leny = *n; + lenx = *m; + leny = *n; } if (*incx > 0) { - kx = 1; + kx = 1; } else { - kx = 1 - (lenx - 1) * *incx; + kx = 1 - (lenx - 1) * *incx; } if (*incy > 0) { - ky = 1; + ky = 1; } else { - ky = 1 - (leny - 1) * *incy; + ky = 1 - (leny - 1) * *incy; } /* Start the operations. In this version the elements of A are */ @@ -270,108 +270,108 @@ extern "C" { /* First form y := beta*y. */ if (*beta != 1.) { - if (*incy == 1) { - if (*beta == 0.) { - i__1 = leny; - for (i__ = 1; i__ <= i__1; ++i__) { - y[i__] = 0.; + if (*incy == 1) { + if (*beta == 0.) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = 0.; /* L10: */ - } - } else { - i__1 = leny; - for (i__ = 1; i__ <= i__1; ++i__) { - y[i__] = *beta * y[i__]; + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = *beta * y[i__]; /* L20: */ - } - } - } else { - iy = ky; - if (*beta == 0.) { - i__1 = leny; - for (i__ = 1; i__ <= i__1; ++i__) { - y[iy] = 0.; - iy += *incy; + } + } + } else { + iy = ky; + if (*beta == 0.) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = 0.; + iy += *incy; /* L30: */ - } - } else { - i__1 = leny; - for (i__ = 1; i__ <= i__1; ++i__) { - y[iy] = *beta * y[iy]; - iy += *incy; + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = *beta * y[iy]; + iy += *incy; /* L40: */ - } - } - } + } + } + } } if (*alpha == 0.) { - return 0; + return 0; } if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { /* Form y := alpha*A*x + y. */ - jx = kx; - if (*incy == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp = *alpha * x[jx]; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - y[i__] += temp * a[i__ + j * a_dim1]; + jx = kx; + if (*incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = *alpha * x[jx]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + y[i__] += temp * a[i__ + j * a_dim1]; /* L50: */ - } - jx += *incx; + } + jx += *incx; /* L60: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp = *alpha * x[jx]; - iy = ky; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - y[iy] += temp * a[i__ + j * a_dim1]; - iy += *incy; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = *alpha * x[jx]; + iy = ky; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + y[iy] += temp * a[i__ + j * a_dim1]; + iy += *incy; /* L70: */ - } - jx += *incx; + } + jx += *incx; /* L80: */ - } - } + } + } } else { /* Form y := alpha*A**T*x + y. */ - jy = ky; - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp = 0.; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp += a[i__ + j * a_dim1] * x[i__]; + jy = ky; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = 0.; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp += a[i__ + j * a_dim1] * x[i__]; /* L90: */ - } - y[jy] += *alpha * temp; - jy += *incy; + } + y[jy] += *alpha * temp; + jy += *incy; /* L100: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp = 0.; - ix = kx; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp += a[i__ + j * a_dim1] * x[ix]; - ix += *incx; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = 0.; + ix = kx; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp += a[i__ + j * a_dim1] * x[ix]; + ix += *incx; /* L110: */ - } - y[jy] += *alpha * temp; - jy += *incy; + } + y[jy] += *alpha * temp; + jy += *incy; /* L120: */ - } - } + } + } } return 0; @@ -381,5 +381,5 @@ extern "C" { } /* dgemv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgeqr2.cpp b/lib/linalg/dgeqr2.cpp index 635e360bc7..6cc1bc8400 100644 --- a/lib/linalg/dgeqr2.cpp +++ b/lib/linalg/dgeqr2.cpp @@ -1,13 +1,13 @@ /* fortran/dgeqr2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -152,7 +152,7 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dgeqr2_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *tau, doublereal *work, integer *info) + lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -160,11 +160,11 @@ f"> */ /* Local variables */ integer i__, k; doublereal aii; - extern /* Subroutine */ int dlarf_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, ftnlen), dlarfg_(integer *, doublereal *, - doublereal *, integer *, doublereal *), xerbla_(char *, integer *, - ftnlen); + extern /* Subroutine */ int dlarf_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen), dlarfg_(integer *, doublereal *, + doublereal *, integer *, doublereal *), xerbla_(char *, integer *, + ftnlen); /* -- LAPACK computational routine -- */ @@ -200,16 +200,16 @@ f"> */ /* Function Body */ *info = 0; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*m)) { - *info = -4; + *info = -4; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGEQR2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGEQR2", &i__1, (ftnlen)6); + return 0; } k = min(*m,*n); @@ -219,24 +219,24 @@ f"> */ /* Generate elementary reflector H(i) to annihilate A(i+1:m,i) */ - i__2 = *m - i__ + 1; + i__2 = *m - i__ + 1; /* Computing MIN */ - i__3 = i__ + 1; - dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3,*m) + i__ * a_dim1] - , &c__1, &tau[i__]); - if (i__ < *n) { + i__3 = i__ + 1; + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3,*m) + i__ * a_dim1] + , &c__1, &tau[i__]); + if (i__ < *n) { /* Apply H(i) to A(i:m,i+1:n) from the left */ - aii = a[i__ + i__ * a_dim1]; - a[i__ + i__ * a_dim1] = 1.; - i__2 = *m - i__ + 1; - i__3 = *n - i__; - dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, &tau[ - i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], ( - ftnlen)4); - a[i__ + i__ * a_dim1] = aii; - } + aii = a[i__ + i__ * a_dim1]; + a[i__ + i__ * a_dim1] = 1.; + i__2 = *m - i__ + 1; + i__3 = *n - i__; + dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, &tau[ + i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], ( + ftnlen)4); + a[i__ + i__ * a_dim1] = aii; + } /* L10: */ } return 0; @@ -246,5 +246,5 @@ f"> */ } /* dgeqr2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgeqrf.cpp b/lib/linalg/dgeqrf.cpp index fa0aca3f47..57b92689b9 100644 --- a/lib/linalg/dgeqrf.cpp +++ b/lib/linalg/dgeqrf.cpp @@ -1,13 +1,13 @@ /* fortran/dgeqrf.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -170,23 +170,23 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dgeqrf_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) + lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, k, ib, nb, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int dgeqr2_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *), dlarfb_(char *, - char *, char *, char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, - ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dgeqr2_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *), dlarfb_(char *, + char *, char *, char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; @@ -225,38 +225,38 @@ f"> */ k = min(*m,*n); *info = 0; nb = ilaenv_(&c__1, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen) - 1); + 1); lquery = *lwork == -1; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*m)) { - *info = -4; + *info = -4; } else if (! lquery) { - if (*lwork <= 0 || *m > 0 && *lwork < max(1,*n)) { - *info = -7; - } + if (*lwork <= 0 || *m > 0 && *lwork < max(1,*n)) { + *info = -7; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGEQRF", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGEQRF", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - if (k == 0) { - lwkopt = 1; - } else { - lwkopt = *n * nb; - } - work[1] = (doublereal) lwkopt; - return 0; + if (k == 0) { + lwkopt = 1; + } else { + lwkopt = *n * nb; + } + work[1] = (doublereal) lwkopt; + return 0; } /* Quick return if possible */ if (k == 0) { - work[1] = 1.; - return 0; + work[1] = 1.; + return 0; } nbmin = 2; @@ -267,79 +267,79 @@ f"> */ /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); - if (nx < k) { + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < k) { /* Determine if workspace is large enough for blocked code. */ - ldwork = *n; - iws = ldwork * nb; - if (*lwork < iws) { + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ - nb = *lwork / ldwork; + nb = *lwork / ldwork; /* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, & - c_n1, (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); - } - } + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, & + c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } } if (nb >= nbmin && nb < k && nx < k) { /* Use blocked code initially */ - i__1 = k - nx; - i__2 = nb; - for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__1 = k - nx; + i__2 = nb; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ - i__3 = k - i__ + 1; - ib = min(i__3,nb); + i__3 = k - i__ + 1; + ib = min(i__3,nb); /* Compute the QR factorization of the current block */ /* A(i:m,i:i+ib-1) */ - i__3 = *m - i__ + 1; - dgeqr2_(&i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ - 1], &iinfo); - if (i__ + ib <= *n) { + i__3 = *m - i__ + 1; + dgeqr2_(&i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ + 1], &iinfo); + if (i__ + ib <= *n) { /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__3 = *m - i__ + 1; - dlarft_((char *)"Forward", (char *)"Columnwise", &i__3, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, - (ftnlen)10); + i__3 = *m - i__ + 1; + dlarft_((char *)"Forward", (char *)"Columnwise", &i__3, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, + (ftnlen)10); /* Apply H**T to A(i:m,i+ib:n) from the left */ - i__3 = *m - i__ + 1; - i__4 = *n - i__ - ib + 1; - dlarfb_((char *)"Left", (char *)"Transpose", (char *)"Forward", (char *)"Columnwise", &i__3, & - i__4, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & - ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, &work[ib - + 1], &ldwork, (ftnlen)4, (ftnlen)9, (ftnlen)7, ( - ftnlen)10); - } + i__3 = *m - i__ + 1; + i__4 = *n - i__ - ib + 1; + dlarfb_((char *)"Left", (char *)"Transpose", (char *)"Forward", (char *)"Columnwise", &i__3, & + i__4, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & + ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, &work[ib + + 1], &ldwork, (ftnlen)4, (ftnlen)9, (ftnlen)7, ( + ftnlen)10); + } /* L10: */ - } + } } else { - i__ = 1; + i__ = 1; } /* Use unblocked code to factor the last or only block. */ if (i__ <= k) { - i__2 = *m - i__ + 1; - i__1 = *n - i__ + 1; - dgeqr2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1] - , &iinfo); + i__2 = *m - i__ + 1; + i__1 = *n - i__ + 1; + dgeqr2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1] + , &iinfo); } work[1] = (doublereal) iws; @@ -350,5 +350,5 @@ f"> */ } /* dgeqrf_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dger.cpp b/lib/linalg/dger.cpp index fd5c4940bf..9bb0d19982 100644 --- a/lib/linalg/dger.cpp +++ b/lib/linalg/dger.cpp @@ -1,13 +1,13 @@ /* fortran/dger.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -143,9 +143,9 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dger_(integer *m, integer *n, doublereal *alpha, - doublereal *x, integer *incx, doublereal *y, integer *incy, - doublereal *a, integer *lda) +/* Subroutine */ int dger_(integer *m, integer *n, doublereal *alpha, + doublereal *x, integer *incx, doublereal *y, integer *incy, + doublereal *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -188,70 +188,70 @@ extern "C" { /* Function Body */ info = 0; if (*m < 0) { - info = 1; + info = 1; } else if (*n < 0) { - info = 2; + info = 2; } else if (*incx == 0) { - info = 5; + info = 5; } else if (*incy == 0) { - info = 7; + info = 7; } else if (*lda < max(1,*m)) { - info = 9; + info = 9; } if (info != 0) { - xerbla_((char *)"DGER ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DGER ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || *alpha == 0.) { - return 0; + return 0; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through A. */ if (*incy > 0) { - jy = 1; + jy = 1; } else { - jy = 1 - (*n - 1) * *incy; + jy = 1 - (*n - 1) * *incy; } if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (y[jy] != 0.) { - temp = *alpha * y[jy]; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] += x[i__] * temp; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (y[jy] != 0.) { + temp = *alpha * y[jy]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] += x[i__] * temp; /* L10: */ - } - } - jy += *incy; + } + } + jy += *incy; /* L20: */ - } + } } else { - if (*incx > 0) { - kx = 1; - } else { - kx = 1 - (*m - 1) * *incx; - } - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (y[jy] != 0.) { - temp = *alpha * y[jy]; - ix = kx; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] += x[ix] * temp; - ix += *incx; + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (*m - 1) * *incx; + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (y[jy] != 0.) { + temp = *alpha * y[jy]; + ix = kx; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] += x[ix] * temp; + ix += *incx; /* L30: */ - } - } - jy += *incy; + } + } + jy += *incy; /* L40: */ - } + } } return 0; @@ -261,5 +261,5 @@ extern "C" { } /* dger_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgesv.cpp b/lib/linalg/dgesv.cpp index a71b2caa68..c2e0232c37 100644 --- a/lib/linalg/dgesv.cpp +++ b/lib/linalg/dgesv.cpp @@ -1,13 +1,13 @@ /* fortran/dgesv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -138,17 +138,17 @@ extern "C" { /* > \ingroup doubleGEsolve */ /* ===================================================================== */ -/* Subroutine */ int dgesv_(integer *n, integer *nrhs, doublereal *a, integer - *lda, integer *ipiv, doublereal *b, integer *ldb, integer *info) +/* Subroutine */ int dgesv_(integer *n, integer *nrhs, doublereal *a, integer + *lda, integer *ipiv, doublereal *b, integer *ldb, integer *info) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; /* Local variables */ - extern /* Subroutine */ int dgetrf_(integer *, integer *, doublereal *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen), dgetrs_(char *, integer *, integer *, doublereal *, - integer *, integer *, doublereal *, integer *, integer *, ftnlen); + extern /* Subroutine */ int dgetrf_(integer *, integer *, doublereal *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen), dgetrs_(char *, integer *, integer *, doublereal *, + integer *, integer *, doublereal *, integer *, integer *, ftnlen); /* -- LAPACK driver routine -- */ @@ -182,18 +182,18 @@ extern "C" { /* Function Body */ *info = 0; if (*n < 0) { - *info = -1; + *info = -1; } else if (*nrhs < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*n)) { - *info = -4; + *info = -4; } else if (*ldb < max(1,*n)) { - *info = -7; + *info = -7; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGESV ", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGESV ", &i__1, (ftnlen)6); + return 0; } /* Compute the LU factorization of A. */ @@ -203,8 +203,8 @@ extern "C" { /* Solve the system A*X = B, overwriting B with X. */ - dgetrs_((char *)"No transpose", n, nrhs, &a[a_offset], lda, &ipiv[1], &b[ - b_offset], ldb, info, (ftnlen)12); + dgetrs_((char *)"No transpose", n, nrhs, &a[a_offset], lda, &ipiv[1], &b[ + b_offset], ldb, info, (ftnlen)12); } return 0; @@ -213,5 +213,5 @@ extern "C" { } /* dgesv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgesvd.cpp b/lib/linalg/dgesvd.cpp index 96fd8735b0..6a2e70640f 100644 --- a/lib/linalg/dgesvd.cpp +++ b/lib/linalg/dgesvd.cpp @@ -1,13 +1,13 @@ /* fortran/dgesvd.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -236,15 +236,15 @@ f"> */ /* > \ingroup doubleGEsing */ /* ===================================================================== */ -/* Subroutine */ int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, - doublereal *a, integer *lda, doublereal *s, doublereal *u, integer * - ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, - integer *info, ftnlen jobu_len, ftnlen jobvt_len) +/* Subroutine */ int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, + doublereal *a, integer *lda, doublereal *s, doublereal *u, integer * + ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, + integer *info, ftnlen jobu_len, ftnlen jobvt_len) { /* System generated locals */ address a__1[2]; - integer a_dim1, a_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1[2], - i__2, i__3, i__4; + integer a_dim1, a_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1[2], + i__2, i__3, i__4; char ch__1[2]; /* Builtin functions */ @@ -256,51 +256,51 @@ f"> */ doublereal dum[1], eps; integer nru, iscl; doublereal anrm; - integer ierr, itau, ncvt, nrvt, lwork_dgebrd__, lwork_dgelqf__, - lwork_dgeqrf__; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer ierr, itau, ncvt, nrvt, lwork_dgebrd__, lwork_dgelqf__, + lwork_dgeqrf__; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); integer chunk, minmn, wrkbl, itaup, itauq, mnthr, iwork; logical wntua, wntva, wntun, wntuo, wntvn, wntvo, wntus, wntvs; - extern /* Subroutine */ int dgebrd_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *, integer *); - extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, ftnlen); + extern /* Subroutine */ int dgebrd_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *, integer *); + extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, ftnlen); integer bdspac; - extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, integer *), - dlascl_(char *, integer *, integer *, doublereal *, doublereal *, - integer *, integer *, doublereal *, integer *, integer *, ftnlen), - dgeqrf_(integer *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, integer *), dlacpy_(char *, - integer *, integer *, doublereal *, integer *, doublereal *, - integer *, ftnlen), dlaset_(char *, integer *, integer *, - doublereal *, doublereal *, doublereal *, integer *, ftnlen), - dbdsqr_(char *, integer *, integer *, integer *, integer *, - doublereal *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, doublereal *, integer *, - ftnlen), dorgbr_(char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - integer *, ftnlen); + extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, + integer *, integer *, doublereal *, integer *, integer *, ftnlen), + dgeqrf_(integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *), dlacpy_(char *, + integer *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen), dlaset_(char *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, ftnlen), + dbdsqr_(char *, integer *, integer *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), dorgbr_(char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + integer *, ftnlen); doublereal bignum; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *, - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, integer *, - ftnlen, ftnlen, ftnlen), dorglq_(integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - integer *), dorgqr_(integer *, integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, integer *); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *, + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen, ftnlen), dorglq_(integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + integer *), dorgqr_(integer *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *); integer ldwrkr, minwrk, ldwrku, maxwrk; doublereal smlnum; logical lquery, wntuas, wntvas; - integer lwork_dorgbr_p__, lwork_dorgbr_q__, lwork_dorglq_m__, - lwork_dorglq_n__, lwork_dorgqr_m__, lwork_dorgqr_n__; + integer lwork_dorgbr_p__, lwork_dorgbr_q__, lwork_dorglq_m__, + lwork_dorglq_n__, lwork_dorgqr_m__, lwork_dorgqr_n__; /* -- LAPACK driver routine -- */ @@ -359,19 +359,19 @@ f"> */ lquery = *lwork == -1; if (! (wntua || wntus || wntuo || wntun)) { - *info = -1; + *info = -1; } else if (! (wntva || wntvs || wntvo || wntvn) || wntvo && wntuo) { - *info = -2; + *info = -2; } else if (*m < 0) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*lda < max(1,*m)) { - *info = -6; + *info = -6; } else if (*ldu < 1 || wntuas && *ldu < *m) { - *info = -9; + *info = -9; } else if (*ldvt < 1 || wntva && *ldvt < *n || wntvs && *ldvt < minmn) { - *info = -11; + *info = -11; } /* Compute workspace */ @@ -382,547 +382,547 @@ f"> */ /* following subroutine, as returned by ILAENV.) */ if (*info == 0) { - minwrk = 1; - maxwrk = 1; - if (*m >= *n && minmn > 0) { + minwrk = 1; + maxwrk = 1; + if (*m >= *n && minmn > 0) { /* Compute space needed for DBDSQR */ /* Writing concatenation */ - i__1[0] = 1, a__1[0] = jobu; - i__1[1] = 1, a__1[1] = jobvt; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); - mnthr = ilaenv_(&c__6, (char *)"DGESVD", ch__1, m, n, &c__0, &c__0, ( - ftnlen)6, (ftnlen)2); - bdspac = *n * 5; + i__1[0] = 1, a__1[0] = jobu; + i__1[1] = 1, a__1[1] = jobvt; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + mnthr = ilaenv_(&c__6, (char *)"DGESVD", ch__1, m, n, &c__0, &c__0, ( + ftnlen)6, (ftnlen)2); + bdspac = *n * 5; /* Compute space needed for DGEQRF */ - dgeqrf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); - lwork_dgeqrf__ = (integer) dum[0]; + dgeqrf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); + lwork_dgeqrf__ = (integer) dum[0]; /* Compute space needed for DORGQR */ - dorgqr_(m, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); - lwork_dorgqr_n__ = (integer) dum[0]; - dorgqr_(m, m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); - lwork_dorgqr_m__ = (integer) dum[0]; + dorgqr_(m, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); + lwork_dorgqr_n__ = (integer) dum[0]; + dorgqr_(m, m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); + lwork_dorgqr_m__ = (integer) dum[0]; /* Compute space needed for DGEBRD */ - dgebrd_(n, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, - &ierr); - lwork_dgebrd__ = (integer) dum[0]; + dgebrd_(n, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, + &ierr); + lwork_dgebrd__ = (integer) dum[0]; /* Compute space needed for DORGBR P */ - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr, ( - ftnlen)1); - lwork_dorgbr_p__ = (integer) dum[0]; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr, ( + ftnlen)1); + lwork_dorgbr_p__ = (integer) dum[0]; /* Compute space needed for DORGBR Q */ - dorgbr_((char *)"Q", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr, ( - ftnlen)1); - lwork_dorgbr_q__ = (integer) dum[0]; + dorgbr_((char *)"Q", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr, ( + ftnlen)1); + lwork_dorgbr_q__ = (integer) dum[0]; - if (*m >= mnthr) { - if (wntun) { + if (*m >= mnthr) { + if (wntun) { /* Path 1 (M much larger than N, JOBU='N') */ - maxwrk = *n + lwork_dgeqrf__; + maxwrk = *n + lwork_dgeqrf__; /* Computing MAX */ - i__2 = maxwrk, i__3 = *n * 3 + lwork_dgebrd__; - maxwrk = max(i__2,i__3); - if (wntvo || wntvas) { + i__2 = maxwrk, i__3 = *n * 3 + lwork_dgebrd__; + maxwrk = max(i__2,i__3); + if (wntvo || wntvas) { /* Computing MAX */ - i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_p__; - maxwrk = max(i__2,i__3); - } - maxwrk = max(maxwrk,bdspac); + i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_p__; + maxwrk = max(i__2,i__3); + } + maxwrk = max(maxwrk,bdspac); /* Computing MAX */ - i__2 = *n << 2; - minwrk = max(i__2,bdspac); - } else if (wntuo && wntvn) { + i__2 = *n << 2; + minwrk = max(i__2,bdspac); + } else if (wntuo && wntvn) { /* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */ - wrkbl = *n + lwork_dgeqrf__; + wrkbl = *n + lwork_dgeqrf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); /* Computing MAX */ - i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n; - maxwrk = max(i__2,i__3); + i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n; + maxwrk = max(i__2,i__3); /* Computing MAX */ - i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); - } else if (wntuo && wntvas) { + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntuo && wntvas) { /* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or */ /* 'A') */ - wrkbl = *n + lwork_dgeqrf__; + wrkbl = *n + lwork_dgeqrf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); /* Computing MAX */ - i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n; - maxwrk = max(i__2,i__3); + i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n; + maxwrk = max(i__2,i__3); /* Computing MAX */ - i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); - } else if (wntus && wntvn) { + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntus && wntvn) { /* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */ - wrkbl = *n + lwork_dgeqrf__; + wrkbl = *n + lwork_dgeqrf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); - maxwrk = *n * *n + wrkbl; + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *n * *n + wrkbl; /* Computing MAX */ - i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); - } else if (wntus && wntvo) { + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntus && wntvo) { /* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */ - wrkbl = *n + lwork_dgeqrf__; + wrkbl = *n + lwork_dgeqrf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); - maxwrk = (*n << 1) * *n + wrkbl; + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = (*n << 1) * *n + wrkbl; /* Computing MAX */ - i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); - } else if (wntus && wntvas) { + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntus && wntvas) { /* Path 6 (M much larger than N, JOBU='S', JOBVT='S' or */ /* 'A') */ - wrkbl = *n + lwork_dgeqrf__; + wrkbl = *n + lwork_dgeqrf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); - maxwrk = *n * *n + wrkbl; + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *n * *n + wrkbl; /* Computing MAX */ - i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); - } else if (wntua && wntvn) { + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntua && wntvn) { /* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */ - wrkbl = *n + lwork_dgeqrf__; + wrkbl = *n + lwork_dgeqrf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); - maxwrk = *n * *n + wrkbl; + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *n * *n + wrkbl; /* Computing MAX */ - i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); - } else if (wntua && wntvo) { + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntua && wntvo) { /* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */ - wrkbl = *n + lwork_dgeqrf__; + wrkbl = *n + lwork_dgeqrf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); - maxwrk = (*n << 1) * *n + wrkbl; + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = (*n << 1) * *n + wrkbl; /* Computing MAX */ - i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); - } else if (wntua && wntvas) { + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } else if (wntua && wntvas) { /* Path 9 (M much larger than N, JOBU='A', JOBVT='S' or */ /* 'A') */ - wrkbl = *n + lwork_dgeqrf__; + wrkbl = *n + lwork_dgeqrf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); - maxwrk = *n * *n + wrkbl; + i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *n * *n + wrkbl; /* Computing MAX */ - i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); - } - } else { + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } + } else { /* Path 10 (M at least N, but not much larger) */ - dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, & - c_n1, &ierr); - lwork_dgebrd__ = (integer) dum[0]; - maxwrk = *n * 3 + lwork_dgebrd__; - if (wntus || wntuo) { - dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, dum, dum, &c_n1, - &ierr, (ftnlen)1); - lwork_dorgbr_q__ = (integer) dum[0]; + dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, & + c_n1, &ierr); + lwork_dgebrd__ = (integer) dum[0]; + maxwrk = *n * 3 + lwork_dgebrd__; + if (wntus || wntuo) { + dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, dum, dum, &c_n1, + &ierr, (ftnlen)1); + lwork_dorgbr_q__ = (integer) dum[0]; /* Computing MAX */ - i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_q__; - maxwrk = max(i__2,i__3); - } - if (wntua) { - dorgbr_((char *)"Q", m, m, n, &a[a_offset], lda, dum, dum, &c_n1, - &ierr, (ftnlen)1); - lwork_dorgbr_q__ = (integer) dum[0]; + i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_q__; + maxwrk = max(i__2,i__3); + } + if (wntua) { + dorgbr_((char *)"Q", m, m, n, &a[a_offset], lda, dum, dum, &c_n1, + &ierr, (ftnlen)1); + lwork_dorgbr_q__ = (integer) dum[0]; /* Computing MAX */ - i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_q__; - maxwrk = max(i__2,i__3); - } - if (! wntvn) { + i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_q__; + maxwrk = max(i__2,i__3); + } + if (! wntvn) { /* Computing MAX */ - i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_p__; - maxwrk = max(i__2,i__3); - } - maxwrk = max(maxwrk,bdspac); + i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_p__; + maxwrk = max(i__2,i__3); + } + maxwrk = max(maxwrk,bdspac); /* Computing MAX */ - i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); - } - } else if (minmn > 0) { + i__2 = *n * 3 + *m; + minwrk = max(i__2,bdspac); + } + } else if (minmn > 0) { /* Compute space needed for DBDSQR */ /* Writing concatenation */ - i__1[0] = 1, a__1[0] = jobu; - i__1[1] = 1, a__1[1] = jobvt; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); - mnthr = ilaenv_(&c__6, (char *)"DGESVD", ch__1, m, n, &c__0, &c__0, ( - ftnlen)6, (ftnlen)2); - bdspac = *m * 5; + i__1[0] = 1, a__1[0] = jobu; + i__1[1] = 1, a__1[1] = jobvt; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + mnthr = ilaenv_(&c__6, (char *)"DGESVD", ch__1, m, n, &c__0, &c__0, ( + ftnlen)6, (ftnlen)2); + bdspac = *m * 5; /* Compute space needed for DGELQF */ - dgelqf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); - lwork_dgelqf__ = (integer) dum[0]; + dgelqf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); + lwork_dgelqf__ = (integer) dum[0]; /* Compute space needed for DORGLQ */ - dorglq_(n, n, m, dum, n, dum, dum, &c_n1, &ierr); - lwork_dorglq_n__ = (integer) dum[0]; - dorglq_(m, n, m, &a[a_offset], lda, dum, dum, &c_n1, &ierr); - lwork_dorglq_m__ = (integer) dum[0]; + dorglq_(n, n, m, dum, n, dum, dum, &c_n1, &ierr); + lwork_dorglq_n__ = (integer) dum[0]; + dorglq_(m, n, m, &a[a_offset], lda, dum, dum, &c_n1, &ierr); + lwork_dorglq_m__ = (integer) dum[0]; /* Compute space needed for DGEBRD */ - dgebrd_(m, m, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, - &ierr); - lwork_dgebrd__ = (integer) dum[0]; + dgebrd_(m, m, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, + &ierr); + lwork_dgebrd__ = (integer) dum[0]; /* Compute space needed for DORGBR P */ - dorgbr_((char *)"P", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, ( - ftnlen)1); - lwork_dorgbr_p__ = (integer) dum[0]; + dorgbr_((char *)"P", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, ( + ftnlen)1); + lwork_dorgbr_p__ = (integer) dum[0]; /* Compute space needed for DORGBR Q */ - dorgbr_((char *)"Q", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, ( - ftnlen)1); - lwork_dorgbr_q__ = (integer) dum[0]; - if (*n >= mnthr) { - if (wntvn) { + dorgbr_((char *)"Q", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, ( + ftnlen)1); + lwork_dorgbr_q__ = (integer) dum[0]; + if (*n >= mnthr) { + if (wntvn) { /* Path 1t(N much larger than M, JOBVT='N') */ - maxwrk = *m + lwork_dgelqf__; + maxwrk = *m + lwork_dgelqf__; /* Computing MAX */ - i__2 = maxwrk, i__3 = *m * 3 + lwork_dgebrd__; - maxwrk = max(i__2,i__3); - if (wntuo || wntuas) { + i__2 = maxwrk, i__3 = *m * 3 + lwork_dgebrd__; + maxwrk = max(i__2,i__3); + if (wntuo || wntuas) { /* Computing MAX */ - i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_q__; - maxwrk = max(i__2,i__3); - } - maxwrk = max(maxwrk,bdspac); + i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_q__; + maxwrk = max(i__2,i__3); + } + maxwrk = max(maxwrk,bdspac); /* Computing MAX */ - i__2 = *m << 2; - minwrk = max(i__2,bdspac); - } else if (wntvo && wntun) { + i__2 = *m << 2; + minwrk = max(i__2,bdspac); + } else if (wntvo && wntun) { /* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */ - wrkbl = *m + lwork_dgelqf__; + wrkbl = *m + lwork_dgelqf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); /* Computing MAX */ - i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m; - maxwrk = max(i__2,i__3); + i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m; + maxwrk = max(i__2,i__3); /* Computing MAX */ - i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); - } else if (wntvo && wntuas) { + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntvo && wntuas) { /* Path 3t(N much larger than M, JOBU='S' or 'A', */ /* JOBVT='O') */ - wrkbl = *m + lwork_dgelqf__; + wrkbl = *m + lwork_dgelqf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); /* Computing MAX */ - i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m; - maxwrk = max(i__2,i__3); + i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m; + maxwrk = max(i__2,i__3); /* Computing MAX */ - i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); - } else if (wntvs && wntun) { + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntvs && wntun) { /* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */ - wrkbl = *m + lwork_dgelqf__; + wrkbl = *m + lwork_dgelqf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); - maxwrk = *m * *m + wrkbl; + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *m * *m + wrkbl; /* Computing MAX */ - i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); - } else if (wntvs && wntuo) { + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntvs && wntuo) { /* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */ - wrkbl = *m + lwork_dgelqf__; + wrkbl = *m + lwork_dgelqf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); - maxwrk = (*m << 1) * *m + wrkbl; + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = (*m << 1) * *m + wrkbl; /* Computing MAX */ - i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); - } else if (wntvs && wntuas) { + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntvs && wntuas) { /* Path 6t(N much larger than M, JOBU='S' or 'A', */ /* JOBVT='S') */ - wrkbl = *m + lwork_dgelqf__; + wrkbl = *m + lwork_dgelqf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); - maxwrk = *m * *m + wrkbl; + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *m * *m + wrkbl; /* Computing MAX */ - i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); - } else if (wntva && wntun) { + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntva && wntun) { /* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */ - wrkbl = *m + lwork_dgelqf__; + wrkbl = *m + lwork_dgelqf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); - maxwrk = *m * *m + wrkbl; + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *m * *m + wrkbl; /* Computing MAX */ - i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); - } else if (wntva && wntuo) { + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntva && wntuo) { /* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */ - wrkbl = *m + lwork_dgelqf__; + wrkbl = *m + lwork_dgelqf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); - maxwrk = (*m << 1) * *m + wrkbl; + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = (*m << 1) * *m + wrkbl; /* Computing MAX */ - i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); - } else if (wntva && wntuas) { + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } else if (wntva && wntuas) { /* Path 9t(N much larger than M, JOBU='S' or 'A', */ /* JOBVT='A') */ - wrkbl = *m + lwork_dgelqf__; + wrkbl = *m + lwork_dgelqf__; /* Computing MAX */ - i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; + wrkbl = max(i__2,i__3); /* Computing MAX */ - i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); - maxwrk = *m * *m + wrkbl; + i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; + wrkbl = max(i__2,i__3); + wrkbl = max(wrkbl,bdspac); + maxwrk = *m * *m + wrkbl; /* Computing MAX */ - i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); - } - } else { + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } + } else { /* Path 10t(N greater than M, but not much larger) */ - dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, & - c_n1, &ierr); - lwork_dgebrd__ = (integer) dum[0]; - maxwrk = *m * 3 + lwork_dgebrd__; - if (wntvs || wntvo) { + dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, & + c_n1, &ierr); + lwork_dgebrd__ = (integer) dum[0]; + maxwrk = *m * 3 + lwork_dgebrd__; + if (wntvs || wntvo) { /* Compute space needed for DORGBR P */ - dorgbr_((char *)"P", m, n, m, &a[a_offset], n, dum, dum, &c_n1, & - ierr, (ftnlen)1); - lwork_dorgbr_p__ = (integer) dum[0]; + dorgbr_((char *)"P", m, n, m, &a[a_offset], n, dum, dum, &c_n1, & + ierr, (ftnlen)1); + lwork_dorgbr_p__ = (integer) dum[0]; /* Computing MAX */ - i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_p__; - maxwrk = max(i__2,i__3); - } - if (wntva) { - dorgbr_((char *)"P", n, n, m, &a[a_offset], n, dum, dum, &c_n1, & - ierr, (ftnlen)1); - lwork_dorgbr_p__ = (integer) dum[0]; + i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_p__; + maxwrk = max(i__2,i__3); + } + if (wntva) { + dorgbr_((char *)"P", n, n, m, &a[a_offset], n, dum, dum, &c_n1, & + ierr, (ftnlen)1); + lwork_dorgbr_p__ = (integer) dum[0]; /* Computing MAX */ - i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_p__; - maxwrk = max(i__2,i__3); - } - if (! wntun) { + i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_p__; + maxwrk = max(i__2,i__3); + } + if (! wntun) { /* Computing MAX */ - i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_q__; - maxwrk = max(i__2,i__3); - } - maxwrk = max(maxwrk,bdspac); + i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_q__; + maxwrk = max(i__2,i__3); + } + maxwrk = max(maxwrk,bdspac); /* Computing MAX */ - i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); - } - } - maxwrk = max(maxwrk,minwrk); - work[1] = (doublereal) maxwrk; + i__2 = *m * 3 + *n; + minwrk = max(i__2,bdspac); + } + } + maxwrk = max(maxwrk,minwrk); + work[1] = (doublereal) maxwrk; - if (*lwork < minwrk && ! lquery) { - *info = -13; - } + if (*lwork < minwrk && ! lquery) { + *info = -13; + } } if (*info != 0) { - i__2 = -(*info); - xerbla_((char *)"DGESVD", &i__2, (ftnlen)6); - return 0; + i__2 = -(*info); + xerbla_((char *)"DGESVD", &i__2, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { - return 0; + return 0; } /* Get machine constants */ @@ -936,13 +936,13 @@ f"> */ anrm = dlange_((char *)"M", m, n, &a[a_offset], lda, dum, (ftnlen)1); iscl = 0; if (anrm > 0. && anrm < smlnum) { - iscl = 1; - dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, & - ierr, (ftnlen)1); + iscl = 1; + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, & + ierr, (ftnlen)1); } else if (anrm > bignum) { - iscl = 1; - dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, & - ierr, (ftnlen)1); + iscl = 1; + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, & + ierr, (ftnlen)1); } if (*m >= *n) { @@ -951,751 +951,751 @@ f"> */ /* more rows than columns, first reduce using the QR */ /* decomposition (if sufficient workspace available) */ - if (*m >= mnthr) { + if (*m >= mnthr) { - if (wntun) { + if (wntun) { /* Path 1 (M much larger than N, JOBU='N') */ /* No left singular vectors to be computed */ - itau = 1; - iwork = itau + *n; + itau = 1; + iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], & + i__2, &ierr); /* Zero out below R */ - if (*n > 1) { - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[a_dim1 + 2], - lda, (ftnlen)1); - } - ie = 1; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[a_dim1 + 2], + lda, (ftnlen)1); + } + ie = 1; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in A */ /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__2, &ierr); - ncvt = 0; - if (wntvo || wntvas) { + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__2, &ierr); + ncvt = 0; + if (wntvo || wntvas) { /* If right singular vectors desired, generate P'. */ /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], & - work[iwork], &i__2, &ierr, (ftnlen)1); - ncvt = *n; - } - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], & + work[iwork], &i__2, &ierr, (ftnlen)1); + ncvt = *n; + } + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of A in A if desired */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, &ncvt, &c__0, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, dum, &c__1, dum, &c__1, &work[iwork], - info, (ftnlen)1); + dbdsqr_((char *)"U", n, &ncvt, &c__0, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, dum, &c__1, dum, &c__1, &work[iwork], + info, (ftnlen)1); /* If right singular vectors desired in VT, copy them there */ - if (wntvas) { - dlacpy_((char *)"F", n, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - } + if (wntvas) { + dlacpy_((char *)"F", n, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + } - } else if (wntuo && wntvn) { + } else if (wntuo && wntvn) { /* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */ /* N left singular vectors to be overwritten on A and */ /* no right singular vectors to be computed */ /* Computing MAX */ - i__2 = *n << 2; - if (*lwork >= *n * *n + max(i__2,bdspac)) { + i__2 = *n << 2; + if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - ir = 1; + ir = 1; /* Computing MAX */ - i__2 = wrkbl, i__3 = *lda * *n + *n; - if (*lwork >= max(i__2,i__3) + *lda * *n) { + i__2 = wrkbl, i__3 = *lda * *n + *n; + if (*lwork >= max(i__2,i__3) + *lda * *n) { /* WORK(IU) is LDA by N, WORK(IR) is LDA by N */ - ldwrku = *lda; - ldwrkr = *lda; - } else /* if(complicated condition) */ { + ldwrku = *lda; + ldwrkr = *lda; + } else /* if(complicated condition) */ { /* Computing MAX */ - i__2 = wrkbl, i__3 = *lda * *n + *n; - if (*lwork >= max(i__2,i__3) + *n * *n) { + i__2 = wrkbl, i__3 = *lda * *n + *n; + if (*lwork >= max(i__2,i__3) + *n * *n) { /* WORK(IU) is LDA by N, WORK(IR) is N by N */ - ldwrku = *lda; - ldwrkr = *n; - } else { + ldwrku = *lda; + ldwrkr = *n; + } else { /* WORK(IU) is LDWRKU by N, WORK(IR) is N by N */ - ldwrku = (*lwork - *n * *n - *n) / *n; - ldwrkr = *n; - } - } - itau = ir + ldwrkr * *n; - iwork = itau + *n; + ldwrku = (*lwork - *n * *n - *n) / *n; + ldwrkr = *n; + } + } + itau = ir + ldwrkr * *n; + iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] - , &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] + , &i__2, &ierr); /* Copy R to WORK(IR) and zero out below it */ - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr, - (ftnlen)1); - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + 1], - &ldwrkr, (ftnlen)1); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr, + (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + 1], + &ldwrkr, (ftnlen)1); /* Generate Q in A */ /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in WORK(IR) */ /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__2, &ierr); /* Generate left vectors bidiagonalizing R */ /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], & - work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], & + work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IR) */ /* (Workspace: need N*N + BDSPAC) */ - dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, & - c__1, &work[ir], &ldwrkr, dum, &c__1, &work[iwork] - , info, (ftnlen)1); - iu = ie + *n; + dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, & + c__1, &work[ir], &ldwrkr, dum, &c__1, &work[iwork] + , info, (ftnlen)1); + iu = ie + *n; /* Multiply Q in A by left singular vectors of R in */ /* WORK(IR), storing result in WORK(IU) and copying to A */ /* (Workspace: need N*N + 2*N, prefer N*N + M*N + N) */ - i__2 = *m; - i__3 = ldwrku; - for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += - i__3) { + i__2 = *m; + i__3 = ldwrku; + for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += + i__3) { /* Computing MIN */ - i__4 = *m - i__ + 1; - chunk = min(i__4,ldwrku); - dgemm_((char *)"N", (char *)"N", &chunk, n, n, &c_b79, &a[i__ + - a_dim1], lda, &work[ir], &ldwrkr, &c_b57, & - work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); - dlacpy_((char *)"F", &chunk, n, &work[iu], &ldwrku, &a[i__ + - a_dim1], lda, (ftnlen)1); + i__4 = *m - i__ + 1; + chunk = min(i__4,ldwrku); + dgemm_((char *)"N", (char *)"N", &chunk, n, n, &c_b79, &a[i__ + + a_dim1], lda, &work[ir], &ldwrkr, &c_b57, & + work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", &chunk, n, &work[iu], &ldwrku, &a[i__ + + a_dim1], lda, (ftnlen)1); /* L10: */ - } + } - } else { + } else { /* Insufficient workspace for a fast algorithm */ - ie = 1; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + ie = 1; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize A */ /* (Workspace: need 3*N + M, prefer 3*N + (M + N)*NB) */ - i__3 = *lwork - iwork + 1; - dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__3, &ierr); + i__3 = *lwork - iwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__3, &ierr); /* Generate left vectors bidiagonalizing A */ /* (Workspace: need 4*N, prefer 3*N + N*NB) */ - i__3 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, &work[itauq], & - work[iwork], &i__3, &ierr, (ftnlen)1); - iwork = ie + *n; + i__3 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, &work[itauq], & + work[iwork], &i__3, &ierr, (ftnlen)1); + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in A */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, & - c__1, &a[a_offset], lda, dum, &c__1, &work[iwork], - info, (ftnlen)1); + dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, & + c__1, &a[a_offset], lda, dum, &c__1, &work[iwork], + info, (ftnlen)1); - } + } - } else if (wntuo && wntvas) { + } else if (wntuo && wntvas) { /* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A') */ /* N left singular vectors to be overwritten on A and */ /* N right singular vectors to be computed in VT */ /* Computing MAX */ - i__3 = *n << 2; - if (*lwork >= *n * *n + max(i__3,bdspac)) { + i__3 = *n << 2; + if (*lwork >= *n * *n + max(i__3,bdspac)) { /* Sufficient workspace for a fast algorithm */ - ir = 1; + ir = 1; /* Computing MAX */ - i__3 = wrkbl, i__2 = *lda * *n + *n; - if (*lwork >= max(i__3,i__2) + *lda * *n) { + i__3 = wrkbl, i__2 = *lda * *n + *n; + if (*lwork >= max(i__3,i__2) + *lda * *n) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ - ldwrku = *lda; - ldwrkr = *lda; - } else /* if(complicated condition) */ { + ldwrku = *lda; + ldwrkr = *lda; + } else /* if(complicated condition) */ { /* Computing MAX */ - i__3 = wrkbl, i__2 = *lda * *n + *n; - if (*lwork >= max(i__3,i__2) + *n * *n) { + i__3 = wrkbl, i__2 = *lda * *n + *n; + if (*lwork >= max(i__3,i__2) + *n * *n) { /* WORK(IU) is LDA by N and WORK(IR) is N by N */ - ldwrku = *lda; - ldwrkr = *n; - } else { + ldwrku = *lda; + ldwrkr = *n; + } else { /* WORK(IU) is LDWRKU by N and WORK(IR) is N by N */ - ldwrku = (*lwork - *n * *n - *n) / *n; - ldwrkr = *n; - } - } - itau = ir + ldwrkr * *n; - iwork = itau + *n; + ldwrku = (*lwork - *n * *n - *n) / *n; + ldwrkr = *n; + } + } + itau = ir + ldwrkr * *n; + iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__3 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] - , &i__3, &ierr); + i__3 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] + , &i__3, &ierr); /* Copy R to VT, zeroing out below it */ - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - if (*n > 1) { - i__3 = *n - 1; - i__2 = *n - 1; - dlaset_((char *)"L", &i__3, &i__2, &c_b57, &c_b57, &vt[ - vt_dim1 + 2], ldvt, (ftnlen)1); - } + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + if (*n > 1) { + i__3 = *n - 1; + i__2 = *n - 1; + dlaset_((char *)"L", &i__3, &i__2, &c_b57, &c_b57, &vt[ + vt_dim1 + 2], ldvt, (ftnlen)1); + } /* Generate Q in A */ /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__3 = *lwork - iwork + 1; - dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__3, &ierr); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + i__3 = *lwork - iwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__3, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in VT, copying result to WORK(IR) */ /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ - i__3 = *lwork - iwork + 1; - dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], &i__3, & - ierr); - dlacpy_((char *)"L", n, n, &vt[vt_offset], ldvt, &work[ir], & - ldwrkr, (ftnlen)1); + i__3 = *lwork - iwork + 1; + dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], &i__3, & + ierr); + dlacpy_((char *)"L", n, n, &vt[vt_offset], ldvt, &work[ir], & + ldwrkr, (ftnlen)1); /* Generate left vectors bidiagonalizing R in WORK(IR) */ /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ - i__3 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], & - work[iwork], &i__3, &ierr, (ftnlen)1); + i__3 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], & + work[iwork], &i__3, &ierr, (ftnlen)1); /* Generate right vectors bidiagonalizing R in VT */ /* (Workspace: need N*N + 4*N-1, prefer N*N + 3*N + (N-1)*NB) */ - i__3 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], - &work[iwork], &i__3, &ierr, (ftnlen)1); - iwork = ie + *n; + i__3 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], + &work[iwork], &i__3, &ierr, (ftnlen)1); + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IR) and computing right */ /* singular vectors of R in VT */ /* (Workspace: need N*N + BDSPAC) */ - dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &work[ir], &ldwrkr, dum, &c__1, - &work[iwork], info, (ftnlen)1); - iu = ie + *n; + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &work[ir], &ldwrkr, dum, &c__1, + &work[iwork], info, (ftnlen)1); + iu = ie + *n; /* Multiply Q in A by left singular vectors of R in */ /* WORK(IR), storing result in WORK(IU) and copying to A */ /* (Workspace: need N*N + 2*N, prefer N*N + M*N + N) */ - i__3 = *m; - i__2 = ldwrku; - for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += - i__2) { + i__3 = *m; + i__2 = ldwrku; + for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += + i__2) { /* Computing MIN */ - i__4 = *m - i__ + 1; - chunk = min(i__4,ldwrku); - dgemm_((char *)"N", (char *)"N", &chunk, n, n, &c_b79, &a[i__ + - a_dim1], lda, &work[ir], &ldwrkr, &c_b57, & - work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); - dlacpy_((char *)"F", &chunk, n, &work[iu], &ldwrku, &a[i__ + - a_dim1], lda, (ftnlen)1); + i__4 = *m - i__ + 1; + chunk = min(i__4,ldwrku); + dgemm_((char *)"N", (char *)"N", &chunk, n, n, &c_b79, &a[i__ + + a_dim1], lda, &work[ir], &ldwrkr, &c_b57, & + work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", &chunk, n, &work[iu], &ldwrku, &a[i__ + + a_dim1], lda, (ftnlen)1); /* L20: */ - } + } - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *n; + itau = 1; + iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] - , &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] + , &i__2, &ierr); /* Copy R to VT, zeroing out below it */ - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - if (*n > 1) { - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[ - vt_dim1 + 2], ldvt, (ftnlen)1); - } + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[ + vt_dim1 + 2], ldvt, (ftnlen)1); + } /* Generate Q in A */ /* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in VT */ /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], &i__2, & - ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], &i__2, & + ierr); /* Multiply Q in A by left vectors bidiagonalizing R */ /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, & - work[itauq], &a[a_offset], lda, &work[iwork], & - i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, & + work[itauq], &a[a_offset], lda, &work[iwork], & + i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); /* Generate right vectors bidiagonalizing R in VT */ /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], - &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in A and computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & + work[iwork], info, (ftnlen)1); - } + } - } else if (wntus) { + } else if (wntus) { - if (wntvn) { + if (wntvn) { /* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */ /* N left singular vectors to be computed in U and */ /* no right singular vectors to be computed */ /* Computing MAX */ - i__2 = *n << 2; - if (*lwork >= *n * *n + max(i__2,bdspac)) { + i__2 = *n << 2; + if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - ir = 1; - if (*lwork >= wrkbl + *lda * *n) { + ir = 1; + if (*lwork >= wrkbl + *lda * *n) { /* WORK(IR) is LDA by N */ - ldwrkr = *lda; - } else { + ldwrkr = *lda; + } else { /* WORK(IR) is N by N */ - ldwrkr = *n; - } - itau = ir + ldwrkr * *n; - iwork = itau + *n; + ldwrkr = *n; + } + itau = ir + ldwrkr * *n; + iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); /* Copy R to WORK(IR), zeroing out below it */ - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], & - ldwrkr, (ftnlen)1); - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + - 1], &ldwrkr, (ftnlen)1); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], & + ldwrkr, (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + + 1], &ldwrkr, (ftnlen)1); /* Generate Q in A */ /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in WORK(IR) */ /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Generate left vectors bidiagonalizing R in WORK(IR) */ /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IR) */ /* (Workspace: need N*N + BDSPAC) */ - dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], - dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], + dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, & + work[iwork], info, (ftnlen)1); /* Multiply Q in A by left singular vectors of R in */ /* WORK(IR), storing result in U */ /* (Workspace: need N*N) */ - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, & - work[ir], &ldwrkr, &c_b57, &u[u_offset], ldu, - (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, & + work[ir], &ldwrkr, &c_b57, &u[u_offset], ldu, + (ftnlen)1, (ftnlen)1); - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *n; + itau = 1; + iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); /* Generate Q in U */ /* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Zero out below R in A */ - if (*n > 1) { - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ - a_dim1 + 2], lda, (ftnlen)1); - } + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ + a_dim1 + 2], lda, (ftnlen)1); + } /* Bidiagonalize R in A */ /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Multiply Q in U by left vectors bidiagonalizing R */ /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & - work[itauq], &u[u_offset], ldu, &work[iwork], - &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) - ; - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & + work[itauq], &u[u_offset], ldu, &work[iwork], + &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) + ; + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], - dum, &c__1, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], + dum, &c__1, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); - } + } - } else if (wntvo) { + } else if (wntvo) { /* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */ /* N left singular vectors to be computed in U and */ /* N right singular vectors to be overwritten on A */ /* Computing MAX */ - i__2 = *n << 2; - if (*lwork >= (*n << 1) * *n + max(i__2,bdspac)) { + i__2 = *n << 2; + if (*lwork >= (*n << 1) * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - iu = 1; - if (*lwork >= wrkbl + (*lda << 1) * *n) { + iu = 1; + if (*lwork >= wrkbl + (*lda << 1) * *n) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ - ldwrku = *lda; - ir = iu + ldwrku * *n; - ldwrkr = *lda; - } else if (*lwork >= wrkbl + (*lda + *n) * *n) { + ldwrku = *lda; + ir = iu + ldwrku * *n; + ldwrkr = *lda; + } else if (*lwork >= wrkbl + (*lda + *n) * *n) { /* WORK(IU) is LDA by N and WORK(IR) is N by N */ - ldwrku = *lda; - ir = iu + ldwrku * *n; - ldwrkr = *n; - } else { + ldwrku = *lda; + ir = iu + ldwrku * *n; + ldwrkr = *n; + } else { /* WORK(IU) is N by N and WORK(IR) is N by N */ - ldwrku = *n; - ir = iu + ldwrku * *n; - ldwrkr = *n; - } - itau = ir + ldwrkr * *n; - iwork = itau + *n; + ldwrku = *n; + ir = iu + ldwrku * *n; + ldwrkr = *n; + } + itau = ir + ldwrkr * *n; + iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); /* Copy R to WORK(IU), zeroing out below it */ - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - 1], &ldwrku, (ftnlen)1); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + 1], &ldwrku, (ftnlen)1); /* Generate Q in A */ /* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in WORK(IU), copying result to */ /* WORK(IR) */ /* (Workspace: need 2*N*N + 4*N, */ /* prefer 2*N*N+3*N+2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &work[ir], & - ldwrkr, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &work[ir], & + ldwrkr, (ftnlen)1); /* Generate left bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need 2*N*N + 4*N, prefer 2*N*N + 3*N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); /* Generate right bidiagonalizing vectors in WORK(IR) */ /* (Workspace: need 2*N*N + 4*N-1, */ /* prefer 2*N*N+3*N+(N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &work[ir], &ldwrkr, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &work[ir], &ldwrkr, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IU) and computing */ /* right singular vectors of R in WORK(IR) */ /* (Workspace: need 2*N*N + BDSPAC) */ - dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &work[ - ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1, - &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &work[ + ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1, + &work[iwork], info, (ftnlen)1); /* Multiply Q in A by left singular vectors of R in */ /* WORK(IU), storing result in U */ /* (Workspace: need N*N) */ - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, & - work[iu], &ldwrku, &c_b57, &u[u_offset], ldu, - (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, & + work[iu], &ldwrku, &c_b57, &u[u_offset], ldu, + (ftnlen)1, (ftnlen)1); /* Copy right singular vectors of R to A */ /* (Workspace: need N*N) */ - dlacpy_((char *)"F", n, n, &work[ir], &ldwrkr, &a[a_offset], - lda, (ftnlen)1); + dlacpy_((char *)"F", n, n, &work[ir], &ldwrkr, &a[a_offset], + lda, (ftnlen)1); - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *n; + itau = 1; + iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); /* Generate Q in U */ /* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Zero out below R in A */ - if (*n > 1) { - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ - a_dim1 + 2], lda, (ftnlen)1); - } + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ + a_dim1 + 2], lda, (ftnlen)1); + } /* Bidiagonalize R in A */ /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Multiply Q in U by left vectors bidiagonalizing R */ /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & - work[itauq], &u[u_offset], ldu, &work[iwork], - &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) - ; + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & + work[itauq], &u[u_offset], ldu, &work[iwork], + &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) + ; /* Generate right vectors bidiagonalizing R in A */ /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], - &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in A */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, &u[u_offset], ldu, dum, &c__1, - &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, &u[u_offset], ldu, dum, &c__1, + &work[iwork], info, (ftnlen)1); - } + } - } else if (wntvas) { + } else if (wntvas) { /* Path 6 (M much larger than N, JOBU='S', JOBVT='S' */ /* or 'A') */ @@ -1703,531 +1703,531 @@ f"> */ /* N right singular vectors to be computed in VT */ /* Computing MAX */ - i__2 = *n << 2; - if (*lwork >= *n * *n + max(i__2,bdspac)) { + i__2 = *n << 2; + if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - iu = 1; - if (*lwork >= wrkbl + *lda * *n) { + iu = 1; + if (*lwork >= wrkbl + *lda * *n) { /* WORK(IU) is LDA by N */ - ldwrku = *lda; - } else { + ldwrku = *lda; + } else { /* WORK(IU) is N by N */ - ldwrku = *n; - } - itau = iu + ldwrku * *n; - iwork = itau + *n; + ldwrku = *n; + } + itau = iu + ldwrku * *n; + iwork = itau + *n; /* Compute A=Q*R */ /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); /* Copy R to WORK(IU), zeroing out below it */ - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - 1], &ldwrku, (ftnlen)1); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + 1], &ldwrku, (ftnlen)1); /* Generate Q in A */ /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in WORK(IU), copying result to VT */ /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &vt[vt_offset], - ldvt, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &vt[vt_offset], + ldvt, (ftnlen)1); /* Generate left bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); /* Generate right bidiagonalizing vectors in VT */ /* (Workspace: need N*N + 4*N-1, */ /* prefer N*N+3*N+(N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ - itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) - ; - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ + itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) + ; + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IU) and computing */ /* right singular vectors of R in VT */ /* (Workspace: need N*N + BDSPAC) */ - dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &work[iu], &ldwrku, dum, & - c__1, &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &work[iu], &ldwrku, dum, & + c__1, &work[iwork], info, (ftnlen)1); /* Multiply Q in A by left singular vectors of R in */ /* WORK(IU), storing result in U */ /* (Workspace: need N*N) */ - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, & - work[iu], &ldwrku, &c_b57, &u[u_offset], ldu, - (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, & + work[iu], &ldwrku, &c_b57, &u[u_offset], ldu, + (ftnlen)1, (ftnlen)1); - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *n; + itau = 1; + iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); /* Generate Q in U */ /* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); /* Copy R to VT, zeroing out below it */ - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - if (*n > 1) { - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[ - vt_dim1 + 2], ldvt, (ftnlen)1); - } - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[ + vt_dim1 + 2], ldvt, (ftnlen)1); + } + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in VT */ /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], - &work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], + &work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Multiply Q in U by left bidiagonalizing vectors */ /* in VT */ /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, - &work[itauq], &u[u_offset], ldu, &work[iwork], - &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen) - 1); + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, + &work[itauq], &u[u_offset], ldu, &work[iwork], + &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen) + 1); /* Generate right bidiagonalizing vectors in VT */ /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ - itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) - ; - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ + itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) + ; + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &u[u_offset], ldu, dum, & - c__1, &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &u[u_offset], ldu, dum, & + c__1, &work[iwork], info, (ftnlen)1); - } + } - } + } - } else if (wntua) { + } else if (wntua) { - if (wntvn) { + if (wntvn) { /* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */ /* M left singular vectors to be computed in U and */ /* no right singular vectors to be computed */ /* Computing MAX */ - i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); - if (*lwork >= *n * *n + max(i__2,bdspac)) { + i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); + if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - ir = 1; - if (*lwork >= wrkbl + *lda * *n) { + ir = 1; + if (*lwork >= wrkbl + *lda * *n) { /* WORK(IR) is LDA by N */ - ldwrkr = *lda; - } else { + ldwrkr = *lda; + } else { /* WORK(IR) is N by N */ - ldwrkr = *n; - } - itau = ir + ldwrkr * *n; - iwork = itau + *n; + ldwrkr = *n; + } + itau = ir + ldwrkr * *n; + iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); /* Copy R to WORK(IR), zeroing out below it */ - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], & - ldwrkr, (ftnlen)1); - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + - 1], &ldwrkr, (ftnlen)1); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], & + ldwrkr, (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + + 1], &ldwrkr, (ftnlen)1); /* Generate Q in U */ /* (Workspace: need N*N + N + M, prefer N*N + N + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + i__2 = *lwork - iwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in WORK(IR) */ /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Generate left bidiagonalizing vectors in WORK(IR) */ /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IR) */ /* (Workspace: need N*N + BDSPAC) */ - dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], - dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], + dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, & + work[iwork], info, (ftnlen)1); /* Multiply Q in U by left singular vectors of R in */ /* WORK(IR), storing result in A */ /* (Workspace: need N*N) */ - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, & - work[ir], &ldwrkr, &c_b57, &a[a_offset], lda, - (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, & + work[ir], &ldwrkr, &c_b57, &a[a_offset], lda, + (ftnlen)1, (ftnlen)1); /* Copy left singular vectors of A from A to U */ - dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *n; + itau = 1; + iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); /* Generate Q in U */ /* (Workspace: need N + M, prefer N + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + i__2 = *lwork - iwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Zero out below R in A */ - if (*n > 1) { - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ - a_dim1 + 2], lda, (ftnlen)1); - } + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ + a_dim1 + 2], lda, (ftnlen)1); + } /* Bidiagonalize R in A */ /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Multiply Q in U by left bidiagonalizing vectors */ /* in A */ /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & - work[itauq], &u[u_offset], ldu, &work[iwork], - &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) - ; - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & + work[itauq], &u[u_offset], ldu, &work[iwork], + &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) + ; + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], - dum, &c__1, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], + dum, &c__1, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); - } + } - } else if (wntvo) { + } else if (wntvo) { /* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */ /* M left singular vectors to be computed in U and */ /* N right singular vectors to be overwritten on A */ /* Computing MAX */ - i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); - if (*lwork >= (*n << 1) * *n + max(i__2,bdspac)) { + i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); + if (*lwork >= (*n << 1) * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - iu = 1; - if (*lwork >= wrkbl + (*lda << 1) * *n) { + iu = 1; + if (*lwork >= wrkbl + (*lda << 1) * *n) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ - ldwrku = *lda; - ir = iu + ldwrku * *n; - ldwrkr = *lda; - } else if (*lwork >= wrkbl + (*lda + *n) * *n) { + ldwrku = *lda; + ir = iu + ldwrku * *n; + ldwrkr = *lda; + } else if (*lwork >= wrkbl + (*lda + *n) * *n) { /* WORK(IU) is LDA by N and WORK(IR) is N by N */ - ldwrku = *lda; - ir = iu + ldwrku * *n; - ldwrkr = *n; - } else { + ldwrku = *lda; + ir = iu + ldwrku * *n; + ldwrkr = *n; + } else { /* WORK(IU) is N by N and WORK(IR) is N by N */ - ldwrku = *n; - ir = iu + ldwrku * *n; - ldwrkr = *n; - } - itau = ir + ldwrkr * *n; - iwork = itau + *n; + ldwrku = *n; + ir = iu + ldwrku * *n; + ldwrkr = *n; + } + itau = ir + ldwrkr * *n; + iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); /* Generate Q in U */ /* (Workspace: need 2*N*N + N + M, prefer 2*N*N + N + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); /* Copy R to WORK(IU), zeroing out below it */ - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - 1], &ldwrku, (ftnlen)1); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + 1], &ldwrku, (ftnlen)1); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in WORK(IU), copying result to */ /* WORK(IR) */ /* (Workspace: need 2*N*N + 4*N, */ /* prefer 2*N*N+3*N+2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &work[ir], & - ldwrkr, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &work[ir], & + ldwrkr, (ftnlen)1); /* Generate left bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need 2*N*N + 4*N, prefer 2*N*N + 3*N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); /* Generate right bidiagonalizing vectors in WORK(IR) */ /* (Workspace: need 2*N*N + 4*N-1, */ /* prefer 2*N*N+3*N+(N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &work[ir], &ldwrkr, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &work[ir], &ldwrkr, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IU) and computing */ /* right singular vectors of R in WORK(IR) */ /* (Workspace: need 2*N*N + BDSPAC) */ - dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &work[ - ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1, - &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &work[ + ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1, + &work[iwork], info, (ftnlen)1); /* Multiply Q in U by left singular vectors of R in */ /* WORK(IU), storing result in A */ /* (Workspace: need N*N) */ - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, & - work[iu], &ldwrku, &c_b57, &a[a_offset], lda, - (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, & + work[iu], &ldwrku, &c_b57, &a[a_offset], lda, + (ftnlen)1, (ftnlen)1); /* Copy left singular vectors of A from A to U */ - dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); /* Copy right singular vectors of R from WORK(IR) to A */ - dlacpy_((char *)"F", n, n, &work[ir], &ldwrkr, &a[a_offset], - lda, (ftnlen)1); + dlacpy_((char *)"F", n, n, &work[ir], &ldwrkr, &a[a_offset], + lda, (ftnlen)1); - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *n; + itau = 1; + iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); /* Generate Q in U */ /* (Workspace: need N + M, prefer N + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + i__2 = *lwork - iwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Zero out below R in A */ - if (*n > 1) { - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ - a_dim1 + 2], lda, (ftnlen)1); - } + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ + a_dim1 + 2], lda, (ftnlen)1); + } /* Bidiagonalize R in A */ /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Multiply Q in U by left bidiagonalizing vectors */ /* in A */ /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & - work[itauq], &u[u_offset], ldu, &work[iwork], - &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) - ; + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & + work[itauq], &u[u_offset], ldu, &work[iwork], + &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) + ; /* Generate right bidiagonalizing vectors in A */ /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], - &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in A */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, &u[u_offset], ldu, dum, &c__1, - &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, &u[u_offset], ldu, dum, &c__1, + &work[iwork], info, (ftnlen)1); - } + } - } else if (wntvas) { + } else if (wntvas) { /* Path 9 (M much larger than N, JOBU='A', JOBVT='S' */ /* or 'A') */ @@ -2235,298 +2235,298 @@ f"> */ /* N right singular vectors to be computed in VT */ /* Computing MAX */ - i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); - if (*lwork >= *n * *n + max(i__2,bdspac)) { + i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); + if (*lwork >= *n * *n + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - iu = 1; - if (*lwork >= wrkbl + *lda * *n) { + iu = 1; + if (*lwork >= wrkbl + *lda * *n) { /* WORK(IU) is LDA by N */ - ldwrku = *lda; - } else { + ldwrku = *lda; + } else { /* WORK(IU) is N by N */ - ldwrku = *n; - } - itau = iu + ldwrku * *n; - iwork = itau + *n; + ldwrku = *n; + } + itau = iu + ldwrku * *n; + iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); /* Generate Q in U */ /* (Workspace: need N*N + N + M, prefer N*N + N + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); /* Copy R to WORK(IU), zeroing out below it */ - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - 1], &ldwrku, (ftnlen)1); - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + 1], &ldwrku, (ftnlen)1); + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in WORK(IU), copying result to VT */ /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &vt[vt_offset], - ldvt, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &vt[vt_offset], + ldvt, (ftnlen)1); /* Generate left bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); /* Generate right bidiagonalizing vectors in VT */ /* (Workspace: need N*N + 4*N-1, */ /* prefer N*N+3*N+(N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ - itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) - ; - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ + itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) + ; + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of R in WORK(IU) and computing */ /* right singular vectors of R in VT */ /* (Workspace: need N*N + BDSPAC) */ - dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &work[iu], &ldwrku, dum, & - c__1, &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &work[iu], &ldwrku, dum, & + c__1, &work[iwork], info, (ftnlen)1); /* Multiply Q in U by left singular vectors of R in */ /* WORK(IU), storing result in A */ /* (Workspace: need N*N) */ - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, & - work[iu], &ldwrku, &c_b57, &a[a_offset], lda, - (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, & + work[iu], &ldwrku, &c_b57, &a[a_offset], lda, + (ftnlen)1, (ftnlen)1); /* Copy left singular vectors of A from A to U */ - dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *n; + itau = 1; + iwork = itau + *n; /* Compute A=Q*R, copying result to U */ /* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); /* Generate Q in U */ /* (Workspace: need N + M, prefer N + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & + work[iwork], &i__2, &ierr); /* Copy R from A to VT, zeroing out below it */ - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - if (*n > 1) { - i__2 = *n - 1; - i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[ - vt_dim1 + 2], ldvt, (ftnlen)1); - } - ie = itau; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); + if (*n > 1) { + i__2 = *n - 1; + i__3 = *n - 1; + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[ + vt_dim1 + 2], ldvt, (ftnlen)1); + } + ie = itau; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize R in VT */ /* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], - &work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], + &work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Multiply Q in U by left bidiagonalizing vectors */ /* in VT */ /* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, - &work[itauq], &u[u_offset], ldu, &work[iwork], - &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen) - 1); + i__2 = *lwork - iwork + 1; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, + &work[itauq], &u[u_offset], ldu, &work[iwork], + &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen) + 1); /* Generate right bidiagonalizing vectors in VT */ /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ - itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) - ; - iwork = ie + *n; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ + itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) + ; + iwork = ie + *n; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &u[u_offset], ldu, dum, & - c__1, &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &u[u_offset], ldu, dum, & + c__1, &work[iwork], info, (ftnlen)1); - } + } - } + } - } + } - } else { + } else { /* M .LT. MNTHR */ /* Path 10 (M at least N, but not much larger) */ /* Reduce to bidiagonal form without QR decomposition */ - ie = 1; - itauq = ie + *n; - itaup = itauq + *n; - iwork = itaup + *n; + ie = 1; + itauq = ie + *n; + itaup = itauq + *n; + iwork = itaup + *n; /* Bidiagonalize A */ /* (Workspace: need 3*N + M, prefer 3*N + (M + N)*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & - work[itaup], &work[iwork], &i__2, &ierr); - if (wntuas) { + i__2 = *lwork - iwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & + work[itaup], &work[iwork], &i__2, &ierr); + if (wntuas) { /* If left singular vectors desired in U, copy result to U */ /* and generate left bidiagonalizing vectors in U */ /* (Workspace: need 3*N + NCU, prefer 3*N + NCU*NB) */ - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, ( - ftnlen)1); - if (wntus) { - ncu = *n; - } - if (wntua) { - ncu = *m; - } - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, &ncu, n, &u[u_offset], ldu, &work[itauq], & - work[iwork], &i__2, &ierr, (ftnlen)1); - } - if (wntvas) { + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, ( + ftnlen)1); + if (wntus) { + ncu = *n; + } + if (wntua) { + ncu = *m; + } + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, &ncu, n, &u[u_offset], ldu, &work[itauq], & + work[iwork], &i__2, &ierr, (ftnlen)1); + } + if (wntvas) { /* If right singular vectors desired in VT, copy result to */ /* VT and generate right bidiagonalizing vectors in VT */ /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt, ( - ftnlen)1); - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], & - work[iwork], &i__2, &ierr, (ftnlen)1); - } - if (wntuo) { + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt, ( + ftnlen)1); + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], & + work[iwork], &i__2, &ierr, (ftnlen)1); + } + if (wntuo) { /* If left singular vectors desired in A, generate left */ /* bidiagonalizing vectors in A */ /* (Workspace: need 4*N, prefer 3*N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, &work[itauq], &work[ - iwork], &i__2, &ierr, (ftnlen)1); - } - if (wntvo) { + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, &work[itauq], &work[ + iwork], &i__2, &ierr, (ftnlen)1); + } + if (wntvo) { /* If right singular vectors desired in A, generate right */ /* bidiagonalizing vectors in A */ /* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[ - iwork], &i__2, &ierr, (ftnlen)1); - } - iwork = ie + *n; - if (wntuas || wntuo) { - nru = *m; - } - if (wntun) { - nru = 0; - } - if (wntvas || wntvo) { - ncvt = *n; - } - if (wntvn) { - ncvt = 0; - } - if (! wntuo && ! wntvo) { + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[ + iwork], &i__2, &ierr, (ftnlen)1); + } + iwork = ie + *n; + if (wntuas || wntuo) { + nru = *m; + } + if (wntun) { + nru = 0; + } + if (wntvas || wntvo) { + ncvt = *n; + } + if (wntvn) { + ncvt = 0; + } + if (! wntuo && ! wntvo) { /* Perform bidiagonal QR iteration, if desired, computing */ /* left singular vectors in U and computing right singular */ /* vectors in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); - } else if (! wntuo && wntvo) { + dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); + } else if (! wntuo && wntvo) { /* Perform bidiagonal QR iteration, if desired, computing */ /* left singular vectors in U and computing right singular */ /* vectors in A */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[ - iwork], info, (ftnlen)1); - } else { + dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[ + iwork], info, (ftnlen)1); + } else { /* Perform bidiagonal QR iteration, if desired, computing */ /* left singular vectors in A and computing right singular */ /* vectors in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & - work[iwork], info, (ftnlen)1); - } + dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & + work[iwork], info, (ftnlen)1); + } - } + } } else { @@ -2534,751 +2534,751 @@ f"> */ /* columns than rows, first reduce using the LQ decomposition (if */ /* sufficient workspace available) */ - if (*n >= mnthr) { + if (*n >= mnthr) { - if (wntvn) { + if (wntvn) { /* Path 1t(N much larger than M, JOBVT='N') */ /* No right singular vectors to be computed */ - itau = 1; - iwork = itau + *m; + itau = 1; + iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], & + i__2, &ierr); /* Zero out above L */ - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 << 1) + - 1], lda, (ftnlen)1); - ie = 1; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 << 1) + + 1], lda, (ftnlen)1); + ie = 1; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in A */ /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__2, &ierr); - if (wntuo || wntuas) { + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__2, &ierr); + if (wntuo || wntuas) { /* If left singular vectors desired, generate Q */ /* (Workspace: need 4*M, prefer 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], & - work[iwork], &i__2, &ierr, (ftnlen)1); - } - iwork = ie + *m; - nru = 0; - if (wntuo || wntuas) { - nru = *m; - } + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], & + work[iwork], &i__2, &ierr, (ftnlen)1); + } + iwork = ie + *m; + nru = 0; + if (wntuo || wntuas) { + nru = *m; + } /* Perform bidiagonal QR iteration, computing left singular */ /* vectors of A in A if desired */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", m, &c__0, &nru, &c__0, &s[1], &work[ie], dum, & - c__1, &a[a_offset], lda, dum, &c__1, &work[iwork], - info, (ftnlen)1); + dbdsqr_((char *)"U", m, &c__0, &nru, &c__0, &s[1], &work[ie], dum, & + c__1, &a[a_offset], lda, dum, &c__1, &work[iwork], + info, (ftnlen)1); /* If left singular vectors desired in U, copy them there */ - if (wntuas) { - dlacpy_((char *)"F", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( - ftnlen)1); - } + if (wntuas) { + dlacpy_((char *)"F", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( + ftnlen)1); + } - } else if (wntvo && wntun) { + } else if (wntvo && wntun) { /* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */ /* M right singular vectors to be overwritten on A and */ /* no left singular vectors to be computed */ /* Computing MAX */ - i__2 = *m << 2; - if (*lwork >= *m * *m + max(i__2,bdspac)) { + i__2 = *m << 2; + if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - ir = 1; + ir = 1; /* Computing MAX */ - i__2 = wrkbl, i__3 = *lda * *n + *m; - if (*lwork >= max(i__2,i__3) + *lda * *m) { + i__2 = wrkbl, i__3 = *lda * *n + *m; + if (*lwork >= max(i__2,i__3) + *lda * *m) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by M */ - ldwrku = *lda; - chunk = *n; - ldwrkr = *lda; - } else /* if(complicated condition) */ { + ldwrku = *lda; + chunk = *n; + ldwrkr = *lda; + } else /* if(complicated condition) */ { /* Computing MAX */ - i__2 = wrkbl, i__3 = *lda * *n + *m; - if (*lwork >= max(i__2,i__3) + *m * *m) { + i__2 = wrkbl, i__3 = *lda * *n + *m; + if (*lwork >= max(i__2,i__3) + *m * *m) { /* WORK(IU) is LDA by N and WORK(IR) is M by M */ - ldwrku = *lda; - chunk = *n; - ldwrkr = *m; - } else { + ldwrku = *lda; + chunk = *n; + ldwrkr = *m; + } else { /* WORK(IU) is M by CHUNK and WORK(IR) is M by M */ - ldwrku = *m; - chunk = (*lwork - *m * *m - *m) / *m; - ldwrkr = *m; - } - } - itau = ir + ldwrkr * *m; - iwork = itau + *m; + ldwrku = *m; + chunk = (*lwork - *m * *m - *m) / *m; + ldwrkr = *m; + } + } + itau = ir + ldwrkr * *m; + iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] - , &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] + , &i__2, &ierr); /* Copy L to WORK(IR) and zero out above it */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], &ldwrkr, - (ftnlen)1); - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + - ldwrkr], &ldwrkr, (ftnlen)1); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], &ldwrkr, + (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + + ldwrkr], &ldwrkr, (ftnlen)1); /* Generate Q in A */ /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in WORK(IR) */ /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__2, &ierr); /* Generate right vectors bidiagonalizing L */ /* (Workspace: need M*M + 4*M-1, prefer M*M + 3*M + (M-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup], & - work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup], & + work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of L in WORK(IR) */ /* (Workspace: need M*M + BDSPAC) */ - dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], &work[ - ir], &ldwrkr, dum, &c__1, dum, &c__1, &work[iwork] - , info, (ftnlen)1); - iu = ie + *m; + dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], &work[ + ir], &ldwrkr, dum, &c__1, dum, &c__1, &work[iwork] + , info, (ftnlen)1); + iu = ie + *m; /* Multiply right singular vectors of L in WORK(IR) by Q */ /* in A, storing result in WORK(IU) and copying to A */ /* (Workspace: need M*M + 2*M, prefer M*M + M*N + M) */ - i__2 = *n; - i__3 = chunk; - for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += - i__3) { + i__2 = *n; + i__3 = chunk; + for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += + i__3) { /* Computing MIN */ - i__4 = *n - i__ + 1; - blk = min(i__4,chunk); - dgemm_((char *)"N", (char *)"N", m, &blk, m, &c_b79, &work[ir], & - ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b57, & - work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); - dlacpy_((char *)"F", m, &blk, &work[iu], &ldwrku, &a[i__ * - a_dim1 + 1], lda, (ftnlen)1); + i__4 = *n - i__ + 1; + blk = min(i__4,chunk); + dgemm_((char *)"N", (char *)"N", m, &blk, m, &c_b79, &work[ir], & + ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b57, & + work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, &blk, &work[iu], &ldwrku, &a[i__ * + a_dim1 + 1], lda, (ftnlen)1); /* L30: */ - } + } - } else { + } else { /* Insufficient workspace for a fast algorithm */ - ie = 1; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + ie = 1; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize A */ /* (Workspace: need 3*M + N, prefer 3*M + (M + N)*NB) */ - i__3 = *lwork - iwork + 1; - dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__3, &ierr); + i__3 = *lwork - iwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__3, &ierr); /* Generate right vectors bidiagonalizing A */ /* (Workspace: need 4*M, prefer 3*M + M*NB) */ - i__3 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], & - work[iwork], &i__3, &ierr, (ftnlen)1); - iwork = ie + *m; + i__3 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], & + work[iwork], &i__3, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of A in A */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"L", m, n, &c__0, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, dum, &c__1, dum, &c__1, &work[ - iwork], info, (ftnlen)1); + dbdsqr_((char *)"L", m, n, &c__0, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, dum, &c__1, dum, &c__1, &work[ + iwork], info, (ftnlen)1); - } + } - } else if (wntvo && wntuas) { + } else if (wntvo && wntuas) { /* Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O') */ /* M right singular vectors to be overwritten on A and */ /* M left singular vectors to be computed in U */ /* Computing MAX */ - i__3 = *m << 2; - if (*lwork >= *m * *m + max(i__3,bdspac)) { + i__3 = *m << 2; + if (*lwork >= *m * *m + max(i__3,bdspac)) { /* Sufficient workspace for a fast algorithm */ - ir = 1; + ir = 1; /* Computing MAX */ - i__3 = wrkbl, i__2 = *lda * *n + *m; - if (*lwork >= max(i__3,i__2) + *lda * *m) { + i__3 = wrkbl, i__2 = *lda * *n + *m; + if (*lwork >= max(i__3,i__2) + *lda * *m) { /* WORK(IU) is LDA by N and WORK(IR) is LDA by M */ - ldwrku = *lda; - chunk = *n; - ldwrkr = *lda; - } else /* if(complicated condition) */ { + ldwrku = *lda; + chunk = *n; + ldwrkr = *lda; + } else /* if(complicated condition) */ { /* Computing MAX */ - i__3 = wrkbl, i__2 = *lda * *n + *m; - if (*lwork >= max(i__3,i__2) + *m * *m) { + i__3 = wrkbl, i__2 = *lda * *n + *m; + if (*lwork >= max(i__3,i__2) + *m * *m) { /* WORK(IU) is LDA by N and WORK(IR) is M by M */ - ldwrku = *lda; - chunk = *n; - ldwrkr = *m; - } else { + ldwrku = *lda; + chunk = *n; + ldwrkr = *m; + } else { /* WORK(IU) is M by CHUNK and WORK(IR) is M by M */ - ldwrku = *m; - chunk = (*lwork - *m * *m - *m) / *m; - ldwrkr = *m; - } - } - itau = ir + ldwrkr * *m; - iwork = itau + *m; + ldwrku = *m; + chunk = (*lwork - *m * *m - *m) / *m; + ldwrkr = *m; + } + } + itau = ir + ldwrkr * *m; + iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__3 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] - , &i__3, &ierr); + i__3 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] + , &i__3, &ierr); /* Copy L to U, zeroing about above it */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( - ftnlen)1); - i__3 = *m - 1; - i__2 = *m - 1; - dlaset_((char *)"U", &i__3, &i__2, &c_b57, &c_b57, &u[(u_dim1 << - 1) + 1], ldu, (ftnlen)1); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( + ftnlen)1); + i__3 = *m - 1; + i__2 = *m - 1; + dlaset_((char *)"U", &i__3, &i__2, &c_b57, &c_b57, &u[(u_dim1 << + 1) + 1], ldu, (ftnlen)1); /* Generate Q in A */ /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__3 = *lwork - iwork + 1; - dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__3, &ierr); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + i__3 = *lwork - iwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__3, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in U, copying result to WORK(IR) */ /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ - i__3 = *lwork - iwork + 1; - dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__3, &ierr); - dlacpy_((char *)"U", m, m, &u[u_offset], ldu, &work[ir], &ldwrkr, - (ftnlen)1); + i__3 = *lwork - iwork + 1; + dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__3, &ierr); + dlacpy_((char *)"U", m, m, &u[u_offset], ldu, &work[ir], &ldwrkr, + (ftnlen)1); /* Generate right vectors bidiagonalizing L in WORK(IR) */ /* (Workspace: need M*M + 4*M-1, prefer M*M + 3*M + (M-1)*NB) */ - i__3 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup], & - work[iwork], &i__3, &ierr, (ftnlen)1); + i__3 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup], & + work[iwork], &i__3, &ierr, (ftnlen)1); /* Generate left vectors bidiagonalizing L in U */ /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) */ - i__3 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], & - work[iwork], &i__3, &ierr, (ftnlen)1); - iwork = ie + *m; + i__3 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], & + work[iwork], &i__3, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of L in U, and computing right */ /* singular vectors of L in WORK(IR) */ /* (Workspace: need M*M + BDSPAC) */ - dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ir], - &ldwrkr, &u[u_offset], ldu, dum, &c__1, &work[ - iwork], info, (ftnlen)1); - iu = ie + *m; + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ir], + &ldwrkr, &u[u_offset], ldu, dum, &c__1, &work[ + iwork], info, (ftnlen)1); + iu = ie + *m; /* Multiply right singular vectors of L in WORK(IR) by Q */ /* in A, storing result in WORK(IU) and copying to A */ /* (Workspace: need M*M + 2*M, prefer M*M + M*N + M)) */ - i__3 = *n; - i__2 = chunk; - for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += - i__2) { + i__3 = *n; + i__2 = chunk; + for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += + i__2) { /* Computing MIN */ - i__4 = *n - i__ + 1; - blk = min(i__4,chunk); - dgemm_((char *)"N", (char *)"N", m, &blk, m, &c_b79, &work[ir], & - ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b57, & - work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); - dlacpy_((char *)"F", m, &blk, &work[iu], &ldwrku, &a[i__ * - a_dim1 + 1], lda, (ftnlen)1); + i__4 = *n - i__ + 1; + blk = min(i__4,chunk); + dgemm_((char *)"N", (char *)"N", m, &blk, m, &c_b79, &work[ir], & + ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b57, & + work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, &blk, &work[iu], &ldwrku, &a[i__ * + a_dim1 + 1], lda, (ftnlen)1); /* L40: */ - } + } - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *m; + itau = 1; + iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] - , &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] + , &i__2, &ierr); /* Copy L to U, zeroing out above it */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( - ftnlen)1); - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 << - 1) + 1], ldu, (ftnlen)1); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( + ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 << + 1) + 1], ldu, (ftnlen)1); /* Generate Q in A */ /* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in U */ /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[ + itauq], &work[itaup], &work[iwork], &i__2, &ierr); /* Multiply right vectors bidiagonalizing L by Q in A */ /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, &work[ - itaup], &a[a_offset], lda, &work[iwork], &i__2, & - ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, &work[ + itaup], &a[a_offset], lda, &work[iwork], &i__2, & + ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); /* Generate left vectors bidiagonalizing L in U */ /* (Workspace: need 4*M, prefer 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], & - work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], & + work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in A */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); - } + } - } else if (wntvs) { + } else if (wntvs) { - if (wntun) { + if (wntun) { /* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */ /* M right singular vectors to be computed in VT and */ /* no left singular vectors to be computed */ /* Computing MAX */ - i__2 = *m << 2; - if (*lwork >= *m * *m + max(i__2,bdspac)) { + i__2 = *m << 2; + if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - ir = 1; - if (*lwork >= wrkbl + *lda * *m) { + ir = 1; + if (*lwork >= wrkbl + *lda * *m) { /* WORK(IR) is LDA by M */ - ldwrkr = *lda; - } else { + ldwrkr = *lda; + } else { /* WORK(IR) is M by M */ - ldwrkr = *m; - } - itau = ir + ldwrkr * *m; - iwork = itau + *m; + ldwrkr = *m; + } + itau = ir + ldwrkr * *m; + iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); /* Copy L to WORK(IR), zeroing out above it */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], & - ldwrkr, (ftnlen)1); - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + - ldwrkr], &ldwrkr, (ftnlen)1); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], & + ldwrkr, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + + ldwrkr], &ldwrkr, (ftnlen)1); /* Generate Q in A */ /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in WORK(IR) */ /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Generate right vectors bidiagonalizing L in */ /* WORK(IR) */ /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + (M-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of L in WORK(IR) */ /* (Workspace: need M*M + BDSPAC) */ - dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], & - work[ir], &ldwrkr, dum, &c__1, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], & + work[ir], &ldwrkr, dum, &c__1, dum, &c__1, & + work[iwork], info, (ftnlen)1); /* Multiply right singular vectors of L in WORK(IR) by */ /* Q in A, storing result in VT */ /* (Workspace: need M*M) */ - dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[ir], &ldwrkr, - &a[a_offset], lda, &c_b57, &vt[vt_offset], - ldvt, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[ir], &ldwrkr, + &a[a_offset], lda, &c_b57, &vt[vt_offset], + ldvt, (ftnlen)1, (ftnlen)1); - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *m; + itau = 1; + iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); /* Copy result to VT */ - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); /* Generate Q in VT */ /* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Zero out above L in A */ - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 - << 1) + 1], lda, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 + << 1) + 1], lda, (ftnlen)1); /* Bidiagonalize L in A */ /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Multiply right vectors bidiagonalizing L by Q in VT */ /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & - work[itaup], &vt[vt_offset], ldvt, &work[ - iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & + work[itaup], &vt[vt_offset], ldvt, &work[ + iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", m, n, &c__0, &c__0, &s[1], &work[ie], & - vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, n, &c__0, &c__0, &s[1], &work[ie], & + vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, & + work[iwork], info, (ftnlen)1); - } + } - } else if (wntuo) { + } else if (wntuo) { /* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */ /* M right singular vectors to be computed in VT and */ /* M left singular vectors to be overwritten on A */ /* Computing MAX */ - i__2 = *m << 2; - if (*lwork >= (*m << 1) * *m + max(i__2,bdspac)) { + i__2 = *m << 2; + if (*lwork >= (*m << 1) * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - iu = 1; - if (*lwork >= wrkbl + (*lda << 1) * *m) { + iu = 1; + if (*lwork >= wrkbl + (*lda << 1) * *m) { /* WORK(IU) is LDA by M and WORK(IR) is LDA by M */ - ldwrku = *lda; - ir = iu + ldwrku * *m; - ldwrkr = *lda; - } else if (*lwork >= wrkbl + (*lda + *m) * *m) { + ldwrku = *lda; + ir = iu + ldwrku * *m; + ldwrkr = *lda; + } else if (*lwork >= wrkbl + (*lda + *m) * *m) { /* WORK(IU) is LDA by M and WORK(IR) is M by M */ - ldwrku = *lda; - ir = iu + ldwrku * *m; - ldwrkr = *m; - } else { + ldwrku = *lda; + ir = iu + ldwrku * *m; + ldwrkr = *m; + } else { /* WORK(IU) is M by M and WORK(IR) is M by M */ - ldwrku = *m; - ir = iu + ldwrku * *m; - ldwrkr = *m; - } - itau = ir + ldwrkr * *m; - iwork = itau + *m; + ldwrku = *m; + ir = iu + ldwrku * *m; + ldwrkr = *m; + } + itau = ir + ldwrkr * *m; + iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); /* Copy L to WORK(IU), zeroing out below it */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - ldwrku], &ldwrku, (ftnlen)1); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + ldwrku], &ldwrku, (ftnlen)1); /* Generate Q in A */ /* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to */ /* WORK(IR) */ /* (Workspace: need 2*M*M + 4*M, */ /* prefer 2*M*M+3*M+2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &work[ir], & - ldwrkr, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &work[ir], & + ldwrkr, (ftnlen)1); /* Generate right bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need 2*M*M + 4*M-1, */ /* prefer 2*M*M+3*M+(M-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); /* Generate left bidiagonalizing vectors in WORK(IR) */ /* (Workspace: need 2*M*M + 4*M, prefer 2*M*M + 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &work[ir], &ldwrkr, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &work[ir], &ldwrkr, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of L in WORK(IR) and computing */ /* right singular vectors of L in WORK(IU) */ /* (Workspace: need 2*M*M + BDSPAC) */ - dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ - iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1, - &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ + iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1, + &work[iwork], info, (ftnlen)1); /* Multiply right singular vectors of L in WORK(IU) by */ /* Q in A, storing result in VT */ /* (Workspace: need M*M) */ - dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, - &a[a_offset], lda, &c_b57, &vt[vt_offset], - ldvt, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, + &a[a_offset], lda, &c_b57, &vt[vt_offset], + ldvt, (ftnlen)1, (ftnlen)1); /* Copy left singular vectors of L to A */ /* (Workspace: need M*M) */ - dlacpy_((char *)"F", m, m, &work[ir], &ldwrkr, &a[a_offset], - lda, (ftnlen)1); + dlacpy_((char *)"F", m, m, &work[ir], &ldwrkr, &a[a_offset], + lda, (ftnlen)1); - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *m; + itau = 1; + iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); /* Generate Q in VT */ /* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Zero out above L in A */ - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 - << 1) + 1], lda, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 + << 1) + 1], lda, (ftnlen)1); /* Bidiagonalize L in A */ /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Multiply right vectors bidiagonalizing L by Q in VT */ /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & - work[itaup], &vt[vt_offset], ldvt, &work[ - iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & + work[itaup], &vt[vt_offset], ldvt, &work[ + iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); /* Generate left bidiagonalizing vectors of L in A */ /* (Workspace: need 4*M, prefer 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], - &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, compute left */ /* singular vectors of A in A and compute right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &a[a_offset], lda, dum, & - c__1, &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &a[a_offset], lda, dum, & + c__1, &work[iwork], info, (ftnlen)1); - } + } - } else if (wntuas) { + } else if (wntuas) { /* Path 6t(N much larger than M, JOBU='S' or 'A', */ /* JOBVT='S') */ @@ -3286,524 +3286,524 @@ f"> */ /* M left singular vectors to be computed in U */ /* Computing MAX */ - i__2 = *m << 2; - if (*lwork >= *m * *m + max(i__2,bdspac)) { + i__2 = *m << 2; + if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - iu = 1; - if (*lwork >= wrkbl + *lda * *m) { + iu = 1; + if (*lwork >= wrkbl + *lda * *m) { /* WORK(IU) is LDA by N */ - ldwrku = *lda; - } else { + ldwrku = *lda; + } else { /* WORK(IU) is LDA by M */ - ldwrku = *m; - } - itau = iu + ldwrku * *m; - iwork = itau + *m; + ldwrku = *m; + } + itau = iu + ldwrku * *m; + iwork = itau + *m; /* Compute A=L*Q */ /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); /* Copy L to WORK(IU), zeroing out above it */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - ldwrku], &ldwrku, (ftnlen)1); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + ldwrku], &ldwrku, (ftnlen)1); /* Generate Q in A */ /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to U */ /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &u[u_offset], - ldu, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &u[u_offset], + ldu, (ftnlen)1); /* Generate right bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need M*M + 4*M-1, */ /* prefer M*M+3*M+(M-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); /* Generate left bidiagonalizing vectors in U */ /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], - &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of L in U and computing right */ /* singular vectors of L in WORK(IU) */ /* (Workspace: need M*M + BDSPAC) */ - dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ - iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ + iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); /* Multiply right singular vectors of L in WORK(IU) by */ /* Q in A, storing result in VT */ /* (Workspace: need M*M) */ - dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, - &a[a_offset], lda, &c_b57, &vt[vt_offset], - ldvt, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, + &a[a_offset], lda, &c_b57, &vt[vt_offset], + ldvt, (ftnlen)1, (ftnlen)1); - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *m; + itau = 1; + iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); /* Generate Q in VT */ /* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); /* Copy L to U, zeroing out above it */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 - << 1) + 1], ldu, (ftnlen)1); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 + << 1) + 1], ldu, (ftnlen)1); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in U */ /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Multiply right bidiagonalizing vectors in U by Q */ /* in VT */ /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, & - work[itaup], &vt[vt_offset], ldvt, &work[ - iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, & + work[itaup], &vt[vt_offset], ldvt, &work[ + iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); /* Generate left bidiagonalizing vectors in U */ /* (Workspace: need 4*M, prefer 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], - &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &u[u_offset], ldu, dum, & - c__1, &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &u[u_offset], ldu, dum, & + c__1, &work[iwork], info, (ftnlen)1); - } + } - } + } - } else if (wntva) { + } else if (wntva) { - if (wntun) { + if (wntun) { /* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */ /* N right singular vectors to be computed in VT and */ /* no left singular vectors to be computed */ /* Computing MAX */ - i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); - if (*lwork >= *m * *m + max(i__2,bdspac)) { + i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); + if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - ir = 1; - if (*lwork >= wrkbl + *lda * *m) { + ir = 1; + if (*lwork >= wrkbl + *lda * *m) { /* WORK(IR) is LDA by M */ - ldwrkr = *lda; - } else { + ldwrkr = *lda; + } else { /* WORK(IR) is M by M */ - ldwrkr = *m; - } - itau = ir + ldwrkr * *m; - iwork = itau + *m; + ldwrkr = *m; + } + itau = ir + ldwrkr * *m; + iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); /* Copy L to WORK(IR), zeroing out above it */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], & - ldwrkr, (ftnlen)1); - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + - ldwrkr], &ldwrkr, (ftnlen)1); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], & + ldwrkr, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + + ldwrkr], &ldwrkr, (ftnlen)1); /* Generate Q in VT */ /* (Workspace: need M*M + M + N, prefer M*M + M + N*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + i__2 = *lwork - iwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in WORK(IR) */ /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Generate right bidiagonalizing vectors in WORK(IR) */ /* (Workspace: need M*M + 4*M-1, */ /* prefer M*M+3*M+(M-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of L in WORK(IR) */ /* (Workspace: need M*M + BDSPAC) */ - dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], & - work[ir], &ldwrkr, dum, &c__1, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], & + work[ir], &ldwrkr, dum, &c__1, dum, &c__1, & + work[iwork], info, (ftnlen)1); /* Multiply right singular vectors of L in WORK(IR) by */ /* Q in VT, storing result in A */ /* (Workspace: need M*M) */ - dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[ir], &ldwrkr, - &vt[vt_offset], ldvt, &c_b57, &a[a_offset], - lda, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[ir], &ldwrkr, + &vt[vt_offset], ldvt, &c_b57, &a[a_offset], + lda, (ftnlen)1, (ftnlen)1); /* Copy right singular vectors of A from A to VT */ - dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *m; + itau = 1; + iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); /* Generate Q in VT */ /* (Workspace: need M + N, prefer M + N*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + i__2 = *lwork - iwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Zero out above L in A */ - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 - << 1) + 1], lda, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 + << 1) + 1], lda, (ftnlen)1); /* Bidiagonalize L in A */ /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Multiply right bidiagonalizing vectors in A by Q */ /* in VT */ /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & - work[itaup], &vt[vt_offset], ldvt, &work[ - iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & + work[itaup], &vt[vt_offset], ldvt, &work[ + iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", m, n, &c__0, &c__0, &s[1], &work[ie], & - vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, n, &c__0, &c__0, &s[1], &work[ie], & + vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, & + work[iwork], info, (ftnlen)1); - } + } - } else if (wntuo) { + } else if (wntuo) { /* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */ /* N right singular vectors to be computed in VT and */ /* M left singular vectors to be overwritten on A */ /* Computing MAX */ - i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); - if (*lwork >= (*m << 1) * *m + max(i__2,bdspac)) { + i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); + if (*lwork >= (*m << 1) * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - iu = 1; - if (*lwork >= wrkbl + (*lda << 1) * *m) { + iu = 1; + if (*lwork >= wrkbl + (*lda << 1) * *m) { /* WORK(IU) is LDA by M and WORK(IR) is LDA by M */ - ldwrku = *lda; - ir = iu + ldwrku * *m; - ldwrkr = *lda; - } else if (*lwork >= wrkbl + (*lda + *m) * *m) { + ldwrku = *lda; + ir = iu + ldwrku * *m; + ldwrkr = *lda; + } else if (*lwork >= wrkbl + (*lda + *m) * *m) { /* WORK(IU) is LDA by M and WORK(IR) is M by M */ - ldwrku = *lda; - ir = iu + ldwrku * *m; - ldwrkr = *m; - } else { + ldwrku = *lda; + ir = iu + ldwrku * *m; + ldwrkr = *m; + } else { /* WORK(IU) is M by M and WORK(IR) is M by M */ - ldwrku = *m; - ir = iu + ldwrku * *m; - ldwrkr = *m; - } - itau = ir + ldwrkr * *m; - iwork = itau + *m; + ldwrku = *m; + ir = iu + ldwrku * *m; + ldwrkr = *m; + } + itau = ir + ldwrkr * *m; + iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); /* Generate Q in VT */ /* (Workspace: need 2*M*M + M + N, prefer 2*M*M + M + N*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); /* Copy L to WORK(IU), zeroing out above it */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - ldwrku], &ldwrku, (ftnlen)1); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + ldwrku], &ldwrku, (ftnlen)1); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to */ /* WORK(IR) */ /* (Workspace: need 2*M*M + 4*M, */ /* prefer 2*M*M+3*M+2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &work[ir], & - ldwrkr, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &work[ir], & + ldwrkr, (ftnlen)1); /* Generate right bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need 2*M*M + 4*M-1, */ /* prefer 2*M*M+3*M+(M-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); /* Generate left bidiagonalizing vectors in WORK(IR) */ /* (Workspace: need 2*M*M + 4*M, prefer 2*M*M + 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &work[ir], &ldwrkr, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &work[ir], &ldwrkr, &work[itauq] + , &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of L in WORK(IR) and computing */ /* right singular vectors of L in WORK(IU) */ /* (Workspace: need 2*M*M + BDSPAC) */ - dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ - iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1, - &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ + iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1, + &work[iwork], info, (ftnlen)1); /* Multiply right singular vectors of L in WORK(IU) by */ /* Q in VT, storing result in A */ /* (Workspace: need M*M) */ - dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, - &vt[vt_offset], ldvt, &c_b57, &a[a_offset], - lda, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, + &vt[vt_offset], ldvt, &c_b57, &a[a_offset], + lda, (ftnlen)1, (ftnlen)1); /* Copy right singular vectors of A from A to VT */ - dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); /* Copy left singular vectors of A from WORK(IR) to A */ - dlacpy_((char *)"F", m, m, &work[ir], &ldwrkr, &a[a_offset], - lda, (ftnlen)1); + dlacpy_((char *)"F", m, m, &work[ir], &ldwrkr, &a[a_offset], + lda, (ftnlen)1); - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *m; + itau = 1; + iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); /* Generate Q in VT */ /* (Workspace: need M + N, prefer M + N*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + i__2 = *lwork - iwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Zero out above L in A */ - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 - << 1) + 1], lda, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 + << 1) + 1], lda, (ftnlen)1); /* Bidiagonalize L in A */ /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Multiply right bidiagonalizing vectors in A by Q */ /* in VT */ /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & - work[itaup], &vt[vt_offset], ldvt, &work[ - iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & + work[itaup], &vt[vt_offset], ldvt, &work[ + iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); /* Generate left bidiagonalizing vectors in A */ /* (Workspace: need 4*M, prefer 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], - &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in A and computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &a[a_offset], lda, dum, & - c__1, &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &a[a_offset], lda, dum, & + c__1, &work[iwork], info, (ftnlen)1); - } + } - } else if (wntuas) { + } else if (wntuas) { /* Path 9t(N much larger than M, JOBU='S' or 'A', */ /* JOBVT='A') */ @@ -3811,293 +3811,293 @@ f"> */ /* M left singular vectors to be computed in U */ /* Computing MAX */ - i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); - if (*lwork >= *m * *m + max(i__2,bdspac)) { + i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); + if (*lwork >= *m * *m + max(i__2,bdspac)) { /* Sufficient workspace for a fast algorithm */ - iu = 1; - if (*lwork >= wrkbl + *lda * *m) { + iu = 1; + if (*lwork >= wrkbl + *lda * *m) { /* WORK(IU) is LDA by M */ - ldwrku = *lda; - } else { + ldwrku = *lda; + } else { /* WORK(IU) is M by M */ - ldwrku = *m; - } - itau = iu + ldwrku * *m; - iwork = itau + *m; + ldwrku = *m; + } + itau = iu + ldwrku * *m; + iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); /* Generate Q in VT */ /* (Workspace: need M*M + M + N, prefer M*M + M + N*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); /* Copy L to WORK(IU), zeroing out above it */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - ldwrku], &ldwrku, (ftnlen)1); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & + ldwrku, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + + ldwrku], &ldwrku, (ftnlen)1); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in WORK(IU), copying result to U */ /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &u[u_offset], - ldu, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); + dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &u[u_offset], + ldu, (ftnlen)1); /* Generate right bidiagonalizing vectors in WORK(IU) */ /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + (M-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] + , &work[iwork], &i__2, &ierr, (ftnlen)1); /* Generate left bidiagonalizing vectors in U */ /* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], - &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of L in U and computing right */ /* singular vectors of L in WORK(IU) */ /* (Workspace: need M*M + BDSPAC) */ - dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ - iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ + iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); /* Multiply right singular vectors of L in WORK(IU) by */ /* Q in VT, storing result in A */ /* (Workspace: need M*M) */ - dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, - &vt[vt_offset], ldvt, &c_b57, &a[a_offset], - lda, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, + &vt[vt_offset], ldvt, &c_b57, &a[a_offset], + lda, (ftnlen)1, (ftnlen)1); /* Copy right singular vectors of A from A to VT */ - dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); - } else { + } else { /* Insufficient workspace for a fast algorithm */ - itau = 1; - iwork = itau + *m; + itau = 1; + iwork = itau + *m; /* Compute A=L*Q, copying result to VT */ /* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + i__2 = *lwork - iwork + 1; + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ + iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], + ldvt, (ftnlen)1); /* Generate Q in VT */ /* (Workspace: need M + N, prefer M + N*NB) */ - i__2 = *lwork - iwork + 1; - dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); + i__2 = *lwork - iwork + 1; + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & + work[iwork], &i__2, &ierr); /* Copy L to U, zeroing out above it */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - i__2 = *m - 1; - i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 - << 1) + 1], ldu, (ftnlen)1); - ie = itau; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], + ldu, (ftnlen)1); + i__2 = *m - 1; + i__3 = *m - 1; + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 + << 1) + 1], ldu, (ftnlen)1); + ie = itau; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize L in U */ /* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); + i__2 = *lwork - iwork + 1; + dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], & + work[itauq], &work[itaup], &work[iwork], & + i__2, &ierr); /* Multiply right bidiagonalizing vectors in U by Q */ /* in VT */ /* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, & - work[itaup], &vt[vt_offset], ldvt, &work[ - iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); + i__2 = *lwork - iwork + 1; + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, & + work[itaup], &vt[vt_offset], ldvt, &work[ + iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); /* Generate left bidiagonalizing vectors in U */ /* (Workspace: need 4*M, prefer 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], - &work[iwork], &i__2, &ierr, (ftnlen)1); - iwork = ie + *m; + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], + &work[iwork], &i__2, &ierr, (ftnlen)1); + iwork = ie + *m; /* Perform bidiagonal QR iteration, computing left */ /* singular vectors of A in U and computing right */ /* singular vectors of A in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &u[u_offset], ldu, dum, & - c__1, &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &u[u_offset], ldu, dum, & + c__1, &work[iwork], info, (ftnlen)1); - } + } - } + } - } + } - } else { + } else { /* N .LT. MNTHR */ /* Path 10t(N greater than M, but not much larger) */ /* Reduce to bidiagonal form without LQ decomposition */ - ie = 1; - itauq = ie + *m; - itaup = itauq + *m; - iwork = itaup + *m; + ie = 1; + itauq = ie + *m; + itaup = itauq + *m; + iwork = itaup + *m; /* Bidiagonalize A */ /* (Workspace: need 3*M + N, prefer 3*M + (M + N)*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & - work[itaup], &work[iwork], &i__2, &ierr); - if (wntuas) { + i__2 = *lwork - iwork + 1; + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & + work[itaup], &work[iwork], &i__2, &ierr); + if (wntuas) { /* If left singular vectors desired in U, copy result to U */ /* and generate left bidiagonalizing vectors in U */ /* (Workspace: need 4*M-1, prefer 3*M + (M-1)*NB) */ - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( - ftnlen)1); - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[ - iwork], &i__2, &ierr, (ftnlen)1); - } - if (wntvas) { + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( + ftnlen)1); + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[ + iwork], &i__2, &ierr, (ftnlen)1); + } + if (wntvas) { /* If right singular vectors desired in VT, copy result to */ /* VT and generate right bidiagonalizing vectors in VT */ /* (Workspace: need 3*M + NRVT, prefer 3*M + NRVT*NB) */ - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, ( - ftnlen)1); - if (wntva) { - nrvt = *n; - } - if (wntvs) { - nrvt = *m; - } - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", &nrvt, n, m, &vt[vt_offset], ldvt, &work[itaup], - &work[iwork], &i__2, &ierr, (ftnlen)1); - } - if (wntuo) { + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, ( + ftnlen)1); + if (wntva) { + nrvt = *n; + } + if (wntvs) { + nrvt = *m; + } + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", &nrvt, n, m, &vt[vt_offset], ldvt, &work[itaup], + &work[iwork], &i__2, &ierr, (ftnlen)1); + } + if (wntuo) { /* If left singular vectors desired in A, generate left */ /* bidiagonalizing vectors in A */ /* (Workspace: need 4*M-1, prefer 3*M + (M-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, n, &a[a_offset], lda, &work[itauq], &work[ - iwork], &i__2, &ierr, (ftnlen)1); - } - if (wntvo) { + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"Q", m, m, n, &a[a_offset], lda, &work[itauq], &work[ + iwork], &i__2, &ierr, (ftnlen)1); + } + if (wntvo) { /* If right singular vectors desired in A, generate right */ /* bidiagonalizing vectors in A */ /* (Workspace: need 4*M, prefer 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], &work[ - iwork], &i__2, &ierr, (ftnlen)1); - } - iwork = ie + *m; - if (wntuas || wntuo) { - nru = *m; - } - if (wntun) { - nru = 0; - } - if (wntvas || wntvo) { - ncvt = *n; - } - if (wntvn) { - ncvt = 0; - } - if (! wntuo && ! wntvo) { + i__2 = *lwork - iwork + 1; + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], &work[ + iwork], &i__2, &ierr, (ftnlen)1); + } + iwork = ie + *m; + if (wntuas || wntuo) { + nru = *m; + } + if (wntun) { + nru = 0; + } + if (wntvas || wntvo) { + ncvt = *n; + } + if (wntvn) { + ncvt = 0; + } + if (! wntuo && ! wntvo) { /* Perform bidiagonal QR iteration, if desired, computing */ /* left singular vectors in U and computing right singular */ /* vectors in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); - } else if (! wntuo && wntvo) { + dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, & + work[iwork], info, (ftnlen)1); + } else if (! wntuo && wntvo) { /* Perform bidiagonal QR iteration, if desired, computing */ /* left singular vectors in U and computing right singular */ /* vectors in A */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[ - iwork], info, (ftnlen)1); - } else { + dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[ + a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[ + iwork], info, (ftnlen)1); + } else { /* Perform bidiagonal QR iteration, if desired, computing */ /* left singular vectors in A and computing right singular */ /* vectors in VT */ /* (Workspace: need BDSPAC) */ - dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & - work[iwork], info, (ftnlen)1); - } + dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ + vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & + work[iwork], info, (ftnlen)1); + } - } + } } @@ -4105,42 +4105,42 @@ f"> */ /* to WORK( 2:MINMN ) */ if (*info != 0) { - if (ie > 2) { - i__2 = minmn - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - work[i__ + 1] = work[i__ + ie - 1]; + if (ie > 2) { + i__2 = minmn - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + work[i__ + 1] = work[i__ + ie - 1]; /* L50: */ - } - } - if (ie < 2) { - for (i__ = minmn - 1; i__ >= 1; --i__) { - work[i__ + 1] = work[i__ + ie - 1]; + } + } + if (ie < 2) { + for (i__ = minmn - 1; i__ >= 1; --i__) { + work[i__ + 1] = work[i__ + ie - 1]; /* L60: */ - } - } + } + } } /* Undo scaling if necessary */ if (iscl == 1) { - if (anrm > bignum) { - dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & - minmn, &ierr, (ftnlen)1); - } - if (*info != 0 && anrm > bignum) { - i__2 = minmn - 1; - dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &i__2, &c__1, &work[2], - &minmn, &ierr, (ftnlen)1); - } - if (anrm < smlnum) { - dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & - minmn, &ierr, (ftnlen)1); - } - if (*info != 0 && anrm < smlnum) { - i__2 = minmn - 1; - dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &i__2, &c__1, &work[2], - &minmn, &ierr, (ftnlen)1); - } + if (anrm > bignum) { + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & + minmn, &ierr, (ftnlen)1); + } + if (*info != 0 && anrm > bignum) { + i__2 = minmn - 1; + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &i__2, &c__1, &work[2], + &minmn, &ierr, (ftnlen)1); + } + if (anrm < smlnum) { + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & + minmn, &ierr, (ftnlen)1); + } + if (*info != 0 && anrm < smlnum) { + i__2 = minmn - 1; + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &i__2, &c__1, &work[2], + &minmn, &ierr, (ftnlen)1); + } } /* Return optimal workspace in WORK(1) */ @@ -4154,5 +4154,5 @@ f"> */ } /* dgesvd_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgetf2.cpp b/lib/linalg/dgetf2.cpp index 0cb6b57a2f..c5951c8703 100644 --- a/lib/linalg/dgetf2.cpp +++ b/lib/linalg/dgetf2.cpp @@ -1,13 +1,13 @@ /* fortran/dgetf2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -131,7 +131,7 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dgetf2_(integer *m, integer *n, doublereal *a, integer * - lda, integer *ipiv, integer *info) + lda, integer *ipiv, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -139,13 +139,13 @@ f"> */ /* Local variables */ integer i__, j, jp; - extern /* Subroutine */ int dger_(integer *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *), dscal_(integer *, doublereal *, doublereal *, integer - *); + extern /* Subroutine */ int dger_(integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *), dscal_(integer *, doublereal *, doublereal *, integer + *); doublereal sfmin; - extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, + doublereal *, integer *); extern doublereal dlamch_(char *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); @@ -185,22 +185,22 @@ f"> */ /* Function Body */ *info = 0; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*m)) { - *info = -4; + *info = -4; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGETF2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGETF2", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { - return 0; + return 0; } /* Compute machine safe minimum */ @@ -212,47 +212,47 @@ f"> */ /* Find pivot and test for singularity. */ - i__2 = *m - j + 1; - jp = j - 1 + idamax_(&i__2, &a[j + j * a_dim1], &c__1); - ipiv[j] = jp; - if (a[jp + j * a_dim1] != 0.) { + i__2 = *m - j + 1; + jp = j - 1 + idamax_(&i__2, &a[j + j * a_dim1], &c__1); + ipiv[j] = jp; + if (a[jp + j * a_dim1] != 0.) { /* Apply the interchange to columns 1:N. */ - if (jp != j) { - dswap_(n, &a[j + a_dim1], lda, &a[jp + a_dim1], lda); - } + if (jp != j) { + dswap_(n, &a[j + a_dim1], lda, &a[jp + a_dim1], lda); + } /* Compute elements J+1:M of J-th column. */ - if (j < *m) { - if ((d__1 = a[j + j * a_dim1], abs(d__1)) >= sfmin) { - i__2 = *m - j; - d__1 = 1. / a[j + j * a_dim1]; - dscal_(&i__2, &d__1, &a[j + 1 + j * a_dim1], &c__1); - } else { - i__2 = *m - j; - for (i__ = 1; i__ <= i__2; ++i__) { - a[j + i__ + j * a_dim1] /= a[j + j * a_dim1]; + if (j < *m) { + if ((d__1 = a[j + j * a_dim1], abs(d__1)) >= sfmin) { + i__2 = *m - j; + d__1 = 1. / a[j + j * a_dim1]; + dscal_(&i__2, &d__1, &a[j + 1 + j * a_dim1], &c__1); + } else { + i__2 = *m - j; + for (i__ = 1; i__ <= i__2; ++i__) { + a[j + i__ + j * a_dim1] /= a[j + j * a_dim1]; /* L20: */ - } - } - } + } + } + } - } else if (*info == 0) { + } else if (*info == 0) { - *info = j; - } + *info = j; + } - if (j < min(*m,*n)) { + if (j < min(*m,*n)) { /* Update trailing submatrix. */ - i__2 = *m - j; - i__3 = *n - j; - dger_(&i__2, &i__3, &c_b8, &a[j + 1 + j * a_dim1], &c__1, &a[j + ( - j + 1) * a_dim1], lda, &a[j + 1 + (j + 1) * a_dim1], lda); - } + i__2 = *m - j; + i__3 = *n - j; + dger_(&i__2, &i__3, &c_b8, &a[j + 1 + j * a_dim1], &c__1, &a[j + ( + j + 1) * a_dim1], lda, &a[j + 1 + (j + 1) * a_dim1], lda); + } /* L10: */ } return 0; @@ -262,5 +262,5 @@ f"> */ } /* dgetf2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgetrf.cpp b/lib/linalg/dgetrf.cpp index eca7500a03..cd1e8b50fe 100644 --- a/lib/linalg/dgetrf.cpp +++ b/lib/linalg/dgetrf.cpp @@ -1,13 +1,13 @@ /* fortran/dgetrf.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -132,26 +132,26 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dgetrf_(integer *m, integer *n, doublereal *a, integer * - lda, integer *ipiv, integer *info) + lda, integer *ipiv, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; /* Local variables */ integer i__, j, jb, nb; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); integer iinfo; - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), xerbla_( - char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dlaswp_(integer *, doublereal *, integer *, - integer *, integer *, integer *, integer *), dgetrf2_(integer *, - integer *, doublereal *, integer *, integer *, integer *); + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), xerbla_( + char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dlaswp_(integer *, doublereal *, integer *, + integer *, integer *, integer *, integer *), dgetrf2_(integer *, + integer *, doublereal *, integer *, integer *, integer *); /* -- LAPACK computational routine -- */ @@ -188,99 +188,99 @@ f"> */ /* Function Body */ *info = 0; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*m)) { - *info = -4; + *info = -4; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGETRF", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGETRF", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { - return 0; + return 0; } /* Determine the block size for this environment. */ nb = ilaenv_(&c__1, (char *)"DGETRF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen) - 1); + 1); if (nb <= 1 || nb >= min(*m,*n)) { /* Use unblocked code. */ - dgetrf2_(m, n, &a[a_offset], lda, &ipiv[1], info); + dgetrf2_(m, n, &a[a_offset], lda, &ipiv[1], info); } else { /* Use blocked code. */ - i__1 = min(*m,*n); - i__2 = nb; - for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + i__1 = min(*m,*n); + i__2 = nb; + for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Computing MIN */ - i__3 = min(*m,*n) - j + 1; - jb = min(i__3,nb); + i__3 = min(*m,*n) - j + 1; + jb = min(i__3,nb); /* Factor diagonal and subdiagonal blocks and test for exact */ /* singularity. */ - i__3 = *m - j + 1; - dgetrf2_(&i__3, &jb, &a[j + j * a_dim1], lda, &ipiv[j], &iinfo); + i__3 = *m - j + 1; + dgetrf2_(&i__3, &jb, &a[j + j * a_dim1], lda, &ipiv[j], &iinfo); /* Adjust INFO and the pivot indices. */ - if (*info == 0 && iinfo > 0) { - *info = iinfo + j - 1; - } + if (*info == 0 && iinfo > 0) { + *info = iinfo + j - 1; + } /* Computing MIN */ - i__4 = *m, i__5 = j + jb - 1; - i__3 = min(i__4,i__5); - for (i__ = j; i__ <= i__3; ++i__) { - ipiv[i__] = j - 1 + ipiv[i__]; + i__4 = *m, i__5 = j + jb - 1; + i__3 = min(i__4,i__5); + for (i__ = j; i__ <= i__3; ++i__) { + ipiv[i__] = j - 1 + ipiv[i__]; /* L10: */ - } + } /* Apply interchanges to columns 1:J-1. */ - i__3 = j - 1; - i__4 = j + jb - 1; - dlaswp_(&i__3, &a[a_offset], lda, &j, &i__4, &ipiv[1], &c__1); + i__3 = j - 1; + i__4 = j + jb - 1; + dlaswp_(&i__3, &a[a_offset], lda, &j, &i__4, &ipiv[1], &c__1); - if (j + jb <= *n) { + if (j + jb <= *n) { /* Apply interchanges to columns J+JB:N. */ - i__3 = *n - j - jb + 1; - i__4 = j + jb - 1; - dlaswp_(&i__3, &a[(j + jb) * a_dim1 + 1], lda, &j, &i__4, & - ipiv[1], &c__1); + i__3 = *n - j - jb + 1; + i__4 = j + jb - 1; + dlaswp_(&i__3, &a[(j + jb) * a_dim1 + 1], lda, &j, &i__4, & + ipiv[1], &c__1); /* Compute block row of U. */ - i__3 = *n - j - jb + 1; - dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Unit", &jb, &i__3, & - c_b16, &a[j + j * a_dim1], lda, &a[j + (j + jb) * - a_dim1], lda, (ftnlen)4, (ftnlen)5, (ftnlen)12, ( - ftnlen)4); - if (j + jb <= *m) { + i__3 = *n - j - jb + 1; + dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Unit", &jb, &i__3, & + c_b16, &a[j + j * a_dim1], lda, &a[j + (j + jb) * + a_dim1], lda, (ftnlen)4, (ftnlen)5, (ftnlen)12, ( + ftnlen)4); + if (j + jb <= *m) { /* Update trailing submatrix. */ - i__3 = *m - j - jb + 1; - i__4 = *n - j - jb + 1; - dgemm_((char *)"No transpose", (char *)"No transpose", &i__3, &i__4, &jb, - &c_b19, &a[j + jb + j * a_dim1], lda, &a[j + (j + - jb) * a_dim1], lda, &c_b16, &a[j + jb + (j + jb) * - a_dim1], lda, (ftnlen)12, (ftnlen)12); - } - } + i__3 = *m - j - jb + 1; + i__4 = *n - j - jb + 1; + dgemm_((char *)"No transpose", (char *)"No transpose", &i__3, &i__4, &jb, + &c_b19, &a[j + jb + j * a_dim1], lda, &a[j + (j + + jb) * a_dim1], lda, &c_b16, &a[j + jb + (j + jb) * + a_dim1], lda, (ftnlen)12, (ftnlen)12); + } + } /* L20: */ - } + } } return 0; @@ -289,5 +289,5 @@ f"> */ } /* dgetrf_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgetrf2.cpp b/lib/linalg/dgetrf2.cpp index 94162fdca8..c7097bbfed 100644 --- a/lib/linalg/dgetrf2.cpp +++ b/lib/linalg/dgetrf2.cpp @@ -1,13 +1,13 @@ /* static/dgetrf2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -133,7 +133,7 @@ static doublereal c_b16 = -1.; /* ===================================================================== */ /* Subroutine */ int dgetrf2_(integer *m, integer *n, doublereal *a, integer * - lda, integer *ipiv, integer *info) + lda, integer *ipiv, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -142,20 +142,20 @@ static doublereal c_b16 = -1.; /* Local variables */ integer i__, n1, n2; doublereal temp; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dgemm_(char *, char *, integer *, integer *, integer * - , doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dgemm_(char *, char *, integer *, integer *, integer * + , doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen, ftnlen); integer iinfo; doublereal sfmin; - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); extern doublereal dlamch_(char *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dlaswp_( - integer *, doublereal *, integer *, integer *, integer *, integer - *, integer *); + integer *, doublereal *, integer *, integer *, integer *, integer + *, integer *); /* -- LAPACK computational routine -- */ @@ -192,32 +192,32 @@ static doublereal c_b16 = -1.; /* Function Body */ *info = 0; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*m)) { - *info = -4; + *info = -4; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGETRF2", &i__1, (ftnlen)7); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGETRF2", &i__1, (ftnlen)7); + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { - return 0; + return 0; } if (*m == 1) { /* Use unblocked code for one row case */ /* Just need to handle IPIV and INFO */ - ipiv[1] = 1; - if (a[a_dim1 + 1] == 0.) { - *info = 1; - } + ipiv[1] = 1; + if (a[a_dim1 + 1] == 0.) { + *info = 1; + } } else if (*n == 1) { @@ -226,98 +226,98 @@ static doublereal c_b16 = -1.; /* Compute machine safe minimum */ - sfmin = dlamch_((char *)"S", (ftnlen)1); + sfmin = dlamch_((char *)"S", (ftnlen)1); /* Find pivot and test for singularity */ - i__ = idamax_(m, &a[a_dim1 + 1], &c__1); - ipiv[1] = i__; - if (a[i__ + a_dim1] != 0.) { + i__ = idamax_(m, &a[a_dim1 + 1], &c__1); + ipiv[1] = i__; + if (a[i__ + a_dim1] != 0.) { /* Apply the interchange */ - if (i__ != 1) { - temp = a[a_dim1 + 1]; - a[a_dim1 + 1] = a[i__ + a_dim1]; - a[i__ + a_dim1] = temp; - } + if (i__ != 1) { + temp = a[a_dim1 + 1]; + a[a_dim1 + 1] = a[i__ + a_dim1]; + a[i__ + a_dim1] = temp; + } /* Compute elements 2:M of the column */ - if ((d__1 = a[a_dim1 + 1], abs(d__1)) >= sfmin) { - i__1 = *m - 1; - d__1 = 1. / a[a_dim1 + 1]; - dscal_(&i__1, &d__1, &a[a_dim1 + 2], &c__1); - } else { - i__1 = *m - 1; - for (i__ = 1; i__ <= i__1; ++i__) { - a[i__ + 1 + a_dim1] /= a[a_dim1 + 1]; + if ((d__1 = a[a_dim1 + 1], abs(d__1)) >= sfmin) { + i__1 = *m - 1; + d__1 = 1. / a[a_dim1 + 1]; + dscal_(&i__1, &d__1, &a[a_dim1 + 2], &c__1); + } else { + i__1 = *m - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + a[i__ + 1 + a_dim1] /= a[a_dim1 + 1]; /* L10: */ - } - } + } + } - } else { - *info = 1; - } + } else { + *info = 1; + } } else { /* Use recursive code */ - n1 = min(*m,*n) / 2; - n2 = *n - n1; + n1 = min(*m,*n) / 2; + n2 = *n - n1; /* [ A11 ] */ /* Factor [ --- ] */ /* [ A21 ] */ - dgetrf2_(m, &n1, &a[a_offset], lda, &ipiv[1], &iinfo); - if (*info == 0 && iinfo > 0) { - *info = iinfo; - } + dgetrf2_(m, &n1, &a[a_offset], lda, &ipiv[1], &iinfo); + if (*info == 0 && iinfo > 0) { + *info = iinfo; + } /* [ A12 ] */ /* Apply interchanges to [ --- ] */ /* [ A22 ] */ - dlaswp_(&n2, &a[(n1 + 1) * a_dim1 + 1], lda, &c__1, &n1, &ipiv[1], & - c__1); + dlaswp_(&n2, &a[(n1 + 1) * a_dim1 + 1], lda, &c__1, &n1, &ipiv[1], & + c__1); /* Solve A12 */ - dtrsm_((char *)"L", (char *)"L", (char *)"N", (char *)"U", &n1, &n2, &c_b13, &a[a_offset], lda, &a[( - n1 + 1) * a_dim1 + 1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); + dtrsm_((char *)"L", (char *)"L", (char *)"N", (char *)"U", &n1, &n2, &c_b13, &a[a_offset], lda, &a[( + n1 + 1) * a_dim1 + 1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); /* Update A22 */ - i__1 = *m - n1; - dgemm_((char *)"N", (char *)"N", &i__1, &n2, &n1, &c_b16, &a[n1 + 1 + a_dim1], lda, & - a[(n1 + 1) * a_dim1 + 1], lda, &c_b13, &a[n1 + 1 + (n1 + 1) * - a_dim1], lda, (ftnlen)1, (ftnlen)1); + i__1 = *m - n1; + dgemm_((char *)"N", (char *)"N", &i__1, &n2, &n1, &c_b16, &a[n1 + 1 + a_dim1], lda, & + a[(n1 + 1) * a_dim1 + 1], lda, &c_b13, &a[n1 + 1 + (n1 + 1) * + a_dim1], lda, (ftnlen)1, (ftnlen)1); /* Factor A22 */ - i__1 = *m - n1; - dgetrf2_(&i__1, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &ipiv[n1 + - 1], &iinfo); + i__1 = *m - n1; + dgetrf2_(&i__1, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &ipiv[n1 + + 1], &iinfo); /* Adjust INFO and the pivot indices */ - if (*info == 0 && iinfo > 0) { - *info = iinfo + n1; - } - i__1 = min(*m,*n); - for (i__ = n1 + 1; i__ <= i__1; ++i__) { - ipiv[i__] += n1; + if (*info == 0 && iinfo > 0) { + *info = iinfo + n1; + } + i__1 = min(*m,*n); + for (i__ = n1 + 1; i__ <= i__1; ++i__) { + ipiv[i__] += n1; /* L20: */ - } + } /* Apply interchanges to A21 */ - i__1 = n1 + 1; - i__2 = min(*m,*n); - dlaswp_(&n1, &a[a_dim1 + 1], lda, &i__1, &i__2, &ipiv[1], &c__1); + i__1 = n1 + 1; + i__2 = min(*m,*n); + dlaswp_(&n1, &a[a_dim1 + 1], lda, &i__1, &i__2, &ipiv[1], &c__1); } return 0; @@ -327,5 +327,5 @@ static doublereal c_b16 = -1.; } /* dgetrf2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgetri.cpp b/lib/linalg/dgetri.cpp index 23178071b6..368c6701ac 100644 --- a/lib/linalg/dgetri.cpp +++ b/lib/linalg/dgetri.cpp @@ -1,13 +1,13 @@ /* fortran/dgetri.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -138,31 +138,31 @@ f"> */ /* > \ingroup doubleGEcomputational */ /* ===================================================================== */ -/* Subroutine */ int dgetri_(integer *n, doublereal *a, integer *lda, integer - *ipiv, doublereal *work, integer *lwork, integer *info) +/* Subroutine */ int dgetri_(integer *n, doublereal *a, integer *lda, integer + *ipiv, doublereal *work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, jb, nb, jj, jp, nn, iws; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), - dgemv_(char *, integer *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, ftnlen); + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), + dgemv_(char *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, ftnlen); integer nbmin; - extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, - doublereal *, integer *), dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), xerbla_( - char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, + doublereal *, integer *), dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), xerbla_( + char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); integer ldwork; - extern /* Subroutine */ int dtrtri_(char *, char *, integer *, doublereal - *, integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dtrtri_(char *, char *, integer *, doublereal + *, integer *, integer *, ftnlen, ftnlen); integer lwkopt; logical lquery; @@ -202,55 +202,55 @@ f"> */ /* Function Body */ *info = 0; nb = ilaenv_(&c__1, (char *)"DGETRI", (char *)" ", n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( - ftnlen)1); + ftnlen)1); lwkopt = *n * nb; work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*n < 0) { - *info = -1; + *info = -1; } else if (*lda < max(1,*n)) { - *info = -3; + *info = -3; } else if (*lwork < max(1,*n) && ! lquery) { - *info = -6; + *info = -6; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGETRI", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGETRI", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } /* Form inv(U). If INFO > 0 from DTRTRI, then U is singular, */ /* and the inverse is not computed. */ dtrtri_((char *)"Upper", (char *)"Non-unit", n, &a[a_offset], lda, info, (ftnlen)5, ( - ftnlen)8); + ftnlen)8); if (*info > 0) { - return 0; + return 0; } nbmin = 2; ldwork = *n; if (nb > 1 && nb < *n) { /* Computing MAX */ - i__1 = ldwork * nb; - iws = max(i__1,1); - if (*lwork < iws) { - nb = *lwork / ldwork; + i__1 = ldwork * nb; + iws = max(i__1,1); + if (*lwork < iws) { + nb = *lwork / ldwork; /* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DGETRI", (char *)" ", n, &c_n1, &c_n1, & - c_n1, (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); - } + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DGETRI", (char *)" ", n, &c_n1, &c_n1, & + c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } } else { - iws = *n; + iws = *n; } /* Solve the equation inv(A)*L = inv(U) for inv(A). */ @@ -259,75 +259,75 @@ f"> */ /* Use unblocked code. */ - for (j = *n; j >= 1; --j) { + for (j = *n; j >= 1; --j) { /* Copy current column of L to WORK and replace with zeros. */ - i__1 = *n; - for (i__ = j + 1; i__ <= i__1; ++i__) { - work[i__] = a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = 0.; + i__1 = *n; + for (i__ = j + 1; i__ <= i__1; ++i__) { + work[i__] = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = 0.; /* L10: */ - } + } /* Compute current column of inv(A). */ - if (j < *n) { - i__1 = *n - j; - dgemv_((char *)"No transpose", n, &i__1, &c_b20, &a[(j + 1) * a_dim1 - + 1], lda, &work[j + 1], &c__1, &c_b22, &a[j * a_dim1 - + 1], &c__1, (ftnlen)12); - } + if (j < *n) { + i__1 = *n - j; + dgemv_((char *)"No transpose", n, &i__1, &c_b20, &a[(j + 1) * a_dim1 + + 1], lda, &work[j + 1], &c__1, &c_b22, &a[j * a_dim1 + + 1], &c__1, (ftnlen)12); + } /* L20: */ - } + } } else { /* Use blocked code. */ - nn = (*n - 1) / nb * nb + 1; - i__1 = -nb; - for (j = nn; i__1 < 0 ? j >= 1 : j <= 1; j += i__1) { + nn = (*n - 1) / nb * nb + 1; + i__1 = -nb; + for (j = nn; i__1 < 0 ? j >= 1 : j <= 1; j += i__1) { /* Computing MIN */ - i__2 = nb, i__3 = *n - j + 1; - jb = min(i__2,i__3); + i__2 = nb, i__3 = *n - j + 1; + jb = min(i__2,i__3); /* Copy current block column of L to WORK and replace with */ /* zeros. */ - i__2 = j + jb - 1; - for (jj = j; jj <= i__2; ++jj) { - i__3 = *n; - for (i__ = jj + 1; i__ <= i__3; ++i__) { - work[i__ + (jj - j) * ldwork] = a[i__ + jj * a_dim1]; - a[i__ + jj * a_dim1] = 0.; + i__2 = j + jb - 1; + for (jj = j; jj <= i__2; ++jj) { + i__3 = *n; + for (i__ = jj + 1; i__ <= i__3; ++i__) { + work[i__ + (jj - j) * ldwork] = a[i__ + jj * a_dim1]; + a[i__ + jj * a_dim1] = 0.; /* L30: */ - } + } /* L40: */ - } + } /* Compute current block column of inv(A). */ - if (j + jb <= *n) { - i__2 = *n - j - jb + 1; - dgemm_((char *)"No transpose", (char *)"No transpose", n, &jb, &i__2, &c_b20, - &a[(j + jb) * a_dim1 + 1], lda, &work[j + jb], & - ldwork, &c_b22, &a[j * a_dim1 + 1], lda, (ftnlen)12, ( - ftnlen)12); - } - dtrsm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, &jb, &c_b22, & - work[j], &ldwork, &a[j * a_dim1 + 1], lda, (ftnlen)5, ( - ftnlen)5, (ftnlen)12, (ftnlen)4); + if (j + jb <= *n) { + i__2 = *n - j - jb + 1; + dgemm_((char *)"No transpose", (char *)"No transpose", n, &jb, &i__2, &c_b20, + &a[(j + jb) * a_dim1 + 1], lda, &work[j + jb], & + ldwork, &c_b22, &a[j * a_dim1 + 1], lda, (ftnlen)12, ( + ftnlen)12); + } + dtrsm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, &jb, &c_b22, & + work[j], &ldwork, &a[j * a_dim1 + 1], lda, (ftnlen)5, ( + ftnlen)5, (ftnlen)12, (ftnlen)4); /* L50: */ - } + } } /* Apply column interchanges. */ for (j = *n - 1; j >= 1; --j) { - jp = ipiv[j]; - if (jp != j) { - dswap_(n, &a[j * a_dim1 + 1], &c__1, &a[jp * a_dim1 + 1], &c__1); - } + jp = ipiv[j]; + if (jp != j) { + dswap_(n, &a[j * a_dim1 + 1], &c__1, &a[jp * a_dim1 + 1], &c__1); + } /* L60: */ } @@ -339,5 +339,5 @@ f"> */ } /* dgetri_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dgetrs.cpp b/lib/linalg/dgetrs.cpp index 4df18e8650..ca10730a0b 100644 --- a/lib/linalg/dgetrs.cpp +++ b/lib/linalg/dgetrs.cpp @@ -1,13 +1,13 @@ /* fortran/dgetrs.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -143,20 +143,20 @@ f"> */ /* > \ingroup doubleGEcomputational */ /* ===================================================================== */ -/* Subroutine */ int dgetrs_(char *trans, integer *n, integer *nrhs, - doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * - ldb, integer *info, ftnlen trans_len) +/* Subroutine */ int dgetrs_(char *trans, integer *n, integer *nrhs, + doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * + ldb, integer *info, ftnlen trans_len) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; /* Local variables */ extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), xerbla_( - char *, integer *, ftnlen), dlaswp_(integer *, doublereal *, - integer *, integer *, integer *, integer *, integer *); + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), xerbla_( + char *, integer *, ftnlen), dlaswp_(integer *, doublereal *, + integer *, integer *, integer *, integer *, integer *); logical notran; @@ -198,27 +198,27 @@ f"> */ *info = 0; notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_( - trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { - *info = -1; + trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*nrhs < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*n)) { - *info = -5; + *info = -5; } else if (*ldb < max(1,*n)) { - *info = -8; + *info = -8; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DGETRS", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DGETRS", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { - return 0; + return 0; } if (notran) { @@ -227,38 +227,38 @@ f"> */ /* Apply row interchanges to the right hand sides. */ - dlaswp_(nrhs, &b[b_offset], ldb, &c__1, n, &ipiv[1], &c__1); + dlaswp_(nrhs, &b[b_offset], ldb, &c__1, n, &ipiv[1], &c__1); /* Solve L*X = B, overwriting B with X. */ - dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, nrhs, &c_b12, &a[ - a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)12, (ftnlen)4); + dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, nrhs, &c_b12, &a[ + a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)12, (ftnlen)4); /* Solve U*X = B, overwriting B with X. */ - dtrsm_((char *)"Left", (char *)"Upper", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b12, & - a[a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)12, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Upper", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b12, & + a[a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)12, (ftnlen)8); } else { /* Solve A**T * X = B. */ /* Solve U**T *X = B, overwriting B with X. */ - dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b12, &a[ - a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)9, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b12, &a[ + a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)9, (ftnlen)8); /* Solve L**T *X = B, overwriting B with X. */ - dtrsm_((char *)"Left", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, nrhs, &c_b12, &a[ - a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)9, (ftnlen)4); + dtrsm_((char *)"Left", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, nrhs, &c_b12, &a[ + a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)9, (ftnlen)4); /* Apply row interchanges to the solution vectors. */ - dlaswp_(nrhs, &b[b_offset], ldb, &c__1, n, &ipiv[1], &c_n1); + dlaswp_(nrhs, &b[b_offset], ldb, &c__1, n, &ipiv[1], &c_n1); } return 0; @@ -268,5 +268,5 @@ f"> */ } /* dgetrs_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlabad.cpp b/lib/linalg/dlabad.cpp index 96eb6efcca..a753834632 100644 --- a/lib/linalg/dlabad.cpp +++ b/lib/linalg/dlabad.cpp @@ -1,13 +1,13 @@ /* fortran/dlabad.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -113,8 +113,8 @@ f"> */ /* SMALL and LARGE to avoid overflow and underflow problems. */ if (d_lg10(large) > 2e3) { - *small = sqrt(*small); - *large = sqrt(*large); + *small = sqrt(*small); + *large = sqrt(*large); } return 0; @@ -124,5 +124,5 @@ f"> */ } /* dlabad_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlabrd.cpp b/lib/linalg/dlabrd.cpp index 5775cc7bc1..a7f9113e5c 100644 --- a/lib/linalg/dlabrd.cpp +++ b/lib/linalg/dlabrd.cpp @@ -1,13 +1,13 @@ /* fortran/dlabrd.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -233,21 +233,21 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dlabrd_(integer *m, integer *n, integer *nb, doublereal * - a, integer *lda, doublereal *d__, doublereal *e, doublereal *tauq, - doublereal *taup, doublereal *x, integer *ldx, doublereal *y, integer - *ldy) + a, integer *lda, doublereal *d__, doublereal *e, doublereal *tauq, + doublereal *taup, doublereal *x, integer *ldx, doublereal *y, integer + *ldy) { /* System generated locals */ - integer a_dim1, a_offset, x_dim1, x_offset, y_dim1, y_offset, i__1, i__2, - i__3; + integer a_dim1, a_offset, x_dim1, x_offset, y_dim1, y_offset, i__1, i__2, + i__3; /* Local variables */ integer i__; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dgemv_(char *, integer *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, ftnlen), dlarfg_(integer *, doublereal *, - doublereal *, integer *, doublereal *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dgemv_(char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen), dlarfg_(integer *, doublereal *, + doublereal *, integer *, doublereal *); /* -- LAPACK auxiliary routine -- */ @@ -290,236 +290,236 @@ f"> */ /* Function Body */ if (*m <= 0 || *n <= 0) { - return 0; + return 0; } if (*m >= *n) { /* Reduce to upper bidiagonal form */ - i__1 = *nb; - for (i__ = 1; i__ <= i__1; ++i__) { + i__1 = *nb; + for (i__ = 1; i__ <= i__1; ++i__) { /* Update A(i:m,i) */ - i__2 = *m - i__ + 1; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + a_dim1], lda, - &y[i__ + y_dim1], ldy, &c_b5, &a[i__ + i__ * a_dim1], & - c__1, (ftnlen)12); - i__2 = *m - i__ + 1; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + x_dim1], ldx, - &a[i__ * a_dim1 + 1], &c__1, &c_b5, &a[i__ + i__ * - a_dim1], &c__1, (ftnlen)12); + i__2 = *m - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + a_dim1], lda, + &y[i__ + y_dim1], ldy, &c_b5, &a[i__ + i__ * a_dim1], & + c__1, (ftnlen)12); + i__2 = *m - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + x_dim1], ldx, + &a[i__ * a_dim1 + 1], &c__1, &c_b5, &a[i__ + i__ * + a_dim1], &c__1, (ftnlen)12); /* Generate reflection Q(i) to annihilate A(i+1:m,i) */ - i__2 = *m - i__ + 1; + i__2 = *m - i__ + 1; /* Computing MIN */ - i__3 = i__ + 1; - dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3,*m) + i__ * - a_dim1], &c__1, &tauq[i__]); - d__[i__] = a[i__ + i__ * a_dim1]; - if (i__ < *n) { - a[i__ + i__ * a_dim1] = 1.; + i__3 = i__ + 1; + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3,*m) + i__ * + a_dim1], &c__1, &tauq[i__]); + d__[i__] = a[i__ + i__ * a_dim1]; + if (i__ < *n) { + a[i__ + i__ * a_dim1] = 1.; /* Compute Y(i+1:n,i) */ - i__2 = *m - i__ + 1; - i__3 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + (i__ + 1) * - a_dim1], lda, &a[i__ + i__ * a_dim1], &c__1, &c_b16, & - y[i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)9); - i__2 = *m - i__ + 1; - i__3 = i__ - 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + a_dim1], - lda, &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ * - y_dim1 + 1], &c__1, (ftnlen)9); - i__2 = *n - i__; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + 1 + - y_dim1], ldy, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[ - i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)12); - i__2 = *m - i__ + 1; - i__3 = i__ - 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &x[i__ + x_dim1], - ldx, &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ * - y_dim1 + 1], &c__1, (ftnlen)9); - i__2 = i__ - 1; - i__3 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[(i__ + 1) * - a_dim1 + 1], lda, &y[i__ * y_dim1 + 1], &c__1, &c_b5, - &y[i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)9); - i__2 = *n - i__; - dscal_(&i__2, &tauq[i__], &y[i__ + 1 + i__ * y_dim1], &c__1); + i__2 = *m - i__ + 1; + i__3 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + (i__ + 1) * + a_dim1], lda, &a[i__ + i__ * a_dim1], &c__1, &c_b16, & + y[i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)9); + i__2 = *m - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + a_dim1], + lda, &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ * + y_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *n - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + 1 + + y_dim1], ldy, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[ + i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)12); + i__2 = *m - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &x[i__ + x_dim1], + ldx, &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ * + y_dim1 + 1], &c__1, (ftnlen)9); + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[(i__ + 1) * + a_dim1 + 1], lda, &y[i__ * y_dim1 + 1], &c__1, &c_b5, + &y[i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)9); + i__2 = *n - i__; + dscal_(&i__2, &tauq[i__], &y[i__ + 1 + i__ * y_dim1], &c__1); /* Update A(i,i+1:n) */ - i__2 = *n - i__; - dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &y[i__ + 1 + - y_dim1], ldy, &a[i__ + a_dim1], lda, &c_b5, &a[i__ + ( - i__ + 1) * a_dim1], lda, (ftnlen)12); - i__2 = i__ - 1; - i__3 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[(i__ + 1) * - a_dim1 + 1], lda, &x[i__ + x_dim1], ldx, &c_b5, &a[ - i__ + (i__ + 1) * a_dim1], lda, (ftnlen)9); + i__2 = *n - i__; + dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &y[i__ + 1 + + y_dim1], ldy, &a[i__ + a_dim1], lda, &c_b5, &a[i__ + ( + i__ + 1) * a_dim1], lda, (ftnlen)12); + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[(i__ + 1) * + a_dim1 + 1], lda, &x[i__ + x_dim1], ldx, &c_b5, &a[ + i__ + (i__ + 1) * a_dim1], lda, (ftnlen)9); /* Generate reflection P(i) to annihilate A(i,i+2:n) */ - i__2 = *n - i__; + i__2 = *n - i__; /* Computing MIN */ - i__3 = i__ + 2; - dlarfg_(&i__2, &a[i__ + (i__ + 1) * a_dim1], &a[i__ + min( - i__3,*n) * a_dim1], lda, &taup[i__]); - e[i__] = a[i__ + (i__ + 1) * a_dim1]; - a[i__ + (i__ + 1) * a_dim1] = 1.; + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + (i__ + 1) * a_dim1], &a[i__ + min( + i__3,*n) * a_dim1], lda, &taup[i__]); + e[i__] = a[i__ + (i__ + 1) * a_dim1]; + a[i__ + (i__ + 1) * a_dim1] = 1.; /* Compute X(i+1:m,i) */ - i__2 = *m - i__; - i__3 = *n - i__; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + (i__ - + 1) * a_dim1], lda, &a[i__ + (i__ + 1) * a_dim1], - lda, &c_b16, &x[i__ + 1 + i__ * x_dim1], &c__1, ( - ftnlen)12); - i__2 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__, &c_b5, &y[i__ + 1 + y_dim1], - ldy, &a[i__ + (i__ + 1) * a_dim1], lda, &c_b16, &x[ - i__ * x_dim1 + 1], &c__1, (ftnlen)9); - i__2 = *m - i__; - dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &a[i__ + 1 + - a_dim1], lda, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ - i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); - i__2 = i__ - 1; - i__3 = *n - i__; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[(i__ + 1) * - a_dim1 + 1], lda, &a[i__ + (i__ + 1) * a_dim1], lda, & - c_b16, &x[i__ * x_dim1 + 1], &c__1, (ftnlen)12); - i__2 = *m - i__; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + 1 + - x_dim1], ldx, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ - i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); - i__2 = *m - i__; - dscal_(&i__2, &taup[i__], &x[i__ + 1 + i__ * x_dim1], &c__1); - } + i__2 = *m - i__; + i__3 = *n - i__; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + (i__ + + 1) * a_dim1], lda, &a[i__ + (i__ + 1) * a_dim1], + lda, &c_b16, &x[i__ + 1 + i__ * x_dim1], &c__1, ( + ftnlen)12); + i__2 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__, &c_b5, &y[i__ + 1 + y_dim1], + ldy, &a[i__ + (i__ + 1) * a_dim1], lda, &c_b16, &x[ + i__ * x_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *m - i__; + dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &a[i__ + 1 + + a_dim1], lda, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ + i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[(i__ + 1) * + a_dim1 + 1], lda, &a[i__ + (i__ + 1) * a_dim1], lda, & + c_b16, &x[i__ * x_dim1 + 1], &c__1, (ftnlen)12); + i__2 = *m - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + 1 + + x_dim1], ldx, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ + i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + i__2 = *m - i__; + dscal_(&i__2, &taup[i__], &x[i__ + 1 + i__ * x_dim1], &c__1); + } /* L10: */ - } + } } else { /* Reduce to lower bidiagonal form */ - i__1 = *nb; - for (i__ = 1; i__ <= i__1; ++i__) { + i__1 = *nb; + for (i__ = 1; i__ <= i__1; ++i__) { /* Update A(i,i:n) */ - i__2 = *n - i__ + 1; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + y_dim1], ldy, - &a[i__ + a_dim1], lda, &c_b5, &a[i__ + i__ * a_dim1], - lda, (ftnlen)12); - i__2 = i__ - 1; - i__3 = *n - i__ + 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[i__ * a_dim1 + 1], - lda, &x[i__ + x_dim1], ldx, &c_b5, &a[i__ + i__ * a_dim1], - lda, (ftnlen)9); + i__2 = *n - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + y_dim1], ldy, + &a[i__ + a_dim1], lda, &c_b5, &a[i__ + i__ * a_dim1], + lda, (ftnlen)12); + i__2 = i__ - 1; + i__3 = *n - i__ + 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[i__ * a_dim1 + 1], + lda, &x[i__ + x_dim1], ldx, &c_b5, &a[i__ + i__ * a_dim1], + lda, (ftnlen)9); /* Generate reflection P(i) to annihilate A(i,i+1:n) */ - i__2 = *n - i__ + 1; + i__2 = *n - i__ + 1; /* Computing MIN */ - i__3 = i__ + 1; - dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3,*n) * - a_dim1], lda, &taup[i__]); - d__[i__] = a[i__ + i__ * a_dim1]; - if (i__ < *m) { - a[i__ + i__ * a_dim1] = 1.; + i__3 = i__ + 1; + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3,*n) * + a_dim1], lda, &taup[i__]); + d__[i__] = a[i__ + i__ * a_dim1]; + if (i__ < *m) { + a[i__ + i__ * a_dim1] = 1.; /* Compute X(i+1:m,i) */ - i__2 = *m - i__; - i__3 = *n - i__ + 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + i__ * - a_dim1], lda, &a[i__ + i__ * a_dim1], lda, &c_b16, & - x[i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); - i__2 = *n - i__ + 1; - i__3 = i__ - 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &y[i__ + y_dim1], - ldy, &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ * - x_dim1 + 1], &c__1, (ftnlen)9); - i__2 = *m - i__; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + 1 + - a_dim1], lda, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ - i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); - i__2 = i__ - 1; - i__3 = *n - i__ + 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ * a_dim1 + - 1], lda, &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ * - x_dim1 + 1], &c__1, (ftnlen)12); - i__2 = *m - i__; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + 1 + - x_dim1], ldx, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ - i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); - i__2 = *m - i__; - dscal_(&i__2, &taup[i__], &x[i__ + 1 + i__ * x_dim1], &c__1); + i__2 = *m - i__; + i__3 = *n - i__ + 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + i__ * + a_dim1], lda, &a[i__ + i__ * a_dim1], lda, &c_b16, & + x[i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + i__2 = *n - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &y[i__ + y_dim1], + ldy, &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ * + x_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *m - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + 1 + + a_dim1], lda, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ + i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + i__2 = i__ - 1; + i__3 = *n - i__ + 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ * a_dim1 + + 1], lda, &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ * + x_dim1 + 1], &c__1, (ftnlen)12); + i__2 = *m - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + 1 + + x_dim1], ldx, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ + i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + i__2 = *m - i__; + dscal_(&i__2, &taup[i__], &x[i__ + 1 + i__ * x_dim1], &c__1); /* Update A(i+1:m,i) */ - i__2 = *m - i__; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + 1 + - a_dim1], lda, &y[i__ + y_dim1], ldy, &c_b5, &a[i__ + - 1 + i__ * a_dim1], &c__1, (ftnlen)12); - i__2 = *m - i__; - dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &x[i__ + 1 + - x_dim1], ldx, &a[i__ * a_dim1 + 1], &c__1, &c_b5, &a[ - i__ + 1 + i__ * a_dim1], &c__1, (ftnlen)12); + i__2 = *m - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + 1 + + a_dim1], lda, &y[i__ + y_dim1], ldy, &c_b5, &a[i__ + + 1 + i__ * a_dim1], &c__1, (ftnlen)12); + i__2 = *m - i__; + dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &x[i__ + 1 + + x_dim1], ldx, &a[i__ * a_dim1 + 1], &c__1, &c_b5, &a[ + i__ + 1 + i__ * a_dim1], &c__1, (ftnlen)12); /* Generate reflection Q(i) to annihilate A(i+2:m,i) */ - i__2 = *m - i__; + i__2 = *m - i__; /* Computing MIN */ - i__3 = i__ + 2; - dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*m) + - i__ * a_dim1], &c__1, &tauq[i__]); - e[i__] = a[i__ + 1 + i__ * a_dim1]; - a[i__ + 1 + i__ * a_dim1] = 1.; + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*m) + + i__ * a_dim1], &c__1, &tauq[i__]); + e[i__] = a[i__ + 1 + i__ * a_dim1]; + a[i__ + 1 + i__ * a_dim1] = 1.; /* Compute Y(i+1:n,i) */ - i__2 = *m - i__; - i__3 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + (i__ + - 1) * a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, - &c_b16, &y[i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)9); - i__2 = *m - i__; - i__3 = i__ - 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + a_dim1], - lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[ - i__ * y_dim1 + 1], &c__1, (ftnlen)9); - i__2 = *n - i__; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + 1 + - y_dim1], ldy, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[ - i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)12); - i__2 = *m - i__; - dgemv_((char *)"Transpose", &i__2, &i__, &c_b5, &x[i__ + 1 + x_dim1], - ldx, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[ - i__ * y_dim1 + 1], &c__1, (ftnlen)9); - i__2 = *n - i__; - dgemv_((char *)"Transpose", &i__, &i__2, &c_b4, &a[(i__ + 1) * a_dim1 - + 1], lda, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[i__ - + 1 + i__ * y_dim1], &c__1, (ftnlen)9); - i__2 = *n - i__; - dscal_(&i__2, &tauq[i__], &y[i__ + 1 + i__ * y_dim1], &c__1); - } + i__2 = *m - i__; + i__3 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + (i__ + + 1) * a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, + &c_b16, &y[i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)9); + i__2 = *m - i__; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + a_dim1], + lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[ + i__ * y_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *n - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + 1 + + y_dim1], ldy, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[ + i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)12); + i__2 = *m - i__; + dgemv_((char *)"Transpose", &i__2, &i__, &c_b5, &x[i__ + 1 + x_dim1], + ldx, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[ + i__ * y_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *n - i__; + dgemv_((char *)"Transpose", &i__, &i__2, &c_b4, &a[(i__ + 1) * a_dim1 + + 1], lda, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[i__ + + 1 + i__ * y_dim1], &c__1, (ftnlen)9); + i__2 = *n - i__; + dscal_(&i__2, &tauq[i__], &y[i__ + 1 + i__ * y_dim1], &c__1); + } /* L20: */ - } + } } return 0; @@ -528,5 +528,5 @@ f"> */ } /* dlabrd_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlacn2.cpp b/lib/linalg/dlacn2.cpp index befb0b4e52..7293447d88 100644 --- a/lib/linalg/dlacn2.cpp +++ b/lib/linalg/dlacn2.cpp @@ -1,13 +1,13 @@ /* fortran/dlacn2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -157,8 +157,8 @@ f"> */ /* > ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988. */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlacn2_(integer *n, doublereal *v, doublereal *x, - integer *isgn, doublereal *est, integer *kase, integer *isave) +/* Subroutine */ int dlacn2_(integer *n, doublereal *v, doublereal *x, + integer *isgn, doublereal *est, integer *kase, integer *isave) { /* System generated locals */ integer i__1; @@ -172,8 +172,8 @@ f"> */ doublereal xs, temp; extern doublereal dasum_(integer *, doublereal *, integer *); integer jlast; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); extern integer idamax_(integer *, doublereal *, integer *); doublereal altsgn, estold; @@ -209,22 +209,22 @@ f"> */ /* Function Body */ if (*kase == 0) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - x[i__] = 1. / (doublereal) (*n); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + x[i__] = 1. / (doublereal) (*n); /* L10: */ - } - *kase = 1; - isave[1] = 1; - return 0; + } + *kase = 1; + isave[1] = 1; + return 0; } switch (isave[1]) { - case 1: goto L20; - case 2: goto L40; - case 3: goto L70; - case 4: goto L110; - case 5: goto L140; + case 1: goto L20; + case 2: goto L40; + case 3: goto L70; + case 4: goto L110; + case 5: goto L140; } /* ................ ENTRY (ISAVE( 1 ) = 1) */ @@ -232,21 +232,21 @@ f"> */ L20: if (*n == 1) { - v[1] = x[1]; - *est = abs(v[1]); + v[1] = x[1]; + *est = abs(v[1]); /* ... QUIT */ - goto L150; + goto L150; } *est = dasum_(n, &x[1], &c__1); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - if (x[i__] >= 0.) { - x[i__] = 1.; - } else { - x[i__] = -1.; - } - isgn[i__] = i_dnnt(&x[i__]); + if (x[i__] >= 0.) { + x[i__] = 1.; + } else { + x[i__] = -1.; + } + isgn[i__] = i_dnnt(&x[i__]); /* L30: */ } *kase = 2; @@ -265,7 +265,7 @@ L40: L50: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - x[i__] = 0.; + x[i__] = 0.; /* L60: */ } x[isave[2]] = 1.; @@ -282,14 +282,14 @@ L70: *est = dasum_(n, &v[1], &c__1); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - if (x[i__] >= 0.) { - xs = 1.; - } else { - xs = -1.; - } - if (i_dnnt(&xs) != isgn[i__]) { - goto L90; - } + if (x[i__] >= 0.) { + xs = 1.; + } else { + xs = -1.; + } + if (i_dnnt(&xs) != isgn[i__]) { + goto L90; + } /* L80: */ } /* REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED. */ @@ -298,17 +298,17 @@ L70: L90: /* TEST FOR CYCLING. */ if (*est <= estold) { - goto L120; + goto L120; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - if (x[i__] >= 0.) { - x[i__] = 1.; - } else { - x[i__] = -1.; - } - isgn[i__] = i_dnnt(&x[i__]); + if (x[i__] >= 0.) { + x[i__] = 1.; + } else { + x[i__] = -1.; + } + isgn[i__] = i_dnnt(&x[i__]); /* L100: */ } *kase = 2; @@ -322,8 +322,8 @@ L110: jlast = isave[2]; isave[2] = idamax_(n, &x[1], &c__1); if (x[jlast] != (d__1 = x[isave[2]], abs(d__1)) && isave[3] < 5) { - ++isave[3]; - goto L50; + ++isave[3]; + goto L50; } /* ITERATION COMPLETE. FINAL STAGE. */ @@ -332,9 +332,9 @@ L120: altsgn = 1.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - x[i__] = altsgn * ((doublereal) (i__ - 1) / (doublereal) (*n - 1) + - 1.); - altsgn = -altsgn; + x[i__] = altsgn * ((doublereal) (i__ - 1) / (doublereal) (*n - 1) + + 1.); + altsgn = -altsgn; /* L130: */ } *kase = 1; @@ -347,8 +347,8 @@ L120: L140: temp = dasum_(n, &x[1], &c__1) / (doublereal) (*n * 3) * 2.; if (temp > *est) { - dcopy_(n, &x[1], &c__1, &v[1], &c__1); - *est = temp; + dcopy_(n, &x[1], &c__1, &v[1], &c__1); + *est = temp; } L150: @@ -360,5 +360,5 @@ L150: } /* dlacn2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlacpy.cpp b/lib/linalg/dlacpy.cpp index b1e62a5336..813a669202 100644 --- a/lib/linalg/dlacpy.cpp +++ b/lib/linalg/dlacpy.cpp @@ -1,13 +1,13 @@ /* fortran/dlacpy.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -120,7 +120,7 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dlacpy_(char *uplo, integer *m, integer *n, doublereal * - a, integer *lda, doublereal *b, integer *ldb, ftnlen uplo_len) + a, integer *lda, doublereal *b, integer *ldb, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; @@ -159,35 +159,35 @@ f"> */ /* Function Body */ if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = min(j,*m); - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = min(j,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; /* L10: */ - } + } /* L20: */ - } + } } else if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = j; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = j; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; /* L30: */ - } + } /* L40: */ - } + } } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; /* L50: */ - } + } /* L60: */ - } + } } return 0; @@ -196,5 +196,5 @@ f"> */ } /* dlacpy_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dladiv.cpp b/lib/linalg/dladiv.cpp index 7ffd5485cc..d12fb854f0 100644 --- a/lib/linalg/dladiv.cpp +++ b/lib/linalg/dladiv.cpp @@ -1,13 +1,13 @@ /* fortran/dladiv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -107,8 +107,8 @@ f"> */ /* > \ingroup doubleOTHERauxiliary */ /* ===================================================================== */ -/* Subroutine */ int dladiv_(doublereal *a, doublereal *b, doublereal *c__, - doublereal *d__, doublereal *p, doublereal *q) +/* Subroutine */ int dladiv_(doublereal *a, doublereal *b, doublereal *c__, + doublereal *d__, doublereal *p, doublereal *q) { /* System generated locals */ doublereal d__1, d__2; @@ -116,8 +116,8 @@ f"> */ /* Local variables */ doublereal s, aa, ab, bb, cc, cd, dd, be, un, ov, eps; extern doublereal dlamch_(char *, ftnlen); - extern /* Subroutine */ int dladiv1_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *); + extern /* Subroutine */ int dladiv1_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine -- */ @@ -157,30 +157,30 @@ f"> */ eps = dlamch_((char *)"Epsilon", (ftnlen)7); be = 2. / (eps * eps); if (ab >= ov * .5) { - aa *= .5; - bb *= .5; - s *= 2.; + aa *= .5; + bb *= .5; + s *= 2.; } if (cd >= ov * .5) { - cc *= .5; - dd *= .5; - s *= .5; + cc *= .5; + dd *= .5; + s *= .5; } if (ab <= un * 2. / eps) { - aa *= be; - bb *= be; - s /= be; + aa *= be; + bb *= be; + s /= be; } if (cd <= un * 2. / eps) { - cc *= be; - dd *= be; - s *= be; + cc *= be; + dd *= be; + s *= be; } if (abs(*d__) <= abs(*c__)) { - dladiv1_(&aa, &bb, &cc, &dd, p, q); + dladiv1_(&aa, &bb, &cc, &dd, p, q); } else { - dladiv1_(&bb, &aa, &dd, &cc, p, q); - *q = -(*q); + dladiv1_(&bb, &aa, &dd, &cc, p, q); + *q = -(*q); } *p *= s; *q *= s; @@ -192,12 +192,12 @@ f"> */ } /* dladiv_ */ /* > \ingroup doubleOTHERauxiliary */ -/* Subroutine */ int dladiv1_(doublereal *a, doublereal *b, doublereal *c__, - doublereal *d__, doublereal *p, doublereal *q) +/* Subroutine */ int dladiv1_(doublereal *a, doublereal *b, doublereal *c__, + doublereal *d__, doublereal *p, doublereal *q) { doublereal r__, t; - extern doublereal dladiv2_(doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *); + extern doublereal dladiv2_(doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine -- */ @@ -230,8 +230,8 @@ f"> */ } /* dladiv1_ */ /* > \ingroup doubleOTHERauxiliary */ -doublereal dladiv2_(doublereal *a, doublereal *b, doublereal *c__, doublereal - *d__, doublereal *r__, doublereal *t) +doublereal dladiv2_(doublereal *a, doublereal *b, doublereal *c__, doublereal + *d__, doublereal *r__, doublereal *t) { /* System generated locals */ doublereal ret_val; @@ -256,14 +256,14 @@ doublereal dladiv2_(doublereal *a, doublereal *b, doublereal *c__, doublereal /* .. Executable Statements .. */ if (*r__ != 0.) { - br = *b * *r__; - if (br != 0.) { - ret_val = (*a + br) * *t; - } else { - ret_val = *a * *t + *b * *t * *r__; - } + br = *b * *r__; + if (br != 0.) { + ret_val = (*a + br) * *t; + } else { + ret_val = *a * *t + *b * *t * *r__; + } } else { - ret_val = (*a + *d__ * (*b / *c__)) * *t; + ret_val = (*a + *d__ * (*b / *c__)) * *t; } return ret_val; @@ -273,5 +273,5 @@ doublereal dladiv2_(doublereal *a, doublereal *b, doublereal *c__, doublereal } /* dladiv2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlae2.cpp b/lib/linalg/dlae2.cpp index 2a1be2816d..7351921b21 100644 --- a/lib/linalg/dlae2.cpp +++ b/lib/linalg/dlae2.cpp @@ -1,13 +1,13 @@ /* fortran/dlae2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -118,8 +118,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlae2_(doublereal *a, doublereal *b, doublereal *c__, - doublereal *rt1, doublereal *rt2) +/* Subroutine */ int dlae2_(doublereal *a, doublereal *b, doublereal *c__, + doublereal *rt1, doublereal *rt2) { /* System generated locals */ doublereal d__1; @@ -156,48 +156,48 @@ extern "C" { tb = *b + *b; ab = abs(tb); if (abs(*a) > abs(*c__)) { - acmx = *a; - acmn = *c__; + acmx = *a; + acmn = *c__; } else { - acmx = *c__; - acmn = *a; + acmx = *c__; + acmn = *a; } if (adf > ab) { /* Computing 2nd power */ - d__1 = ab / adf; - rt = adf * sqrt(d__1 * d__1 + 1.); + d__1 = ab / adf; + rt = adf * sqrt(d__1 * d__1 + 1.); } else if (adf < ab) { /* Computing 2nd power */ - d__1 = adf / ab; - rt = ab * sqrt(d__1 * d__1 + 1.); + d__1 = adf / ab; + rt = ab * sqrt(d__1 * d__1 + 1.); } else { /* Includes case AB=ADF=0 */ - rt = ab * sqrt(2.); + rt = ab * sqrt(2.); } if (sm < 0.) { - *rt1 = (sm - rt) * .5; + *rt1 = (sm - rt) * .5; /* Order of execution important. */ /* To get fully accurate smaller eigenvalue, */ /* next line needs to be executed in higher precision. */ - *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; + *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else if (sm > 0.) { - *rt1 = (sm + rt) * .5; + *rt1 = (sm + rt) * .5; /* Order of execution important. */ /* To get fully accurate smaller eigenvalue, */ /* next line needs to be executed in higher precision. */ - *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; + *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else { /* Includes case RT1 = RT2 = 0 */ - *rt1 = rt * .5; - *rt2 = rt * -.5; + *rt1 = rt * .5; + *rt2 = rt * -.5; } return 0; @@ -206,5 +206,5 @@ extern "C" { } /* dlae2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaed0.cpp b/lib/linalg/dlaed0.cpp index 41b13a3cac..68fee93814 100644 --- a/lib/linalg/dlaed0.cpp +++ b/lib/linalg/dlaed0.cpp @@ -1,13 +1,13 @@ /* fortran/dlaed0.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -24,7 +24,7 @@ static doublereal c_b23 = 1.; static doublereal c_b24 = 0.; static integer c__1 = 1; -/* > \brief \b DLAED0 used by DSTEDC. Computes all eigenvalues and corresponding eigenvectors of an unreduced +/* > \brief \b DLAED0 used by DSTEDC. Computes all eigenvalues and corresponding eigenvectors of an unreduced symmetric tridiagonal matrix using the divide and conquer method. */ /* =========== DOCUMENTATION =========== */ @@ -197,10 +197,10 @@ f"> */ /* > at Berkeley, USA */ /* ===================================================================== */ -/* Subroutine */ int dlaed0_(integer *icompq, integer *qsiz, integer *n, - doublereal *d__, doublereal *e, doublereal *q, integer *ldq, - doublereal *qstore, integer *ldqs, doublereal *work, integer *iwork, - integer *info) +/* Subroutine */ int dlaed0_(integer *icompq, integer *qsiz, integer *n, + doublereal *d__, doublereal *e, doublereal *q, integer *ldq, + doublereal *qstore, integer *ldqs, doublereal *work, integer *iwork, + integer *info) { /* System generated locals */ integer q_dim1, q_offset, qstore_dim1, qstore_offset, i__1, i__2; @@ -214,33 +214,33 @@ f"> */ integer i__, j, k, iq, lgn, msd2, smm1, spm1, spm2; doublereal temp; integer curr; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); integer iperm; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); integer indxq, iwrem; extern /* Subroutine */ int dlaed1_(integer *, doublereal *, doublereal *, - integer *, integer *, doublereal *, integer *, doublereal *, - integer *, integer *); + integer *, integer *, doublereal *, integer *, doublereal *, + integer *, integer *); integer iqptr; - extern /* Subroutine */ int dlaed7_(integer *, integer *, integer *, - integer *, integer *, integer *, doublereal *, doublereal *, - integer *, integer *, doublereal *, integer *, doublereal *, - integer *, integer *, integer *, integer *, integer *, doublereal - *, doublereal *, integer *, integer *); + extern /* Subroutine */ int dlaed7_(integer *, integer *, integer *, + integer *, integer *, integer *, doublereal *, doublereal *, + integer *, integer *, doublereal *, integer *, doublereal *, + integer *, integer *, integer *, integer *, integer *, doublereal + *, doublereal *, integer *, integer *); integer tlvls; - extern /* Subroutine */ int dlacpy_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen); + extern /* Subroutine */ int dlacpy_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen); integer igivcl; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); integer igivnm, submat, curprb, subpbs, igivpt; - extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - ftnlen); + extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + ftnlen); integer curlvl, matsiz, iprmpt, smlsiz; @@ -285,30 +285,30 @@ f"> */ *info = 0; if (*icompq < 0 || *icompq > 2) { - *info = -1; + *info = -1; } else if (*icompq == 1 && *qsiz < max(0,*n)) { - *info = -2; + *info = -2; } else if (*n < 0) { - *info = -3; + *info = -3; } else if (*ldq < max(1,*n)) { - *info = -7; + *info = -7; } else if (*ldqs < max(1,*n)) { - *info = -9; + *info = -9; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLAED0", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLAED0", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } smlsiz = ilaenv_(&c__9, (char *)"DLAED0", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( - ftnlen)6, (ftnlen)1); + ftnlen)6, (ftnlen)1); /* Determine the size and placement of the submatrices, and save in */ /* the leading elements of IWORK. */ @@ -318,18 +318,18 @@ f"> */ tlvls = 0; L10: if (iwork[subpbs] > smlsiz) { - for (j = subpbs; j >= 1; --j) { - iwork[j * 2] = (iwork[j] + 1) / 2; - iwork[(j << 1) - 1] = iwork[j] / 2; + for (j = subpbs; j >= 1; --j) { + iwork[j * 2] = (iwork[j] + 1) / 2; + iwork[(j << 1) - 1] = iwork[j] / 2; /* L20: */ - } - ++tlvls; - subpbs <<= 1; - goto L10; + } + ++tlvls; + subpbs <<= 1; + goto L10; } i__1 = subpbs; for (j = 2; j <= i__1; ++j) { - iwork[j] += iwork[j - 1]; + iwork[j] += iwork[j - 1]; /* L30: */ } @@ -339,10 +339,10 @@ L10: spm1 = subpbs - 1; i__1 = spm1; for (i__ = 1; i__ <= i__1; ++i__) { - submat = iwork[i__] + 1; - smm1 = submat - 1; - d__[smm1] -= (d__1 = e[smm1], abs(d__1)); - d__[submat] -= (d__1 = e[smm1], abs(d__1)); + submat = iwork[i__] + 1; + smm1 = submat - 1; + d__[smm1] -= (d__1 = e[smm1], abs(d__1)); + d__[submat] -= (d__1 = e[smm1], abs(d__1)); /* L40: */ } @@ -352,35 +352,35 @@ L10: /* Set up workspaces for eigenvalues only/accumulate new vectors */ /* routine */ - temp = log((doublereal) (*n)) / log(2.); - lgn = (integer) temp; - if (pow_ii(&c__2, &lgn) < *n) { - ++lgn; - } - if (pow_ii(&c__2, &lgn) < *n) { - ++lgn; - } - iprmpt = indxq + *n + 1; - iperm = iprmpt + *n * lgn; - iqptr = iperm + *n * lgn; - igivpt = iqptr + *n + 2; - igivcl = igivpt + *n * lgn; + temp = log((doublereal) (*n)) / log(2.); + lgn = (integer) temp; + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + iprmpt = indxq + *n + 1; + iperm = iprmpt + *n * lgn; + iqptr = iperm + *n * lgn; + igivpt = iqptr + *n + 2; + igivcl = igivpt + *n * lgn; - igivnm = 1; - iq = igivnm + (*n << 1) * lgn; + igivnm = 1; + iq = igivnm + (*n << 1) * lgn; /* Computing 2nd power */ - i__1 = *n; - iwrem = iq + i__1 * i__1 + 1; + i__1 = *n; + iwrem = iq + i__1 * i__1 + 1; /* Initialize pointers */ - i__1 = subpbs; - for (i__ = 0; i__ <= i__1; ++i__) { - iwork[iprmpt + i__] = 1; - iwork[igivpt + i__] = 1; + i__1 = subpbs; + for (i__ = 0; i__ <= i__1; ++i__) { + iwork[iprmpt + i__] = 1; + iwork[igivpt + i__] = 1; /* L50: */ - } - iwork[iqptr] = 1; + } + iwork[iqptr] = 1; } /* Solve each submatrix eigenproblem at the bottom of the divide and */ @@ -389,43 +389,43 @@ L10: curr = 0; i__1 = spm1; for (i__ = 0; i__ <= i__1; ++i__) { - if (i__ == 0) { - submat = 1; - matsiz = iwork[1]; - } else { - submat = iwork[i__] + 1; - matsiz = iwork[i__ + 1] - iwork[i__]; - } - if (*icompq == 2) { - dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &q[submat + - submat * q_dim1], ldq, &work[1], info, (ftnlen)1); - if (*info != 0) { - goto L130; - } - } else { - dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &work[iq - 1 + - iwork[iqptr + curr]], &matsiz, &work[1], info, (ftnlen)1); - if (*info != 0) { - goto L130; - } - if (*icompq == 1) { - dgemm_((char *)"N", (char *)"N", qsiz, &matsiz, &matsiz, &c_b23, &q[submat * - q_dim1 + 1], ldq, &work[iq - 1 + iwork[iqptr + curr]], - &matsiz, &c_b24, &qstore[submat * qstore_dim1 + 1], - ldqs, (ftnlen)1, (ftnlen)1); - } + if (i__ == 0) { + submat = 1; + matsiz = iwork[1]; + } else { + submat = iwork[i__] + 1; + matsiz = iwork[i__ + 1] - iwork[i__]; + } + if (*icompq == 2) { + dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &q[submat + + submat * q_dim1], ldq, &work[1], info, (ftnlen)1); + if (*info != 0) { + goto L130; + } + } else { + dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &work[iq - 1 + + iwork[iqptr + curr]], &matsiz, &work[1], info, (ftnlen)1); + if (*info != 0) { + goto L130; + } + if (*icompq == 1) { + dgemm_((char *)"N", (char *)"N", qsiz, &matsiz, &matsiz, &c_b23, &q[submat * + q_dim1 + 1], ldq, &work[iq - 1 + iwork[iqptr + curr]], + &matsiz, &c_b24, &qstore[submat * qstore_dim1 + 1], + ldqs, (ftnlen)1, (ftnlen)1); + } /* Computing 2nd power */ - i__2 = matsiz; - iwork[iqptr + curr + 1] = iwork[iqptr + curr] + i__2 * i__2; - ++curr; - } - k = 1; - i__2 = iwork[i__ + 1]; - for (j = submat; j <= i__2; ++j) { - iwork[indxq + j] = k; - ++k; + i__2 = matsiz; + iwork[iqptr + curr + 1] = iwork[iqptr + curr] + i__2 * i__2; + ++curr; + } + k = 1; + i__2 = iwork[i__ + 1]; + for (j = submat; j <= i__2; ++j) { + iwork[indxq + j] = k; + ++k; /* L60: */ - } + } /* L70: */ } @@ -437,20 +437,20 @@ L10: curlvl = 1; L80: if (subpbs > 1) { - spm2 = subpbs - 2; - i__1 = spm2; - for (i__ = 0; i__ <= i__1; i__ += 2) { - if (i__ == 0) { - submat = 1; - matsiz = iwork[2]; - msd2 = iwork[1]; - curprb = 0; - } else { - submat = iwork[i__] + 1; - matsiz = iwork[i__ + 2] - iwork[i__]; - msd2 = matsiz / 2; - ++curprb; - } + spm2 = subpbs - 2; + i__1 = spm2; + for (i__ = 0; i__ <= i__1; i__ += 2) { + if (i__ == 0) { + submat = 1; + matsiz = iwork[2]; + msd2 = iwork[1]; + curprb = 0; + } else { + submat = iwork[i__] + 1; + matsiz = iwork[i__ + 2] - iwork[i__]; + msd2 = matsiz / 2; + ++curprb; + } /* Merge lower order eigensystems (of size MSD2 and MATSIZ - MSD2) */ /* into an eigensystem of size MATSIZ. */ @@ -460,27 +460,27 @@ L80: /* and eigenvectors of a full symmetric matrix (which was reduced to */ /* tridiagonal form) are desired. */ - if (*icompq == 2) { - dlaed1_(&matsiz, &d__[submat], &q[submat + submat * q_dim1], - ldq, &iwork[indxq + submat], &e[submat + msd2 - 1], & - msd2, &work[1], &iwork[subpbs + 1], info); - } else { - dlaed7_(icompq, &matsiz, qsiz, &tlvls, &curlvl, &curprb, &d__[ - submat], &qstore[submat * qstore_dim1 + 1], ldqs, & - iwork[indxq + submat], &e[submat + msd2 - 1], &msd2, & - work[iq], &iwork[iqptr], &iwork[iprmpt], &iwork[iperm] - , &iwork[igivpt], &iwork[igivcl], &work[igivnm], & - work[iwrem], &iwork[subpbs + 1], info); - } - if (*info != 0) { - goto L130; - } - iwork[i__ / 2 + 1] = iwork[i__ + 2]; + if (*icompq == 2) { + dlaed1_(&matsiz, &d__[submat], &q[submat + submat * q_dim1], + ldq, &iwork[indxq + submat], &e[submat + msd2 - 1], & + msd2, &work[1], &iwork[subpbs + 1], info); + } else { + dlaed7_(icompq, &matsiz, qsiz, &tlvls, &curlvl, &curprb, &d__[ + submat], &qstore[submat * qstore_dim1 + 1], ldqs, & + iwork[indxq + submat], &e[submat + msd2 - 1], &msd2, & + work[iq], &iwork[iqptr], &iwork[iprmpt], &iwork[iperm] + , &iwork[igivpt], &iwork[igivcl], &work[igivnm], & + work[iwrem], &iwork[subpbs + 1], info); + } + if (*info != 0) { + goto L130; + } + iwork[i__ / 2 + 1] = iwork[i__ + 2]; /* L90: */ - } - subpbs /= 2; - ++curlvl; - goto L80; + } + subpbs /= 2; + ++curlvl; + goto L80; } /* end while */ @@ -489,33 +489,33 @@ L80: /* merge step. */ if (*icompq == 1) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - j = iwork[indxq + i__]; - work[i__] = d__[j]; - dcopy_(qsiz, &qstore[j * qstore_dim1 + 1], &c__1, &q[i__ * q_dim1 - + 1], &c__1); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + j = iwork[indxq + i__]; + work[i__] = d__[j]; + dcopy_(qsiz, &qstore[j * qstore_dim1 + 1], &c__1, &q[i__ * q_dim1 + + 1], &c__1); /* L100: */ - } - dcopy_(n, &work[1], &c__1, &d__[1], &c__1); + } + dcopy_(n, &work[1], &c__1, &d__[1], &c__1); } else if (*icompq == 2) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - j = iwork[indxq + i__]; - work[i__] = d__[j]; - dcopy_(n, &q[j * q_dim1 + 1], &c__1, &work[*n * i__ + 1], &c__1); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + j = iwork[indxq + i__]; + work[i__] = d__[j]; + dcopy_(n, &q[j * q_dim1 + 1], &c__1, &work[*n * i__ + 1], &c__1); /* L110: */ - } - dcopy_(n, &work[1], &c__1, &d__[1], &c__1); - dlacpy_((char *)"A", n, n, &work[*n + 1], n, &q[q_offset], ldq, (ftnlen)1); + } + dcopy_(n, &work[1], &c__1, &d__[1], &c__1); + dlacpy_((char *)"A", n, n, &work[*n + 1], n, &q[q_offset], ldq, (ftnlen)1); } else { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - j = iwork[indxq + i__]; - work[i__] = d__[j]; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + j = iwork[indxq + i__]; + work[i__] = d__[j]; /* L120: */ - } - dcopy_(n, &work[1], &c__1, &d__[1], &c__1); + } + dcopy_(n, &work[1], &c__1, &d__[1], &c__1); } goto L140; @@ -530,5 +530,5 @@ L140: } /* dlaed0_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaed1.cpp b/lib/linalg/dlaed1.cpp index a448e3363e..ff6c537c7c 100644 --- a/lib/linalg/dlaed1.cpp +++ b/lib/linalg/dlaed1.cpp @@ -1,13 +1,13 @@ /* fortran/dlaed1.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -184,29 +184,29 @@ f"> */ /* > Modified by Francoise Tisseur, University of Tennessee */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlaed1_(integer *n, doublereal *d__, doublereal *q, - integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, - doublereal *work, integer *iwork, integer *info) +/* Subroutine */ int dlaed1_(integer *n, doublereal *d__, doublereal *q, + integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, + doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; /* Local variables */ integer i__, k, n1, n2, is, iw, iz, iq2, zpp1, indx, indxc; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); integer indxp; - extern /* Subroutine */ int dlaed2_(integer *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *, - integer *, integer *, integer *, integer *), dlaed3_(integer *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, doublereal *, doublereal *, integer *, integer *, - doublereal *, doublereal *, integer *); + extern /* Subroutine */ int dlaed2_(integer *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *, integer *, integer *, integer *), dlaed3_(integer *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, doublereal *, doublereal *, integer *, integer *, + doublereal *, doublereal *, integer *); integer idlmda; - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen); + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen); integer coltyp; @@ -244,26 +244,26 @@ f"> */ *info = 0; if (*n < 0) { - *info = -1; + *info = -1; } else if (*ldq < max(1,*n)) { - *info = -4; + *info = -4; } else /* if(complicated condition) */ { /* Computing MIN */ - i__1 = 1, i__2 = *n / 2; - if (min(i__1,i__2) > *cutpnt || *n / 2 < *cutpnt) { - *info = -7; - } + i__1 = 1, i__2 = *n / 2; + if (min(i__1,i__2) > *cutpnt || *n / 2 < *cutpnt) { + *info = -7; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLAED1", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLAED1", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } /* The following values are integer pointers which indicate */ @@ -292,36 +292,36 @@ f"> */ /* Deflate eigenvalues. */ dlaed2_(&k, n, cutpnt, &d__[1], &q[q_offset], ldq, &indxq[1], rho, &work[ - iz], &work[idlmda], &work[iw], &work[iq2], &iwork[indx], &iwork[ - indxc], &iwork[indxp], &iwork[coltyp], info); + iz], &work[idlmda], &work[iw], &work[iq2], &iwork[indx], &iwork[ + indxc], &iwork[indxp], &iwork[coltyp], info); if (*info != 0) { - goto L20; + goto L20; } /* Solve Secular Equation. */ if (k != 0) { - is = (iwork[coltyp] + iwork[coltyp + 1]) * *cutpnt + (iwork[coltyp + - 1] + iwork[coltyp + 2]) * (*n - *cutpnt) + iq2; - dlaed3_(&k, n, cutpnt, &d__[1], &q[q_offset], ldq, rho, &work[idlmda], - &work[iq2], &iwork[indxc], &iwork[coltyp], &work[iw], &work[ - is], info); - if (*info != 0) { - goto L20; - } + is = (iwork[coltyp] + iwork[coltyp + 1]) * *cutpnt + (iwork[coltyp + + 1] + iwork[coltyp + 2]) * (*n - *cutpnt) + iq2; + dlaed3_(&k, n, cutpnt, &d__[1], &q[q_offset], ldq, rho, &work[idlmda], + &work[iq2], &iwork[indxc], &iwork[coltyp], &work[iw], &work[ + is], info); + if (*info != 0) { + goto L20; + } /* Prepare the INDXQ sorting permutation. */ - n1 = k; - n2 = *n - k; - dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); + n1 = k; + n2 = *n - k; + dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); } else { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - indxq[i__] = i__; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + indxq[i__] = i__; /* L10: */ - } + } } L20: @@ -332,5 +332,5 @@ L20: } /* dlaed1_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaed2.cpp b/lib/linalg/dlaed2.cpp index 746c07ba33..c56d856171 100644 --- a/lib/linalg/dlaed2.cpp +++ b/lib/linalg/dlaed2.cpp @@ -1,13 +1,13 @@ /* fortran/dlaed2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -234,10 +234,10 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dlaed2_(integer *k, integer *n, integer *n1, doublereal * - d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, - doublereal *z__, doublereal *dlamda, doublereal *w, doublereal *q2, - integer *indx, integer *indxc, integer *indxp, integer *coltyp, - integer *info) + d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, + doublereal *z__, doublereal *dlamda, doublereal *w, doublereal *q2, + integer *indx, integer *indxc, integer *indxp, integer *coltyp, + integer *info) { /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; @@ -253,19 +253,19 @@ f"> */ integer k2, n2, ct, nj, pj, js, iq1, iq2, n1p1; doublereal eps, tau, tol; integer psm[4], imax, jmax; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *); + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *); integer ctot[4]; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dcopy_(integer *, doublereal *, integer *, doublereal - *, integer *); - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dcopy_(integer *, doublereal *, integer *, doublereal + *, integer *); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); extern integer idamax_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), dlacpy_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - ftnlen), xerbla_(char *, integer *, ftnlen); + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), dlacpy_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), xerbla_(char *, integer *, ftnlen); /* -- LAPACK computational routine -- */ @@ -314,33 +314,33 @@ f"> */ *info = 0; if (*n < 0) { - *info = -2; + *info = -2; } else if (*ldq < max(1,*n)) { - *info = -6; + *info = -6; } else /* if(complicated condition) */ { /* Computing MIN */ - i__1 = 1, i__2 = *n / 2; - if (min(i__1,i__2) > *n1 || *n / 2 < *n1) { - *info = -3; - } + i__1 = 1, i__2 = *n / 2; + if (min(i__1,i__2) > *n1 || *n / 2 < *n1) { + *info = -3; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLAED2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLAED2", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } n2 = *n - *n1; n1p1 = *n1 + 1; if (*rho < 0.) { - dscal_(&n2, &c_b3, &z__[n1p1], &c__1); + dscal_(&n2, &c_b3, &z__[n1p1], &c__1); } /* Normalize z so that norm(z) = 1. Since z is the concatenation of */ @@ -357,7 +357,7 @@ f"> */ i__1 = *n; for (i__ = n1p1; i__ <= i__1; ++i__) { - indxq[i__] += *n1; + indxq[i__] += *n1; /* L10: */ } @@ -365,13 +365,13 @@ f"> */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - dlamda[i__] = d__[indxq[i__]]; + dlamda[i__] = d__[indxq[i__]]; /* L20: */ } dlamrg_(n1, &n2, &dlamda[1], &c__1, &c__1, &indxc[1]); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - indx[i__] = indxq[indxc[i__]]; + indx[i__] = indxq[indxc[i__]]; /* L30: */ } @@ -382,7 +382,7 @@ f"> */ eps = dlamch_((char *)"Epsilon", (ftnlen)7); /* Computing MAX */ d__3 = (d__1 = d__[jmax], abs(d__1)), d__4 = (d__2 = z__[imax], abs(d__2)) - ; + ; tol = eps * 8. * max(d__3,d__4); /* If the rank-1 modifier is small enough, no more needs to be done */ @@ -390,19 +390,19 @@ f"> */ /* elements in D. */ if (*rho * (d__1 = z__[imax], abs(d__1)) <= tol) { - *k = 0; - iq2 = 1; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__ = indx[j]; - dcopy_(n, &q[i__ * q_dim1 + 1], &c__1, &q2[iq2], &c__1); - dlamda[j] = d__[i__]; - iq2 += *n; + *k = 0; + iq2 = 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__ = indx[j]; + dcopy_(n, &q[i__ * q_dim1 + 1], &c__1, &q2[iq2], &c__1); + dlamda[j] = d__[i__]; + iq2 += *n; /* L40: */ - } - dlacpy_((char *)"A", n, n, &q2[1], n, &q[q_offset], ldq, (ftnlen)1); - dcopy_(n, &dlamda[1], &c__1, &d__[1], &c__1); - goto L190; + } + dlacpy_((char *)"A", n, n, &q2[1], n, &q[q_offset], ldq, (ftnlen)1); + dcopy_(n, &dlamda[1], &c__1, &d__[1], &c__1); + goto L190; } /* If there are multiple eigenvalues then the problem deflates. Here */ @@ -413,12 +413,12 @@ f"> */ i__1 = *n1; for (i__ = 1; i__ <= i__1; ++i__) { - coltyp[i__] = 1; + coltyp[i__] = 1; /* L50: */ } i__1 = *n; for (i__ = n1p1; i__ <= i__1; ++i__) { - coltyp[i__] = 3; + coltyp[i__] = 3; /* L60: */ } @@ -427,96 +427,96 @@ f"> */ k2 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { - nj = indx[j]; - if (*rho * (d__1 = z__[nj], abs(d__1)) <= tol) { + nj = indx[j]; + if (*rho * (d__1 = z__[nj], abs(d__1)) <= tol) { /* Deflate due to small z component. */ - --k2; - coltyp[nj] = 4; - indxp[k2] = nj; - if (j == *n) { - goto L100; - } - } else { - pj = nj; - goto L80; - } + --k2; + coltyp[nj] = 4; + indxp[k2] = nj; + if (j == *n) { + goto L100; + } + } else { + pj = nj; + goto L80; + } /* L70: */ } L80: ++j; nj = indx[j]; if (j > *n) { - goto L100; + goto L100; } if (*rho * (d__1 = z__[nj], abs(d__1)) <= tol) { /* Deflate due to small z component. */ - --k2; - coltyp[nj] = 4; - indxp[k2] = nj; + --k2; + coltyp[nj] = 4; + indxp[k2] = nj; } else { /* Check if eigenvalues are close enough to allow deflation. */ - s = z__[pj]; - c__ = z__[nj]; + s = z__[pj]; + c__ = z__[nj]; /* Find sqrt(a**2+b**2) without overflow or */ /* destructive underflow. */ - tau = dlapy2_(&c__, &s); - t = d__[nj] - d__[pj]; - c__ /= tau; - s = -s / tau; - if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { + tau = dlapy2_(&c__, &s); + t = d__[nj] - d__[pj]; + c__ /= tau; + s = -s / tau; + if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { /* Deflation is possible. */ - z__[nj] = tau; - z__[pj] = 0.; - if (coltyp[nj] != coltyp[pj]) { - coltyp[nj] = 2; - } - coltyp[pj] = 4; - drot_(n, &q[pj * q_dim1 + 1], &c__1, &q[nj * q_dim1 + 1], &c__1, & - c__, &s); + z__[nj] = tau; + z__[pj] = 0.; + if (coltyp[nj] != coltyp[pj]) { + coltyp[nj] = 2; + } + coltyp[pj] = 4; + drot_(n, &q[pj * q_dim1 + 1], &c__1, &q[nj * q_dim1 + 1], &c__1, & + c__, &s); /* Computing 2nd power */ - d__1 = c__; + d__1 = c__; /* Computing 2nd power */ - d__2 = s; - t = d__[pj] * (d__1 * d__1) + d__[nj] * (d__2 * d__2); + d__2 = s; + t = d__[pj] * (d__1 * d__1) + d__[nj] * (d__2 * d__2); /* Computing 2nd power */ - d__1 = s; + d__1 = s; /* Computing 2nd power */ - d__2 = c__; - d__[nj] = d__[pj] * (d__1 * d__1) + d__[nj] * (d__2 * d__2); - d__[pj] = t; - --k2; - i__ = 1; + d__2 = c__; + d__[nj] = d__[pj] * (d__1 * d__1) + d__[nj] * (d__2 * d__2); + d__[pj] = t; + --k2; + i__ = 1; L90: - if (k2 + i__ <= *n) { - if (d__[pj] < d__[indxp[k2 + i__]]) { - indxp[k2 + i__ - 1] = indxp[k2 + i__]; - indxp[k2 + i__] = pj; - ++i__; - goto L90; - } else { - indxp[k2 + i__ - 1] = pj; - } - } else { - indxp[k2 + i__ - 1] = pj; - } - pj = nj; - } else { - ++(*k); - dlamda[*k] = d__[pj]; - w[*k] = z__[pj]; - indxp[*k] = pj; - pj = nj; - } + if (k2 + i__ <= *n) { + if (d__[pj] < d__[indxp[k2 + i__]]) { + indxp[k2 + i__ - 1] = indxp[k2 + i__]; + indxp[k2 + i__] = pj; + ++i__; + goto L90; + } else { + indxp[k2 + i__ - 1] = pj; + } + } else { + indxp[k2 + i__ - 1] = pj; + } + pj = nj; + } else { + ++(*k); + dlamda[*k] = d__[pj]; + w[*k] = z__[pj]; + indxp[*k] = pj; + pj = nj; + } } goto L80; L100: @@ -534,13 +534,13 @@ L100: /* empty). */ for (j = 1; j <= 4; ++j) { - ctot[j - 1] = 0; + ctot[j - 1] = 0; /* L110: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { - ct = coltyp[j]; - ++ctot[ct - 1]; + ct = coltyp[j]; + ++ctot[ct - 1]; /* L120: */ } @@ -558,11 +558,11 @@ L100: i__1 = *n; for (j = 1; j <= i__1; ++j) { - js = indxp[j]; - ct = coltyp[js]; - indx[psm[ct - 1]] = js; - indxc[psm[ct - 1]] = j; - ++psm[ct - 1]; + js = indxp[j]; + ct = coltyp[js]; + indx[psm[ct - 1]] = js; + indxc[psm[ct - 1]] = j; + ++psm[ct - 1]; /* L130: */ } @@ -576,44 +576,44 @@ L100: iq2 = (ctot[0] + ctot[1]) * *n1 + 1; i__1 = ctot[0]; for (j = 1; j <= i__1; ++j) { - js = indx[i__]; - dcopy_(n1, &q[js * q_dim1 + 1], &c__1, &q2[iq1], &c__1); - z__[i__] = d__[js]; - ++i__; - iq1 += *n1; + js = indx[i__]; + dcopy_(n1, &q[js * q_dim1 + 1], &c__1, &q2[iq1], &c__1); + z__[i__] = d__[js]; + ++i__; + iq1 += *n1; /* L140: */ } i__1 = ctot[1]; for (j = 1; j <= i__1; ++j) { - js = indx[i__]; - dcopy_(n1, &q[js * q_dim1 + 1], &c__1, &q2[iq1], &c__1); - dcopy_(&n2, &q[*n1 + 1 + js * q_dim1], &c__1, &q2[iq2], &c__1); - z__[i__] = d__[js]; - ++i__; - iq1 += *n1; - iq2 += n2; + js = indx[i__]; + dcopy_(n1, &q[js * q_dim1 + 1], &c__1, &q2[iq1], &c__1); + dcopy_(&n2, &q[*n1 + 1 + js * q_dim1], &c__1, &q2[iq2], &c__1); + z__[i__] = d__[js]; + ++i__; + iq1 += *n1; + iq2 += n2; /* L150: */ } i__1 = ctot[2]; for (j = 1; j <= i__1; ++j) { - js = indx[i__]; - dcopy_(&n2, &q[*n1 + 1 + js * q_dim1], &c__1, &q2[iq2], &c__1); - z__[i__] = d__[js]; - ++i__; - iq2 += n2; + js = indx[i__]; + dcopy_(&n2, &q[*n1 + 1 + js * q_dim1], &c__1, &q2[iq2], &c__1); + z__[i__] = d__[js]; + ++i__; + iq2 += n2; /* L160: */ } iq1 = iq2; i__1 = ctot[3]; for (j = 1; j <= i__1; ++j) { - js = indx[i__]; - dcopy_(n, &q[js * q_dim1 + 1], &c__1, &q2[iq2], &c__1); - iq2 += *n; - z__[i__] = d__[js]; - ++i__; + js = indx[i__]; + dcopy_(n, &q[js * q_dim1 + 1], &c__1, &q2[iq2], &c__1); + iq2 += *n; + z__[i__] = d__[js]; + ++i__; /* L170: */ } @@ -621,16 +621,16 @@ L100: /* into the last N - K slots of D and Q respectively. */ if (*k < *n) { - dlacpy_((char *)"A", n, &ctot[3], &q2[iq1], n, &q[(*k + 1) * q_dim1 + 1], ldq, - (ftnlen)1); - i__1 = *n - *k; - dcopy_(&i__1, &z__[*k + 1], &c__1, &d__[*k + 1], &c__1); + dlacpy_((char *)"A", n, &ctot[3], &q2[iq1], n, &q[(*k + 1) * q_dim1 + 1], ldq, + (ftnlen)1); + i__1 = *n - *k; + dcopy_(&i__1, &z__[*k + 1], &c__1, &d__[*k + 1], &c__1); } /* Copy CTOT into COLTYP for referencing in DLAED3. */ for (j = 1; j <= 4; ++j) { - coltyp[j] = ctot[j - 1]; + coltyp[j] = ctot[j - 1]; /* L180: */ } @@ -642,5 +642,5 @@ L190: } /* dlaed2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaed3.cpp b/lib/linalg/dlaed3.cpp index e56c3fb41b..c1f5e908dc 100644 --- a/lib/linalg/dlaed3.cpp +++ b/lib/linalg/dlaed3.cpp @@ -1,13 +1,13 @@ /* fortran/dlaed3.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -208,9 +208,9 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dlaed3_(integer *k, integer *n, integer *n1, doublereal * - d__, doublereal *q, integer *ldq, doublereal *rho, doublereal *dlamda, - doublereal *q2, integer *indx, integer *ctot, doublereal *w, - doublereal *s, integer *info) + d__, doublereal *q, integer *ldq, doublereal *rho, doublereal *dlamda, + doublereal *q2, integer *indx, integer *ctot, doublereal *w, + doublereal *s, integer *info) { /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; @@ -223,18 +223,18 @@ f"> */ integer i__, j, n2, n12, ii, n23, iq2; doublereal temp; extern doublereal dnrm2_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), - dcopy_(integer *, doublereal *, integer *, doublereal *, integer - *), dlaed4_(integer *, integer *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, integer *); + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer + *), dlaed4_(integer *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *); extern doublereal dlamc3_(doublereal *, doublereal *); - extern /* Subroutine */ int dlacpy_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen), - dlaset_(char *, integer *, integer *, doublereal *, doublereal *, - doublereal *, integer *, ftnlen), xerbla_(char *, integer *, - ftnlen); + extern /* Subroutine */ int dlacpy_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen), xerbla_(char *, integer *, + ftnlen); /* -- LAPACK computational routine -- */ @@ -278,22 +278,22 @@ f"> */ *info = 0; if (*k < 0) { - *info = -1; + *info = -1; } else if (*n < *k) { - *info = -2; + *info = -2; } else if (*ldq < max(1,*n)) { - *info = -6; + *info = -6; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLAED3", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLAED3", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*k == 0) { - return 0; + return 0; } /* Modify values DLAMDA(i) to make sure all DLAMDA(i)-DLAMDA(j) can */ @@ -315,38 +315,38 @@ f"> */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { - dlamda[i__] = dlamc3_(&dlamda[i__], &dlamda[i__]) - dlamda[i__]; + dlamda[i__] = dlamc3_(&dlamda[i__], &dlamda[i__]) - dlamda[i__]; /* L10: */ } i__1 = *k; for (j = 1; j <= i__1; ++j) { - dlaed4_(k, &j, &dlamda[1], &w[1], &q[j * q_dim1 + 1], rho, &d__[j], - info); + dlaed4_(k, &j, &dlamda[1], &w[1], &q[j * q_dim1 + 1], rho, &d__[j], + info); /* If the zero finder fails, the computation is terminated. */ - if (*info != 0) { - goto L120; - } + if (*info != 0) { + goto L120; + } /* L20: */ } if (*k == 1) { - goto L110; + goto L110; } if (*k == 2) { - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - w[1] = q[j * q_dim1 + 1]; - w[2] = q[j * q_dim1 + 2]; - ii = indx[1]; - q[j * q_dim1 + 1] = w[ii]; - ii = indx[2]; - q[j * q_dim1 + 2] = w[ii]; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + w[1] = q[j * q_dim1 + 1]; + w[2] = q[j * q_dim1 + 2]; + ii = indx[1]; + q[j * q_dim1 + 1] = w[ii]; + ii = indx[2]; + q[j * q_dim1 + 2] = w[ii]; /* L30: */ - } - goto L110; + } + goto L110; } /* Compute updated W. */ @@ -359,22 +359,22 @@ f"> */ dcopy_(k, &q[q_offset], &i__1, &w[1], &c__1); i__1 = *k; for (j = 1; j <= i__1; ++j) { - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); /* L40: */ - } - i__2 = *k; - for (i__ = j + 1; i__ <= i__2; ++i__) { - w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); + } + i__2 = *k; + for (i__ = j + 1; i__ <= i__2; ++i__) { + w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); /* L50: */ - } + } /* L60: */ } i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { - d__1 = sqrt(-w[i__]); - w[i__] = d_sign(&d__1, &s[i__]); + d__1 = sqrt(-w[i__]); + w[i__] = d_sign(&d__1, &s[i__]); /* L70: */ } @@ -382,18 +382,18 @@ f"> */ i__1 = *k; for (j = 1; j <= i__1; ++j) { - i__2 = *k; - for (i__ = 1; i__ <= i__2; ++i__) { - s[i__] = w[i__] / q[i__ + j * q_dim1]; + i__2 = *k; + for (i__ = 1; i__ <= i__2; ++i__) { + s[i__] = w[i__] / q[i__ + j * q_dim1]; /* L80: */ - } - temp = dnrm2_(k, &s[1], &c__1); - i__2 = *k; - for (i__ = 1; i__ <= i__2; ++i__) { - ii = indx[i__]; - q[i__ + j * q_dim1] = s[ii] / temp; + } + temp = dnrm2_(k, &s[1], &c__1); + i__2 = *k; + for (i__ = 1; i__ <= i__2; ++i__) { + ii = indx[i__]; + q[i__ + j * q_dim1] = s[ii] / temp; /* L90: */ - } + } /* L100: */ } @@ -406,22 +406,22 @@ L110: n23 = ctot[2] + ctot[3]; dlacpy_((char *)"A", &n23, k, &q[ctot[1] + 1 + q_dim1], ldq, &s[1], &n23, (ftnlen) - 1); + 1); iq2 = *n1 * n12 + 1; if (n23 != 0) { - dgemm_((char *)"N", (char *)"N", &n2, k, &n23, &c_b22, &q2[iq2], &n2, &s[1], &n23, & - c_b23, &q[*n1 + 1 + q_dim1], ldq, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", &n2, k, &n23, &c_b22, &q2[iq2], &n2, &s[1], &n23, & + c_b23, &q[*n1 + 1 + q_dim1], ldq, (ftnlen)1, (ftnlen)1); } else { - dlaset_((char *)"A", &n2, k, &c_b23, &c_b23, &q[*n1 + 1 + q_dim1], ldq, ( - ftnlen)1); + dlaset_((char *)"A", &n2, k, &c_b23, &c_b23, &q[*n1 + 1 + q_dim1], ldq, ( + ftnlen)1); } dlacpy_((char *)"A", &n12, k, &q[q_offset], ldq, &s[1], &n12, (ftnlen)1); if (n12 != 0) { - dgemm_((char *)"N", (char *)"N", n1, k, &n12, &c_b22, &q2[1], n1, &s[1], &n12, &c_b23, - &q[q_offset], ldq, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", n1, k, &n12, &c_b22, &q2[1], n1, &s[1], &n12, &c_b23, + &q[q_offset], ldq, (ftnlen)1, (ftnlen)1); } else { - dlaset_((char *)"A", n1, k, &c_b23, &c_b23, &q[q_dim1 + 1], ldq, (ftnlen)1); + dlaset_((char *)"A", n1, k, &c_b23, &c_b23, &q[q_dim1 + 1], ldq, (ftnlen)1); } @@ -433,5 +433,5 @@ L120: } /* dlaed3_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaed4.cpp b/lib/linalg/dlaed4.cpp index 5cc622887d..ca532571dd 100644 --- a/lib/linalg/dlaed4.cpp +++ b/lib/linalg/dlaed4.cpp @@ -1,13 +1,13 @@ /* fortran/dlaed4.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -161,9 +161,9 @@ f"> */ /* > at Berkeley, USA */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlaed4_(integer *n, integer *i__, doublereal *d__, - doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam, - integer *info) +/* Subroutine */ int dlaed4_(integer *n, integer *i__, doublereal *d__, + doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam, + integer *info) { /* System generated locals */ integer i__1; @@ -187,9 +187,9 @@ f"> */ integer niter; logical swtch; extern /* Subroutine */ int dlaed5_(integer *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *), dlaed6_(integer *, - logical *, doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *); + doublereal *, doublereal *, doublereal *), dlaed6_(integer *, + logical *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *); logical swtch3; extern doublereal dlamch_(char *, ftnlen); logical orgati; @@ -237,13 +237,13 @@ f"> */ /* Presumably, I=1 upon entry */ - *dlam = d__[1] + *rho * z__[1] * z__[1]; - delta[1] = 1.; - return 0; + *dlam = d__[1] + *rho * z__[1] * z__[1]; + delta[1] = 1.; + return 0; } if (*n == 2) { - dlaed5_(i__, &d__[1], &z__[1], &delta[1], rho, dlam); - return 0; + dlaed5_(i__, &d__[1], &z__[1], &delta[1], rho, dlam); + return 0; } /* Compute machine epsilon */ @@ -257,140 +257,140 @@ f"> */ /* Initialize some basic variables */ - ii = *n - 1; - niter = 1; + ii = *n - 1; + niter = 1; /* Calculate initial guess */ - midpt = *rho / 2.; + midpt = *rho / 2.; /* If ||Z||_2 is not one, then TEMP should be set to */ /* RHO * ||Z||_2^2 / TWO */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - delta[j] = d__[j] - d__[*i__] - midpt; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] = d__[j] - d__[*i__] - midpt; /* L10: */ - } + } - psi = 0.; - i__1 = *n - 2; - for (j = 1; j <= i__1; ++j) { - psi += z__[j] * z__[j] / delta[j]; + psi = 0.; + i__1 = *n - 2; + for (j = 1; j <= i__1; ++j) { + psi += z__[j] * z__[j] / delta[j]; /* L20: */ - } + } - c__ = rhoinv + psi; - w = c__ + z__[ii] * z__[ii] / delta[ii] + z__[*n] * z__[*n] / delta[* - n]; + c__ = rhoinv + psi; + w = c__ + z__[ii] * z__[ii] / delta[ii] + z__[*n] * z__[*n] / delta[* + n]; - if (w <= 0.) { - temp = z__[*n - 1] * z__[*n - 1] / (d__[*n] - d__[*n - 1] + *rho) - + z__[*n] * z__[*n] / *rho; - if (c__ <= temp) { - tau = *rho; - } else { - del = d__[*n] - d__[*n - 1]; - a = -c__ * del + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n] - ; - b = z__[*n] * z__[*n] * del; - if (a < 0.) { - tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a); - } else { - tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); - } - } + if (w <= 0.) { + temp = z__[*n - 1] * z__[*n - 1] / (d__[*n] - d__[*n - 1] + *rho) + + z__[*n] * z__[*n] / *rho; + if (c__ <= temp) { + tau = *rho; + } else { + del = d__[*n] - d__[*n - 1]; + a = -c__ * del + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n] + ; + b = z__[*n] * z__[*n] * del; + if (a < 0.) { + tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a); + } else { + tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); + } + } /* It can be proved that */ /* D(N)+RHO/2 <= LAMBDA(N) < D(N)+TAU <= D(N)+RHO */ - dltlb = midpt; - dltub = *rho; - } else { - del = d__[*n] - d__[*n - 1]; - a = -c__ * del + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n]; - b = z__[*n] * z__[*n] * del; - if (a < 0.) { - tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a); - } else { - tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); - } + dltlb = midpt; + dltub = *rho; + } else { + del = d__[*n] - d__[*n - 1]; + a = -c__ * del + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n]; + b = z__[*n] * z__[*n] * del; + if (a < 0.) { + tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a); + } else { + tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); + } /* It can be proved that */ /* D(N) < D(N)+TAU < LAMBDA(N) < D(N)+RHO/2 */ - dltlb = 0.; - dltub = midpt; - } + dltlb = 0.; + dltub = midpt; + } - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - delta[j] = d__[j] - d__[*i__] - tau; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] = d__[j] - d__[*i__] - tau; /* L30: */ - } + } /* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; - psi = 0.; - erretm = 0.; - i__1 = ii; - for (j = 1; j <= i__1; ++j) { - temp = z__[j] / delta[j]; - psi += z__[j] * temp; - dpsi += temp * temp; - erretm += psi; + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = ii; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / delta[j]; + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; /* L40: */ - } - erretm = abs(erretm); + } + erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ - temp = z__[*n] / delta[*n]; - phi = z__[*n] * temp; - dphi = temp * temp; - erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi - + dphi); + temp = z__[*n] / delta[*n]; + phi = z__[*n] * temp; + dphi = temp * temp; + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi + + dphi); - w = rhoinv + phi + psi; + w = rhoinv + phi + psi; /* Test for convergence */ - if (abs(w) <= eps * erretm) { - *dlam = d__[*i__] + tau; - goto L250; - } + if (abs(w) <= eps * erretm) { + *dlam = d__[*i__] + tau; + goto L250; + } - if (w <= 0.) { - dltlb = max(dltlb,tau); - } else { - dltub = min(dltub,tau); - } + if (w <= 0.) { + dltlb = max(dltlb,tau); + } else { + dltub = min(dltub,tau); + } /* Calculate the new step */ - ++niter; - c__ = w - delta[*n - 1] * dpsi - delta[*n] * dphi; - a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * ( - dpsi + dphi); - b = delta[*n - 1] * delta[*n] * w; - if (c__ < 0.) { - c__ = abs(c__); - } - if (c__ == 0.) { + ++niter; + c__ = w - delta[*n - 1] * dpsi - delta[*n] * dphi; + a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * ( + dpsi + dphi); + b = delta[*n - 1] * delta[*n] * w; + if (c__ < 0.) { + c__ = abs(c__); + } + if (c__ == 0.) { /* ETA = B/A */ /* ETA = RHO - TAU */ /* ETA = DLTUB - TAU */ /* Update proposed by Li, Ren-Cang: */ - eta = -w / (dpsi + dphi); - } else if (a >= 0.) { - eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ - * 2.); - } else { - eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) - ); - } + eta = -w / (dpsi + dphi); + } else if (a >= 0.) { + eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ + * 2.); + } else { + eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) + ); + } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ @@ -398,82 +398,82 @@ f"> */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ - if (w * eta > 0.) { - eta = -w / (dpsi + dphi); - } - temp = tau + eta; - if (temp > dltub || temp < dltlb) { - if (w < 0.) { - eta = (dltub - tau) / 2.; - } else { - eta = (dltlb - tau) / 2.; - } - } - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - delta[j] -= eta; + if (w * eta > 0.) { + eta = -w / (dpsi + dphi); + } + temp = tau + eta; + if (temp > dltub || temp < dltlb) { + if (w < 0.) { + eta = (dltub - tau) / 2.; + } else { + eta = (dltlb - tau) / 2.; + } + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] -= eta; /* L50: */ - } + } - tau += eta; + tau += eta; /* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; - psi = 0.; - erretm = 0.; - i__1 = ii; - for (j = 1; j <= i__1; ++j) { - temp = z__[j] / delta[j]; - psi += z__[j] * temp; - dpsi += temp * temp; - erretm += psi; + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = ii; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / delta[j]; + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; /* L60: */ - } - erretm = abs(erretm); + } + erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ - temp = z__[*n] / delta[*n]; - phi = z__[*n] * temp; - dphi = temp * temp; - erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi - + dphi); + temp = z__[*n] / delta[*n]; + phi = z__[*n] * temp; + dphi = temp * temp; + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi + + dphi); - w = rhoinv + phi + psi; + w = rhoinv + phi + psi; /* Main loop to update the values of the array DELTA */ - iter = niter + 1; + iter = niter + 1; - for (niter = iter; niter <= 30; ++niter) { + for (niter = iter; niter <= 30; ++niter) { /* Test for convergence */ - if (abs(w) <= eps * erretm) { - *dlam = d__[*i__] + tau; - goto L250; - } + if (abs(w) <= eps * erretm) { + *dlam = d__[*i__] + tau; + goto L250; + } - if (w <= 0.) { - dltlb = max(dltlb,tau); - } else { - dltub = min(dltub,tau); - } + if (w <= 0.) { + dltlb = max(dltlb,tau); + } else { + dltub = min(dltub,tau); + } /* Calculate the new step */ - c__ = w - delta[*n - 1] * dpsi - delta[*n] * dphi; - a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * - (dpsi + dphi); - b = delta[*n - 1] * delta[*n] * w; - if (a >= 0.) { - eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( - c__ * 2.); - } else { - eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))); - } + c__ = w - delta[*n - 1] * dpsi - delta[*n] * dphi; + a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * + (dpsi + dphi); + b = delta[*n - 1] * delta[*n] * w; + if (a >= 0.) { + eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( + c__ * 2.); + } else { + eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))); + } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ @@ -481,57 +481,57 @@ f"> */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ - if (w * eta > 0.) { - eta = -w / (dpsi + dphi); - } - temp = tau + eta; - if (temp > dltub || temp < dltlb) { - if (w < 0.) { - eta = (dltub - tau) / 2.; - } else { - eta = (dltlb - tau) / 2.; - } - } - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - delta[j] -= eta; + if (w * eta > 0.) { + eta = -w / (dpsi + dphi); + } + temp = tau + eta; + if (temp > dltub || temp < dltlb) { + if (w < 0.) { + eta = (dltub - tau) / 2.; + } else { + eta = (dltlb - tau) / 2.; + } + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] -= eta; /* L70: */ - } + } - tau += eta; + tau += eta; /* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; - psi = 0.; - erretm = 0.; - i__1 = ii; - for (j = 1; j <= i__1; ++j) { - temp = z__[j] / delta[j]; - psi += z__[j] * temp; - dpsi += temp * temp; - erretm += psi; + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = ii; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / delta[j]; + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; /* L80: */ - } - erretm = abs(erretm); + } + erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ - temp = z__[*n] / delta[*n]; - phi = z__[*n] * temp; - dphi = temp * temp; - erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * ( - dpsi + dphi); + temp = z__[*n] / delta[*n]; + phi = z__[*n] * temp; + dphi = temp * temp; + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * ( + dpsi + dphi); - w = rhoinv + phi + psi; + w = rhoinv + phi + psi; /* L90: */ - } + } /* Return with INFO = 1, NITER = MAXIT and not converged */ - *info = 1; - *dlam = d__[*i__] + tau; - goto L250; + *info = 1; + *dlam = d__[*i__] + tau; + goto L250; /* End for the case I = N */ @@ -539,228 +539,228 @@ f"> */ /* The case for I < N */ - niter = 1; - ip1 = *i__ + 1; + niter = 1; + ip1 = *i__ + 1; /* Calculate initial guess */ - del = d__[ip1] - d__[*i__]; - midpt = del / 2.; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - delta[j] = d__[j] - d__[*i__] - midpt; + del = d__[ip1] - d__[*i__]; + midpt = del / 2.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] = d__[j] - d__[*i__] - midpt; /* L100: */ - } + } - psi = 0.; - i__1 = *i__ - 1; - for (j = 1; j <= i__1; ++j) { - psi += z__[j] * z__[j] / delta[j]; + psi = 0.; + i__1 = *i__ - 1; + for (j = 1; j <= i__1; ++j) { + psi += z__[j] * z__[j] / delta[j]; /* L110: */ - } + } - phi = 0.; - i__1 = *i__ + 2; - for (j = *n; j >= i__1; --j) { - phi += z__[j] * z__[j] / delta[j]; + phi = 0.; + i__1 = *i__ + 2; + for (j = *n; j >= i__1; --j) { + phi += z__[j] * z__[j] / delta[j]; /* L120: */ - } - c__ = rhoinv + psi + phi; - w = c__ + z__[*i__] * z__[*i__] / delta[*i__] + z__[ip1] * z__[ip1] / - delta[ip1]; + } + c__ = rhoinv + psi + phi; + w = c__ + z__[*i__] * z__[*i__] / delta[*i__] + z__[ip1] * z__[ip1] / + delta[ip1]; - if (w > 0.) { + if (w > 0.) { /* d(i)< the ith eigenvalue < (d(i)+d(i+1))/2 */ /* We choose d(i) as origin. */ - orgati = TRUE_; - a = c__ * del + z__[*i__] * z__[*i__] + z__[ip1] * z__[ip1]; - b = z__[*i__] * z__[*i__] * del; - if (a > 0.) { - tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))); - } else { - tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( - c__ * 2.); - } - dltlb = 0.; - dltub = midpt; - } else { + orgati = TRUE_; + a = c__ * del + z__[*i__] * z__[*i__] + z__[ip1] * z__[ip1]; + b = z__[*i__] * z__[*i__] * del; + if (a > 0.) { + tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))); + } else { + tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( + c__ * 2.); + } + dltlb = 0.; + dltub = midpt; + } else { /* (d(i)+d(i+1))/2 <= the ith eigenvalue < d(i+1) */ /* We choose d(i+1) as origin. */ - orgati = FALSE_; - a = c__ * del - z__[*i__] * z__[*i__] - z__[ip1] * z__[ip1]; - b = z__[ip1] * z__[ip1] * del; - if (a < 0.) { - tau = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs( - d__1)))); - } else { - tau = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / - (c__ * 2.); - } - dltlb = -midpt; - dltub = 0.; - } + orgati = FALSE_; + a = c__ * del - z__[*i__] * z__[*i__] - z__[ip1] * z__[ip1]; + b = z__[ip1] * z__[ip1] * del; + if (a < 0.) { + tau = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs( + d__1)))); + } else { + tau = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / + (c__ * 2.); + } + dltlb = -midpt; + dltub = 0.; + } - if (orgati) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - delta[j] = d__[j] - d__[*i__] - tau; + if (orgati) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] = d__[j] - d__[*i__] - tau; /* L130: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - delta[j] = d__[j] - d__[ip1] - tau; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] = d__[j] - d__[ip1] - tau; /* L140: */ - } - } - if (orgati) { - ii = *i__; - } else { - ii = *i__ + 1; - } - iim1 = ii - 1; - iip1 = ii + 1; + } + } + if (orgati) { + ii = *i__; + } else { + ii = *i__ + 1; + } + iim1 = ii - 1; + iip1 = ii + 1; /* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; - psi = 0.; - erretm = 0.; - i__1 = iim1; - for (j = 1; j <= i__1; ++j) { - temp = z__[j] / delta[j]; - psi += z__[j] * temp; - dpsi += temp * temp; - erretm += psi; + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = iim1; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / delta[j]; + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; /* L150: */ - } - erretm = abs(erretm); + } + erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ - dphi = 0.; - phi = 0.; - i__1 = iip1; - for (j = *n; j >= i__1; --j) { - temp = z__[j] / delta[j]; - phi += z__[j] * temp; - dphi += temp * temp; - erretm += phi; + dphi = 0.; + phi = 0.; + i__1 = iip1; + for (j = *n; j >= i__1; --j) { + temp = z__[j] / delta[j]; + phi += z__[j] * temp; + dphi += temp * temp; + erretm += phi; /* L160: */ - } + } - w = rhoinv + phi + psi; + w = rhoinv + phi + psi; /* W is the value of the secular function with */ /* its ii-th element removed. */ - swtch3 = FALSE_; - if (orgati) { - if (w < 0.) { - swtch3 = TRUE_; - } - } else { - if (w > 0.) { - swtch3 = TRUE_; - } - } - if (ii == 1 || ii == *n) { - swtch3 = FALSE_; - } + swtch3 = FALSE_; + if (orgati) { + if (w < 0.) { + swtch3 = TRUE_; + } + } else { + if (w > 0.) { + swtch3 = TRUE_; + } + } + if (ii == 1 || ii == *n) { + swtch3 = FALSE_; + } - temp = z__[ii] / delta[ii]; - dw = dpsi + dphi + temp * temp; - temp = z__[ii] * temp; - w += temp; - erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + - abs(tau) * dw; + temp = z__[ii] / delta[ii]; + dw = dpsi + dphi + temp * temp; + temp = z__[ii] * temp; + w += temp; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + + abs(tau) * dw; /* Test for convergence */ - if (abs(w) <= eps * erretm) { - if (orgati) { - *dlam = d__[*i__] + tau; - } else { - *dlam = d__[ip1] + tau; - } - goto L250; - } + if (abs(w) <= eps * erretm) { + if (orgati) { + *dlam = d__[*i__] + tau; + } else { + *dlam = d__[ip1] + tau; + } + goto L250; + } - if (w <= 0.) { - dltlb = max(dltlb,tau); - } else { - dltub = min(dltub,tau); - } + if (w <= 0.) { + dltlb = max(dltlb,tau); + } else { + dltub = min(dltub,tau); + } /* Calculate the new step */ - ++niter; - if (! swtch3) { - if (orgati) { + ++niter; + if (! swtch3) { + if (orgati) { /* Computing 2nd power */ - d__1 = z__[*i__] / delta[*i__]; - c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * (d__1 * - d__1); - } else { + d__1 = z__[*i__] / delta[*i__]; + c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * (d__1 * + d__1); + } else { /* Computing 2nd power */ - d__1 = z__[ip1] / delta[ip1]; - c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * (d__1 * - d__1); - } - a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] * - dw; - b = delta[*i__] * delta[ip1] * w; - if (c__ == 0.) { - if (a == 0.) { - if (orgati) { - a = z__[*i__] * z__[*i__] + delta[ip1] * delta[ip1] * - (dpsi + dphi); - } else { - a = z__[ip1] * z__[ip1] + delta[*i__] * delta[*i__] * - (dpsi + dphi); - } - } - eta = b / a; - } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( - c__ * 2.); - } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))); - } - } else { + d__1 = z__[ip1] / delta[ip1]; + c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * (d__1 * + d__1); + } + a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] * + dw; + b = delta[*i__] * delta[ip1] * w; + if (c__ == 0.) { + if (a == 0.) { + if (orgati) { + a = z__[*i__] * z__[*i__] + delta[ip1] * delta[ip1] * + (dpsi + dphi); + } else { + a = z__[ip1] * z__[ip1] + delta[*i__] * delta[*i__] * + (dpsi + dphi); + } + } + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( + c__ * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))); + } + } else { /* Interpolation using THREE most relevant poles */ - temp = rhoinv + psi + phi; - if (orgati) { - temp1 = z__[iim1] / delta[iim1]; - temp1 *= temp1; - c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] - d__[ - iip1]) * temp1; - zz[0] = z__[iim1] * z__[iim1]; - zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + dphi); - } else { - temp1 = z__[iip1] / delta[iip1]; - temp1 *= temp1; - c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] - d__[ - iim1]) * temp1; - zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - temp1)); - zz[2] = z__[iip1] * z__[iip1]; - } - zz[1] = z__[ii] * z__[ii]; - dlaed6_(&niter, &orgati, &c__, &delta[iim1], zz, &w, &eta, info); - if (*info != 0) { - goto L250; - } - } + temp = rhoinv + psi + phi; + if (orgati) { + temp1 = z__[iim1] / delta[iim1]; + temp1 *= temp1; + c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] - d__[ + iip1]) * temp1; + zz[0] = z__[iim1] * z__[iim1]; + zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + dphi); + } else { + temp1 = z__[iip1] / delta[iip1]; + temp1 *= temp1; + c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] - d__[ + iim1]) * temp1; + zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - temp1)); + zz[2] = z__[iip1] * z__[iip1]; + } + zz[1] = z__[ii] * z__[ii]; + dlaed6_(&niter, &orgati, &c__, &delta[iim1], zz, &w, &eta, info); + if (*info != 0) { + goto L250; + } + } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ @@ -768,181 +768,181 @@ f"> */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ - if (w * eta >= 0.) { - eta = -w / dw; - } - temp = tau + eta; - if (temp > dltub || temp < dltlb) { - if (w < 0.) { - eta = (dltub - tau) / 2.; - } else { - eta = (dltlb - tau) / 2.; - } - } + if (w * eta >= 0.) { + eta = -w / dw; + } + temp = tau + eta; + if (temp > dltub || temp < dltlb) { + if (w < 0.) { + eta = (dltub - tau) / 2.; + } else { + eta = (dltlb - tau) / 2.; + } + } - prew = w; + prew = w; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - delta[j] -= eta; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] -= eta; /* L180: */ - } + } /* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; - psi = 0.; - erretm = 0.; - i__1 = iim1; - for (j = 1; j <= i__1; ++j) { - temp = z__[j] / delta[j]; - psi += z__[j] * temp; - dpsi += temp * temp; - erretm += psi; + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = iim1; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / delta[j]; + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; /* L190: */ - } - erretm = abs(erretm); + } + erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ - dphi = 0.; - phi = 0.; - i__1 = iip1; - for (j = *n; j >= i__1; --j) { - temp = z__[j] / delta[j]; - phi += z__[j] * temp; - dphi += temp * temp; - erretm += phi; + dphi = 0.; + phi = 0.; + i__1 = iip1; + for (j = *n; j >= i__1; --j) { + temp = z__[j] / delta[j]; + phi += z__[j] * temp; + dphi += temp * temp; + erretm += phi; /* L200: */ - } + } - temp = z__[ii] / delta[ii]; - dw = dpsi + dphi + temp * temp; - temp = z__[ii] * temp; - w = rhoinv + phi + psi + temp; - erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + ( - d__1 = tau + eta, abs(d__1)) * dw; + temp = z__[ii] / delta[ii]; + dw = dpsi + dphi + temp * temp; + temp = z__[ii] * temp; + w = rhoinv + phi + psi + temp; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + ( + d__1 = tau + eta, abs(d__1)) * dw; - swtch = FALSE_; - if (orgati) { - if (-w > abs(prew) / 10.) { - swtch = TRUE_; - } - } else { - if (w > abs(prew) / 10.) { - swtch = TRUE_; - } - } + swtch = FALSE_; + if (orgati) { + if (-w > abs(prew) / 10.) { + swtch = TRUE_; + } + } else { + if (w > abs(prew) / 10.) { + swtch = TRUE_; + } + } - tau += eta; + tau += eta; /* Main loop to update the values of the array DELTA */ - iter = niter + 1; + iter = niter + 1; - for (niter = iter; niter <= 30; ++niter) { + for (niter = iter; niter <= 30; ++niter) { /* Test for convergence */ - if (abs(w) <= eps * erretm) { - if (orgati) { - *dlam = d__[*i__] + tau; - } else { - *dlam = d__[ip1] + tau; - } - goto L250; - } + if (abs(w) <= eps * erretm) { + if (orgati) { + *dlam = d__[*i__] + tau; + } else { + *dlam = d__[ip1] + tau; + } + goto L250; + } - if (w <= 0.) { - dltlb = max(dltlb,tau); - } else { - dltub = min(dltub,tau); - } + if (w <= 0.) { + dltlb = max(dltlb,tau); + } else { + dltub = min(dltub,tau); + } /* Calculate the new step */ - if (! swtch3) { - if (! swtch) { - if (orgati) { + if (! swtch3) { + if (! swtch) { + if (orgati) { /* Computing 2nd power */ - d__1 = z__[*i__] / delta[*i__]; - c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * ( - d__1 * d__1); - } else { + d__1 = z__[*i__] / delta[*i__]; + c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * ( + d__1 * d__1); + } else { /* Computing 2nd power */ - d__1 = z__[ip1] / delta[ip1]; - c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * - (d__1 * d__1); - } - } else { - temp = z__[ii] / delta[ii]; - if (orgati) { - dpsi += temp * temp; - } else { - dphi += temp * temp; - } - c__ = w - delta[*i__] * dpsi - delta[ip1] * dphi; - } - a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] - * dw; - b = delta[*i__] * delta[ip1] * w; - if (c__ == 0.) { - if (a == 0.) { - if (! swtch) { - if (orgati) { - a = z__[*i__] * z__[*i__] + delta[ip1] * - delta[ip1] * (dpsi + dphi); - } else { - a = z__[ip1] * z__[ip1] + delta[*i__] * delta[ - *i__] * (dpsi + dphi); - } - } else { - a = delta[*i__] * delta[*i__] * dpsi + delta[ip1] - * delta[ip1] * dphi; - } - } - eta = b / a; - } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) - / (c__ * 2.); - } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, - abs(d__1)))); - } - } else { + d__1 = z__[ip1] / delta[ip1]; + c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * + (d__1 * d__1); + } + } else { + temp = z__[ii] / delta[ii]; + if (orgati) { + dpsi += temp * temp; + } else { + dphi += temp * temp; + } + c__ = w - delta[*i__] * dpsi - delta[ip1] * dphi; + } + a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] + * dw; + b = delta[*i__] * delta[ip1] * w; + if (c__ == 0.) { + if (a == 0.) { + if (! swtch) { + if (orgati) { + a = z__[*i__] * z__[*i__] + delta[ip1] * + delta[ip1] * (dpsi + dphi); + } else { + a = z__[ip1] * z__[ip1] + delta[*i__] * delta[ + *i__] * (dpsi + dphi); + } + } else { + a = delta[*i__] * delta[*i__] * dpsi + delta[ip1] + * delta[ip1] * dphi; + } + } + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) + / (c__ * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, + abs(d__1)))); + } + } else { /* Interpolation using THREE most relevant poles */ - temp = rhoinv + psi + phi; - if (swtch) { - c__ = temp - delta[iim1] * dpsi - delta[iip1] * dphi; - zz[0] = delta[iim1] * delta[iim1] * dpsi; - zz[2] = delta[iip1] * delta[iip1] * dphi; - } else { - if (orgati) { - temp1 = z__[iim1] / delta[iim1]; - temp1 *= temp1; - c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] - - d__[iip1]) * temp1; - zz[0] = z__[iim1] * z__[iim1]; - zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + - dphi); - } else { - temp1 = z__[iip1] / delta[iip1]; - temp1 *= temp1; - c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] - - d__[iim1]) * temp1; - zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - - temp1)); - zz[2] = z__[iip1] * z__[iip1]; - } - } - dlaed6_(&niter, &orgati, &c__, &delta[iim1], zz, &w, &eta, - info); - if (*info != 0) { - goto L250; - } - } + temp = rhoinv + psi + phi; + if (swtch) { + c__ = temp - delta[iim1] * dpsi - delta[iip1] * dphi; + zz[0] = delta[iim1] * delta[iim1] * dpsi; + zz[2] = delta[iip1] * delta[iip1] * dphi; + } else { + if (orgati) { + temp1 = z__[iim1] / delta[iim1]; + temp1 *= temp1; + c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] + - d__[iip1]) * temp1; + zz[0] = z__[iim1] * z__[iim1]; + zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + + dphi); + } else { + temp1 = z__[iip1] / delta[iip1]; + temp1 *= temp1; + c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] + - d__[iim1]) * temp1; + zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - + temp1)); + zz[2] = z__[iip1] * z__[iip1]; + } + } + dlaed6_(&niter, &orgati, &c__, &delta[iim1], zz, &w, &eta, + info); + if (*info != 0) { + goto L250; + } + } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ @@ -950,76 +950,76 @@ f"> */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ - if (w * eta >= 0.) { - eta = -w / dw; - } - temp = tau + eta; - if (temp > dltub || temp < dltlb) { - if (w < 0.) { - eta = (dltub - tau) / 2.; - } else { - eta = (dltlb - tau) / 2.; - } - } + if (w * eta >= 0.) { + eta = -w / dw; + } + temp = tau + eta; + if (temp > dltub || temp < dltlb) { + if (w < 0.) { + eta = (dltub - tau) / 2.; + } else { + eta = (dltlb - tau) / 2.; + } + } - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - delta[j] -= eta; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] -= eta; /* L210: */ - } + } - tau += eta; - prew = w; + tau += eta; + prew = w; /* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; - psi = 0.; - erretm = 0.; - i__1 = iim1; - for (j = 1; j <= i__1; ++j) { - temp = z__[j] / delta[j]; - psi += z__[j] * temp; - dpsi += temp * temp; - erretm += psi; + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = iim1; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / delta[j]; + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; /* L220: */ - } - erretm = abs(erretm); + } + erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ - dphi = 0.; - phi = 0.; - i__1 = iip1; - for (j = *n; j >= i__1; --j) { - temp = z__[j] / delta[j]; - phi += z__[j] * temp; - dphi += temp * temp; - erretm += phi; + dphi = 0.; + phi = 0.; + i__1 = iip1; + for (j = *n; j >= i__1; --j) { + temp = z__[j] / delta[j]; + phi += z__[j] * temp; + dphi += temp * temp; + erretm += phi; /* L230: */ - } + } - temp = z__[ii] / delta[ii]; - dw = dpsi + dphi + temp * temp; - temp = z__[ii] * temp; - w = rhoinv + phi + psi + temp; - erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. - + abs(tau) * dw; - if (w * prew > 0. && abs(w) > abs(prew) / 10.) { - swtch = ! swtch; - } + temp = z__[ii] / delta[ii]; + dw = dpsi + dphi + temp * temp; + temp = z__[ii] * temp; + w = rhoinv + phi + psi + temp; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + + abs(tau) * dw; + if (w * prew > 0. && abs(w) > abs(prew) / 10.) { + swtch = ! swtch; + } /* L240: */ - } + } /* Return with INFO = 1, NITER = MAXIT and not converged */ - *info = 1; - if (orgati) { - *dlam = d__[*i__] + tau; - } else { - *dlam = d__[ip1] + tau; - } + *info = 1; + if (orgati) { + *dlam = d__[*i__] + tau; + } else { + *dlam = d__[ip1] + tau; + } } @@ -1032,5 +1032,5 @@ L250: } /* dlaed4_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaed5.cpp b/lib/linalg/dlaed5.cpp index 14e8a429ee..558676d269 100644 --- a/lib/linalg/dlaed5.cpp +++ b/lib/linalg/dlaed5.cpp @@ -1,13 +1,13 @@ /* fortran/dlaed5.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -124,8 +124,8 @@ f"> */ /* > at Berkeley, USA */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlaed5_(integer *i__, doublereal *d__, doublereal *z__, - doublereal *delta, doublereal *rho, doublereal *dlam) +/* Subroutine */ int dlaed5_(integer *i__, doublereal *d__, doublereal *z__, + doublereal *delta, doublereal *rho, doublereal *dlam) { /* System generated locals */ doublereal d__1; @@ -164,49 +164,49 @@ f"> */ /* Function Body */ del = d__[2] - d__[1]; if (*i__ == 1) { - w = *rho * 2. * (z__[2] * z__[2] - z__[1] * z__[1]) / del + 1.; - if (w > 0.) { - b = del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); - c__ = *rho * z__[1] * z__[1] * del; + w = *rho * 2. * (z__[2] * z__[2] - z__[1] * z__[1]) / del + 1.; + if (w > 0.) { + b = del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); + c__ = *rho * z__[1] * z__[1] * del; /* B > ZERO, always */ - tau = c__ * 2. / (b + sqrt((d__1 = b * b - c__ * 4., abs(d__1)))); - *dlam = d__[1] + tau; - delta[1] = -z__[1] / tau; - delta[2] = z__[2] / (del - tau); - } else { - b = -del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); - c__ = *rho * z__[2] * z__[2] * del; - if (b > 0.) { - tau = c__ * -2. / (b + sqrt(b * b + c__ * 4.)); - } else { - tau = (b - sqrt(b * b + c__ * 4.)) / 2.; - } - *dlam = d__[2] + tau; - delta[1] = -z__[1] / (del + tau); - delta[2] = -z__[2] / tau; - } - temp = sqrt(delta[1] * delta[1] + delta[2] * delta[2]); - delta[1] /= temp; - delta[2] /= temp; + tau = c__ * 2. / (b + sqrt((d__1 = b * b - c__ * 4., abs(d__1)))); + *dlam = d__[1] + tau; + delta[1] = -z__[1] / tau; + delta[2] = z__[2] / (del - tau); + } else { + b = -del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); + c__ = *rho * z__[2] * z__[2] * del; + if (b > 0.) { + tau = c__ * -2. / (b + sqrt(b * b + c__ * 4.)); + } else { + tau = (b - sqrt(b * b + c__ * 4.)) / 2.; + } + *dlam = d__[2] + tau; + delta[1] = -z__[1] / (del + tau); + delta[2] = -z__[2] / tau; + } + temp = sqrt(delta[1] * delta[1] + delta[2] * delta[2]); + delta[1] /= temp; + delta[2] /= temp; } else { /* Now I=2 */ - b = -del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); - c__ = *rho * z__[2] * z__[2] * del; - if (b > 0.) { - tau = (b + sqrt(b * b + c__ * 4.)) / 2.; - } else { - tau = c__ * 2. / (-b + sqrt(b * b + c__ * 4.)); - } - *dlam = d__[2] + tau; - delta[1] = -z__[1] / (del + tau); - delta[2] = -z__[2] / tau; - temp = sqrt(delta[1] * delta[1] + delta[2] * delta[2]); - delta[1] /= temp; - delta[2] /= temp; + b = -del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); + c__ = *rho * z__[2] * z__[2] * del; + if (b > 0.) { + tau = (b + sqrt(b * b + c__ * 4.)) / 2.; + } else { + tau = c__ * 2. / (-b + sqrt(b * b + c__ * 4.)); + } + *dlam = d__[2] + tau; + delta[1] = -z__[1] / (del + tau); + delta[2] = -z__[2] / tau; + temp = sqrt(delta[1] * delta[1] + delta[2] * delta[2]); + delta[1] /= temp; + delta[2] /= temp; } return 0; @@ -215,5 +215,5 @@ f"> */ } /* dlaed5_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaed6.cpp b/lib/linalg/dlaed6.cpp index 7a855780f0..aae975971f 100644 --- a/lib/linalg/dlaed6.cpp +++ b/lib/linalg/dlaed6.cpp @@ -1,13 +1,13 @@ /* fortran/dlaed6.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -157,8 +157,8 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dlaed6_(integer *kniter, logical *orgati, doublereal * - rho, doublereal *d__, doublereal *z__, doublereal *finit, doublereal * - tau, integer *info) + rho, doublereal *d__, doublereal *z__, doublereal *finit, doublereal * + tau, integer *info) { /* System generated locals */ integer i__1; @@ -211,65 +211,65 @@ f"> */ *info = 0; if (*orgati) { - lbd = d__[2]; - ubd = d__[3]; + lbd = d__[2]; + ubd = d__[3]; } else { - lbd = d__[1]; - ubd = d__[2]; + lbd = d__[1]; + ubd = d__[2]; } if (*finit < 0.) { - lbd = 0.; + lbd = 0.; } else { - ubd = 0.; + ubd = 0.; } niter = 1; *tau = 0.; if (*kniter == 2) { - if (*orgati) { - temp = (d__[3] - d__[2]) / 2.; - c__ = *rho + z__[1] / (d__[1] - d__[2] - temp); - a = c__ * (d__[2] + d__[3]) + z__[2] + z__[3]; - b = c__ * d__[2] * d__[3] + z__[2] * d__[3] + z__[3] * d__[2]; - } else { - temp = (d__[1] - d__[2]) / 2.; - c__ = *rho + z__[3] / (d__[3] - d__[2] - temp); - a = c__ * (d__[1] + d__[2]) + z__[1] + z__[2]; - b = c__ * d__[1] * d__[2] + z__[1] * d__[2] + z__[2] * d__[1]; - } + if (*orgati) { + temp = (d__[3] - d__[2]) / 2.; + c__ = *rho + z__[1] / (d__[1] - d__[2] - temp); + a = c__ * (d__[2] + d__[3]) + z__[2] + z__[3]; + b = c__ * d__[2] * d__[3] + z__[2] * d__[3] + z__[3] * d__[2]; + } else { + temp = (d__[1] - d__[2]) / 2.; + c__ = *rho + z__[3] / (d__[3] - d__[2] - temp); + a = c__ * (d__[1] + d__[2]) + z__[1] + z__[2]; + b = c__ * d__[1] * d__[2] + z__[1] * d__[2] + z__[2] * d__[1]; + } /* Computing MAX */ - d__1 = abs(a), d__2 = abs(b), d__1 = max(d__1,d__2), d__2 = abs(c__); - temp = max(d__1,d__2); - a /= temp; - b /= temp; - c__ /= temp; - if (c__ == 0.) { - *tau = b / a; - } else if (a <= 0.) { - *tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( - c__ * 2.); - } else { - *tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)) - )); - } - if (*tau < lbd || *tau > ubd) { - *tau = (lbd + ubd) / 2.; - } - if (d__[1] == *tau || d__[2] == *tau || d__[3] == *tau) { - *tau = 0.; - } else { - temp = *finit + *tau * z__[1] / (d__[1] * (d__[1] - *tau)) + *tau - * z__[2] / (d__[2] * (d__[2] - *tau)) + *tau * z__[3] / ( - d__[3] * (d__[3] - *tau)); - if (temp <= 0.) { - lbd = *tau; - } else { - ubd = *tau; - } - if (abs(*finit) <= abs(temp)) { - *tau = 0.; - } - } + d__1 = abs(a), d__2 = abs(b), d__1 = max(d__1,d__2), d__2 = abs(c__); + temp = max(d__1,d__2); + a /= temp; + b /= temp; + c__ /= temp; + if (c__ == 0.) { + *tau = b / a; + } else if (a <= 0.) { + *tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( + c__ * 2.); + } else { + *tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)) + )); + } + if (*tau < lbd || *tau > ubd) { + *tau = (lbd + ubd) / 2.; + } + if (d__[1] == *tau || d__[2] == *tau || d__[3] == *tau) { + *tau = 0.; + } else { + temp = *finit + *tau * z__[1] / (d__[1] * (d__[1] - *tau)) + *tau + * z__[2] / (d__[2] * (d__[2] - *tau)) + *tau * z__[3] / ( + d__[3] * (d__[3] - *tau)); + if (temp <= 0.) { + lbd = *tau; + } else { + ubd = *tau; + } + if (abs(*finit) <= abs(temp)) { + *tau = 0.; + } + } } /* get machine parameters for possible scaling to avoid overflow */ @@ -291,75 +291,75 @@ f"> */ if (*orgati) { /* Computing MIN */ - d__3 = (d__1 = d__[2] - *tau, abs(d__1)), d__4 = (d__2 = d__[3] - * - tau, abs(d__2)); - temp = min(d__3,d__4); + d__3 = (d__1 = d__[2] - *tau, abs(d__1)), d__4 = (d__2 = d__[3] - * + tau, abs(d__2)); + temp = min(d__3,d__4); } else { /* Computing MIN */ - d__3 = (d__1 = d__[1] - *tau, abs(d__1)), d__4 = (d__2 = d__[2] - * - tau, abs(d__2)); - temp = min(d__3,d__4); + d__3 = (d__1 = d__[1] - *tau, abs(d__1)), d__4 = (d__2 = d__[2] - * + tau, abs(d__2)); + temp = min(d__3,d__4); } scale = FALSE_; if (temp <= small1) { - scale = TRUE_; - if (temp <= small2) { + scale = TRUE_; + if (temp <= small2) { /* Scale up by power of radix nearest 1/SAFMIN**(2/3) */ - sclfac = sminv2; - sclinv = small2; - } else { + sclfac = sminv2; + sclinv = small2; + } else { /* Scale up by power of radix nearest 1/SAFMIN**(1/3) */ - sclfac = sminv1; - sclinv = small1; - } + sclfac = sminv1; + sclinv = small1; + } /* Scaling up safe because D, Z, TAU scaled elsewhere to be O(1) */ - for (i__ = 1; i__ <= 3; ++i__) { - dscale[i__ - 1] = d__[i__] * sclfac; - zscale[i__ - 1] = z__[i__] * sclfac; + for (i__ = 1; i__ <= 3; ++i__) { + dscale[i__ - 1] = d__[i__] * sclfac; + zscale[i__ - 1] = z__[i__] * sclfac; /* L10: */ - } - *tau *= sclfac; - lbd *= sclfac; - ubd *= sclfac; + } + *tau *= sclfac; + lbd *= sclfac; + ubd *= sclfac; } else { /* Copy D and Z to DSCALE and ZSCALE */ - for (i__ = 1; i__ <= 3; ++i__) { - dscale[i__ - 1] = d__[i__]; - zscale[i__ - 1] = z__[i__]; + for (i__ = 1; i__ <= 3; ++i__) { + dscale[i__ - 1] = d__[i__]; + zscale[i__ - 1] = z__[i__]; /* L20: */ - } + } } fc = 0.; df = 0.; ddf = 0.; for (i__ = 1; i__ <= 3; ++i__) { - temp = 1. / (dscale[i__ - 1] - *tau); - temp1 = zscale[i__ - 1] * temp; - temp2 = temp1 * temp; - temp3 = temp2 * temp; - fc += temp1 / dscale[i__ - 1]; - df += temp2; - ddf += temp3; + temp = 1. / (dscale[i__ - 1] - *tau); + temp1 = zscale[i__ - 1] * temp; + temp2 = temp1 * temp; + temp3 = temp2 * temp; + fc += temp1 / dscale[i__ - 1]; + df += temp2; + ddf += temp3; /* L30: */ } f = *finit + *tau * fc; if (abs(f) <= 0.) { - goto L60; + goto L60; } if (f <= 0.) { - lbd = *tau; + lbd = *tau; } else { - ubd = *tau; + ubd = *tau; } /* Iteration begins -- Use Gragg-Thornton-Warner cubic convergent */ @@ -377,71 +377,71 @@ f"> */ for (niter = iter; niter <= 40; ++niter) { - if (*orgati) { - temp1 = dscale[1] - *tau; - temp2 = dscale[2] - *tau; - } else { - temp1 = dscale[0] - *tau; - temp2 = dscale[1] - *tau; - } - a = (temp1 + temp2) * f - temp1 * temp2 * df; - b = temp1 * temp2 * f; - c__ = f - (temp1 + temp2) * df + temp1 * temp2 * ddf; + if (*orgati) { + temp1 = dscale[1] - *tau; + temp2 = dscale[2] - *tau; + } else { + temp1 = dscale[0] - *tau; + temp2 = dscale[1] - *tau; + } + a = (temp1 + temp2) * f - temp1 * temp2 * df; + b = temp1 * temp2 * f; + c__ = f - (temp1 + temp2) * df + temp1 * temp2 * ddf; /* Computing MAX */ - d__1 = abs(a), d__2 = abs(b), d__1 = max(d__1,d__2), d__2 = abs(c__); - temp = max(d__1,d__2); - a /= temp; - b /= temp; - c__ /= temp; - if (c__ == 0.) { - eta = b / a; - } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ - * 2.); - } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) - ); - } - if (f * eta >= 0.) { - eta = -f / df; - } + d__1 = abs(a), d__2 = abs(b), d__1 = max(d__1,d__2), d__2 = abs(c__); + temp = max(d__1,d__2); + a /= temp; + b /= temp; + c__ /= temp; + if (c__ == 0.) { + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ + * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) + ); + } + if (f * eta >= 0.) { + eta = -f / df; + } - *tau += eta; - if (*tau < lbd || *tau > ubd) { - *tau = (lbd + ubd) / 2.; - } + *tau += eta; + if (*tau < lbd || *tau > ubd) { + *tau = (lbd + ubd) / 2.; + } - fc = 0.; - erretm = 0.; - df = 0.; - ddf = 0.; - for (i__ = 1; i__ <= 3; ++i__) { - if (dscale[i__ - 1] - *tau != 0.) { - temp = 1. / (dscale[i__ - 1] - *tau); - temp1 = zscale[i__ - 1] * temp; - temp2 = temp1 * temp; - temp3 = temp2 * temp; - temp4 = temp1 / dscale[i__ - 1]; - fc += temp4; - erretm += abs(temp4); - df += temp2; - ddf += temp3; - } else { - goto L60; - } + fc = 0.; + erretm = 0.; + df = 0.; + ddf = 0.; + for (i__ = 1; i__ <= 3; ++i__) { + if (dscale[i__ - 1] - *tau != 0.) { + temp = 1. / (dscale[i__ - 1] - *tau); + temp1 = zscale[i__ - 1] * temp; + temp2 = temp1 * temp; + temp3 = temp2 * temp; + temp4 = temp1 / dscale[i__ - 1]; + fc += temp4; + erretm += abs(temp4); + df += temp2; + ddf += temp3; + } else { + goto L60; + } /* L40: */ - } - f = *finit + *tau * fc; - erretm = (abs(*finit) + abs(*tau) * erretm) * 8. + abs(*tau) * df; - if (abs(f) <= eps * 4. * erretm || ubd - lbd <= eps * 4. * abs(*tau)) - { - goto L60; - } - if (f <= 0.) { - lbd = *tau; - } else { - ubd = *tau; - } + } + f = *finit + *tau * fc; + erretm = (abs(*finit) + abs(*tau) * erretm) * 8. + abs(*tau) * df; + if (abs(f) <= eps * 4. * erretm || ubd - lbd <= eps * 4. * abs(*tau)) + { + goto L60; + } + if (f <= 0.) { + lbd = *tau; + } else { + ubd = *tau; + } /* L50: */ } *info = 1; @@ -450,7 +450,7 @@ L60: /* Undo scaling */ if (scale) { - *tau *= sclinv; + *tau *= sclinv; } return 0; @@ -459,5 +459,5 @@ L60: } /* dlaed6_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaed7.cpp b/lib/linalg/dlaed7.cpp index 367bf37a46..1751f93559 100644 --- a/lib/linalg/dlaed7.cpp +++ b/lib/linalg/dlaed7.cpp @@ -1,13 +1,13 @@ /* fortran/dlaed7.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -282,12 +282,12 @@ f"> */ /* > at Berkeley, USA */ /* ===================================================================== */ -/* Subroutine */ int dlaed7_(integer *icompq, integer *n, integer *qsiz, - integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, - doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer - *cutpnt, doublereal *qstore, integer *qptr, integer *prmptr, integer * - perm, integer *givptr, integer *givcol, doublereal *givnum, - doublereal *work, integer *iwork, integer *info) +/* Subroutine */ int dlaed7_(integer *icompq, integer *n, integer *qsiz, + integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, + doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer + *cutpnt, doublereal *qstore, integer *qptr, integer *prmptr, integer * + perm, integer *givptr, integer *givcol, doublereal *givnum, + doublereal *work, integer *iwork, integer *info) { /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; @@ -297,25 +297,25 @@ f"> */ /* Local variables */ integer i__, k, n1, n2, is, iw, iz, iq2, ptr, ldq2, indx, curr; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); integer indxc, indxp; - extern /* Subroutine */ int dlaed8_(integer *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, integer *, - doublereal *, integer *, integer *, integer *), dlaed9_(integer *, - integer *, integer *, integer *, doublereal *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - integer *, integer *), dlaeda_(integer *, integer *, integer *, - integer *, integer *, integer *, integer *, integer *, doublereal - *, doublereal *, integer *, doublereal *, doublereal *, integer *) - ; + extern /* Subroutine */ int dlaed8_(integer *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, integer *, + doublereal *, integer *, integer *, integer *), dlaed9_(integer *, + integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + integer *, integer *), dlaeda_(integer *, integer *, integer *, + integer *, integer *, integer *, integer *, integer *, doublereal + *, doublereal *, integer *, doublereal *, doublereal *, integer *) + ; integer idlmda; - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen); + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen); integer coltyp; @@ -362,26 +362,26 @@ f"> */ *info = 0; if (*icompq < 0 || *icompq > 1) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*icompq == 1 && *qsiz < *n) { - *info = -3; + *info = -3; } else if (*ldq < max(1,*n)) { - *info = -9; + *info = -9; } else if (min(1,*n) > *cutpnt || *n < *cutpnt) { - *info = -12; + *info = -12; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLAED7", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLAED7", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } /* The following values are for bookkeeping purposes only. They are */ @@ -389,9 +389,9 @@ f"> */ /* used by a particular array in DLAED8 and DLAED9. */ if (*icompq == 1) { - ldq2 = *qsiz; + ldq2 = *qsiz; } else { - ldq2 = *n; + ldq2 = *n; } iz = 1; @@ -411,64 +411,64 @@ f"> */ ptr = pow_ii(&c__2, tlvls) + 1; i__1 = *curlvl - 1; for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = *tlvls - i__; - ptr += pow_ii(&c__2, &i__2); + i__2 = *tlvls - i__; + ptr += pow_ii(&c__2, &i__2); /* L10: */ } curr = ptr + *curpbm; dlaeda_(n, tlvls, curlvl, curpbm, &prmptr[1], &perm[1], &givptr[1], & - givcol[3], &givnum[3], &qstore[1], &qptr[1], &work[iz], &work[iz - + *n], info); + givcol[3], &givnum[3], &qstore[1], &qptr[1], &work[iz], &work[iz + + *n], info); /* When solving the final problem, we no longer need the stored data, */ /* so we will overwrite the data from this level onto the previously */ /* used storage space. */ if (*curlvl == *tlvls) { - qptr[curr] = 1; - prmptr[curr] = 1; - givptr[curr] = 1; + qptr[curr] = 1; + prmptr[curr] = 1; + givptr[curr] = 1; } /* Sort and Deflate eigenvalues. */ - dlaed8_(icompq, &k, n, qsiz, &d__[1], &q[q_offset], ldq, &indxq[1], rho, - cutpnt, &work[iz], &work[idlmda], &work[iq2], &ldq2, &work[iw], & - perm[prmptr[curr]], &givptr[curr + 1], &givcol[(givptr[curr] << 1) - + 1], &givnum[(givptr[curr] << 1) + 1], &iwork[indxp], &iwork[ - indx], info); + dlaed8_(icompq, &k, n, qsiz, &d__[1], &q[q_offset], ldq, &indxq[1], rho, + cutpnt, &work[iz], &work[idlmda], &work[iq2], &ldq2, &work[iw], & + perm[prmptr[curr]], &givptr[curr + 1], &givcol[(givptr[curr] << 1) + + 1], &givnum[(givptr[curr] << 1) + 1], &iwork[indxp], &iwork[ + indx], info); prmptr[curr + 1] = prmptr[curr] + *n; givptr[curr + 1] += givptr[curr]; /* Solve Secular Equation. */ if (k != 0) { - dlaed9_(&k, &c__1, &k, n, &d__[1], &work[is], &k, rho, &work[idlmda], - &work[iw], &qstore[qptr[curr]], &k, info); - if (*info != 0) { - goto L30; - } - if (*icompq == 1) { - dgemm_((char *)"N", (char *)"N", qsiz, &k, &k, &c_b10, &work[iq2], &ldq2, &qstore[ - qptr[curr]], &k, &c_b11, &q[q_offset], ldq, (ftnlen)1, ( - ftnlen)1); - } + dlaed9_(&k, &c__1, &k, n, &d__[1], &work[is], &k, rho, &work[idlmda], + &work[iw], &qstore[qptr[curr]], &k, info); + if (*info != 0) { + goto L30; + } + if (*icompq == 1) { + dgemm_((char *)"N", (char *)"N", qsiz, &k, &k, &c_b10, &work[iq2], &ldq2, &qstore[ + qptr[curr]], &k, &c_b11, &q[q_offset], ldq, (ftnlen)1, ( + ftnlen)1); + } /* Computing 2nd power */ - i__1 = k; - qptr[curr + 1] = qptr[curr] + i__1 * i__1; + i__1 = k; + qptr[curr + 1] = qptr[curr] + i__1 * i__1; /* Prepare the INDXQ sorting permutation. */ - n1 = k; - n2 = *n - k; - dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); + n1 = k; + n2 = *n - k; + dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); } else { - qptr[curr + 1] = qptr[curr]; - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - indxq[i__] = i__; + qptr[curr + 1] = qptr[curr]; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + indxq[i__] = i__; /* L20: */ - } + } } L30: @@ -479,5 +479,5 @@ L30: } /* dlaed7_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaed8.cpp b/lib/linalg/dlaed8.cpp index 263bea75d5..8d1a7ae4b3 100644 --- a/lib/linalg/dlaed8.cpp +++ b/lib/linalg/dlaed8.cpp @@ -1,13 +1,13 @@ /* fortran/dlaed8.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -263,12 +263,12 @@ f"> */ /* > at Berkeley, USA */ /* ===================================================================== */ -/* Subroutine */ int dlaed8_(integer *icompq, integer *k, integer *n, integer - *qsiz, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, - doublereal *rho, integer *cutpnt, doublereal *z__, doublereal *dlamda, - doublereal *q2, integer *ldq2, doublereal *w, integer *perm, integer - *givptr, integer *givcol, doublereal *givnum, integer *indxp, integer - *indx, integer *info) +/* Subroutine */ int dlaed8_(integer *icompq, integer *k, integer *n, integer + *qsiz, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, + doublereal *rho, integer *cutpnt, doublereal *z__, doublereal *dlamda, + doublereal *q2, integer *ldq2, doublereal *w, integer *perm, integer + *givptr, integer *givcol, doublereal *givnum, integer *indxp, integer + *indx, integer *info) { /* System generated locals */ integer q_dim1, q_offset, q2_dim1, q2_offset, i__1; @@ -284,17 +284,17 @@ f"> */ integer k2, n1, n2, jp, n1p1; doublereal eps, tau, tol; integer jlam, imax, jmax; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *), dscal_( - integer *, doublereal *, doublereal *, integer *), dcopy_(integer - *, doublereal *, integer *, doublereal *, integer *); - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *), dscal_( + integer *, doublereal *, doublereal *, integer *), dcopy_(integer + *, doublereal *, integer *, doublereal *, integer *); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); extern integer idamax_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), dlacpy_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - ftnlen), xerbla_(char *, integer *, ftnlen); + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), dlacpy_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), xerbla_(char *, integer *, ftnlen); /* -- LAPACK computational routine -- */ @@ -345,22 +345,22 @@ f"> */ *info = 0; if (*icompq < 0 || *icompq > 1) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -3; + *info = -3; } else if (*icompq == 1 && *qsiz < *n) { - *info = -4; + *info = -4; } else if (*ldq < max(1,*n)) { - *info = -7; + *info = -7; } else if (*cutpnt < min(1,*n) || *cutpnt > *n) { - *info = -10; + *info = -10; } else if (*ldq2 < max(1,*n)) { - *info = -14; + *info = -14; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLAED8", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLAED8", &i__1, (ftnlen)6); + return 0; } /* Need to initialize GIVPTR to O here in case of quick exit */ @@ -373,7 +373,7 @@ f"> */ /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } n1 = *cutpnt; @@ -381,7 +381,7 @@ f"> */ n1p1 = n1 + 1; if (*rho < 0.) { - dscal_(&n2, &c_b3, &z__[n1p1], &c__1); + dscal_(&n2, &c_b3, &z__[n1p1], &c__1); } /* Normalize z so that norm(z) = 1 */ @@ -389,7 +389,7 @@ f"> */ t = 1. / sqrt(2.); i__1 = *n; for (j = 1; j <= i__1; ++j) { - indx[j] = j; + indx[j] = j; /* L10: */ } dscal_(n, &t, &z__[1], &c__1); @@ -399,13 +399,13 @@ f"> */ i__1 = *n; for (i__ = *cutpnt + 1; i__ <= i__1; ++i__) { - indxq[i__] += *cutpnt; + indxq[i__] += *cutpnt; /* L20: */ } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - dlamda[i__] = d__[indxq[i__]]; - w[i__] = z__[indxq[i__]]; + dlamda[i__] = d__[indxq[i__]]; + w[i__] = z__[indxq[i__]]; /* L30: */ } i__ = 1; @@ -413,8 +413,8 @@ f"> */ dlamrg_(&n1, &n2, &dlamda[1], &c__1, &c__1, &indx[1]); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - d__[i__] = dlamda[indx[i__]]; - z__[i__] = w[indx[i__]]; + d__[i__] = dlamda[indx[i__]]; + z__[i__] = w[indx[i__]]; /* L40: */ } @@ -430,25 +430,25 @@ f"> */ /* elements in D. */ if (*rho * (d__1 = z__[imax], abs(d__1)) <= tol) { - *k = 0; - if (*icompq == 0) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - perm[j] = indxq[indx[j]]; + *k = 0; + if (*icompq == 0) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + perm[j] = indxq[indx[j]]; /* L50: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - perm[j] = indxq[indx[j]]; - dcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 - + 1], &c__1); + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + perm[j] = indxq[indx[j]]; + dcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + + 1], &c__1); /* L60: */ - } - dlacpy_((char *)"A", qsiz, n, &q2[q2_dim1 + 1], ldq2, &q[q_dim1 + 1], ldq, - (ftnlen)1); - } - return 0; + } + dlacpy_((char *)"A", qsiz, n, &q2[q2_dim1 + 1], ldq2, &q[q_dim1 + 1], ldq, + (ftnlen)1); + } + return 0; } /* If there are multiple eigenvalues then the problem deflates. Here */ @@ -461,90 +461,90 @@ f"> */ k2 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { - if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { + if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { /* Deflate due to small z component. */ - --k2; - indxp[k2] = j; - if (j == *n) { - goto L110; - } - } else { - jlam = j; - goto L80; - } + --k2; + indxp[k2] = j; + if (j == *n) { + goto L110; + } + } else { + jlam = j; + goto L80; + } /* L70: */ } L80: ++j; if (j > *n) { - goto L100; + goto L100; } if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { /* Deflate due to small z component. */ - --k2; - indxp[k2] = j; + --k2; + indxp[k2] = j; } else { /* Check if eigenvalues are close enough to allow deflation. */ - s = z__[jlam]; - c__ = z__[j]; + s = z__[jlam]; + c__ = z__[j]; /* Find sqrt(a**2+b**2) without overflow or */ /* destructive underflow. */ - tau = dlapy2_(&c__, &s); - t = d__[j] - d__[jlam]; - c__ /= tau; - s = -s / tau; - if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { + tau = dlapy2_(&c__, &s); + t = d__[j] - d__[jlam]; + c__ /= tau; + s = -s / tau; + if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { /* Deflation is possible. */ - z__[j] = tau; - z__[jlam] = 0.; + z__[j] = tau; + z__[jlam] = 0.; /* Record the appropriate Givens rotation */ - ++(*givptr); - givcol[(*givptr << 1) + 1] = indxq[indx[jlam]]; - givcol[(*givptr << 1) + 2] = indxq[indx[j]]; - givnum[(*givptr << 1) + 1] = c__; - givnum[(*givptr << 1) + 2] = s; - if (*icompq == 1) { - drot_(qsiz, &q[indxq[indx[jlam]] * q_dim1 + 1], &c__1, &q[ - indxq[indx[j]] * q_dim1 + 1], &c__1, &c__, &s); - } - t = d__[jlam] * c__ * c__ + d__[j] * s * s; - d__[j] = d__[jlam] * s * s + d__[j] * c__ * c__; - d__[jlam] = t; - --k2; - i__ = 1; + ++(*givptr); + givcol[(*givptr << 1) + 1] = indxq[indx[jlam]]; + givcol[(*givptr << 1) + 2] = indxq[indx[j]]; + givnum[(*givptr << 1) + 1] = c__; + givnum[(*givptr << 1) + 2] = s; + if (*icompq == 1) { + drot_(qsiz, &q[indxq[indx[jlam]] * q_dim1 + 1], &c__1, &q[ + indxq[indx[j]] * q_dim1 + 1], &c__1, &c__, &s); + } + t = d__[jlam] * c__ * c__ + d__[j] * s * s; + d__[j] = d__[jlam] * s * s + d__[j] * c__ * c__; + d__[jlam] = t; + --k2; + i__ = 1; L90: - if (k2 + i__ <= *n) { - if (d__[jlam] < d__[indxp[k2 + i__]]) { - indxp[k2 + i__ - 1] = indxp[k2 + i__]; - indxp[k2 + i__] = jlam; - ++i__; - goto L90; - } else { - indxp[k2 + i__ - 1] = jlam; - } - } else { - indxp[k2 + i__ - 1] = jlam; - } - jlam = j; - } else { - ++(*k); - w[*k] = z__[jlam]; - dlamda[*k] = d__[jlam]; - indxp[*k] = jlam; - jlam = j; - } + if (k2 + i__ <= *n) { + if (d__[jlam] < d__[indxp[k2 + i__]]) { + indxp[k2 + i__ - 1] = indxp[k2 + i__]; + indxp[k2 + i__] = jlam; + ++i__; + goto L90; + } else { + indxp[k2 + i__ - 1] = jlam; + } + } else { + indxp[k2 + i__ - 1] = jlam; + } + jlam = j; + } else { + ++(*k); + w[*k] = z__[jlam]; + dlamda[*k] = d__[jlam]; + indxp[*k] = jlam; + jlam = j; + } } goto L80; L100: @@ -564,39 +564,39 @@ L110: /* while those which were deflated go into the last N - K slots. */ if (*icompq == 0) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - jp = indxp[j]; - dlamda[j] = d__[jp]; - perm[j] = indxq[indx[jp]]; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + jp = indxp[j]; + dlamda[j] = d__[jp]; + perm[j] = indxq[indx[jp]]; /* L120: */ - } + } } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - jp = indxp[j]; - dlamda[j] = d__[jp]; - perm[j] = indxq[indx[jp]]; - dcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1] - , &c__1); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + jp = indxp[j]; + dlamda[j] = d__[jp]; + perm[j] = indxq[indx[jp]]; + dcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1] + , &c__1); /* L130: */ - } + } } /* The deflated eigenvalues and their corresponding vectors go back */ /* into the last N - K slots of D and Q respectively. */ if (*k < *n) { - if (*icompq == 0) { - i__1 = *n - *k; - dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); - } else { - i__1 = *n - *k; - dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); - i__1 = *n - *k; - dlacpy_((char *)"A", qsiz, &i__1, &q2[(*k + 1) * q2_dim1 + 1], ldq2, &q[(* - k + 1) * q_dim1 + 1], ldq, (ftnlen)1); - } + if (*icompq == 0) { + i__1 = *n - *k; + dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); + } else { + i__1 = *n - *k; + dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); + i__1 = *n - *k; + dlacpy_((char *)"A", qsiz, &i__1, &q2[(*k + 1) * q2_dim1 + 1], ldq2, &q[(* + k + 1) * q_dim1 + 1], ldq, (ftnlen)1); + } } return 0; @@ -606,5 +606,5 @@ L110: } /* dlaed8_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaed9.cpp b/lib/linalg/dlaed9.cpp index f74b8f5bc0..d6a4f8bca3 100644 --- a/lib/linalg/dlaed9.cpp +++ b/lib/linalg/dlaed9.cpp @@ -1,13 +1,13 @@ /* fortran/dlaed9.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -176,10 +176,10 @@ f"> */ /* > at Berkeley, USA */ /* ===================================================================== */ -/* Subroutine */ int dlaed9_(integer *k, integer *kstart, integer *kstop, - integer *n, doublereal *d__, doublereal *q, integer *ldq, doublereal * - rho, doublereal *dlamda, doublereal *w, doublereal *s, integer *lds, - integer *info) +/* Subroutine */ int dlaed9_(integer *k, integer *kstart, integer *kstop, + integer *n, doublereal *d__, doublereal *q, integer *ldq, doublereal * + rho, doublereal *dlamda, doublereal *w, doublereal *s, integer *lds, + integer *info) { /* System generated locals */ integer q_dim1, q_offset, s_dim1, s_offset, i__1, i__2; @@ -192,10 +192,10 @@ f"> */ integer i__, j; doublereal temp; extern doublereal dnrm2_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *), dlaed4_(integer *, integer *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *), dlaed4_(integer *, integer *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *); extern doublereal dlamc3_(doublereal *, doublereal *); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); @@ -238,28 +238,28 @@ f"> */ *info = 0; if (*k < 0) { - *info = -1; + *info = -1; } else if (*kstart < 1 || *kstart > max(1,*k)) { - *info = -2; + *info = -2; } else if (max(1,*kstop) < *kstart || *kstop > max(1,*k)) { - *info = -3; + *info = -3; } else if (*n < *k) { - *info = -4; + *info = -4; } else if (*ldq < max(1,*k)) { - *info = -7; + *info = -7; } else if (*lds < max(1,*k)) { - *info = -12; + *info = -12; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLAED9", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLAED9", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*k == 0) { - return 0; + return 0; } /* Modify values DLAMDA(i) to make sure all DLAMDA(i)-DLAMDA(j) can */ @@ -281,34 +281,34 @@ f"> */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - dlamda[i__] = dlamc3_(&dlamda[i__], &dlamda[i__]) - dlamda[i__]; + dlamda[i__] = dlamc3_(&dlamda[i__], &dlamda[i__]) - dlamda[i__]; /* L10: */ } i__1 = *kstop; for (j = *kstart; j <= i__1; ++j) { - dlaed4_(k, &j, &dlamda[1], &w[1], &q[j * q_dim1 + 1], rho, &d__[j], - info); + dlaed4_(k, &j, &dlamda[1], &w[1], &q[j * q_dim1 + 1], rho, &d__[j], + info); /* If the zero finder fails, the computation is terminated. */ - if (*info != 0) { - goto L120; - } + if (*info != 0) { + goto L120; + } /* L20: */ } if (*k == 1 || *k == 2) { - i__1 = *k; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = *k; - for (j = 1; j <= i__2; ++j) { - s[j + i__ * s_dim1] = q[j + i__ * q_dim1]; + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = *k; + for (j = 1; j <= i__2; ++j) { + s[j + i__ * s_dim1] = q[j + i__ * q_dim1]; /* L30: */ - } + } /* L40: */ - } - goto L120; + } + goto L120; } /* Compute updated W. */ @@ -321,22 +321,22 @@ f"> */ dcopy_(k, &q[q_offset], &i__1, &w[1], &c__1); i__1 = *k; for (j = 1; j <= i__1; ++j) { - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); /* L50: */ - } - i__2 = *k; - for (i__ = j + 1; i__ <= i__2; ++i__) { - w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); + } + i__2 = *k; + for (i__ = j + 1; i__ <= i__2; ++i__) { + w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); /* L60: */ - } + } /* L70: */ } i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { - d__1 = sqrt(-w[i__]); - w[i__] = d_sign(&d__1, &s[i__ + s_dim1]); + d__1 = sqrt(-w[i__]); + w[i__] = d_sign(&d__1, &s[i__ + s_dim1]); /* L80: */ } @@ -344,17 +344,17 @@ f"> */ i__1 = *k; for (j = 1; j <= i__1; ++j) { - i__2 = *k; - for (i__ = 1; i__ <= i__2; ++i__) { - q[i__ + j * q_dim1] = w[i__] / q[i__ + j * q_dim1]; + i__2 = *k; + for (i__ = 1; i__ <= i__2; ++i__) { + q[i__ + j * q_dim1] = w[i__] / q[i__ + j * q_dim1]; /* L90: */ - } - temp = dnrm2_(k, &q[j * q_dim1 + 1], &c__1); - i__2 = *k; - for (i__ = 1; i__ <= i__2; ++i__) { - s[i__ + j * s_dim1] = q[i__ + j * q_dim1] / temp; + } + temp = dnrm2_(k, &q[j * q_dim1 + 1], &c__1); + i__2 = *k; + for (i__ = 1; i__ <= i__2; ++i__) { + s[i__ + j * s_dim1] = q[i__ + j * q_dim1] / temp; /* L100: */ - } + } /* L110: */ } @@ -366,5 +366,5 @@ L120: } /* dlaed9_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaeda.cpp b/lib/linalg/dlaeda.cpp index f487609f82..39b4c8810f 100644 --- a/lib/linalg/dlaeda.cpp +++ b/lib/linalg/dlaeda.cpp @@ -1,13 +1,13 @@ /* fortran/dlaeda.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -189,10 +189,10 @@ f"> */ /* > at Berkeley, USA */ /* ===================================================================== */ -/* Subroutine */ int dlaeda_(integer *n, integer *tlvls, integer *curlvl, - integer *curpbm, integer *prmptr, integer *perm, integer *givptr, - integer *givcol, doublereal *givnum, doublereal *q, integer *qptr, - doublereal *z__, doublereal *ztemp, integer *info) +/* Subroutine */ int dlaeda_(integer *n, integer *tlvls, integer *curlvl, + integer *curpbm, integer *prmptr, integer *perm, integer *givptr, + integer *givcol, doublereal *givnum, doublereal *q, integer *qptr, + doublereal *z__, doublereal *ztemp, integer *info) { /* System generated locals */ integer i__1, i__2, i__3; @@ -203,14 +203,14 @@ f"> */ /* Local variables */ integer i__, k, mid, ptr; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *); + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *); integer curr, bsiz1, bsiz2, psiz1, psiz2, zptr1; - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen), dcopy_(integer *, - doublereal *, integer *, doublereal *, integer *), xerbla_(char *, - integer *, ftnlen); + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen), dcopy_(integer *, + doublereal *, integer *, doublereal *, integer *), xerbla_(char *, + integer *, ftnlen); /* -- LAPACK computational routine -- */ @@ -251,18 +251,18 @@ f"> */ *info = 0; if (*n < 0) { - *info = -1; + *info = -1; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLAEDA", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLAEDA", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } /* Determine location of first number in second half. */ @@ -284,19 +284,19 @@ f"> */ /* roots. */ bsiz1 = (integer) (sqrt((doublereal) (qptr[curr + 1] - qptr[curr])) + .5); - bsiz2 = (integer) (sqrt((doublereal) (qptr[curr + 2] - qptr[curr + 1])) + - .5); + bsiz2 = (integer) (sqrt((doublereal) (qptr[curr + 2] - qptr[curr + 1])) + + .5); i__1 = mid - bsiz1 - 1; for (k = 1; k <= i__1; ++k) { - z__[k] = 0.; + z__[k] = 0.; /* L10: */ } dcopy_(&bsiz1, &q[qptr[curr] + bsiz1 - 1], &bsiz1, &z__[mid - bsiz1], & - c__1); + c__1); dcopy_(&bsiz2, &q[qptr[curr + 1]], &bsiz2, &z__[mid], &c__1); i__1 = *n; for (k = mid + bsiz2; k <= i__1; ++k) { - z__[k] = 0.; + z__[k] = 0.; /* L20: */ } @@ -307,43 +307,43 @@ f"> */ ptr = pow_ii(&c__2, tlvls) + 1; i__1 = *curlvl - 1; for (k = 1; k <= i__1; ++k) { - i__2 = *curlvl - k; - i__3 = *curlvl - k - 1; - curr = ptr + *curpbm * pow_ii(&c__2, &i__2) + pow_ii(&c__2, &i__3) - - 1; - psiz1 = prmptr[curr + 1] - prmptr[curr]; - psiz2 = prmptr[curr + 2] - prmptr[curr + 1]; - zptr1 = mid - psiz1; + i__2 = *curlvl - k; + i__3 = *curlvl - k - 1; + curr = ptr + *curpbm * pow_ii(&c__2, &i__2) + pow_ii(&c__2, &i__3) - + 1; + psiz1 = prmptr[curr + 1] - prmptr[curr]; + psiz2 = prmptr[curr + 2] - prmptr[curr + 1]; + zptr1 = mid - psiz1; /* Apply Givens at CURR and CURR+1 */ - i__2 = givptr[curr + 1] - 1; - for (i__ = givptr[curr]; i__ <= i__2; ++i__) { - drot_(&c__1, &z__[zptr1 + givcol[(i__ << 1) + 1] - 1], &c__1, & - z__[zptr1 + givcol[(i__ << 1) + 2] - 1], &c__1, &givnum[( - i__ << 1) + 1], &givnum[(i__ << 1) + 2]); + i__2 = givptr[curr + 1] - 1; + for (i__ = givptr[curr]; i__ <= i__2; ++i__) { + drot_(&c__1, &z__[zptr1 + givcol[(i__ << 1) + 1] - 1], &c__1, & + z__[zptr1 + givcol[(i__ << 1) + 2] - 1], &c__1, &givnum[( + i__ << 1) + 1], &givnum[(i__ << 1) + 2]); /* L30: */ - } - i__2 = givptr[curr + 2] - 1; - for (i__ = givptr[curr + 1]; i__ <= i__2; ++i__) { - drot_(&c__1, &z__[mid - 1 + givcol[(i__ << 1) + 1]], &c__1, &z__[ - mid - 1 + givcol[(i__ << 1) + 2]], &c__1, &givnum[(i__ << - 1) + 1], &givnum[(i__ << 1) + 2]); + } + i__2 = givptr[curr + 2] - 1; + for (i__ = givptr[curr + 1]; i__ <= i__2; ++i__) { + drot_(&c__1, &z__[mid - 1 + givcol[(i__ << 1) + 1]], &c__1, &z__[ + mid - 1 + givcol[(i__ << 1) + 2]], &c__1, &givnum[(i__ << + 1) + 1], &givnum[(i__ << 1) + 2]); /* L40: */ - } - psiz1 = prmptr[curr + 1] - prmptr[curr]; - psiz2 = prmptr[curr + 2] - prmptr[curr + 1]; - i__2 = psiz1 - 1; - for (i__ = 0; i__ <= i__2; ++i__) { - ztemp[i__ + 1] = z__[zptr1 + perm[prmptr[curr] + i__] - 1]; + } + psiz1 = prmptr[curr + 1] - prmptr[curr]; + psiz2 = prmptr[curr + 2] - prmptr[curr + 1]; + i__2 = psiz1 - 1; + for (i__ = 0; i__ <= i__2; ++i__) { + ztemp[i__ + 1] = z__[zptr1 + perm[prmptr[curr] + i__] - 1]; /* L50: */ - } - i__2 = psiz2 - 1; - for (i__ = 0; i__ <= i__2; ++i__) { - ztemp[psiz1 + i__ + 1] = z__[mid + perm[prmptr[curr + 1] + i__] - - 1]; + } + i__2 = psiz2 - 1; + for (i__ = 0; i__ <= i__2; ++i__) { + ztemp[psiz1 + i__ + 1] = z__[mid + perm[prmptr[curr + 1] + i__] - + 1]; /* L60: */ - } + } /* Multiply Blocks at CURR and CURR+1 */ @@ -351,27 +351,27 @@ f"> */ /* the SQRT in case the machine underestimates one of these */ /* square roots. */ - bsiz1 = (integer) (sqrt((doublereal) (qptr[curr + 1] - qptr[curr])) + - .5); - bsiz2 = (integer) (sqrt((doublereal) (qptr[curr + 2] - qptr[curr + 1]) - ) + .5); - if (bsiz1 > 0) { - dgemv_((char *)"T", &bsiz1, &bsiz1, &c_b24, &q[qptr[curr]], &bsiz1, & - ztemp[1], &c__1, &c_b26, &z__[zptr1], &c__1, (ftnlen)1); - } - i__2 = psiz1 - bsiz1; - dcopy_(&i__2, &ztemp[bsiz1 + 1], &c__1, &z__[zptr1 + bsiz1], &c__1); - if (bsiz2 > 0) { - dgemv_((char *)"T", &bsiz2, &bsiz2, &c_b24, &q[qptr[curr + 1]], &bsiz2, & - ztemp[psiz1 + 1], &c__1, &c_b26, &z__[mid], &c__1, ( - ftnlen)1); - } - i__2 = psiz2 - bsiz2; - dcopy_(&i__2, &ztemp[psiz1 + bsiz2 + 1], &c__1, &z__[mid + bsiz2], & - c__1); + bsiz1 = (integer) (sqrt((doublereal) (qptr[curr + 1] - qptr[curr])) + + .5); + bsiz2 = (integer) (sqrt((doublereal) (qptr[curr + 2] - qptr[curr + 1]) + ) + .5); + if (bsiz1 > 0) { + dgemv_((char *)"T", &bsiz1, &bsiz1, &c_b24, &q[qptr[curr]], &bsiz1, & + ztemp[1], &c__1, &c_b26, &z__[zptr1], &c__1, (ftnlen)1); + } + i__2 = psiz1 - bsiz1; + dcopy_(&i__2, &ztemp[bsiz1 + 1], &c__1, &z__[zptr1 + bsiz1], &c__1); + if (bsiz2 > 0) { + dgemv_((char *)"T", &bsiz2, &bsiz2, &c_b24, &q[qptr[curr + 1]], &bsiz2, & + ztemp[psiz1 + 1], &c__1, &c_b26, &z__[mid], &c__1, ( + ftnlen)1); + } + i__2 = psiz2 - bsiz2; + dcopy_(&i__2, &ztemp[psiz1 + bsiz2 + 1], &c__1, &z__[mid + bsiz2], & + c__1); - i__2 = *tlvls - k; - ptr += pow_ii(&c__2, &i__2); + i__2 = *tlvls - k; + ptr += pow_ii(&c__2, &i__2); /* L70: */ } @@ -382,5 +382,5 @@ f"> */ } /* dlaeda_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaev2.cpp b/lib/linalg/dlaev2.cpp index 32f4eb5424..21bdbebe69 100644 --- a/lib/linalg/dlaev2.cpp +++ b/lib/linalg/dlaev2.cpp @@ -1,13 +1,13 @@ /* fortran/dlaev2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -136,8 +136,8 @@ f"> */ /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlaev2_(doublereal *a, doublereal *b, doublereal *c__, - doublereal *rt1, doublereal *rt2, doublereal *cs1, doublereal *sn1) +/* Subroutine */ int dlaev2_(doublereal *a, doublereal *b, doublereal *c__, + doublereal *rt1, doublereal *rt2, doublereal *cs1, doublereal *sn1) { /* System generated locals */ doublereal d__1; @@ -176,81 +176,81 @@ f"> */ tb = *b + *b; ab = abs(tb); if (abs(*a) > abs(*c__)) { - acmx = *a; - acmn = *c__; + acmx = *a; + acmn = *c__; } else { - acmx = *c__; - acmn = *a; + acmx = *c__; + acmn = *a; } if (adf > ab) { /* Computing 2nd power */ - d__1 = ab / adf; - rt = adf * sqrt(d__1 * d__1 + 1.); + d__1 = ab / adf; + rt = adf * sqrt(d__1 * d__1 + 1.); } else if (adf < ab) { /* Computing 2nd power */ - d__1 = adf / ab; - rt = ab * sqrt(d__1 * d__1 + 1.); + d__1 = adf / ab; + rt = ab * sqrt(d__1 * d__1 + 1.); } else { /* Includes case AB=ADF=0 */ - rt = ab * sqrt(2.); + rt = ab * sqrt(2.); } if (sm < 0.) { - *rt1 = (sm - rt) * .5; - sgn1 = -1; + *rt1 = (sm - rt) * .5; + sgn1 = -1; /* Order of execution important. */ /* To get fully accurate smaller eigenvalue, */ /* next line needs to be executed in higher precision. */ - *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; + *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else if (sm > 0.) { - *rt1 = (sm + rt) * .5; - sgn1 = 1; + *rt1 = (sm + rt) * .5; + sgn1 = 1; /* Order of execution important. */ /* To get fully accurate smaller eigenvalue, */ /* next line needs to be executed in higher precision. */ - *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; + *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else { /* Includes case RT1 = RT2 = 0 */ - *rt1 = rt * .5; - *rt2 = rt * -.5; - sgn1 = 1; + *rt1 = rt * .5; + *rt2 = rt * -.5; + sgn1 = 1; } /* Compute the eigenvector */ if (df >= 0.) { - cs = df + rt; - sgn2 = 1; + cs = df + rt; + sgn2 = 1; } else { - cs = df - rt; - sgn2 = -1; + cs = df - rt; + sgn2 = -1; } acs = abs(cs); if (acs > ab) { - ct = -tb / cs; - *sn1 = 1. / sqrt(ct * ct + 1.); - *cs1 = ct * *sn1; + ct = -tb / cs; + *sn1 = 1. / sqrt(ct * ct + 1.); + *cs1 = ct * *sn1; } else { - if (ab == 0.) { - *cs1 = 1.; - *sn1 = 0.; - } else { - tn = -cs / tb; - *cs1 = 1. / sqrt(tn * tn + 1.); - *sn1 = tn * *cs1; - } + if (ab == 0.) { + *cs1 = 1.; + *sn1 = 0.; + } else { + tn = -cs / tb; + *cs1 = 1. / sqrt(tn * tn + 1.); + *sn1 = tn * *cs1; + } } if (sgn1 == sgn2) { - tn = *cs1; - *cs1 = -(*sn1); - *sn1 = tn; + tn = *cs1; + *cs1 = -(*sn1); + *sn1 = tn; } return 0; @@ -259,5 +259,5 @@ f"> */ } /* dlaev2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlals0.cpp b/lib/linalg/dlals0.cpp index ce36d7d553..9dfb826915 100644 --- a/lib/linalg/dlals0.cpp +++ b/lib/linalg/dlals0.cpp @@ -1,13 +1,13 @@ /* fortran/dlals0.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -291,17 +291,17 @@ f"> */ /* > Osni Marques, LBNL/NERSC, USA \n */ /* ===================================================================== */ -/* Subroutine */ int dlals0_(integer *icompq, integer *nl, integer *nr, - integer *sqre, integer *nrhs, doublereal *b, integer *ldb, doublereal - *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, - integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal * - poles, doublereal *difl, doublereal *difr, doublereal *z__, integer * - k, doublereal *c__, doublereal *s, doublereal *work, integer *info) +/* Subroutine */ int dlals0_(integer *icompq, integer *nl, integer *nr, + integer *sqre, integer *nrhs, doublereal *b, integer *ldb, doublereal + *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, + integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal * + poles, doublereal *difl, doublereal *difr, doublereal *z__, integer * + k, doublereal *c__, doublereal *s, doublereal *work, integer *info) { /* System generated locals */ - integer givcol_dim1, givcol_offset, b_dim1, b_offset, bx_dim1, bx_offset, - difr_dim1, difr_offset, givnum_dim1, givnum_offset, poles_dim1, - poles_offset, i__1, i__2; + integer givcol_dim1, givcol_offset, b_dim1, b_offset, bx_dim1, bx_offset, + difr_dim1, difr_offset, givnum_dim1, givnum_offset, poles_dim1, + poles_offset, i__1, i__2; doublereal d__1; /* Local variables */ @@ -309,22 +309,22 @@ f"> */ doublereal dj; integer nlp1; doublereal temp; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *); + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *); extern doublereal dnrm2_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); doublereal diflj, difrj, dsigj; - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen), dcopy_(integer *, - doublereal *, integer *, doublereal *, integer *); + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen), dcopy_(integer *, + doublereal *, integer *, doublereal *, integer *); extern doublereal dlamc3_(doublereal *, doublereal *); - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dlacpy_(char *, integer *, integer - *, doublereal *, integer *, doublereal *, integer *, ftnlen), - xerbla_(char *, integer *, ftnlen); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dlacpy_(char *, integer *, integer + *, doublereal *, integer *, doublereal *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); doublereal dsigjp; @@ -382,32 +382,32 @@ f"> */ n = *nl + *nr + 1; if (*icompq < 0 || *icompq > 1) { - *info = -1; + *info = -1; } else if (*nl < 1) { - *info = -2; + *info = -2; } else if (*nr < 1) { - *info = -3; + *info = -3; } else if (*sqre < 0 || *sqre > 1) { - *info = -4; + *info = -4; } else if (*nrhs < 1) { - *info = -5; + *info = -5; } else if (*ldb < n) { - *info = -7; + *info = -7; } else if (*ldbx < n) { - *info = -9; + *info = -9; } else if (*givptr < 0) { - *info = -11; + *info = -11; } else if (*ldgcol < n) { - *info = -13; + *info = -13; } else if (*ldgnum < n) { - *info = -15; + *info = -15; } else if (*k < 1) { - *info = -20; + *info = -20; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLALS0", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLALS0", &i__1, (ftnlen)6); + return 0; } m = n + *sqre; @@ -419,91 +419,91 @@ f"> */ /* Step (1L): apply back the Givens rotations performed. */ - i__1 = *givptr; - for (i__ = 1; i__ <= i__1; ++i__) { - drot_(nrhs, &b[givcol[i__ + (givcol_dim1 << 1)] + b_dim1], ldb, & - b[givcol[i__ + givcol_dim1] + b_dim1], ldb, &givnum[i__ + - (givnum_dim1 << 1)], &givnum[i__ + givnum_dim1]); + i__1 = *givptr; + for (i__ = 1; i__ <= i__1; ++i__) { + drot_(nrhs, &b[givcol[i__ + (givcol_dim1 << 1)] + b_dim1], ldb, & + b[givcol[i__ + givcol_dim1] + b_dim1], ldb, &givnum[i__ + + (givnum_dim1 << 1)], &givnum[i__ + givnum_dim1]); /* L10: */ - } + } /* Step (2L): permute rows of B. */ - dcopy_(nrhs, &b[nlp1 + b_dim1], ldb, &bx[bx_dim1 + 1], ldbx); - i__1 = n; - for (i__ = 2; i__ <= i__1; ++i__) { - dcopy_(nrhs, &b[perm[i__] + b_dim1], ldb, &bx[i__ + bx_dim1], - ldbx); + dcopy_(nrhs, &b[nlp1 + b_dim1], ldb, &bx[bx_dim1 + 1], ldbx); + i__1 = n; + for (i__ = 2; i__ <= i__1; ++i__) { + dcopy_(nrhs, &b[perm[i__] + b_dim1], ldb, &bx[i__ + bx_dim1], + ldbx); /* L20: */ - } + } /* Step (3L): apply the inverse of the left singular vector */ /* matrix to BX. */ - if (*k == 1) { - dcopy_(nrhs, &bx[bx_offset], ldbx, &b[b_offset], ldb); - if (z__[1] < 0.) { - dscal_(nrhs, &c_b5, &b[b_offset], ldb); - } - } else { - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - diflj = difl[j]; - dj = poles[j + poles_dim1]; - dsigj = -poles[j + (poles_dim1 << 1)]; - if (j < *k) { - difrj = -difr[j + difr_dim1]; - dsigjp = -poles[j + 1 + (poles_dim1 << 1)]; - } - if (z__[j] == 0. || poles[j + (poles_dim1 << 1)] == 0.) { - work[j] = 0.; - } else { - work[j] = -poles[j + (poles_dim1 << 1)] * z__[j] / diflj / - (poles[j + (poles_dim1 << 1)] + dj); - } - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - if (z__[i__] == 0. || poles[i__ + (poles_dim1 << 1)] == - 0.) { - work[i__] = 0.; - } else { - work[i__] = poles[i__ + (poles_dim1 << 1)] * z__[i__] - / (dlamc3_(&poles[i__ + (poles_dim1 << 1)], & - dsigj) - diflj) / (poles[i__ + (poles_dim1 << - 1)] + dj); - } + if (*k == 1) { + dcopy_(nrhs, &bx[bx_offset], ldbx, &b[b_offset], ldb); + if (z__[1] < 0.) { + dscal_(nrhs, &c_b5, &b[b_offset], ldb); + } + } else { + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + diflj = difl[j]; + dj = poles[j + poles_dim1]; + dsigj = -poles[j + (poles_dim1 << 1)]; + if (j < *k) { + difrj = -difr[j + difr_dim1]; + dsigjp = -poles[j + 1 + (poles_dim1 << 1)]; + } + if (z__[j] == 0. || poles[j + (poles_dim1 << 1)] == 0.) { + work[j] = 0.; + } else { + work[j] = -poles[j + (poles_dim1 << 1)] * z__[j] / diflj / + (poles[j + (poles_dim1 << 1)] + dj); + } + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + if (z__[i__] == 0. || poles[i__ + (poles_dim1 << 1)] == + 0.) { + work[i__] = 0.; + } else { + work[i__] = poles[i__ + (poles_dim1 << 1)] * z__[i__] + / (dlamc3_(&poles[i__ + (poles_dim1 << 1)], & + dsigj) - diflj) / (poles[i__ + (poles_dim1 << + 1)] + dj); + } /* L30: */ - } - i__2 = *k; - for (i__ = j + 1; i__ <= i__2; ++i__) { - if (z__[i__] == 0. || poles[i__ + (poles_dim1 << 1)] == - 0.) { - work[i__] = 0.; - } else { - work[i__] = poles[i__ + (poles_dim1 << 1)] * z__[i__] - / (dlamc3_(&poles[i__ + (poles_dim1 << 1)], & - dsigjp) + difrj) / (poles[i__ + (poles_dim1 << - 1)] + dj); - } + } + i__2 = *k; + for (i__ = j + 1; i__ <= i__2; ++i__) { + if (z__[i__] == 0. || poles[i__ + (poles_dim1 << 1)] == + 0.) { + work[i__] = 0.; + } else { + work[i__] = poles[i__ + (poles_dim1 << 1)] * z__[i__] + / (dlamc3_(&poles[i__ + (poles_dim1 << 1)], & + dsigjp) + difrj) / (poles[i__ + (poles_dim1 << + 1)] + dj); + } /* L40: */ - } - work[1] = -1.; - temp = dnrm2_(k, &work[1], &c__1); - dgemv_((char *)"T", k, nrhs, &c_b11, &bx[bx_offset], ldbx, &work[1], & - c__1, &c_b13, &b[j + b_dim1], ldb, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &temp, &c_b11, &c__1, nrhs, &b[j + - b_dim1], ldb, info, (ftnlen)1); + } + work[1] = -1.; + temp = dnrm2_(k, &work[1], &c__1); + dgemv_((char *)"T", k, nrhs, &c_b11, &bx[bx_offset], ldbx, &work[1], & + c__1, &c_b13, &b[j + b_dim1], ldb, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &temp, &c_b11, &c__1, nrhs, &b[j + + b_dim1], ldb, info, (ftnlen)1); /* L50: */ - } - } + } + } /* Move the deflated rows of BX to B also. */ - if (*k < max(m,n)) { - i__1 = n - *k; - dlacpy_((char *)"A", &i__1, nrhs, &bx[*k + 1 + bx_dim1], ldbx, &b[*k + 1 - + b_dim1], ldb, (ftnlen)1); - } + if (*k < max(m,n)) { + i__1 = n - *k; + dlacpy_((char *)"A", &i__1, nrhs, &bx[*k + 1 + bx_dim1], ldbx, &b[*k + 1 + + b_dim1], ldb, (ftnlen)1); + } } else { /* Apply back the right orthogonal transformations. */ @@ -511,84 +511,84 @@ f"> */ /* Step (1R): apply back the new right singular vector matrix */ /* to B. */ - if (*k == 1) { - dcopy_(nrhs, &b[b_offset], ldb, &bx[bx_offset], ldbx); - } else { - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - dsigj = poles[j + (poles_dim1 << 1)]; - if (z__[j] == 0.) { - work[j] = 0.; - } else { - work[j] = -z__[j] / difl[j] / (dsigj + poles[j + - poles_dim1]) / difr[j + (difr_dim1 << 1)]; - } - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - if (z__[j] == 0.) { - work[i__] = 0.; - } else { - d__1 = -poles[i__ + 1 + (poles_dim1 << 1)]; - work[i__] = z__[j] / (dlamc3_(&dsigj, &d__1) - difr[ - i__ + difr_dim1]) / (dsigj + poles[i__ + - poles_dim1]) / difr[i__ + (difr_dim1 << 1)]; - } + if (*k == 1) { + dcopy_(nrhs, &b[b_offset], ldb, &bx[bx_offset], ldbx); + } else { + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dsigj = poles[j + (poles_dim1 << 1)]; + if (z__[j] == 0.) { + work[j] = 0.; + } else { + work[j] = -z__[j] / difl[j] / (dsigj + poles[j + + poles_dim1]) / difr[j + (difr_dim1 << 1)]; + } + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + if (z__[j] == 0.) { + work[i__] = 0.; + } else { + d__1 = -poles[i__ + 1 + (poles_dim1 << 1)]; + work[i__] = z__[j] / (dlamc3_(&dsigj, &d__1) - difr[ + i__ + difr_dim1]) / (dsigj + poles[i__ + + poles_dim1]) / difr[i__ + (difr_dim1 << 1)]; + } /* L60: */ - } - i__2 = *k; - for (i__ = j + 1; i__ <= i__2; ++i__) { - if (z__[j] == 0.) { - work[i__] = 0.; - } else { - d__1 = -poles[i__ + (poles_dim1 << 1)]; - work[i__] = z__[j] / (dlamc3_(&dsigj, &d__1) - difl[ - i__]) / (dsigj + poles[i__ + poles_dim1]) / - difr[i__ + (difr_dim1 << 1)]; - } + } + i__2 = *k; + for (i__ = j + 1; i__ <= i__2; ++i__) { + if (z__[j] == 0.) { + work[i__] = 0.; + } else { + d__1 = -poles[i__ + (poles_dim1 << 1)]; + work[i__] = z__[j] / (dlamc3_(&dsigj, &d__1) - difl[ + i__]) / (dsigj + poles[i__ + poles_dim1]) / + difr[i__ + (difr_dim1 << 1)]; + } /* L70: */ - } - dgemv_((char *)"T", k, nrhs, &c_b11, &b[b_offset], ldb, &work[1], & - c__1, &c_b13, &bx[j + bx_dim1], ldbx, (ftnlen)1); + } + dgemv_((char *)"T", k, nrhs, &c_b11, &b[b_offset], ldb, &work[1], & + c__1, &c_b13, &bx[j + bx_dim1], ldbx, (ftnlen)1); /* L80: */ - } - } + } + } /* Step (2R): if SQRE = 1, apply back the rotation that is */ /* related to the right null space of the subproblem. */ - if (*sqre == 1) { - dcopy_(nrhs, &b[m + b_dim1], ldb, &bx[m + bx_dim1], ldbx); - drot_(nrhs, &bx[bx_dim1 + 1], ldbx, &bx[m + bx_dim1], ldbx, c__, - s); - } - if (*k < max(m,n)) { - i__1 = n - *k; - dlacpy_((char *)"A", &i__1, nrhs, &b[*k + 1 + b_dim1], ldb, &bx[*k + 1 + - bx_dim1], ldbx, (ftnlen)1); - } + if (*sqre == 1) { + dcopy_(nrhs, &b[m + b_dim1], ldb, &bx[m + bx_dim1], ldbx); + drot_(nrhs, &bx[bx_dim1 + 1], ldbx, &bx[m + bx_dim1], ldbx, c__, + s); + } + if (*k < max(m,n)) { + i__1 = n - *k; + dlacpy_((char *)"A", &i__1, nrhs, &b[*k + 1 + b_dim1], ldb, &bx[*k + 1 + + bx_dim1], ldbx, (ftnlen)1); + } /* Step (3R): permute rows of B. */ - dcopy_(nrhs, &bx[bx_dim1 + 1], ldbx, &b[nlp1 + b_dim1], ldb); - if (*sqre == 1) { - dcopy_(nrhs, &bx[m + bx_dim1], ldbx, &b[m + b_dim1], ldb); - } - i__1 = n; - for (i__ = 2; i__ <= i__1; ++i__) { - dcopy_(nrhs, &bx[i__ + bx_dim1], ldbx, &b[perm[i__] + b_dim1], - ldb); + dcopy_(nrhs, &bx[bx_dim1 + 1], ldbx, &b[nlp1 + b_dim1], ldb); + if (*sqre == 1) { + dcopy_(nrhs, &bx[m + bx_dim1], ldbx, &b[m + b_dim1], ldb); + } + i__1 = n; + for (i__ = 2; i__ <= i__1; ++i__) { + dcopy_(nrhs, &bx[i__ + bx_dim1], ldbx, &b[perm[i__] + b_dim1], + ldb); /* L90: */ - } + } /* Step (4R): apply back the Givens rotations performed. */ - for (i__ = *givptr; i__ >= 1; --i__) { - d__1 = -givnum[i__ + givnum_dim1]; - drot_(nrhs, &b[givcol[i__ + (givcol_dim1 << 1)] + b_dim1], ldb, & - b[givcol[i__ + givcol_dim1] + b_dim1], ldb, &givnum[i__ + - (givnum_dim1 << 1)], &d__1); + for (i__ = *givptr; i__ >= 1; --i__) { + d__1 = -givnum[i__ + givnum_dim1]; + drot_(nrhs, &b[givcol[i__ + (givcol_dim1 << 1)] + b_dim1], ldb, & + b[givcol[i__ + givcol_dim1] + b_dim1], ldb, &givnum[i__ + + (givnum_dim1 << 1)], &d__1); /* L100: */ - } + } } return 0; @@ -598,5 +598,5 @@ f"> */ } /* dlals0_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlalsa.cpp b/lib/linalg/dlalsa.cpp index 7c09a46de3..e68dabd8dd 100644 --- a/lib/linalg/dlalsa.cpp +++ b/lib/linalg/dlalsa.cpp @@ -1,13 +1,13 @@ /* fortran/dlalsa.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -286,40 +286,40 @@ f"> */ /* > Osni Marques, LBNL/NERSC, USA \n */ /* ===================================================================== */ -/* Subroutine */ int dlalsa_(integer *icompq, integer *smlsiz, integer *n, - integer *nrhs, doublereal *b, integer *ldb, doublereal *bx, integer * - ldbx, doublereal *u, integer *ldu, doublereal *vt, integer *k, - doublereal *difl, doublereal *difr, doublereal *z__, doublereal * - poles, integer *givptr, integer *givcol, integer *ldgcol, integer * - perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal * - work, integer *iwork, integer *info) +/* Subroutine */ int dlalsa_(integer *icompq, integer *smlsiz, integer *n, + integer *nrhs, doublereal *b, integer *ldb, doublereal *bx, integer * + ldbx, doublereal *u, integer *ldu, doublereal *vt, integer *k, + doublereal *difl, doublereal *difr, doublereal *z__, doublereal * + poles, integer *givptr, integer *givcol, integer *ldgcol, integer * + perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal * + work, integer *iwork, integer *info) { /* System generated locals */ - integer givcol_dim1, givcol_offset, perm_dim1, perm_offset, b_dim1, - b_offset, bx_dim1, bx_offset, difl_dim1, difl_offset, difr_dim1, - difr_offset, givnum_dim1, givnum_offset, poles_dim1, poles_offset, - u_dim1, u_offset, vt_dim1, vt_offset, z_dim1, z_offset, i__1, - i__2; + integer givcol_dim1, givcol_offset, perm_dim1, perm_offset, b_dim1, + b_offset, bx_dim1, bx_offset, difl_dim1, difl_offset, difr_dim1, + difr_offset, givnum_dim1, givnum_offset, poles_dim1, poles_offset, + u_dim1, u_offset, vt_dim1, vt_offset, z_dim1, z_offset, i__1, + i__2; /* Builtin functions */ integer pow_ii(integer *, integer *); /* Local variables */ - integer i__, j, i1, ic, lf, nd, ll, nl, nr, im1, nlf, nrf, lvl, ndb1, - nlp1, lvl2, nrp1, nlvl, sqre; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer i__, j, i1, ic, lf, nd, ll, nl, nr, im1, nlf, nrf, lvl, ndb1, + nlp1, lvl2, nrp1, nlvl, sqre; + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); integer inode, ndiml, ndimr; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *), dlals0_(integer *, integer *, integer *, - integer *, integer *, doublereal *, integer *, doublereal *, - integer *, integer *, integer *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *, doublereal *, doublereal *, doublereal *, - integer *), dlasdt_(integer *, integer *, integer *, integer *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *), dlals0_(integer *, integer *, integer *, + integer *, integer *, doublereal *, integer *, doublereal *, + integer *, integer *, integer *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, doublereal *, doublereal *, + integer *), dlasdt_(integer *, integer *, integer *, integer *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen); /* -- LAPACK computational routine -- */ @@ -388,26 +388,26 @@ f"> */ *info = 0; if (*icompq < 0 || *icompq > 1) { - *info = -1; + *info = -1; } else if (*smlsiz < 3) { - *info = -2; + *info = -2; } else if (*n < *smlsiz) { - *info = -3; + *info = -3; } else if (*nrhs < 1) { - *info = -4; + *info = -4; } else if (*ldb < *n) { - *info = -6; + *info = -6; } else if (*ldbx < *n) { - *info = -8; + *info = -8; } else if (*ldu < *n) { - *info = -10; + *info = -10; } else if (*ldgcol < *n) { - *info = -19; + *info = -19; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLALSA", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLALSA", &i__1, (ftnlen)6); + return 0; } /* Book-keeping and setting up the computation tree. */ @@ -416,14 +416,14 @@ f"> */ ndiml = inode + *n; ndimr = ndiml + *n; - dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], - smlsiz); + dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], + smlsiz); /* The following code applies back the left singular vector factors. */ /* For applying back the right singular vector factors, go to 50. */ if (*icompq == 1) { - goto L50; + goto L50; } /* The nodes on the bottom level of the tree were solved */ @@ -441,18 +441,18 @@ f"> */ /* NLF: starting row of the left subproblem */ /* NRF: starting row of the right subproblem */ - i1 = i__ - 1; - ic = iwork[inode + i1]; - nl = iwork[ndiml + i1]; - nr = iwork[ndimr + i1]; - nlf = ic - nl; - nrf = ic + 1; - dgemm_((char *)"T", (char *)"N", &nl, nrhs, &nl, &c_b7, &u[nlf + u_dim1], ldu, &b[nlf - + b_dim1], ldb, &c_b8, &bx[nlf + bx_dim1], ldbx, (ftnlen)1, ( - ftnlen)1); - dgemm_((char *)"T", (char *)"N", &nr, nrhs, &nr, &c_b7, &u[nrf + u_dim1], ldu, &b[nrf - + b_dim1], ldb, &c_b8, &bx[nrf + bx_dim1], ldbx, (ftnlen)1, ( - ftnlen)1); + i1 = i__ - 1; + ic = iwork[inode + i1]; + nl = iwork[ndiml + i1]; + nr = iwork[ndimr + i1]; + nlf = ic - nl; + nrf = ic + 1; + dgemm_((char *)"T", (char *)"N", &nl, nrhs, &nl, &c_b7, &u[nlf + u_dim1], ldu, &b[nlf + + b_dim1], ldb, &c_b8, &bx[nlf + bx_dim1], ldbx, (ftnlen)1, ( + ftnlen)1); + dgemm_((char *)"T", (char *)"N", &nr, nrhs, &nr, &c_b7, &u[nrf + u_dim1], ldu, &b[nrf + + b_dim1], ldb, &c_b8, &bx[nrf + bx_dim1], ldbx, (ftnlen)1, ( + ftnlen)1); /* L10: */ } @@ -461,8 +461,8 @@ f"> */ i__1 = nd; for (i__ = 1; i__ <= i__1; ++i__) { - ic = iwork[inode + i__ - 1]; - dcopy_(nrhs, &b[ic + b_dim1], ldb, &bx[ic + bx_dim1], ldbx); + ic = iwork[inode + i__ - 1]; + dcopy_(nrhs, &b[ic + b_dim1], ldb, &bx[ic + bx_dim1], ldbx); /* L20: */ } @@ -473,37 +473,37 @@ f"> */ sqre = 0; for (lvl = nlvl; lvl >= 1; --lvl) { - lvl2 = (lvl << 1) - 1; + lvl2 = (lvl << 1) - 1; /* find the first node LF and last node LL on */ /* the current level LVL */ - if (lvl == 1) { - lf = 1; - ll = 1; - } else { - i__1 = lvl - 1; - lf = pow_ii(&c__2, &i__1); - ll = (lf << 1) - 1; - } - i__1 = ll; - for (i__ = lf; i__ <= i__1; ++i__) { - im1 = i__ - 1; - ic = iwork[inode + im1]; - nl = iwork[ndiml + im1]; - nr = iwork[ndimr + im1]; - nlf = ic - nl; - nrf = ic + 1; - --j; - dlals0_(icompq, &nl, &nr, &sqre, nrhs, &bx[nlf + bx_dim1], ldbx, & - b[nlf + b_dim1], ldb, &perm[nlf + lvl * perm_dim1], & - givptr[j], &givcol[nlf + lvl2 * givcol_dim1], ldgcol, & - givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * - poles_dim1], &difl[nlf + lvl * difl_dim1], &difr[nlf + - lvl2 * difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[ - j], &s[j], &work[1], info); + if (lvl == 1) { + lf = 1; + ll = 1; + } else { + i__1 = lvl - 1; + lf = pow_ii(&c__2, &i__1); + ll = (lf << 1) - 1; + } + i__1 = ll; + for (i__ = lf; i__ <= i__1; ++i__) { + im1 = i__ - 1; + ic = iwork[inode + im1]; + nl = iwork[ndiml + im1]; + nr = iwork[ndimr + im1]; + nlf = ic - nl; + nrf = ic + 1; + --j; + dlals0_(icompq, &nl, &nr, &sqre, nrhs, &bx[nlf + bx_dim1], ldbx, & + b[nlf + b_dim1], ldb, &perm[nlf + lvl * perm_dim1], & + givptr[j], &givcol[nlf + lvl2 * givcol_dim1], ldgcol, & + givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * + poles_dim1], &difl[nlf + lvl * difl_dim1], &difr[nlf + + lvl2 * difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[ + j], &s[j], &work[1], info); /* L30: */ - } + } /* L40: */ } goto L90; @@ -518,42 +518,42 @@ L50: j = 0; i__1 = nlvl; for (lvl = 1; lvl <= i__1; ++lvl) { - lvl2 = (lvl << 1) - 1; + lvl2 = (lvl << 1) - 1; /* Find the first node LF and last node LL on */ /* the current level LVL. */ - if (lvl == 1) { - lf = 1; - ll = 1; - } else { - i__2 = lvl - 1; - lf = pow_ii(&c__2, &i__2); - ll = (lf << 1) - 1; - } - i__2 = lf; - for (i__ = ll; i__ >= i__2; --i__) { - im1 = i__ - 1; - ic = iwork[inode + im1]; - nl = iwork[ndiml + im1]; - nr = iwork[ndimr + im1]; - nlf = ic - nl; - nrf = ic + 1; - if (i__ == ll) { - sqre = 0; - } else { - sqre = 1; - } - ++j; - dlals0_(icompq, &nl, &nr, &sqre, nrhs, &b[nlf + b_dim1], ldb, &bx[ - nlf + bx_dim1], ldbx, &perm[nlf + lvl * perm_dim1], & - givptr[j], &givcol[nlf + lvl2 * givcol_dim1], ldgcol, & - givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * - poles_dim1], &difl[nlf + lvl * difl_dim1], &difr[nlf + - lvl2 * difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[ - j], &s[j], &work[1], info); + if (lvl == 1) { + lf = 1; + ll = 1; + } else { + i__2 = lvl - 1; + lf = pow_ii(&c__2, &i__2); + ll = (lf << 1) - 1; + } + i__2 = lf; + for (i__ = ll; i__ >= i__2; --i__) { + im1 = i__ - 1; + ic = iwork[inode + im1]; + nl = iwork[ndiml + im1]; + nr = iwork[ndimr + im1]; + nlf = ic - nl; + nrf = ic + 1; + if (i__ == ll) { + sqre = 0; + } else { + sqre = 1; + } + ++j; + dlals0_(icompq, &nl, &nr, &sqre, nrhs, &b[nlf + b_dim1], ldb, &bx[ + nlf + bx_dim1], ldbx, &perm[nlf + lvl * perm_dim1], & + givptr[j], &givcol[nlf + lvl2 * givcol_dim1], ldgcol, & + givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * + poles_dim1], &difl[nlf + lvl * difl_dim1], &difr[nlf + + lvl2 * difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[ + j], &s[j], &work[1], info); /* L60: */ - } + } /* L70: */ } @@ -564,24 +564,24 @@ L50: ndb1 = (nd + 1) / 2; i__1 = nd; for (i__ = ndb1; i__ <= i__1; ++i__) { - i1 = i__ - 1; - ic = iwork[inode + i1]; - nl = iwork[ndiml + i1]; - nr = iwork[ndimr + i1]; - nlp1 = nl + 1; - if (i__ == nd) { - nrp1 = nr; - } else { - nrp1 = nr + 1; - } - nlf = ic - nl; - nrf = ic + 1; - dgemm_((char *)"T", (char *)"N", &nlp1, nrhs, &nlp1, &c_b7, &vt[nlf + vt_dim1], ldu, & - b[nlf + b_dim1], ldb, &c_b8, &bx[nlf + bx_dim1], ldbx, ( - ftnlen)1, (ftnlen)1); - dgemm_((char *)"T", (char *)"N", &nrp1, nrhs, &nrp1, &c_b7, &vt[nrf + vt_dim1], ldu, & - b[nrf + b_dim1], ldb, &c_b8, &bx[nrf + bx_dim1], ldbx, ( - ftnlen)1, (ftnlen)1); + i1 = i__ - 1; + ic = iwork[inode + i1]; + nl = iwork[ndiml + i1]; + nr = iwork[ndimr + i1]; + nlp1 = nl + 1; + if (i__ == nd) { + nrp1 = nr; + } else { + nrp1 = nr + 1; + } + nlf = ic - nl; + nrf = ic + 1; + dgemm_((char *)"T", (char *)"N", &nlp1, nrhs, &nlp1, &c_b7, &vt[nlf + vt_dim1], ldu, & + b[nlf + b_dim1], ldb, &c_b8, &bx[nlf + bx_dim1], ldbx, ( + ftnlen)1, (ftnlen)1); + dgemm_((char *)"T", (char *)"N", &nrp1, nrhs, &nrp1, &c_b7, &vt[nrf + vt_dim1], ldu, & + b[nrf + b_dim1], ldb, &c_b8, &bx[nrf + bx_dim1], ldbx, ( + ftnlen)1, (ftnlen)1); /* L80: */ } @@ -594,5 +594,5 @@ L90: } /* dlalsa_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlalsd.cpp b/lib/linalg/dlalsd.cpp index 07c3ca57f0..a141fa6992 100644 --- a/lib/linalg/dlalsd.cpp +++ b/lib/linalg/dlalsd.cpp @@ -1,13 +1,13 @@ /* fortran/dlalsd.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -201,10 +201,10 @@ f"> */ /* > Osni Marques, LBNL/NERSC, USA \n */ /* ===================================================================== */ -/* Subroutine */ int dlalsd_(char *uplo, integer *smlsiz, integer *n, integer - *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, - doublereal *rcond, integer *rank, doublereal *work, integer *iwork, - integer *info, ftnlen uplo_len) +/* Subroutine */ int dlalsd_(char *uplo, integer *smlsiz, integer *n, integer + *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, + doublereal *rcond, integer *rank, doublereal *work, integer *iwork, + integer *info, ftnlen uplo_len) { /* System generated locals */ integer b_dim1, b_offset, i__1, i__2; @@ -227,44 +227,44 @@ f"> */ integer difl, difr; doublereal rcnd; integer perm, nsub; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *); + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *); integer nlvl, sqre, bxst; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), - dcopy_(integer *, doublereal *, integer *, doublereal *, integer - *); + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer + *); integer poles, sizei, nsize, nwork, icmpq1, icmpq2; extern doublereal dlamch_(char *, ftnlen); - extern /* Subroutine */ int dlasda_(integer *, integer *, integer *, - integer *, doublereal *, doublereal *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *, integer *, integer *, integer *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *, - integer *), dlalsa_(integer *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - doublereal *, doublereal *, integer *, integer *, integer *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - integer *, integer *), dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern /* Subroutine */ int dlasda_(integer *, integer *, integer *, + integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *, integer *, integer *, integer *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *), dlalsa_(integer *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *, integer *, integer *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + integer *, integer *), dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dlasdq_(char *, integer *, integer *, integer - *, integer *, integer *, doublereal *, doublereal *, doublereal *, - integer *, doublereal *, integer *, doublereal *, integer *, - doublereal *, integer *, ftnlen), dlacpy_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - ftnlen), dlartg_(doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *), dlaset_(char *, integer *, integer *, - doublereal *, doublereal *, doublereal *, integer *, ftnlen), - xerbla_(char *, integer *, ftnlen); + extern /* Subroutine */ int dlasdq_(char *, integer *, integer *, integer + *, integer *, integer *, doublereal *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, ftnlen), dlacpy_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), dlartg_(doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *), dlaset_(char *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); integer givcol; - extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, - ftnlen); - extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, - integer *, ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, + ftnlen); + extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, + integer *, ftnlen); doublereal orgnrm; integer givnum, givptr, smlszp; @@ -307,16 +307,16 @@ f"> */ *info = 0; if (*n < 0) { - *info = -3; + *info = -3; } else if (*nrhs < 1) { - *info = -4; + *info = -4; } else if (*ldb < 1 || *ldb < *n) { - *info = -8; + *info = -8; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLALSD", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLALSD", &i__1, (ftnlen)6); + return 0; } eps = dlamch_((char *)"Epsilon", (ftnlen)7); @@ -324,9 +324,9 @@ f"> */ /* Set up the tolerance. */ if (*rcond <= 0. || *rcond >= 1.) { - rcnd = eps; + rcnd = eps; } else { - rcnd = *rcond; + rcnd = *rcond; } *rank = 0; @@ -334,52 +334,52 @@ f"> */ /* Quick return if possible. */ if (*n == 0) { - return 0; + return 0; } else if (*n == 1) { - if (d__[1] == 0.) { - dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &b[b_offset], ldb, ( - ftnlen)1); - } else { - *rank = 1; - dlascl_((char *)"G", &c__0, &c__0, &d__[1], &c_b11, &c__1, nrhs, &b[ - b_offset], ldb, info, (ftnlen)1); - d__[1] = abs(d__[1]); - } - return 0; + if (d__[1] == 0.) { + dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &b[b_offset], ldb, ( + ftnlen)1); + } else { + *rank = 1; + dlascl_((char *)"G", &c__0, &c__0, &d__[1], &c_b11, &c__1, nrhs, &b[ + b_offset], ldb, info, (ftnlen)1); + d__[1] = abs(d__[1]); + } + return 0; } /* Rotate the matrix if it is lower bidiagonal. */ if (*(unsigned char *)uplo == 'L') { - i__1 = *n - 1; - for (i__ = 1; i__ <= i__1; ++i__) { - dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); - d__[i__] = r__; - e[i__] = sn * d__[i__ + 1]; - d__[i__ + 1] = cs * d__[i__ + 1]; - if (*nrhs == 1) { - drot_(&c__1, &b[i__ + b_dim1], &c__1, &b[i__ + 1 + b_dim1], & - c__1, &cs, &sn); - } else { - work[(i__ << 1) - 1] = cs; - work[i__ * 2] = sn; - } + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); + d__[i__] = r__; + e[i__] = sn * d__[i__ + 1]; + d__[i__ + 1] = cs * d__[i__ + 1]; + if (*nrhs == 1) { + drot_(&c__1, &b[i__ + b_dim1], &c__1, &b[i__ + 1 + b_dim1], & + c__1, &cs, &sn); + } else { + work[(i__ << 1) - 1] = cs; + work[i__ * 2] = sn; + } /* L10: */ - } - if (*nrhs > 1) { - i__1 = *nrhs; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = *n - 1; - for (j = 1; j <= i__2; ++j) { - cs = work[(j << 1) - 1]; - sn = work[j * 2]; - drot_(&c__1, &b[j + i__ * b_dim1], &c__1, &b[j + 1 + i__ * - b_dim1], &c__1, &cs, &sn); + } + if (*nrhs > 1) { + i__1 = *nrhs; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = *n - 1; + for (j = 1; j <= i__2; ++j) { + cs = work[(j << 1) - 1]; + sn = work[j * 2]; + drot_(&c__1, &b[j + i__ * b_dim1], &c__1, &b[j + 1 + i__ * + b_dim1], &c__1, &cs, &sn); /* L20: */ - } + } /* L30: */ - } - } + } + } } /* Scale. */ @@ -387,58 +387,58 @@ f"> */ nm1 = *n - 1; orgnrm = dlanst_((char *)"M", n, &d__[1], &e[1], (ftnlen)1); if (orgnrm == 0.) { - dlaset_((char *)"A", n, nrhs, &c_b6, &c_b6, &b[b_offset], ldb, (ftnlen)1); - return 0; + dlaset_((char *)"A", n, nrhs, &c_b6, &c_b6, &b[b_offset], ldb, (ftnlen)1); + return 0; } dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, &c__1, &d__[1], n, info, ( - ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, &nm1, &c__1, &e[1], &nm1, - info, (ftnlen)1); + ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, &nm1, &c__1, &e[1], &nm1, + info, (ftnlen)1); /* If N is smaller than the minimum divide size SMLSIZ, then solve */ /* the problem with another solver. */ if (*n <= *smlsiz) { - nwork = *n * *n + 1; - dlaset_((char *)"A", n, n, &c_b6, &c_b11, &work[1], n, (ftnlen)1); - dlasdq_((char *)"U", &c__0, n, n, &c__0, nrhs, &d__[1], &e[1], &work[1], n, & - work[1], n, &b[b_offset], ldb, &work[nwork], info, (ftnlen)1); - if (*info != 0) { - return 0; - } - tol = rcnd * (d__1 = d__[idamax_(n, &d__[1], &c__1)], abs(d__1)); - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - if (d__[i__] <= tol) { - dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &b[i__ + b_dim1], ldb, - (ftnlen)1); - } else { - dlascl_((char *)"G", &c__0, &c__0, &d__[i__], &c_b11, &c__1, nrhs, &b[ - i__ + b_dim1], ldb, info, (ftnlen)1); - ++(*rank); - } + nwork = *n * *n + 1; + dlaset_((char *)"A", n, n, &c_b6, &c_b11, &work[1], n, (ftnlen)1); + dlasdq_((char *)"U", &c__0, n, n, &c__0, nrhs, &d__[1], &e[1], &work[1], n, & + work[1], n, &b[b_offset], ldb, &work[nwork], info, (ftnlen)1); + if (*info != 0) { + return 0; + } + tol = rcnd * (d__1 = d__[idamax_(n, &d__[1], &c__1)], abs(d__1)); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + if (d__[i__] <= tol) { + dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &b[i__ + b_dim1], ldb, + (ftnlen)1); + } else { + dlascl_((char *)"G", &c__0, &c__0, &d__[i__], &c_b11, &c__1, nrhs, &b[ + i__ + b_dim1], ldb, info, (ftnlen)1); + ++(*rank); + } /* L40: */ - } - dgemm_((char *)"T", (char *)"N", n, nrhs, n, &c_b11, &work[1], n, &b[b_offset], ldb, & - c_b6, &work[nwork], n, (ftnlen)1, (ftnlen)1); - dlacpy_((char *)"A", n, nrhs, &work[nwork], n, &b[b_offset], ldb, (ftnlen)1); + } + dgemm_((char *)"T", (char *)"N", n, nrhs, n, &c_b11, &work[1], n, &b[b_offset], ldb, & + c_b6, &work[nwork], n, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"A", n, nrhs, &work[nwork], n, &b[b_offset], ldb, (ftnlen)1); /* Unscale. */ - dlascl_((char *)"G", &c__0, &c__0, &c_b11, &orgnrm, n, &c__1, &d__[1], n, - info, (ftnlen)1); - dlasrt_((char *)"D", n, &d__[1], info, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, nrhs, &b[b_offset], - ldb, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &c_b11, &orgnrm, n, &c__1, &d__[1], n, + info, (ftnlen)1); + dlasrt_((char *)"D", n, &d__[1], info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, nrhs, &b[b_offset], + ldb, info, (ftnlen)1); - return 0; + return 0; } /* Book-keeping and setting up some constants. */ - nlvl = (integer) (log((doublereal) (*n) / (doublereal) (*smlsiz + 1)) / - log(2.)) + 1; + nlvl = (integer) (log((doublereal) (*n) / (doublereal) (*smlsiz + 1)) / + log(2.)) + 1; smlszp = *smlsiz + 1; @@ -469,95 +469,95 @@ f"> */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - if ((d__1 = d__[i__], abs(d__1)) < eps) { - d__[i__] = d_sign(&eps, &d__[i__]); - } + if ((d__1 = d__[i__], abs(d__1)) < eps) { + d__[i__] = d_sign(&eps, &d__[i__]); + } /* L50: */ } i__1 = nm1; for (i__ = 1; i__ <= i__1; ++i__) { - if ((d__1 = e[i__], abs(d__1)) < eps || i__ == nm1) { - ++nsub; - iwork[nsub] = st; + if ((d__1 = e[i__], abs(d__1)) < eps || i__ == nm1) { + ++nsub; + iwork[nsub] = st; /* Subproblem found. First determine its size and then */ /* apply divide and conquer on it. */ - if (i__ < nm1) { + if (i__ < nm1) { /* A subproblem with E(I) small for I < NM1. */ - nsize = i__ - st + 1; - iwork[sizei + nsub - 1] = nsize; - } else if ((d__1 = e[i__], abs(d__1)) >= eps) { + nsize = i__ - st + 1; + iwork[sizei + nsub - 1] = nsize; + } else if ((d__1 = e[i__], abs(d__1)) >= eps) { /* A subproblem with E(NM1) not too small but I = NM1. */ - nsize = *n - st + 1; - iwork[sizei + nsub - 1] = nsize; - } else { + nsize = *n - st + 1; + iwork[sizei + nsub - 1] = nsize; + } else { /* A subproblem with E(NM1) small. This implies an */ /* 1-by-1 subproblem at D(N), which is not solved */ /* explicitly. */ - nsize = i__ - st + 1; - iwork[sizei + nsub - 1] = nsize; - ++nsub; - iwork[nsub] = *n; - iwork[sizei + nsub - 1] = 1; - dcopy_(nrhs, &b[*n + b_dim1], ldb, &work[bx + nm1], n); - } - st1 = st - 1; - if (nsize == 1) { + nsize = i__ - st + 1; + iwork[sizei + nsub - 1] = nsize; + ++nsub; + iwork[nsub] = *n; + iwork[sizei + nsub - 1] = 1; + dcopy_(nrhs, &b[*n + b_dim1], ldb, &work[bx + nm1], n); + } + st1 = st - 1; + if (nsize == 1) { /* This is a 1-by-1 subproblem and is not solved */ /* explicitly. */ - dcopy_(nrhs, &b[st + b_dim1], ldb, &work[bx + st1], n); - } else if (nsize <= *smlsiz) { + dcopy_(nrhs, &b[st + b_dim1], ldb, &work[bx + st1], n); + } else if (nsize <= *smlsiz) { /* This is a small subproblem and is solved by DLASDQ. */ - dlaset_((char *)"A", &nsize, &nsize, &c_b6, &c_b11, &work[vt + st1], - n, (ftnlen)1); - dlasdq_((char *)"U", &c__0, &nsize, &nsize, &c__0, nrhs, &d__[st], &e[ - st], &work[vt + st1], n, &work[nwork], n, &b[st + - b_dim1], ldb, &work[nwork], info, (ftnlen)1); - if (*info != 0) { - return 0; - } - dlacpy_((char *)"A", &nsize, nrhs, &b[st + b_dim1], ldb, &work[bx + - st1], n, (ftnlen)1); - } else { + dlaset_((char *)"A", &nsize, &nsize, &c_b6, &c_b11, &work[vt + st1], + n, (ftnlen)1); + dlasdq_((char *)"U", &c__0, &nsize, &nsize, &c__0, nrhs, &d__[st], &e[ + st], &work[vt + st1], n, &work[nwork], n, &b[st + + b_dim1], ldb, &work[nwork], info, (ftnlen)1); + if (*info != 0) { + return 0; + } + dlacpy_((char *)"A", &nsize, nrhs, &b[st + b_dim1], ldb, &work[bx + + st1], n, (ftnlen)1); + } else { /* A large problem. Solve it using divide and conquer. */ - dlasda_(&icmpq1, smlsiz, &nsize, &sqre, &d__[st], &e[st], & - work[u + st1], n, &work[vt + st1], &iwork[k + st1], & - work[difl + st1], &work[difr + st1], &work[z__ + st1], - &work[poles + st1], &iwork[givptr + st1], &iwork[ - givcol + st1], n, &iwork[perm + st1], &work[givnum + - st1], &work[c__ + st1], &work[s + st1], &work[nwork], - &iwork[iwk], info); - if (*info != 0) { - return 0; - } - bxst = bx + st1; - dlalsa_(&icmpq2, smlsiz, &nsize, nrhs, &b[st + b_dim1], ldb, & - work[bxst], n, &work[u + st1], n, &work[vt + st1], & - iwork[k + st1], &work[difl + st1], &work[difr + st1], - &work[z__ + st1], &work[poles + st1], &iwork[givptr + - st1], &iwork[givcol + st1], n, &iwork[perm + st1], & - work[givnum + st1], &work[c__ + st1], &work[s + st1], - &work[nwork], &iwork[iwk], info); - if (*info != 0) { - return 0; - } - } - st = i__ + 1; - } + dlasda_(&icmpq1, smlsiz, &nsize, &sqre, &d__[st], &e[st], & + work[u + st1], n, &work[vt + st1], &iwork[k + st1], & + work[difl + st1], &work[difr + st1], &work[z__ + st1], + &work[poles + st1], &iwork[givptr + st1], &iwork[ + givcol + st1], n, &iwork[perm + st1], &work[givnum + + st1], &work[c__ + st1], &work[s + st1], &work[nwork], + &iwork[iwk], info); + if (*info != 0) { + return 0; + } + bxst = bx + st1; + dlalsa_(&icmpq2, smlsiz, &nsize, nrhs, &b[st + b_dim1], ldb, & + work[bxst], n, &work[u + st1], n, &work[vt + st1], & + iwork[k + st1], &work[difl + st1], &work[difr + st1], + &work[z__ + st1], &work[poles + st1], &iwork[givptr + + st1], &iwork[givcol + st1], n, &iwork[perm + st1], & + work[givnum + st1], &work[c__ + st1], &work[s + st1], + &work[nwork], &iwork[iwk], info); + if (*info != 0) { + return 0; + } + } + st = i__ + 1; + } /* L60: */ } @@ -571,15 +571,15 @@ f"> */ /* Some of the elements in D can be negative because 1-by-1 */ /* subproblems were not solved explicitly. */ - if ((d__1 = d__[i__], abs(d__1)) <= tol) { - dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &work[bx + i__ - 1], n, ( - ftnlen)1); - } else { - ++(*rank); - dlascl_((char *)"G", &c__0, &c__0, &d__[i__], &c_b11, &c__1, nrhs, &work[ - bx + i__ - 1], n, info, (ftnlen)1); - } - d__[i__] = (d__1 = d__[i__], abs(d__1)); + if ((d__1 = d__[i__], abs(d__1)) <= tol) { + dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &work[bx + i__ - 1], n, ( + ftnlen)1); + } else { + ++(*rank); + dlascl_((char *)"G", &c__0, &c__0, &d__[i__], &c_b11, &c__1, nrhs, &work[ + bx + i__ - 1], n, info, (ftnlen)1); + } + d__[i__] = (d__1 = d__[i__], abs(d__1)); /* L70: */ } @@ -588,38 +588,38 @@ f"> */ icmpq2 = 1; i__1 = nsub; for (i__ = 1; i__ <= i__1; ++i__) { - st = iwork[i__]; - st1 = st - 1; - nsize = iwork[sizei + i__ - 1]; - bxst = bx + st1; - if (nsize == 1) { - dcopy_(nrhs, &work[bxst], n, &b[st + b_dim1], ldb); - } else if (nsize <= *smlsiz) { - dgemm_((char *)"T", (char *)"N", &nsize, nrhs, &nsize, &c_b11, &work[vt + st1], n, - &work[bxst], n, &c_b6, &b[st + b_dim1], ldb, (ftnlen)1, ( - ftnlen)1); - } else { - dlalsa_(&icmpq2, smlsiz, &nsize, nrhs, &work[bxst], n, &b[st + - b_dim1], ldb, &work[u + st1], n, &work[vt + st1], &iwork[ - k + st1], &work[difl + st1], &work[difr + st1], &work[z__ - + st1], &work[poles + st1], &iwork[givptr + st1], &iwork[ - givcol + st1], n, &iwork[perm + st1], &work[givnum + st1], - &work[c__ + st1], &work[s + st1], &work[nwork], &iwork[ - iwk], info); - if (*info != 0) { - return 0; - } - } + st = iwork[i__]; + st1 = st - 1; + nsize = iwork[sizei + i__ - 1]; + bxst = bx + st1; + if (nsize == 1) { + dcopy_(nrhs, &work[bxst], n, &b[st + b_dim1], ldb); + } else if (nsize <= *smlsiz) { + dgemm_((char *)"T", (char *)"N", &nsize, nrhs, &nsize, &c_b11, &work[vt + st1], n, + &work[bxst], n, &c_b6, &b[st + b_dim1], ldb, (ftnlen)1, ( + ftnlen)1); + } else { + dlalsa_(&icmpq2, smlsiz, &nsize, nrhs, &work[bxst], n, &b[st + + b_dim1], ldb, &work[u + st1], n, &work[vt + st1], &iwork[ + k + st1], &work[difl + st1], &work[difr + st1], &work[z__ + + st1], &work[poles + st1], &iwork[givptr + st1], &iwork[ + givcol + st1], n, &iwork[perm + st1], &work[givnum + st1], + &work[c__ + st1], &work[s + st1], &work[nwork], &iwork[ + iwk], info); + if (*info != 0) { + return 0; + } + } /* L80: */ } /* Unscale and sort the singular values. */ dlascl_((char *)"G", &c__0, &c__0, &c_b11, &orgnrm, n, &c__1, &d__[1], n, info, ( - ftnlen)1); + ftnlen)1); dlasrt_((char *)"D", n, &d__[1], info, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, nrhs, &b[b_offset], ldb, + info, (ftnlen)1); return 0; @@ -628,5 +628,5 @@ f"> */ } /* dlalsd_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlamrg.cpp b/lib/linalg/dlamrg.cpp index 581a64fba7..810d1db154 100644 --- a/lib/linalg/dlamrg.cpp +++ b/lib/linalg/dlamrg.cpp @@ -1,13 +1,13 @@ /* fortran/dlamrg.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -15,7 +15,7 @@ extern "C" { #endif #include "lmp_f2c.h" -/* > \brief \b DLAMRG creates a permutation list to merge the entries of two independently sorted sets into a +/* > \brief \b DLAMRG creates a permutation list to merge the entries of two independently sorted sets into a single set sorted in ascending order. */ /* =========== DOCUMENTATION =========== */ @@ -116,8 +116,8 @@ f"> */ /* > \ingroup auxOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dlamrg_(integer *n1, integer *n2, doublereal *a, integer - *dtrd1, integer *dtrd2, integer *index) +/* Subroutine */ int dlamrg_(integer *n1, integer *n2, doublereal *a, integer + *dtrd1, integer *dtrd2, integer *index) { /* System generated locals */ integer i__1; @@ -149,50 +149,50 @@ f"> */ n1sv = *n1; n2sv = *n2; if (*dtrd1 > 0) { - ind1 = 1; + ind1 = 1; } else { - ind1 = *n1; + ind1 = *n1; } if (*dtrd2 > 0) { - ind2 = *n1 + 1; + ind2 = *n1 + 1; } else { - ind2 = *n1 + *n2; + ind2 = *n1 + *n2; } i__ = 1; /* while ( (N1SV > 0) & (N2SV > 0) ) */ L10: if (n1sv > 0 && n2sv > 0) { - if (a[ind1] <= a[ind2]) { - index[i__] = ind1; - ++i__; - ind1 += *dtrd1; - --n1sv; - } else { - index[i__] = ind2; - ++i__; - ind2 += *dtrd2; - --n2sv; - } - goto L10; + if (a[ind1] <= a[ind2]) { + index[i__] = ind1; + ++i__; + ind1 += *dtrd1; + --n1sv; + } else { + index[i__] = ind2; + ++i__; + ind2 += *dtrd2; + --n2sv; + } + goto L10; } /* end while */ if (n1sv == 0) { - i__1 = n2sv; - for (n1sv = 1; n1sv <= i__1; ++n1sv) { - index[i__] = ind2; - ++i__; - ind2 += *dtrd2; + i__1 = n2sv; + for (n1sv = 1; n1sv <= i__1; ++n1sv) { + index[i__] = ind2; + ++i__; + ind2 += *dtrd2; /* L20: */ - } + } } else { /* N2SV .EQ. 0 */ - i__1 = n1sv; - for (n2sv = 1; n2sv <= i__1; ++n2sv) { - index[i__] = ind1; - ++i__; - ind1 += *dtrd1; + i__1 = n1sv; + for (n2sv = 1; n2sv <= i__1; ++n2sv) { + index[i__] = ind1; + ++i__; + ind1 += *dtrd1; /* L30: */ - } + } } return 0; @@ -202,5 +202,5 @@ L10: } /* dlamrg_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlange.cpp b/lib/linalg/dlange.cpp index 1ccc6fae2b..ab88573259 100644 --- a/lib/linalg/dlange.cpp +++ b/lib/linalg/dlange.cpp @@ -1,13 +1,13 @@ /* fortran/dlange.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -19,7 +19,7 @@ extern "C" { static integer c__1 = 1; -/* > \brief \b DLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute +/* > \brief \b DLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value of any element of a general rectangular matrix. */ /* =========== DOCUMENTATION =========== */ @@ -135,8 +135,8 @@ f"> */ /* > \ingroup doubleGEauxiliary */ /* ===================================================================== */ -doublereal dlange_(char *norm, integer *m, integer *n, doublereal *a, integer - *lda, doublereal *work, ftnlen norm_len) +doublereal dlange_(char *norm, integer *m, integer *n, doublereal *a, integer + *lda, doublereal *work, ftnlen norm_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -151,8 +151,8 @@ doublereal dlange_(char *norm, integer *m, integer *n, doublereal *a, integer extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal value; extern logical disnan_(doublereal *); - extern /* Subroutine */ int dlassq_(integer *, doublereal *, integer *, - doublereal *, doublereal *); + extern /* Subroutine */ int dlassq_(integer *, doublereal *, integer *, + doublereal *, doublereal *); /* -- LAPACK auxiliary routine -- */ @@ -186,83 +186,83 @@ doublereal dlange_(char *norm, integer *m, integer *n, doublereal *a, integer /* Function Body */ if (min(*m,*n) == 0) { - value = 0.; + value = 0.; } else if (lsame_(norm, (char *)"M", (ftnlen)1, (ftnlen)1)) { /* Find max(abs(A(i,j))). */ - value = 0.; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp = (d__1 = a[i__ + j * a_dim1], abs(d__1)); - if (value < temp || disnan_(&temp)) { - value = temp; - } + value = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = (d__1 = a[i__ + j * a_dim1], abs(d__1)); + if (value < temp || disnan_(&temp)) { + value = temp; + } /* L10: */ - } + } /* L20: */ - } + } } else if (lsame_(norm, (char *)"O", (ftnlen)1, (ftnlen)1) || *(unsigned char *) - norm == '1') { + norm == '1') { /* Find norm1(A). */ - value = 0.; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - sum = 0.; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - sum += (d__1 = a[i__ + j * a_dim1], abs(d__1)); + value = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = 0.; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + sum += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L30: */ - } - if (value < sum || disnan_(&sum)) { - value = sum; - } + } + if (value < sum || disnan_(&sum)) { + value = sum; + } /* L40: */ - } + } } else if (lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1)) { /* Find normI(A). */ - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - work[i__] = 0.; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + work[i__] = 0.; /* L50: */ - } - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)); + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)); /* L60: */ - } + } /* L70: */ - } - value = 0.; - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - temp = work[i__]; - if (value < temp || disnan_(&temp)) { - value = temp; - } + } + value = 0.; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = work[i__]; + if (value < temp || disnan_(&temp)) { + value = temp; + } /* L80: */ - } + } } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", ( - ftnlen)1, (ftnlen)1)) { + ftnlen)1, (ftnlen)1)) { /* Find normF(A). */ - scale = 0.; - sum = 1.; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - dlassq_(m, &a[j * a_dim1 + 1], &c__1, &scale, &sum); + scale = 0.; + sum = 1.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + dlassq_(m, &a[j * a_dim1 + 1], &c__1, &scale, &sum); /* L90: */ - } - value = scale * sqrt(sum); + } + value = scale * sqrt(sum); } ret_val = value; @@ -273,5 +273,5 @@ doublereal dlange_(char *norm, integer *m, integer *n, doublereal *a, integer } /* dlange_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlanst.cpp b/lib/linalg/dlanst.cpp index 8a71bcd12d..c216660b75 100644 --- a/lib/linalg/dlanst.cpp +++ b/lib/linalg/dlanst.cpp @@ -1,13 +1,13 @@ /* fortran/dlanst.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -121,8 +121,8 @@ f"> */ /* > \ingroup OTHERauxiliary */ /* ===================================================================== */ -doublereal dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e, - ftnlen norm_len) +doublereal dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e, + ftnlen norm_len) { /* System generated locals */ integer i__1; @@ -137,8 +137,8 @@ doublereal dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e, extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal anorm; extern logical disnan_(doublereal *); - extern /* Subroutine */ int dlassq_(integer *, doublereal *, integer *, - doublereal *, doublereal *); + extern /* Subroutine */ int dlassq_(integer *, doublereal *, integer *, + doublereal *, doublereal *); /* -- LAPACK auxiliary routine -- */ @@ -170,61 +170,61 @@ doublereal dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e, /* Function Body */ if (*n <= 0) { - anorm = 0.; + anorm = 0.; } else if (lsame_(norm, (char *)"M", (ftnlen)1, (ftnlen)1)) { /* Find max(abs(A(i,j))). */ - anorm = (d__1 = d__[*n], abs(d__1)); - i__1 = *n - 1; - for (i__ = 1; i__ <= i__1; ++i__) { - sum = (d__1 = d__[i__], abs(d__1)); - if (anorm < sum || disnan_(&sum)) { - anorm = sum; - } - sum = (d__1 = e[i__], abs(d__1)); - if (anorm < sum || disnan_(&sum)) { - anorm = sum; - } + anorm = (d__1 = d__[*n], abs(d__1)); + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + sum = (d__1 = d__[i__], abs(d__1)); + if (anorm < sum || disnan_(&sum)) { + anorm = sum; + } + sum = (d__1 = e[i__], abs(d__1)); + if (anorm < sum || disnan_(&sum)) { + anorm = sum; + } /* L10: */ - } + } } else if (lsame_(norm, (char *)"O", (ftnlen)1, (ftnlen)1) || *(unsigned char *) - norm == '1' || lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1)) { + norm == '1' || lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1)) { /* Find norm1(A). */ - if (*n == 1) { - anorm = abs(d__[1]); - } else { - anorm = abs(d__[1]) + abs(e[1]); - sum = (d__1 = e[*n - 1], abs(d__1)) + (d__2 = d__[*n], abs(d__2)); - if (anorm < sum || disnan_(&sum)) { - anorm = sum; - } - i__1 = *n - 1; - for (i__ = 2; i__ <= i__1; ++i__) { - sum = (d__1 = d__[i__], abs(d__1)) + (d__2 = e[i__], abs(d__2) - ) + (d__3 = e[i__ - 1], abs(d__3)); - if (anorm < sum || disnan_(&sum)) { - anorm = sum; - } + if (*n == 1) { + anorm = abs(d__[1]); + } else { + anorm = abs(d__[1]) + abs(e[1]); + sum = (d__1 = e[*n - 1], abs(d__1)) + (d__2 = d__[*n], abs(d__2)); + if (anorm < sum || disnan_(&sum)) { + anorm = sum; + } + i__1 = *n - 1; + for (i__ = 2; i__ <= i__1; ++i__) { + sum = (d__1 = d__[i__], abs(d__1)) + (d__2 = e[i__], abs(d__2) + ) + (d__3 = e[i__ - 1], abs(d__3)); + if (anorm < sum || disnan_(&sum)) { + anorm = sum; + } /* L20: */ - } - } + } + } } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", ( - ftnlen)1, (ftnlen)1)) { + ftnlen)1, (ftnlen)1)) { /* Find normF(A). */ - scale = 0.; - sum = 1.; - if (*n > 1) { - i__1 = *n - 1; - dlassq_(&i__1, &e[1], &c__1, &scale, &sum); - sum *= 2; - } - dlassq_(n, &d__[1], &c__1, &scale, &sum); - anorm = scale * sqrt(sum); + scale = 0.; + sum = 1.; + if (*n > 1) { + i__1 = *n - 1; + dlassq_(&i__1, &e[1], &c__1, &scale, &sum); + sum *= 2; + } + dlassq_(n, &d__[1], &c__1, &scale, &sum); + anorm = scale * sqrt(sum); } ret_val = anorm; @@ -235,5 +235,5 @@ doublereal dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e, } /* dlanst_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlansy.cpp b/lib/linalg/dlansy.cpp index 1c5a1fa24c..8d3cb42b7a 100644 --- a/lib/linalg/dlansy.cpp +++ b/lib/linalg/dlansy.cpp @@ -1,13 +1,13 @@ /* fortran/dlansy.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -143,8 +143,8 @@ f"> */ /* > \ingroup doubleSYauxiliary */ /* ===================================================================== */ -doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer - *lda, doublereal *work, ftnlen norm_len, ftnlen uplo_len) +doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer + *lda, doublereal *work, ftnlen norm_len, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -159,8 +159,8 @@ doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal value; extern logical disnan_(doublereal *); - extern /* Subroutine */ int dlassq_(integer *, doublereal *, integer *, - doublereal *, doublereal *); + extern /* Subroutine */ int dlassq_(integer *, doublereal *, integer *, + doublereal *, doublereal *); /* -- LAPACK auxiliary routine -- */ @@ -194,115 +194,115 @@ doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer /* Function Body */ if (*n == 0) { - value = 0.; + value = 0.; } else if (lsame_(norm, (char *)"M", (ftnlen)1, (ftnlen)1)) { /* Find max(abs(A(i,j))). */ - value = 0.; - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - sum = (d__1 = a[i__ + j * a_dim1], abs(d__1)); - if (value < sum || disnan_(&sum)) { - value = sum; - } + value = 0.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + sum = (d__1 = a[i__ + j * a_dim1], abs(d__1)); + if (value < sum || disnan_(&sum)) { + value = sum; + } /* L10: */ - } + } /* L20: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - sum = (d__1 = a[i__ + j * a_dim1], abs(d__1)); - if (value < sum || disnan_(&sum)) { - value = sum; - } + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + sum = (d__1 = a[i__ + j * a_dim1], abs(d__1)); + if (value < sum || disnan_(&sum)) { + value = sum; + } /* L30: */ - } + } /* L40: */ - } - } + } + } } else if (lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"O", ( - ftnlen)1, (ftnlen)1) || *(unsigned char *)norm == '1') { + ftnlen)1, (ftnlen)1) || *(unsigned char *)norm == '1') { /* Find normI(A) ( = norm1(A), since A is symmetric). */ - value = 0.; - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - sum = 0.; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - absa = (d__1 = a[i__ + j * a_dim1], abs(d__1)); - sum += absa; - work[i__] += absa; + value = 0.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = 0.; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + absa = (d__1 = a[i__ + j * a_dim1], abs(d__1)); + sum += absa; + work[i__] += absa; /* L50: */ - } - work[j] = sum + (d__1 = a[j + j * a_dim1], abs(d__1)); + } + work[j] = sum + (d__1 = a[j + j * a_dim1], abs(d__1)); /* L60: */ - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - sum = work[i__]; - if (value < sum || disnan_(&sum)) { - value = sum; - } + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + sum = work[i__]; + if (value < sum || disnan_(&sum)) { + value = sum; + } /* L70: */ - } - } else { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - work[i__] = 0.; + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + work[i__] = 0.; /* L80: */ - } - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - sum = work[j] + (d__1 = a[j + j * a_dim1], abs(d__1)); - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - absa = (d__1 = a[i__ + j * a_dim1], abs(d__1)); - sum += absa; - work[i__] += absa; + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = work[j] + (d__1 = a[j + j * a_dim1], abs(d__1)); + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + absa = (d__1 = a[i__ + j * a_dim1], abs(d__1)); + sum += absa; + work[i__] += absa; /* L90: */ - } - if (value < sum || disnan_(&sum)) { - value = sum; - } + } + if (value < sum || disnan_(&sum)) { + value = sum; + } /* L100: */ - } - } + } + } } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", ( - ftnlen)1, (ftnlen)1)) { + ftnlen)1, (ftnlen)1)) { /* Find normF(A). */ - scale = 0.; - sum = 1.; - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - i__1 = *n; - for (j = 2; j <= i__1; ++j) { - i__2 = j - 1; - dlassq_(&i__2, &a[j * a_dim1 + 1], &c__1, &scale, &sum); + scale = 0.; + sum = 1.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 2; j <= i__1; ++j) { + i__2 = j - 1; + dlassq_(&i__2, &a[j * a_dim1 + 1], &c__1, &scale, &sum); /* L110: */ - } - } else { - i__1 = *n - 1; - for (j = 1; j <= i__1; ++j) { - i__2 = *n - j; - dlassq_(&i__2, &a[j + 1 + j * a_dim1], &c__1, &scale, &sum); + } + } else { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + i__2 = *n - j; + dlassq_(&i__2, &a[j + 1 + j * a_dim1], &c__1, &scale, &sum); /* L120: */ - } - } - sum *= 2; - i__1 = *lda + 1; - dlassq_(n, &a[a_offset], &i__1, &scale, &sum); - value = scale * sqrt(sum); + } + } + sum *= 2; + i__1 = *lda + 1; + dlassq_(n, &a[a_offset], &i__1, &scale, &sum); + value = scale * sqrt(sum); } ret_val = value; @@ -313,5 +313,5 @@ doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer } /* dlansy_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlapy2.cpp b/lib/linalg/dlapy2.cpp index 6a5443d8df..d746e1f56a 100644 --- a/lib/linalg/dlapy2.cpp +++ b/lib/linalg/dlapy2.cpp @@ -1,13 +1,13 @@ /* fortran/dlapy2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -119,25 +119,25 @@ doublereal dlapy2_(doublereal *x, doublereal *y) x_is_nan__ = disnan_(x); y_is_nan__ = disnan_(y); if (x_is_nan__) { - ret_val = *x; + ret_val = *x; } if (y_is_nan__) { - ret_val = *y; + ret_val = *y; } hugeval = dlamch_((char *)"Overflow", (ftnlen)8); if (! (x_is_nan__ || y_is_nan__)) { - xabs = abs(*x); - yabs = abs(*y); - w = max(xabs,yabs); - z__ = min(xabs,yabs); - if (z__ == 0. || w > hugeval) { - ret_val = w; - } else { + xabs = abs(*x); + yabs = abs(*y); + w = max(xabs,yabs); + z__ = min(xabs,yabs); + if (z__ == 0. || w > hugeval) { + ret_val = w; + } else { /* Computing 2nd power */ - d__1 = z__ / w; - ret_val = w * sqrt(d__1 * d__1 + 1.); - } + d__1 = z__ / w; + ret_val = w * sqrt(d__1 * d__1 + 1.); + } } return ret_val; @@ -146,5 +146,5 @@ doublereal dlapy2_(doublereal *x, doublereal *y) } /* dlapy2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlapy3.cpp b/lib/linalg/dlapy3.cpp index 528afbf3d8..211f60dbf6 100644 --- a/lib/linalg/dlapy3.cpp +++ b/lib/linalg/dlapy3.cpp @@ -1,13 +1,13 @@ /* fortran/dlapy3.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -128,15 +128,15 @@ doublereal dlapy3_(doublereal *x, doublereal *y, doublereal *z__) /* W can be zero for max(0,nan,0) */ /* adding all three entries together will make sure */ /* NaN will not disappear. */ - ret_val = xabs + yabs + zabs; + ret_val = xabs + yabs + zabs; } else { /* Computing 2nd power */ - d__1 = xabs / w; + d__1 = xabs / w; /* Computing 2nd power */ - d__2 = yabs / w; + d__2 = yabs / w; /* Computing 2nd power */ - d__3 = zabs / w; - ret_val = w * sqrt(d__1 * d__1 + d__2 * d__2 + d__3 * d__3); + d__3 = zabs / w; + ret_val = w * sqrt(d__1 * d__1 + d__2 * d__2 + d__3 * d__3); } return ret_val; @@ -145,5 +145,5 @@ doublereal dlapy3_(doublereal *x, doublereal *y, doublereal *z__) } /* dlapy3_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlarf.cpp b/lib/linalg/dlarf.cpp index 5534559e63..8111d5fa2f 100644 --- a/lib/linalg/dlarf.cpp +++ b/lib/linalg/dlarf.cpp @@ -1,13 +1,13 @@ /* fortran/dlarf.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -147,8 +147,8 @@ static integer c__1 = 1; /* ===================================================================== */ /* Subroutine */ int dlarf_(char *side, integer *m, integer *n, doublereal *v, - integer *incv, doublereal *tau, doublereal *c__, integer *ldc, - doublereal *work, ftnlen side_len) + integer *incv, doublereal *tau, doublereal *c__, integer *ldc, + doublereal *work, ftnlen side_len) { /* System generated locals */ integer c_dim1, c_offset; @@ -157,16 +157,16 @@ static integer c__1 = 1; /* Local variables */ integer i__; logical applyleft; - extern /* Subroutine */ int dger_(integer *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *); + extern /* Subroutine */ int dger_(integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen); + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen); integer lastc, lastv; - extern integer iladlc_(integer *, integer *, doublereal *, integer *), - iladlr_(integer *, integer *, doublereal *, integer *); + extern integer iladlc_(integer *, integer *, doublereal *, integer *), + iladlr_(integer *, integer *, doublereal *, integer *); /* -- LAPACK auxiliary routine -- */ @@ -204,28 +204,28 @@ static integer c__1 = 1; if (*tau != 0.) { /* Set up variables for scanning V. LASTV begins pointing to the end */ /* of V. */ - if (applyleft) { - lastv = *m; - } else { - lastv = *n; - } - if (*incv > 0) { - i__ = (lastv - 1) * *incv + 1; - } else { - i__ = 1; - } + if (applyleft) { + lastv = *m; + } else { + lastv = *n; + } + if (*incv > 0) { + i__ = (lastv - 1) * *incv + 1; + } else { + i__ = 1; + } /* Look for the last non-zero row in V. */ - while(lastv > 0 && v[i__] == 0.) { - --lastv; - i__ -= *incv; - } - if (applyleft) { + while(lastv > 0 && v[i__] == 0.) { + --lastv; + i__ -= *incv; + } + if (applyleft) { /* Scan for the last non-zero column in C(1:lastv,:). */ - lastc = iladlc_(&lastv, n, &c__[c_offset], ldc); - } else { + lastc = iladlc_(&lastv, n, &c__[c_offset], ldc); + } else { /* Scan for the last non-zero row in C(:,1:lastv). */ - lastc = iladlr_(m, &lastv, &c__[c_offset], ldc); - } + lastc = iladlr_(m, &lastv, &c__[c_offset], ldc); + } } /* Note that lastc.eq.0 renders the BLAS operations null; no special */ /* case is needed at this level. */ @@ -233,36 +233,36 @@ static integer c__1 = 1; /* Form H * C */ - if (lastv > 0) { + if (lastv > 0) { /* w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1) */ - dgemv_((char *)"Transpose", &lastv, &lastc, &c_b4, &c__[c_offset], ldc, & - v[1], incv, &c_b5, &work[1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &lastv, &lastc, &c_b4, &c__[c_offset], ldc, & + v[1], incv, &c_b5, &work[1], &c__1, (ftnlen)9); /* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**T */ - d__1 = -(*tau); - dger_(&lastv, &lastc, &d__1, &v[1], incv, &work[1], &c__1, &c__[ - c_offset], ldc); - } + d__1 = -(*tau); + dger_(&lastv, &lastc, &d__1, &v[1], incv, &work[1], &c__1, &c__[ + c_offset], ldc); + } } else { /* Form C * H */ - if (lastv > 0) { + if (lastv > 0) { /* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */ - dgemv_((char *)"No transpose", &lastc, &lastv, &c_b4, &c__[c_offset], ldc, - &v[1], incv, &c_b5, &work[1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &lastc, &lastv, &c_b4, &c__[c_offset], ldc, + &v[1], incv, &c_b5, &work[1], &c__1, (ftnlen)12); /* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**T */ - d__1 = -(*tau); - dger_(&lastc, &lastv, &d__1, &work[1], &c__1, &v[1], incv, &c__[ - c_offset], ldc); - } + d__1 = -(*tau); + dger_(&lastc, &lastv, &d__1, &work[1], &c__1, &v[1], incv, &c__[ + c_offset], ldc); + } } return 0; @@ -271,5 +271,5 @@ static integer c__1 = 1; } /* dlarf_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlarfb.cpp b/lib/linalg/dlarfb.cpp index df15d11900..d282b19899 100644 --- a/lib/linalg/dlarfb.cpp +++ b/lib/linalg/dlarfb.cpp @@ -1,13 +1,13 @@ /* fortran/dlarfb.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -219,25 +219,25 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dlarfb_(char *side, char *trans, char *direct, char * - storev, integer *m, integer *n, integer *k, doublereal *v, integer * - ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc, - doublereal *work, integer *ldwork, ftnlen side_len, ftnlen trans_len, - ftnlen direct_len, ftnlen storev_len) + storev, integer *m, integer *n, integer *k, doublereal *v, integer * + ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc, + doublereal *work, integer *ldwork, ftnlen side_len, ftnlen trans_len, + ftnlen direct_len, ftnlen storev_len) { /* System generated locals */ - integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, - work_offset, i__1, i__2; + integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, + work_offset, i__1, i__2; /* Local variables */ integer i__, j; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *), dtrmm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *), dtrmm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); char transt[1]; @@ -280,24 +280,24 @@ f"> */ /* Function Body */ if (*m <= 0 || *n <= 0) { - return 0; + return 0; } if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - *(unsigned char *)transt = 'T'; + *(unsigned char *)transt = 'T'; } else { - *(unsigned char *)transt = 'N'; + *(unsigned char *)transt = 'N'; } if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { /* Let V = ( V1 ) (first K rows) */ /* ( V2 ) */ /* where V1 is unit lower triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { /* Form H * C or H**T * C where C = ( C1 ) */ /* ( C2 ) */ @@ -306,67 +306,67 @@ f"> */ /* W := C1**T */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - dcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], - &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], + &c__1); /* L10: */ - } + } /* W := W * V1 */ - dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); - if (*m > *k) { + dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*m > *k) { /* W := W + C2**T * V2 */ - i__1 = *m - *k; - dgemm_((char *)"Transpose", (char *)"No transpose", n, k, &i__1, &c_b14, & - c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + v_dim1], - ldv, &c_b14, &work[work_offset], ldwork, (ftnlen) - 9, (ftnlen)12); - } + i__1 = *m - *k; + dgemm_((char *)"Transpose", (char *)"No transpose", n, k, &i__1, &c_b14, & + c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + v_dim1], + ldv, &c_b14, &work[work_offset], ldwork, (ftnlen) + 9, (ftnlen)12); + } /* W := W * T**T or W * T */ - dtrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + dtrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - V * W**T */ - if (*m > *k) { + if (*m > *k) { /* C2 := C2 - V2 * W**T */ - i__1 = *m - *k; - dgemm_((char *)"No transpose", (char *)"Transpose", &i__1, n, k, &c_b25, & - v[*k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc, ( - ftnlen)12, (ftnlen)9); - } + i__1 = *m - *k; + dgemm_((char *)"No transpose", (char *)"Transpose", &i__1, n, k, &c_b25, & + v[*k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc, ( + ftnlen)12, (ftnlen)9); + } /* W := W * V1**T */ - dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & - v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) - 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & + v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) + 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); /* C1 := C1 - W**T */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; /* L20: */ - } + } /* L30: */ - } + } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { /* Form C * H or C * H**T where C = ( C1 C2 ) */ @@ -374,74 +374,74 @@ f"> */ /* W := C1 */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - dcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * - work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * + work_dim1 + 1], &c__1); /* L40: */ - } + } /* W := W * V1 */ - dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); - if (*n > *k) { + dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*n > *k) { /* W := W + C2 * V2 */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, & - c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + - 1 + v_dim1], ldv, &c_b14, &work[work_offset], - ldwork, (ftnlen)12, (ftnlen)12); - } + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, & + c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + + 1 + v_dim1], ldv, &c_b14, &work[work_offset], + ldwork, (ftnlen)12, (ftnlen)12); + } /* W := W * T or W * T**T */ - dtrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + dtrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - W * V**T */ - if (*n > *k) { + if (*n > *k) { /* C2 := C2 - W * V2**T */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"Transpose", m, &i__1, k, &c_b25, & - work[work_offset], ldwork, &v[*k + 1 + v_dim1], - ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, ( - ftnlen)12, (ftnlen)9); - } + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"Transpose", m, &i__1, k, &c_b25, & + work[work_offset], ldwork, &v[*k + 1 + v_dim1], + ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, ( + ftnlen)12, (ftnlen)9); + } /* W := W * V1**T */ - dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & - v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) - 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & + v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) + 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); /* C1 := C1 - W */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; /* L50: */ - } + } /* L60: */ - } - } + } + } - } else { + } else { /* Let V = ( V1 ) */ /* ( V2 ) (last K rows) */ /* where V2 is unit upper triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { /* Form H * C or H**T * C where C = ( C1 ) */ /* ( C2 ) */ @@ -450,67 +450,67 @@ f"> */ /* W := C2**T */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - dcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * - work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * + work_dim1 + 1], &c__1); /* L70: */ - } + } /* W := W * V2 */ - dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, - &v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); - if (*m > *k) { + dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, + &v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*m > *k) { /* W := W + C1**T * V1 */ - i__1 = *m - *k; - dgemm_((char *)"Transpose", (char *)"No transpose", n, k, &i__1, &c_b14, & - c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & - work[work_offset], ldwork, (ftnlen)9, (ftnlen)12); - } + i__1 = *m - *k; + dgemm_((char *)"Transpose", (char *)"No transpose", n, k, &i__1, &c_b14, & + c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & + work[work_offset], ldwork, (ftnlen)9, (ftnlen)12); + } /* W := W * T**T or W * T */ - dtrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + dtrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - V * W**T */ - if (*m > *k) { + if (*m > *k) { /* C1 := C1 - V1 * W**T */ - i__1 = *m - *k; - dgemm_((char *)"No transpose", (char *)"Transpose", &i__1, n, k, &c_b25, & - v[v_offset], ldv, &work[work_offset], ldwork, & - c_b14, &c__[c_offset], ldc, (ftnlen)12, (ftnlen)9) - ; - } + i__1 = *m - *k; + dgemm_((char *)"No transpose", (char *)"Transpose", &i__1, n, k, &c_b25, & + v[v_offset], ldv, &work[work_offset], ldwork, & + c_b14, &c__[c_offset], ldc, (ftnlen)12, (ftnlen)9) + ; + } /* W := W * V2**T */ - dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & - v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & + v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); /* C2 := C2 - W**T */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[*m - *k + j + i__ * c_dim1] -= work[i__ + j * - work_dim1]; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[*m - *k + j + i__ * c_dim1] -= work[i__ + j * + work_dim1]; /* L80: */ - } + } /* L90: */ - } + } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { /* Form C * H or C * H**T where C = ( C1 C2 ) */ @@ -518,77 +518,77 @@ f"> */ /* W := C2 */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - dcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ - j * work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ + j * work_dim1 + 1], &c__1); /* L100: */ - } + } /* W := W * V2 */ - dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, - &v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); - if (*n > *k) { + dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, + &v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*n > *k) { /* W := W + C1 * V1 */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, & - c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, & - c_b14, &work[work_offset], ldwork, (ftnlen)12, ( - ftnlen)12); - } + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, & + c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, & + c_b14, &work[work_offset], ldwork, (ftnlen)12, ( + ftnlen)12); + } /* W := W * T or W * T**T */ - dtrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + dtrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - W * V**T */ - if (*n > *k) { + if (*n > *k) { /* C1 := C1 - W * V1**T */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"Transpose", m, &i__1, k, &c_b25, & - work[work_offset], ldwork, &v[v_offset], ldv, & - c_b14, &c__[c_offset], ldc, (ftnlen)12, (ftnlen)9) - ; - } + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"Transpose", m, &i__1, k, &c_b25, & + work[work_offset], ldwork, &v[v_offset], ldv, & + c_b14, &c__[c_offset], ldc, (ftnlen)12, (ftnlen)9) + ; + } /* W := W * V2**T */ - dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & - v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & + v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); /* C2 := C2 - W */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + (*n - *k + j) * c_dim1] -= work[i__ + j * - work_dim1]; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + (*n - *k + j) * c_dim1] -= work[i__ + j * + work_dim1]; /* L110: */ - } + } /* L120: */ - } - } - } + } + } + } } else if (lsame_(storev, (char *)"R", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { /* Let V = ( V1 V2 ) (V1: first K columns) */ /* where V1 is unit upper triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { /* Form H * C or H**T * C where C = ( C1 ) */ /* ( C2 ) */ @@ -597,67 +597,67 @@ f"> */ /* W := C1**T */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - dcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], - &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], + &c__1); /* L130: */ - } + } /* W := W * V1**T */ - dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & - v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) - 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); - if (*m > *k) { + dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & + v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) + 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + if (*m > *k) { /* W := W + C2**T * V2**T */ - i__1 = *m - *k; - dgemm_((char *)"Transpose", (char *)"Transpose", n, k, &i__1, &c_b14, & - c__[*k + 1 + c_dim1], ldc, &v[(*k + 1) * v_dim1 + - 1], ldv, &c_b14, &work[work_offset], ldwork, ( - ftnlen)9, (ftnlen)9); - } + i__1 = *m - *k; + dgemm_((char *)"Transpose", (char *)"Transpose", n, k, &i__1, &c_b14, & + c__[*k + 1 + c_dim1], ldc, &v[(*k + 1) * v_dim1 + + 1], ldv, &c_b14, &work[work_offset], ldwork, ( + ftnlen)9, (ftnlen)9); + } /* W := W * T**T or W * T */ - dtrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + dtrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - V**T * W**T */ - if (*m > *k) { + if (*m > *k) { /* C2 := C2 - V2**T * W**T */ - i__1 = *m - *k; - dgemm_((char *)"Transpose", (char *)"Transpose", &i__1, n, k, &c_b25, &v[( - *k + 1) * v_dim1 + 1], ldv, &work[work_offset], - ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc, ( - ftnlen)9, (ftnlen)9); - } + i__1 = *m - *k; + dgemm_((char *)"Transpose", (char *)"Transpose", &i__1, n, k, &c_b25, &v[( + *k + 1) * v_dim1 + 1], ldv, &work[work_offset], + ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc, ( + ftnlen)9, (ftnlen)9); + } /* W := W * V1 */ - dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); /* C1 := C1 - W**T */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; /* L140: */ - } + } /* L150: */ - } + } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { /* Form C * H or C * H**T where C = ( C1 C2 ) */ @@ -665,74 +665,74 @@ f"> */ /* W := C1 */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - dcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * - work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * + work_dim1 + 1], &c__1); /* L160: */ - } + } /* W := W * V1**T */ - dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & - v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) - 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); - if (*n > *k) { + dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & + v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) + 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + if (*n > *k) { /* W := W + C2 * V2**T */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"Transpose", m, k, &i__1, &c_b14, & - c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + 1) * - v_dim1 + 1], ldv, &c_b14, &work[work_offset], - ldwork, (ftnlen)12, (ftnlen)9); - } + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"Transpose", m, k, &i__1, &c_b14, & + c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + 1) * + v_dim1 + 1], ldv, &c_b14, &work[work_offset], + ldwork, (ftnlen)12, (ftnlen)9); + } /* W := W * T or W * T**T */ - dtrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + dtrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - W * V */ - if (*n > *k) { + if (*n > *k) { /* C2 := C2 - W * V2 */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, & - c_b25, &work[work_offset], ldwork, &v[(*k + 1) * - v_dim1 + 1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 - + 1], ldc, (ftnlen)12, (ftnlen)12); - } + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, & + c_b25, &work[work_offset], ldwork, &v[(*k + 1) * + v_dim1 + 1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 + + 1], ldc, (ftnlen)12, (ftnlen)12); + } /* W := W * V1 */ - dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); /* C1 := C1 - W */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; /* L170: */ - } + } /* L180: */ - } + } - } + } - } else { + } else { /* Let V = ( V1 V2 ) (V2: last K columns) */ /* where V2 is unit lower triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { /* Form H * C or H**T * C where C = ( C1 ) */ /* ( C2 ) */ @@ -741,67 +741,67 @@ f"> */ /* W := C2**T */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - dcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * - work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * + work_dim1 + 1], &c__1); /* L190: */ - } + } /* W := W * V2**T */ - dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & - v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[work_offset] - , ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); - if (*m > *k) { + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & + v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[work_offset] + , ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + if (*m > *k) { /* W := W + C1**T * V1**T */ - i__1 = *m - *k; - dgemm_((char *)"Transpose", (char *)"Transpose", n, k, &i__1, &c_b14, & - c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & - work[work_offset], ldwork, (ftnlen)9, (ftnlen)9); - } + i__1 = *m - *k; + dgemm_((char *)"Transpose", (char *)"Transpose", n, k, &i__1, &c_b14, & + c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & + work[work_offset], ldwork, (ftnlen)9, (ftnlen)9); + } /* W := W * T**T or W * T */ - dtrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + dtrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - V**T * W**T */ - if (*m > *k) { + if (*m > *k) { /* C1 := C1 - V1**T * W**T */ - i__1 = *m - *k; - dgemm_((char *)"Transpose", (char *)"Transpose", &i__1, n, k, &c_b25, &v[ - v_offset], ldv, &work[work_offset], ldwork, & - c_b14, &c__[c_offset], ldc, (ftnlen)9, (ftnlen)9); - } + i__1 = *m - *k; + dgemm_((char *)"Transpose", (char *)"Transpose", &i__1, n, k, &c_b25, &v[ + v_offset], ldv, &work[work_offset], ldwork, & + c_b14, &c__[c_offset], ldc, (ftnlen)9, (ftnlen)9); + } /* W := W * V2 */ - dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, - &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 12, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, + &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 12, (ftnlen)4); /* C2 := C2 - W**T */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[*m - *k + j + i__ * c_dim1] -= work[i__ + j * - work_dim1]; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[*m - *k + j + i__ * c_dim1] -= work[i__ + j * + work_dim1]; /* L200: */ - } + } /* L210: */ - } + } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { /* Form C * H or C * H' where C = ( C1 C2 ) */ @@ -809,70 +809,70 @@ f"> */ /* W := C2 */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - dcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ - j * work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + dcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ + j * work_dim1 + 1], &c__1); /* L220: */ - } + } /* W := W * V2**T */ - dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & - v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[work_offset] - , ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); - if (*n > *k) { + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & + v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[work_offset] + , ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + if (*n > *k) { /* W := W + C1 * V1**T */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"Transpose", m, k, &i__1, &c_b14, & - c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & - work[work_offset], ldwork, (ftnlen)12, (ftnlen)9); - } + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"Transpose", m, k, &i__1, &c_b14, & + c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & + work[work_offset], ldwork, (ftnlen)12, (ftnlen)9); + } /* W := W * T or W * T**T */ - dtrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + dtrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b14, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - W * V */ - if (*n > *k) { + if (*n > *k) { /* C1 := C1 - W * V1 */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, & - c_b25, &work[work_offset], ldwork, &v[v_offset], - ldv, &c_b14, &c__[c_offset], ldc, (ftnlen)12, ( - ftnlen)12); - } + i__1 = *n - *k; + dgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, & + c_b25, &work[work_offset], ldwork, &v[v_offset], + ldv, &c_b14, &c__[c_offset], ldc, (ftnlen)12, ( + ftnlen)12); + } /* W := W * V2 */ - dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, - &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 12, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, + &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 12, (ftnlen)4); /* C1 := C1 - W */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + (*n - *k + j) * c_dim1] -= work[i__ + j * - work_dim1]; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + (*n - *k + j) * c_dim1] -= work[i__ + j * + work_dim1]; /* L230: */ - } + } /* L240: */ - } + } - } + } - } + } } return 0; @@ -882,5 +882,5 @@ f"> */ } /* dlarfb_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlarfg.cpp b/lib/linalg/dlarfg.cpp index cb544ccf18..6693e1edb6 100644 --- a/lib/linalg/dlarfg.cpp +++ b/lib/linalg/dlarfg.cpp @@ -1,13 +1,13 @@ /* fortran/dlarfg.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -122,8 +122,8 @@ f"> */ /* > \ingroup doubleOTHERauxiliary */ /* ===================================================================== */ -/* Subroutine */ int dlarfg_(integer *n, doublereal *alpha, doublereal *x, - integer *incx, doublereal *tau) +/* Subroutine */ int dlarfg_(integer *n, doublereal *alpha, doublereal *x, + integer *incx, doublereal *tau) { /* System generated locals */ integer i__1; @@ -136,11 +136,11 @@ f"> */ integer j, knt; doublereal beta; extern doublereal dnrm2_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); doublereal xnorm; - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); doublereal safmin, rsafmn; @@ -172,8 +172,8 @@ f"> */ /* Function Body */ if (*n <= 1) { - *tau = 0.; - return 0; + *tau = 0.; + return 0; } i__1 = *n - 1; @@ -183,50 +183,50 @@ f"> */ /* H = I */ - *tau = 0.; + *tau = 0.; } else { /* general case */ - d__1 = dlapy2_(alpha, &xnorm); - beta = -d_sign(&d__1, alpha); - safmin = dlamch_((char *)"S", (ftnlen)1) / dlamch_((char *)"E", (ftnlen)1); - knt = 0; - if (abs(beta) < safmin) { + d__1 = dlapy2_(alpha, &xnorm); + beta = -d_sign(&d__1, alpha); + safmin = dlamch_((char *)"S", (ftnlen)1) / dlamch_((char *)"E", (ftnlen)1); + knt = 0; + if (abs(beta) < safmin) { /* XNORM, BETA may be inaccurate; scale X and recompute them */ - rsafmn = 1. / safmin; + rsafmn = 1. / safmin; L10: - ++knt; - i__1 = *n - 1; - dscal_(&i__1, &rsafmn, &x[1], incx); - beta *= rsafmn; - *alpha *= rsafmn; - if (abs(beta) < safmin && knt < 20) { - goto L10; - } + ++knt; + i__1 = *n - 1; + dscal_(&i__1, &rsafmn, &x[1], incx); + beta *= rsafmn; + *alpha *= rsafmn; + if (abs(beta) < safmin && knt < 20) { + goto L10; + } /* New BETA is at most 1, at least SAFMIN */ - i__1 = *n - 1; - xnorm = dnrm2_(&i__1, &x[1], incx); - d__1 = dlapy2_(alpha, &xnorm); - beta = -d_sign(&d__1, alpha); - } - *tau = (beta - *alpha) / beta; - i__1 = *n - 1; - d__1 = 1. / (*alpha - beta); - dscal_(&i__1, &d__1, &x[1], incx); + i__1 = *n - 1; + xnorm = dnrm2_(&i__1, &x[1], incx); + d__1 = dlapy2_(alpha, &xnorm); + beta = -d_sign(&d__1, alpha); + } + *tau = (beta - *alpha) / beta; + i__1 = *n - 1; + d__1 = 1. / (*alpha - beta); + dscal_(&i__1, &d__1, &x[1], incx); /* If ALPHA is subnormal, it may lose relative accuracy */ - i__1 = knt; - for (j = 1; j <= i__1; ++j) { - beta *= safmin; + i__1 = knt; + for (j = 1; j <= i__1; ++j) { + beta *= safmin; /* L20: */ - } - *alpha = beta; + } + *alpha = beta; } return 0; @@ -236,5 +236,5 @@ L10: } /* dlarfg_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlarft.cpp b/lib/linalg/dlarft.cpp index 220c9f0082..bd0874fa3c 100644 --- a/lib/linalg/dlarft.cpp +++ b/lib/linalg/dlarft.cpp @@ -1,13 +1,13 @@ /* static/dlarft.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -185,8 +185,8 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dlarft_(char *direct, char *storev, integer *n, integer * - k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, - integer *ldt, ftnlen direct_len, ftnlen storev_len) + k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, + integer *ldt, ftnlen direct_len, ftnlen storev_len) { /* System generated locals */ integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3; @@ -195,13 +195,13 @@ f"> */ /* Local variables */ integer i__, j, prevlastv; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen); + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen); integer lastv; - extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen); + extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen); /* -- LAPACK auxiliary routine -- */ @@ -238,173 +238,173 @@ f"> */ /* Function Body */ if (*n == 0) { - return 0; + return 0; } if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - prevlastv = *n; - i__1 = *k; - for (i__ = 1; i__ <= i__1; ++i__) { - prevlastv = max(i__,prevlastv); - if (tau[i__] == 0.) { + prevlastv = *n; + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + prevlastv = max(i__,prevlastv); + if (tau[i__] == 0.) { /* H(i) = I */ - i__2 = i__; - for (j = 1; j <= i__2; ++j) { - t[j + i__ * t_dim1] = 0.; - } - } else { + i__2 = i__; + for (j = 1; j <= i__2; ++j) { + t[j + i__ * t_dim1] = 0.; + } + } else { /* general case */ - if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { + if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { /* Skip any trailing zeros. */ - i__2 = i__ + 1; - for (lastv = *n; lastv >= i__2; --lastv) { - if (v[lastv + i__ * v_dim1] != 0.) { - goto L219; - } - } + i__2 = i__ + 1; + for (lastv = *n; lastv >= i__2; --lastv) { + if (v[lastv + i__ * v_dim1] != 0.) { + goto L219; + } + } L219: - i__2 = i__ - 1; - for (j = 1; j <= i__2; ++j) { - t[j + i__ * t_dim1] = -tau[i__] * v[i__ + j * v_dim1]; - } - j = min(lastv,prevlastv); + i__2 = i__ - 1; + for (j = 1; j <= i__2; ++j) { + t[j + i__ * t_dim1] = -tau[i__] * v[i__ + j * v_dim1]; + } + j = min(lastv,prevlastv); /* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i) */ - i__2 = j - i__; - i__3 = i__ - 1; - d__1 = -tau[i__]; - dgemv_((char *)"Transpose", &i__2, &i__3, &d__1, &v[i__ + 1 + - v_dim1], ldv, &v[i__ + 1 + i__ * v_dim1], &c__1, & - c_b7, &t[i__ * t_dim1 + 1], &c__1, (ftnlen)9); - } else { + i__2 = j - i__; + i__3 = i__ - 1; + d__1 = -tau[i__]; + dgemv_((char *)"Transpose", &i__2, &i__3, &d__1, &v[i__ + 1 + + v_dim1], ldv, &v[i__ + 1 + i__ * v_dim1], &c__1, & + c_b7, &t[i__ * t_dim1 + 1], &c__1, (ftnlen)9); + } else { /* Skip any trailing zeros. */ - i__2 = i__ + 1; - for (lastv = *n; lastv >= i__2; --lastv) { - if (v[i__ + lastv * v_dim1] != 0.) { - goto L235; - } - } + i__2 = i__ + 1; + for (lastv = *n; lastv >= i__2; --lastv) { + if (v[i__ + lastv * v_dim1] != 0.) { + goto L235; + } + } L235: - i__2 = i__ - 1; - for (j = 1; j <= i__2; ++j) { - t[j + i__ * t_dim1] = -tau[i__] * v[j + i__ * v_dim1]; - } - j = min(lastv,prevlastv); + i__2 = i__ - 1; + for (j = 1; j <= i__2; ++j) { + t[j + i__ * t_dim1] = -tau[i__] * v[j + i__ * v_dim1]; + } + j = min(lastv,prevlastv); /* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T */ - i__2 = i__ - 1; - i__3 = j - i__; - d__1 = -tau[i__]; - dgemv_((char *)"No transpose", &i__2, &i__3, &d__1, &v[(i__ + 1) * - v_dim1 + 1], ldv, &v[i__ + (i__ + 1) * v_dim1], - ldv, &c_b7, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) - 12); - } + i__2 = i__ - 1; + i__3 = j - i__; + d__1 = -tau[i__]; + dgemv_((char *)"No transpose", &i__2, &i__3, &d__1, &v[(i__ + 1) * + v_dim1 + 1], ldv, &v[i__ + (i__ + 1) * v_dim1], + ldv, &c_b7, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) + 12); + } /* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */ - i__2 = i__ - 1; - dtrmv_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", &i__2, &t[ - t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) - 5, (ftnlen)12, (ftnlen)8); - t[i__ + i__ * t_dim1] = tau[i__]; - if (i__ > 1) { - prevlastv = max(prevlastv,lastv); - } else { - prevlastv = lastv; - } - } - } + i__2 = i__ - 1; + dtrmv_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", &i__2, &t[ + t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) + 5, (ftnlen)12, (ftnlen)8); + t[i__ + i__ * t_dim1] = tau[i__]; + if (i__ > 1) { + prevlastv = max(prevlastv,lastv); + } else { + prevlastv = lastv; + } + } + } } else { - prevlastv = 1; - for (i__ = *k; i__ >= 1; --i__) { - if (tau[i__] == 0.) { + prevlastv = 1; + for (i__ = *k; i__ >= 1; --i__) { + if (tau[i__] == 0.) { /* H(i) = I */ - i__1 = *k; - for (j = i__; j <= i__1; ++j) { - t[j + i__ * t_dim1] = 0.; - } - } else { + i__1 = *k; + for (j = i__; j <= i__1; ++j) { + t[j + i__ * t_dim1] = 0.; + } + } else { /* general case */ - if (i__ < *k) { - if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { + if (i__ < *k) { + if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { /* Skip any leading zeros. */ - i__1 = i__ - 1; - for (lastv = 1; lastv <= i__1; ++lastv) { - if (v[lastv + i__ * v_dim1] != 0.) { - goto L280; - } - } + i__1 = i__ - 1; + for (lastv = 1; lastv <= i__1; ++lastv) { + if (v[lastv + i__ * v_dim1] != 0.) { + goto L280; + } + } L280: - i__1 = *k; - for (j = i__ + 1; j <= i__1; ++j) { - t[j + i__ * t_dim1] = -tau[i__] * v[*n - *k + i__ - + j * v_dim1]; - } - j = max(lastv,prevlastv); + i__1 = *k; + for (j = i__ + 1; j <= i__1; ++j) { + t[j + i__ * t_dim1] = -tau[i__] * v[*n - *k + i__ + + j * v_dim1]; + } + j = max(lastv,prevlastv); /* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i) */ - i__1 = *n - *k + i__ - j; - i__2 = *k - i__; - d__1 = -tau[i__]; - dgemv_((char *)"Transpose", &i__1, &i__2, &d__1, &v[j + (i__ - + 1) * v_dim1], ldv, &v[j + i__ * v_dim1], & - c__1, &c_b7, &t[i__ + 1 + i__ * t_dim1], & - c__1, (ftnlen)9); - } else { + i__1 = *n - *k + i__ - j; + i__2 = *k - i__; + d__1 = -tau[i__]; + dgemv_((char *)"Transpose", &i__1, &i__2, &d__1, &v[j + (i__ + + 1) * v_dim1], ldv, &v[j + i__ * v_dim1], & + c__1, &c_b7, &t[i__ + 1 + i__ * t_dim1], & + c__1, (ftnlen)9); + } else { /* Skip any leading zeros. */ - i__1 = i__ - 1; - for (lastv = 1; lastv <= i__1; ++lastv) { - if (v[i__ + lastv * v_dim1] != 0.) { - goto L296; - } - } + i__1 = i__ - 1; + for (lastv = 1; lastv <= i__1; ++lastv) { + if (v[i__ + lastv * v_dim1] != 0.) { + goto L296; + } + } L296: - i__1 = *k; - for (j = i__ + 1; j <= i__1; ++j) { - t[j + i__ * t_dim1] = -tau[i__] * v[j + (*n - *k - + i__) * v_dim1]; - } - j = max(lastv,prevlastv); + i__1 = *k; + for (j = i__ + 1; j <= i__1; ++j) { + t[j + i__ * t_dim1] = -tau[i__] * v[j + (*n - *k + + i__) * v_dim1]; + } + j = max(lastv,prevlastv); /* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T */ - i__1 = *k - i__; - i__2 = *n - *k + i__ - j; - d__1 = -tau[i__]; - dgemv_((char *)"No transpose", &i__1, &i__2, &d__1, &v[i__ + - 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], - ldv, &c_b7, &t[i__ + 1 + i__ * t_dim1], &c__1, - (ftnlen)12); - } + i__1 = *k - i__; + i__2 = *n - *k + i__ - j; + d__1 = -tau[i__]; + dgemv_((char *)"No transpose", &i__1, &i__2, &d__1, &v[i__ + + 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], + ldv, &c_b7, &t[i__ + 1 + i__ * t_dim1], &c__1, + (ftnlen)12); + } /* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */ - i__1 = *k - i__; - dtrmv_((char *)"Lower", (char *)"No transpose", (char *)"Non-unit", &i__1, &t[i__ - + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * - t_dim1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)8) - ; - if (i__ > 1) { - prevlastv = min(prevlastv,lastv); - } else { - prevlastv = lastv; - } - } - t[i__ + i__ * t_dim1] = tau[i__]; - } - } + i__1 = *k - i__; + dtrmv_((char *)"Lower", (char *)"No transpose", (char *)"Non-unit", &i__1, &t[i__ + + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * + t_dim1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)8) + ; + if (i__ > 1) { + prevlastv = min(prevlastv,lastv); + } else { + prevlastv = lastv; + } + } + t[i__ + i__ * t_dim1] = tau[i__]; + } + } } return 0; @@ -413,5 +413,5 @@ L296: } /* dlarft_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlartg.cpp b/lib/linalg/dlartg.cpp index 118d7865f6..3f5832318e 100644 --- a/lib/linalg/dlartg.cpp +++ b/lib/linalg/dlartg.cpp @@ -1,13 +1,13 @@ /* fortran/dlartg.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -115,8 +115,8 @@ f"> */ /* > \ingroup OTHERauxiliary */ /* ===================================================================== */ -/* Subroutine */ int dlartg_(doublereal *f, doublereal *g, doublereal *cs, - doublereal *sn, doublereal *r__) +/* Subroutine */ int dlartg_(doublereal *f, doublereal *g, doublereal *cs, + doublereal *sn, doublereal *r__) { /* System generated locals */ integer i__1; @@ -171,81 +171,81 @@ f"> */ /* FIRST = .FALSE. */ /* END IF */ if (*g == 0.) { - *cs = 1.; - *sn = 0.; - *r__ = *f; + *cs = 1.; + *sn = 0.; + *r__ = *f; } else if (*f == 0.) { - *cs = 0.; - *sn = 1.; - *r__ = *g; + *cs = 0.; + *sn = 1.; + *r__ = *g; } else { - f1 = *f; - g1 = *g; + f1 = *f; + g1 = *g; /* Computing MAX */ - d__1 = abs(f1), d__2 = abs(g1); - scale = max(d__1,d__2); - if (scale >= safmx2) { - count = 0; + d__1 = abs(f1), d__2 = abs(g1); + scale = max(d__1,d__2); + if (scale >= safmx2) { + count = 0; L10: - ++count; - f1 *= safmn2; - g1 *= safmn2; + ++count; + f1 *= safmn2; + g1 *= safmn2; /* Computing MAX */ - d__1 = abs(f1), d__2 = abs(g1); - scale = max(d__1,d__2); - if (scale >= safmx2) { - goto L10; - } + d__1 = abs(f1), d__2 = abs(g1); + scale = max(d__1,d__2); + if (scale >= safmx2) { + goto L10; + } /* Computing 2nd power */ - d__1 = f1; + d__1 = f1; /* Computing 2nd power */ - d__2 = g1; - *r__ = sqrt(d__1 * d__1 + d__2 * d__2); - *cs = f1 / *r__; - *sn = g1 / *r__; - i__1 = count; - for (i__ = 1; i__ <= i__1; ++i__) { - *r__ *= safmx2; + d__2 = g1; + *r__ = sqrt(d__1 * d__1 + d__2 * d__2); + *cs = f1 / *r__; + *sn = g1 / *r__; + i__1 = count; + for (i__ = 1; i__ <= i__1; ++i__) { + *r__ *= safmx2; /* L20: */ - } - } else if (scale <= safmn2) { - count = 0; + } + } else if (scale <= safmn2) { + count = 0; L30: - ++count; - f1 *= safmx2; - g1 *= safmx2; + ++count; + f1 *= safmx2; + g1 *= safmx2; /* Computing MAX */ - d__1 = abs(f1), d__2 = abs(g1); - scale = max(d__1,d__2); - if (scale <= safmn2) { - goto L30; - } + d__1 = abs(f1), d__2 = abs(g1); + scale = max(d__1,d__2); + if (scale <= safmn2) { + goto L30; + } /* Computing 2nd power */ - d__1 = f1; + d__1 = f1; /* Computing 2nd power */ - d__2 = g1; - *r__ = sqrt(d__1 * d__1 + d__2 * d__2); - *cs = f1 / *r__; - *sn = g1 / *r__; - i__1 = count; - for (i__ = 1; i__ <= i__1; ++i__) { - *r__ *= safmn2; + d__2 = g1; + *r__ = sqrt(d__1 * d__1 + d__2 * d__2); + *cs = f1 / *r__; + *sn = g1 / *r__; + i__1 = count; + for (i__ = 1; i__ <= i__1; ++i__) { + *r__ *= safmn2; /* L40: */ - } - } else { + } + } else { /* Computing 2nd power */ - d__1 = f1; + d__1 = f1; /* Computing 2nd power */ - d__2 = g1; - *r__ = sqrt(d__1 * d__1 + d__2 * d__2); - *cs = f1 / *r__; - *sn = g1 / *r__; - } - if (abs(*f) > abs(*g) && *cs < 0.) { - *cs = -(*cs); - *sn = -(*sn); - *r__ = -(*r__); - } + d__2 = g1; + *r__ = sqrt(d__1 * d__1 + d__2 * d__2); + *cs = f1 / *r__; + *sn = g1 / *r__; + } + if (abs(*f) > abs(*g) && *cs < 0.) { + *cs = -(*cs); + *sn = -(*sn); + *r__ = -(*r__); + } } return 0; @@ -254,5 +254,5 @@ L30: } /* dlartg_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlas2.cpp b/lib/linalg/dlas2.cpp index e3a53a9bac..c590ed5819 100644 --- a/lib/linalg/dlas2.cpp +++ b/lib/linalg/dlas2.cpp @@ -1,13 +1,13 @@ /* fortran/dlas2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -123,8 +123,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlas2_(doublereal *f, doublereal *g, doublereal *h__, - doublereal *ssmin, doublereal *ssmax) +/* Subroutine */ int dlas2_(doublereal *f, doublereal *g, doublereal *h__, + doublereal *ssmin, doublereal *ssmax) { /* System generated locals */ doublereal d__1, d__2; @@ -159,47 +159,47 @@ extern "C" { fhmn = min(fa,ha); fhmx = max(fa,ha); if (fhmn == 0.) { - *ssmin = 0.; - if (fhmx == 0.) { - *ssmax = ga; - } else { + *ssmin = 0.; + if (fhmx == 0.) { + *ssmax = ga; + } else { /* Computing 2nd power */ - d__1 = min(fhmx,ga) / max(fhmx,ga); - *ssmax = max(fhmx,ga) * sqrt(d__1 * d__1 + 1.); - } + d__1 = min(fhmx,ga) / max(fhmx,ga); + *ssmax = max(fhmx,ga) * sqrt(d__1 * d__1 + 1.); + } } else { - if (ga < fhmx) { - as = fhmn / fhmx + 1.; - at = (fhmx - fhmn) / fhmx; + if (ga < fhmx) { + as = fhmn / fhmx + 1.; + at = (fhmx - fhmn) / fhmx; /* Computing 2nd power */ - d__1 = ga / fhmx; - au = d__1 * d__1; - c__ = 2. / (sqrt(as * as + au) + sqrt(at * at + au)); - *ssmin = fhmn * c__; - *ssmax = fhmx / c__; - } else { - au = fhmx / ga; - if (au == 0.) { + d__1 = ga / fhmx; + au = d__1 * d__1; + c__ = 2. / (sqrt(as * as + au) + sqrt(at * at + au)); + *ssmin = fhmn * c__; + *ssmax = fhmx / c__; + } else { + au = fhmx / ga; + if (au == 0.) { /* Avoid possible harmful underflow if exponent range */ /* asymmetric (true SSMIN may not underflow even if */ /* AU underflows) */ - *ssmin = fhmn * fhmx / ga; - *ssmax = ga; - } else { - as = fhmn / fhmx + 1.; - at = (fhmx - fhmn) / fhmx; + *ssmin = fhmn * fhmx / ga; + *ssmax = ga; + } else { + as = fhmn / fhmx + 1.; + at = (fhmx - fhmn) / fhmx; /* Computing 2nd power */ - d__1 = as * au; + d__1 = as * au; /* Computing 2nd power */ - d__2 = at * au; - c__ = 1. / (sqrt(d__1 * d__1 + 1.) + sqrt(d__2 * d__2 + 1.)); - *ssmin = fhmn * c__ * au; - *ssmin += *ssmin; - *ssmax = ga / (c__ + c__); - } - } + d__2 = at * au; + c__ = 1. / (sqrt(d__1 * d__1 + 1.) + sqrt(d__2 * d__2 + 1.)); + *ssmin = fhmn * c__ * au; + *ssmin += *ssmin; + *ssmax = ga / (c__ + c__); + } + } } return 0; @@ -208,5 +208,5 @@ extern "C" { } /* dlas2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlascl.cpp b/lib/linalg/dlascl.cpp index 932e1c63cb..7596a5c109 100644 --- a/lib/linalg/dlascl.cpp +++ b/lib/linalg/dlascl.cpp @@ -1,13 +1,13 @@ /* fortran/dlascl.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -159,9 +159,9 @@ f"> */ /* > \ingroup OTHERauxiliary */ /* ===================================================================== */ -/* Subroutine */ int dlascl_(char *type__, integer *kl, integer *ku, - doublereal *cfrom, doublereal *cto, integer *m, integer *n, - doublereal *a, integer *lda, integer *info, ftnlen type_len) +/* Subroutine */ int dlascl_(char *type__, integer *kl, integer *ku, + doublereal *cfrom, doublereal *cto, integer *m, integer *n, + doublereal *a, integer *lda, integer *info, ftnlen type_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; @@ -215,63 +215,63 @@ f"> */ *info = 0; if (lsame_(type__, (char *)"G", (ftnlen)1, (ftnlen)1)) { - itype = 0; + itype = 0; } else if (lsame_(type__, (char *)"L", (ftnlen)1, (ftnlen)1)) { - itype = 1; + itype = 1; } else if (lsame_(type__, (char *)"U", (ftnlen)1, (ftnlen)1)) { - itype = 2; + itype = 2; } else if (lsame_(type__, (char *)"H", (ftnlen)1, (ftnlen)1)) { - itype = 3; + itype = 3; } else if (lsame_(type__, (char *)"B", (ftnlen)1, (ftnlen)1)) { - itype = 4; + itype = 4; } else if (lsame_(type__, (char *)"Q", (ftnlen)1, (ftnlen)1)) { - itype = 5; + itype = 5; } else if (lsame_(type__, (char *)"Z", (ftnlen)1, (ftnlen)1)) { - itype = 6; + itype = 6; } else { - itype = -1; + itype = -1; } if (itype == -1) { - *info = -1; + *info = -1; } else if (*cfrom == 0. || disnan_(cfrom)) { - *info = -4; + *info = -4; } else if (disnan_(cto)) { - *info = -5; + *info = -5; } else if (*m < 0) { - *info = -6; + *info = -6; } else if (*n < 0 || itype == 4 && *n != *m || itype == 5 && *n != *m) { - *info = -7; + *info = -7; } else if (itype <= 3 && *lda < max(1,*m)) { - *info = -9; + *info = -9; } else if (itype >= 4) { /* Computing MAX */ - i__1 = *m - 1; - if (*kl < 0 || *kl > max(i__1,0)) { - *info = -2; - } else /* if(complicated condition) */ { + i__1 = *m - 1; + if (*kl < 0 || *kl > max(i__1,0)) { + *info = -2; + } else /* if(complicated condition) */ { /* Computing MAX */ - i__1 = *n - 1; - if (*ku < 0 || *ku > max(i__1,0) || (itype == 4 || itype == 5) && - *kl != *ku) { - *info = -3; - } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < * - ku + 1 || itype == 6 && *lda < (*kl << 1) + *ku + 1) { - *info = -9; - } - } + i__1 = *n - 1; + if (*ku < 0 || *ku > max(i__1,0) || (itype == 4 || itype == 5) && + *kl != *ku) { + *info = -3; + } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < * + ku + 1 || itype == 6 && *lda < (*kl << 1) + *ku + 1) { + *info = -9; + } + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLASCL", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLASCL", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0 || *m == 0) { - return 0; + return 0; } /* Get machine parameters */ @@ -287,154 +287,154 @@ L10: if (cfrom1 == cfromc) { /* CFROMC is an inf. Multiply by a correctly signed zero for */ /* finite CTOC, or a NaN if CTOC is infinite. */ - mul = ctoc / cfromc; - done = TRUE_; - cto1 = ctoc; + mul = ctoc / cfromc; + done = TRUE_; + cto1 = ctoc; } else { - cto1 = ctoc / bignum; - if (cto1 == ctoc) { + cto1 = ctoc / bignum; + if (cto1 == ctoc) { /* CTOC is either 0 or an inf. In both cases, CTOC itself */ /* serves as the correct multiplication factor. */ - mul = ctoc; - done = TRUE_; - cfromc = 1.; - } else if (abs(cfrom1) > abs(ctoc) && ctoc != 0.) { - mul = smlnum; - done = FALSE_; - cfromc = cfrom1; - } else if (abs(cto1) > abs(cfromc)) { - mul = bignum; - done = FALSE_; - ctoc = cto1; - } else { - mul = ctoc / cfromc; - done = TRUE_; - if (mul == 1.) { - return 0; - } - } + mul = ctoc; + done = TRUE_; + cfromc = 1.; + } else if (abs(cfrom1) > abs(ctoc) && ctoc != 0.) { + mul = smlnum; + done = FALSE_; + cfromc = cfrom1; + } else if (abs(cto1) > abs(cfromc)) { + mul = bignum; + done = FALSE_; + ctoc = cto1; + } else { + mul = ctoc / cfromc; + done = TRUE_; + if (mul == 1.) { + return 0; + } + } } if (itype == 0) { /* Full matrix */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] *= mul; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] *= mul; /* L20: */ - } + } /* L30: */ - } + } } else if (itype == 1) { /* Lower triangular matrix */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = j; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] *= mul; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = j; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] *= mul; /* L40: */ - } + } /* L50: */ - } + } } else if (itype == 2) { /* Upper triangular matrix */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = min(j,*m); - for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] *= mul; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = min(j,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] *= mul; /* L60: */ - } + } /* L70: */ - } + } } else if (itype == 3) { /* Upper Hessenberg matrix */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { /* Computing MIN */ - i__3 = j + 1; - i__2 = min(i__3,*m); - for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] *= mul; + i__3 = j + 1; + i__2 = min(i__3,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] *= mul; /* L80: */ - } + } /* L90: */ - } + } } else if (itype == 4) { /* Lower half of a symmetric band matrix */ - k3 = *kl + 1; - k4 = *n + 1; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { + k3 = *kl + 1; + k4 = *n + 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { /* Computing MIN */ - i__3 = k3, i__4 = k4 - j; - i__2 = min(i__3,i__4); - for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] *= mul; + i__3 = k3, i__4 = k4 - j; + i__2 = min(i__3,i__4); + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] *= mul; /* L100: */ - } + } /* L110: */ - } + } } else if (itype == 5) { /* Upper half of a symmetric band matrix */ - k1 = *ku + 2; - k3 = *ku + 1; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { + k1 = *ku + 2; + k3 = *ku + 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { /* Computing MAX */ - i__2 = k1 - j; - i__3 = k3; - for (i__ = max(i__2,1); i__ <= i__3; ++i__) { - a[i__ + j * a_dim1] *= mul; + i__2 = k1 - j; + i__3 = k3; + for (i__ = max(i__2,1); i__ <= i__3; ++i__) { + a[i__ + j * a_dim1] *= mul; /* L120: */ - } + } /* L130: */ - } + } } else if (itype == 6) { /* Band matrix */ - k1 = *kl + *ku + 2; - k2 = *kl + 1; - k3 = (*kl << 1) + *ku + 1; - k4 = *kl + *ku + 1 + *m; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { + k1 = *kl + *ku + 2; + k2 = *kl + 1; + k3 = (*kl << 1) + *ku + 1; + k4 = *kl + *ku + 1 + *m; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { /* Computing MAX */ - i__3 = k1 - j; + i__3 = k1 - j; /* Computing MIN */ - i__4 = k3, i__5 = k4 - j; - i__2 = min(i__4,i__5); - for (i__ = max(i__3,k2); i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] *= mul; + i__4 = k3, i__5 = k4 - j; + i__2 = min(i__4,i__5); + for (i__ = max(i__3,k2); i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] *= mul; /* L140: */ - } + } /* L150: */ - } + } } if (! done) { - goto L10; + goto L10; } return 0; @@ -444,5 +444,5 @@ L10: } /* dlascl_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasd4.cpp b/lib/linalg/dlasd4.cpp index b0d8d1f7fe..e7922d1199 100644 --- a/lib/linalg/dlasd4.cpp +++ b/lib/linalg/dlasd4.cpp @@ -1,13 +1,13 @@ /* fortran/dlasd4.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -170,9 +170,9 @@ f"> */ /* > at Berkeley, USA */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlasd4_(integer *n, integer *i__, doublereal *d__, - doublereal *z__, doublereal *delta, doublereal *rho, doublereal * - sigma, doublereal *work, integer *info) +/* Subroutine */ int dlasd4_(integer *n, integer *i__, doublereal *d__, + doublereal *z__, doublereal *delta, doublereal *rho, doublereal * + sigma, doublereal *work, integer *info) { /* System generated locals */ integer i__1; @@ -197,10 +197,10 @@ f"> */ doublereal dtisq; logical swtch; doublereal dtnsq; - extern /* Subroutine */ int dlaed6_(integer *, logical *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *) - , dlasd5_(integer *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *); + extern /* Subroutine */ int dlaed6_(integer *, logical *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *) + , dlasd5_(integer *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); doublereal delsq2, dtnsq1; logical swtch3; extern doublereal dlamch_(char *, ftnlen); @@ -251,14 +251,14 @@ f"> */ /* Presumably, I=1 upon entry */ - *sigma = sqrt(d__[1] * d__[1] + *rho * z__[1] * z__[1]); - delta[1] = 1.; - work[1] = 1.; - return 0; + *sigma = sqrt(d__[1] * d__[1] + *rho * z__[1] * z__[1]); + delta[1] = 1.; + work[1] = 1.; + return 0; } if (*n == 2) { - dlasd5_(i__, &d__[1], &z__[1], &delta[1], rho, sigma, &work[1]); - return 0; + dlasd5_(i__, &d__[1], &z__[1], &delta[1], rho, sigma, &work[1]); + return 0; } /* Compute machine epsilon */ @@ -273,145 +273,145 @@ f"> */ /* Initialize some basic variables */ - ii = *n - 1; - niter = 1; + ii = *n - 1; + niter = 1; /* Calculate initial guess */ - temp = *rho / 2.; + temp = *rho / 2.; /* If ||Z||_2 is not one, then TEMP should be set to */ /* RHO * ||Z||_2^2 / TWO */ - temp1 = temp / (d__[*n] + sqrt(d__[*n] * d__[*n] + temp)); - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - work[j] = d__[j] + d__[*n] + temp1; - delta[j] = d__[j] - d__[*n] - temp1; + temp1 = temp / (d__[*n] + sqrt(d__[*n] * d__[*n] + temp)); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + work[j] = d__[j] + d__[*n] + temp1; + delta[j] = d__[j] - d__[*n] - temp1; /* L10: */ - } + } - psi = 0.; - i__1 = *n - 2; - for (j = 1; j <= i__1; ++j) { - psi += z__[j] * z__[j] / (delta[j] * work[j]); + psi = 0.; + i__1 = *n - 2; + for (j = 1; j <= i__1; ++j) { + psi += z__[j] * z__[j] / (delta[j] * work[j]); /* L20: */ - } + } - c__ = rhoinv + psi; - w = c__ + z__[ii] * z__[ii] / (delta[ii] * work[ii]) + z__[*n] * z__[* - n] / (delta[*n] * work[*n]); + c__ = rhoinv + psi; + w = c__ + z__[ii] * z__[ii] / (delta[ii] * work[ii]) + z__[*n] * z__[* + n] / (delta[*n] * work[*n]); - if (w <= 0.) { - temp1 = sqrt(d__[*n] * d__[*n] + *rho); - temp = z__[*n - 1] * z__[*n - 1] / ((d__[*n - 1] + temp1) * (d__[* - n] - d__[*n - 1] + *rho / (d__[*n] + temp1))) + z__[*n] * - z__[*n] / *rho; + if (w <= 0.) { + temp1 = sqrt(d__[*n] * d__[*n] + *rho); + temp = z__[*n - 1] * z__[*n - 1] / ((d__[*n - 1] + temp1) * (d__[* + n] - d__[*n - 1] + *rho / (d__[*n] + temp1))) + z__[*n] * + z__[*n] / *rho; /* The following TAU2 is to approximate */ /* SIGMA_n^2 - D( N )*D( N ) */ - if (c__ <= temp) { - tau = *rho; - } else { - delsq = (d__[*n] - d__[*n - 1]) * (d__[*n] + d__[*n - 1]); - a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[* - n]; - b = z__[*n] * z__[*n] * delsq; - if (a < 0.) { - tau2 = b * 2. / (sqrt(a * a + b * 4. * c__) - a); - } else { - tau2 = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); - } - tau = tau2 / (d__[*n] + sqrt(d__[*n] * d__[*n] + tau2)); - } + if (c__ <= temp) { + tau = *rho; + } else { + delsq = (d__[*n] - d__[*n - 1]) * (d__[*n] + d__[*n - 1]); + a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[* + n]; + b = z__[*n] * z__[*n] * delsq; + if (a < 0.) { + tau2 = b * 2. / (sqrt(a * a + b * 4. * c__) - a); + } else { + tau2 = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); + } + tau = tau2 / (d__[*n] + sqrt(d__[*n] * d__[*n] + tau2)); + } /* It can be proved that */ /* D(N)^2+RHO/2 <= SIGMA_n^2 < D(N)^2+TAU2 <= D(N)^2+RHO */ - } else { - delsq = (d__[*n] - d__[*n - 1]) * (d__[*n] + d__[*n - 1]); - a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n]; - b = z__[*n] * z__[*n] * delsq; + } else { + delsq = (d__[*n] - d__[*n - 1]) * (d__[*n] + d__[*n - 1]); + a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n]; + b = z__[*n] * z__[*n] * delsq; /* The following TAU2 is to approximate */ /* SIGMA_n^2 - D( N )*D( N ) */ - if (a < 0.) { - tau2 = b * 2. / (sqrt(a * a + b * 4. * c__) - a); - } else { - tau2 = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); - } - tau = tau2 / (d__[*n] + sqrt(d__[*n] * d__[*n] + tau2)); + if (a < 0.) { + tau2 = b * 2. / (sqrt(a * a + b * 4. * c__) - a); + } else { + tau2 = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); + } + tau = tau2 / (d__[*n] + sqrt(d__[*n] * d__[*n] + tau2)); /* It can be proved that */ /* D(N)^2 < D(N)^2+TAU2 < SIGMA(N)^2 < D(N)^2+RHO/2 */ - } + } /* The following TAU is to approximate SIGMA_n - D( N ) */ /* TAU = TAU2 / ( D( N )+SQRT( D( N )*D( N )+TAU2 ) ) */ - *sigma = d__[*n] + tau; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - delta[j] = d__[j] - d__[*n] - tau; - work[j] = d__[j] + d__[*n] + tau; + *sigma = d__[*n] + tau; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] = d__[j] - d__[*n] - tau; + work[j] = d__[j] + d__[*n] + tau; /* L30: */ - } + } /* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; - psi = 0.; - erretm = 0.; - i__1 = ii; - for (j = 1; j <= i__1; ++j) { - temp = z__[j] / (delta[j] * work[j]); - psi += z__[j] * temp; - dpsi += temp * temp; - erretm += psi; + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = ii; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / (delta[j] * work[j]); + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; /* L40: */ - } - erretm = abs(erretm); + } + erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ - temp = z__[*n] / (delta[*n] * work[*n]); - phi = z__[*n] * temp; - dphi = temp * temp; - erretm = (-phi - psi) * 8. + erretm - phi + rhoinv; + temp = z__[*n] / (delta[*n] * work[*n]); + phi = z__[*n] * temp; + dphi = temp * temp; + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv; /* $ + ABS( TAU2 )*( DPSI+DPHI ) */ - w = rhoinv + phi + psi; + w = rhoinv + phi + psi; /* Test for convergence */ - if (abs(w) <= eps * erretm) { - goto L240; - } + if (abs(w) <= eps * erretm) { + goto L240; + } /* Calculate the new step */ - ++niter; - dtnsq1 = work[*n - 1] * delta[*n - 1]; - dtnsq = work[*n] * delta[*n]; - c__ = w - dtnsq1 * dpsi - dtnsq * dphi; - a = (dtnsq + dtnsq1) * w - dtnsq * dtnsq1 * (dpsi + dphi); - b = dtnsq * dtnsq1 * w; - if (c__ < 0.) { - c__ = abs(c__); - } - if (c__ == 0.) { - eta = *rho - *sigma * *sigma; - } else if (a >= 0.) { - eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ - * 2.); - } else { - eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) - ); - } + ++niter; + dtnsq1 = work[*n - 1] * delta[*n - 1]; + dtnsq = work[*n] * delta[*n]; + c__ = w - dtnsq1 * dpsi - dtnsq * dphi; + a = (dtnsq + dtnsq1) * w - dtnsq * dtnsq1 * (dpsi + dphi); + b = dtnsq * dtnsq1 * w; + if (c__ < 0.) { + c__ = abs(c__); + } + if (c__ == 0.) { + eta = *rho - *sigma * *sigma; + } else if (a >= 0.) { + eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ + * 2.); + } else { + eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) + ); + } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ @@ -419,77 +419,77 @@ f"> */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ - if (w * eta > 0.) { - eta = -w / (dpsi + dphi); - } - temp = eta - dtnsq; - if (temp > *rho) { - eta = *rho + dtnsq; - } + if (w * eta > 0.) { + eta = -w / (dpsi + dphi); + } + temp = eta - dtnsq; + if (temp > *rho) { + eta = *rho + dtnsq; + } - eta /= *sigma + sqrt(eta + *sigma * *sigma); - tau += eta; - *sigma += eta; + eta /= *sigma + sqrt(eta + *sigma * *sigma); + tau += eta; + *sigma += eta; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - delta[j] -= eta; - work[j] += eta; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] -= eta; + work[j] += eta; /* L50: */ - } + } /* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; - psi = 0.; - erretm = 0.; - i__1 = ii; - for (j = 1; j <= i__1; ++j) { - temp = z__[j] / (work[j] * delta[j]); - psi += z__[j] * temp; - dpsi += temp * temp; - erretm += psi; + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = ii; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / (work[j] * delta[j]); + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; /* L60: */ - } - erretm = abs(erretm); + } + erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ - tau2 = work[*n] * delta[*n]; - temp = z__[*n] / tau2; - phi = z__[*n] * temp; - dphi = temp * temp; - erretm = (-phi - psi) * 8. + erretm - phi + rhoinv; + tau2 = work[*n] * delta[*n]; + temp = z__[*n] / tau2; + phi = z__[*n] * temp; + dphi = temp * temp; + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv; /* $ + ABS( TAU2 )*( DPSI+DPHI ) */ - w = rhoinv + phi + psi; + w = rhoinv + phi + psi; /* Main loop to update the values of the array DELTA */ - iter = niter + 1; + iter = niter + 1; - for (niter = iter; niter <= 400; ++niter) { + for (niter = iter; niter <= 400; ++niter) { /* Test for convergence */ - if (abs(w) <= eps * erretm) { - goto L240; - } + if (abs(w) <= eps * erretm) { + goto L240; + } /* Calculate the new step */ - dtnsq1 = work[*n - 1] * delta[*n - 1]; - dtnsq = work[*n] * delta[*n]; - c__ = w - dtnsq1 * dpsi - dtnsq * dphi; - a = (dtnsq + dtnsq1) * w - dtnsq1 * dtnsq * (dpsi + dphi); - b = dtnsq1 * dtnsq * w; - if (a >= 0.) { - eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( - c__ * 2.); - } else { - eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))); - } + dtnsq1 = work[*n - 1] * delta[*n - 1]; + dtnsq = work[*n] * delta[*n]; + c__ = w - dtnsq1 * dpsi - dtnsq * dphi; + a = (dtnsq + dtnsq1) * w - dtnsq1 * dtnsq * (dpsi + dphi); + b = dtnsq1 * dtnsq * w; + if (a >= 0.) { + eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( + c__ * 2.); + } else { + eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))); + } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ @@ -497,57 +497,57 @@ f"> */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ - if (w * eta > 0.) { - eta = -w / (dpsi + dphi); - } - temp = eta - dtnsq; - if (temp <= 0.) { - eta /= 2.; - } + if (w * eta > 0.) { + eta = -w / (dpsi + dphi); + } + temp = eta - dtnsq; + if (temp <= 0.) { + eta /= 2.; + } - eta /= *sigma + sqrt(eta + *sigma * *sigma); - tau += eta; - *sigma += eta; + eta /= *sigma + sqrt(eta + *sigma * *sigma); + tau += eta; + *sigma += eta; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - delta[j] -= eta; - work[j] += eta; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + delta[j] -= eta; + work[j] += eta; /* L70: */ - } + } /* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; - psi = 0.; - erretm = 0.; - i__1 = ii; - for (j = 1; j <= i__1; ++j) { - temp = z__[j] / (work[j] * delta[j]); - psi += z__[j] * temp; - dpsi += temp * temp; - erretm += psi; + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = ii; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / (work[j] * delta[j]); + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; /* L80: */ - } - erretm = abs(erretm); + } + erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ - tau2 = work[*n] * delta[*n]; - temp = z__[*n] / tau2; - phi = z__[*n] * temp; - dphi = temp * temp; - erretm = (-phi - psi) * 8. + erretm - phi + rhoinv; + tau2 = work[*n] * delta[*n]; + temp = z__[*n] / tau2; + phi = z__[*n] * temp; + dphi = temp * temp; + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv; /* $ + ABS( TAU2 )*( DPSI+DPHI ) */ - w = rhoinv + phi + psi; + w = rhoinv + phi + psi; /* L90: */ - } + } /* Return with INFO = 1, NITER = MAXIT and not converged */ - *info = 1; - goto L240; + *info = 1; + goto L240; /* End for the case I = N */ @@ -555,288 +555,288 @@ f"> */ /* The case for I < N */ - niter = 1; - ip1 = *i__ + 1; + niter = 1; + ip1 = *i__ + 1; /* Calculate initial guess */ - delsq = (d__[ip1] - d__[*i__]) * (d__[ip1] + d__[*i__]); - delsq2 = delsq / 2.; - sq2 = sqrt((d__[*i__] * d__[*i__] + d__[ip1] * d__[ip1]) / 2.); - temp = delsq2 / (d__[*i__] + sq2); - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - work[j] = d__[j] + d__[*i__] + temp; - delta[j] = d__[j] - d__[*i__] - temp; + delsq = (d__[ip1] - d__[*i__]) * (d__[ip1] + d__[*i__]); + delsq2 = delsq / 2.; + sq2 = sqrt((d__[*i__] * d__[*i__] + d__[ip1] * d__[ip1]) / 2.); + temp = delsq2 / (d__[*i__] + sq2); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + work[j] = d__[j] + d__[*i__] + temp; + delta[j] = d__[j] - d__[*i__] - temp; /* L100: */ - } + } - psi = 0.; - i__1 = *i__ - 1; - for (j = 1; j <= i__1; ++j) { - psi += z__[j] * z__[j] / (work[j] * delta[j]); + psi = 0.; + i__1 = *i__ - 1; + for (j = 1; j <= i__1; ++j) { + psi += z__[j] * z__[j] / (work[j] * delta[j]); /* L110: */ - } + } - phi = 0.; - i__1 = *i__ + 2; - for (j = *n; j >= i__1; --j) { - phi += z__[j] * z__[j] / (work[j] * delta[j]); + phi = 0.; + i__1 = *i__ + 2; + for (j = *n; j >= i__1; --j) { + phi += z__[j] * z__[j] / (work[j] * delta[j]); /* L120: */ - } - c__ = rhoinv + psi + phi; - w = c__ + z__[*i__] * z__[*i__] / (work[*i__] * delta[*i__]) + z__[ - ip1] * z__[ip1] / (work[ip1] * delta[ip1]); + } + c__ = rhoinv + psi + phi; + w = c__ + z__[*i__] * z__[*i__] / (work[*i__] * delta[*i__]) + z__[ + ip1] * z__[ip1] / (work[ip1] * delta[ip1]); - geomavg = FALSE_; - if (w > 0.) { + geomavg = FALSE_; + if (w > 0.) { /* d(i)^2 < the ith sigma^2 < (d(i)^2+d(i+1)^2)/2 */ /* We choose d(i) as origin. */ - orgati = TRUE_; - ii = *i__; - sglb = 0.; - sgub = delsq2 / (d__[*i__] + sq2); - a = c__ * delsq + z__[*i__] * z__[*i__] + z__[ip1] * z__[ip1]; - b = z__[*i__] * z__[*i__] * delsq; - if (a > 0.) { - tau2 = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))); - } else { - tau2 = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / - (c__ * 2.); - } + orgati = TRUE_; + ii = *i__; + sglb = 0.; + sgub = delsq2 / (d__[*i__] + sq2); + a = c__ * delsq + z__[*i__] * z__[*i__] + z__[ip1] * z__[ip1]; + b = z__[*i__] * z__[*i__] * delsq; + if (a > 0.) { + tau2 = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))); + } else { + tau2 = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / + (c__ * 2.); + } /* TAU2 now is an estimation of SIGMA^2 - D( I )^2. The */ /* following, however, is the corresponding estimation of */ /* SIGMA - D( I ). */ - tau = tau2 / (d__[*i__] + sqrt(d__[*i__] * d__[*i__] + tau2)); - temp = sqrt(eps); - if (d__[*i__] <= temp * d__[ip1] && (d__1 = z__[*i__], abs(d__1)) - <= temp && d__[*i__] > 0.) { + tau = tau2 / (d__[*i__] + sqrt(d__[*i__] * d__[*i__] + tau2)); + temp = sqrt(eps); + if (d__[*i__] <= temp * d__[ip1] && (d__1 = z__[*i__], abs(d__1)) + <= temp && d__[*i__] > 0.) { /* Computing MIN */ - d__1 = d__[*i__] * 10.; - tau = min(d__1,sgub); - geomavg = TRUE_; - } - } else { + d__1 = d__[*i__] * 10.; + tau = min(d__1,sgub); + geomavg = TRUE_; + } + } else { /* (d(i)^2+d(i+1)^2)/2 <= the ith sigma^2 < d(i+1)^2/2 */ /* We choose d(i+1) as origin. */ - orgati = FALSE_; - ii = ip1; - sglb = -delsq2 / (d__[ii] + sq2); - sgub = 0.; - a = c__ * delsq - z__[*i__] * z__[*i__] - z__[ip1] * z__[ip1]; - b = z__[ip1] * z__[ip1] * delsq; - if (a < 0.) { - tau2 = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs( - d__1)))); - } else { - tau2 = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / - (c__ * 2.); - } + orgati = FALSE_; + ii = ip1; + sglb = -delsq2 / (d__[ii] + sq2); + sgub = 0.; + a = c__ * delsq - z__[*i__] * z__[*i__] - z__[ip1] * z__[ip1]; + b = z__[ip1] * z__[ip1] * delsq; + if (a < 0.) { + tau2 = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs( + d__1)))); + } else { + tau2 = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / + (c__ * 2.); + } /* TAU2 now is an estimation of SIGMA^2 - D( IP1 )^2. The */ /* following, however, is the corresponding estimation of */ /* SIGMA - D( IP1 ). */ - tau = tau2 / (d__[ip1] + sqrt((d__1 = d__[ip1] * d__[ip1] + tau2, - abs(d__1)))); - } + tau = tau2 / (d__[ip1] + sqrt((d__1 = d__[ip1] * d__[ip1] + tau2, + abs(d__1)))); + } - *sigma = d__[ii] + tau; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - work[j] = d__[j] + d__[ii] + tau; - delta[j] = d__[j] - d__[ii] - tau; + *sigma = d__[ii] + tau; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + work[j] = d__[j] + d__[ii] + tau; + delta[j] = d__[j] - d__[ii] - tau; /* L130: */ - } - iim1 = ii - 1; - iip1 = ii + 1; + } + iim1 = ii - 1; + iip1 = ii + 1; /* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; - psi = 0.; - erretm = 0.; - i__1 = iim1; - for (j = 1; j <= i__1; ++j) { - temp = z__[j] / (work[j] * delta[j]); - psi += z__[j] * temp; - dpsi += temp * temp; - erretm += psi; + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = iim1; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / (work[j] * delta[j]); + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; /* L150: */ - } - erretm = abs(erretm); + } + erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ - dphi = 0.; - phi = 0.; - i__1 = iip1; - for (j = *n; j >= i__1; --j) { - temp = z__[j] / (work[j] * delta[j]); - phi += z__[j] * temp; - dphi += temp * temp; - erretm += phi; + dphi = 0.; + phi = 0.; + i__1 = iip1; + for (j = *n; j >= i__1; --j) { + temp = z__[j] / (work[j] * delta[j]); + phi += z__[j] * temp; + dphi += temp * temp; + erretm += phi; /* L160: */ - } + } - w = rhoinv + phi + psi; + w = rhoinv + phi + psi; /* W is the value of the secular function with */ /* its ii-th element removed. */ - swtch3 = FALSE_; - if (orgati) { - if (w < 0.) { - swtch3 = TRUE_; - } - } else { - if (w > 0.) { - swtch3 = TRUE_; - } - } - if (ii == 1 || ii == *n) { - swtch3 = FALSE_; - } + swtch3 = FALSE_; + if (orgati) { + if (w < 0.) { + swtch3 = TRUE_; + } + } else { + if (w > 0.) { + swtch3 = TRUE_; + } + } + if (ii == 1 || ii == *n) { + swtch3 = FALSE_; + } - temp = z__[ii] / (work[ii] * delta[ii]); - dw = dpsi + dphi + temp * temp; - temp = z__[ii] * temp; - w += temp; - erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.; + temp = z__[ii] / (work[ii] * delta[ii]); + dw = dpsi + dphi + temp * temp; + temp = z__[ii] * temp; + w += temp; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.; /* $ + ABS( TAU2 )*DW */ /* Test for convergence */ - if (abs(w) <= eps * erretm) { - goto L240; - } + if (abs(w) <= eps * erretm) { + goto L240; + } - if (w <= 0.) { - sglb = max(sglb,tau); - } else { - sgub = min(sgub,tau); - } + if (w <= 0.) { + sglb = max(sglb,tau); + } else { + sgub = min(sgub,tau); + } /* Calculate the new step */ - ++niter; - if (! swtch3) { - dtipsq = work[ip1] * delta[ip1]; - dtisq = work[*i__] * delta[*i__]; - if (orgati) { + ++niter; + if (! swtch3) { + dtipsq = work[ip1] * delta[ip1]; + dtisq = work[*i__] * delta[*i__]; + if (orgati) { /* Computing 2nd power */ - d__1 = z__[*i__] / dtisq; - c__ = w - dtipsq * dw + delsq * (d__1 * d__1); - } else { + d__1 = z__[*i__] / dtisq; + c__ = w - dtipsq * dw + delsq * (d__1 * d__1); + } else { /* Computing 2nd power */ - d__1 = z__[ip1] / dtipsq; - c__ = w - dtisq * dw - delsq * (d__1 * d__1); - } - a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; - b = dtipsq * dtisq * w; - if (c__ == 0.) { - if (a == 0.) { - if (orgati) { - a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (dpsi + - dphi); - } else { - a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + - dphi); - } - } - eta = b / a; - } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( - c__ * 2.); - } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))); - } - } else { + d__1 = z__[ip1] / dtipsq; + c__ = w - dtisq * dw - delsq * (d__1 * d__1); + } + a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; + b = dtipsq * dtisq * w; + if (c__ == 0.) { + if (a == 0.) { + if (orgati) { + a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (dpsi + + dphi); + } else { + a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + + dphi); + } + } + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( + c__ * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))); + } + } else { /* Interpolation using THREE most relevant poles */ - dtiim = work[iim1] * delta[iim1]; - dtiip = work[iip1] * delta[iip1]; - temp = rhoinv + psi + phi; - if (orgati) { - temp1 = z__[iim1] / dtiim; - temp1 *= temp1; - c__ = temp - dtiip * (dpsi + dphi) - (d__[iim1] - d__[iip1]) * - (d__[iim1] + d__[iip1]) * temp1; - zz[0] = z__[iim1] * z__[iim1]; - if (dpsi < temp1) { - zz[2] = dtiip * dtiip * dphi; - } else { - zz[2] = dtiip * dtiip * (dpsi - temp1 + dphi); - } - } else { - temp1 = z__[iip1] / dtiip; - temp1 *= temp1; - c__ = temp - dtiim * (dpsi + dphi) - (d__[iip1] - d__[iim1]) * - (d__[iim1] + d__[iip1]) * temp1; - if (dphi < temp1) { - zz[0] = dtiim * dtiim * dpsi; - } else { - zz[0] = dtiim * dtiim * (dpsi + (dphi - temp1)); - } - zz[2] = z__[iip1] * z__[iip1]; - } - zz[1] = z__[ii] * z__[ii]; - dd[0] = dtiim; - dd[1] = delta[ii] * work[ii]; - dd[2] = dtiip; - dlaed6_(&niter, &orgati, &c__, dd, zz, &w, &eta, info); + dtiim = work[iim1] * delta[iim1]; + dtiip = work[iip1] * delta[iip1]; + temp = rhoinv + psi + phi; + if (orgati) { + temp1 = z__[iim1] / dtiim; + temp1 *= temp1; + c__ = temp - dtiip * (dpsi + dphi) - (d__[iim1] - d__[iip1]) * + (d__[iim1] + d__[iip1]) * temp1; + zz[0] = z__[iim1] * z__[iim1]; + if (dpsi < temp1) { + zz[2] = dtiip * dtiip * dphi; + } else { + zz[2] = dtiip * dtiip * (dpsi - temp1 + dphi); + } + } else { + temp1 = z__[iip1] / dtiip; + temp1 *= temp1; + c__ = temp - dtiim * (dpsi + dphi) - (d__[iip1] - d__[iim1]) * + (d__[iim1] + d__[iip1]) * temp1; + if (dphi < temp1) { + zz[0] = dtiim * dtiim * dpsi; + } else { + zz[0] = dtiim * dtiim * (dpsi + (dphi - temp1)); + } + zz[2] = z__[iip1] * z__[iip1]; + } + zz[1] = z__[ii] * z__[ii]; + dd[0] = dtiim; + dd[1] = delta[ii] * work[ii]; + dd[2] = dtiip; + dlaed6_(&niter, &orgati, &c__, dd, zz, &w, &eta, info); - if (*info != 0) { + if (*info != 0) { /* If INFO is not 0, i.e., DLAED6 failed, switch back */ /* to 2 pole interpolation. */ - swtch3 = FALSE_; - *info = 0; - dtipsq = work[ip1] * delta[ip1]; - dtisq = work[*i__] * delta[*i__]; - if (orgati) { + swtch3 = FALSE_; + *info = 0; + dtipsq = work[ip1] * delta[ip1]; + dtisq = work[*i__] * delta[*i__]; + if (orgati) { /* Computing 2nd power */ - d__1 = z__[*i__] / dtisq; - c__ = w - dtipsq * dw + delsq * (d__1 * d__1); - } else { + d__1 = z__[*i__] / dtisq; + c__ = w - dtipsq * dw + delsq * (d__1 * d__1); + } else { /* Computing 2nd power */ - d__1 = z__[ip1] / dtipsq; - c__ = w - dtisq * dw - delsq * (d__1 * d__1); - } - a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; - b = dtipsq * dtisq * w; - if (c__ == 0.) { - if (a == 0.) { - if (orgati) { - a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * ( - dpsi + dphi); - } else { - a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + - dphi); - } - } - eta = b / a; - } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) - / (c__ * 2.); - } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, - abs(d__1)))); - } - } - } + d__1 = z__[ip1] / dtipsq; + c__ = w - dtisq * dw - delsq * (d__1 * d__1); + } + a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; + b = dtipsq * dtisq * w; + if (c__ == 0.) { + if (a == 0.) { + if (orgati) { + a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * ( + dpsi + dphi); + } else { + a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + + dphi); + } + } + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) + / (c__ * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, + abs(d__1)))); + } + } + } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ @@ -844,255 +844,255 @@ f"> */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ - if (w * eta >= 0.) { - eta = -w / dw; - } + if (w * eta >= 0.) { + eta = -w / dw; + } - eta /= *sigma + sqrt(*sigma * *sigma + eta); - temp = tau + eta; - if (temp > sgub || temp < sglb) { - if (w < 0.) { - eta = (sgub - tau) / 2.; - } else { - eta = (sglb - tau) / 2.; - } - if (geomavg) { - if (w < 0.) { - if (tau > 0.) { - eta = sqrt(sgub * tau) - tau; - } - } else { - if (sglb > 0.) { - eta = sqrt(sglb * tau) - tau; - } - } - } - } + eta /= *sigma + sqrt(*sigma * *sigma + eta); + temp = tau + eta; + if (temp > sgub || temp < sglb) { + if (w < 0.) { + eta = (sgub - tau) / 2.; + } else { + eta = (sglb - tau) / 2.; + } + if (geomavg) { + if (w < 0.) { + if (tau > 0.) { + eta = sqrt(sgub * tau) - tau; + } + } else { + if (sglb > 0.) { + eta = sqrt(sglb * tau) - tau; + } + } + } + } - prew = w; + prew = w; - tau += eta; - *sigma += eta; + tau += eta; + *sigma += eta; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - work[j] += eta; - delta[j] -= eta; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + work[j] += eta; + delta[j] -= eta; /* L170: */ - } + } /* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; - psi = 0.; - erretm = 0.; - i__1 = iim1; - for (j = 1; j <= i__1; ++j) { - temp = z__[j] / (work[j] * delta[j]); - psi += z__[j] * temp; - dpsi += temp * temp; - erretm += psi; + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = iim1; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / (work[j] * delta[j]); + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; /* L180: */ - } - erretm = abs(erretm); + } + erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ - dphi = 0.; - phi = 0.; - i__1 = iip1; - for (j = *n; j >= i__1; --j) { - temp = z__[j] / (work[j] * delta[j]); - phi += z__[j] * temp; - dphi += temp * temp; - erretm += phi; + dphi = 0.; + phi = 0.; + i__1 = iip1; + for (j = *n; j >= i__1; --j) { + temp = z__[j] / (work[j] * delta[j]); + phi += z__[j] * temp; + dphi += temp * temp; + erretm += phi; /* L190: */ - } + } - tau2 = work[ii] * delta[ii]; - temp = z__[ii] / tau2; - dw = dpsi + dphi + temp * temp; - temp = z__[ii] * temp; - w = rhoinv + phi + psi + temp; - erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.; + tau2 = work[ii] * delta[ii]; + temp = z__[ii] / tau2; + dw = dpsi + dphi + temp * temp; + temp = z__[ii] * temp; + w = rhoinv + phi + psi + temp; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.; /* $ + ABS( TAU2 )*DW */ - swtch = FALSE_; - if (orgati) { - if (-w > abs(prew) / 10.) { - swtch = TRUE_; - } - } else { - if (w > abs(prew) / 10.) { - swtch = TRUE_; - } - } + swtch = FALSE_; + if (orgati) { + if (-w > abs(prew) / 10.) { + swtch = TRUE_; + } + } else { + if (w > abs(prew) / 10.) { + swtch = TRUE_; + } + } /* Main loop to update the values of the array DELTA and WORK */ - iter = niter + 1; + iter = niter + 1; - for (niter = iter; niter <= 400; ++niter) { + for (niter = iter; niter <= 400; ++niter) { /* Test for convergence */ - if (abs(w) <= eps * erretm) { + if (abs(w) <= eps * erretm) { /* $ .OR. (SGUB-SGLB).LE.EIGHT*ABS(SGUB+SGLB) ) THEN */ - goto L240; - } + goto L240; + } - if (w <= 0.) { - sglb = max(sglb,tau); - } else { - sgub = min(sgub,tau); - } + if (w <= 0.) { + sglb = max(sglb,tau); + } else { + sgub = min(sgub,tau); + } /* Calculate the new step */ - if (! swtch3) { - dtipsq = work[ip1] * delta[ip1]; - dtisq = work[*i__] * delta[*i__]; - if (! swtch) { - if (orgati) { + if (! swtch3) { + dtipsq = work[ip1] * delta[ip1]; + dtisq = work[*i__] * delta[*i__]; + if (! swtch) { + if (orgati) { /* Computing 2nd power */ - d__1 = z__[*i__] / dtisq; - c__ = w - dtipsq * dw + delsq * (d__1 * d__1); - } else { + d__1 = z__[*i__] / dtisq; + c__ = w - dtipsq * dw + delsq * (d__1 * d__1); + } else { /* Computing 2nd power */ - d__1 = z__[ip1] / dtipsq; - c__ = w - dtisq * dw - delsq * (d__1 * d__1); - } - } else { - temp = z__[ii] / (work[ii] * delta[ii]); - if (orgati) { - dpsi += temp * temp; - } else { - dphi += temp * temp; - } - c__ = w - dtisq * dpsi - dtipsq * dphi; - } - a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; - b = dtipsq * dtisq * w; - if (c__ == 0.) { - if (a == 0.) { - if (! swtch) { - if (orgati) { - a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * - (dpsi + dphi); - } else { - a = z__[ip1] * z__[ip1] + dtisq * dtisq * ( - dpsi + dphi); - } - } else { - a = dtisq * dtisq * dpsi + dtipsq * dtipsq * dphi; - } - } - eta = b / a; - } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) - / (c__ * 2.); - } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, - abs(d__1)))); - } - } else { + d__1 = z__[ip1] / dtipsq; + c__ = w - dtisq * dw - delsq * (d__1 * d__1); + } + } else { + temp = z__[ii] / (work[ii] * delta[ii]); + if (orgati) { + dpsi += temp * temp; + } else { + dphi += temp * temp; + } + c__ = w - dtisq * dpsi - dtipsq * dphi; + } + a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; + b = dtipsq * dtisq * w; + if (c__ == 0.) { + if (a == 0.) { + if (! swtch) { + if (orgati) { + a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * + (dpsi + dphi); + } else { + a = z__[ip1] * z__[ip1] + dtisq * dtisq * ( + dpsi + dphi); + } + } else { + a = dtisq * dtisq * dpsi + dtipsq * dtipsq * dphi; + } + } + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) + / (c__ * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, + abs(d__1)))); + } + } else { /* Interpolation using THREE most relevant poles */ - dtiim = work[iim1] * delta[iim1]; - dtiip = work[iip1] * delta[iip1]; - temp = rhoinv + psi + phi; - if (swtch) { - c__ = temp - dtiim * dpsi - dtiip * dphi; - zz[0] = dtiim * dtiim * dpsi; - zz[2] = dtiip * dtiip * dphi; - } else { - if (orgati) { - temp1 = z__[iim1] / dtiim; - temp1 *= temp1; - temp2 = (d__[iim1] - d__[iip1]) * (d__[iim1] + d__[ - iip1]) * temp1; - c__ = temp - dtiip * (dpsi + dphi) - temp2; - zz[0] = z__[iim1] * z__[iim1]; - if (dpsi < temp1) { - zz[2] = dtiip * dtiip * dphi; - } else { - zz[2] = dtiip * dtiip * (dpsi - temp1 + dphi); - } - } else { - temp1 = z__[iip1] / dtiip; - temp1 *= temp1; - temp2 = (d__[iip1] - d__[iim1]) * (d__[iim1] + d__[ - iip1]) * temp1; - c__ = temp - dtiim * (dpsi + dphi) - temp2; - if (dphi < temp1) { - zz[0] = dtiim * dtiim * dpsi; - } else { - zz[0] = dtiim * dtiim * (dpsi + (dphi - temp1)); - } - zz[2] = z__[iip1] * z__[iip1]; - } - } - dd[0] = dtiim; - dd[1] = delta[ii] * work[ii]; - dd[2] = dtiip; - dlaed6_(&niter, &orgati, &c__, dd, zz, &w, &eta, info); + dtiim = work[iim1] * delta[iim1]; + dtiip = work[iip1] * delta[iip1]; + temp = rhoinv + psi + phi; + if (swtch) { + c__ = temp - dtiim * dpsi - dtiip * dphi; + zz[0] = dtiim * dtiim * dpsi; + zz[2] = dtiip * dtiip * dphi; + } else { + if (orgati) { + temp1 = z__[iim1] / dtiim; + temp1 *= temp1; + temp2 = (d__[iim1] - d__[iip1]) * (d__[iim1] + d__[ + iip1]) * temp1; + c__ = temp - dtiip * (dpsi + dphi) - temp2; + zz[0] = z__[iim1] * z__[iim1]; + if (dpsi < temp1) { + zz[2] = dtiip * dtiip * dphi; + } else { + zz[2] = dtiip * dtiip * (dpsi - temp1 + dphi); + } + } else { + temp1 = z__[iip1] / dtiip; + temp1 *= temp1; + temp2 = (d__[iip1] - d__[iim1]) * (d__[iim1] + d__[ + iip1]) * temp1; + c__ = temp - dtiim * (dpsi + dphi) - temp2; + if (dphi < temp1) { + zz[0] = dtiim * dtiim * dpsi; + } else { + zz[0] = dtiim * dtiim * (dpsi + (dphi - temp1)); + } + zz[2] = z__[iip1] * z__[iip1]; + } + } + dd[0] = dtiim; + dd[1] = delta[ii] * work[ii]; + dd[2] = dtiip; + dlaed6_(&niter, &orgati, &c__, dd, zz, &w, &eta, info); - if (*info != 0) { + if (*info != 0) { /* If INFO is not 0, i.e., DLAED6 failed, switch */ /* back to two pole interpolation */ - swtch3 = FALSE_; - *info = 0; - dtipsq = work[ip1] * delta[ip1]; - dtisq = work[*i__] * delta[*i__]; - if (! swtch) { - if (orgati) { + swtch3 = FALSE_; + *info = 0; + dtipsq = work[ip1] * delta[ip1]; + dtisq = work[*i__] * delta[*i__]; + if (! swtch) { + if (orgati) { /* Computing 2nd power */ - d__1 = z__[*i__] / dtisq; - c__ = w - dtipsq * dw + delsq * (d__1 * d__1); - } else { + d__1 = z__[*i__] / dtisq; + c__ = w - dtipsq * dw + delsq * (d__1 * d__1); + } else { /* Computing 2nd power */ - d__1 = z__[ip1] / dtipsq; - c__ = w - dtisq * dw - delsq * (d__1 * d__1); - } - } else { - temp = z__[ii] / (work[ii] * delta[ii]); - if (orgati) { - dpsi += temp * temp; - } else { - dphi += temp * temp; - } - c__ = w - dtisq * dpsi - dtipsq * dphi; - } - a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; - b = dtipsq * dtisq * w; - if (c__ == 0.) { - if (a == 0.) { - if (! swtch) { - if (orgati) { - a = z__[*i__] * z__[*i__] + dtipsq * - dtipsq * (dpsi + dphi); - } else { - a = z__[ip1] * z__[ip1] + dtisq * dtisq * - (dpsi + dphi); - } - } else { - a = dtisq * dtisq * dpsi + dtipsq * dtipsq * - dphi; - } - } - eta = b / a; - } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))) / (c__ * 2.); - } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, - abs(d__1)))); - } - } - } + d__1 = z__[ip1] / dtipsq; + c__ = w - dtisq * dw - delsq * (d__1 * d__1); + } + } else { + temp = z__[ii] / (work[ii] * delta[ii]); + if (orgati) { + dpsi += temp * temp; + } else { + dphi += temp * temp; + } + c__ = w - dtisq * dpsi - dtipsq * dphi; + } + a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw; + b = dtipsq * dtisq * w; + if (c__ == 0.) { + if (a == 0.) { + if (! swtch) { + if (orgati) { + a = z__[*i__] * z__[*i__] + dtipsq * + dtipsq * (dpsi + dphi); + } else { + a = z__[ip1] * z__[ip1] + dtisq * dtisq * + (dpsi + dphi); + } + } else { + a = dtisq * dtisq * dpsi + dtipsq * dtipsq * + dphi; + } + } + eta = b / a; + } else if (a <= 0.) { + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs( + d__1)))) / (c__ * 2.); + } else { + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, + abs(d__1)))); + } + } + } /* Note, eta should be positive if w is negative, and */ /* eta should be negative otherwise. However, */ @@ -1100,89 +1100,89 @@ f"> */ /* we simply use one Newton step instead. This way */ /* will guarantee eta*w < 0. */ - if (w * eta >= 0.) { - eta = -w / dw; - } + if (w * eta >= 0.) { + eta = -w / dw; + } - eta /= *sigma + sqrt(*sigma * *sigma + eta); - temp = tau + eta; - if (temp > sgub || temp < sglb) { - if (w < 0.) { - eta = (sgub - tau) / 2.; - } else { - eta = (sglb - tau) / 2.; - } - if (geomavg) { - if (w < 0.) { - if (tau > 0.) { - eta = sqrt(sgub * tau) - tau; - } - } else { - if (sglb > 0.) { - eta = sqrt(sglb * tau) - tau; - } - } - } - } + eta /= *sigma + sqrt(*sigma * *sigma + eta); + temp = tau + eta; + if (temp > sgub || temp < sglb) { + if (w < 0.) { + eta = (sgub - tau) / 2.; + } else { + eta = (sglb - tau) / 2.; + } + if (geomavg) { + if (w < 0.) { + if (tau > 0.) { + eta = sqrt(sgub * tau) - tau; + } + } else { + if (sglb > 0.) { + eta = sqrt(sglb * tau) - tau; + } + } + } + } - prew = w; + prew = w; - tau += eta; - *sigma += eta; + tau += eta; + *sigma += eta; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - work[j] += eta; - delta[j] -= eta; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + work[j] += eta; + delta[j] -= eta; /* L200: */ - } + } /* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; - psi = 0.; - erretm = 0.; - i__1 = iim1; - for (j = 1; j <= i__1; ++j) { - temp = z__[j] / (work[j] * delta[j]); - psi += z__[j] * temp; - dpsi += temp * temp; - erretm += psi; + dpsi = 0.; + psi = 0.; + erretm = 0.; + i__1 = iim1; + for (j = 1; j <= i__1; ++j) { + temp = z__[j] / (work[j] * delta[j]); + psi += z__[j] * temp; + dpsi += temp * temp; + erretm += psi; /* L210: */ - } - erretm = abs(erretm); + } + erretm = abs(erretm); /* Evaluate PHI and the derivative DPHI */ - dphi = 0.; - phi = 0.; - i__1 = iip1; - for (j = *n; j >= i__1; --j) { - temp = z__[j] / (work[j] * delta[j]); - phi += z__[j] * temp; - dphi += temp * temp; - erretm += phi; + dphi = 0.; + phi = 0.; + i__1 = iip1; + for (j = *n; j >= i__1; --j) { + temp = z__[j] / (work[j] * delta[j]); + phi += z__[j] * temp; + dphi += temp * temp; + erretm += phi; /* L220: */ - } + } - tau2 = work[ii] * delta[ii]; - temp = z__[ii] / tau2; - dw = dpsi + dphi + temp * temp; - temp = z__[ii] * temp; - w = rhoinv + phi + psi + temp; - erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.; + tau2 = work[ii] * delta[ii]; + temp = z__[ii] / tau2; + dw = dpsi + dphi + temp * temp; + temp = z__[ii] * temp; + w = rhoinv + phi + psi + temp; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.; /* $ + ABS( TAU2 )*DW */ - if (w * prew > 0. && abs(w) > abs(prew) / 10.) { - swtch = ! swtch; - } + if (w * prew > 0. && abs(w) > abs(prew) / 10.) { + swtch = ! swtch; + } /* L230: */ - } + } /* Return with INFO = 1, NITER = MAXIT and not converged */ - *info = 1; + *info = 1; } @@ -1194,5 +1194,5 @@ L240: } /* dlasd4_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasd5.cpp b/lib/linalg/dlasd5.cpp index a789475cad..a56f570c0b 100644 --- a/lib/linalg/dlasd5.cpp +++ b/lib/linalg/dlasd5.cpp @@ -1,13 +1,13 @@ /* fortran/dlasd5.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -133,9 +133,9 @@ f"> */ /* > at Berkeley, USA */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlasd5_(integer *i__, doublereal *d__, doublereal *z__, - doublereal *delta, doublereal *rho, doublereal *dsigma, doublereal * - work) +/* Subroutine */ int dlasd5_(integer *i__, doublereal *d__, doublereal *z__, + doublereal *delta, doublereal *rho, doublereal *dsigma, doublereal * + work) { /* System generated locals */ doublereal d__1; @@ -176,51 +176,51 @@ f"> */ del = d__[2] - d__[1]; delsq = del * (d__[2] + d__[1]); if (*i__ == 1) { - w = *rho * 4. * (z__[2] * z__[2] / (d__[1] + d__[2] * 3.) - z__[1] * - z__[1] / (d__[1] * 3. + d__[2])) / del + 1.; - if (w > 0.) { - b = delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); - c__ = *rho * z__[1] * z__[1] * delsq; + w = *rho * 4. * (z__[2] * z__[2] / (d__[1] + d__[2] * 3.) - z__[1] * + z__[1] / (d__[1] * 3. + d__[2])) / del + 1.; + if (w > 0.) { + b = delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); + c__ = *rho * z__[1] * z__[1] * delsq; /* B > ZERO, always */ /* The following TAU is DSIGMA * DSIGMA - D( 1 ) * D( 1 ) */ - tau = c__ * 2. / (b + sqrt((d__1 = b * b - c__ * 4., abs(d__1)))); + tau = c__ * 2. / (b + sqrt((d__1 = b * b - c__ * 4., abs(d__1)))); /* The following TAU is DSIGMA - D( 1 ) */ - tau /= d__[1] + sqrt(d__[1] * d__[1] + tau); - *dsigma = d__[1] + tau; - delta[1] = -tau; - delta[2] = del - tau; - work[1] = d__[1] * 2. + tau; - work[2] = d__[1] + tau + d__[2]; + tau /= d__[1] + sqrt(d__[1] * d__[1] + tau); + *dsigma = d__[1] + tau; + delta[1] = -tau; + delta[2] = del - tau; + work[1] = d__[1] * 2. + tau; + work[2] = d__[1] + tau + d__[2]; /* DELTA( 1 ) = -Z( 1 ) / TAU */ /* DELTA( 2 ) = Z( 2 ) / ( DEL-TAU ) */ - } else { - b = -delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); - c__ = *rho * z__[2] * z__[2] * delsq; + } else { + b = -delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); + c__ = *rho * z__[2] * z__[2] * delsq; /* The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 ) */ - if (b > 0.) { - tau = c__ * -2. / (b + sqrt(b * b + c__ * 4.)); - } else { - tau = (b - sqrt(b * b + c__ * 4.)) / 2.; - } + if (b > 0.) { + tau = c__ * -2. / (b + sqrt(b * b + c__ * 4.)); + } else { + tau = (b - sqrt(b * b + c__ * 4.)) / 2.; + } /* The following TAU is DSIGMA - D( 2 ) */ - tau /= d__[2] + sqrt((d__1 = d__[2] * d__[2] + tau, abs(d__1))); - *dsigma = d__[2] + tau; - delta[1] = -(del + tau); - delta[2] = -tau; - work[1] = d__[1] + tau + d__[2]; - work[2] = d__[2] * 2. + tau; + tau /= d__[2] + sqrt((d__1 = d__[2] * d__[2] + tau, abs(d__1))); + *dsigma = d__[2] + tau; + delta[1] = -(del + tau); + delta[2] = -tau; + work[1] = d__[1] + tau + d__[2]; + work[2] = d__[2] * 2. + tau; /* DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) */ /* DELTA( 2 ) = -Z( 2 ) / TAU */ - } + } /* TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) */ /* DELTA( 1 ) = DELTA( 1 ) / TEMP */ /* DELTA( 2 ) = DELTA( 2 ) / TEMP */ @@ -228,25 +228,25 @@ f"> */ /* Now I=2 */ - b = -delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); - c__ = *rho * z__[2] * z__[2] * delsq; + b = -delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); + c__ = *rho * z__[2] * z__[2] * delsq; /* The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 ) */ - if (b > 0.) { - tau = (b + sqrt(b * b + c__ * 4.)) / 2.; - } else { - tau = c__ * 2. / (-b + sqrt(b * b + c__ * 4.)); - } + if (b > 0.) { + tau = (b + sqrt(b * b + c__ * 4.)) / 2.; + } else { + tau = c__ * 2. / (-b + sqrt(b * b + c__ * 4.)); + } /* The following TAU is DSIGMA - D( 2 ) */ - tau /= d__[2] + sqrt(d__[2] * d__[2] + tau); - *dsigma = d__[2] + tau; - delta[1] = -(del + tau); - delta[2] = -tau; - work[1] = d__[1] + tau + d__[2]; - work[2] = d__[2] * 2. + tau; + tau /= d__[2] + sqrt(d__[2] * d__[2] + tau); + *dsigma = d__[2] + tau; + delta[1] = -(del + tau); + delta[2] = -tau; + work[1] = d__[1] + tau + d__[2]; + work[2] = d__[2] * 2. + tau; /* DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) */ /* DELTA( 2 ) = -Z( 2 ) / TAU */ /* TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) */ @@ -260,5 +260,5 @@ f"> */ } /* dlasd5_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasd6.cpp b/lib/linalg/dlasd6.cpp index d3b6cddd86..48c7d8dd4f 100644 --- a/lib/linalg/dlasd6.cpp +++ b/lib/linalg/dlasd6.cpp @@ -1,13 +1,13 @@ /* fortran/dlasd6.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -334,34 +334,34 @@ f"> */ /* > California at Berkeley, USA */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlasd6_(integer *icompq, integer *nl, integer *nr, - integer *sqre, doublereal *d__, doublereal *vf, doublereal *vl, - doublereal *alpha, doublereal *beta, integer *idxq, integer *perm, - integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, - integer *ldgnum, doublereal *poles, doublereal *difl, doublereal * - difr, doublereal *z__, integer *k, doublereal *c__, doublereal *s, - doublereal *work, integer *iwork, integer *info) +/* Subroutine */ int dlasd6_(integer *icompq, integer *nl, integer *nr, + integer *sqre, doublereal *d__, doublereal *vf, doublereal *vl, + doublereal *alpha, doublereal *beta, integer *idxq, integer *perm, + integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, + integer *ldgnum, doublereal *poles, doublereal *difl, doublereal * + difr, doublereal *z__, integer *k, doublereal *c__, doublereal *s, + doublereal *work, integer *iwork, integer *info) { /* System generated locals */ - integer givcol_dim1, givcol_offset, givnum_dim1, givnum_offset, - poles_dim1, poles_offset, i__1; + integer givcol_dim1, givcol_offset, givnum_dim1, givnum_offset, + poles_dim1, poles_offset, i__1; doublereal d__1, d__2; /* Local variables */ integer i__, m, n, n1, n2, iw, idx, idxc, idxp, ivfw, ivlw; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *), dlasd7_(integer *, integer *, integer *, - integer *, integer *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, integer *, integer *, - integer *, integer *, integer *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *), dlasd8_( - integer *, integer *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, integer *, doublereal *, - doublereal *, integer *), dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dlamrg_(integer *, integer *, - doublereal *, integer *, integer *, integer *); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *), dlasd7_(integer *, integer *, integer *, + integer *, integer *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, integer *, + integer *, integer *, integer *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *), dlasd8_( + integer *, integer *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, doublereal *, + doublereal *, integer *), dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dlamrg_(integer *, integer *, + doublereal *, integer *, integer *, integer *); integer isigma; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); doublereal orgnrm; @@ -417,22 +417,22 @@ f"> */ m = n + *sqre; if (*icompq < 0 || *icompq > 1) { - *info = -1; + *info = -1; } else if (*nl < 1) { - *info = -2; + *info = -2; } else if (*nr < 1) { - *info = -3; + *info = -3; } else if (*sqre < 0 || *sqre > 1) { - *info = -4; + *info = -4; } else if (*ldgcol < n) { - *info = -14; + *info = -14; } else if (*ldgnum < n) { - *info = -16; + *info = -16; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLASD6", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLASD6", &i__1, (ftnlen)6); + return 0; } /* The following values are for bookkeeping purposes only. They are */ @@ -456,46 +456,46 @@ f"> */ d__[*nl + 1] = 0.; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { - if ((d__1 = d__[i__], abs(d__1)) > orgnrm) { - orgnrm = (d__1 = d__[i__], abs(d__1)); - } + if ((d__1 = d__[i__], abs(d__1)) > orgnrm) { + orgnrm = (d__1 = d__[i__], abs(d__1)); + } /* L10: */ } dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b7, &n, &c__1, &d__[1], &n, info, ( - ftnlen)1); + ftnlen)1); *alpha /= orgnrm; *beta /= orgnrm; /* Sort and Deflate singular values. */ dlasd7_(icompq, nl, nr, sqre, k, &d__[1], &z__[1], &work[iw], &vf[1], & - work[ivfw], &vl[1], &work[ivlw], alpha, beta, &work[isigma], & - iwork[idx], &iwork[idxp], &idxq[1], &perm[1], givptr, &givcol[ - givcol_offset], ldgcol, &givnum[givnum_offset], ldgnum, c__, s, - info); + work[ivfw], &vl[1], &work[ivlw], alpha, beta, &work[isigma], & + iwork[idx], &iwork[idxp], &idxq[1], &perm[1], givptr, &givcol[ + givcol_offset], ldgcol, &givnum[givnum_offset], ldgnum, c__, s, + info); /* Solve Secular Equation, compute DIFL, DIFR, and update VF, VL. */ - dlasd8_(icompq, k, &d__[1], &z__[1], &vf[1], &vl[1], &difl[1], &difr[1], - ldgnum, &work[isigma], &work[iw], info); + dlasd8_(icompq, k, &d__[1], &z__[1], &vf[1], &vl[1], &difl[1], &difr[1], + ldgnum, &work[isigma], &work[iw], info); /* Report the possible convergence failure. */ if (*info != 0) { - return 0; + return 0; } /* Save the poles if ICOMPQ = 1. */ if (*icompq == 1) { - dcopy_(k, &d__[1], &c__1, &poles[poles_dim1 + 1], &c__1); - dcopy_(k, &work[isigma], &c__1, &poles[(poles_dim1 << 1) + 1], &c__1); + dcopy_(k, &d__[1], &c__1, &poles[poles_dim1 + 1], &c__1); + dcopy_(k, &work[isigma], &c__1, &poles[(poles_dim1 << 1) + 1], &c__1); } /* Unscale. */ dlascl_((char *)"G", &c__0, &c__0, &c_b7, &orgnrm, &n, &c__1, &d__[1], &n, info, ( - ftnlen)1); + ftnlen)1); /* Prepare the IDXQ sorting permutation. */ @@ -510,5 +510,5 @@ f"> */ } /* dlasd6_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasd7.cpp b/lib/linalg/dlasd7.cpp index 29169c7a84..89a18cc81f 100644 --- a/lib/linalg/dlasd7.cpp +++ b/lib/linalg/dlasd7.cpp @@ -1,13 +1,13 @@ /* fortran/dlasd7.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -19,7 +19,7 @@ extern "C" { static integer c__1 = 1; -/* > \brief \b DLASD7 merges the two sets of singular values together into a single sorted set. Then it tries +/* > \brief \b DLASD7 merges the two sets of singular values together into a single sorted set. Then it tries to deflate the size of the problem. Used by sbdsdc. */ /* =========== DOCUMENTATION =========== */ @@ -298,13 +298,13 @@ f"> */ /* > California at Berkeley, USA */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlasd7_(integer *icompq, integer *nl, integer *nr, - integer *sqre, integer *k, doublereal *d__, doublereal *z__, - doublereal *zw, doublereal *vf, doublereal *vfw, doublereal *vl, - doublereal *vlw, doublereal *alpha, doublereal *beta, doublereal * - dsigma, integer *idx, integer *idxp, integer *idxq, integer *perm, - integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, - integer *ldgnum, doublereal *c__, doublereal *s, integer *info) +/* Subroutine */ int dlasd7_(integer *icompq, integer *nl, integer *nr, + integer *sqre, integer *k, doublereal *d__, doublereal *z__, + doublereal *zw, doublereal *vf, doublereal *vfw, doublereal *vl, + doublereal *vlw, doublereal *alpha, doublereal *beta, doublereal * + dsigma, integer *idx, integer *idxp, integer *idxq, integer *perm, + integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, + integer *ldgnum, doublereal *c__, doublereal *s, integer *info) { /* System generated locals */ integer givcol_dim1, givcol_offset, givnum_dim1, givnum_offset, i__1; @@ -316,17 +316,17 @@ f"> */ integer jp; doublereal eps, tau, tol; integer nlp1, nlp2, idxi, idxj; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *); + extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *); integer idxjp; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); integer jprev; - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen); doublereal hlftol; @@ -382,28 +382,28 @@ f"> */ m = n + *sqre; if (*icompq < 0 || *icompq > 1) { - *info = -1; + *info = -1; } else if (*nl < 1) { - *info = -2; + *info = -2; } else if (*nr < 1) { - *info = -3; + *info = -3; } else if (*sqre < 0 || *sqre > 1) { - *info = -4; + *info = -4; } else if (*ldgcol < n) { - *info = -22; + *info = -22; } else if (*ldgnum < n) { - *info = -24; + *info = -24; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLASD7", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLASD7", &i__1, (ftnlen)6); + return 0; } nlp1 = *nl + 1; nlp2 = *nl + 2; if (*icompq == 1) { - *givptr = 0; + *givptr = 0; } /* Generate the first part of the vector Z and move the singular */ @@ -413,11 +413,11 @@ f"> */ vl[nlp1] = 0.; tau = vf[nlp1]; for (i__ = *nl; i__ >= 1; --i__) { - z__[i__ + 1] = *alpha * vl[i__]; - vl[i__] = 0.; - vf[i__ + 1] = vf[i__]; - d__[i__ + 1] = d__[i__]; - idxq[i__ + 1] = idxq[i__] + 1; + z__[i__ + 1] = *alpha * vl[i__]; + vl[i__] = 0.; + vf[i__ + 1] = vf[i__]; + d__[i__ + 1] = d__[i__]; + idxq[i__ + 1] = idxq[i__] + 1; /* L10: */ } vf[1] = tau; @@ -426,8 +426,8 @@ f"> */ i__1 = m; for (i__ = nlp2; i__ <= i__1; ++i__) { - z__[i__] = *beta * vf[i__]; - vf[i__] = 0.; + z__[i__] = *beta * vf[i__]; + vf[i__] = 0.; /* L20: */ } @@ -435,7 +435,7 @@ f"> */ i__1 = n; for (i__ = nlp2; i__ <= i__1; ++i__) { - idxq[i__] += nlp1; + idxq[i__] += nlp1; /* L30: */ } @@ -443,10 +443,10 @@ f"> */ i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { - dsigma[i__] = d__[idxq[i__]]; - zw[i__] = z__[idxq[i__]]; - vfw[i__] = vf[idxq[i__]]; - vlw[i__] = vl[idxq[i__]]; + dsigma[i__] = d__[idxq[i__]]; + zw[i__] = z__[idxq[i__]]; + vfw[i__] = vf[idxq[i__]]; + vlw[i__] = vl[idxq[i__]]; /* L40: */ } @@ -454,11 +454,11 @@ f"> */ i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { - idxi = idx[i__] + 1; - d__[i__] = dsigma[idxi]; - z__[i__] = zw[idxi]; - vf[i__] = vfw[idxi]; - vl[i__] = vlw[idxi]; + idxi = idx[i__] + 1; + d__[i__] = dsigma[idxi]; + z__[i__] = zw[idxi]; + vf[i__] = vfw[idxi]; + vl[i__] = vlw[idxi]; /* L50: */ } @@ -495,19 +495,19 @@ f"> */ k2 = n + 1; i__1 = n; for (j = 2; j <= i__1; ++j) { - if ((d__1 = z__[j], abs(d__1)) <= tol) { + if ((d__1 = z__[j], abs(d__1)) <= tol) { /* Deflate due to small z component. */ - --k2; - idxp[k2] = j; - if (j == n) { - goto L100; - } - } else { - jprev = j; - goto L70; - } + --k2; + idxp[k2] = j; + if (j == n) { + goto L100; + } + } else { + jprev = j; + goto L70; + } /* L60: */ } L70: @@ -515,63 +515,63 @@ L70: L80: ++j; if (j > n) { - goto L90; + goto L90; } if ((d__1 = z__[j], abs(d__1)) <= tol) { /* Deflate due to small z component. */ - --k2; - idxp[k2] = j; + --k2; + idxp[k2] = j; } else { /* Check if singular values are close enough to allow deflation. */ - if ((d__1 = d__[j] - d__[jprev], abs(d__1)) <= tol) { + if ((d__1 = d__[j] - d__[jprev], abs(d__1)) <= tol) { /* Deflation is possible. */ - *s = z__[jprev]; - *c__ = z__[j]; + *s = z__[jprev]; + *c__ = z__[j]; /* Find sqrt(a**2+b**2) without overflow or */ /* destructive underflow. */ - tau = dlapy2_(c__, s); - z__[j] = tau; - z__[jprev] = 0.; - *c__ /= tau; - *s = -(*s) / tau; + tau = dlapy2_(c__, s); + z__[j] = tau; + z__[jprev] = 0.; + *c__ /= tau; + *s = -(*s) / tau; /* Record the appropriate Givens rotation */ - if (*icompq == 1) { - ++(*givptr); - idxjp = idxq[idx[jprev] + 1]; - idxj = idxq[idx[j] + 1]; - if (idxjp <= nlp1) { - --idxjp; - } - if (idxj <= nlp1) { - --idxj; - } - givcol[*givptr + (givcol_dim1 << 1)] = idxjp; - givcol[*givptr + givcol_dim1] = idxj; - givnum[*givptr + (givnum_dim1 << 1)] = *c__; - givnum[*givptr + givnum_dim1] = *s; - } - drot_(&c__1, &vf[jprev], &c__1, &vf[j], &c__1, c__, s); - drot_(&c__1, &vl[jprev], &c__1, &vl[j], &c__1, c__, s); - --k2; - idxp[k2] = jprev; - jprev = j; - } else { - ++(*k); - zw[*k] = z__[jprev]; - dsigma[*k] = d__[jprev]; - idxp[*k] = jprev; - jprev = j; - } + if (*icompq == 1) { + ++(*givptr); + idxjp = idxq[idx[jprev] + 1]; + idxj = idxq[idx[j] + 1]; + if (idxjp <= nlp1) { + --idxjp; + } + if (idxj <= nlp1) { + --idxj; + } + givcol[*givptr + (givcol_dim1 << 1)] = idxjp; + givcol[*givptr + givcol_dim1] = idxj; + givnum[*givptr + (givnum_dim1 << 1)] = *c__; + givnum[*givptr + givnum_dim1] = *s; + } + drot_(&c__1, &vf[jprev], &c__1, &vf[j], &c__1, c__, s); + drot_(&c__1, &vl[jprev], &c__1, &vl[j], &c__1, c__, s); + --k2; + idxp[k2] = jprev; + jprev = j; + } else { + ++(*k); + zw[*k] = z__[jprev]; + dsigma[*k] = d__[jprev]; + idxp[*k] = jprev; + jprev = j; + } } goto L80; L90: @@ -591,22 +591,22 @@ L100: i__1 = n; for (j = 2; j <= i__1; ++j) { - jp = idxp[j]; - dsigma[j] = d__[jp]; - vfw[j] = vf[jp]; - vlw[j] = vl[jp]; + jp = idxp[j]; + dsigma[j] = d__[jp]; + vfw[j] = vf[jp]; + vlw[j] = vl[jp]; /* L110: */ } if (*icompq == 1) { - i__1 = n; - for (j = 2; j <= i__1; ++j) { - jp = idxp[j]; - perm[j] = idxq[idx[jp] + 1]; - if (perm[j] <= nlp1) { - --perm[j]; - } + i__1 = n; + for (j = 2; j <= i__1; ++j) { + jp = idxp[j]; + perm[j] = idxq[idx[jp] + 1]; + if (perm[j] <= nlp1) { + --perm[j]; + } /* L120: */ - } + } } /* The deflated singular values go back into the last N - K slots of */ @@ -621,26 +621,26 @@ L100: dsigma[1] = 0.; hlftol = tol / 2.; if (abs(dsigma[2]) <= hlftol) { - dsigma[2] = hlftol; + dsigma[2] = hlftol; } if (m > n) { - z__[1] = dlapy2_(&z1, &z__[m]); - if (z__[1] <= tol) { - *c__ = 1.; - *s = 0.; - z__[1] = tol; - } else { - *c__ = z1 / z__[1]; - *s = -z__[m] / z__[1]; - } - drot_(&c__1, &vf[m], &c__1, &vf[1], &c__1, c__, s); - drot_(&c__1, &vl[m], &c__1, &vl[1], &c__1, c__, s); + z__[1] = dlapy2_(&z1, &z__[m]); + if (z__[1] <= tol) { + *c__ = 1.; + *s = 0.; + z__[1] = tol; + } else { + *c__ = z1 / z__[1]; + *s = -z__[m] / z__[1]; + } + drot_(&c__1, &vf[m], &c__1, &vf[1], &c__1, c__, s); + drot_(&c__1, &vl[m], &c__1, &vl[1], &c__1, c__, s); } else { - if (abs(z1) <= tol) { - z__[1] = tol; - } else { - z__[1] = z1; - } + if (abs(z1) <= tol) { + z__[1] = tol; + } else { + z__[1] = z1; + } } /* Restore Z, VF, and VL. */ @@ -659,5 +659,5 @@ L100: } /* dlasd7_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasd8.cpp b/lib/linalg/dlasd8.cpp index b95d5b11cc..3ec481bb55 100644 --- a/lib/linalg/dlasd8.cpp +++ b/lib/linalg/dlasd8.cpp @@ -1,13 +1,13 @@ /* fortran/dlasd8.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -188,10 +188,10 @@ f"> */ /* > California at Berkeley, USA */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlasd8_(integer *icompq, integer *k, doublereal *d__, - doublereal *z__, doublereal *vf, doublereal *vl, doublereal *difl, - doublereal *difr, integer *lddifr, doublereal *dsigma, doublereal * - work, integer *info) +/* Subroutine */ int dlasd8_(integer *icompq, integer *k, doublereal *d__, + doublereal *z__, doublereal *vf, doublereal *vl, doublereal *difl, + doublereal *difr, integer *lddifr, doublereal *dsigma, doublereal * + work, integer *info) { /* System generated locals */ integer difr_dim1, difr_offset, i__1, i__2; @@ -204,22 +204,22 @@ f"> */ integer i__, j; doublereal dj, rho; integer iwk1, iwk2, iwk3; - extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, - integer *); + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, + integer *); doublereal temp; extern doublereal dnrm2_(integer *, doublereal *, integer *); integer iwk2i, iwk3i; doublereal diflj, difrj, dsigj; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); extern doublereal dlamc3_(doublereal *, doublereal *); - extern /* Subroutine */ int dlasd4_(integer *, integer *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *), dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dlaset_(char *, integer *, integer - *, doublereal *, doublereal *, doublereal *, integer *, ftnlen), - xerbla_(char *, integer *, ftnlen); + extern /* Subroutine */ int dlasd4_(integer *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *), dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dlaset_(char *, integer *, integer + *, doublereal *, doublereal *, doublereal *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); doublereal dsigjp; @@ -264,28 +264,28 @@ f"> */ *info = 0; if (*icompq < 0 || *icompq > 1) { - *info = -1; + *info = -1; } else if (*k < 1) { - *info = -2; + *info = -2; } else if (*lddifr < *k) { - *info = -9; + *info = -9; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLASD8", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLASD8", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*k == 1) { - d__[1] = abs(z__[1]); - difl[1] = d__[1]; - if (*icompq == 1) { - difl[2] = 1.; - difr[(difr_dim1 << 1) + 1] = 1.; - } - return 0; + d__[1] = abs(z__[1]); + difl[1] = d__[1]; + if (*icompq == 1) { + difl[2] = 1.; + difr[(difr_dim1 << 1) + 1] = 1.; + } + return 0; } /* Modify values DSIGMA(i) to make sure all DSIGMA(i)-DSIGMA(j) can */ @@ -307,7 +307,7 @@ f"> */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { - dsigma[i__] = dlamc3_(&dsigma[i__], &dsigma[i__]) - dsigma[i__]; + dsigma[i__] = dlamc3_(&dsigma[i__], &dsigma[i__]) - dsigma[i__]; /* L10: */ } @@ -323,7 +323,7 @@ f"> */ rho = dnrm2_(k, &z__[1], &c__1); dlascl_((char *)"G", &c__0, &c__0, &rho, &c_b8, k, &c__1, &z__[1], k, info, ( - ftnlen)1); + ftnlen)1); rho *= rho; /* Initialize WORK(IWK3). */ @@ -335,31 +335,31 @@ f"> */ i__1 = *k; for (j = 1; j <= i__1; ++j) { - dlasd4_(k, &j, &dsigma[1], &z__[1], &work[iwk1], &rho, &d__[j], &work[ - iwk2], info); + dlasd4_(k, &j, &dsigma[1], &z__[1], &work[iwk1], &rho, &d__[j], &work[ + iwk2], info); /* If the root finder fails, report the convergence failure. */ - if (*info != 0) { - return 0; - } - work[iwk3i + j] = work[iwk3i + j] * work[j] * work[iwk2i + j]; - difl[j] = -work[j]; - difr[j + difr_dim1] = -work[j + 1]; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - work[iwk3i + i__] = work[iwk3i + i__] * work[i__] * work[iwk2i + - i__] / (dsigma[i__] - dsigma[j]) / (dsigma[i__] + dsigma[ - j]); + if (*info != 0) { + return 0; + } + work[iwk3i + j] = work[iwk3i + j] * work[j] * work[iwk2i + j]; + difl[j] = -work[j]; + difr[j + difr_dim1] = -work[j + 1]; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + work[iwk3i + i__] = work[iwk3i + i__] * work[i__] * work[iwk2i + + i__] / (dsigma[i__] - dsigma[j]) / (dsigma[i__] + dsigma[ + j]); /* L20: */ - } - i__2 = *k; - for (i__ = j + 1; i__ <= i__2; ++i__) { - work[iwk3i + i__] = work[iwk3i + i__] * work[i__] * work[iwk2i + - i__] / (dsigma[i__] - dsigma[j]) / (dsigma[i__] + dsigma[ - j]); + } + i__2 = *k; + for (i__ = j + 1; i__ <= i__2; ++i__) { + work[iwk3i + i__] = work[iwk3i + i__] * work[i__] * work[iwk2i + + i__] / (dsigma[i__] - dsigma[j]) / (dsigma[i__] + dsigma[ + j]); /* L30: */ - } + } /* L40: */ } @@ -367,8 +367,8 @@ f"> */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { - d__2 = sqrt((d__1 = work[iwk3i + i__], abs(d__1))); - z__[i__] = d_sign(&d__2, &z__[i__]); + d__2 = sqrt((d__1 = work[iwk3i + i__], abs(d__1))); + z__[i__] = d_sign(&d__2, &z__[i__]); /* L50: */ } @@ -376,32 +376,32 @@ f"> */ i__1 = *k; for (j = 1; j <= i__1; ++j) { - diflj = difl[j]; - dj = d__[j]; - dsigj = -dsigma[j]; - if (j < *k) { - difrj = -difr[j + difr_dim1]; - dsigjp = -dsigma[j + 1]; - } - work[j] = -z__[j] / diflj / (dsigma[j] + dj); - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - work[i__] = z__[i__] / (dlamc3_(&dsigma[i__], &dsigj) - diflj) / ( - dsigma[i__] + dj); + diflj = difl[j]; + dj = d__[j]; + dsigj = -dsigma[j]; + if (j < *k) { + difrj = -difr[j + difr_dim1]; + dsigjp = -dsigma[j + 1]; + } + work[j] = -z__[j] / diflj / (dsigma[j] + dj); + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + work[i__] = z__[i__] / (dlamc3_(&dsigma[i__], &dsigj) - diflj) / ( + dsigma[i__] + dj); /* L60: */ - } - i__2 = *k; - for (i__ = j + 1; i__ <= i__2; ++i__) { - work[i__] = z__[i__] / (dlamc3_(&dsigma[i__], &dsigjp) + difrj) / - (dsigma[i__] + dj); + } + i__2 = *k; + for (i__ = j + 1; i__ <= i__2; ++i__) { + work[i__] = z__[i__] / (dlamc3_(&dsigma[i__], &dsigjp) + difrj) / + (dsigma[i__] + dj); /* L70: */ - } - temp = dnrm2_(k, &work[1], &c__1); - work[iwk2i + j] = ddot_(k, &work[1], &c__1, &vf[1], &c__1) / temp; - work[iwk3i + j] = ddot_(k, &work[1], &c__1, &vl[1], &c__1) / temp; - if (*icompq == 1) { - difr[j + (difr_dim1 << 1)] = temp; - } + } + temp = dnrm2_(k, &work[1], &c__1); + work[iwk2i + j] = ddot_(k, &work[1], &c__1, &vf[1], &c__1) / temp; + work[iwk3i + j] = ddot_(k, &work[1], &c__1, &vl[1], &c__1) / temp; + if (*icompq == 1) { + difr[j + (difr_dim1 << 1)] = temp; + } /* L80: */ } @@ -415,5 +415,5 @@ f"> */ } /* dlasd8_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasda.cpp b/lib/linalg/dlasda.cpp index a63dc14dec..d064a9af51 100644 --- a/lib/linalg/dlasda.cpp +++ b/lib/linalg/dlasda.cpp @@ -1,13 +1,13 @@ /* fortran/dlasda.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -296,47 +296,47 @@ f"> */ /* > California at Berkeley, USA */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlasda_(integer *icompq, integer *smlsiz, integer *n, - integer *sqre, doublereal *d__, doublereal *e, doublereal *u, integer - *ldu, doublereal *vt, integer *k, doublereal *difl, doublereal *difr, - doublereal *z__, doublereal *poles, integer *givptr, integer *givcol, - integer *ldgcol, integer *perm, doublereal *givnum, doublereal *c__, - doublereal *s, doublereal *work, integer *iwork, integer *info) +/* Subroutine */ int dlasda_(integer *icompq, integer *smlsiz, integer *n, + integer *sqre, doublereal *d__, doublereal *e, doublereal *u, integer + *ldu, doublereal *vt, integer *k, doublereal *difl, doublereal *difr, + doublereal *z__, doublereal *poles, integer *givptr, integer *givcol, + integer *ldgcol, integer *perm, doublereal *givnum, doublereal *c__, + doublereal *s, doublereal *work, integer *iwork, integer *info) { /* System generated locals */ - integer givcol_dim1, givcol_offset, perm_dim1, perm_offset, difl_dim1, - difl_offset, difr_dim1, difr_offset, givnum_dim1, givnum_offset, - poles_dim1, poles_offset, u_dim1, u_offset, vt_dim1, vt_offset, - z_dim1, z_offset, i__1, i__2; + integer givcol_dim1, givcol_offset, perm_dim1, perm_offset, difl_dim1, + difl_offset, difr_dim1, difr_offset, givnum_dim1, givnum_offset, + poles_dim1, poles_offset, u_dim1, u_offset, vt_dim1, vt_offset, + z_dim1, z_offset, i__1, i__2; /* Builtin functions */ integer pow_ii(integer *, integer *); /* Local variables */ integer i__, j, m, i1, ic, lf, nd, ll, nl, vf, nr, vl, im1, ncc, nlf, nrf, - vfi, iwk, vli, lvl, nru, ndb1, nlp1, lvl2, nrp1; + vfi, iwk, vli, lvl, nru, ndb1, nlp1, lvl2, nrp1; doublereal beta; integer idxq, nlvl; doublereal alpha; integer inode, ndiml, ndimr, idxqi, itemp; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); integer sqrei; - extern /* Subroutine */ int dlasd6_(integer *, integer *, integer *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *, integer *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - doublereal *, doublereal *, integer *, doublereal *, doublereal *, - doublereal *, integer *, integer *); + extern /* Subroutine */ int dlasd6_(integer *, integer *, integer *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *, integer *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, integer *, integer *); integer nwork1, nwork2; - extern /* Subroutine */ int dlasdq_(char *, integer *, integer *, integer - *, integer *, integer *, doublereal *, doublereal *, doublereal *, - integer *, doublereal *, integer *, doublereal *, integer *, - doublereal *, integer *, ftnlen), dlasdt_(integer *, integer *, - integer *, integer *, integer *, integer *, integer *), dlaset_( - char *, integer *, integer *, doublereal *, doublereal *, - doublereal *, integer *, ftnlen), xerbla_(char *, integer *, - ftnlen); + extern /* Subroutine */ int dlasdq_(char *, integer *, integer *, integer + *, integer *, integer *, doublereal *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, ftnlen), dlasdt_(integer *, integer *, + integer *, integer *, integer *, integer *, integer *), dlaset_( + char *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen), xerbla_(char *, integer *, + ftnlen); integer smlszp; @@ -402,22 +402,22 @@ f"> */ *info = 0; if (*icompq < 0 || *icompq > 1) { - *info = -1; + *info = -1; } else if (*smlsiz < 3) { - *info = -2; + *info = -2; } else if (*n < 0) { - *info = -3; + *info = -3; } else if (*sqre < 0 || *sqre > 1) { - *info = -4; + *info = -4; } else if (*ldu < *n + *sqre) { - *info = -8; + *info = -8; } else if (*ldgcol < *n) { - *info = -17; + *info = -17; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLASDA", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLASDA", &i__1, (ftnlen)6); + return 0; } m = *n + *sqre; @@ -425,16 +425,16 @@ f"> */ /* If the input matrix is too small, call DLASDQ to find the SVD. */ if (*n <= *smlsiz) { - if (*icompq == 0) { - dlasdq_((char *)"U", sqre, n, &c__0, &c__0, &c__0, &d__[1], &e[1], &vt[ - vt_offset], ldu, &u[u_offset], ldu, &u[u_offset], ldu, & - work[1], info, (ftnlen)1); - } else { - dlasdq_((char *)"U", sqre, n, &m, n, &c__0, &d__[1], &e[1], &vt[vt_offset] - , ldu, &u[u_offset], ldu, &u[u_offset], ldu, &work[1], - info, (ftnlen)1); - } - return 0; + if (*icompq == 0) { + dlasdq_((char *)"U", sqre, n, &c__0, &c__0, &c__0, &d__[1], &e[1], &vt[ + vt_offset], ldu, &u[u_offset], ldu, &u[u_offset], ldu, & + work[1], info, (ftnlen)1); + } else { + dlasdq_((char *)"U", sqre, n, &m, n, &c__0, &d__[1], &e[1], &vt[vt_offset] + , ldu, &u[u_offset], ldu, &u[u_offset], ldu, &work[1], + info, (ftnlen)1); + } + return 0; } /* Book-keeping and set up the computation tree. */ @@ -454,8 +454,8 @@ f"> */ nwork1 = vl + m; nwork2 = nwork1 + smlszp * smlszp; - dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], - smlsiz); + dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], + smlsiz); /* for the nodes on bottom level of the tree, solve */ /* their subproblems by DLASDQ. */ @@ -470,84 +470,84 @@ f"> */ /* NLF: starting row of the left subproblem */ /* NRF: starting row of the right subproblem */ - i1 = i__ - 1; - ic = iwork[inode + i1]; - nl = iwork[ndiml + i1]; - nlp1 = nl + 1; - nr = iwork[ndimr + i1]; - nlf = ic - nl; - nrf = ic + 1; - idxqi = idxq + nlf - 2; - vfi = vf + nlf - 1; - vli = vl + nlf - 1; - sqrei = 1; - if (*icompq == 0) { - dlaset_((char *)"A", &nlp1, &nlp1, &c_b11, &c_b12, &work[nwork1], &smlszp, - (ftnlen)1); - dlasdq_((char *)"U", &sqrei, &nl, &nlp1, &nru, &ncc, &d__[nlf], &e[nlf], & - work[nwork1], &smlszp, &work[nwork2], &nl, &work[nwork2], - &nl, &work[nwork2], info, (ftnlen)1); - itemp = nwork1 + nl * smlszp; - dcopy_(&nlp1, &work[nwork1], &c__1, &work[vfi], &c__1); - dcopy_(&nlp1, &work[itemp], &c__1, &work[vli], &c__1); - } else { - dlaset_((char *)"A", &nl, &nl, &c_b11, &c_b12, &u[nlf + u_dim1], ldu, ( - ftnlen)1); - dlaset_((char *)"A", &nlp1, &nlp1, &c_b11, &c_b12, &vt[nlf + vt_dim1], - ldu, (ftnlen)1); - dlasdq_((char *)"U", &sqrei, &nl, &nlp1, &nl, &ncc, &d__[nlf], &e[nlf], & - vt[nlf + vt_dim1], ldu, &u[nlf + u_dim1], ldu, &u[nlf + - u_dim1], ldu, &work[nwork1], info, (ftnlen)1); - dcopy_(&nlp1, &vt[nlf + vt_dim1], &c__1, &work[vfi], &c__1); - dcopy_(&nlp1, &vt[nlf + nlp1 * vt_dim1], &c__1, &work[vli], &c__1) - ; - } - if (*info != 0) { - return 0; - } - i__2 = nl; - for (j = 1; j <= i__2; ++j) { - iwork[idxqi + j] = j; + i1 = i__ - 1; + ic = iwork[inode + i1]; + nl = iwork[ndiml + i1]; + nlp1 = nl + 1; + nr = iwork[ndimr + i1]; + nlf = ic - nl; + nrf = ic + 1; + idxqi = idxq + nlf - 2; + vfi = vf + nlf - 1; + vli = vl + nlf - 1; + sqrei = 1; + if (*icompq == 0) { + dlaset_((char *)"A", &nlp1, &nlp1, &c_b11, &c_b12, &work[nwork1], &smlszp, + (ftnlen)1); + dlasdq_((char *)"U", &sqrei, &nl, &nlp1, &nru, &ncc, &d__[nlf], &e[nlf], & + work[nwork1], &smlszp, &work[nwork2], &nl, &work[nwork2], + &nl, &work[nwork2], info, (ftnlen)1); + itemp = nwork1 + nl * smlszp; + dcopy_(&nlp1, &work[nwork1], &c__1, &work[vfi], &c__1); + dcopy_(&nlp1, &work[itemp], &c__1, &work[vli], &c__1); + } else { + dlaset_((char *)"A", &nl, &nl, &c_b11, &c_b12, &u[nlf + u_dim1], ldu, ( + ftnlen)1); + dlaset_((char *)"A", &nlp1, &nlp1, &c_b11, &c_b12, &vt[nlf + vt_dim1], + ldu, (ftnlen)1); + dlasdq_((char *)"U", &sqrei, &nl, &nlp1, &nl, &ncc, &d__[nlf], &e[nlf], & + vt[nlf + vt_dim1], ldu, &u[nlf + u_dim1], ldu, &u[nlf + + u_dim1], ldu, &work[nwork1], info, (ftnlen)1); + dcopy_(&nlp1, &vt[nlf + vt_dim1], &c__1, &work[vfi], &c__1); + dcopy_(&nlp1, &vt[nlf + nlp1 * vt_dim1], &c__1, &work[vli], &c__1) + ; + } + if (*info != 0) { + return 0; + } + i__2 = nl; + for (j = 1; j <= i__2; ++j) { + iwork[idxqi + j] = j; /* L10: */ - } - if (i__ == nd && *sqre == 0) { - sqrei = 0; - } else { - sqrei = 1; - } - idxqi += nlp1; - vfi += nlp1; - vli += nlp1; - nrp1 = nr + sqrei; - if (*icompq == 0) { - dlaset_((char *)"A", &nrp1, &nrp1, &c_b11, &c_b12, &work[nwork1], &smlszp, - (ftnlen)1); - dlasdq_((char *)"U", &sqrei, &nr, &nrp1, &nru, &ncc, &d__[nrf], &e[nrf], & - work[nwork1], &smlszp, &work[nwork2], &nr, &work[nwork2], - &nr, &work[nwork2], info, (ftnlen)1); - itemp = nwork1 + (nrp1 - 1) * smlszp; - dcopy_(&nrp1, &work[nwork1], &c__1, &work[vfi], &c__1); - dcopy_(&nrp1, &work[itemp], &c__1, &work[vli], &c__1); - } else { - dlaset_((char *)"A", &nr, &nr, &c_b11, &c_b12, &u[nrf + u_dim1], ldu, ( - ftnlen)1); - dlaset_((char *)"A", &nrp1, &nrp1, &c_b11, &c_b12, &vt[nrf + vt_dim1], - ldu, (ftnlen)1); - dlasdq_((char *)"U", &sqrei, &nr, &nrp1, &nr, &ncc, &d__[nrf], &e[nrf], & - vt[nrf + vt_dim1], ldu, &u[nrf + u_dim1], ldu, &u[nrf + - u_dim1], ldu, &work[nwork1], info, (ftnlen)1); - dcopy_(&nrp1, &vt[nrf + vt_dim1], &c__1, &work[vfi], &c__1); - dcopy_(&nrp1, &vt[nrf + nrp1 * vt_dim1], &c__1, &work[vli], &c__1) - ; - } - if (*info != 0) { - return 0; - } - i__2 = nr; - for (j = 1; j <= i__2; ++j) { - iwork[idxqi + j] = j; + } + if (i__ == nd && *sqre == 0) { + sqrei = 0; + } else { + sqrei = 1; + } + idxqi += nlp1; + vfi += nlp1; + vli += nlp1; + nrp1 = nr + sqrei; + if (*icompq == 0) { + dlaset_((char *)"A", &nrp1, &nrp1, &c_b11, &c_b12, &work[nwork1], &smlszp, + (ftnlen)1); + dlasdq_((char *)"U", &sqrei, &nr, &nrp1, &nru, &ncc, &d__[nrf], &e[nrf], & + work[nwork1], &smlszp, &work[nwork2], &nr, &work[nwork2], + &nr, &work[nwork2], info, (ftnlen)1); + itemp = nwork1 + (nrp1 - 1) * smlszp; + dcopy_(&nrp1, &work[nwork1], &c__1, &work[vfi], &c__1); + dcopy_(&nrp1, &work[itemp], &c__1, &work[vli], &c__1); + } else { + dlaset_((char *)"A", &nr, &nr, &c_b11, &c_b12, &u[nrf + u_dim1], ldu, ( + ftnlen)1); + dlaset_((char *)"A", &nrp1, &nrp1, &c_b11, &c_b12, &vt[nrf + vt_dim1], + ldu, (ftnlen)1); + dlasdq_((char *)"U", &sqrei, &nr, &nrp1, &nr, &ncc, &d__[nrf], &e[nrf], & + vt[nrf + vt_dim1], ldu, &u[nrf + u_dim1], ldu, &u[nrf + + u_dim1], ldu, &work[nwork1], info, (ftnlen)1); + dcopy_(&nrp1, &vt[nrf + vt_dim1], &c__1, &work[vfi], &c__1); + dcopy_(&nrp1, &vt[nrf + nrp1 * vt_dim1], &c__1, &work[vli], &c__1) + ; + } + if (*info != 0) { + return 0; + } + i__2 = nr; + for (j = 1; j <= i__2; ++j) { + iwork[idxqi + j] = j; /* L20: */ - } + } /* L30: */ } @@ -555,61 +555,61 @@ f"> */ j = pow_ii(&c__2, &nlvl); for (lvl = nlvl; lvl >= 1; --lvl) { - lvl2 = (lvl << 1) - 1; + lvl2 = (lvl << 1) - 1; /* Find the first node LF and last node LL on */ /* the current level LVL. */ - if (lvl == 1) { - lf = 1; - ll = 1; - } else { - i__1 = lvl - 1; - lf = pow_ii(&c__2, &i__1); - ll = (lf << 1) - 1; - } - i__1 = ll; - for (i__ = lf; i__ <= i__1; ++i__) { - im1 = i__ - 1; - ic = iwork[inode + im1]; - nl = iwork[ndiml + im1]; - nr = iwork[ndimr + im1]; - nlf = ic - nl; - nrf = ic + 1; - if (i__ == ll) { - sqrei = *sqre; - } else { - sqrei = 1; - } - vfi = vf + nlf - 1; - vli = vl + nlf - 1; - idxqi = idxq + nlf - 1; - alpha = d__[ic]; - beta = e[ic]; - if (*icompq == 0) { - dlasd6_(icompq, &nl, &nr, &sqrei, &d__[nlf], &work[vfi], & - work[vli], &alpha, &beta, &iwork[idxqi], &perm[ - perm_offset], &givptr[1], &givcol[givcol_offset], - ldgcol, &givnum[givnum_offset], ldu, &poles[ - poles_offset], &difl[difl_offset], &difr[difr_offset], - &z__[z_offset], &k[1], &c__[1], &s[1], &work[nwork1], - &iwork[iwk], info); - } else { - --j; - dlasd6_(icompq, &nl, &nr, &sqrei, &d__[nlf], &work[vfi], & - work[vli], &alpha, &beta, &iwork[idxqi], &perm[nlf + - lvl * perm_dim1], &givptr[j], &givcol[nlf + lvl2 * - givcol_dim1], ldgcol, &givnum[nlf + lvl2 * - givnum_dim1], ldu, &poles[nlf + lvl2 * poles_dim1], & - difl[nlf + lvl * difl_dim1], &difr[nlf + lvl2 * - difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[j], - &s[j], &work[nwork1], &iwork[iwk], info); - } - if (*info != 0) { - return 0; - } + if (lvl == 1) { + lf = 1; + ll = 1; + } else { + i__1 = lvl - 1; + lf = pow_ii(&c__2, &i__1); + ll = (lf << 1) - 1; + } + i__1 = ll; + for (i__ = lf; i__ <= i__1; ++i__) { + im1 = i__ - 1; + ic = iwork[inode + im1]; + nl = iwork[ndiml + im1]; + nr = iwork[ndimr + im1]; + nlf = ic - nl; + nrf = ic + 1; + if (i__ == ll) { + sqrei = *sqre; + } else { + sqrei = 1; + } + vfi = vf + nlf - 1; + vli = vl + nlf - 1; + idxqi = idxq + nlf - 1; + alpha = d__[ic]; + beta = e[ic]; + if (*icompq == 0) { + dlasd6_(icompq, &nl, &nr, &sqrei, &d__[nlf], &work[vfi], & + work[vli], &alpha, &beta, &iwork[idxqi], &perm[ + perm_offset], &givptr[1], &givcol[givcol_offset], + ldgcol, &givnum[givnum_offset], ldu, &poles[ + poles_offset], &difl[difl_offset], &difr[difr_offset], + &z__[z_offset], &k[1], &c__[1], &s[1], &work[nwork1], + &iwork[iwk], info); + } else { + --j; + dlasd6_(icompq, &nl, &nr, &sqrei, &d__[nlf], &work[vfi], & + work[vli], &alpha, &beta, &iwork[idxqi], &perm[nlf + + lvl * perm_dim1], &givptr[j], &givcol[nlf + lvl2 * + givcol_dim1], ldgcol, &givnum[nlf + lvl2 * + givnum_dim1], ldu, &poles[nlf + lvl2 * poles_dim1], & + difl[nlf + lvl * difl_dim1], &difr[nlf + lvl2 * + difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[j], + &s[j], &work[nwork1], &iwork[iwk], info); + } + if (*info != 0) { + return 0; + } /* L40: */ - } + } /* L50: */ } @@ -620,5 +620,5 @@ f"> */ } /* dlasda_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasdq.cpp b/lib/linalg/dlasdq.cpp index efb468cef4..418be52678 100644 --- a/lib/linalg/dlasdq.cpp +++ b/lib/linalg/dlasdq.cpp @@ -1,13 +1,13 @@ /* fortran/dlasdq.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -232,14 +232,14 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dlasdq_(char *uplo, integer *sqre, integer *n, integer * - ncvt, integer *nru, integer *ncc, doublereal *d__, doublereal *e, - doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, - doublereal *c__, integer *ldc, doublereal *work, integer *info, - ftnlen uplo_len) + ncvt, integer *nru, integer *ncc, doublereal *d__, doublereal *e, + doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, + doublereal *c__, integer *ldc, doublereal *work, integer *info, + ftnlen uplo_len) { /* System generated locals */ - integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, - i__2; + integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, + i__2; /* Local variables */ integer i__, j; @@ -248,17 +248,17 @@ f"> */ doublereal smin; integer sqre1; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dlasr_(char *, char *, char *, integer *, - integer *, doublereal *, doublereal *, doublereal *, integer *, - ftnlen, ftnlen, ftnlen), dswap_(integer *, doublereal *, integer * - , doublereal *, integer *); + extern /* Subroutine */ int dlasr_(char *, char *, char *, integer *, + integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen, ftnlen), dswap_(integer *, doublereal *, integer * + , doublereal *, integer *); integer iuplo; - extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *), xerbla_(char *, - integer *, ftnlen), dbdsqr_(char *, integer *, integer *, integer - *, integer *, doublereal *, doublereal *, doublereal *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, ftnlen); + extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *), xerbla_(char *, + integer *, ftnlen), dbdsqr_(char *, integer *, integer *, integer + *, integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen); logical rotate; @@ -305,37 +305,37 @@ f"> */ *info = 0; iuplo = 0; if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - iuplo = 1; + iuplo = 1; } if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - iuplo = 2; + iuplo = 2; } if (iuplo == 0) { - *info = -1; + *info = -1; } else if (*sqre < 0 || *sqre > 1) { - *info = -2; + *info = -2; } else if (*n < 0) { - *info = -3; + *info = -3; } else if (*ncvt < 0) { - *info = -4; + *info = -4; } else if (*nru < 0) { - *info = -5; + *info = -5; } else if (*ncc < 0) { - *info = -6; + *info = -6; } else if (*ncvt == 0 && *ldvt < 1 || *ncvt > 0 && *ldvt < max(1,*n)) { - *info = -10; + *info = -10; } else if (*ldu < max(1,*nru)) { - *info = -12; + *info = -12; } else if (*ncc == 0 && *ldc < 1 || *ncc > 0 && *ldc < max(1,*n)) { - *info = -14; + *info = -14; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLASDQ", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLASDQ", &i__1, (ftnlen)6); + return 0; } if (*n == 0) { - return 0; + return 0; } /* ROTATE is true if any singular vectors desired, false otherwise */ @@ -348,92 +348,92 @@ f"> */ /* bidiagonal. The rotations are on the right. */ if (iuplo == 1 && sqre1 == 1) { - i__1 = *n - 1; - for (i__ = 1; i__ <= i__1; ++i__) { - dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); - d__[i__] = r__; - e[i__] = sn * d__[i__ + 1]; - d__[i__ + 1] = cs * d__[i__ + 1]; - if (rotate) { - work[i__] = cs; - work[*n + i__] = sn; - } + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); + d__[i__] = r__; + e[i__] = sn * d__[i__ + 1]; + d__[i__ + 1] = cs * d__[i__ + 1]; + if (rotate) { + work[i__] = cs; + work[*n + i__] = sn; + } /* L10: */ - } - dlartg_(&d__[*n], &e[*n], &cs, &sn, &r__); - d__[*n] = r__; - e[*n] = 0.; - if (rotate) { - work[*n] = cs; - work[*n + *n] = sn; - } - iuplo = 2; - sqre1 = 0; + } + dlartg_(&d__[*n], &e[*n], &cs, &sn, &r__); + d__[*n] = r__; + e[*n] = 0.; + if (rotate) { + work[*n] = cs; + work[*n + *n] = sn; + } + iuplo = 2; + sqre1 = 0; /* Update singular vectors if desired. */ - if (*ncvt > 0) { - dlasr_((char *)"L", (char *)"V", (char *)"F", &np1, ncvt, &work[1], &work[np1], &vt[ - vt_offset], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } + if (*ncvt > 0) { + dlasr_((char *)"L", (char *)"V", (char *)"F", &np1, ncvt, &work[1], &work[np1], &vt[ + vt_offset], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } } /* If matrix lower bidiagonal, rotate to be upper bidiagonal */ /* by applying Givens rotations on the left. */ if (iuplo == 2) { - i__1 = *n - 1; - for (i__ = 1; i__ <= i__1; ++i__) { - dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); - d__[i__] = r__; - e[i__] = sn * d__[i__ + 1]; - d__[i__ + 1] = cs * d__[i__ + 1]; - if (rotate) { - work[i__] = cs; - work[*n + i__] = sn; - } + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + dlartg_(&d__[i__], &e[i__], &cs, &sn, &r__); + d__[i__] = r__; + e[i__] = sn * d__[i__ + 1]; + d__[i__ + 1] = cs * d__[i__ + 1]; + if (rotate) { + work[i__] = cs; + work[*n + i__] = sn; + } /* L20: */ - } + } /* If matrix (N+1)-by-N lower bidiagonal, one additional */ /* rotation is needed. */ - if (sqre1 == 1) { - dlartg_(&d__[*n], &e[*n], &cs, &sn, &r__); - d__[*n] = r__; - if (rotate) { - work[*n] = cs; - work[*n + *n] = sn; - } - } + if (sqre1 == 1) { + dlartg_(&d__[*n], &e[*n], &cs, &sn, &r__); + d__[*n] = r__; + if (rotate) { + work[*n] = cs; + work[*n + *n] = sn; + } + } /* Update singular vectors if desired. */ - if (*nru > 0) { - if (sqre1 == 0) { - dlasr_((char *)"R", (char *)"V", (char *)"F", nru, n, &work[1], &work[np1], &u[ - u_offset], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } else { - dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &np1, &work[1], &work[np1], &u[ - u_offset], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } - } - if (*ncc > 0) { - if (sqre1 == 0) { - dlasr_((char *)"L", (char *)"V", (char *)"F", n, ncc, &work[1], &work[np1], &c__[ - c_offset], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } else { - dlasr_((char *)"L", (char *)"V", (char *)"F", &np1, ncc, &work[1], &work[np1], &c__[ - c_offset], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } - } + if (*nru > 0) { + if (sqre1 == 0) { + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, n, &work[1], &work[np1], &u[ + u_offset], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } else { + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &np1, &work[1], &work[np1], &u[ + u_offset], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + } + if (*ncc > 0) { + if (sqre1 == 0) { + dlasr_((char *)"L", (char *)"V", (char *)"F", n, ncc, &work[1], &work[np1], &c__[ + c_offset], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } else { + dlasr_((char *)"L", (char *)"V", (char *)"F", &np1, ncc, &work[1], &work[np1], &c__[ + c_offset], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } + } } /* Call DBDSQR to compute the SVD of the reduced real */ /* N-by-N upper bidiagonal matrix. */ dbdsqr_((char *)"U", n, ncvt, nru, ncc, &d__[1], &e[1], &vt[vt_offset], ldvt, &u[ - u_offset], ldu, &c__[c_offset], ldc, &work[1], info, (ftnlen)1); + u_offset], ldu, &c__[c_offset], ldc, &work[1], info, (ftnlen)1); /* Sort the singular values into ascending order (insertion sort on */ /* singular values, but only one transposition per singular vector) */ @@ -443,35 +443,35 @@ f"> */ /* Scan for smallest D(I). */ - isub = i__; - smin = d__[i__]; - i__2 = *n; - for (j = i__ + 1; j <= i__2; ++j) { - if (d__[j] < smin) { - isub = j; - smin = d__[j]; - } + isub = i__; + smin = d__[i__]; + i__2 = *n; + for (j = i__ + 1; j <= i__2; ++j) { + if (d__[j] < smin) { + isub = j; + smin = d__[j]; + } /* L30: */ - } - if (isub != i__) { + } + if (isub != i__) { /* Swap singular values and vectors. */ - d__[isub] = d__[i__]; - d__[i__] = smin; - if (*ncvt > 0) { - dswap_(ncvt, &vt[isub + vt_dim1], ldvt, &vt[i__ + vt_dim1], - ldvt); - } - if (*nru > 0) { - dswap_(nru, &u[isub * u_dim1 + 1], &c__1, &u[i__ * u_dim1 + 1] - , &c__1); - } - if (*ncc > 0) { - dswap_(ncc, &c__[isub + c_dim1], ldc, &c__[i__ + c_dim1], ldc) - ; - } - } + d__[isub] = d__[i__]; + d__[i__] = smin; + if (*ncvt > 0) { + dswap_(ncvt, &vt[isub + vt_dim1], ldvt, &vt[i__ + vt_dim1], + ldvt); + } + if (*nru > 0) { + dswap_(nru, &u[isub * u_dim1 + 1], &c__1, &u[i__ * u_dim1 + 1] + , &c__1); + } + if (*ncc > 0) { + dswap_(ncc, &c__[isub + c_dim1], ldc, &c__[i__ + c_dim1], ldc) + ; + } + } /* L40: */ } @@ -482,5 +482,5 @@ f"> */ } /* dlasdq_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasdt.cpp b/lib/linalg/dlasdt.cpp index 0e507af8f2..77edcf93d4 100644 --- a/lib/linalg/dlasdt.cpp +++ b/lib/linalg/dlasdt.cpp @@ -1,13 +1,13 @@ /* fortran/dlasdt.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -122,7 +122,7 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dlasdt_(integer *n, integer *lvl, integer *nd, integer * - inode, integer *ndiml, integer *ndimr, integer *msub) + inode, integer *ndiml, integer *ndimr, integer *msub) { /* System generated locals */ integer i__1, i__2; @@ -180,20 +180,20 @@ f"> */ /* Constructing the tree at (NLVL+1)-st level. The number of */ /* nodes created on this level is LLST * 2. */ - i__2 = llst - 1; - for (i__ = 0; i__ <= i__2; ++i__) { - il += 2; - ir += 2; - ncrnt = llst + i__; - ndiml[il] = ndiml[ncrnt] / 2; - ndimr[il] = ndiml[ncrnt] - ndiml[il] - 1; - inode[il] = inode[ncrnt] - ndimr[il] - 1; - ndiml[ir] = ndimr[ncrnt] / 2; - ndimr[ir] = ndimr[ncrnt] - ndiml[ir] - 1; - inode[ir] = inode[ncrnt] + ndiml[ir] + 1; + i__2 = llst - 1; + for (i__ = 0; i__ <= i__2; ++i__) { + il += 2; + ir += 2; + ncrnt = llst + i__; + ndiml[il] = ndiml[ncrnt] / 2; + ndimr[il] = ndiml[ncrnt] - ndiml[il] - 1; + inode[il] = inode[ncrnt] - ndimr[il] - 1; + ndiml[ir] = ndimr[ncrnt] / 2; + ndimr[ir] = ndimr[ncrnt] - ndiml[ir] - 1; + inode[ir] = inode[ncrnt] + ndiml[ir] + 1; /* L10: */ - } - llst <<= 1; + } + llst <<= 1; /* L20: */ } *nd = (llst << 1) - 1; @@ -205,5 +205,5 @@ f"> */ } /* dlasdt_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaset.cpp b/lib/linalg/dlaset.cpp index 072bbf1500..4323f948e4 100644 --- a/lib/linalg/dlaset.cpp +++ b/lib/linalg/dlaset.cpp @@ -1,13 +1,13 @@ /* fortran/dlaset.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -128,7 +128,7 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dlaset_(char *uplo, integer *m, integer *n, doublereal * - alpha, doublereal *beta, doublereal *a, integer *lda, ftnlen uplo_len) + alpha, doublereal *beta, doublereal *a, integer *lda, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -168,53 +168,53 @@ f"> */ /* Set the strictly upper triangular or trapezoidal part of the */ /* array to ALPHA. */ - i__1 = *n; - for (j = 2; j <= i__1; ++j) { + i__1 = *n; + for (j = 2; j <= i__1; ++j) { /* Computing MIN */ - i__3 = j - 1; - i__2 = min(i__3,*m); - for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = *alpha; + i__3 = j - 1; + i__2 = min(i__3,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = *alpha; /* L10: */ - } + } /* L20: */ - } + } } else if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { /* Set the strictly lower triangular or trapezoidal part of the */ /* array to ALPHA. */ - i__1 = min(*m,*n); - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = j + 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = *alpha; + i__1 = min(*m,*n); + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = j + 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = *alpha; /* L30: */ - } + } /* L40: */ - } + } } else { /* Set the leading m-by-n submatrix to ALPHA. */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = *alpha; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = *alpha; /* L50: */ - } + } /* L60: */ - } + } } /* Set the first min(M,N) diagonal elements to BETA. */ i__1 = min(*m,*n); for (i__ = 1; i__ <= i__1; ++i__) { - a[i__ + i__ * a_dim1] = *beta; + a[i__ + i__ * a_dim1] = *beta; /* L70: */ } @@ -225,5 +225,5 @@ f"> */ } /* dlaset_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasq1.cpp b/lib/linalg/dlasq1.cpp index 090f680525..0c9e0ca9f2 100644 --- a/lib/linalg/dlasq1.cpp +++ b/lib/linalg/dlasq1.cpp @@ -1,13 +1,13 @@ /* fortran/dlasq1.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -130,8 +130,8 @@ f"> */ /* > \ingroup auxOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dlasq1_(integer *n, doublereal *d__, doublereal *e, - doublereal *work, integer *info) +/* Subroutine */ int dlasq1_(integer *n, doublereal *d__, doublereal *e, + doublereal *work, integer *info) { /* System generated locals */ integer i__1, i__2; @@ -143,22 +143,22 @@ f"> */ /* Local variables */ integer i__; doublereal eps; - extern /* Subroutine */ int dlas2_(doublereal *, doublereal *, doublereal - *, doublereal *, doublereal *); + extern /* Subroutine */ int dlas2_(doublereal *, doublereal *, doublereal + *, doublereal *, doublereal *); doublereal scale; integer iinfo; doublereal sigmn; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); doublereal sigmx; extern /* Subroutine */ int dlasq2_(integer *, doublereal *, integer *); extern doublereal dlamch_(char *, ftnlen); - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen); doublereal safmin; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dlasrt_( - char *, integer *, doublereal *, integer *, ftnlen); + char *, integer *, doublereal *, integer *, ftnlen); /* -- LAPACK computational routine -- */ @@ -192,20 +192,20 @@ f"> */ /* Function Body */ *info = 0; if (*n < 0) { - *info = -1; - i__1 = -(*info); - xerbla_((char *)"DLASQ1", &i__1, (ftnlen)6); - return 0; + *info = -1; + i__1 = -(*info); + xerbla_((char *)"DLASQ1", &i__1, (ftnlen)6); + return 0; } else if (*n == 0) { - return 0; + return 0; } else if (*n == 1) { - d__[1] = abs(d__[1]); - return 0; + d__[1] = abs(d__[1]); + return 0; } else if (*n == 2) { - dlas2_(&d__[1], &e[1], &d__[2], &sigmn, &sigmx); - d__[1] = sigmx; - d__[2] = sigmn; - return 0; + dlas2_(&d__[1], &e[1], &d__[2], &sigmn, &sigmx); + d__[1] = sigmx; + d__[2] = sigmn; + return 0; } /* Estimate the largest singular value. */ @@ -213,10 +213,10 @@ f"> */ sigmx = 0.; i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { - d__[i__] = (d__1 = d__[i__], abs(d__1)); + d__[i__] = (d__1 = d__[i__], abs(d__1)); /* Computing MAX */ - d__2 = sigmx, d__3 = (d__1 = e[i__], abs(d__1)); - sigmx = max(d__2,d__3); + d__2 = sigmx, d__3 = (d__1 = e[i__], abs(d__1)); + sigmx = max(d__2,d__3); /* L10: */ } d__[*n] = (d__1 = d__[*n], abs(d__1)); @@ -224,15 +224,15 @@ f"> */ /* Early return if SIGMX is zero (matrix is already diagonal). */ if (sigmx == 0.) { - dlasrt_((char *)"D", n, &d__[1], &iinfo, (ftnlen)1); - return 0; + dlasrt_((char *)"D", n, &d__[1], &iinfo, (ftnlen)1); + return 0; } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing MAX */ - d__1 = sigmx, d__2 = d__[i__]; - sigmx = max(d__1,d__2); + d__1 = sigmx, d__2 = d__[i__]; + sigmx = max(d__1,d__2); /* L20: */ } @@ -247,16 +247,16 @@ f"> */ dcopy_(&i__1, &e[1], &c__1, &work[2], &c__2); i__1 = (*n << 1) - 1; i__2 = (*n << 1) - 1; - dlascl_((char *)"G", &c__0, &c__0, &sigmx, &scale, &i__1, &c__1, &work[1], &i__2, - &iinfo, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &sigmx, &scale, &i__1, &c__1, &work[1], &i__2, + &iinfo, (ftnlen)1); /* Compute the q's and e's. */ i__1 = (*n << 1) - 1; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing 2nd power */ - d__1 = work[i__]; - work[i__] = d__1 * d__1; + d__1 = work[i__]; + work[i__] = d__1 * d__1; /* L30: */ } work[*n * 2] = 0.; @@ -264,27 +264,27 @@ f"> */ dlasq2_(n, &work[1], info); if (*info == 0) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - d__[i__] = sqrt(work[i__]); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + d__[i__] = sqrt(work[i__]); /* L40: */ - } - dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &d__[1], n, & - iinfo, (ftnlen)1); + } + dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &d__[1], n, & + iinfo, (ftnlen)1); } else if (*info == 2) { /* Maximum number of iterations exceeded. Move data from WORK */ /* into D and E so the calling subroutine can try to finish */ - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - d__[i__] = sqrt(work[(i__ << 1) - 1]); - e[i__] = sqrt(work[i__ * 2]); - } - dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &d__[1], n, & - iinfo, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &e[1], n, &iinfo, - (ftnlen)1); + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + d__[i__] = sqrt(work[(i__ << 1) - 1]); + e[i__] = sqrt(work[i__ * 2]); + } + dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &d__[1], n, & + iinfo, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &e[1], n, &iinfo, + (ftnlen)1); } return 0; @@ -294,5 +294,5 @@ f"> */ } /* dlasq1_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasq2.cpp b/lib/linalg/dlasq2.cpp index a6362ecfdf..c9e4b30884 100644 --- a/lib/linalg/dlasq2.cpp +++ b/lib/linalg/dlasq2.cpp @@ -1,13 +1,13 @@ /* fortran/dlasq2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -168,20 +168,20 @@ f"> */ integer iinfo; doublereal tempe, tempq; integer ttype; - extern /* Subroutine */ int dlasq3_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - integer *, integer *, integer *, logical *, integer *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *); + extern /* Subroutine */ int dlasq3_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + integer *, integer *, integer *, logical *, integer *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); extern doublereal dlamch_(char *, ftnlen); doublereal deemin; integer iwhila, iwhilb; doublereal oldemn, safmin; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, - integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, + integer *, ftnlen); /* -- LAPACK computational routine -- */ @@ -223,57 +223,57 @@ f"> */ tol2 = d__1 * d__1; if (*n < 0) { - *info = -1; - xerbla_((char *)"DLASQ2", &c__1, (ftnlen)6); - return 0; + *info = -1; + xerbla_((char *)"DLASQ2", &c__1, (ftnlen)6); + return 0; } else if (*n == 0) { - return 0; + return 0; } else if (*n == 1) { /* 1-by-1 case. */ - if (z__[1] < 0.) { - *info = -201; - xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); - } - return 0; + if (z__[1] < 0.) { + *info = -201; + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + } + return 0; } else if (*n == 2) { /* 2-by-2 case. */ - if (z__[1] < 0.) { - *info = -201; - xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); - return 0; - } else if (z__[2] < 0.) { - *info = -202; - xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); - return 0; - } else if (z__[3] < 0.) { - *info = -203; - xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); - return 0; - } else if (z__[3] > z__[1]) { - d__ = z__[3]; - z__[3] = z__[1]; - z__[1] = d__; - } - z__[5] = z__[1] + z__[2] + z__[3]; - if (z__[2] > z__[3] * tol2) { - t = (z__[1] - z__[3] + z__[2]) * .5; - s = z__[3] * (z__[2] / t); - if (s <= t) { - s = z__[3] * (z__[2] / (t * (sqrt(s / t + 1.) + 1.))); - } else { - s = z__[3] * (z__[2] / (t + sqrt(t) * sqrt(t + s))); - } - t = z__[1] + (s + z__[2]); - z__[3] *= z__[1] / t; - z__[1] = t; - } - z__[2] = z__[3]; - z__[6] = z__[2] + z__[1]; - return 0; + if (z__[1] < 0.) { + *info = -201; + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + return 0; + } else if (z__[2] < 0.) { + *info = -202; + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + return 0; + } else if (z__[3] < 0.) { + *info = -203; + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + return 0; + } else if (z__[3] > z__[1]) { + d__ = z__[3]; + z__[3] = z__[1]; + z__[1] = d__; + } + z__[5] = z__[1] + z__[2] + z__[3]; + if (z__[2] > z__[3] * tol2) { + t = (z__[1] - z__[3] + z__[2]) * .5; + s = z__[3] * (z__[2] / t); + if (s <= t) { + s = z__[3] * (z__[2] / (t * (sqrt(s / t + 1.) + 1.))); + } else { + s = z__[3] * (z__[2] / (t + sqrt(t) * sqrt(t + s))); + } + t = z__[1] + (s + z__[2]); + z__[3] *= z__[1] / t; + z__[1] = t; + } + z__[2] = z__[3]; + z__[6] = z__[2] + z__[1]; + return 0; } /* Check for negative data and compute sums of q's and e's. */ @@ -287,32 +287,32 @@ f"> */ i__1 = *n - 1 << 1; for (k = 1; k <= i__1; k += 2) { - if (z__[k] < 0.) { - *info = -(k + 200); - xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); - return 0; - } else if (z__[k + 1] < 0.) { - *info = -(k + 201); - xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); - return 0; - } - d__ += z__[k]; - e += z__[k + 1]; + if (z__[k] < 0.) { + *info = -(k + 200); + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + return 0; + } else if (z__[k + 1] < 0.) { + *info = -(k + 201); + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + return 0; + } + d__ += z__[k]; + e += z__[k + 1]; /* Computing MAX */ - d__1 = qmax, d__2 = z__[k]; - qmax = max(d__1,d__2); + d__1 = qmax, d__2 = z__[k]; + qmax = max(d__1,d__2); /* Computing MIN */ - d__1 = emin, d__2 = z__[k + 1]; - emin = min(d__1,d__2); + d__1 = emin, d__2 = z__[k + 1]; + emin = min(d__1,d__2); /* Computing MAX */ - d__1 = max(qmax,zmax), d__2 = z__[k + 1]; - zmax = max(d__1,d__2); + d__1 = max(qmax,zmax), d__2 = z__[k + 1]; + zmax = max(d__1,d__2); /* L10: */ } if (z__[(*n << 1) - 1] < 0.) { - *info = -((*n << 1) + 199); - xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); - return 0; + *info = -((*n << 1) + 199); + xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); + return 0; } d__ += z__[(*n << 1) - 1]; /* Computing MAX */ @@ -323,14 +323,14 @@ f"> */ /* Check for diagonality. */ if (e == 0.) { - i__1 = *n; - for (k = 2; k <= i__1; ++k) { - z__[k] = z__[(k << 1) - 1]; + i__1 = *n; + for (k = 2; k <= i__1; ++k) { + z__[k] = z__[(k << 1) - 1]; /* L20: */ - } - dlasrt_((char *)"D", n, &z__[1], &iinfo, (ftnlen)1); - z__[(*n << 1) - 1] = d__; - return 0; + } + dlasrt_((char *)"D", n, &z__[1], &iinfo, (ftnlen)1); + z__[(*n << 1) - 1] = d__; + return 0; } trace = d__ + e; @@ -338,22 +338,22 @@ f"> */ /* Check for zero data. */ if (trace == 0.) { - z__[(*n << 1) - 1] = 0.; - return 0; + z__[(*n << 1) - 1] = 0.; + return 0; } /* Check whether the machine is IEEE conformable. */ ieee = ilaenv_(&c__10, (char *)"DLASQ2", (char *)"N", &c__1, &c__2, &c__3, &c__4, (ftnlen) - 6, (ftnlen)1) == 1; + 6, (ftnlen)1) == 1; /* Rearrange data for locality: Z=(q1,qq1,e1,ee1,q2,qq2,e2,ee2,...). */ for (k = *n << 1; k >= 2; k += -2) { - z__[k * 2] = 0.; - z__[(k << 1) - 1] = z__[k]; - z__[(k << 1) - 2] = 0.; - z__[(k << 1) - 3] = z__[k - 1]; + z__[k * 2] = 0.; + z__[(k << 1) - 1] = z__[k]; + z__[(k << 1) - 2] = 0.; + z__[(k << 1) - 3] = z__[k - 1]; /* L30: */ } @@ -363,17 +363,17 @@ f"> */ /* Reverse the qd-array, if warranted. */ if (z__[(i0 << 2) - 3] * 1.5 < z__[(n0 << 2) - 3]) { - ipn4 = i0 + n0 << 2; - i__1 = i0 + n0 - 1 << 1; - for (i4 = i0 << 2; i4 <= i__1; i4 += 4) { - temp = z__[i4 - 3]; - z__[i4 - 3] = z__[ipn4 - i4 - 3]; - z__[ipn4 - i4 - 3] = temp; - temp = z__[i4 - 1]; - z__[i4 - 1] = z__[ipn4 - i4 - 5]; - z__[ipn4 - i4 - 5] = temp; + ipn4 = i0 + n0 << 2; + i__1 = i0 + n0 - 1 << 1; + for (i4 = i0 << 2; i4 <= i__1; i4 += 4) { + temp = z__[i4 - 3]; + z__[i4 - 3] = z__[ipn4 - i4 - 3]; + z__[ipn4 - i4 - 3] = temp; + temp = z__[i4 - 1]; + z__[i4 - 1] = z__[ipn4 - i4 - 5]; + z__[ipn4 - i4 - 5] = temp; /* L40: */ - } + } } /* Initial split checking via dqd and Li's test. */ @@ -382,61 +382,61 @@ f"> */ for (k = 1; k <= 2; ++k) { - d__ = z__[(n0 << 2) + pp - 3]; - i__1 = (i0 << 2) + pp; - for (i4 = (n0 - 1 << 2) + pp; i4 >= i__1; i4 += -4) { - if (z__[i4 - 1] <= tol2 * d__) { - z__[i4 - 1] = -0.; - d__ = z__[i4 - 3]; - } else { - d__ = z__[i4 - 3] * (d__ / (d__ + z__[i4 - 1])); - } + d__ = z__[(n0 << 2) + pp - 3]; + i__1 = (i0 << 2) + pp; + for (i4 = (n0 - 1 << 2) + pp; i4 >= i__1; i4 += -4) { + if (z__[i4 - 1] <= tol2 * d__) { + z__[i4 - 1] = -0.; + d__ = z__[i4 - 3]; + } else { + d__ = z__[i4 - 3] * (d__ / (d__ + z__[i4 - 1])); + } /* L50: */ - } + } /* dqd maps Z to ZZ plus Li's test. */ - emin = z__[(i0 << 2) + pp + 1]; - d__ = z__[(i0 << 2) + pp - 3]; - i__1 = (n0 - 1 << 2) + pp; - for (i4 = (i0 << 2) + pp; i4 <= i__1; i4 += 4) { - z__[i4 - (pp << 1) - 2] = d__ + z__[i4 - 1]; - if (z__[i4 - 1] <= tol2 * d__) { - z__[i4 - 1] = -0.; - z__[i4 - (pp << 1) - 2] = d__; - z__[i4 - (pp << 1)] = 0.; - d__ = z__[i4 + 1]; - } else if (safmin * z__[i4 + 1] < z__[i4 - (pp << 1) - 2] && - safmin * z__[i4 - (pp << 1) - 2] < z__[i4 + 1]) { - temp = z__[i4 + 1] / z__[i4 - (pp << 1) - 2]; - z__[i4 - (pp << 1)] = z__[i4 - 1] * temp; - d__ *= temp; - } else { - z__[i4 - (pp << 1)] = z__[i4 + 1] * (z__[i4 - 1] / z__[i4 - ( - pp << 1) - 2]); - d__ = z__[i4 + 1] * (d__ / z__[i4 - (pp << 1) - 2]); - } + emin = z__[(i0 << 2) + pp + 1]; + d__ = z__[(i0 << 2) + pp - 3]; + i__1 = (n0 - 1 << 2) + pp; + for (i4 = (i0 << 2) + pp; i4 <= i__1; i4 += 4) { + z__[i4 - (pp << 1) - 2] = d__ + z__[i4 - 1]; + if (z__[i4 - 1] <= tol2 * d__) { + z__[i4 - 1] = -0.; + z__[i4 - (pp << 1) - 2] = d__; + z__[i4 - (pp << 1)] = 0.; + d__ = z__[i4 + 1]; + } else if (safmin * z__[i4 + 1] < z__[i4 - (pp << 1) - 2] && + safmin * z__[i4 - (pp << 1) - 2] < z__[i4 + 1]) { + temp = z__[i4 + 1] / z__[i4 - (pp << 1) - 2]; + z__[i4 - (pp << 1)] = z__[i4 - 1] * temp; + d__ *= temp; + } else { + z__[i4 - (pp << 1)] = z__[i4 + 1] * (z__[i4 - 1] / z__[i4 - ( + pp << 1) - 2]); + d__ = z__[i4 + 1] * (d__ / z__[i4 - (pp << 1) - 2]); + } /* Computing MIN */ - d__1 = emin, d__2 = z__[i4 - (pp << 1)]; - emin = min(d__1,d__2); + d__1 = emin, d__2 = z__[i4 - (pp << 1)]; + emin = min(d__1,d__2); /* L60: */ - } - z__[(n0 << 2) - pp - 2] = d__; + } + z__[(n0 << 2) - pp - 2] = d__; /* Now find qmax. */ - qmax = z__[(i0 << 2) - pp - 2]; - i__1 = (n0 << 2) - pp - 2; - for (i4 = (i0 << 2) - pp + 2; i4 <= i__1; i4 += 4) { + qmax = z__[(i0 << 2) - pp - 2]; + i__1 = (n0 << 2) - pp - 2; + for (i4 = (i0 << 2) - pp + 2; i4 <= i__1; i4 += 4) { /* Computing MAX */ - d__1 = qmax, d__2 = z__[i4]; - qmax = max(d__1,d__2); + d__1 = qmax, d__2 = z__[i4]; + qmax = max(d__1,d__2); /* L70: */ - } + } /* Prepare for the next iteration on K. */ - pp = 1 - pp; + pp = 1 - pp; /* L80: */ } @@ -457,104 +457,104 @@ f"> */ i__1 = *n + 1; for (iwhila = 1; iwhila <= i__1; ++iwhila) { - if (n0 < 1) { - goto L170; - } + if (n0 < 1) { + goto L170; + } /* While array unfinished do */ /* E(N0) holds the value of SIGMA when submatrix in I0:N0 */ /* splits from the rest of the array, but is negated. */ - desig = 0.; - if (n0 == *n) { - sigma = 0.; - } else { - sigma = -z__[(n0 << 2) - 1]; - } - if (sigma < 0.) { - *info = 1; - return 0; - } + desig = 0.; + if (n0 == *n) { + sigma = 0.; + } else { + sigma = -z__[(n0 << 2) - 1]; + } + if (sigma < 0.) { + *info = 1; + return 0; + } /* Find last unreduced submatrix's top index I0, find QMAX and */ /* EMIN. Find Gershgorin-type bound if Q's much greater than E's. */ - emax = 0.; - if (n0 > i0) { - emin = (d__1 = z__[(n0 << 2) - 5], abs(d__1)); - } else { - emin = 0.; - } - qmin = z__[(n0 << 2) - 3]; - qmax = qmin; - for (i4 = n0 << 2; i4 >= 8; i4 += -4) { - if (z__[i4 - 5] <= 0.) { - goto L100; - } - if (qmin >= emax * 4.) { + emax = 0.; + if (n0 > i0) { + emin = (d__1 = z__[(n0 << 2) - 5], abs(d__1)); + } else { + emin = 0.; + } + qmin = z__[(n0 << 2) - 3]; + qmax = qmin; + for (i4 = n0 << 2; i4 >= 8; i4 += -4) { + if (z__[i4 - 5] <= 0.) { + goto L100; + } + if (qmin >= emax * 4.) { /* Computing MIN */ - d__1 = qmin, d__2 = z__[i4 - 3]; - qmin = min(d__1,d__2); + d__1 = qmin, d__2 = z__[i4 - 3]; + qmin = min(d__1,d__2); /* Computing MAX */ - d__1 = emax, d__2 = z__[i4 - 5]; - emax = max(d__1,d__2); - } + d__1 = emax, d__2 = z__[i4 - 5]; + emax = max(d__1,d__2); + } /* Computing MAX */ - d__1 = qmax, d__2 = z__[i4 - 7] + z__[i4 - 5]; - qmax = max(d__1,d__2); + d__1 = qmax, d__2 = z__[i4 - 7] + z__[i4 - 5]; + qmax = max(d__1,d__2); /* Computing MIN */ - d__1 = emin, d__2 = z__[i4 - 5]; - emin = min(d__1,d__2); + d__1 = emin, d__2 = z__[i4 - 5]; + emin = min(d__1,d__2); /* L90: */ - } - i4 = 4; + } + i4 = 4; L100: - i0 = i4 / 4; - pp = 0; + i0 = i4 / 4; + pp = 0; - if (n0 - i0 > 1) { - dee = z__[(i0 << 2) - 3]; - deemin = dee; - kmin = i0; - i__2 = (n0 << 2) - 3; - for (i4 = (i0 << 2) + 1; i4 <= i__2; i4 += 4) { - dee = z__[i4] * (dee / (dee + z__[i4 - 2])); - if (dee <= deemin) { - deemin = dee; - kmin = (i4 + 3) / 4; - } + if (n0 - i0 > 1) { + dee = z__[(i0 << 2) - 3]; + deemin = dee; + kmin = i0; + i__2 = (n0 << 2) - 3; + for (i4 = (i0 << 2) + 1; i4 <= i__2; i4 += 4) { + dee = z__[i4] * (dee / (dee + z__[i4 - 2])); + if (dee <= deemin) { + deemin = dee; + kmin = (i4 + 3) / 4; + } /* L110: */ - } - if (kmin - i0 << 1 < n0 - kmin && deemin <= z__[(n0 << 2) - 3] * - .5) { - ipn4 = i0 + n0 << 2; - pp = 2; - i__2 = i0 + n0 - 1 << 1; - for (i4 = i0 << 2; i4 <= i__2; i4 += 4) { - temp = z__[i4 - 3]; - z__[i4 - 3] = z__[ipn4 - i4 - 3]; - z__[ipn4 - i4 - 3] = temp; - temp = z__[i4 - 2]; - z__[i4 - 2] = z__[ipn4 - i4 - 2]; - z__[ipn4 - i4 - 2] = temp; - temp = z__[i4 - 1]; - z__[i4 - 1] = z__[ipn4 - i4 - 5]; - z__[ipn4 - i4 - 5] = temp; - temp = z__[i4]; - z__[i4] = z__[ipn4 - i4 - 4]; - z__[ipn4 - i4 - 4] = temp; + } + if (kmin - i0 << 1 < n0 - kmin && deemin <= z__[(n0 << 2) - 3] * + .5) { + ipn4 = i0 + n0 << 2; + pp = 2; + i__2 = i0 + n0 - 1 << 1; + for (i4 = i0 << 2; i4 <= i__2; i4 += 4) { + temp = z__[i4 - 3]; + z__[i4 - 3] = z__[ipn4 - i4 - 3]; + z__[ipn4 - i4 - 3] = temp; + temp = z__[i4 - 2]; + z__[i4 - 2] = z__[ipn4 - i4 - 2]; + z__[ipn4 - i4 - 2] = temp; + temp = z__[i4 - 1]; + z__[i4 - 1] = z__[ipn4 - i4 - 5]; + z__[ipn4 - i4 - 5] = temp; + temp = z__[i4]; + z__[i4] = z__[ipn4 - i4 - 4]; + z__[ipn4 - i4 - 4] = temp; /* L120: */ - } - } - } + } + } + } /* Put -(initial shift) into DMIN. */ /* Computing MAX */ - d__1 = 0., d__2 = qmin - sqrt(qmin) * 2. * sqrt(emax); - dmin__ = -max(d__1,d__2); + d__1 = 0., d__2 = qmin - sqrt(qmin) * 2. * sqrt(emax); + dmin__ = -max(d__1,d__2); /* Now I0:N0 is unreduced. */ /* PP = 0 for ping, PP = 1 for pong. */ @@ -562,113 +562,113 @@ L100: /* and that the tests for deflation upon entry in DLASQ3 */ /* should not be performed. */ - nbig = (n0 - i0 + 1) * 100; - i__2 = nbig; - for (iwhilb = 1; iwhilb <= i__2; ++iwhilb) { - if (i0 > n0) { - goto L150; - } + nbig = (n0 - i0 + 1) * 100; + i__2 = nbig; + for (iwhilb = 1; iwhilb <= i__2; ++iwhilb) { + if (i0 > n0) { + goto L150; + } /* While submatrix unfinished take a good dqds step. */ - dlasq3_(&i0, &n0, &z__[1], &pp, &dmin__, &sigma, &desig, &qmax, & - nfail, &iter, &ndiv, &ieee, &ttype, &dmin1, &dmin2, &dn, & - dn1, &dn2, &g, &tau); + dlasq3_(&i0, &n0, &z__[1], &pp, &dmin__, &sigma, &desig, &qmax, & + nfail, &iter, &ndiv, &ieee, &ttype, &dmin1, &dmin2, &dn, & + dn1, &dn2, &g, &tau); - pp = 1 - pp; + pp = 1 - pp; /* When EMIN is very small check for splits. */ - if (pp == 0 && n0 - i0 >= 3) { - if (z__[n0 * 4] <= tol2 * qmax || z__[(n0 << 2) - 1] <= tol2 * - sigma) { - splt = i0 - 1; - qmax = z__[(i0 << 2) - 3]; - emin = z__[(i0 << 2) - 1]; - oldemn = z__[i0 * 4]; - i__3 = n0 - 3 << 2; - for (i4 = i0 << 2; i4 <= i__3; i4 += 4) { - if (z__[i4] <= tol2 * z__[i4 - 3] || z__[i4 - 1] <= - tol2 * sigma) { - z__[i4 - 1] = -sigma; - splt = i4 / 4; - qmax = 0.; - emin = z__[i4 + 3]; - oldemn = z__[i4 + 4]; - } else { + if (pp == 0 && n0 - i0 >= 3) { + if (z__[n0 * 4] <= tol2 * qmax || z__[(n0 << 2) - 1] <= tol2 * + sigma) { + splt = i0 - 1; + qmax = z__[(i0 << 2) - 3]; + emin = z__[(i0 << 2) - 1]; + oldemn = z__[i0 * 4]; + i__3 = n0 - 3 << 2; + for (i4 = i0 << 2; i4 <= i__3; i4 += 4) { + if (z__[i4] <= tol2 * z__[i4 - 3] || z__[i4 - 1] <= + tol2 * sigma) { + z__[i4 - 1] = -sigma; + splt = i4 / 4; + qmax = 0.; + emin = z__[i4 + 3]; + oldemn = z__[i4 + 4]; + } else { /* Computing MAX */ - d__1 = qmax, d__2 = z__[i4 + 1]; - qmax = max(d__1,d__2); + d__1 = qmax, d__2 = z__[i4 + 1]; + qmax = max(d__1,d__2); /* Computing MIN */ - d__1 = emin, d__2 = z__[i4 - 1]; - emin = min(d__1,d__2); + d__1 = emin, d__2 = z__[i4 - 1]; + emin = min(d__1,d__2); /* Computing MIN */ - d__1 = oldemn, d__2 = z__[i4]; - oldemn = min(d__1,d__2); - } + d__1 = oldemn, d__2 = z__[i4]; + oldemn = min(d__1,d__2); + } /* L130: */ - } - z__[(n0 << 2) - 1] = emin; - z__[n0 * 4] = oldemn; - i0 = splt + 1; - } - } + } + z__[(n0 << 2) - 1] = emin; + z__[n0 * 4] = oldemn; + i0 = splt + 1; + } + } /* L140: */ - } + } - *info = 2; + *info = 2; /* Maximum number of iterations exceeded, restore the shift */ /* SIGMA and place the new d's and e's in a qd array. */ /* This might need to be done for several blocks */ - i1 = i0; - n1 = n0; + i1 = i0; + n1 = n0; L145: - tempq = z__[(i0 << 2) - 3]; - z__[(i0 << 2) - 3] += sigma; - i__2 = n0; - for (k = i0 + 1; k <= i__2; ++k) { - tempe = z__[(k << 2) - 5]; - z__[(k << 2) - 5] *= tempq / z__[(k << 2) - 7]; - tempq = z__[(k << 2) - 3]; - z__[(k << 2) - 3] = z__[(k << 2) - 3] + sigma + tempe - z__[(k << - 2) - 5]; - } + tempq = z__[(i0 << 2) - 3]; + z__[(i0 << 2) - 3] += sigma; + i__2 = n0; + for (k = i0 + 1; k <= i__2; ++k) { + tempe = z__[(k << 2) - 5]; + z__[(k << 2) - 5] *= tempq / z__[(k << 2) - 7]; + tempq = z__[(k << 2) - 3]; + z__[(k << 2) - 3] = z__[(k << 2) - 3] + sigma + tempe - z__[(k << + 2) - 5]; + } /* Prepare to do this on the previous block if there is one */ - if (i1 > 1) { - n1 = i1 - 1; - while(i1 >= 2 && z__[(i1 << 2) - 5] >= 0.) { - --i1; - } - sigma = -z__[(n1 << 2) - 1]; - goto L145; - } - i__2 = *n; - for (k = 1; k <= i__2; ++k) { - z__[(k << 1) - 1] = z__[(k << 2) - 3]; + if (i1 > 1) { + n1 = i1 - 1; + while(i1 >= 2 && z__[(i1 << 2) - 5] >= 0.) { + --i1; + } + sigma = -z__[(n1 << 2) - 1]; + goto L145; + } + i__2 = *n; + for (k = 1; k <= i__2; ++k) { + z__[(k << 1) - 1] = z__[(k << 2) - 3]; /* Only the block 1..N0 is unfinished. The rest of the e's */ /* must be essentially zero, although sometimes other data */ /* has been stored in them. */ - if (k < n0) { - z__[k * 2] = z__[(k << 2) - 1]; - } else { - z__[k * 2] = 0.; - } - } - return 0; + if (k < n0) { + z__[k * 2] = z__[(k << 2) - 1]; + } else { + z__[k * 2] = 0.; + } + } + return 0; /* end IWHILB */ L150: /* L160: */ - ; + ; } *info = 3; @@ -682,7 +682,7 @@ L170: i__1 = *n; for (k = 2; k <= i__1; ++k) { - z__[k] = z__[(k << 2) - 3]; + z__[k] = z__[(k << 2) - 3]; /* L180: */ } @@ -692,7 +692,7 @@ L170: e = 0.; for (k = *n; k >= 1; --k) { - e += z__[k]; + e += z__[k]; /* L190: */ } @@ -712,5 +712,5 @@ L170: } /* dlasq2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasq3.cpp b/lib/linalg/dlasq3.cpp index e5974545a6..f43c67ca34 100644 --- a/lib/linalg/dlasq3.cpp +++ b/lib/linalg/dlasq3.cpp @@ -1,13 +1,13 @@ /* fortran/dlasq3.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -196,12 +196,12 @@ f"> */ /* > \ingroup auxOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dlasq3_(integer *i0, integer *n0, doublereal *z__, - integer *pp, doublereal *dmin__, doublereal *sigma, doublereal *desig, - doublereal *qmax, integer *nfail, integer *iter, integer *ndiv, - logical *ieee, integer *ttype, doublereal *dmin1, doublereal *dmin2, - doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *g, - doublereal *tau) +/* Subroutine */ int dlasq3_(integer *i0, integer *n0, doublereal *z__, + integer *pp, doublereal *dmin__, doublereal *sigma, doublereal *desig, + doublereal *qmax, integer *nfail, integer *iter, integer *ndiv, + logical *ieee, integer *ttype, doublereal *dmin1, doublereal *dmin2, + doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *g, + doublereal *tau) { /* System generated locals */ integer i__1; @@ -216,15 +216,15 @@ f"> */ doublereal eps, tol; integer n0in, ipn4; doublereal tol2, temp; - extern /* Subroutine */ int dlasq4_(integer *, integer *, doublereal *, - integer *, integer *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *, - doublereal *), dlasq5_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, logical * - , doublereal *), dlasq6_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *); + extern /* Subroutine */ int dlasq4_(integer *, integer *, doublereal *, + integer *, integer *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *), dlasq5_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, logical * + , doublereal *), dlasq6_(integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *); extern doublereal dlamch_(char *, ftnlen); extern logical disnan_(doublereal *); @@ -268,21 +268,21 @@ f"> */ L10: if (*n0 < *i0) { - return 0; + return 0; } if (*n0 == *i0) { - goto L20; + goto L20; } nn = (*n0 << 2) + *pp; if (*n0 == *i0 + 1) { - goto L40; + goto L40; } /* Check whether E(N0-1) is negligible, 1 eigenvalue. */ - if (z__[nn - 5] > tol2 * (*sigma + z__[nn - 3]) && z__[nn - (*pp << 1) - - 4] > tol2 * z__[nn - 7]) { - goto L30; + if (z__[nn - 5] > tol2 * (*sigma + z__[nn - 3]) && z__[nn - (*pp << 1) - + 4] > tol2 * z__[nn - 7]) { + goto L30; } L20: @@ -296,28 +296,28 @@ L20: L30: if (z__[nn - 9] > tol2 * *sigma && z__[nn - (*pp << 1) - 8] > tol2 * z__[ - nn - 11]) { - goto L50; + nn - 11]) { + goto L50; } L40: if (z__[nn - 3] > z__[nn - 7]) { - s = z__[nn - 3]; - z__[nn - 3] = z__[nn - 7]; - z__[nn - 7] = s; + s = z__[nn - 3]; + z__[nn - 3] = z__[nn - 7]; + z__[nn - 7] = s; } t = (z__[nn - 7] - z__[nn - 3] + z__[nn - 5]) * .5; if (z__[nn - 5] > z__[nn - 3] * tol2 && t != 0.) { - s = z__[nn - 3] * (z__[nn - 5] / t); - if (s <= t) { - s = z__[nn - 3] * (z__[nn - 5] / (t * (sqrt(s / t + 1.) + 1.))); - } else { - s = z__[nn - 3] * (z__[nn - 5] / (t + sqrt(t) * sqrt(t + s))); - } - t = z__[nn - 7] + (s + z__[nn - 5]); - z__[nn - 3] *= z__[nn - 7] / t; - z__[nn - 7] = t; + s = z__[nn - 3] * (z__[nn - 5] / t); + if (s <= t) { + s = z__[nn - 3] * (z__[nn - 5] / (t * (sqrt(s / t + 1.) + 1.))); + } else { + s = z__[nn - 3] * (z__[nn - 5] / (t + sqrt(t) * sqrt(t + s))); + } + t = z__[nn - 7] + (s + z__[nn - 5]); + z__[nn - 3] *= z__[nn - 7] / t; + z__[nn - 7] = t; } z__[(*n0 << 2) - 7] = z__[nn - 7] + *sigma; z__[(*n0 << 2) - 3] = z__[nn - 3] + *sigma; @@ -326,64 +326,64 @@ L40: L50: if (*pp == 2) { - *pp = 0; + *pp = 0; } /* Reverse the qd-array, if warranted. */ if (*dmin__ <= 0. || *n0 < n0in) { - if (z__[(*i0 << 2) + *pp - 3] * 1.5 < z__[(*n0 << 2) + *pp - 3]) { - ipn4 = *i0 + *n0 << 2; - i__1 = *i0 + *n0 - 1 << 1; - for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { - temp = z__[j4 - 3]; - z__[j4 - 3] = z__[ipn4 - j4 - 3]; - z__[ipn4 - j4 - 3] = temp; - temp = z__[j4 - 2]; - z__[j4 - 2] = z__[ipn4 - j4 - 2]; - z__[ipn4 - j4 - 2] = temp; - temp = z__[j4 - 1]; - z__[j4 - 1] = z__[ipn4 - j4 - 5]; - z__[ipn4 - j4 - 5] = temp; - temp = z__[j4]; - z__[j4] = z__[ipn4 - j4 - 4]; - z__[ipn4 - j4 - 4] = temp; + if (z__[(*i0 << 2) + *pp - 3] * 1.5 < z__[(*n0 << 2) + *pp - 3]) { + ipn4 = *i0 + *n0 << 2; + i__1 = *i0 + *n0 - 1 << 1; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + temp = z__[j4 - 3]; + z__[j4 - 3] = z__[ipn4 - j4 - 3]; + z__[ipn4 - j4 - 3] = temp; + temp = z__[j4 - 2]; + z__[j4 - 2] = z__[ipn4 - j4 - 2]; + z__[ipn4 - j4 - 2] = temp; + temp = z__[j4 - 1]; + z__[j4 - 1] = z__[ipn4 - j4 - 5]; + z__[ipn4 - j4 - 5] = temp; + temp = z__[j4]; + z__[j4] = z__[ipn4 - j4 - 4]; + z__[ipn4 - j4 - 4] = temp; /* L60: */ - } - if (*n0 - *i0 <= 4) { - z__[(*n0 << 2) + *pp - 1] = z__[(*i0 << 2) + *pp - 1]; - z__[(*n0 << 2) - *pp] = z__[(*i0 << 2) - *pp]; - } + } + if (*n0 - *i0 <= 4) { + z__[(*n0 << 2) + *pp - 1] = z__[(*i0 << 2) + *pp - 1]; + z__[(*n0 << 2) - *pp] = z__[(*i0 << 2) - *pp]; + } /* Computing MIN */ - d__1 = *dmin2, d__2 = z__[(*n0 << 2) + *pp - 1]; - *dmin2 = min(d__1,d__2); + d__1 = *dmin2, d__2 = z__[(*n0 << 2) + *pp - 1]; + *dmin2 = min(d__1,d__2); /* Computing MIN */ - d__1 = z__[(*n0 << 2) + *pp - 1], d__2 = z__[(*i0 << 2) + *pp - 1] - , d__1 = min(d__1,d__2), d__2 = z__[(*i0 << 2) + *pp + 3]; - z__[(*n0 << 2) + *pp - 1] = min(d__1,d__2); + d__1 = z__[(*n0 << 2) + *pp - 1], d__2 = z__[(*i0 << 2) + *pp - 1] + , d__1 = min(d__1,d__2), d__2 = z__[(*i0 << 2) + *pp + 3]; + z__[(*n0 << 2) + *pp - 1] = min(d__1,d__2); /* Computing MIN */ - d__1 = z__[(*n0 << 2) - *pp], d__2 = z__[(*i0 << 2) - *pp], d__1 = - min(d__1,d__2), d__2 = z__[(*i0 << 2) - *pp + 4]; - z__[(*n0 << 2) - *pp] = min(d__1,d__2); + d__1 = z__[(*n0 << 2) - *pp], d__2 = z__[(*i0 << 2) - *pp], d__1 = + min(d__1,d__2), d__2 = z__[(*i0 << 2) - *pp + 4]; + z__[(*n0 << 2) - *pp] = min(d__1,d__2); /* Computing MAX */ - d__1 = *qmax, d__2 = z__[(*i0 << 2) + *pp - 3], d__1 = max(d__1, - d__2), d__2 = z__[(*i0 << 2) + *pp + 1]; - *qmax = max(d__1,d__2); - *dmin__ = -0.; - } + d__1 = *qmax, d__2 = z__[(*i0 << 2) + *pp - 3], d__1 = max(d__1, + d__2), d__2 = z__[(*i0 << 2) + *pp + 1]; + *qmax = max(d__1,d__2); + *dmin__ = -0.; + } } /* Choose a shift. */ - dlasq4_(i0, n0, &z__[1], pp, &n0in, dmin__, dmin1, dmin2, dn, dn1, dn2, - tau, ttype, g); + dlasq4_(i0, n0, &z__[1], pp, &n0in, dmin__, dmin1, dmin2, dn, dn1, dn2, + tau, ttype, g); /* Call dqds until DMIN > 0. */ L70: - dlasq5_(i0, n0, &z__[1], pp, tau, sigma, dmin__, dmin1, dmin2, dn, dn1, - dn2, ieee, &eps); + dlasq5_(i0, n0, &z__[1], pp, tau, sigma, dmin__, dmin1, dmin2, dn, dn1, + dn2, ieee, &eps); *ndiv += *n0 - *i0 + 2; ++(*iter); @@ -394,55 +394,55 @@ L70: /* Success. */ - goto L90; + goto L90; - } else if (*dmin__ < 0. && *dmin1 > 0. && z__[(*n0 - 1 << 2) - *pp] < tol - * (*sigma + *dn1) && abs(*dn) < tol * *sigma) { + } else if (*dmin__ < 0. && *dmin1 > 0. && z__[(*n0 - 1 << 2) - *pp] < tol + * (*sigma + *dn1) && abs(*dn) < tol * *sigma) { /* Convergence hidden by negative DN. */ - z__[(*n0 - 1 << 2) - *pp + 2] = 0.; - *dmin__ = 0.; - goto L90; + z__[(*n0 - 1 << 2) - *pp + 2] = 0.; + *dmin__ = 0.; + goto L90; } else if (*dmin__ < 0.) { /* TAU too big. Select new TAU and try again. */ - ++(*nfail); - if (*ttype < -22) { + ++(*nfail); + if (*ttype < -22) { /* Failed twice. Play it safe. */ - *tau = 0.; - } else if (*dmin1 > 0.) { + *tau = 0.; + } else if (*dmin1 > 0.) { /* Late failure. Gives excellent shift. */ - *tau = (*tau + *dmin__) * (1. - eps * 2.); - *ttype += -11; - } else { + *tau = (*tau + *dmin__) * (1. - eps * 2.); + *ttype += -11; + } else { /* Early failure. Divide by 4. */ - *tau *= .25; - *ttype += -12; - } - goto L70; + *tau *= .25; + *ttype += -12; + } + goto L70; } else if (disnan_(dmin__)) { /* NaN. */ - if (*tau == 0.) { - goto L80; - } else { - *tau = 0.; - goto L70; - } + if (*tau == 0.) { + goto L80; + } else { + *tau = 0.; + goto L70; + } } else { /* Possible underflow. Play it safe. */ - goto L80; + goto L80; } /* Risk of underflow. */ @@ -455,12 +455,12 @@ L80: L90: if (*tau < *sigma) { - *desig += *tau; - t = *sigma + *desig; - *desig -= t - *sigma; + *desig += *tau; + t = *sigma + *desig; + *desig -= t - *sigma; } else { - t = *sigma + *tau; - *desig = *sigma - (t - *tau) + *desig; + t = *sigma + *tau; + *desig = *sigma - (t - *tau) + *desig; } *sigma = t; @@ -471,5 +471,5 @@ L90: } /* dlasq3_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasq4.cpp b/lib/linalg/dlasq4.cpp index 4841ada1d2..9629f53161 100644 --- a/lib/linalg/dlasq4.cpp +++ b/lib/linalg/dlasq4.cpp @@ -1,13 +1,13 @@ /* fortran/dlasq4.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -167,10 +167,10 @@ f"> */ /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlasq4_(integer *i0, integer *n0, doublereal *z__, - integer *pp, integer *n0in, doublereal *dmin__, doublereal *dmin1, - doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, - doublereal *tau, integer *ttype, doublereal *g) +/* Subroutine */ int dlasq4_(integer *i0, integer *n0, doublereal *z__, + integer *pp, integer *n0in, doublereal *dmin__, doublereal *dmin1, + doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, + doublereal *tau, integer *ttype, doublereal *g) { /* System generated locals */ integer i__1; @@ -212,9 +212,9 @@ f"> */ /* Function Body */ if (*dmin__ <= 0.) { - *tau = -(*dmin__); - *ttype = -1; - return 0; + *tau = -(*dmin__); + *ttype = -1; + return 0; } nn = (*n0 << 2) + *pp; @@ -222,215 +222,215 @@ f"> */ /* No eigenvalues deflated. */ - if (*dmin__ == *dn || *dmin__ == *dn1) { + if (*dmin__ == *dn || *dmin__ == *dn1) { - b1 = sqrt(z__[nn - 3]) * sqrt(z__[nn - 5]); - b2 = sqrt(z__[nn - 7]) * sqrt(z__[nn - 9]); - a2 = z__[nn - 7] + z__[nn - 5]; + b1 = sqrt(z__[nn - 3]) * sqrt(z__[nn - 5]); + b2 = sqrt(z__[nn - 7]) * sqrt(z__[nn - 9]); + a2 = z__[nn - 7] + z__[nn - 5]; /* Cases 2 and 3. */ - if (*dmin__ == *dn && *dmin1 == *dn1) { - gap2 = *dmin2 - a2 - *dmin2 * .25; - if (gap2 > 0. && gap2 > b2) { - gap1 = a2 - *dn - b2 / gap2 * b2; - } else { - gap1 = a2 - *dn - (b1 + b2); - } - if (gap1 > 0. && gap1 > b1) { + if (*dmin__ == *dn && *dmin1 == *dn1) { + gap2 = *dmin2 - a2 - *dmin2 * .25; + if (gap2 > 0. && gap2 > b2) { + gap1 = a2 - *dn - b2 / gap2 * b2; + } else { + gap1 = a2 - *dn - (b1 + b2); + } + if (gap1 > 0. && gap1 > b1) { /* Computing MAX */ - d__1 = *dn - b1 / gap1 * b1, d__2 = *dmin__ * .5; - s = max(d__1,d__2); - *ttype = -2; - } else { - s = 0.; - if (*dn > b1) { - s = *dn - b1; - } - if (a2 > b1 + b2) { + d__1 = *dn - b1 / gap1 * b1, d__2 = *dmin__ * .5; + s = max(d__1,d__2); + *ttype = -2; + } else { + s = 0.; + if (*dn > b1) { + s = *dn - b1; + } + if (a2 > b1 + b2) { /* Computing MIN */ - d__1 = s, d__2 = a2 - (b1 + b2); - s = min(d__1,d__2); - } + d__1 = s, d__2 = a2 - (b1 + b2); + s = min(d__1,d__2); + } /* Computing MAX */ - d__1 = s, d__2 = *dmin__ * .333; - s = max(d__1,d__2); - *ttype = -3; - } - } else { + d__1 = s, d__2 = *dmin__ * .333; + s = max(d__1,d__2); + *ttype = -3; + } + } else { /* Case 4. */ - *ttype = -4; - s = *dmin__ * .25; - if (*dmin__ == *dn) { - gam = *dn; - a2 = 0.; - if (z__[nn - 5] > z__[nn - 7]) { - return 0; - } - b2 = z__[nn - 5] / z__[nn - 7]; - np = nn - 9; - } else { - np = nn - (*pp << 1); - gam = *dn1; - if (z__[np - 4] > z__[np - 2]) { - return 0; - } - a2 = z__[np - 4] / z__[np - 2]; - if (z__[nn - 9] > z__[nn - 11]) { - return 0; - } - b2 = z__[nn - 9] / z__[nn - 11]; - np = nn - 13; - } + *ttype = -4; + s = *dmin__ * .25; + if (*dmin__ == *dn) { + gam = *dn; + a2 = 0.; + if (z__[nn - 5] > z__[nn - 7]) { + return 0; + } + b2 = z__[nn - 5] / z__[nn - 7]; + np = nn - 9; + } else { + np = nn - (*pp << 1); + gam = *dn1; + if (z__[np - 4] > z__[np - 2]) { + return 0; + } + a2 = z__[np - 4] / z__[np - 2]; + if (z__[nn - 9] > z__[nn - 11]) { + return 0; + } + b2 = z__[nn - 9] / z__[nn - 11]; + np = nn - 13; + } /* Approximate contribution to norm squared from I < NN-1. */ - a2 += b2; - i__1 = (*i0 << 2) - 1 + *pp; - for (i4 = np; i4 >= i__1; i4 += -4) { - if (b2 == 0.) { - goto L20; - } - b1 = b2; - if (z__[i4] > z__[i4 - 2]) { - return 0; - } - b2 *= z__[i4] / z__[i4 - 2]; - a2 += b2; - if (max(b2,b1) * 100. < a2 || .563 < a2) { - goto L20; - } + a2 += b2; + i__1 = (*i0 << 2) - 1 + *pp; + for (i4 = np; i4 >= i__1; i4 += -4) { + if (b2 == 0.) { + goto L20; + } + b1 = b2; + if (z__[i4] > z__[i4 - 2]) { + return 0; + } + b2 *= z__[i4] / z__[i4 - 2]; + a2 += b2; + if (max(b2,b1) * 100. < a2 || .563 < a2) { + goto L20; + } /* L10: */ - } + } L20: - a2 *= 1.05; + a2 *= 1.05; /* Rayleigh quotient residual bound. */ - if (a2 < .563) { - s = gam * (1. - sqrt(a2)) / (a2 + 1.); - } - } - } else if (*dmin__ == *dn2) { + if (a2 < .563) { + s = gam * (1. - sqrt(a2)) / (a2 + 1.); + } + } + } else if (*dmin__ == *dn2) { /* Case 5. */ - *ttype = -5; - s = *dmin__ * .25; + *ttype = -5; + s = *dmin__ * .25; /* Compute contribution to norm squared from I > NN-2. */ - np = nn - (*pp << 1); - b1 = z__[np - 2]; - b2 = z__[np - 6]; - gam = *dn2; - if (z__[np - 8] > b2 || z__[np - 4] > b1) { - return 0; - } - a2 = z__[np - 8] / b2 * (z__[np - 4] / b1 + 1.); + np = nn - (*pp << 1); + b1 = z__[np - 2]; + b2 = z__[np - 6]; + gam = *dn2; + if (z__[np - 8] > b2 || z__[np - 4] > b1) { + return 0; + } + a2 = z__[np - 8] / b2 * (z__[np - 4] / b1 + 1.); /* Approximate contribution to norm squared from I < NN-2. */ - if (*n0 - *i0 > 2) { - b2 = z__[nn - 13] / z__[nn - 15]; - a2 += b2; - i__1 = (*i0 << 2) - 1 + *pp; - for (i4 = nn - 17; i4 >= i__1; i4 += -4) { - if (b2 == 0.) { - goto L40; - } - b1 = b2; - if (z__[i4] > z__[i4 - 2]) { - return 0; - } - b2 *= z__[i4] / z__[i4 - 2]; - a2 += b2; - if (max(b2,b1) * 100. < a2 || .563 < a2) { - goto L40; - } + if (*n0 - *i0 > 2) { + b2 = z__[nn - 13] / z__[nn - 15]; + a2 += b2; + i__1 = (*i0 << 2) - 1 + *pp; + for (i4 = nn - 17; i4 >= i__1; i4 += -4) { + if (b2 == 0.) { + goto L40; + } + b1 = b2; + if (z__[i4] > z__[i4 - 2]) { + return 0; + } + b2 *= z__[i4] / z__[i4 - 2]; + a2 += b2; + if (max(b2,b1) * 100. < a2 || .563 < a2) { + goto L40; + } /* L30: */ - } + } L40: - a2 *= 1.05; - } + a2 *= 1.05; + } - if (a2 < .563) { - s = gam * (1. - sqrt(a2)) / (a2 + 1.); - } - } else { + if (a2 < .563) { + s = gam * (1. - sqrt(a2)) / (a2 + 1.); + } + } else { /* Case 6, no information to guide us. */ - if (*ttype == -6) { - *g += (1. - *g) * .333; - } else if (*ttype == -18) { - *g = .083250000000000005; - } else { - *g = .25; - } - s = *g * *dmin__; - *ttype = -6; - } + if (*ttype == -6) { + *g += (1. - *g) * .333; + } else if (*ttype == -18) { + *g = .083250000000000005; + } else { + *g = .25; + } + s = *g * *dmin__; + *ttype = -6; + } } else if (*n0in == *n0 + 1) { /* One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN. */ - if (*dmin1 == *dn1 && *dmin2 == *dn2) { + if (*dmin1 == *dn1 && *dmin2 == *dn2) { /* Cases 7 and 8. */ - *ttype = -7; - s = *dmin1 * .333; - if (z__[nn - 5] > z__[nn - 7]) { - return 0; - } - b1 = z__[nn - 5] / z__[nn - 7]; - b2 = b1; - if (b2 == 0.) { - goto L60; - } - i__1 = (*i0 << 2) - 1 + *pp; - for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) { - a2 = b1; - if (z__[i4] > z__[i4 - 2]) { - return 0; - } - b1 *= z__[i4] / z__[i4 - 2]; - b2 += b1; - if (max(b1,a2) * 100. < b2) { - goto L60; - } + *ttype = -7; + s = *dmin1 * .333; + if (z__[nn - 5] > z__[nn - 7]) { + return 0; + } + b1 = z__[nn - 5] / z__[nn - 7]; + b2 = b1; + if (b2 == 0.) { + goto L60; + } + i__1 = (*i0 << 2) - 1 + *pp; + for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) { + a2 = b1; + if (z__[i4] > z__[i4 - 2]) { + return 0; + } + b1 *= z__[i4] / z__[i4 - 2]; + b2 += b1; + if (max(b1,a2) * 100. < b2) { + goto L60; + } /* L50: */ - } + } L60: - b2 = sqrt(b2 * 1.05); + b2 = sqrt(b2 * 1.05); /* Computing 2nd power */ - d__1 = b2; - a2 = *dmin1 / (d__1 * d__1 + 1.); - gap2 = *dmin2 * .5 - a2; - if (gap2 > 0. && gap2 > b2 * a2) { + d__1 = b2; + a2 = *dmin1 / (d__1 * d__1 + 1.); + gap2 = *dmin2 * .5 - a2; + if (gap2 > 0. && gap2 > b2 * a2) { /* Computing MAX */ - d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2); - s = max(d__1,d__2); - } else { + d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2); + s = max(d__1,d__2); + } else { /* Computing MAX */ - d__1 = s, d__2 = a2 * (1. - b2 * 1.01); - s = max(d__1,d__2); - *ttype = -8; - } - } else { + d__1 = s, d__2 = a2 * (1. - b2 * 1.01); + s = max(d__1,d__2); + *ttype = -8; + } + } else { /* Case 9. */ - s = *dmin1 * .25; - if (*dmin1 == *dn1) { - s = *dmin1 * .5; - } - *ttype = -9; - } + s = *dmin1 * .25; + if (*dmin1 == *dn1) { + s = *dmin1 * .5; + } + *ttype = -9; + } } else if (*n0in == *n0 + 2) { @@ -438,55 +438,55 @@ L60: /* Cases 10 and 11. */ - if (*dmin2 == *dn2 && z__[nn - 5] * 2. < z__[nn - 7]) { - *ttype = -10; - s = *dmin2 * .333; - if (z__[nn - 5] > z__[nn - 7]) { - return 0; - } - b1 = z__[nn - 5] / z__[nn - 7]; - b2 = b1; - if (b2 == 0.) { - goto L80; - } - i__1 = (*i0 << 2) - 1 + *pp; - for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) { - if (z__[i4] > z__[i4 - 2]) { - return 0; - } - b1 *= z__[i4] / z__[i4 - 2]; - b2 += b1; - if (b1 * 100. < b2) { - goto L80; - } + if (*dmin2 == *dn2 && z__[nn - 5] * 2. < z__[nn - 7]) { + *ttype = -10; + s = *dmin2 * .333; + if (z__[nn - 5] > z__[nn - 7]) { + return 0; + } + b1 = z__[nn - 5] / z__[nn - 7]; + b2 = b1; + if (b2 == 0.) { + goto L80; + } + i__1 = (*i0 << 2) - 1 + *pp; + for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) { + if (z__[i4] > z__[i4 - 2]) { + return 0; + } + b1 *= z__[i4] / z__[i4 - 2]; + b2 += b1; + if (b1 * 100. < b2) { + goto L80; + } /* L70: */ - } + } L80: - b2 = sqrt(b2 * 1.05); + b2 = sqrt(b2 * 1.05); /* Computing 2nd power */ - d__1 = b2; - a2 = *dmin2 / (d__1 * d__1 + 1.); - gap2 = z__[nn - 7] + z__[nn - 9] - sqrt(z__[nn - 11]) * sqrt(z__[ - nn - 9]) - a2; - if (gap2 > 0. && gap2 > b2 * a2) { + d__1 = b2; + a2 = *dmin2 / (d__1 * d__1 + 1.); + gap2 = z__[nn - 7] + z__[nn - 9] - sqrt(z__[nn - 11]) * sqrt(z__[ + nn - 9]) - a2; + if (gap2 > 0. && gap2 > b2 * a2) { /* Computing MAX */ - d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2); - s = max(d__1,d__2); - } else { + d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2); + s = max(d__1,d__2); + } else { /* Computing MAX */ - d__1 = s, d__2 = a2 * (1. - b2 * 1.01); - s = max(d__1,d__2); - } - } else { - s = *dmin2 * .25; - *ttype = -11; - } + d__1 = s, d__2 = a2 * (1. - b2 * 1.01); + s = max(d__1,d__2); + } + } else { + s = *dmin2 * .25; + *ttype = -11; + } } else if (*n0in > *n0 + 2) { /* Case 12, more than two eigenvalues deflated. No information. */ - s = 0.; - *ttype = -12; + s = 0.; + *ttype = -12; } *tau = s; @@ -497,5 +497,5 @@ L80: } /* dlasq4_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasq5.cpp b/lib/linalg/dlasq5.cpp index 13ae0ed20c..a7cd93932f 100644 --- a/lib/linalg/dlasq5.cpp +++ b/lib/linalg/dlasq5.cpp @@ -1,13 +1,13 @@ /* fortran/dlasq5.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -159,10 +159,10 @@ f"> */ /* > \ingroup auxOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dlasq5_(integer *i0, integer *n0, doublereal *z__, - integer *pp, doublereal *tau, doublereal *sigma, doublereal *dmin__, - doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal * - dnm1, doublereal *dnm2, logical *ieee, doublereal *eps) +/* Subroutine */ int dlasq5_(integer *i0, integer *n0, doublereal *z__, + integer *pp, doublereal *tau, doublereal *sigma, doublereal *dmin__, + doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal * + dnm1, doublereal *dnm2, logical *ieee, doublereal *eps) { /* System generated locals */ integer i__1; @@ -198,273 +198,273 @@ f"> */ /* Function Body */ if (*n0 - *i0 - 1 <= 0) { - return 0; + return 0; } dthresh = *eps * (*sigma + *tau); if (*tau < dthresh * .5) { - *tau = 0.; + *tau = 0.; } if (*tau != 0.) { - j4 = (*i0 << 2) + *pp - 3; - emin = z__[j4 + 4]; - d__ = z__[j4] - *tau; - *dmin__ = d__; - *dmin1 = -z__[j4]; + j4 = (*i0 << 2) + *pp - 3; + emin = z__[j4 + 4]; + d__ = z__[j4] - *tau; + *dmin__ = d__; + *dmin1 = -z__[j4]; - if (*ieee) { + if (*ieee) { /* Code for IEEE arithmetic. */ - if (*pp == 0) { - i__1 = *n0 - 3 << 2; - for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { - z__[j4 - 2] = d__ + z__[j4 - 1]; - temp = z__[j4 + 1] / z__[j4 - 2]; - d__ = d__ * temp - *tau; - *dmin__ = min(*dmin__,d__); - z__[j4] = z__[j4 - 1] * temp; + if (*pp == 0) { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 2] = d__ + z__[j4 - 1]; + temp = z__[j4 + 1] / z__[j4 - 2]; + d__ = d__ * temp - *tau; + *dmin__ = min(*dmin__,d__); + z__[j4] = z__[j4 - 1] * temp; /* Computing MIN */ - d__1 = z__[j4]; - emin = min(d__1,emin); + d__1 = z__[j4]; + emin = min(d__1,emin); /* L10: */ - } - } else { - i__1 = *n0 - 3 << 2; - for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { - z__[j4 - 3] = d__ + z__[j4]; - temp = z__[j4 + 2] / z__[j4 - 3]; - d__ = d__ * temp - *tau; - *dmin__ = min(*dmin__,d__); - z__[j4 - 1] = z__[j4] * temp; + } + } else { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 3] = d__ + z__[j4]; + temp = z__[j4 + 2] / z__[j4 - 3]; + d__ = d__ * temp - *tau; + *dmin__ = min(*dmin__,d__); + z__[j4 - 1] = z__[j4] * temp; /* Computing MIN */ - d__1 = z__[j4 - 1]; - emin = min(d__1,emin); + d__1 = z__[j4 - 1]; + emin = min(d__1,emin); /* L20: */ - } - } + } + } /* Unroll last two steps. */ - *dnm2 = d__; - *dmin2 = *dmin__; - j4 = (*n0 - 2 << 2) - *pp; - j4p2 = j4 + (*pp << 1) - 1; - z__[j4 - 2] = *dnm2 + z__[j4p2]; - z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); - *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; - *dmin__ = min(*dmin__,*dnm1); + *dnm2 = d__; + *dmin2 = *dmin__; + j4 = (*n0 - 2 << 2) - *pp; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm2 + z__[j4p2]; + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; + *dmin__ = min(*dmin__,*dnm1); - *dmin1 = *dmin__; - j4 += 4; - j4p2 = j4 + (*pp << 1) - 1; - z__[j4 - 2] = *dnm1 + z__[j4p2]; - z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); - *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; - *dmin__ = min(*dmin__,*dn); + *dmin1 = *dmin__; + j4 += 4; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm1 + z__[j4p2]; + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; + *dmin__ = min(*dmin__,*dn); - } else { + } else { /* Code for non IEEE arithmetic. */ - if (*pp == 0) { - i__1 = *n0 - 3 << 2; - for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { - z__[j4 - 2] = d__ + z__[j4 - 1]; - if (d__ < 0.) { - return 0; - } else { - z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); - d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]) - *tau; - } - *dmin__ = min(*dmin__,d__); + if (*pp == 0) { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 2] = d__ + z__[j4 - 1]; + if (d__ < 0.) { + return 0; + } else { + z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); + d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]) - *tau; + } + *dmin__ = min(*dmin__,d__); /* Computing MIN */ - d__1 = emin, d__2 = z__[j4]; - emin = min(d__1,d__2); + d__1 = emin, d__2 = z__[j4]; + emin = min(d__1,d__2); /* L30: */ - } - } else { - i__1 = *n0 - 3 << 2; - for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { - z__[j4 - 3] = d__ + z__[j4]; - if (d__ < 0.) { - return 0; - } else { - z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); - d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]) - *tau; - } - *dmin__ = min(*dmin__,d__); + } + } else { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 3] = d__ + z__[j4]; + if (d__ < 0.) { + return 0; + } else { + z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); + d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]) - *tau; + } + *dmin__ = min(*dmin__,d__); /* Computing MIN */ - d__1 = emin, d__2 = z__[j4 - 1]; - emin = min(d__1,d__2); + d__1 = emin, d__2 = z__[j4 - 1]; + emin = min(d__1,d__2); /* L40: */ - } - } + } + } /* Unroll last two steps. */ - *dnm2 = d__; - *dmin2 = *dmin__; - j4 = (*n0 - 2 << 2) - *pp; - j4p2 = j4 + (*pp << 1) - 1; - z__[j4 - 2] = *dnm2 + z__[j4p2]; - if (*dnm2 < 0.) { - return 0; - } else { - z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); - *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; - } - *dmin__ = min(*dmin__,*dnm1); + *dnm2 = d__; + *dmin2 = *dmin__; + j4 = (*n0 - 2 << 2) - *pp; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm2 + z__[j4p2]; + if (*dnm2 < 0.) { + return 0; + } else { + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; + } + *dmin__ = min(*dmin__,*dnm1); - *dmin1 = *dmin__; - j4 += 4; - j4p2 = j4 + (*pp << 1) - 1; - z__[j4 - 2] = *dnm1 + z__[j4p2]; - if (*dnm1 < 0.) { - return 0; - } else { - z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); - *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; - } - *dmin__ = min(*dmin__,*dn); + *dmin1 = *dmin__; + j4 += 4; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm1 + z__[j4p2]; + if (*dnm1 < 0.) { + return 0; + } else { + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; + } + *dmin__ = min(*dmin__,*dn); - } + } } else { /* This is the version that sets d's to zero if they are small enough */ - j4 = (*i0 << 2) + *pp - 3; - emin = z__[j4 + 4]; - d__ = z__[j4] - *tau; - *dmin__ = d__; - *dmin1 = -z__[j4]; - if (*ieee) { + j4 = (*i0 << 2) + *pp - 3; + emin = z__[j4 + 4]; + d__ = z__[j4] - *tau; + *dmin__ = d__; + *dmin1 = -z__[j4]; + if (*ieee) { /* Code for IEEE arithmetic. */ - if (*pp == 0) { - i__1 = *n0 - 3 << 2; - for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { - z__[j4 - 2] = d__ + z__[j4 - 1]; - temp = z__[j4 + 1] / z__[j4 - 2]; - d__ = d__ * temp - *tau; - if (d__ < dthresh) { - d__ = 0.; - } - *dmin__ = min(*dmin__,d__); - z__[j4] = z__[j4 - 1] * temp; + if (*pp == 0) { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 2] = d__ + z__[j4 - 1]; + temp = z__[j4 + 1] / z__[j4 - 2]; + d__ = d__ * temp - *tau; + if (d__ < dthresh) { + d__ = 0.; + } + *dmin__ = min(*dmin__,d__); + z__[j4] = z__[j4 - 1] * temp; /* Computing MIN */ - d__1 = z__[j4]; - emin = min(d__1,emin); + d__1 = z__[j4]; + emin = min(d__1,emin); /* L50: */ - } - } else { - i__1 = *n0 - 3 << 2; - for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { - z__[j4 - 3] = d__ + z__[j4]; - temp = z__[j4 + 2] / z__[j4 - 3]; - d__ = d__ * temp - *tau; - if (d__ < dthresh) { - d__ = 0.; - } - *dmin__ = min(*dmin__,d__); - z__[j4 - 1] = z__[j4] * temp; + } + } else { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 3] = d__ + z__[j4]; + temp = z__[j4 + 2] / z__[j4 - 3]; + d__ = d__ * temp - *tau; + if (d__ < dthresh) { + d__ = 0.; + } + *dmin__ = min(*dmin__,d__); + z__[j4 - 1] = z__[j4] * temp; /* Computing MIN */ - d__1 = z__[j4 - 1]; - emin = min(d__1,emin); + d__1 = z__[j4 - 1]; + emin = min(d__1,emin); /* L60: */ - } - } + } + } /* Unroll last two steps. */ - *dnm2 = d__; - *dmin2 = *dmin__; - j4 = (*n0 - 2 << 2) - *pp; - j4p2 = j4 + (*pp << 1) - 1; - z__[j4 - 2] = *dnm2 + z__[j4p2]; - z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); - *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; - *dmin__ = min(*dmin__,*dnm1); + *dnm2 = d__; + *dmin2 = *dmin__; + j4 = (*n0 - 2 << 2) - *pp; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm2 + z__[j4p2]; + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; + *dmin__ = min(*dmin__,*dnm1); - *dmin1 = *dmin__; - j4 += 4; - j4p2 = j4 + (*pp << 1) - 1; - z__[j4 - 2] = *dnm1 + z__[j4p2]; - z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); - *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; - *dmin__ = min(*dmin__,*dn); + *dmin1 = *dmin__; + j4 += 4; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm1 + z__[j4p2]; + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; + *dmin__ = min(*dmin__,*dn); - } else { + } else { /* Code for non IEEE arithmetic. */ - if (*pp == 0) { - i__1 = *n0 - 3 << 2; - for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { - z__[j4 - 2] = d__ + z__[j4 - 1]; - if (d__ < 0.) { - return 0; - } else { - z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); - d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]) - *tau; - } - if (d__ < dthresh) { - d__ = 0.; - } - *dmin__ = min(*dmin__,d__); + if (*pp == 0) { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 2] = d__ + z__[j4 - 1]; + if (d__ < 0.) { + return 0; + } else { + z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); + d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]) - *tau; + } + if (d__ < dthresh) { + d__ = 0.; + } + *dmin__ = min(*dmin__,d__); /* Computing MIN */ - d__1 = emin, d__2 = z__[j4]; - emin = min(d__1,d__2); + d__1 = emin, d__2 = z__[j4]; + emin = min(d__1,d__2); /* L70: */ - } - } else { - i__1 = *n0 - 3 << 2; - for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { - z__[j4 - 3] = d__ + z__[j4]; - if (d__ < 0.) { - return 0; - } else { - z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); - d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]) - *tau; - } - if (d__ < dthresh) { - d__ = 0.; - } - *dmin__ = min(*dmin__,d__); + } + } else { + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 3] = d__ + z__[j4]; + if (d__ < 0.) { + return 0; + } else { + z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); + d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]) - *tau; + } + if (d__ < dthresh) { + d__ = 0.; + } + *dmin__ = min(*dmin__,d__); /* Computing MIN */ - d__1 = emin, d__2 = z__[j4 - 1]; - emin = min(d__1,d__2); + d__1 = emin, d__2 = z__[j4 - 1]; + emin = min(d__1,d__2); /* L80: */ - } - } + } + } /* Unroll last two steps. */ - *dnm2 = d__; - *dmin2 = *dmin__; - j4 = (*n0 - 2 << 2) - *pp; - j4p2 = j4 + (*pp << 1) - 1; - z__[j4 - 2] = *dnm2 + z__[j4p2]; - if (*dnm2 < 0.) { - return 0; - } else { - z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); - *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; - } - *dmin__ = min(*dmin__,*dnm1); + *dnm2 = d__; + *dmin2 = *dmin__; + j4 = (*n0 - 2 << 2) - *pp; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm2 + z__[j4p2]; + if (*dnm2 < 0.) { + return 0; + } else { + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; + } + *dmin__ = min(*dmin__,*dnm1); - *dmin1 = *dmin__; - j4 += 4; - j4p2 = j4 + (*pp << 1) - 1; - z__[j4 - 2] = *dnm1 + z__[j4p2]; - if (*dnm1 < 0.) { - return 0; - } else { - z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); - *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; - } - *dmin__ = min(*dmin__,*dn); + *dmin1 = *dmin__; + j4 += 4; + j4p2 = j4 + (*pp << 1) - 1; + z__[j4 - 2] = *dnm1 + z__[j4p2]; + if (*dnm1 < 0.) { + return 0; + } else { + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; + } + *dmin__ = min(*dmin__,*dn); - } + } } z__[j4 + 2] = *dn; @@ -476,5 +476,5 @@ f"> */ } /* dlasq5_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasq6.cpp b/lib/linalg/dlasq6.cpp index b06e9ad028..96bda77630 100644 --- a/lib/linalg/dlasq6.cpp +++ b/lib/linalg/dlasq6.cpp @@ -1,13 +1,13 @@ /* fortran/dlasq6.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -134,9 +134,9 @@ f"> */ /* > \ingroup auxOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dlasq6_(integer *i0, integer *n0, doublereal *z__, - integer *pp, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, - doublereal *dn, doublereal *dnm1, doublereal *dnm2) +/* Subroutine */ int dlasq6_(integer *i0, integer *n0, doublereal *z__, + integer *pp, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, + doublereal *dn, doublereal *dnm1, doublereal *dnm2) { /* System generated locals */ integer i__1; @@ -176,7 +176,7 @@ f"> */ /* Function Body */ if (*n0 - *i0 - 1 <= 0) { - return 0; + return 0; } safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); @@ -186,53 +186,53 @@ f"> */ *dmin__ = d__; if (*pp == 0) { - i__1 = *n0 - 3 << 2; - for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { - z__[j4 - 2] = d__ + z__[j4 - 1]; - if (z__[j4 - 2] == 0.) { - z__[j4] = 0.; - d__ = z__[j4 + 1]; - *dmin__ = d__; - emin = 0.; - } else if (safmin * z__[j4 + 1] < z__[j4 - 2] && safmin * z__[j4 - - 2] < z__[j4 + 1]) { - temp = z__[j4 + 1] / z__[j4 - 2]; - z__[j4] = z__[j4 - 1] * temp; - d__ *= temp; - } else { - z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); - d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]); - } - *dmin__ = min(*dmin__,d__); + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 2] = d__ + z__[j4 - 1]; + if (z__[j4 - 2] == 0.) { + z__[j4] = 0.; + d__ = z__[j4 + 1]; + *dmin__ = d__; + emin = 0.; + } else if (safmin * z__[j4 + 1] < z__[j4 - 2] && safmin * z__[j4 + - 2] < z__[j4 + 1]) { + temp = z__[j4 + 1] / z__[j4 - 2]; + z__[j4] = z__[j4 - 1] * temp; + d__ *= temp; + } else { + z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); + d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]); + } + *dmin__ = min(*dmin__,d__); /* Computing MIN */ - d__1 = emin, d__2 = z__[j4]; - emin = min(d__1,d__2); + d__1 = emin, d__2 = z__[j4]; + emin = min(d__1,d__2); /* L10: */ - } + } } else { - i__1 = *n0 - 3 << 2; - for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { - z__[j4 - 3] = d__ + z__[j4]; - if (z__[j4 - 3] == 0.) { - z__[j4 - 1] = 0.; - d__ = z__[j4 + 2]; - *dmin__ = d__; - emin = 0.; - } else if (safmin * z__[j4 + 2] < z__[j4 - 3] && safmin * z__[j4 - - 3] < z__[j4 + 2]) { - temp = z__[j4 + 2] / z__[j4 - 3]; - z__[j4 - 1] = z__[j4] * temp; - d__ *= temp; - } else { - z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); - d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]); - } - *dmin__ = min(*dmin__,d__); + i__1 = *n0 - 3 << 2; + for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { + z__[j4 - 3] = d__ + z__[j4]; + if (z__[j4 - 3] == 0.) { + z__[j4 - 1] = 0.; + d__ = z__[j4 + 2]; + *dmin__ = d__; + emin = 0.; + } else if (safmin * z__[j4 + 2] < z__[j4 - 3] && safmin * z__[j4 + - 3] < z__[j4 + 2]) { + temp = z__[j4 + 2] / z__[j4 - 3]; + z__[j4 - 1] = z__[j4] * temp; + d__ *= temp; + } else { + z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); + d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]); + } + *dmin__ = min(*dmin__,d__); /* Computing MIN */ - d__1 = emin, d__2 = z__[j4 - 1]; - emin = min(d__1,d__2); + d__1 = emin, d__2 = z__[j4 - 1]; + emin = min(d__1,d__2); /* L20: */ - } + } } /* Unroll last two steps. */ @@ -243,18 +243,18 @@ f"> */ j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm2 + z__[j4p2]; if (z__[j4 - 2] == 0.) { - z__[j4] = 0.; - *dnm1 = z__[j4p2 + 2]; - *dmin__ = *dnm1; - emin = 0.; - } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < - z__[j4p2 + 2]) { - temp = z__[j4p2 + 2] / z__[j4 - 2]; - z__[j4] = z__[j4p2] * temp; - *dnm1 = *dnm2 * temp; + z__[j4] = 0.; + *dnm1 = z__[j4p2 + 2]; + *dmin__ = *dnm1; + emin = 0.; + } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < + z__[j4p2 + 2]) { + temp = z__[j4p2 + 2] / z__[j4 - 2]; + z__[j4] = z__[j4p2] * temp; + *dnm1 = *dnm2 * temp; } else { - z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); - *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]); + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]); } *dmin__ = min(*dmin__,*dnm1); @@ -263,18 +263,18 @@ f"> */ j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm1 + z__[j4p2]; if (z__[j4 - 2] == 0.) { - z__[j4] = 0.; - *dn = z__[j4p2 + 2]; - *dmin__ = *dn; - emin = 0.; - } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < - z__[j4p2 + 2]) { - temp = z__[j4p2 + 2] / z__[j4 - 2]; - z__[j4] = z__[j4p2] * temp; - *dn = *dnm1 * temp; + z__[j4] = 0.; + *dn = z__[j4p2 + 2]; + *dmin__ = *dn; + emin = 0.; + } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < + z__[j4p2 + 2]) { + temp = z__[j4p2 + 2] / z__[j4 - 2]; + z__[j4] = z__[j4p2] * temp; + *dn = *dnm1 * temp; } else { - z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); - *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]); + z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); + *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]); } *dmin__ = min(*dmin__,*dn); @@ -287,5 +287,5 @@ f"> */ } /* dlasq6_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasr.cpp b/lib/linalg/dlasr.cpp index c4de2f85a9..5baf2cd50c 100644 --- a/lib/linalg/dlasr.cpp +++ b/lib/linalg/dlasr.cpp @@ -1,13 +1,13 @@ /* fortran/dlasr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -216,8 +216,8 @@ extern "C" { /* ===================================================================== */ /* Subroutine */ int dlasr_(char *side, char *pivot, char *direct, integer *m, - integer *n, doublereal *c__, doublereal *s, doublereal *a, integer * - lda, ftnlen side_len, ftnlen pivot_len, ftnlen direct_len) + integer *n, doublereal *c__, doublereal *s, doublereal *a, integer * + lda, ftnlen side_len, ftnlen pivot_len, ftnlen direct_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -265,264 +265,264 @@ extern "C" { /* Function Body */ info = 0; if (! (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) || lsame_(side, (char *)"R", ( - ftnlen)1, (ftnlen)1))) { - info = 1; - } else if (! (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1) || lsame_(pivot, - (char *)"T", (ftnlen)1, (ftnlen)1) || lsame_(pivot, (char *)"B", (ftnlen)1, ( - ftnlen)1))) { - info = 2; - } else if (! (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(direct, - (char *)"B", (ftnlen)1, (ftnlen)1))) { - info = 3; + ftnlen)1, (ftnlen)1))) { + info = 1; + } else if (! (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1) || lsame_(pivot, + (char *)"T", (ftnlen)1, (ftnlen)1) || lsame_(pivot, (char *)"B", (ftnlen)1, ( + ftnlen)1))) { + info = 2; + } else if (! (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(direct, + (char *)"B", (ftnlen)1, (ftnlen)1))) { + info = 3; } else if (*m < 0) { - info = 4; + info = 4; } else if (*n < 0) { - info = 5; + info = 5; } else if (*lda < max(1,*m)) { - info = 9; + info = 9; } if (info != 0) { - xerbla_((char *)"DLASR ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DLASR ", &info, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { - return 0; + return 0; } if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { /* Form P * A */ - if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - i__1 = *m - 1; - for (j = 1; j <= i__1; ++j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - temp = a[j + 1 + i__ * a_dim1]; - a[j + 1 + i__ * a_dim1] = ctemp * temp - stemp * - a[j + i__ * a_dim1]; - a[j + i__ * a_dim1] = stemp * temp + ctemp * a[j - + i__ * a_dim1]; + if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *m - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = a[j + 1 + i__ * a_dim1]; + a[j + 1 + i__ * a_dim1] = ctemp * temp - stemp * + a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = stemp * temp + ctemp * a[j + + i__ * a_dim1]; /* L10: */ - } - } + } + } /* L20: */ - } - } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { - for (j = *m - 1; j >= 1; --j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - temp = a[j + 1 + i__ * a_dim1]; - a[j + 1 + i__ * a_dim1] = ctemp * temp - stemp * - a[j + i__ * a_dim1]; - a[j + i__ * a_dim1] = stemp * temp + ctemp * a[j - + i__ * a_dim1]; + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *m - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = a[j + 1 + i__ * a_dim1]; + a[j + 1 + i__ * a_dim1] = ctemp * temp - stemp * + a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = stemp * temp + ctemp * a[j + + i__ * a_dim1]; /* L30: */ - } - } + } + } /* L40: */ - } - } - } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - i__1 = *m; - for (j = 2; j <= i__1; ++j) { - ctemp = c__[j - 1]; - stemp = s[j - 1]; - if (ctemp != 1. || stemp != 0.) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - temp = a[j + i__ * a_dim1]; - a[j + i__ * a_dim1] = ctemp * temp - stemp * a[ - i__ * a_dim1 + 1]; - a[i__ * a_dim1 + 1] = stemp * temp + ctemp * a[ - i__ * a_dim1 + 1]; + } + } + } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *m; + for (j = 2; j <= i__1; ++j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = ctemp * temp - stemp * a[ + i__ * a_dim1 + 1]; + a[i__ * a_dim1 + 1] = stemp * temp + ctemp * a[ + i__ * a_dim1 + 1]; /* L50: */ - } - } + } + } /* L60: */ - } - } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { - for (j = *m; j >= 2; --j) { - ctemp = c__[j - 1]; - stemp = s[j - 1]; - if (ctemp != 1. || stemp != 0.) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - temp = a[j + i__ * a_dim1]; - a[j + i__ * a_dim1] = ctemp * temp - stemp * a[ - i__ * a_dim1 + 1]; - a[i__ * a_dim1 + 1] = stemp * temp + ctemp * a[ - i__ * a_dim1 + 1]; + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *m; j >= 2; --j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = ctemp * temp - stemp * a[ + i__ * a_dim1 + 1]; + a[i__ * a_dim1 + 1] = stemp * temp + ctemp * a[ + i__ * a_dim1 + 1]; /* L70: */ - } - } + } + } /* L80: */ - } - } - } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - i__1 = *m - 1; - for (j = 1; j <= i__1; ++j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - temp = a[j + i__ * a_dim1]; - a[j + i__ * a_dim1] = stemp * a[*m + i__ * a_dim1] - + ctemp * temp; - a[*m + i__ * a_dim1] = ctemp * a[*m + i__ * - a_dim1] - stemp * temp; + } + } + } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *m - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = stemp * a[*m + i__ * a_dim1] + + ctemp * temp; + a[*m + i__ * a_dim1] = ctemp * a[*m + i__ * + a_dim1] - stemp * temp; /* L90: */ - } - } + } + } /* L100: */ - } - } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { - for (j = *m - 1; j >= 1; --j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - temp = a[j + i__ * a_dim1]; - a[j + i__ * a_dim1] = stemp * a[*m + i__ * a_dim1] - + ctemp * temp; - a[*m + i__ * a_dim1] = ctemp * a[*m + i__ * - a_dim1] - stemp * temp; + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *m - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = stemp * a[*m + i__ * a_dim1] + + ctemp * temp; + a[*m + i__ * a_dim1] = ctemp * a[*m + i__ * + a_dim1] - stemp * temp; /* L110: */ - } - } + } + } /* L120: */ - } - } - } + } + } + } } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { /* Form A * P**T */ - if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - i__1 = *n - 1; - for (j = 1; j <= i__1; ++j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp = a[i__ + (j + 1) * a_dim1]; - a[i__ + (j + 1) * a_dim1] = ctemp * temp - stemp * - a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = stemp * temp + ctemp * a[ - i__ + j * a_dim1]; + if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = a[i__ + (j + 1) * a_dim1]; + a[i__ + (j + 1) * a_dim1] = ctemp * temp - stemp * + a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = stemp * temp + ctemp * a[ + i__ + j * a_dim1]; /* L130: */ - } - } + } + } /* L140: */ - } - } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { - for (j = *n - 1; j >= 1; --j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - temp = a[i__ + (j + 1) * a_dim1]; - a[i__ + (j + 1) * a_dim1] = ctemp * temp - stemp * - a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = stemp * temp + ctemp * a[ - i__ + j * a_dim1]; + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *n - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = a[i__ + (j + 1) * a_dim1]; + a[i__ + (j + 1) * a_dim1] = ctemp * temp - stemp * + a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = stemp * temp + ctemp * a[ + i__ + j * a_dim1]; /* L150: */ - } - } + } + } /* L160: */ - } - } - } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - i__1 = *n; - for (j = 2; j <= i__1; ++j) { - ctemp = c__[j - 1]; - stemp = s[j - 1]; - if (ctemp != 1. || stemp != 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp = a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = ctemp * temp - stemp * a[ - i__ + a_dim1]; - a[i__ + a_dim1] = stemp * temp + ctemp * a[i__ + - a_dim1]; + } + } + } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 2; j <= i__1; ++j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = ctemp * temp - stemp * a[ + i__ + a_dim1]; + a[i__ + a_dim1] = stemp * temp + ctemp * a[i__ + + a_dim1]; /* L170: */ - } - } + } + } /* L180: */ - } - } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { - for (j = *n; j >= 2; --j) { - ctemp = c__[j - 1]; - stemp = s[j - 1]; - if (ctemp != 1. || stemp != 0.) { - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - temp = a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = ctemp * temp - stemp * a[ - i__ + a_dim1]; - a[i__ + a_dim1] = stemp * temp + ctemp * a[i__ + - a_dim1]; + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *n; j >= 2; --j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = ctemp * temp - stemp * a[ + i__ + a_dim1]; + a[i__ + a_dim1] = stemp * temp + ctemp * a[i__ + + a_dim1]; /* L190: */ - } - } + } + } /* L200: */ - } - } - } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - i__1 = *n - 1; - for (j = 1; j <= i__1; ++j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp = a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = stemp * a[i__ + *n * a_dim1] - + ctemp * temp; - a[i__ + *n * a_dim1] = ctemp * a[i__ + *n * - a_dim1] - stemp * temp; + } + } + } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = stemp * a[i__ + *n * a_dim1] + + ctemp * temp; + a[i__ + *n * a_dim1] = ctemp * a[i__ + *n * + a_dim1] - stemp * temp; /* L210: */ - } - } + } + } /* L220: */ - } - } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { - for (j = *n - 1; j >= 1; --j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - temp = a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = stemp * a[i__ + *n * a_dim1] - + ctemp * temp; - a[i__ + *n * a_dim1] = ctemp * a[i__ + *n * - a_dim1] - stemp * temp; + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *n - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + temp = a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = stemp * a[i__ + *n * a_dim1] + + ctemp * temp; + a[i__ + *n * a_dim1] = ctemp * a[i__ + *n * + a_dim1] - stemp * temp; /* L230: */ - } - } + } + } /* L240: */ - } - } - } + } + } + } } return 0; @@ -532,5 +532,5 @@ extern "C" { } /* dlasr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasrt.cpp b/lib/linalg/dlasrt.cpp index 8c0eec5f2e..a796f6e568 100644 --- a/lib/linalg/dlasrt.cpp +++ b/lib/linalg/dlasrt.cpp @@ -1,13 +1,13 @@ /* fortran/dlasrt.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -105,7 +105,7 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dlasrt_(char *id, integer *n, doublereal *d__, integer * - info, ftnlen id_len) + info, ftnlen id_len) { /* System generated locals */ integer i__1, i__2; @@ -117,7 +117,7 @@ f"> */ doublereal tmp; integer endd; extern logical lsame_(char *, char *, ftnlen, ftnlen); - integer stack[64] /* was [2][32] */; + integer stack[64] /* was [2][32] */; doublereal dmnmx; integer start; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); @@ -156,25 +156,25 @@ f"> */ *info = 0; dir = -1; if (lsame_(id, (char *)"D", (ftnlen)1, (ftnlen)1)) { - dir = 0; + dir = 0; } else if (lsame_(id, (char *)"I", (ftnlen)1, (ftnlen)1)) { - dir = 1; + dir = 1; } if (dir == -1) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLASRT", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLASRT", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n <= 1) { - return 0; + return 0; } stkpnt = 1; @@ -188,49 +188,49 @@ L10: /* Do Insertion sort on D( START:ENDD ) */ - if (dir == 0) { + if (dir == 0) { /* Sort into decreasing order */ - i__1 = endd; - for (i__ = start + 1; i__ <= i__1; ++i__) { - i__2 = start + 1; - for (j = i__; j >= i__2; --j) { - if (d__[j] > d__[j - 1]) { - dmnmx = d__[j]; - d__[j] = d__[j - 1]; - d__[j - 1] = dmnmx; - } else { - goto L30; - } + i__1 = endd; + for (i__ = start + 1; i__ <= i__1; ++i__) { + i__2 = start + 1; + for (j = i__; j >= i__2; --j) { + if (d__[j] > d__[j - 1]) { + dmnmx = d__[j]; + d__[j] = d__[j - 1]; + d__[j - 1] = dmnmx; + } else { + goto L30; + } /* L20: */ - } + } L30: - ; - } + ; + } - } else { + } else { /* Sort into increasing order */ - i__1 = endd; - for (i__ = start + 1; i__ <= i__1; ++i__) { - i__2 = start + 1; - for (j = i__; j >= i__2; --j) { - if (d__[j] < d__[j - 1]) { - dmnmx = d__[j]; - d__[j] = d__[j - 1]; - d__[j - 1] = dmnmx; - } else { - goto L50; - } + i__1 = endd; + for (i__ = start + 1; i__ <= i__1; ++i__) { + i__2 = start + 1; + for (j = i__; j >= i__2; --j) { + if (d__[j] < d__[j - 1]) { + dmnmx = d__[j]; + d__[j] = d__[j - 1]; + d__[j - 1] = dmnmx; + } else { + goto L50; + } /* L40: */ - } + } L50: - ; - } + ; + } - } + } } else if (endd - start > 20) { @@ -238,108 +238,108 @@ L50: /* Choose partition entry as median of 3 */ - d1 = d__[start]; - d2 = d__[endd]; - i__ = (start + endd) / 2; - d3 = d__[i__]; - if (d1 < d2) { - if (d3 < d1) { - dmnmx = d1; - } else if (d3 < d2) { - dmnmx = d3; - } else { - dmnmx = d2; - } - } else { - if (d3 < d2) { - dmnmx = d2; - } else if (d3 < d1) { - dmnmx = d3; - } else { - dmnmx = d1; - } - } + d1 = d__[start]; + d2 = d__[endd]; + i__ = (start + endd) / 2; + d3 = d__[i__]; + if (d1 < d2) { + if (d3 < d1) { + dmnmx = d1; + } else if (d3 < d2) { + dmnmx = d3; + } else { + dmnmx = d2; + } + } else { + if (d3 < d2) { + dmnmx = d2; + } else if (d3 < d1) { + dmnmx = d3; + } else { + dmnmx = d1; + } + } - if (dir == 0) { + if (dir == 0) { /* Sort into decreasing order */ - i__ = start - 1; - j = endd + 1; + i__ = start - 1; + j = endd + 1; L60: L70: - --j; - if (d__[j] < dmnmx) { - goto L70; - } + --j; + if (d__[j] < dmnmx) { + goto L70; + } L80: - ++i__; - if (d__[i__] > dmnmx) { - goto L80; - } - if (i__ < j) { - tmp = d__[i__]; - d__[i__] = d__[j]; - d__[j] = tmp; - goto L60; - } - if (j - start > endd - j - 1) { - ++stkpnt; - stack[(stkpnt << 1) - 2] = start; - stack[(stkpnt << 1) - 1] = j; - ++stkpnt; - stack[(stkpnt << 1) - 2] = j + 1; - stack[(stkpnt << 1) - 1] = endd; - } else { - ++stkpnt; - stack[(stkpnt << 1) - 2] = j + 1; - stack[(stkpnt << 1) - 1] = endd; - ++stkpnt; - stack[(stkpnt << 1) - 2] = start; - stack[(stkpnt << 1) - 1] = j; - } - } else { + ++i__; + if (d__[i__] > dmnmx) { + goto L80; + } + if (i__ < j) { + tmp = d__[i__]; + d__[i__] = d__[j]; + d__[j] = tmp; + goto L60; + } + if (j - start > endd - j - 1) { + ++stkpnt; + stack[(stkpnt << 1) - 2] = start; + stack[(stkpnt << 1) - 1] = j; + ++stkpnt; + stack[(stkpnt << 1) - 2] = j + 1; + stack[(stkpnt << 1) - 1] = endd; + } else { + ++stkpnt; + stack[(stkpnt << 1) - 2] = j + 1; + stack[(stkpnt << 1) - 1] = endd; + ++stkpnt; + stack[(stkpnt << 1) - 2] = start; + stack[(stkpnt << 1) - 1] = j; + } + } else { /* Sort into increasing order */ - i__ = start - 1; - j = endd + 1; + i__ = start - 1; + j = endd + 1; L90: L100: - --j; - if (d__[j] > dmnmx) { - goto L100; - } + --j; + if (d__[j] > dmnmx) { + goto L100; + } L110: - ++i__; - if (d__[i__] < dmnmx) { - goto L110; - } - if (i__ < j) { - tmp = d__[i__]; - d__[i__] = d__[j]; - d__[j] = tmp; - goto L90; - } - if (j - start > endd - j - 1) { - ++stkpnt; - stack[(stkpnt << 1) - 2] = start; - stack[(stkpnt << 1) - 1] = j; - ++stkpnt; - stack[(stkpnt << 1) - 2] = j + 1; - stack[(stkpnt << 1) - 1] = endd; - } else { - ++stkpnt; - stack[(stkpnt << 1) - 2] = j + 1; - stack[(stkpnt << 1) - 1] = endd; - ++stkpnt; - stack[(stkpnt << 1) - 2] = start; - stack[(stkpnt << 1) - 1] = j; - } - } + ++i__; + if (d__[i__] < dmnmx) { + goto L110; + } + if (i__ < j) { + tmp = d__[i__]; + d__[i__] = d__[j]; + d__[j] = tmp; + goto L90; + } + if (j - start > endd - j - 1) { + ++stkpnt; + stack[(stkpnt << 1) - 2] = start; + stack[(stkpnt << 1) - 1] = j; + ++stkpnt; + stack[(stkpnt << 1) - 2] = j + 1; + stack[(stkpnt << 1) - 1] = endd; + } else { + ++stkpnt; + stack[(stkpnt << 1) - 2] = j + 1; + stack[(stkpnt << 1) - 1] = endd; + ++stkpnt; + stack[(stkpnt << 1) - 2] = start; + stack[(stkpnt << 1) - 1] = j; + } + } } if (stkpnt > 0) { - goto L10; + goto L10; } return 0; @@ -348,5 +348,5 @@ L110: } /* dlasrt_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlassq.cpp b/lib/linalg/dlassq.cpp index fe346d2247..76391a54f9 100644 --- a/lib/linalg/dlassq.cpp +++ b/lib/linalg/dlassq.cpp @@ -1,13 +1,13 @@ /* fortran/dlassq.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -121,8 +121,8 @@ f"> */ /* > \ingroup OTHERauxiliary */ /* ===================================================================== */ -/* Subroutine */ int dlassq_(integer *n, doublereal *x, integer *incx, - doublereal *scale, doublereal *sumsq) +/* Subroutine */ int dlassq_(integer *n, doublereal *x, integer *incx, + doublereal *scale, doublereal *sumsq) { /* System generated locals */ integer i__1, i__2; @@ -161,24 +161,24 @@ f"> */ /* Function Body */ if (*n > 0) { - i__1 = (*n - 1) * *incx + 1; - i__2 = *incx; - for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { - absxi = (d__1 = x[ix], abs(d__1)); - if (absxi > 0. || disnan_(&absxi)) { - if (*scale < absxi) { + i__1 = (*n - 1) * *incx + 1; + i__2 = *incx; + for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { + absxi = (d__1 = x[ix], abs(d__1)); + if (absxi > 0. || disnan_(&absxi)) { + if (*scale < absxi) { /* Computing 2nd power */ - d__1 = *scale / absxi; - *sumsq = *sumsq * (d__1 * d__1) + 1; - *scale = absxi; - } else { + d__1 = *scale / absxi; + *sumsq = *sumsq * (d__1 * d__1) + 1; + *scale = absxi; + } else { /* Computing 2nd power */ - d__1 = absxi / *scale; - *sumsq += d__1 * d__1; - } - } + d__1 = absxi / *scale; + *sumsq += d__1 * d__1; + } + } /* L10: */ - } + } } return 0; @@ -187,5 +187,5 @@ f"> */ } /* dlassq_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlasv2.cpp b/lib/linalg/dlasv2.cpp index 4667b941d4..7bab630b39 100644 --- a/lib/linalg/dlasv2.cpp +++ b/lib/linalg/dlasv2.cpp @@ -1,13 +1,13 @@ /* fortran/dlasv2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -159,9 +159,9 @@ f"> */ /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlasv2_(doublereal *f, doublereal *g, doublereal *h__, - doublereal *ssmin, doublereal *ssmax, doublereal *snr, doublereal * - csr, doublereal *snl, doublereal *csl) +/* Subroutine */ int dlasv2_(doublereal *f, doublereal *g, doublereal *h__, + doublereal *ssmin, doublereal *ssmax, doublereal *snr, doublereal * + csr, doublereal *snl, doublereal *csl) { /* System generated locals */ doublereal d__1; @@ -170,8 +170,8 @@ f"> */ double sqrt(doublereal), d_sign(doublereal *, doublereal *); /* Local variables */ - doublereal a, d__, l, m, r__, s, t, fa, ga, ha, ft, gt, ht, mm, tt, clt, - crt, slt, srt; + doublereal a, d__, l, m, r__, s, t, fa, ga, ha, ft, gt, ht, mm, tt, clt, + crt, slt, srt; integer pmax; doublereal temp; logical swap; @@ -212,13 +212,13 @@ f"> */ pmax = 1; swap = ha > fa; if (swap) { - pmax = 3; - temp = ft; - ft = ht; - ht = temp; - temp = fa; - fa = ha; - ha = temp; + pmax = 3; + temp = ft; + ft = ht; + ht = temp; + temp = fa; + fa = ha; + ha = temp; /* Now FA .ge. HA */ @@ -229,118 +229,118 @@ f"> */ /* Diagonal matrix */ - *ssmin = ha; - *ssmax = fa; - clt = 1.; - crt = 1.; - slt = 0.; - srt = 0.; + *ssmin = ha; + *ssmax = fa; + clt = 1.; + crt = 1.; + slt = 0.; + srt = 0.; } else { - gasmal = TRUE_; - if (ga > fa) { - pmax = 2; - if (fa / ga < dlamch_((char *)"EPS", (ftnlen)3)) { + gasmal = TRUE_; + if (ga > fa) { + pmax = 2; + if (fa / ga < dlamch_((char *)"EPS", (ftnlen)3)) { /* Case of very large GA */ - gasmal = FALSE_; - *ssmax = ga; - if (ha > 1.) { - *ssmin = fa / (ga / ha); - } else { - *ssmin = fa / ga * ha; - } - clt = 1.; - slt = ht / gt; - srt = 1.; - crt = ft / gt; - } - } - if (gasmal) { + gasmal = FALSE_; + *ssmax = ga; + if (ha > 1.) { + *ssmin = fa / (ga / ha); + } else { + *ssmin = fa / ga * ha; + } + clt = 1.; + slt = ht / gt; + srt = 1.; + crt = ft / gt; + } + } + if (gasmal) { /* Normal case */ - d__ = fa - ha; - if (d__ == fa) { + d__ = fa - ha; + if (d__ == fa) { /* Copes with infinite F or H */ - l = 1.; - } else { - l = d__ / fa; - } + l = 1.; + } else { + l = d__ / fa; + } /* Note that 0 .le. L .le. 1 */ - m = gt / ft; + m = gt / ft; /* Note that abs(M) .le. 1/macheps */ - t = 2. - l; + t = 2. - l; /* Note that T .ge. 1 */ - mm = m * m; - tt = t * t; - s = sqrt(tt + mm); + mm = m * m; + tt = t * t; + s = sqrt(tt + mm); /* Note that 1 .le. S .le. 1 + 1/macheps */ - if (l == 0.) { - r__ = abs(m); - } else { - r__ = sqrt(l * l + mm); - } + if (l == 0.) { + r__ = abs(m); + } else { + r__ = sqrt(l * l + mm); + } /* Note that 0 .le. R .le. 1 + 1/macheps */ - a = (s + r__) * .5; + a = (s + r__) * .5; /* Note that 1 .le. A .le. 1 + abs(M) */ - *ssmin = ha / a; - *ssmax = fa * a; - if (mm == 0.) { + *ssmin = ha / a; + *ssmax = fa * a; + if (mm == 0.) { /* Note that M is very tiny */ - if (l == 0.) { - t = d_sign(&c_b3, &ft) * d_sign(&c_b4, >); - } else { - t = gt / d_sign(&d__, &ft) + m / t; - } - } else { - t = (m / (s + t) + m / (r__ + l)) * (a + 1.); - } - l = sqrt(t * t + 4.); - crt = 2. / l; - srt = t / l; - clt = (crt + srt * m) / a; - slt = ht / ft * srt / a; - } + if (l == 0.) { + t = d_sign(&c_b3, &ft) * d_sign(&c_b4, >); + } else { + t = gt / d_sign(&d__, &ft) + m / t; + } + } else { + t = (m / (s + t) + m / (r__ + l)) * (a + 1.); + } + l = sqrt(t * t + 4.); + crt = 2. / l; + srt = t / l; + clt = (crt + srt * m) / a; + slt = ht / ft * srt / a; + } } if (swap) { - *csl = srt; - *snl = crt; - *csr = slt; - *snr = clt; + *csl = srt; + *snl = crt; + *csr = slt; + *snr = clt; } else { - *csl = clt; - *snl = slt; - *csr = crt; - *snr = srt; + *csl = clt; + *snl = slt; + *csr = crt; + *snr = srt; } /* Correct signs of SSMAX and SSMIN */ if (pmax == 1) { - tsign = d_sign(&c_b4, csr) * d_sign(&c_b4, csl) * d_sign(&c_b4, f); + tsign = d_sign(&c_b4, csr) * d_sign(&c_b4, csl) * d_sign(&c_b4, f); } if (pmax == 2) { - tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, csl) * d_sign(&c_b4, g); + tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, csl) * d_sign(&c_b4, g); } if (pmax == 3) { - tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, snl) * d_sign(&c_b4, h__); + tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, snl) * d_sign(&c_b4, h__); } *ssmax = d_sign(ssmax, &tsign); d__1 = tsign * d_sign(&c_b4, f) * d_sign(&c_b4, h__); @@ -352,5 +352,5 @@ f"> */ } /* dlasv2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlaswp.cpp b/lib/linalg/dlaswp.cpp index db83b75947..05d911f30c 100644 --- a/lib/linalg/dlaswp.cpp +++ b/lib/linalg/dlaswp.cpp @@ -1,13 +1,13 @@ /* fortran/dlaswp.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -131,8 +131,8 @@ f"> */ /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dlaswp_(integer *n, doublereal *a, integer *lda, integer - *k1, integer *k2, integer *ipiv, integer *incx) +/* Subroutine */ int dlaswp_(integer *n, doublereal *a, integer *lda, integer + *k1, integer *k2, integer *ipiv, integer *incx) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; @@ -168,63 +168,63 @@ f"> */ /* Function Body */ if (*incx > 0) { - ix0 = *k1; - i1 = *k1; - i2 = *k2; - inc = 1; + ix0 = *k1; + i1 = *k1; + i2 = *k2; + inc = 1; } else if (*incx < 0) { - ix0 = *k1 + (*k1 - *k2) * *incx; - i1 = *k2; - i2 = *k1; - inc = -1; + ix0 = *k1 + (*k1 - *k2) * *incx; + i1 = *k2; + i2 = *k1; + inc = -1; } else { - return 0; + return 0; } n32 = *n / 32 << 5; if (n32 != 0) { - i__1 = n32; - for (j = 1; j <= i__1; j += 32) { - ix = ix0; - i__2 = i2; - i__3 = inc; - for (i__ = i1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) - { - ip = ipiv[ix]; - if (ip != i__) { - i__4 = j + 31; - for (k = j; k <= i__4; ++k) { - temp = a[i__ + k * a_dim1]; - a[i__ + k * a_dim1] = a[ip + k * a_dim1]; - a[ip + k * a_dim1] = temp; + i__1 = n32; + for (j = 1; j <= i__1; j += 32) { + ix = ix0; + i__2 = i2; + i__3 = inc; + for (i__ = i1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) + { + ip = ipiv[ix]; + if (ip != i__) { + i__4 = j + 31; + for (k = j; k <= i__4; ++k) { + temp = a[i__ + k * a_dim1]; + a[i__ + k * a_dim1] = a[ip + k * a_dim1]; + a[ip + k * a_dim1] = temp; /* L10: */ - } - } - ix += *incx; + } + } + ix += *incx; /* L20: */ - } + } /* L30: */ - } + } } if (n32 != *n) { - ++n32; - ix = ix0; - i__1 = i2; - i__3 = inc; - for (i__ = i1; i__3 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__3) { - ip = ipiv[ix]; - if (ip != i__) { - i__2 = *n; - for (k = n32; k <= i__2; ++k) { - temp = a[i__ + k * a_dim1]; - a[i__ + k * a_dim1] = a[ip + k * a_dim1]; - a[ip + k * a_dim1] = temp; + ++n32; + ix = ix0; + i__1 = i2; + i__3 = inc; + for (i__ = i1; i__3 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__3) { + ip = ipiv[ix]; + if (ip != i__) { + i__2 = *n; + for (k = n32; k <= i__2; ++k) { + temp = a[i__ + k * a_dim1]; + a[i__ + k * a_dim1] = a[ip + k * a_dim1]; + a[ip + k * a_dim1] = temp; /* L40: */ - } - } - ix += *incx; + } + } + ix += *incx; /* L50: */ - } + } } return 0; @@ -234,5 +234,5 @@ f"> */ } /* dlaswp_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlatrd.cpp b/lib/linalg/dlatrd.cpp index b291e1adbf..74fc5fcc87 100644 --- a/lib/linalg/dlatrd.cpp +++ b/lib/linalg/dlatrd.cpp @@ -1,13 +1,13 @@ /* fortran/dlatrd.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -223,28 +223,28 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dlatrd_(char *uplo, integer *n, integer *nb, doublereal * - a, integer *lda, doublereal *e, doublereal *tau, doublereal *w, - integer *ldw, ftnlen uplo_len) + a, integer *lda, doublereal *e, doublereal *tau, doublereal *w, + integer *ldw, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3; /* Local variables */ integer i__, iw; - extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, - integer *); + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, + integer *); doublereal alpha; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen), daxpy_(integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *), - dsymv_(char *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - ftnlen), dlarfg_(integer *, doublereal *, doublereal *, integer *, - doublereal *); + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen), daxpy_(integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *), + dsymv_(char *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen), dlarfg_(integer *, doublereal *, doublereal *, integer *, + doublereal *); /* -- LAPACK auxiliary routine -- */ @@ -284,154 +284,154 @@ f"> */ /* Function Body */ if (*n <= 0) { - return 0; + return 0; } if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { /* Reduce last NB columns of upper triangle */ - i__1 = *n - *nb + 1; - for (i__ = *n; i__ >= i__1; --i__) { - iw = i__ - *n + *nb; - if (i__ < *n) { + i__1 = *n - *nb + 1; + for (i__ = *n; i__ >= i__1; --i__) { + iw = i__ - *n + *nb; + if (i__ < *n) { /* Update A(1:i,i) */ - i__2 = *n - i__; - dgemv_((char *)"No transpose", &i__, &i__2, &c_b5, &a[(i__ + 1) * - a_dim1 + 1], lda, &w[i__ + (iw + 1) * w_dim1], ldw, & - c_b6, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); - i__2 = *n - i__; - dgemv_((char *)"No transpose", &i__, &i__2, &c_b5, &w[(iw + 1) * - w_dim1 + 1], ldw, &a[i__ + (i__ + 1) * a_dim1], lda, & - c_b6, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); - } - if (i__ > 1) { + i__2 = *n - i__; + dgemv_((char *)"No transpose", &i__, &i__2, &c_b5, &a[(i__ + 1) * + a_dim1 + 1], lda, &w[i__ + (iw + 1) * w_dim1], ldw, & + c_b6, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); + i__2 = *n - i__; + dgemv_((char *)"No transpose", &i__, &i__2, &c_b5, &w[(iw + 1) * + w_dim1 + 1], ldw, &a[i__ + (i__ + 1) * a_dim1], lda, & + c_b6, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); + } + if (i__ > 1) { /* Generate elementary reflector H(i) to annihilate */ /* A(1:i-2,i) */ - i__2 = i__ - 1; - dlarfg_(&i__2, &a[i__ - 1 + i__ * a_dim1], &a[i__ * a_dim1 + - 1], &c__1, &tau[i__ - 1]); - e[i__ - 1] = a[i__ - 1 + i__ * a_dim1]; - a[i__ - 1 + i__ * a_dim1] = 1.; + i__2 = i__ - 1; + dlarfg_(&i__2, &a[i__ - 1 + i__ * a_dim1], &a[i__ * a_dim1 + + 1], &c__1, &tau[i__ - 1]); + e[i__ - 1] = a[i__ - 1 + i__ * a_dim1]; + a[i__ - 1 + i__ * a_dim1] = 1.; /* Compute W(1:i-1,i) */ - i__2 = i__ - 1; - dsymv_((char *)"Upper", &i__2, &c_b6, &a[a_offset], lda, &a[i__ * - a_dim1 + 1], &c__1, &c_b16, &w[iw * w_dim1 + 1], & - c__1, (ftnlen)5); - if (i__ < *n) { - i__2 = i__ - 1; - i__3 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &w[(iw + 1) * - w_dim1 + 1], ldw, &a[i__ * a_dim1 + 1], &c__1, & - c_b16, &w[i__ + 1 + iw * w_dim1], &c__1, (ftnlen) - 9); - i__2 = i__ - 1; - i__3 = *n - i__; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[(i__ + 1) * - a_dim1 + 1], lda, &w[i__ + 1 + iw * w_dim1], & - c__1, &c_b6, &w[iw * w_dim1 + 1], &c__1, (ftnlen) - 12); - i__2 = i__ - 1; - i__3 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &a[(i__ + 1) * - a_dim1 + 1], lda, &a[i__ * a_dim1 + 1], &c__1, & - c_b16, &w[i__ + 1 + iw * w_dim1], &c__1, (ftnlen) - 9); - i__2 = i__ - 1; - i__3 = *n - i__; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[(iw + 1) * - w_dim1 + 1], ldw, &w[i__ + 1 + iw * w_dim1], & - c__1, &c_b6, &w[iw * w_dim1 + 1], &c__1, (ftnlen) - 12); - } - i__2 = i__ - 1; - dscal_(&i__2, &tau[i__ - 1], &w[iw * w_dim1 + 1], &c__1); - i__2 = i__ - 1; - alpha = tau[i__ - 1] * -.5 * ddot_(&i__2, &w[iw * w_dim1 + 1], - &c__1, &a[i__ * a_dim1 + 1], &c__1); - i__2 = i__ - 1; - daxpy_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &w[iw * - w_dim1 + 1], &c__1); - } + i__2 = i__ - 1; + dsymv_((char *)"Upper", &i__2, &c_b6, &a[a_offset], lda, &a[i__ * + a_dim1 + 1], &c__1, &c_b16, &w[iw * w_dim1 + 1], & + c__1, (ftnlen)5); + if (i__ < *n) { + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &w[(iw + 1) * + w_dim1 + 1], ldw, &a[i__ * a_dim1 + 1], &c__1, & + c_b16, &w[i__ + 1 + iw * w_dim1], &c__1, (ftnlen) + 9); + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[(i__ + 1) * + a_dim1 + 1], lda, &w[i__ + 1 + iw * w_dim1], & + c__1, &c_b6, &w[iw * w_dim1 + 1], &c__1, (ftnlen) + 12); + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &a[(i__ + 1) * + a_dim1 + 1], lda, &a[i__ * a_dim1 + 1], &c__1, & + c_b16, &w[i__ + 1 + iw * w_dim1], &c__1, (ftnlen) + 9); + i__2 = i__ - 1; + i__3 = *n - i__; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[(iw + 1) * + w_dim1 + 1], ldw, &w[i__ + 1 + iw * w_dim1], & + c__1, &c_b6, &w[iw * w_dim1 + 1], &c__1, (ftnlen) + 12); + } + i__2 = i__ - 1; + dscal_(&i__2, &tau[i__ - 1], &w[iw * w_dim1 + 1], &c__1); + i__2 = i__ - 1; + alpha = tau[i__ - 1] * -.5 * ddot_(&i__2, &w[iw * w_dim1 + 1], + &c__1, &a[i__ * a_dim1 + 1], &c__1); + i__2 = i__ - 1; + daxpy_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &w[iw * + w_dim1 + 1], &c__1); + } /* L10: */ - } + } } else { /* Reduce first NB columns of lower triangle */ - i__1 = *nb; - for (i__ = 1; i__ <= i__1; ++i__) { + i__1 = *nb; + for (i__ = 1; i__ <= i__1; ++i__) { /* Update A(i:n,i) */ - i__2 = *n - i__ + 1; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + a_dim1], lda, - &w[i__ + w_dim1], ldw, &c_b6, &a[i__ + i__ * a_dim1], & - c__1, (ftnlen)12); - i__2 = *n - i__ + 1; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[i__ + w_dim1], ldw, - &a[i__ + a_dim1], lda, &c_b6, &a[i__ + i__ * a_dim1], & - c__1, (ftnlen)12); - if (i__ < *n) { + i__2 = *n - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + a_dim1], lda, + &w[i__ + w_dim1], ldw, &c_b6, &a[i__ + i__ * a_dim1], & + c__1, (ftnlen)12); + i__2 = *n - i__ + 1; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[i__ + w_dim1], ldw, + &a[i__ + a_dim1], lda, &c_b6, &a[i__ + i__ * a_dim1], & + c__1, (ftnlen)12); + if (i__ < *n) { /* Generate elementary reflector H(i) to annihilate */ /* A(i+2:n,i) */ - i__2 = *n - i__; + i__2 = *n - i__; /* Computing MIN */ - i__3 = i__ + 2; - dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*n) + - i__ * a_dim1], &c__1, &tau[i__]); - e[i__] = a[i__ + 1 + i__ * a_dim1]; - a[i__ + 1 + i__ * a_dim1] = 1.; + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*n) + + i__ * a_dim1], &c__1, &tau[i__]); + e[i__] = a[i__ + 1 + i__ * a_dim1]; + a[i__ + 1 + i__ * a_dim1] = 1.; /* Compute W(i+1:n,i) */ - i__2 = *n - i__; - dsymv_((char *)"Lower", &i__2, &c_b6, &a[i__ + 1 + (i__ + 1) * a_dim1] - , lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ - i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)5); - i__2 = *n - i__; - i__3 = i__ - 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &w[i__ + 1 + w_dim1], - ldw, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ - i__ * w_dim1 + 1], &c__1, (ftnlen)9); - i__2 = *n - i__; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + - a_dim1], lda, &w[i__ * w_dim1 + 1], &c__1, &c_b6, &w[ - i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); - i__2 = *n - i__; - i__3 = i__ - 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &a[i__ + 1 + a_dim1], - lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ - i__ * w_dim1 + 1], &c__1, (ftnlen)9); - i__2 = *n - i__; - i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[i__ + 1 + - w_dim1], ldw, &w[i__ * w_dim1 + 1], &c__1, &c_b6, &w[ - i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); - i__2 = *n - i__; - dscal_(&i__2, &tau[i__], &w[i__ + 1 + i__ * w_dim1], &c__1); - i__2 = *n - i__; - alpha = tau[i__] * -.5 * ddot_(&i__2, &w[i__ + 1 + i__ * - w_dim1], &c__1, &a[i__ + 1 + i__ * a_dim1], &c__1); - i__2 = *n - i__; - daxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &w[ - i__ + 1 + i__ * w_dim1], &c__1); - } + i__2 = *n - i__; + dsymv_((char *)"Lower", &i__2, &c_b6, &a[i__ + 1 + (i__ + 1) * a_dim1] + , lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ + i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)5); + i__2 = *n - i__; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &w[i__ + 1 + w_dim1], + ldw, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ + i__ * w_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *n - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + + a_dim1], lda, &w[i__ * w_dim1 + 1], &c__1, &c_b6, &w[ + i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); + i__2 = *n - i__; + i__3 = i__ - 1; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &a[i__ + 1 + a_dim1], + lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ + i__ * w_dim1 + 1], &c__1, (ftnlen)9); + i__2 = *n - i__; + i__3 = i__ - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[i__ + 1 + + w_dim1], ldw, &w[i__ * w_dim1 + 1], &c__1, &c_b6, &w[ + i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); + i__2 = *n - i__; + dscal_(&i__2, &tau[i__], &w[i__ + 1 + i__ * w_dim1], &c__1); + i__2 = *n - i__; + alpha = tau[i__] * -.5 * ddot_(&i__2, &w[i__ + 1 + i__ * + w_dim1], &c__1, &a[i__ + 1 + i__ * a_dim1], &c__1); + i__2 = *n - i__; + daxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &w[ + i__ + 1 + i__ * w_dim1], &c__1); + } /* L20: */ - } + } } return 0; @@ -441,5 +441,5 @@ f"> */ } /* dlatrd_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dlatrs.cpp b/lib/linalg/dlatrs.cpp index 0b68eac917..fc97690682 100644 --- a/lib/linalg/dlatrs.cpp +++ b/lib/linalg/dlatrs.cpp @@ -1,13 +1,13 @@ /* fortran/dlatrs.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -20,7 +20,7 @@ extern "C" { static integer c__1 = 1; static doublereal c_b46 = .5; -/* > \brief \b DLATRS solves a triangular system of equations with the scale factor set to prevent overflow. +/* > \brief \b DLATRS solves a triangular system of equations with the scale factor set to prevent overflow. */ /* =========== DOCUMENTATION =========== */ @@ -260,9 +260,9 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dlatrs_(char *uplo, char *trans, char *diag, char * - normin, integer *n, doublereal *a, integer *lda, doublereal *x, - doublereal *scale, doublereal *cnorm, integer *info, ftnlen uplo_len, - ftnlen trans_len, ftnlen diag_len, ftnlen normin_len) + normin, integer *n, doublereal *a, integer *lda, doublereal *x, + doublereal *scale, doublereal *cnorm, integer *info, ftnlen uplo_len, + ftnlen trans_len, ftnlen diag_len, ftnlen normin_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -272,25 +272,25 @@ f"> */ integer i__, j; doublereal xj, rec, tjj; integer jinc; - extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, - integer *); + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, + integer *); doublereal xbnd; integer imax; doublereal tmax, tjjs, xmax, grow, sumj; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal tscal, uscal; extern doublereal dasum_(integer *, doublereal *, integer *); integer jlast; - extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *); + extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *); logical upper; - extern /* Subroutine */ int dtrsv_(char *, char *, char *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen); - extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, ftnlen); + extern /* Subroutine */ int dtrsv_(char *, char *, char *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen); + extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, + integer *, doublereal *, integer *, doublereal *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); doublereal bignum; @@ -339,65 +339,65 @@ f"> */ /* Test the input parameters. */ if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; - } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && ! - lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -1; + } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && ! + lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + *info = -2; } else if (! nounit && ! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { - *info = -3; + *info = -3; } else if (! lsame_(normin, (char *)"Y", (ftnlen)1, (ftnlen)1) && ! lsame_(normin, - (char *)"N", (ftnlen)1, (ftnlen)1)) { - *info = -4; + (char *)"N", (ftnlen)1, (ftnlen)1)) { + *info = -4; } else if (*n < 0) { - *info = -5; + *info = -5; } else if (*lda < max(1,*n)) { - *info = -7; + *info = -7; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DLATRS", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DLATRS", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ *scale = 1.; if (*n == 0) { - return 0; + return 0; } /* Determine machine dependent parameters to control overflow. */ smlnum = dlamch_((char *)"Safe minimum", (ftnlen)12) / dlamch_((char *)"Precision", ( - ftnlen)9); + ftnlen)9); bignum = 1. / smlnum; if (lsame_(normin, (char *)"N", (ftnlen)1, (ftnlen)1)) { /* Compute the 1-norm of each column, not including the diagonal. */ - if (upper) { + if (upper) { /* A is upper triangular. */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j - 1; - cnorm[j] = dasum_(&i__2, &a[j * a_dim1 + 1], &c__1); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + cnorm[j] = dasum_(&i__2, &a[j * a_dim1 + 1], &c__1); /* L10: */ - } - } else { + } + } else { /* A is lower triangular. */ - i__1 = *n - 1; - for (j = 1; j <= i__1; ++j) { - i__2 = *n - j; - cnorm[j] = dasum_(&i__2, &a[j + 1 + j * a_dim1], &c__1); + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + i__2 = *n - j; + cnorm[j] = dasum_(&i__2, &a[j + 1 + j * a_dim1], &c__1); /* L20: */ - } - cnorm[*n] = 0.; - } + } + cnorm[*n] = 0.; + } } /* Scale the column norms by TSCAL if the maximum element in CNORM is */ @@ -406,81 +406,81 @@ f"> */ imax = idamax_(n, &cnorm[1], &c__1); tmax = cnorm[imax]; if (tmax <= bignum) { - tscal = 1.; + tscal = 1.; } else { /* Avoid NaN generation if entries in CNORM exceed the */ /* overflow threshold */ - if (tmax <= dlamch_((char *)"Overflow", (ftnlen)8)) { + if (tmax <= dlamch_((char *)"Overflow", (ftnlen)8)) { /* Case 1: All entries in CNORM are valid floating-point numbers */ - tscal = 1. / (smlnum * tmax); - dscal_(n, &tscal, &cnorm[1], &c__1); - } else { + tscal = 1. / (smlnum * tmax); + dscal_(n, &tscal, &cnorm[1], &c__1); + } else { /* Case 2: At least one column norm of A cannot be represented */ /* as floating-point number. Find the offdiagonal entry A( I, J ) */ /* with the largest absolute value. If this entry is not +/- Infinity, */ /* use this value as TSCAL. */ - tmax = 0.; - if (upper) { + tmax = 0.; + if (upper) { /* A is upper triangular. */ - i__1 = *n; - for (j = 2; j <= i__1; ++j) { + i__1 = *n; + for (j = 2; j <= i__1; ++j) { /* Computing MAX */ - i__2 = j - 1; - d__1 = dlange_((char *)"M", &i__2, &c__1, &a[j * a_dim1 + 1], & - c__1, &sumj, (ftnlen)1); - tmax = max(d__1,tmax); - } - } else { + i__2 = j - 1; + d__1 = dlange_((char *)"M", &i__2, &c__1, &a[j * a_dim1 + 1], & + c__1, &sumj, (ftnlen)1); + tmax = max(d__1,tmax); + } + } else { /* A is lower triangular. */ - i__1 = *n - 1; - for (j = 1; j <= i__1; ++j) { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { /* Computing MAX */ - i__2 = *n - j; - d__1 = dlange_((char *)"M", &i__2, &c__1, &a[j + 1 + j * a_dim1], - &c__1, &sumj, (ftnlen)1); - tmax = max(d__1,tmax); - } - } + i__2 = *n - j; + d__1 = dlange_((char *)"M", &i__2, &c__1, &a[j + 1 + j * a_dim1], + &c__1, &sumj, (ftnlen)1); + tmax = max(d__1,tmax); + } + } - if (tmax <= dlamch_((char *)"Overflow", (ftnlen)8)) { - tscal = 1. / (smlnum * tmax); - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (cnorm[j] <= dlamch_((char *)"Overflow", (ftnlen)8)) { - cnorm[j] *= tscal; - } else { + if (tmax <= dlamch_((char *)"Overflow", (ftnlen)8)) { + tscal = 1. / (smlnum * tmax); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (cnorm[j] <= dlamch_((char *)"Overflow", (ftnlen)8)) { + cnorm[j] *= tscal; + } else { /* Recompute the 1-norm without introducing Infinity */ /* in the summation */ - cnorm[j] = 0.; - if (upper) { - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - cnorm[j] += tscal * (d__1 = a[i__ + j * - a_dim1], abs(d__1)); - } - } else { - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - cnorm[j] += tscal * (d__1 = a[i__ + j * - a_dim1], abs(d__1)); - } - } - } - } - } else { + cnorm[j] = 0.; + if (upper) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + cnorm[j] += tscal * (d__1 = a[i__ + j * + a_dim1], abs(d__1)); + } + } else { + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + cnorm[j] += tscal * (d__1 = a[i__ + j * + a_dim1], abs(d__1)); + } + } + } + } + } else { /* At least one entry of A is not a valid floating-point entry. */ /* Rely on TRSV to propagate Inf and NaN. */ - dtrsv_(uplo, trans, diag, n, &a[a_offset], lda, &x[1], &c__1, - (ftnlen)1, (ftnlen)1, (ftnlen)1); - return 0; - } - } + dtrsv_(uplo, trans, diag, n, &a[a_offset], lda, &x[1], &c__1, + (ftnlen)1, (ftnlen)1, (ftnlen)1); + return 0; + } + } } /* Compute a bound on the computed solution vector to see if the */ @@ -493,170 +493,170 @@ f"> */ /* Compute the growth in A * x = b. */ - if (upper) { - jfirst = *n; - jlast = 1; - jinc = -1; - } else { - jfirst = 1; - jlast = *n; - jinc = 1; - } + if (upper) { + jfirst = *n; + jlast = 1; + jinc = -1; + } else { + jfirst = 1; + jlast = *n; + jinc = 1; + } - if (tscal != 1.) { - grow = 0.; - goto L50; - } + if (tscal != 1.) { + grow = 0.; + goto L50; + } - if (nounit) { + if (nounit) { /* A is non-unit triangular. */ /* Compute GROW = 1/G(j) and XBND = 1/M(j). */ /* Initially, G(0) = max{x(i), i=1,...,n}. */ - grow = 1. / max(xbnd,smlnum); - xbnd = grow; - i__1 = jlast; - i__2 = jinc; - for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + grow = 1. / max(xbnd,smlnum); + xbnd = grow; + i__1 = jlast; + i__2 = jinc; + for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Exit the loop if the growth factor is too small. */ - if (grow <= smlnum) { - goto L50; - } + if (grow <= smlnum) { + goto L50; + } /* M(j) = G(j-1) / abs(A(j,j)) */ - tjj = (d__1 = a[j + j * a_dim1], abs(d__1)); + tjj = (d__1 = a[j + j * a_dim1], abs(d__1)); /* Computing MIN */ - d__1 = xbnd, d__2 = min(1.,tjj) * grow; - xbnd = min(d__1,d__2); - if (tjj + cnorm[j] >= smlnum) { + d__1 = xbnd, d__2 = min(1.,tjj) * grow; + xbnd = min(d__1,d__2); + if (tjj + cnorm[j] >= smlnum) { /* G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) ) */ - grow *= tjj / (tjj + cnorm[j]); - } else { + grow *= tjj / (tjj + cnorm[j]); + } else { /* G(j) could overflow, set GROW to 0. */ - grow = 0.; - } + grow = 0.; + } /* L30: */ - } - grow = xbnd; - } else { + } + grow = xbnd; + } else { /* A is unit triangular. */ /* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. */ /* Computing MIN */ - d__1 = 1., d__2 = 1. / max(xbnd,smlnum); - grow = min(d__1,d__2); - i__2 = jlast; - i__1 = jinc; - for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { + d__1 = 1., d__2 = 1. / max(xbnd,smlnum); + grow = min(d__1,d__2); + i__2 = jlast; + i__1 = jinc; + for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Exit the loop if the growth factor is too small. */ - if (grow <= smlnum) { - goto L50; - } + if (grow <= smlnum) { + goto L50; + } /* G(j) = G(j-1)*( 1 + CNORM(j) ) */ - grow *= 1. / (cnorm[j] + 1.); + grow *= 1. / (cnorm[j] + 1.); /* L40: */ - } - } + } + } L50: - ; + ; } else { /* Compute the growth in A**T * x = b. */ - if (upper) { - jfirst = 1; - jlast = *n; - jinc = 1; - } else { - jfirst = *n; - jlast = 1; - jinc = -1; - } + if (upper) { + jfirst = 1; + jlast = *n; + jinc = 1; + } else { + jfirst = *n; + jlast = 1; + jinc = -1; + } - if (tscal != 1.) { - grow = 0.; - goto L80; - } + if (tscal != 1.) { + grow = 0.; + goto L80; + } - if (nounit) { + if (nounit) { /* A is non-unit triangular. */ /* Compute GROW = 1/G(j) and XBND = 1/M(j). */ /* Initially, M(0) = max{x(i), i=1,...,n}. */ - grow = 1. / max(xbnd,smlnum); - xbnd = grow; - i__1 = jlast; - i__2 = jinc; - for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + grow = 1. / max(xbnd,smlnum); + xbnd = grow; + i__1 = jlast; + i__2 = jinc; + for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Exit the loop if the growth factor is too small. */ - if (grow <= smlnum) { - goto L80; - } + if (grow <= smlnum) { + goto L80; + } /* G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) ) */ - xj = cnorm[j] + 1.; + xj = cnorm[j] + 1.; /* Computing MIN */ - d__1 = grow, d__2 = xbnd / xj; - grow = min(d__1,d__2); + d__1 = grow, d__2 = xbnd / xj; + grow = min(d__1,d__2); /* M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j)) */ - tjj = (d__1 = a[j + j * a_dim1], abs(d__1)); - if (xj > tjj) { - xbnd *= tjj / xj; - } + tjj = (d__1 = a[j + j * a_dim1], abs(d__1)); + if (xj > tjj) { + xbnd *= tjj / xj; + } /* L60: */ - } - grow = min(grow,xbnd); - } else { + } + grow = min(grow,xbnd); + } else { /* A is unit triangular. */ /* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. */ /* Computing MIN */ - d__1 = 1., d__2 = 1. / max(xbnd,smlnum); - grow = min(d__1,d__2); - i__2 = jlast; - i__1 = jinc; - for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { + d__1 = 1., d__2 = 1. / max(xbnd,smlnum); + grow = min(d__1,d__2); + i__2 = jlast; + i__1 = jinc; + for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Exit the loop if the growth factor is too small. */ - if (grow <= smlnum) { - goto L80; - } + if (grow <= smlnum) { + goto L80; + } /* G(j) = ( 1 + CNORM(j) )*G(j-1) */ - xj = cnorm[j] + 1.; - grow /= xj; + xj = cnorm[j] + 1.; + grow /= xj; /* L70: */ - } - } + } + } L80: - ; + ; } if (grow * tscal > smlnum) { @@ -664,313 +664,313 @@ L80: /* Use the Level 2 BLAS solve if the reciprocal of the bound on */ /* elements of X is not too small. */ - dtrsv_(uplo, trans, diag, n, &a[a_offset], lda, &x[1], &c__1, (ftnlen) - 1, (ftnlen)1, (ftnlen)1); + dtrsv_(uplo, trans, diag, n, &a[a_offset], lda, &x[1], &c__1, (ftnlen) + 1, (ftnlen)1, (ftnlen)1); } else { /* Use a Level 1 BLAS solve, scaling intermediate results. */ - if (xmax > bignum) { + if (xmax > bignum) { /* Scale X so that its components are less than or equal to */ /* BIGNUM in absolute value. */ - *scale = bignum / xmax; - dscal_(n, scale, &x[1], &c__1); - xmax = bignum; - } + *scale = bignum / xmax; + dscal_(n, scale, &x[1], &c__1); + xmax = bignum; + } - if (notran) { + if (notran) { /* Solve A * x = b */ - i__1 = jlast; - i__2 = jinc; - for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + i__1 = jlast; + i__2 = jinc; + for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Compute x(j) = b(j) / A(j,j), scaling x if necessary. */ - xj = (d__1 = x[j], abs(d__1)); - if (nounit) { - tjjs = a[j + j * a_dim1] * tscal; - } else { - tjjs = tscal; - if (tscal == 1.) { - goto L100; - } - } - tjj = abs(tjjs); - if (tjj > smlnum) { + xj = (d__1 = x[j], abs(d__1)); + if (nounit) { + tjjs = a[j + j * a_dim1] * tscal; + } else { + tjjs = tscal; + if (tscal == 1.) { + goto L100; + } + } + tjj = abs(tjjs); + if (tjj > smlnum) { /* abs(A(j,j)) > SMLNUM: */ - if (tjj < 1.) { - if (xj > tjj * bignum) { + if (tjj < 1.) { + if (xj > tjj * bignum) { /* Scale x by 1/b(j). */ - rec = 1. / xj; - dscal_(n, &rec, &x[1], &c__1); - *scale *= rec; - xmax *= rec; - } - } - x[j] /= tjjs; - xj = (d__1 = x[j], abs(d__1)); - } else if (tjj > 0.) { + rec = 1. / xj; + dscal_(n, &rec, &x[1], &c__1); + *scale *= rec; + xmax *= rec; + } + } + x[j] /= tjjs; + xj = (d__1 = x[j], abs(d__1)); + } else if (tjj > 0.) { /* 0 < abs(A(j,j)) <= SMLNUM: */ - if (xj > tjj * bignum) { + if (xj > tjj * bignum) { /* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM */ /* to avoid overflow when dividing by A(j,j). */ - rec = tjj * bignum / xj; - if (cnorm[j] > 1.) { + rec = tjj * bignum / xj; + if (cnorm[j] > 1.) { /* Scale by 1/CNORM(j) to avoid overflow when */ /* multiplying x(j) times column j. */ - rec /= cnorm[j]; - } - dscal_(n, &rec, &x[1], &c__1); - *scale *= rec; - xmax *= rec; - } - x[j] /= tjjs; - xj = (d__1 = x[j], abs(d__1)); - } else { + rec /= cnorm[j]; + } + dscal_(n, &rec, &x[1], &c__1); + *scale *= rec; + xmax *= rec; + } + x[j] /= tjjs; + xj = (d__1 = x[j], abs(d__1)); + } else { /* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and */ /* scale = 0, and compute a solution to A*x = 0. */ - i__3 = *n; - for (i__ = 1; i__ <= i__3; ++i__) { - x[i__] = 0.; + i__3 = *n; + for (i__ = 1; i__ <= i__3; ++i__) { + x[i__] = 0.; /* L90: */ - } - x[j] = 1.; - xj = 1.; - *scale = 0.; - xmax = 0.; - } + } + x[j] = 1.; + xj = 1.; + *scale = 0.; + xmax = 0.; + } L100: /* Scale x if necessary to avoid overflow when adding a */ /* multiple of column j of A. */ - if (xj > 1.) { - rec = 1. / xj; - if (cnorm[j] > (bignum - xmax) * rec) { + if (xj > 1.) { + rec = 1. / xj; + if (cnorm[j] > (bignum - xmax) * rec) { /* Scale x by 1/(2*abs(x(j))). */ - rec *= .5; - dscal_(n, &rec, &x[1], &c__1); - *scale *= rec; - } - } else if (xj * cnorm[j] > bignum - xmax) { + rec *= .5; + dscal_(n, &rec, &x[1], &c__1); + *scale *= rec; + } + } else if (xj * cnorm[j] > bignum - xmax) { /* Scale x by 1/2. */ - dscal_(n, &c_b46, &x[1], &c__1); - *scale *= .5; - } + dscal_(n, &c_b46, &x[1], &c__1); + *scale *= .5; + } - if (upper) { - if (j > 1) { + if (upper) { + if (j > 1) { /* Compute the update */ /* x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j) */ - i__3 = j - 1; - d__1 = -x[j] * tscal; - daxpy_(&i__3, &d__1, &a[j * a_dim1 + 1], &c__1, &x[1], - &c__1); - i__3 = j - 1; - i__ = idamax_(&i__3, &x[1], &c__1); - xmax = (d__1 = x[i__], abs(d__1)); - } - } else { - if (j < *n) { + i__3 = j - 1; + d__1 = -x[j] * tscal; + daxpy_(&i__3, &d__1, &a[j * a_dim1 + 1], &c__1, &x[1], + &c__1); + i__3 = j - 1; + i__ = idamax_(&i__3, &x[1], &c__1); + xmax = (d__1 = x[i__], abs(d__1)); + } + } else { + if (j < *n) { /* Compute the update */ /* x(j+1:n) := x(j+1:n) - x(j) * A(j+1:n,j) */ - i__3 = *n - j; - d__1 = -x[j] * tscal; - daxpy_(&i__3, &d__1, &a[j + 1 + j * a_dim1], &c__1, & - x[j + 1], &c__1); - i__3 = *n - j; - i__ = j + idamax_(&i__3, &x[j + 1], &c__1); - xmax = (d__1 = x[i__], abs(d__1)); - } - } + i__3 = *n - j; + d__1 = -x[j] * tscal; + daxpy_(&i__3, &d__1, &a[j + 1 + j * a_dim1], &c__1, & + x[j + 1], &c__1); + i__3 = *n - j; + i__ = j + idamax_(&i__3, &x[j + 1], &c__1); + xmax = (d__1 = x[i__], abs(d__1)); + } + } /* L110: */ - } + } - } else { + } else { /* Solve A**T * x = b */ - i__2 = jlast; - i__1 = jinc; - for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { + i__2 = jlast; + i__1 = jinc; + for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Compute x(j) = b(j) - sum A(k,j)*x(k). */ /* k<>j */ - xj = (d__1 = x[j], abs(d__1)); - uscal = tscal; - rec = 1. / max(xmax,1.); - if (cnorm[j] > (bignum - xj) * rec) { + xj = (d__1 = x[j], abs(d__1)); + uscal = tscal; + rec = 1. / max(xmax,1.); + if (cnorm[j] > (bignum - xj) * rec) { /* If x(j) could overflow, scale x by 1/(2*XMAX). */ - rec *= .5; - if (nounit) { - tjjs = a[j + j * a_dim1] * tscal; - } else { - tjjs = tscal; - } - tjj = abs(tjjs); - if (tjj > 1.) { + rec *= .5; + if (nounit) { + tjjs = a[j + j * a_dim1] * tscal; + } else { + tjjs = tscal; + } + tjj = abs(tjjs); + if (tjj > 1.) { /* Divide by A(j,j) when scaling x if A(j,j) > 1. */ /* Computing MIN */ - d__1 = 1., d__2 = rec * tjj; - rec = min(d__1,d__2); - uscal /= tjjs; - } - if (rec < 1.) { - dscal_(n, &rec, &x[1], &c__1); - *scale *= rec; - xmax *= rec; - } - } + d__1 = 1., d__2 = rec * tjj; + rec = min(d__1,d__2); + uscal /= tjjs; + } + if (rec < 1.) { + dscal_(n, &rec, &x[1], &c__1); + *scale *= rec; + xmax *= rec; + } + } - sumj = 0.; - if (uscal == 1.) { + sumj = 0.; + if (uscal == 1.) { /* If the scaling needed for A in the dot product is 1, */ /* call DDOT to perform the dot product. */ - if (upper) { - i__3 = j - 1; - sumj = ddot_(&i__3, &a[j * a_dim1 + 1], &c__1, &x[1], - &c__1); - } else if (j < *n) { - i__3 = *n - j; - sumj = ddot_(&i__3, &a[j + 1 + j * a_dim1], &c__1, &x[ - j + 1], &c__1); - } - } else { + if (upper) { + i__3 = j - 1; + sumj = ddot_(&i__3, &a[j * a_dim1 + 1], &c__1, &x[1], + &c__1); + } else if (j < *n) { + i__3 = *n - j; + sumj = ddot_(&i__3, &a[j + 1 + j * a_dim1], &c__1, &x[ + j + 1], &c__1); + } + } else { /* Otherwise, use in-line code for the dot product. */ - if (upper) { - i__3 = j - 1; - for (i__ = 1; i__ <= i__3; ++i__) { - sumj += a[i__ + j * a_dim1] * uscal * x[i__]; + if (upper) { + i__3 = j - 1; + for (i__ = 1; i__ <= i__3; ++i__) { + sumj += a[i__ + j * a_dim1] * uscal * x[i__]; /* L120: */ - } - } else if (j < *n) { - i__3 = *n; - for (i__ = j + 1; i__ <= i__3; ++i__) { - sumj += a[i__ + j * a_dim1] * uscal * x[i__]; + } + } else if (j < *n) { + i__3 = *n; + for (i__ = j + 1; i__ <= i__3; ++i__) { + sumj += a[i__ + j * a_dim1] * uscal * x[i__]; /* L130: */ - } - } - } + } + } + } - if (uscal == tscal) { + if (uscal == tscal) { /* Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j) */ /* was not used to scale the dotproduct. */ - x[j] -= sumj; - xj = (d__1 = x[j], abs(d__1)); - if (nounit) { - tjjs = a[j + j * a_dim1] * tscal; - } else { - tjjs = tscal; - if (tscal == 1.) { - goto L150; - } - } + x[j] -= sumj; + xj = (d__1 = x[j], abs(d__1)); + if (nounit) { + tjjs = a[j + j * a_dim1] * tscal; + } else { + tjjs = tscal; + if (tscal == 1.) { + goto L150; + } + } /* Compute x(j) = x(j) / A(j,j), scaling if necessary. */ - tjj = abs(tjjs); - if (tjj > smlnum) { + tjj = abs(tjjs); + if (tjj > smlnum) { /* abs(A(j,j)) > SMLNUM: */ - if (tjj < 1.) { - if (xj > tjj * bignum) { + if (tjj < 1.) { + if (xj > tjj * bignum) { /* Scale X by 1/abs(x(j)). */ - rec = 1. / xj; - dscal_(n, &rec, &x[1], &c__1); - *scale *= rec; - xmax *= rec; - } - } - x[j] /= tjjs; - } else if (tjj > 0.) { + rec = 1. / xj; + dscal_(n, &rec, &x[1], &c__1); + *scale *= rec; + xmax *= rec; + } + } + x[j] /= tjjs; + } else if (tjj > 0.) { /* 0 < abs(A(j,j)) <= SMLNUM: */ - if (xj > tjj * bignum) { + if (xj > tjj * bignum) { /* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM. */ - rec = tjj * bignum / xj; - dscal_(n, &rec, &x[1], &c__1); - *scale *= rec; - xmax *= rec; - } - x[j] /= tjjs; - } else { + rec = tjj * bignum / xj; + dscal_(n, &rec, &x[1], &c__1); + *scale *= rec; + xmax *= rec; + } + x[j] /= tjjs; + } else { /* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and */ /* scale = 0, and compute a solution to A**T*x = 0. */ - i__3 = *n; - for (i__ = 1; i__ <= i__3; ++i__) { - x[i__] = 0.; + i__3 = *n; + for (i__ = 1; i__ <= i__3; ++i__) { + x[i__] = 0.; /* L140: */ - } - x[j] = 1.; - *scale = 0.; - xmax = 0.; - } + } + x[j] = 1.; + *scale = 0.; + xmax = 0.; + } L150: - ; - } else { + ; + } else { /* Compute x(j) := x(j) / A(j,j) - sumj if the dot */ /* product has already been divided by 1/A(j,j). */ - x[j] = x[j] / tjjs - sumj; - } + x[j] = x[j] / tjjs - sumj; + } /* Computing MAX */ - d__2 = xmax, d__3 = (d__1 = x[j], abs(d__1)); - xmax = max(d__2,d__3); + d__2 = xmax, d__3 = (d__1 = x[j], abs(d__1)); + xmax = max(d__2,d__3); /* L160: */ - } - } - *scale /= tscal; + } + } + *scale /= tscal; } /* Scale the column norms by 1/TSCAL for return. */ if (tscal != 1.) { - d__1 = 1. / tscal; - dscal_(n, &d__1, &cnorm[1], &c__1); + d__1 = 1. / tscal; + dscal_(n, &d__1, &cnorm[1], &c__1); } return 0; @@ -980,5 +980,5 @@ L150: } /* dlatrs_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dnrm2.cpp b/lib/linalg/dnrm2.cpp index 6ebf2d935e..dc2a59dfbd 100644 --- a/lib/linalg/dnrm2.cpp +++ b/lib/linalg/dnrm2.cpp @@ -1,13 +1,13 @@ /* fortran/dnrm2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -126,35 +126,35 @@ doublereal dnrm2_(integer *n, doublereal *x, integer *incx) /* Function Body */ if (*n < 1 || *incx < 1) { - norm = 0.; + norm = 0.; } else if (*n == 1) { - norm = abs(x[1]); + norm = abs(x[1]); } else { - scale = 0.; - ssq = 1.; + scale = 0.; + ssq = 1.; /* The following loop is equivalent to this call to the LAPACK */ /* auxiliary routine: */ /* CALL DLASSQ( N, X, INCX, SCALE, SSQ ) */ - i__1 = (*n - 1) * *incx + 1; - i__2 = *incx; - for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { - if (x[ix] != 0.) { - absxi = (d__1 = x[ix], abs(d__1)); - if (scale < absxi) { + i__1 = (*n - 1) * *incx + 1; + i__2 = *incx; + for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { + if (x[ix] != 0.) { + absxi = (d__1 = x[ix], abs(d__1)); + if (scale < absxi) { /* Computing 2nd power */ - d__1 = scale / absxi; - ssq = ssq * (d__1 * d__1) + 1.; - scale = absxi; - } else { + d__1 = scale / absxi; + ssq = ssq * (d__1 * d__1) + 1.; + scale = absxi; + } else { /* Computing 2nd power */ - d__1 = absxi / scale; - ssq += d__1 * d__1; - } - } + d__1 = absxi / scale; + ssq += d__1 * d__1; + } + } /* L10: */ - } - norm = scale * sqrt(ssq); + } + norm = scale * sqrt(ssq); } ret_val = norm; @@ -165,5 +165,5 @@ doublereal dnrm2_(integer *n, doublereal *x, integer *incx) } /* dnrm2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dorg2l.cpp b/lib/linalg/dorg2l.cpp index 5705f3b630..a028102645 100644 --- a/lib/linalg/dorg2l.cpp +++ b/lib/linalg/dorg2l.cpp @@ -1,13 +1,13 @@ /* fortran/dorg2l.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -136,7 +136,7 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dorg2l_(integer *m, integer *n, integer *k, doublereal * - a, integer *lda, doublereal *tau, doublereal *work, integer *info) + a, integer *lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -144,10 +144,10 @@ f"> */ /* Local variables */ integer i__, j, l, ii; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dlarf_(char *, integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - ftnlen), xerbla_(char *, integer *, ftnlen); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dlarf_(char *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + ftnlen), xerbla_(char *, integer *, ftnlen); /* -- LAPACK computational routine -- */ @@ -183,62 +183,62 @@ f"> */ /* Function Body */ *info = 0; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0 || *n > *m) { - *info = -2; + *info = -2; } else if (*k < 0 || *k > *n) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORG2L", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORG2L", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n <= 0) { - return 0; + return 0; } /* Initialise columns 1:n-k to columns of the unit matrix */ i__1 = *n - *k; for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (l = 1; l <= i__2; ++l) { - a[l + j * a_dim1] = 0.; + i__2 = *m; + for (l = 1; l <= i__2; ++l) { + a[l + j * a_dim1] = 0.; /* L10: */ - } - a[*m - *n + j + j * a_dim1] = 1.; + } + a[*m - *n + j + j * a_dim1] = 1.; /* L20: */ } i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { - ii = *n - *k + i__; + ii = *n - *k + i__; /* Apply H(i) to A(1:m-k+i,1:n-k+i) from the left */ - a[*m - *n + ii + ii * a_dim1] = 1.; - i__2 = *m - *n + ii; - i__3 = ii - 1; - dlarf_((char *)"Left", &i__2, &i__3, &a[ii * a_dim1 + 1], &c__1, &tau[i__], & - a[a_offset], lda, &work[1], (ftnlen)4); - i__2 = *m - *n + ii - 1; - d__1 = -tau[i__]; - dscal_(&i__2, &d__1, &a[ii * a_dim1 + 1], &c__1); - a[*m - *n + ii + ii * a_dim1] = 1. - tau[i__]; + a[*m - *n + ii + ii * a_dim1] = 1.; + i__2 = *m - *n + ii; + i__3 = ii - 1; + dlarf_((char *)"Left", &i__2, &i__3, &a[ii * a_dim1 + 1], &c__1, &tau[i__], & + a[a_offset], lda, &work[1], (ftnlen)4); + i__2 = *m - *n + ii - 1; + d__1 = -tau[i__]; + dscal_(&i__2, &d__1, &a[ii * a_dim1 + 1], &c__1); + a[*m - *n + ii + ii * a_dim1] = 1. - tau[i__]; /* Set A(m-k+i+1:m,n-k+i) to zero */ - i__2 = *m; - for (l = *m - *n + ii + 1; l <= i__2; ++l) { - a[l + ii * a_dim1] = 0.; + i__2 = *m; + for (l = *m - *n + ii + 1; l <= i__2; ++l) { + a[l + ii * a_dim1] = 0.; /* L30: */ - } + } /* L40: */ } return 0; @@ -248,5 +248,5 @@ f"> */ } /* dorg2l_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dorg2r.cpp b/lib/linalg/dorg2r.cpp index 90ebed3963..f6d897beb6 100644 --- a/lib/linalg/dorg2r.cpp +++ b/lib/linalg/dorg2r.cpp @@ -1,13 +1,13 @@ /* fortran/dorg2r.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -136,7 +136,7 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dorg2r_(integer *m, integer *n, integer *k, doublereal * - a, integer *lda, doublereal *tau, doublereal *work, integer *info) + a, integer *lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -144,10 +144,10 @@ f"> */ /* Local variables */ integer i__, j, l; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dlarf_(char *, integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - ftnlen), xerbla_(char *, integer *, ftnlen); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dlarf_(char *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + ftnlen), xerbla_(char *, integer *, ftnlen); /* -- LAPACK computational routine -- */ @@ -183,36 +183,36 @@ f"> */ /* Function Body */ *info = 0; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0 || *n > *m) { - *info = -2; + *info = -2; } else if (*k < 0 || *k > *n) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORG2R", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORG2R", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n <= 0) { - return 0; + return 0; } /* Initialise columns k+1:n to columns of the unit matrix */ i__1 = *n; for (j = *k + 1; j <= i__1; ++j) { - i__2 = *m; - for (l = 1; l <= i__2; ++l) { - a[l + j * a_dim1] = 0.; + i__2 = *m; + for (l = 1; l <= i__2; ++l) { + a[l + j * a_dim1] = 0.; /* L10: */ - } - a[j + j * a_dim1] = 1.; + } + a[j + j * a_dim1] = 1.; /* L20: */ } @@ -220,28 +220,28 @@ f"> */ /* Apply H(i) to A(i:m,i:n) from the left */ - if (i__ < *n) { - a[i__ + i__ * a_dim1] = 1.; - i__1 = *m - i__ + 1; - i__2 = *n - i__; - dlarf_((char *)"Left", &i__1, &i__2, &a[i__ + i__ * a_dim1], &c__1, &tau[ - i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], ( - ftnlen)4); - } - if (i__ < *m) { - i__1 = *m - i__; - d__1 = -tau[i__]; - dscal_(&i__1, &d__1, &a[i__ + 1 + i__ * a_dim1], &c__1); - } - a[i__ + i__ * a_dim1] = 1. - tau[i__]; + if (i__ < *n) { + a[i__ + i__ * a_dim1] = 1.; + i__1 = *m - i__ + 1; + i__2 = *n - i__; + dlarf_((char *)"Left", &i__1, &i__2, &a[i__ + i__ * a_dim1], &c__1, &tau[ + i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], ( + ftnlen)4); + } + if (i__ < *m) { + i__1 = *m - i__; + d__1 = -tau[i__]; + dscal_(&i__1, &d__1, &a[i__ + 1 + i__ * a_dim1], &c__1); + } + a[i__ + i__ * a_dim1] = 1. - tau[i__]; /* Set A(1:i-1,i) to zero */ - i__1 = i__ - 1; - for (l = 1; l <= i__1; ++l) { - a[l + i__ * a_dim1] = 0.; + i__1 = i__ - 1; + for (l = 1; l <= i__1; ++l) { + a[l + i__ * a_dim1] = 0.; /* L30: */ - } + } /* L40: */ } return 0; @@ -251,5 +251,5 @@ f"> */ } /* dorg2r_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dorgbr.cpp b/lib/linalg/dorgbr.cpp index 4991344c01..a55e8aeca0 100644 --- a/lib/linalg/dorgbr.cpp +++ b/lib/linalg/dorgbr.cpp @@ -1,13 +1,13 @@ /* fortran/dorgbr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -177,9 +177,9 @@ f"> */ /* > \ingroup doubleGBcomputational */ /* ===================================================================== */ -/* Subroutine */ int dorgbr_(char *vect, integer *m, integer *n, integer *k, - doublereal *a, integer *lda, doublereal *tau, doublereal *work, - integer *lwork, integer *info, ftnlen vect_len) +/* Subroutine */ int dorgbr_(char *vect, integer *m, integer *n, integer *k, + doublereal *a, integer *lda, doublereal *tau, doublereal *work, + integer *lwork, integer *info, ftnlen vect_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -190,10 +190,10 @@ f"> */ integer iinfo; logical wantq; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dorglq_( - integer *, integer *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, integer *), dorgqr_( - integer *, integer *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, integer *); + integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *), dorgqr_( + integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; @@ -236,67 +236,67 @@ f"> */ mn = min(*m,*n); lquery = *lwork == -1; if (! wantq && ! lsame_(vect, (char *)"P", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*m < 0) { - *info = -2; + *info = -2; } else if (*n < 0 || wantq && (*n > *m || *n < min(*m,*k)) || ! wantq && ( - *m > *n || *m < min(*n,*k))) { - *info = -3; + *m > *n || *m < min(*n,*k))) { + *info = -3; } else if (*k < 0) { - *info = -4; + *info = -4; } else if (*lda < max(1,*m)) { - *info = -6; + *info = -6; } else if (*lwork < max(1,mn) && ! lquery) { - *info = -9; + *info = -9; } if (*info == 0) { - work[1] = 1.; - if (wantq) { - if (*m >= *k) { - dorgqr_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], &c_n1, - &iinfo); - } else { - if (*m > 1) { - i__1 = *m - 1; - i__2 = *m - 1; - i__3 = *m - 1; - dorgqr_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], & - work[1], &c_n1, &iinfo); - } - } - } else { - if (*k < *n) { - dorglq_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], &c_n1, - &iinfo); - } else { - if (*n > 1) { - i__1 = *n - 1; - i__2 = *n - 1; - i__3 = *n - 1; - dorglq_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], & - work[1], &c_n1, &iinfo); - } - } - } - lwkopt = (integer) work[1]; - lwkopt = max(lwkopt,mn); + work[1] = 1.; + if (wantq) { + if (*m >= *k) { + dorgqr_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], &c_n1, + &iinfo); + } else { + if (*m > 1) { + i__1 = *m - 1; + i__2 = *m - 1; + i__3 = *m - 1; + dorgqr_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], & + work[1], &c_n1, &iinfo); + } + } + } else { + if (*k < *n) { + dorglq_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], &c_n1, + &iinfo); + } else { + if (*n > 1) { + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + dorglq_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], & + work[1], &c_n1, &iinfo); + } + } + } + lwkopt = (integer) work[1]; + lwkopt = max(lwkopt,mn); } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORGBR", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORGBR", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - work[1] = (doublereal) lwkopt; - return 0; + work[1] = (doublereal) lwkopt; + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { - work[1] = 1.; - return 0; + work[1] = 1.; + return 0; } if (wantq) { @@ -304,14 +304,14 @@ f"> */ /* Form Q, determined by a call to DGEBRD to reduce an m-by-k */ /* matrix */ - if (*m >= *k) { + if (*m >= *k) { /* If m >= k, assume m >= n >= k */ - dorgqr_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, & - iinfo); + dorgqr_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, & + iinfo); - } else { + } else { /* If m < k, assume m = n */ @@ -319,45 +319,45 @@ f"> */ /* column to the right, and set the first row and column of Q */ /* to those of the unit matrix */ - for (j = *m; j >= 2; --j) { - a[j * a_dim1 + 1] = 0.; - i__1 = *m; - for (i__ = j + 1; i__ <= i__1; ++i__) { - a[i__ + j * a_dim1] = a[i__ + (j - 1) * a_dim1]; + for (j = *m; j >= 2; --j) { + a[j * a_dim1 + 1] = 0.; + i__1 = *m; + for (i__ = j + 1; i__ <= i__1; ++i__) { + a[i__ + j * a_dim1] = a[i__ + (j - 1) * a_dim1]; /* L10: */ - } + } /* L20: */ - } - a[a_dim1 + 1] = 1.; - i__1 = *m; - for (i__ = 2; i__ <= i__1; ++i__) { - a[i__ + a_dim1] = 0.; + } + a[a_dim1 + 1] = 1.; + i__1 = *m; + for (i__ = 2; i__ <= i__1; ++i__) { + a[i__ + a_dim1] = 0.; /* L30: */ - } - if (*m > 1) { + } + if (*m > 1) { /* Form Q(2:m,2:m) */ - i__1 = *m - 1; - i__2 = *m - 1; - i__3 = *m - 1; - dorgqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[ - 1], &work[1], lwork, &iinfo); - } - } + i__1 = *m - 1; + i__2 = *m - 1; + i__3 = *m - 1; + dorgqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[ + 1], &work[1], lwork, &iinfo); + } + } } else { /* Form P**T, determined by a call to DGEBRD to reduce a k-by-n */ /* matrix */ - if (*k < *n) { + if (*k < *n) { /* If k < n, assume k <= m <= n */ - dorglq_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, & - iinfo); + dorglq_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, & + iinfo); - } else { + } else { /* If k >= n, assume m = n */ @@ -365,32 +365,32 @@ f"> */ /* row downward, and set the first row and column of P**T to */ /* those of the unit matrix */ - a[a_dim1 + 1] = 1.; - i__1 = *n; - for (i__ = 2; i__ <= i__1; ++i__) { - a[i__ + a_dim1] = 0.; + a[a_dim1 + 1] = 1.; + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + a[i__ + a_dim1] = 0.; /* L40: */ - } - i__1 = *n; - for (j = 2; j <= i__1; ++j) { - for (i__ = j - 1; i__ >= 2; --i__) { - a[i__ + j * a_dim1] = a[i__ - 1 + j * a_dim1]; + } + i__1 = *n; + for (j = 2; j <= i__1; ++j) { + for (i__ = j - 1; i__ >= 2; --i__) { + a[i__ + j * a_dim1] = a[i__ - 1 + j * a_dim1]; /* L50: */ - } - a[j * a_dim1 + 1] = 0.; + } + a[j * a_dim1 + 1] = 0.; /* L60: */ - } - if (*n > 1) { + } + if (*n > 1) { /* Form P**T(2:n,2:n) */ - i__1 = *n - 1; - i__2 = *n - 1; - i__3 = *n - 1; - dorglq_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[ - 1], &work[1], lwork, &iinfo); - } - } + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + dorglq_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[ + 1], &work[1], lwork, &iinfo); + } + } } work[1] = (doublereal) lwkopt; return 0; @@ -400,5 +400,5 @@ f"> */ } /* dorgbr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dorgl2.cpp b/lib/linalg/dorgl2.cpp index a2cce985f3..68b6445522 100644 --- a/lib/linalg/dorgl2.cpp +++ b/lib/linalg/dorgl2.cpp @@ -1,13 +1,13 @@ /* fortran/dorgl2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -130,7 +130,7 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dorgl2_(integer *m, integer *n, integer *k, doublereal * - a, integer *lda, doublereal *tau, doublereal *work, integer *info) + a, integer *lda, doublereal *tau, doublereal *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -138,10 +138,10 @@ f"> */ /* Local variables */ integer i__, j, l; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dlarf_(char *, integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - ftnlen), xerbla_(char *, integer *, ftnlen); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dlarf_(char *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + ftnlen), xerbla_(char *, integer *, ftnlen); /* -- LAPACK computational routine -- */ @@ -177,70 +177,70 @@ f"> */ /* Function Body */ *info = 0; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < *m) { - *info = -2; + *info = -2; } else if (*k < 0 || *k > *m) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORGL2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORGL2", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*m <= 0) { - return 0; + return 0; } if (*k < *m) { /* Initialise rows k+1:m to rows of the unit matrix */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (l = *k + 1; l <= i__2; ++l) { - a[l + j * a_dim1] = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (l = *k + 1; l <= i__2; ++l) { + a[l + j * a_dim1] = 0.; /* L10: */ - } - if (j > *k && j <= *m) { - a[j + j * a_dim1] = 1.; - } + } + if (j > *k && j <= *m) { + a[j + j * a_dim1] = 1.; + } /* L20: */ - } + } } for (i__ = *k; i__ >= 1; --i__) { /* Apply H(i) to A(i:m,i:n) from the right */ - if (i__ < *n) { - if (i__ < *m) { - a[i__ + i__ * a_dim1] = 1.; - i__1 = *m - i__; - i__2 = *n - i__ + 1; - dlarf_((char *)"Right", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, & - tau[i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1], ( - ftnlen)5); - } - i__1 = *n - i__; - d__1 = -tau[i__]; - dscal_(&i__1, &d__1, &a[i__ + (i__ + 1) * a_dim1], lda); - } - a[i__ + i__ * a_dim1] = 1. - tau[i__]; + if (i__ < *n) { + if (i__ < *m) { + a[i__ + i__ * a_dim1] = 1.; + i__1 = *m - i__; + i__2 = *n - i__ + 1; + dlarf_((char *)"Right", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, & + tau[i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1], ( + ftnlen)5); + } + i__1 = *n - i__; + d__1 = -tau[i__]; + dscal_(&i__1, &d__1, &a[i__ + (i__ + 1) * a_dim1], lda); + } + a[i__ + i__ * a_dim1] = 1. - tau[i__]; /* Set A(i,1:i-1) to zero */ - i__1 = i__ - 1; - for (l = 1; l <= i__1; ++l) { - a[i__ + l * a_dim1] = 0.; + i__1 = i__ - 1; + for (l = 1; l <= i__1; ++l) { + a[i__ + l * a_dim1] = 0.; /* L30: */ - } + } /* L40: */ } return 0; @@ -250,5 +250,5 @@ f"> */ } /* dorgl2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dorglq.cpp b/lib/linalg/dorglq.cpp index 3dc2d1986c..96eb224501 100644 --- a/lib/linalg/dorglq.cpp +++ b/lib/linalg/dorglq.cpp @@ -1,13 +1,13 @@ /* fortran/dorglq.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -151,24 +151,24 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dorglq_(integer *m, integer *n, integer *k, doublereal * - a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, - integer *info) + a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, + integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int dorgl2_(integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *), - dlarfb_(char *, char *, char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen, ftnlen), dlarft_(char *, char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dorgl2_(integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *), + dlarfb_(char *, char *, char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen, ftnlen), dlarft_(char *, char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; @@ -212,29 +212,29 @@ f"> */ work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < *m) { - *info = -2; + *info = -2; } else if (*k < 0 || *k > *m) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } else if (*lwork < max(1,*m) && ! lquery) { - *info = -8; + *info = -8; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORGLQ", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORGLQ", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*m <= 0) { - work[1] = 1.; - return 0; + work[1] = 1.; + return 0; } nbmin = 2; @@ -245,27 +245,27 @@ f"> */ /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGLQ", (char *)" ", m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); - if (nx < *k) { + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGLQ", (char *)" ", m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *k) { /* Determine if workspace is large enough for blocked code. */ - ldwork = *m; - iws = ldwork * nb; - if (*lwork < iws) { + ldwork = *m; + iws = ldwork * nb; + if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ - nb = *lwork / ldwork; + nb = *lwork / ldwork; /* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORGLQ", (char *)" ", m, n, k, &c_n1, - (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); - } - } + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORGLQ", (char *)" ", m, n, k, &c_n1, + (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } } if (nb >= nbmin && nb < *k && nx < *k) { @@ -273,85 +273,85 @@ f"> */ /* Use blocked code after the last block. */ /* The first kk rows are handled by the block method. */ - ki = (*k - nx - 1) / nb * nb; + ki = (*k - nx - 1) / nb * nb; /* Computing MIN */ - i__1 = *k, i__2 = ki + nb; - kk = min(i__1,i__2); + i__1 = *k, i__2 = ki + nb; + kk = min(i__1,i__2); /* Set A(kk+1:m,1:kk) to zero. */ - i__1 = kk; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = kk + 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = 0.; + i__1 = kk; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = kk + 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = 0.; /* L10: */ - } + } /* L20: */ - } + } } else { - kk = 0; + kk = 0; } /* Use unblocked code for the last or only block. */ if (kk < *m) { - i__1 = *m - kk; - i__2 = *n - kk; - i__3 = *k - kk; - dorgl2_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & - tau[kk + 1], &work[1], &iinfo); + i__1 = *m - kk; + i__2 = *n - kk; + i__3 = *k - kk; + dorgl2_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & + tau[kk + 1], &work[1], &iinfo); } if (kk > 0) { /* Use blocked code */ - i__1 = -nb; - for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { + i__1 = -nb; + for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { /* Computing MIN */ - i__2 = nb, i__3 = *k - i__ + 1; - ib = min(i__2,i__3); - if (i__ + ib <= *m) { + i__2 = nb, i__3 = *k - i__ + 1; + ib = min(i__2,i__3); + if (i__ + ib <= *m) { /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__2 = *n - i__ + 1; - dlarft_((char *)"Forward", (char *)"Rowwise", &i__2, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, - (ftnlen)7); + i__2 = *n - i__ + 1; + dlarft_((char *)"Forward", (char *)"Rowwise", &i__2, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, + (ftnlen)7); /* Apply H**T to A(i+ib:m,i:n) from the right */ - i__2 = *m - i__ - ib + 1; - i__3 = *n - i__ + 1; - dlarfb_((char *)"Right", (char *)"Transpose", (char *)"Forward", (char *)"Rowwise", &i__2, & - i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & - ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[ib + - 1], &ldwork, (ftnlen)5, (ftnlen)9, (ftnlen)7, (ftnlen) - 7); - } + i__2 = *m - i__ - ib + 1; + i__3 = *n - i__ + 1; + dlarfb_((char *)"Right", (char *)"Transpose", (char *)"Forward", (char *)"Rowwise", &i__2, & + i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & + ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[ib + + 1], &ldwork, (ftnlen)5, (ftnlen)9, (ftnlen)7, (ftnlen) + 7); + } /* Apply H**T to columns i:n of current block */ - i__2 = *n - i__ + 1; - dorgl2_(&ib, &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & - work[1], &iinfo); + i__2 = *n - i__ + 1; + dorgl2_(&ib, &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & + work[1], &iinfo); /* Set columns 1:i-1 of current block to zero */ - i__2 = i__ - 1; - for (j = 1; j <= i__2; ++j) { - i__3 = i__ + ib - 1; - for (l = i__; l <= i__3; ++l) { - a[l + j * a_dim1] = 0.; + i__2 = i__ - 1; + for (j = 1; j <= i__2; ++j) { + i__3 = i__ + ib - 1; + for (l = i__; l <= i__3; ++l) { + a[l + j * a_dim1] = 0.; /* L30: */ - } + } /* L40: */ - } + } /* L50: */ - } + } } work[1] = (doublereal) iws; @@ -362,5 +362,5 @@ f"> */ } /* dorglq_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dorgql.cpp b/lib/linalg/dorgql.cpp index 22a9b05b4b..719b7aa685 100644 --- a/lib/linalg/dorgql.cpp +++ b/lib/linalg/dorgql.cpp @@ -1,13 +1,13 @@ /* fortran/dorgql.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -152,24 +152,24 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dorgql_(integer *m, integer *n, integer *k, doublereal * - a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, - integer *info) + a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, + integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j, l, ib, nb, kk, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int dorg2l_(integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *), - dlarfb_(char *, char *, char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen, ftnlen), dlarft_(char *, char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dorg2l_(integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *), + dlarfb_(char *, char *, char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen, ftnlen), dlarft_(char *, char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; @@ -210,42 +210,42 @@ f"> */ *info = 0; lquery = *lwork == -1; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0 || *n > *m) { - *info = -2; + *info = -2; } else if (*k < 0 || *k > *n) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } if (*info == 0) { - if (*n == 0) { - lwkopt = 1; - } else { - nb = ilaenv_(&c__1, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, ( - ftnlen)1); - lwkopt = *n * nb; - } - work[1] = (doublereal) lwkopt; + if (*n == 0) { + lwkopt = 1; + } else { + nb = ilaenv_(&c__1, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, ( + ftnlen)1); + lwkopt = *n * nb; + } + work[1] = (doublereal) lwkopt; - if (*lwork < max(1,*n) && ! lquery) { - *info = -8; - } + if (*lwork < max(1,*n) && ! lquery) { + *info = -8; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORGQL", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORGQL", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n <= 0) { - return 0; + return 0; } nbmin = 2; @@ -256,27 +256,27 @@ f"> */ /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); - if (nx < *k) { + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *k) { /* Determine if workspace is large enough for blocked code. */ - ldwork = *n; - iws = ldwork * nb; - if (*lwork < iws) { + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ - nb = *lwork / ldwork; + nb = *lwork / ldwork; /* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, - (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); - } - } + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, + (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } } if (nb >= nbmin && nb < *k && nx < *k) { @@ -285,22 +285,22 @@ f"> */ /* The last kk columns are handled by the block method. */ /* Computing MIN */ - i__1 = *k, i__2 = (*k - nx + nb - 1) / nb * nb; - kk = min(i__1,i__2); + i__1 = *k, i__2 = (*k - nx + nb - 1) / nb * nb; + kk = min(i__1,i__2); /* Set A(m-kk+1:m,1:n-kk) to zero. */ - i__1 = *n - kk; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = *m - kk + 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = 0.; + i__1 = *n - kk; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = *m - kk + 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = 0.; /* L10: */ - } + } /* L20: */ - } + } } else { - kk = 0; + kk = 0; } /* Use unblocked code for the first or only block. */ @@ -309,59 +309,59 @@ f"> */ i__2 = *n - kk; i__3 = *k - kk; dorg2l_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &iinfo) - ; + ; if (kk > 0) { /* Use blocked code */ - i__1 = *k; - i__2 = nb; - for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += - i__2) { + i__1 = *k; + i__2 = nb; + for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += + i__2) { /* Computing MIN */ - i__3 = nb, i__4 = *k - i__ + 1; - ib = min(i__3,i__4); - if (*n - *k + i__ > 1) { + i__3 = nb, i__4 = *k - i__ + 1; + ib = min(i__3,i__4); + if (*n - *k + i__ > 1) { /* Form the triangular factor of the block reflector */ /* H = H(i+ib-1) . . . H(i+1) H(i) */ - i__3 = *m - *k + i__ + ib - 1; - dlarft_((char *)"Backward", (char *)"Columnwise", &i__3, &ib, &a[(*n - *k + - i__) * a_dim1 + 1], lda, &tau[i__], &work[1], &ldwork, - (ftnlen)8, (ftnlen)10); + i__3 = *m - *k + i__ + ib - 1; + dlarft_((char *)"Backward", (char *)"Columnwise", &i__3, &ib, &a[(*n - *k + + i__) * a_dim1 + 1], lda, &tau[i__], &work[1], &ldwork, + (ftnlen)8, (ftnlen)10); /* Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left */ - i__3 = *m - *k + i__ + ib - 1; - i__4 = *n - *k + i__ - 1; - dlarfb_((char *)"Left", (char *)"No transpose", (char *)"Backward", (char *)"Columnwise", & - i__3, &i__4, &ib, &a[(*n - *k + i__) * a_dim1 + 1], - lda, &work[1], &ldwork, &a[a_offset], lda, &work[ib + - 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen)8, ( - ftnlen)10); - } + i__3 = *m - *k + i__ + ib - 1; + i__4 = *n - *k + i__ - 1; + dlarfb_((char *)"Left", (char *)"No transpose", (char *)"Backward", (char *)"Columnwise", & + i__3, &i__4, &ib, &a[(*n - *k + i__) * a_dim1 + 1], + lda, &work[1], &ldwork, &a[a_offset], lda, &work[ib + + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen)8, ( + ftnlen)10); + } /* Apply H to rows 1:m-k+i+ib-1 of current block */ - i__3 = *m - *k + i__ + ib - 1; - dorg2l_(&i__3, &ib, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, & - tau[i__], &work[1], &iinfo); + i__3 = *m - *k + i__ + ib - 1; + dorg2l_(&i__3, &ib, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, & + tau[i__], &work[1], &iinfo); /* Set rows m-k+i+ib:m of current block to zero */ - i__3 = *n - *k + i__ + ib - 1; - for (j = *n - *k + i__; j <= i__3; ++j) { - i__4 = *m; - for (l = *m - *k + i__ + ib; l <= i__4; ++l) { - a[l + j * a_dim1] = 0.; + i__3 = *n - *k + i__ + ib - 1; + for (j = *n - *k + i__; j <= i__3; ++j) { + i__4 = *m; + for (l = *m - *k + i__ + ib; l <= i__4; ++l) { + a[l + j * a_dim1] = 0.; /* L30: */ - } + } /* L40: */ - } + } /* L50: */ - } + } } work[1] = (doublereal) iws; @@ -372,5 +372,5 @@ f"> */ } /* dorgql_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dorgqr.cpp b/lib/linalg/dorgqr.cpp index 30f175f707..4fedb08864 100644 --- a/lib/linalg/dorgqr.cpp +++ b/lib/linalg/dorgqr.cpp @@ -1,13 +1,13 @@ /* fortran/dorgqr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -152,24 +152,24 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dorgqr_(integer *m, integer *n, integer *k, doublereal * - a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, - integer *info) + a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, + integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int dorg2r_(integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *), - dlarfb_(char *, char *, char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen, ftnlen), dlarft_(char *, char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dorg2r_(integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *), + dlarfb_(char *, char *, char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen, ftnlen), dlarft_(char *, char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; @@ -213,29 +213,29 @@ f"> */ work[1] = (doublereal) lwkopt; lquery = *lwork == -1; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0 || *n > *m) { - *info = -2; + *info = -2; } else if (*k < 0 || *k > *n) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } else if (*lwork < max(1,*n) && ! lquery) { - *info = -8; + *info = -8; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORGQR", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORGQR", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n <= 0) { - work[1] = 1.; - return 0; + work[1] = 1.; + return 0; } nbmin = 2; @@ -246,27 +246,27 @@ f"> */ /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGQR", (char *)" ", m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); - if (nx < *k) { + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGQR", (char *)" ", m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *k) { /* Determine if workspace is large enough for blocked code. */ - ldwork = *n; - iws = ldwork * nb; - if (*lwork < iws) { + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ - nb = *lwork / ldwork; + nb = *lwork / ldwork; /* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORGQR", (char *)" ", m, n, k, &c_n1, - (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); - } - } + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORGQR", (char *)" ", m, n, k, &c_n1, + (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } } if (nb >= nbmin && nb < *k && nx < *k) { @@ -274,85 +274,85 @@ f"> */ /* Use blocked code after the last block. */ /* The first kk columns are handled by the block method. */ - ki = (*k - nx - 1) / nb * nb; + ki = (*k - nx - 1) / nb * nb; /* Computing MIN */ - i__1 = *k, i__2 = ki + nb; - kk = min(i__1,i__2); + i__1 = *k, i__2 = ki + nb; + kk = min(i__1,i__2); /* Set A(1:kk,kk+1:n) to zero. */ - i__1 = *n; - for (j = kk + 1; j <= i__1; ++j) { - i__2 = kk; - for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = 0.; + i__1 = *n; + for (j = kk + 1; j <= i__1; ++j) { + i__2 = kk; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = 0.; /* L10: */ - } + } /* L20: */ - } + } } else { - kk = 0; + kk = 0; } /* Use unblocked code for the last or only block. */ if (kk < *n) { - i__1 = *m - kk; - i__2 = *n - kk; - i__3 = *k - kk; - dorg2r_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & - tau[kk + 1], &work[1], &iinfo); + i__1 = *m - kk; + i__2 = *n - kk; + i__3 = *k - kk; + dorg2r_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & + tau[kk + 1], &work[1], &iinfo); } if (kk > 0) { /* Use blocked code */ - i__1 = -nb; - for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { + i__1 = -nb; + for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { /* Computing MIN */ - i__2 = nb, i__3 = *k - i__ + 1; - ib = min(i__2,i__3); - if (i__ + ib <= *n) { + i__2 = nb, i__3 = *k - i__ + 1; + ib = min(i__2,i__3); + if (i__ + ib <= *n) { /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__2 = *m - i__ + 1; - dlarft_((char *)"Forward", (char *)"Columnwise", &i__2, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, - (ftnlen)10); + i__2 = *m - i__ + 1; + dlarft_((char *)"Forward", (char *)"Columnwise", &i__2, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, + (ftnlen)10); /* Apply H to A(i:m,i+ib:n) from the left */ - i__2 = *m - i__ + 1; - i__3 = *n - i__ - ib + 1; - dlarfb_((char *)"Left", (char *)"No transpose", (char *)"Forward", (char *)"Columnwise", & - i__2, &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[ - 1], &ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, & - work[ib + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen) - 7, (ftnlen)10); - } + i__2 = *m - i__ + 1; + i__3 = *n - i__ - ib + 1; + dlarfb_((char *)"Left", (char *)"No transpose", (char *)"Forward", (char *)"Columnwise", & + i__2, &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[ + 1], &ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, & + work[ib + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen) + 7, (ftnlen)10); + } /* Apply H to rows i:m of current block */ - i__2 = *m - i__ + 1; - dorg2r_(&i__2, &ib, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & - work[1], &iinfo); + i__2 = *m - i__ + 1; + dorg2r_(&i__2, &ib, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & + work[1], &iinfo); /* Set rows 1:i-1 of current block to zero */ - i__2 = i__ + ib - 1; - for (j = i__; j <= i__2; ++j) { - i__3 = i__ - 1; - for (l = 1; l <= i__3; ++l) { - a[l + j * a_dim1] = 0.; + i__2 = i__ + ib - 1; + for (j = i__; j <= i__2; ++j) { + i__3 = i__ - 1; + for (l = 1; l <= i__3; ++l) { + a[l + j * a_dim1] = 0.; /* L30: */ - } + } /* L40: */ - } + } /* L50: */ - } + } } work[1] = (doublereal) iws; @@ -363,5 +363,5 @@ f"> */ } /* dorgqr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dorgtr.cpp b/lib/linalg/dorgtr.cpp index 7686c56d19..0574de0d9b 100644 --- a/lib/linalg/dorgtr.cpp +++ b/lib/linalg/dorgtr.cpp @@ -1,13 +1,13 @@ /* fortran/dorgtr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -145,8 +145,8 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dorgtr_(char *uplo, integer *n, doublereal *a, integer * - lda, doublereal *tau, doublereal *work, integer *lwork, integer *info, - ftnlen uplo_len) + lda, doublereal *tau, doublereal *work, integer *lwork, integer *info, + ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -157,12 +157,12 @@ f"> */ integer iinfo; logical upper; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dorgql_(integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - integer *), dorgqr_(integer *, integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, integer *); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dorgql_(integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + integer *), dorgqr_(integer *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *); integer lwkopt; logical lquery; @@ -204,52 +204,52 @@ f"> */ lquery = *lwork == -1; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*n)) { - *info = -4; + *info = -4; } else /* if(complicated condition) */ { /* Computing MAX */ - i__1 = 1, i__2 = *n - 1; - if (*lwork < max(i__1,i__2) && ! lquery) { - *info = -7; - } + i__1 = 1, i__2 = *n - 1; + if (*lwork < max(i__1,i__2) && ! lquery) { + *info = -7; + } } if (*info == 0) { - if (upper) { - i__1 = *n - 1; - i__2 = *n - 1; - i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"DORGQL", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)1); - } else { - i__1 = *n - 1; - i__2 = *n - 1; - i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"DORGQR", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)1); - } + if (upper) { + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"DORGQL", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)1); + } else { + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"DORGQR", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)1); + } /* Computing MAX */ - i__1 = 1, i__2 = *n - 1; - lwkopt = max(i__1,i__2) * nb; - work[1] = (doublereal) lwkopt; + i__1 = 1, i__2 = *n - 1; + lwkopt = max(i__1,i__2) * nb; + work[1] = (doublereal) lwkopt; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORGTR", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORGTR", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - work[1] = 1.; - return 0; + work[1] = 1.; + return 0; } if (upper) { @@ -260,30 +260,30 @@ f"> */ /* column to the left, and set the last row and column of Q to */ /* those of the unit matrix */ - i__1 = *n - 1; - for (j = 1; j <= i__1; ++j) { - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = a[i__ + (j + 1) * a_dim1]; + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = a[i__ + (j + 1) * a_dim1]; /* L10: */ - } - a[*n + j * a_dim1] = 0.; + } + a[*n + j * a_dim1] = 0.; /* L20: */ - } - i__1 = *n - 1; - for (i__ = 1; i__ <= i__1; ++i__) { - a[i__ + *n * a_dim1] = 0.; + } + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + a[i__ + *n * a_dim1] = 0.; /* L30: */ - } - a[*n + *n * a_dim1] = 1.; + } + a[*n + *n * a_dim1] = 1.; /* Generate Q(1:n-1,1:n-1) */ - i__1 = *n - 1; - i__2 = *n - 1; - i__3 = *n - 1; - dorgql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], - lwork, &iinfo); + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + dorgql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], + lwork, &iinfo); } else { @@ -293,31 +293,31 @@ f"> */ /* column to the right, and set the first row and column of Q to */ /* those of the unit matrix */ - for (j = *n; j >= 2; --j) { - a[j * a_dim1 + 1] = 0.; - i__1 = *n; - for (i__ = j + 1; i__ <= i__1; ++i__) { - a[i__ + j * a_dim1] = a[i__ + (j - 1) * a_dim1]; + for (j = *n; j >= 2; --j) { + a[j * a_dim1 + 1] = 0.; + i__1 = *n; + for (i__ = j + 1; i__ <= i__1; ++i__) { + a[i__ + j * a_dim1] = a[i__ + (j - 1) * a_dim1]; /* L40: */ - } + } /* L50: */ - } - a[a_dim1 + 1] = 1.; - i__1 = *n; - for (i__ = 2; i__ <= i__1; ++i__) { - a[i__ + a_dim1] = 0.; + } + a[a_dim1 + 1] = 1.; + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + a[i__ + a_dim1] = 0.; /* L60: */ - } - if (*n > 1) { + } + if (*n > 1) { /* Generate Q(2:n,2:n) */ - i__1 = *n - 1; - i__2 = *n - 1; - i__3 = *n - 1; - dorgqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], - &work[1], lwork, &iinfo); - } + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + dorgqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], + &work[1], lwork, &iinfo); + } } work[1] = (doublereal) lwkopt; return 0; @@ -327,5 +327,5 @@ f"> */ } /* dorgtr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dorm2l.cpp b/lib/linalg/dorm2l.cpp index 6669a81614..6882f50cdb 100644 --- a/lib/linalg/dorm2l.cpp +++ b/lib/linalg/dorm2l.cpp @@ -1,13 +1,13 @@ /* fortran/dorm2l.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -19,7 +19,7 @@ extern "C" { static integer c__1 = 1; -/* > \brief \b DORM2L multiplies a general matrix by the orthogonal matrix from a QL factorization determined +/* > \brief \b DORM2L multiplies a general matrix by the orthogonal matrix from a QL factorization determined by sgeqlf (unblocked algorithm). */ /* =========== DOCUMENTATION =========== */ @@ -179,10 +179,10 @@ f"> */ /* > \ingroup doubleOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dorm2l_(char *side, char *trans, integer *m, integer *n, - integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *info, ftnlen side_len, - ftnlen trans_len) +/* Subroutine */ int dorm2l_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *info, ftnlen side_len, + ftnlen trans_len) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; @@ -191,9 +191,9 @@ f"> */ integer i__, i1, i2, i3, mi, ni, nq; doublereal aii; logical left; - extern /* Subroutine */ int dlarf_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, ftnlen); + extern /* Subroutine */ int dlarf_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); logical notran; @@ -242,75 +242,75 @@ f"> */ /* NQ is the order of Q */ if (left) { - nq = *m; + nq = *m; } else { - nq = *n; + nq = *n; } if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*m < 0) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*k < 0 || *k > nq) { - *info = -5; + *info = -5; } else if (*lda < max(1,nq)) { - *info = -7; + *info = -7; } else if (*ldc < max(1,*m)) { - *info = -10; + *info = -10; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORM2L", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORM2L", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { - return 0; + return 0; } if (left && notran || ! left && ! notran) { - i1 = 1; - i2 = *k; - i3 = 1; + i1 = 1; + i2 = *k; + i3 = 1; } else { - i1 = *k; - i2 = 1; - i3 = -1; + i1 = *k; + i2 = 1; + i3 = -1; } if (left) { - ni = *n; + ni = *n; } else { - mi = *m; + mi = *m; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { - if (left) { + if (left) { /* H(i) is applied to C(1:m-k+i,1:n) */ - mi = *m - *k + i__; - } else { + mi = *m - *k + i__; + } else { /* H(i) is applied to C(1:m,1:n-k+i) */ - ni = *n - *k + i__; - } + ni = *n - *k + i__; + } /* Apply H(i) */ - aii = a[nq - *k + i__ + i__ * a_dim1]; - a[nq - *k + i__ + i__ * a_dim1] = 1.; - dlarf_(side, &mi, &ni, &a[i__ * a_dim1 + 1], &c__1, &tau[i__], &c__[ - c_offset], ldc, &work[1], (ftnlen)1); - a[nq - *k + i__ + i__ * a_dim1] = aii; + aii = a[nq - *k + i__ + i__ * a_dim1]; + a[nq - *k + i__ + i__ * a_dim1] = 1.; + dlarf_(side, &mi, &ni, &a[i__ * a_dim1 + 1], &c__1, &tau[i__], &c__[ + c_offset], ldc, &work[1], (ftnlen)1); + a[nq - *k + i__ + i__ * a_dim1] = aii; /* L10: */ } return 0; @@ -320,5 +320,5 @@ f"> */ } /* dorm2l_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dorm2r.cpp b/lib/linalg/dorm2r.cpp index 13a74e8fe1..1b600a3507 100644 --- a/lib/linalg/dorm2r.cpp +++ b/lib/linalg/dorm2r.cpp @@ -1,13 +1,13 @@ /* fortran/dorm2r.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -19,7 +19,7 @@ extern "C" { static integer c__1 = 1; -/* > \brief \b DORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined +/* > \brief \b DORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sgeqrf (unblocked algorithm). */ /* =========== DOCUMENTATION =========== */ @@ -179,10 +179,10 @@ f"> */ /* > \ingroup doubleOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dorm2r_(char *side, char *trans, integer *m, integer *n, - integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *info, ftnlen side_len, - ftnlen trans_len) +/* Subroutine */ int dorm2r_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *info, ftnlen side_len, + ftnlen trans_len) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; @@ -191,9 +191,9 @@ f"> */ integer i__, i1, i2, i3, ic, jc, mi, ni, nq; doublereal aii; logical left; - extern /* Subroutine */ int dlarf_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, ftnlen); + extern /* Subroutine */ int dlarf_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); logical notran; @@ -242,79 +242,79 @@ f"> */ /* NQ is the order of Q */ if (left) { - nq = *m; + nq = *m; } else { - nq = *n; + nq = *n; } if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*m < 0) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*k < 0 || *k > nq) { - *info = -5; + *info = -5; } else if (*lda < max(1,nq)) { - *info = -7; + *info = -7; } else if (*ldc < max(1,*m)) { - *info = -10; + *info = -10; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORM2R", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORM2R", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { - return 0; + return 0; } if (left && ! notran || ! left && notran) { - i1 = 1; - i2 = *k; - i3 = 1; + i1 = 1; + i2 = *k; + i3 = 1; } else { - i1 = *k; - i2 = 1; - i3 = -1; + i1 = *k; + i2 = 1; + i3 = -1; } if (left) { - ni = *n; - jc = 1; + ni = *n; + jc = 1; } else { - mi = *m; - ic = 1; + mi = *m; + ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { - if (left) { + if (left) { /* H(i) is applied to C(i:m,1:n) */ - mi = *m - i__ + 1; - ic = i__; - } else { + mi = *m - i__ + 1; + ic = i__; + } else { /* H(i) is applied to C(1:m,i:n) */ - ni = *n - i__ + 1; - jc = i__; - } + ni = *n - i__ + 1; + jc = i__; + } /* Apply H(i) */ - aii = a[i__ + i__ * a_dim1]; - a[i__ + i__ * a_dim1] = 1.; - dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &tau[i__], &c__[ - ic + jc * c_dim1], ldc, &work[1], (ftnlen)1); - a[i__ + i__ * a_dim1] = aii; + aii = a[i__ + i__ * a_dim1]; + a[i__ + i__ * a_dim1] = 1.; + dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &tau[i__], &c__[ + ic + jc * c_dim1], ldc, &work[1], (ftnlen)1); + a[i__ + i__ * a_dim1] = aii; /* L10: */ } return 0; @@ -324,5 +324,5 @@ f"> */ } /* dorm2r_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dormbr.cpp b/lib/linalg/dormbr.cpp index e00ec3ecb0..69283d95ef 100644 --- a/lib/linalg/dormbr.cpp +++ b/lib/linalg/dormbr.cpp @@ -1,13 +1,13 @@ /* fortran/dormbr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -216,10 +216,10 @@ f"> */ /* > \ingroup doubleOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dormbr_(char *vect, char *side, char *trans, integer *m, - integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, - doublereal *c__, integer *ldc, doublereal *work, integer *lwork, - integer *info, ftnlen vect_len, ftnlen side_len, ftnlen trans_len) +/* Subroutine */ int dormbr_(char *vect, char *side, char *trans, integer *m, + integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, + doublereal *c__, integer *ldc, doublereal *work, integer *lwork, + integer *info, ftnlen vect_len, ftnlen side_len, ftnlen trans_len) { /* System generated locals */ address a__1[2]; @@ -235,15 +235,15 @@ f"> */ extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dormlq_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dormlq_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); logical notran; - extern /* Subroutine */ int dormqr_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dormqr_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); logical applyq; char transt[1]; integer lwkopt; @@ -293,164 +293,164 @@ f"> */ /* NQ is the order of Q or P and NW is the minimum dimension of WORK */ if (left) { - nq = *m; - nw = max(1,*n); + nq = *m; + nw = max(1,*n); } else { - nq = *n; - nw = max(1,*m); + nq = *n; + nw = max(1,*m); } if (! applyq && ! lsame_(vect, (char *)"P", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { - *info = -3; + *info = -3; } else if (*m < 0) { - *info = -4; + *info = -4; } else if (*n < 0) { - *info = -5; + *info = -5; } else if (*k < 0) { - *info = -6; + *info = -6; } else /* if(complicated condition) */ { /* Computing MAX */ - i__1 = 1, i__2 = min(nq,*k); - if (applyq && *lda < max(1,nq) || ! applyq && *lda < max(i__1,i__2)) { - *info = -8; - } else if (*ldc < max(1,*m)) { - *info = -11; - } else if (*lwork < nw && ! lquery) { - *info = -13; - } + i__1 = 1, i__2 = min(nq,*k); + if (applyq && *lda < max(1,nq) || ! applyq && *lda < max(i__1,i__2)) { + *info = -8; + } else if (*ldc < max(1,*m)) { + *info = -11; + } else if (*lwork < nw && ! lquery) { + *info = -13; + } } if (*info == 0) { - if (applyq) { - if (left) { + if (applyq) { + if (left) { /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = *m - 1; - i__2 = *m - 1; - nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &i__1, n, &i__2, &c_n1, ( - ftnlen)6, (ftnlen)2); - } else { + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = *m - 1; + i__2 = *m - 1; + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &i__1, n, &i__2, &c_n1, ( + ftnlen)6, (ftnlen)2); + } else { /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = *n - 1; - i__2 = *n - 1; - nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &i__1, &i__2, &c_n1, ( - ftnlen)6, (ftnlen)2); - } - } else { - if (left) { + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = *n - 1; + i__2 = *n - 1; + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &i__1, &i__2, &c_n1, ( + ftnlen)6, (ftnlen)2); + } + } else { + if (left) { /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = *m - 1; - i__2 = *m - 1; - nb = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, &i__1, n, &i__2, &c_n1, ( - ftnlen)6, (ftnlen)2); - } else { + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = *m - 1; + i__2 = *m - 1; + nb = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, &i__1, n, &i__2, &c_n1, ( + ftnlen)6, (ftnlen)2); + } else { /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = *n - 1; - i__2 = *n - 1; - nb = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, m, &i__1, &i__2, &c_n1, ( - ftnlen)6, (ftnlen)2); - } - } - lwkopt = nw * nb; - work[1] = (doublereal) lwkopt; + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = *n - 1; + i__2 = *n - 1; + nb = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, m, &i__1, &i__2, &c_n1, ( + ftnlen)6, (ftnlen)2); + } + } + lwkopt = nw * nb; + work[1] = (doublereal) lwkopt; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORMBR", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORMBR", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ work[1] = 1.; if (*m == 0 || *n == 0) { - return 0; + return 0; } if (applyq) { /* Apply Q */ - if (nq >= *k) { + if (nq >= *k) { /* Q was determined by a call to DGEBRD with nq >= k */ - dormqr_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen)1, ( - ftnlen)1); - } else if (nq > 1) { + dormqr_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen)1, ( + ftnlen)1); + } else if (nq > 1) { /* Q was determined by a call to DGEBRD with nq < k */ - if (left) { - mi = *m - 1; - ni = *n; - i1 = 2; - i2 = 1; - } else { - mi = *m; - ni = *n - 1; - i1 = 1; - i2 = 2; - } - i__1 = nq - 1; - dormqr_(side, trans, &mi, &ni, &i__1, &a[a_dim1 + 2], lda, &tau[1] - , &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, ( - ftnlen)1, (ftnlen)1); - } + if (left) { + mi = *m - 1; + ni = *n; + i1 = 2; + i2 = 1; + } else { + mi = *m; + ni = *n - 1; + i1 = 1; + i2 = 2; + } + i__1 = nq - 1; + dormqr_(side, trans, &mi, &ni, &i__1, &a[a_dim1 + 2], lda, &tau[1] + , &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, ( + ftnlen)1, (ftnlen)1); + } } else { /* Apply P */ - if (notran) { - *(unsigned char *)transt = 'T'; - } else { - *(unsigned char *)transt = 'N'; - } - if (nq > *k) { + if (notran) { + *(unsigned char *)transt = 'T'; + } else { + *(unsigned char *)transt = 'N'; + } + if (nq > *k) { /* P was determined by a call to DGEBRD with nq > k */ - dormlq_(side, transt, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen)1, ( - ftnlen)1); - } else if (nq > 1) { + dormlq_(side, transt, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen)1, ( + ftnlen)1); + } else if (nq > 1) { /* P was determined by a call to DGEBRD with nq <= k */ - if (left) { - mi = *m - 1; - ni = *n; - i1 = 2; - i2 = 1; - } else { - mi = *m; - ni = *n - 1; - i1 = 1; - i2 = 2; - } - i__1 = nq - 1; - dormlq_(side, transt, &mi, &ni, &i__1, &a[(a_dim1 << 1) + 1], lda, - &tau[1], &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, & - iinfo, (ftnlen)1, (ftnlen)1); - } + if (left) { + mi = *m - 1; + ni = *n; + i1 = 2; + i2 = 1; + } else { + mi = *m; + ni = *n - 1; + i1 = 1; + i2 = 2; + } + i__1 = nq - 1; + dormlq_(side, transt, &mi, &ni, &i__1, &a[(a_dim1 << 1) + 1], lda, + &tau[1], &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, & + iinfo, (ftnlen)1, (ftnlen)1); + } } work[1] = (doublereal) lwkopt; return 0; @@ -460,5 +460,5 @@ f"> */ } /* dormbr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dorml2.cpp b/lib/linalg/dorml2.cpp index 9085a5a0ce..7fe1aac941 100644 --- a/lib/linalg/dorml2.cpp +++ b/lib/linalg/dorml2.cpp @@ -1,13 +1,13 @@ /* fortran/dorml2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -15,7 +15,7 @@ extern "C" { #endif #include "lmp_f2c.h" -/* > \brief \b DORML2 multiplies a general matrix by the orthogonal matrix from a LQ factorization determined +/* > \brief \b DORML2 multiplies a general matrix by the orthogonal matrix from a LQ factorization determined by sgelqf (unblocked algorithm). */ /* =========== DOCUMENTATION =========== */ @@ -175,10 +175,10 @@ f"> */ /* > \ingroup doubleOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dorml2_(char *side, char *trans, integer *m, integer *n, - integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *info, ftnlen side_len, - ftnlen trans_len) +/* Subroutine */ int dorml2_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *info, ftnlen side_len, + ftnlen trans_len) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; @@ -187,9 +187,9 @@ f"> */ integer i__, i1, i2, i3, ic, jc, mi, ni, nq; doublereal aii; logical left; - extern /* Subroutine */ int dlarf_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, ftnlen); + extern /* Subroutine */ int dlarf_(char *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); logical notran; @@ -238,79 +238,79 @@ f"> */ /* NQ is the order of Q */ if (left) { - nq = *m; + nq = *m; } else { - nq = *n; + nq = *n; } if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*m < 0) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*k < 0 || *k > nq) { - *info = -5; + *info = -5; } else if (*lda < max(1,*k)) { - *info = -7; + *info = -7; } else if (*ldc < max(1,*m)) { - *info = -10; + *info = -10; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORML2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORML2", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { - return 0; + return 0; } if (left && notran || ! left && ! notran) { - i1 = 1; - i2 = *k; - i3 = 1; + i1 = 1; + i2 = *k; + i3 = 1; } else { - i1 = *k; - i2 = 1; - i3 = -1; + i1 = *k; + i2 = 1; + i3 = -1; } if (left) { - ni = *n; - jc = 1; + ni = *n; + jc = 1; } else { - mi = *m; - ic = 1; + mi = *m; + ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { - if (left) { + if (left) { /* H(i) is applied to C(i:m,1:n) */ - mi = *m - i__ + 1; - ic = i__; - } else { + mi = *m - i__ + 1; + ic = i__; + } else { /* H(i) is applied to C(1:m,i:n) */ - ni = *n - i__ + 1; - jc = i__; - } + ni = *n - i__ + 1; + jc = i__; + } /* Apply H(i) */ - aii = a[i__ + i__ * a_dim1]; - a[i__ + i__ * a_dim1] = 1.; - dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], lda, &tau[i__], &c__[ - ic + jc * c_dim1], ldc, &work[1], (ftnlen)1); - a[i__ + i__ * a_dim1] = aii; + aii = a[i__ + i__ * a_dim1]; + a[i__ + i__ * a_dim1] = 1.; + dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], lda, &tau[i__], &c__[ + ic + jc * c_dim1], ldc, &work[1], (ftnlen)1); + a[i__ + i__ * a_dim1] = aii; /* L10: */ } return 0; @@ -320,5 +320,5 @@ f"> */ } /* dorml2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dormlq.cpp b/lib/linalg/dormlq.cpp index e5ed90a9fa..bb14bbfc98 100644 --- a/lib/linalg/dormlq.cpp +++ b/lib/linalg/dormlq.cpp @@ -1,13 +1,13 @@ /* fortran/dormlq.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -189,15 +189,15 @@ f"> */ /* > \ingroup doubleOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dormlq_(char *side, char *trans, integer *m, integer *n, - integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *lwork, integer *info, - ftnlen side_len, ftnlen trans_len) +/* Subroutine */ int dormlq_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info, + ftnlen side_len, ftnlen trans_len) { /* System generated locals */ address a__1[2]; - integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, - i__5; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, + i__5; char ch__1[2]; /* Builtin functions */ @@ -208,17 +208,17 @@ f"> */ logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; - extern /* Subroutine */ int dorml2_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen), dlarfb_(char - *, char *, char *, char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, - ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dorml2_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen), dlarfb_(char + *, char *, char *, char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); logical notran; integer ldwork; char transt[1]; @@ -270,28 +270,28 @@ f"> */ /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { - nq = *m; - nw = max(1,*n); + nq = *m; + nw = max(1,*n); } else { - nq = *n; - nw = max(1,*m); + nq = *n; + nw = max(1,*m); } if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*m < 0) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*k < 0 || *k > nq) { - *info = -5; + *info = -5; } else if (*lda < max(1,*k)) { - *info = -7; + *info = -7; } else if (*ldc < max(1,*m)) { - *info = -10; + *info = -10; } else if (*lwork < nw && ! lquery) { - *info = -12; + *info = -12; } if (*info == 0) { @@ -300,117 +300,117 @@ f"> */ /* Computing MIN */ /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nb = min(i__1,i__2); - lwkopt = nw * nb + 4160; - work[1] = (doublereal) lwkopt; + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nb = min(i__1,i__2); + lwkopt = nw * nb + 4160; + work[1] = (doublereal) lwkopt; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORMLQ", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORMLQ", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { - work[1] = 1.; - return 0; + work[1] = 1.; + return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { - if (*lwork < lwkopt) { - nb = (*lwork - 4160) / ldwork; + if (*lwork < lwkopt) { + nb = (*lwork - 4160) / ldwork; /* Computing MAX */ /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMLQ", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nbmin = max(i__1,i__2); - } + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMLQ", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nbmin = max(i__1,i__2); + } } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ - dorml2_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + dorml2_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); } else { /* Use blocked code */ - iwt = nw * nb + 1; - if (left && notran || ! left && ! notran) { - i1 = 1; - i2 = *k; - i3 = nb; - } else { - i1 = (*k - 1) / nb * nb + 1; - i2 = 1; - i3 = -nb; - } + iwt = nw * nb + 1; + if (left && notran || ! left && ! notran) { + i1 = 1; + i2 = *k; + i3 = nb; + } else { + i1 = (*k - 1) / nb * nb + 1; + i2 = 1; + i3 = -nb; + } - if (left) { - ni = *n; - jc = 1; - } else { - mi = *m; - ic = 1; - } + if (left) { + ni = *n; + jc = 1; + } else { + mi = *m; + ic = 1; + } - if (notran) { - *(unsigned char *)transt = 'T'; - } else { - *(unsigned char *)transt = 'N'; - } + if (notran) { + *(unsigned char *)transt = 'T'; + } else { + *(unsigned char *)transt = 'N'; + } - i__1 = i2; - i__2 = i3; - for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ - i__4 = nb, i__5 = *k - i__ + 1; - ib = min(i__4,i__5); + i__4 = nb, i__5 = *k - i__ + 1; + ib = min(i__4,i__5); /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__4 = nq - i__ + 1; - dlarft_((char *)"Forward", (char *)"Rowwise", &i__4, &ib, &a[i__ + i__ * a_dim1], - lda, &tau[i__], &work[iwt], &c__65, (ftnlen)7, (ftnlen)7); - if (left) { + i__4 = nq - i__ + 1; + dlarft_((char *)"Forward", (char *)"Rowwise", &i__4, &ib, &a[i__ + i__ * a_dim1], + lda, &tau[i__], &work[iwt], &c__65, (ftnlen)7, (ftnlen)7); + if (left) { /* H or H**T is applied to C(i:m,1:n) */ - mi = *m - i__ + 1; - ic = i__; - } else { + mi = *m - i__ + 1; + ic = i__; + } else { /* H or H**T is applied to C(1:m,i:n) */ - ni = *n - i__ + 1; - jc = i__; - } + ni = *n - i__ + 1; + jc = i__; + } /* Apply H or H**T */ - dlarfb_(side, transt, (char *)"Forward", (char *)"Rowwise", &mi, &ni, &ib, &a[i__ - + i__ * a_dim1], lda, &work[iwt], &c__65, &c__[ic + jc * - c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen)1, ( - ftnlen)7, (ftnlen)7); + dlarfb_(side, transt, (char *)"Forward", (char *)"Rowwise", &mi, &ni, &ib, &a[i__ + + i__ * a_dim1], lda, &work[iwt], &c__65, &c__[ic + jc * + c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen)1, ( + ftnlen)7, (ftnlen)7); /* L10: */ - } + } } work[1] = (doublereal) lwkopt; return 0; @@ -420,5 +420,5 @@ f"> */ } /* dormlq_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dormql.cpp b/lib/linalg/dormql.cpp index 735f9e3d2b..70694ed5f9 100644 --- a/lib/linalg/dormql.cpp +++ b/lib/linalg/dormql.cpp @@ -1,13 +1,13 @@ /* fortran/dormql.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -189,15 +189,15 @@ f"> */ /* > \ingroup doubleOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dormql_(char *side, char *trans, integer *m, integer *n, - integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *lwork, integer *info, - ftnlen side_len, ftnlen trans_len) +/* Subroutine */ int dormql_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info, + ftnlen side_len, ftnlen trans_len) { /* System generated locals */ address a__1[2]; - integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, - i__5; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, + i__5; char ch__1[2]; /* Builtin functions */ @@ -208,17 +208,17 @@ f"> */ logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; - extern /* Subroutine */ int dorm2l_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen), dlarfb_(char - *, char *, char *, char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, - ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dorm2l_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen), dlarfb_(char + *, char *, char *, char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); logical notran; integer ldwork, lwkopt; logical lquery; @@ -268,141 +268,141 @@ f"> */ /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { - nq = *m; - nw = max(1,*n); + nq = *m; + nw = max(1,*n); } else { - nq = *n; - nw = max(1,*m); + nq = *n; + nw = max(1,*m); } if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*m < 0) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*k < 0 || *k > nq) { - *info = -5; + *info = -5; } else if (*lda < max(1,nq)) { - *info = -7; + *info = -7; } else if (*ldc < max(1,*m)) { - *info = -10; + *info = -10; } else if (*lwork < nw && ! lquery) { - *info = -12; + *info = -12; } if (*info == 0) { /* Compute the workspace requirements */ - if (*m == 0 || *n == 0) { - lwkopt = 1; - } else { + if (*m == 0 || *n == 0) { + lwkopt = 1; + } else { /* Computing MIN */ /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMQL", ch__1, m, n, k, &c_n1, - (ftnlen)6, (ftnlen)2); - nb = min(i__1,i__2); - lwkopt = nw * nb + 4160; - } - work[1] = (doublereal) lwkopt; + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMQL", ch__1, m, n, k, &c_n1, + (ftnlen)6, (ftnlen)2); + nb = min(i__1,i__2); + lwkopt = nw * nb + 4160; + } + work[1] = (doublereal) lwkopt; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORMQL", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORMQL", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { - return 0; + return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { - if (*lwork < lwkopt) { - nb = (*lwork - 4160) / ldwork; + if (*lwork < lwkopt) { + nb = (*lwork - 4160) / ldwork; /* Computing MAX */ /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMQL", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nbmin = max(i__1,i__2); - } + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMQL", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nbmin = max(i__1,i__2); + } } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ - dorm2l_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + dorm2l_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); } else { /* Use blocked code */ - iwt = nw * nb + 1; - if (left && notran || ! left && ! notran) { - i1 = 1; - i2 = *k; - i3 = nb; - } else { - i1 = (*k - 1) / nb * nb + 1; - i2 = 1; - i3 = -nb; - } + iwt = nw * nb + 1; + if (left && notran || ! left && ! notran) { + i1 = 1; + i2 = *k; + i3 = nb; + } else { + i1 = (*k - 1) / nb * nb + 1; + i2 = 1; + i3 = -nb; + } - if (left) { - ni = *n; - } else { - mi = *m; - } + if (left) { + ni = *n; + } else { + mi = *m; + } - i__1 = i2; - i__2 = i3; - for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ - i__4 = nb, i__5 = *k - i__ + 1; - ib = min(i__4,i__5); + i__4 = nb, i__5 = *k - i__ + 1; + ib = min(i__4,i__5); /* Form the triangular factor of the block reflector */ /* H = H(i+ib-1) . . . H(i+1) H(i) */ - i__4 = nq - *k + i__ + ib - 1; - dlarft_((char *)"Backward", (char *)"Columnwise", &i__4, &ib, &a[i__ * a_dim1 + 1] - , lda, &tau[i__], &work[iwt], &c__65, (ftnlen)8, (ftnlen) - 10); - if (left) { + i__4 = nq - *k + i__ + ib - 1; + dlarft_((char *)"Backward", (char *)"Columnwise", &i__4, &ib, &a[i__ * a_dim1 + 1] + , lda, &tau[i__], &work[iwt], &c__65, (ftnlen)8, (ftnlen) + 10); + if (left) { /* H or H**T is applied to C(1:m-k+i+ib-1,1:n) */ - mi = *m - *k + i__ + ib - 1; - } else { + mi = *m - *k + i__ + ib - 1; + } else { /* H or H**T is applied to C(1:m,1:n-k+i+ib-1) */ - ni = *n - *k + i__ + ib - 1; - } + ni = *n - *k + i__ + ib - 1; + } /* Apply H or H**T */ - dlarfb_(side, trans, (char *)"Backward", (char *)"Columnwise", &mi, &ni, &ib, &a[ - i__ * a_dim1 + 1], lda, &work[iwt], &c__65, &c__[c_offset] - , ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen)1, (ftnlen)8, - (ftnlen)10); + dlarfb_(side, trans, (char *)"Backward", (char *)"Columnwise", &mi, &ni, &ib, &a[ + i__ * a_dim1 + 1], lda, &work[iwt], &c__65, &c__[c_offset] + , ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen)1, (ftnlen)8, + (ftnlen)10); /* L10: */ - } + } } work[1] = (doublereal) lwkopt; return 0; @@ -412,5 +412,5 @@ f"> */ } /* dormql_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dormqr.cpp b/lib/linalg/dormqr.cpp index 7fce43b587..17aaab62ba 100644 --- a/lib/linalg/dormqr.cpp +++ b/lib/linalg/dormqr.cpp @@ -1,13 +1,13 @@ /* fortran/dormqr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -189,15 +189,15 @@ f"> */ /* > \ingroup doubleOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dormqr_(char *side, char *trans, integer *m, integer *n, - integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *lwork, integer *info, - ftnlen side_len, ftnlen trans_len) +/* Subroutine */ int dormqr_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info, + ftnlen side_len, ftnlen trans_len) { /* System generated locals */ address a__1[2]; - integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, - i__5; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, + i__5; char ch__1[2]; /* Builtin functions */ @@ -208,17 +208,17 @@ f"> */ logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; - extern /* Subroutine */ int dorm2r_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen), dlarfb_(char - *, char *, char *, char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, - ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dorm2r_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen), dlarfb_(char + *, char *, char *, char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); logical notran; integer ldwork, lwkopt; logical lquery; @@ -268,28 +268,28 @@ f"> */ /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { - nq = *m; - nw = max(1,*n); + nq = *m; + nw = max(1,*n); } else { - nq = *n; - nw = max(1,*m); + nq = *n; + nw = max(1,*m); } if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*m < 0) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*k < 0 || *k > nq) { - *info = -5; + *info = -5; } else if (*lda < max(1,nq)) { - *info = -7; + *info = -7; } else if (*ldc < max(1,*m)) { - *info = -10; + *info = -10; } else if (*lwork < nw && ! lquery) { - *info = -12; + *info = -12; } if (*info == 0) { @@ -298,112 +298,112 @@ f"> */ /* Computing MIN */ /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nb = min(i__1,i__2); - lwkopt = nw * nb + 4160; - work[1] = (doublereal) lwkopt; + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nb = min(i__1,i__2); + lwkopt = nw * nb + 4160; + work[1] = (doublereal) lwkopt; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DORMQR", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DORMQR", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { - work[1] = 1.; - return 0; + work[1] = 1.; + return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { - if (*lwork < lwkopt) { - nb = (*lwork - 4160) / ldwork; + if (*lwork < lwkopt) { + nb = (*lwork - 4160) / ldwork; /* Computing MAX */ /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMQR", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nbmin = max(i__1,i__2); - } + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMQR", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nbmin = max(i__1,i__2); + } } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ - dorm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + dorm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); } else { /* Use blocked code */ - iwt = nw * nb + 1; - if (left && ! notran || ! left && notran) { - i1 = 1; - i2 = *k; - i3 = nb; - } else { - i1 = (*k - 1) / nb * nb + 1; - i2 = 1; - i3 = -nb; - } + iwt = nw * nb + 1; + if (left && ! notran || ! left && notran) { + i1 = 1; + i2 = *k; + i3 = nb; + } else { + i1 = (*k - 1) / nb * nb + 1; + i2 = 1; + i3 = -nb; + } - if (left) { - ni = *n; - jc = 1; - } else { - mi = *m; - ic = 1; - } + if (left) { + ni = *n; + jc = 1; + } else { + mi = *m; + ic = 1; + } - i__1 = i2; - i__2 = i3; - for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ - i__4 = nb, i__5 = *k - i__ + 1; - ib = min(i__4,i__5); + i__4 = nb, i__5 = *k - i__ + 1; + ib = min(i__4,i__5); /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__4 = nq - i__ + 1; - dlarft_((char *)"Forward", (char *)"Columnwise", &i__4, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[iwt], &c__65, (ftnlen)7, ( - ftnlen)10); - if (left) { + i__4 = nq - i__ + 1; + dlarft_((char *)"Forward", (char *)"Columnwise", &i__4, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[iwt], &c__65, (ftnlen)7, ( + ftnlen)10); + if (left) { /* H or H**T is applied to C(i:m,1:n) */ - mi = *m - i__ + 1; - ic = i__; - } else { + mi = *m - i__ + 1; + ic = i__; + } else { /* H or H**T is applied to C(1:m,i:n) */ - ni = *n - i__ + 1; - jc = i__; - } + ni = *n - i__ + 1; + jc = i__; + } /* Apply H or H**T */ - dlarfb_(side, trans, (char *)"Forward", (char *)"Columnwise", &mi, &ni, &ib, &a[ - i__ + i__ * a_dim1], lda, &work[iwt], &c__65, &c__[ic + - jc * c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen) - 1, (ftnlen)7, (ftnlen)10); + dlarfb_(side, trans, (char *)"Forward", (char *)"Columnwise", &mi, &ni, &ib, &a[ + i__ + i__ * a_dim1], lda, &work[iwt], &c__65, &c__[ic + + jc * c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen) + 1, (ftnlen)7, (ftnlen)10); /* L10: */ - } + } } work[1] = (doublereal) lwkopt; return 0; @@ -413,5 +413,5 @@ f"> */ } /* dormqr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dormtr.cpp b/lib/linalg/dormtr.cpp index d917e95b06..a55ee5efbe 100644 --- a/lib/linalg/dormtr.cpp +++ b/lib/linalg/dormtr.cpp @@ -1,13 +1,13 @@ /* fortran/dormtr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -192,10 +192,10 @@ f"> */ /* > \ingroup doubleOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dormtr_(char *side, char *uplo, char *trans, integer *m, - integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *lwork, integer *info, - ftnlen side_len, ftnlen uplo_len, ftnlen trans_len) +/* Subroutine */ int dormtr_(char *side, char *uplo, char *trans, integer *m, + integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info, + ftnlen side_len, ftnlen uplo_len, ftnlen trans_len) { /* System generated locals */ address a__1[2]; @@ -212,14 +212,14 @@ f"> */ integer iinfo; logical upper; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dormql_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen), - dormqr_(char *, char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, integer *, ftnlen, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dormql_(char *, char *, integer *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen), + dormqr_(char *, char *, integer *, integer *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, integer *, ftnlen, ftnlen); integer lwkopt; logical lquery; @@ -266,123 +266,123 @@ f"> */ /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { - nq = *m; - nw = max(1,*n); + nq = *m; + nw = max(1,*n); } else { - nq = *n; - nw = max(1,*m); + nq = *n; + nw = max(1,*m); } if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -2; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1)) { - *info = -3; + *info = -2; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1)) { + *info = -3; } else if (*m < 0) { - *info = -4; + *info = -4; } else if (*n < 0) { - *info = -5; + *info = -5; } else if (*lda < max(1,nq)) { - *info = -7; + *info = -7; } else if (*ldc < max(1,*m)) { - *info = -10; + *info = -10; } else if (*lwork < nw && ! lquery) { - *info = -12; + *info = -12; } if (*info == 0) { - if (upper) { - if (left) { + if (upper) { + if (left) { /* Writing concatenation */ - i__1[0] = 1, a__1[0] = side; - i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); - i__2 = *m - 1; - i__3 = *m - 1; - nb = ilaenv_(&c__1, (char *)"DORMQL", ch__1, &i__2, n, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); - } else { + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *m - 1; + i__3 = *m - 1; + nb = ilaenv_(&c__1, (char *)"DORMQL", ch__1, &i__2, n, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } else { /* Writing concatenation */ - i__1[0] = 1, a__1[0] = side; - i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); - i__2 = *n - 1; - i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"DORMQL", ch__1, m, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); - } - } else { - if (left) { + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"DORMQL", ch__1, m, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } + } else { + if (left) { /* Writing concatenation */ - i__1[0] = 1, a__1[0] = side; - i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); - i__2 = *m - 1; - i__3 = *m - 1; - nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &i__2, n, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); - } else { + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *m - 1; + i__3 = *m - 1; + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &i__2, n, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } else { /* Writing concatenation */ - i__1[0] = 1, a__1[0] = side; - i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); - i__2 = *n - 1; - i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); - } - } - lwkopt = nw * nb; - work[1] = (doublereal) lwkopt; + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } + } + lwkopt = nw * nb; + work[1] = (doublereal) lwkopt; } if (*info != 0) { - i__2 = -(*info); - xerbla_((char *)"DORMTR", &i__2, (ftnlen)6); - return 0; + i__2 = -(*info); + xerbla_((char *)"DORMTR", &i__2, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || nq == 1) { - work[1] = 1.; - return 0; + work[1] = 1.; + return 0; } if (left) { - mi = *m - 1; - ni = *n; + mi = *m - 1; + ni = *n; } else { - mi = *m; - ni = *n - 1; + mi = *m; + ni = *n - 1; } if (upper) { /* Q was determined by a call to DSYTRD with UPLO = 'U' */ - i__2 = nq - 1; - dormql_(side, trans, &mi, &ni, &i__2, &a[(a_dim1 << 1) + 1], lda, & - tau[1], &c__[c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen) - 1, (ftnlen)1); + i__2 = nq - 1; + dormql_(side, trans, &mi, &ni, &i__2, &a[(a_dim1 << 1) + 1], lda, & + tau[1], &c__[c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen) + 1, (ftnlen)1); } else { /* Q was determined by a call to DSYTRD with UPLO = 'L' */ - if (left) { - i1 = 2; - i2 = 1; - } else { - i1 = 1; - i2 = 2; - } - i__2 = nq - 1; - dormqr_(side, trans, &mi, &ni, &i__2, &a[a_dim1 + 2], lda, &tau[1], & - c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, (ftnlen) - 1, (ftnlen)1); + if (left) { + i1 = 2; + i2 = 1; + } else { + i1 = 1; + i2 = 2; + } + i__2 = nq - 1; + dormqr_(side, trans, &mi, &ni, &i__2, &a[a_dim1 + 2], lda, &tau[1], & + c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, (ftnlen) + 1, (ftnlen)1); } work[1] = (doublereal) lwkopt; return 0; @@ -392,5 +392,5 @@ f"> */ } /* dormtr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dposv.cpp b/lib/linalg/dposv.cpp index 6981ea843d..370c261bf0 100644 --- a/lib/linalg/dposv.cpp +++ b/lib/linalg/dposv.cpp @@ -1,13 +1,13 @@ /* fortran/dposv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -146,9 +146,9 @@ extern "C" { /* > \ingroup doublePOsolve */ /* ===================================================================== */ -/* Subroutine */ int dposv_(char *uplo, integer *n, integer *nrhs, doublereal - *a, integer *lda, doublereal *b, integer *ldb, integer *info, ftnlen - uplo_len) +/* Subroutine */ int dposv_(char *uplo, integer *n, integer *nrhs, doublereal + *a, integer *lda, doublereal *b, integer *ldb, integer *info, ftnlen + uplo_len) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; @@ -156,9 +156,9 @@ extern "C" { /* Local variables */ extern logical lsame_(char *, char *, ftnlen, ftnlen); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dpotrf_( - char *, integer *, doublereal *, integer *, integer *, ftnlen), - dpotrs_(char *, integer *, integer *, doublereal *, integer *, - doublereal *, integer *, integer *, ftnlen); + char *, integer *, doublereal *, integer *, integer *, ftnlen), + dpotrs_(char *, integer *, integer *, doublereal *, integer *, + doublereal *, integer *, integer *, ftnlen); /* -- LAPACK driver routine -- */ @@ -193,21 +193,21 @@ extern "C" { /* Function Body */ *info = 0; if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { - *info = -1; + ftnlen)1, (ftnlen)1)) { + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*nrhs < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*n)) { - *info = -5; + *info = -5; } else if (*ldb < max(1,*n)) { - *info = -7; + *info = -7; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DPOSV ", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DPOSV ", &i__1, (ftnlen)6); + return 0; } /* Compute the Cholesky factorization A = U**T*U or A = L*L**T. */ @@ -217,8 +217,8 @@ extern "C" { /* Solve the system A*X = B, overwriting B with X. */ - dpotrs_(uplo, n, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info, ( - ftnlen)1); + dpotrs_(uplo, n, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info, ( + ftnlen)1); } return 0; @@ -228,5 +228,5 @@ extern "C" { } /* dposv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dpotf2.cpp b/lib/linalg/dpotf2.cpp index e32a52c97c..987db22578 100644 --- a/lib/linalg/dpotf2.cpp +++ b/lib/linalg/dpotf2.cpp @@ -1,13 +1,13 @@ /* fortran/dpotf2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -133,7 +133,7 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dpotf2_(char *uplo, integer *n, doublereal *a, integer * - lda, integer *info, ftnlen uplo_len) + lda, integer *info, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -145,14 +145,14 @@ f"> */ /* Local variables */ integer j; doublereal ajj; - extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, - integer *); - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, + integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen); + extern /* Subroutine */ int dgemv_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen); logical upper; extern logical disnan_(doublereal *); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); @@ -192,90 +192,90 @@ f"> */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*n)) { - *info = -4; + *info = -4; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DPOTF2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DPOTF2", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } if (upper) { /* Compute the Cholesky factorization A = U**T *U. */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { /* Compute U(J,J) and test for non-positive-definiteness. */ - i__2 = j - 1; - ajj = a[j + j * a_dim1] - ddot_(&i__2, &a[j * a_dim1 + 1], &c__1, - &a[j * a_dim1 + 1], &c__1); - if (ajj <= 0. || disnan_(&ajj)) { - a[j + j * a_dim1] = ajj; - goto L30; - } - ajj = sqrt(ajj); - a[j + j * a_dim1] = ajj; + i__2 = j - 1; + ajj = a[j + j * a_dim1] - ddot_(&i__2, &a[j * a_dim1 + 1], &c__1, + &a[j * a_dim1 + 1], &c__1); + if (ajj <= 0. || disnan_(&ajj)) { + a[j + j * a_dim1] = ajj; + goto L30; + } + ajj = sqrt(ajj); + a[j + j * a_dim1] = ajj; /* Compute elements J+1:N of row J. */ - if (j < *n) { - i__2 = j - 1; - i__3 = *n - j; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b10, &a[(j + 1) * a_dim1 - + 1], lda, &a[j * a_dim1 + 1], &c__1, &c_b12, &a[j + ( - j + 1) * a_dim1], lda, (ftnlen)9); - i__2 = *n - j; - d__1 = 1. / ajj; - dscal_(&i__2, &d__1, &a[j + (j + 1) * a_dim1], lda); - } + if (j < *n) { + i__2 = j - 1; + i__3 = *n - j; + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b10, &a[(j + 1) * a_dim1 + + 1], lda, &a[j * a_dim1 + 1], &c__1, &c_b12, &a[j + ( + j + 1) * a_dim1], lda, (ftnlen)9); + i__2 = *n - j; + d__1 = 1. / ajj; + dscal_(&i__2, &d__1, &a[j + (j + 1) * a_dim1], lda); + } /* L10: */ - } + } } else { /* Compute the Cholesky factorization A = L*L**T. */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { /* Compute L(J,J) and test for non-positive-definiteness. */ - i__2 = j - 1; - ajj = a[j + j * a_dim1] - ddot_(&i__2, &a[j + a_dim1], lda, &a[j - + a_dim1], lda); - if (ajj <= 0. || disnan_(&ajj)) { - a[j + j * a_dim1] = ajj; - goto L30; - } - ajj = sqrt(ajj); - a[j + j * a_dim1] = ajj; + i__2 = j - 1; + ajj = a[j + j * a_dim1] - ddot_(&i__2, &a[j + a_dim1], lda, &a[j + + a_dim1], lda); + if (ajj <= 0. || disnan_(&ajj)) { + a[j + j * a_dim1] = ajj; + goto L30; + } + ajj = sqrt(ajj); + a[j + j * a_dim1] = ajj; /* Compute elements J+1:N of column J. */ - if (j < *n) { - i__2 = *n - j; - i__3 = j - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b10, &a[j + 1 + - a_dim1], lda, &a[j + a_dim1], lda, &c_b12, &a[j + 1 + - j * a_dim1], &c__1, (ftnlen)12); - i__2 = *n - j; - d__1 = 1. / ajj; - dscal_(&i__2, &d__1, &a[j + 1 + j * a_dim1], &c__1); - } + if (j < *n) { + i__2 = *n - j; + i__3 = j - 1; + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b10, &a[j + 1 + + a_dim1], lda, &a[j + a_dim1], lda, &c_b12, &a[j + 1 + + j * a_dim1], &c__1, (ftnlen)12); + i__2 = *n - j; + d__1 = 1. / ajj; + dscal_(&i__2, &d__1, &a[j + 1 + j * a_dim1], &c__1); + } /* L20: */ - } + } } goto L40; @@ -290,5 +290,5 @@ L40: } /* dpotf2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dpotrf.cpp b/lib/linalg/dpotrf.cpp index cd343efd77..6dc003ab93 100644 --- a/lib/linalg/dpotrf.cpp +++ b/lib/linalg/dpotrf.cpp @@ -1,13 +1,13 @@ /* fortran/dpotrf.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -131,28 +131,28 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dpotrf_(char *uplo, integer *n, doublereal *a, integer * - lda, integer *info, ftnlen uplo_len) + lda, integer *info, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer j, jb, nb; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); logical upper; - extern /* Subroutine */ int dsyrk_(char *, char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, doublereal *, - integer *, ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dpotrf2_(char *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern /* Subroutine */ int dsyrk_(char *, char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, doublereal *, + integer *, ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dpotrf2_(char *, integer *, doublereal *, + integer *, integer *, ftnlen); /* -- LAPACK computational routine -- */ @@ -189,121 +189,121 @@ f"> */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*n)) { - *info = -4; + *info = -4; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DPOTRF", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DPOTRF", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } /* Determine the block size for this environment. */ nb = ilaenv_(&c__1, (char *)"DPOTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( - ftnlen)1); + ftnlen)1); if (nb <= 1 || nb >= *n) { /* Use unblocked code. */ - dpotrf2_(uplo, n, &a[a_offset], lda, info, (ftnlen)1); + dpotrf2_(uplo, n, &a[a_offset], lda, info, (ftnlen)1); } else { /* Use blocked code. */ - if (upper) { + if (upper) { /* Compute the Cholesky factorization A = U**T*U. */ - i__1 = *n; - i__2 = nb; - for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { + i__1 = *n; + i__2 = nb; + for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { /* Update and factorize the current diagonal block and test */ /* for non-positive-definiteness. */ /* Computing MIN */ - i__3 = nb, i__4 = *n - j + 1; - jb = min(i__3,i__4); - i__3 = j - 1; - dsyrk_((char *)"Upper", (char *)"Transpose", &jb, &i__3, &c_b13, &a[j * - a_dim1 + 1], lda, &c_b14, &a[j + j * a_dim1], lda, ( - ftnlen)5, (ftnlen)9); - dpotrf2_((char *)"Upper", &jb, &a[j + j * a_dim1], lda, info, (ftnlen) - 5); - if (*info != 0) { - goto L30; - } - if (j + jb <= *n) { + i__3 = nb, i__4 = *n - j + 1; + jb = min(i__3,i__4); + i__3 = j - 1; + dsyrk_((char *)"Upper", (char *)"Transpose", &jb, &i__3, &c_b13, &a[j * + a_dim1 + 1], lda, &c_b14, &a[j + j * a_dim1], lda, ( + ftnlen)5, (ftnlen)9); + dpotrf2_((char *)"Upper", &jb, &a[j + j * a_dim1], lda, info, (ftnlen) + 5); + if (*info != 0) { + goto L30; + } + if (j + jb <= *n) { /* Compute the current block row. */ - i__3 = *n - j - jb + 1; - i__4 = j - 1; - dgemm_((char *)"Transpose", (char *)"No transpose", &jb, &i__3, &i__4, & - c_b13, &a[j * a_dim1 + 1], lda, &a[(j + jb) * - a_dim1 + 1], lda, &c_b14, &a[j + (j + jb) * - a_dim1], lda, (ftnlen)9, (ftnlen)12); - i__3 = *n - j - jb + 1; - dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", &jb, & - i__3, &c_b14, &a[j + j * a_dim1], lda, &a[j + (j - + jb) * a_dim1], lda, (ftnlen)4, (ftnlen)5, ( - ftnlen)9, (ftnlen)8); - } + i__3 = *n - j - jb + 1; + i__4 = j - 1; + dgemm_((char *)"Transpose", (char *)"No transpose", &jb, &i__3, &i__4, & + c_b13, &a[j * a_dim1 + 1], lda, &a[(j + jb) * + a_dim1 + 1], lda, &c_b14, &a[j + (j + jb) * + a_dim1], lda, (ftnlen)9, (ftnlen)12); + i__3 = *n - j - jb + 1; + dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", &jb, & + i__3, &c_b14, &a[j + j * a_dim1], lda, &a[j + (j + + jb) * a_dim1], lda, (ftnlen)4, (ftnlen)5, ( + ftnlen)9, (ftnlen)8); + } /* L10: */ - } + } - } else { + } else { /* Compute the Cholesky factorization A = L*L**T. */ - i__2 = *n; - i__1 = nb; - for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { + i__2 = *n; + i__1 = nb; + for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { /* Update and factorize the current diagonal block and test */ /* for non-positive-definiteness. */ /* Computing MIN */ - i__3 = nb, i__4 = *n - j + 1; - jb = min(i__3,i__4); - i__3 = j - 1; - dsyrk_((char *)"Lower", (char *)"No transpose", &jb, &i__3, &c_b13, &a[j + - a_dim1], lda, &c_b14, &a[j + j * a_dim1], lda, ( - ftnlen)5, (ftnlen)12); - dpotrf2_((char *)"Lower", &jb, &a[j + j * a_dim1], lda, info, (ftnlen) - 5); - if (*info != 0) { - goto L30; - } - if (j + jb <= *n) { + i__3 = nb, i__4 = *n - j + 1; + jb = min(i__3,i__4); + i__3 = j - 1; + dsyrk_((char *)"Lower", (char *)"No transpose", &jb, &i__3, &c_b13, &a[j + + a_dim1], lda, &c_b14, &a[j + j * a_dim1], lda, ( + ftnlen)5, (ftnlen)12); + dpotrf2_((char *)"Lower", &jb, &a[j + j * a_dim1], lda, info, (ftnlen) + 5); + if (*info != 0) { + goto L30; + } + if (j + jb <= *n) { /* Compute the current block column. */ - i__3 = *n - j - jb + 1; - i__4 = j - 1; - dgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &jb, &i__4, & - c_b13, &a[j + jb + a_dim1], lda, &a[j + a_dim1], - lda, &c_b14, &a[j + jb + j * a_dim1], lda, ( - ftnlen)12, (ftnlen)9); - i__3 = *n - j - jb + 1; - dtrsm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Non-unit", &i__3, & - jb, &c_b14, &a[j + j * a_dim1], lda, &a[j + jb + - j * a_dim1], lda, (ftnlen)5, (ftnlen)5, (ftnlen)9, - (ftnlen)8); - } + i__3 = *n - j - jb + 1; + i__4 = j - 1; + dgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &jb, &i__4, & + c_b13, &a[j + jb + a_dim1], lda, &a[j + a_dim1], + lda, &c_b14, &a[j + jb + j * a_dim1], lda, ( + ftnlen)12, (ftnlen)9); + i__3 = *n - j - jb + 1; + dtrsm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Non-unit", &i__3, & + jb, &c_b14, &a[j + j * a_dim1], lda, &a[j + jb + + j * a_dim1], lda, (ftnlen)5, (ftnlen)5, (ftnlen)9, + (ftnlen)8); + } /* L20: */ - } - } + } + } } goto L40; @@ -318,5 +318,5 @@ L40: } /* dpotrf_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dpotrf2.cpp b/lib/linalg/dpotrf2.cpp index 9b882bb9e0..61f9c83af6 100644 --- a/lib/linalg/dpotrf2.cpp +++ b/lib/linalg/dpotrf2.cpp @@ -1,13 +1,13 @@ /* static/dpotrf2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -125,7 +125,7 @@ static doublereal c_b11 = -1.; /* ===================================================================== */ /* Subroutine */ int dpotrf2_(char *uplo, integer *n, doublereal *a, integer * - lda, integer *info, ftnlen uplo_len) + lda, integer *info, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1; @@ -137,13 +137,13 @@ static doublereal c_b11 = -1.; integer n1, n2; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); logical upper; - extern /* Subroutine */ int dsyrk_(char *, char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, doublereal *, - integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dsyrk_(char *, char *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, doublereal *, + integer *, ftnlen, ftnlen); extern logical disnan_(doublereal *); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); @@ -182,22 +182,22 @@ static doublereal c_b11 = -1.; *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*n)) { - *info = -4; + *info = -4; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DPOTRF2", &i__1, (ftnlen)7); - return 0; + i__1 = -(*info); + xerbla_((char *)"DPOTRF2", &i__1, (ftnlen)7); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } /* N=1 case */ @@ -206,73 +206,73 @@ static doublereal c_b11 = -1.; /* Test for non-positive-definiteness */ - if (a[a_dim1 + 1] <= 0. || disnan_(&a[a_dim1 + 1])) { - *info = 1; - return 0; - } + if (a[a_dim1 + 1] <= 0. || disnan_(&a[a_dim1 + 1])) { + *info = 1; + return 0; + } /* Factor */ - a[a_dim1 + 1] = sqrt(a[a_dim1 + 1]); + a[a_dim1 + 1] = sqrt(a[a_dim1 + 1]); /* Use recursive code */ } else { - n1 = *n / 2; - n2 = *n - n1; + n1 = *n / 2; + n2 = *n - n1; /* Factor A11 */ - dpotrf2_(uplo, &n1, &a[a_dim1 + 1], lda, &iinfo, (ftnlen)1); - if (iinfo != 0) { - *info = iinfo; - return 0; - } + dpotrf2_(uplo, &n1, &a[a_dim1 + 1], lda, &iinfo, (ftnlen)1); + if (iinfo != 0) { + *info = iinfo; + return 0; + } /* Compute the Cholesky factorization A = U**T*U */ - if (upper) { + if (upper) { /* Update and scale A12 */ - dtrsm_((char *)"L", (char *)"U", (char *)"T", (char *)"N", &n1, &n2, &c_b9, &a[a_dim1 + 1], lda, & - a[(n1 + 1) * a_dim1 + 1], lda, (ftnlen)1, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); + dtrsm_((char *)"L", (char *)"U", (char *)"T", (char *)"N", &n1, &n2, &c_b9, &a[a_dim1 + 1], lda, & + a[(n1 + 1) * a_dim1 + 1], lda, (ftnlen)1, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); /* Update and factor A22 */ - dsyrk_(uplo, (char *)"T", &n2, &n1, &c_b11, &a[(n1 + 1) * a_dim1 + 1], - lda, &c_b9, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, (ftnlen) - 1, (ftnlen)1); - dpotrf2_(uplo, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &iinfo, ( - ftnlen)1); - if (iinfo != 0) { - *info = iinfo + n1; - return 0; - } + dsyrk_(uplo, (char *)"T", &n2, &n1, &c_b11, &a[(n1 + 1) * a_dim1 + 1], + lda, &c_b9, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, (ftnlen) + 1, (ftnlen)1); + dpotrf2_(uplo, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &iinfo, ( + ftnlen)1); + if (iinfo != 0) { + *info = iinfo + n1; + return 0; + } /* Compute the Cholesky factorization A = L*L**T */ - } else { + } else { /* Update and scale A21 */ - dtrsm_((char *)"R", (char *)"L", (char *)"T", (char *)"N", &n2, &n1, &c_b9, &a[a_dim1 + 1], lda, & - a[n1 + 1 + a_dim1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, - (ftnlen)1); + dtrsm_((char *)"R", (char *)"L", (char *)"T", (char *)"N", &n2, &n1, &c_b9, &a[a_dim1 + 1], lda, & + a[n1 + 1 + a_dim1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, + (ftnlen)1); /* Update and factor A22 */ - dsyrk_(uplo, (char *)"N", &n2, &n1, &c_b11, &a[n1 + 1 + a_dim1], lda, & - c_b9, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, (ftnlen)1, ( - ftnlen)1); - dpotrf2_(uplo, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &iinfo, ( - ftnlen)1); - if (iinfo != 0) { - *info = iinfo + n1; - return 0; - } - } + dsyrk_(uplo, (char *)"N", &n2, &n1, &c_b11, &a[n1 + 1 + a_dim1], lda, & + c_b9, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, (ftnlen)1, ( + ftnlen)1); + dpotrf2_(uplo, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &iinfo, ( + ftnlen)1); + if (iinfo != 0) { + *info = iinfo + n1; + return 0; + } + } } return 0; @@ -281,5 +281,5 @@ static doublereal c_b11 = -1.; } /* dpotrf2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dpotrs.cpp b/lib/linalg/dpotrs.cpp index 169f851130..c8cc0e0d68 100644 --- a/lib/linalg/dpotrs.cpp +++ b/lib/linalg/dpotrs.cpp @@ -1,13 +1,13 @@ /* fortran/dpotrs.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -130,18 +130,18 @@ f"> */ /* > \ingroup doublePOcomputational */ /* ===================================================================== */ -/* Subroutine */ int dpotrs_(char *uplo, integer *n, integer *nrhs, - doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * - info, ftnlen uplo_len) +/* Subroutine */ int dpotrs_(char *uplo, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * + info, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; /* Local variables */ extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); logical upper; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); @@ -183,26 +183,26 @@ f"> */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*nrhs < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*n)) { - *info = -5; + *info = -5; } else if (*ldb < max(1,*n)) { - *info = -7; + *info = -7; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DPOTRS", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DPOTRS", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0 || *nrhs == 0) { - return 0; + return 0; } if (upper) { @@ -211,30 +211,30 @@ f"> */ /* Solve U**T *X = B, overwriting B with X. */ - dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b9, &a[ - a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)9, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b9, &a[ + a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)9, (ftnlen)8); /* Solve U*X = B, overwriting B with X. */ - dtrsm_((char *)"Left", (char *)"Upper", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b9, & - a[a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)12, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Upper", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b9, & + a[a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)12, (ftnlen)8); } else { /* Solve A*X = B where A = L*L**T. */ /* Solve L*X = B, overwriting B with X. */ - dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b9, & - a[a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)12, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b9, & + a[a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)12, (ftnlen)8); /* Solve L**T *X = B, overwriting B with X. */ - dtrsm_((char *)"Left", (char *)"Lower", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b9, &a[ - a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)9, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Lower", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b9, &a[ + a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( + ftnlen)9, (ftnlen)8); } return 0; @@ -244,5 +244,5 @@ f"> */ } /* dpotrs_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/drot.cpp b/lib/linalg/drot.cpp index efd339cdf0..1ed9c47a89 100644 --- a/lib/linalg/drot.cpp +++ b/lib/linalg/drot.cpp @@ -1,13 +1,13 @@ /* fortran/drot.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -105,8 +105,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int drot_(integer *n, doublereal *dx, integer *incx, - doublereal *dy, integer *incy, doublereal *c__, doublereal *s) +/* Subroutine */ int drot_(integer *n, doublereal *dx, integer *incx, + doublereal *dy, integer *incy, doublereal *c__, doublereal *s) { /* System generated locals */ integer i__1; @@ -135,39 +135,39 @@ extern "C" { /* Function Body */ if (*n <= 0) { - return 0; + return 0; } if (*incx == 1 && *incy == 1) { /* code for both increments equal to 1 */ - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - dtemp = *c__ * dx[i__] + *s * dy[i__]; - dy[i__] = *c__ * dy[i__] - *s * dx[i__]; - dx[i__] = dtemp; - } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp = *c__ * dx[i__] + *s * dy[i__]; + dy[i__] = *c__ * dy[i__] - *s * dx[i__]; + dx[i__] = dtemp; + } } else { /* code for unequal increments or equal increments not equal */ /* to 1 */ - ix = 1; - iy = 1; - if (*incx < 0) { - ix = (-(*n) + 1) * *incx + 1; - } - if (*incy < 0) { - iy = (-(*n) + 1) * *incy + 1; - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - dtemp = *c__ * dx[ix] + *s * dy[iy]; - dy[iy] = *c__ * dy[iy] - *s * dx[ix]; - dx[ix] = dtemp; - ix += *incx; - iy += *incy; - } + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp = *c__ * dx[ix] + *s * dy[iy]; + dy[iy] = *c__ * dy[iy] - *s * dx[ix]; + dx[ix] = dtemp; + ix += *incx; + iy += *incy; + } } return 0; @@ -176,5 +176,5 @@ extern "C" { } /* drot_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/drscl.cpp b/lib/linalg/drscl.cpp index 041c7fbba3..10904c478f 100644 --- a/lib/linalg/drscl.cpp +++ b/lib/linalg/drscl.cpp @@ -1,13 +1,13 @@ /* fortran/drscl.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -100,14 +100,14 @@ extern "C" { /* > \ingroup doubleOTHERauxiliary */ /* ===================================================================== */ -/* Subroutine */ int drscl_(integer *n, doublereal *sa, doublereal *sx, - integer *incx) +/* Subroutine */ int drscl_(integer *n, doublereal *sa, doublereal *sx, + integer *incx) { doublereal mul, cden; logical done; doublereal cnum, cden1, cnum1; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dlabad_(doublereal *, doublereal *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dlabad_(doublereal *, doublereal *); extern doublereal dlamch_(char *, ftnlen); doublereal bignum, smlnum; @@ -142,7 +142,7 @@ extern "C" { /* Function Body */ if (*n <= 0) { - return 0; + return 0; } /* Get machine parameters */ @@ -163,22 +163,22 @@ L10: /* Pre-multiply X by SMLNUM if CDEN is large compared to CNUM. */ - mul = smlnum; - done = FALSE_; - cden = cden1; + mul = smlnum; + done = FALSE_; + cden = cden1; } else if (abs(cnum1) > abs(cden)) { /* Pre-multiply X by BIGNUM if CDEN is small compared to CNUM. */ - mul = bignum; - done = FALSE_; - cnum = cnum1; + mul = bignum; + done = FALSE_; + cnum = cnum1; } else { /* Multiply X by CNUM / CDEN and return. */ - mul = cnum / cden; - done = TRUE_; + mul = cnum / cden; + done = TRUE_; } /* Scale the vector X by MUL */ @@ -186,7 +186,7 @@ L10: dscal_(n, &mul, &sx[1], incx); if (! done) { - goto L10; + goto L10; } return 0; @@ -196,5 +196,5 @@ L10: } /* drscl_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dscal.cpp b/lib/linalg/dscal.cpp index d1fc1d43ee..e141f7352b 100644 --- a/lib/linalg/dscal.cpp +++ b/lib/linalg/dscal.cpp @@ -1,13 +1,13 @@ /* fortran/dscal.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -92,8 +92,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dscal_(integer *n, doublereal *da, doublereal *dx, - integer *incx) +/* Subroutine */ int dscal_(integer *n, doublereal *da, doublereal *dx, + integer *incx) { /* System generated locals */ integer i__1, i__2; @@ -123,7 +123,7 @@ extern "C" { /* Function Body */ if (*n <= 0 || *incx <= 0 || *da == 1.) { - return 0; + return 0; } if (*incx == 1) { @@ -132,35 +132,35 @@ extern "C" { /* clean-up loop */ - m = *n % 5; - if (m != 0) { - i__1 = m; - for (i__ = 1; i__ <= i__1; ++i__) { - dx[i__] = *da * dx[i__]; - } - if (*n < 5) { - return 0; - } - } - mp1 = m + 1; - i__1 = *n; - for (i__ = mp1; i__ <= i__1; i__ += 5) { - dx[i__] = *da * dx[i__]; - dx[i__ + 1] = *da * dx[i__ + 1]; - dx[i__ + 2] = *da * dx[i__ + 2]; - dx[i__ + 3] = *da * dx[i__ + 3]; - dx[i__ + 4] = *da * dx[i__ + 4]; - } + m = *n % 5; + if (m != 0) { + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + dx[i__] = *da * dx[i__]; + } + if (*n < 5) { + return 0; + } + } + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 5) { + dx[i__] = *da * dx[i__]; + dx[i__ + 1] = *da * dx[i__ + 1]; + dx[i__ + 2] = *da * dx[i__ + 2]; + dx[i__ + 3] = *da * dx[i__ + 3]; + dx[i__ + 4] = *da * dx[i__ + 4]; + } } else { /* code for increment not equal to 1 */ - nincx = *n * *incx; - i__1 = nincx; - i__2 = *incx; - for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { - dx[i__] = *da * dx[i__]; - } + nincx = *n * *incx; + i__1 = nincx; + i__2 = *incx; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + dx[i__] = *da * dx[i__]; + } } return 0; @@ -169,5 +169,5 @@ extern "C" { } /* dscal_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dstedc.cpp b/lib/linalg/dstedc.cpp index e71b373994..f1b09e0f25 100644 --- a/lib/linalg/dstedc.cpp +++ b/lib/linalg/dstedc.cpp @@ -1,13 +1,13 @@ /* fortran/dstedc.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -212,10 +212,10 @@ f"> */ /* > Modified by Francoise Tisseur, University of Tennessee */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dstedc_(char *compz, integer *n, doublereal *d__, - doublereal *e, doublereal *z__, integer *ldz, doublereal *work, - integer *lwork, integer *iwork, integer *liwork, integer *info, - ftnlen compz_len) +/* Subroutine */ int dstedc_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublereal *z__, integer *ldz, doublereal *work, + integer *lwork, integer *iwork, integer *liwork, integer *info, + ftnlen compz_len) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; @@ -231,37 +231,37 @@ f"> */ doublereal p; integer ii, lgn; doublereal eps, tiny; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, + doublereal *, integer *); integer lwmin; - extern /* Subroutine */ int dlaed0_(integer *, integer *, integer *, - doublereal *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, integer *); + extern /* Subroutine */ int dlaed0_(integer *, integer *, integer *, + doublereal *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, integer *); integer start; extern doublereal dlamch_(char *, ftnlen); - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dlacpy_(char *, integer *, integer - *, doublereal *, integer *, doublereal *, integer *, ftnlen), - dlaset_(char *, integer *, integer *, doublereal *, doublereal *, - doublereal *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dlacpy_(char *, integer *, integer + *, doublereal *, integer *, doublereal *, integer *, ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); integer finish; - extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, - ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, + ftnlen); extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, - integer *), dlasrt_(char *, integer *, doublereal *, integer *, - ftnlen); + integer *), dlasrt_(char *, integer *, doublereal *, integer *, + ftnlen); integer liwmin, icompz; - extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - ftnlen); + extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + ftnlen); doublereal orgnrm; logical lquery; integer smlsiz, storez, strtrw; @@ -306,82 +306,82 @@ f"> */ lquery = *lwork == -1 || *liwork == -1; if (lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1)) { - icompz = 0; + icompz = 0; } else if (lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1)) { - icompz = 1; + icompz = 1; } else if (lsame_(compz, (char *)"I", (ftnlen)1, (ftnlen)1)) { - icompz = 2; + icompz = 2; } else { - icompz = -1; + icompz = -1; } if (icompz < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { - *info = -6; + *info = -6; } if (*info == 0) { /* Compute the workspace requirements */ - smlsiz = ilaenv_(&c__9, (char *)"DSTEDC", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( - ftnlen)6, (ftnlen)1); - if (*n <= 1 || icompz == 0) { - liwmin = 1; - lwmin = 1; - } else if (*n <= smlsiz) { - liwmin = 1; - lwmin = *n - 1 << 1; - } else { - lgn = (integer) (log((doublereal) (*n)) / log(2.)); - if (pow_ii(&c__2, &lgn) < *n) { - ++lgn; - } - if (pow_ii(&c__2, &lgn) < *n) { - ++lgn; - } - if (icompz == 1) { + smlsiz = ilaenv_(&c__9, (char *)"DSTEDC", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( + ftnlen)6, (ftnlen)1); + if (*n <= 1 || icompz == 0) { + liwmin = 1; + lwmin = 1; + } else if (*n <= smlsiz) { + liwmin = 1; + lwmin = *n - 1 << 1; + } else { + lgn = (integer) (log((doublereal) (*n)) / log(2.)); + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + if (icompz == 1) { /* Computing 2nd power */ - i__1 = *n; - lwmin = *n * 3 + 1 + (*n << 1) * lgn + (i__1 * i__1 << 2); - liwmin = *n * 6 + 6 + *n * 5 * lgn; - } else if (icompz == 2) { + i__1 = *n; + lwmin = *n * 3 + 1 + (*n << 1) * lgn + (i__1 * i__1 << 2); + liwmin = *n * 6 + 6 + *n * 5 * lgn; + } else if (icompz == 2) { /* Computing 2nd power */ - i__1 = *n; - lwmin = (*n << 2) + 1 + i__1 * i__1; - liwmin = *n * 5 + 3; - } - } - work[1] = (doublereal) lwmin; - iwork[1] = liwmin; + i__1 = *n; + lwmin = (*n << 2) + 1 + i__1 * i__1; + liwmin = *n * 5 + 3; + } + } + work[1] = (doublereal) lwmin; + iwork[1] = liwmin; - if (*lwork < lwmin && ! lquery) { - *info = -8; - } else if (*liwork < liwmin && ! lquery) { - *info = -10; - } + if (*lwork < lwmin && ! lquery) { + *info = -8; + } else if (*liwork < liwmin && ! lquery) { + *info = -10; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DSTEDC", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DSTEDC", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } if (*n == 1) { - if (icompz != 0) { - z__[z_dim1 + 1] = 1.; - } - return 0; + if (icompz != 0) { + z__[z_dim1 + 1] = 1.; + } + return 0; } /* If the following conditional clause is removed, then the routine */ @@ -396,8 +396,8 @@ f"> */ /* If COMPZ = 'N', use DSTERF to compute the eigenvalues. */ if (icompz == 0) { - dsterf_(n, &d__[1], &e[1], info); - goto L50; + dsterf_(n, &d__[1], &e[1], info); + goto L50; } /* If N is smaller than the minimum divide size (SMLSIZ+1), then */ @@ -405,40 +405,40 @@ f"> */ if (*n <= smlsiz) { - dsteqr_(compz, n, &d__[1], &e[1], &z__[z_offset], ldz, &work[1], info, - (ftnlen)1); + dsteqr_(compz, n, &d__[1], &e[1], &z__[z_offset], ldz, &work[1], info, + (ftnlen)1); } else { /* If COMPZ = 'V', the Z matrix must be stored elsewhere for later */ /* use. */ - if (icompz == 1) { - storez = *n * *n + 1; - } else { - storez = 1; - } + if (icompz == 1) { + storez = *n * *n + 1; + } else { + storez = 1; + } - if (icompz == 2) { - dlaset_((char *)"Full", n, n, &c_b17, &c_b18, &z__[z_offset], ldz, ( - ftnlen)4); - } + if (icompz == 2) { + dlaset_((char *)"Full", n, n, &c_b17, &c_b18, &z__[z_offset], ldz, ( + ftnlen)4); + } /* Scale. */ - orgnrm = dlanst_((char *)"M", n, &d__[1], &e[1], (ftnlen)1); - if (orgnrm == 0.) { - goto L50; - } + orgnrm = dlanst_((char *)"M", n, &d__[1], &e[1], (ftnlen)1); + if (orgnrm == 0.) { + goto L50; + } - eps = dlamch_((char *)"Epsilon", (ftnlen)7); + eps = dlamch_((char *)"Epsilon", (ftnlen)7); - start = 1; + start = 1; /* while ( START <= N ) */ L10: - if (start <= *n) { + if (start <= *n) { /* Let FINISH be the position of the next subdiagonal entry */ /* such that E( FINISH ) <= TINY or FINISH = N if no such */ @@ -446,119 +446,119 @@ L10: /* between START and FINISH constitutes an independent */ /* sub-problem. */ - finish = start; + finish = start; L20: - if (finish < *n) { - tiny = eps * sqrt((d__1 = d__[finish], abs(d__1))) * sqrt(( - d__2 = d__[finish + 1], abs(d__2))); - if ((d__1 = e[finish], abs(d__1)) > tiny) { - ++finish; - goto L20; - } - } + if (finish < *n) { + tiny = eps * sqrt((d__1 = d__[finish], abs(d__1))) * sqrt(( + d__2 = d__[finish + 1], abs(d__2))); + if ((d__1 = e[finish], abs(d__1)) > tiny) { + ++finish; + goto L20; + } + } /* (Sub) Problem determined. Compute its size and solve it. */ - m = finish - start + 1; - if (m == 1) { - start = finish + 1; - goto L10; - } - if (m > smlsiz) { + m = finish - start + 1; + if (m == 1) { + start = finish + 1; + goto L10; + } + if (m > smlsiz) { /* Scale. */ - orgnrm = dlanst_((char *)"M", &m, &d__[start], &e[start], (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &m, &c__1, &d__[ - start], &m, info, (ftnlen)1); - i__1 = m - 1; - i__2 = m - 1; - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &i__1, &c__1, &e[ - start], &i__2, info, (ftnlen)1); + orgnrm = dlanst_((char *)"M", &m, &d__[start], &e[start], (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &m, &c__1, &d__[ + start], &m, info, (ftnlen)1); + i__1 = m - 1; + i__2 = m - 1; + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &i__1, &c__1, &e[ + start], &i__2, info, (ftnlen)1); - if (icompz == 1) { - strtrw = 1; - } else { - strtrw = start; - } - dlaed0_(&icompz, n, &m, &d__[start], &e[start], &z__[strtrw + - start * z_dim1], ldz, &work[1], n, &work[storez], & - iwork[1], info); - if (*info != 0) { - *info = (*info / (m + 1) + start - 1) * (*n + 1) + *info % - (m + 1) + start - 1; - goto L50; - } + if (icompz == 1) { + strtrw = 1; + } else { + strtrw = start; + } + dlaed0_(&icompz, n, &m, &d__[start], &e[start], &z__[strtrw + + start * z_dim1], ldz, &work[1], n, &work[storez], & + iwork[1], info); + if (*info != 0) { + *info = (*info / (m + 1) + start - 1) * (*n + 1) + *info % + (m + 1) + start - 1; + goto L50; + } /* Scale back. */ - dlascl_((char *)"G", &c__0, &c__0, &c_b18, &orgnrm, &m, &c__1, &d__[ - start], &m, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &c_b18, &orgnrm, &m, &c__1, &d__[ + start], &m, info, (ftnlen)1); - } else { - if (icompz == 1) { + } else { + if (icompz == 1) { /* Since QR won't update a Z matrix which is larger than */ /* the length of D, we must solve the sub-problem in a */ /* workspace and then multiply back into Z. */ - dsteqr_((char *)"I", &m, &d__[start], &e[start], &work[1], &m, & - work[m * m + 1], info, (ftnlen)1); - dlacpy_((char *)"A", n, &m, &z__[start * z_dim1 + 1], ldz, &work[ - storez], n, (ftnlen)1); - dgemm_((char *)"N", (char *)"N", n, &m, &m, &c_b18, &work[storez], n, & - work[1], &m, &c_b17, &z__[start * z_dim1 + 1], - ldz, (ftnlen)1, (ftnlen)1); - } else if (icompz == 2) { - dsteqr_((char *)"I", &m, &d__[start], &e[start], &z__[start + - start * z_dim1], ldz, &work[1], info, (ftnlen)1); - } else { - dsterf_(&m, &d__[start], &e[start], info); - } - if (*info != 0) { - *info = start * (*n + 1) + finish; - goto L50; - } - } + dsteqr_((char *)"I", &m, &d__[start], &e[start], &work[1], &m, & + work[m * m + 1], info, (ftnlen)1); + dlacpy_((char *)"A", n, &m, &z__[start * z_dim1 + 1], ldz, &work[ + storez], n, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", n, &m, &m, &c_b18, &work[storez], n, & + work[1], &m, &c_b17, &z__[start * z_dim1 + 1], + ldz, (ftnlen)1, (ftnlen)1); + } else if (icompz == 2) { + dsteqr_((char *)"I", &m, &d__[start], &e[start], &z__[start + + start * z_dim1], ldz, &work[1], info, (ftnlen)1); + } else { + dsterf_(&m, &d__[start], &e[start], info); + } + if (*info != 0) { + *info = start * (*n + 1) + finish; + goto L50; + } + } - start = finish + 1; - goto L10; - } + start = finish + 1; + goto L10; + } /* endwhile */ - if (icompz == 0) { + if (icompz == 0) { /* Use Quick Sort */ - dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); + dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); - } else { + } else { /* Use Selection Sort to minimize swaps of eigenvectors */ - i__1 = *n; - for (ii = 2; ii <= i__1; ++ii) { - i__ = ii - 1; - k = i__; - p = d__[i__]; - i__2 = *n; - for (j = ii; j <= i__2; ++j) { - if (d__[j] < p) { - k = j; - p = d__[j]; - } + i__1 = *n; + for (ii = 2; ii <= i__1; ++ii) { + i__ = ii - 1; + k = i__; + p = d__[i__]; + i__2 = *n; + for (j = ii; j <= i__2; ++j) { + if (d__[j] < p) { + k = j; + p = d__[j]; + } /* L30: */ - } - if (k != i__) { - d__[k] = d__[i__]; - d__[i__] = p; - dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 - + 1], &c__1); - } + } + if (k != i__) { + d__[k] = d__[i__]; + d__[i__] = p; + dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + + 1], &c__1); + } /* L40: */ - } - } + } + } } L50: @@ -572,5 +572,5 @@ L50: } /* dstedc_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsteqr.cpp b/lib/linalg/dsteqr.cpp index 65209d15d3..62a13f9d0b 100644 --- a/lib/linalg/dsteqr.cpp +++ b/lib/linalg/dsteqr.cpp @@ -1,13 +1,13 @@ /* fortran/dsteqr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -155,9 +155,9 @@ f"> */ /* > \ingroup auxOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dsteqr_(char *compz, integer *n, doublereal *d__, - doublereal *e, doublereal *z__, integer *ldz, doublereal *work, - integer *info, ftnlen compz_len) +/* Subroutine */ int dsteqr_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublereal *z__, integer *ldz, doublereal *work, + integer *info, ftnlen compz_len) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; @@ -175,34 +175,34 @@ f"> */ integer lsv; doublereal tst, eps2; integer lend, jtot; - extern /* Subroutine */ int dlae2_(doublereal *, doublereal *, doublereal - *, doublereal *, doublereal *); + extern /* Subroutine */ int dlae2_(doublereal *, doublereal *, doublereal + *, doublereal *, doublereal *); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dlasr_(char *, char *, char *, integer *, - integer *, doublereal *, doublereal *, doublereal *, integer *, - ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dlasr_(char *, char *, char *, integer *, + integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen, ftnlen); doublereal anorm; - extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, - doublereal *, integer *), dlaev2_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *); + extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, + doublereal *, integer *), dlaev2_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *); integer lendm1, lendp1; - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); integer iscale; - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dlaset_(char *, integer *, integer - *, doublereal *, doublereal *, doublereal *, integer *, ftnlen); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dlaset_(char *, integer *, integer + *, doublereal *, doublereal *, doublereal *, integer *, ftnlen); doublereal safmin; - extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *); + extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); doublereal safmax; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, - ftnlen); - extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, - integer *, ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, + ftnlen); + extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, + integer *, ftnlen); integer lendsv; doublereal ssfmin; integer nmaxit, icompz; @@ -246,38 +246,38 @@ f"> */ *info = 0; if (lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1)) { - icompz = 0; + icompz = 0; } else if (lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1)) { - icompz = 1; + icompz = 1; } else if (lsame_(compz, (char *)"I", (ftnlen)1, (ftnlen)1)) { - icompz = 2; + icompz = 2; } else { - icompz = -1; + icompz = -1; } if (icompz < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { - *info = -6; + *info = -6; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DSTEQR", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DSTEQR", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } if (*n == 1) { - if (icompz == 2) { - z__[z_dim1 + 1] = 1.; - } - return 0; + if (icompz == 2) { + z__[z_dim1 + 1] = 1.; + } + return 0; } /* Determine the unit roundoff and over/underflow thresholds. */ @@ -295,7 +295,7 @@ f"> */ /* matrix. */ if (icompz == 2) { - dlaset_((char *)"Full", n, n, &c_b9, &c_b10, &z__[z_offset], ldz, (ftnlen)4); + dlaset_((char *)"Full", n, n, &c_b9, &c_b10, &z__[z_offset], ldz, (ftnlen)4); } nmaxit = *n * 30; @@ -310,25 +310,25 @@ f"> */ L10: if (l1 > *n) { - goto L160; + goto L160; } if (l1 > 1) { - e[l1 - 1] = 0.; + e[l1 - 1] = 0.; } if (l1 <= nm1) { - i__1 = nm1; - for (m = l1; m <= i__1; ++m) { - tst = (d__1 = e[m], abs(d__1)); - if (tst == 0.) { - goto L30; - } - if (tst <= sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m - + 1], abs(d__2))) * eps) { - e[m] = 0.; - goto L30; - } + i__1 = nm1; + for (m = l1; m <= i__1; ++m) { + tst = (d__1 = e[m], abs(d__1)); + if (tst == 0.) { + goto L30; + } + if (tst <= sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m + + 1], abs(d__2))) * eps) { + e[m] = 0.; + goto L30; + } /* L20: */ - } + } } m = *n; @@ -339,7 +339,7 @@ L30: lendsv = lend; l1 = m + 1; if (lend == l) { - goto L10; + goto L10; } /* Scale submatrix in rows and columns L to LEND */ @@ -348,31 +348,31 @@ L30: anorm = dlanst_((char *)"M", &i__1, &d__[l], &e[l], (ftnlen)1); iscale = 0; if (anorm == 0.) { - goto L10; + goto L10; } if (anorm > ssfmax) { - iscale = 1; - i__1 = lend - l + 1; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, - info, (ftnlen)1); - i__1 = lend - l; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, - info, (ftnlen)1); + iscale = 1; + i__1 = lend - l + 1; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, + info, (ftnlen)1); + i__1 = lend - l; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, + info, (ftnlen)1); } else if (anorm < ssfmin) { - iscale = 2; - i__1 = lend - l + 1; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, - info, (ftnlen)1); - i__1 = lend - l; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, - info, (ftnlen)1); + iscale = 2; + i__1 = lend - l + 1; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, + info, (ftnlen)1); + i__1 = lend - l; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, + info, (ftnlen)1); } /* Choose between QL and QR iteration */ if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { - lend = lsv; - l = lendsv; + lend = lsv; + l = lendsv; } if (lend > l) { @@ -382,120 +382,120 @@ L30: /* Look for small subdiagonal element. */ L40: - if (l != lend) { - lendm1 = lend - 1; - i__1 = lendm1; - for (m = l; m <= i__1; ++m) { + if (l != lend) { + lendm1 = lend - 1; + i__1 = lendm1; + for (m = l; m <= i__1; ++m) { /* Computing 2nd power */ - d__2 = (d__1 = e[m], abs(d__1)); - tst = d__2 * d__2; - if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m - + 1], abs(d__2)) + safmin) { - goto L60; - } + d__2 = (d__1 = e[m], abs(d__1)); + tst = d__2 * d__2; + if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m + + 1], abs(d__2)) + safmin) { + goto L60; + } /* L50: */ - } - } + } + } - m = lend; + m = lend; L60: - if (m < lend) { - e[m] = 0.; - } - p = d__[l]; - if (m == l) { - goto L80; - } + if (m < lend) { + e[m] = 0.; + } + p = d__[l]; + if (m == l) { + goto L80; + } /* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ /* to compute its eigensystem. */ - if (m == l + 1) { - if (icompz > 0) { - dlaev2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s); - work[l] = c__; - work[*n - 1 + l] = s; - dlasr_((char *)"R", (char *)"V", (char *)"B", n, &c__2, &work[l], &work[*n - 1 + l], & - z__[l * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); - } else { - dlae2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2); - } - d__[l] = rt1; - d__[l + 1] = rt2; - e[l] = 0.; - l += 2; - if (l <= lend) { - goto L40; - } - goto L140; - } + if (m == l + 1) { + if (icompz > 0) { + dlaev2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s); + work[l] = c__; + work[*n - 1 + l] = s; + dlasr_((char *)"R", (char *)"V", (char *)"B", n, &c__2, &work[l], &work[*n - 1 + l], & + z__[l * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + } else { + dlae2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2); + } + d__[l] = rt1; + d__[l + 1] = rt2; + e[l] = 0.; + l += 2; + if (l <= lend) { + goto L40; + } + goto L140; + } - if (jtot == nmaxit) { - goto L140; - } - ++jtot; + if (jtot == nmaxit) { + goto L140; + } + ++jtot; /* Form shift. */ - g = (d__[l + 1] - p) / (e[l] * 2.); - r__ = dlapy2_(&g, &c_b10); - g = d__[m] - p + e[l] / (g + d_sign(&r__, &g)); + g = (d__[l + 1] - p) / (e[l] * 2.); + r__ = dlapy2_(&g, &c_b10); + g = d__[m] - p + e[l] / (g + d_sign(&r__, &g)); - s = 1.; - c__ = 1.; - p = 0.; + s = 1.; + c__ = 1.; + p = 0.; /* Inner loop */ - mm1 = m - 1; - i__1 = l; - for (i__ = mm1; i__ >= i__1; --i__) { - f = s * e[i__]; - b = c__ * e[i__]; - dlartg_(&g, &f, &c__, &s, &r__); - if (i__ != m - 1) { - e[i__ + 1] = r__; - } - g = d__[i__ + 1] - p; - r__ = (d__[i__] - g) * s + c__ * 2. * b; - p = s * r__; - d__[i__ + 1] = g + p; - g = c__ * r__ - b; + mm1 = m - 1; + i__1 = l; + for (i__ = mm1; i__ >= i__1; --i__) { + f = s * e[i__]; + b = c__ * e[i__]; + dlartg_(&g, &f, &c__, &s, &r__); + if (i__ != m - 1) { + e[i__ + 1] = r__; + } + g = d__[i__ + 1] - p; + r__ = (d__[i__] - g) * s + c__ * 2. * b; + p = s * r__; + d__[i__ + 1] = g + p; + g = c__ * r__ - b; /* If eigenvectors are desired, then save rotations. */ - if (icompz > 0) { - work[i__] = c__; - work[*n - 1 + i__] = -s; - } + if (icompz > 0) { + work[i__] = c__; + work[*n - 1 + i__] = -s; + } /* L70: */ - } + } /* If eigenvectors are desired, then apply saved rotations. */ - if (icompz > 0) { - mm = m - l + 1; - dlasr_((char *)"R", (char *)"V", (char *)"B", n, &mm, &work[l], &work[*n - 1 + l], &z__[l - * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } + if (icompz > 0) { + mm = m - l + 1; + dlasr_((char *)"R", (char *)"V", (char *)"B", n, &mm, &work[l], &work[*n - 1 + l], &z__[l + * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } - d__[l] -= p; - e[l] = g; - goto L40; + d__[l] -= p; + e[l] = g; + goto L40; /* Eigenvalue found. */ L80: - d__[l] = p; + d__[l] = p; - ++l; - if (l <= lend) { - goto L40; - } - goto L140; + ++l; + if (l <= lend) { + goto L40; + } + goto L140; } else { @@ -504,121 +504,121 @@ L80: /* Look for small superdiagonal element. */ L90: - if (l != lend) { - lendp1 = lend + 1; - i__1 = lendp1; - for (m = l; m >= i__1; --m) { + if (l != lend) { + lendp1 = lend + 1; + i__1 = lendp1; + for (m = l; m >= i__1; --m) { /* Computing 2nd power */ - d__2 = (d__1 = e[m - 1], abs(d__1)); - tst = d__2 * d__2; - if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m - - 1], abs(d__2)) + safmin) { - goto L110; - } + d__2 = (d__1 = e[m - 1], abs(d__1)); + tst = d__2 * d__2; + if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m + - 1], abs(d__2)) + safmin) { + goto L110; + } /* L100: */ - } - } + } + } - m = lend; + m = lend; L110: - if (m > lend) { - e[m - 1] = 0.; - } - p = d__[l]; - if (m == l) { - goto L130; - } + if (m > lend) { + e[m - 1] = 0.; + } + p = d__[l]; + if (m == l) { + goto L130; + } /* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ /* to compute its eigensystem. */ - if (m == l - 1) { - if (icompz > 0) { - dlaev2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s) - ; - work[m] = c__; - work[*n - 1 + m] = s; - dlasr_((char *)"R", (char *)"V", (char *)"F", n, &c__2, &work[m], &work[*n - 1 + m], & - z__[(l - 1) * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, - (ftnlen)1); - } else { - dlae2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2); - } - d__[l - 1] = rt1; - d__[l] = rt2; - e[l - 1] = 0.; - l += -2; - if (l >= lend) { - goto L90; - } - goto L140; - } + if (m == l - 1) { + if (icompz > 0) { + dlaev2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s) + ; + work[m] = c__; + work[*n - 1 + m] = s; + dlasr_((char *)"R", (char *)"V", (char *)"F", n, &c__2, &work[m], &work[*n - 1 + m], & + z__[(l - 1) * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + } else { + dlae2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2); + } + d__[l - 1] = rt1; + d__[l] = rt2; + e[l - 1] = 0.; + l += -2; + if (l >= lend) { + goto L90; + } + goto L140; + } - if (jtot == nmaxit) { - goto L140; - } - ++jtot; + if (jtot == nmaxit) { + goto L140; + } + ++jtot; /* Form shift. */ - g = (d__[l - 1] - p) / (e[l - 1] * 2.); - r__ = dlapy2_(&g, &c_b10); - g = d__[m] - p + e[l - 1] / (g + d_sign(&r__, &g)); + g = (d__[l - 1] - p) / (e[l - 1] * 2.); + r__ = dlapy2_(&g, &c_b10); + g = d__[m] - p + e[l - 1] / (g + d_sign(&r__, &g)); - s = 1.; - c__ = 1.; - p = 0.; + s = 1.; + c__ = 1.; + p = 0.; /* Inner loop */ - lm1 = l - 1; - i__1 = lm1; - for (i__ = m; i__ <= i__1; ++i__) { - f = s * e[i__]; - b = c__ * e[i__]; - dlartg_(&g, &f, &c__, &s, &r__); - if (i__ != m) { - e[i__ - 1] = r__; - } - g = d__[i__] - p; - r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b; - p = s * r__; - d__[i__] = g + p; - g = c__ * r__ - b; + lm1 = l - 1; + i__1 = lm1; + for (i__ = m; i__ <= i__1; ++i__) { + f = s * e[i__]; + b = c__ * e[i__]; + dlartg_(&g, &f, &c__, &s, &r__); + if (i__ != m) { + e[i__ - 1] = r__; + } + g = d__[i__] - p; + r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b; + p = s * r__; + d__[i__] = g + p; + g = c__ * r__ - b; /* If eigenvectors are desired, then save rotations. */ - if (icompz > 0) { - work[i__] = c__; - work[*n - 1 + i__] = s; - } + if (icompz > 0) { + work[i__] = c__; + work[*n - 1 + i__] = s; + } /* L120: */ - } + } /* If eigenvectors are desired, then apply saved rotations. */ - if (icompz > 0) { - mm = l - m + 1; - dlasr_((char *)"R", (char *)"V", (char *)"F", n, &mm, &work[m], &work[*n - 1 + m], &z__[m - * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } + if (icompz > 0) { + mm = l - m + 1; + dlasr_((char *)"R", (char *)"V", (char *)"F", n, &mm, &work[m], &work[*n - 1 + m], &z__[m + * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } - d__[l] -= p; - e[lm1] = g; - goto L90; + d__[l] -= p; + e[lm1] = g; + goto L90; /* Eigenvalue found. */ L130: - d__[l] = p; + d__[l] = p; - --l; - if (l >= lend) { - goto L90; - } - goto L140; + --l; + if (l >= lend) { + goto L90; + } + goto L140; } @@ -626,32 +626,32 @@ L130: L140: if (iscale == 1) { - i__1 = lendsv - lsv + 1; - dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], - n, info, (ftnlen)1); - i__1 = lendsv - lsv; - dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n, - info, (ftnlen)1); + i__1 = lendsv - lsv + 1; + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], + n, info, (ftnlen)1); + i__1 = lendsv - lsv; + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n, + info, (ftnlen)1); } else if (iscale == 2) { - i__1 = lendsv - lsv + 1; - dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], - n, info, (ftnlen)1); - i__1 = lendsv - lsv; - dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n, - info, (ftnlen)1); + i__1 = lendsv - lsv + 1; + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], + n, info, (ftnlen)1); + i__1 = lendsv - lsv; + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n, + info, (ftnlen)1); } /* Check for no convergence to an eigenvalue after a total */ /* of N*MAXIT iterations. */ if (jtot < nmaxit) { - goto L10; + goto L10; } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { - if (e[i__] != 0.) { - ++(*info); - } + if (e[i__] != 0.) { + ++(*info); + } /* L150: */ } goto L190; @@ -663,33 +663,33 @@ L160: /* Use Quick Sort */ - dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); + dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); } else { /* Use Selection Sort to minimize swaps of eigenvectors */ - i__1 = *n; - for (ii = 2; ii <= i__1; ++ii) { - i__ = ii - 1; - k = i__; - p = d__[i__]; - i__2 = *n; - for (j = ii; j <= i__2; ++j) { - if (d__[j] < p) { - k = j; - p = d__[j]; - } + i__1 = *n; + for (ii = 2; ii <= i__1; ++ii) { + i__ = ii - 1; + k = i__; + p = d__[i__]; + i__2 = *n; + for (j = ii; j <= i__2; ++j) { + if (d__[j] < p) { + k = j; + p = d__[j]; + } /* L170: */ - } - if (k != i__) { - d__[k] = d__[i__]; - d__[i__] = p; - dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], - &c__1); - } + } + if (k != i__) { + d__[k] = d__[i__]; + d__[i__] = p; + dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], + &c__1); + } /* L180: */ - } + } } L190: @@ -700,5 +700,5 @@ L190: } /* dsteqr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsterf.cpp b/lib/linalg/dsterf.cpp index 03172b87f3..981374d32a 100644 --- a/lib/linalg/dsterf.cpp +++ b/lib/linalg/dsterf.cpp @@ -1,13 +1,13 @@ /* fortran/dsterf.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -108,8 +108,8 @@ f"> */ /* > \ingroup auxOTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int dsterf_(integer *n, doublereal *d__, doublereal *e, - integer *info) +/* Subroutine */ int dsterf_(integer *n, doublereal *d__, doublereal *e, + integer *info) { /* System generated locals */ integer i__1; @@ -129,22 +129,22 @@ f"> */ integer lend; doublereal rmax; integer jtot; - extern /* Subroutine */ int dlae2_(doublereal *, doublereal *, doublereal - *, doublereal *, doublereal *); + extern /* Subroutine */ int dlae2_(doublereal *, doublereal *, doublereal + *, doublereal *, doublereal *); doublereal gamma, alpha, sigma, anorm; - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); integer iscale; - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen); doublereal oldgam, safmin; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); doublereal safmax; - extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, - ftnlen); - extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, - integer *, ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, + ftnlen); + extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, + integer *, ftnlen); integer lendsv; doublereal ssfmin; integer nmaxit; @@ -186,13 +186,13 @@ f"> */ /* Quick return if possible */ if (*n < 0) { - *info = -1; - i__1 = -(*info); - xerbla_((char *)"DSTERF", &i__1, (ftnlen)6); - return 0; + *info = -1; + i__1 = -(*info); + xerbla_((char *)"DSTERF", &i__1, (ftnlen)6); + return 0; } if (*n <= 1) { - return 0; + return 0; } /* Determine the unit roundoff for this environment. */ @@ -221,18 +221,18 @@ f"> */ L10: if (l1 > *n) { - goto L170; + goto L170; } if (l1 > 1) { - e[l1 - 1] = 0.; + e[l1 - 1] = 0.; } i__1 = *n - 1; for (m = l1; m <= i__1; ++m) { - if ((d__3 = e[m], abs(d__3)) <= sqrt((d__1 = d__[m], abs(d__1))) * - sqrt((d__2 = d__[m + 1], abs(d__2))) * eps) { - e[m] = 0.; - goto L30; - } + if ((d__3 = e[m], abs(d__3)) <= sqrt((d__1 = d__[m], abs(d__1))) * + sqrt((d__2 = d__[m + 1], abs(d__2))) * eps) { + e[m] = 0.; + goto L30; + } /* L20: */ } m = *n; @@ -244,7 +244,7 @@ L30: lendsv = lend; l1 = m + 1; if (lend == l) { - goto L10; + goto L10; } /* Scale submatrix in rows and columns L to LEND */ @@ -253,39 +253,39 @@ L30: anorm = dlanst_((char *)"M", &i__1, &d__[l], &e[l], (ftnlen)1); iscale = 0; if (anorm == 0.) { - goto L10; + goto L10; } if (anorm > ssfmax) { - iscale = 1; - i__1 = lend - l + 1; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, - info, (ftnlen)1); - i__1 = lend - l; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, - info, (ftnlen)1); + iscale = 1; + i__1 = lend - l + 1; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, + info, (ftnlen)1); + i__1 = lend - l; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, + info, (ftnlen)1); } else if (anorm < ssfmin) { - iscale = 2; - i__1 = lend - l + 1; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, - info, (ftnlen)1); - i__1 = lend - l; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, - info, (ftnlen)1); + iscale = 2; + i__1 = lend - l + 1; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, + info, (ftnlen)1); + i__1 = lend - l; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, + info, (ftnlen)1); } i__1 = lend - 1; for (i__ = l; i__ <= i__1; ++i__) { /* Computing 2nd power */ - d__1 = e[i__]; - e[i__] = d__1 * d__1; + d__1 = e[i__]; + e[i__] = d__1 * d__1; /* L40: */ } /* Choose between QL and QR iteration */ if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { - lend = lsv; - l = lendsv; + lend = lsv; + l = lendsv; } if (lend >= l) { @@ -295,98 +295,98 @@ L30: /* Look for small subdiagonal element. */ L50: - if (l != lend) { - i__1 = lend - 1; - for (m = l; m <= i__1; ++m) { - if ((d__2 = e[m], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m - + 1], abs(d__1))) { - goto L70; - } + if (l != lend) { + i__1 = lend - 1; + for (m = l; m <= i__1; ++m) { + if ((d__2 = e[m], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m + + 1], abs(d__1))) { + goto L70; + } /* L60: */ - } - } - m = lend; + } + } + m = lend; L70: - if (m < lend) { - e[m] = 0.; - } - p = d__[l]; - if (m == l) { - goto L90; - } + if (m < lend) { + e[m] = 0.; + } + p = d__[l]; + if (m == l) { + goto L90; + } /* If remaining matrix is 2 by 2, use DLAE2 to compute its */ /* eigenvalues. */ - if (m == l + 1) { - rte = sqrt(e[l]); - dlae2_(&d__[l], &rte, &d__[l + 1], &rt1, &rt2); - d__[l] = rt1; - d__[l + 1] = rt2; - e[l] = 0.; - l += 2; - if (l <= lend) { - goto L50; - } - goto L150; - } + if (m == l + 1) { + rte = sqrt(e[l]); + dlae2_(&d__[l], &rte, &d__[l + 1], &rt1, &rt2); + d__[l] = rt1; + d__[l + 1] = rt2; + e[l] = 0.; + l += 2; + if (l <= lend) { + goto L50; + } + goto L150; + } - if (jtot == nmaxit) { - goto L150; - } - ++jtot; + if (jtot == nmaxit) { + goto L150; + } + ++jtot; /* Form shift. */ - rte = sqrt(e[l]); - sigma = (d__[l + 1] - p) / (rte * 2.); - r__ = dlapy2_(&sigma, &c_b33); - sigma = p - rte / (sigma + d_sign(&r__, &sigma)); + rte = sqrt(e[l]); + sigma = (d__[l + 1] - p) / (rte * 2.); + r__ = dlapy2_(&sigma, &c_b33); + sigma = p - rte / (sigma + d_sign(&r__, &sigma)); - c__ = 1.; - s = 0.; - gamma = d__[m] - sigma; - p = gamma * gamma; + c__ = 1.; + s = 0.; + gamma = d__[m] - sigma; + p = gamma * gamma; /* Inner loop */ - i__1 = l; - for (i__ = m - 1; i__ >= i__1; --i__) { - bb = e[i__]; - r__ = p + bb; - if (i__ != m - 1) { - e[i__ + 1] = s * r__; - } - oldc = c__; - c__ = p / r__; - s = bb / r__; - oldgam = gamma; - alpha = d__[i__]; - gamma = c__ * (alpha - sigma) - s * oldgam; - d__[i__ + 1] = oldgam + (alpha - gamma); - if (c__ != 0.) { - p = gamma * gamma / c__; - } else { - p = oldc * bb; - } + i__1 = l; + for (i__ = m - 1; i__ >= i__1; --i__) { + bb = e[i__]; + r__ = p + bb; + if (i__ != m - 1) { + e[i__ + 1] = s * r__; + } + oldc = c__; + c__ = p / r__; + s = bb / r__; + oldgam = gamma; + alpha = d__[i__]; + gamma = c__ * (alpha - sigma) - s * oldgam; + d__[i__ + 1] = oldgam + (alpha - gamma); + if (c__ != 0.) { + p = gamma * gamma / c__; + } else { + p = oldc * bb; + } /* L80: */ - } + } - e[l] = s * p; - d__[l] = sigma + gamma; - goto L50; + e[l] = s * p; + d__[l] = sigma + gamma; + goto L50; /* Eigenvalue found. */ L90: - d__[l] = p; + d__[l] = p; - ++l; - if (l <= lend) { - goto L50; - } - goto L150; + ++l; + if (l <= lend) { + goto L50; + } + goto L150; } else { @@ -395,96 +395,96 @@ L90: /* Look for small superdiagonal element. */ L100: - i__1 = lend + 1; - for (m = l; m >= i__1; --m) { - if ((d__2 = e[m - 1], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m - - 1], abs(d__1))) { - goto L120; - } + i__1 = lend + 1; + for (m = l; m >= i__1; --m) { + if ((d__2 = e[m - 1], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m + - 1], abs(d__1))) { + goto L120; + } /* L110: */ - } - m = lend; + } + m = lend; L120: - if (m > lend) { - e[m - 1] = 0.; - } - p = d__[l]; - if (m == l) { - goto L140; - } + if (m > lend) { + e[m - 1] = 0.; + } + p = d__[l]; + if (m == l) { + goto L140; + } /* If remaining matrix is 2 by 2, use DLAE2 to compute its */ /* eigenvalues. */ - if (m == l - 1) { - rte = sqrt(e[l - 1]); - dlae2_(&d__[l], &rte, &d__[l - 1], &rt1, &rt2); - d__[l] = rt1; - d__[l - 1] = rt2; - e[l - 1] = 0.; - l += -2; - if (l >= lend) { - goto L100; - } - goto L150; - } + if (m == l - 1) { + rte = sqrt(e[l - 1]); + dlae2_(&d__[l], &rte, &d__[l - 1], &rt1, &rt2); + d__[l] = rt1; + d__[l - 1] = rt2; + e[l - 1] = 0.; + l += -2; + if (l >= lend) { + goto L100; + } + goto L150; + } - if (jtot == nmaxit) { - goto L150; - } - ++jtot; + if (jtot == nmaxit) { + goto L150; + } + ++jtot; /* Form shift. */ - rte = sqrt(e[l - 1]); - sigma = (d__[l - 1] - p) / (rte * 2.); - r__ = dlapy2_(&sigma, &c_b33); - sigma = p - rte / (sigma + d_sign(&r__, &sigma)); + rte = sqrt(e[l - 1]); + sigma = (d__[l - 1] - p) / (rte * 2.); + r__ = dlapy2_(&sigma, &c_b33); + sigma = p - rte / (sigma + d_sign(&r__, &sigma)); - c__ = 1.; - s = 0.; - gamma = d__[m] - sigma; - p = gamma * gamma; + c__ = 1.; + s = 0.; + gamma = d__[m] - sigma; + p = gamma * gamma; /* Inner loop */ - i__1 = l - 1; - for (i__ = m; i__ <= i__1; ++i__) { - bb = e[i__]; - r__ = p + bb; - if (i__ != m) { - e[i__ - 1] = s * r__; - } - oldc = c__; - c__ = p / r__; - s = bb / r__; - oldgam = gamma; - alpha = d__[i__ + 1]; - gamma = c__ * (alpha - sigma) - s * oldgam; - d__[i__] = oldgam + (alpha - gamma); - if (c__ != 0.) { - p = gamma * gamma / c__; - } else { - p = oldc * bb; - } + i__1 = l - 1; + for (i__ = m; i__ <= i__1; ++i__) { + bb = e[i__]; + r__ = p + bb; + if (i__ != m) { + e[i__ - 1] = s * r__; + } + oldc = c__; + c__ = p / r__; + s = bb / r__; + oldgam = gamma; + alpha = d__[i__ + 1]; + gamma = c__ * (alpha - sigma) - s * oldgam; + d__[i__] = oldgam + (alpha - gamma); + if (c__ != 0.) { + p = gamma * gamma / c__; + } else { + p = oldc * bb; + } /* L130: */ - } + } - e[l - 1] = s * p; - d__[l] = sigma + gamma; - goto L100; + e[l - 1] = s * p; + d__[l] = sigma + gamma; + goto L100; /* Eigenvalue found. */ L140: - d__[l] = p; + d__[l] = p; - --l; - if (l >= lend) { - goto L100; - } - goto L150; + --l; + if (l >= lend) { + goto L100; + } + goto L150; } @@ -492,27 +492,27 @@ L140: L150: if (iscale == 1) { - i__1 = lendsv - lsv + 1; - dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], - n, info, (ftnlen)1); + i__1 = lendsv - lsv + 1; + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], + n, info, (ftnlen)1); } if (iscale == 2) { - i__1 = lendsv - lsv + 1; - dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], - n, info, (ftnlen)1); + i__1 = lendsv - lsv + 1; + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], + n, info, (ftnlen)1); } /* Check for no convergence to an eigenvalue after a total */ /* of N*MAXIT iterations. */ if (jtot < nmaxit) { - goto L10; + goto L10; } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { - if (e[i__] != 0.) { - ++(*info); - } + if (e[i__] != 0.) { + ++(*info); + } /* L160: */ } goto L180; @@ -530,5 +530,5 @@ L180: } /* dsterf_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dswap.cpp b/lib/linalg/dswap.cpp index a1eca4fc06..4cb6a77f67 100644 --- a/lib/linalg/dswap.cpp +++ b/lib/linalg/dswap.cpp @@ -1,13 +1,13 @@ /* fortran/dswap.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -95,8 +95,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dswap_(integer *n, doublereal *dx, integer *incx, - doublereal *dy, integer *incy) +/* Subroutine */ int dswap_(integer *n, doublereal *dx, integer *incx, + doublereal *dy, integer *incy) { /* System generated locals */ integer i__1; @@ -127,7 +127,7 @@ extern "C" { /* Function Body */ if (*n <= 0) { - return 0; + return 0; } if (*incx == 1 && *incy == 1) { @@ -136,52 +136,52 @@ extern "C" { /* clean-up loop */ - m = *n % 3; - if (m != 0) { - i__1 = m; - for (i__ = 1; i__ <= i__1; ++i__) { - dtemp = dx[i__]; - dx[i__] = dy[i__]; - dy[i__] = dtemp; - } - if (*n < 3) { - return 0; - } - } - mp1 = m + 1; - i__1 = *n; - for (i__ = mp1; i__ <= i__1; i__ += 3) { - dtemp = dx[i__]; - dx[i__] = dy[i__]; - dy[i__] = dtemp; - dtemp = dx[i__ + 1]; - dx[i__ + 1] = dy[i__ + 1]; - dy[i__ + 1] = dtemp; - dtemp = dx[i__ + 2]; - dx[i__ + 2] = dy[i__ + 2]; - dy[i__ + 2] = dtemp; - } + m = *n % 3; + if (m != 0) { + i__1 = m; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp = dx[i__]; + dx[i__] = dy[i__]; + dy[i__] = dtemp; + } + if (*n < 3) { + return 0; + } + } + mp1 = m + 1; + i__1 = *n; + for (i__ = mp1; i__ <= i__1; i__ += 3) { + dtemp = dx[i__]; + dx[i__] = dy[i__]; + dy[i__] = dtemp; + dtemp = dx[i__ + 1]; + dx[i__ + 1] = dy[i__ + 1]; + dy[i__ + 1] = dtemp; + dtemp = dx[i__ + 2]; + dx[i__ + 2] = dy[i__ + 2]; + dy[i__ + 2] = dtemp; + } } else { /* code for unequal increments or equal increments not equal */ /* to 1 */ - ix = 1; - iy = 1; - if (*incx < 0) { - ix = (-(*n) + 1) * *incx + 1; - } - if (*incy < 0) { - iy = (-(*n) + 1) * *incy + 1; - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - dtemp = dx[ix]; - dx[ix] = dy[iy]; - dy[iy] = dtemp; - ix += *incx; - iy += *incy; - } + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + dtemp = dx[ix]; + dx[ix] = dy[iy]; + dy[iy] = dtemp; + ix += *incx; + iy += *incy; + } } return 0; @@ -190,5 +190,5 @@ extern "C" { } /* dswap_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsyev.cpp b/lib/linalg/dsyev.cpp index 603b633195..a222fc4b09 100644 --- a/lib/linalg/dsyev.cpp +++ b/lib/linalg/dsyev.cpp @@ -1,13 +1,13 @@ /* fortran/dsyev.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -157,8 +157,8 @@ ices */ /* ===================================================================== */ /* Subroutine */ int dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, - integer *lda, doublereal *w, doublereal *work, integer *lwork, - integer *info, ftnlen jobz_len, ftnlen uplo_len) + integer *lda, doublereal *w, doublereal *work, integer *lwork, + integer *info, ftnlen jobz_len, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -174,35 +174,35 @@ ices */ doublereal anrm; integer imax; doublereal rmin, rmax; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); doublereal sigma; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; logical lower, wantz; extern doublereal dlamch_(char *, ftnlen); integer iscale; - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen); doublereal safmin; - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); doublereal bignum; integer indtau; extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, - integer *); - extern doublereal dlansy_(char *, char *, integer *, doublereal *, - integer *, doublereal *, ftnlen, ftnlen); + integer *); + extern doublereal dlansy_(char *, char *, integer *, doublereal *, + integer *, doublereal *, ftnlen, ftnlen); integer indwrk; - extern /* Subroutine */ int dorgtr_(char *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, integer *, - ftnlen), dsteqr_(char *, integer *, doublereal *, doublereal *, - doublereal *, integer *, doublereal *, integer *, ftnlen), - dsytrd_(char *, integer *, doublereal *, integer *, doublereal *, - doublereal *, doublereal *, doublereal *, integer *, integer *, - ftnlen); + extern /* Subroutine */ int dorgtr_(char *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, integer *, + ftnlen), dsteqr_(char *, integer *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen), + dsytrd_(char *, integer *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, integer *, + ftnlen); integer llwork; doublereal smlnum; integer lwkopt; @@ -248,51 +248,51 @@ ices */ *info = 0; if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { - *info = -1; + *info = -1; } else if (! (lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { - *info = -2; + *info = -2; } else if (*n < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*n)) { - *info = -5; + *info = -5; } if (*info == 0) { - nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, - (ftnlen)1); + nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, + (ftnlen)1); /* Computing MAX */ - i__1 = 1, i__2 = (nb + 2) * *n; - lwkopt = max(i__1,i__2); - work[1] = (doublereal) lwkopt; + i__1 = 1, i__2 = (nb + 2) * *n; + lwkopt = max(i__1,i__2); + work[1] = (doublereal) lwkopt; /* Computing MAX */ - i__1 = 1, i__2 = *n * 3 - 1; - if (*lwork < max(i__1,i__2) && ! lquery) { - *info = -8; - } + i__1 = 1, i__2 = *n * 3 - 1; + if (*lwork < max(i__1,i__2) && ! lquery) { + *info = -8; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DSYEV ", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DSYEV ", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } if (*n == 1) { - w[1] = a[a_dim1 + 1]; - work[1] = 2.; - if (wantz) { - a[a_dim1 + 1] = 1.; - } - return 0; + w[1] = a[a_dim1 + 1]; + work[1] = 2.; + if (wantz) { + a[a_dim1 + 1] = 1.; + } + return 0; } /* Get machine constants. */ @@ -307,18 +307,18 @@ ices */ /* Scale matrix to allowable range, if necessary. */ anrm = dlansy_((char *)"M", uplo, n, &a[a_offset], lda, &work[1], (ftnlen)1, ( - ftnlen)1); + ftnlen)1); iscale = 0; if (anrm > 0. && anrm < rmin) { - iscale = 1; - sigma = rmin / anrm; + iscale = 1; + sigma = rmin / anrm; } else if (anrm > rmax) { - iscale = 1; - sigma = rmax / anrm; + iscale = 1; + sigma = rmax / anrm; } if (iscale == 1) { - dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, - info, (ftnlen)1); + dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, + info, (ftnlen)1); } /* Call DSYTRD to reduce symmetric matrix to tridiagonal form. */ @@ -328,30 +328,30 @@ ices */ indwrk = indtau + *n; llwork = *lwork - indwrk + 1; dsytrd_(uplo, n, &a[a_offset], lda, &w[1], &work[inde], &work[indtau], & - work[indwrk], &llwork, &iinfo, (ftnlen)1); + work[indwrk], &llwork, &iinfo, (ftnlen)1); /* For eigenvalues only, call DSTERF. For eigenvectors, first call */ /* DORGTR to generate the orthogonal matrix, then call DSTEQR. */ if (! wantz) { - dsterf_(n, &w[1], &work[inde], info); + dsterf_(n, &w[1], &work[inde], info); } else { - dorgtr_(uplo, n, &a[a_offset], lda, &work[indtau], &work[indwrk], & - llwork, &iinfo, (ftnlen)1); - dsteqr_(jobz, n, &w[1], &work[inde], &a[a_offset], lda, &work[indtau], - info, (ftnlen)1); + dorgtr_(uplo, n, &a[a_offset], lda, &work[indtau], &work[indwrk], & + llwork, &iinfo, (ftnlen)1); + dsteqr_(jobz, n, &w[1], &work[inde], &a[a_offset], lda, &work[indtau], + info, (ftnlen)1); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { - if (*info == 0) { - imax = *n; - } else { - imax = *info - 1; - } - d__1 = 1. / sigma; - dscal_(&imax, &d__1, &w[1], &c__1); + if (*info == 0) { + imax = *n; + } else { + imax = *info - 1; + } + d__1 = 1. / sigma; + dscal_(&imax, &d__1, &w[1], &c__1); } /* Set WORK(1) to optimal workspace size. */ @@ -365,5 +365,5 @@ ices */ } /* dsyev_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsyevd.cpp b/lib/linalg/dsyevd.cpp index a0e0084884..2f8d5a145b 100644 --- a/lib/linalg/dsyevd.cpp +++ b/lib/linalg/dsyevd.cpp @@ -1,13 +1,13 @@ /* fortran/dsyevd.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -207,9 +207,9 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dsyevd_(char *jobz, char *uplo, integer *n, doublereal * - a, integer *lda, doublereal *w, doublereal *work, integer *lwork, - integer *iwork, integer *liwork, integer *info, ftnlen jobz_len, - ftnlen uplo_len) + a, integer *lda, doublereal *w, doublereal *work, integer *lwork, + integer *iwork, integer *liwork, integer *info, ftnlen jobz_len, + ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -223,8 +223,8 @@ f"> */ integer inde; doublereal anrm, rmin, rmax; integer lopt; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); doublereal sigma; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo, lwmin, liopt; @@ -232,30 +232,30 @@ f"> */ integer indwk2, llwrk2; extern doublereal dlamch_(char *, ftnlen); integer iscale; - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dstedc_(char *, integer *, - doublereal *, doublereal *, doublereal *, integer *, doublereal *, - integer *, integer *, integer *, integer *, ftnlen), dlacpy_( - char *, integer *, integer *, doublereal *, integer *, doublereal - *, integer *, ftnlen); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dstedc_(char *, integer *, + doublereal *, doublereal *, doublereal *, integer *, doublereal *, + integer *, integer *, integer *, integer *, ftnlen), dlacpy_( + char *, integer *, integer *, doublereal *, integer *, doublereal + *, integer *, ftnlen); doublereal safmin; - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); doublereal bignum; integer indtau; extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, - integer *); - extern doublereal dlansy_(char *, char *, integer *, doublereal *, - integer *, doublereal *, ftnlen, ftnlen); + integer *); + extern doublereal dlansy_(char *, char *, integer *, doublereal *, + integer *, doublereal *, ftnlen, ftnlen); integer indwrk, liwmin; - extern /* Subroutine */ int dormtr_(char *, char *, char *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen, - ftnlen), dsytrd_(char *, integer *, doublereal *, integer *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *, - integer *, ftnlen); + extern /* Subroutine */ int dormtr_(char *, char *, char *, integer *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, integer *, ftnlen, ftnlen, + ftnlen), dsytrd_(char *, integer *, doublereal *, integer *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *, ftnlen); integer llwork; doublereal smlnum; logical lquery; @@ -302,67 +302,67 @@ f"> */ *info = 0; if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { - *info = -1; + *info = -1; } else if (! (lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { - *info = -2; + *info = -2; } else if (*n < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*n)) { - *info = -5; + *info = -5; } if (*info == 0) { - if (*n <= 1) { - liwmin = 1; - lwmin = 1; - lopt = lwmin; - liopt = liwmin; - } else { - if (wantz) { - liwmin = *n * 5 + 3; + if (*n <= 1) { + liwmin = 1; + lwmin = 1; + lopt = lwmin; + liopt = liwmin; + } else { + if (wantz) { + liwmin = *n * 5 + 3; /* Computing 2nd power */ - i__1 = *n; - lwmin = *n * 6 + 1 + (i__1 * i__1 << 1); - } else { - liwmin = 1; - lwmin = (*n << 1) + 1; - } + i__1 = *n; + lwmin = *n * 6 + 1 + (i__1 * i__1 << 1); + } else { + liwmin = 1; + lwmin = (*n << 1) + 1; + } /* Computing MAX */ - i__1 = lwmin, i__2 = (*n << 1) + *n * ilaenv_(&c__1, (char *)"DSYTRD", - uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); - lopt = max(i__1,i__2); - liopt = liwmin; - } - work[1] = (doublereal) lopt; - iwork[1] = liopt; + i__1 = lwmin, i__2 = (*n << 1) + *n * ilaenv_(&c__1, (char *)"DSYTRD", + uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + lopt = max(i__1,i__2); + liopt = liwmin; + } + work[1] = (doublereal) lopt; + iwork[1] = liopt; - if (*lwork < lwmin && ! lquery) { - *info = -8; - } else if (*liwork < liwmin && ! lquery) { - *info = -10; - } + if (*lwork < lwmin && ! lquery) { + *info = -8; + } else if (*liwork < liwmin && ! lquery) { + *info = -10; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DSYEVD", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DSYEVD", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } if (*n == 1) { - w[1] = a[a_dim1 + 1]; - if (wantz) { - a[a_dim1 + 1] = 1.; - } - return 0; + w[1] = a[a_dim1 + 1]; + if (wantz) { + a[a_dim1 + 1] = 1.; + } + return 0; } /* Get machine constants. */ @@ -377,18 +377,18 @@ f"> */ /* Scale matrix to allowable range, if necessary. */ anrm = dlansy_((char *)"M", uplo, n, &a[a_offset], lda, &work[1], (ftnlen)1, ( - ftnlen)1); + ftnlen)1); iscale = 0; if (anrm > 0. && anrm < rmin) { - iscale = 1; - sigma = rmin / anrm; + iscale = 1; + sigma = rmin / anrm; } else if (anrm > rmax) { - iscale = 1; - sigma = rmax / anrm; + iscale = 1; + sigma = rmax / anrm; } if (iscale == 1) { - dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, - info, (ftnlen)1); + dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, + info, (ftnlen)1); } /* Call DSYTRD to reduce symmetric matrix to tridiagonal form. */ @@ -401,7 +401,7 @@ f"> */ llwrk2 = *lwork - indwk2 + 1; dsytrd_(uplo, n, &a[a_offset], lda, &w[1], &work[inde], &work[indtau], & - work[indwrk], &llwork, &iinfo, (ftnlen)1); + work[indwrk], &llwork, &iinfo, (ftnlen)1); /* For eigenvalues only, call DSTERF. For eigenvectors, first call */ /* DSTEDC to generate the eigenvector matrix, WORK(INDWRK), of the */ @@ -409,21 +409,21 @@ f"> */ /* Householder transformations stored in A. */ if (! wantz) { - dsterf_(n, &w[1], &work[inde], info); + dsterf_(n, &w[1], &work[inde], info); } else { - dstedc_((char *)"I", n, &w[1], &work[inde], &work[indwrk], n, &work[indwk2], & - llwrk2, &iwork[1], liwork, info, (ftnlen)1); - dormtr_((char *)"L", uplo, (char *)"N", n, n, &a[a_offset], lda, &work[indtau], &work[ - indwrk], n, &work[indwk2], &llwrk2, &iinfo, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - dlacpy_((char *)"A", n, n, &work[indwrk], n, &a[a_offset], lda, (ftnlen)1); + dstedc_((char *)"I", n, &w[1], &work[inde], &work[indwrk], n, &work[indwk2], & + llwrk2, &iwork[1], liwork, info, (ftnlen)1); + dormtr_((char *)"L", uplo, (char *)"N", n, n, &a[a_offset], lda, &work[indtau], &work[ + indwrk], n, &work[indwk2], &llwrk2, &iinfo, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + dlacpy_((char *)"A", n, n, &work[indwrk], n, &a[a_offset], lda, (ftnlen)1); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { - d__1 = 1. / sigma; - dscal_(n, &d__1, &w[1], &c__1); + d__1 = 1. / sigma; + dscal_(n, &d__1, &w[1], &c__1); } work[1] = (doublereal) lopt; @@ -436,5 +436,5 @@ f"> */ } /* dsyevd_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsygs2.cpp b/lib/linalg/dsygs2.cpp index 8b0089be28..785aeb4f27 100644 --- a/lib/linalg/dsygs2.cpp +++ b/lib/linalg/dsygs2.cpp @@ -1,13 +1,13 @@ /* fortran/dsygs2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -150,9 +150,9 @@ f"> */ /* > \ingroup doubleSYcomputational */ /* ===================================================================== */ -/* Subroutine */ int dsygs2_(integer *itype, char *uplo, integer *n, - doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * - info, ftnlen uplo_len) +/* Subroutine */ int dsygs2_(integer *itype, char *uplo, integer *n, + doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * + info, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; @@ -161,19 +161,19 @@ f"> */ /* Local variables */ integer k; doublereal ct, akk, bkk; - extern /* Subroutine */ int dsyr2_(char *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, ftnlen), dscal_(integer *, doublereal *, doublereal *, - integer *); + extern /* Subroutine */ int dsyr2_(char *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen), dscal_(integer *, doublereal *, doublereal *, + integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *); + extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *); logical upper; - extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen), dtrsv_(char *, char *, char *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen), - xerbla_(char *, integer *, ftnlen); + extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen), dtrsv_(char *, char *, char *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); /* -- LAPACK computational routine -- */ @@ -213,162 +213,162 @@ f"> */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (*itype < 1 || *itype > 3) { - *info = -1; + *info = -1; } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*n < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*n)) { - *info = -5; + *info = -5; } else if (*ldb < max(1,*n)) { - *info = -7; + *info = -7; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DSYGS2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DSYGS2", &i__1, (ftnlen)6); + return 0; } if (*itype == 1) { - if (upper) { + if (upper) { /* Compute inv(U**T)*A*inv(U) */ - i__1 = *n; - for (k = 1; k <= i__1; ++k) { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { /* Update the upper triangle of A(k:n,k:n) */ - akk = a[k + k * a_dim1]; - bkk = b[k + k * b_dim1]; + akk = a[k + k * a_dim1]; + bkk = b[k + k * b_dim1]; /* Computing 2nd power */ - d__1 = bkk; - akk /= d__1 * d__1; - a[k + k * a_dim1] = akk; - if (k < *n) { - i__2 = *n - k; - d__1 = 1. / bkk; - dscal_(&i__2, &d__1, &a[k + (k + 1) * a_dim1], lda); - ct = akk * -.5; - i__2 = *n - k; - daxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + ( - k + 1) * a_dim1], lda); - i__2 = *n - k; - dsyr2_(uplo, &i__2, &c_b6, &a[k + (k + 1) * a_dim1], lda, - &b[k + (k + 1) * b_dim1], ldb, &a[k + 1 + (k + 1) - * a_dim1], lda, (ftnlen)1); - i__2 = *n - k; - daxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + ( - k + 1) * a_dim1], lda); - i__2 = *n - k; - dtrsv_(uplo, (char *)"Transpose", (char *)"Non-unit", &i__2, &b[k + 1 + ( - k + 1) * b_dim1], ldb, &a[k + (k + 1) * a_dim1], - lda, (ftnlen)1, (ftnlen)9, (ftnlen)8); - } + d__1 = bkk; + akk /= d__1 * d__1; + a[k + k * a_dim1] = akk; + if (k < *n) { + i__2 = *n - k; + d__1 = 1. / bkk; + dscal_(&i__2, &d__1, &a[k + (k + 1) * a_dim1], lda); + ct = akk * -.5; + i__2 = *n - k; + daxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + ( + k + 1) * a_dim1], lda); + i__2 = *n - k; + dsyr2_(uplo, &i__2, &c_b6, &a[k + (k + 1) * a_dim1], lda, + &b[k + (k + 1) * b_dim1], ldb, &a[k + 1 + (k + 1) + * a_dim1], lda, (ftnlen)1); + i__2 = *n - k; + daxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + ( + k + 1) * a_dim1], lda); + i__2 = *n - k; + dtrsv_(uplo, (char *)"Transpose", (char *)"Non-unit", &i__2, &b[k + 1 + ( + k + 1) * b_dim1], ldb, &a[k + (k + 1) * a_dim1], + lda, (ftnlen)1, (ftnlen)9, (ftnlen)8); + } /* L10: */ - } - } else { + } + } else { /* Compute inv(L)*A*inv(L**T) */ - i__1 = *n; - for (k = 1; k <= i__1; ++k) { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { /* Update the lower triangle of A(k:n,k:n) */ - akk = a[k + k * a_dim1]; - bkk = b[k + k * b_dim1]; + akk = a[k + k * a_dim1]; + bkk = b[k + k * b_dim1]; /* Computing 2nd power */ - d__1 = bkk; - akk /= d__1 * d__1; - a[k + k * a_dim1] = akk; - if (k < *n) { - i__2 = *n - k; - d__1 = 1. / bkk; - dscal_(&i__2, &d__1, &a[k + 1 + k * a_dim1], &c__1); - ct = akk * -.5; - i__2 = *n - k; - daxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + - 1 + k * a_dim1], &c__1); - i__2 = *n - k; - dsyr2_(uplo, &i__2, &c_b6, &a[k + 1 + k * a_dim1], &c__1, - &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + (k + 1) - * a_dim1], lda, (ftnlen)1); - i__2 = *n - k; - daxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + - 1 + k * a_dim1], &c__1); - i__2 = *n - k; - dtrsv_(uplo, (char *)"No transpose", (char *)"Non-unit", &i__2, &b[k + 1 - + (k + 1) * b_dim1], ldb, &a[k + 1 + k * a_dim1], - &c__1, (ftnlen)1, (ftnlen)12, (ftnlen)8); - } + d__1 = bkk; + akk /= d__1 * d__1; + a[k + k * a_dim1] = akk; + if (k < *n) { + i__2 = *n - k; + d__1 = 1. / bkk; + dscal_(&i__2, &d__1, &a[k + 1 + k * a_dim1], &c__1); + ct = akk * -.5; + i__2 = *n - k; + daxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + + 1 + k * a_dim1], &c__1); + i__2 = *n - k; + dsyr2_(uplo, &i__2, &c_b6, &a[k + 1 + k * a_dim1], &c__1, + &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + (k + 1) + * a_dim1], lda, (ftnlen)1); + i__2 = *n - k; + daxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + + 1 + k * a_dim1], &c__1); + i__2 = *n - k; + dtrsv_(uplo, (char *)"No transpose", (char *)"Non-unit", &i__2, &b[k + 1 + + (k + 1) * b_dim1], ldb, &a[k + 1 + k * a_dim1], + &c__1, (ftnlen)1, (ftnlen)12, (ftnlen)8); + } /* L20: */ - } - } + } + } } else { - if (upper) { + if (upper) { /* Compute U*A*U**T */ - i__1 = *n; - for (k = 1; k <= i__1; ++k) { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { /* Update the upper triangle of A(1:k,1:k) */ - akk = a[k + k * a_dim1]; - bkk = b[k + k * b_dim1]; - i__2 = k - 1; - dtrmv_(uplo, (char *)"No transpose", (char *)"Non-unit", &i__2, &b[b_offset], - ldb, &a[k * a_dim1 + 1], &c__1, (ftnlen)1, (ftnlen)12, - (ftnlen)8); - ct = akk * .5; - i__2 = k - 1; - daxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + - 1], &c__1); - i__2 = k - 1; - dsyr2_(uplo, &i__2, &c_b27, &a[k * a_dim1 + 1], &c__1, &b[k * - b_dim1 + 1], &c__1, &a[a_offset], lda, (ftnlen)1); - i__2 = k - 1; - daxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + - 1], &c__1); - i__2 = k - 1; - dscal_(&i__2, &bkk, &a[k * a_dim1 + 1], &c__1); + akk = a[k + k * a_dim1]; + bkk = b[k + k * b_dim1]; + i__2 = k - 1; + dtrmv_(uplo, (char *)"No transpose", (char *)"Non-unit", &i__2, &b[b_offset], + ldb, &a[k * a_dim1 + 1], &c__1, (ftnlen)1, (ftnlen)12, + (ftnlen)8); + ct = akk * .5; + i__2 = k - 1; + daxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + + 1], &c__1); + i__2 = k - 1; + dsyr2_(uplo, &i__2, &c_b27, &a[k * a_dim1 + 1], &c__1, &b[k * + b_dim1 + 1], &c__1, &a[a_offset], lda, (ftnlen)1); + i__2 = k - 1; + daxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + + 1], &c__1); + i__2 = k - 1; + dscal_(&i__2, &bkk, &a[k * a_dim1 + 1], &c__1); /* Computing 2nd power */ - d__1 = bkk; - a[k + k * a_dim1] = akk * (d__1 * d__1); + d__1 = bkk; + a[k + k * a_dim1] = akk * (d__1 * d__1); /* L30: */ - } - } else { + } + } else { /* Compute L**T *A*L */ - i__1 = *n; - for (k = 1; k <= i__1; ++k) { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { /* Update the lower triangle of A(1:k,1:k) */ - akk = a[k + k * a_dim1]; - bkk = b[k + k * b_dim1]; - i__2 = k - 1; - dtrmv_(uplo, (char *)"Transpose", (char *)"Non-unit", &i__2, &b[b_offset], - ldb, &a[k + a_dim1], lda, (ftnlen)1, (ftnlen)9, ( - ftnlen)8); - ct = akk * .5; - i__2 = k - 1; - daxpy_(&i__2, &ct, &b[k + b_dim1], ldb, &a[k + a_dim1], lda); - i__2 = k - 1; - dsyr2_(uplo, &i__2, &c_b27, &a[k + a_dim1], lda, &b[k + - b_dim1], ldb, &a[a_offset], lda, (ftnlen)1); - i__2 = k - 1; - daxpy_(&i__2, &ct, &b[k + b_dim1], ldb, &a[k + a_dim1], lda); - i__2 = k - 1; - dscal_(&i__2, &bkk, &a[k + a_dim1], lda); + akk = a[k + k * a_dim1]; + bkk = b[k + k * b_dim1]; + i__2 = k - 1; + dtrmv_(uplo, (char *)"Transpose", (char *)"Non-unit", &i__2, &b[b_offset], + ldb, &a[k + a_dim1], lda, (ftnlen)1, (ftnlen)9, ( + ftnlen)8); + ct = akk * .5; + i__2 = k - 1; + daxpy_(&i__2, &ct, &b[k + b_dim1], ldb, &a[k + a_dim1], lda); + i__2 = k - 1; + dsyr2_(uplo, &i__2, &c_b27, &a[k + a_dim1], lda, &b[k + + b_dim1], ldb, &a[a_offset], lda, (ftnlen)1); + i__2 = k - 1; + daxpy_(&i__2, &ct, &b[k + b_dim1], ldb, &a[k + a_dim1], lda); + i__2 = k - 1; + dscal_(&i__2, &bkk, &a[k + a_dim1], lda); /* Computing 2nd power */ - d__1 = bkk; - a[k + k * a_dim1] = akk * (d__1 * d__1); + d__1 = bkk; + a[k + k * a_dim1] = akk * (d__1 * d__1); /* L40: */ - } - } + } + } } return 0; @@ -377,5 +377,5 @@ f"> */ } /* dsygs2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsygst.cpp b/lib/linalg/dsygst.cpp index 2f5189a6f1..0ad89918d3 100644 --- a/lib/linalg/dsygst.cpp +++ b/lib/linalg/dsygst.cpp @@ -1,13 +1,13 @@ /* fortran/dsygst.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -152,9 +152,9 @@ f"> */ /* > \ingroup doubleSYcomputational */ /* ===================================================================== */ -/* Subroutine */ int dsygst_(integer *itype, char *uplo, integer *n, - doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * - info, ftnlen uplo_len) +/* Subroutine */ int dsygst_(integer *itype, char *uplo, integer *n, + doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * + info, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; @@ -162,23 +162,23 @@ f"> */ /* Local variables */ integer k, kb, nb; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), dsymm_( - char *, char *, integer *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), dsymm_( + char *, char *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, ftnlen, ftnlen); logical upper; - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), dsygs2_( - integer *, char *, integer *, doublereal *, integer *, doublereal - *, integer *, integer *, ftnlen), dsyr2k_(char *, char *, integer - *, integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen) - , xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), dsygs2_( + integer *, char *, integer *, doublereal *, integer *, doublereal + *, integer *, integer *, ftnlen), dsyr2k_(char *, char *, integer + *, integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen) + , xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); /* -- LAPACK computational routine -- */ @@ -218,212 +218,212 @@ f"> */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (*itype < 1 || *itype > 3) { - *info = -1; + *info = -1; } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*n < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*n)) { - *info = -5; + *info = -5; } else if (*ldb < max(1,*n)) { - *info = -7; + *info = -7; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DSYGST", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DSYGST", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } /* Determine the block size for this environment. */ nb = ilaenv_(&c__1, (char *)"DSYGST", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( - ftnlen)1); + ftnlen)1); if (nb <= 1 || nb >= *n) { /* Use unblocked code */ - dsygs2_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, ( - ftnlen)1); + dsygs2_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, ( + ftnlen)1); } else { /* Use blocked code */ - if (*itype == 1) { - if (upper) { + if (*itype == 1) { + if (upper) { /* Compute inv(U**T)*A*inv(U) */ - i__1 = *n; - i__2 = nb; - for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { + i__1 = *n; + i__2 = nb; + for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { /* Computing MIN */ - i__3 = *n - k + 1; - kb = min(i__3,nb); + i__3 = *n - k + 1; + kb = min(i__3,nb); /* Update the upper triangle of A(k:n,k:n) */ - dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + - k * b_dim1], ldb, info, (ftnlen)1); - if (k + kb <= *n) { - i__3 = *n - k - kb + 1; - dtrsm_((char *)"Left", uplo, (char *)"Transpose", (char *)"Non-unit", &kb, & - i__3, &c_b14, &b[k + k * b_dim1], ldb, &a[k + - (k + kb) * a_dim1], lda, (ftnlen)4, (ftnlen)1, - (ftnlen)9, (ftnlen)8); - i__3 = *n - k - kb + 1; - dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b16, &a[k + k * - a_dim1], lda, &b[k + (k + kb) * b_dim1], ldb, - &c_b14, &a[k + (k + kb) * a_dim1], lda, ( - ftnlen)4, (ftnlen)1); - i__3 = *n - k - kb + 1; - dsyr2k_(uplo, (char *)"Transpose", &i__3, &kb, &c_b19, &a[k + - (k + kb) * a_dim1], lda, &b[k + (k + kb) * - b_dim1], ldb, &c_b14, &a[k + kb + (k + kb) * - a_dim1], lda, (ftnlen)1, (ftnlen)9); - i__3 = *n - k - kb + 1; - dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b16, &a[k + k * - a_dim1], lda, &b[k + (k + kb) * b_dim1], ldb, - &c_b14, &a[k + (k + kb) * a_dim1], lda, ( - ftnlen)4, (ftnlen)1); - i__3 = *n - k - kb + 1; - dtrsm_((char *)"Right", uplo, (char *)"No transpose", (char *)"Non-unit", &kb, - &i__3, &c_b14, &b[k + kb + (k + kb) * b_dim1] - , ldb, &a[k + (k + kb) * a_dim1], lda, ( - ftnlen)5, (ftnlen)1, (ftnlen)12, (ftnlen)8); - } + dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + + k * b_dim1], ldb, info, (ftnlen)1); + if (k + kb <= *n) { + i__3 = *n - k - kb + 1; + dtrsm_((char *)"Left", uplo, (char *)"Transpose", (char *)"Non-unit", &kb, & + i__3, &c_b14, &b[k + k * b_dim1], ldb, &a[k + + (k + kb) * a_dim1], lda, (ftnlen)4, (ftnlen)1, + (ftnlen)9, (ftnlen)8); + i__3 = *n - k - kb + 1; + dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b16, &a[k + k * + a_dim1], lda, &b[k + (k + kb) * b_dim1], ldb, + &c_b14, &a[k + (k + kb) * a_dim1], lda, ( + ftnlen)4, (ftnlen)1); + i__3 = *n - k - kb + 1; + dsyr2k_(uplo, (char *)"Transpose", &i__3, &kb, &c_b19, &a[k + + (k + kb) * a_dim1], lda, &b[k + (k + kb) * + b_dim1], ldb, &c_b14, &a[k + kb + (k + kb) * + a_dim1], lda, (ftnlen)1, (ftnlen)9); + i__3 = *n - k - kb + 1; + dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b16, &a[k + k * + a_dim1], lda, &b[k + (k + kb) * b_dim1], ldb, + &c_b14, &a[k + (k + kb) * a_dim1], lda, ( + ftnlen)4, (ftnlen)1); + i__3 = *n - k - kb + 1; + dtrsm_((char *)"Right", uplo, (char *)"No transpose", (char *)"Non-unit", &kb, + &i__3, &c_b14, &b[k + kb + (k + kb) * b_dim1] + , ldb, &a[k + (k + kb) * a_dim1], lda, ( + ftnlen)5, (ftnlen)1, (ftnlen)12, (ftnlen)8); + } /* L10: */ - } - } else { + } + } else { /* Compute inv(L)*A*inv(L**T) */ - i__2 = *n; - i__1 = nb; - for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { + i__2 = *n; + i__1 = nb; + for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { /* Computing MIN */ - i__3 = *n - k + 1; - kb = min(i__3,nb); + i__3 = *n - k + 1; + kb = min(i__3,nb); /* Update the lower triangle of A(k:n,k:n) */ - dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + - k * b_dim1], ldb, info, (ftnlen)1); - if (k + kb <= *n) { - i__3 = *n - k - kb + 1; - dtrsm_((char *)"Right", uplo, (char *)"Transpose", (char *)"Non-unit", &i__3, - &kb, &c_b14, &b[k + k * b_dim1], ldb, &a[k + - kb + k * a_dim1], lda, (ftnlen)5, (ftnlen)1, ( - ftnlen)9, (ftnlen)8); - i__3 = *n - k - kb + 1; - dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b16, &a[k + k * - a_dim1], lda, &b[k + kb + k * b_dim1], ldb, & - c_b14, &a[k + kb + k * a_dim1], lda, (ftnlen) - 5, (ftnlen)1); - i__3 = *n - k - kb + 1; - dsyr2k_(uplo, (char *)"No transpose", &i__3, &kb, &c_b19, &a[ - k + kb + k * a_dim1], lda, &b[k + kb + k * - b_dim1], ldb, &c_b14, &a[k + kb + (k + kb) * - a_dim1], lda, (ftnlen)1, (ftnlen)12); - i__3 = *n - k - kb + 1; - dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b16, &a[k + k * - a_dim1], lda, &b[k + kb + k * b_dim1], ldb, & - c_b14, &a[k + kb + k * a_dim1], lda, (ftnlen) - 5, (ftnlen)1); - i__3 = *n - k - kb + 1; - dtrsm_((char *)"Left", uplo, (char *)"No transpose", (char *)"Non-unit", & - i__3, &kb, &c_b14, &b[k + kb + (k + kb) * - b_dim1], ldb, &a[k + kb + k * a_dim1], lda, ( - ftnlen)4, (ftnlen)1, (ftnlen)12, (ftnlen)8); - } + dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + + k * b_dim1], ldb, info, (ftnlen)1); + if (k + kb <= *n) { + i__3 = *n - k - kb + 1; + dtrsm_((char *)"Right", uplo, (char *)"Transpose", (char *)"Non-unit", &i__3, + &kb, &c_b14, &b[k + k * b_dim1], ldb, &a[k + + kb + k * a_dim1], lda, (ftnlen)5, (ftnlen)1, ( + ftnlen)9, (ftnlen)8); + i__3 = *n - k - kb + 1; + dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b16, &a[k + k * + a_dim1], lda, &b[k + kb + k * b_dim1], ldb, & + c_b14, &a[k + kb + k * a_dim1], lda, (ftnlen) + 5, (ftnlen)1); + i__3 = *n - k - kb + 1; + dsyr2k_(uplo, (char *)"No transpose", &i__3, &kb, &c_b19, &a[ + k + kb + k * a_dim1], lda, &b[k + kb + k * + b_dim1], ldb, &c_b14, &a[k + kb + (k + kb) * + a_dim1], lda, (ftnlen)1, (ftnlen)12); + i__3 = *n - k - kb + 1; + dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b16, &a[k + k * + a_dim1], lda, &b[k + kb + k * b_dim1], ldb, & + c_b14, &a[k + kb + k * a_dim1], lda, (ftnlen) + 5, (ftnlen)1); + i__3 = *n - k - kb + 1; + dtrsm_((char *)"Left", uplo, (char *)"No transpose", (char *)"Non-unit", & + i__3, &kb, &c_b14, &b[k + kb + (k + kb) * + b_dim1], ldb, &a[k + kb + k * a_dim1], lda, ( + ftnlen)4, (ftnlen)1, (ftnlen)12, (ftnlen)8); + } /* L20: */ - } - } - } else { - if (upper) { + } + } + } else { + if (upper) { /* Compute U*A*U**T */ - i__1 = *n; - i__2 = nb; - for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { + i__1 = *n; + i__2 = nb; + for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { /* Computing MIN */ - i__3 = *n - k + 1; - kb = min(i__3,nb); + i__3 = *n - k + 1; + kb = min(i__3,nb); /* Update the upper triangle of A(1:k+kb-1,1:k+kb-1) */ - i__3 = k - 1; - dtrmm_((char *)"Left", uplo, (char *)"No transpose", (char *)"Non-unit", &i__3, & - kb, &c_b14, &b[b_offset], ldb, &a[k * a_dim1 + 1], - lda, (ftnlen)4, (ftnlen)1, (ftnlen)12, (ftnlen)8) - ; - i__3 = k - 1; - dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b52, &a[k + k * - a_dim1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, &a[ - k * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)1); - i__3 = k - 1; - dsyr2k_(uplo, (char *)"No transpose", &i__3, &kb, &c_b14, &a[k * - a_dim1 + 1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, - &a[a_offset], lda, (ftnlen)1, (ftnlen)12); - i__3 = k - 1; - dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b52, &a[k + k * - a_dim1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, &a[ - k * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)1); - i__3 = k - 1; - dtrmm_((char *)"Right", uplo, (char *)"Transpose", (char *)"Non-unit", &i__3, &kb, - &c_b14, &b[k + k * b_dim1], ldb, &a[k * a_dim1 + - 1], lda, (ftnlen)5, (ftnlen)1, (ftnlen)9, (ftnlen) - 8); - dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + - k * b_dim1], ldb, info, (ftnlen)1); + i__3 = k - 1; + dtrmm_((char *)"Left", uplo, (char *)"No transpose", (char *)"Non-unit", &i__3, & + kb, &c_b14, &b[b_offset], ldb, &a[k * a_dim1 + 1], + lda, (ftnlen)4, (ftnlen)1, (ftnlen)12, (ftnlen)8) + ; + i__3 = k - 1; + dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b52, &a[k + k * + a_dim1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, &a[ + k * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)1); + i__3 = k - 1; + dsyr2k_(uplo, (char *)"No transpose", &i__3, &kb, &c_b14, &a[k * + a_dim1 + 1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, + &a[a_offset], lda, (ftnlen)1, (ftnlen)12); + i__3 = k - 1; + dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b52, &a[k + k * + a_dim1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, &a[ + k * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)1); + i__3 = k - 1; + dtrmm_((char *)"Right", uplo, (char *)"Transpose", (char *)"Non-unit", &i__3, &kb, + &c_b14, &b[k + k * b_dim1], ldb, &a[k * a_dim1 + + 1], lda, (ftnlen)5, (ftnlen)1, (ftnlen)9, (ftnlen) + 8); + dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + + k * b_dim1], ldb, info, (ftnlen)1); /* L30: */ - } - } else { + } + } else { /* Compute L**T*A*L */ - i__2 = *n; - i__1 = nb; - for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { + i__2 = *n; + i__1 = nb; + for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { /* Computing MIN */ - i__3 = *n - k + 1; - kb = min(i__3,nb); + i__3 = *n - k + 1; + kb = min(i__3,nb); /* Update the lower triangle of A(1:k+kb-1,1:k+kb-1) */ - i__3 = k - 1; - dtrmm_((char *)"Right", uplo, (char *)"No transpose", (char *)"Non-unit", &kb, & - i__3, &c_b14, &b[b_offset], ldb, &a[k + a_dim1], - lda, (ftnlen)5, (ftnlen)1, (ftnlen)12, (ftnlen)8); - i__3 = k - 1; - dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b52, &a[k + k * - a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[k + - a_dim1], lda, (ftnlen)4, (ftnlen)1); - i__3 = k - 1; - dsyr2k_(uplo, (char *)"Transpose", &i__3, &kb, &c_b14, &a[k + - a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[ - a_offset], lda, (ftnlen)1, (ftnlen)9); - i__3 = k - 1; - dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b52, &a[k + k * - a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[k + - a_dim1], lda, (ftnlen)4, (ftnlen)1); - i__3 = k - 1; - dtrmm_((char *)"Left", uplo, (char *)"Transpose", (char *)"Non-unit", &kb, &i__3, - &c_b14, &b[k + k * b_dim1], ldb, &a[k + a_dim1], - lda, (ftnlen)4, (ftnlen)1, (ftnlen)9, (ftnlen)8); - dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + - k * b_dim1], ldb, info, (ftnlen)1); + i__3 = k - 1; + dtrmm_((char *)"Right", uplo, (char *)"No transpose", (char *)"Non-unit", &kb, & + i__3, &c_b14, &b[b_offset], ldb, &a[k + a_dim1], + lda, (ftnlen)5, (ftnlen)1, (ftnlen)12, (ftnlen)8); + i__3 = k - 1; + dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b52, &a[k + k * + a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[k + + a_dim1], lda, (ftnlen)4, (ftnlen)1); + i__3 = k - 1; + dsyr2k_(uplo, (char *)"Transpose", &i__3, &kb, &c_b14, &a[k + + a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[ + a_offset], lda, (ftnlen)1, (ftnlen)9); + i__3 = k - 1; + dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b52, &a[k + k * + a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[k + + a_dim1], lda, (ftnlen)4, (ftnlen)1); + i__3 = k - 1; + dtrmm_((char *)"Left", uplo, (char *)"Transpose", (char *)"Non-unit", &kb, &i__3, + &c_b14, &b[k + k * b_dim1], ldb, &a[k + a_dim1], + lda, (ftnlen)4, (ftnlen)1, (ftnlen)9, (ftnlen)8); + dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + + k * b_dim1], ldb, info, (ftnlen)1); /* L40: */ - } - } - } + } + } + } } return 0; @@ -432,5 +432,5 @@ f"> */ } /* dsygst_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsygv.cpp b/lib/linalg/dsygv.cpp index e7078e8006..bc7ed2cc76 100644 --- a/lib/linalg/dsygv.cpp +++ b/lib/linalg/dsygv.cpp @@ -1,13 +1,13 @@ /* fortran/dsygv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -197,9 +197,9 @@ static doublereal c_b16 = 1.; /* ===================================================================== */ /* Subroutine */ int dsygv_(integer *itype, char *jobz, char *uplo, integer * - n, doublereal *a, integer *lda, doublereal *b, integer *ldb, - doublereal *w, doublereal *work, integer *lwork, integer *info, - ftnlen jobz_len, ftnlen uplo_len) + n, doublereal *a, integer *lda, doublereal *b, integer *ldb, + doublereal *w, doublereal *work, integer *lwork, integer *info, + ftnlen jobz_len, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; @@ -207,27 +207,27 @@ static doublereal c_b16 = 1.; /* Local variables */ integer nb, neig; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); char trans[1]; - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); logical upper; extern /* Subroutine */ int dsyev_(char *, char *, integer *, doublereal * - , integer *, doublereal *, doublereal *, integer *, integer *, - ftnlen, ftnlen); + , integer *, doublereal *, doublereal *, integer *, integer *, + ftnlen, ftnlen); logical wantz; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dpotrf_(char *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dpotrf_(char *, integer *, doublereal *, + integer *, integer *, ftnlen); integer lwkmin; - extern /* Subroutine */ int dsygst_(integer *, char *, integer *, - doublereal *, integer *, doublereal *, integer *, integer *, - ftnlen); + extern /* Subroutine */ int dsygst_(integer *, char *, integer *, + doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen); integer lwkopt; logical lquery; @@ -274,102 +274,102 @@ static doublereal c_b16 = 1.; *info = 0; if (*itype < 1 || *itype > 3) { - *info = -1; + *info = -1; } else if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { - *info = -2; + *info = -2; } else if (! (upper || lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1))) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*lda < max(1,*n)) { - *info = -6; + *info = -6; } else if (*ldb < max(1,*n)) { - *info = -8; + *info = -8; } if (*info == 0) { /* Computing MAX */ - i__1 = 1, i__2 = *n * 3 - 1; - lwkmin = max(i__1,i__2); - nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, - (ftnlen)1); + i__1 = 1, i__2 = *n * 3 - 1; + lwkmin = max(i__1,i__2); + nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, + (ftnlen)1); /* Computing MAX */ - i__1 = lwkmin, i__2 = (nb + 2) * *n; - lwkopt = max(i__1,i__2); - work[1] = (doublereal) lwkopt; + i__1 = lwkmin, i__2 = (nb + 2) * *n; + lwkopt = max(i__1,i__2); + work[1] = (doublereal) lwkopt; - if (*lwork < lwkmin && ! lquery) { - *info = -11; - } + if (*lwork < lwkmin && ! lquery) { + *info = -11; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DSYGV ", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DSYGV ", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } /* Form a Cholesky factorization of B. */ dpotrf_(uplo, n, &b[b_offset], ldb, info, (ftnlen)1); if (*info != 0) { - *info = *n + *info; - return 0; + *info = *n + *info; + return 0; } /* Transform problem to standard eigenvalue problem and solve. */ dsygst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, ( - ftnlen)1); + ftnlen)1); dsyev_(jobz, uplo, n, &a[a_offset], lda, &w[1], &work[1], lwork, info, ( - ftnlen)1, (ftnlen)1); + ftnlen)1, (ftnlen)1); if (wantz) { /* Backtransform eigenvectors to the original problem. */ - neig = *n; - if (*info > 0) { - neig = *info - 1; - } - if (*itype == 1 || *itype == 2) { + neig = *n; + if (*info > 0) { + neig = *info - 1; + } + if (*itype == 1 || *itype == 2) { /* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; */ /* backtransform eigenvectors: x = inv(L)**T*y or inv(U)*y */ - if (upper) { - *(unsigned char *)trans = 'N'; - } else { - *(unsigned char *)trans = 'T'; - } + if (upper) { + *(unsigned char *)trans = 'N'; + } else { + *(unsigned char *)trans = 'T'; + } - dtrsm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, &neig, &c_b16, &b[ - b_offset], ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, ( - ftnlen)1, (ftnlen)8); + dtrsm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, &neig, &c_b16, &b[ + b_offset], ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, ( + ftnlen)1, (ftnlen)8); - } else if (*itype == 3) { + } else if (*itype == 3) { /* For B*A*x=(lambda)*x; */ /* backtransform eigenvectors: x = L*y or U**T*y */ - if (upper) { - *(unsigned char *)trans = 'T'; - } else { - *(unsigned char *)trans = 'N'; - } + if (upper) { + *(unsigned char *)trans = 'T'; + } else { + *(unsigned char *)trans = 'N'; + } - dtrmm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, &neig, &c_b16, &b[ - b_offset], ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, ( - ftnlen)1, (ftnlen)8); - } + dtrmm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, &neig, &c_b16, &b[ + b_offset], ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, ( + ftnlen)1, (ftnlen)8); + } } work[1] = (doublereal) lwkopt; @@ -380,5 +380,5 @@ static doublereal c_b16 = 1.; } /* dsygv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsygvd.cpp b/lib/linalg/dsygvd.cpp index 80513dfdcc..c44f6239f6 100644 --- a/lib/linalg/dsygvd.cpp +++ b/lib/linalg/dsygvd.cpp @@ -1,13 +1,13 @@ /* fortran/dsygvd.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -247,9 +247,9 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dsygvd_(integer *itype, char *jobz, char *uplo, integer * - n, doublereal *a, integer *lda, doublereal *b, integer *ldb, - doublereal *w, doublereal *work, integer *lwork, integer *iwork, - integer *liwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) + n, doublereal *a, integer *lda, doublereal *b, integer *ldb, + doublereal *w, doublereal *work, integer *lwork, integer *iwork, + integer *liwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; @@ -258,24 +258,24 @@ f"> */ /* Local variables */ integer lopt; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); integer lwmin; char trans[1]; integer liopt; - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); logical upper, wantz; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dpotrf_( - char *, integer *, doublereal *, integer *, integer *, ftnlen); + char *, integer *, doublereal *, integer *, integer *, ftnlen); integer liwmin; - extern /* Subroutine */ int dsyevd_(char *, char *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen), dsygst_(integer *, char *, - integer *, doublereal *, integer *, doublereal *, integer *, - integer *, ftnlen); + extern /* Subroutine */ int dsyevd_(char *, char *, integer *, doublereal + *, integer *, doublereal *, doublereal *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen), dsygst_(integer *, char *, + integer *, doublereal *, integer *, doublereal *, integer *, + integer *, ftnlen); logical lquery; @@ -322,72 +322,72 @@ f"> */ *info = 0; if (*n <= 1) { - liwmin = 1; - lwmin = 1; + liwmin = 1; + lwmin = 1; } else if (wantz) { - liwmin = *n * 5 + 3; + liwmin = *n * 5 + 3; /* Computing 2nd power */ - i__1 = *n; - lwmin = *n * 6 + 1 + (i__1 * i__1 << 1); + i__1 = *n; + lwmin = *n * 6 + 1 + (i__1 * i__1 << 1); } else { - liwmin = 1; - lwmin = (*n << 1) + 1; + liwmin = 1; + lwmin = (*n << 1) + 1; } lopt = lwmin; liopt = liwmin; if (*itype < 1 || *itype > 3) { - *info = -1; + *info = -1; } else if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { - *info = -2; + *info = -2; } else if (! (upper || lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1))) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*lda < max(1,*n)) { - *info = -6; + *info = -6; } else if (*ldb < max(1,*n)) { - *info = -8; + *info = -8; } if (*info == 0) { - work[1] = (doublereal) lopt; - iwork[1] = liopt; + work[1] = (doublereal) lopt; + iwork[1] = liopt; - if (*lwork < lwmin && ! lquery) { - *info = -11; - } else if (*liwork < liwmin && ! lquery) { - *info = -13; - } + if (*lwork < lwmin && ! lquery) { + *info = -11; + } else if (*liwork < liwmin && ! lquery) { + *info = -13; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DSYGVD", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DSYGVD", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } /* Form a Cholesky factorization of B. */ dpotrf_(uplo, n, &b[b_offset], ldb, info, (ftnlen)1); if (*info != 0) { - *info = *n + *info; - return 0; + *info = *n + *info; + return 0; } /* Transform problem to standard eigenvalue problem and solve. */ dsygst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, ( - ftnlen)1); + ftnlen)1); dsyevd_(jobz, uplo, n, &a[a_offset], lda, &w[1], &work[1], lwork, &iwork[ - 1], liwork, info, (ftnlen)1, (ftnlen)1); + 1], liwork, info, (ftnlen)1, (ftnlen)1); /* Computing MAX */ d__1 = (doublereal) lopt; lopt = (integer) max(d__1,work[1]); @@ -399,36 +399,36 @@ f"> */ /* Backtransform eigenvectors to the original problem. */ - if (*itype == 1 || *itype == 2) { + if (*itype == 1 || *itype == 2) { /* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; */ /* backtransform eigenvectors: x = inv(L)**T*y or inv(U)*y */ - if (upper) { - *(unsigned char *)trans = 'N'; - } else { - *(unsigned char *)trans = 'T'; - } + if (upper) { + *(unsigned char *)trans = 'N'; + } else { + *(unsigned char *)trans = 'T'; + } - dtrsm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, n, &c_b11, &b[b_offset] - , ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, - (ftnlen)8); + dtrsm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, n, &c_b11, &b[b_offset] + , ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, + (ftnlen)8); - } else if (*itype == 3) { + } else if (*itype == 3) { /* For B*A*x=(lambda)*x; */ /* backtransform eigenvectors: x = L*y or U**T*y */ - if (upper) { - *(unsigned char *)trans = 'T'; - } else { - *(unsigned char *)trans = 'N'; - } + if (upper) { + *(unsigned char *)trans = 'T'; + } else { + *(unsigned char *)trans = 'N'; + } - dtrmm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, n, &c_b11, &b[b_offset] - , ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, - (ftnlen)8); - } + dtrmm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, n, &c_b11, &b[b_offset] + , ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, + (ftnlen)8); + } } work[1] = (doublereal) lopt; @@ -441,5 +441,5 @@ f"> */ } /* dsygvd_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsymm.cpp b/lib/linalg/dsymm.cpp index 223551570d..83538c9c27 100644 --- a/lib/linalg/dsymm.cpp +++ b/lib/linalg/dsymm.cpp @@ -1,13 +1,13 @@ /* fortran/dsymm.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -202,14 +202,14 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dsymm_(char *side, char *uplo, integer *m, integer *n, - doublereal *alpha, doublereal *a, integer *lda, doublereal *b, - integer *ldb, doublereal *beta, doublereal *c__, integer *ldc, ftnlen - side_len, ftnlen uplo_len) +/* Subroutine */ int dsymm_(char *side, char *uplo, integer *m, integer *n, + doublereal *alpha, doublereal *a, integer *lda, doublereal *b, + integer *ldb, doublereal *beta, doublereal *c__, integer *ldc, ftnlen + side_len, ftnlen uplo_len) { /* System generated locals */ - integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, - i__3; + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3; /* Local variables */ integer i__, j, k, info; @@ -257,9 +257,9 @@ extern "C" { /* Function Body */ if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { - nrowa = *m; + nrowa = *m; } else { - nrowa = *n; + nrowa = *n; } upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); @@ -267,57 +267,57 @@ extern "C" { info = 0; if (! lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) && ! lsame_(side, (char *)"R", ( - ftnlen)1, (ftnlen)1)) { - info = 1; + ftnlen)1, (ftnlen)1)) { + info = 1; } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - info = 2; + info = 2; } else if (*m < 0) { - info = 3; + info = 3; } else if (*n < 0) { - info = 4; + info = 4; } else if (*lda < max(1,nrowa)) { - info = 7; + info = 7; } else if (*ldb < max(1,*m)) { - info = 9; + info = 9; } else if (*ldc < max(1,*m)) { - info = 12; + info = 12; } if (info != 0) { - xerbla_((char *)"DSYMM ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DSYMM ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) { - return 0; + return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { - if (*beta == 0.) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = 0.; + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; /* L10: */ - } + } /* L20: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L30: */ - } + } /* L40: */ - } - } - return 0; + } + } + return 0; } /* Start the operations. */ @@ -326,107 +326,107 @@ extern "C" { /* Form C := alpha*A*B + beta*C. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp1 = *alpha * b[i__ + j * b_dim1]; - temp2 = 0.; - i__3 = i__ - 1; - for (k = 1; k <= i__3; ++k) { - c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; - temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp1 = *alpha * b[i__ + j * b_dim1]; + temp2 = 0.; + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; + temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; /* L50: */ - } - if (*beta == 0.) { - c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] - + *alpha * temp2; - } else { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] - + temp1 * a[i__ + i__ * a_dim1] + *alpha * - temp2; - } + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + + *alpha * temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * a[i__ + i__ * a_dim1] + *alpha * + temp2; + } /* L60: */ - } + } /* L70: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - for (i__ = *m; i__ >= 1; --i__) { - temp1 = *alpha * b[i__ + j * b_dim1]; - temp2 = 0.; - i__2 = *m; - for (k = i__ + 1; k <= i__2; ++k) { - c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; - temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + temp1 = *alpha * b[i__ + j * b_dim1]; + temp2 = 0.; + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; + temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; /* L80: */ - } - if (*beta == 0.) { - c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] - + *alpha * temp2; - } else { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] - + temp1 * a[i__ + i__ * a_dim1] + *alpha * - temp2; - } + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + + *alpha * temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * a[i__ + i__ * a_dim1] + *alpha * + temp2; + } /* L90: */ - } + } /* L100: */ - } - } + } + } } else { /* Form C := alpha*B*A + beta*C. */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp1 = *alpha * a[j + j * a_dim1]; - if (*beta == 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = temp1 * b[i__ + j * b_dim1]; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * a[j + j * a_dim1]; + if (*beta == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = temp1 * b[i__ + j * b_dim1]; /* L110: */ - } - } else { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + - temp1 * b[i__ + j * b_dim1]; + } + } else { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * b[i__ + j * b_dim1]; /* L120: */ - } - } - i__2 = j - 1; - for (k = 1; k <= i__2; ++k) { - if (upper) { - temp1 = *alpha * a[k + j * a_dim1]; - } else { - temp1 = *alpha * a[j + k * a_dim1]; - } - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; + } + } + i__2 = j - 1; + for (k = 1; k <= i__2; ++k) { + if (upper) { + temp1 = *alpha * a[k + j * a_dim1]; + } else { + temp1 = *alpha * a[j + k * a_dim1]; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; /* L130: */ - } + } /* L140: */ - } - i__2 = *n; - for (k = j + 1; k <= i__2; ++k) { - if (upper) { - temp1 = *alpha * a[j + k * a_dim1]; - } else { - temp1 = *alpha * a[k + j * a_dim1]; - } - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; + } + i__2 = *n; + for (k = j + 1; k <= i__2; ++k) { + if (upper) { + temp1 = *alpha * a[j + k * a_dim1]; + } else { + temp1 = *alpha * a[k + j * a_dim1]; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; /* L150: */ - } + } /* L160: */ - } + } /* L170: */ - } + } } return 0; @@ -436,5 +436,5 @@ extern "C" { } /* dsymm_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsymv.cpp b/lib/linalg/dsymv.cpp index 4dc77ad743..542c12c97c 100644 --- a/lib/linalg/dsymv.cpp +++ b/lib/linalg/dsymv.cpp @@ -1,13 +1,13 @@ /* fortran/dsymv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -165,9 +165,9 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dsymv_(char *uplo, integer *n, doublereal *alpha, - doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal - *beta, doublereal *y, integer *incy, ftnlen uplo_len) +/* Subroutine */ int dsymv_(char *uplo, integer *n, doublereal *alpha, + doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal + *beta, doublereal *y, integer *incy, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -213,39 +213,39 @@ extern "C" { /* Function Body */ info = 0; if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { - info = 1; + ftnlen)1, (ftnlen)1)) { + info = 1; } else if (*n < 0) { - info = 2; + info = 2; } else if (*lda < max(1,*n)) { - info = 5; + info = 5; } else if (*incx == 0) { - info = 7; + info = 7; } else if (*incy == 0) { - info = 10; + info = 10; } if (info != 0) { - xerbla_((char *)"DSYMV ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DSYMV ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*n == 0 || *alpha == 0. && *beta == 1.) { - return 0; + return 0; } /* Set up the start points in X and Y. */ if (*incx > 0) { - kx = 1; + kx = 1; } else { - kx = 1 - (*n - 1) * *incx; + kx = 1 - (*n - 1) * *incx; } if (*incy > 0) { - ky = 1; + ky = 1; } else { - ky = 1 - (*n - 1) * *incy; + ky = 1 - (*n - 1) * *incy; } /* Start the operations. In this version the elements of A are */ @@ -255,126 +255,126 @@ extern "C" { /* First form y := beta*y. */ if (*beta != 1.) { - if (*incy == 1) { - if (*beta == 0.) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - y[i__] = 0.; + if (*incy == 1) { + if (*beta == 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = 0.; /* L10: */ - } - } else { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - y[i__] = *beta * y[i__]; + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + y[i__] = *beta * y[i__]; /* L20: */ - } - } - } else { - iy = ky; - if (*beta == 0.) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - y[iy] = 0.; - iy += *incy; + } + } + } else { + iy = ky; + if (*beta == 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = 0.; + iy += *incy; /* L30: */ - } - } else { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - y[iy] = *beta * y[iy]; - iy += *incy; + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + y[iy] = *beta * y[iy]; + iy += *incy; /* L40: */ - } - } - } + } + } + } } if (*alpha == 0.) { - return 0; + return 0; } if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { /* Form y when A is stored in upper triangle. */ - if (*incx == 1 && *incy == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp1 = *alpha * x[j]; - temp2 = 0.; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - y[i__] += temp1 * a[i__ + j * a_dim1]; - temp2 += a[i__ + j * a_dim1] * x[i__]; + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * x[j]; + temp2 = 0.; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + y[i__] += temp1 * a[i__ + j * a_dim1]; + temp2 += a[i__ + j * a_dim1] * x[i__]; /* L50: */ - } - y[j] = y[j] + temp1 * a[j + j * a_dim1] + *alpha * temp2; + } + y[j] = y[j] + temp1 * a[j + j * a_dim1] + *alpha * temp2; /* L60: */ - } - } else { - jx = kx; - jy = ky; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp1 = *alpha * x[jx]; - temp2 = 0.; - ix = kx; - iy = ky; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - y[iy] += temp1 * a[i__ + j * a_dim1]; - temp2 += a[i__ + j * a_dim1] * x[ix]; - ix += *incx; - iy += *incy; + } + } else { + jx = kx; + jy = ky; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * x[jx]; + temp2 = 0.; + ix = kx; + iy = ky; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + y[iy] += temp1 * a[i__ + j * a_dim1]; + temp2 += a[i__ + j * a_dim1] * x[ix]; + ix += *incx; + iy += *incy; /* L70: */ - } - y[jy] = y[jy] + temp1 * a[j + j * a_dim1] + *alpha * temp2; - jx += *incx; - jy += *incy; + } + y[jy] = y[jy] + temp1 * a[j + j * a_dim1] + *alpha * temp2; + jx += *incx; + jy += *incy; /* L80: */ - } - } + } + } } else { /* Form y when A is stored in lower triangle. */ - if (*incx == 1 && *incy == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp1 = *alpha * x[j]; - temp2 = 0.; - y[j] += temp1 * a[j + j * a_dim1]; - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - y[i__] += temp1 * a[i__ + j * a_dim1]; - temp2 += a[i__ + j * a_dim1] * x[i__]; + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * x[j]; + temp2 = 0.; + y[j] += temp1 * a[j + j * a_dim1]; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + y[i__] += temp1 * a[i__ + j * a_dim1]; + temp2 += a[i__ + j * a_dim1] * x[i__]; /* L90: */ - } - y[j] += *alpha * temp2; + } + y[j] += *alpha * temp2; /* L100: */ - } - } else { - jx = kx; - jy = ky; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp1 = *alpha * x[jx]; - temp2 = 0.; - y[jy] += temp1 * a[j + j * a_dim1]; - ix = jx; - iy = jy; - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - ix += *incx; - iy += *incy; - y[iy] += temp1 * a[i__ + j * a_dim1]; - temp2 += a[i__ + j * a_dim1] * x[ix]; + } + } else { + jx = kx; + jy = ky; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp1 = *alpha * x[jx]; + temp2 = 0.; + y[jy] += temp1 * a[j + j * a_dim1]; + ix = jx; + iy = jy; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + iy += *incy; + y[iy] += temp1 * a[i__ + j * a_dim1]; + temp2 += a[i__ + j * a_dim1] * x[ix]; /* L110: */ - } - y[jy] += *alpha * temp2; - jx += *incx; - jy += *incy; + } + y[jy] += *alpha * temp2; + jx += *incx; + jy += *incy; /* L120: */ - } - } + } + } } return 0; @@ -384,5 +384,5 @@ extern "C" { } /* dsymv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsyr2.cpp b/lib/linalg/dsyr2.cpp index f017821e1d..d4395ee996 100644 --- a/lib/linalg/dsyr2.cpp +++ b/lib/linalg/dsyr2.cpp @@ -1,13 +1,13 @@ /* fortran/dsyr2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -160,9 +160,9 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dsyr2_(char *uplo, integer *n, doublereal *alpha, - doublereal *x, integer *incx, doublereal *y, integer *incy, - doublereal *a, integer *lda, ftnlen uplo_len) +/* Subroutine */ int dsyr2_(char *uplo, integer *n, doublereal *alpha, + doublereal *x, integer *incx, doublereal *y, integer *incy, + doublereal *a, integer *lda, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -208,44 +208,44 @@ extern "C" { /* Function Body */ info = 0; if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { - info = 1; + ftnlen)1, (ftnlen)1)) { + info = 1; } else if (*n < 0) { - info = 2; + info = 2; } else if (*incx == 0) { - info = 5; + info = 5; } else if (*incy == 0) { - info = 7; + info = 7; } else if (*lda < max(1,*n)) { - info = 9; + info = 9; } if (info != 0) { - xerbla_((char *)"DSYR2 ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DSYR2 ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*n == 0 || *alpha == 0.) { - return 0; + return 0; } /* Set up the start points in X and Y if the increments are not both */ /* unity. */ if (*incx != 1 || *incy != 1) { - if (*incx > 0) { - kx = 1; - } else { - kx = 1 - (*n - 1) * *incx; - } - if (*incy > 0) { - ky = 1; - } else { - ky = 1 - (*n - 1) * *incy; - } - jx = kx; - jy = ky; + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (*n - 1) * *incx; + } + if (*incy > 0) { + ky = 1; + } else { + ky = 1 - (*n - 1) * *incy; + } + jx = kx; + jy = ky; } /* Start the operations. In this version the elements of A are */ @@ -256,84 +256,84 @@ extern "C" { /* Form A when A is stored in the upper triangle. */ - if (*incx == 1 && *incy == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (x[j] != 0. || y[j] != 0.) { - temp1 = *alpha * y[j]; - temp2 = *alpha * x[j]; - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[i__] * - temp1 + y[i__] * temp2; + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[j] != 0. || y[j] != 0.) { + temp1 = *alpha * y[j]; + temp2 = *alpha * x[j]; + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[i__] * + temp1 + y[i__] * temp2; /* L10: */ - } - } + } + } /* L20: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (x[jx] != 0. || y[jy] != 0.) { - temp1 = *alpha * y[jy]; - temp2 = *alpha * x[jx]; - ix = kx; - iy = ky; - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[ix] * - temp1 + y[iy] * temp2; - ix += *incx; - iy += *incy; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0. || y[jy] != 0.) { + temp1 = *alpha * y[jy]; + temp2 = *alpha * x[jx]; + ix = kx; + iy = ky; + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[ix] * + temp1 + y[iy] * temp2; + ix += *incx; + iy += *incy; /* L30: */ - } - } - jx += *incx; - jy += *incy; + } + } + jx += *incx; + jy += *incy; /* L40: */ - } - } + } + } } else { /* Form A when A is stored in the lower triangle. */ - if (*incx == 1 && *incy == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (x[j] != 0. || y[j] != 0.) { - temp1 = *alpha * y[j]; - temp2 = *alpha * x[j]; - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[i__] * - temp1 + y[i__] * temp2; + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[j] != 0. || y[j] != 0.) { + temp1 = *alpha * y[j]; + temp2 = *alpha * x[j]; + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[i__] * + temp1 + y[i__] * temp2; /* L50: */ - } - } + } + } /* L60: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (x[jx] != 0. || y[jy] != 0.) { - temp1 = *alpha * y[jy]; - temp2 = *alpha * x[jx]; - ix = jx; - iy = jy; - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[ix] * - temp1 + y[iy] * temp2; - ix += *incx; - iy += *incy; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0. || y[jy] != 0.) { + temp1 = *alpha * y[jy]; + temp2 = *alpha * x[jx]; + ix = jx; + iy = jy; + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[ix] * + temp1 + y[iy] * temp2; + ix += *incx; + iy += *incy; /* L70: */ - } - } - jx += *incx; - jy += *incy; + } + } + jx += *incx; + jy += *incy; /* L80: */ - } - } + } + } } return 0; @@ -343,5 +343,5 @@ extern "C" { } /* dsyr2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsyr2k.cpp b/lib/linalg/dsyr2k.cpp index 33d32b3440..29f16539b2 100644 --- a/lib/linalg/dsyr2k.cpp +++ b/lib/linalg/dsyr2k.cpp @@ -1,13 +1,13 @@ /* fortran/dsyr2k.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -205,14 +205,14 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dsyr2k_(char *uplo, char *trans, integer *n, integer *k, - doublereal *alpha, doublereal *a, integer *lda, doublereal *b, - integer *ldb, doublereal *beta, doublereal *c__, integer *ldc, ftnlen - uplo_len, ftnlen trans_len) +/* Subroutine */ int dsyr2k_(char *uplo, char *trans, integer *n, integer *k, + doublereal *alpha, doublereal *a, integer *lda, doublereal *b, + integer *ldb, doublereal *beta, doublereal *c__, integer *ldc, ftnlen + uplo_len, ftnlen trans_len) { /* System generated locals */ - integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, - i__3; + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3; /* Local variables */ integer i__, j, l, info; @@ -260,90 +260,90 @@ extern "C" { /* Function Body */ if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - nrowa = *n; + nrowa = *n; } else { - nrowa = *k; + nrowa = *k; } upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); info = 0; if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { - info = 2; + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; } else if (*n < 0) { - info = 3; + info = 3; } else if (*k < 0) { - info = 4; + info = 4; } else if (*lda < max(1,nrowa)) { - info = 7; + info = 7; } else if (*ldb < max(1,nrowa)) { - info = 9; + info = 9; } else if (*ldc < max(1,*n)) { - info = 12; + info = 12; } if (info != 0) { - xerbla_((char *)"DSYR2K", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DSYR2K", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { - return 0; + return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { - if (upper) { - if (*beta == 0.) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = 0.; + if (upper) { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; /* L10: */ - } + } /* L20: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L30: */ - } + } /* L40: */ - } - } - } else { - if (*beta == 0.) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = 0.; + } + } + } else { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; /* L50: */ - } + } /* L60: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L70: */ - } + } /* L80: */ - } - } - } - return 0; + } + } + } + return 0; } /* Start the operations. */ @@ -352,126 +352,126 @@ extern "C" { /* Form C := alpha*A*B**T + alpha*B*A**T + C. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (*beta == 0.) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = 0.; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; /* L90: */ - } - } else if (*beta != 1.) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; + } + } else if (*beta != 1.) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L100: */ - } - } - i__2 = *k; - for (l = 1; l <= i__2; ++l) { - if (a[j + l * a_dim1] != 0. || b[j + l * b_dim1] != 0.) { - temp1 = *alpha * b[j + l * b_dim1]; - temp2 = *alpha * a[j + l * a_dim1]; - i__3 = j; - for (i__ = 1; i__ <= i__3; ++i__) { - c__[i__ + j * c_dim1] = c__[i__ + j * c_dim1] + a[ - i__ + l * a_dim1] * temp1 + b[i__ + l * - b_dim1] * temp2; + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0. || b[j + l * b_dim1] != 0.) { + temp1 = *alpha * b[j + l * b_dim1]; + temp2 = *alpha * a[j + l * a_dim1]; + i__3 = j; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] = c__[i__ + j * c_dim1] + a[ + i__ + l * a_dim1] * temp1 + b[i__ + l * + b_dim1] * temp2; /* L110: */ - } - } + } + } /* L120: */ - } + } /* L130: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (*beta == 0.) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = 0.; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; /* L140: */ - } - } else if (*beta != 1.) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; + } + } else if (*beta != 1.) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L150: */ - } - } - i__2 = *k; - for (l = 1; l <= i__2; ++l) { - if (a[j + l * a_dim1] != 0. || b[j + l * b_dim1] != 0.) { - temp1 = *alpha * b[j + l * b_dim1]; - temp2 = *alpha * a[j + l * a_dim1]; - i__3 = *n; - for (i__ = j; i__ <= i__3; ++i__) { - c__[i__ + j * c_dim1] = c__[i__ + j * c_dim1] + a[ - i__ + l * a_dim1] * temp1 + b[i__ + l * - b_dim1] * temp2; + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0. || b[j + l * b_dim1] != 0.) { + temp1 = *alpha * b[j + l * b_dim1]; + temp2 = *alpha * a[j + l * a_dim1]; + i__3 = *n; + for (i__ = j; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] = c__[i__ + j * c_dim1] + a[ + i__ + l * a_dim1] * temp1 + b[i__ + l * + b_dim1] * temp2; /* L160: */ - } - } + } + } /* L170: */ - } + } /* L180: */ - } - } + } + } } else { /* Form C := alpha*A**T*B + alpha*B**T*A + C. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - temp1 = 0.; - temp2 = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - temp1 += a[l + i__ * a_dim1] * b[l + j * b_dim1]; - temp2 += b[l + i__ * b_dim1] * a[l + j * a_dim1]; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + temp1 = 0.; + temp2 = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp1 += a[l + i__ * a_dim1] * b[l + j * b_dim1]; + temp2 += b[l + i__ * b_dim1] * a[l + j * a_dim1]; /* L190: */ - } - if (*beta == 0.) { - c__[i__ + j * c_dim1] = *alpha * temp1 + *alpha * - temp2; - } else { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] - + *alpha * temp1 + *alpha * temp2; - } + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = *alpha * temp1 + *alpha * + temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + *alpha * temp1 + *alpha * temp2; + } /* L200: */ - } + } /* L210: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - temp1 = 0.; - temp2 = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - temp1 += a[l + i__ * a_dim1] * b[l + j * b_dim1]; - temp2 += b[l + i__ * b_dim1] * a[l + j * a_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + temp1 = 0.; + temp2 = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp1 += a[l + i__ * a_dim1] * b[l + j * b_dim1]; + temp2 += b[l + i__ * b_dim1] * a[l + j * a_dim1]; /* L220: */ - } - if (*beta == 0.) { - c__[i__ + j * c_dim1] = *alpha * temp1 + *alpha * - temp2; - } else { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] - + *alpha * temp1 + *alpha * temp2; - } + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = *alpha * temp1 + *alpha * + temp2; + } else { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + *alpha * temp1 + *alpha * temp2; + } /* L230: */ - } + } /* L240: */ - } - } + } + } } return 0; @@ -481,5 +481,5 @@ extern "C" { } /* dsyr2k_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsyrk.cpp b/lib/linalg/dsyrk.cpp index 28dc601121..4fb3e554f9 100644 --- a/lib/linalg/dsyrk.cpp +++ b/lib/linalg/dsyrk.cpp @@ -1,13 +1,13 @@ /* fortran/dsyrk.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -182,9 +182,9 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dsyrk_(char *uplo, char *trans, integer *n, integer *k, - doublereal *alpha, doublereal *a, integer *lda, doublereal *beta, - doublereal *c__, integer *ldc, ftnlen uplo_len, ftnlen trans_len) +/* Subroutine */ int dsyrk_(char *uplo, char *trans, integer *n, integer *k, + doublereal *alpha, doublereal *a, integer *lda, doublereal *beta, + doublereal *c__, integer *ldc, ftnlen uplo_len, ftnlen trans_len) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; @@ -232,88 +232,88 @@ extern "C" { /* Function Body */ if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - nrowa = *n; + nrowa = *n; } else { - nrowa = *k; + nrowa = *k; } upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); info = 0; if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { - info = 2; + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; } else if (*n < 0) { - info = 3; + info = 3; } else if (*k < 0) { - info = 4; + info = 4; } else if (*lda < max(1,nrowa)) { - info = 7; + info = 7; } else if (*ldc < max(1,*n)) { - info = 10; + info = 10; } if (info != 0) { - xerbla_((char *)"DSYRK ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DSYRK ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { - return 0; + return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { - if (upper) { - if (*beta == 0.) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = 0.; + if (upper) { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; /* L10: */ - } + } /* L20: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L30: */ - } + } /* L40: */ - } - } - } else { - if (*beta == 0.) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = 0.; + } + } + } else { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; /* L50: */ - } + } /* L60: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L70: */ - } + } /* L80: */ - } - } - } - return 0; + } + } + } + return 0; } /* Start the operations. */ @@ -322,116 +322,116 @@ extern "C" { /* Form C := alpha*A*A**T + beta*C. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (*beta == 0.) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = 0.; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; /* L90: */ - } - } else if (*beta != 1.) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; + } + } else if (*beta != 1.) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L100: */ - } - } - i__2 = *k; - for (l = 1; l <= i__2; ++l) { - if (a[j + l * a_dim1] != 0.) { - temp = *alpha * a[j + l * a_dim1]; - i__3 = j; - for (i__ = 1; i__ <= i__3; ++i__) { - c__[i__ + j * c_dim1] += temp * a[i__ + l * - a_dim1]; + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0.) { + temp = *alpha * a[j + l * a_dim1]; + i__3 = j; + for (i__ = 1; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; /* L110: */ - } - } + } + } /* L120: */ - } + } /* L130: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (*beta == 0.) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = 0.; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = 0.; /* L140: */ - } - } else if (*beta != 1.) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; + } + } else if (*beta != 1.) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; /* L150: */ - } - } - i__2 = *k; - for (l = 1; l <= i__2; ++l) { - if (a[j + l * a_dim1] != 0.) { - temp = *alpha * a[j + l * a_dim1]; - i__3 = *n; - for (i__ = j; i__ <= i__3; ++i__) { - c__[i__ + j * c_dim1] += temp * a[i__ + l * - a_dim1]; + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + if (a[j + l * a_dim1] != 0.) { + temp = *alpha * a[j + l * a_dim1]; + i__3 = *n; + for (i__ = j; i__ <= i__3; ++i__) { + c__[i__ + j * c_dim1] += temp * a[i__ + l * + a_dim1]; /* L160: */ - } - } + } + } /* L170: */ - } + } /* L180: */ - } - } + } + } } else { /* Form C := alpha*A**T*A + beta*C. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - temp = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; /* L190: */ - } - if (*beta == 0.) { - c__[i__ + j * c_dim1] = *alpha * temp; - } else { - c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ - i__ + j * c_dim1]; - } + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } /* L200: */ - } + } /* L210: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - temp = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + temp = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; /* L220: */ - } - if (*beta == 0.) { - c__[i__ + j * c_dim1] = *alpha * temp; - } else { - c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ - i__ + j * c_dim1]; - } + } + if (*beta == 0.) { + c__[i__ + j * c_dim1] = *alpha * temp; + } else { + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ + i__ + j * c_dim1]; + } /* L230: */ - } + } /* L240: */ - } - } + } + } } return 0; @@ -441,5 +441,5 @@ extern "C" { } /* dsyrk_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsytd2.cpp b/lib/linalg/dsytd2.cpp index 4035fd0d58..acf22710af 100644 --- a/lib/linalg/dsytd2.cpp +++ b/lib/linalg/dsytd2.cpp @@ -1,13 +1,13 @@ /* fortran/dsytd2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -197,30 +197,30 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dsytd2_(char *uplo, integer *n, doublereal *a, integer * - lda, doublereal *d__, doublereal *e, doublereal *tau, integer *info, - ftnlen uplo_len) + lda, doublereal *d__, doublereal *e, doublereal *tau, integer *info, + ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; /* Local variables */ integer i__; - extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, - integer *); + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, + integer *); doublereal taui; - extern /* Subroutine */ int dsyr2_(char *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, ftnlen); + extern /* Subroutine */ int dsyr2_(char *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen); doublereal alpha; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *); + extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *); logical upper; - extern /* Subroutine */ int dsymv_(char *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, ftnlen), dlarfg_(integer *, doublereal *, - doublereal *, integer *, doublereal *), xerbla_(char *, integer * - , ftnlen); + extern /* Subroutine */ int dsymv_(char *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen), dlarfg_(integer *, doublereal *, + doublereal *, integer *, doublereal *), xerbla_(char *, integer * + , ftnlen); /* -- LAPACK computational routine -- */ @@ -260,122 +260,122 @@ f"> */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*n)) { - *info = -4; + *info = -4; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DSYTD2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DSYTD2", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n <= 0) { - return 0; + return 0; } if (upper) { /* Reduce the upper triangle of A */ - for (i__ = *n - 1; i__ >= 1; --i__) { + for (i__ = *n - 1; i__ >= 1; --i__) { /* Generate elementary reflector H(i) = I - tau * v * v**T */ /* to annihilate A(1:i-1,i+1) */ - dlarfg_(&i__, &a[i__ + (i__ + 1) * a_dim1], &a[(i__ + 1) * a_dim1 - + 1], &c__1, &taui); - e[i__] = a[i__ + (i__ + 1) * a_dim1]; + dlarfg_(&i__, &a[i__ + (i__ + 1) * a_dim1], &a[(i__ + 1) * a_dim1 + + 1], &c__1, &taui); + e[i__] = a[i__ + (i__ + 1) * a_dim1]; - if (taui != 0.) { + if (taui != 0.) { /* Apply H(i) from both sides to A(1:i,1:i) */ - a[i__ + (i__ + 1) * a_dim1] = 1.; + a[i__ + (i__ + 1) * a_dim1] = 1.; /* Compute x := tau * A * v storing x in TAU(1:i) */ - dsymv_(uplo, &i__, &taui, &a[a_offset], lda, &a[(i__ + 1) * - a_dim1 + 1], &c__1, &c_b8, &tau[1], &c__1, (ftnlen)1); + dsymv_(uplo, &i__, &taui, &a[a_offset], lda, &a[(i__ + 1) * + a_dim1 + 1], &c__1, &c_b8, &tau[1], &c__1, (ftnlen)1); /* Compute w := x - 1/2 * tau * (x**T * v) * v */ - alpha = taui * -.5 * ddot_(&i__, &tau[1], &c__1, &a[(i__ + 1) - * a_dim1 + 1], &c__1); - daxpy_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[ - 1], &c__1); + alpha = taui * -.5 * ddot_(&i__, &tau[1], &c__1, &a[(i__ + 1) + * a_dim1 + 1], &c__1); + daxpy_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[ + 1], &c__1); /* Apply the transformation as a rank-2 update: */ /* A := A - v * w**T - w * v**T */ - dsyr2_(uplo, &i__, &c_b14, &a[(i__ + 1) * a_dim1 + 1], &c__1, - &tau[1], &c__1, &a[a_offset], lda, (ftnlen)1); + dsyr2_(uplo, &i__, &c_b14, &a[(i__ + 1) * a_dim1 + 1], &c__1, + &tau[1], &c__1, &a[a_offset], lda, (ftnlen)1); - a[i__ + (i__ + 1) * a_dim1] = e[i__]; - } - d__[i__ + 1] = a[i__ + 1 + (i__ + 1) * a_dim1]; - tau[i__] = taui; + a[i__ + (i__ + 1) * a_dim1] = e[i__]; + } + d__[i__ + 1] = a[i__ + 1 + (i__ + 1) * a_dim1]; + tau[i__] = taui; /* L10: */ - } - d__[1] = a[a_dim1 + 1]; + } + d__[1] = a[a_dim1 + 1]; } else { /* Reduce the lower triangle of A */ - i__1 = *n - 1; - for (i__ = 1; i__ <= i__1; ++i__) { + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) = I - tau * v * v**T */ /* to annihilate A(i+2:n,i) */ - i__2 = *n - i__; + i__2 = *n - i__; /* Computing MIN */ - i__3 = i__ + 2; - dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*n) + i__ * - a_dim1], &c__1, &taui); - e[i__] = a[i__ + 1 + i__ * a_dim1]; + i__3 = i__ + 2; + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*n) + i__ * + a_dim1], &c__1, &taui); + e[i__] = a[i__ + 1 + i__ * a_dim1]; - if (taui != 0.) { + if (taui != 0.) { /* Apply H(i) from both sides to A(i+1:n,i+1:n) */ - a[i__ + 1 + i__ * a_dim1] = 1.; + a[i__ + 1 + i__ * a_dim1] = 1.; /* Compute x := tau * A * v storing y in TAU(i:n-1) */ - i__2 = *n - i__; - dsymv_(uplo, &i__2, &taui, &a[i__ + 1 + (i__ + 1) * a_dim1], - lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b8, &tau[ - i__], &c__1, (ftnlen)1); + i__2 = *n - i__; + dsymv_(uplo, &i__2, &taui, &a[i__ + 1 + (i__ + 1) * a_dim1], + lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b8, &tau[ + i__], &c__1, (ftnlen)1); /* Compute w := x - 1/2 * tau * (x**T * v) * v */ - i__2 = *n - i__; - alpha = taui * -.5 * ddot_(&i__2, &tau[i__], &c__1, &a[i__ + - 1 + i__ * a_dim1], &c__1); - i__2 = *n - i__; - daxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[ - i__], &c__1); + i__2 = *n - i__; + alpha = taui * -.5 * ddot_(&i__2, &tau[i__], &c__1, &a[i__ + + 1 + i__ * a_dim1], &c__1); + i__2 = *n - i__; + daxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[ + i__], &c__1); /* Apply the transformation as a rank-2 update: */ /* A := A - v * w**T - w * v**T */ - i__2 = *n - i__; - dsyr2_(uplo, &i__2, &c_b14, &a[i__ + 1 + i__ * a_dim1], &c__1, - &tau[i__], &c__1, &a[i__ + 1 + (i__ + 1) * a_dim1], - lda, (ftnlen)1); + i__2 = *n - i__; + dsyr2_(uplo, &i__2, &c_b14, &a[i__ + 1 + i__ * a_dim1], &c__1, + &tau[i__], &c__1, &a[i__ + 1 + (i__ + 1) * a_dim1], + lda, (ftnlen)1); - a[i__ + 1 + i__ * a_dim1] = e[i__]; - } - d__[i__] = a[i__ + i__ * a_dim1]; - tau[i__] = taui; + a[i__ + 1 + i__ * a_dim1] = e[i__]; + } + d__[i__] = a[i__ + i__ * a_dim1]; + tau[i__] = taui; /* L20: */ - } - d__[*n] = a[*n + *n * a_dim1]; + } + d__[*n] = a[*n + *n * a_dim1]; } return 0; @@ -385,5 +385,5 @@ f"> */ } /* dsytd2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dsytrd.cpp b/lib/linalg/dsytrd.cpp index 190dd8b1ac..b29df9fb10 100644 --- a/lib/linalg/dsytrd.cpp +++ b/lib/linalg/dsytrd.cpp @@ -1,13 +1,13 @@ /* fortran/dsytrd.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -218,8 +218,8 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int dsytrd_(char *uplo, integer *n, doublereal *a, integer * - lda, doublereal *d__, doublereal *e, doublereal *tau, doublereal * - work, integer *lwork, integer *info, ftnlen uplo_len) + lda, doublereal *d__, doublereal *e, doublereal *tau, doublereal * + work, integer *lwork, integer *info, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -229,16 +229,16 @@ f"> */ extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; logical upper; - extern /* Subroutine */ int dsytd2_(char *, integer *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, integer *, - ftnlen), dsyr2k_(char *, char *, integer *, integer *, doublereal - *, doublereal *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, ftnlen, ftnlen), dlatrd_(char *, - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, doublereal *, integer *, ftnlen), xerbla_(char *, - integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dsytd2_(char *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), dsyr2k_(char *, char *, integer *, integer *, doublereal + *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen), dlatrd_(char *, + integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, integer *, ftnlen), xerbla_(char *, + integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; @@ -282,38 +282,38 @@ f"> */ upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*n)) { - *info = -4; + *info = -4; } else if (*lwork < 1 && ! lquery) { - *info = -9; + *info = -9; } if (*info == 0) { /* Determine the block size. */ - nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, - (ftnlen)1); - lwkopt = *n * nb; - work[1] = (doublereal) lwkopt; + nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, + (ftnlen)1); + lwkopt = *n * nb; + work[1] = (doublereal) lwkopt; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DSYTRD", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DSYTRD", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - work[1] = 1.; - return 0; + work[1] = 1.; + return 0; } nx = *n; @@ -324,35 +324,35 @@ f"> */ /* (last block is always handled by unblocked code). */ /* Computing MAX */ - i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, & - c_n1, (ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); - if (nx < *n) { + i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, & + c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *n) { /* Determine if workspace is large enough for blocked code. */ - ldwork = *n; - iws = ldwork * nb; - if (*lwork < iws) { + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { /* Not enough workspace to use optimal NB: determine the */ /* minimum value of NB, and reduce NB or force use of */ /* unblocked code by setting NX = N. */ /* Computing MAX */ - i__1 = *lwork / ldwork; - nb = max(i__1,1); - nbmin = ilaenv_(&c__2, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, - (ftnlen)6, (ftnlen)1); - if (nb < nbmin) { - nx = *n; - } - } - } else { - nx = *n; - } + i__1 = *lwork / ldwork; + nb = max(i__1,1); + nbmin = ilaenv_(&c__2, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, + (ftnlen)6, (ftnlen)1); + if (nb < nbmin) { + nx = *n; + } + } + } else { + nx = *n; + } } else { - nb = 1; + nb = 1; } if (upper) { @@ -360,86 +360,86 @@ f"> */ /* Reduce the upper triangle of A. */ /* Columns 1:kk are handled by the unblocked method. */ - kk = *n - (*n - nx + nb - 1) / nb * nb; - i__1 = kk + 1; - i__2 = -nb; - for (i__ = *n - nb + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += - i__2) { + kk = *n - (*n - nx + nb - 1) / nb * nb; + i__1 = kk + 1; + i__2 = -nb; + for (i__ = *n - nb + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += + i__2) { /* Reduce columns i:i+nb-1 to tridiagonal form and form the */ /* matrix W which is needed to update the unreduced part of */ /* the matrix */ - i__3 = i__ + nb - 1; - dlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], & - work[1], &ldwork, (ftnlen)1); + i__3 = i__ + nb - 1; + dlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], & + work[1], &ldwork, (ftnlen)1); /* Update the unreduced submatrix A(1:i-1,1:i-1), using an */ /* update of the form: A := A - V*W**T - W*V**T */ - i__3 = i__ - 1; - dsyr2k_(uplo, (char *)"No transpose", &i__3, &nb, &c_b22, &a[i__ * a_dim1 - + 1], lda, &work[1], &ldwork, &c_b23, &a[a_offset], lda, ( - ftnlen)1, (ftnlen)12); + i__3 = i__ - 1; + dsyr2k_(uplo, (char *)"No transpose", &i__3, &nb, &c_b22, &a[i__ * a_dim1 + + 1], lda, &work[1], &ldwork, &c_b23, &a[a_offset], lda, ( + ftnlen)1, (ftnlen)12); /* Copy superdiagonal elements back into A, and diagonal */ /* elements into D */ - i__3 = i__ + nb - 1; - for (j = i__; j <= i__3; ++j) { - a[j - 1 + j * a_dim1] = e[j - 1]; - d__[j] = a[j + j * a_dim1]; + i__3 = i__ + nb - 1; + for (j = i__; j <= i__3; ++j) { + a[j - 1 + j * a_dim1] = e[j - 1]; + d__[j] = a[j + j * a_dim1]; /* L10: */ - } + } /* L20: */ - } + } /* Use unblocked code to reduce the last or only block */ - dsytd2_(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo, - (ftnlen)1); + dsytd2_(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo, + (ftnlen)1); } else { /* Reduce the lower triangle of A */ - i__2 = *n - nx; - i__1 = nb; - for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { + i__2 = *n - nx; + i__1 = nb; + for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { /* Reduce columns i:i+nb-1 to tridiagonal form and form the */ /* matrix W which is needed to update the unreduced part of */ /* the matrix */ - i__3 = *n - i__ + 1; - dlatrd_(uplo, &i__3, &nb, &a[i__ + i__ * a_dim1], lda, &e[i__], & - tau[i__], &work[1], &ldwork, (ftnlen)1); + i__3 = *n - i__ + 1; + dlatrd_(uplo, &i__3, &nb, &a[i__ + i__ * a_dim1], lda, &e[i__], & + tau[i__], &work[1], &ldwork, (ftnlen)1); /* Update the unreduced submatrix A(i+ib:n,i+ib:n), using */ /* an update of the form: A := A - V*W**T - W*V**T */ - i__3 = *n - i__ - nb + 1; - dsyr2k_(uplo, (char *)"No transpose", &i__3, &nb, &c_b22, &a[i__ + nb + - i__ * a_dim1], lda, &work[nb + 1], &ldwork, &c_b23, &a[ - i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)1, (ftnlen) - 12); + i__3 = *n - i__ - nb + 1; + dsyr2k_(uplo, (char *)"No transpose", &i__3, &nb, &c_b22, &a[i__ + nb + + i__ * a_dim1], lda, &work[nb + 1], &ldwork, &c_b23, &a[ + i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)1, (ftnlen) + 12); /* Copy subdiagonal elements back into A, and diagonal */ /* elements into D */ - i__3 = i__ + nb - 1; - for (j = i__; j <= i__3; ++j) { - a[j + 1 + j * a_dim1] = e[j]; - d__[j] = a[j + j * a_dim1]; + i__3 = i__ + nb - 1; + for (j = i__; j <= i__3; ++j) { + a[j + 1 + j * a_dim1] = e[j]; + d__[j] = a[j + j * a_dim1]; /* L30: */ - } + } /* L40: */ - } + } /* Use unblocked code to reduce the last or only block */ - i__1 = *n - i__ + 1; - dsytd2_(uplo, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], - &tau[i__], &iinfo, (ftnlen)1); + i__1 = *n - i__ + 1; + dsytd2_(uplo, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], + &tau[i__], &iinfo, (ftnlen)1); } work[1] = (doublereal) lwkopt; @@ -450,5 +450,5 @@ f"> */ } /* dsytrd_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dtrmm.cpp b/lib/linalg/dtrmm.cpp index ffb6a1ad6b..1a61cf72b1 100644 --- a/lib/linalg/dtrmm.cpp +++ b/lib/linalg/dtrmm.cpp @@ -1,13 +1,13 @@ /* fortran/dtrmm.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -190,10 +190,10 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dtrmm_(char *side, char *uplo, char *transa, char *diag, - integer *m, integer *n, doublereal *alpha, doublereal *a, integer * - lda, doublereal *b, integer *ldb, ftnlen side_len, ftnlen uplo_len, - ftnlen transa_len, ftnlen diag_len) +/* Subroutine */ int dtrmm_(char *side, char *uplo, char *transa, char *diag, + integer *m, integer *n, doublereal *alpha, doublereal *a, integer * + lda, doublereal *b, integer *ldb, ftnlen side_len, ftnlen uplo_len, + ftnlen transa_len, ftnlen diag_len) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; @@ -244,276 +244,276 @@ extern "C" { /* Function Body */ lside = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); if (lside) { - nrowa = *m; + nrowa = *m; } else { - nrowa = *n; + nrowa = *n; } nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); info = 0; if (! lside && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - info = 1; + info = 1; } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - info = 2; + info = 2; } else if (! lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { - info = 3; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { - info = 4; + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 3; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 4; } else if (*m < 0) { - info = 5; + info = 5; } else if (*n < 0) { - info = 6; + info = 6; } else if (*lda < max(1,nrowa)) { - info = 9; + info = 9; } else if (*ldb < max(1,*m)) { - info = 11; + info = 11; } if (info != 0) { - xerbla_((char *)"DTRMM ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DTRMM ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0) { - return 0; + return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = 0.; /* L10: */ - } + } /* L20: */ - } - return 0; + } + return 0; } /* Start the operations. */ if (lside) { - if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { /* Form B := alpha*A*B. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (k = 1; k <= i__2; ++k) { - if (b[k + j * b_dim1] != 0.) { - temp = *alpha * b[k + j * b_dim1]; - i__3 = k - 1; - for (i__ = 1; i__ <= i__3; ++i__) { - b[i__ + j * b_dim1] += temp * a[i__ + k * - a_dim1]; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (k = 1; k <= i__2; ++k) { + if (b[k + j * b_dim1] != 0.) { + temp = *alpha * b[k + j * b_dim1]; + i__3 = k - 1; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] += temp * a[i__ + k * + a_dim1]; /* L30: */ - } - if (nounit) { - temp *= a[k + k * a_dim1]; - } - b[k + j * b_dim1] = temp; - } + } + if (nounit) { + temp *= a[k + k * a_dim1]; + } + b[k + j * b_dim1] = temp; + } /* L40: */ - } + } /* L50: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - for (k = *m; k >= 1; --k) { - if (b[k + j * b_dim1] != 0.) { - temp = *alpha * b[k + j * b_dim1]; - b[k + j * b_dim1] = temp; - if (nounit) { - b[k + j * b_dim1] *= a[k + k * a_dim1]; - } - i__2 = *m; - for (i__ = k + 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] += temp * a[i__ + k * - a_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (k = *m; k >= 1; --k) { + if (b[k + j * b_dim1] != 0.) { + temp = *alpha * b[k + j * b_dim1]; + b[k + j * b_dim1] = temp; + if (nounit) { + b[k + j * b_dim1] *= a[k + k * a_dim1]; + } + i__2 = *m; + for (i__ = k + 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] += temp * a[i__ + k * + a_dim1]; /* L60: */ - } - } + } + } /* L70: */ - } + } /* L80: */ - } - } - } else { + } + } + } else { /* Form B := alpha*A**T*B. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - for (i__ = *m; i__ >= 1; --i__) { - temp = b[i__ + j * b_dim1]; - if (nounit) { - temp *= a[i__ + i__ * a_dim1]; - } - i__2 = i__ - 1; - for (k = 1; k <= i__2; ++k) { - temp += a[k + i__ * a_dim1] * b[k + j * b_dim1]; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + temp = b[i__ + j * b_dim1]; + if (nounit) { + temp *= a[i__ + i__ * a_dim1]; + } + i__2 = i__ - 1; + for (k = 1; k <= i__2; ++k) { + temp += a[k + i__ * a_dim1] * b[k + j * b_dim1]; /* L90: */ - } - b[i__ + j * b_dim1] = *alpha * temp; + } + b[i__ + j * b_dim1] = *alpha * temp; /* L100: */ - } + } /* L110: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp = b[i__ + j * b_dim1]; - if (nounit) { - temp *= a[i__ + i__ * a_dim1]; - } - i__3 = *m; - for (k = i__ + 1; k <= i__3; ++k) { - temp += a[k + i__ * a_dim1] * b[k + j * b_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = b[i__ + j * b_dim1]; + if (nounit) { + temp *= a[i__ + i__ * a_dim1]; + } + i__3 = *m; + for (k = i__ + 1; k <= i__3; ++k) { + temp += a[k + i__ * a_dim1] * b[k + j * b_dim1]; /* L120: */ - } - b[i__ + j * b_dim1] = *alpha * temp; + } + b[i__ + j * b_dim1] = *alpha * temp; /* L130: */ - } + } /* L140: */ - } - } - } + } + } + } } else { - if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { /* Form B := alpha*B*A. */ - if (upper) { - for (j = *n; j >= 1; --j) { - temp = *alpha; - if (nounit) { - temp *= a[j + j * a_dim1]; - } - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; + if (upper) { + for (j = *n; j >= 1; --j) { + temp = *alpha; + if (nounit) { + temp *= a[j + j * a_dim1]; + } + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; /* L150: */ - } - i__1 = j - 1; - for (k = 1; k <= i__1; ++k) { - if (a[k + j * a_dim1] != 0.) { - temp = *alpha * a[k + j * a_dim1]; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] += temp * b[i__ + k * - b_dim1]; + } + i__1 = j - 1; + for (k = 1; k <= i__1; ++k) { + if (a[k + j * a_dim1] != 0.) { + temp = *alpha * a[k + j * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] += temp * b[i__ + k * + b_dim1]; /* L160: */ - } - } + } + } /* L170: */ - } + } /* L180: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp = *alpha; - if (nounit) { - temp *= a[j + j * a_dim1]; - } - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = *alpha; + if (nounit) { + temp *= a[j + j * a_dim1]; + } + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; /* L190: */ - } - i__2 = *n; - for (k = j + 1; k <= i__2; ++k) { - if (a[k + j * a_dim1] != 0.) { - temp = *alpha * a[k + j * a_dim1]; - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - b[i__ + j * b_dim1] += temp * b[i__ + k * - b_dim1]; + } + i__2 = *n; + for (k = j + 1; k <= i__2; ++k) { + if (a[k + j * a_dim1] != 0.) { + temp = *alpha * a[k + j * a_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] += temp * b[i__ + k * + b_dim1]; /* L200: */ - } - } + } + } /* L210: */ - } + } /* L220: */ - } - } - } else { + } + } + } else { /* Form B := alpha*B*A**T. */ - if (upper) { - i__1 = *n; - for (k = 1; k <= i__1; ++k) { - i__2 = k - 1; - for (j = 1; j <= i__2; ++j) { - if (a[j + k * a_dim1] != 0.) { - temp = *alpha * a[j + k * a_dim1]; - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - b[i__ + j * b_dim1] += temp * b[i__ + k * - b_dim1]; + if (upper) { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + i__2 = k - 1; + for (j = 1; j <= i__2; ++j) { + if (a[j + k * a_dim1] != 0.) { + temp = *alpha * a[j + k * a_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] += temp * b[i__ + k * + b_dim1]; /* L230: */ - } - } + } + } /* L240: */ - } - temp = *alpha; - if (nounit) { - temp *= a[k + k * a_dim1]; - } - if (temp != 1.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; + } + temp = *alpha; + if (nounit) { + temp *= a[k + k * a_dim1]; + } + if (temp != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; /* L250: */ - } - } + } + } /* L260: */ - } - } else { - for (k = *n; k >= 1; --k) { - i__1 = *n; - for (j = k + 1; j <= i__1; ++j) { - if (a[j + k * a_dim1] != 0.) { - temp = *alpha * a[j + k * a_dim1]; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] += temp * b[i__ + k * - b_dim1]; + } + } else { + for (k = *n; k >= 1; --k) { + i__1 = *n; + for (j = k + 1; j <= i__1; ++j) { + if (a[j + k * a_dim1] != 0.) { + temp = *alpha * a[j + k * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] += temp * b[i__ + k * + b_dim1]; /* L270: */ - } - } + } + } /* L280: */ - } - temp = *alpha; - if (nounit) { - temp *= a[k + k * a_dim1]; - } - if (temp != 1.) { - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; + } + temp = *alpha; + if (nounit) { + temp *= a[k + k * a_dim1]; + } + if (temp != 1.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; /* L290: */ - } - } + } + } /* L300: */ - } - } - } + } + } + } } return 0; @@ -523,5 +523,5 @@ extern "C" { } /* dtrmm_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dtrmv.cpp b/lib/linalg/dtrmv.cpp index 77dbf2f66f..597fcae137 100644 --- a/lib/linalg/dtrmv.cpp +++ b/lib/linalg/dtrmv.cpp @@ -1,13 +1,13 @@ /* fortran/dtrmv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -160,9 +160,9 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dtrmv_(char *uplo, char *trans, char *diag, integer *n, - doublereal *a, integer *lda, doublereal *x, integer *incx, ftnlen - uplo_len, ftnlen trans_len, ftnlen diag_len) +/* Subroutine */ int dtrmv_(char *uplo, char *trans, char *diag, integer *n, + doublereal *a, integer *lda, doublereal *x, integer *incx, ftnlen + uplo_len, ftnlen trans_len, ftnlen diag_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -208,31 +208,31 @@ extern "C" { /* Function Body */ info = 0; if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { - info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { - info = 2; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { - info = 3; + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 3; } else if (*n < 0) { - info = 4; + info = 4; } else if (*lda < max(1,*n)) { - info = 6; + info = 6; } else if (*incx == 0) { - info = 8; + info = 8; } if (info != 0) { - xerbla_((char *)"DTRMV ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DTRMV ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*n == 0) { - return 0; + return 0; } nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); @@ -241,9 +241,9 @@ extern "C" { /* will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { - kx = 1 - (*n - 1) * *incx; + kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { - kx = 1; + kx = 1; } /* Start the operations. In this version the elements of A are */ @@ -253,155 +253,155 @@ extern "C" { /* Form x := A*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (x[j] != 0.) { - temp = x[j]; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - x[i__] += temp * a[i__ + j * a_dim1]; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[j] != 0.) { + temp = x[j]; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + x[i__] += temp * a[i__ + j * a_dim1]; /* L10: */ - } - if (nounit) { - x[j] *= a[j + j * a_dim1]; - } - } + } + if (nounit) { + x[j] *= a[j + j * a_dim1]; + } + } /* L20: */ - } - } else { - jx = kx; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (x[jx] != 0.) { - temp = x[jx]; - ix = kx; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - x[ix] += temp * a[i__ + j * a_dim1]; - ix += *incx; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0.) { + temp = x[jx]; + ix = kx; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + x[ix] += temp * a[i__ + j * a_dim1]; + ix += *incx; /* L30: */ - } - if (nounit) { - x[jx] *= a[j + j * a_dim1]; - } - } - jx += *incx; + } + if (nounit) { + x[jx] *= a[j + j * a_dim1]; + } + } + jx += *incx; /* L40: */ - } - } - } else { - if (*incx == 1) { - for (j = *n; j >= 1; --j) { - if (x[j] != 0.) { - temp = x[j]; - i__1 = j + 1; - for (i__ = *n; i__ >= i__1; --i__) { - x[i__] += temp * a[i__ + j * a_dim1]; + } + } + } else { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + if (x[j] != 0.) { + temp = x[j]; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + x[i__] += temp * a[i__ + j * a_dim1]; /* L50: */ - } - if (nounit) { - x[j] *= a[j + j * a_dim1]; - } - } + } + if (nounit) { + x[j] *= a[j + j * a_dim1]; + } + } /* L60: */ - } - } else { - kx += (*n - 1) * *incx; - jx = kx; - for (j = *n; j >= 1; --j) { - if (x[jx] != 0.) { - temp = x[jx]; - ix = kx; - i__1 = j + 1; - for (i__ = *n; i__ >= i__1; --i__) { - x[ix] += temp * a[i__ + j * a_dim1]; - ix -= *incx; + } + } else { + kx += (*n - 1) * *incx; + jx = kx; + for (j = *n; j >= 1; --j) { + if (x[jx] != 0.) { + temp = x[jx]; + ix = kx; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + x[ix] += temp * a[i__ + j * a_dim1]; + ix -= *incx; /* L70: */ - } - if (nounit) { - x[jx] *= a[j + j * a_dim1]; - } - } - jx -= *incx; + } + if (nounit) { + x[jx] *= a[j + j * a_dim1]; + } + } + jx -= *incx; /* L80: */ - } - } - } + } + } + } } else { /* Form x := A**T*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - if (*incx == 1) { - for (j = *n; j >= 1; --j) { - temp = x[j]; - if (nounit) { - temp *= a[j + j * a_dim1]; - } - for (i__ = j - 1; i__ >= 1; --i__) { - temp += a[i__ + j * a_dim1] * x[i__]; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + temp = x[j]; + if (nounit) { + temp *= a[j + j * a_dim1]; + } + for (i__ = j - 1; i__ >= 1; --i__) { + temp += a[i__ + j * a_dim1] * x[i__]; /* L90: */ - } - x[j] = temp; + } + x[j] = temp; /* L100: */ - } - } else { - jx = kx + (*n - 1) * *incx; - for (j = *n; j >= 1; --j) { - temp = x[jx]; - ix = jx; - if (nounit) { - temp *= a[j + j * a_dim1]; - } - for (i__ = j - 1; i__ >= 1; --i__) { - ix -= *incx; - temp += a[i__ + j * a_dim1] * x[ix]; + } + } else { + jx = kx + (*n - 1) * *incx; + for (j = *n; j >= 1; --j) { + temp = x[jx]; + ix = jx; + if (nounit) { + temp *= a[j + j * a_dim1]; + } + for (i__ = j - 1; i__ >= 1; --i__) { + ix -= *incx; + temp += a[i__ + j * a_dim1] * x[ix]; /* L110: */ - } - x[jx] = temp; - jx -= *incx; + } + x[jx] = temp; + jx -= *incx; /* L120: */ - } - } - } else { - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp = x[j]; - if (nounit) { - temp *= a[j + j * a_dim1]; - } - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - temp += a[i__ + j * a_dim1] * x[i__]; + } + } + } else { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = x[j]; + if (nounit) { + temp *= a[j + j * a_dim1]; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + temp += a[i__ + j * a_dim1] * x[i__]; /* L130: */ - } - x[j] = temp; + } + x[j] = temp; /* L140: */ - } - } else { - jx = kx; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp = x[jx]; - ix = jx; - if (nounit) { - temp *= a[j + j * a_dim1]; - } - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - ix += *incx; - temp += a[i__ + j * a_dim1] * x[ix]; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = x[jx]; + ix = jx; + if (nounit) { + temp *= a[j + j * a_dim1]; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + temp += a[i__ + j * a_dim1] * x[ix]; /* L150: */ - } - x[jx] = temp; - jx += *incx; + } + x[jx] = temp; + jx += *incx; /* L160: */ - } - } - } + } + } + } } return 0; @@ -411,5 +411,5 @@ extern "C" { } /* dtrmv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dtrsm.cpp b/lib/linalg/dtrsm.cpp index 488da4ecdc..8b815c5300 100644 --- a/lib/linalg/dtrsm.cpp +++ b/lib/linalg/dtrsm.cpp @@ -1,13 +1,13 @@ /* fortran/dtrsm.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -194,10 +194,10 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int dtrsm_(char *side, char *uplo, char *transa, char *diag, - integer *m, integer *n, doublereal *alpha, doublereal *a, integer * - lda, doublereal *b, integer *ldb, ftnlen side_len, ftnlen uplo_len, - ftnlen transa_len, ftnlen diag_len) +/* Subroutine */ int dtrsm_(char *side, char *uplo, char *transa, char *diag, + integer *m, integer *n, doublereal *alpha, doublereal *a, integer * + lda, doublereal *b, integer *ldb, ftnlen side_len, ftnlen uplo_len, + ftnlen transa_len, ftnlen diag_len) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; @@ -248,310 +248,310 @@ extern "C" { /* Function Body */ lside = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); if (lside) { - nrowa = *m; + nrowa = *m; } else { - nrowa = *n; + nrowa = *n; } nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); info = 0; if (! lside && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - info = 1; + info = 1; } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - info = 2; + info = 2; } else if (! lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { - info = 3; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { - info = 4; + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 3; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 4; } else if (*m < 0) { - info = 5; + info = 5; } else if (*n < 0) { - info = 6; + info = 6; } else if (*lda < max(1,nrowa)) { - info = 9; + info = 9; } else if (*ldb < max(1,*m)) { - info = 11; + info = 11; } if (info != 0) { - xerbla_((char *)"DTRSM ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DTRSM ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0) { - return 0; + return 0; } /* And when alpha.eq.zero. */ if (*alpha == 0.) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = 0.; /* L10: */ - } + } /* L20: */ - } - return 0; + } + return 0; } /* Start the operations. */ if (lside) { - if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { /* Form B := alpha*inv( A )*B. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (*alpha != 1.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] - ; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; /* L30: */ - } - } - for (k = *m; k >= 1; --k) { - if (b[k + j * b_dim1] != 0.) { - if (nounit) { - b[k + j * b_dim1] /= a[k + k * a_dim1]; - } - i__2 = k - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ - i__ + k * a_dim1]; + } + } + for (k = *m; k >= 1; --k) { + if (b[k + j * b_dim1] != 0.) { + if (nounit) { + b[k + j * b_dim1] /= a[k + k * a_dim1]; + } + i__2 = k - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ + i__ + k * a_dim1]; /* L40: */ - } - } + } + } /* L50: */ - } + } /* L60: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (*alpha != 1.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] - ; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; /* L70: */ - } - } - i__2 = *m; - for (k = 1; k <= i__2; ++k) { - if (b[k + j * b_dim1] != 0.) { - if (nounit) { - b[k + j * b_dim1] /= a[k + k * a_dim1]; - } - i__3 = *m; - for (i__ = k + 1; i__ <= i__3; ++i__) { - b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ - i__ + k * a_dim1]; + } + } + i__2 = *m; + for (k = 1; k <= i__2; ++k) { + if (b[k + j * b_dim1] != 0.) { + if (nounit) { + b[k + j * b_dim1] /= a[k + k * a_dim1]; + } + i__3 = *m; + for (i__ = k + 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ + i__ + k * a_dim1]; /* L80: */ - } - } + } + } /* L90: */ - } + } /* L100: */ - } - } - } else { + } + } + } else { /* Form B := alpha*inv( A**T )*B. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp = *alpha * b[i__ + j * b_dim1]; - i__3 = i__ - 1; - for (k = 1; k <= i__3; ++k) { - temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp = *alpha * b[i__ + j * b_dim1]; + i__3 = i__ - 1; + for (k = 1; k <= i__3; ++k) { + temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; /* L110: */ - } - if (nounit) { - temp /= a[i__ + i__ * a_dim1]; - } - b[i__ + j * b_dim1] = temp; + } + if (nounit) { + temp /= a[i__ + i__ * a_dim1]; + } + b[i__ + j * b_dim1] = temp; /* L120: */ - } + } /* L130: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - for (i__ = *m; i__ >= 1; --i__) { - temp = *alpha * b[i__ + j * b_dim1]; - i__2 = *m; - for (k = i__ + 1; k <= i__2; ++k) { - temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + temp = *alpha * b[i__ + j * b_dim1]; + i__2 = *m; + for (k = i__ + 1; k <= i__2; ++k) { + temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; /* L140: */ - } - if (nounit) { - temp /= a[i__ + i__ * a_dim1]; - } - b[i__ + j * b_dim1] = temp; + } + if (nounit) { + temp /= a[i__ + i__ * a_dim1]; + } + b[i__ + j * b_dim1] = temp; /* L150: */ - } + } /* L160: */ - } - } - } + } + } + } } else { - if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { /* Form B := alpha*B*inv( A ). */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (*alpha != 1.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] - ; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*alpha != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; /* L170: */ - } - } - i__2 = j - 1; - for (k = 1; k <= i__2; ++k) { - if (a[k + j * a_dim1] != 0.) { - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ - i__ + k * b_dim1]; + } + } + i__2 = j - 1; + for (k = 1; k <= i__2; ++k) { + if (a[k + j * a_dim1] != 0.) { + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ + i__ + k * b_dim1]; /* L180: */ - } - } + } + } /* L190: */ - } - if (nounit) { - temp = 1. / a[j + j * a_dim1]; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; + } + if (nounit) { + temp = 1. / a[j + j * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; /* L200: */ - } - } + } + } /* L210: */ - } - } else { - for (j = *n; j >= 1; --j) { - if (*alpha != 1.) { - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] - ; + } + } else { + for (j = *n; j >= 1; --j) { + if (*alpha != 1.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] + ; /* L220: */ - } - } - i__1 = *n; - for (k = j + 1; k <= i__1; ++k) { - if (a[k + j * a_dim1] != 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ - i__ + k * b_dim1]; + } + } + i__1 = *n; + for (k = j + 1; k <= i__1; ++k) { + if (a[k + j * a_dim1] != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ + i__ + k * b_dim1]; /* L230: */ - } - } + } + } /* L240: */ - } - if (nounit) { - temp = 1. / a[j + j * a_dim1]; - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; + } + if (nounit) { + temp = 1. / a[j + j * a_dim1]; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; /* L250: */ - } - } + } + } /* L260: */ - } - } - } else { + } + } + } else { /* Form B := alpha*B*inv( A**T ). */ - if (upper) { - for (k = *n; k >= 1; --k) { - if (nounit) { - temp = 1. / a[k + k * a_dim1]; - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; + if (upper) { + for (k = *n; k >= 1; --k) { + if (nounit) { + temp = 1. / a[k + k * a_dim1]; + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; /* L270: */ - } - } - i__1 = k - 1; - for (j = 1; j <= i__1; ++j) { - if (a[j + k * a_dim1] != 0.) { - temp = a[j + k * a_dim1]; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] -= temp * b[i__ + k * - b_dim1]; + } + } + i__1 = k - 1; + for (j = 1; j <= i__1; ++j) { + if (a[j + k * a_dim1] != 0.) { + temp = a[j + k * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + j * b_dim1] -= temp * b[i__ + k * + b_dim1]; /* L280: */ - } - } + } + } /* L290: */ - } - if (*alpha != 1.) { - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] - ; + } + if (*alpha != 1.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] + ; /* L300: */ - } - } + } + } /* L310: */ - } - } else { - i__1 = *n; - for (k = 1; k <= i__1; ++k) { - if (nounit) { - temp = 1. / a[k + k * a_dim1]; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; + } + } else { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + if (nounit) { + temp = 1. / a[k + k * a_dim1]; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; /* L320: */ - } - } - i__2 = *n; - for (j = k + 1; j <= i__2; ++j) { - if (a[j + k * a_dim1] != 0.) { - temp = a[j + k * a_dim1]; - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - b[i__ + j * b_dim1] -= temp * b[i__ + k * - b_dim1]; + } + } + i__2 = *n; + for (j = k + 1; j <= i__2; ++j) { + if (a[j + k * a_dim1] != 0.) { + temp = a[j + k * a_dim1]; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + b[i__ + j * b_dim1] -= temp * b[i__ + k * + b_dim1]; /* L330: */ - } - } + } + } /* L340: */ - } - if (*alpha != 1.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] - ; + } + if (*alpha != 1.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] + ; /* L350: */ - } - } + } + } /* L360: */ - } - } - } + } + } + } } return 0; @@ -561,5 +561,5 @@ extern "C" { } /* dtrsm_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dtrsv.cpp b/lib/linalg/dtrsv.cpp index 58b85f9206..4044c819f6 100644 --- a/lib/linalg/dtrsv.cpp +++ b/lib/linalg/dtrsv.cpp @@ -1,13 +1,13 @@ /* fortran/dtrsv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -156,9 +156,9 @@ extern "C" { /* > \ingroup double_blas_level1 */ /* ===================================================================== */ -/* Subroutine */ int dtrsv_(char *uplo, char *trans, char *diag, integer *n, - doublereal *a, integer *lda, doublereal *x, integer *incx, ftnlen - uplo_len, ftnlen trans_len, ftnlen diag_len) +/* Subroutine */ int dtrsv_(char *uplo, char *trans, char *diag, integer *n, + doublereal *a, integer *lda, doublereal *x, integer *incx, ftnlen + uplo_len, ftnlen trans_len, ftnlen diag_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -204,31 +204,31 @@ extern "C" { /* Function Body */ info = 0; if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { - info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { - info = 2; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { - info = 3; + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 3; } else if (*n < 0) { - info = 4; + info = 4; } else if (*lda < max(1,*n)) { - info = 6; + info = 6; } else if (*incx == 0) { - info = 8; + info = 8; } if (info != 0) { - xerbla_((char *)"DTRSV ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"DTRSV ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*n == 0) { - return 0; + return 0; } nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); @@ -237,9 +237,9 @@ extern "C" { /* will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { - kx = 1 - (*n - 1) * *incx; + kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { - kx = 1; + kx = 1; } /* Start the operations. In this version the elements of A are */ @@ -249,155 +249,155 @@ extern "C" { /* Form x := inv( A )*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - if (*incx == 1) { - for (j = *n; j >= 1; --j) { - if (x[j] != 0.) { - if (nounit) { - x[j] /= a[j + j * a_dim1]; - } - temp = x[j]; - for (i__ = j - 1; i__ >= 1; --i__) { - x[i__] -= temp * a[i__ + j * a_dim1]; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + if (x[j] != 0.) { + if (nounit) { + x[j] /= a[j + j * a_dim1]; + } + temp = x[j]; + for (i__ = j - 1; i__ >= 1; --i__) { + x[i__] -= temp * a[i__ + j * a_dim1]; /* L10: */ - } - } + } + } /* L20: */ - } - } else { - jx = kx + (*n - 1) * *incx; - for (j = *n; j >= 1; --j) { - if (x[jx] != 0.) { - if (nounit) { - x[jx] /= a[j + j * a_dim1]; - } - temp = x[jx]; - ix = jx; - for (i__ = j - 1; i__ >= 1; --i__) { - ix -= *incx; - x[ix] -= temp * a[i__ + j * a_dim1]; + } + } else { + jx = kx + (*n - 1) * *incx; + for (j = *n; j >= 1; --j) { + if (x[jx] != 0.) { + if (nounit) { + x[jx] /= a[j + j * a_dim1]; + } + temp = x[jx]; + ix = jx; + for (i__ = j - 1; i__ >= 1; --i__) { + ix -= *incx; + x[ix] -= temp * a[i__ + j * a_dim1]; /* L30: */ - } - } - jx -= *incx; + } + } + jx -= *incx; /* L40: */ - } - } - } else { - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (x[j] != 0.) { - if (nounit) { - x[j] /= a[j + j * a_dim1]; - } - temp = x[j]; - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - x[i__] -= temp * a[i__ + j * a_dim1]; + } + } + } else { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[j] != 0.) { + if (nounit) { + x[j] /= a[j + j * a_dim1]; + } + temp = x[j]; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + x[i__] -= temp * a[i__ + j * a_dim1]; /* L50: */ - } - } + } + } /* L60: */ - } - } else { - jx = kx; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (x[jx] != 0.) { - if (nounit) { - x[jx] /= a[j + j * a_dim1]; - } - temp = x[jx]; - ix = jx; - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - ix += *incx; - x[ix] -= temp * a[i__ + j * a_dim1]; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (x[jx] != 0.) { + if (nounit) { + x[jx] /= a[j + j * a_dim1]; + } + temp = x[jx]; + ix = jx; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + x[ix] -= temp * a[i__ + j * a_dim1]; /* L70: */ - } - } - jx += *incx; + } + } + jx += *incx; /* L80: */ - } - } - } + } + } + } } else { /* Form x := inv( A**T )*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp = x[j]; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - temp -= a[i__ + j * a_dim1] * x[i__]; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = x[j]; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + temp -= a[i__ + j * a_dim1] * x[i__]; /* L90: */ - } - if (nounit) { - temp /= a[j + j * a_dim1]; - } - x[j] = temp; + } + if (nounit) { + temp /= a[j + j * a_dim1]; + } + x[j] = temp; /* L100: */ - } - } else { - jx = kx; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp = x[jx]; - ix = kx; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - temp -= a[i__ + j * a_dim1] * x[ix]; - ix += *incx; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp = x[jx]; + ix = kx; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + temp -= a[i__ + j * a_dim1] * x[ix]; + ix += *incx; /* L110: */ - } - if (nounit) { - temp /= a[j + j * a_dim1]; - } - x[jx] = temp; - jx += *incx; + } + if (nounit) { + temp /= a[j + j * a_dim1]; + } + x[jx] = temp; + jx += *incx; /* L120: */ - } - } - } else { - if (*incx == 1) { - for (j = *n; j >= 1; --j) { - temp = x[j]; - i__1 = j + 1; - for (i__ = *n; i__ >= i__1; --i__) { - temp -= a[i__ + j * a_dim1] * x[i__]; + } + } + } else { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + temp = x[j]; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + temp -= a[i__ + j * a_dim1] * x[i__]; /* L130: */ - } - if (nounit) { - temp /= a[j + j * a_dim1]; - } - x[j] = temp; + } + if (nounit) { + temp /= a[j + j * a_dim1]; + } + x[j] = temp; /* L140: */ - } - } else { - kx += (*n - 1) * *incx; - jx = kx; - for (j = *n; j >= 1; --j) { - temp = x[jx]; - ix = kx; - i__1 = j + 1; - for (i__ = *n; i__ >= i__1; --i__) { - temp -= a[i__ + j * a_dim1] * x[ix]; - ix -= *incx; + } + } else { + kx += (*n - 1) * *incx; + jx = kx; + for (j = *n; j >= 1; --j) { + temp = x[jx]; + ix = kx; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + temp -= a[i__ + j * a_dim1] * x[ix]; + ix -= *incx; /* L150: */ - } - if (nounit) { - temp /= a[j + j * a_dim1]; - } - x[jx] = temp; - jx -= *incx; + } + if (nounit) { + temp /= a[j + j * a_dim1]; + } + x[jx] = temp; + jx -= *incx; /* L160: */ - } - } - } + } + } + } } return 0; @@ -407,5 +407,5 @@ extern "C" { } /* dtrsv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dtrti2.cpp b/lib/linalg/dtrti2.cpp index f159e31b0d..79cc64b359 100644 --- a/lib/linalg/dtrti2.cpp +++ b/lib/linalg/dtrti2.cpp @@ -1,13 +1,13 @@ /* fortran/dtrti2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -131,7 +131,7 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dtrti2_(char *uplo, char *diag, integer *n, doublereal * - a, integer *lda, integer *info, ftnlen uplo_len, ftnlen diag_len) + a, integer *lda, integer *info, ftnlen uplo_len, ftnlen diag_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -139,13 +139,13 @@ f"> */ /* Local variables */ integer j; doublereal ajj; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); logical upper; - extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); + extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); logical nounit; @@ -184,67 +184,67 @@ f"> */ upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! nounit && ! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*n < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*n)) { - *info = -5; + *info = -5; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DTRTI2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DTRTI2", &i__1, (ftnlen)6); + return 0; } if (upper) { /* Compute inverse of upper triangular matrix. */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (nounit) { - a[j + j * a_dim1] = 1. / a[j + j * a_dim1]; - ajj = -a[j + j * a_dim1]; - } else { - ajj = -1.; - } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (nounit) { + a[j + j * a_dim1] = 1. / a[j + j * a_dim1]; + ajj = -a[j + j * a_dim1]; + } else { + ajj = -1.; + } /* Compute elements 1:j-1 of j-th column. */ - i__2 = j - 1; - dtrmv_((char *)"Upper", (char *)"No transpose", diag, &i__2, &a[a_offset], lda, & - a[j * a_dim1 + 1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen) - 1); - i__2 = j - 1; - dscal_(&i__2, &ajj, &a[j * a_dim1 + 1], &c__1); + i__2 = j - 1; + dtrmv_((char *)"Upper", (char *)"No transpose", diag, &i__2, &a[a_offset], lda, & + a[j * a_dim1 + 1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen) + 1); + i__2 = j - 1; + dscal_(&i__2, &ajj, &a[j * a_dim1 + 1], &c__1); /* L10: */ - } + } } else { /* Compute inverse of lower triangular matrix. */ - for (j = *n; j >= 1; --j) { - if (nounit) { - a[j + j * a_dim1] = 1. / a[j + j * a_dim1]; - ajj = -a[j + j * a_dim1]; - } else { - ajj = -1.; - } - if (j < *n) { + for (j = *n; j >= 1; --j) { + if (nounit) { + a[j + j * a_dim1] = 1. / a[j + j * a_dim1]; + ajj = -a[j + j * a_dim1]; + } else { + ajj = -1.; + } + if (j < *n) { /* Compute elements j+1:n of j-th column. */ - i__1 = *n - j; - dtrmv_((char *)"Lower", (char *)"No transpose", diag, &i__1, &a[j + 1 + (j + - 1) * a_dim1], lda, &a[j + 1 + j * a_dim1], &c__1, ( - ftnlen)5, (ftnlen)12, (ftnlen)1); - i__1 = *n - j; - dscal_(&i__1, &ajj, &a[j + 1 + j * a_dim1], &c__1); - } + i__1 = *n - j; + dtrmv_((char *)"Lower", (char *)"No transpose", diag, &i__1, &a[j + 1 + (j + + 1) * a_dim1], lda, &a[j + 1 + j * a_dim1], &c__1, ( + ftnlen)5, (ftnlen)12, (ftnlen)1); + i__1 = *n - j; + dscal_(&i__1, &ajj, &a[j + 1 + j * a_dim1], &c__1); + } /* L20: */ - } + } } return 0; @@ -254,5 +254,5 @@ f"> */ } /* dtrti2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dtrtri.cpp b/lib/linalg/dtrtri.cpp index faecb3dd69..a80ece791c 100644 --- a/lib/linalg/dtrtri.cpp +++ b/lib/linalg/dtrtri.cpp @@ -1,13 +1,13 @@ /* fortran/dtrtri.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -134,7 +134,7 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int dtrtri_(char *uplo, char *diag, integer *n, doublereal * - a, integer *lda, integer *info, ftnlen uplo_len, ftnlen diag_len) + a, integer *lda, integer *info, ftnlen uplo_len, ftnlen diag_len) { /* System generated locals */ address a__1[2]; @@ -147,18 +147,18 @@ f"> */ /* Local variables */ integer j, jb, nb, nn; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), dtrsm_( - char *, char *, char *, char *, integer *, integer *, doublereal * - , doublereal *, integer *, doublereal *, integer *, ftnlen, - ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, + integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), dtrsm_( + char *, char *, char *, char *, integer *, integer *, doublereal * + , doublereal *, integer *, doublereal *, integer *, ftnlen, + ftnlen, ftnlen, ftnlen); logical upper; - extern /* Subroutine */ int dtrti2_(char *, char *, integer *, doublereal - *, integer *, integer *, ftnlen, ftnlen), xerbla_(char *, integer - *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dtrti2_(char *, char *, integer *, doublereal + *, integer *, integer *, ftnlen, ftnlen), xerbla_(char *, integer + *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); logical nounit; @@ -197,37 +197,37 @@ f"> */ upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! nounit && ! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*n < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*n)) { - *info = -5; + *info = -5; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"DTRTRI", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"DTRTRI", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } /* Check for singularity if non-unit. */ if (nounit) { - i__1 = *n; - for (*info = 1; *info <= i__1; ++(*info)) { - if (a[*info + *info * a_dim1] == 0.) { - return 0; - } + i__1 = *n; + for (*info = 1; *info <= i__1; ++(*info)) { + if (a[*info + *info * a_dim1] == 0.) { + return 0; + } /* L10: */ - } - *info = 0; + } + *info = 0; } /* Determine the block size for this environment. */ @@ -237,77 +237,77 @@ f"> */ i__2[1] = 1, a__1[1] = diag; s_cat(ch__1, a__1, i__2, &c__2, (ftnlen)2); nb = ilaenv_(&c__1, (char *)"DTRTRI", ch__1, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( - ftnlen)2); + ftnlen)2); if (nb <= 1 || nb >= *n) { /* Use unblocked code */ - dtrti2_(uplo, diag, n, &a[a_offset], lda, info, (ftnlen)1, (ftnlen)1); + dtrti2_(uplo, diag, n, &a[a_offset], lda, info, (ftnlen)1, (ftnlen)1); } else { /* Use blocked code */ - if (upper) { + if (upper) { /* Compute inverse of upper triangular matrix */ - i__1 = *n; - i__3 = nb; - for (j = 1; i__3 < 0 ? j >= i__1 : j <= i__1; j += i__3) { + i__1 = *n; + i__3 = nb; + for (j = 1; i__3 < 0 ? j >= i__1 : j <= i__1; j += i__3) { /* Computing MIN */ - i__4 = nb, i__5 = *n - j + 1; - jb = min(i__4,i__5); + i__4 = nb, i__5 = *n - j + 1; + jb = min(i__4,i__5); /* Compute rows 1:j-1 of current block column */ - i__4 = j - 1; - dtrmm_((char *)"Left", (char *)"Upper", (char *)"No transpose", diag, &i__4, &jb, & - c_b18, &a[a_offset], lda, &a[j * a_dim1 + 1], lda, ( - ftnlen)4, (ftnlen)5, (ftnlen)12, (ftnlen)1); - i__4 = j - 1; - dtrsm_((char *)"Right", (char *)"Upper", (char *)"No transpose", diag, &i__4, &jb, & - c_b22, &a[j + j * a_dim1], lda, &a[j * a_dim1 + 1], - lda, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)1); + i__4 = j - 1; + dtrmm_((char *)"Left", (char *)"Upper", (char *)"No transpose", diag, &i__4, &jb, & + c_b18, &a[a_offset], lda, &a[j * a_dim1 + 1], lda, ( + ftnlen)4, (ftnlen)5, (ftnlen)12, (ftnlen)1); + i__4 = j - 1; + dtrsm_((char *)"Right", (char *)"Upper", (char *)"No transpose", diag, &i__4, &jb, & + c_b22, &a[j + j * a_dim1], lda, &a[j * a_dim1 + 1], + lda, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)1); /* Compute inverse of current diagonal block */ - dtrti2_((char *)"Upper", diag, &jb, &a[j + j * a_dim1], lda, info, ( - ftnlen)5, (ftnlen)1); + dtrti2_((char *)"Upper", diag, &jb, &a[j + j * a_dim1], lda, info, ( + ftnlen)5, (ftnlen)1); /* L20: */ - } - } else { + } + } else { /* Compute inverse of lower triangular matrix */ - nn = (*n - 1) / nb * nb + 1; - i__3 = -nb; - for (j = nn; i__3 < 0 ? j >= 1 : j <= 1; j += i__3) { + nn = (*n - 1) / nb * nb + 1; + i__3 = -nb; + for (j = nn; i__3 < 0 ? j >= 1 : j <= 1; j += i__3) { /* Computing MIN */ - i__1 = nb, i__4 = *n - j + 1; - jb = min(i__1,i__4); - if (j + jb <= *n) { + i__1 = nb, i__4 = *n - j + 1; + jb = min(i__1,i__4); + if (j + jb <= *n) { /* Compute rows j+jb:n of current block column */ - i__1 = *n - j - jb + 1; - dtrmm_((char *)"Left", (char *)"Lower", (char *)"No transpose", diag, &i__1, &jb, - &c_b18, &a[j + jb + (j + jb) * a_dim1], lda, &a[j - + jb + j * a_dim1], lda, (ftnlen)4, (ftnlen)5, ( - ftnlen)12, (ftnlen)1); - i__1 = *n - j - jb + 1; - dtrsm_((char *)"Right", (char *)"Lower", (char *)"No transpose", diag, &i__1, &jb, - &c_b22, &a[j + j * a_dim1], lda, &a[j + jb + j * - a_dim1], lda, (ftnlen)5, (ftnlen)5, (ftnlen)12, ( - ftnlen)1); - } + i__1 = *n - j - jb + 1; + dtrmm_((char *)"Left", (char *)"Lower", (char *)"No transpose", diag, &i__1, &jb, + &c_b18, &a[j + jb + (j + jb) * a_dim1], lda, &a[j + + jb + j * a_dim1], lda, (ftnlen)4, (ftnlen)5, ( + ftnlen)12, (ftnlen)1); + i__1 = *n - j - jb + 1; + dtrsm_((char *)"Right", (char *)"Lower", (char *)"No transpose", diag, &i__1, &jb, + &c_b22, &a[j + j * a_dim1], lda, &a[j + jb + j * + a_dim1], lda, (ftnlen)5, (ftnlen)5, (ftnlen)12, ( + ftnlen)1); + } /* Compute inverse of current diagonal block */ - dtrti2_((char *)"Lower", diag, &jb, &a[j + j * a_dim1], lda, info, ( - ftnlen)5, (ftnlen)1); + dtrti2_((char *)"Lower", diag, &jb, &a[j + j * a_dim1], lda, info, ( + ftnlen)5, (ftnlen)1); /* L30: */ - } - } + } + } } return 0; @@ -317,5 +317,5 @@ f"> */ } /* dtrtri_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/dznrm2.cpp b/lib/linalg/dznrm2.cpp index ec71aa201b..7a92e63831 100644 --- a/lib/linalg/dznrm2.cpp +++ b/lib/linalg/dznrm2.cpp @@ -1,13 +1,13 @@ /* fortran/dznrm2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -127,48 +127,48 @@ doublereal dznrm2_(integer *n, doublecomplex *x, integer *incx) /* Function Body */ if (*n < 1 || *incx < 1) { - norm = 0.; + norm = 0.; } else { - scale = 0.; - ssq = 1.; + scale = 0.; + ssq = 1.; /* The following loop is equivalent to this call to the LAPACK */ /* auxiliary routine: */ /* CALL ZLASSQ( N, X, INCX, SCALE, SSQ ) */ - i__1 = (*n - 1) * *incx + 1; - i__2 = *incx; - for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { - i__3 = ix; - if (x[i__3].r != 0.) { - i__3 = ix; - temp = (d__1 = x[i__3].r, abs(d__1)); - if (scale < temp) { + i__1 = (*n - 1) * *incx + 1; + i__2 = *incx; + for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { + i__3 = ix; + if (x[i__3].r != 0.) { + i__3 = ix; + temp = (d__1 = x[i__3].r, abs(d__1)); + if (scale < temp) { /* Computing 2nd power */ - d__1 = scale / temp; - ssq = ssq * (d__1 * d__1) + 1.; - scale = temp; - } else { + d__1 = scale / temp; + ssq = ssq * (d__1 * d__1) + 1.; + scale = temp; + } else { /* Computing 2nd power */ - d__1 = temp / scale; - ssq += d__1 * d__1; - } - } - if (d_imag(&x[ix]) != 0.) { - temp = (d__1 = d_imag(&x[ix]), abs(d__1)); - if (scale < temp) { + d__1 = temp / scale; + ssq += d__1 * d__1; + } + } + if (d_imag(&x[ix]) != 0.) { + temp = (d__1 = d_imag(&x[ix]), abs(d__1)); + if (scale < temp) { /* Computing 2nd power */ - d__1 = scale / temp; - ssq = ssq * (d__1 * d__1) + 1.; - scale = temp; - } else { + d__1 = scale / temp; + ssq = ssq * (d__1 * d__1) + 1.; + scale = temp; + } else { /* Computing 2nd power */ - d__1 = temp / scale; - ssq += d__1 * d__1; - } - } + d__1 = temp / scale; + ssq += d__1 * d__1; + } + } /* L10: */ - } - norm = scale * sqrt(ssq); + } + norm = scale * sqrt(ssq); } ret_val = norm; @@ -179,5 +179,5 @@ doublereal dznrm2_(integer *n, doublecomplex *x, integer *incx) } /* dznrm2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/idamax.cpp b/lib/linalg/idamax.cpp index edcf861435..e50c15bd38 100644 --- a/lib/linalg/idamax.cpp +++ b/lib/linalg/idamax.cpp @@ -1,13 +1,13 @@ /* fortran/idamax.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -116,39 +116,39 @@ integer idamax_(integer *n, doublereal *dx, integer *incx) /* Function Body */ ret_val = 0; if (*n < 1 || *incx <= 0) { - return ret_val; + return ret_val; } ret_val = 1; if (*n == 1) { - return ret_val; + return ret_val; } if (*incx == 1) { /* code for increment equal to 1 */ - dmax__ = abs(dx[1]); - i__1 = *n; - for (i__ = 2; i__ <= i__1; ++i__) { - if ((d__1 = dx[i__], abs(d__1)) > dmax__) { - ret_val = i__; - dmax__ = (d__1 = dx[i__], abs(d__1)); - } - } + dmax__ = abs(dx[1]); + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + if ((d__1 = dx[i__], abs(d__1)) > dmax__) { + ret_val = i__; + dmax__ = (d__1 = dx[i__], abs(d__1)); + } + } } else { /* code for increment not equal to 1 */ - ix = 1; - dmax__ = abs(dx[1]); - ix += *incx; - i__1 = *n; - for (i__ = 2; i__ <= i__1; ++i__) { - if ((d__1 = dx[ix], abs(d__1)) > dmax__) { - ret_val = i__; - dmax__ = (d__1 = dx[ix], abs(d__1)); - } - ix += *incx; - } + ix = 1; + dmax__ = abs(dx[1]); + ix += *incx; + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + if ((d__1 = dx[ix], abs(d__1)) > dmax__) { + ret_val = i__; + dmax__ = (d__1 = dx[ix], abs(d__1)); + } + ix += *incx; + } } return ret_val; @@ -157,5 +157,5 @@ integer idamax_(integer *n, doublereal *dx, integer *incx) } /* idamax_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/ieeeck.cpp b/lib/linalg/ieeeck.cpp index 16626acf9d..783a87df9d 100644 --- a/lib/linalg/ieeeck.cpp +++ b/lib/linalg/ieeeck.cpp @@ -1,13 +1,13 @@ /* fortran/ieeeck.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -123,50 +123,50 @@ integer ieeeck_(integer *ispec, real *zero, real *one) posinf = *one / *zero; if (posinf <= *one) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } neginf = -(*one) / *zero; if (neginf >= *zero) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } negzro = *one / (neginf + *one); if (negzro != *zero) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } neginf = *one / negzro; if (neginf >= *zero) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } newzro = negzro + *zero; if (newzro != *zero) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } posinf = *one / newzro; if (posinf <= *one) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } neginf *= posinf; if (neginf >= *zero) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } posinf *= posinf; if (posinf <= *one) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } @@ -175,7 +175,7 @@ integer ieeeck_(integer *ispec, real *zero, real *one) /* Return if we were only asked to check infinity arithmetic */ if (*ispec == 0) { - return ret_val; + return ret_val; } nan1 = posinf + neginf; @@ -191,38 +191,38 @@ integer ieeeck_(integer *ispec, real *zero, real *one) nan6 = nan5 * *zero; if (nan1 == nan1) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } if (nan2 == nan2) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } if (nan3 == nan3) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } if (nan4 == nan4) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } if (nan5 == nan5) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } if (nan6 == nan6) { - ret_val = 0; - return ret_val; + ret_val = 0; + return ret_val; } return ret_val; } /* ieeeck_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/iladlc.cpp b/lib/linalg/iladlc.cpp index 21b05e970a..20355f1a94 100644 --- a/lib/linalg/iladlc.cpp +++ b/lib/linalg/iladlc.cpp @@ -1,13 +1,13 @@ /* fortran/iladlc.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -128,23 +128,23 @@ integer iladlc_(integer *m, integer *n, doublereal *a, integer *lda) /* Function Body */ if (*n == 0) { - ret_val = *n; + ret_val = *n; } else if (a[*n * a_dim1 + 1] != 0. || a[*m + *n * a_dim1] != 0.) { - ret_val = *n; + ret_val = *n; } else { /* Now scan each column from the end, returning with the first non-zero. */ - for (ret_val = *n; ret_val >= 1; --ret_val) { - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - if (a[i__ + ret_val * a_dim1] != 0.) { - return ret_val; - } - } - } + for (ret_val = *n; ret_val >= 1; --ret_val) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + if (a[i__ + ret_val * a_dim1] != 0.) { + return ret_val; + } + } + } } return ret_val; } /* iladlc_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/iladlr.cpp b/lib/linalg/iladlr.cpp index a301b66170..a68f2a665e 100644 --- a/lib/linalg/iladlr.cpp +++ b/lib/linalg/iladlr.cpp @@ -1,13 +1,13 @@ /* fortran/iladlr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -128,24 +128,24 @@ integer iladlr_(integer *m, integer *n, doublereal *a, integer *lda) /* Function Body */ if (*m == 0) { - ret_val = *m; + ret_val = *m; } else if (a[*m + a_dim1] != 0. || a[*m + *n * a_dim1] != 0.) { - ret_val = *m; + ret_val = *m; } else { /* Scan up each column tracking the last zero row seen. */ - ret_val = 0; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__ = *m; - while(a[max(i__,1) + j * a_dim1] == 0. && i__ >= 1) { - --i__; - } - ret_val = max(ret_val,i__); - } + ret_val = 0; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__ = *m; + while(a[max(i__,1) + j * a_dim1] == 0. && i__ >= 1) { + --i__; + } + ret_val = max(ret_val,i__); + } } return ret_val; } /* iladlr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/ilaenv.cpp b/lib/linalg/ilaenv.cpp index 0e9a051222..6c94f00e6f 100644 --- a/lib/linalg/ilaenv.cpp +++ b/lib/linalg/ilaenv.cpp @@ -1,13 +1,13 @@ /* fortran/ilaenv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -185,9 +185,9 @@ f"> */ /* > \endverbatim */ /* > */ /* ===================================================================== */ -integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, - integer *n2, integer *n3, integer *n4, ftnlen name_len, ftnlen - opts_len) +integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, + integer *n2, integer *n3, integer *n4, ftnlen name_len, ftnlen + opts_len) { /* System generated locals */ integer ret_val, i__1, i__2, i__3; @@ -206,8 +206,8 @@ integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, logical sname; extern integer ieeeck_(integer *, real *, real *); char subnam[16]; - extern integer iparmq_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern integer iparmq_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); /* -- LAPACK auxiliary routine -- */ @@ -228,23 +228,23 @@ integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, /* .. Executable Statements .. */ switch (*ispec) { - case 1: goto L10; - case 2: goto L10; - case 3: goto L10; - case 4: goto L80; - case 5: goto L90; - case 6: goto L100; - case 7: goto L110; - case 8: goto L120; - case 9: goto L130; - case 10: goto L140; - case 11: goto L150; - case 12: goto L160; - case 13: goto L160; - case 14: goto L160; - case 15: goto L160; - case 16: goto L160; - case 17: goto L160; + case 1: goto L10; + case 2: goto L10; + case 3: goto L10; + case 4: goto L80; + case 5: goto L90; + case 6: goto L100; + case 7: goto L110; + case 8: goto L120; + case 9: goto L130; + case 10: goto L140; + case 11: goto L150; + case 12: goto L160; + case 13: goto L160; + case 14: goto L160; + case 15: goto L160; + case 16: goto L160; + case 17: goto L160; } /* Invalid value for ISPEC */ @@ -264,66 +264,66 @@ L10: /* ASCII character set */ - if (ic >= 97 && ic <= 122) { - *(unsigned char *)subnam = (char) (ic - 32); - for (i__ = 2; i__ <= 6; ++i__) { - ic = *(unsigned char *)&subnam[i__ - 1]; - if (ic >= 97 && ic <= 122) { - *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); - } + if (ic >= 97 && ic <= 122) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 97 && ic <= 122) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } /* L20: */ - } - } + } + } } else if (iz == 233 || iz == 169) { /* EBCDIC character set */ - if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 && - ic <= 169) { - *(unsigned char *)subnam = (char) (ic + 64); - for (i__ = 2; i__ <= 6; ++i__) { - ic = *(unsigned char *)&subnam[i__ - 1]; - if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= - 162 && ic <= 169) { - *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); - } + if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 && + ic <= 169) { + *(unsigned char *)subnam = (char) (ic + 64); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= + 162 && ic <= 169) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); + } /* L30: */ - } - } + } + } } else if (iz == 218 || iz == 250) { /* Prime machines: ASCII+128 */ - if (ic >= 225 && ic <= 250) { - *(unsigned char *)subnam = (char) (ic - 32); - for (i__ = 2; i__ <= 6; ++i__) { - ic = *(unsigned char *)&subnam[i__ - 1]; - if (ic >= 225 && ic <= 250) { - *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); - } + if (ic >= 225 && ic <= 250) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 225 && ic <= 250) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } /* L40: */ - } - } + } + } } *(unsigned char *)c1 = *(unsigned char *)subnam; sname = *(unsigned char *)c1 == 'S' || *(unsigned char *)c1 == 'D'; cname = *(unsigned char *)c1 == 'C' || *(unsigned char *)c1 == 'Z'; if (! (cname || sname)) { - return ret_val; + return ret_val; } s_copy(c2, subnam + 1, (ftnlen)2, (ftnlen)2); s_copy(c3, subnam + 3, (ftnlen)3, (ftnlen)3); s_copy(c4, c3 + 1, (ftnlen)2, (ftnlen)2); twostage = i_len(subnam, (ftnlen)16) >= 11 && *(unsigned char *)&subnam[ - 10] == '2'; + 10] == '2'; switch (*ispec) { - case 1: goto L50; - case 2: goto L60; - case 3: goto L70; + case 1: goto L50; + case 2: goto L60; + case 3: goto L70; } L50: @@ -340,260 +340,260 @@ L50: /* This is for *LAORHR_GETRFNP routine */ - if (sname) { - nb = 32; - } else { - nb = 32; - } + if (sname) { + nb = 32; + } else { + nb = 32; + } } else if (s_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nb = 64; - } else { - nb = 64; - } - } else if (s_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, - (char *)"RQF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"LQF", (ftnlen) - 3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) - == 0) { - if (sname) { - nb = 32; - } else { - nb = 32; - } - } else if (s_cmp(c3, (char *)"QR ", (ftnlen)3, (ftnlen)3) == 0) { - if (*n3 == 1) { - if (sname) { + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (s_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, + (char *)"RQF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"LQF", (ftnlen) + 3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) + == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, (char *)"QR ", (ftnlen)3, (ftnlen)3) == 0) { + if (*n3 == 1) { + if (sname) { /* M*N */ - if (*n1 * *n2 <= 131072 || *n1 <= 8192) { - nb = *n1; - } else { - nb = 32768 / *n2; - } - } else { - if (*n1 * *n2 <= 131072 || *n1 <= 8192) { - nb = *n1; - } else { - nb = 32768 / *n2; - } - } - } else { - if (sname) { - nb = 1; - } else { - nb = 1; - } - } - } else if (s_cmp(c3, (char *)"LQ ", (ftnlen)3, (ftnlen)3) == 0) { - if (*n3 == 2) { - if (sname) { + if (*n1 * *n2 <= 131072 || *n1 <= 8192) { + nb = *n1; + } else { + nb = 32768 / *n2; + } + } else { + if (*n1 * *n2 <= 131072 || *n1 <= 8192) { + nb = *n1; + } else { + nb = 32768 / *n2; + } + } + } else { + if (sname) { + nb = 1; + } else { + nb = 1; + } + } + } else if (s_cmp(c3, (char *)"LQ ", (ftnlen)3, (ftnlen)3) == 0) { + if (*n3 == 2) { + if (sname) { /* M*N */ - if (*n1 * *n2 <= 131072 || *n1 <= 8192) { - nb = *n1; - } else { - nb = 32768 / *n2; - } - } else { - if (*n1 * *n2 <= 131072 || *n1 <= 8192) { - nb = *n1; - } else { - nb = 32768 / *n2; - } - } - } else { - if (sname) { - nb = 1; - } else { - nb = 1; - } - } - } else if (s_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nb = 32; - } else { - nb = 32; - } - } else if (s_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nb = 32; - } else { - nb = 32; - } - } else if (s_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nb = 64; - } else { - nb = 64; - } - } + if (*n1 * *n2 <= 131072 || *n1 <= 8192) { + nb = *n1; + } else { + nb = 32768 / *n2; + } + } else { + if (*n1 * *n2 <= 131072 || *n1 <= 8192) { + nb = *n1; + } else { + nb = 32768 / *n2; + } + } + } else { + if (sname) { + nb = 1; + } else { + nb = 1; + } + } + } else if (s_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } else if (s_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } } else if (s_cmp(c2, (char *)"PO", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nb = 64; - } else { - nb = 64; - } - } + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } } else if (s_cmp(c2, (char *)"SY", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - if (twostage) { - nb = 192; - } else { - nb = 64; - } - } else { - if (twostage) { - nb = 192; - } else { - nb = 64; - } - } - } else if (sname && s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { - nb = 32; - } else if (sname && s_cmp(c3, (char *)"GST", (ftnlen)3, (ftnlen)3) == 0) { - nb = 64; - } + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + if (twostage) { + nb = 192; + } else { + nb = 64; + } + } else { + if (twostage) { + nb = 192; + } else { + nb = 64; + } + } + } else if (sname && s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + nb = 32; + } else if (sname && s_cmp(c3, (char *)"GST", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } } else if (cname && s_cmp(c2, (char *)"HE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { - if (twostage) { - nb = 192; - } else { - nb = 64; - } - } else if (s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { - nb = 32; - } else if (s_cmp(c3, (char *)"GST", (ftnlen)3, (ftnlen)3) == 0) { - nb = 64; - } + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (twostage) { + nb = 192; + } else { + nb = 64; + } + } else if (s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + nb = 32; + } else if (s_cmp(c3, (char *)"GST", (ftnlen)3, (ftnlen)3) == 0) { + nb = 64; + } } else if (sname && s_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { - if (*(unsigned char *)c3 == 'G') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { - nb = 32; - } - } else if (*(unsigned char *)c3 == 'M') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { - nb = 32; - } - } + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } } else if (cname && s_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { - if (*(unsigned char *)c3 == 'G') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { - nb = 32; - } - } else if (*(unsigned char *)c3 == 'M') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { - nb = 32; - } - } + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nb = 32; + } + } } else if (s_cmp(c2, (char *)"GB", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - if (*n4 <= 64) { - nb = 1; - } else { - nb = 32; - } - } else { - if (*n4 <= 64) { - nb = 1; - } else { - nb = 32; - } - } - } + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + if (*n4 <= 64) { + nb = 1; + } else { + nb = 32; + } + } else { + if (*n4 <= 64) { + nb = 1; + } else { + nb = 32; + } + } + } } else if (s_cmp(c2, (char *)"PB", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - if (*n2 <= 64) { - nb = 1; - } else { - nb = 32; - } - } else { - if (*n2 <= 64) { - nb = 1; - } else { - nb = 32; - } - } - } + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + if (*n2 <= 64) { + nb = 1; + } else { + nb = 32; + } + } else { + if (*n2 <= 64) { + nb = 1; + } else { + nb = 32; + } + } + } } else if (s_cmp(c2, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nb = 64; - } else { - nb = 64; - } - } else if (s_cmp(c3, (char *)"EVC", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nb = 64; - } else { - nb = 64; - } - } else if (s_cmp(c3, (char *)"SYL", (ftnlen)3, (ftnlen)3) == 0) { + if (s_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (s_cmp(c3, (char *)"EVC", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (s_cmp(c3, (char *)"SYL", (ftnlen)3, (ftnlen)3) == 0) { /* The upper bound is to prevent overly aggressive scaling. */ - if (sname) { + if (sname) { /* Computing MIN */ /* Computing MAX */ - i__2 = 48, i__3 = (min(*n1,*n2) << 4) / 100; - i__1 = max(i__2,i__3); - nb = min(i__1,240); - } else { + i__2 = 48, i__3 = (min(*n1,*n2) << 4) / 100; + i__1 = max(i__2,i__3); + nb = min(i__1,240); + } else { /* Computing MIN */ /* Computing MAX */ - i__2 = 24, i__3 = (min(*n1,*n2) << 3) / 100; - i__1 = max(i__2,i__3); - nb = min(i__1,80); - } - } + i__2 = 24, i__3 = (min(*n1,*n2) << 3) / 100; + i__1 = max(i__2,i__3); + nb = min(i__1,80); + } + } } else if (s_cmp(c2, (char *)"LA", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"UUM", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nb = 64; - } else { - nb = 64; - } - } else if (s_cmp(c3, (char *)"TRS", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nb = 32; - } else { - nb = 32; - } - } + if (s_cmp(c3, (char *)"UUM", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 64; + } else { + nb = 64; + } + } else if (s_cmp(c3, (char *)"TRS", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } } else if (sname && s_cmp(c2, (char *)"ST", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"EBZ", (ftnlen)3, (ftnlen)3) == 0) { - nb = 1; - } + if (s_cmp(c3, (char *)"EBZ", (ftnlen)3, (ftnlen)3) == 0) { + nb = 1; + } } else if (s_cmp(c2, (char *)"GG", (ftnlen)2, (ftnlen)2) == 0) { - nb = 32; - if (s_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nb = 32; - } else { - nb = 32; - } - } + nb = 32; + if (s_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nb = 32; + } else { + nb = 32; + } + } } ret_val = nb; return ret_val; @@ -604,93 +604,93 @@ L60: nbmin = 2; if (s_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"RQF", ( - ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"LQF", (ftnlen)3, ( - ftnlen)3) == 0 || s_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) - { - if (sname) { - nbmin = 2; - } else { - nbmin = 2; - } - } else if (s_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nbmin = 2; - } else { - nbmin = 2; - } - } else if (s_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nbmin = 2; - } else { - nbmin = 2; - } - } else if (s_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nbmin = 2; - } else { - nbmin = 2; - } - } + if (s_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"RQF", ( + ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"LQF", (ftnlen)3, ( + ftnlen)3) == 0 || s_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) + { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } else if (s_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 2; + } else { + nbmin = 2; + } + } } else if (s_cmp(c2, (char *)"SY", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nbmin = 8; - } else { - nbmin = 8; - } - } else if (sname && s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { - nbmin = 2; - } + if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nbmin = 8; + } else { + nbmin = 8; + } + } else if (sname && s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + nbmin = 2; + } } else if (cname && s_cmp(c2, (char *)"HE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { - nbmin = 2; - } + if (s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + nbmin = 2; + } } else if (sname && s_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { - if (*(unsigned char *)c3 == 'G') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { - nbmin = 2; - } - } else if (*(unsigned char *)c3 == 'M') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { - nbmin = 2; - } - } + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } } else if (cname && s_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { - if (*(unsigned char *)c3 == 'G') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { - nbmin = 2; - } - } else if (*(unsigned char *)c3 == 'M') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { - nbmin = 2; - } - } + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } else if (*(unsigned char *)c3 == 'M') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nbmin = 2; + } + } } else if (s_cmp(c2, (char *)"GG", (ftnlen)2, (ftnlen)2) == 0) { - nbmin = 2; - if (s_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { - nbmin = 2; - } + nbmin = 2; + if (s_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { + nbmin = 2; + } } ret_val = nbmin; return ret_val; @@ -701,63 +701,63 @@ L70: nx = 0; if (s_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"RQF", ( - ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"LQF", (ftnlen)3, ( - ftnlen)3) == 0 || s_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) - { - if (sname) { - nx = 128; - } else { - nx = 128; - } - } else if (s_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nx = 128; - } else { - nx = 128; - } - } else if (s_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { - if (sname) { - nx = 128; - } else { - nx = 128; - } - } + if (s_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"RQF", ( + ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"LQF", (ftnlen)3, ( + ftnlen)3) == 0 || s_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) + { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } else if (s_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } else if (s_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { + if (sname) { + nx = 128; + } else { + nx = 128; + } + } } else if (s_cmp(c2, (char *)"SY", (ftnlen)2, (ftnlen)2) == 0) { - if (sname && s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { - nx = 32; - } + if (sname && s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + nx = 32; + } } else if (cname && s_cmp(c2, (char *)"HE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { - nx = 32; - } + if (s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + nx = 32; + } } else if (sname && s_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { - if (*(unsigned char *)c3 == 'G') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { - nx = 128; - } - } + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nx = 128; + } + } } else if (cname && s_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { - if (*(unsigned char *)c3 == 'G') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { - nx = 128; - } - } + if (*(unsigned char *)c3 == 'G') { + if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + ftnlen)2, (ftnlen)2) == 0) { + nx = 128; + } + } } else if (s_cmp(c2, (char *)"GG", (ftnlen)2, (ftnlen)2) == 0) { - nx = 128; - if (s_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { - nx = 128; - } + nx = 128; + if (s_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { + nx = 128; + } } ret_val = nx; return ret_val; @@ -813,7 +813,7 @@ L140: /* ILAENV = 0 */ ret_val = 1; if (ret_val == 1) { - ret_val = ieeeck_(&c__1, &c_b176, &c_b177); + ret_val = ieeeck_(&c__1, &c_b176, &c_b177); } return ret_val; @@ -824,7 +824,7 @@ L150: /* ILAENV = 0 */ ret_val = 1; if (ret_val == 1) { - ret_val = ieeeck_(&c__0, &c_b176, &c_b177); + ret_val = ieeeck_(&c__0, &c_b176, &c_b177); } return ret_val; @@ -833,7 +833,7 @@ L160: /* 12 <= ISPEC <= 17: xHSEQR or related subroutines. */ ret_val = iparmq_(ispec, name__, opts, n1, n2, n3, n4, name_len, opts_len) - ; + ; return ret_val; /* End of ILAENV */ @@ -841,5 +841,5 @@ L160: } /* ilaenv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/ilazlc.cpp b/lib/linalg/ilazlc.cpp index 309c9e5edb..eb3f9ed604 100644 --- a/lib/linalg/ilazlc.cpp +++ b/lib/linalg/ilazlc.cpp @@ -1,13 +1,13 @@ /* fortran/ilazlc.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -128,29 +128,29 @@ integer ilazlc_(integer *m, integer *n, doublecomplex *a, integer *lda) /* Function Body */ if (*n == 0) { - ret_val = *n; + ret_val = *n; } else /* if(complicated condition) */ { - i__1 = *n * a_dim1 + 1; - i__2 = *m + *n * a_dim1; - if (a[i__1].r != 0. || a[i__1].i != 0. || (a[i__2].r != 0. || a[i__2] - .i != 0.)) { - ret_val = *n; - } else { + i__1 = *n * a_dim1 + 1; + i__2 = *m + *n * a_dim1; + if (a[i__1].r != 0. || a[i__1].i != 0. || (a[i__2].r != 0. || a[i__2] + .i != 0.)) { + ret_val = *n; + } else { /* Now scan each column from the end, returning with the first non-zero. */ - for (ret_val = *n; ret_val >= 1; --ret_val) { - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__ + ret_val * a_dim1; - if (a[i__2].r != 0. || a[i__2].i != 0.) { - return ret_val; - } - } - } - } + for (ret_val = *n; ret_val >= 1; --ret_val) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + ret_val * a_dim1; + if (a[i__2].r != 0. || a[i__2].i != 0.) { + return ret_val; + } + } + } + } } return ret_val; } /* ilazlc_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/ilazlr.cpp b/lib/linalg/ilazlr.cpp index 8ca4fd8029..ebef3fa0e1 100644 --- a/lib/linalg/ilazlr.cpp +++ b/lib/linalg/ilazlr.cpp @@ -1,13 +1,13 @@ /* fortran/ilazlr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -128,32 +128,32 @@ integer ilazlr_(integer *m, integer *n, doublecomplex *a, integer *lda) /* Function Body */ if (*m == 0) { - ret_val = *m; + ret_val = *m; } else /* if(complicated condition) */ { - i__1 = *m + a_dim1; - i__2 = *m + *n * a_dim1; - if (a[i__1].r != 0. || a[i__1].i != 0. || (a[i__2].r != 0. || a[i__2] - .i != 0.)) { - ret_val = *m; - } else { + i__1 = *m + a_dim1; + i__2 = *m + *n * a_dim1; + if (a[i__1].r != 0. || a[i__1].i != 0. || (a[i__2].r != 0. || a[i__2] + .i != 0.)) { + ret_val = *m; + } else { /* Scan up each column tracking the last zero row seen. */ - ret_val = 0; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__ = *m; - for(;;) { /* while(complicated condition) */ - i__2 = max(i__,1) + j * a_dim1; - if (!(a[i__2].r == 0. && a[i__2].i == 0. && i__ >= 1)) - break; - --i__; - } - ret_val = max(ret_val,i__); - } - } + ret_val = 0; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__ = *m; + for(;;) { /* while(complicated condition) */ + i__2 = max(i__,1) + j * a_dim1; + if (!(a[i__2].r == 0. && a[i__2].i == 0. && i__ >= 1)) + break; + --i__; + } + ret_val = max(ret_val,i__); + } + } } return ret_val; } /* ilazlr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/iparmq.cpp b/lib/linalg/iparmq.cpp index 12f3b7f7f6..ad22d9f869 100644 --- a/lib/linalg/iparmq.cpp +++ b/lib/linalg/iparmq.cpp @@ -1,13 +1,13 @@ /* fortran/iparmq.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -246,8 +246,8 @@ f"> */ /* > \endverbatim */ /* > */ /* ===================================================================== */ -integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer - *ilo, integer *ihi, integer *lwork, ftnlen name_len, ftnlen opts_len) +integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer + *ilo, integer *ihi, integer *lwork, ftnlen name_len, ftnlen opts_len) { /* System generated locals */ integer ret_val, i__1, i__2; @@ -282,32 +282,32 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer /* ==== Set the number simultaneous shifts ==== */ - nh = *ihi - *ilo + 1; - ns = 2; - if (nh >= 30) { - ns = 4; - } - if (nh >= 60) { - ns = 10; - } - if (nh >= 150) { + nh = *ihi - *ilo + 1; + ns = 2; + if (nh >= 30) { + ns = 4; + } + if (nh >= 60) { + ns = 10; + } + if (nh >= 150) { /* Computing MAX */ - r__1 = log((real) nh) / log((float)2.); - i__1 = 10, i__2 = nh / i_nint(&r__1); - ns = max(i__1,i__2); - } - if (nh >= 590) { - ns = 64; - } - if (nh >= 3000) { - ns = 128; - } - if (nh >= 6000) { - ns = 256; - } + r__1 = log((real) nh) / log((float)2.); + i__1 = 10, i__2 = nh / i_nint(&r__1); + ns = max(i__1,i__2); + } + if (nh >= 590) { + ns = 64; + } + if (nh >= 3000) { + ns = 128; + } + if (nh >= 6000) { + ns = 256; + } /* Computing MAX */ - i__1 = 2, i__2 = ns - ns % 2; - ns = max(i__1,i__2); + i__1 = 2, i__2 = ns - ns % 2; + ns = max(i__1,i__2); } if (*ispec == 12) { @@ -317,7 +317,7 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer /* . to xLAHQR, the classic double shift algorithm. */ /* . This must be at least 11. ==== */ - ret_val = 75; + ret_val = 75; } else if (*ispec == 14) { @@ -325,23 +325,23 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer /* . whenever aggressive early deflation finds */ /* . at least (NIBBLE*(window size)/100) deflations. ==== */ - ret_val = 14; + ret_val = 14; } else if (*ispec == 15) { /* ==== NSHFTS: The number of simultaneous shifts ===== */ - ret_val = ns; + ret_val = ns; } else if (*ispec == 13) { /* ==== NW: deflation window size. ==== */ - if (nh <= 500) { - ret_val = ns; - } else { - ret_val = ns * 3 / 2; - } + if (nh <= 500) { + ret_val = ns; + } else { + ret_val = ns * 3 / 2; + } } else if (*ispec == 16) { @@ -355,87 +355,87 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer /* Convert NAME to upper case if the first character is lower case. */ - ret_val = 0; - s_copy(subnam, name__, (ftnlen)6, name_len); - ic = *(unsigned char *)subnam; - iz = 'Z'; - if (iz == 90 || iz == 122) { + ret_val = 0; + s_copy(subnam, name__, (ftnlen)6, name_len); + ic = *(unsigned char *)subnam; + iz = 'Z'; + if (iz == 90 || iz == 122) { /* ASCII character set */ - if (ic >= 97 && ic <= 122) { - *(unsigned char *)subnam = (char) (ic - 32); - for (i__ = 2; i__ <= 6; ++i__) { - ic = *(unsigned char *)&subnam[i__ - 1]; - if (ic >= 97 && ic <= 122) { - *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); - } - } - } + if (ic >= 97 && ic <= 122) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 97 && ic <= 122) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } + } + } - } else if (iz == 233 || iz == 169) { + } else if (iz == 233 || iz == 169) { /* EBCDIC character set */ - if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 - && ic <= 169) { - *(unsigned char *)subnam = (char) (ic + 64); - for (i__ = 2; i__ <= 6; ++i__) { - ic = *(unsigned char *)&subnam[i__ - 1]; - if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || - ic >= 162 && ic <= 169) { - *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); - } - } - } + if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 + && ic <= 169) { + *(unsigned char *)subnam = (char) (ic + 64); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || + ic >= 162 && ic <= 169) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); + } + } + } - } else if (iz == 218 || iz == 250) { + } else if (iz == 218 || iz == 250) { /* Prime machines: ASCII+128 */ - if (ic >= 225 && ic <= 250) { - *(unsigned char *)subnam = (char) (ic - 32); - for (i__ = 2; i__ <= 6; ++i__) { - ic = *(unsigned char *)&subnam[i__ - 1]; - if (ic >= 225 && ic <= 250) { - *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); - } - } - } - } + if (ic >= 225 && ic <= 250) { + *(unsigned char *)subnam = (char) (ic - 32); + for (i__ = 2; i__ <= 6; ++i__) { + ic = *(unsigned char *)&subnam[i__ - 1]; + if (ic >= 225 && ic <= 250) { + *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + } + } + } + } - if (s_cmp(subnam + 1, (char *)"GGHRD", (ftnlen)5, (ftnlen)5) == 0 || s_cmp( - subnam + 1, (char *)"GGHD3", (ftnlen)5, (ftnlen)5) == 0) { - ret_val = 1; - if (nh >= 14) { - ret_val = 2; - } - } else if (s_cmp(subnam + 3, (char *)"EXC", (ftnlen)3, (ftnlen)3) == 0) { - if (nh >= 14) { - ret_val = 1; - } - if (nh >= 14) { - ret_val = 2; - } - } else if (s_cmp(subnam + 1, (char *)"HSEQR", (ftnlen)5, (ftnlen)5) == 0 || - s_cmp(subnam + 1, (char *)"LAQR", (ftnlen)4, (ftnlen)4) == 0) { - if (ns >= 14) { - ret_val = 1; - } - if (ns >= 14) { - ret_val = 2; - } - } + if (s_cmp(subnam + 1, (char *)"GGHRD", (ftnlen)5, (ftnlen)5) == 0 || s_cmp( + subnam + 1, (char *)"GGHD3", (ftnlen)5, (ftnlen)5) == 0) { + ret_val = 1; + if (nh >= 14) { + ret_val = 2; + } + } else if (s_cmp(subnam + 3, (char *)"EXC", (ftnlen)3, (ftnlen)3) == 0) { + if (nh >= 14) { + ret_val = 1; + } + if (nh >= 14) { + ret_val = 2; + } + } else if (s_cmp(subnam + 1, (char *)"HSEQR", (ftnlen)5, (ftnlen)5) == 0 || + s_cmp(subnam + 1, (char *)"LAQR", (ftnlen)4, (ftnlen)4) == 0) { + if (ns >= 14) { + ret_val = 1; + } + if (ns >= 14) { + ret_val = 2; + } + } } else if (*ispec == 17) { /* === Relative cost of near-the-diagonal chase vs */ /* BLAS updates === */ - ret_val = 10; + ret_val = 10; } else { /* ===== invalid value of ispec ===== */ - ret_val = -1; + ret_val = -1; } @@ -445,5 +445,5 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer } /* iparmq_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/lmp_f2c.h b/lib/linalg/lmp_f2c.h index 0b1ebac99c..7483a147ea 100644 --- a/lib/linalg/lmp_f2c.h +++ b/lib/linalg/lmp_f2c.h @@ -2,7 +2,7 @@ /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." - - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ + - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ #ifndef F2C_INCLUDE #define F2C_INCLUDE @@ -19,11 +19,11 @@ typedef long int logical; typedef short int shortlogical; typedef char logical1; typedef char integer1; -#ifdef INTEGER_STAR_8 /* Adjust for integer*8. */ -typedef long long longint; /* system-dependent */ -typedef unsigned long long ulongint; /* system-dependent */ -#define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) -#define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) +#ifdef INTEGER_STAR_8 /* Adjust for integer*8. */ +typedef long long longint; /* system-dependent */ +typedef unsigned long long ulongint; /* system-dependent */ +#define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) +#define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) #endif #define TRUE_ (1) @@ -49,109 +49,109 @@ typedef long int ftnint; /*external read, write*/ typedef struct -{ flag cierr; - ftnint ciunit; - flag ciend; - char *cifmt; - ftnint cirec; +{ flag cierr; + ftnint ciunit; + flag ciend; + char *cifmt; + ftnint cirec; } cilist; /*internal read, write*/ typedef struct -{ flag icierr; - char *iciunit; - flag iciend; - char *icifmt; - ftnint icirlen; - ftnint icirnum; +{ flag icierr; + char *iciunit; + flag iciend; + char *icifmt; + ftnint icirlen; + ftnint icirnum; } icilist; /*open*/ typedef struct -{ flag oerr; - ftnint ounit; - char *ofnm; - ftnlen ofnmlen; - char *osta; - char *oacc; - char *ofm; - ftnint orl; - char *oblnk; +{ flag oerr; + ftnint ounit; + char *ofnm; + ftnlen ofnmlen; + char *osta; + char *oacc; + char *ofm; + ftnint orl; + char *oblnk; } olist; /*close*/ typedef struct -{ flag cerr; - ftnint cunit; - char *csta; +{ flag cerr; + ftnint cunit; + char *csta; } cllist; /*rewind, backspace, endfile*/ typedef struct -{ flag aerr; - ftnint aunit; +{ flag aerr; + ftnint aunit; } alist; /* inquire */ typedef struct -{ flag inerr; - ftnint inunit; - char *infile; - ftnlen infilen; - ftnint *inex; /*parameters in standard's order*/ - ftnint *inopen; - ftnint *innum; - ftnint *innamed; - char *inname; - ftnlen innamlen; - char *inacc; - ftnlen inacclen; - char *inseq; - ftnlen inseqlen; - char *indir; - ftnlen indirlen; - char *infmt; - ftnlen infmtlen; - char *inform; - ftnint informlen; - char *inunf; - ftnlen inunflen; - ftnint *inrecl; - ftnint *innrec; - char *inblank; - ftnlen inblanklen; +{ flag inerr; + ftnint inunit; + char *infile; + ftnlen infilen; + ftnint *inex; /*parameters in standard's order*/ + ftnint *inopen; + ftnint *innum; + ftnint *innamed; + char *inname; + ftnlen innamlen; + char *inacc; + ftnlen inacclen; + char *inseq; + ftnlen inseqlen; + char *indir; + ftnlen indirlen; + char *infmt; + ftnlen infmtlen; + char *inform; + ftnint informlen; + char *inunf; + ftnlen inunflen; + ftnint *inrecl; + ftnint *innrec; + char *inblank; + ftnlen inblanklen; } inlist; #define VOID void -union Multitype { /* for multiple entry points */ - integer1 g; - shortint h; - integer i; - /* longint j; */ - real r; - doublereal d; - complex c; - doublecomplex z; - }; +union Multitype { /* for multiple entry points */ + integer1 g; + shortint h; + integer i; + /* longint j; */ + real r; + doublereal d; + complex c; + doublecomplex z; + }; typedef union Multitype Multitype; -/*typedef long int Long;*/ /* No longer used; formerly in Namelist */ +/*typedef long int Long;*/ /* No longer used; formerly in Namelist */ -struct Vardesc { /* for Namelist */ - char *name; - char *addr; - ftnlen *dims; - int type; - }; +struct Vardesc { /* for Namelist */ + char *name; + char *addr; + ftnlen *dims; + int type; + }; typedef struct Vardesc Vardesc; struct Namelist { - char *name; - Vardesc **vars; - int nvars; - }; + char *name; + Vardesc **vars; + int nvars; + }; typedef struct Namelist Namelist; #define abs(x) ((x) >= 0 ? (x) : -(x)) @@ -160,9 +160,9 @@ typedef struct Namelist Namelist; #define max(a,b) ((a) >= (b) ? (a) : (b)) #define dmin(a,b) (doublereal)min(a,b) #define dmax(a,b) (doublereal)max(a,b) -#define bit_test(a,b) ((a) >> (b) & 1) -#define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) -#define bit_set(a,b) ((a) | ((uinteger)1 << (b))) +#define bit_test(a,b) ((a) >> (b) & 1) +#define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) +#define bit_set(a,b) ((a) | ((uinteger)1 << (b))) /* procedure parameter types for -A and -C++ */ @@ -193,10 +193,10 @@ typedef /* Character */ VOID (*H_fp)(); typedef /* Subroutine */ int (*S_fp)(); #endif /* E_fp is for real functions when -R is not specified */ -typedef VOID C_f; /* complex function */ -typedef VOID H_f; /* character function */ -typedef VOID Z_f; /* double complex function */ -typedef doublereal E_f; /* real function with -R not specified */ +typedef VOID C_f; /* complex function */ +typedef VOID H_f; /* character function */ +typedef VOID Z_f; /* double complex function */ +typedef doublereal E_f; /* real function with -R not specified */ /* undef any lower-case symbols that your C compiler predefines, e.g.: */ diff --git a/lib/linalg/zaxpy.cpp b/lib/linalg/zaxpy.cpp index 2788743a40..6939872757 100644 --- a/lib/linalg/zaxpy.cpp +++ b/lib/linalg/zaxpy.cpp @@ -1,13 +1,13 @@ /* fortran/zaxpy.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -101,8 +101,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zaxpy_(integer *n, doublecomplex *za, doublecomplex *zx, - integer *incx, doublecomplex *zy, integer *incy) +/* Subroutine */ int zaxpy_(integer *n, doublecomplex *za, doublecomplex *zx, + integer *incx, doublecomplex *zy, integer *incy) { /* System generated locals */ integer i__1, i__2, i__3, i__4; @@ -134,50 +134,50 @@ extern "C" { /* Function Body */ if (*n <= 0) { - return 0; + return 0; } if (dcabs1_(za) == 0.) { - return 0; + return 0; } if (*incx == 1 && *incy == 1) { /* code for both increments equal to 1 */ - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__; - i__3 = i__; - i__4 = i__; - z__2.r = za->r * zx[i__4].r - za->i * zx[i__4].i, z__2.i = za->r * - zx[i__4].i + za->i * zx[i__4].r; - z__1.r = zy[i__3].r + z__2.r, z__1.i = zy[i__3].i + z__2.i; - zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; - } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + i__4 = i__; + z__2.r = za->r * zx[i__4].r - za->i * zx[i__4].i, z__2.i = za->r * + zx[i__4].i + za->i * zx[i__4].r; + z__1.r = zy[i__3].r + z__2.r, z__1.i = zy[i__3].i + z__2.i; + zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; + } } else { /* code for unequal increments or equal increments */ /* not equal to 1 */ - ix = 1; - iy = 1; - if (*incx < 0) { - ix = (-(*n) + 1) * *incx + 1; - } - if (*incy < 0) { - iy = (-(*n) + 1) * *incy + 1; - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = iy; - i__3 = iy; - i__4 = ix; - z__2.r = za->r * zx[i__4].r - za->i * zx[i__4].i, z__2.i = za->r * - zx[i__4].i + za->i * zx[i__4].r; - z__1.r = zy[i__3].r + z__2.r, z__1.i = zy[i__3].i + z__2.i; - zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; - ix += *incx; - iy += *incy; - } + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + i__3 = iy; + i__4 = ix; + z__2.r = za->r * zx[i__4].r - za->i * zx[i__4].i, z__2.i = za->r * + zx[i__4].i + za->i * zx[i__4].r; + z__1.r = zy[i__3].r + z__2.r, z__1.i = zy[i__3].i + z__2.i; + zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; + ix += *incx; + iy += *incy; + } } return 0; @@ -187,5 +187,5 @@ extern "C" { } /* zaxpy_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zcopy.cpp b/lib/linalg/zcopy.cpp index 357bd961a0..97d1250228 100644 --- a/lib/linalg/zcopy.cpp +++ b/lib/linalg/zcopy.cpp @@ -1,13 +1,13 @@ /* fortran/zcopy.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -94,8 +94,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zcopy_(integer *n, doublecomplex *zx, integer *incx, - doublecomplex *zy, integer *incy) +/* Subroutine */ int zcopy_(integer *n, doublecomplex *zx, integer *incx, + doublecomplex *zy, integer *incy) { /* System generated locals */ integer i__1, i__2, i__3; @@ -123,39 +123,39 @@ extern "C" { /* Function Body */ if (*n <= 0) { - return 0; + return 0; } if (*incx == 1 && *incy == 1) { /* code for both increments equal to 1 */ - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__; - i__3 = i__; - zy[i__2].r = zx[i__3].r, zy[i__2].i = zx[i__3].i; - } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + zy[i__2].r = zx[i__3].r, zy[i__2].i = zx[i__3].i; + } } else { /* code for unequal increments or equal increments */ /* not equal to 1 */ - ix = 1; - iy = 1; - if (*incx < 0) { - ix = (-(*n) + 1) * *incx + 1; - } - if (*incy < 0) { - iy = (-(*n) + 1) * *incy + 1; - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = iy; - i__3 = ix; - zy[i__2].r = zx[i__3].r, zy[i__2].i = zx[i__3].i; - ix += *incx; - iy += *incy; - } + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + i__3 = ix; + zy[i__2].r = zx[i__3].r, zy[i__2].i = zx[i__3].i; + ix += *incx; + iy += *incy; + } } return 0; @@ -164,5 +164,5 @@ extern "C" { } /* zcopy_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zdotc.cpp b/lib/linalg/zdotc.cpp index 943f923bea..e0c614e843 100644 --- a/lib/linalg/zdotc.cpp +++ b/lib/linalg/zdotc.cpp @@ -1,13 +1,13 @@ /* fortran/zdotc.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -96,8 +96,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Double Complex */ VOID zdotc_(doublecomplex * ret_val, integer *n, - doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy) +/* Double Complex */ VOID zdotc_(doublecomplex * ret_val, integer *n, + doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy) { /* System generated locals */ integer i__1, i__2; @@ -134,45 +134,45 @@ extern "C" { ztemp.r = 0., ztemp.i = 0.; ret_val->r = 0., ret_val->i = 0.; if (*n <= 0) { - return ; + return ; } if (*incx == 1 && *incy == 1) { /* code for both increments equal to 1 */ - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - d_cnjg(&z__3, &zx[i__]); - i__2 = i__; - z__2.r = z__3.r * zy[i__2].r - z__3.i * zy[i__2].i, z__2.i = - z__3.r * zy[i__2].i + z__3.i * zy[i__2].r; - z__1.r = ztemp.r + z__2.r, z__1.i = ztemp.i + z__2.i; - ztemp.r = z__1.r, ztemp.i = z__1.i; - } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + d_cnjg(&z__3, &zx[i__]); + i__2 = i__; + z__2.r = z__3.r * zy[i__2].r - z__3.i * zy[i__2].i, z__2.i = + z__3.r * zy[i__2].i + z__3.i * zy[i__2].r; + z__1.r = ztemp.r + z__2.r, z__1.i = ztemp.i + z__2.i; + ztemp.r = z__1.r, ztemp.i = z__1.i; + } } else { /* code for unequal increments or equal increments */ /* not equal to 1 */ - ix = 1; - iy = 1; - if (*incx < 0) { - ix = (-(*n) + 1) * *incx + 1; - } - if (*incy < 0) { - iy = (-(*n) + 1) * *incy + 1; - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - d_cnjg(&z__3, &zx[ix]); - i__2 = iy; - z__2.r = z__3.r * zy[i__2].r - z__3.i * zy[i__2].i, z__2.i = - z__3.r * zy[i__2].i + z__3.i * zy[i__2].r; - z__1.r = ztemp.r + z__2.r, z__1.i = ztemp.i + z__2.i; - ztemp.r = z__1.r, ztemp.i = z__1.i; - ix += *incx; - iy += *incy; - } + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + d_cnjg(&z__3, &zx[ix]); + i__2 = iy; + z__2.r = z__3.r * zy[i__2].r - z__3.i * zy[i__2].i, z__2.i = + z__3.r * zy[i__2].i + z__3.i * zy[i__2].r; + z__1.r = ztemp.r + z__2.r, z__1.i = ztemp.i + z__2.i; + ztemp.r = z__1.r, ztemp.i = z__1.i; + ix += *incx; + iy += *incy; + } } ret_val->r = ztemp.r, ret_val->i = ztemp.i; return ; @@ -182,5 +182,5 @@ extern "C" { } /* zdotc_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zdrot.cpp b/lib/linalg/zdrot.cpp index c6ec16b053..e4c66f5480 100644 --- a/lib/linalg/zdrot.cpp +++ b/lib/linalg/zdrot.cpp @@ -1,13 +1,13 @@ /* fortran/zdrot.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -111,8 +111,8 @@ extern "C" { /* > \ingroup complex16_blas_level1 */ /* ===================================================================== */ -/* Subroutine */ int zdrot_(integer *n, doublecomplex *zx, integer *incx, - doublecomplex *zy, integer *incy, doublereal *c__, doublereal *s) +/* Subroutine */ int zdrot_(integer *n, doublecomplex *zx, integer *incx, + doublecomplex *zy, integer *incy, doublereal *c__, doublereal *s) { /* System generated locals */ integer i__1, i__2, i__3, i__4; @@ -144,63 +144,63 @@ extern "C" { /* Function Body */ if (*n <= 0) { - return 0; + return 0; } if (*incx == 1 && *incy == 1) { /* code for both increments equal to 1 */ - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__; - z__2.r = *c__ * zx[i__2].r, z__2.i = *c__ * zx[i__2].i; - i__3 = i__; - z__3.r = *s * zy[i__3].r, z__3.i = *s * zy[i__3].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - ctemp.r = z__1.r, ctemp.i = z__1.i; - i__2 = i__; - i__3 = i__; - z__2.r = *c__ * zy[i__3].r, z__2.i = *c__ * zy[i__3].i; - i__4 = i__; - z__3.r = *s * zx[i__4].r, z__3.i = *s * zx[i__4].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; - zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; - i__2 = i__; - zx[i__2].r = ctemp.r, zx[i__2].i = ctemp.i; - } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + z__2.r = *c__ * zx[i__2].r, z__2.i = *c__ * zx[i__2].i; + i__3 = i__; + z__3.r = *s * zy[i__3].r, z__3.i = *s * zy[i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + ctemp.r = z__1.r, ctemp.i = z__1.i; + i__2 = i__; + i__3 = i__; + z__2.r = *c__ * zy[i__3].r, z__2.i = *c__ * zy[i__3].i; + i__4 = i__; + z__3.r = *s * zx[i__4].r, z__3.i = *s * zx[i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; + zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; + i__2 = i__; + zx[i__2].r = ctemp.r, zx[i__2].i = ctemp.i; + } } else { /* code for unequal increments or equal increments not equal */ /* to 1 */ - ix = 1; - iy = 1; - if (*incx < 0) { - ix = (-(*n) + 1) * *incx + 1; - } - if (*incy < 0) { - iy = (-(*n) + 1) * *incy + 1; - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = ix; - z__2.r = *c__ * zx[i__2].r, z__2.i = *c__ * zx[i__2].i; - i__3 = iy; - z__3.r = *s * zy[i__3].r, z__3.i = *s * zy[i__3].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - ctemp.r = z__1.r, ctemp.i = z__1.i; - i__2 = iy; - i__3 = iy; - z__2.r = *c__ * zy[i__3].r, z__2.i = *c__ * zy[i__3].i; - i__4 = ix; - z__3.r = *s * zx[i__4].r, z__3.i = *s * zx[i__4].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; - zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; - i__2 = ix; - zx[i__2].r = ctemp.r, zx[i__2].i = ctemp.i; - ix += *incx; - iy += *incy; - } + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ix; + z__2.r = *c__ * zx[i__2].r, z__2.i = *c__ * zx[i__2].i; + i__3 = iy; + z__3.r = *s * zy[i__3].r, z__3.i = *s * zy[i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + ctemp.r = z__1.r, ctemp.i = z__1.i; + i__2 = iy; + i__3 = iy; + z__2.r = *c__ * zy[i__3].r, z__2.i = *c__ * zy[i__3].i; + i__4 = ix; + z__3.r = *s * zx[i__4].r, z__3.i = *s * zx[i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; + zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; + i__2 = ix; + zx[i__2].r = ctemp.r, zx[i__2].i = ctemp.i; + ix += *incx; + iy += *incy; + } } return 0; @@ -209,5 +209,5 @@ extern "C" { } /* zdrot_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zdscal.cpp b/lib/linalg/zdscal.cpp index c7c6406782..fd444bdf71 100644 --- a/lib/linalg/zdscal.cpp +++ b/lib/linalg/zdscal.cpp @@ -1,13 +1,13 @@ /* fortran/zdscal.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -91,8 +91,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zdscal_(integer *n, doublereal *da, doublecomplex *zx, - integer *incx) +/* Subroutine */ int zdscal_(integer *n, doublereal *da, doublecomplex *zx, + integer *incx) { /* System generated locals */ integer i__1, i__2, i__3, i__4; @@ -127,36 +127,36 @@ extern "C" { /* Function Body */ if (*n <= 0 || *incx <= 0 || *da == 1.) { - return 0; + return 0; } if (*incx == 1) { /* code for increment equal to 1 */ - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__; - i__3 = i__; - d__1 = *da * zx[i__3].r; - d__2 = *da * d_imag(&zx[i__]); - z__1.r = d__1, z__1.i = d__2; - zx[i__2].r = z__1.r, zx[i__2].i = z__1.i; - } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + d__1 = *da * zx[i__3].r; + d__2 = *da * d_imag(&zx[i__]); + z__1.r = d__1, z__1.i = d__2; + zx[i__2].r = z__1.r, zx[i__2].i = z__1.i; + } } else { /* code for increment not equal to 1 */ - nincx = *n * *incx; - i__1 = nincx; - i__2 = *incx; - for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { - i__3 = i__; - i__4 = i__; - d__1 = *da * zx[i__4].r; - d__2 = *da * d_imag(&zx[i__]); - z__1.r = d__1, z__1.i = d__2; - zx[i__3].r = z__1.r, zx[i__3].i = z__1.i; - } + nincx = *n * *incx; + i__1 = nincx; + i__2 = *incx; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__3 = i__; + i__4 = i__; + d__1 = *da * zx[i__4].r; + d__2 = *da * d_imag(&zx[i__]); + z__1.r = d__1, z__1.i = d__2; + zx[i__3].r = z__1.r, zx[i__3].i = z__1.i; + } } return 0; @@ -165,5 +165,5 @@ extern "C" { } /* zdscal_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zgemm.cpp b/lib/linalg/zgemm.cpp index 92434e720f..53020bef2d 100644 --- a/lib/linalg/zgemm.cpp +++ b/lib/linalg/zgemm.cpp @@ -1,13 +1,13 @@ /* fortran/zgemm.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -201,13 +201,13 @@ extern "C" { /* > */ /* ===================================================================== */ /* Subroutine */ int zgemm_(char *transa, char *transb, integer *m, integer * - n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, - doublecomplex *b, integer *ldb, doublecomplex *beta, doublecomplex * - c__, integer *ldc, ftnlen transa_len, ftnlen transb_len) + n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, + doublecomplex *b, integer *ldb, doublecomplex *beta, doublecomplex * + c__, integer *ldc, ftnlen transa_len, ftnlen transb_len) { /* System generated locals */ - integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, - i__3, i__4, i__5, i__6; + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3, i__4, i__5, i__6; doublecomplex z__1, z__2, z__3, z__4; /* Builtin functions */ @@ -267,489 +267,489 @@ extern "C" { conja = lsame_(transa, (char *)"C", (ftnlen)1, (ftnlen)1); conjb = lsame_(transb, (char *)"C", (ftnlen)1, (ftnlen)1); if (nota) { - nrowa = *m; + nrowa = *m; } else { - nrowa = *k; + nrowa = *k; } if (notb) { - nrowb = *k; + nrowb = *k; } else { - nrowb = *n; + nrowb = *n; } /* Test the input parameters. */ info = 0; if (! nota && ! conja && ! lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1)) { - info = 1; + info = 1; } else if (! notb && ! conjb && ! lsame_(transb, (char *)"T", (ftnlen)1, (ftnlen) - 1)) { - info = 2; + 1)) { + info = 2; } else if (*m < 0) { - info = 3; + info = 3; } else if (*n < 0) { - info = 4; + info = 4; } else if (*k < 0) { - info = 5; + info = 5; } else if (*lda < max(1,nrowa)) { - info = 8; + info = 8; } else if (*ldb < max(1,nrowb)) { - info = 10; + info = 10; } else if (*ldc < max(1,*m)) { - info = 13; + info = 13; } if (info != 0) { - xerbla_((char *)"ZGEMM ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"ZGEMM ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || (alpha->r == 0. && alpha->i == 0. || *k == 0) && - (beta->r == 1. && beta->i == 0.)) { - return 0; + (beta->r == 1. && beta->i == 0.)) { + return 0; } /* And when alpha.eq.zero. */ if (alpha->r == 0. && alpha->i == 0.) { - if (beta->r == 0. && beta->i == 0.) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - c__[i__3].r = 0., c__[i__3].i = 0.; + if (beta->r == 0. && beta->i == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; /* L10: */ - } + } /* L20: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, - z__1.i = beta->r * c__[i__4].i + beta->i * c__[ - i__4].r; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__1.i = beta->r * c__[i__4].i + beta->i * c__[ + i__4].r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L30: */ - } + } /* L40: */ - } - } - return 0; + } + } + return 0; } /* Start the operations. */ if (notb) { - if (nota) { + if (nota) { /* Form C := alpha*A*B + beta*C. */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (beta->r == 0. && beta->i == 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - c__[i__3].r = 0., c__[i__3].i = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (beta->r == 0. && beta->i == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; /* L50: */ - } - } else if (beta->r != 1. || beta->i != 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__1.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } else if (beta->r != 1. || beta->i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__1.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L60: */ - } - } - i__2 = *k; - for (l = 1; l <= i__2; ++l) { - i__3 = l + j * b_dim1; - z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, - z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3] - .r; - temp.r = z__1.r, temp.i = z__1.i; - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - i__4 = i__ + j * c_dim1; - i__5 = i__ + j * c_dim1; - i__6 = i__ + l * a_dim1; - z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, - z__2.i = temp.r * a[i__6].i + temp.i * a[i__6] - .r; - z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + - z__2.i; - c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + i__3 = l + j * b_dim1; + z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, + z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3] + .r; + temp.r = z__1.r, temp.i = z__1.i; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + l * a_dim1; + z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, + z__2.i = temp.r * a[i__6].i + temp.i * a[i__6] + .r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + + z__2.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; /* L70: */ - } + } /* L80: */ - } + } /* L90: */ - } - } else if (conja) { + } + } else if (conja) { /* Form C := alpha*A**H*B + beta*C. */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp.r = 0., temp.i = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - d_cnjg(&z__3, &a[l + i__ * a_dim1]); - i__4 = l + j * b_dim1; - z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, - z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] - .r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + d_cnjg(&z__3, &a[l + i__ * a_dim1]); + i__4 = l + j * b_dim1; + z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] + .r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L100: */ - } - if (beta->r == 0. && beta->i == 0.) { - i__3 = i__ + j * c_dim1; - z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } else { - i__3 = i__ + j * c_dim1; - z__2.r = alpha->r * temp.r - alpha->i * temp.i, - z__2.i = alpha->r * temp.i + alpha->i * - temp.r; - i__4 = i__ + j * c_dim1; - z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__3.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * + temp.r; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__3.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } /* L110: */ - } + } /* L120: */ - } - } else { + } + } else { /* Form C := alpha*A**T*B + beta*C */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp.r = 0., temp.i = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - i__4 = l + i__ * a_dim1; - i__5 = l + j * b_dim1; - z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * b[i__5] - .i, z__2.i = a[i__4].r * b[i__5].i + a[i__4] - .i * b[i__5].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + i__4 = l + i__ * a_dim1; + i__5 = l + j * b_dim1; + z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * b[i__5] + .i, z__2.i = a[i__4].r * b[i__5].i + a[i__4] + .i * b[i__5].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L130: */ - } - if (beta->r == 0. && beta->i == 0.) { - i__3 = i__ + j * c_dim1; - z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } else { - i__3 = i__ + j * c_dim1; - z__2.r = alpha->r * temp.r - alpha->i * temp.i, - z__2.i = alpha->r * temp.i + alpha->i * - temp.r; - i__4 = i__ + j * c_dim1; - z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__3.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * + temp.r; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__3.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } /* L140: */ - } + } /* L150: */ - } - } + } + } } else if (nota) { - if (conjb) { + if (conjb) { /* Form C := alpha*A*B**H + beta*C. */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (beta->r == 0. && beta->i == 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - c__[i__3].r = 0., c__[i__3].i = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (beta->r == 0. && beta->i == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; /* L160: */ - } - } else if (beta->r != 1. || beta->i != 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__1.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } else if (beta->r != 1. || beta->i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__1.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L170: */ - } - } - i__2 = *k; - for (l = 1; l <= i__2; ++l) { - d_cnjg(&z__2, &b[j + l * b_dim1]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - i__4 = i__ + j * c_dim1; - i__5 = i__ + j * c_dim1; - i__6 = i__ + l * a_dim1; - z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, - z__2.i = temp.r * a[i__6].i + temp.i * a[i__6] - .r; - z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + - z__2.i; - c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + d_cnjg(&z__2, &b[j + l * b_dim1]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + l * a_dim1; + z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, + z__2.i = temp.r * a[i__6].i + temp.i * a[i__6] + .r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + + z__2.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; /* L180: */ - } + } /* L190: */ - } + } /* L200: */ - } - } else { + } + } else { /* Form C := alpha*A*B**T + beta*C */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (beta->r == 0. && beta->i == 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - c__[i__3].r = 0., c__[i__3].i = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (beta->r == 0. && beta->i == 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; /* L210: */ - } - } else if (beta->r != 1. || beta->i != 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__1.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } else if (beta->r != 1. || beta->i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__1.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L220: */ - } - } - i__2 = *k; - for (l = 1; l <= i__2; ++l) { - i__3 = j + l * b_dim1; - z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, - z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3] - .r; - temp.r = z__1.r, temp.i = z__1.i; - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - i__4 = i__ + j * c_dim1; - i__5 = i__ + j * c_dim1; - i__6 = i__ + l * a_dim1; - z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, - z__2.i = temp.r * a[i__6].i + temp.i * a[i__6] - .r; - z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + - z__2.i; - c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; + } + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + i__3 = j + l * b_dim1; + z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, + z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3] + .r; + temp.r = z__1.r, temp.i = z__1.i; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + l * a_dim1; + z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, + z__2.i = temp.r * a[i__6].i + temp.i * a[i__6] + .r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + + z__2.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; /* L230: */ - } + } /* L240: */ - } + } /* L250: */ - } - } + } + } } else if (conja) { - if (conjb) { + if (conjb) { /* Form C := alpha*A**H*B**H + beta*C. */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp.r = 0., temp.i = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - d_cnjg(&z__3, &a[l + i__ * a_dim1]); - d_cnjg(&z__4, &b[j + l * b_dim1]); - z__2.r = z__3.r * z__4.r - z__3.i * z__4.i, z__2.i = - z__3.r * z__4.i + z__3.i * z__4.r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + d_cnjg(&z__3, &a[l + i__ * a_dim1]); + d_cnjg(&z__4, &b[j + l * b_dim1]); + z__2.r = z__3.r * z__4.r - z__3.i * z__4.i, z__2.i = + z__3.r * z__4.i + z__3.i * z__4.r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L260: */ - } - if (beta->r == 0. && beta->i == 0.) { - i__3 = i__ + j * c_dim1; - z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } else { - i__3 = i__ + j * c_dim1; - z__2.r = alpha->r * temp.r - alpha->i * temp.i, - z__2.i = alpha->r * temp.i + alpha->i * - temp.r; - i__4 = i__ + j * c_dim1; - z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__3.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * + temp.r; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__3.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } /* L270: */ - } + } /* L280: */ - } - } else { + } + } else { /* Form C := alpha*A**H*B**T + beta*C */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp.r = 0., temp.i = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - d_cnjg(&z__3, &a[l + i__ * a_dim1]); - i__4 = j + l * b_dim1; - z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, - z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] - .r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + d_cnjg(&z__3, &a[l + i__ * a_dim1]); + i__4 = j + l * b_dim1; + z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] + .r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L290: */ - } - if (beta->r == 0. && beta->i == 0.) { - i__3 = i__ + j * c_dim1; - z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } else { - i__3 = i__ + j * c_dim1; - z__2.r = alpha->r * temp.r - alpha->i * temp.i, - z__2.i = alpha->r * temp.i + alpha->i * - temp.r; - i__4 = i__ + j * c_dim1; - z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__3.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * + temp.r; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__3.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } /* L300: */ - } + } /* L310: */ - } - } + } + } } else { - if (conjb) { + if (conjb) { /* Form C := alpha*A**T*B**H + beta*C */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp.r = 0., temp.i = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - i__4 = l + i__ * a_dim1; - d_cnjg(&z__3, &b[j + l * b_dim1]); - z__2.r = a[i__4].r * z__3.r - a[i__4].i * z__3.i, - z__2.i = a[i__4].r * z__3.i + a[i__4].i * - z__3.r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + i__4 = l + i__ * a_dim1; + d_cnjg(&z__3, &b[j + l * b_dim1]); + z__2.r = a[i__4].r * z__3.r - a[i__4].i * z__3.i, + z__2.i = a[i__4].r * z__3.i + a[i__4].i * + z__3.r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L320: */ - } - if (beta->r == 0. && beta->i == 0.) { - i__3 = i__ + j * c_dim1; - z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } else { - i__3 = i__ + j * c_dim1; - z__2.r = alpha->r * temp.r - alpha->i * temp.i, - z__2.i = alpha->r * temp.i + alpha->i * - temp.r; - i__4 = i__ + j * c_dim1; - z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__3.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * + temp.r; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__3.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } /* L330: */ - } + } /* L340: */ - } - } else { + } + } else { /* Form C := alpha*A**T*B**T + beta*C */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - temp.r = 0., temp.i = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - i__4 = l + i__ * a_dim1; - i__5 = j + l * b_dim1; - z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * b[i__5] - .i, z__2.i = a[i__4].r * b[i__5].i + a[i__4] - .i * b[i__5].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + temp.r = 0., temp.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + i__4 = l + i__ * a_dim1; + i__5 = j + l * b_dim1; + z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * b[i__5] + .i, z__2.i = a[i__4].r * b[i__5].i + a[i__4] + .i * b[i__5].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L350: */ - } - if (beta->r == 0. && beta->i == 0.) { - i__3 = i__ + j * c_dim1; - z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } else { - i__3 = i__ + j * c_dim1; - z__2.r = alpha->r * temp.r - alpha->i * temp.i, - z__2.i = alpha->r * temp.i + alpha->i * - temp.r; - i__4 = i__ + j * c_dim1; - z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__3.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } + } + if (beta->r == 0. && beta->i == 0.) { + i__3 = i__ + j * c_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * + temp.r; + i__4 = i__ + j * c_dim1; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] + .i, z__3.i = beta->r * c__[i__4].i + beta->i * + c__[i__4].r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } /* L360: */ - } + } /* L370: */ - } - } + } + } } return 0; @@ -759,5 +759,5 @@ extern "C" { } /* zgemm_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zgemv.cpp b/lib/linalg/zgemv.cpp index 9524445dba..99b8cf9d0a 100644 --- a/lib/linalg/zgemv.cpp +++ b/lib/linalg/zgemv.cpp @@ -1,13 +1,13 @@ /* fortran/zgemv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -171,10 +171,10 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zgemv_(char *trans, integer *m, integer *n, - doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * - x, integer *incx, doublecomplex *beta, doublecomplex *y, integer * - incy, ftnlen trans_len) +/* Subroutine */ int zgemv_(char *trans, integer *m, integer *n, + doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * + x, integer *incx, doublecomplex *beta, doublecomplex *y, integer * + incy, ftnlen trans_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; @@ -226,30 +226,30 @@ extern "C" { /* Function Body */ info = 0; if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"T", ( - ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1) - ) { - info = 1; + ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1) + ) { + info = 1; } else if (*m < 0) { - info = 2; + info = 2; } else if (*n < 0) { - info = 3; + info = 3; } else if (*lda < max(1,*m)) { - info = 6; + info = 6; } else if (*incx == 0) { - info = 8; + info = 8; } else if (*incy == 0) { - info = 11; + info = 11; } if (info != 0) { - xerbla_((char *)"ZGEMV ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"ZGEMV ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ - if (*m == 0 || *n == 0 || alpha->r == 0. && alpha->i == 0. && (beta->r == - 1. && beta->i == 0.)) { - return 0; + if (*m == 0 || *n == 0 || alpha->r == 0. && alpha->i == 0. && (beta->r == + 1. && beta->i == 0.)) { + return 0; } noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); @@ -258,21 +258,21 @@ extern "C" { /* up the start points in X and Y. */ if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - lenx = *n; - leny = *m; + lenx = *n; + leny = *m; } else { - lenx = *m; - leny = *n; + lenx = *m; + leny = *n; } if (*incx > 0) { - kx = 1; + kx = 1; } else { - kx = 1 - (lenx - 1) * *incx; + kx = 1 - (lenx - 1) * *incx; } if (*incy > 0) { - ky = 1; + ky = 1; } else { - ky = 1 - (leny - 1) * *incy; + ky = 1 - (leny - 1) * *incy; } /* Start the operations. In this version the elements of A are */ @@ -281,189 +281,189 @@ extern "C" { /* First form y := beta*y. */ if (beta->r != 1. || beta->i != 0.) { - if (*incy == 1) { - if (beta->r == 0. && beta->i == 0.) { - i__1 = leny; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__; - y[i__2].r = 0., y[i__2].i = 0.; + if (*incy == 1) { + if (beta->r == 0. && beta->i == 0.) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + y[i__2].r = 0., y[i__2].i = 0.; /* L10: */ - } - } else { - i__1 = leny; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__; - i__3 = i__; - z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, - z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] - .r; - y[i__2].r = z__1.r, y[i__2].i = z__1.i; + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] + .r; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; /* L20: */ - } - } - } else { - iy = ky; - if (beta->r == 0. && beta->i == 0.) { - i__1 = leny; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = iy; - y[i__2].r = 0., y[i__2].i = 0.; - iy += *incy; + } + } + } else { + iy = ky; + if (beta->r == 0. && beta->i == 0.) { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + y[i__2].r = 0., y[i__2].i = 0.; + iy += *incy; /* L30: */ - } - } else { - i__1 = leny; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = iy; - i__3 = iy; - z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, - z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] - .r; - y[i__2].r = z__1.r, y[i__2].i = z__1.i; - iy += *incy; + } + } else { + i__1 = leny; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + i__3 = iy; + z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] + .r; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + iy += *incy; /* L40: */ - } - } - } + } + } + } } if (alpha->r == 0. && alpha->i == 0.) { - return 0; + return 0; } if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { /* Form y := alpha*A*x + y. */ - jx = kx; - if (*incy == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = - alpha->r * x[i__2].i + alpha->i * x[i__2].r; - temp.r = z__1.r, temp.i = z__1.i; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__; - i__4 = i__; - i__5 = i__ + j * a_dim1; - z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, z__2.i = - temp.r * a[i__5].i + temp.i * a[i__5].r; - z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; - y[i__3].r = z__1.r, y[i__3].i = z__1.i; + jx = kx; + if (*incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = + alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, z__2.i = + temp.r * a[i__5].i + temp.i * a[i__5].r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; /* L50: */ - } - jx += *incx; + } + jx += *incx; /* L60: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = - alpha->r * x[i__2].i + alpha->i * x[i__2].r; - temp.r = z__1.r, temp.i = z__1.i; - iy = ky; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = iy; - i__4 = iy; - i__5 = i__ + j * a_dim1; - z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, z__2.i = - temp.r * a[i__5].i + temp.i * a[i__5].r; - z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; - y[i__3].r = z__1.r, y[i__3].i = z__1.i; - iy += *incy; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = + alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + iy = ky; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = iy; + i__4 = iy; + i__5 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, z__2.i = + temp.r * a[i__5].i + temp.i * a[i__5].r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + iy += *incy; /* L70: */ - } - jx += *incx; + } + jx += *incx; /* L80: */ - } - } + } + } } else { /* Form y := alpha*A**T*x + y or y := alpha*A**H*x + y. */ - jy = ky; - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp.r = 0., temp.i = 0.; - if (noconj) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__; - z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4] - .i, z__2.i = a[i__3].r * x[i__4].i + a[i__3] - .i * x[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + jy = ky; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp.r = 0., temp.i = 0.; + if (noconj) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4] + .i, z__2.i = a[i__3].r * x[i__4].i + a[i__3] + .i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L90: */ - } - } else { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - d_cnjg(&z__3, &a[i__ + j * a_dim1]); - i__3 = i__; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3] - .r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3] + .r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L100: */ - } - } - i__2 = jy; - i__3 = jy; - z__2.r = alpha->r * temp.r - alpha->i * temp.i, z__2.i = - alpha->r * temp.i + alpha->i * temp.r; - z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; - y[i__2].r = z__1.r, y[i__2].i = z__1.i; - jy += *incy; + } + } + i__2 = jy; + i__3 = jy; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, z__2.i = + alpha->r * temp.i + alpha->i * temp.r; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + jy += *incy; /* L110: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp.r = 0., temp.i = 0.; - ix = kx; - if (noconj) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = ix; - z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4] - .i, z__2.i = a[i__3].r * x[i__4].i + a[i__3] - .i * x[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - ix += *incx; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp.r = 0., temp.i = 0.; + ix = kx; + if (noconj) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = ix; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4] + .i, z__2.i = a[i__3].r * x[i__4].i + a[i__3] + .i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix += *incx; /* L120: */ - } - } else { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - d_cnjg(&z__3, &a[i__ + j * a_dim1]); - i__3 = ix; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3] - .r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - ix += *incx; + } + } else { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3] + .r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix += *incx; /* L130: */ - } - } - i__2 = jy; - i__3 = jy; - z__2.r = alpha->r * temp.r - alpha->i * temp.i, z__2.i = - alpha->r * temp.i + alpha->i * temp.r; - z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; - y[i__2].r = z__1.r, y[i__2].i = z__1.i; - jy += *incy; + } + } + i__2 = jy; + i__3 = jy; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, z__2.i = + alpha->r * temp.i + alpha->i * temp.r; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + jy += *incy; /* L140: */ - } - } + } + } } return 0; @@ -473,5 +473,5 @@ extern "C" { } /* zgemv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zgerc.cpp b/lib/linalg/zgerc.cpp index db1e60a2eb..668c4c4f64 100644 --- a/lib/linalg/zgerc.cpp +++ b/lib/linalg/zgerc.cpp @@ -1,13 +1,13 @@ /* fortran/zgerc.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -143,9 +143,9 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zgerc_(integer *m, integer *n, doublecomplex *alpha, - doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, - doublecomplex *a, integer *lda) +/* Subroutine */ int zgerc_(integer *m, integer *n, doublecomplex *alpha, + doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, + doublecomplex *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; @@ -192,90 +192,90 @@ extern "C" { /* Function Body */ info = 0; if (*m < 0) { - info = 1; + info = 1; } else if (*n < 0) { - info = 2; + info = 2; } else if (*incx == 0) { - info = 5; + info = 5; } else if (*incy == 0) { - info = 7; + info = 7; } else if (*lda < max(1,*m)) { - info = 9; + info = 9; } if (info != 0) { - xerbla_((char *)"ZGERC ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"ZGERC ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0 || alpha->r == 0. && alpha->i == 0.) { - return 0; + return 0; } /* Start the operations. In this version the elements of A are */ /* accessed sequentially with one pass through A. */ if (*incy > 0) { - jy = 1; + jy = 1; } else { - jy = 1 - (*n - 1) * *incy; + jy = 1 - (*n - 1) * *incy; } if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jy; - if (y[i__2].r != 0. || y[i__2].i != 0.) { - d_cnjg(&z__2, &y[jy]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - i__5 = i__; - z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, z__2.i = - x[i__5].r * temp.i + x[i__5].i * temp.r; - z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jy; + if (y[i__2].r != 0. || y[i__2].i != 0.) { + d_cnjg(&z__2, &y[jy]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = i__; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, z__2.i = + x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L10: */ - } - } - jy += *incy; + } + } + jy += *incy; /* L20: */ - } + } } else { - if (*incx > 0) { - kx = 1; - } else { - kx = 1 - (*m - 1) * *incx; - } - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jy; - if (y[i__2].r != 0. || y[i__2].i != 0.) { - d_cnjg(&z__2, &y[jy]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - ix = kx; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - i__5 = ix; - z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, z__2.i = - x[i__5].r * temp.i + x[i__5].i * temp.r; - z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; - ix += *incx; + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (*m - 1) * *incx; + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jy; + if (y[i__2].r != 0. || y[i__2].i != 0.) { + d_cnjg(&z__2, &y[jy]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + ix = kx; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = ix; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, z__2.i = + x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + ix += *incx; /* L30: */ - } - } - jy += *incy; + } + } + jy += *incy; /* L40: */ - } + } } return 0; @@ -285,5 +285,5 @@ extern "C" { } /* zgerc_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zheev.cpp b/lib/linalg/zheev.cpp index f421e49090..52661d9511 100644 --- a/lib/linalg/zheev.cpp +++ b/lib/linalg/zheev.cpp @@ -1,13 +1,13 @@ /* fortran/zheev.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -163,9 +163,9 @@ ices */ /* > \ingroup complex16HEeigen */ /* ===================================================================== */ -/* Subroutine */ int zheev_(char *jobz, char *uplo, integer *n, doublecomplex - *a, integer *lda, doublereal *w, doublecomplex *work, integer *lwork, - doublereal *rwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) +/* Subroutine */ int zheev_(char *jobz, char *uplo, integer *n, doublecomplex + *a, integer *lda, doublereal *w, doublecomplex *work, integer *lwork, + doublereal *rwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -181,8 +181,8 @@ ices */ doublereal anrm; integer imax; doublereal rmin, rmax; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); doublereal sigma; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; @@ -190,29 +190,29 @@ ices */ extern doublereal dlamch_(char *, ftnlen); integer iscale; doublereal safmin; - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); doublereal bignum; - extern doublereal zlanhe_(char *, char *, integer *, doublecomplex *, - integer *, doublereal *, ftnlen, ftnlen); + extern doublereal zlanhe_(char *, char *, integer *, doublecomplex *, + integer *, doublereal *, ftnlen, ftnlen); integer indtau; extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, - integer *), zlascl_(char *, integer *, integer *, doublereal *, - doublereal *, integer *, integer *, doublecomplex *, integer *, - integer *, ftnlen); + integer *), zlascl_(char *, integer *, integer *, doublereal *, + doublereal *, integer *, integer *, doublecomplex *, integer *, + integer *, ftnlen); integer indwrk; - extern /* Subroutine */ int zhetrd_(char *, integer *, doublecomplex *, - integer *, doublereal *, doublereal *, doublecomplex *, - doublecomplex *, integer *, integer *, ftnlen); + extern /* Subroutine */ int zhetrd_(char *, integer *, doublecomplex *, + integer *, doublereal *, doublereal *, doublecomplex *, + doublecomplex *, integer *, integer *, ftnlen); integer llwork; doublereal smlnum; integer lwkopt; logical lquery; - extern /* Subroutine */ int zsteqr_(char *, integer *, doublereal *, - doublereal *, doublecomplex *, integer *, doublereal *, integer *, - ftnlen), zungtr_(char *, integer *, doublecomplex *, integer *, - doublecomplex *, doublecomplex *, integer *, integer *, ftnlen); + extern /* Subroutine */ int zsteqr_(char *, integer *, doublereal *, + doublereal *, doublecomplex *, integer *, doublereal *, integer *, + ftnlen), zungtr_(char *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, integer *, ftnlen); /* -- LAPACK driver routine -- */ @@ -255,53 +255,53 @@ ices */ *info = 0; if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { - *info = -1; + *info = -1; } else if (! (lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { - *info = -2; + *info = -2; } else if (*n < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*n)) { - *info = -5; + *info = -5; } if (*info == 0) { - nb = ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, - (ftnlen)1); + nb = ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, + (ftnlen)1); /* Computing MAX */ - i__1 = 1, i__2 = (nb + 1) * *n; - lwkopt = max(i__1,i__2); - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + i__1 = 1, i__2 = (nb + 1) * *n; + lwkopt = max(i__1,i__2); + work[1].r = (doublereal) lwkopt, work[1].i = 0.; /* Computing MAX */ - i__1 = 1, i__2 = (*n << 1) - 1; - if (*lwork < max(i__1,i__2) && ! lquery) { - *info = -8; - } + i__1 = 1, i__2 = (*n << 1) - 1; + if (*lwork < max(i__1,i__2) && ! lquery) { + *info = -8; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZHEEV ", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZHEEV ", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } if (*n == 1) { - i__1 = a_dim1 + 1; - w[1] = a[i__1].r; - work[1].r = 1., work[1].i = 0.; - if (wantz) { - i__1 = a_dim1 + 1; - a[i__1].r = 1., a[i__1].i = 0.; - } - return 0; + i__1 = a_dim1 + 1; + w[1] = a[i__1].r; + work[1].r = 1., work[1].i = 0.; + if (wantz) { + i__1 = a_dim1 + 1; + a[i__1].r = 1., a[i__1].i = 0.; + } + return 0; } /* Get machine constants. */ @@ -316,18 +316,18 @@ ices */ /* Scale matrix to allowable range, if necessary. */ anrm = zlanhe_((char *)"M", uplo, n, &a[a_offset], lda, &rwork[1], (ftnlen)1, ( - ftnlen)1); + ftnlen)1); iscale = 0; if (anrm > 0. && anrm < rmin) { - iscale = 1; - sigma = rmin / anrm; + iscale = 1; + sigma = rmin / anrm; } else if (anrm > rmax) { - iscale = 1; - sigma = rmax / anrm; + iscale = 1; + sigma = rmax / anrm; } if (iscale == 1) { - zlascl_(uplo, &c__0, &c__0, &c_b18, &sigma, n, n, &a[a_offset], lda, - info, (ftnlen)1); + zlascl_(uplo, &c__0, &c__0, &c_b18, &sigma, n, n, &a[a_offset], lda, + info, (ftnlen)1); } /* Call ZHETRD to reduce Hermitian matrix to tridiagonal form. */ @@ -337,31 +337,31 @@ ices */ indwrk = indtau + *n; llwork = *lwork - indwrk + 1; zhetrd_(uplo, n, &a[a_offset], lda, &w[1], &rwork[inde], &work[indtau], & - work[indwrk], &llwork, &iinfo, (ftnlen)1); + work[indwrk], &llwork, &iinfo, (ftnlen)1); /* For eigenvalues only, call DSTERF. For eigenvectors, first call */ /* ZUNGTR to generate the unitary matrix, then call ZSTEQR. */ if (! wantz) { - dsterf_(n, &w[1], &rwork[inde], info); + dsterf_(n, &w[1], &rwork[inde], info); } else { - zungtr_(uplo, n, &a[a_offset], lda, &work[indtau], &work[indwrk], & - llwork, &iinfo, (ftnlen)1); - indwrk = inde + *n; - zsteqr_(jobz, n, &w[1], &rwork[inde], &a[a_offset], lda, &rwork[ - indwrk], info, (ftnlen)1); + zungtr_(uplo, n, &a[a_offset], lda, &work[indtau], &work[indwrk], & + llwork, &iinfo, (ftnlen)1); + indwrk = inde + *n; + zsteqr_(jobz, n, &w[1], &rwork[inde], &a[a_offset], lda, &rwork[ + indwrk], info, (ftnlen)1); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { - if (*info == 0) { - imax = *n; - } else { - imax = *info - 1; - } - d__1 = 1. / sigma; - dscal_(&imax, &d__1, &w[1], &c__1); + if (*info == 0) { + imax = *n; + } else { + imax = *info - 1; + } + d__1 = 1. / sigma; + dscal_(&imax, &d__1, &w[1], &c__1); } /* Set WORK(1) to optimal complex workspace size. */ @@ -375,5 +375,5 @@ ices */ } /* zheev_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zheevd.cpp b/lib/linalg/zheevd.cpp index c340c17718..83747a7962 100644 --- a/lib/linalg/zheevd.cpp +++ b/lib/linalg/zheevd.cpp @@ -1,13 +1,13 @@ /* fortran/zheevd.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -228,10 +228,10 @@ f"> */ /* > at Berkeley, USA */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zheevd_(char *jobz, char *uplo, integer *n, - doublecomplex *a, integer *lda, doublereal *w, doublecomplex *work, - integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, - integer *liwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) +/* Subroutine */ int zheevd_(char *jobz, char *uplo, integer *n, + doublecomplex *a, integer *lda, doublereal *w, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, + integer *liwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -247,8 +247,8 @@ f"> */ integer imax; doublereal rmin, rmax; integer lopt; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *); doublereal sigma; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo, lwmin, liopt; @@ -259,33 +259,33 @@ f"> */ extern doublereal dlamch_(char *, ftnlen); integer iscale; doublereal safmin; - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); doublereal bignum; - extern doublereal zlanhe_(char *, char *, integer *, doublecomplex *, - integer *, doublereal *, ftnlen, ftnlen); + extern doublereal zlanhe_(char *, char *, integer *, doublecomplex *, + integer *, doublereal *, ftnlen, ftnlen); integer indtau; extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, - integer *), zlascl_(char *, integer *, integer *, doublereal *, - doublereal *, integer *, integer *, doublecomplex *, integer *, - integer *, ftnlen), zstedc_(char *, integer *, doublereal *, - doublereal *, doublecomplex *, integer *, doublecomplex *, - integer *, doublereal *, integer *, integer *, integer *, integer - *, ftnlen); + integer *), zlascl_(char *, integer *, integer *, doublereal *, + doublereal *, integer *, integer *, doublecomplex *, integer *, + integer *, ftnlen), zstedc_(char *, integer *, doublereal *, + doublereal *, doublecomplex *, integer *, doublecomplex *, + integer *, doublereal *, integer *, integer *, integer *, integer + *, ftnlen); integer indrwk, indwrk, liwmin; - extern /* Subroutine */ int zhetrd_(char *, integer *, doublecomplex *, - integer *, doublereal *, doublereal *, doublecomplex *, - doublecomplex *, integer *, integer *, ftnlen), zlacpy_(char *, - integer *, integer *, doublecomplex *, integer *, doublecomplex *, - integer *, ftnlen); + extern /* Subroutine */ int zhetrd_(char *, integer *, doublecomplex *, + integer *, doublereal *, doublereal *, doublecomplex *, + doublecomplex *, integer *, integer *, ftnlen), zlacpy_(char *, + integer *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, ftnlen); integer lrwmin, llwork; doublereal smlnum; logical lquery; - extern /* Subroutine */ int zunmtr_(char *, char *, char *, integer *, - integer *, doublecomplex *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, integer *, - ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int zunmtr_(char *, char *, char *, integer *, + integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, integer *, + ftnlen, ftnlen, ftnlen); /* -- LAPACK driver routine -- */ @@ -329,77 +329,77 @@ f"> */ *info = 0; if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { - *info = -1; + *info = -1; } else if (! (lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { - *info = -2; + *info = -2; } else if (*n < 0) { - *info = -3; + *info = -3; } else if (*lda < max(1,*n)) { - *info = -5; + *info = -5; } if (*info == 0) { - if (*n <= 1) { - lwmin = 1; - lrwmin = 1; - liwmin = 1; - lopt = lwmin; - lropt = lrwmin; - liopt = liwmin; - } else { - if (wantz) { - lwmin = (*n << 1) + *n * *n; + if (*n <= 1) { + lwmin = 1; + lrwmin = 1; + liwmin = 1; + lopt = lwmin; + lropt = lrwmin; + liopt = liwmin; + } else { + if (wantz) { + lwmin = (*n << 1) + *n * *n; /* Computing 2nd power */ - i__1 = *n; - lrwmin = *n * 5 + 1 + (i__1 * i__1 << 1); - liwmin = *n * 5 + 3; - } else { - lwmin = *n + 1; - lrwmin = *n; - liwmin = 1; - } + i__1 = *n; + lrwmin = *n * 5 + 1 + (i__1 * i__1 << 1); + liwmin = *n * 5 + 3; + } else { + lwmin = *n + 1; + lrwmin = *n; + liwmin = 1; + } /* Computing MAX */ - i__1 = lwmin, i__2 = *n + *n * ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, & - c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); - lopt = max(i__1,i__2); - lropt = lrwmin; - liopt = liwmin; - } - work[1].r = (doublereal) lopt, work[1].i = 0.; - rwork[1] = (doublereal) lropt; - iwork[1] = liopt; + i__1 = lwmin, i__2 = *n + *n * ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, & + c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + lopt = max(i__1,i__2); + lropt = lrwmin; + liopt = liwmin; + } + work[1].r = (doublereal) lopt, work[1].i = 0.; + rwork[1] = (doublereal) lropt; + iwork[1] = liopt; - if (*lwork < lwmin && ! lquery) { - *info = -8; - } else if (*lrwork < lrwmin && ! lquery) { - *info = -10; - } else if (*liwork < liwmin && ! lquery) { - *info = -12; - } + if (*lwork < lwmin && ! lquery) { + *info = -8; + } else if (*lrwork < lrwmin && ! lquery) { + *info = -10; + } else if (*liwork < liwmin && ! lquery) { + *info = -12; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZHEEVD", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZHEEVD", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } if (*n == 1) { - i__1 = a_dim1 + 1; - w[1] = a[i__1].r; - if (wantz) { - i__1 = a_dim1 + 1; - a[i__1].r = 1., a[i__1].i = 0.; - } - return 0; + i__1 = a_dim1 + 1; + w[1] = a[i__1].r; + if (wantz) { + i__1 = a_dim1 + 1; + a[i__1].r = 1., a[i__1].i = 0.; + } + return 0; } /* Get machine constants. */ @@ -414,18 +414,18 @@ f"> */ /* Scale matrix to allowable range, if necessary. */ anrm = zlanhe_((char *)"M", uplo, n, &a[a_offset], lda, &rwork[1], (ftnlen)1, ( - ftnlen)1); + ftnlen)1); iscale = 0; if (anrm > 0. && anrm < rmin) { - iscale = 1; - sigma = rmin / anrm; + iscale = 1; + sigma = rmin / anrm; } else if (anrm > rmax) { - iscale = 1; - sigma = rmax / anrm; + iscale = 1; + sigma = rmax / anrm; } if (iscale == 1) { - zlascl_(uplo, &c__0, &c__0, &c_b18, &sigma, n, n, &a[a_offset], lda, - info, (ftnlen)1); + zlascl_(uplo, &c__0, &c__0, &c_b18, &sigma, n, n, &a[a_offset], lda, + info, (ftnlen)1); } /* Call ZHETRD to reduce Hermitian matrix to tridiagonal form. */ @@ -439,7 +439,7 @@ f"> */ llwrk2 = *lwork - indwk2 + 1; llrwk = *lrwork - indrwk + 1; zhetrd_(uplo, n, &a[a_offset], lda, &w[1], &rwork[inde], &work[indtau], & - work[indwrk], &llwork, &iinfo, (ftnlen)1); + work[indwrk], &llwork, &iinfo, (ftnlen)1); /* For eigenvalues only, call DSTERF. For eigenvectors, first call */ /* ZSTEDC to generate the eigenvector matrix, WORK(INDWRK), of the */ @@ -448,27 +448,27 @@ f"> */ /* A. */ if (! wantz) { - dsterf_(n, &w[1], &rwork[inde], info); + dsterf_(n, &w[1], &rwork[inde], info); } else { - zstedc_((char *)"I", n, &w[1], &rwork[inde], &work[indwrk], n, &work[indwk2], - &llwrk2, &rwork[indrwk], &llrwk, &iwork[1], liwork, info, ( - ftnlen)1); - zunmtr_((char *)"L", uplo, (char *)"N", n, n, &a[a_offset], lda, &work[indtau], &work[ - indwrk], n, &work[indwk2], &llwrk2, &iinfo, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - zlacpy_((char *)"A", n, n, &work[indwrk], n, &a[a_offset], lda, (ftnlen)1); + zstedc_((char *)"I", n, &w[1], &rwork[inde], &work[indwrk], n, &work[indwk2], + &llwrk2, &rwork[indrwk], &llrwk, &iwork[1], liwork, info, ( + ftnlen)1); + zunmtr_((char *)"L", uplo, (char *)"N", n, n, &a[a_offset], lda, &work[indtau], &work[ + indwrk], n, &work[indwk2], &llwrk2, &iinfo, (ftnlen)1, ( + ftnlen)1, (ftnlen)1); + zlacpy_((char *)"A", n, n, &work[indwrk], n, &a[a_offset], lda, (ftnlen)1); } /* If matrix was scaled, then rescale eigenvalues appropriately. */ if (iscale == 1) { - if (*info == 0) { - imax = *n; - } else { - imax = *info - 1; - } - d__1 = 1. / sigma; - dscal_(&imax, &d__1, &w[1], &c__1); + if (*info == 0) { + imax = *n; + } else { + imax = *info - 1; + } + d__1 = 1. / sigma; + dscal_(&imax, &d__1, &w[1], &c__1); } work[1].r = (doublereal) lopt, work[1].i = 0.; @@ -482,5 +482,5 @@ f"> */ } /* zheevd_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zhemv.cpp b/lib/linalg/zhemv.cpp index f965dcfcdf..132915183b 100644 --- a/lib/linalg/zhemv.cpp +++ b/lib/linalg/zhemv.cpp @@ -1,13 +1,13 @@ /* fortran/zhemv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -167,9 +167,9 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zhemv_(char *uplo, integer *n, doublecomplex *alpha, - doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, - doublecomplex *beta, doublecomplex *y, integer *incy, ftnlen uplo_len) +/* Subroutine */ int zhemv_(char *uplo, integer *n, doublecomplex *alpha, + doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, + doublecomplex *beta, doublecomplex *y, integer *incy, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; @@ -220,40 +220,40 @@ extern "C" { /* Function Body */ info = 0; if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { - info = 1; + ftnlen)1, (ftnlen)1)) { + info = 1; } else if (*n < 0) { - info = 2; + info = 2; } else if (*lda < max(1,*n)) { - info = 5; + info = 5; } else if (*incx == 0) { - info = 7; + info = 7; } else if (*incy == 0) { - info = 10; + info = 10; } if (info != 0) { - xerbla_((char *)"ZHEMV ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"ZHEMV ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ - if (*n == 0 || alpha->r == 0. && alpha->i == 0. && (beta->r == 1. && - beta->i == 0.)) { - return 0; + if (*n == 0 || alpha->r == 0. && alpha->i == 0. && (beta->r == 1. && + beta->i == 0.)) { + return 0; } /* Set up the start points in X and Y. */ if (*incx > 0) { - kx = 1; + kx = 1; } else { - kx = 1 - (*n - 1) * *incx; + kx = 1 - (*n - 1) * *incx; } if (*incy > 0) { - ky = 1; + ky = 1; } else { - ky = 1 - (*n - 1) * *incy; + ky = 1 - (*n - 1) * *incy; } /* Start the operations. In this version the elements of A are */ @@ -263,238 +263,238 @@ extern "C" { /* First form y := beta*y. */ if (beta->r != 1. || beta->i != 0.) { - if (*incy == 1) { - if (beta->r == 0. && beta->i == 0.) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__; - y[i__2].r = 0., y[i__2].i = 0.; + if (*incy == 1) { + if (beta->r == 0. && beta->i == 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + y[i__2].r = 0., y[i__2].i = 0.; /* L10: */ - } - } else { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__; - i__3 = i__; - z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, - z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] - .r; - y[i__2].r = z__1.r, y[i__2].i = z__1.i; + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] + .r; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; /* L20: */ - } - } - } else { - iy = ky; - if (beta->r == 0. && beta->i == 0.) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = iy; - y[i__2].r = 0., y[i__2].i = 0.; - iy += *incy; + } + } + } else { + iy = ky; + if (beta->r == 0. && beta->i == 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + y[i__2].r = 0., y[i__2].i = 0.; + iy += *incy; /* L30: */ - } - } else { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = iy; - i__3 = iy; - z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, - z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] - .r; - y[i__2].r = z__1.r, y[i__2].i = z__1.i; - iy += *incy; + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = iy; + i__3 = iy; + z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] + .r; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + iy += *incy; /* L40: */ - } - } - } + } + } + } } if (alpha->r == 0. && alpha->i == 0.) { - return 0; + return 0; } if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { /* Form y when A is stored in upper triangle. */ - if (*incx == 1 && *incy == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = - alpha->r * x[i__2].i + alpha->i * x[i__2].r; - temp1.r = z__1.r, temp1.i = z__1.i; - temp2.r = 0., temp2.i = 0.; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__; - i__4 = i__; - i__5 = i__ + j * a_dim1; - z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, - z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] - .r; - z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; - y[i__3].r = z__1.r, y[i__3].i = z__1.i; - d_cnjg(&z__3, &a[i__ + j * a_dim1]); - i__3 = i__; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = - z__3.r * x[i__3].i + z__3.i * x[i__3].r; - z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; - temp2.r = z__1.r, temp2.i = z__1.i; + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = + alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = i__ + j * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] + .r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = + z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; /* L50: */ - } - i__2 = j; - i__3 = j; - i__4 = j + j * a_dim1; - d__1 = a[i__4].r; - z__3.r = d__1 * temp1.r, z__3.i = d__1 * temp1.i; - z__2.r = y[i__3].r + z__3.r, z__2.i = y[i__3].i + z__3.i; - z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, z__4.i = - alpha->r * temp2.i + alpha->i * temp2.r; - z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; - y[i__2].r = z__1.r, y[i__2].i = z__1.i; + } + i__2 = j; + i__3 = j; + i__4 = j + j * a_dim1; + d__1 = a[i__4].r; + z__3.r = d__1 * temp1.r, z__3.i = d__1 * temp1.i; + z__2.r = y[i__3].r + z__3.r, z__2.i = y[i__3].i + z__3.i; + z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, z__4.i = + alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; /* L60: */ - } - } else { - jx = kx; - jy = ky; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = - alpha->r * x[i__2].i + alpha->i * x[i__2].r; - temp1.r = z__1.r, temp1.i = z__1.i; - temp2.r = 0., temp2.i = 0.; - ix = kx; - iy = ky; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = iy; - i__4 = iy; - i__5 = i__ + j * a_dim1; - z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, - z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] - .r; - z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; - y[i__3].r = z__1.r, y[i__3].i = z__1.i; - d_cnjg(&z__3, &a[i__ + j * a_dim1]); - i__3 = ix; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = - z__3.r * x[i__3].i + z__3.i * x[i__3].r; - z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; - temp2.r = z__1.r, temp2.i = z__1.i; - ix += *incx; - iy += *incy; + } + } else { + jx = kx; + jy = ky; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = + alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + ix = kx; + iy = ky; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = iy; + i__4 = iy; + i__5 = i__ + j * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] + .r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = + z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; + ix += *incx; + iy += *incy; /* L70: */ - } - i__2 = jy; - i__3 = jy; - i__4 = j + j * a_dim1; - d__1 = a[i__4].r; - z__3.r = d__1 * temp1.r, z__3.i = d__1 * temp1.i; - z__2.r = y[i__3].r + z__3.r, z__2.i = y[i__3].i + z__3.i; - z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, z__4.i = - alpha->r * temp2.i + alpha->i * temp2.r; - z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; - y[i__2].r = z__1.r, y[i__2].i = z__1.i; - jx += *incx; - jy += *incy; + } + i__2 = jy; + i__3 = jy; + i__4 = j + j * a_dim1; + d__1 = a[i__4].r; + z__3.r = d__1 * temp1.r, z__3.i = d__1 * temp1.i; + z__2.r = y[i__3].r + z__3.r, z__2.i = y[i__3].i + z__3.i; + z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, z__4.i = + alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + jx += *incx; + jy += *incy; /* L80: */ - } - } + } + } } else { /* Form y when A is stored in lower triangle. */ - if (*incx == 1 && *incy == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = - alpha->r * x[i__2].i + alpha->i * x[i__2].r; - temp1.r = z__1.r, temp1.i = z__1.i; - temp2.r = 0., temp2.i = 0.; - i__2 = j; - i__3 = j; - i__4 = j + j * a_dim1; - d__1 = a[i__4].r; - z__2.r = d__1 * temp1.r, z__2.i = d__1 * temp1.i; - z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; - y[i__2].r = z__1.r, y[i__2].i = z__1.i; - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - i__3 = i__; - i__4 = i__; - i__5 = i__ + j * a_dim1; - z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, - z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] - .r; - z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; - y[i__3].r = z__1.r, y[i__3].i = z__1.i; - d_cnjg(&z__3, &a[i__ + j * a_dim1]); - i__3 = i__; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = - z__3.r * x[i__3].i + z__3.i * x[i__3].r; - z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; - temp2.r = z__1.r, temp2.i = z__1.i; + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = + alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + i__2 = j; + i__3 = j; + i__4 = j + j * a_dim1; + d__1 = a[i__4].r; + z__2.r = d__1 * temp1.r, z__2.i = d__1 * temp1.i; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = i__ + j * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] + .r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = + z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; /* L90: */ - } - i__2 = j; - i__3 = j; - z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, z__2.i = - alpha->r * temp2.i + alpha->i * temp2.r; - z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; - y[i__2].r = z__1.r, y[i__2].i = z__1.i; + } + i__2 = j; + i__3 = j; + z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, z__2.i = + alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; /* L100: */ - } - } else { - jx = kx; - jy = ky; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = - alpha->r * x[i__2].i + alpha->i * x[i__2].r; - temp1.r = z__1.r, temp1.i = z__1.i; - temp2.r = 0., temp2.i = 0.; - i__2 = jy; - i__3 = jy; - i__4 = j + j * a_dim1; - d__1 = a[i__4].r; - z__2.r = d__1 * temp1.r, z__2.i = d__1 * temp1.i; - z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; - y[i__2].r = z__1.r, y[i__2].i = z__1.i; - ix = jx; - iy = jy; - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - ix += *incx; - iy += *incy; - i__3 = iy; - i__4 = iy; - i__5 = i__ + j * a_dim1; - z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, - z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] - .r; - z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; - y[i__3].r = z__1.r, y[i__3].i = z__1.i; - d_cnjg(&z__3, &a[i__ + j * a_dim1]); - i__3 = ix; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = - z__3.r * x[i__3].i + z__3.i * x[i__3].r; - z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; - temp2.r = z__1.r, temp2.i = z__1.i; + } + } else { + jx = kx; + jy = ky; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = + alpha->r * x[i__2].i + alpha->i * x[i__2].r; + temp1.r = z__1.r, temp1.i = z__1.i; + temp2.r = 0., temp2.i = 0.; + i__2 = jy; + i__3 = jy; + i__4 = j + j * a_dim1; + d__1 = a[i__4].r; + z__2.r = d__1 * temp1.r, z__2.i = d__1 * temp1.i; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + ix = jx; + iy = jy; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + iy += *incy; + i__3 = iy; + i__4 = iy; + i__5 = i__ + j * a_dim1; + z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] + .r; + z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; + y[i__3].r = z__1.r, y[i__3].i = z__1.i; + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = + z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; /* L110: */ - } - i__2 = jy; - i__3 = jy; - z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, z__2.i = - alpha->r * temp2.i + alpha->i * temp2.r; - z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; - y[i__2].r = z__1.r, y[i__2].i = z__1.i; - jx += *incx; - jy += *incy; + } + i__2 = jy; + i__3 = jy; + z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, z__2.i = + alpha->r * temp2.i + alpha->i * temp2.r; + z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; + y[i__2].r = z__1.r, y[i__2].i = z__1.i; + jx += *incx; + jy += *incy; /* L120: */ - } - } + } + } } return 0; @@ -504,5 +504,5 @@ extern "C" { } /* zhemv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zher2.cpp b/lib/linalg/zher2.cpp index 2f77acd257..07d95f7917 100644 --- a/lib/linalg/zher2.cpp +++ b/lib/linalg/zher2.cpp @@ -1,13 +1,13 @@ /* fortran/zher2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -163,9 +163,9 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zher2_(char *uplo, integer *n, doublecomplex *alpha, - doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, - doublecomplex *a, integer *lda, ftnlen uplo_len) +/* Subroutine */ int zher2_(char *uplo, integer *n, doublecomplex *alpha, + doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, + doublecomplex *a, integer *lda, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5, i__6; @@ -216,44 +216,44 @@ extern "C" { /* Function Body */ info = 0; if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { - info = 1; + ftnlen)1, (ftnlen)1)) { + info = 1; } else if (*n < 0) { - info = 2; + info = 2; } else if (*incx == 0) { - info = 5; + info = 5; } else if (*incy == 0) { - info = 7; + info = 7; } else if (*lda < max(1,*n)) { - info = 9; + info = 9; } if (info != 0) { - xerbla_((char *)"ZHER2 ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"ZHER2 ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*n == 0 || alpha->r == 0. && alpha->i == 0.) { - return 0; + return 0; } /* Set up the start points in X and Y if the increments are not both */ /* unity. */ if (*incx != 1 || *incy != 1) { - if (*incx > 0) { - kx = 1; - } else { - kx = 1 - (*n - 1) * *incx; - } - if (*incy > 0) { - ky = 1; - } else { - ky = 1 - (*n - 1) * *incy; - } - jx = kx; - jy = ky; + if (*incx > 0) { + kx = 1; + } else { + kx = 1 - (*n - 1) * *incx; + } + if (*incy > 0) { + ky = 1; + } else { + ky = 1 - (*n - 1) * *incy; + } + jx = kx; + jy = ky; } /* Start the operations. In this version the elements of A are */ @@ -264,248 +264,248 @@ extern "C" { /* Form A when A is stored in the upper triangle. */ - if (*incx == 1 && *incy == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - i__3 = j; - if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || - y[i__3].i != 0.)) { - d_cnjg(&z__2, &y[j]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; - temp1.r = z__1.r, temp1.i = z__1.i; - i__2 = j; - z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, - z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] - .r; - d_cnjg(&z__1, &z__2); - temp2.r = z__1.r, temp2.i = z__1.i; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - i__5 = i__; - z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, - z__3.i = x[i__5].r * temp1.i + x[i__5].i * - temp1.r; - z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + - z__3.i; - i__6 = i__; - z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, - z__4.i = y[i__6].r * temp2.i + y[i__6].i * - temp2.r; - z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + i__3 = j; + if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || + y[i__3].i != 0.)) { + d_cnjg(&z__2, &y[j]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + i__2 = j; + z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] + .r; + d_cnjg(&z__1, &z__2); + temp2.r = z__1.r, temp2.i = z__1.i; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = i__; + z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, + z__3.i = x[i__5].r * temp1.i + x[i__5].i * + temp1.r; + z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + + z__3.i; + i__6 = i__; + z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, + z__4.i = y[i__6].r * temp2.i + y[i__6].i * + temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L10: */ - } - i__2 = j + j * a_dim1; - i__3 = j + j * a_dim1; - i__4 = j; - z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, - z__2.i = x[i__4].r * temp1.i + x[i__4].i * - temp1.r; - i__5 = j; - z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, - z__3.i = y[i__5].r * temp2.i + y[i__5].i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - d__1 = a[i__3].r + z__1.r; - a[i__2].r = d__1, a[i__2].i = 0.; - } else { - i__2 = j + j * a_dim1; - i__3 = j + j * a_dim1; - d__1 = a[i__3].r; - a[i__2].r = d__1, a[i__2].i = 0.; - } + } + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + i__4 = j; + z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, + z__2.i = x[i__4].r * temp1.i + x[i__4].i * + temp1.r; + i__5 = j; + z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, + z__3.i = y[i__5].r * temp2.i + y[i__5].i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + d__1 = a[i__3].r + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + } else { + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } /* L20: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - i__3 = jy; - if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || - y[i__3].i != 0.)) { - d_cnjg(&z__2, &y[jy]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; - temp1.r = z__1.r, temp1.i = z__1.i; - i__2 = jx; - z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, - z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] - .r; - d_cnjg(&z__1, &z__2); - temp2.r = z__1.r, temp2.i = z__1.i; - ix = kx; - iy = ky; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - i__5 = ix; - z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, - z__3.i = x[i__5].r * temp1.i + x[i__5].i * - temp1.r; - z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + - z__3.i; - i__6 = iy; - z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, - z__4.i = y[i__6].r * temp2.i + y[i__6].i * - temp2.r; - z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; - ix += *incx; - iy += *incy; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + i__3 = jy; + if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || + y[i__3].i != 0.)) { + d_cnjg(&z__2, &y[jy]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + i__2 = jx; + z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] + .r; + d_cnjg(&z__1, &z__2); + temp2.r = z__1.r, temp2.i = z__1.i; + ix = kx; + iy = ky; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = ix; + z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, + z__3.i = x[i__5].r * temp1.i + x[i__5].i * + temp1.r; + z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + + z__3.i; + i__6 = iy; + z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, + z__4.i = y[i__6].r * temp2.i + y[i__6].i * + temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + ix += *incx; + iy += *incy; /* L30: */ - } - i__2 = j + j * a_dim1; - i__3 = j + j * a_dim1; - i__4 = jx; - z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, - z__2.i = x[i__4].r * temp1.i + x[i__4].i * - temp1.r; - i__5 = jy; - z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, - z__3.i = y[i__5].r * temp2.i + y[i__5].i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - d__1 = a[i__3].r + z__1.r; - a[i__2].r = d__1, a[i__2].i = 0.; - } else { - i__2 = j + j * a_dim1; - i__3 = j + j * a_dim1; - d__1 = a[i__3].r; - a[i__2].r = d__1, a[i__2].i = 0.; - } - jx += *incx; - jy += *incy; + } + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + i__4 = jx; + z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, + z__2.i = x[i__4].r * temp1.i + x[i__4].i * + temp1.r; + i__5 = jy; + z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, + z__3.i = y[i__5].r * temp2.i + y[i__5].i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + d__1 = a[i__3].r + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + } else { + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } + jx += *incx; + jy += *incy; /* L40: */ - } - } + } + } } else { /* Form A when A is stored in the lower triangle. */ - if (*incx == 1 && *incy == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - i__3 = j; - if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || - y[i__3].i != 0.)) { - d_cnjg(&z__2, &y[j]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; - temp1.r = z__1.r, temp1.i = z__1.i; - i__2 = j; - z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, - z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] - .r; - d_cnjg(&z__1, &z__2); - temp2.r = z__1.r, temp2.i = z__1.i; - i__2 = j + j * a_dim1; - i__3 = j + j * a_dim1; - i__4 = j; - z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, - z__2.i = x[i__4].r * temp1.i + x[i__4].i * - temp1.r; - i__5 = j; - z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, - z__3.i = y[i__5].r * temp2.i + y[i__5].i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - d__1 = a[i__3].r + z__1.r; - a[i__2].r = d__1, a[i__2].i = 0.; - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - i__5 = i__; - z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, - z__3.i = x[i__5].r * temp1.i + x[i__5].i * - temp1.r; - z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + - z__3.i; - i__6 = i__; - z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, - z__4.i = y[i__6].r * temp2.i + y[i__6].i * - temp2.r; - z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + if (*incx == 1 && *incy == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + i__3 = j; + if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || + y[i__3].i != 0.)) { + d_cnjg(&z__2, &y[j]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + i__2 = j; + z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] + .r; + d_cnjg(&z__1, &z__2); + temp2.r = z__1.r, temp2.i = z__1.i; + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + i__4 = j; + z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, + z__2.i = x[i__4].r * temp1.i + x[i__4].i * + temp1.r; + i__5 = j; + z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, + z__3.i = y[i__5].r * temp2.i + y[i__5].i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + d__1 = a[i__3].r + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = i__; + z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, + z__3.i = x[i__5].r * temp1.i + x[i__5].i * + temp1.r; + z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + + z__3.i; + i__6 = i__; + z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, + z__4.i = y[i__6].r * temp2.i + y[i__6].i * + temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L50: */ - } - } else { - i__2 = j + j * a_dim1; - i__3 = j + j * a_dim1; - d__1 = a[i__3].r; - a[i__2].r = d__1, a[i__2].i = 0.; - } + } + } else { + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } /* L60: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - i__3 = jy; - if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || - y[i__3].i != 0.)) { - d_cnjg(&z__2, &y[jy]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; - temp1.r = z__1.r, temp1.i = z__1.i; - i__2 = jx; - z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, - z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] - .r; - d_cnjg(&z__1, &z__2); - temp2.r = z__1.r, temp2.i = z__1.i; - i__2 = j + j * a_dim1; - i__3 = j + j * a_dim1; - i__4 = jx; - z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, - z__2.i = x[i__4].r * temp1.i + x[i__4].i * - temp1.r; - i__5 = jy; - z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, - z__3.i = y[i__5].r * temp2.i + y[i__5].i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - d__1 = a[i__3].r + z__1.r; - a[i__2].r = d__1, a[i__2].i = 0.; - ix = jx; - iy = jy; - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - ix += *incx; - iy += *incy; - i__3 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - i__5 = ix; - z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, - z__3.i = x[i__5].r * temp1.i + x[i__5].i * - temp1.r; - z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + - z__3.i; - i__6 = iy; - z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, - z__4.i = y[i__6].r * temp2.i + y[i__6].i * - temp2.r; - z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + i__3 = jy; + if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || + y[i__3].i != 0.)) { + d_cnjg(&z__2, &y[jy]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = + alpha->r * z__2.i + alpha->i * z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + i__2 = jx; + z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] + .r; + d_cnjg(&z__1, &z__2); + temp2.r = z__1.r, temp2.i = z__1.i; + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + i__4 = jx; + z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, + z__2.i = x[i__4].r * temp1.i + x[i__4].i * + temp1.r; + i__5 = jy; + z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, + z__3.i = y[i__5].r * temp2.i + y[i__5].i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + d__1 = a[i__3].r + z__1.r; + a[i__2].r = d__1, a[i__2].i = 0.; + ix = jx; + iy = jy; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + iy += *incy; + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + i__5 = ix; + z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, + z__3.i = x[i__5].r * temp1.i + x[i__5].i * + temp1.r; + z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + + z__3.i; + i__6 = iy; + z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, + z__4.i = y[i__6].r * temp2.i + y[i__6].i * + temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L70: */ - } - } else { - i__2 = j + j * a_dim1; - i__3 = j + j * a_dim1; - d__1 = a[i__3].r; - a[i__2].r = d__1, a[i__2].i = 0.; - } - jx += *incx; - jy += *incy; + } + } else { + i__2 = j + j * a_dim1; + i__3 = j + j * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } + jx += *incx; + jy += *incy; /* L80: */ - } - } + } + } } return 0; @@ -515,5 +515,5 @@ extern "C" { } /* zher2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zher2k.cpp b/lib/linalg/zher2k.cpp index 1b94010d33..7b5553add1 100644 --- a/lib/linalg/zher2k.cpp +++ b/lib/linalg/zher2k.cpp @@ -1,13 +1,13 @@ /* fortran/zher2k.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -211,14 +211,14 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zher2k_(char *uplo, char *trans, integer *n, integer *k, - doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * - b, integer *ldb, doublereal *beta, doublecomplex *c__, integer *ldc, - ftnlen uplo_len, ftnlen trans_len) +/* Subroutine */ int zher2k_(char *uplo, char *trans, integer *n, integer *k, + doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * + b, integer *ldb, doublereal *beta, doublecomplex *c__, integer *ldc, + ftnlen uplo_len, ftnlen trans_len) { /* System generated locals */ - integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, - i__3, i__4, i__5, i__6, i__7; + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, + i__3, i__4, i__5, i__6, i__7; doublereal d__1; doublecomplex z__1, z__2, z__3, z__4, z__5, z__6; @@ -271,108 +271,108 @@ extern "C" { /* Function Body */ if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - nrowa = *n; + nrowa = *n; } else { - nrowa = *k; + nrowa = *k; } upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); info = 0; if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"C", (ftnlen)1, (ftnlen)1)) { - info = 2; + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"C", (ftnlen)1, (ftnlen)1)) { + info = 2; } else if (*n < 0) { - info = 3; + info = 3; } else if (*k < 0) { - info = 4; + info = 4; } else if (*lda < max(1,nrowa)) { - info = 7; + info = 7; } else if (*ldb < max(1,nrowa)) { - info = 9; + info = 9; } else if (*ldc < max(1,*n)) { - info = 12; + info = 12; } if (info != 0) { - xerbla_((char *)"ZHER2K", &info, (ftnlen)6); - return 0; + xerbla_((char *)"ZHER2K", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ - if (*n == 0 || (alpha->r == 0. && alpha->i == 0. || *k == 0) && *beta == - 1.) { - return 0; + if (*n == 0 || (alpha->r == 0. && alpha->i == 0. || *k == 0) && *beta == + 1.) { + return 0; } /* And when alpha.eq.zero. */ if (alpha->r == 0. && alpha->i == 0.) { - if (upper) { - if (*beta == 0.) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - c__[i__3].r = 0., c__[i__3].i = 0.; + if (upper) { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; /* L10: */ - } + } /* L20: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ - i__4].i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ + i__4].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L30: */ - } - i__2 = j + j * c_dim1; - i__3 = j + j * c_dim1; - d__1 = *beta * c__[i__3].r; - c__[i__2].r = d__1, c__[i__2].i = 0.; + } + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; /* L40: */ - } - } - } else { - if (*beta == 0.) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - c__[i__3].r = 0., c__[i__3].i = 0.; + } + } + } else { + if (*beta == 0.) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; /* L50: */ - } + } /* L60: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j + j * c_dim1; - i__3 = j + j * c_dim1; - d__1 = *beta * c__[i__3].r; - c__[i__2].r = d__1, c__[i__2].i = 0.; - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ - i__4].i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ + i__4].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L70: */ - } + } /* L80: */ - } - } - } - return 0; + } + } + } + return 0; } /* Start the operations. */ @@ -382,361 +382,361 @@ extern "C" { /* Form C := alpha*A*B**H + conjg( alpha )*B*A**H + */ /* C. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (*beta == 0.) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - c__[i__3].r = 0., c__[i__3].i = 0.; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; /* L90: */ - } - } else if (*beta != 1.) { - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ - i__4].i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } else if (*beta != 1.) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ + i__4].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L100: */ - } - i__2 = j + j * c_dim1; - i__3 = j + j * c_dim1; - d__1 = *beta * c__[i__3].r; - c__[i__2].r = d__1, c__[i__2].i = 0.; - } else { - i__2 = j + j * c_dim1; - i__3 = j + j * c_dim1; - d__1 = c__[i__3].r; - c__[i__2].r = d__1, c__[i__2].i = 0.; - } - i__2 = *k; - for (l = 1; l <= i__2; ++l) { - i__3 = j + l * a_dim1; - i__4 = j + l * b_dim1; - if (a[i__3].r != 0. || a[i__3].i != 0. || (b[i__4].r != - 0. || b[i__4].i != 0.)) { - d_cnjg(&z__2, &b[j + l * b_dim1]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, - z__1.i = alpha->r * z__2.i + alpha->i * - z__2.r; - temp1.r = z__1.r, temp1.i = z__1.i; - i__3 = j + l * a_dim1; - z__2.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, - z__2.i = alpha->r * a[i__3].i + alpha->i * a[ - i__3].r; - d_cnjg(&z__1, &z__2); - temp2.r = z__1.r, temp2.i = z__1.i; - i__3 = j - 1; - for (i__ = 1; i__ <= i__3; ++i__) { - i__4 = i__ + j * c_dim1; - i__5 = i__ + j * c_dim1; - i__6 = i__ + l * a_dim1; - z__3.r = a[i__6].r * temp1.r - a[i__6].i * - temp1.i, z__3.i = a[i__6].r * temp1.i + a[ - i__6].i * temp1.r; - z__2.r = c__[i__5].r + z__3.r, z__2.i = c__[i__5] - .i + z__3.i; - i__7 = i__ + l * b_dim1; - z__4.r = b[i__7].r * temp2.r - b[i__7].i * - temp2.i, z__4.i = b[i__7].r * temp2.i + b[ - i__7].i * temp2.r; - z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + - z__4.i; - c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; + } + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } else { + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + i__3 = j + l * a_dim1; + i__4 = j + l * b_dim1; + if (a[i__3].r != 0. || a[i__3].i != 0. || (b[i__4].r != + 0. || b[i__4].i != 0.)) { + d_cnjg(&z__2, &b[j + l * b_dim1]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * + z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + i__3 = j + l * a_dim1; + z__2.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, + z__2.i = alpha->r * a[i__3].i + alpha->i * a[ + i__3].r; + d_cnjg(&z__1, &z__2); + temp2.r = z__1.r, temp2.i = z__1.i; + i__3 = j - 1; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + l * a_dim1; + z__3.r = a[i__6].r * temp1.r - a[i__6].i * + temp1.i, z__3.i = a[i__6].r * temp1.i + a[ + i__6].i * temp1.r; + z__2.r = c__[i__5].r + z__3.r, z__2.i = c__[i__5] + .i + z__3.i; + i__7 = i__ + l * b_dim1; + z__4.r = b[i__7].r * temp2.r - b[i__7].i * + temp2.i, z__4.i = b[i__7].r * temp2.i + b[ + i__7].i * temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + + z__4.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; /* L110: */ - } - i__3 = j + j * c_dim1; - i__4 = j + j * c_dim1; - i__5 = j + l * a_dim1; - z__2.r = a[i__5].r * temp1.r - a[i__5].i * temp1.i, - z__2.i = a[i__5].r * temp1.i + a[i__5].i * - temp1.r; - i__6 = j + l * b_dim1; - z__3.r = b[i__6].r * temp2.r - b[i__6].i * temp2.i, - z__3.i = b[i__6].r * temp2.i + b[i__6].i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - d__1 = c__[i__4].r + z__1.r; - c__[i__3].r = d__1, c__[i__3].i = 0.; - } + } + i__3 = j + j * c_dim1; + i__4 = j + j * c_dim1; + i__5 = j + l * a_dim1; + z__2.r = a[i__5].r * temp1.r - a[i__5].i * temp1.i, + z__2.i = a[i__5].r * temp1.i + a[i__5].i * + temp1.r; + i__6 = j + l * b_dim1; + z__3.r = b[i__6].r * temp2.r - b[i__6].i * temp2.i, + z__3.i = b[i__6].r * temp2.i + b[i__6].i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + d__1 = c__[i__4].r + z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } /* L120: */ - } + } /* L130: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (*beta == 0.) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - c__[i__3].r = 0., c__[i__3].i = 0.; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (*beta == 0.) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + c__[i__3].r = 0., c__[i__3].i = 0.; /* L140: */ - } - } else if (*beta != 1.) { - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ - i__4].i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } else if (*beta != 1.) { + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ + i__4].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L150: */ - } - i__2 = j + j * c_dim1; - i__3 = j + j * c_dim1; - d__1 = *beta * c__[i__3].r; - c__[i__2].r = d__1, c__[i__2].i = 0.; - } else { - i__2 = j + j * c_dim1; - i__3 = j + j * c_dim1; - d__1 = c__[i__3].r; - c__[i__2].r = d__1, c__[i__2].i = 0.; - } - i__2 = *k; - for (l = 1; l <= i__2; ++l) { - i__3 = j + l * a_dim1; - i__4 = j + l * b_dim1; - if (a[i__3].r != 0. || a[i__3].i != 0. || (b[i__4].r != - 0. || b[i__4].i != 0.)) { - d_cnjg(&z__2, &b[j + l * b_dim1]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, - z__1.i = alpha->r * z__2.i + alpha->i * - z__2.r; - temp1.r = z__1.r, temp1.i = z__1.i; - i__3 = j + l * a_dim1; - z__2.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, - z__2.i = alpha->r * a[i__3].i + alpha->i * a[ - i__3].r; - d_cnjg(&z__1, &z__2); - temp2.r = z__1.r, temp2.i = z__1.i; - i__3 = *n; - for (i__ = j + 1; i__ <= i__3; ++i__) { - i__4 = i__ + j * c_dim1; - i__5 = i__ + j * c_dim1; - i__6 = i__ + l * a_dim1; - z__3.r = a[i__6].r * temp1.r - a[i__6].i * - temp1.i, z__3.i = a[i__6].r * temp1.i + a[ - i__6].i * temp1.r; - z__2.r = c__[i__5].r + z__3.r, z__2.i = c__[i__5] - .i + z__3.i; - i__7 = i__ + l * b_dim1; - z__4.r = b[i__7].r * temp2.r - b[i__7].i * - temp2.i, z__4.i = b[i__7].r * temp2.i + b[ - i__7].i * temp2.r; - z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + - z__4.i; - c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; + } + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = *beta * c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } else { + i__2 = j + j * c_dim1; + i__3 = j + j * c_dim1; + d__1 = c__[i__3].r; + c__[i__2].r = d__1, c__[i__2].i = 0.; + } + i__2 = *k; + for (l = 1; l <= i__2; ++l) { + i__3 = j + l * a_dim1; + i__4 = j + l * b_dim1; + if (a[i__3].r != 0. || a[i__3].i != 0. || (b[i__4].r != + 0. || b[i__4].i != 0.)) { + d_cnjg(&z__2, &b[j + l * b_dim1]); + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * + z__2.r; + temp1.r = z__1.r, temp1.i = z__1.i; + i__3 = j + l * a_dim1; + z__2.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, + z__2.i = alpha->r * a[i__3].i + alpha->i * a[ + i__3].r; + d_cnjg(&z__1, &z__2); + temp2.r = z__1.r, temp2.i = z__1.i; + i__3 = *n; + for (i__ = j + 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * c_dim1; + i__6 = i__ + l * a_dim1; + z__3.r = a[i__6].r * temp1.r - a[i__6].i * + temp1.i, z__3.i = a[i__6].r * temp1.i + a[ + i__6].i * temp1.r; + z__2.r = c__[i__5].r + z__3.r, z__2.i = c__[i__5] + .i + z__3.i; + i__7 = i__ + l * b_dim1; + z__4.r = b[i__7].r * temp2.r - b[i__7].i * + temp2.i, z__4.i = b[i__7].r * temp2.i + b[ + i__7].i * temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + + z__4.i; + c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; /* L160: */ - } - i__3 = j + j * c_dim1; - i__4 = j + j * c_dim1; - i__5 = j + l * a_dim1; - z__2.r = a[i__5].r * temp1.r - a[i__5].i * temp1.i, - z__2.i = a[i__5].r * temp1.i + a[i__5].i * - temp1.r; - i__6 = j + l * b_dim1; - z__3.r = b[i__6].r * temp2.r - b[i__6].i * temp2.i, - z__3.i = b[i__6].r * temp2.i + b[i__6].i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; - d__1 = c__[i__4].r + z__1.r; - c__[i__3].r = d__1, c__[i__3].i = 0.; - } + } + i__3 = j + j * c_dim1; + i__4 = j + j * c_dim1; + i__5 = j + l * a_dim1; + z__2.r = a[i__5].r * temp1.r - a[i__5].i * temp1.i, + z__2.i = a[i__5].r * temp1.i + a[i__5].i * + temp1.r; + i__6 = j + l * b_dim1; + z__3.r = b[i__6].r * temp2.r - b[i__6].i * temp2.i, + z__3.i = b[i__6].r * temp2.i + b[i__6].i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; + d__1 = c__[i__4].r + z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } /* L170: */ - } + } /* L180: */ - } - } + } + } } else { /* Form C := alpha*A**H*B + conjg( alpha )*B**H*A + */ /* C. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - for (i__ = 1; i__ <= i__2; ++i__) { - temp1.r = 0., temp1.i = 0.; - temp2.r = 0., temp2.i = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - d_cnjg(&z__3, &a[l + i__ * a_dim1]); - i__4 = l + j * b_dim1; - z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, - z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] - .r; - z__1.r = temp1.r + z__2.r, z__1.i = temp1.i + z__2.i; - temp1.r = z__1.r, temp1.i = z__1.i; - d_cnjg(&z__3, &b[l + i__ * b_dim1]); - i__4 = l + j * a_dim1; - z__2.r = z__3.r * a[i__4].r - z__3.i * a[i__4].i, - z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4] - .r; - z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; - temp2.r = z__1.r, temp2.i = z__1.i; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + for (i__ = 1; i__ <= i__2; ++i__) { + temp1.r = 0., temp1.i = 0.; + temp2.r = 0., temp2.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + d_cnjg(&z__3, &a[l + i__ * a_dim1]); + i__4 = l + j * b_dim1; + z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] + .r; + z__1.r = temp1.r + z__2.r, z__1.i = temp1.i + z__2.i; + temp1.r = z__1.r, temp1.i = z__1.i; + d_cnjg(&z__3, &b[l + i__ * b_dim1]); + i__4 = l + j * a_dim1; + z__2.r = z__3.r * a[i__4].r - z__3.i * a[i__4].i, + z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4] + .r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; /* L190: */ - } - if (i__ == j) { - if (*beta == 0.) { - i__3 = j + j * c_dim1; - z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__2.i = alpha->r * temp1.i + alpha->i * - temp1.r; - d_cnjg(&z__4, alpha); - z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, - z__3.i = z__4.r * temp2.i + z__4.i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - d__1 = z__1.r; - c__[i__3].r = d__1, c__[i__3].i = 0.; - } else { - i__3 = j + j * c_dim1; - i__4 = j + j * c_dim1; - z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__2.i = alpha->r * temp1.i + alpha->i * - temp1.r; - d_cnjg(&z__4, alpha); - z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, - z__3.i = z__4.r * temp2.i + z__4.i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - d__1 = *beta * c__[i__4].r + z__1.r; - c__[i__3].r = d__1, c__[i__3].i = 0.; - } - } else { - if (*beta == 0.) { - i__3 = i__ + j * c_dim1; - z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__2.i = alpha->r * temp1.i + alpha->i * - temp1.r; - d_cnjg(&z__4, alpha); - z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, - z__3.i = z__4.r * temp2.i + z__4.i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } else { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - z__3.r = *beta * c__[i__4].r, z__3.i = *beta * - c__[i__4].i; - z__4.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__4.i = alpha->r * temp1.i + alpha->i * - temp1.r; - z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + - z__4.i; - d_cnjg(&z__6, alpha); - z__5.r = z__6.r * temp2.r - z__6.i * temp2.i, - z__5.i = z__6.r * temp2.i + z__6.i * - temp2.r; - z__1.r = z__2.r + z__5.r, z__1.i = z__2.i + - z__5.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } - } + } + if (i__ == j) { + if (*beta == 0.) { + i__3 = j + j * c_dim1; + z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__2.i = alpha->r * temp1.i + alpha->i * + temp1.r; + d_cnjg(&z__4, alpha); + z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, + z__3.i = z__4.r * temp2.i + z__4.i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + d__1 = z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } else { + i__3 = j + j * c_dim1; + i__4 = j + j * c_dim1; + z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__2.i = alpha->r * temp1.i + alpha->i * + temp1.r; + d_cnjg(&z__4, alpha); + z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, + z__3.i = z__4.r * temp2.i + z__4.i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + d__1 = *beta * c__[i__4].r + z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } + } else { + if (*beta == 0.) { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__2.i = alpha->r * temp1.i + alpha->i * + temp1.r; + d_cnjg(&z__4, alpha); + z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, + z__3.i = z__4.r * temp2.i + z__4.i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__3.r = *beta * c__[i__4].r, z__3.i = *beta * + c__[i__4].i; + z__4.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__4.i = alpha->r * temp1.i + alpha->i * + temp1.r; + z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + + z__4.i; + d_cnjg(&z__6, alpha); + z__5.r = z__6.r * temp2.r - z__6.i * temp2.i, + z__5.i = z__6.r * temp2.i + z__6.i * + temp2.r; + z__1.r = z__2.r + z__5.r, z__1.i = z__2.i + + z__5.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } /* L200: */ - } + } /* L210: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = j; i__ <= i__2; ++i__) { - temp1.r = 0., temp1.i = 0.; - temp2.r = 0., temp2.i = 0.; - i__3 = *k; - for (l = 1; l <= i__3; ++l) { - d_cnjg(&z__3, &a[l + i__ * a_dim1]); - i__4 = l + j * b_dim1; - z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, - z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] - .r; - z__1.r = temp1.r + z__2.r, z__1.i = temp1.i + z__2.i; - temp1.r = z__1.r, temp1.i = z__1.i; - d_cnjg(&z__3, &b[l + i__ * b_dim1]); - i__4 = l + j * a_dim1; - z__2.r = z__3.r * a[i__4].r - z__3.i * a[i__4].i, - z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4] - .r; - z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; - temp2.r = z__1.r, temp2.i = z__1.i; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = j; i__ <= i__2; ++i__) { + temp1.r = 0., temp1.i = 0.; + temp2.r = 0., temp2.i = 0.; + i__3 = *k; + for (l = 1; l <= i__3; ++l) { + d_cnjg(&z__3, &a[l + i__ * a_dim1]); + i__4 = l + j * b_dim1; + z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] + .r; + z__1.r = temp1.r + z__2.r, z__1.i = temp1.i + z__2.i; + temp1.r = z__1.r, temp1.i = z__1.i; + d_cnjg(&z__3, &b[l + i__ * b_dim1]); + i__4 = l + j * a_dim1; + z__2.r = z__3.r * a[i__4].r - z__3.i * a[i__4].i, + z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4] + .r; + z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; + temp2.r = z__1.r, temp2.i = z__1.i; /* L220: */ - } - if (i__ == j) { - if (*beta == 0.) { - i__3 = j + j * c_dim1; - z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__2.i = alpha->r * temp1.i + alpha->i * - temp1.r; - d_cnjg(&z__4, alpha); - z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, - z__3.i = z__4.r * temp2.i + z__4.i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - d__1 = z__1.r; - c__[i__3].r = d__1, c__[i__3].i = 0.; - } else { - i__3 = j + j * c_dim1; - i__4 = j + j * c_dim1; - z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__2.i = alpha->r * temp1.i + alpha->i * - temp1.r; - d_cnjg(&z__4, alpha); - z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, - z__3.i = z__4.r * temp2.i + z__4.i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - d__1 = *beta * c__[i__4].r + z__1.r; - c__[i__3].r = d__1, c__[i__3].i = 0.; - } - } else { - if (*beta == 0.) { - i__3 = i__ + j * c_dim1; - z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__2.i = alpha->r * temp1.i + alpha->i * - temp1.r; - d_cnjg(&z__4, alpha); - z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, - z__3.i = z__4.r * temp2.i + z__4.i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } else { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - z__3.r = *beta * c__[i__4].r, z__3.i = *beta * - c__[i__4].i; - z__4.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__4.i = alpha->r * temp1.i + alpha->i * - temp1.r; - z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + - z__4.i; - d_cnjg(&z__6, alpha); - z__5.r = z__6.r * temp2.r - z__6.i * temp2.i, - z__5.i = z__6.r * temp2.i + z__6.i * - temp2.r; - z__1.r = z__2.r + z__5.r, z__1.i = z__2.i + - z__5.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; - } - } + } + if (i__ == j) { + if (*beta == 0.) { + i__3 = j + j * c_dim1; + z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__2.i = alpha->r * temp1.i + alpha->i * + temp1.r; + d_cnjg(&z__4, alpha); + z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, + z__3.i = z__4.r * temp2.i + z__4.i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + d__1 = z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } else { + i__3 = j + j * c_dim1; + i__4 = j + j * c_dim1; + z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__2.i = alpha->r * temp1.i + alpha->i * + temp1.r; + d_cnjg(&z__4, alpha); + z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, + z__3.i = z__4.r * temp2.i + z__4.i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + d__1 = *beta * c__[i__4].r + z__1.r; + c__[i__3].r = d__1, c__[i__3].i = 0.; + } + } else { + if (*beta == 0.) { + i__3 = i__ + j * c_dim1; + z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__2.i = alpha->r * temp1.i + alpha->i * + temp1.r; + d_cnjg(&z__4, alpha); + z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, + z__3.i = z__4.r * temp2.i + z__4.i * + temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } else { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + z__3.r = *beta * c__[i__4].r, z__3.i = *beta * + c__[i__4].i; + z__4.r = alpha->r * temp1.r - alpha->i * temp1.i, + z__4.i = alpha->r * temp1.i + alpha->i * + temp1.r; + z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + + z__4.i; + d_cnjg(&z__6, alpha); + z__5.r = z__6.r * temp2.r - z__6.i * temp2.i, + z__5.i = z__6.r * temp2.i + z__6.i * + temp2.r; + z__1.r = z__2.r + z__5.r, z__1.i = z__2.i + + z__5.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + } + } /* L230: */ - } + } /* L240: */ - } - } + } + } } return 0; @@ -746,5 +746,5 @@ extern "C" { } /* zher2k_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zhetd2.cpp b/lib/linalg/zhetd2.cpp index c6c59ad6d5..71ad2aeab4 100644 --- a/lib/linalg/zhetd2.cpp +++ b/lib/linalg/zhetd2.cpp @@ -1,13 +1,13 @@ /* fortran/zhetd2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -197,9 +197,9 @@ f"> */ /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zhetd2_(char *uplo, integer *n, doublecomplex *a, - integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, - integer *info, ftnlen uplo_len) +/* Subroutine */ int zhetd2_(char *uplo, integer *n, doublecomplex *a, + integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, + integer *info, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -209,21 +209,21 @@ f"> */ /* Local variables */ integer i__; doublecomplex taui; - extern /* Subroutine */ int zher2_(char *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, ftnlen); + extern /* Subroutine */ int zher2_(char *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen); doublecomplex alpha; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *); - extern /* Subroutine */ int zhemv_(char *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, doublecomplex *, integer *, ftnlen); + extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *); + extern /* Subroutine */ int zhemv_(char *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, ftnlen); logical upper; - extern /* Subroutine */ int zaxpy_(integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *), xerbla_( - char *, integer *, ftnlen), zlarfg_(integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *); + extern /* Subroutine */ int zaxpy_(integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *), xerbla_( + char *, integer *, ftnlen), zlarfg_(integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *); /* -- LAPACK computational routine -- */ @@ -263,169 +263,169 @@ f"> */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*n)) { - *info = -4; + *info = -4; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZHETD2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZHETD2", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n <= 0) { - return 0; + return 0; } if (upper) { /* Reduce the upper triangle of A */ - i__1 = *n + *n * a_dim1; - i__2 = *n + *n * a_dim1; - d__1 = a[i__2].r; - a[i__1].r = d__1, a[i__1].i = 0.; - for (i__ = *n - 1; i__ >= 1; --i__) { + i__1 = *n + *n * a_dim1; + i__2 = *n + *n * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + for (i__ = *n - 1; i__ >= 1; --i__) { /* Generate elementary reflector H(i) = I - tau * v * v**H */ /* to annihilate A(1:i-1,i+1) */ - i__1 = i__ + (i__ + 1) * a_dim1; - alpha.r = a[i__1].r, alpha.i = a[i__1].i; - zlarfg_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &taui); - e[i__] = alpha.r; + i__1 = i__ + (i__ + 1) * a_dim1; + alpha.r = a[i__1].r, alpha.i = a[i__1].i; + zlarfg_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &taui); + e[i__] = alpha.r; - if (taui.r != 0. || taui.i != 0.) { + if (taui.r != 0. || taui.i != 0.) { /* Apply H(i) from both sides to A(1:i,1:i) */ - i__1 = i__ + (i__ + 1) * a_dim1; - a[i__1].r = 1., a[i__1].i = 0.; + i__1 = i__ + (i__ + 1) * a_dim1; + a[i__1].r = 1., a[i__1].i = 0.; /* Compute x := tau * A * v storing x in TAU(1:i) */ - zhemv_(uplo, &i__, &taui, &a[a_offset], lda, &a[(i__ + 1) * - a_dim1 + 1], &c__1, &c_b2, &tau[1], &c__1, (ftnlen)1); + zhemv_(uplo, &i__, &taui, &a[a_offset], lda, &a[(i__ + 1) * + a_dim1 + 1], &c__1, &c_b2, &tau[1], &c__1, (ftnlen)1); /* Compute w := x - 1/2 * tau * (x**H * v) * v */ - z__3.r = -.5, z__3.i = -0.; - z__2.r = z__3.r * taui.r - z__3.i * taui.i, z__2.i = z__3.r * - taui.i + z__3.i * taui.r; - zdotc_(&z__4, &i__, &tau[1], &c__1, &a[(i__ + 1) * a_dim1 + 1] - , &c__1); - z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * - z__4.i + z__2.i * z__4.r; - alpha.r = z__1.r, alpha.i = z__1.i; - zaxpy_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[ - 1], &c__1); + z__3.r = -.5, z__3.i = -0.; + z__2.r = z__3.r * taui.r - z__3.i * taui.i, z__2.i = z__3.r * + taui.i + z__3.i * taui.r; + zdotc_(&z__4, &i__, &tau[1], &c__1, &a[(i__ + 1) * a_dim1 + 1] + , &c__1); + z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * + z__4.i + z__2.i * z__4.r; + alpha.r = z__1.r, alpha.i = z__1.i; + zaxpy_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[ + 1], &c__1); /* Apply the transformation as a rank-2 update: */ /* A := A - v * w**H - w * v**H */ - z__1.r = -1., z__1.i = -0.; - zher2_(uplo, &i__, &z__1, &a[(i__ + 1) * a_dim1 + 1], &c__1, & - tau[1], &c__1, &a[a_offset], lda, (ftnlen)1); + z__1.r = -1., z__1.i = -0.; + zher2_(uplo, &i__, &z__1, &a[(i__ + 1) * a_dim1 + 1], &c__1, & + tau[1], &c__1, &a[a_offset], lda, (ftnlen)1); - } else { - i__1 = i__ + i__ * a_dim1; - i__2 = i__ + i__ * a_dim1; - d__1 = a[i__2].r; - a[i__1].r = d__1, a[i__1].i = 0.; - } - i__1 = i__ + (i__ + 1) * a_dim1; - i__2 = i__; - a[i__1].r = e[i__2], a[i__1].i = 0.; - i__1 = i__ + 1 + (i__ + 1) * a_dim1; - d__[i__ + 1] = a[i__1].r; - i__1 = i__; - tau[i__1].r = taui.r, tau[i__1].i = taui.i; + } else { + i__1 = i__ + i__ * a_dim1; + i__2 = i__ + i__ * a_dim1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + } + i__1 = i__ + (i__ + 1) * a_dim1; + i__2 = i__; + a[i__1].r = e[i__2], a[i__1].i = 0.; + i__1 = i__ + 1 + (i__ + 1) * a_dim1; + d__[i__ + 1] = a[i__1].r; + i__1 = i__; + tau[i__1].r = taui.r, tau[i__1].i = taui.i; /* L10: */ - } - i__1 = a_dim1 + 1; - d__[1] = a[i__1].r; + } + i__1 = a_dim1 + 1; + d__[1] = a[i__1].r; } else { /* Reduce the lower triangle of A */ - i__1 = a_dim1 + 1; - i__2 = a_dim1 + 1; - d__1 = a[i__2].r; - a[i__1].r = d__1, a[i__1].i = 0.; - i__1 = *n - 1; - for (i__ = 1; i__ <= i__1; ++i__) { + i__1 = a_dim1 + 1; + i__2 = a_dim1 + 1; + d__1 = a[i__2].r; + a[i__1].r = d__1, a[i__1].i = 0.; + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { /* Generate elementary reflector H(i) = I - tau * v * v**H */ /* to annihilate A(i+2:n,i) */ - i__2 = i__ + 1 + i__ * a_dim1; - alpha.r = a[i__2].r, alpha.i = a[i__2].i; - i__2 = *n - i__; + i__2 = i__ + 1 + i__ * a_dim1; + alpha.r = a[i__2].r, alpha.i = a[i__2].i; + i__2 = *n - i__; /* Computing MIN */ - i__3 = i__ + 2; - zlarfg_(&i__2, &alpha, &a[min(i__3,*n) + i__ * a_dim1], &c__1, & - taui); - e[i__] = alpha.r; + i__3 = i__ + 2; + zlarfg_(&i__2, &alpha, &a[min(i__3,*n) + i__ * a_dim1], &c__1, & + taui); + e[i__] = alpha.r; - if (taui.r != 0. || taui.i != 0.) { + if (taui.r != 0. || taui.i != 0.) { /* Apply H(i) from both sides to A(i+1:n,i+1:n) */ - i__2 = i__ + 1 + i__ * a_dim1; - a[i__2].r = 1., a[i__2].i = 0.; + i__2 = i__ + 1 + i__ * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; /* Compute x := tau * A * v storing y in TAU(i:n-1) */ - i__2 = *n - i__; - zhemv_(uplo, &i__2, &taui, &a[i__ + 1 + (i__ + 1) * a_dim1], - lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b2, &tau[ - i__], &c__1, (ftnlen)1); + i__2 = *n - i__; + zhemv_(uplo, &i__2, &taui, &a[i__ + 1 + (i__ + 1) * a_dim1], + lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b2, &tau[ + i__], &c__1, (ftnlen)1); /* Compute w := x - 1/2 * tau * (x**H * v) * v */ - z__3.r = -.5, z__3.i = -0.; - z__2.r = z__3.r * taui.r - z__3.i * taui.i, z__2.i = z__3.r * - taui.i + z__3.i * taui.r; - i__2 = *n - i__; - zdotc_(&z__4, &i__2, &tau[i__], &c__1, &a[i__ + 1 + i__ * - a_dim1], &c__1); - z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * - z__4.i + z__2.i * z__4.r; - alpha.r = z__1.r, alpha.i = z__1.i; - i__2 = *n - i__; - zaxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[ - i__], &c__1); + z__3.r = -.5, z__3.i = -0.; + z__2.r = z__3.r * taui.r - z__3.i * taui.i, z__2.i = z__3.r * + taui.i + z__3.i * taui.r; + i__2 = *n - i__; + zdotc_(&z__4, &i__2, &tau[i__], &c__1, &a[i__ + 1 + i__ * + a_dim1], &c__1); + z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * + z__4.i + z__2.i * z__4.r; + alpha.r = z__1.r, alpha.i = z__1.i; + i__2 = *n - i__; + zaxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[ + i__], &c__1); /* Apply the transformation as a rank-2 update: */ /* A := A - v * w**H - w * v**H */ - i__2 = *n - i__; - z__1.r = -1., z__1.i = -0.; - zher2_(uplo, &i__2, &z__1, &a[i__ + 1 + i__ * a_dim1], &c__1, - &tau[i__], &c__1, &a[i__ + 1 + (i__ + 1) * a_dim1], - lda, (ftnlen)1); + i__2 = *n - i__; + z__1.r = -1., z__1.i = -0.; + zher2_(uplo, &i__2, &z__1, &a[i__ + 1 + i__ * a_dim1], &c__1, + &tau[i__], &c__1, &a[i__ + 1 + (i__ + 1) * a_dim1], + lda, (ftnlen)1); - } else { - i__2 = i__ + 1 + (i__ + 1) * a_dim1; - i__3 = i__ + 1 + (i__ + 1) * a_dim1; - d__1 = a[i__3].r; - a[i__2].r = d__1, a[i__2].i = 0.; - } - i__2 = i__ + 1 + i__ * a_dim1; - i__3 = i__; - a[i__2].r = e[i__3], a[i__2].i = 0.; - i__2 = i__ + i__ * a_dim1; - d__[i__] = a[i__2].r; - i__2 = i__; - tau[i__2].r = taui.r, tau[i__2].i = taui.i; + } else { + i__2 = i__ + 1 + (i__ + 1) * a_dim1; + i__3 = i__ + 1 + (i__ + 1) * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } + i__2 = i__ + 1 + i__ * a_dim1; + i__3 = i__; + a[i__2].r = e[i__3], a[i__2].i = 0.; + i__2 = i__ + i__ * a_dim1; + d__[i__] = a[i__2].r; + i__2 = i__; + tau[i__2].r = taui.r, tau[i__2].i = taui.i; /* L20: */ - } - i__1 = *n + *n * a_dim1; - d__[*n] = a[i__1].r; + } + i__1 = *n + *n * a_dim1; + d__[*n] = a[i__1].r; } return 0; @@ -435,5 +435,5 @@ f"> */ } /* zhetd2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zhetrd.cpp b/lib/linalg/zhetrd.cpp index e1c8481bbb..ed3de347ef 100644 --- a/lib/linalg/zhetrd.cpp +++ b/lib/linalg/zhetrd.cpp @@ -1,13 +1,13 @@ /* fortran/zhetrd.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -216,9 +216,9 @@ f"> */ /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zhetrd_(char *uplo, integer *n, doublecomplex *a, - integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, - doublecomplex *work, integer *lwork, integer *info, ftnlen uplo_len) +/* Subroutine */ int zhetrd_(char *uplo, integer *n, doublecomplex *a, + integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, + doublecomplex *work, integer *lwork, integer *info, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; @@ -229,17 +229,17 @@ f"> */ extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; logical upper; - extern /* Subroutine */ int zhetd2_(char *, integer *, doublecomplex *, - integer *, doublereal *, doublereal *, doublecomplex *, integer *, - ftnlen), zher2k_(char *, char *, integer *, integer *, - doublecomplex *, doublecomplex *, integer *, doublecomplex *, - integer *, doublereal *, doublecomplex *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int zlatrd_(char *, integer *, integer *, - doublecomplex *, integer *, doublereal *, doublecomplex *, - doublecomplex *, integer *, ftnlen); + extern /* Subroutine */ int zhetd2_(char *, integer *, doublecomplex *, + integer *, doublereal *, doublereal *, doublecomplex *, integer *, + ftnlen), zher2k_(char *, char *, integer *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *, doublereal *, doublecomplex *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlatrd_(char *, integer *, integer *, + doublecomplex *, integer *, doublereal *, doublecomplex *, + doublecomplex *, integer *, ftnlen); integer ldwork, lwkopt; logical lquery; @@ -283,38 +283,38 @@ f"> */ upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*n)) { - *info = -4; + *info = -4; } else if (*lwork < 1 && ! lquery) { - *info = -9; + *info = -9; } if (*info == 0) { /* Determine the block size. */ - nb = ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, - (ftnlen)1); - lwkopt = *n * nb; - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + nb = ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, + (ftnlen)1); + lwkopt = *n * nb; + work[1].r = (doublereal) lwkopt, work[1].i = 0.; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZHETRD", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZHETRD", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - work[1].r = 1., work[1].i = 0.; - return 0; + work[1].r = 1., work[1].i = 0.; + return 0; } nx = *n; @@ -325,35 +325,35 @@ f"> */ /* (last block is always handled by unblocked code). */ /* Computing MAX */ - i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, & - c_n1, (ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); - if (nx < *n) { + i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, & + c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *n) { /* Determine if workspace is large enough for blocked code. */ - ldwork = *n; - iws = ldwork * nb; - if (*lwork < iws) { + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { /* Not enough workspace to use optimal NB: determine the */ /* minimum value of NB, and reduce NB or force use of */ /* unblocked code by setting NX = N. */ /* Computing MAX */ - i__1 = *lwork / ldwork; - nb = max(i__1,1); - nbmin = ilaenv_(&c__2, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, - (ftnlen)6, (ftnlen)1); - if (nb < nbmin) { - nx = *n; - } - } - } else { - nx = *n; - } + i__1 = *lwork / ldwork; + nb = max(i__1,1); + nbmin = ilaenv_(&c__2, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, + (ftnlen)6, (ftnlen)1); + if (nb < nbmin) { + nx = *n; + } + } + } else { + nx = *n; + } } else { - nb = 1; + nb = 1; } if (upper) { @@ -361,94 +361,94 @@ f"> */ /* Reduce the upper triangle of A. */ /* Columns 1:kk are handled by the unblocked method. */ - kk = *n - (*n - nx + nb - 1) / nb * nb; - i__1 = kk + 1; - i__2 = -nb; - for (i__ = *n - nb + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += - i__2) { + kk = *n - (*n - nx + nb - 1) / nb * nb; + i__1 = kk + 1; + i__2 = -nb; + for (i__ = *n - nb + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += + i__2) { /* Reduce columns i:i+nb-1 to tridiagonal form and form the */ /* matrix W which is needed to update the unreduced part of */ /* the matrix */ - i__3 = i__ + nb - 1; - zlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], & - work[1], &ldwork, (ftnlen)1); + i__3 = i__ + nb - 1; + zlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], & + work[1], &ldwork, (ftnlen)1); /* Update the unreduced submatrix A(1:i-1,1:i-1), using an */ /* update of the form: A := A - V*W**H - W*V**H */ - i__3 = i__ - 1; - z__1.r = -1., z__1.i = -0.; - zher2k_(uplo, (char *)"No transpose", &i__3, &nb, &z__1, &a[i__ * a_dim1 - + 1], lda, &work[1], &ldwork, &c_b23, &a[a_offset], lda, ( - ftnlen)1, (ftnlen)12); + i__3 = i__ - 1; + z__1.r = -1., z__1.i = -0.; + zher2k_(uplo, (char *)"No transpose", &i__3, &nb, &z__1, &a[i__ * a_dim1 + + 1], lda, &work[1], &ldwork, &c_b23, &a[a_offset], lda, ( + ftnlen)1, (ftnlen)12); /* Copy superdiagonal elements back into A, and diagonal */ /* elements into D */ - i__3 = i__ + nb - 1; - for (j = i__; j <= i__3; ++j) { - i__4 = j - 1 + j * a_dim1; - i__5 = j - 1; - a[i__4].r = e[i__5], a[i__4].i = 0.; - i__4 = j + j * a_dim1; - d__[j] = a[i__4].r; + i__3 = i__ + nb - 1; + for (j = i__; j <= i__3; ++j) { + i__4 = j - 1 + j * a_dim1; + i__5 = j - 1; + a[i__4].r = e[i__5], a[i__4].i = 0.; + i__4 = j + j * a_dim1; + d__[j] = a[i__4].r; /* L10: */ - } + } /* L20: */ - } + } /* Use unblocked code to reduce the last or only block */ - zhetd2_(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo, - (ftnlen)1); + zhetd2_(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo, + (ftnlen)1); } else { /* Reduce the lower triangle of A */ - i__2 = *n - nx; - i__1 = nb; - for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { + i__2 = *n - nx; + i__1 = nb; + for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { /* Reduce columns i:i+nb-1 to tridiagonal form and form the */ /* matrix W which is needed to update the unreduced part of */ /* the matrix */ - i__3 = *n - i__ + 1; - zlatrd_(uplo, &i__3, &nb, &a[i__ + i__ * a_dim1], lda, &e[i__], & - tau[i__], &work[1], &ldwork, (ftnlen)1); + i__3 = *n - i__ + 1; + zlatrd_(uplo, &i__3, &nb, &a[i__ + i__ * a_dim1], lda, &e[i__], & + tau[i__], &work[1], &ldwork, (ftnlen)1); /* Update the unreduced submatrix A(i+nb:n,i+nb:n), using */ /* an update of the form: A := A - V*W**H - W*V**H */ - i__3 = *n - i__ - nb + 1; - z__1.r = -1., z__1.i = -0.; - zher2k_(uplo, (char *)"No transpose", &i__3, &nb, &z__1, &a[i__ + nb + - i__ * a_dim1], lda, &work[nb + 1], &ldwork, &c_b23, &a[ - i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)1, (ftnlen) - 12); + i__3 = *n - i__ - nb + 1; + z__1.r = -1., z__1.i = -0.; + zher2k_(uplo, (char *)"No transpose", &i__3, &nb, &z__1, &a[i__ + nb + + i__ * a_dim1], lda, &work[nb + 1], &ldwork, &c_b23, &a[ + i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)1, (ftnlen) + 12); /* Copy subdiagonal elements back into A, and diagonal */ /* elements into D */ - i__3 = i__ + nb - 1; - for (j = i__; j <= i__3; ++j) { - i__4 = j + 1 + j * a_dim1; - i__5 = j; - a[i__4].r = e[i__5], a[i__4].i = 0.; - i__4 = j + j * a_dim1; - d__[j] = a[i__4].r; + i__3 = i__ + nb - 1; + for (j = i__; j <= i__3; ++j) { + i__4 = j + 1 + j * a_dim1; + i__5 = j; + a[i__4].r = e[i__5], a[i__4].i = 0.; + i__4 = j + j * a_dim1; + d__[j] = a[i__4].r; /* L30: */ - } + } /* L40: */ - } + } /* Use unblocked code to reduce the last or only block */ - i__1 = *n - i__ + 1; - zhetd2_(uplo, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], - &tau[i__], &iinfo, (ftnlen)1); + i__1 = *n - i__ + 1; + zhetd2_(uplo, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], + &tau[i__], &iinfo, (ftnlen)1); } work[1].r = (doublereal) lwkopt, work[1].i = 0.; @@ -459,5 +459,5 @@ f"> */ } /* zhetrd_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zhpr.cpp b/lib/linalg/zhpr.cpp index f3c36d5826..b977b2ce1e 100644 --- a/lib/linalg/zhpr.cpp +++ b/lib/linalg/zhpr.cpp @@ -1,13 +1,13 @@ /* fortran/zhpr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -143,8 +143,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zhpr_(char *uplo, integer *n, doublereal *alpha, - doublecomplex *x, integer *incx, doublecomplex *ap, ftnlen uplo_len) +/* Subroutine */ int zhpr_(char *uplo, integer *n, doublereal *alpha, + doublecomplex *x, integer *incx, doublecomplex *ap, ftnlen uplo_len) { /* System generated locals */ integer i__1, i__2, i__3, i__4, i__5; @@ -192,30 +192,30 @@ extern "C" { /* Function Body */ info = 0; if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { - info = 1; + ftnlen)1, (ftnlen)1)) { + info = 1; } else if (*n < 0) { - info = 2; + info = 2; } else if (*incx == 0) { - info = 5; + info = 5; } if (info != 0) { - xerbla_((char *)"ZHPR ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"ZHPR ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*n == 0 || *alpha == 0.) { - return 0; + return 0; } /* Set the start point in X if the increment is not unity. */ if (*incx <= 0) { - kx = 1 - (*n - 1) * *incx; + kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { - kx = 1; + kx = 1; } /* Start the operations. In this version the elements of the array AP */ @@ -226,172 +226,172 @@ extern "C" { /* Form A when upper triangle is stored in AP. */ - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - if (x[i__2].r != 0. || x[i__2].i != 0.) { - d_cnjg(&z__2, &x[j]); - z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - k = kk; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = k; - i__4 = k; - i__5 = i__; - z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, - z__2.i = x[i__5].r * temp.i + x[i__5].i * - temp.r; - z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + - z__2.i; - ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; - ++k; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + d_cnjg(&z__2, &x[j]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + k = kk; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = k; + i__4 = k; + i__5 = i__; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * + temp.r; + z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + + z__2.i; + ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; + ++k; /* L10: */ - } - i__2 = kk + j - 1; - i__3 = kk + j - 1; - i__4 = j; - z__1.r = x[i__4].r * temp.r - x[i__4].i * temp.i, z__1.i = - x[i__4].r * temp.i + x[i__4].i * temp.r; - d__1 = ap[i__3].r + z__1.r; - ap[i__2].r = d__1, ap[i__2].i = 0.; - } else { - i__2 = kk + j - 1; - i__3 = kk + j - 1; - d__1 = ap[i__3].r; - ap[i__2].r = d__1, ap[i__2].i = 0.; - } - kk += j; + } + i__2 = kk + j - 1; + i__3 = kk + j - 1; + i__4 = j; + z__1.r = x[i__4].r * temp.r - x[i__4].i * temp.i, z__1.i = + x[i__4].r * temp.i + x[i__4].i * temp.r; + d__1 = ap[i__3].r + z__1.r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + } else { + i__2 = kk + j - 1; + i__3 = kk + j - 1; + d__1 = ap[i__3].r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + } + kk += j; /* L20: */ - } - } else { - jx = kx; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - if (x[i__2].r != 0. || x[i__2].i != 0.) { - d_cnjg(&z__2, &x[jx]); - z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - ix = kx; - i__2 = kk + j - 2; - for (k = kk; k <= i__2; ++k) { - i__3 = k; - i__4 = k; - i__5 = ix; - z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, - z__2.i = x[i__5].r * temp.i + x[i__5].i * - temp.r; - z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + - z__2.i; - ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; - ix += *incx; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + d_cnjg(&z__2, &x[jx]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix = kx; + i__2 = kk + j - 2; + for (k = kk; k <= i__2; ++k) { + i__3 = k; + i__4 = k; + i__5 = ix; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * + temp.r; + z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + + z__2.i; + ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; + ix += *incx; /* L30: */ - } - i__2 = kk + j - 1; - i__3 = kk + j - 1; - i__4 = jx; - z__1.r = x[i__4].r * temp.r - x[i__4].i * temp.i, z__1.i = - x[i__4].r * temp.i + x[i__4].i * temp.r; - d__1 = ap[i__3].r + z__1.r; - ap[i__2].r = d__1, ap[i__2].i = 0.; - } else { - i__2 = kk + j - 1; - i__3 = kk + j - 1; - d__1 = ap[i__3].r; - ap[i__2].r = d__1, ap[i__2].i = 0.; - } - jx += *incx; - kk += j; + } + i__2 = kk + j - 1; + i__3 = kk + j - 1; + i__4 = jx; + z__1.r = x[i__4].r * temp.r - x[i__4].i * temp.i, z__1.i = + x[i__4].r * temp.i + x[i__4].i * temp.r; + d__1 = ap[i__3].r + z__1.r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + } else { + i__2 = kk + j - 1; + i__3 = kk + j - 1; + d__1 = ap[i__3].r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + } + jx += *incx; + kk += j; /* L40: */ - } - } + } + } } else { /* Form A when lower triangle is stored in AP. */ - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - if (x[i__2].r != 0. || x[i__2].i != 0.) { - d_cnjg(&z__2, &x[j]); - z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - i__2 = kk; - i__3 = kk; - i__4 = j; - z__1.r = temp.r * x[i__4].r - temp.i * x[i__4].i, z__1.i = - temp.r * x[i__4].i + temp.i * x[i__4].r; - d__1 = ap[i__3].r + z__1.r; - ap[i__2].r = d__1, ap[i__2].i = 0.; - k = kk + 1; - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - i__3 = k; - i__4 = k; - i__5 = i__; - z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, - z__2.i = x[i__5].r * temp.i + x[i__5].i * - temp.r; - z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + - z__2.i; - ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; - ++k; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + d_cnjg(&z__2, &x[j]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = kk; + i__3 = kk; + i__4 = j; + z__1.r = temp.r * x[i__4].r - temp.i * x[i__4].i, z__1.i = + temp.r * x[i__4].i + temp.i * x[i__4].r; + d__1 = ap[i__3].r + z__1.r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + k = kk + 1; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = k; + i__4 = k; + i__5 = i__; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * + temp.r; + z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + + z__2.i; + ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; + ++k; /* L50: */ - } - } else { - i__2 = kk; - i__3 = kk; - d__1 = ap[i__3].r; - ap[i__2].r = d__1, ap[i__2].i = 0.; - } - kk = kk + *n - j + 1; + } + } else { + i__2 = kk; + i__3 = kk; + d__1 = ap[i__3].r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + } + kk = kk + *n - j + 1; /* L60: */ - } - } else { - jx = kx; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - if (x[i__2].r != 0. || x[i__2].i != 0.) { - d_cnjg(&z__2, &x[jx]); - z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - i__2 = kk; - i__3 = kk; - i__4 = jx; - z__1.r = temp.r * x[i__4].r - temp.i * x[i__4].i, z__1.i = - temp.r * x[i__4].i + temp.i * x[i__4].r; - d__1 = ap[i__3].r + z__1.r; - ap[i__2].r = d__1, ap[i__2].i = 0.; - ix = jx; - i__2 = kk + *n - j; - for (k = kk + 1; k <= i__2; ++k) { - ix += *incx; - i__3 = k; - i__4 = k; - i__5 = ix; - z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, - z__2.i = x[i__5].r * temp.i + x[i__5].i * - temp.r; - z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + - z__2.i; - ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + d_cnjg(&z__2, &x[jx]); + z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = kk; + i__3 = kk; + i__4 = jx; + z__1.r = temp.r * x[i__4].r - temp.i * x[i__4].i, z__1.i = + temp.r * x[i__4].i + temp.i * x[i__4].r; + d__1 = ap[i__3].r + z__1.r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + ix = jx; + i__2 = kk + *n - j; + for (k = kk + 1; k <= i__2; ++k) { + ix += *incx; + i__3 = k; + i__4 = k; + i__5 = ix; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * + temp.r; + z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + + z__2.i; + ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; /* L70: */ - } - } else { - i__2 = kk; - i__3 = kk; - d__1 = ap[i__3].r; - ap[i__2].r = d__1, ap[i__2].i = 0.; - } - jx += *incx; - kk = kk + *n - j + 1; + } + } else { + i__2 = kk; + i__3 = kk; + d__1 = ap[i__3].r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + } + jx += *incx; + kk = kk + *n - j + 1; /* L80: */ - } - } + } + } } return 0; @@ -401,5 +401,5 @@ extern "C" { } /* zhpr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlacgv.cpp b/lib/linalg/zlacgv.cpp index 46c1c5c0ce..9e9a4050b2 100644 --- a/lib/linalg/zlacgv.cpp +++ b/lib/linalg/zlacgv.cpp @@ -1,13 +1,13 @@ /* fortran/zlacgv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -125,26 +125,26 @@ f"> */ /* Function Body */ if (*incx == 1) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__; - d_cnjg(&z__1, &x[i__]); - x[i__2].r = z__1.r, x[i__2].i = z__1.i; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + d_cnjg(&z__1, &x[i__]); + x[i__2].r = z__1.r, x[i__2].i = z__1.i; /* L10: */ - } + } } else { - ioff = 1; - if (*incx < 0) { - ioff = 1 - (*n - 1) * *incx; - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = ioff; - d_cnjg(&z__1, &x[ioff]); - x[i__2].r = z__1.r, x[i__2].i = z__1.i; - ioff += *incx; + ioff = 1; + if (*incx < 0) { + ioff = 1 - (*n - 1) * *incx; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ioff; + d_cnjg(&z__1, &x[ioff]); + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + ioff += *incx; /* L20: */ - } + } } return 0; @@ -153,5 +153,5 @@ f"> */ } /* zlacgv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlacpy.cpp b/lib/linalg/zlacpy.cpp index 1cb52d4c0a..4a68cd9e07 100644 --- a/lib/linalg/zlacpy.cpp +++ b/lib/linalg/zlacpy.cpp @@ -1,13 +1,13 @@ /* fortran/zlacpy.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -119,9 +119,9 @@ f"> */ /* > \ingroup complex16OTHERauxiliary */ /* ===================================================================== */ -/* Subroutine */ int zlacpy_(char *uplo, integer *m, integer *n, - doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, - ftnlen uplo_len) +/* Subroutine */ int zlacpy_(char *uplo, integer *m, integer *n, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; @@ -160,43 +160,43 @@ f"> */ /* Function Body */ if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = min(j,*m); - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * b_dim1; - i__4 = i__ + j * a_dim1; - b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = min(j,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * a_dim1; + b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; /* L10: */ - } + } /* L20: */ - } + } } else if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = j; i__ <= i__2; ++i__) { - i__3 = i__ + j * b_dim1; - i__4 = i__ + j * a_dim1; - b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * a_dim1; + b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; /* L30: */ - } + } /* L40: */ - } + } } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * b_dim1; - i__4 = i__ + j * a_dim1; - b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * a_dim1; + b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; /* L50: */ - } + } /* L60: */ - } + } } return 0; @@ -206,5 +206,5 @@ f"> */ } /* zlacpy_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlacrm.cpp b/lib/linalg/zlacrm.cpp index e993f79aa5..46508ae4a9 100644 --- a/lib/linalg/zlacrm.cpp +++ b/lib/linalg/zlacrm.cpp @@ -1,13 +1,13 @@ /* fortran/zlacrm.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -135,13 +135,13 @@ f"> */ /* > \ingroup complex16OTHERauxiliary */ /* ===================================================================== */ -/* Subroutine */ int zlacrm_(integer *m, integer *n, doublecomplex *a, - integer *lda, doublereal *b, integer *ldb, doublecomplex *c__, - integer *ldc, doublereal *rwork) +/* Subroutine */ int zlacrm_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublereal *b, integer *ldb, doublecomplex *c__, + integer *ldc, doublereal *rwork) { /* System generated locals */ - integer b_dim1, b_offset, a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, - i__3, i__4, i__5; + integer b_dim1, b_offset, a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, + i__3, i__4, i__5; doublereal d__1; doublecomplex z__1; @@ -150,9 +150,9 @@ f"> */ /* Local variables */ integer i__, j, l; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); /* -- LAPACK auxiliary routine -- */ @@ -192,58 +192,58 @@ f"> */ /* Function Body */ if (*m == 0 || *n == 0) { - return 0; + return 0; } i__1 = *n; for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - rwork[(j - 1) * *m + i__] = a[i__3].r; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + rwork[(j - 1) * *m + i__] = a[i__3].r; /* L10: */ - } + } /* L20: */ } l = *m * *n + 1; dgemm_((char *)"N", (char *)"N", m, n, n, &c_b6, &rwork[1], m, &b[b_offset], ldb, &c_b7, & - rwork[l], m, (ftnlen)1, (ftnlen)1); + rwork[l], m, (ftnlen)1, (ftnlen)1); i__1 = *n; for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - i__4 = l + (j - 1) * *m + i__ - 1; - c__[i__3].r = rwork[i__4], c__[i__3].i = 0.; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = l + (j - 1) * *m + i__ - 1; + c__[i__3].r = rwork[i__4], c__[i__3].i = 0.; /* L30: */ - } + } /* L40: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - rwork[(j - 1) * *m + i__] = d_imag(&a[i__ + j * a_dim1]); + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + rwork[(j - 1) * *m + i__] = d_imag(&a[i__ + j * a_dim1]); /* L50: */ - } + } /* L60: */ } dgemm_((char *)"N", (char *)"N", m, n, n, &c_b6, &rwork[1], m, &b[b_offset], ldb, &c_b7, & - rwork[l], m, (ftnlen)1, (ftnlen)1); + rwork[l], m, (ftnlen)1, (ftnlen)1); i__1 = *n; for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - d__1 = c__[i__4].r; - i__5 = l + (j - 1) * *m + i__ - 1; - z__1.r = d__1, z__1.i = rwork[i__5]; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + d__1 = c__[i__4].r; + i__5 = l + (j - 1) * *m + i__ - 1; + z__1.r = d__1, z__1.i = rwork[i__5]; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L70: */ - } + } /* L80: */ } @@ -254,5 +254,5 @@ f"> */ } /* zlacrm_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zladiv.cpp b/lib/linalg/zladiv.cpp index 6e80b3371a..6b065d5ce0 100644 --- a/lib/linalg/zladiv.cpp +++ b/lib/linalg/zladiv.cpp @@ -1,13 +1,13 @@ /* fortran/zladiv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -80,8 +80,8 @@ f"> */ /* > \ingroup complex16OTHERauxiliary */ /* ===================================================================== */ -/* Double Complex */ VOID zladiv_(doublecomplex * ret_val, doublecomplex *x, - doublecomplex *y) +/* Double Complex */ VOID zladiv_(doublecomplex * ret_val, doublecomplex *x, + doublecomplex *y) { /* System generated locals */ doublereal d__1, d__2, d__3, d__4; @@ -92,8 +92,8 @@ f"> */ /* Local variables */ doublereal zi, zr; - extern /* Subroutine */ int dladiv_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *); + extern /* Subroutine */ int dladiv_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *); /* -- LAPACK auxiliary routine -- */ @@ -128,5 +128,5 @@ f"> */ } /* zladiv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlaed0.cpp b/lib/linalg/zlaed0.cpp index 680dd85054..98bc39611d 100644 --- a/lib/linalg/zlaed0.cpp +++ b/lib/linalg/zlaed0.cpp @@ -1,13 +1,13 @@ /* fortran/zlaed0.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -22,7 +22,7 @@ static integer c__0 = 0; static integer c__2 = 2; static integer c__1 = 1; -/* > \brief \b ZLAED0 used by ZSTEDC. Computes all eigenvalues and corresponding eigenvectors of an unreduced +/* > \brief \b ZLAED0 used by ZSTEDC. Computes all eigenvalues and corresponding eigenvectors of an unreduced symmetric tridiagonal matrix using the divide and conquer method. */ /* =========== DOCUMENTATION =========== */ @@ -168,9 +168,9 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zlaed0_(integer *qsiz, integer *n, doublereal *d__, - doublereal *e, doublecomplex *q, integer *ldq, doublecomplex *qstore, - integer *ldqs, doublereal *rwork, integer *iwork, integer *info) +/* Subroutine */ int zlaed0_(integer *qsiz, integer *n, doublereal *d__, + doublereal *e, doublecomplex *q, integer *ldq, doublecomplex *qstore, + integer *ldqs, doublereal *rwork, integer *iwork, integer *info) { /* System generated locals */ integer q_dim1, q_offset, qstore_dim1, qstore_offset, i__1, i__2; @@ -184,27 +184,27 @@ f"> */ integer i__, j, k, ll, iq, lgn, msd2, smm1, spm1, spm2; doublereal temp; integer curr, iperm; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, + doublereal *, integer *); integer indxq, iwrem, iqptr, tlvls; - extern /* Subroutine */ int zcopy_(integer *, doublecomplex *, integer *, - doublecomplex *, integer *), zlaed7_(integer *, integer *, - integer *, integer *, integer *, integer *, doublereal *, - doublecomplex *, integer *, doublereal *, integer *, doublereal *, - integer *, integer *, integer *, integer *, integer *, - doublereal *, doublecomplex *, doublereal *, integer *, integer *) - ; + extern /* Subroutine */ int zcopy_(integer *, doublecomplex *, integer *, + doublecomplex *, integer *), zlaed7_(integer *, integer *, + integer *, integer *, integer *, integer *, doublereal *, + doublecomplex *, integer *, doublereal *, integer *, doublereal *, + integer *, integer *, integer *, integer *, integer *, + doublereal *, doublecomplex *, doublereal *, integer *, integer *) + ; integer igivcl; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ int zlacrm_(integer *, integer *, doublecomplex *, - integer *, doublereal *, integer *, doublecomplex *, integer *, - doublereal *); + integer *, doublereal *, integer *, doublecomplex *, integer *, + doublereal *); integer igivnm, submat, curprb, subpbs, igivpt; - extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - ftnlen); + extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + ftnlen); integer curlvl, matsiz, iprmpt, smlsiz; @@ -255,28 +255,28 @@ f"> */ /* ELSE IF( ( ICOMPQ .EQ. 1 ) .AND. ( QSIZ .LT. MAX( 0, N ) ) ) */ /* $ THEN */ if (*qsiz < max(0,*n)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*ldq < max(1,*n)) { - *info = -6; + *info = -6; } else if (*ldqs < max(1,*n)) { - *info = -8; + *info = -8; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZLAED0", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZLAED0", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } smlsiz = ilaenv_(&c__9, (char *)"ZLAED0", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( - ftnlen)6, (ftnlen)1); + ftnlen)6, (ftnlen)1); /* Determine the size and placement of the submatrices, and save in */ /* the leading elements of IWORK. */ @@ -286,18 +286,18 @@ f"> */ tlvls = 0; L10: if (iwork[subpbs] > smlsiz) { - for (j = subpbs; j >= 1; --j) { - iwork[j * 2] = (iwork[j] + 1) / 2; - iwork[(j << 1) - 1] = iwork[j] / 2; + for (j = subpbs; j >= 1; --j) { + iwork[j * 2] = (iwork[j] + 1) / 2; + iwork[(j << 1) - 1] = iwork[j] / 2; /* L20: */ - } - ++tlvls; - subpbs <<= 1; - goto L10; + } + ++tlvls; + subpbs <<= 1; + goto L10; } i__1 = subpbs; for (j = 2; j <= i__1; ++j) { - iwork[j] += iwork[j - 1]; + iwork[j] += iwork[j - 1]; /* L30: */ } @@ -307,10 +307,10 @@ L10: spm1 = subpbs - 1; i__1 = spm1; for (i__ = 1; i__ <= i__1; ++i__) { - submat = iwork[i__] + 1; - smm1 = submat - 1; - d__[smm1] -= (d__1 = e[smm1], abs(d__1)); - d__[submat] -= (d__1 = e[smm1], abs(d__1)); + submat = iwork[i__] + 1; + smm1 = submat - 1; + d__[smm1] -= (d__1 = e[smm1], abs(d__1)); + d__[submat] -= (d__1 = e[smm1], abs(d__1)); /* L40: */ } @@ -322,10 +322,10 @@ L10: temp = log((doublereal) (*n)) / log(2.); lgn = (integer) temp; if (pow_ii(&c__2, &lgn) < *n) { - ++lgn; + ++lgn; } if (pow_ii(&c__2, &lgn) < *n) { - ++lgn; + ++lgn; } iprmpt = indxq + *n + 1; iperm = iprmpt + *n * lgn; @@ -341,8 +341,8 @@ L10: /* Initialize pointers */ i__1 = subpbs; for (i__ = 0; i__ <= i__1; ++i__) { - iwork[iprmpt + i__] = 1; - iwork[igivpt + i__] = 1; + iwork[iprmpt + i__] = 1; + iwork[igivpt + i__] = 1; /* L50: */ } iwork[iqptr] = 1; @@ -353,34 +353,34 @@ L10: curr = 0; i__1 = spm1; for (i__ = 0; i__ <= i__1; ++i__) { - if (i__ == 0) { - submat = 1; - matsiz = iwork[1]; - } else { - submat = iwork[i__] + 1; - matsiz = iwork[i__ + 1] - iwork[i__]; - } - ll = iq - 1 + iwork[iqptr + curr]; - dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &rwork[ll], &matsiz, & - rwork[1], info, (ftnlen)1); - zlacrm_(qsiz, &matsiz, &q[submat * q_dim1 + 1], ldq, &rwork[ll], & - matsiz, &qstore[submat * qstore_dim1 + 1], ldqs, &rwork[iwrem] - ); + if (i__ == 0) { + submat = 1; + matsiz = iwork[1]; + } else { + submat = iwork[i__] + 1; + matsiz = iwork[i__ + 1] - iwork[i__]; + } + ll = iq - 1 + iwork[iqptr + curr]; + dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &rwork[ll], &matsiz, & + rwork[1], info, (ftnlen)1); + zlacrm_(qsiz, &matsiz, &q[submat * q_dim1 + 1], ldq, &rwork[ll], & + matsiz, &qstore[submat * qstore_dim1 + 1], ldqs, &rwork[iwrem] + ); /* Computing 2nd power */ - i__2 = matsiz; - iwork[iqptr + curr + 1] = iwork[iqptr + curr] + i__2 * i__2; - ++curr; - if (*info > 0) { - *info = submat * (*n + 1) + submat + matsiz - 1; - return 0; - } - k = 1; - i__2 = iwork[i__ + 1]; - for (j = submat; j <= i__2; ++j) { - iwork[indxq + j] = k; - ++k; + i__2 = matsiz; + iwork[iqptr + curr + 1] = iwork[iqptr + curr] + i__2 * i__2; + ++curr; + if (*info > 0) { + *info = submat * (*n + 1) + submat + matsiz - 1; + return 0; + } + k = 1; + i__2 = iwork[i__ + 1]; + for (j = submat; j <= i__2; ++j) { + iwork[indxq + j] = k; + ++k; /* L60: */ - } + } /* L70: */ } @@ -392,20 +392,20 @@ L10: curlvl = 1; L80: if (subpbs > 1) { - spm2 = subpbs - 2; - i__1 = spm2; - for (i__ = 0; i__ <= i__1; i__ += 2) { - if (i__ == 0) { - submat = 1; - matsiz = iwork[2]; - msd2 = iwork[1]; - curprb = 0; - } else { - submat = iwork[i__] + 1; - matsiz = iwork[i__ + 2] - iwork[i__]; - msd2 = matsiz / 2; - ++curprb; - } + spm2 = subpbs - 2; + i__1 = spm2; + for (i__ = 0; i__ <= i__1; i__ += 2) { + if (i__ == 0) { + submat = 1; + matsiz = iwork[2]; + msd2 = iwork[1]; + curprb = 0; + } else { + submat = iwork[i__] + 1; + matsiz = iwork[i__ + 2] - iwork[i__]; + msd2 = matsiz / 2; + ++curprb; + } /* Merge lower order eigensystems (of size MSD2 and MATSIZ - MSD2) */ /* into an eigensystem of size MATSIZ. ZLAED7 handles the case */ @@ -414,22 +414,22 @@ L80: /* I am free to use Q as a valuable working space until Loop 150. */ - zlaed7_(&matsiz, &msd2, qsiz, &tlvls, &curlvl, &curprb, &d__[ - submat], &qstore[submat * qstore_dim1 + 1], ldqs, &e[ - submat + msd2 - 1], &iwork[indxq + submat], &rwork[iq], & - iwork[iqptr], &iwork[iprmpt], &iwork[iperm], &iwork[ - igivpt], &iwork[igivcl], &rwork[igivnm], &q[submat * - q_dim1 + 1], &rwork[iwrem], &iwork[subpbs + 1], info); - if (*info > 0) { - *info = submat * (*n + 1) + submat + matsiz - 1; - return 0; - } - iwork[i__ / 2 + 1] = iwork[i__ + 2]; + zlaed7_(&matsiz, &msd2, qsiz, &tlvls, &curlvl, &curprb, &d__[ + submat], &qstore[submat * qstore_dim1 + 1], ldqs, &e[ + submat + msd2 - 1], &iwork[indxq + submat], &rwork[iq], & + iwork[iqptr], &iwork[iprmpt], &iwork[iperm], &iwork[ + igivpt], &iwork[igivcl], &rwork[igivnm], &q[submat * + q_dim1 + 1], &rwork[iwrem], &iwork[subpbs + 1], info); + if (*info > 0) { + *info = submat * (*n + 1) + submat + matsiz - 1; + return 0; + } + iwork[i__ / 2 + 1] = iwork[i__ + 2]; /* L90: */ - } - subpbs /= 2; - ++curlvl; - goto L80; + } + subpbs /= 2; + ++curlvl; + goto L80; } /* end while */ @@ -439,10 +439,10 @@ L80: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - j = iwork[indxq + i__]; - rwork[i__] = d__[j]; - zcopy_(qsiz, &qstore[j * qstore_dim1 + 1], &c__1, &q[i__ * q_dim1 + 1] - , &c__1); + j = iwork[indxq + i__]; + rwork[i__] = d__[j]; + zcopy_(qsiz, &qstore[j * qstore_dim1 + 1], &c__1, &q[i__ * q_dim1 + 1] + , &c__1); /* L100: */ } dcopy_(n, &rwork[1], &c__1, &d__[1], &c__1); @@ -454,5 +454,5 @@ L80: } /* zlaed0_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlaed7.cpp b/lib/linalg/zlaed7.cpp index 9c06a0c334..b20d805e62 100644 --- a/lib/linalg/zlaed7.cpp +++ b/lib/linalg/zlaed7.cpp @@ -1,13 +1,13 @@ /* fortran/zlaed7.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -269,12 +269,12 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zlaed7_(integer *n, integer *cutpnt, integer *qsiz, - integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, - doublecomplex *q, integer *ldq, doublereal *rho, integer *indxq, - doublereal *qstore, integer *qptr, integer *prmptr, integer *perm, - integer *givptr, integer *givcol, doublereal *givnum, doublecomplex * - work, doublereal *rwork, integer *iwork, integer *info) +/* Subroutine */ int zlaed7_(integer *n, integer *cutpnt, integer *qsiz, + integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, + doublecomplex *q, integer *ldq, doublereal *rho, integer *indxq, + doublereal *qstore, integer *qptr, integer *prmptr, integer *perm, + integer *givptr, integer *givcol, doublereal *givnum, doublecomplex * + work, doublereal *rwork, integer *iwork, integer *info) { /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; @@ -284,23 +284,23 @@ f"> */ /* Local variables */ integer i__, k, n1, n2, iq, iw, iz, ptr, indx, curr, indxc, indxp; - extern /* Subroutine */ int dlaed9_(integer *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - doublereal *, doublereal *, doublereal *, integer *, integer *), - zlaed8_(integer *, integer *, integer *, doublecomplex *, integer - *, doublereal *, doublereal *, integer *, doublereal *, - doublereal *, doublecomplex *, integer *, doublereal *, integer *, - integer *, integer *, integer *, integer *, integer *, - doublereal *, integer *), dlaeda_(integer *, integer *, integer *, - integer *, integer *, integer *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, doublereal *, - integer *); + extern /* Subroutine */ int dlaed9_(integer *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, integer *), + zlaed8_(integer *, integer *, integer *, doublecomplex *, integer + *, doublereal *, doublereal *, integer *, doublereal *, + doublereal *, doublecomplex *, integer *, doublereal *, integer *, + integer *, integer *, integer *, integer *, integer *, + doublereal *, integer *), dlaeda_(integer *, integer *, integer *, + integer *, integer *, integer *, integer *, integer *, + doublereal *, doublereal *, integer *, doublereal *, doublereal *, + integer *); integer idlmda; - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen), zlacrm_(integer *, integer *, doublecomplex *, integer *, - doublereal *, integer *, doublecomplex *, integer *, doublereal * - ); + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen), zlacrm_(integer *, integer *, doublecomplex *, integer *, + doublereal *, integer *, doublecomplex *, integer *, doublereal * + ); integer coltyp; @@ -349,24 +349,24 @@ f"> */ /* INFO = -1 */ /* ELSE IF( N.LT.0 ) THEN */ if (*n < 0) { - *info = -1; + *info = -1; } else if (min(1,*n) > *cutpnt || *n < *cutpnt) { - *info = -2; + *info = -2; } else if (*qsiz < *n) { - *info = -3; + *info = -3; } else if (*ldq < max(1,*n)) { - *info = -9; + *info = -9; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZLAED7", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZLAED7", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } /* The following values are for bookkeeping purposes only. They are */ @@ -389,60 +389,60 @@ f"> */ ptr = pow_ii(&c__2, tlvls) + 1; i__1 = *curlvl - 1; for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = *tlvls - i__; - ptr += pow_ii(&c__2, &i__2); + i__2 = *tlvls - i__; + ptr += pow_ii(&c__2, &i__2); /* L10: */ } curr = ptr + *curpbm; dlaeda_(n, tlvls, curlvl, curpbm, &prmptr[1], &perm[1], &givptr[1], & - givcol[3], &givnum[3], &qstore[1], &qptr[1], &rwork[iz], &rwork[ - iz + *n], info); + givcol[3], &givnum[3], &qstore[1], &qptr[1], &rwork[iz], &rwork[ + iz + *n], info); /* When solving the final problem, we no longer need the stored data, */ /* so we will overwrite the data from this level onto the previously */ /* used storage space. */ if (*curlvl == *tlvls) { - qptr[curr] = 1; - prmptr[curr] = 1; - givptr[curr] = 1; + qptr[curr] = 1; + prmptr[curr] = 1; + givptr[curr] = 1; } /* Sort and Deflate eigenvalues. */ - zlaed8_(&k, n, qsiz, &q[q_offset], ldq, &d__[1], rho, cutpnt, &rwork[iz], - &rwork[idlmda], &work[1], qsiz, &rwork[iw], &iwork[indxp], &iwork[ - indx], &indxq[1], &perm[prmptr[curr]], &givptr[curr + 1], &givcol[ - (givptr[curr] << 1) + 1], &givnum[(givptr[curr] << 1) + 1], info); + zlaed8_(&k, n, qsiz, &q[q_offset], ldq, &d__[1], rho, cutpnt, &rwork[iz], + &rwork[idlmda], &work[1], qsiz, &rwork[iw], &iwork[indxp], &iwork[ + indx], &indxq[1], &perm[prmptr[curr]], &givptr[curr + 1], &givcol[ + (givptr[curr] << 1) + 1], &givnum[(givptr[curr] << 1) + 1], info); prmptr[curr + 1] = prmptr[curr] + *n; givptr[curr + 1] += givptr[curr]; /* Solve Secular Equation. */ if (k != 0) { - dlaed9_(&k, &c__1, &k, n, &d__[1], &rwork[iq], &k, rho, &rwork[idlmda] - , &rwork[iw], &qstore[qptr[curr]], &k, info); - zlacrm_(qsiz, &k, &work[1], qsiz, &qstore[qptr[curr]], &k, &q[ - q_offset], ldq, &rwork[iq]); + dlaed9_(&k, &c__1, &k, n, &d__[1], &rwork[iq], &k, rho, &rwork[idlmda] + , &rwork[iw], &qstore[qptr[curr]], &k, info); + zlacrm_(qsiz, &k, &work[1], qsiz, &qstore[qptr[curr]], &k, &q[ + q_offset], ldq, &rwork[iq]); /* Computing 2nd power */ - i__1 = k; - qptr[curr + 1] = qptr[curr] + i__1 * i__1; - if (*info != 0) { - return 0; - } + i__1 = k; + qptr[curr + 1] = qptr[curr] + i__1 * i__1; + if (*info != 0) { + return 0; + } /* Prepare the INDXQ sorting premutation. */ - n1 = k; - n2 = *n - k; - dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); + n1 = k; + n2 = *n - k; + dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); } else { - qptr[curr + 1] = qptr[curr]; - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - indxq[i__] = i__; + qptr[curr + 1] = qptr[curr]; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + indxq[i__] = i__; /* L20: */ - } + } } return 0; @@ -452,5 +452,5 @@ f"> */ } /* zlaed7_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlaed8.cpp b/lib/linalg/zlaed8.cpp index 00f4db857b..77c07f385e 100644 --- a/lib/linalg/zlaed8.cpp +++ b/lib/linalg/zlaed8.cpp @@ -1,13 +1,13 @@ /* fortran/zlaed8.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -248,12 +248,12 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zlaed8_(integer *k, integer *n, integer *qsiz, - doublecomplex *q, integer *ldq, doublereal *d__, doublereal *rho, - integer *cutpnt, doublereal *z__, doublereal *dlamda, doublecomplex * - q2, integer *ldq2, doublereal *w, integer *indxp, integer *indx, - integer *indxq, integer *perm, integer *givptr, integer *givcol, - doublereal *givnum, integer *info) +/* Subroutine */ int zlaed8_(integer *k, integer *n, integer *qsiz, + doublecomplex *q, integer *ldq, doublereal *d__, doublereal *rho, + integer *cutpnt, doublereal *z__, doublereal *dlamda, doublecomplex * + q2, integer *ldq2, doublereal *w, integer *indxp, integer *indx, + integer *indxq, integer *perm, integer *givptr, integer *givcol, + doublereal *givnum, integer *info) { /* System generated locals */ integer q_dim1, q_offset, q2_dim1, q2_offset, i__1; @@ -269,19 +269,19 @@ f"> */ integer k2, n1, n2, jp, n1p1; doublereal eps, tau, tol; integer jlam, imax, jmax; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dcopy_(integer *, doublereal *, integer *, doublereal - *, integer *), zdrot_(integer *, doublecomplex *, integer *, - doublecomplex *, integer *, doublereal *, doublereal *), zcopy_( - integer *, doublecomplex *, integer *, doublecomplex *, integer *) - ; - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, + integer *), dcopy_(integer *, doublereal *, integer *, doublereal + *, integer *), zdrot_(integer *, doublecomplex *, integer *, + doublecomplex *, integer *, doublereal *, doublereal *), zcopy_( + integer *, doublecomplex *, integer *, doublecomplex *, integer *) + ; + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); extern integer idamax_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen), zlacpy_(char *, integer *, integer *, doublecomplex *, - integer *, doublecomplex *, integer *, ftnlen); + extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, + integer *, integer *, integer *), xerbla_(char *, integer *, + ftnlen), zlacpy_(char *, integer *, integer *, doublecomplex *, + integer *, doublecomplex *, integer *, ftnlen); /* -- LAPACK computational routine -- */ @@ -331,20 +331,20 @@ f"> */ *info = 0; if (*n < 0) { - *info = -2; + *info = -2; } else if (*qsiz < *n) { - *info = -3; + *info = -3; } else if (*ldq < max(1,*n)) { - *info = -5; + *info = -5; } else if (*cutpnt < min(1,*n) || *cutpnt > *n) { - *info = -8; + *info = -8; } else if (*ldq2 < max(1,*n)) { - *info = -12; + *info = -12; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZLAED8", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZLAED8", &i__1, (ftnlen)6); + return 0; } /* Need to initialize GIVPTR to O here in case of quick exit */ @@ -357,7 +357,7 @@ f"> */ /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } n1 = *cutpnt; @@ -365,7 +365,7 @@ f"> */ n1p1 = n1 + 1; if (*rho < 0.) { - dscal_(&n2, &c_b3, &z__[n1p1], &c__1); + dscal_(&n2, &c_b3, &z__[n1p1], &c__1); } /* Normalize z so that norm(z) = 1 */ @@ -373,7 +373,7 @@ f"> */ t = 1. / sqrt(2.); i__1 = *n; for (j = 1; j <= i__1; ++j) { - indx[j] = j; + indx[j] = j; /* L10: */ } dscal_(n, &t, &z__[1], &c__1); @@ -383,13 +383,13 @@ f"> */ i__1 = *n; for (i__ = *cutpnt + 1; i__ <= i__1; ++i__) { - indxq[i__] += *cutpnt; + indxq[i__] += *cutpnt; /* L20: */ } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - dlamda[i__] = d__[indxq[i__]]; - w[i__] = z__[indxq[i__]]; + dlamda[i__] = d__[indxq[i__]]; + w[i__] = z__[indxq[i__]]; /* L30: */ } i__ = 1; @@ -397,8 +397,8 @@ f"> */ dlamrg_(&n1, &n2, &dlamda[1], &c__1, &c__1, &indx[1]); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - d__[i__] = dlamda[indx[i__]]; - z__[i__] = w[indx[i__]]; + d__[i__] = dlamda[indx[i__]]; + z__[i__] = w[indx[i__]]; /* L40: */ } @@ -414,17 +414,17 @@ f"> */ /* elements in D. */ if (*rho * (d__1 = z__[imax], abs(d__1)) <= tol) { - *k = 0; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - perm[j] = indxq[indx[j]]; - zcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1] - , &c__1); + *k = 0; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + perm[j] = indxq[indx[j]]; + zcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1] + , &c__1); /* L50: */ - } - zlacpy_((char *)"A", qsiz, n, &q2[q2_dim1 + 1], ldq2, &q[q_dim1 + 1], ldq, ( - ftnlen)1); - return 0; + } + zlacpy_((char *)"A", qsiz, n, &q2[q2_dim1 + 1], ldq2, &q[q_dim1 + 1], ldq, ( + ftnlen)1); + return 0; } /* If there are multiple eigenvalues then the problem deflates. Here */ @@ -437,88 +437,88 @@ f"> */ k2 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { - if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { + if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { /* Deflate due to small z component. */ - --k2; - indxp[k2] = j; - if (j == *n) { - goto L100; - } - } else { - jlam = j; - goto L70; - } + --k2; + indxp[k2] = j; + if (j == *n) { + goto L100; + } + } else { + jlam = j; + goto L70; + } /* L60: */ } L70: ++j; if (j > *n) { - goto L90; + goto L90; } if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { /* Deflate due to small z component. */ - --k2; - indxp[k2] = j; + --k2; + indxp[k2] = j; } else { /* Check if eigenvalues are close enough to allow deflation. */ - s = z__[jlam]; - c__ = z__[j]; + s = z__[jlam]; + c__ = z__[j]; /* Find sqrt(a**2+b**2) without overflow or */ /* destructive underflow. */ - tau = dlapy2_(&c__, &s); - t = d__[j] - d__[jlam]; - c__ /= tau; - s = -s / tau; - if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { + tau = dlapy2_(&c__, &s); + t = d__[j] - d__[jlam]; + c__ /= tau; + s = -s / tau; + if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { /* Deflation is possible. */ - z__[j] = tau; - z__[jlam] = 0.; + z__[j] = tau; + z__[jlam] = 0.; /* Record the appropriate Givens rotation */ - ++(*givptr); - givcol[(*givptr << 1) + 1] = indxq[indx[jlam]]; - givcol[(*givptr << 1) + 2] = indxq[indx[j]]; - givnum[(*givptr << 1) + 1] = c__; - givnum[(*givptr << 1) + 2] = s; - zdrot_(qsiz, &q[indxq[indx[jlam]] * q_dim1 + 1], &c__1, &q[indxq[ - indx[j]] * q_dim1 + 1], &c__1, &c__, &s); - t = d__[jlam] * c__ * c__ + d__[j] * s * s; - d__[j] = d__[jlam] * s * s + d__[j] * c__ * c__; - d__[jlam] = t; - --k2; - i__ = 1; + ++(*givptr); + givcol[(*givptr << 1) + 1] = indxq[indx[jlam]]; + givcol[(*givptr << 1) + 2] = indxq[indx[j]]; + givnum[(*givptr << 1) + 1] = c__; + givnum[(*givptr << 1) + 2] = s; + zdrot_(qsiz, &q[indxq[indx[jlam]] * q_dim1 + 1], &c__1, &q[indxq[ + indx[j]] * q_dim1 + 1], &c__1, &c__, &s); + t = d__[jlam] * c__ * c__ + d__[j] * s * s; + d__[j] = d__[jlam] * s * s + d__[j] * c__ * c__; + d__[jlam] = t; + --k2; + i__ = 1; L80: - if (k2 + i__ <= *n) { - if (d__[jlam] < d__[indxp[k2 + i__]]) { - indxp[k2 + i__ - 1] = indxp[k2 + i__]; - indxp[k2 + i__] = jlam; - ++i__; - goto L80; - } else { - indxp[k2 + i__ - 1] = jlam; - } - } else { - indxp[k2 + i__ - 1] = jlam; - } - jlam = j; - } else { - ++(*k); - w[*k] = z__[jlam]; - dlamda[*k] = d__[jlam]; - indxp[*k] = jlam; - jlam = j; - } + if (k2 + i__ <= *n) { + if (d__[jlam] < d__[indxp[k2 + i__]]) { + indxp[k2 + i__ - 1] = indxp[k2 + i__]; + indxp[k2 + i__] = jlam; + ++i__; + goto L80; + } else { + indxp[k2 + i__ - 1] = jlam; + } + } else { + indxp[k2 + i__ - 1] = jlam; + } + jlam = j; + } else { + ++(*k); + w[*k] = z__[jlam]; + dlamda[*k] = d__[jlam]; + indxp[*k] = jlam; + jlam = j; + } } goto L70; L90: @@ -539,11 +539,11 @@ L100: i__1 = *n; for (j = 1; j <= i__1; ++j) { - jp = indxp[j]; - dlamda[j] = d__[jp]; - perm[j] = indxq[indx[jp]]; - zcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1], & - c__1); + jp = indxp[j]; + dlamda[j] = d__[jp]; + perm[j] = indxq[indx[jp]]; + zcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1], & + c__1); /* L110: */ } @@ -551,11 +551,11 @@ L100: /* into the last N - K slots of D and Q respectively. */ if (*k < *n) { - i__1 = *n - *k; - dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); - i__1 = *n - *k; - zlacpy_((char *)"A", qsiz, &i__1, &q2[(*k + 1) * q2_dim1 + 1], ldq2, &q[(*k + - 1) * q_dim1 + 1], ldq, (ftnlen)1); + i__1 = *n - *k; + dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); + i__1 = *n - *k; + zlacpy_((char *)"A", qsiz, &i__1, &q2[(*k + 1) * q2_dim1 + 1], ldq2, &q[(*k + + 1) * q_dim1 + 1], ldq, (ftnlen)1); } return 0; @@ -565,5 +565,5 @@ L100: } /* zlaed8_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlanhe.cpp b/lib/linalg/zlanhe.cpp index 2522e8d500..c54482158a 100644 --- a/lib/linalg/zlanhe.cpp +++ b/lib/linalg/zlanhe.cpp @@ -1,13 +1,13 @@ /* fortran/zlanhe.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -145,8 +145,8 @@ f"> */ /* > \ingroup complex16HEauxiliary */ /* ===================================================================== */ -doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, - integer *lda, doublereal *work, ftnlen norm_len, ftnlen uplo_len) +doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, + integer *lda, doublereal *work, ftnlen norm_len, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; @@ -162,7 +162,7 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, doublereal value; extern logical disnan_(doublereal *); extern /* Subroutine */ int zlassq_(integer *, doublecomplex *, integer *, - doublereal *, doublereal *); + doublereal *, doublereal *); /* -- LAPACK auxiliary routine -- */ @@ -196,144 +196,144 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, /* Function Body */ if (*n == 0) { - value = 0.; + value = 0.; } else if (lsame_(norm, (char *)"M", (ftnlen)1, (ftnlen)1)) { /* Find max(abs(A(i,j))). */ - value = 0.; - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - sum = z_abs(&a[i__ + j * a_dim1]); - if (value < sum || disnan_(&sum)) { - value = sum; - } + value = 0.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + sum = z_abs(&a[i__ + j * a_dim1]); + if (value < sum || disnan_(&sum)) { + value = sum; + } /* L10: */ - } - i__2 = j + j * a_dim1; - sum = (d__1 = a[i__2].r, abs(d__1)); - if (value < sum || disnan_(&sum)) { - value = sum; - } + } + i__2 = j + j * a_dim1; + sum = (d__1 = a[i__2].r, abs(d__1)); + if (value < sum || disnan_(&sum)) { + value = sum; + } /* L20: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j + j * a_dim1; - sum = (d__1 = a[i__2].r, abs(d__1)); - if (value < sum || disnan_(&sum)) { - value = sum; - } - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - sum = z_abs(&a[i__ + j * a_dim1]); - if (value < sum || disnan_(&sum)) { - value = sum; - } + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j + j * a_dim1; + sum = (d__1 = a[i__2].r, abs(d__1)); + if (value < sum || disnan_(&sum)) { + value = sum; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + sum = z_abs(&a[i__ + j * a_dim1]); + if (value < sum || disnan_(&sum)) { + value = sum; + } /* L30: */ - } + } /* L40: */ - } - } + } + } } else if (lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"O", ( - ftnlen)1, (ftnlen)1) || *(unsigned char *)norm == '1') { + ftnlen)1, (ftnlen)1) || *(unsigned char *)norm == '1') { /* Find normI(A) ( = norm1(A), since A is hermitian). */ - value = 0.; - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - sum = 0.; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - absa = z_abs(&a[i__ + j * a_dim1]); - sum += absa; - work[i__] += absa; + value = 0.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + sum = 0.; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + absa = z_abs(&a[i__ + j * a_dim1]); + sum += absa; + work[i__] += absa; /* L50: */ - } - i__2 = j + j * a_dim1; - work[j] = sum + (d__1 = a[i__2].r, abs(d__1)); + } + i__2 = j + j * a_dim1; + work[j] = sum + (d__1 = a[i__2].r, abs(d__1)); /* L60: */ - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - sum = work[i__]; - if (value < sum || disnan_(&sum)) { - value = sum; - } + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + sum = work[i__]; + if (value < sum || disnan_(&sum)) { + value = sum; + } /* L70: */ - } - } else { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - work[i__] = 0.; + } + } else { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + work[i__] = 0.; /* L80: */ - } - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j + j * a_dim1; - sum = work[j] + (d__1 = a[i__2].r, abs(d__1)); - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - absa = z_abs(&a[i__ + j * a_dim1]); - sum += absa; - work[i__] += absa; + } + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j + j * a_dim1; + sum = work[j] + (d__1 = a[i__2].r, abs(d__1)); + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + absa = z_abs(&a[i__ + j * a_dim1]); + sum += absa; + work[i__] += absa; /* L90: */ - } - if (value < sum || disnan_(&sum)) { - value = sum; - } + } + if (value < sum || disnan_(&sum)) { + value = sum; + } /* L100: */ - } - } + } + } } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", ( - ftnlen)1, (ftnlen)1)) { + ftnlen)1, (ftnlen)1)) { /* Find normF(A). */ - scale = 0.; - sum = 1.; - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - i__1 = *n; - for (j = 2; j <= i__1; ++j) { - i__2 = j - 1; - zlassq_(&i__2, &a[j * a_dim1 + 1], &c__1, &scale, &sum); + scale = 0.; + sum = 1.; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 2; j <= i__1; ++j) { + i__2 = j - 1; + zlassq_(&i__2, &a[j * a_dim1 + 1], &c__1, &scale, &sum); /* L110: */ - } - } else { - i__1 = *n - 1; - for (j = 1; j <= i__1; ++j) { - i__2 = *n - j; - zlassq_(&i__2, &a[j + 1 + j * a_dim1], &c__1, &scale, &sum); + } + } else { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + i__2 = *n - j; + zlassq_(&i__2, &a[j + 1 + j * a_dim1], &c__1, &scale, &sum); /* L120: */ - } - } - sum *= 2; - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__ + i__ * a_dim1; - if (a[i__2].r != 0.) { - i__2 = i__ + i__ * a_dim1; - absa = (d__1 = a[i__2].r, abs(d__1)); - if (scale < absa) { + } + } + sum *= 2; + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + i__ * a_dim1; + if (a[i__2].r != 0.) { + i__2 = i__ + i__ * a_dim1; + absa = (d__1 = a[i__2].r, abs(d__1)); + if (scale < absa) { /* Computing 2nd power */ - d__1 = scale / absa; - sum = sum * (d__1 * d__1) + 1.; - scale = absa; - } else { + d__1 = scale / absa; + sum = sum * (d__1 * d__1) + 1.; + scale = absa; + } else { /* Computing 2nd power */ - d__1 = absa / scale; - sum += d__1 * d__1; - } - } + d__1 = absa / scale; + sum += d__1 * d__1; + } + } /* L130: */ - } - value = scale * sqrt(sum); + } + value = scale * sqrt(sum); } ret_val = value; @@ -344,5 +344,5 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, } /* zlanhe_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlarf.cpp b/lib/linalg/zlarf.cpp index 453644e7d9..7bee520eae 100644 --- a/lib/linalg/zlarf.cpp +++ b/lib/linalg/zlarf.cpp @@ -1,13 +1,13 @@ /* fortran/zlarf.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -150,9 +150,9 @@ static integer c__1 = 1; /* > \ingroup complex16OTHERauxiliary */ /* ===================================================================== */ -/* Subroutine */ int zlarf_(char *side, integer *m, integer *n, doublecomplex - *v, integer *incv, doublecomplex *tau, doublecomplex *c__, integer * - ldc, doublecomplex *work, ftnlen side_len) +/* Subroutine */ int zlarf_(char *side, integer *m, integer *n, doublecomplex + *v, integer *incv, doublecomplex *tau, doublecomplex *c__, integer * + ldc, doublecomplex *work, ftnlen side_len) { /* System generated locals */ integer c_dim1, c_offset, i__1; @@ -163,14 +163,14 @@ static integer c__1 = 1; logical applyleft; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer lastc; - extern /* Subroutine */ int zgerc_(integer *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *), zgemv_(char *, integer *, integer *, - doublecomplex *, doublecomplex *, integer *, doublecomplex *, - integer *, doublecomplex *, doublecomplex *, integer *, ftnlen); + extern /* Subroutine */ int zgerc_(integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *), zgemv_(char *, integer *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *, doublecomplex *, doublecomplex *, integer *, ftnlen); integer lastv; - extern integer ilazlc_(integer *, integer *, doublecomplex *, integer *), - ilazlr_(integer *, integer *, doublecomplex *, integer *); + extern integer ilazlc_(integer *, integer *, doublecomplex *, integer *), + ilazlr_(integer *, integer *, doublecomplex *, integer *); /* -- LAPACK auxiliary routine -- */ @@ -208,31 +208,31 @@ static integer c__1 = 1; if (tau->r != 0. || tau->i != 0.) { /* Set up variables for scanning V. LASTV begins pointing to the end */ /* of V. */ - if (applyleft) { - lastv = *m; - } else { - lastv = *n; - } - if (*incv > 0) { - i__ = (lastv - 1) * *incv + 1; - } else { - i__ = 1; - } + if (applyleft) { + lastv = *m; + } else { + lastv = *n; + } + if (*incv > 0) { + i__ = (lastv - 1) * *incv + 1; + } else { + i__ = 1; + } /* Look for the last non-zero row in V. */ - for(;;) { /* while(complicated condition) */ - i__1 = i__; - if (!(lastv > 0 && (v[i__1].r == 0. && v[i__1].i == 0.))) - break; - --lastv; - i__ -= *incv; - } - if (applyleft) { + for(;;) { /* while(complicated condition) */ + i__1 = i__; + if (!(lastv > 0 && (v[i__1].r == 0. && v[i__1].i == 0.))) + break; + --lastv; + i__ -= *incv; + } + if (applyleft) { /* Scan for the last non-zero column in C(1:lastv,:). */ - lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc); - } else { + lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc); + } else { /* Scan for the last non-zero row in C(:,1:lastv). */ - lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc); - } + lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc); + } } /* Note that lastc.eq.0 renders the BLAS operations null; no special */ /* case is needed at this level. */ @@ -240,37 +240,37 @@ static integer c__1 = 1; /* Form H * C */ - if (lastv > 0) { + if (lastv > 0) { /* w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1) */ - zgemv_((char *)"Conjugate transpose", &lastv, &lastc, &c_b1, &c__[ - c_offset], ldc, &v[1], incv, &c_b2, &work[1], &c__1, ( - ftnlen)19); + zgemv_((char *)"Conjugate transpose", &lastv, &lastc, &c_b1, &c__[ + c_offset], ldc, &v[1], incv, &c_b2, &work[1], &c__1, ( + ftnlen)19); /* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H */ - z__1.r = -tau->r, z__1.i = -tau->i; - zgerc_(&lastv, &lastc, &z__1, &v[1], incv, &work[1], &c__1, &c__[ - c_offset], ldc); - } + z__1.r = -tau->r, z__1.i = -tau->i; + zgerc_(&lastv, &lastc, &z__1, &v[1], incv, &work[1], &c__1, &c__[ + c_offset], ldc); + } } else { /* Form C * H */ - if (lastv > 0) { + if (lastv > 0) { /* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */ - zgemv_((char *)"No transpose", &lastc, &lastv, &c_b1, &c__[c_offset], ldc, - &v[1], incv, &c_b2, &work[1], &c__1, (ftnlen)12); + zgemv_((char *)"No transpose", &lastc, &lastv, &c_b1, &c__[c_offset], ldc, + &v[1], incv, &c_b2, &work[1], &c__1, (ftnlen)12); /* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H */ - z__1.r = -tau->r, z__1.i = -tau->i; - zgerc_(&lastc, &lastv, &z__1, &work[1], &c__1, &v[1], incv, &c__[ - c_offset], ldc); - } + z__1.r = -tau->r, z__1.i = -tau->i; + zgerc_(&lastc, &lastv, &z__1, &work[1], &c__1, &v[1], incv, &c__[ + c_offset], ldc); + } } return 0; @@ -279,5 +279,5 @@ static integer c__1 = 1; } /* zlarf_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlarfb.cpp b/lib/linalg/zlarfb.cpp index 0ea0c17bd4..b09fdf4917 100644 --- a/lib/linalg/zlarfb.cpp +++ b/lib/linalg/zlarfb.cpp @@ -1,13 +1,13 @@ /* fortran/zlarfb.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -218,14 +218,14 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int zlarfb_(char *side, char *trans, char *direct, char * - storev, integer *m, integer *n, integer *k, doublecomplex *v, integer - *ldv, doublecomplex *t, integer *ldt, doublecomplex *c__, integer * - ldc, doublecomplex *work, integer *ldwork, ftnlen side_len, ftnlen - trans_len, ftnlen direct_len, ftnlen storev_len) + storev, integer *m, integer *n, integer *k, doublecomplex *v, integer + *ldv, doublecomplex *t, integer *ldt, doublecomplex *c__, integer * + ldc, doublecomplex *work, integer *ldwork, ftnlen side_len, ftnlen + trans_len, ftnlen direct_len, ftnlen storev_len) { /* System generated locals */ - integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, - work_offset, i__1, i__2, i__3, i__4, i__5; + integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, + work_offset, i__1, i__2, i__3, i__4, i__5; doublecomplex z__1, z__2; /* Builtin functions */ @@ -234,15 +234,15 @@ f"> */ /* Local variables */ integer i__, j; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int zgemm_(char *, char *, integer *, integer *, - integer *, doublecomplex *, doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, ftnlen, ftnlen), zcopy_(integer *, doublecomplex *, - integer *, doublecomplex *, integer *), ztrmm_(char *, char *, - char *, char *, integer *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, - ftnlen, ftnlen, ftnlen), zlacgv_(integer *, doublecomplex *, - integer *); + extern /* Subroutine */ int zgemm_(char *, char *, integer *, integer *, + integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen), zcopy_(integer *, doublecomplex *, + integer *, doublecomplex *, integer *), ztrmm_(char *, char *, + char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, + ftnlen, ftnlen, ftnlen), zlacgv_(integer *, doublecomplex *, + integer *); char transt[1]; @@ -287,24 +287,24 @@ f"> */ /* Function Body */ if (*m <= 0 || *n <= 0) { - return 0; + return 0; } if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - *(unsigned char *)transt = 'C'; + *(unsigned char *)transt = 'C'; } else { - *(unsigned char *)transt = 'N'; + *(unsigned char *)transt = 'N'; } if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { /* Let V = ( V1 ) (first K rows) */ /* ( V2 ) */ /* where V1 is unit lower triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { /* Form H * C or H**H * C where C = ( C1 ) */ /* ( C2 ) */ @@ -313,74 +313,74 @@ f"> */ /* W := C1**H */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - zcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], - &c__1); - zlacgv_(n, &work[j * work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], + &c__1); + zlacgv_(n, &work[j * work_dim1 + 1], &c__1); /* L10: */ - } + } /* W := W * V1 */ - ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); - if (*m > *k) { + ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*m > *k) { /* W := W + C2**H * V2 */ - i__1 = *m - *k; - zgemm_((char *)"Conjugate transpose", (char *)"No transpose", n, k, &i__1, - &c_b1, &c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + - v_dim1], ldv, &c_b1, &work[work_offset], ldwork, ( - ftnlen)19, (ftnlen)12); - } + i__1 = *m - *k; + zgemm_((char *)"Conjugate transpose", (char *)"No transpose", n, k, &i__1, + &c_b1, &c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + + v_dim1], ldv, &c_b1, &work[work_offset], ldwork, ( + ftnlen)19, (ftnlen)12); + } /* W := W * T**H or W * T */ - ztrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + ztrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - V * W**H */ - if (*m > *k) { + if (*m > *k) { /* C2 := C2 - V2 * W**H */ - i__1 = *m - *k; - z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"No transpose", (char *)"Conjugate transpose", &i__1, n, k, - &z__1, &v[*k + 1 + v_dim1], ldv, &work[ - work_offset], ldwork, &c_b1, &c__[*k + 1 + c_dim1] - , ldc, (ftnlen)12, (ftnlen)19); - } + i__1 = *m - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", &i__1, n, k, + &z__1, &v[*k + 1 + v_dim1], ldv, &work[ + work_offset], ldwork, &c_b1, &c__[*k + 1 + c_dim1] + , ldc, (ftnlen)12, (ftnlen)19); + } /* W := W * V1**H */ - ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", n, k, - &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, - (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", n, k, + &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, + (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); /* C1 := C1 - W**H */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = j + i__ * c_dim1; - i__4 = j + i__ * c_dim1; - d_cnjg(&z__2, &work[i__ + j * work_dim1]); - z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - - z__2.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = j + i__ * c_dim1; + i__4 = j + i__ * c_dim1; + d_cnjg(&z__2, &work[i__ + j * work_dim1]); + z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - + z__2.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L20: */ - } + } /* L30: */ - } + } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { /* Form C * H or C * H**H where C = ( C1 C2 ) */ @@ -388,80 +388,80 @@ f"> */ /* W := C1 */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - zcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * - work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * + work_dim1 + 1], &c__1); /* L40: */ - } + } /* W := W * V1 */ - ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); - if (*n > *k) { + ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*n > *k) { /* W := W + C2 * V2 */ - i__1 = *n - *k; - zgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, &c_b1, - &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + 1 + - v_dim1], ldv, &c_b1, &work[work_offset], ldwork, ( - ftnlen)12, (ftnlen)12); - } + i__1 = *n - *k; + zgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, &c_b1, + &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + 1 + + v_dim1], ldv, &c_b1, &work[work_offset], ldwork, ( + ftnlen)12, (ftnlen)12); + } /* W := W * T or W * T**H */ - ztrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + ztrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - W * V**H */ - if (*n > *k) { + if (*n > *k) { /* C2 := C2 - W * V2**H */ - i__1 = *n - *k; - z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, &i__1, k, - &z__1, &work[work_offset], ldwork, &v[*k + 1 + - v_dim1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 1], - ldc, (ftnlen)12, (ftnlen)19); - } + i__1 = *n - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, &i__1, k, + &z__1, &work[work_offset], ldwork, &v[*k + 1 + + v_dim1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 1], + ldc, (ftnlen)12, (ftnlen)19); + } /* W := W * V1**H */ - ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", m, k, - &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, - (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", m, k, + &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, + (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); /* C1 := C1 - W */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - i__5 = i__ + j * work_dim1; - z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ - i__4].i - work[i__5].i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * work_dim1; + z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ + i__4].i - work[i__5].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L50: */ - } + } /* L60: */ - } - } + } + } - } else { + } else { /* Let V = ( V1 ) */ /* ( V2 ) (last K rows) */ /* where V2 is unit upper triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { /* Form H * C or H**H * C where C = ( C1 ) */ /* ( C2 ) */ @@ -470,75 +470,75 @@ f"> */ /* W := C2**H */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - zcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * - work_dim1 + 1], &c__1); - zlacgv_(n, &work[j * work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * + work_dim1 + 1], &c__1); + zlacgv_(n, &work[j * work_dim1 + 1], &c__1); /* L70: */ - } + } /* W := W * V2 */ - ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, - &v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); - if (*m > *k) { + ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, + &v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*m > *k) { /* W := W + C1**H * V1 */ - i__1 = *m - *k; - zgemm_((char *)"Conjugate transpose", (char *)"No transpose", n, k, &i__1, - &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv, & - c_b1, &work[work_offset], ldwork, (ftnlen)19, ( - ftnlen)12); - } + i__1 = *m - *k; + zgemm_((char *)"Conjugate transpose", (char *)"No transpose", n, k, &i__1, + &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv, & + c_b1, &work[work_offset], ldwork, (ftnlen)19, ( + ftnlen)12); + } /* W := W * T**H or W * T */ - ztrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + ztrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - V * W**H */ - if (*m > *k) { + if (*m > *k) { /* C1 := C1 - V1 * W**H */ - i__1 = *m - *k; - z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"No transpose", (char *)"Conjugate transpose", &i__1, n, k, - &z__1, &v[v_offset], ldv, &work[work_offset], - ldwork, &c_b1, &c__[c_offset], ldc, (ftnlen)12, ( - ftnlen)19); - } + i__1 = *m - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", &i__1, n, k, + &z__1, &v[v_offset], ldv, &work[work_offset], + ldwork, &c_b1, &c__[c_offset], ldc, (ftnlen)12, ( + ftnlen)19); + } /* W := W * V2**H */ - ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", n, k, - &c_b1, &v[*m - *k + 1 + v_dim1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 19, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", n, k, + &c_b1, &v[*m - *k + 1 + v_dim1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 19, (ftnlen)4); /* C2 := C2 - W**H */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = *m - *k + j + i__ * c_dim1; - i__4 = *m - *k + j + i__ * c_dim1; - d_cnjg(&z__2, &work[i__ + j * work_dim1]); - z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - - z__2.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = *m - *k + j + i__ * c_dim1; + i__4 = *m - *k + j + i__ * c_dim1; + d_cnjg(&z__2, &work[i__ + j * work_dim1]); + z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - + z__2.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L80: */ - } + } /* L90: */ - } + } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { /* Form C * H or C * H**H where C = ( C1 C2 ) */ @@ -546,83 +546,83 @@ f"> */ /* W := C2 */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - zcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ - j * work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ + j * work_dim1 + 1], &c__1); /* L100: */ - } + } /* W := W * V2 */ - ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, - &v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); - if (*n > *k) { + ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, + &v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], + ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + if (*n > *k) { /* W := W + C1 * V1 */ - i__1 = *n - *k; - zgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, &c_b1, - &c__[c_offset], ldc, &v[v_offset], ldv, &c_b1, & - work[work_offset], ldwork, (ftnlen)12, (ftnlen)12) - ; - } + i__1 = *n - *k; + zgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, &c_b1, + &c__[c_offset], ldc, &v[v_offset], ldv, &c_b1, & + work[work_offset], ldwork, (ftnlen)12, (ftnlen)12) + ; + } /* W := W * T or W * T**H */ - ztrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + ztrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - W * V**H */ - if (*n > *k) { + if (*n > *k) { /* C1 := C1 - W * V1**H */ - i__1 = *n - *k; - z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, &i__1, k, - &z__1, &work[work_offset], ldwork, &v[v_offset], - ldv, &c_b1, &c__[c_offset], ldc, (ftnlen)12, ( - ftnlen)19); - } + i__1 = *n - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, &i__1, k, + &z__1, &work[work_offset], ldwork, &v[v_offset], + ldv, &c_b1, &c__[c_offset], ldc, (ftnlen)12, ( + ftnlen)19); + } /* W := W * V2**H */ - ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", m, k, - &c_b1, &v[*n - *k + 1 + v_dim1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 19, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", m, k, + &c_b1, &v[*n - *k + 1 + v_dim1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 19, (ftnlen)4); /* C2 := C2 - W */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + (*n - *k + j) * c_dim1; - i__4 = i__ + (*n - *k + j) * c_dim1; - i__5 = i__ + j * work_dim1; - z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ - i__4].i - work[i__5].i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + (*n - *k + j) * c_dim1; + i__4 = i__ + (*n - *k + j) * c_dim1; + i__5 = i__ + j * work_dim1; + z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ + i__4].i - work[i__5].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L110: */ - } + } /* L120: */ - } - } - } + } + } + } } else if (lsame_(storev, (char *)"R", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { /* Let V = ( V1 V2 ) (V1: first K columns) */ /* where V1 is unit upper triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { /* Form H * C or H**H * C where C = ( C1 ) */ /* ( C2 ) */ @@ -631,74 +631,74 @@ f"> */ /* W := C1**H */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - zcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], - &c__1); - zlacgv_(n, &work[j * work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], + &c__1); + zlacgv_(n, &work[j * work_dim1 + 1], &c__1); /* L130: */ - } + } /* W := W * V1**H */ - ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", n, k, - &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, - (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); - if (*m > *k) { + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", n, k, + &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, + (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); + if (*m > *k) { /* W := W + C2**H * V2**H */ - i__1 = *m - *k; - zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", n, k, - &i__1, &c_b1, &c__[*k + 1 + c_dim1], ldc, &v[(*k - + 1) * v_dim1 + 1], ldv, &c_b1, &work[work_offset] - , ldwork, (ftnlen)19, (ftnlen)19); - } + i__1 = *m - *k; + zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", n, k, + &i__1, &c_b1, &c__[*k + 1 + c_dim1], ldc, &v[(*k + + 1) * v_dim1 + 1], ldv, &c_b1, &work[work_offset] + , ldwork, (ftnlen)19, (ftnlen)19); + } /* W := W * T**H or W * T */ - ztrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + ztrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - V**H * W**H */ - if (*m > *k) { + if (*m > *k) { /* C2 := C2 - V2**H * W**H */ - i__1 = *m - *k; - z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", & - i__1, n, k, &z__1, &v[(*k + 1) * v_dim1 + 1], ldv, - &work[work_offset], ldwork, &c_b1, &c__[*k + 1 + - c_dim1], ldc, (ftnlen)19, (ftnlen)19); - } + i__1 = *m - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", & + i__1, n, k, &z__1, &v[(*k + 1) * v_dim1 + 1], ldv, + &work[work_offset], ldwork, &c_b1, &c__[*k + 1 + + c_dim1], ldc, (ftnlen)19, (ftnlen)19); + } /* W := W * V1 */ - ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); /* C1 := C1 - W**H */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = j + i__ * c_dim1; - i__4 = j + i__ * c_dim1; - d_cnjg(&z__2, &work[i__ + j * work_dim1]); - z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - - z__2.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = j + i__ * c_dim1; + i__4 = j + i__ * c_dim1; + d_cnjg(&z__2, &work[i__ + j * work_dim1]); + z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - + z__2.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L140: */ - } + } /* L150: */ - } + } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { /* Form C * H or C * H**H where C = ( C1 C2 ) */ @@ -706,80 +706,80 @@ f"> */ /* W := C1 */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - zcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * - work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * + work_dim1 + 1], &c__1); /* L160: */ - } + } /* W := W * V1**H */ - ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", m, k, - &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, - (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); - if (*n > *k) { + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", m, k, + &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, + (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); + if (*n > *k) { /* W := W + C2 * V2**H */ - i__1 = *n - *k; - zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, k, &i__1, - &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k - + 1) * v_dim1 + 1], ldv, &c_b1, &work[work_offset] - , ldwork, (ftnlen)12, (ftnlen)19); - } + i__1 = *n - *k; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, k, &i__1, + &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + + 1) * v_dim1 + 1], ldv, &c_b1, &work[work_offset] + , ldwork, (ftnlen)12, (ftnlen)19); + } /* W := W * T or W * T**H */ - ztrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + ztrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - W * V */ - if (*n > *k) { + if (*n > *k) { /* C2 := C2 - W * V2 */ - i__1 = *n - *k; - z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, &z__1, - &work[work_offset], ldwork, &v[(*k + 1) * v_dim1 - + 1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 1], - ldc, (ftnlen)12, (ftnlen)12); - } + i__1 = *n - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, &z__1, + &work[work_offset], ldwork, &v[(*k + 1) * v_dim1 + + 1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 1], + ldc, (ftnlen)12, (ftnlen)12); + } /* W := W * V1 */ - ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, + &v[v_offset], ldv, &work[work_offset], ldwork, ( + ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); /* C1 := C1 - W */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * c_dim1; - i__4 = i__ + j * c_dim1; - i__5 = i__ + j * work_dim1; - z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ - i__4].i - work[i__5].i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * c_dim1; + i__4 = i__ + j * c_dim1; + i__5 = i__ + j * work_dim1; + z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ + i__4].i - work[i__5].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L170: */ - } + } /* L180: */ - } + } - } + } - } else { + } else { /* Let V = ( V1 V2 ) (V2: last K columns) */ /* where V2 is unit lower triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { /* Form H * C or H**H * C where C = ( C1 ) */ /* ( C2 ) */ @@ -788,76 +788,76 @@ f"> */ /* W := C2**H */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - zcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * - work_dim1 + 1], &c__1); - zlacgv_(n, &work[j * work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * + work_dim1 + 1], &c__1); + zlacgv_(n, &work[j * work_dim1 + 1], &c__1); /* L190: */ - } + } /* W := W * V2**H */ - ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", n, k, - &c_b1, &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 19, (ftnlen)4); - if (*m > *k) { + ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", n, k, + &c_b1, &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 19, (ftnlen)4); + if (*m > *k) { /* W := W + C1**H * V1**H */ - i__1 = *m - *k; - zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", n, k, - &i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], - ldv, &c_b1, &work[work_offset], ldwork, (ftnlen) - 19, (ftnlen)19); - } + i__1 = *m - *k; + zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", n, k, + &i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], + ldv, &c_b1, &work[work_offset], ldwork, (ftnlen) + 19, (ftnlen)19); + } /* W := W * T**H or W * T */ - ztrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + ztrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - V**H * W**H */ - if (*m > *k) { + if (*m > *k) { /* C1 := C1 - V1**H * W**H */ - i__1 = *m - *k; - z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", & - i__1, n, k, &z__1, &v[v_offset], ldv, &work[ - work_offset], ldwork, &c_b1, &c__[c_offset], ldc, - (ftnlen)19, (ftnlen)19); - } + i__1 = *m - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", & + i__1, n, k, &z__1, &v[v_offset], ldv, &work[ + work_offset], ldwork, &c_b1, &c__[c_offset], ldc, + (ftnlen)19, (ftnlen)19); + } /* W := W * V2 */ - ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, - &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 12, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, + &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 12, (ftnlen)4); /* C2 := C2 - W**H */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = *m - *k + j + i__ * c_dim1; - i__4 = *m - *k + j + i__ * c_dim1; - d_cnjg(&z__2, &work[i__ + j * work_dim1]); - z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - - z__2.i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = *m - *k + j + i__ * c_dim1; + i__4 = *m - *k + j + i__ * c_dim1; + d_cnjg(&z__2, &work[i__ + j * work_dim1]); + z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - + z__2.i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L200: */ - } + } /* L210: */ - } + } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { /* Form C * H or C * H**H where C = ( C1 C2 ) */ @@ -865,77 +865,77 @@ f"> */ /* W := C2 */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - zcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ - j * work_dim1 + 1], &c__1); + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + zcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ + j * work_dim1 + 1], &c__1); /* L220: */ - } + } /* W := W * V2**H */ - ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", m, k, - &c_b1, &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 19, (ftnlen)4); - if (*n > *k) { + ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", m, k, + &c_b1, &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 19, (ftnlen)4); + if (*n > *k) { /* W := W + C1 * V1**H */ - i__1 = *n - *k; - zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, k, &i__1, - &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv, & - c_b1, &work[work_offset], ldwork, (ftnlen)12, ( - ftnlen)19); - } + i__1 = *n - *k; + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, k, &i__1, + &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv, & + c_b1, &work[work_offset], ldwork, (ftnlen)12, ( + ftnlen)19); + } /* W := W * T or W * T**H */ - ztrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); + ztrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b1, &t[ + t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)1, (ftnlen)8); /* C := C - W * V */ - if (*n > *k) { + if (*n > *k) { /* C1 := C1 - W * V1 */ - i__1 = *n - *k; - z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, &z__1, - &work[work_offset], ldwork, &v[v_offset], ldv, & - c_b1, &c__[c_offset], ldc, (ftnlen)12, (ftnlen)12) - ; - } + i__1 = *n - *k; + z__1.r = -1., z__1.i = -0.; + zgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, &z__1, + &work[work_offset], ldwork, &v[v_offset], ldv, & + c_b1, &c__[c_offset], ldc, (ftnlen)12, (ftnlen)12) + ; + } /* W := W * V2 */ - ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, - &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 12, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, + &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ + work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) + 12, (ftnlen)4); /* C1 := C1 - W */ - i__1 = *k; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + (*n - *k + j) * c_dim1; - i__4 = i__ + (*n - *k + j) * c_dim1; - i__5 = i__ + j * work_dim1; - z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ - i__4].i - work[i__5].i; - c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; + i__1 = *k; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + (*n - *k + j) * c_dim1; + i__4 = i__ + (*n - *k + j) * c_dim1; + i__5 = i__ + j * work_dim1; + z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ + i__4].i - work[i__5].i; + c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; /* L230: */ - } + } /* L240: */ - } + } - } + } - } + } } return 0; @@ -945,5 +945,5 @@ f"> */ } /* zlarfb_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlarfg.cpp b/lib/linalg/zlarfg.cpp index e3d58be892..71e2add68c 100644 --- a/lib/linalg/zlarfg.cpp +++ b/lib/linalg/zlarfg.cpp @@ -1,13 +1,13 @@ /* fortran/zlarfg.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -127,7 +127,7 @@ f"> */ /* ===================================================================== */ /* Subroutine */ int zlarfg_(integer *n, doublecomplex *alpha, doublecomplex * - x, integer *incx, doublecomplex *tau) + x, integer *incx, doublecomplex *tau) { /* System generated locals */ integer i__1; @@ -140,18 +140,18 @@ f"> */ /* Local variables */ integer j, knt; doublereal beta, alphi, alphr; - extern /* Subroutine */ int zscal_(integer *, doublecomplex *, - doublecomplex *, integer *); + extern /* Subroutine */ int zscal_(integer *, doublecomplex *, + doublecomplex *, integer *); doublereal xnorm; - extern doublereal dlapy3_(doublereal *, doublereal *, doublereal *), - dznrm2_(integer *, doublecomplex *, integer *), dlamch_(char *, - ftnlen); + extern doublereal dlapy3_(doublereal *, doublereal *, doublereal *), + dznrm2_(integer *, doublecomplex *, integer *), dlamch_(char *, + ftnlen); doublereal safmin; - extern /* Subroutine */ int zdscal_(integer *, doublereal *, - doublecomplex *, integer *); + extern /* Subroutine */ int zdscal_(integer *, doublereal *, + doublecomplex *, integer *); doublereal rsafmn; extern /* Double Complex */ VOID zladiv_(doublecomplex *, doublecomplex *, - doublecomplex *); + doublecomplex *); /* -- LAPACK auxiliary routine -- */ @@ -182,8 +182,8 @@ f"> */ /* Function Body */ if (*n <= 0) { - tau->r = 0., tau->i = 0.; - return 0; + tau->r = 0., tau->i = 0.; + return 0; } i__1 = *n - 1; @@ -195,59 +195,59 @@ f"> */ /* H = I */ - tau->r = 0., tau->i = 0.; + tau->r = 0., tau->i = 0.; } else { /* general case */ - d__1 = dlapy3_(&alphr, &alphi, &xnorm); - beta = -d_sign(&d__1, &alphr); - safmin = dlamch_((char *)"S", (ftnlen)1) / dlamch_((char *)"E", (ftnlen)1); - rsafmn = 1. / safmin; + d__1 = dlapy3_(&alphr, &alphi, &xnorm); + beta = -d_sign(&d__1, &alphr); + safmin = dlamch_((char *)"S", (ftnlen)1) / dlamch_((char *)"E", (ftnlen)1); + rsafmn = 1. / safmin; - knt = 0; - if (abs(beta) < safmin) { + knt = 0; + if (abs(beta) < safmin) { /* XNORM, BETA may be inaccurate; scale X and recompute them */ L10: - ++knt; - i__1 = *n - 1; - zdscal_(&i__1, &rsafmn, &x[1], incx); - beta *= rsafmn; - alphi *= rsafmn; - alphr *= rsafmn; - if (abs(beta) < safmin && knt < 20) { - goto L10; - } + ++knt; + i__1 = *n - 1; + zdscal_(&i__1, &rsafmn, &x[1], incx); + beta *= rsafmn; + alphi *= rsafmn; + alphr *= rsafmn; + if (abs(beta) < safmin && knt < 20) { + goto L10; + } /* New BETA is at most 1, at least SAFMIN */ - i__1 = *n - 1; - xnorm = dznrm2_(&i__1, &x[1], incx); - z__1.r = alphr, z__1.i = alphi; - alpha->r = z__1.r, alpha->i = z__1.i; - d__1 = dlapy3_(&alphr, &alphi, &xnorm); - beta = -d_sign(&d__1, &alphr); - } - d__1 = (beta - alphr) / beta; - d__2 = -alphi / beta; - z__1.r = d__1, z__1.i = d__2; - tau->r = z__1.r, tau->i = z__1.i; - z__2.r = alpha->r - beta, z__2.i = alpha->i; - zladiv_(&z__1, &c_b5, &z__2); - alpha->r = z__1.r, alpha->i = z__1.i; - i__1 = *n - 1; - zscal_(&i__1, alpha, &x[1], incx); + i__1 = *n - 1; + xnorm = dznrm2_(&i__1, &x[1], incx); + z__1.r = alphr, z__1.i = alphi; + alpha->r = z__1.r, alpha->i = z__1.i; + d__1 = dlapy3_(&alphr, &alphi, &xnorm); + beta = -d_sign(&d__1, &alphr); + } + d__1 = (beta - alphr) / beta; + d__2 = -alphi / beta; + z__1.r = d__1, z__1.i = d__2; + tau->r = z__1.r, tau->i = z__1.i; + z__2.r = alpha->r - beta, z__2.i = alpha->i; + zladiv_(&z__1, &c_b5, &z__2); + alpha->r = z__1.r, alpha->i = z__1.i; + i__1 = *n - 1; + zscal_(&i__1, alpha, &x[1], incx); /* If ALPHA is subnormal, it may lose relative accuracy */ - i__1 = knt; - for (j = 1; j <= i__1; ++j) { - beta *= safmin; + i__1 = knt; + for (j = 1; j <= i__1; ++j) { + beta *= safmin; /* L20: */ - } - alpha->r = beta, alpha->i = 0.; + } + alpha->r = beta, alpha->i = 0.; } return 0; @@ -257,5 +257,5 @@ L10: } /* zlarfg_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlarft.cpp b/lib/linalg/zlarft.cpp index d907f6792d..ad5e46b910 100644 --- a/lib/linalg/zlarft.cpp +++ b/lib/linalg/zlarft.cpp @@ -1,13 +1,13 @@ /* static/zlarft.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -185,8 +185,8 @@ f"> */ /* > */ /* ===================================================================== */ /* Subroutine */ int zlarft_(char *direct, char *storev, integer *n, integer * - k, doublecomplex *v, integer *ldv, doublecomplex *tau, doublecomplex * - t, integer *ldt, ftnlen direct_len, ftnlen storev_len) + k, doublecomplex *v, integer *ldv, doublecomplex *tau, doublecomplex * + t, integer *ldt, ftnlen direct_len, ftnlen storev_len) { /* System generated locals */ integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4, i__5; @@ -198,16 +198,16 @@ f"> */ /* Local variables */ integer i__, j, prevlastv; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int zgemm_(char *, char *, integer *, integer *, - integer *, doublecomplex *, doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, ftnlen, ftnlen), zgemv_(char *, integer *, integer *, - doublecomplex *, doublecomplex *, integer *, doublecomplex *, - integer *, doublecomplex *, doublecomplex *, integer *, ftnlen); + extern /* Subroutine */ int zgemm_(char *, char *, integer *, integer *, + integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen), zgemv_(char *, integer *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *, doublecomplex *, doublecomplex *, integer *, ftnlen); integer lastv; - extern /* Subroutine */ int ztrmv_(char *, char *, char *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, - ftnlen, ftnlen); + extern /* Subroutine */ int ztrmv_(char *, char *, char *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, + ftnlen, ftnlen); /* -- LAPACK auxiliary routine -- */ @@ -244,215 +244,215 @@ f"> */ /* Function Body */ if (*n == 0) { - return 0; + return 0; } if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - prevlastv = *n; - i__1 = *k; - for (i__ = 1; i__ <= i__1; ++i__) { - prevlastv = max(prevlastv,i__); - i__2 = i__; - if (tau[i__2].r == 0. && tau[i__2].i == 0.) { + prevlastv = *n; + i__1 = *k; + for (i__ = 1; i__ <= i__1; ++i__) { + prevlastv = max(prevlastv,i__); + i__2 = i__; + if (tau[i__2].r == 0. && tau[i__2].i == 0.) { /* H(i) = I */ - i__2 = i__; - for (j = 1; j <= i__2; ++j) { - i__3 = j + i__ * t_dim1; - t[i__3].r = 0., t[i__3].i = 0.; - } - } else { + i__2 = i__; + for (j = 1; j <= i__2; ++j) { + i__3 = j + i__ * t_dim1; + t[i__3].r = 0., t[i__3].i = 0.; + } + } else { /* general case */ - if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { + if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { /* Skip any trailing zeros. */ - i__2 = i__ + 1; - for (lastv = *n; lastv >= i__2; --lastv) { - i__3 = lastv + i__ * v_dim1; - if (v[i__3].r != 0. || v[i__3].i != 0.) { - goto L220; - } - } + i__2 = i__ + 1; + for (lastv = *n; lastv >= i__2; --lastv) { + i__3 = lastv + i__ * v_dim1; + if (v[i__3].r != 0. || v[i__3].i != 0.) { + goto L220; + } + } L220: - i__2 = i__ - 1; - for (j = 1; j <= i__2; ++j) { - i__3 = j + i__ * t_dim1; - i__4 = i__; - z__2.r = -tau[i__4].r, z__2.i = -tau[i__4].i; - d_cnjg(&z__3, &v[i__ + j * v_dim1]); - z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, z__1.i = - z__2.r * z__3.i + z__2.i * z__3.r; - t[i__3].r = z__1.r, t[i__3].i = z__1.i; - } - j = min(lastv,prevlastv); + i__2 = i__ - 1; + for (j = 1; j <= i__2; ++j) { + i__3 = j + i__ * t_dim1; + i__4 = i__; + z__2.r = -tau[i__4].r, z__2.i = -tau[i__4].i; + d_cnjg(&z__3, &v[i__ + j * v_dim1]); + z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, z__1.i = + z__2.r * z__3.i + z__2.i * z__3.r; + t[i__3].r = z__1.r, t[i__3].i = z__1.i; + } + j = min(lastv,prevlastv); /* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) */ - i__2 = j - i__; - i__3 = i__ - 1; - i__4 = i__; - z__1.r = -tau[i__4].r, z__1.i = -tau[i__4].i; - zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &z__1, &v[i__ - + 1 + v_dim1], ldv, &v[i__ + 1 + i__ * v_dim1], & - c__1, &c_b1, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) - 19); - } else { + i__2 = j - i__; + i__3 = i__ - 1; + i__4 = i__; + z__1.r = -tau[i__4].r, z__1.i = -tau[i__4].i; + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &z__1, &v[i__ + + 1 + v_dim1], ldv, &v[i__ + 1 + i__ * v_dim1], & + c__1, &c_b1, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) + 19); + } else { /* Skip any trailing zeros. */ - i__2 = i__ + 1; - for (lastv = *n; lastv >= i__2; --lastv) { - i__3 = i__ + lastv * v_dim1; - if (v[i__3].r != 0. || v[i__3].i != 0.) { - goto L236; - } - } + i__2 = i__ + 1; + for (lastv = *n; lastv >= i__2; --lastv) { + i__3 = i__ + lastv * v_dim1; + if (v[i__3].r != 0. || v[i__3].i != 0.) { + goto L236; + } + } L236: - i__2 = i__ - 1; - for (j = 1; j <= i__2; ++j) { - i__3 = j + i__ * t_dim1; - i__4 = i__; - z__2.r = -tau[i__4].r, z__2.i = -tau[i__4].i; - i__5 = j + i__ * v_dim1; - z__1.r = z__2.r * v[i__5].r - z__2.i * v[i__5].i, - z__1.i = z__2.r * v[i__5].i + z__2.i * v[i__5] - .r; - t[i__3].r = z__1.r, t[i__3].i = z__1.i; - } - j = min(lastv,prevlastv); + i__2 = i__ - 1; + for (j = 1; j <= i__2; ++j) { + i__3 = j + i__ * t_dim1; + i__4 = i__; + z__2.r = -tau[i__4].r, z__2.i = -tau[i__4].i; + i__5 = j + i__ * v_dim1; + z__1.r = z__2.r * v[i__5].r - z__2.i * v[i__5].i, + z__1.i = z__2.r * v[i__5].i + z__2.i * v[i__5] + .r; + t[i__3].r = z__1.r, t[i__3].i = z__1.i; + } + j = min(lastv,prevlastv); /* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H */ - i__2 = i__ - 1; - i__3 = j - i__; - i__4 = i__; - z__1.r = -tau[i__4].r, z__1.i = -tau[i__4].i; - zgemm_((char *)"N", (char *)"C", &i__2, &c__1, &i__3, &z__1, &v[(i__ + 1) - * v_dim1 + 1], ldv, &v[i__ + (i__ + 1) * v_dim1], - ldv, &c_b1, &t[i__ * t_dim1 + 1], ldt, (ftnlen)1, - (ftnlen)1); - } + i__2 = i__ - 1; + i__3 = j - i__; + i__4 = i__; + z__1.r = -tau[i__4].r, z__1.i = -tau[i__4].i; + zgemm_((char *)"N", (char *)"C", &i__2, &c__1, &i__3, &z__1, &v[(i__ + 1) + * v_dim1 + 1], ldv, &v[i__ + (i__ + 1) * v_dim1], + ldv, &c_b1, &t[i__ * t_dim1 + 1], ldt, (ftnlen)1, + (ftnlen)1); + } /* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */ - i__2 = i__ - 1; - ztrmv_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", &i__2, &t[ - t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) - 5, (ftnlen)12, (ftnlen)8); - i__2 = i__ + i__ * t_dim1; - i__3 = i__; - t[i__2].r = tau[i__3].r, t[i__2].i = tau[i__3].i; - if (i__ > 1) { - prevlastv = max(prevlastv,lastv); - } else { - prevlastv = lastv; - } - } - } + i__2 = i__ - 1; + ztrmv_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", &i__2, &t[ + t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) + 5, (ftnlen)12, (ftnlen)8); + i__2 = i__ + i__ * t_dim1; + i__3 = i__; + t[i__2].r = tau[i__3].r, t[i__2].i = tau[i__3].i; + if (i__ > 1) { + prevlastv = max(prevlastv,lastv); + } else { + prevlastv = lastv; + } + } + } } else { - prevlastv = 1; - for (i__ = *k; i__ >= 1; --i__) { - i__1 = i__; - if (tau[i__1].r == 0. && tau[i__1].i == 0.) { + prevlastv = 1; + for (i__ = *k; i__ >= 1; --i__) { + i__1 = i__; + if (tau[i__1].r == 0. && tau[i__1].i == 0.) { /* H(i) = I */ - i__1 = *k; - for (j = i__; j <= i__1; ++j) { - i__2 = j + i__ * t_dim1; - t[i__2].r = 0., t[i__2].i = 0.; - } - } else { + i__1 = *k; + for (j = i__; j <= i__1; ++j) { + i__2 = j + i__ * t_dim1; + t[i__2].r = 0., t[i__2].i = 0.; + } + } else { /* general case */ - if (i__ < *k) { - if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { + if (i__ < *k) { + if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { /* Skip any leading zeros. */ - i__1 = i__ - 1; - for (lastv = 1; lastv <= i__1; ++lastv) { - i__2 = lastv + i__ * v_dim1; - if (v[i__2].r != 0. || v[i__2].i != 0.) { - goto L281; - } - } + i__1 = i__ - 1; + for (lastv = 1; lastv <= i__1; ++lastv) { + i__2 = lastv + i__ * v_dim1; + if (v[i__2].r != 0. || v[i__2].i != 0.) { + goto L281; + } + } L281: - i__1 = *k; - for (j = i__ + 1; j <= i__1; ++j) { - i__2 = j + i__ * t_dim1; - i__3 = i__; - z__2.r = -tau[i__3].r, z__2.i = -tau[i__3].i; - d_cnjg(&z__3, &v[*n - *k + i__ + j * v_dim1]); - z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, - z__1.i = z__2.r * z__3.i + z__2.i * - z__3.r; - t[i__2].r = z__1.r, t[i__2].i = z__1.i; - } - j = max(lastv,prevlastv); + i__1 = *k; + for (j = i__ + 1; j <= i__1; ++j) { + i__2 = j + i__ * t_dim1; + i__3 = i__; + z__2.r = -tau[i__3].r, z__2.i = -tau[i__3].i; + d_cnjg(&z__3, &v[*n - *k + i__ + j * v_dim1]); + z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, + z__1.i = z__2.r * z__3.i + z__2.i * + z__3.r; + t[i__2].r = z__1.r, t[i__2].i = z__1.i; + } + j = max(lastv,prevlastv); /* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) */ - i__1 = *n - *k + i__ - j; - i__2 = *k - i__; - i__3 = i__; - z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i; - zgemv_((char *)"Conjugate transpose", &i__1, &i__2, &z__1, &v[ - j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * - v_dim1], &c__1, &c_b1, &t[i__ + 1 + i__ * - t_dim1], &c__1, (ftnlen)19); - } else { + i__1 = *n - *k + i__ - j; + i__2 = *k - i__; + i__3 = i__; + z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i; + zgemv_((char *)"Conjugate transpose", &i__1, &i__2, &z__1, &v[ + j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * + v_dim1], &c__1, &c_b1, &t[i__ + 1 + i__ * + t_dim1], &c__1, (ftnlen)19); + } else { /* Skip any leading zeros. */ - i__1 = i__ - 1; - for (lastv = 1; lastv <= i__1; ++lastv) { - i__2 = i__ + lastv * v_dim1; - if (v[i__2].r != 0. || v[i__2].i != 0.) { - goto L297; - } - } + i__1 = i__ - 1; + for (lastv = 1; lastv <= i__1; ++lastv) { + i__2 = i__ + lastv * v_dim1; + if (v[i__2].r != 0. || v[i__2].i != 0.) { + goto L297; + } + } L297: - i__1 = *k; - for (j = i__ + 1; j <= i__1; ++j) { - i__2 = j + i__ * t_dim1; - i__3 = i__; - z__2.r = -tau[i__3].r, z__2.i = -tau[i__3].i; - i__4 = j + (*n - *k + i__) * v_dim1; - z__1.r = z__2.r * v[i__4].r - z__2.i * v[i__4].i, - z__1.i = z__2.r * v[i__4].i + z__2.i * v[ - i__4].r; - t[i__2].r = z__1.r, t[i__2].i = z__1.i; - } - j = max(lastv,prevlastv); + i__1 = *k; + for (j = i__ + 1; j <= i__1; ++j) { + i__2 = j + i__ * t_dim1; + i__3 = i__; + z__2.r = -tau[i__3].r, z__2.i = -tau[i__3].i; + i__4 = j + (*n - *k + i__) * v_dim1; + z__1.r = z__2.r * v[i__4].r - z__2.i * v[i__4].i, + z__1.i = z__2.r * v[i__4].i + z__2.i * v[ + i__4].r; + t[i__2].r = z__1.r, t[i__2].i = z__1.i; + } + j = max(lastv,prevlastv); /* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H */ - i__1 = *k - i__; - i__2 = *n - *k + i__ - j; - i__3 = i__; - z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i; - zgemm_((char *)"N", (char *)"C", &i__1, &c__1, &i__2, &z__1, &v[i__ + - 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], - ldv, &c_b1, &t[i__ + 1 + i__ * t_dim1], ldt, ( - ftnlen)1, (ftnlen)1); - } + i__1 = *k - i__; + i__2 = *n - *k + i__ - j; + i__3 = i__; + z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i; + zgemm_((char *)"N", (char *)"C", &i__1, &c__1, &i__2, &z__1, &v[i__ + + 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], + ldv, &c_b1, &t[i__ + 1 + i__ * t_dim1], ldt, ( + ftnlen)1, (ftnlen)1); + } /* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */ - i__1 = *k - i__; - ztrmv_((char *)"Lower", (char *)"No transpose", (char *)"Non-unit", &i__1, &t[i__ - + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * - t_dim1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)8) - ; - if (i__ > 1) { - prevlastv = min(prevlastv,lastv); - } else { - prevlastv = lastv; - } - } - i__1 = i__ + i__ * t_dim1; - i__2 = i__; - t[i__1].r = tau[i__2].r, t[i__1].i = tau[i__2].i; - } - } + i__1 = *k - i__; + ztrmv_((char *)"Lower", (char *)"No transpose", (char *)"Non-unit", &i__1, &t[i__ + + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * + t_dim1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)8) + ; + if (i__ > 1) { + prevlastv = min(prevlastv,lastv); + } else { + prevlastv = lastv; + } + } + i__1 = i__ + i__ * t_dim1; + i__2 = i__; + t[i__1].r = tau[i__2].r, t[i__1].i = tau[i__2].i; + } + } } return 0; @@ -461,5 +461,5 @@ L297: } /* zlarft_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlascl.cpp b/lib/linalg/zlascl.cpp index 337dd64793..8cea99ddb0 100644 --- a/lib/linalg/zlascl.cpp +++ b/lib/linalg/zlascl.cpp @@ -1,13 +1,13 @@ /* fortran/zlascl.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -159,9 +159,9 @@ f"> */ /* > \ingroup complex16OTHERauxiliary */ /* ===================================================================== */ -/* Subroutine */ int zlascl_(char *type__, integer *kl, integer *ku, - doublereal *cfrom, doublereal *cto, integer *m, integer *n, - doublecomplex *a, integer *lda, integer *info, ftnlen type_len) +/* Subroutine */ int zlascl_(char *type__, integer *kl, integer *ku, + doublereal *cfrom, doublereal *cto, integer *m, integer *n, + doublecomplex *a, integer *lda, integer *info, ftnlen type_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; @@ -216,63 +216,63 @@ f"> */ *info = 0; if (lsame_(type__, (char *)"G", (ftnlen)1, (ftnlen)1)) { - itype = 0; + itype = 0; } else if (lsame_(type__, (char *)"L", (ftnlen)1, (ftnlen)1)) { - itype = 1; + itype = 1; } else if (lsame_(type__, (char *)"U", (ftnlen)1, (ftnlen)1)) { - itype = 2; + itype = 2; } else if (lsame_(type__, (char *)"H", (ftnlen)1, (ftnlen)1)) { - itype = 3; + itype = 3; } else if (lsame_(type__, (char *)"B", (ftnlen)1, (ftnlen)1)) { - itype = 4; + itype = 4; } else if (lsame_(type__, (char *)"Q", (ftnlen)1, (ftnlen)1)) { - itype = 5; + itype = 5; } else if (lsame_(type__, (char *)"Z", (ftnlen)1, (ftnlen)1)) { - itype = 6; + itype = 6; } else { - itype = -1; + itype = -1; } if (itype == -1) { - *info = -1; + *info = -1; } else if (*cfrom == 0. || disnan_(cfrom)) { - *info = -4; + *info = -4; } else if (disnan_(cto)) { - *info = -5; + *info = -5; } else if (*m < 0) { - *info = -6; + *info = -6; } else if (*n < 0 || itype == 4 && *n != *m || itype == 5 && *n != *m) { - *info = -7; + *info = -7; } else if (itype <= 3 && *lda < max(1,*m)) { - *info = -9; + *info = -9; } else if (itype >= 4) { /* Computing MAX */ - i__1 = *m - 1; - if (*kl < 0 || *kl > max(i__1,0)) { - *info = -2; - } else /* if(complicated condition) */ { + i__1 = *m - 1; + if (*kl < 0 || *kl > max(i__1,0)) { + *info = -2; + } else /* if(complicated condition) */ { /* Computing MAX */ - i__1 = *n - 1; - if (*ku < 0 || *ku > max(i__1,0) || (itype == 4 || itype == 5) && - *kl != *ku) { - *info = -3; - } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < * - ku + 1 || itype == 6 && *lda < (*kl << 1) + *ku + 1) { - *info = -9; - } - } + i__1 = *n - 1; + if (*ku < 0 || *ku > max(i__1,0) || (itype == 4 || itype == 5) && + *kl != *ku) { + *info = -3; + } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < * + ku + 1 || itype == 6 && *lda < (*kl << 1) + *ku + 1) { + *info = -9; + } + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZLASCL", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZLASCL", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0 || *m == 0) { - return 0; + return 0; } /* Get machine parameters */ @@ -288,175 +288,175 @@ L10: if (cfrom1 == cfromc) { /* CFROMC is an inf. Multiply by a correctly signed zero for */ /* finite CTOC, or a NaN if CTOC is infinite. */ - mul = ctoc / cfromc; - done = TRUE_; - cto1 = ctoc; + mul = ctoc / cfromc; + done = TRUE_; + cto1 = ctoc; } else { - cto1 = ctoc / bignum; - if (cto1 == ctoc) { + cto1 = ctoc / bignum; + if (cto1 == ctoc) { /* CTOC is either 0 or an inf. In both cases, CTOC itself */ /* serves as the correct multiplication factor. */ - mul = ctoc; - done = TRUE_; - cfromc = 1.; - } else if (abs(cfrom1) > abs(ctoc) && ctoc != 0.) { - mul = smlnum; - done = FALSE_; - cfromc = cfrom1; - } else if (abs(cto1) > abs(cfromc)) { - mul = bignum; - done = FALSE_; - ctoc = cto1; - } else { - mul = ctoc / cfromc; - done = TRUE_; - if (mul == 1.) { - return 0; - } - } + mul = ctoc; + done = TRUE_; + cfromc = 1.; + } else if (abs(cfrom1) > abs(ctoc) && ctoc != 0.) { + mul = smlnum; + done = FALSE_; + cfromc = cfrom1; + } else if (abs(cto1) > abs(cfromc)) { + mul = bignum; + done = FALSE_; + ctoc = cto1; + } else { + mul = ctoc / cfromc; + done = TRUE_; + if (mul == 1.) { + return 0; + } + } } if (itype == 0) { /* Full matrix */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L20: */ - } + } /* L30: */ - } + } } else if (itype == 1) { /* Lower triangular matrix */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = j; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = j; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L40: */ - } + } /* L50: */ - } + } } else if (itype == 2) { /* Upper triangular matrix */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = min(j,*m); - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = min(j,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L60: */ - } + } /* L70: */ - } + } } else if (itype == 3) { /* Upper Hessenberg matrix */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { /* Computing MIN */ - i__3 = j + 1; - i__2 = min(i__3,*m); - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = j + 1; + i__2 = min(i__3,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L80: */ - } + } /* L90: */ - } + } } else if (itype == 4) { /* Lower half of a symmetric band matrix */ - k3 = *kl + 1; - k4 = *n + 1; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { + k3 = *kl + 1; + k4 = *n + 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { /* Computing MIN */ - i__3 = k3, i__4 = k4 - j; - i__2 = min(i__3,i__4); - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = k3, i__4 = k4 - j; + i__2 = min(i__3,i__4); + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L100: */ - } + } /* L110: */ - } + } } else if (itype == 5) { /* Upper half of a symmetric band matrix */ - k1 = *ku + 2; - k3 = *ku + 1; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { + k1 = *ku + 2; + k3 = *ku + 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { /* Computing MAX */ - i__2 = k1 - j; - i__3 = k3; - for (i__ = max(i__2,1); i__ <= i__3; ++i__) { - i__2 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = k1 - j; + i__3 = k3; + for (i__ = max(i__2,1); i__ <= i__3; ++i__) { + i__2 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; /* L120: */ - } + } /* L130: */ - } + } } else if (itype == 6) { /* Band matrix */ - k1 = *kl + *ku + 2; - k2 = *kl + 1; - k3 = (*kl << 1) + *ku + 1; - k4 = *kl + *ku + 1 + *m; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { + k1 = *kl + *ku + 2; + k2 = *kl + 1; + k3 = (*kl << 1) + *ku + 1; + k4 = *kl + *ku + 1 + *m; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { /* Computing MAX */ - i__3 = k1 - j; + i__3 = k1 - j; /* Computing MIN */ - i__4 = k3, i__5 = k4 - j; - i__2 = min(i__4,i__5); - for (i__ = max(i__3,k2); i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__ + j * a_dim1; - z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__4 = k3, i__5 = k4 - j; + i__2 = min(i__4,i__5); + for (i__ = max(i__3,k2); i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + j * a_dim1; + z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L140: */ - } + } /* L150: */ - } + } } if (! done) { - goto L10; + goto L10; } return 0; @@ -466,5 +466,5 @@ L10: } /* zlascl_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlaset.cpp b/lib/linalg/zlaset.cpp index e402ea02fe..782cc99055 100644 --- a/lib/linalg/zlaset.cpp +++ b/lib/linalg/zlaset.cpp @@ -1,13 +1,13 @@ /* fortran/zlaset.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -123,9 +123,9 @@ f"> */ /* > \ingroup complex16OTHERauxiliary */ /* ===================================================================== */ -/* Subroutine */ int zlaset_(char *uplo, integer *m, integer *n, - doublecomplex *alpha, doublecomplex *beta, doublecomplex *a, integer * - lda, ftnlen uplo_len) +/* Subroutine */ int zlaset_(char *uplo, integer *m, integer *n, + doublecomplex *alpha, doublecomplex *beta, doublecomplex *a, integer * + lda, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -165,68 +165,68 @@ f"> */ /* Set the diagonal to BETA and the strictly upper triangular */ /* part of the array to ALPHA. */ - i__1 = *n; - for (j = 2; j <= i__1; ++j) { + i__1 = *n; + for (j = 2; j <= i__1; ++j) { /* Computing MIN */ - i__3 = j - 1; - i__2 = min(i__3,*m); - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - a[i__3].r = alpha->r, a[i__3].i = alpha->i; + i__3 = j - 1; + i__2 = min(i__3,*m); + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + a[i__3].r = alpha->r, a[i__3].i = alpha->i; /* L10: */ - } + } /* L20: */ - } - i__1 = min(*n,*m); - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__ + i__ * a_dim1; - a[i__2].r = beta->r, a[i__2].i = beta->i; + } + i__1 = min(*n,*m); + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + i__ * a_dim1; + a[i__2].r = beta->r, a[i__2].i = beta->i; /* L30: */ - } + } } else if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { /* Set the diagonal to BETA and the strictly lower triangular */ /* part of the array to ALPHA. */ - i__1 = min(*m,*n); - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = j + 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - a[i__3].r = alpha->r, a[i__3].i = alpha->i; + i__1 = min(*m,*n); + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + a[i__3].r = alpha->r, a[i__3].i = alpha->i; /* L40: */ - } + } /* L50: */ - } - i__1 = min(*n,*m); - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__ + i__ * a_dim1; - a[i__2].r = beta->r, a[i__2].i = beta->i; + } + i__1 = min(*n,*m); + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + i__ * a_dim1; + a[i__2].r = beta->r, a[i__2].i = beta->i; /* L60: */ - } + } } else { /* Set the array to BETA on the diagonal and ALPHA on the */ /* offdiagonal. */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - a[i__3].r = alpha->r, a[i__3].i = alpha->i; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + a[i__3].r = alpha->r, a[i__3].i = alpha->i; /* L70: */ - } + } /* L80: */ - } - i__1 = min(*m,*n); - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__ + i__ * a_dim1; - a[i__2].r = beta->r, a[i__2].i = beta->i; + } + i__1 = min(*m,*n); + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + i__ * a_dim1; + a[i__2].r = beta->r, a[i__2].i = beta->i; /* L90: */ - } + } } return 0; @@ -236,5 +236,5 @@ f"> */ } /* zlaset_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlasr.cpp b/lib/linalg/zlasr.cpp index 23d68bf82f..51c9797679 100644 --- a/lib/linalg/zlasr.cpp +++ b/lib/linalg/zlasr.cpp @@ -1,13 +1,13 @@ /* fortran/zlasr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -217,8 +217,8 @@ extern "C" { /* ===================================================================== */ /* Subroutine */ int zlasr_(char *side, char *pivot, char *direct, integer *m, - integer *n, doublereal *c__, doublereal *s, doublecomplex *a, - integer *lda, ftnlen side_len, ftnlen pivot_len, ftnlen direct_len) + integer *n, doublereal *c__, doublereal *s, doublecomplex *a, + integer *lda, ftnlen side_len, ftnlen pivot_len, ftnlen direct_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; @@ -267,420 +267,420 @@ extern "C" { /* Function Body */ info = 0; if (! (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) || lsame_(side, (char *)"R", ( - ftnlen)1, (ftnlen)1))) { - info = 1; - } else if (! (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1) || lsame_(pivot, - (char *)"T", (ftnlen)1, (ftnlen)1) || lsame_(pivot, (char *)"B", (ftnlen)1, ( - ftnlen)1))) { - info = 2; - } else if (! (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(direct, - (char *)"B", (ftnlen)1, (ftnlen)1))) { - info = 3; + ftnlen)1, (ftnlen)1))) { + info = 1; + } else if (! (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1) || lsame_(pivot, + (char *)"T", (ftnlen)1, (ftnlen)1) || lsame_(pivot, (char *)"B", (ftnlen)1, ( + ftnlen)1))) { + info = 2; + } else if (! (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(direct, + (char *)"B", (ftnlen)1, (ftnlen)1))) { + info = 3; } else if (*m < 0) { - info = 4; + info = 4; } else if (*n < 0) { - info = 5; + info = 5; } else if (*lda < max(1,*m)) { - info = 9; + info = 9; } if (info != 0) { - xerbla_((char *)"ZLASR ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"ZLASR ", &info, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { - return 0; + return 0; } if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { /* Form P * A */ - if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - i__1 = *m - 1; - for (j = 1; j <= i__1; ++j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = j + 1 + i__ * a_dim1; - temp.r = a[i__3].r, temp.i = a[i__3].i; - i__3 = j + 1 + i__ * a_dim1; - z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; - i__4 = j + i__ * a_dim1; - z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ - i__4].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; - i__3 = j + i__ * a_dim1; - z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; - i__4 = j + i__ * a_dim1; - z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ - i__4].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *m - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = j + 1 + i__ * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + i__3 = j + 1 + i__ * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__4 = j + i__ * a_dim1; + z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ + i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = j + i__ * a_dim1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__4 = j + i__ * a_dim1; + z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ + i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L10: */ - } - } + } + } /* L20: */ - } - } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { - for (j = *m - 1; j >= 1; --j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = j + 1 + i__ * a_dim1; - temp.r = a[i__2].r, temp.i = a[i__2].i; - i__2 = j + 1 + i__ * a_dim1; - z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; - i__3 = j + i__ * a_dim1; - z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ - i__3].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; - i__2 = j + i__ * a_dim1; - z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; - i__3 = j + i__ * a_dim1; - z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ - i__3].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *m - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = j + 1 + i__ * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + i__2 = j + 1 + i__ * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__3 = j + i__ * a_dim1; + z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ + i__3].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = j + i__ * a_dim1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__3 = j + i__ * a_dim1; + z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ + i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; /* L30: */ - } - } + } + } /* L40: */ - } - } - } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - i__1 = *m; - for (j = 2; j <= i__1; ++j) { - ctemp = c__[j - 1]; - stemp = s[j - 1]; - if (ctemp != 1. || stemp != 0.) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = j + i__ * a_dim1; - temp.r = a[i__3].r, temp.i = a[i__3].i; - i__3 = j + i__ * a_dim1; - z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; - i__4 = i__ * a_dim1 + 1; - z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ - i__4].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; - i__3 = i__ * a_dim1 + 1; - z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; - i__4 = i__ * a_dim1 + 1; - z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ - i__4].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + } + } + } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *m; + for (j = 2; j <= i__1; ++j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = j + i__ * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + i__3 = j + i__ * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__4 = i__ * a_dim1 + 1; + z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ + i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = i__ * a_dim1 + 1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__4 = i__ * a_dim1 + 1; + z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ + i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L50: */ - } - } + } + } /* L60: */ - } - } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { - for (j = *m; j >= 2; --j) { - ctemp = c__[j - 1]; - stemp = s[j - 1]; - if (ctemp != 1. || stemp != 0.) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = j + i__ * a_dim1; - temp.r = a[i__2].r, temp.i = a[i__2].i; - i__2 = j + i__ * a_dim1; - z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; - i__3 = i__ * a_dim1 + 1; - z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ - i__3].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; - i__2 = i__ * a_dim1 + 1; - z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; - i__3 = i__ * a_dim1 + 1; - z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ - i__3].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *m; j >= 2; --j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = j + i__ * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + i__2 = j + i__ * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__3 = i__ * a_dim1 + 1; + z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ + i__3].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = i__ * a_dim1 + 1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__3 = i__ * a_dim1 + 1; + z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ + i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; /* L70: */ - } - } + } + } /* L80: */ - } - } - } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - i__1 = *m - 1; - for (j = 1; j <= i__1; ++j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = j + i__ * a_dim1; - temp.r = a[i__3].r, temp.i = a[i__3].i; - i__3 = j + i__ * a_dim1; - i__4 = *m + i__ * a_dim1; - z__2.r = stemp * a[i__4].r, z__2.i = stemp * a[ - i__4].i; - z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; - i__3 = *m + i__ * a_dim1; - i__4 = *m + i__ * a_dim1; - z__2.r = ctemp * a[i__4].r, z__2.i = ctemp * a[ - i__4].i; - z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + } + } + } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *m - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = j + i__ * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + i__3 = j + i__ * a_dim1; + i__4 = *m + i__ * a_dim1; + z__2.r = stemp * a[i__4].r, z__2.i = stemp * a[ + i__4].i; + z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = *m + i__ * a_dim1; + i__4 = *m + i__ * a_dim1; + z__2.r = ctemp * a[i__4].r, z__2.i = ctemp * a[ + i__4].i; + z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L90: */ - } - } + } + } /* L100: */ - } - } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { - for (j = *m - 1; j >= 1; --j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = j + i__ * a_dim1; - temp.r = a[i__2].r, temp.i = a[i__2].i; - i__2 = j + i__ * a_dim1; - i__3 = *m + i__ * a_dim1; - z__2.r = stemp * a[i__3].r, z__2.i = stemp * a[ - i__3].i; - z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; - i__2 = *m + i__ * a_dim1; - i__3 = *m + i__ * a_dim1; - z__2.r = ctemp * a[i__3].r, z__2.i = ctemp * a[ - i__3].i; - z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *m - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = j + i__ * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + i__2 = j + i__ * a_dim1; + i__3 = *m + i__ * a_dim1; + z__2.r = stemp * a[i__3].r, z__2.i = stemp * a[ + i__3].i; + z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = *m + i__ * a_dim1; + i__3 = *m + i__ * a_dim1; + z__2.r = ctemp * a[i__3].r, z__2.i = ctemp * a[ + i__3].i; + z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; /* L110: */ - } - } + } + } /* L120: */ - } - } - } + } + } + } } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { /* Form A * P**T */ - if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - i__1 = *n - 1; - for (j = 1; j <= i__1; ++j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + (j + 1) * a_dim1; - temp.r = a[i__3].r, temp.i = a[i__3].i; - i__3 = i__ + (j + 1) * a_dim1; - z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; - i__4 = i__ + j * a_dim1; - z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ - i__4].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; - i__3 = i__ + j * a_dim1; - z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; - i__4 = i__ + j * a_dim1; - z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ - i__4].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + (j + 1) * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + i__3 = i__ + (j + 1) * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__4 = i__ + j * a_dim1; + z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ + i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = i__ + j * a_dim1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__4 = i__ + j * a_dim1; + z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ + i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L130: */ - } - } + } + } /* L140: */ - } - } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { - for (j = *n - 1; j >= 1; --j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__ + (j + 1) * a_dim1; - temp.r = a[i__2].r, temp.i = a[i__2].i; - i__2 = i__ + (j + 1) * a_dim1; - z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; - i__3 = i__ + j * a_dim1; - z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ - i__3].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; - i__2 = i__ + j * a_dim1; - z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; - i__3 = i__ + j * a_dim1; - z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ - i__3].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *n - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + (j + 1) * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + i__2 = i__ + (j + 1) * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__3 = i__ + j * a_dim1; + z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ + i__3].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = i__ + j * a_dim1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__3 = i__ + j * a_dim1; + z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ + i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; /* L150: */ - } - } + } + } /* L160: */ - } - } - } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - i__1 = *n; - for (j = 2; j <= i__1; ++j) { - ctemp = c__[j - 1]; - stemp = s[j - 1]; - if (ctemp != 1. || stemp != 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - temp.r = a[i__3].r, temp.i = a[i__3].i; - i__3 = i__ + j * a_dim1; - z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; - i__4 = i__ + a_dim1; - z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ - i__4].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; - i__3 = i__ + a_dim1; - z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; - i__4 = i__ + a_dim1; - z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ - i__4].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + } + } + } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *n; + for (j = 2; j <= i__1; ++j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + i__3 = i__ + j * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__4 = i__ + a_dim1; + z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ + i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = i__ + a_dim1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__4 = i__ + a_dim1; + z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ + i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L170: */ - } - } + } + } /* L180: */ - } - } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { - for (j = *n; j >= 2; --j) { - ctemp = c__[j - 1]; - stemp = s[j - 1]; - if (ctemp != 1. || stemp != 0.) { - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__ + j * a_dim1; - temp.r = a[i__2].r, temp.i = a[i__2].i; - i__2 = i__ + j * a_dim1; - z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; - i__3 = i__ + a_dim1; - z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ - i__3].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; - i__2 = i__ + a_dim1; - z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; - i__3 = i__ + a_dim1; - z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ - i__3].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *n; j >= 2; --j) { + ctemp = c__[j - 1]; + stemp = s[j - 1]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + j * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + i__2 = i__ + j * a_dim1; + z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; + i__3 = i__ + a_dim1; + z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ + i__3].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = i__ + a_dim1; + z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; + i__3 = i__ + a_dim1; + z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ + i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; /* L190: */ - } - } + } + } /* L200: */ - } - } - } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - i__1 = *n - 1; - for (j = 1; j <= i__1; ++j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - temp.r = a[i__3].r, temp.i = a[i__3].i; - i__3 = i__ + j * a_dim1; - i__4 = i__ + *n * a_dim1; - z__2.r = stemp * a[i__4].r, z__2.i = stemp * a[ - i__4].i; - z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; - i__3 = i__ + *n * a_dim1; - i__4 = i__ + *n * a_dim1; - z__2.r = ctemp * a[i__4].r, z__2.i = ctemp * a[ - i__4].i; - z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; - a[i__3].r = z__1.r, a[i__3].i = z__1.i; + } + } + } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { + if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + temp.r = a[i__3].r, temp.i = a[i__3].i; + i__3 = i__ + j * a_dim1; + i__4 = i__ + *n * a_dim1; + z__2.r = stemp * a[i__4].r, z__2.i = stemp * a[ + i__4].i; + z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; + i__3 = i__ + *n * a_dim1; + i__4 = i__ + *n * a_dim1; + z__2.r = ctemp * a[i__4].r, z__2.i = ctemp * a[ + i__4].i; + z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__3].r = z__1.r, a[i__3].i = z__1.i; /* L210: */ - } - } + } + } /* L220: */ - } - } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { - for (j = *n - 1; j >= 1; --j) { - ctemp = c__[j]; - stemp = s[j]; - if (ctemp != 1. || stemp != 0.) { - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__ + j * a_dim1; - temp.r = a[i__2].r, temp.i = a[i__2].i; - i__2 = i__ + j * a_dim1; - i__3 = i__ + *n * a_dim1; - z__2.r = stemp * a[i__3].r, z__2.i = stemp * a[ - i__3].i; - z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; - i__2 = i__ + *n * a_dim1; - i__3 = i__ + *n * a_dim1; - z__2.r = ctemp * a[i__3].r, z__2.i = ctemp * a[ - i__3].i; - z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; + } + } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { + for (j = *n - 1; j >= 1; --j) { + ctemp = c__[j]; + stemp = s[j]; + if (ctemp != 1. || stemp != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + j * a_dim1; + temp.r = a[i__2].r, temp.i = a[i__2].i; + i__2 = i__ + j * a_dim1; + i__3 = i__ + *n * a_dim1; + z__2.r = stemp * a[i__3].r, z__2.i = stemp * a[ + i__3].i; + z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = i__ + *n * a_dim1; + i__3 = i__ + *n * a_dim1; + z__2.r = ctemp * a[i__3].r, z__2.i = ctemp * a[ + i__3].i; + z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - + z__3.i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; /* L230: */ - } - } + } + } /* L240: */ - } - } - } + } + } + } } return 0; @@ -690,5 +690,5 @@ extern "C" { } /* zlasr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlassq.cpp b/lib/linalg/zlassq.cpp index 1fa44450fe..2e2a5ba539 100644 --- a/lib/linalg/zlassq.cpp +++ b/lib/linalg/zlassq.cpp @@ -1,13 +1,13 @@ /* fortran/zlassq.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -124,8 +124,8 @@ f"> */ /* > \ingroup complex16OTHERauxiliary */ /* ===================================================================== */ -/* Subroutine */ int zlassq_(integer *n, doublecomplex *x, integer *incx, - doublereal *scale, doublereal *sumsq) +/* Subroutine */ int zlassq_(integer *n, doublecomplex *x, integer *incx, + doublereal *scale, doublereal *sumsq) { /* System generated locals */ integer i__1, i__2, i__3; @@ -167,38 +167,38 @@ f"> */ /* Function Body */ if (*n > 0) { - i__1 = (*n - 1) * *incx + 1; - i__2 = *incx; - for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { - i__3 = ix; - temp1 = (d__1 = x[i__3].r, abs(d__1)); - if (temp1 > 0. || disnan_(&temp1)) { - if (*scale < temp1) { + i__1 = (*n - 1) * *incx + 1; + i__2 = *incx; + for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { + i__3 = ix; + temp1 = (d__1 = x[i__3].r, abs(d__1)); + if (temp1 > 0. || disnan_(&temp1)) { + if (*scale < temp1) { /* Computing 2nd power */ - d__1 = *scale / temp1; - *sumsq = *sumsq * (d__1 * d__1) + 1; - *scale = temp1; - } else { + d__1 = *scale / temp1; + *sumsq = *sumsq * (d__1 * d__1) + 1; + *scale = temp1; + } else { /* Computing 2nd power */ - d__1 = temp1 / *scale; - *sumsq += d__1 * d__1; - } - } - temp1 = (d__1 = d_imag(&x[ix]), abs(d__1)); - if (temp1 > 0. || disnan_(&temp1)) { - if (*scale < temp1) { + d__1 = temp1 / *scale; + *sumsq += d__1 * d__1; + } + } + temp1 = (d__1 = d_imag(&x[ix]), abs(d__1)); + if (temp1 > 0. || disnan_(&temp1)) { + if (*scale < temp1) { /* Computing 2nd power */ - d__1 = *scale / temp1; - *sumsq = *sumsq * (d__1 * d__1) + 1; - *scale = temp1; - } else { + d__1 = *scale / temp1; + *sumsq = *sumsq * (d__1 * d__1) + 1; + *scale = temp1; + } else { /* Computing 2nd power */ - d__1 = temp1 / *scale; - *sumsq += d__1 * d__1; - } - } + d__1 = temp1 / *scale; + *sumsq += d__1 * d__1; + } + } /* L10: */ - } + } } return 0; @@ -208,5 +208,5 @@ f"> */ } /* zlassq_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zlatrd.cpp b/lib/linalg/zlatrd.cpp index eaa0fc1826..d471ea96eb 100644 --- a/lib/linalg/zlatrd.cpp +++ b/lib/linalg/zlatrd.cpp @@ -1,13 +1,13 @@ /* fortran/zlatrd.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -222,9 +222,9 @@ f"> */ /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zlatrd_(char *uplo, integer *n, integer *nb, - doublecomplex *a, integer *lda, doublereal *e, doublecomplex *tau, - doublecomplex *w, integer *ldw, ftnlen uplo_len) +/* Subroutine */ int zlatrd_(char *uplo, integer *n, integer *nb, + doublecomplex *a, integer *lda, doublereal *e, doublecomplex *tau, + doublecomplex *w, integer *ldw, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3; @@ -235,20 +235,20 @@ f"> */ integer i__, iw; doublecomplex alpha; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int zscal_(integer *, doublecomplex *, - doublecomplex *, integer *); - extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *); - extern /* Subroutine */ int zgemv_(char *, integer *, integer *, - doublecomplex *, doublecomplex *, integer *, doublecomplex *, - integer *, doublecomplex *, doublecomplex *, integer *, ftnlen), - zhemv_(char *, integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *, integer *, doublecomplex *, - doublecomplex *, integer *, ftnlen), zaxpy_(integer *, - doublecomplex *, doublecomplex *, integer *, doublecomplex *, - integer *), zlarfg_(integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *), zlacgv_(integer *, doublecomplex *, - integer *); + extern /* Subroutine */ int zscal_(integer *, doublecomplex *, + doublecomplex *, integer *); + extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *); + extern /* Subroutine */ int zgemv_(char *, integer *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *, doublecomplex *, doublecomplex *, integer *, ftnlen), + zhemv_(char *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, ftnlen), zaxpy_(integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *), zlarfg_(integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *), zlacgv_(integer *, doublecomplex *, + integer *); /* -- LAPACK auxiliary routine -- */ @@ -288,214 +288,214 @@ f"> */ /* Function Body */ if (*n <= 0) { - return 0; + return 0; } if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { /* Reduce last NB columns of upper triangle */ - i__1 = *n - *nb + 1; - for (i__ = *n; i__ >= i__1; --i__) { - iw = i__ - *n + *nb; - if (i__ < *n) { + i__1 = *n - *nb + 1; + for (i__ = *n; i__ >= i__1; --i__) { + iw = i__ - *n + *nb; + if (i__ < *n) { /* Update A(1:i,i) */ - i__2 = i__ + i__ * a_dim1; - i__3 = i__ + i__ * a_dim1; - d__1 = a[i__3].r; - a[i__2].r = d__1, a[i__2].i = 0.; - i__2 = *n - i__; - zlacgv_(&i__2, &w[i__ + (iw + 1) * w_dim1], ldw); - i__2 = *n - i__; - z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__, &i__2, &z__1, &a[(i__ + 1) * - a_dim1 + 1], lda, &w[i__ + (iw + 1) * w_dim1], ldw, & - c_b2, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); - i__2 = *n - i__; - zlacgv_(&i__2, &w[i__ + (iw + 1) * w_dim1], ldw); - i__2 = *n - i__; - zlacgv_(&i__2, &a[i__ + (i__ + 1) * a_dim1], lda); - i__2 = *n - i__; - z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__, &i__2, &z__1, &w[(iw + 1) * - w_dim1 + 1], ldw, &a[i__ + (i__ + 1) * a_dim1], lda, & - c_b2, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); - i__2 = *n - i__; - zlacgv_(&i__2, &a[i__ + (i__ + 1) * a_dim1], lda); - i__2 = i__ + i__ * a_dim1; - i__3 = i__ + i__ * a_dim1; - d__1 = a[i__3].r; - a[i__2].r = d__1, a[i__2].i = 0.; - } - if (i__ > 1) { + i__2 = i__ + i__ * a_dim1; + i__3 = i__ + i__ * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + i__2 = *n - i__; + zlacgv_(&i__2, &w[i__ + (iw + 1) * w_dim1], ldw); + i__2 = *n - i__; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__, &i__2, &z__1, &a[(i__ + 1) * + a_dim1 + 1], lda, &w[i__ + (iw + 1) * w_dim1], ldw, & + c_b2, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); + i__2 = *n - i__; + zlacgv_(&i__2, &w[i__ + (iw + 1) * w_dim1], ldw); + i__2 = *n - i__; + zlacgv_(&i__2, &a[i__ + (i__ + 1) * a_dim1], lda); + i__2 = *n - i__; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__, &i__2, &z__1, &w[(iw + 1) * + w_dim1 + 1], ldw, &a[i__ + (i__ + 1) * a_dim1], lda, & + c_b2, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); + i__2 = *n - i__; + zlacgv_(&i__2, &a[i__ + (i__ + 1) * a_dim1], lda); + i__2 = i__ + i__ * a_dim1; + i__3 = i__ + i__ * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + } + if (i__ > 1) { /* Generate elementary reflector H(i) to annihilate */ /* A(1:i-2,i) */ - i__2 = i__ - 1 + i__ * a_dim1; - alpha.r = a[i__2].r, alpha.i = a[i__2].i; - i__2 = i__ - 1; - zlarfg_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &tau[i__ - - 1]); - e[i__ - 1] = alpha.r; - i__2 = i__ - 1 + i__ * a_dim1; - a[i__2].r = 1., a[i__2].i = 0.; + i__2 = i__ - 1 + i__ * a_dim1; + alpha.r = a[i__2].r, alpha.i = a[i__2].i; + i__2 = i__ - 1; + zlarfg_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &tau[i__ + - 1]); + e[i__ - 1] = alpha.r; + i__2 = i__ - 1 + i__ * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; /* Compute W(1:i-1,i) */ - i__2 = i__ - 1; - zhemv_((char *)"Upper", &i__2, &c_b2, &a[a_offset], lda, &a[i__ * - a_dim1 + 1], &c__1, &c_b1, &w[iw * w_dim1 + 1], &c__1, - (ftnlen)5); - if (i__ < *n) { - i__2 = i__ - 1; - i__3 = *n - i__; - zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &w[(iw - + 1) * w_dim1 + 1], ldw, &a[i__ * a_dim1 + 1], & - c__1, &c_b1, &w[i__ + 1 + iw * w_dim1], &c__1, ( - ftnlen)19); - i__2 = i__ - 1; - i__3 = *n - i__; - z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[(i__ + 1) * - a_dim1 + 1], lda, &w[i__ + 1 + iw * w_dim1], & - c__1, &c_b2, &w[iw * w_dim1 + 1], &c__1, (ftnlen) - 12); - i__2 = i__ - 1; - i__3 = *n - i__; - zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &a[( - i__ + 1) * a_dim1 + 1], lda, &a[i__ * a_dim1 + 1], - &c__1, &c_b1, &w[i__ + 1 + iw * w_dim1], &c__1, ( - ftnlen)19); - i__2 = i__ - 1; - i__3 = *n - i__; - z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[(iw + 1) * - w_dim1 + 1], ldw, &w[i__ + 1 + iw * w_dim1], & - c__1, &c_b2, &w[iw * w_dim1 + 1], &c__1, (ftnlen) - 12); - } - i__2 = i__ - 1; - zscal_(&i__2, &tau[i__ - 1], &w[iw * w_dim1 + 1], &c__1); - z__3.r = -.5, z__3.i = -0.; - i__2 = i__ - 1; - z__2.r = z__3.r * tau[i__2].r - z__3.i * tau[i__2].i, z__2.i = - z__3.r * tau[i__2].i + z__3.i * tau[i__2].r; - i__3 = i__ - 1; - zdotc_(&z__4, &i__3, &w[iw * w_dim1 + 1], &c__1, &a[i__ * - a_dim1 + 1], &c__1); - z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * - z__4.i + z__2.i * z__4.r; - alpha.r = z__1.r, alpha.i = z__1.i; - i__2 = i__ - 1; - zaxpy_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &w[iw * - w_dim1 + 1], &c__1); - } + i__2 = i__ - 1; + zhemv_((char *)"Upper", &i__2, &c_b2, &a[a_offset], lda, &a[i__ * + a_dim1 + 1], &c__1, &c_b1, &w[iw * w_dim1 + 1], &c__1, + (ftnlen)5); + if (i__ < *n) { + i__2 = i__ - 1; + i__3 = *n - i__; + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &w[(iw + + 1) * w_dim1 + 1], ldw, &a[i__ * a_dim1 + 1], & + c__1, &c_b1, &w[i__ + 1 + iw * w_dim1], &c__1, ( + ftnlen)19); + i__2 = i__ - 1; + i__3 = *n - i__; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[(i__ + 1) * + a_dim1 + 1], lda, &w[i__ + 1 + iw * w_dim1], & + c__1, &c_b2, &w[iw * w_dim1 + 1], &c__1, (ftnlen) + 12); + i__2 = i__ - 1; + i__3 = *n - i__; + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &a[( + i__ + 1) * a_dim1 + 1], lda, &a[i__ * a_dim1 + 1], + &c__1, &c_b1, &w[i__ + 1 + iw * w_dim1], &c__1, ( + ftnlen)19); + i__2 = i__ - 1; + i__3 = *n - i__; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[(iw + 1) * + w_dim1 + 1], ldw, &w[i__ + 1 + iw * w_dim1], & + c__1, &c_b2, &w[iw * w_dim1 + 1], &c__1, (ftnlen) + 12); + } + i__2 = i__ - 1; + zscal_(&i__2, &tau[i__ - 1], &w[iw * w_dim1 + 1], &c__1); + z__3.r = -.5, z__3.i = -0.; + i__2 = i__ - 1; + z__2.r = z__3.r * tau[i__2].r - z__3.i * tau[i__2].i, z__2.i = + z__3.r * tau[i__2].i + z__3.i * tau[i__2].r; + i__3 = i__ - 1; + zdotc_(&z__4, &i__3, &w[iw * w_dim1 + 1], &c__1, &a[i__ * + a_dim1 + 1], &c__1); + z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * + z__4.i + z__2.i * z__4.r; + alpha.r = z__1.r, alpha.i = z__1.i; + i__2 = i__ - 1; + zaxpy_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &w[iw * + w_dim1 + 1], &c__1); + } /* L10: */ - } + } } else { /* Reduce first NB columns of lower triangle */ - i__1 = *nb; - for (i__ = 1; i__ <= i__1; ++i__) { + i__1 = *nb; + for (i__ = 1; i__ <= i__1; ++i__) { /* Update A(i:n,i) */ - i__2 = i__ + i__ * a_dim1; - i__3 = i__ + i__ * a_dim1; - d__1 = a[i__3].r; - a[i__2].r = d__1, a[i__2].i = 0.; - i__2 = i__ - 1; - zlacgv_(&i__2, &w[i__ + w_dim1], ldw); - i__2 = *n - i__ + 1; - i__3 = i__ - 1; - z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[i__ + a_dim1], lda, - &w[i__ + w_dim1], ldw, &c_b2, &a[i__ + i__ * a_dim1], & - c__1, (ftnlen)12); - i__2 = i__ - 1; - zlacgv_(&i__2, &w[i__ + w_dim1], ldw); - i__2 = i__ - 1; - zlacgv_(&i__2, &a[i__ + a_dim1], lda); - i__2 = *n - i__ + 1; - i__3 = i__ - 1; - z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[i__ + w_dim1], ldw, - &a[i__ + a_dim1], lda, &c_b2, &a[i__ + i__ * a_dim1], & - c__1, (ftnlen)12); - i__2 = i__ - 1; - zlacgv_(&i__2, &a[i__ + a_dim1], lda); - i__2 = i__ + i__ * a_dim1; - i__3 = i__ + i__ * a_dim1; - d__1 = a[i__3].r; - a[i__2].r = d__1, a[i__2].i = 0.; - if (i__ < *n) { + i__2 = i__ + i__ * a_dim1; + i__3 = i__ + i__ * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + i__2 = i__ - 1; + zlacgv_(&i__2, &w[i__ + w_dim1], ldw); + i__2 = *n - i__ + 1; + i__3 = i__ - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[i__ + a_dim1], lda, + &w[i__ + w_dim1], ldw, &c_b2, &a[i__ + i__ * a_dim1], & + c__1, (ftnlen)12); + i__2 = i__ - 1; + zlacgv_(&i__2, &w[i__ + w_dim1], ldw); + i__2 = i__ - 1; + zlacgv_(&i__2, &a[i__ + a_dim1], lda); + i__2 = *n - i__ + 1; + i__3 = i__ - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[i__ + w_dim1], ldw, + &a[i__ + a_dim1], lda, &c_b2, &a[i__ + i__ * a_dim1], & + c__1, (ftnlen)12); + i__2 = i__ - 1; + zlacgv_(&i__2, &a[i__ + a_dim1], lda); + i__2 = i__ + i__ * a_dim1; + i__3 = i__ + i__ * a_dim1; + d__1 = a[i__3].r; + a[i__2].r = d__1, a[i__2].i = 0.; + if (i__ < *n) { /* Generate elementary reflector H(i) to annihilate */ /* A(i+2:n,i) */ - i__2 = i__ + 1 + i__ * a_dim1; - alpha.r = a[i__2].r, alpha.i = a[i__2].i; - i__2 = *n - i__; + i__2 = i__ + 1 + i__ * a_dim1; + alpha.r = a[i__2].r, alpha.i = a[i__2].i; + i__2 = *n - i__; /* Computing MIN */ - i__3 = i__ + 2; - zlarfg_(&i__2, &alpha, &a[min(i__3,*n) + i__ * a_dim1], &c__1, - &tau[i__]); - e[i__] = alpha.r; - i__2 = i__ + 1 + i__ * a_dim1; - a[i__2].r = 1., a[i__2].i = 0.; + i__3 = i__ + 2; + zlarfg_(&i__2, &alpha, &a[min(i__3,*n) + i__ * a_dim1], &c__1, + &tau[i__]); + e[i__] = alpha.r; + i__2 = i__ + 1 + i__ * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; /* Compute W(i+1:n,i) */ - i__2 = *n - i__; - zhemv_((char *)"Lower", &i__2, &c_b2, &a[i__ + 1 + (i__ + 1) * a_dim1] - , lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b1, &w[ - i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)5); - i__2 = *n - i__; - i__3 = i__ - 1; - zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &w[i__ + 1 - + w_dim1], ldw, &a[i__ + 1 + i__ * a_dim1], &c__1, & - c_b1, &w[i__ * w_dim1 + 1], &c__1, (ftnlen)19); - i__2 = *n - i__; - i__3 = i__ - 1; - z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[i__ + 1 + - a_dim1], lda, &w[i__ * w_dim1 + 1], &c__1, &c_b2, &w[ - i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); - i__2 = *n - i__; - i__3 = i__ - 1; - zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &a[i__ + 1 - + a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, & - c_b1, &w[i__ * w_dim1 + 1], &c__1, (ftnlen)19); - i__2 = *n - i__; - i__3 = i__ - 1; - z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[i__ + 1 + - w_dim1], ldw, &w[i__ * w_dim1 + 1], &c__1, &c_b2, &w[ - i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); - i__2 = *n - i__; - zscal_(&i__2, &tau[i__], &w[i__ + 1 + i__ * w_dim1], &c__1); - z__3.r = -.5, z__3.i = -0.; - i__2 = i__; - z__2.r = z__3.r * tau[i__2].r - z__3.i * tau[i__2].i, z__2.i = - z__3.r * tau[i__2].i + z__3.i * tau[i__2].r; - i__3 = *n - i__; - zdotc_(&z__4, &i__3, &w[i__ + 1 + i__ * w_dim1], &c__1, &a[ - i__ + 1 + i__ * a_dim1], &c__1); - z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * - z__4.i + z__2.i * z__4.r; - alpha.r = z__1.r, alpha.i = z__1.i; - i__2 = *n - i__; - zaxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &w[ - i__ + 1 + i__ * w_dim1], &c__1); - } + i__2 = *n - i__; + zhemv_((char *)"Lower", &i__2, &c_b2, &a[i__ + 1 + (i__ + 1) * a_dim1] + , lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b1, &w[ + i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)5); + i__2 = *n - i__; + i__3 = i__ - 1; + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &w[i__ + 1 + + w_dim1], ldw, &a[i__ + 1 + i__ * a_dim1], &c__1, & + c_b1, &w[i__ * w_dim1 + 1], &c__1, (ftnlen)19); + i__2 = *n - i__; + i__3 = i__ - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[i__ + 1 + + a_dim1], lda, &w[i__ * w_dim1 + 1], &c__1, &c_b2, &w[ + i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); + i__2 = *n - i__; + i__3 = i__ - 1; + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &a[i__ + 1 + + a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, & + c_b1, &w[i__ * w_dim1 + 1], &c__1, (ftnlen)19); + i__2 = *n - i__; + i__3 = i__ - 1; + z__1.r = -1., z__1.i = -0.; + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[i__ + 1 + + w_dim1], ldw, &w[i__ * w_dim1 + 1], &c__1, &c_b2, &w[ + i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); + i__2 = *n - i__; + zscal_(&i__2, &tau[i__], &w[i__ + 1 + i__ * w_dim1], &c__1); + z__3.r = -.5, z__3.i = -0.; + i__2 = i__; + z__2.r = z__3.r * tau[i__2].r - z__3.i * tau[i__2].i, z__2.i = + z__3.r * tau[i__2].i + z__3.i * tau[i__2].r; + i__3 = *n - i__; + zdotc_(&z__4, &i__3, &w[i__ + 1 + i__ * w_dim1], &c__1, &a[ + i__ + 1 + i__ * a_dim1], &c__1); + z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * + z__4.i + z__2.i * z__4.r; + alpha.r = z__1.r, alpha.i = z__1.i; + i__2 = *n - i__; + zaxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &w[ + i__ + 1 + i__ * w_dim1], &c__1); + } /* L20: */ - } + } } return 0; @@ -505,5 +505,5 @@ f"> */ } /* zlatrd_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zpptrf.cpp b/lib/linalg/zpptrf.cpp index ebf3b7df9a..d14e3678be 100644 --- a/lib/linalg/zpptrf.cpp +++ b/lib/linalg/zpptrf.cpp @@ -1,13 +1,13 @@ /* fortran/zpptrf.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -140,8 +140,8 @@ f"> */ /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zpptrf_(char *uplo, integer *n, doublecomplex *ap, - integer *info, ftnlen uplo_len) +/* Subroutine */ int zpptrf_(char *uplo, integer *n, doublecomplex *ap, + integer *info, ftnlen uplo_len) { /* System generated locals */ integer i__1, i__2, i__3; @@ -154,16 +154,16 @@ f"> */ /* Local variables */ integer j, jc, jj; doublereal ajj; - extern /* Subroutine */ int zhpr_(char *, integer *, doublereal *, - doublecomplex *, integer *, doublecomplex *, ftnlen); + extern /* Subroutine */ int zhpr_(char *, integer *, doublereal *, + doublecomplex *, integer *, doublecomplex *, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *); + extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *); logical upper; - extern /* Subroutine */ int ztpsv_(char *, char *, char *, integer *, - doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen), zdscal_(integer *, - doublereal *, doublecomplex *, integer *); + extern /* Subroutine */ int ztpsv_(char *, char *, char *, integer *, + doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen), zdscal_(integer *, + doublereal *, doublecomplex *, integer *); /* -- LAPACK computational routine -- */ @@ -198,91 +198,91 @@ f"> */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZPPTRF", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZPPTRF", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } if (upper) { /* Compute the Cholesky factorization A = U**H * U. */ - jj = 0; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - jc = jj + 1; - jj += j; + jj = 0; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + jc = jj + 1; + jj += j; /* Compute elements 1:J-1 of column J. */ - if (j > 1) { - i__2 = j - 1; - ztpsv_((char *)"Upper", (char *)"Conjugate transpose", (char *)"Non-unit", &i__2, &ap[ - 1], &ap[jc], &c__1, (ftnlen)5, (ftnlen)19, (ftnlen)8); - } + if (j > 1) { + i__2 = j - 1; + ztpsv_((char *)"Upper", (char *)"Conjugate transpose", (char *)"Non-unit", &i__2, &ap[ + 1], &ap[jc], &c__1, (ftnlen)5, (ftnlen)19, (ftnlen)8); + } /* Compute U(J,J) and test for non-positive-definiteness. */ - i__2 = jj; - i__3 = j - 1; - zdotc_(&z__1, &i__3, &ap[jc], &c__1, &ap[jc], &c__1); - ajj = ap[i__2].r - z__1.r; - if (ajj <= 0.) { - i__2 = jj; - ap[i__2].r = ajj, ap[i__2].i = 0.; - goto L30; - } - i__2 = jj; - d__1 = sqrt(ajj); - ap[i__2].r = d__1, ap[i__2].i = 0.; + i__2 = jj; + i__3 = j - 1; + zdotc_(&z__1, &i__3, &ap[jc], &c__1, &ap[jc], &c__1); + ajj = ap[i__2].r - z__1.r; + if (ajj <= 0.) { + i__2 = jj; + ap[i__2].r = ajj, ap[i__2].i = 0.; + goto L30; + } + i__2 = jj; + d__1 = sqrt(ajj); + ap[i__2].r = d__1, ap[i__2].i = 0.; /* L10: */ - } + } } else { /* Compute the Cholesky factorization A = L * L**H. */ - jj = 1; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { + jj = 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { /* Compute L(J,J) and test for non-positive-definiteness. */ - i__2 = jj; - ajj = ap[i__2].r; - if (ajj <= 0.) { - i__2 = jj; - ap[i__2].r = ajj, ap[i__2].i = 0.; - goto L30; - } - ajj = sqrt(ajj); - i__2 = jj; - ap[i__2].r = ajj, ap[i__2].i = 0.; + i__2 = jj; + ajj = ap[i__2].r; + if (ajj <= 0.) { + i__2 = jj; + ap[i__2].r = ajj, ap[i__2].i = 0.; + goto L30; + } + ajj = sqrt(ajj); + i__2 = jj; + ap[i__2].r = ajj, ap[i__2].i = 0.; /* Compute elements J+1:N of column J and update the trailing */ /* submatrix. */ - if (j < *n) { - i__2 = *n - j; - d__1 = 1. / ajj; - zdscal_(&i__2, &d__1, &ap[jj + 1], &c__1); - i__2 = *n - j; - zhpr_((char *)"Lower", &i__2, &c_b16, &ap[jj + 1], &c__1, &ap[jj + *n - - j + 1], (ftnlen)5); - jj = jj + *n - j + 1; - } + if (j < *n) { + i__2 = *n - j; + d__1 = 1. / ajj; + zdscal_(&i__2, &d__1, &ap[jj + 1], &c__1); + i__2 = *n - j; + zhpr_((char *)"Lower", &i__2, &c_b16, &ap[jj + 1], &c__1, &ap[jj + *n + - j + 1], (ftnlen)5); + jj = jj + *n - j + 1; + } /* L20: */ - } + } } goto L40; @@ -297,5 +297,5 @@ L40: } /* zpptrf_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zpptri.cpp b/lib/linalg/zpptri.cpp index fc11e435b1..e804683c79 100644 --- a/lib/linalg/zpptri.cpp +++ b/lib/linalg/zpptri.cpp @@ -1,13 +1,13 @@ /* fortran/zpptri.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -114,8 +114,8 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zpptri_(char *uplo, integer *n, doublecomplex *ap, - integer *info, ftnlen uplo_len) +/* Subroutine */ int zpptri_(char *uplo, integer *n, doublecomplex *ap, + integer *info, ftnlen uplo_len) { /* System generated locals */ integer i__1, i__2, i__3; @@ -126,17 +126,17 @@ f"> */ integer j, jc, jj; doublereal ajj; integer jjn; - extern /* Subroutine */ int zhpr_(char *, integer *, doublereal *, - doublecomplex *, integer *, doublecomplex *, ftnlen); + extern /* Subroutine */ int zhpr_(char *, integer *, doublereal *, + doublecomplex *, integer *, doublecomplex *, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *); + extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *); logical upper; - extern /* Subroutine */ int ztpmv_(char *, char *, char *, integer *, - doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen), zdscal_(integer *, - doublereal *, doublecomplex *, integer *), ztptri_(char *, char *, - integer *, doublecomplex *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int ztpmv_(char *, char *, char *, integer *, + doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen), zdscal_(integer *, + doublereal *, doublecomplex *, integer *), ztptri_(char *, char *, + integer *, doublecomplex *, integer *, ftnlen, ftnlen); /* -- LAPACK computational routine -- */ @@ -171,70 +171,70 @@ f"> */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZPPTRI", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZPPTRI", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } /* Invert the triangular Cholesky factor U or L. */ ztptri_(uplo, (char *)"Non-unit", n, &ap[1], info, (ftnlen)1, (ftnlen)8); if (*info > 0) { - return 0; + return 0; } if (upper) { /* Compute the product inv(U) * inv(U)**H. */ - jj = 0; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - jc = jj + 1; - jj += j; - if (j > 1) { - i__2 = j - 1; - zhpr_((char *)"Upper", &i__2, &c_b8, &ap[jc], &c__1, &ap[1], (ftnlen) - 5); - } - i__2 = jj; - ajj = ap[i__2].r; - zdscal_(&j, &ajj, &ap[jc], &c__1); + jj = 0; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + jc = jj + 1; + jj += j; + if (j > 1) { + i__2 = j - 1; + zhpr_((char *)"Upper", &i__2, &c_b8, &ap[jc], &c__1, &ap[1], (ftnlen) + 5); + } + i__2 = jj; + ajj = ap[i__2].r; + zdscal_(&j, &ajj, &ap[jc], &c__1); /* L10: */ - } + } } else { /* Compute the product inv(L)**H * inv(L). */ - jj = 1; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - jjn = jj + *n - j + 1; - i__2 = jj; - i__3 = *n - j + 1; - zdotc_(&z__1, &i__3, &ap[jj], &c__1, &ap[jj], &c__1); - d__1 = z__1.r; - ap[i__2].r = d__1, ap[i__2].i = 0.; - if (j < *n) { - i__2 = *n - j; - ztpmv_((char *)"Lower", (char *)"Conjugate transpose", (char *)"Non-unit", &i__2, &ap[ - jjn], &ap[jj + 1], &c__1, (ftnlen)5, (ftnlen)19, ( - ftnlen)8); - } - jj = jjn; + jj = 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + jjn = jj + *n - j + 1; + i__2 = jj; + i__3 = *n - j + 1; + zdotc_(&z__1, &i__3, &ap[jj], &c__1, &ap[jj], &c__1); + d__1 = z__1.r; + ap[i__2].r = d__1, ap[i__2].i = 0.; + if (j < *n) { + i__2 = *n - j; + ztpmv_((char *)"Lower", (char *)"Conjugate transpose", (char *)"Non-unit", &i__2, &ap[ + jjn], &ap[jj + 1], &c__1, (ftnlen)5, (ftnlen)19, ( + ftnlen)8); + } + jj = jjn; /* L20: */ - } + } } return 0; @@ -244,5 +244,5 @@ f"> */ } /* zpptri_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zscal.cpp b/lib/linalg/zscal.cpp index 5985adebaf..6efc02ee5e 100644 --- a/lib/linalg/zscal.cpp +++ b/lib/linalg/zscal.cpp @@ -1,13 +1,13 @@ /* fortran/zscal.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -91,8 +91,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zscal_(integer *n, doublecomplex *za, doublecomplex *zx, - integer *incx) +/* Subroutine */ int zscal_(integer *n, doublecomplex *za, doublecomplex *zx, + integer *incx) { /* System generated locals */ integer i__1, i__2, i__3, i__4; @@ -122,34 +122,34 @@ extern "C" { /* Function Body */ if (*n <= 0 || *incx <= 0 || za->r == 1. && za->i == 0.) { - return 0; + return 0; } if (*incx == 1) { /* code for increment equal to 1 */ - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__; - i__3 = i__; - z__1.r = za->r * zx[i__3].r - za->i * zx[i__3].i, z__1.i = za->r * - zx[i__3].i + za->i * zx[i__3].r; - zx[i__2].r = z__1.r, zx[i__2].i = z__1.i; - } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + i__3 = i__; + z__1.r = za->r * zx[i__3].r - za->i * zx[i__3].i, z__1.i = za->r * + zx[i__3].i + za->i * zx[i__3].r; + zx[i__2].r = z__1.r, zx[i__2].i = z__1.i; + } } else { /* code for increment not equal to 1 */ - nincx = *n * *incx; - i__1 = nincx; - i__2 = *incx; - for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { - i__3 = i__; - i__4 = i__; - z__1.r = za->r * zx[i__4].r - za->i * zx[i__4].i, z__1.i = za->r * - zx[i__4].i + za->i * zx[i__4].r; - zx[i__3].r = z__1.r, zx[i__3].i = z__1.i; - } + nincx = *n * *incx; + i__1 = nincx; + i__2 = *incx; + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__3 = i__; + i__4 = i__; + z__1.r = za->r * zx[i__4].r - za->i * zx[i__4].i, z__1.i = za->r * + zx[i__4].i + za->i * zx[i__4].r; + zx[i__3].r = z__1.r, zx[i__3].i = z__1.i; + } } return 0; @@ -158,5 +158,5 @@ extern "C" { } /* zscal_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zstedc.cpp b/lib/linalg/zstedc.cpp index fb52b344b1..1a4d71cf50 100644 --- a/lib/linalg/zstedc.cpp +++ b/lib/linalg/zstedc.cpp @@ -1,13 +1,13 @@ /* fortran/zstedc.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -236,10 +236,10 @@ f"> */ /* > at Berkeley, USA */ /* ===================================================================== */ -/* Subroutine */ int zstedc_(char *compz, integer *n, doublereal *d__, - doublereal *e, doublecomplex *z__, integer *ldz, doublecomplex *work, - integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, - integer *liwork, integer *info, ftnlen compz_len) +/* Subroutine */ int zstedc_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublecomplex *z__, integer *ldz, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, + integer *liwork, integer *info, ftnlen compz_len) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2, i__3, i__4; @@ -257,40 +257,40 @@ f"> */ doublereal eps, tiny; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer lwmin, start; - extern /* Subroutine */ int zswap_(integer *, doublecomplex *, integer *, - doublecomplex *, integer *), zlaed0_(integer *, integer *, - doublereal *, doublereal *, doublecomplex *, integer *, - doublecomplex *, integer *, doublereal *, integer *, integer *); + extern /* Subroutine */ int zswap_(integer *, doublecomplex *, integer *, + doublecomplex *, integer *), zlaed0_(integer *, integer *, + doublereal *, doublereal *, doublecomplex *, integer *, + doublecomplex *, integer *, doublereal *, integer *, integer *); extern doublereal dlamch_(char *, ftnlen); - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dstedc_(char *, integer *, - doublereal *, doublereal *, doublereal *, integer *, doublereal *, - integer *, integer *, integer *, integer *, ftnlen), dlaset_( - char *, integer *, integer *, doublereal *, doublereal *, - doublereal *, integer *, ftnlen), xerbla_(char *, integer *, - ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen), dstedc_(char *, integer *, + doublereal *, doublereal *, doublereal *, integer *, doublereal *, + integer *, integer *, integer *, integer *, ftnlen), dlaset_( + char *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen), xerbla_(char *, integer *, + ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); integer finish; - extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, - ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, + ftnlen); extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, - integer *), zlacrm_(integer *, integer *, doublecomplex *, - integer *, doublereal *, integer *, doublecomplex *, integer *, - doublereal *); + integer *), zlacrm_(integer *, integer *, doublecomplex *, + integer *, doublereal *, integer *, doublecomplex *, integer *, + doublereal *); integer liwmin, icompz; - extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - ftnlen), zlacpy_(char *, integer *, integer *, doublecomplex *, - integer *, doublecomplex *, integer *, ftnlen); + extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, + ftnlen), zlacpy_(char *, integer *, integer *, doublecomplex *, + integer *, doublecomplex *, integer *, ftnlen); doublereal orgnrm; integer lrwmin; logical lquery; integer smlsiz; - extern /* Subroutine */ int zsteqr_(char *, integer *, doublereal *, - doublereal *, doublecomplex *, integer *, doublereal *, integer *, - ftnlen); + extern /* Subroutine */ int zsteqr_(char *, integer *, doublereal *, + doublereal *, doublecomplex *, integer *, doublereal *, integer *, + ftnlen); /* -- LAPACK computational routine -- */ @@ -333,88 +333,88 @@ f"> */ lquery = *lwork == -1 || *lrwork == -1 || *liwork == -1; if (lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1)) { - icompz = 0; + icompz = 0; } else if (lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1)) { - icompz = 1; + icompz = 1; } else if (lsame_(compz, (char *)"I", (ftnlen)1, (ftnlen)1)) { - icompz = 2; + icompz = 2; } else { - icompz = -1; + icompz = -1; } if (icompz < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { - *info = -6; + *info = -6; } if (*info == 0) { /* Compute the workspace requirements */ - smlsiz = ilaenv_(&c__9, (char *)"ZSTEDC", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( - ftnlen)6, (ftnlen)1); - if (*n <= 1 || icompz == 0) { - lwmin = 1; - liwmin = 1; - lrwmin = 1; - } else if (*n <= smlsiz) { - lwmin = 1; - liwmin = 1; - lrwmin = *n - 1 << 1; - } else if (icompz == 1) { - lgn = (integer) (log((doublereal) (*n)) / log(2.)); - if (pow_ii(&c__2, &lgn) < *n) { - ++lgn; - } - if (pow_ii(&c__2, &lgn) < *n) { - ++lgn; - } - lwmin = *n * *n; + smlsiz = ilaenv_(&c__9, (char *)"ZSTEDC", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( + ftnlen)6, (ftnlen)1); + if (*n <= 1 || icompz == 0) { + lwmin = 1; + liwmin = 1; + lrwmin = 1; + } else if (*n <= smlsiz) { + lwmin = 1; + liwmin = 1; + lrwmin = *n - 1 << 1; + } else if (icompz == 1) { + lgn = (integer) (log((doublereal) (*n)) / log(2.)); + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + if (pow_ii(&c__2, &lgn) < *n) { + ++lgn; + } + lwmin = *n * *n; /* Computing 2nd power */ - i__1 = *n; - lrwmin = *n * 3 + 1 + (*n << 1) * lgn + (i__1 * i__1 << 2); - liwmin = *n * 6 + 6 + *n * 5 * lgn; - } else if (icompz == 2) { - lwmin = 1; + i__1 = *n; + lrwmin = *n * 3 + 1 + (*n << 1) * lgn + (i__1 * i__1 << 2); + liwmin = *n * 6 + 6 + *n * 5 * lgn; + } else if (icompz == 2) { + lwmin = 1; /* Computing 2nd power */ - i__1 = *n; - lrwmin = (*n << 2) + 1 + (i__1 * i__1 << 1); - liwmin = *n * 5 + 3; - } - work[1].r = (doublereal) lwmin, work[1].i = 0.; - rwork[1] = (doublereal) lrwmin; - iwork[1] = liwmin; + i__1 = *n; + lrwmin = (*n << 2) + 1 + (i__1 * i__1 << 1); + liwmin = *n * 5 + 3; + } + work[1].r = (doublereal) lwmin, work[1].i = 0.; + rwork[1] = (doublereal) lrwmin; + iwork[1] = liwmin; - if (*lwork < lwmin && ! lquery) { - *info = -8; - } else if (*lrwork < lrwmin && ! lquery) { - *info = -10; - } else if (*liwork < liwmin && ! lquery) { - *info = -12; - } + if (*lwork < lwmin && ! lquery) { + *info = -8; + } else if (*lrwork < lrwmin && ! lquery) { + *info = -10; + } else if (*liwork < liwmin && ! lquery) { + *info = -12; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZSTEDC", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZSTEDC", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } if (*n == 1) { - if (icompz != 0) { - i__1 = z_dim1 + 1; - z__[i__1].r = 1., z__[i__1].i = 0.; - } - return 0; + if (icompz != 0) { + i__1 = z_dim1 + 1; + z__[i__1].r = 1., z__[i__1].i = 0.; + } + return 0; } /* If the following conditional clause is removed, then the routine */ @@ -429,8 +429,8 @@ f"> */ /* If COMPZ = 'N', use DSTERF to compute the eigenvalues. */ if (icompz == 0) { - dsterf_(n, &d__[1], &e[1], info); - goto L70; + dsterf_(n, &d__[1], &e[1], info); + goto L70; } /* If N is smaller than the minimum divide size (SMLSIZ+1), then */ @@ -438,51 +438,51 @@ f"> */ if (*n <= smlsiz) { - zsteqr_(compz, n, &d__[1], &e[1], &z__[z_offset], ldz, &rwork[1], - info, (ftnlen)1); + zsteqr_(compz, n, &d__[1], &e[1], &z__[z_offset], ldz, &rwork[1], + info, (ftnlen)1); } else { /* If COMPZ = 'I', we simply call DSTEDC instead. */ - if (icompz == 2) { - dlaset_((char *)"Full", n, n, &c_b17, &c_b18, &rwork[1], n, (ftnlen)4); - ll = *n * *n + 1; - i__1 = *lrwork - ll + 1; - dstedc_((char *)"I", n, &d__[1], &e[1], &rwork[1], n, &rwork[ll], &i__1, & - iwork[1], liwork, info, (ftnlen)1); - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *n; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * z_dim1; - i__4 = (j - 1) * *n + i__; - z__[i__3].r = rwork[i__4], z__[i__3].i = 0.; + if (icompz == 2) { + dlaset_((char *)"Full", n, n, &c_b17, &c_b18, &rwork[1], n, (ftnlen)4); + ll = *n * *n + 1; + i__1 = *lrwork - ll + 1; + dstedc_((char *)"I", n, &d__[1], &e[1], &rwork[1], n, &rwork[ll], &i__1, & + iwork[1], liwork, info, (ftnlen)1); + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *n; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * z_dim1; + i__4 = (j - 1) * *n + i__; + z__[i__3].r = rwork[i__4], z__[i__3].i = 0.; /* L10: */ - } + } /* L20: */ - } - goto L70; - } + } + goto L70; + } /* From now on, only option left to be handled is COMPZ = 'V', */ /* i.e. ICOMPZ = 1. */ /* Scale. */ - orgnrm = dlanst_((char *)"M", n, &d__[1], &e[1], (ftnlen)1); - if (orgnrm == 0.) { - goto L70; - } + orgnrm = dlanst_((char *)"M", n, &d__[1], &e[1], (ftnlen)1); + if (orgnrm == 0.) { + goto L70; + } - eps = dlamch_((char *)"Epsilon", (ftnlen)7); + eps = dlamch_((char *)"Epsilon", (ftnlen)7); - start = 1; + start = 1; /* while ( START <= N ) */ L30: - if (start <= *n) { + if (start <= *n) { /* Let FINISH be the position of the next subdiagonal entry */ /* such that E( FINISH ) <= TINY or FINISH = N if no such */ @@ -490,88 +490,88 @@ L30: /* between START and FINISH constitutes an independent */ /* sub-problem. */ - finish = start; + finish = start; L40: - if (finish < *n) { - tiny = eps * sqrt((d__1 = d__[finish], abs(d__1))) * sqrt(( - d__2 = d__[finish + 1], abs(d__2))); - if ((d__1 = e[finish], abs(d__1)) > tiny) { - ++finish; - goto L40; - } - } + if (finish < *n) { + tiny = eps * sqrt((d__1 = d__[finish], abs(d__1))) * sqrt(( + d__2 = d__[finish + 1], abs(d__2))); + if ((d__1 = e[finish], abs(d__1)) > tiny) { + ++finish; + goto L40; + } + } /* (Sub) Problem determined. Compute its size and solve it. */ - m = finish - start + 1; - if (m > smlsiz) { + m = finish - start + 1; + if (m > smlsiz) { /* Scale. */ - orgnrm = dlanst_((char *)"M", &m, &d__[start], &e[start], (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &m, &c__1, &d__[ - start], &m, info, (ftnlen)1); - i__1 = m - 1; - i__2 = m - 1; - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &i__1, &c__1, &e[ - start], &i__2, info, (ftnlen)1); + orgnrm = dlanst_((char *)"M", &m, &d__[start], &e[start], (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &m, &c__1, &d__[ + start], &m, info, (ftnlen)1); + i__1 = m - 1; + i__2 = m - 1; + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &i__1, &c__1, &e[ + start], &i__2, info, (ftnlen)1); - zlaed0_(n, &m, &d__[start], &e[start], &z__[start * z_dim1 + - 1], ldz, &work[1], n, &rwork[1], &iwork[1], info); - if (*info > 0) { - *info = (*info / (m + 1) + start - 1) * (*n + 1) + *info % - (m + 1) + start - 1; - goto L70; - } + zlaed0_(n, &m, &d__[start], &e[start], &z__[start * z_dim1 + + 1], ldz, &work[1], n, &rwork[1], &iwork[1], info); + if (*info > 0) { + *info = (*info / (m + 1) + start - 1) * (*n + 1) + *info % + (m + 1) + start - 1; + goto L70; + } /* Scale back. */ - dlascl_((char *)"G", &c__0, &c__0, &c_b18, &orgnrm, &m, &c__1, &d__[ - start], &m, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &c_b18, &orgnrm, &m, &c__1, &d__[ + start], &m, info, (ftnlen)1); - } else { - dsteqr_((char *)"I", &m, &d__[start], &e[start], &rwork[1], &m, & - rwork[m * m + 1], info, (ftnlen)1); - zlacrm_(n, &m, &z__[start * z_dim1 + 1], ldz, &rwork[1], &m, & - work[1], n, &rwork[m * m + 1]); - zlacpy_((char *)"A", n, &m, &work[1], n, &z__[start * z_dim1 + 1], - ldz, (ftnlen)1); - if (*info > 0) { - *info = start * (*n + 1) + finish; - goto L70; - } - } + } else { + dsteqr_((char *)"I", &m, &d__[start], &e[start], &rwork[1], &m, & + rwork[m * m + 1], info, (ftnlen)1); + zlacrm_(n, &m, &z__[start * z_dim1 + 1], ldz, &rwork[1], &m, & + work[1], n, &rwork[m * m + 1]); + zlacpy_((char *)"A", n, &m, &work[1], n, &z__[start * z_dim1 + 1], + ldz, (ftnlen)1); + if (*info > 0) { + *info = start * (*n + 1) + finish; + goto L70; + } + } - start = finish + 1; - goto L30; - } + start = finish + 1; + goto L30; + } /* endwhile */ /* Use Selection Sort to minimize swaps of eigenvectors */ - i__1 = *n; - for (ii = 2; ii <= i__1; ++ii) { - i__ = ii - 1; - k = i__; - p = d__[i__]; - i__2 = *n; - for (j = ii; j <= i__2; ++j) { - if (d__[j] < p) { - k = j; - p = d__[j]; - } + i__1 = *n; + for (ii = 2; ii <= i__1; ++ii) { + i__ = ii - 1; + k = i__; + p = d__[i__]; + i__2 = *n; + for (j = ii; j <= i__2; ++j) { + if (d__[j] < p) { + k = j; + p = d__[j]; + } /* L50: */ - } - if (k != i__) { - d__[k] = d__[i__]; - d__[i__] = p; - zswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], - &c__1); - } + } + if (k != i__) { + d__[k] = d__[i__]; + d__[i__] = p; + zswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], + &c__1); + } /* L60: */ - } + } } L70: @@ -586,5 +586,5 @@ L70: } /* zstedc_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zsteqr.cpp b/lib/linalg/zsteqr.cpp index 21cb31cc10..ce75593d28 100644 --- a/lib/linalg/zsteqr.cpp +++ b/lib/linalg/zsteqr.cpp @@ -1,13 +1,13 @@ /* fortran/zsteqr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -157,9 +157,9 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zsteqr_(char *compz, integer *n, doublereal *d__, - doublereal *e, doublecomplex *z__, integer *ldz, doublereal *work, - integer *info, ftnlen compz_len) +/* Subroutine */ int zsteqr_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublecomplex *z__, integer *ldz, doublereal *work, + integer *info, ftnlen compz_len) { /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; @@ -177,39 +177,39 @@ f"> */ integer lsv; doublereal tst, eps2; integer lend, jtot; - extern /* Subroutine */ int dlae2_(doublereal *, doublereal *, doublereal - *, doublereal *, doublereal *); + extern /* Subroutine */ int dlae2_(doublereal *, doublereal *, doublereal + *, doublereal *, doublereal *); extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal anorm; - extern /* Subroutine */ int zlasr_(char *, char *, char *, integer *, - integer *, doublereal *, doublereal *, doublecomplex *, integer *, - ftnlen, ftnlen, ftnlen), zswap_(integer *, doublecomplex *, - integer *, doublecomplex *, integer *), dlaev2_(doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *); + extern /* Subroutine */ int zlasr_(char *, char *, char *, integer *, + integer *, doublereal *, doublereal *, doublecomplex *, integer *, + ftnlen, ftnlen, ftnlen), zswap_(integer *, doublecomplex *, + integer *, doublecomplex *, integer *), dlaev2_(doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *); integer lendm1, lendp1; - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, + ftnlen); integer iscale; - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern /* Subroutine */ int dlascl_(char *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen); doublereal safmin; - extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *); + extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); doublereal safmax; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, - ftnlen); - extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, - integer *, ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, + ftnlen); + extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, + integer *, ftnlen); integer lendsv; doublereal ssfmin; integer nmaxit, icompz; doublereal ssfmax; - extern /* Subroutine */ int zlaset_(char *, integer *, integer *, - doublecomplex *, doublecomplex *, doublecomplex *, integer *, - ftnlen); + extern /* Subroutine */ int zlaset_(char *, integer *, integer *, + doublecomplex *, doublecomplex *, doublecomplex *, integer *, + ftnlen); /* -- LAPACK computational routine -- */ @@ -249,39 +249,39 @@ f"> */ *info = 0; if (lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1)) { - icompz = 0; + icompz = 0; } else if (lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1)) { - icompz = 1; + icompz = 1; } else if (lsame_(compz, (char *)"I", (ftnlen)1, (ftnlen)1)) { - icompz = 2; + icompz = 2; } else { - icompz = -1; + icompz = -1; } if (icompz < 0) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { - *info = -6; + *info = -6; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZSTEQR", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZSTEQR", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n == 0) { - return 0; + return 0; } if (*n == 1) { - if (icompz == 2) { - i__1 = z_dim1 + 1; - z__[i__1].r = 1., z__[i__1].i = 0.; - } - return 0; + if (icompz == 2) { + i__1 = z_dim1 + 1; + z__[i__1].r = 1., z__[i__1].i = 0.; + } + return 0; } /* Determine the unit roundoff and over/underflow thresholds. */ @@ -299,7 +299,7 @@ f"> */ /* matrix. */ if (icompz == 2) { - zlaset_((char *)"Full", n, n, &c_b1, &c_b2, &z__[z_offset], ldz, (ftnlen)4); + zlaset_((char *)"Full", n, n, &c_b1, &c_b2, &z__[z_offset], ldz, (ftnlen)4); } nmaxit = *n * 30; @@ -314,25 +314,25 @@ f"> */ L10: if (l1 > *n) { - goto L160; + goto L160; } if (l1 > 1) { - e[l1 - 1] = 0.; + e[l1 - 1] = 0.; } if (l1 <= nm1) { - i__1 = nm1; - for (m = l1; m <= i__1; ++m) { - tst = (d__1 = e[m], abs(d__1)); - if (tst == 0.) { - goto L30; - } - if (tst <= sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m - + 1], abs(d__2))) * eps) { - e[m] = 0.; - goto L30; - } + i__1 = nm1; + for (m = l1; m <= i__1; ++m) { + tst = (d__1 = e[m], abs(d__1)); + if (tst == 0.) { + goto L30; + } + if (tst <= sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m + + 1], abs(d__2))) * eps) { + e[m] = 0.; + goto L30; + } /* L20: */ - } + } } m = *n; @@ -343,7 +343,7 @@ L30: lendsv = lend; l1 = m + 1; if (lend == l) { - goto L10; + goto L10; } /* Scale submatrix in rows and columns L to LEND */ @@ -352,31 +352,31 @@ L30: anorm = dlanst_((char *)"I", &i__1, &d__[l], &e[l], (ftnlen)1); iscale = 0; if (anorm == 0.) { - goto L10; + goto L10; } if (anorm > ssfmax) { - iscale = 1; - i__1 = lend - l + 1; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, - info, (ftnlen)1); - i__1 = lend - l; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, - info, (ftnlen)1); + iscale = 1; + i__1 = lend - l + 1; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, + info, (ftnlen)1); + i__1 = lend - l; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, + info, (ftnlen)1); } else if (anorm < ssfmin) { - iscale = 2; - i__1 = lend - l + 1; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, - info, (ftnlen)1); - i__1 = lend - l; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, - info, (ftnlen)1); + iscale = 2; + i__1 = lend - l + 1; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, + info, (ftnlen)1); + i__1 = lend - l; + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, + info, (ftnlen)1); } /* Choose between QL and QR iteration */ if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { - lend = lsv; - l = lendsv; + lend = lsv; + l = lendsv; } if (lend > l) { @@ -386,120 +386,120 @@ L30: /* Look for small subdiagonal element. */ L40: - if (l != lend) { - lendm1 = lend - 1; - i__1 = lendm1; - for (m = l; m <= i__1; ++m) { + if (l != lend) { + lendm1 = lend - 1; + i__1 = lendm1; + for (m = l; m <= i__1; ++m) { /* Computing 2nd power */ - d__2 = (d__1 = e[m], abs(d__1)); - tst = d__2 * d__2; - if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m - + 1], abs(d__2)) + safmin) { - goto L60; - } + d__2 = (d__1 = e[m], abs(d__1)); + tst = d__2 * d__2; + if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m + + 1], abs(d__2)) + safmin) { + goto L60; + } /* L50: */ - } - } + } + } - m = lend; + m = lend; L60: - if (m < lend) { - e[m] = 0.; - } - p = d__[l]; - if (m == l) { - goto L80; - } + if (m < lend) { + e[m] = 0.; + } + p = d__[l]; + if (m == l) { + goto L80; + } /* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ /* to compute its eigensystem. */ - if (m == l + 1) { - if (icompz > 0) { - dlaev2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s); - work[l] = c__; - work[*n - 1 + l] = s; - zlasr_((char *)"R", (char *)"V", (char *)"B", n, &c__2, &work[l], &work[*n - 1 + l], & - z__[l * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); - } else { - dlae2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2); - } - d__[l] = rt1; - d__[l + 1] = rt2; - e[l] = 0.; - l += 2; - if (l <= lend) { - goto L40; - } - goto L140; - } + if (m == l + 1) { + if (icompz > 0) { + dlaev2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s); + work[l] = c__; + work[*n - 1 + l] = s; + zlasr_((char *)"R", (char *)"V", (char *)"B", n, &c__2, &work[l], &work[*n - 1 + l], & + z__[l * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, ( + ftnlen)1); + } else { + dlae2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2); + } + d__[l] = rt1; + d__[l + 1] = rt2; + e[l] = 0.; + l += 2; + if (l <= lend) { + goto L40; + } + goto L140; + } - if (jtot == nmaxit) { - goto L140; - } - ++jtot; + if (jtot == nmaxit) { + goto L140; + } + ++jtot; /* Form shift. */ - g = (d__[l + 1] - p) / (e[l] * 2.); - r__ = dlapy2_(&g, &c_b41); - g = d__[m] - p + e[l] / (g + d_sign(&r__, &g)); + g = (d__[l + 1] - p) / (e[l] * 2.); + r__ = dlapy2_(&g, &c_b41); + g = d__[m] - p + e[l] / (g + d_sign(&r__, &g)); - s = 1.; - c__ = 1.; - p = 0.; + s = 1.; + c__ = 1.; + p = 0.; /* Inner loop */ - mm1 = m - 1; - i__1 = l; - for (i__ = mm1; i__ >= i__1; --i__) { - f = s * e[i__]; - b = c__ * e[i__]; - dlartg_(&g, &f, &c__, &s, &r__); - if (i__ != m - 1) { - e[i__ + 1] = r__; - } - g = d__[i__ + 1] - p; - r__ = (d__[i__] - g) * s + c__ * 2. * b; - p = s * r__; - d__[i__ + 1] = g + p; - g = c__ * r__ - b; + mm1 = m - 1; + i__1 = l; + for (i__ = mm1; i__ >= i__1; --i__) { + f = s * e[i__]; + b = c__ * e[i__]; + dlartg_(&g, &f, &c__, &s, &r__); + if (i__ != m - 1) { + e[i__ + 1] = r__; + } + g = d__[i__ + 1] - p; + r__ = (d__[i__] - g) * s + c__ * 2. * b; + p = s * r__; + d__[i__ + 1] = g + p; + g = c__ * r__ - b; /* If eigenvectors are desired, then save rotations. */ - if (icompz > 0) { - work[i__] = c__; - work[*n - 1 + i__] = -s; - } + if (icompz > 0) { + work[i__] = c__; + work[*n - 1 + i__] = -s; + } /* L70: */ - } + } /* If eigenvectors are desired, then apply saved rotations. */ - if (icompz > 0) { - mm = m - l + 1; - zlasr_((char *)"R", (char *)"V", (char *)"B", n, &mm, &work[l], &work[*n - 1 + l], &z__[l - * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } + if (icompz > 0) { + mm = m - l + 1; + zlasr_((char *)"R", (char *)"V", (char *)"B", n, &mm, &work[l], &work[*n - 1 + l], &z__[l + * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } - d__[l] -= p; - e[l] = g; - goto L40; + d__[l] -= p; + e[l] = g; + goto L40; /* Eigenvalue found. */ L80: - d__[l] = p; + d__[l] = p; - ++l; - if (l <= lend) { - goto L40; - } - goto L140; + ++l; + if (l <= lend) { + goto L40; + } + goto L140; } else { @@ -508,121 +508,121 @@ L80: /* Look for small superdiagonal element. */ L90: - if (l != lend) { - lendp1 = lend + 1; - i__1 = lendp1; - for (m = l; m >= i__1; --m) { + if (l != lend) { + lendp1 = lend + 1; + i__1 = lendp1; + for (m = l; m >= i__1; --m) { /* Computing 2nd power */ - d__2 = (d__1 = e[m - 1], abs(d__1)); - tst = d__2 * d__2; - if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m - - 1], abs(d__2)) + safmin) { - goto L110; - } + d__2 = (d__1 = e[m - 1], abs(d__1)); + tst = d__2 * d__2; + if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m + - 1], abs(d__2)) + safmin) { + goto L110; + } /* L100: */ - } - } + } + } - m = lend; + m = lend; L110: - if (m > lend) { - e[m - 1] = 0.; - } - p = d__[l]; - if (m == l) { - goto L130; - } + if (m > lend) { + e[m - 1] = 0.; + } + p = d__[l]; + if (m == l) { + goto L130; + } /* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ /* to compute its eigensystem. */ - if (m == l - 1) { - if (icompz > 0) { - dlaev2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s) - ; - work[m] = c__; - work[*n - 1 + m] = s; - zlasr_((char *)"R", (char *)"V", (char *)"F", n, &c__2, &work[m], &work[*n - 1 + m], & - z__[(l - 1) * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, - (ftnlen)1); - } else { - dlae2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2); - } - d__[l - 1] = rt1; - d__[l] = rt2; - e[l - 1] = 0.; - l += -2; - if (l >= lend) { - goto L90; - } - goto L140; - } + if (m == l - 1) { + if (icompz > 0) { + dlaev2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s) + ; + work[m] = c__; + work[*n - 1 + m] = s; + zlasr_((char *)"R", (char *)"V", (char *)"F", n, &c__2, &work[m], &work[*n - 1 + m], & + z__[(l - 1) * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, + (ftnlen)1); + } else { + dlae2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2); + } + d__[l - 1] = rt1; + d__[l] = rt2; + e[l - 1] = 0.; + l += -2; + if (l >= lend) { + goto L90; + } + goto L140; + } - if (jtot == nmaxit) { - goto L140; - } - ++jtot; + if (jtot == nmaxit) { + goto L140; + } + ++jtot; /* Form shift. */ - g = (d__[l - 1] - p) / (e[l - 1] * 2.); - r__ = dlapy2_(&g, &c_b41); - g = d__[m] - p + e[l - 1] / (g + d_sign(&r__, &g)); + g = (d__[l - 1] - p) / (e[l - 1] * 2.); + r__ = dlapy2_(&g, &c_b41); + g = d__[m] - p + e[l - 1] / (g + d_sign(&r__, &g)); - s = 1.; - c__ = 1.; - p = 0.; + s = 1.; + c__ = 1.; + p = 0.; /* Inner loop */ - lm1 = l - 1; - i__1 = lm1; - for (i__ = m; i__ <= i__1; ++i__) { - f = s * e[i__]; - b = c__ * e[i__]; - dlartg_(&g, &f, &c__, &s, &r__); - if (i__ != m) { - e[i__ - 1] = r__; - } - g = d__[i__] - p; - r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b; - p = s * r__; - d__[i__] = g + p; - g = c__ * r__ - b; + lm1 = l - 1; + i__1 = lm1; + for (i__ = m; i__ <= i__1; ++i__) { + f = s * e[i__]; + b = c__ * e[i__]; + dlartg_(&g, &f, &c__, &s, &r__); + if (i__ != m) { + e[i__ - 1] = r__; + } + g = d__[i__] - p; + r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b; + p = s * r__; + d__[i__] = g + p; + g = c__ * r__ - b; /* If eigenvectors are desired, then save rotations. */ - if (icompz > 0) { - work[i__] = c__; - work[*n - 1 + i__] = s; - } + if (icompz > 0) { + work[i__] = c__; + work[*n - 1 + i__] = s; + } /* L120: */ - } + } /* If eigenvectors are desired, then apply saved rotations. */ - if (icompz > 0) { - mm = l - m + 1; - zlasr_((char *)"R", (char *)"V", (char *)"F", n, &mm, &work[m], &work[*n - 1 + m], &z__[m - * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); - } + if (icompz > 0) { + mm = l - m + 1; + zlasr_((char *)"R", (char *)"V", (char *)"F", n, &mm, &work[m], &work[*n - 1 + m], &z__[m + * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } - d__[l] -= p; - e[lm1] = g; - goto L90; + d__[l] -= p; + e[lm1] = g; + goto L90; /* Eigenvalue found. */ L130: - d__[l] = p; + d__[l] = p; - --l; - if (l >= lend) { - goto L90; - } - goto L140; + --l; + if (l >= lend) { + goto L90; + } + goto L140; } @@ -630,33 +630,33 @@ L130: L140: if (iscale == 1) { - i__1 = lendsv - lsv + 1; - dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], - n, info, (ftnlen)1); - i__1 = lendsv - lsv; - dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n, - info, (ftnlen)1); + i__1 = lendsv - lsv + 1; + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], + n, info, (ftnlen)1); + i__1 = lendsv - lsv; + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n, + info, (ftnlen)1); } else if (iscale == 2) { - i__1 = lendsv - lsv + 1; - dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], - n, info, (ftnlen)1); - i__1 = lendsv - lsv; - dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n, - info, (ftnlen)1); + i__1 = lendsv - lsv + 1; + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], + n, info, (ftnlen)1); + i__1 = lendsv - lsv; + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n, + info, (ftnlen)1); } /* Check for no convergence to an eigenvalue after a total */ /* of N*MAXIT iterations. */ if (jtot == nmaxit) { - i__1 = *n - 1; - for (i__ = 1; i__ <= i__1; ++i__) { - if (e[i__] != 0.) { - ++(*info); - } + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + if (e[i__] != 0.) { + ++(*info); + } /* L150: */ - } - return 0; + } + return 0; } goto L10; @@ -667,33 +667,33 @@ L160: /* Use Quick Sort */ - dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); + dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); } else { /* Use Selection Sort to minimize swaps of eigenvectors */ - i__1 = *n; - for (ii = 2; ii <= i__1; ++ii) { - i__ = ii - 1; - k = i__; - p = d__[i__]; - i__2 = *n; - for (j = ii; j <= i__2; ++j) { - if (d__[j] < p) { - k = j; - p = d__[j]; - } + i__1 = *n; + for (ii = 2; ii <= i__1; ++ii) { + i__ = ii - 1; + k = i__; + p = d__[i__]; + i__2 = *n; + for (j = ii; j <= i__2; ++j) { + if (d__[j] < p) { + k = j; + p = d__[j]; + } /* L170: */ - } - if (k != i__) { - d__[k] = d__[i__]; - d__[i__] = p; - zswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], - &c__1); - } + } + if (k != i__) { + d__[k] = d__[i__]; + d__[i__] = p; + zswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], + &c__1); + } /* L180: */ - } + } } return 0; @@ -702,5 +702,5 @@ L160: } /* zsteqr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zswap.cpp b/lib/linalg/zswap.cpp index d00bb044fd..ff04833b04 100644 --- a/lib/linalg/zswap.cpp +++ b/lib/linalg/zswap.cpp @@ -1,13 +1,13 @@ /* fortran/zswap.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -94,8 +94,8 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int zswap_(integer *n, doublecomplex *zx, integer *incx, - doublecomplex *zy, integer *incy) +/* Subroutine */ int zswap_(integer *n, doublecomplex *zx, integer *incx, + doublecomplex *zy, integer *incy) { /* System generated locals */ integer i__1, i__2, i__3; @@ -124,46 +124,46 @@ extern "C" { /* Function Body */ if (*n <= 0) { - return 0; + return 0; } if (*incx == 1 && *incy == 1) { /* code for both increments equal to 1 */ - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__; - ztemp.r = zx[i__2].r, ztemp.i = zx[i__2].i; - i__2 = i__; - i__3 = i__; - zx[i__2].r = zy[i__3].r, zx[i__2].i = zy[i__3].i; - i__2 = i__; - zy[i__2].r = ztemp.r, zy[i__2].i = ztemp.i; - } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__; + ztemp.r = zx[i__2].r, ztemp.i = zx[i__2].i; + i__2 = i__; + i__3 = i__; + zx[i__2].r = zy[i__3].r, zx[i__2].i = zy[i__3].i; + i__2 = i__; + zy[i__2].r = ztemp.r, zy[i__2].i = ztemp.i; + } } else { /* code for unequal increments or equal increments not equal */ /* to 1 */ - ix = 1; - iy = 1; - if (*incx < 0) { - ix = (-(*n) + 1) * *incx + 1; - } - if (*incy < 0) { - iy = (-(*n) + 1) * *incy + 1; - } - i__1 = *n; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = ix; - ztemp.r = zx[i__2].r, ztemp.i = zx[i__2].i; - i__2 = ix; - i__3 = iy; - zx[i__2].r = zy[i__3].r, zx[i__2].i = zy[i__3].i; - i__2 = iy; - zy[i__2].r = ztemp.r, zy[i__2].i = ztemp.i; - ix += *incx; - iy += *incy; - } + ix = 1; + iy = 1; + if (*incx < 0) { + ix = (-(*n) + 1) * *incx + 1; + } + if (*incy < 0) { + iy = (-(*n) + 1) * *incy + 1; + } + i__1 = *n; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ix; + ztemp.r = zx[i__2].r, ztemp.i = zx[i__2].i; + i__2 = ix; + i__3 = iy; + zx[i__2].r = zy[i__3].r, zx[i__2].i = zy[i__3].i; + i__2 = iy; + zy[i__2].r = ztemp.r, zy[i__2].i = ztemp.i; + ix += *incx; + iy += *incy; + } } return 0; @@ -172,5 +172,5 @@ extern "C" { } /* zswap_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/ztpmv.cpp b/lib/linalg/ztpmv.cpp index a29145d6bd..adb1db10f4 100644 --- a/lib/linalg/ztpmv.cpp +++ b/lib/linalg/ztpmv.cpp @@ -1,13 +1,13 @@ /* fortran/ztpmv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -155,9 +155,9 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int ztpmv_(char *uplo, char *trans, char *diag, integer *n, - doublecomplex *ap, doublecomplex *x, integer *incx, ftnlen uplo_len, - ftnlen trans_len, ftnlen diag_len) +/* Subroutine */ int ztpmv_(char *uplo, char *trans, char *diag, integer *n, + doublecomplex *ap, doublecomplex *x, integer *incx, ftnlen uplo_len, + ftnlen trans_len, ftnlen diag_len) { /* System generated locals */ integer i__1, i__2, i__3, i__4, i__5; @@ -205,29 +205,29 @@ extern "C" { /* Function Body */ info = 0; if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { - info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { - info = 2; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { - info = 3; + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 3; } else if (*n < 0) { - info = 4; + info = 4; } else if (*incx == 0) { - info = 7; + info = 7; } if (info != 0) { - xerbla_((char *)"ZTPMV ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"ZTPMV ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*n == 0) { - return 0; + return 0; } noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); @@ -237,9 +237,9 @@ extern "C" { /* will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { - kx = 1 - (*n - 1) * *incx; + kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { - kx = 1; + kx = 1; } /* Start the operations. In this version the elements of AP are */ @@ -249,383 +249,383 @@ extern "C" { /* Form x:= A*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - kk = 1; - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - if (x[i__2].r != 0. || x[i__2].i != 0.) { - i__2 = j; - temp.r = x[i__2].r, temp.i = x[i__2].i; - k = kk; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__; - i__4 = i__; - i__5 = k; - z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] - .i, z__2.i = temp.r * ap[i__5].i + temp.i - * ap[i__5].r; - z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + - z__2.i; - x[i__3].r = z__1.r, x[i__3].i = z__1.i; - ++k; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + kk = 1; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + k = kk; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = k; + z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] + .i, z__2.i = temp.r * ap[i__5].i + temp.i + * ap[i__5].r; + z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + + z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; + ++k; /* L10: */ - } - if (nounit) { - i__2 = j; - i__3 = j; - i__4 = kk + j - 1; - z__1.r = x[i__3].r * ap[i__4].r - x[i__3].i * ap[ - i__4].i, z__1.i = x[i__3].r * ap[i__4].i - + x[i__3].i * ap[i__4].r; - x[i__2].r = z__1.r, x[i__2].i = z__1.i; - } - } - kk += j; + } + if (nounit) { + i__2 = j; + i__3 = j; + i__4 = kk + j - 1; + z__1.r = x[i__3].r * ap[i__4].r - x[i__3].i * ap[ + i__4].i, z__1.i = x[i__3].r * ap[i__4].i + + x[i__3].i * ap[i__4].r; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + } + kk += j; /* L20: */ - } - } else { - jx = kx; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - if (x[i__2].r != 0. || x[i__2].i != 0.) { - i__2 = jx; - temp.r = x[i__2].r, temp.i = x[i__2].i; - ix = kx; - i__2 = kk + j - 2; - for (k = kk; k <= i__2; ++k) { - i__3 = ix; - i__4 = ix; - i__5 = k; - z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] - .i, z__2.i = temp.r * ap[i__5].i + temp.i - * ap[i__5].r; - z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + - z__2.i; - x[i__3].r = z__1.r, x[i__3].i = z__1.i; - ix += *incx; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = kx; + i__2 = kk + j - 2; + for (k = kk; k <= i__2; ++k) { + i__3 = ix; + i__4 = ix; + i__5 = k; + z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] + .i, z__2.i = temp.r * ap[i__5].i + temp.i + * ap[i__5].r; + z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + + z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; + ix += *incx; /* L30: */ - } - if (nounit) { - i__2 = jx; - i__3 = jx; - i__4 = kk + j - 1; - z__1.r = x[i__3].r * ap[i__4].r - x[i__3].i * ap[ - i__4].i, z__1.i = x[i__3].r * ap[i__4].i - + x[i__3].i * ap[i__4].r; - x[i__2].r = z__1.r, x[i__2].i = z__1.i; - } - } - jx += *incx; - kk += j; + } + if (nounit) { + i__2 = jx; + i__3 = jx; + i__4 = kk + j - 1; + z__1.r = x[i__3].r * ap[i__4].r - x[i__3].i * ap[ + i__4].i, z__1.i = x[i__3].r * ap[i__4].i + + x[i__3].i * ap[i__4].r; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + } + jx += *incx; + kk += j; /* L40: */ - } - } - } else { - kk = *n * (*n + 1) / 2; - if (*incx == 1) { - for (j = *n; j >= 1; --j) { - i__1 = j; - if (x[i__1].r != 0. || x[i__1].i != 0.) { - i__1 = j; - temp.r = x[i__1].r, temp.i = x[i__1].i; - k = kk; - i__1 = j + 1; - for (i__ = *n; i__ >= i__1; --i__) { - i__2 = i__; - i__3 = i__; - i__4 = k; - z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4] - .i, z__2.i = temp.r * ap[i__4].i + temp.i - * ap[i__4].r; - z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + - z__2.i; - x[i__2].r = z__1.r, x[i__2].i = z__1.i; - --k; + } + } + } else { + kk = *n * (*n + 1) / 2; + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + k = kk; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + i__2 = i__; + i__3 = i__; + i__4 = k; + z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4] + .i, z__2.i = temp.r * ap[i__4].i + temp.i + * ap[i__4].r; + z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + + z__2.i; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + --k; /* L50: */ - } - if (nounit) { - i__1 = j; - i__2 = j; - i__3 = kk - *n + j; - z__1.r = x[i__2].r * ap[i__3].r - x[i__2].i * ap[ - i__3].i, z__1.i = x[i__2].r * ap[i__3].i - + x[i__2].i * ap[i__3].r; - x[i__1].r = z__1.r, x[i__1].i = z__1.i; - } - } - kk -= *n - j + 1; + } + if (nounit) { + i__1 = j; + i__2 = j; + i__3 = kk - *n + j; + z__1.r = x[i__2].r * ap[i__3].r - x[i__2].i * ap[ + i__3].i, z__1.i = x[i__2].r * ap[i__3].i + + x[i__2].i * ap[i__3].r; + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + } + kk -= *n - j + 1; /* L60: */ - } - } else { - kx += (*n - 1) * *incx; - jx = kx; - for (j = *n; j >= 1; --j) { - i__1 = jx; - if (x[i__1].r != 0. || x[i__1].i != 0.) { - i__1 = jx; - temp.r = x[i__1].r, temp.i = x[i__1].i; - ix = kx; - i__1 = kk - (*n - (j + 1)); - for (k = kk; k >= i__1; --k) { - i__2 = ix; - i__3 = ix; - i__4 = k; - z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4] - .i, z__2.i = temp.r * ap[i__4].i + temp.i - * ap[i__4].r; - z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + - z__2.i; - x[i__2].r = z__1.r, x[i__2].i = z__1.i; - ix -= *incx; + } + } else { + kx += (*n - 1) * *incx; + jx = kx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = kx; + i__1 = kk - (*n - (j + 1)); + for (k = kk; k >= i__1; --k) { + i__2 = ix; + i__3 = ix; + i__4 = k; + z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4] + .i, z__2.i = temp.r * ap[i__4].i + temp.i + * ap[i__4].r; + z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + + z__2.i; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + ix -= *incx; /* L70: */ - } - if (nounit) { - i__1 = jx; - i__2 = jx; - i__3 = kk - *n + j; - z__1.r = x[i__2].r * ap[i__3].r - x[i__2].i * ap[ - i__3].i, z__1.i = x[i__2].r * ap[i__3].i - + x[i__2].i * ap[i__3].r; - x[i__1].r = z__1.r, x[i__1].i = z__1.i; - } - } - jx -= *incx; - kk -= *n - j + 1; + } + if (nounit) { + i__1 = jx; + i__2 = jx; + i__3 = kk - *n + j; + z__1.r = x[i__2].r * ap[i__3].r - x[i__2].i * ap[ + i__3].i, z__1.i = x[i__2].r * ap[i__3].i + + x[i__2].i * ap[i__3].r; + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + } + jx -= *incx; + kk -= *n - j + 1; /* L80: */ - } - } - } + } + } + } } else { /* Form x := A**T*x or x := A**H*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - kk = *n * (*n + 1) / 2; - if (*incx == 1) { - for (j = *n; j >= 1; --j) { - i__1 = j; - temp.r = x[i__1].r, temp.i = x[i__1].i; - k = kk - 1; - if (noconj) { - if (nounit) { - i__1 = kk; - z__1.r = temp.r * ap[i__1].r - temp.i * ap[i__1] - .i, z__1.i = temp.r * ap[i__1].i + temp.i - * ap[i__1].r; - temp.r = z__1.r, temp.i = z__1.i; - } - for (i__ = j - 1; i__ >= 1; --i__) { - i__1 = k; - i__2 = i__; - z__2.r = ap[i__1].r * x[i__2].r - ap[i__1].i * x[ - i__2].i, z__2.i = ap[i__1].r * x[i__2].i - + ap[i__1].i * x[i__2].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - --k; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + kk = *n * (*n + 1) / 2; + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + k = kk - 1; + if (noconj) { + if (nounit) { + i__1 = kk; + z__1.r = temp.r * ap[i__1].r - temp.i * ap[i__1] + .i, z__1.i = temp.r * ap[i__1].i + temp.i + * ap[i__1].r; + temp.r = z__1.r, temp.i = z__1.i; + } + for (i__ = j - 1; i__ >= 1; --i__) { + i__1 = k; + i__2 = i__; + z__2.r = ap[i__1].r * x[i__2].r - ap[i__1].i * x[ + i__2].i, z__2.i = ap[i__1].r * x[i__2].i + + ap[i__1].i * x[i__2].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + --k; /* L90: */ - } - } else { - if (nounit) { - d_cnjg(&z__2, &ap[kk]); - z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - for (i__ = j - 1; i__ >= 1; --i__) { - d_cnjg(&z__3, &ap[k]); - i__1 = i__; - z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, - z__2.i = z__3.r * x[i__1].i + z__3.i * x[ - i__1].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - --k; + } + } else { + if (nounit) { + d_cnjg(&z__2, &ap[kk]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + for (i__ = j - 1; i__ >= 1; --i__) { + d_cnjg(&z__3, &ap[k]); + i__1 = i__; + z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, + z__2.i = z__3.r * x[i__1].i + z__3.i * x[ + i__1].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + --k; /* L100: */ - } - } - i__1 = j; - x[i__1].r = temp.r, x[i__1].i = temp.i; - kk -= j; + } + } + i__1 = j; + x[i__1].r = temp.r, x[i__1].i = temp.i; + kk -= j; /* L110: */ - } - } else { - jx = kx + (*n - 1) * *incx; - for (j = *n; j >= 1; --j) { - i__1 = jx; - temp.r = x[i__1].r, temp.i = x[i__1].i; - ix = jx; - if (noconj) { - if (nounit) { - i__1 = kk; - z__1.r = temp.r * ap[i__1].r - temp.i * ap[i__1] - .i, z__1.i = temp.r * ap[i__1].i + temp.i - * ap[i__1].r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__1 = kk - j + 1; - for (k = kk - 1; k >= i__1; --k) { - ix -= *incx; - i__2 = k; - i__3 = ix; - z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[ - i__3].i, z__2.i = ap[i__2].r * x[i__3].i - + ap[i__2].i * x[i__3].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + jx = kx + (*n - 1) * *incx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = jx; + if (noconj) { + if (nounit) { + i__1 = kk; + z__1.r = temp.r * ap[i__1].r - temp.i * ap[i__1] + .i, z__1.i = temp.r * ap[i__1].i + temp.i + * ap[i__1].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__1 = kk - j + 1; + for (k = kk - 1; k >= i__1; --k) { + ix -= *incx; + i__2 = k; + i__3 = ix; + z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[ + i__3].i, z__2.i = ap[i__2].r * x[i__3].i + + ap[i__2].i * x[i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L120: */ - } - } else { - if (nounit) { - d_cnjg(&z__2, &ap[kk]); - z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__1 = kk - j + 1; - for (k = kk - 1; k >= i__1; --k) { - ix -= *incx; - d_cnjg(&z__3, &ap[k]); - i__2 = ix; - z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, - z__2.i = z__3.r * x[i__2].i + z__3.i * x[ - i__2].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + if (nounit) { + d_cnjg(&z__2, &ap[kk]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__1 = kk - j + 1; + for (k = kk - 1; k >= i__1; --k) { + ix -= *incx; + d_cnjg(&z__3, &ap[k]); + i__2 = ix; + z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, + z__2.i = z__3.r * x[i__2].i + z__3.i * x[ + i__2].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L130: */ - } - } - i__1 = jx; - x[i__1].r = temp.r, x[i__1].i = temp.i; - jx -= *incx; - kk -= j; + } + } + i__1 = jx; + x[i__1].r = temp.r, x[i__1].i = temp.i; + jx -= *incx; + kk -= j; /* L140: */ - } - } - } else { - kk = 1; - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - temp.r = x[i__2].r, temp.i = x[i__2].i; - k = kk + 1; - if (noconj) { - if (nounit) { - i__2 = kk; - z__1.r = temp.r * ap[i__2].r - temp.i * ap[i__2] - .i, z__1.i = temp.r * ap[i__2].i + temp.i - * ap[i__2].r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - i__3 = k; - i__4 = i__; - z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ - i__4].i, z__2.i = ap[i__3].r * x[i__4].i - + ap[i__3].i * x[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - ++k; + } + } + } else { + kk = 1; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + k = kk + 1; + if (noconj) { + if (nounit) { + i__2 = kk; + z__1.r = temp.r * ap[i__2].r - temp.i * ap[i__2] + .i, z__1.i = temp.r * ap[i__2].i + temp.i + * ap[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = k; + i__4 = i__; + z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ + i__4].i, z__2.i = ap[i__3].r * x[i__4].i + + ap[i__3].i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ++k; /* L150: */ - } - } else { - if (nounit) { - d_cnjg(&z__2, &ap[kk]); - z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - d_cnjg(&z__3, &ap[k]); - i__3 = i__; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[ - i__3].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - ++k; + } + } else { + if (nounit) { + d_cnjg(&z__2, &ap[kk]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + d_cnjg(&z__3, &ap[k]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[ + i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ++k; /* L160: */ - } - } - i__2 = j; - x[i__2].r = temp.r, x[i__2].i = temp.i; - kk += *n - j + 1; + } + } + i__2 = j; + x[i__2].r = temp.r, x[i__2].i = temp.i; + kk += *n - j + 1; /* L170: */ - } - } else { - jx = kx; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - temp.r = x[i__2].r, temp.i = x[i__2].i; - ix = jx; - if (noconj) { - if (nounit) { - i__2 = kk; - z__1.r = temp.r * ap[i__2].r - temp.i * ap[i__2] - .i, z__1.i = temp.r * ap[i__2].i + temp.i - * ap[i__2].r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__2 = kk + *n - j; - for (k = kk + 1; k <= i__2; ++k) { - ix += *incx; - i__3 = k; - i__4 = ix; - z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ - i__4].i, z__2.i = ap[i__3].r * x[i__4].i - + ap[i__3].i * x[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = jx; + if (noconj) { + if (nounit) { + i__2 = kk; + z__1.r = temp.r * ap[i__2].r - temp.i * ap[i__2] + .i, z__1.i = temp.r * ap[i__2].i + temp.i + * ap[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = kk + *n - j; + for (k = kk + 1; k <= i__2; ++k) { + ix += *incx; + i__3 = k; + i__4 = ix; + z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ + i__4].i, z__2.i = ap[i__3].r * x[i__4].i + + ap[i__3].i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L180: */ - } - } else { - if (nounit) { - d_cnjg(&z__2, &ap[kk]); - z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__2 = kk + *n - j; - for (k = kk + 1; k <= i__2; ++k) { - ix += *incx; - d_cnjg(&z__3, &ap[k]); - i__3 = ix; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[ - i__3].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + if (nounit) { + d_cnjg(&z__2, &ap[kk]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = kk + *n - j; + for (k = kk + 1; k <= i__2; ++k) { + ix += *incx; + d_cnjg(&z__3, &ap[k]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[ + i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L190: */ - } - } - i__2 = jx; - x[i__2].r = temp.r, x[i__2].i = temp.i; - jx += *incx; - kk += *n - j + 1; + } + } + i__2 = jx; + x[i__2].r = temp.r, x[i__2].i = temp.i; + jx += *incx; + kk += *n - j + 1; /* L200: */ - } - } - } + } + } + } } return 0; @@ -635,5 +635,5 @@ extern "C" { } /* ztpmv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/ztpsv.cpp b/lib/linalg/ztpsv.cpp index 7e7e64d721..c3c564acd2 100644 --- a/lib/linalg/ztpsv.cpp +++ b/lib/linalg/ztpsv.cpp @@ -1,13 +1,13 @@ /* fortran/ztpsv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -157,9 +157,9 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int ztpsv_(char *uplo, char *trans, char *diag, integer *n, - doublecomplex *ap, doublecomplex *x, integer *incx, ftnlen uplo_len, - ftnlen trans_len, ftnlen diag_len) +/* Subroutine */ int ztpsv_(char *uplo, char *trans, char *diag, integer *n, + doublecomplex *ap, doublecomplex *x, integer *incx, ftnlen uplo_len, + ftnlen trans_len, ftnlen diag_len) { /* System generated locals */ integer i__1, i__2, i__3, i__4, i__5; @@ -167,7 +167,7 @@ extern "C" { /* Builtin functions */ void z_div(doublecomplex *, doublecomplex *, doublecomplex *), d_cnjg( - doublecomplex *, doublecomplex *); + doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, k, kk, ix, jx, kx, info; @@ -208,29 +208,29 @@ extern "C" { /* Function Body */ info = 0; if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { - info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { - info = 2; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { - info = 3; + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 3; } else if (*n < 0) { - info = 4; + info = 4; } else if (*incx == 0) { - info = 7; + info = 7; } if (info != 0) { - xerbla_((char *)"ZTPSV ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"ZTPSV ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*n == 0) { - return 0; + return 0; } noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); @@ -240,9 +240,9 @@ extern "C" { /* will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { - kx = 1 - (*n - 1) * *incx; + kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { - kx = 1; + kx = 1; } /* Start the operations. In this version the elements of AP are */ @@ -252,348 +252,348 @@ extern "C" { /* Form x := inv( A )*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - kk = *n * (*n + 1) / 2; - if (*incx == 1) { - for (j = *n; j >= 1; --j) { - i__1 = j; - if (x[i__1].r != 0. || x[i__1].i != 0.) { - if (nounit) { - i__1 = j; - z_div(&z__1, &x[j], &ap[kk]); - x[i__1].r = z__1.r, x[i__1].i = z__1.i; - } - i__1 = j; - temp.r = x[i__1].r, temp.i = x[i__1].i; - k = kk - 1; - for (i__ = j - 1; i__ >= 1; --i__) { - i__1 = i__; - i__2 = i__; - i__3 = k; - z__2.r = temp.r * ap[i__3].r - temp.i * ap[i__3] - .i, z__2.i = temp.r * ap[i__3].i + temp.i - * ap[i__3].r; - z__1.r = x[i__2].r - z__2.r, z__1.i = x[i__2].i - - z__2.i; - x[i__1].r = z__1.r, x[i__1].i = z__1.i; - --k; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + kk = *n * (*n + 1) / 2; + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + if (nounit) { + i__1 = j; + z_div(&z__1, &x[j], &ap[kk]); + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + k = kk - 1; + for (i__ = j - 1; i__ >= 1; --i__) { + i__1 = i__; + i__2 = i__; + i__3 = k; + z__2.r = temp.r * ap[i__3].r - temp.i * ap[i__3] + .i, z__2.i = temp.r * ap[i__3].i + temp.i + * ap[i__3].r; + z__1.r = x[i__2].r - z__2.r, z__1.i = x[i__2].i - + z__2.i; + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + --k; /* L10: */ - } - } - kk -= j; + } + } + kk -= j; /* L20: */ - } - } else { - jx = kx + (*n - 1) * *incx; - for (j = *n; j >= 1; --j) { - i__1 = jx; - if (x[i__1].r != 0. || x[i__1].i != 0.) { - if (nounit) { - i__1 = jx; - z_div(&z__1, &x[jx], &ap[kk]); - x[i__1].r = z__1.r, x[i__1].i = z__1.i; - } - i__1 = jx; - temp.r = x[i__1].r, temp.i = x[i__1].i; - ix = jx; - i__1 = kk - j + 1; - for (k = kk - 1; k >= i__1; --k) { - ix -= *incx; - i__2 = ix; - i__3 = ix; - i__4 = k; - z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4] - .i, z__2.i = temp.r * ap[i__4].i + temp.i - * ap[i__4].r; - z__1.r = x[i__3].r - z__2.r, z__1.i = x[i__3].i - - z__2.i; - x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + } else { + jx = kx + (*n - 1) * *incx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + if (nounit) { + i__1 = jx; + z_div(&z__1, &x[jx], &ap[kk]); + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = jx; + i__1 = kk - j + 1; + for (k = kk - 1; k >= i__1; --k) { + ix -= *incx; + i__2 = ix; + i__3 = ix; + i__4 = k; + z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4] + .i, z__2.i = temp.r * ap[i__4].i + temp.i + * ap[i__4].r; + z__1.r = x[i__3].r - z__2.r, z__1.i = x[i__3].i - + z__2.i; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; /* L30: */ - } - } - jx -= *incx; - kk -= j; + } + } + jx -= *incx; + kk -= j; /* L40: */ - } - } - } else { - kk = 1; - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - if (x[i__2].r != 0. || x[i__2].i != 0.) { - if (nounit) { - i__2 = j; - z_div(&z__1, &x[j], &ap[kk]); - x[i__2].r = z__1.r, x[i__2].i = z__1.i; - } - i__2 = j; - temp.r = x[i__2].r, temp.i = x[i__2].i; - k = kk + 1; - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - i__3 = i__; - i__4 = i__; - i__5 = k; - z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] - .i, z__2.i = temp.r * ap[i__5].i + temp.i - * ap[i__5].r; - z__1.r = x[i__4].r - z__2.r, z__1.i = x[i__4].i - - z__2.i; - x[i__3].r = z__1.r, x[i__3].i = z__1.i; - ++k; + } + } + } else { + kk = 1; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + if (nounit) { + i__2 = j; + z_div(&z__1, &x[j], &ap[kk]); + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + k = kk + 1; + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = k; + z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] + .i, z__2.i = temp.r * ap[i__5].i + temp.i + * ap[i__5].r; + z__1.r = x[i__4].r - z__2.r, z__1.i = x[i__4].i - + z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; + ++k; /* L50: */ - } - } - kk += *n - j + 1; + } + } + kk += *n - j + 1; /* L60: */ - } - } else { - jx = kx; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - if (x[i__2].r != 0. || x[i__2].i != 0.) { - if (nounit) { - i__2 = jx; - z_div(&z__1, &x[jx], &ap[kk]); - x[i__2].r = z__1.r, x[i__2].i = z__1.i; - } - i__2 = jx; - temp.r = x[i__2].r, temp.i = x[i__2].i; - ix = jx; - i__2 = kk + *n - j; - for (k = kk + 1; k <= i__2; ++k) { - ix += *incx; - i__3 = ix; - i__4 = ix; - i__5 = k; - z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] - .i, z__2.i = temp.r * ap[i__5].i + temp.i - * ap[i__5].r; - z__1.r = x[i__4].r - z__2.r, z__1.i = x[i__4].i - - z__2.i; - x[i__3].r = z__1.r, x[i__3].i = z__1.i; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + if (nounit) { + i__2 = jx; + z_div(&z__1, &x[jx], &ap[kk]); + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = jx; + i__2 = kk + *n - j; + for (k = kk + 1; k <= i__2; ++k) { + ix += *incx; + i__3 = ix; + i__4 = ix; + i__5 = k; + z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] + .i, z__2.i = temp.r * ap[i__5].i + temp.i + * ap[i__5].r; + z__1.r = x[i__4].r - z__2.r, z__1.i = x[i__4].i - + z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; /* L70: */ - } - } - jx += *incx; - kk += *n - j + 1; + } + } + jx += *incx; + kk += *n - j + 1; /* L80: */ - } - } - } + } + } + } } else { /* Form x := inv( A**T )*x or x := inv( A**H )*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - kk = 1; - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - temp.r = x[i__2].r, temp.i = x[i__2].i; - k = kk; - if (noconj) { - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = k; - i__4 = i__; - z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ - i__4].i, z__2.i = ap[i__3].r * x[i__4].i - + ap[i__3].i * x[i__4].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - ++k; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + kk = 1; + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + k = kk; + if (noconj) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = k; + i__4 = i__; + z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ + i__4].i, z__2.i = ap[i__3].r * x[i__4].i + + ap[i__3].i * x[i__4].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ++k; /* L90: */ - } - if (nounit) { - z_div(&z__1, &temp, &ap[kk + j - 1]); - temp.r = z__1.r, temp.i = z__1.i; - } - } else { - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - d_cnjg(&z__3, &ap[k]); - i__3 = i__; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[ - i__3].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - ++k; + } + if (nounit) { + z_div(&z__1, &temp, &ap[kk + j - 1]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + d_cnjg(&z__3, &ap[k]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[ + i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ++k; /* L100: */ - } - if (nounit) { - d_cnjg(&z__2, &ap[kk + j - 1]); - z_div(&z__1, &temp, &z__2); - temp.r = z__1.r, temp.i = z__1.i; - } - } - i__2 = j; - x[i__2].r = temp.r, x[i__2].i = temp.i; - kk += j; + } + if (nounit) { + d_cnjg(&z__2, &ap[kk + j - 1]); + z_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__2 = j; + x[i__2].r = temp.r, x[i__2].i = temp.i; + kk += j; /* L110: */ - } - } else { - jx = kx; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - temp.r = x[i__2].r, temp.i = x[i__2].i; - ix = kx; - if (noconj) { - i__2 = kk + j - 2; - for (k = kk; k <= i__2; ++k) { - i__3 = k; - i__4 = ix; - z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ - i__4].i, z__2.i = ap[i__3].r * x[i__4].i - + ap[i__3].i * x[i__4].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - ix += *incx; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = kx; + if (noconj) { + i__2 = kk + j - 2; + for (k = kk; k <= i__2; ++k) { + i__3 = k; + i__4 = ix; + z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ + i__4].i, z__2.i = ap[i__3].r * x[i__4].i + + ap[i__3].i * x[i__4].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix += *incx; /* L120: */ - } - if (nounit) { - z_div(&z__1, &temp, &ap[kk + j - 1]); - temp.r = z__1.r, temp.i = z__1.i; - } - } else { - i__2 = kk + j - 2; - for (k = kk; k <= i__2; ++k) { - d_cnjg(&z__3, &ap[k]); - i__3 = ix; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[ - i__3].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - ix += *incx; + } + if (nounit) { + z_div(&z__1, &temp, &ap[kk + j - 1]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__2 = kk + j - 2; + for (k = kk; k <= i__2; ++k) { + d_cnjg(&z__3, &ap[k]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[ + i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix += *incx; /* L130: */ - } - if (nounit) { - d_cnjg(&z__2, &ap[kk + j - 1]); - z_div(&z__1, &temp, &z__2); - temp.r = z__1.r, temp.i = z__1.i; - } - } - i__2 = jx; - x[i__2].r = temp.r, x[i__2].i = temp.i; - jx += *incx; - kk += j; + } + if (nounit) { + d_cnjg(&z__2, &ap[kk + j - 1]); + z_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__2 = jx; + x[i__2].r = temp.r, x[i__2].i = temp.i; + jx += *incx; + kk += j; /* L140: */ - } - } - } else { - kk = *n * (*n + 1) / 2; - if (*incx == 1) { - for (j = *n; j >= 1; --j) { - i__1 = j; - temp.r = x[i__1].r, temp.i = x[i__1].i; - k = kk; - if (noconj) { - i__1 = j + 1; - for (i__ = *n; i__ >= i__1; --i__) { - i__2 = k; - i__3 = i__; - z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[ - i__3].i, z__2.i = ap[i__2].r * x[i__3].i - + ap[i__2].i * x[i__3].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - --k; + } + } + } else { + kk = *n * (*n + 1) / 2; + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + k = kk; + if (noconj) { + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + i__2 = k; + i__3 = i__; + z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[ + i__3].i, z__2.i = ap[i__2].r * x[i__3].i + + ap[i__2].i * x[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + --k; /* L150: */ - } - if (nounit) { - z_div(&z__1, &temp, &ap[kk - *n + j]); - temp.r = z__1.r, temp.i = z__1.i; - } - } else { - i__1 = j + 1; - for (i__ = *n; i__ >= i__1; --i__) { - d_cnjg(&z__3, &ap[k]); - i__2 = i__; - z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, - z__2.i = z__3.r * x[i__2].i + z__3.i * x[ - i__2].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - --k; + } + if (nounit) { + z_div(&z__1, &temp, &ap[kk - *n + j]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + d_cnjg(&z__3, &ap[k]); + i__2 = i__; + z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, + z__2.i = z__3.r * x[i__2].i + z__3.i * x[ + i__2].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + --k; /* L160: */ - } - if (nounit) { - d_cnjg(&z__2, &ap[kk - *n + j]); - z_div(&z__1, &temp, &z__2); - temp.r = z__1.r, temp.i = z__1.i; - } - } - i__1 = j; - x[i__1].r = temp.r, x[i__1].i = temp.i; - kk -= *n - j + 1; + } + if (nounit) { + d_cnjg(&z__2, &ap[kk - *n + j]); + z_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__1 = j; + x[i__1].r = temp.r, x[i__1].i = temp.i; + kk -= *n - j + 1; /* L170: */ - } - } else { - kx += (*n - 1) * *incx; - jx = kx; - for (j = *n; j >= 1; --j) { - i__1 = jx; - temp.r = x[i__1].r, temp.i = x[i__1].i; - ix = kx; - if (noconj) { - i__1 = kk - (*n - (j + 1)); - for (k = kk; k >= i__1; --k) { - i__2 = k; - i__3 = ix; - z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[ - i__3].i, z__2.i = ap[i__2].r * x[i__3].i - + ap[i__2].i * x[i__3].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - ix -= *incx; + } + } else { + kx += (*n - 1) * *incx; + jx = kx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = kx; + if (noconj) { + i__1 = kk - (*n - (j + 1)); + for (k = kk; k >= i__1; --k) { + i__2 = k; + i__3 = ix; + z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[ + i__3].i, z__2.i = ap[i__2].r * x[i__3].i + + ap[i__2].i * x[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix -= *incx; /* L180: */ - } - if (nounit) { - z_div(&z__1, &temp, &ap[kk - *n + j]); - temp.r = z__1.r, temp.i = z__1.i; - } - } else { - i__1 = kk - (*n - (j + 1)); - for (k = kk; k >= i__1; --k) { - d_cnjg(&z__3, &ap[k]); - i__2 = ix; - z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, - z__2.i = z__3.r * x[i__2].i + z__3.i * x[ - i__2].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; - ix -= *incx; + } + if (nounit) { + z_div(&z__1, &temp, &ap[kk - *n + j]); + temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__1 = kk - (*n - (j + 1)); + for (k = kk; k >= i__1; --k) { + d_cnjg(&z__3, &ap[k]); + i__2 = ix; + z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, + z__2.i = z__3.r * x[i__2].i + z__3.i * x[ + i__2].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; + ix -= *incx; /* L190: */ - } - if (nounit) { - d_cnjg(&z__2, &ap[kk - *n + j]); - z_div(&z__1, &temp, &z__2); - temp.r = z__1.r, temp.i = z__1.i; - } - } - i__1 = jx; - x[i__1].r = temp.r, x[i__1].i = temp.i; - jx -= *incx; - kk -= *n - j + 1; + } + if (nounit) { + d_cnjg(&z__2, &ap[kk - *n + j]); + z_div(&z__1, &temp, &z__2); + temp.r = z__1.r, temp.i = z__1.i; + } + } + i__1 = jx; + x[i__1].r = temp.r, x[i__1].i = temp.i; + jx -= *incx; + kk -= *n - j + 1; /* L200: */ - } - } - } + } + } + } } return 0; @@ -603,5 +603,5 @@ extern "C" { } /* ztpsv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/ztptri.cpp b/lib/linalg/ztptri.cpp index c781cb964f..eb5c2988e3 100644 --- a/lib/linalg/ztptri.cpp +++ b/lib/linalg/ztptri.cpp @@ -1,13 +1,13 @@ /* fortran/ztptri.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -138,8 +138,8 @@ f"> */ /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int ztptri_(char *uplo, char *diag, integer *n, - doublecomplex *ap, integer *info, ftnlen uplo_len, ftnlen diag_len) +/* Subroutine */ int ztptri_(char *uplo, char *diag, integer *n, + doublecomplex *ap, integer *info, ftnlen uplo_len, ftnlen diag_len) { /* System generated locals */ integer i__1, i__2; @@ -152,12 +152,12 @@ f"> */ integer j, jc, jj; doublecomplex ajj; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int zscal_(integer *, doublecomplex *, - doublecomplex *, integer *); + extern /* Subroutine */ int zscal_(integer *, doublecomplex *, + doublecomplex *, integer *); logical upper; - extern /* Subroutine */ int ztpmv_(char *, char *, char *, integer *, - doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); + extern /* Subroutine */ int ztpmv_(char *, char *, char *, integer *, + doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); integer jclast; logical nounit; @@ -193,108 +193,108 @@ f"> */ upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! nounit && ! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*n < 0) { - *info = -3; + *info = -3; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZTPTRI", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZTPTRI", &i__1, (ftnlen)6); + return 0; } /* Check for singularity if non-unit. */ if (nounit) { - if (upper) { - jj = 0; - i__1 = *n; - for (*info = 1; *info <= i__1; ++(*info)) { - jj += *info; - i__2 = jj; - if (ap[i__2].r == 0. && ap[i__2].i == 0.) { - return 0; - } + if (upper) { + jj = 0; + i__1 = *n; + for (*info = 1; *info <= i__1; ++(*info)) { + jj += *info; + i__2 = jj; + if (ap[i__2].r == 0. && ap[i__2].i == 0.) { + return 0; + } /* L10: */ - } - } else { - jj = 1; - i__1 = *n; - for (*info = 1; *info <= i__1; ++(*info)) { - i__2 = jj; - if (ap[i__2].r == 0. && ap[i__2].i == 0.) { - return 0; - } - jj = jj + *n - *info + 1; + } + } else { + jj = 1; + i__1 = *n; + for (*info = 1; *info <= i__1; ++(*info)) { + i__2 = jj; + if (ap[i__2].r == 0. && ap[i__2].i == 0.) { + return 0; + } + jj = jj + *n - *info + 1; /* L20: */ - } - } - *info = 0; + } + } + *info = 0; } if (upper) { /* Compute inverse of upper triangular matrix. */ - jc = 1; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - if (nounit) { - i__2 = jc + j - 1; - z_div(&z__1, &c_b1, &ap[jc + j - 1]); - ap[i__2].r = z__1.r, ap[i__2].i = z__1.i; - i__2 = jc + j - 1; - z__1.r = -ap[i__2].r, z__1.i = -ap[i__2].i; - ajj.r = z__1.r, ajj.i = z__1.i; - } else { - z__1.r = -1., z__1.i = -0.; - ajj.r = z__1.r, ajj.i = z__1.i; - } + jc = 1; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + if (nounit) { + i__2 = jc + j - 1; + z_div(&z__1, &c_b1, &ap[jc + j - 1]); + ap[i__2].r = z__1.r, ap[i__2].i = z__1.i; + i__2 = jc + j - 1; + z__1.r = -ap[i__2].r, z__1.i = -ap[i__2].i; + ajj.r = z__1.r, ajj.i = z__1.i; + } else { + z__1.r = -1., z__1.i = -0.; + ajj.r = z__1.r, ajj.i = z__1.i; + } /* Compute elements 1:j-1 of j-th column. */ - i__2 = j - 1; - ztpmv_((char *)"Upper", (char *)"No transpose", diag, &i__2, &ap[1], &ap[jc], & - c__1, (ftnlen)5, (ftnlen)12, (ftnlen)1); - i__2 = j - 1; - zscal_(&i__2, &ajj, &ap[jc], &c__1); - jc += j; + i__2 = j - 1; + ztpmv_((char *)"Upper", (char *)"No transpose", diag, &i__2, &ap[1], &ap[jc], & + c__1, (ftnlen)5, (ftnlen)12, (ftnlen)1); + i__2 = j - 1; + zscal_(&i__2, &ajj, &ap[jc], &c__1); + jc += j; /* L30: */ - } + } } else { /* Compute inverse of lower triangular matrix. */ - jc = *n * (*n + 1) / 2; - for (j = *n; j >= 1; --j) { - if (nounit) { - i__1 = jc; - z_div(&z__1, &c_b1, &ap[jc]); - ap[i__1].r = z__1.r, ap[i__1].i = z__1.i; - i__1 = jc; - z__1.r = -ap[i__1].r, z__1.i = -ap[i__1].i; - ajj.r = z__1.r, ajj.i = z__1.i; - } else { - z__1.r = -1., z__1.i = -0.; - ajj.r = z__1.r, ajj.i = z__1.i; - } - if (j < *n) { + jc = *n * (*n + 1) / 2; + for (j = *n; j >= 1; --j) { + if (nounit) { + i__1 = jc; + z_div(&z__1, &c_b1, &ap[jc]); + ap[i__1].r = z__1.r, ap[i__1].i = z__1.i; + i__1 = jc; + z__1.r = -ap[i__1].r, z__1.i = -ap[i__1].i; + ajj.r = z__1.r, ajj.i = z__1.i; + } else { + z__1.r = -1., z__1.i = -0.; + ajj.r = z__1.r, ajj.i = z__1.i; + } + if (j < *n) { /* Compute elements j+1:n of j-th column. */ - i__1 = *n - j; - ztpmv_((char *)"Lower", (char *)"No transpose", diag, &i__1, &ap[jclast], &ap[ - jc + 1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)1); - i__1 = *n - j; - zscal_(&i__1, &ajj, &ap[jc + 1], &c__1); - } - jclast = jc; - jc = jc - *n + j - 2; + i__1 = *n - j; + ztpmv_((char *)"Lower", (char *)"No transpose", diag, &i__1, &ap[jclast], &ap[ + jc + 1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)1); + i__1 = *n - j; + zscal_(&i__1, &ajj, &ap[jc + 1], &c__1); + } + jclast = jc; + jc = jc - *n + j - 2; /* L40: */ - } + } } return 0; @@ -304,5 +304,5 @@ f"> */ } /* ztptri_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/ztrmm.cpp b/lib/linalg/ztrmm.cpp index cd71371d5b..3fec24189e 100644 --- a/lib/linalg/ztrmm.cpp +++ b/lib/linalg/ztrmm.cpp @@ -1,13 +1,13 @@ /* fortran/ztrmm.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -190,14 +190,14 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int ztrmm_(char *side, char *uplo, char *transa, char *diag, - integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, - integer *lda, doublecomplex *b, integer *ldb, ftnlen side_len, ftnlen - uplo_len, ftnlen transa_len, ftnlen diag_len) +/* Subroutine */ int ztrmm_(char *side, char *uplo, char *transa, char *diag, + integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, + integer *lda, doublecomplex *b, integer *ldb, ftnlen side_len, ftnlen + uplo_len, ftnlen transa_len, ftnlen diag_len) { /* System generated locals */ - integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4, i__5, - i__6; + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4, i__5, + i__6; doublecomplex z__1, z__2, z__3; /* Builtin functions */ @@ -249,9 +249,9 @@ extern "C" { /* Function Body */ lside = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); if (lside) { - nrowa = *m; + nrowa = *m; } else { - nrowa = *n; + nrowa = *n; } noconj = lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1); nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); @@ -259,496 +259,496 @@ extern "C" { info = 0; if (! lside && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - info = 1; + info = 1; } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - info = 2; + info = 2; } else if (! lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { - info = 3; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { - info = 4; + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 3; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 4; } else if (*m < 0) { - info = 5; + info = 5; } else if (*n < 0) { - info = 6; + info = 6; } else if (*lda < max(1,nrowa)) { - info = 9; + info = 9; } else if (*ldb < max(1,*m)) { - info = 11; + info = 11; } if (info != 0) { - xerbla_((char *)"ZTRMM ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"ZTRMM ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*m == 0 || *n == 0) { - return 0; + return 0; } /* And when alpha.eq.zero. */ if (alpha->r == 0. && alpha->i == 0.) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * b_dim1; - b[i__3].r = 0., b[i__3].i = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + b[i__3].r = 0., b[i__3].i = 0.; /* L10: */ - } + } /* L20: */ - } - return 0; + } + return 0; } /* Start the operations. */ if (lside) { - if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { /* Form B := alpha*A*B. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (k = 1; k <= i__2; ++k) { - i__3 = k + j * b_dim1; - if (b[i__3].r != 0. || b[i__3].i != 0.) { - i__3 = k + j * b_dim1; - z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3] - .i, z__1.i = alpha->r * b[i__3].i + - alpha->i * b[i__3].r; - temp.r = z__1.r, temp.i = z__1.i; - i__3 = k - 1; - for (i__ = 1; i__ <= i__3; ++i__) { - i__4 = i__ + j * b_dim1; - i__5 = i__ + j * b_dim1; - i__6 = i__ + k * a_dim1; - z__2.r = temp.r * a[i__6].r - temp.i * a[i__6] - .i, z__2.i = temp.r * a[i__6].i + - temp.i * a[i__6].r; - z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5] - .i + z__2.i; - b[i__4].r = z__1.r, b[i__4].i = z__1.i; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (k = 1; k <= i__2; ++k) { + i__3 = k + j * b_dim1; + if (b[i__3].r != 0. || b[i__3].i != 0.) { + i__3 = k + j * b_dim1; + z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3] + .i, z__1.i = alpha->r * b[i__3].i + + alpha->i * b[i__3].r; + temp.r = z__1.r, temp.i = z__1.i; + i__3 = k - 1; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * b_dim1; + i__5 = i__ + j * b_dim1; + i__6 = i__ + k * a_dim1; + z__2.r = temp.r * a[i__6].r - temp.i * a[i__6] + .i, z__2.i = temp.r * a[i__6].i + + temp.i * a[i__6].r; + z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5] + .i + z__2.i; + b[i__4].r = z__1.r, b[i__4].i = z__1.i; /* L30: */ - } - if (nounit) { - i__3 = k + k * a_dim1; - z__1.r = temp.r * a[i__3].r - temp.i * a[i__3] - .i, z__1.i = temp.r * a[i__3].i + - temp.i * a[i__3].r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__3 = k + j * b_dim1; - b[i__3].r = temp.r, b[i__3].i = temp.i; - } + } + if (nounit) { + i__3 = k + k * a_dim1; + z__1.r = temp.r * a[i__3].r - temp.i * a[i__3] + .i, z__1.i = temp.r * a[i__3].i + + temp.i * a[i__3].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__3 = k + j * b_dim1; + b[i__3].r = temp.r, b[i__3].i = temp.i; + } /* L40: */ - } + } /* L50: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - for (k = *m; k >= 1; --k) { - i__2 = k + j * b_dim1; - if (b[i__2].r != 0. || b[i__2].i != 0.) { - i__2 = k + j * b_dim1; - z__1.r = alpha->r * b[i__2].r - alpha->i * b[i__2] - .i, z__1.i = alpha->r * b[i__2].i + - alpha->i * b[i__2].r; - temp.r = z__1.r, temp.i = z__1.i; - i__2 = k + j * b_dim1; - b[i__2].r = temp.r, b[i__2].i = temp.i; - if (nounit) { - i__2 = k + j * b_dim1; - i__3 = k + j * b_dim1; - i__4 = k + k * a_dim1; - z__1.r = b[i__3].r * a[i__4].r - b[i__3].i * - a[i__4].i, z__1.i = b[i__3].r * a[ - i__4].i + b[i__3].i * a[i__4].r; - b[i__2].r = z__1.r, b[i__2].i = z__1.i; - } - i__2 = *m; - for (i__ = k + 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * b_dim1; - i__4 = i__ + j * b_dim1; - i__5 = i__ + k * a_dim1; - z__2.r = temp.r * a[i__5].r - temp.i * a[i__5] - .i, z__2.i = temp.r * a[i__5].i + - temp.i * a[i__5].r; - z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4] - .i + z__2.i; - b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (k = *m; k >= 1; --k) { + i__2 = k + j * b_dim1; + if (b[i__2].r != 0. || b[i__2].i != 0.) { + i__2 = k + j * b_dim1; + z__1.r = alpha->r * b[i__2].r - alpha->i * b[i__2] + .i, z__1.i = alpha->r * b[i__2].i + + alpha->i * b[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = k + j * b_dim1; + b[i__2].r = temp.r, b[i__2].i = temp.i; + if (nounit) { + i__2 = k + j * b_dim1; + i__3 = k + j * b_dim1; + i__4 = k + k * a_dim1; + z__1.r = b[i__3].r * a[i__4].r - b[i__3].i * + a[i__4].i, z__1.i = b[i__3].r * a[ + i__4].i + b[i__3].i * a[i__4].r; + b[i__2].r = z__1.r, b[i__2].i = z__1.i; + } + i__2 = *m; + for (i__ = k + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + i__5 = i__ + k * a_dim1; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5] + .i, z__2.i = temp.r * a[i__5].i + + temp.i * a[i__5].r; + z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4] + .i + z__2.i; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; /* L60: */ - } - } + } + } /* L70: */ - } + } /* L80: */ - } - } - } else { + } + } + } else { /* Form B := alpha*A**T*B or B := alpha*A**H*B. */ - if (upper) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - for (i__ = *m; i__ >= 1; --i__) { - i__2 = i__ + j * b_dim1; - temp.r = b[i__2].r, temp.i = b[i__2].i; - if (noconj) { - if (nounit) { - i__2 = i__ + i__ * a_dim1; - z__1.r = temp.r * a[i__2].r - temp.i * a[i__2] - .i, z__1.i = temp.r * a[i__2].i + - temp.i * a[i__2].r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__2 = i__ - 1; - for (k = 1; k <= i__2; ++k) { - i__3 = k + i__ * a_dim1; - i__4 = k + j * b_dim1; - z__2.r = a[i__3].r * b[i__4].r - a[i__3].i * - b[i__4].i, z__2.i = a[i__3].r * b[ - i__4].i + a[i__3].i * b[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + if (upper) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + for (i__ = *m; i__ >= 1; --i__) { + i__2 = i__ + j * b_dim1; + temp.r = b[i__2].r, temp.i = b[i__2].i; + if (noconj) { + if (nounit) { + i__2 = i__ + i__ * a_dim1; + z__1.r = temp.r * a[i__2].r - temp.i * a[i__2] + .i, z__1.i = temp.r * a[i__2].i + + temp.i * a[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = i__ - 1; + for (k = 1; k <= i__2; ++k) { + i__3 = k + i__ * a_dim1; + i__4 = k + j * b_dim1; + z__2.r = a[i__3].r * b[i__4].r - a[i__3].i * + b[i__4].i, z__2.i = a[i__3].r * b[ + i__4].i + a[i__3].i * b[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L90: */ - } - } else { - if (nounit) { - d_cnjg(&z__2, &a[i__ + i__ * a_dim1]); - z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__2 = i__ - 1; - for (k = 1; k <= i__2; ++k) { - d_cnjg(&z__3, &a[k + i__ * a_dim1]); - i__3 = k + j * b_dim1; - z__2.r = z__3.r * b[i__3].r - z__3.i * b[i__3] - .i, z__2.i = z__3.r * b[i__3].i + - z__3.i * b[i__3].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + if (nounit) { + d_cnjg(&z__2, &a[i__ + i__ * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = i__ - 1; + for (k = 1; k <= i__2; ++k) { + d_cnjg(&z__3, &a[k + i__ * a_dim1]); + i__3 = k + j * b_dim1; + z__2.r = z__3.r * b[i__3].r - z__3.i * b[i__3] + .i, z__2.i = z__3.r * b[i__3].i + + z__3.i * b[i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L100: */ - } - } - i__2 = i__ + j * b_dim1; - z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; - b[i__2].r = z__1.r, b[i__2].i = z__1.i; + } + } + i__2 = i__ + j * b_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + b[i__2].r = z__1.r, b[i__2].i = z__1.i; /* L110: */ - } + } /* L120: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * b_dim1; - temp.r = b[i__3].r, temp.i = b[i__3].i; - if (noconj) { - if (nounit) { - i__3 = i__ + i__ * a_dim1; - z__1.r = temp.r * a[i__3].r - temp.i * a[i__3] - .i, z__1.i = temp.r * a[i__3].i + - temp.i * a[i__3].r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__3 = *m; - for (k = i__ + 1; k <= i__3; ++k) { - i__4 = k + i__ * a_dim1; - i__5 = k + j * b_dim1; - z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * - b[i__5].i, z__2.i = a[i__4].r * b[ - i__5].i + a[i__4].i * b[i__5].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + temp.r = b[i__3].r, temp.i = b[i__3].i; + if (noconj) { + if (nounit) { + i__3 = i__ + i__ * a_dim1; + z__1.r = temp.r * a[i__3].r - temp.i * a[i__3] + .i, z__1.i = temp.r * a[i__3].i + + temp.i * a[i__3].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__3 = *m; + for (k = i__ + 1; k <= i__3; ++k) { + i__4 = k + i__ * a_dim1; + i__5 = k + j * b_dim1; + z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * + b[i__5].i, z__2.i = a[i__4].r * b[ + i__5].i + a[i__4].i * b[i__5].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L130: */ - } - } else { - if (nounit) { - d_cnjg(&z__2, &a[i__ + i__ * a_dim1]); - z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__3 = *m; - for (k = i__ + 1; k <= i__3; ++k) { - d_cnjg(&z__3, &a[k + i__ * a_dim1]); - i__4 = k + j * b_dim1; - z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4] - .i, z__2.i = z__3.r * b[i__4].i + - z__3.i * b[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + if (nounit) { + d_cnjg(&z__2, &a[i__ + i__ * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__3 = *m; + for (k = i__ + 1; k <= i__3; ++k) { + d_cnjg(&z__3, &a[k + i__ * a_dim1]); + i__4 = k + j * b_dim1; + z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4] + .i, z__2.i = z__3.r * b[i__4].i + + z__3.i * b[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L140: */ - } - } - i__3 = i__ + j * b_dim1; - z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; - b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } + i__3 = i__ + j * b_dim1; + z__1.r = alpha->r * temp.r - alpha->i * temp.i, + z__1.i = alpha->r * temp.i + alpha->i * + temp.r; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; /* L150: */ - } + } /* L160: */ - } - } - } + } + } + } } else { - if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { + if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { /* Form B := alpha*B*A. */ - if (upper) { - for (j = *n; j >= 1; --j) { - temp.r = alpha->r, temp.i = alpha->i; - if (nounit) { - i__1 = j + j * a_dim1; - z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, - z__1.i = temp.r * a[i__1].i + temp.i * a[i__1] - .r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__ + j * b_dim1; - i__3 = i__ + j * b_dim1; - z__1.r = temp.r * b[i__3].r - temp.i * b[i__3].i, - z__1.i = temp.r * b[i__3].i + temp.i * b[i__3] - .r; - b[i__2].r = z__1.r, b[i__2].i = z__1.i; + if (upper) { + for (j = *n; j >= 1; --j) { + temp.r = alpha->r, temp.i = alpha->i; + if (nounit) { + i__1 = j + j * a_dim1; + z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, + z__1.i = temp.r * a[i__1].i + temp.i * a[i__1] + .r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + j * b_dim1; + i__3 = i__ + j * b_dim1; + z__1.r = temp.r * b[i__3].r - temp.i * b[i__3].i, + z__1.i = temp.r * b[i__3].i + temp.i * b[i__3] + .r; + b[i__2].r = z__1.r, b[i__2].i = z__1.i; /* L170: */ - } - i__1 = j - 1; - for (k = 1; k <= i__1; ++k) { - i__2 = k + j * a_dim1; - if (a[i__2].r != 0. || a[i__2].i != 0.) { - i__2 = k + j * a_dim1; - z__1.r = alpha->r * a[i__2].r - alpha->i * a[i__2] - .i, z__1.i = alpha->r * a[i__2].i + - alpha->i * a[i__2].r; - temp.r = z__1.r, temp.i = z__1.i; - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * b_dim1; - i__4 = i__ + j * b_dim1; - i__5 = i__ + k * b_dim1; - z__2.r = temp.r * b[i__5].r - temp.i * b[i__5] - .i, z__2.i = temp.r * b[i__5].i + - temp.i * b[i__5].r; - z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4] - .i + z__2.i; - b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + i__1 = j - 1; + for (k = 1; k <= i__1; ++k) { + i__2 = k + j * a_dim1; + if (a[i__2].r != 0. || a[i__2].i != 0.) { + i__2 = k + j * a_dim1; + z__1.r = alpha->r * a[i__2].r - alpha->i * a[i__2] + .i, z__1.i = alpha->r * a[i__2].i + + alpha->i * a[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + i__5 = i__ + k * b_dim1; + z__2.r = temp.r * b[i__5].r - temp.i * b[i__5] + .i, z__2.i = temp.r * b[i__5].i + + temp.i * b[i__5].r; + z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4] + .i + z__2.i; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; /* L180: */ - } - } + } + } /* L190: */ - } + } /* L200: */ - } - } else { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - temp.r = alpha->r, temp.i = alpha->i; - if (nounit) { - i__2 = j + j * a_dim1; - z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, - z__1.i = temp.r * a[i__2].i + temp.i * a[i__2] - .r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * b_dim1; - i__4 = i__ + j * b_dim1; - z__1.r = temp.r * b[i__4].r - temp.i * b[i__4].i, - z__1.i = temp.r * b[i__4].i + temp.i * b[i__4] - .r; - b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } else { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + temp.r = alpha->r, temp.i = alpha->i; + if (nounit) { + i__2 = j + j * a_dim1; + z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, + z__1.i = temp.r * a[i__2].i + temp.i * a[i__2] + .r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + z__1.r = temp.r * b[i__4].r - temp.i * b[i__4].i, + z__1.i = temp.r * b[i__4].i + temp.i * b[i__4] + .r; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; /* L210: */ - } - i__2 = *n; - for (k = j + 1; k <= i__2; ++k) { - i__3 = k + j * a_dim1; - if (a[i__3].r != 0. || a[i__3].i != 0.) { - i__3 = k + j * a_dim1; - z__1.r = alpha->r * a[i__3].r - alpha->i * a[i__3] - .i, z__1.i = alpha->r * a[i__3].i + - alpha->i * a[i__3].r; - temp.r = z__1.r, temp.i = z__1.i; - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - i__4 = i__ + j * b_dim1; - i__5 = i__ + j * b_dim1; - i__6 = i__ + k * b_dim1; - z__2.r = temp.r * b[i__6].r - temp.i * b[i__6] - .i, z__2.i = temp.r * b[i__6].i + - temp.i * b[i__6].r; - z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5] - .i + z__2.i; - b[i__4].r = z__1.r, b[i__4].i = z__1.i; + } + i__2 = *n; + for (k = j + 1; k <= i__2; ++k) { + i__3 = k + j * a_dim1; + if (a[i__3].r != 0. || a[i__3].i != 0.) { + i__3 = k + j * a_dim1; + z__1.r = alpha->r * a[i__3].r - alpha->i * a[i__3] + .i, z__1.i = alpha->r * a[i__3].i + + alpha->i * a[i__3].r; + temp.r = z__1.r, temp.i = z__1.i; + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * b_dim1; + i__5 = i__ + j * b_dim1; + i__6 = i__ + k * b_dim1; + z__2.r = temp.r * b[i__6].r - temp.i * b[i__6] + .i, z__2.i = temp.r * b[i__6].i + + temp.i * b[i__6].r; + z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5] + .i + z__2.i; + b[i__4].r = z__1.r, b[i__4].i = z__1.i; /* L220: */ - } - } + } + } /* L230: */ - } + } /* L240: */ - } - } - } else { + } + } + } else { /* Form B := alpha*B*A**T or B := alpha*B*A**H. */ - if (upper) { - i__1 = *n; - for (k = 1; k <= i__1; ++k) { - i__2 = k - 1; - for (j = 1; j <= i__2; ++j) { - i__3 = j + k * a_dim1; - if (a[i__3].r != 0. || a[i__3].i != 0.) { - if (noconj) { - i__3 = j + k * a_dim1; - z__1.r = alpha->r * a[i__3].r - alpha->i * a[ - i__3].i, z__1.i = alpha->r * a[i__3] - .i + alpha->i * a[i__3].r; - temp.r = z__1.r, temp.i = z__1.i; - } else { - d_cnjg(&z__2, &a[j + k * a_dim1]); - z__1.r = alpha->r * z__2.r - alpha->i * - z__2.i, z__1.i = alpha->r * z__2.i + - alpha->i * z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__3 = *m; - for (i__ = 1; i__ <= i__3; ++i__) { - i__4 = i__ + j * b_dim1; - i__5 = i__ + j * b_dim1; - i__6 = i__ + k * b_dim1; - z__2.r = temp.r * b[i__6].r - temp.i * b[i__6] - .i, z__2.i = temp.r * b[i__6].i + - temp.i * b[i__6].r; - z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5] - .i + z__2.i; - b[i__4].r = z__1.r, b[i__4].i = z__1.i; + if (upper) { + i__1 = *n; + for (k = 1; k <= i__1; ++k) { + i__2 = k - 1; + for (j = 1; j <= i__2; ++j) { + i__3 = j + k * a_dim1; + if (a[i__3].r != 0. || a[i__3].i != 0.) { + if (noconj) { + i__3 = j + k * a_dim1; + z__1.r = alpha->r * a[i__3].r - alpha->i * a[ + i__3].i, z__1.i = alpha->r * a[i__3] + .i + alpha->i * a[i__3].r; + temp.r = z__1.r, temp.i = z__1.i; + } else { + d_cnjg(&z__2, &a[j + k * a_dim1]); + z__1.r = alpha->r * z__2.r - alpha->i * + z__2.i, z__1.i = alpha->r * z__2.i + + alpha->i * z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__3 = *m; + for (i__ = 1; i__ <= i__3; ++i__) { + i__4 = i__ + j * b_dim1; + i__5 = i__ + j * b_dim1; + i__6 = i__ + k * b_dim1; + z__2.r = temp.r * b[i__6].r - temp.i * b[i__6] + .i, z__2.i = temp.r * b[i__6].i + + temp.i * b[i__6].r; + z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5] + .i + z__2.i; + b[i__4].r = z__1.r, b[i__4].i = z__1.i; /* L250: */ - } - } + } + } /* L260: */ - } - temp.r = alpha->r, temp.i = alpha->i; - if (nounit) { - if (noconj) { - i__2 = k + k * a_dim1; - z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, - z__1.i = temp.r * a[i__2].i + temp.i * a[ - i__2].r; - temp.r = z__1.r, temp.i = z__1.i; - } else { - d_cnjg(&z__2, &a[k + k * a_dim1]); - z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - } - if (temp.r != 1. || temp.i != 0.) { - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + k * b_dim1; - i__4 = i__ + k * b_dim1; - z__1.r = temp.r * b[i__4].r - temp.i * b[i__4].i, - z__1.i = temp.r * b[i__4].i + temp.i * b[ - i__4].r; - b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + temp.r = alpha->r, temp.i = alpha->i; + if (nounit) { + if (noconj) { + i__2 = k + k * a_dim1; + z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, + z__1.i = temp.r * a[i__2].i + temp.i * a[ + i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } else { + d_cnjg(&z__2, &a[k + k * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + } + if (temp.r != 1. || temp.i != 0.) { + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + k * b_dim1; + i__4 = i__ + k * b_dim1; + z__1.r = temp.r * b[i__4].r - temp.i * b[i__4].i, + z__1.i = temp.r * b[i__4].i + temp.i * b[ + i__4].r; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; /* L270: */ - } - } + } + } /* L280: */ - } - } else { - for (k = *n; k >= 1; --k) { - i__1 = *n; - for (j = k + 1; j <= i__1; ++j) { - i__2 = j + k * a_dim1; - if (a[i__2].r != 0. || a[i__2].i != 0.) { - if (noconj) { - i__2 = j + k * a_dim1; - z__1.r = alpha->r * a[i__2].r - alpha->i * a[ - i__2].i, z__1.i = alpha->r * a[i__2] - .i + alpha->i * a[i__2].r; - temp.r = z__1.r, temp.i = z__1.i; - } else { - d_cnjg(&z__2, &a[j + k * a_dim1]); - z__1.r = alpha->r * z__2.r - alpha->i * - z__2.i, z__1.i = alpha->r * z__2.i + - alpha->i * z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__2 = *m; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * b_dim1; - i__4 = i__ + j * b_dim1; - i__5 = i__ + k * b_dim1; - z__2.r = temp.r * b[i__5].r - temp.i * b[i__5] - .i, z__2.i = temp.r * b[i__5].i + - temp.i * b[i__5].r; - z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4] - .i + z__2.i; - b[i__3].r = z__1.r, b[i__3].i = z__1.i; + } + } else { + for (k = *n; k >= 1; --k) { + i__1 = *n; + for (j = k + 1; j <= i__1; ++j) { + i__2 = j + k * a_dim1; + if (a[i__2].r != 0. || a[i__2].i != 0.) { + if (noconj) { + i__2 = j + k * a_dim1; + z__1.r = alpha->r * a[i__2].r - alpha->i * a[ + i__2].i, z__1.i = alpha->r * a[i__2] + .i + alpha->i * a[i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } else { + d_cnjg(&z__2, &a[j + k * a_dim1]); + z__1.r = alpha->r * z__2.r - alpha->i * + z__2.i, z__1.i = alpha->r * z__2.i + + alpha->i * z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *m; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * b_dim1; + i__4 = i__ + j * b_dim1; + i__5 = i__ + k * b_dim1; + z__2.r = temp.r * b[i__5].r - temp.i * b[i__5] + .i, z__2.i = temp.r * b[i__5].i + + temp.i * b[i__5].r; + z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4] + .i + z__2.i; + b[i__3].r = z__1.r, b[i__3].i = z__1.i; /* L290: */ - } - } + } + } /* L300: */ - } - temp.r = alpha->r, temp.i = alpha->i; - if (nounit) { - if (noconj) { - i__1 = k + k * a_dim1; - z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, - z__1.i = temp.r * a[i__1].i + temp.i * a[ - i__1].r; - temp.r = z__1.r, temp.i = z__1.i; - } else { - d_cnjg(&z__2, &a[k + k * a_dim1]); - z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - } - if (temp.r != 1. || temp.i != 0.) { - i__1 = *m; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__ + k * b_dim1; - i__3 = i__ + k * b_dim1; - z__1.r = temp.r * b[i__3].r - temp.i * b[i__3].i, - z__1.i = temp.r * b[i__3].i + temp.i * b[ - i__3].r; - b[i__2].r = z__1.r, b[i__2].i = z__1.i; + } + temp.r = alpha->r, temp.i = alpha->i; + if (nounit) { + if (noconj) { + i__1 = k + k * a_dim1; + z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, + z__1.i = temp.r * a[i__1].i + temp.i * a[ + i__1].r; + temp.r = z__1.r, temp.i = z__1.i; + } else { + d_cnjg(&z__2, &a[k + k * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + } + if (temp.r != 1. || temp.i != 0.) { + i__1 = *m; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + k * b_dim1; + i__3 = i__ + k * b_dim1; + z__1.r = temp.r * b[i__3].r - temp.i * b[i__3].i, + z__1.i = temp.r * b[i__3].i + temp.i * b[ + i__3].r; + b[i__2].r = z__1.r, b[i__2].i = z__1.i; /* L310: */ - } - } + } + } /* L320: */ - } - } - } + } + } + } } return 0; @@ -758,5 +758,5 @@ extern "C" { } /* ztrmm_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/ztrmv.cpp b/lib/linalg/ztrmv.cpp index ffc55b16fe..77f93e41a6 100644 --- a/lib/linalg/ztrmv.cpp +++ b/lib/linalg/ztrmv.cpp @@ -1,13 +1,13 @@ /* fortran/ztrmv.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -160,9 +160,9 @@ extern "C" { /* > \endverbatim */ /* > */ /* ===================================================================== */ -/* Subroutine */ int ztrmv_(char *uplo, char *trans, char *diag, integer *n, - doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, - ftnlen uplo_len, ftnlen trans_len, ftnlen diag_len) +/* Subroutine */ int ztrmv_(char *uplo, char *trans, char *diag, integer *n, + doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, + ftnlen uplo_len, ftnlen trans_len, ftnlen diag_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; @@ -212,31 +212,31 @@ extern "C" { /* Function Body */ info = 0; if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { - info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { - info = 2; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { - info = 3; + ftnlen)1, (ftnlen)1)) { + info = 1; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( + ftnlen)1)) { + info = 2; + } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, + (char *)"N", (ftnlen)1, (ftnlen)1)) { + info = 3; } else if (*n < 0) { - info = 4; + info = 4; } else if (*lda < max(1,*n)) { - info = 6; + info = 6; } else if (*incx == 0) { - info = 8; + info = 8; } if (info != 0) { - xerbla_((char *)"ZTRMV ", &info, (ftnlen)6); - return 0; + xerbla_((char *)"ZTRMV ", &info, (ftnlen)6); + return 0; } /* Quick return if possible. */ if (*n == 0) { - return 0; + return 0; } noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); @@ -246,9 +246,9 @@ extern "C" { /* will be ( N - 1 )*INCX too small for descending loops. */ if (*incx <= 0) { - kx = 1 - (*n - 1) * *incx; + kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { - kx = 1; + kx = 1; } /* Start the operations. In this version the elements of A are */ @@ -258,359 +258,359 @@ extern "C" { /* Form x := A*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - if (x[i__2].r != 0. || x[i__2].i != 0.) { - i__2 = j; - temp.r = x[i__2].r, temp.i = x[i__2].i; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__; - i__4 = i__; - i__5 = i__ + j * a_dim1; - z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, - z__2.i = temp.r * a[i__5].i + temp.i * a[ - i__5].r; - z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + - z__2.i; - x[i__3].r = z__1.r, x[i__3].i = z__1.i; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__; + i__4 = i__; + i__5 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, + z__2.i = temp.r * a[i__5].i + temp.i * a[ + i__5].r; + z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + + z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; /* L10: */ - } - if (nounit) { - i__2 = j; - i__3 = j; - i__4 = j + j * a_dim1; - z__1.r = x[i__3].r * a[i__4].r - x[i__3].i * a[ - i__4].i, z__1.i = x[i__3].r * a[i__4].i + - x[i__3].i * a[i__4].r; - x[i__2].r = z__1.r, x[i__2].i = z__1.i; - } - } + } + if (nounit) { + i__2 = j; + i__3 = j; + i__4 = j + j * a_dim1; + z__1.r = x[i__3].r * a[i__4].r - x[i__3].i * a[ + i__4].i, z__1.i = x[i__3].r * a[i__4].i + + x[i__3].i * a[i__4].r; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + } /* L20: */ - } - } else { - jx = kx; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - if (x[i__2].r != 0. || x[i__2].i != 0.) { - i__2 = jx; - temp.r = x[i__2].r, temp.i = x[i__2].i; - ix = kx; - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = ix; - i__4 = ix; - i__5 = i__ + j * a_dim1; - z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, - z__2.i = temp.r * a[i__5].i + temp.i * a[ - i__5].r; - z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + - z__2.i; - x[i__3].r = z__1.r, x[i__3].i = z__1.i; - ix += *incx; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + if (x[i__2].r != 0. || x[i__2].i != 0.) { + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = kx; + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = ix; + i__4 = ix; + i__5 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, + z__2.i = temp.r * a[i__5].i + temp.i * a[ + i__5].r; + z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + + z__2.i; + x[i__3].r = z__1.r, x[i__3].i = z__1.i; + ix += *incx; /* L30: */ - } - if (nounit) { - i__2 = jx; - i__3 = jx; - i__4 = j + j * a_dim1; - z__1.r = x[i__3].r * a[i__4].r - x[i__3].i * a[ - i__4].i, z__1.i = x[i__3].r * a[i__4].i + - x[i__3].i * a[i__4].r; - x[i__2].r = z__1.r, x[i__2].i = z__1.i; - } - } - jx += *incx; + } + if (nounit) { + i__2 = jx; + i__3 = jx; + i__4 = j + j * a_dim1; + z__1.r = x[i__3].r * a[i__4].r - x[i__3].i * a[ + i__4].i, z__1.i = x[i__3].r * a[i__4].i + + x[i__3].i * a[i__4].r; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + } + jx += *incx; /* L40: */ - } - } - } else { - if (*incx == 1) { - for (j = *n; j >= 1; --j) { - i__1 = j; - if (x[i__1].r != 0. || x[i__1].i != 0.) { - i__1 = j; - temp.r = x[i__1].r, temp.i = x[i__1].i; - i__1 = j + 1; - for (i__ = *n; i__ >= i__1; --i__) { - i__2 = i__; - i__3 = i__; - i__4 = i__ + j * a_dim1; - z__2.r = temp.r * a[i__4].r - temp.i * a[i__4].i, - z__2.i = temp.r * a[i__4].i + temp.i * a[ - i__4].r; - z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + - z__2.i; - x[i__2].r = z__1.r, x[i__2].i = z__1.i; + } + } + } else { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + i__2 = i__; + i__3 = i__; + i__4 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__4].r - temp.i * a[i__4].i, + z__2.i = temp.r * a[i__4].i + temp.i * a[ + i__4].r; + z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + + z__2.i; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; /* L50: */ - } - if (nounit) { - i__1 = j; - i__2 = j; - i__3 = j + j * a_dim1; - z__1.r = x[i__2].r * a[i__3].r - x[i__2].i * a[ - i__3].i, z__1.i = x[i__2].r * a[i__3].i + - x[i__2].i * a[i__3].r; - x[i__1].r = z__1.r, x[i__1].i = z__1.i; - } - } + } + if (nounit) { + i__1 = j; + i__2 = j; + i__3 = j + j * a_dim1; + z__1.r = x[i__2].r * a[i__3].r - x[i__2].i * a[ + i__3].i, z__1.i = x[i__2].r * a[i__3].i + + x[i__2].i * a[i__3].r; + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + } /* L60: */ - } - } else { - kx += (*n - 1) * *incx; - jx = kx; - for (j = *n; j >= 1; --j) { - i__1 = jx; - if (x[i__1].r != 0. || x[i__1].i != 0.) { - i__1 = jx; - temp.r = x[i__1].r, temp.i = x[i__1].i; - ix = kx; - i__1 = j + 1; - for (i__ = *n; i__ >= i__1; --i__) { - i__2 = ix; - i__3 = ix; - i__4 = i__ + j * a_dim1; - z__2.r = temp.r * a[i__4].r - temp.i * a[i__4].i, - z__2.i = temp.r * a[i__4].i + temp.i * a[ - i__4].r; - z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + - z__2.i; - x[i__2].r = z__1.r, x[i__2].i = z__1.i; - ix -= *incx; + } + } else { + kx += (*n - 1) * *incx; + jx = kx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + if (x[i__1].r != 0. || x[i__1].i != 0.) { + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = kx; + i__1 = j + 1; + for (i__ = *n; i__ >= i__1; --i__) { + i__2 = ix; + i__3 = ix; + i__4 = i__ + j * a_dim1; + z__2.r = temp.r * a[i__4].r - temp.i * a[i__4].i, + z__2.i = temp.r * a[i__4].i + temp.i * a[ + i__4].r; + z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + + z__2.i; + x[i__2].r = z__1.r, x[i__2].i = z__1.i; + ix -= *incx; /* L70: */ - } - if (nounit) { - i__1 = jx; - i__2 = jx; - i__3 = j + j * a_dim1; - z__1.r = x[i__2].r * a[i__3].r - x[i__2].i * a[ - i__3].i, z__1.i = x[i__2].r * a[i__3].i + - x[i__2].i * a[i__3].r; - x[i__1].r = z__1.r, x[i__1].i = z__1.i; - } - } - jx -= *incx; + } + if (nounit) { + i__1 = jx; + i__2 = jx; + i__3 = j + j * a_dim1; + z__1.r = x[i__2].r * a[i__3].r - x[i__2].i * a[ + i__3].i, z__1.i = x[i__2].r * a[i__3].i + + x[i__2].i * a[i__3].r; + x[i__1].r = z__1.r, x[i__1].i = z__1.i; + } + } + jx -= *incx; /* L80: */ - } - } - } + } + } + } } else { /* Form x := A**T*x or x := A**H*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - if (*incx == 1) { - for (j = *n; j >= 1; --j) { - i__1 = j; - temp.r = x[i__1].r, temp.i = x[i__1].i; - if (noconj) { - if (nounit) { - i__1 = j + j * a_dim1; - z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, - z__1.i = temp.r * a[i__1].i + temp.i * a[ - i__1].r; - temp.r = z__1.r, temp.i = z__1.i; - } - for (i__ = j - 1; i__ >= 1; --i__) { - i__1 = i__ + j * a_dim1; - i__2 = i__; - z__2.r = a[i__1].r * x[i__2].r - a[i__1].i * x[ - i__2].i, z__2.i = a[i__1].r * x[i__2].i + - a[i__1].i * x[i__2].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { + if (*incx == 1) { + for (j = *n; j >= 1; --j) { + i__1 = j; + temp.r = x[i__1].r, temp.i = x[i__1].i; + if (noconj) { + if (nounit) { + i__1 = j + j * a_dim1; + z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, + z__1.i = temp.r * a[i__1].i + temp.i * a[ + i__1].r; + temp.r = z__1.r, temp.i = z__1.i; + } + for (i__ = j - 1; i__ >= 1; --i__) { + i__1 = i__ + j * a_dim1; + i__2 = i__; + z__2.r = a[i__1].r * x[i__2].r - a[i__1].i * x[ + i__2].i, z__2.i = a[i__1].r * x[i__2].i + + a[i__1].i * x[i__2].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L90: */ - } - } else { - if (nounit) { - d_cnjg(&z__2, &a[j + j * a_dim1]); - z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - for (i__ = j - 1; i__ >= 1; --i__) { - d_cnjg(&z__3, &a[i__ + j * a_dim1]); - i__1 = i__; - z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, - z__2.i = z__3.r * x[i__1].i + z__3.i * x[ - i__1].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + if (nounit) { + d_cnjg(&z__2, &a[j + j * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + for (i__ = j - 1; i__ >= 1; --i__) { + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__1 = i__; + z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, + z__2.i = z__3.r * x[i__1].i + z__3.i * x[ + i__1].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L100: */ - } - } - i__1 = j; - x[i__1].r = temp.r, x[i__1].i = temp.i; + } + } + i__1 = j; + x[i__1].r = temp.r, x[i__1].i = temp.i; /* L110: */ - } - } else { - jx = kx + (*n - 1) * *incx; - for (j = *n; j >= 1; --j) { - i__1 = jx; - temp.r = x[i__1].r, temp.i = x[i__1].i; - ix = jx; - if (noconj) { - if (nounit) { - i__1 = j + j * a_dim1; - z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, - z__1.i = temp.r * a[i__1].i + temp.i * a[ - i__1].r; - temp.r = z__1.r, temp.i = z__1.i; - } - for (i__ = j - 1; i__ >= 1; --i__) { - ix -= *incx; - i__1 = i__ + j * a_dim1; - i__2 = ix; - z__2.r = a[i__1].r * x[i__2].r - a[i__1].i * x[ - i__2].i, z__2.i = a[i__1].r * x[i__2].i + - a[i__1].i * x[i__2].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + jx = kx + (*n - 1) * *incx; + for (j = *n; j >= 1; --j) { + i__1 = jx; + temp.r = x[i__1].r, temp.i = x[i__1].i; + ix = jx; + if (noconj) { + if (nounit) { + i__1 = j + j * a_dim1; + z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, + z__1.i = temp.r * a[i__1].i + temp.i * a[ + i__1].r; + temp.r = z__1.r, temp.i = z__1.i; + } + for (i__ = j - 1; i__ >= 1; --i__) { + ix -= *incx; + i__1 = i__ + j * a_dim1; + i__2 = ix; + z__2.r = a[i__1].r * x[i__2].r - a[i__1].i * x[ + i__2].i, z__2.i = a[i__1].r * x[i__2].i + + a[i__1].i * x[i__2].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L120: */ - } - } else { - if (nounit) { - d_cnjg(&z__2, &a[j + j * a_dim1]); - z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - for (i__ = j - 1; i__ >= 1; --i__) { - ix -= *incx; - d_cnjg(&z__3, &a[i__ + j * a_dim1]); - i__1 = ix; - z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, - z__2.i = z__3.r * x[i__1].i + z__3.i * x[ - i__1].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + if (nounit) { + d_cnjg(&z__2, &a[j + j * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + for (i__ = j - 1; i__ >= 1; --i__) { + ix -= *incx; + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__1 = ix; + z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, + z__2.i = z__3.r * x[i__1].i + z__3.i * x[ + i__1].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L130: */ - } - } - i__1 = jx; - x[i__1].r = temp.r, x[i__1].i = temp.i; - jx -= *incx; + } + } + i__1 = jx; + x[i__1].r = temp.r, x[i__1].i = temp.i; + jx -= *incx; /* L140: */ - } - } - } else { - if (*incx == 1) { - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = j; - temp.r = x[i__2].r, temp.i = x[i__2].i; - if (noconj) { - if (nounit) { - i__2 = j + j * a_dim1; - z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, - z__1.i = temp.r * a[i__2].i + temp.i * a[ - i__2].r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__; - z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[ - i__4].i, z__2.i = a[i__3].r * x[i__4].i + - a[i__3].i * x[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } + } else { + if (*incx == 1) { + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = j; + temp.r = x[i__2].r, temp.i = x[i__2].i; + if (noconj) { + if (nounit) { + i__2 = j + j * a_dim1; + z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, + z__1.i = temp.r * a[i__2].i + temp.i * a[ + i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[ + i__4].i, z__2.i = a[i__3].r * x[i__4].i + + a[i__3].i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L150: */ - } - } else { - if (nounit) { - d_cnjg(&z__2, &a[j + j * a_dim1]); - z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - d_cnjg(&z__3, &a[i__ + j * a_dim1]); - i__3 = i__; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[ - i__3].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + if (nounit) { + d_cnjg(&z__2, &a[j + j * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = i__; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[ + i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L160: */ - } - } - i__2 = j; - x[i__2].r = temp.r, x[i__2].i = temp.i; + } + } + i__2 = j; + x[i__2].r = temp.r, x[i__2].i = temp.i; /* L170: */ - } - } else { - jx = kx; - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = jx; - temp.r = x[i__2].r, temp.i = x[i__2].i; - ix = jx; - if (noconj) { - if (nounit) { - i__2 = j + j * a_dim1; - z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, - z__1.i = temp.r * a[i__2].i + temp.i * a[ - i__2].r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - ix += *incx; - i__3 = i__ + j * a_dim1; - i__4 = ix; - z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[ - i__4].i, z__2.i = a[i__3].r * x[i__4].i + - a[i__3].i * x[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + jx = kx; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = jx; + temp.r = x[i__2].r, temp.i = x[i__2].i; + ix = jx; + if (noconj) { + if (nounit) { + i__2 = j + j * a_dim1; + z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, + z__1.i = temp.r * a[i__2].i + temp.i * a[ + i__2].r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + i__3 = i__ + j * a_dim1; + i__4 = ix; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[ + i__4].i, z__2.i = a[i__3].r * x[i__4].i + + a[i__3].i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L180: */ - } - } else { - if (nounit) { - d_cnjg(&z__2, &a[j + j * a_dim1]); - z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; - temp.r = z__1.r, temp.i = z__1.i; - } - i__2 = *n; - for (i__ = j + 1; i__ <= i__2; ++i__) { - ix += *incx; - d_cnjg(&z__3, &a[i__ + j * a_dim1]); - i__3 = ix; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[ - i__3].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; - temp.r = z__1.r, temp.i = z__1.i; + } + } else { + if (nounit) { + d_cnjg(&z__2, &a[j + j * a_dim1]); + z__1.r = temp.r * z__2.r - temp.i * z__2.i, + z__1.i = temp.r * z__2.i + temp.i * + z__2.r; + temp.r = z__1.r, temp.i = z__1.i; + } + i__2 = *n; + for (i__ = j + 1; i__ <= i__2; ++i__) { + ix += *incx; + d_cnjg(&z__3, &a[i__ + j * a_dim1]); + i__3 = ix; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[ + i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + + z__2.i; + temp.r = z__1.r, temp.i = z__1.i; /* L190: */ - } - } - i__2 = jx; - x[i__2].r = temp.r, x[i__2].i = temp.i; - jx += *incx; + } + } + i__2 = jx; + x[i__2].r = temp.r, x[i__2].i = temp.i; + jx += *incx; /* L200: */ - } - } - } + } + } + } } return 0; @@ -620,5 +620,5 @@ extern "C" { } /* ztrmv_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zung2l.cpp b/lib/linalg/zung2l.cpp index 45c03e5c78..4c4f96c5b0 100644 --- a/lib/linalg/zung2l.cpp +++ b/lib/linalg/zung2l.cpp @@ -1,13 +1,13 @@ /* fortran/zung2l.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -135,9 +135,9 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zung2l_(integer *m, integer *n, integer *k, - doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * - work, integer *info) +/* Subroutine */ int zung2l_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -145,11 +145,11 @@ f"> */ /* Local variables */ integer i__, j, l, ii; - extern /* Subroutine */ int zscal_(integer *, doublecomplex *, - doublecomplex *, integer *), zlarf_(char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, - ftnlen); + extern /* Subroutine */ int zscal_(integer *, doublecomplex *, + doublecomplex *, integer *), zlarf_(char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, + ftnlen); /* -- LAPACK computational routine -- */ @@ -185,70 +185,70 @@ f"> */ /* Function Body */ *info = 0; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0 || *n > *m) { - *info = -2; + *info = -2; } else if (*k < 0 || *k > *n) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZUNG2L", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZUNG2L", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n <= 0) { - return 0; + return 0; } /* Initialise columns 1:n-k to columns of the unit matrix */ i__1 = *n - *k; for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (l = 1; l <= i__2; ++l) { - i__3 = l + j * a_dim1; - a[i__3].r = 0., a[i__3].i = 0.; + i__2 = *m; + for (l = 1; l <= i__2; ++l) { + i__3 = l + j * a_dim1; + a[i__3].r = 0., a[i__3].i = 0.; /* L10: */ - } - i__2 = *m - *n + j + j * a_dim1; - a[i__2].r = 1., a[i__2].i = 0.; + } + i__2 = *m - *n + j + j * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; /* L20: */ } i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { - ii = *n - *k + i__; + ii = *n - *k + i__; /* Apply H(i) to A(1:m-k+i,1:n-k+i) from the left */ - i__2 = *m - *n + ii + ii * a_dim1; - a[i__2].r = 1., a[i__2].i = 0.; - i__2 = *m - *n + ii; - i__3 = ii - 1; - zlarf_((char *)"Left", &i__2, &i__3, &a[ii * a_dim1 + 1], &c__1, &tau[i__], & - a[a_offset], lda, &work[1], (ftnlen)4); - i__2 = *m - *n + ii - 1; - i__3 = i__; - z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i; - zscal_(&i__2, &z__1, &a[ii * a_dim1 + 1], &c__1); - i__2 = *m - *n + ii + ii * a_dim1; - i__3 = i__; - z__1.r = 1. - tau[i__3].r, z__1.i = 0. - tau[i__3].i; - a[i__2].r = z__1.r, a[i__2].i = z__1.i; + i__2 = *m - *n + ii + ii * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; + i__2 = *m - *n + ii; + i__3 = ii - 1; + zlarf_((char *)"Left", &i__2, &i__3, &a[ii * a_dim1 + 1], &c__1, &tau[i__], & + a[a_offset], lda, &work[1], (ftnlen)4); + i__2 = *m - *n + ii - 1; + i__3 = i__; + z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i; + zscal_(&i__2, &z__1, &a[ii * a_dim1 + 1], &c__1); + i__2 = *m - *n + ii + ii * a_dim1; + i__3 = i__; + z__1.r = 1. - tau[i__3].r, z__1.i = 0. - tau[i__3].i; + a[i__2].r = z__1.r, a[i__2].i = z__1.i; /* Set A(m-k+i+1:m,n-k+i) to zero */ - i__2 = *m; - for (l = *m - *n + ii + 1; l <= i__2; ++l) { - i__3 = l + ii * a_dim1; - a[i__3].r = 0., a[i__3].i = 0.; + i__2 = *m; + for (l = *m - *n + ii + 1; l <= i__2; ++l) { + i__3 = l + ii * a_dim1; + a[i__3].r = 0., a[i__3].i = 0.; /* L30: */ - } + } /* L40: */ } return 0; @@ -258,5 +258,5 @@ f"> */ } /* zung2l_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zung2r.cpp b/lib/linalg/zung2r.cpp index 4bd9202caa..044df4d2b0 100644 --- a/lib/linalg/zung2r.cpp +++ b/lib/linalg/zung2r.cpp @@ -1,13 +1,13 @@ /* fortran/zung2r.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -134,9 +134,9 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zung2r_(integer *m, integer *n, integer *k, - doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * - work, integer *info) +/* Subroutine */ int zung2r_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -144,11 +144,11 @@ f"> */ /* Local variables */ integer i__, j, l; - extern /* Subroutine */ int zscal_(integer *, doublecomplex *, - doublecomplex *, integer *), zlarf_(char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, - ftnlen); + extern /* Subroutine */ int zscal_(integer *, doublecomplex *, + doublecomplex *, integer *), zlarf_(char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, + ftnlen); /* -- LAPACK computational routine -- */ @@ -184,38 +184,38 @@ f"> */ /* Function Body */ *info = 0; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0 || *n > *m) { - *info = -2; + *info = -2; } else if (*k < 0 || *k > *n) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZUNG2R", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZUNG2R", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*n <= 0) { - return 0; + return 0; } /* Initialise columns k+1:n to columns of the unit matrix */ i__1 = *n; for (j = *k + 1; j <= i__1; ++j) { - i__2 = *m; - for (l = 1; l <= i__2; ++l) { - i__3 = l + j * a_dim1; - a[i__3].r = 0., a[i__3].i = 0.; + i__2 = *m; + for (l = 1; l <= i__2; ++l) { + i__3 = l + j * a_dim1; + a[i__3].r = 0., a[i__3].i = 0.; /* L10: */ - } - i__2 = j + j * a_dim1; - a[i__2].r = 1., a[i__2].i = 0.; + } + i__2 = j + j * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; /* L20: */ } @@ -223,34 +223,34 @@ f"> */ /* Apply H(i) to A(i:m,i:n) from the left */ - if (i__ < *n) { - i__1 = i__ + i__ * a_dim1; - a[i__1].r = 1., a[i__1].i = 0.; - i__1 = *m - i__ + 1; - i__2 = *n - i__; - zlarf_((char *)"Left", &i__1, &i__2, &a[i__ + i__ * a_dim1], &c__1, &tau[ - i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], ( - ftnlen)4); - } - if (i__ < *m) { - i__1 = *m - i__; - i__2 = i__; - z__1.r = -tau[i__2].r, z__1.i = -tau[i__2].i; - zscal_(&i__1, &z__1, &a[i__ + 1 + i__ * a_dim1], &c__1); - } - i__1 = i__ + i__ * a_dim1; - i__2 = i__; - z__1.r = 1. - tau[i__2].r, z__1.i = 0. - tau[i__2].i; - a[i__1].r = z__1.r, a[i__1].i = z__1.i; + if (i__ < *n) { + i__1 = i__ + i__ * a_dim1; + a[i__1].r = 1., a[i__1].i = 0.; + i__1 = *m - i__ + 1; + i__2 = *n - i__; + zlarf_((char *)"Left", &i__1, &i__2, &a[i__ + i__ * a_dim1], &c__1, &tau[ + i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], ( + ftnlen)4); + } + if (i__ < *m) { + i__1 = *m - i__; + i__2 = i__; + z__1.r = -tau[i__2].r, z__1.i = -tau[i__2].i; + zscal_(&i__1, &z__1, &a[i__ + 1 + i__ * a_dim1], &c__1); + } + i__1 = i__ + i__ * a_dim1; + i__2 = i__; + z__1.r = 1. - tau[i__2].r, z__1.i = 0. - tau[i__2].i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; /* Set A(1:i-1,i) to zero */ - i__1 = i__ - 1; - for (l = 1; l <= i__1; ++l) { - i__2 = l + i__ * a_dim1; - a[i__2].r = 0., a[i__2].i = 0.; + i__1 = i__ - 1; + for (l = 1; l <= i__1; ++l) { + i__2 = l + i__ * a_dim1; + a[i__2].r = 0., a[i__2].i = 0.; /* L30: */ - } + } /* L40: */ } return 0; @@ -260,5 +260,5 @@ f"> */ } /* zung2r_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zungl2.cpp b/lib/linalg/zungl2.cpp index bd40069fd6..d4b85486c6 100644 --- a/lib/linalg/zungl2.cpp +++ b/lib/linalg/zungl2.cpp @@ -1,13 +1,13 @@ /* fortran/zungl2.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -130,9 +130,9 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zungl2_(integer *m, integer *n, integer *k, - doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * - work, integer *info) +/* Subroutine */ int zungl2_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; @@ -143,11 +143,11 @@ f"> */ /* Local variables */ integer i__, j, l; - extern /* Subroutine */ int zscal_(integer *, doublecomplex *, - doublecomplex *, integer *), zlarf_(char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, - ftnlen), zlacgv_(integer *, doublecomplex *, integer *); + extern /* Subroutine */ int zscal_(integer *, doublecomplex *, + doublecomplex *, integer *), zlarf_(char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, + ftnlen), zlacgv_(integer *, doublecomplex *, integer *); /* -- LAPACK computational routine -- */ @@ -183,83 +183,83 @@ f"> */ /* Function Body */ *info = 0; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < *m) { - *info = -2; + *info = -2; } else if (*k < 0 || *k > *m) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZUNGL2", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZUNGL2", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*m <= 0) { - return 0; + return 0; } if (*k < *m) { /* Initialise rows k+1:m to rows of the unit matrix */ - i__1 = *n; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (l = *k + 1; l <= i__2; ++l) { - i__3 = l + j * a_dim1; - a[i__3].r = 0., a[i__3].i = 0.; + i__1 = *n; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (l = *k + 1; l <= i__2; ++l) { + i__3 = l + j * a_dim1; + a[i__3].r = 0., a[i__3].i = 0.; /* L10: */ - } - if (j > *k && j <= *m) { - i__2 = j + j * a_dim1; - a[i__2].r = 1., a[i__2].i = 0.; - } + } + if (j > *k && j <= *m) { + i__2 = j + j * a_dim1; + a[i__2].r = 1., a[i__2].i = 0.; + } /* L20: */ - } + } } for (i__ = *k; i__ >= 1; --i__) { /* Apply H(i)**H to A(i:m,i:n) from the right */ - if (i__ < *n) { - i__1 = *n - i__; - zlacgv_(&i__1, &a[i__ + (i__ + 1) * a_dim1], lda); - if (i__ < *m) { - i__1 = i__ + i__ * a_dim1; - a[i__1].r = 1., a[i__1].i = 0.; - i__1 = *m - i__; - i__2 = *n - i__ + 1; - d_cnjg(&z__1, &tau[i__]); - zlarf_((char *)"Right", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, & - z__1, &a[i__ + 1 + i__ * a_dim1], lda, &work[1], ( - ftnlen)5); - } - i__1 = *n - i__; - i__2 = i__; - z__1.r = -tau[i__2].r, z__1.i = -tau[i__2].i; - zscal_(&i__1, &z__1, &a[i__ + (i__ + 1) * a_dim1], lda); - i__1 = *n - i__; - zlacgv_(&i__1, &a[i__ + (i__ + 1) * a_dim1], lda); - } - i__1 = i__ + i__ * a_dim1; - d_cnjg(&z__2, &tau[i__]); - z__1.r = 1. - z__2.r, z__1.i = 0. - z__2.i; - a[i__1].r = z__1.r, a[i__1].i = z__1.i; + if (i__ < *n) { + i__1 = *n - i__; + zlacgv_(&i__1, &a[i__ + (i__ + 1) * a_dim1], lda); + if (i__ < *m) { + i__1 = i__ + i__ * a_dim1; + a[i__1].r = 1., a[i__1].i = 0.; + i__1 = *m - i__; + i__2 = *n - i__ + 1; + d_cnjg(&z__1, &tau[i__]); + zlarf_((char *)"Right", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, & + z__1, &a[i__ + 1 + i__ * a_dim1], lda, &work[1], ( + ftnlen)5); + } + i__1 = *n - i__; + i__2 = i__; + z__1.r = -tau[i__2].r, z__1.i = -tau[i__2].i; + zscal_(&i__1, &z__1, &a[i__ + (i__ + 1) * a_dim1], lda); + i__1 = *n - i__; + zlacgv_(&i__1, &a[i__ + (i__ + 1) * a_dim1], lda); + } + i__1 = i__ + i__ * a_dim1; + d_cnjg(&z__2, &tau[i__]); + z__1.r = 1. - z__2.r, z__1.i = 0. - z__2.i; + a[i__1].r = z__1.r, a[i__1].i = z__1.i; /* Set A(i,1:i-1) to zero */ - i__1 = i__ - 1; - for (l = 1; l <= i__1; ++l) { - i__2 = i__ + l * a_dim1; - a[i__2].r = 0., a[i__2].i = 0.; + i__1 = i__ - 1; + for (l = 1; l <= i__1; ++l) { + i__2 = i__ + l * a_dim1; + a[i__2].r = 0., a[i__2].i = 0.; /* L30: */ - } + } /* L40: */ } return 0; @@ -269,5 +269,5 @@ f"> */ } /* zungl2_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zungql.cpp b/lib/linalg/zungql.cpp index 006c4859eb..8ee03838d4 100644 --- a/lib/linalg/zungql.cpp +++ b/lib/linalg/zungql.cpp @@ -1,13 +1,13 @@ /* fortran/zungql.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -151,28 +151,28 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zungql_(integer *m, integer *n, integer *k, - doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * - work, integer *lwork, integer *info) +/* Subroutine */ int zungql_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; /* Local variables */ integer i__, j, l, ib, nb, kk, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int zung2l_(integer *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, - integer *, integer *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int zung2l_(integer *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, + integer *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); integer ldwork; - extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen); logical lquery; integer lwkopt; @@ -213,42 +213,42 @@ f"> */ *info = 0; lquery = *lwork == -1; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0 || *n > *m) { - *info = -2; + *info = -2; } else if (*k < 0 || *k > *n) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } if (*info == 0) { - if (*n == 0) { - lwkopt = 1; - } else { - nb = ilaenv_(&c__1, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, ( - ftnlen)1); - lwkopt = *n * nb; - } - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + if (*n == 0) { + lwkopt = 1; + } else { + nb = ilaenv_(&c__1, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, ( + ftnlen)1); + lwkopt = *n * nb; + } + work[1].r = (doublereal) lwkopt, work[1].i = 0.; - if (*lwork < max(1,*n) && ! lquery) { - *info = -8; - } + if (*lwork < max(1,*n) && ! lquery) { + *info = -8; + } } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZUNGQL", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZUNGQL", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n <= 0) { - return 0; + return 0; } nbmin = 2; @@ -259,27 +259,27 @@ f"> */ /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); - if (nx < *k) { + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *k) { /* Determine if workspace is large enough for blocked code. */ - ldwork = *n; - iws = ldwork * nb; - if (*lwork < iws) { + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ - nb = *lwork / ldwork; + nb = *lwork / ldwork; /* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, - (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); - } - } + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, + (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } } if (nb >= nbmin && nb < *k && nx < *k) { @@ -288,23 +288,23 @@ f"> */ /* The last kk columns are handled by the block method. */ /* Computing MIN */ - i__1 = *k, i__2 = (*k - nx + nb - 1) / nb * nb; - kk = min(i__1,i__2); + i__1 = *k, i__2 = (*k - nx + nb - 1) / nb * nb; + kk = min(i__1,i__2); /* Set A(m-kk+1:m,1:n-kk) to zero. */ - i__1 = *n - kk; - for (j = 1; j <= i__1; ++j) { - i__2 = *m; - for (i__ = *m - kk + 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - a[i__3].r = 0., a[i__3].i = 0.; + i__1 = *n - kk; + for (j = 1; j <= i__1; ++j) { + i__2 = *m; + for (i__ = *m - kk + 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + a[i__3].r = 0., a[i__3].i = 0.; /* L10: */ - } + } /* L20: */ - } + } } else { - kk = 0; + kk = 0; } /* Use unblocked code for the first or only block. */ @@ -313,60 +313,60 @@ f"> */ i__2 = *n - kk; i__3 = *k - kk; zung2l_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &iinfo) - ; + ; if (kk > 0) { /* Use blocked code */ - i__1 = *k; - i__2 = nb; - for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += - i__2) { + i__1 = *k; + i__2 = nb; + for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += + i__2) { /* Computing MIN */ - i__3 = nb, i__4 = *k - i__ + 1; - ib = min(i__3,i__4); - if (*n - *k + i__ > 1) { + i__3 = nb, i__4 = *k - i__ + 1; + ib = min(i__3,i__4); + if (*n - *k + i__ > 1) { /* Form the triangular factor of the block reflector */ /* H = H(i+ib-1) . . . H(i+1) H(i) */ - i__3 = *m - *k + i__ + ib - 1; - zlarft_((char *)"Backward", (char *)"Columnwise", &i__3, &ib, &a[(*n - *k + - i__) * a_dim1 + 1], lda, &tau[i__], &work[1], &ldwork, - (ftnlen)8, (ftnlen)10); + i__3 = *m - *k + i__ + ib - 1; + zlarft_((char *)"Backward", (char *)"Columnwise", &i__3, &ib, &a[(*n - *k + + i__) * a_dim1 + 1], lda, &tau[i__], &work[1], &ldwork, + (ftnlen)8, (ftnlen)10); /* Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left */ - i__3 = *m - *k + i__ + ib - 1; - i__4 = *n - *k + i__ - 1; - zlarfb_((char *)"Left", (char *)"No transpose", (char *)"Backward", (char *)"Columnwise", & - i__3, &i__4, &ib, &a[(*n - *k + i__) * a_dim1 + 1], - lda, &work[1], &ldwork, &a[a_offset], lda, &work[ib + - 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen)8, ( - ftnlen)10); - } + i__3 = *m - *k + i__ + ib - 1; + i__4 = *n - *k + i__ - 1; + zlarfb_((char *)"Left", (char *)"No transpose", (char *)"Backward", (char *)"Columnwise", & + i__3, &i__4, &ib, &a[(*n - *k + i__) * a_dim1 + 1], + lda, &work[1], &ldwork, &a[a_offset], lda, &work[ib + + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen)8, ( + ftnlen)10); + } /* Apply H to rows 1:m-k+i+ib-1 of current block */ - i__3 = *m - *k + i__ + ib - 1; - zung2l_(&i__3, &ib, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, & - tau[i__], &work[1], &iinfo); + i__3 = *m - *k + i__ + ib - 1; + zung2l_(&i__3, &ib, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, & + tau[i__], &work[1], &iinfo); /* Set rows m-k+i+ib:m of current block to zero */ - i__3 = *n - *k + i__ + ib - 1; - for (j = *n - *k + i__; j <= i__3; ++j) { - i__4 = *m; - for (l = *m - *k + i__ + ib; l <= i__4; ++l) { - i__5 = l + j * a_dim1; - a[i__5].r = 0., a[i__5].i = 0.; + i__3 = *n - *k + i__ + ib - 1; + for (j = *n - *k + i__; j <= i__3; ++j) { + i__4 = *m; + for (l = *m - *k + i__ + ib; l <= i__4; ++l) { + i__5 = l + j * a_dim1; + a[i__5].r = 0., a[i__5].i = 0.; /* L30: */ - } + } /* L40: */ - } + } /* L50: */ - } + } } work[1].r = (doublereal) iws, work[1].i = 0.; @@ -377,5 +377,5 @@ f"> */ } /* zungql_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zungqr.cpp b/lib/linalg/zungqr.cpp index 7ce6a2a40d..a79c87eedd 100644 --- a/lib/linalg/zungqr.cpp +++ b/lib/linalg/zungqr.cpp @@ -1,13 +1,13 @@ /* fortran/zungqr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -151,28 +151,28 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zungqr_(integer *m, integer *n, integer *k, - doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * - work, integer *lwork, integer *info) +/* Subroutine */ int zungqr_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *lwork, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; /* Local variables */ integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int zung2r_(integer *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, - integer *, integer *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int zung2r_(integer *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, + integer *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); integer ldwork; - extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen); integer lwkopt; logical lquery; @@ -216,29 +216,29 @@ f"> */ work[1].r = (doublereal) lwkopt, work[1].i = 0.; lquery = *lwork == -1; if (*m < 0) { - *info = -1; + *info = -1; } else if (*n < 0 || *n > *m) { - *info = -2; + *info = -2; } else if (*k < 0 || *k > *n) { - *info = -3; + *info = -3; } else if (*lda < max(1,*m)) { - *info = -5; + *info = -5; } else if (*lwork < max(1,*n) && ! lquery) { - *info = -8; + *info = -8; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZUNGQR", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZUNGQR", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n <= 0) { - work[1].r = 1., work[1].i = 0.; - return 0; + work[1].r = 1., work[1].i = 0.; + return 0; } nbmin = 2; @@ -249,27 +249,27 @@ f"> */ /* Determine when to cross over from blocked to unblocked code. */ /* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"ZUNGQR", (char *)" ", m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); - if (nx < *k) { + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"ZUNGQR", (char *)" ", m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)1); + nx = max(i__1,i__2); + if (nx < *k) { /* Determine if workspace is large enough for blocked code. */ - ldwork = *n; - iws = ldwork * nb; - if (*lwork < iws) { + ldwork = *n; + iws = ldwork * nb; + if (*lwork < iws) { /* Not enough workspace to use optimal NB: reduce NB and */ /* determine the minimum value of NB. */ - nb = *lwork / ldwork; + nb = *lwork / ldwork; /* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNGQR", (char *)" ", m, n, k, &c_n1, - (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); - } - } + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNGQR", (char *)" ", m, n, k, &c_n1, + (ftnlen)6, (ftnlen)1); + nbmin = max(i__1,i__2); + } + } } if (nb >= nbmin && nb < *k && nx < *k) { @@ -277,87 +277,87 @@ f"> */ /* Use blocked code after the last block. */ /* The first kk columns are handled by the block method. */ - ki = (*k - nx - 1) / nb * nb; + ki = (*k - nx - 1) / nb * nb; /* Computing MIN */ - i__1 = *k, i__2 = ki + nb; - kk = min(i__1,i__2); + i__1 = *k, i__2 = ki + nb; + kk = min(i__1,i__2); /* Set A(1:kk,kk+1:n) to zero. */ - i__1 = *n; - for (j = kk + 1; j <= i__1; ++j) { - i__2 = kk; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - a[i__3].r = 0., a[i__3].i = 0.; + i__1 = *n; + for (j = kk + 1; j <= i__1; ++j) { + i__2 = kk; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + a[i__3].r = 0., a[i__3].i = 0.; /* L10: */ - } + } /* L20: */ - } + } } else { - kk = 0; + kk = 0; } /* Use unblocked code for the last or only block. */ if (kk < *n) { - i__1 = *m - kk; - i__2 = *n - kk; - i__3 = *k - kk; - zung2r_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & - tau[kk + 1], &work[1], &iinfo); + i__1 = *m - kk; + i__2 = *n - kk; + i__3 = *k - kk; + zung2r_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & + tau[kk + 1], &work[1], &iinfo); } if (kk > 0) { /* Use blocked code */ - i__1 = -nb; - for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { + i__1 = -nb; + for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { /* Computing MIN */ - i__2 = nb, i__3 = *k - i__ + 1; - ib = min(i__2,i__3); - if (i__ + ib <= *n) { + i__2 = nb, i__3 = *k - i__ + 1; + ib = min(i__2,i__3); + if (i__ + ib <= *n) { /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__2 = *m - i__ + 1; - zlarft_((char *)"Forward", (char *)"Columnwise", &i__2, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, - (ftnlen)10); + i__2 = *m - i__ + 1; + zlarft_((char *)"Forward", (char *)"Columnwise", &i__2, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, + (ftnlen)10); /* Apply H to A(i:m,i+ib:n) from the left */ - i__2 = *m - i__ + 1; - i__3 = *n - i__ - ib + 1; - zlarfb_((char *)"Left", (char *)"No transpose", (char *)"Forward", (char *)"Columnwise", & - i__2, &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[ - 1], &ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, & - work[ib + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen) - 7, (ftnlen)10); - } + i__2 = *m - i__ + 1; + i__3 = *n - i__ - ib + 1; + zlarfb_((char *)"Left", (char *)"No transpose", (char *)"Forward", (char *)"Columnwise", & + i__2, &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[ + 1], &ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, & + work[ib + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen) + 7, (ftnlen)10); + } /* Apply H to rows i:m of current block */ - i__2 = *m - i__ + 1; - zung2r_(&i__2, &ib, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & - work[1], &iinfo); + i__2 = *m - i__ + 1; + zung2r_(&i__2, &ib, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & + work[1], &iinfo); /* Set rows 1:i-1 of current block to zero */ - i__2 = i__ + ib - 1; - for (j = i__; j <= i__2; ++j) { - i__3 = i__ - 1; - for (l = 1; l <= i__3; ++l) { - i__4 = l + j * a_dim1; - a[i__4].r = 0., a[i__4].i = 0.; + i__2 = i__ + ib - 1; + for (j = i__; j <= i__2; ++j) { + i__3 = i__ - 1; + for (l = 1; l <= i__3; ++l) { + i__4 = l + j * a_dim1; + a[i__4].r = 0., a[i__4].i = 0.; /* L30: */ - } + } /* L40: */ - } + } /* L50: */ - } + } } work[1].r = (doublereal) iws, work[1].i = 0.; @@ -368,5 +368,5 @@ f"> */ } /* zungqr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zungtr.cpp b/lib/linalg/zungtr.cpp index c8f42b6e21..86c03cb474 100644 --- a/lib/linalg/zungtr.cpp +++ b/lib/linalg/zungtr.cpp @@ -1,13 +1,13 @@ /* fortran/zungtr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -144,9 +144,9 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zungtr_(char *uplo, integer *n, doublecomplex *a, - integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, - integer *info, ftnlen uplo_len) +/* Subroutine */ int zungtr_(char *uplo, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, + integer *info, ftnlen uplo_len) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; @@ -157,15 +157,15 @@ f"> */ integer iinfo; logical upper; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); integer lwkopt; logical lquery; - extern /* Subroutine */ int zungql_(integer *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, integer *), zungqr_(integer *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, integer *); + extern /* Subroutine */ int zungql_(integer *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, integer *), zungqr_(integer *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, integer *); /* -- LAPACK computational routine -- */ @@ -205,52 +205,52 @@ f"> */ lquery = *lwork == -1; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (*n < 0) { - *info = -2; + *info = -2; } else if (*lda < max(1,*n)) { - *info = -4; + *info = -4; } else /* if(complicated condition) */ { /* Computing MAX */ - i__1 = 1, i__2 = *n - 1; - if (*lwork < max(i__1,i__2) && ! lquery) { - *info = -7; - } + i__1 = 1, i__2 = *n - 1; + if (*lwork < max(i__1,i__2) && ! lquery) { + *info = -7; + } } if (*info == 0) { - if (upper) { - i__1 = *n - 1; - i__2 = *n - 1; - i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"ZUNGQL", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)1); - } else { - i__1 = *n - 1; - i__2 = *n - 1; - i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"ZUNGQR", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)1); - } + if (upper) { + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"ZUNGQL", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)1); + } else { + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"ZUNGQR", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)1); + } /* Computing MAX */ - i__1 = 1, i__2 = *n - 1; - lwkopt = max(i__1,i__2) * nb; - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + i__1 = 1, i__2 = *n - 1; + lwkopt = max(i__1,i__2) * nb; + work[1].r = (doublereal) lwkopt, work[1].i = 0.; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZUNGTR", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZUNGTR", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*n == 0) { - work[1].r = 1., work[1].i = 0.; - return 0; + work[1].r = 1., work[1].i = 0.; + return 0; } if (upper) { @@ -261,35 +261,35 @@ f"> */ /* column to the left, and set the last row and column of Q to */ /* those of the unit matrix */ - i__1 = *n - 1; - for (j = 1; j <= i__1; ++j) { - i__2 = j - 1; - for (i__ = 1; i__ <= i__2; ++i__) { - i__3 = i__ + j * a_dim1; - i__4 = i__ + (j + 1) * a_dim1; - a[i__3].r = a[i__4].r, a[i__3].i = a[i__4].i; + i__1 = *n - 1; + for (j = 1; j <= i__1; ++j) { + i__2 = j - 1; + for (i__ = 1; i__ <= i__2; ++i__) { + i__3 = i__ + j * a_dim1; + i__4 = i__ + (j + 1) * a_dim1; + a[i__3].r = a[i__4].r, a[i__3].i = a[i__4].i; /* L10: */ - } - i__2 = *n + j * a_dim1; - a[i__2].r = 0., a[i__2].i = 0.; + } + i__2 = *n + j * a_dim1; + a[i__2].r = 0., a[i__2].i = 0.; /* L20: */ - } - i__1 = *n - 1; - for (i__ = 1; i__ <= i__1; ++i__) { - i__2 = i__ + *n * a_dim1; - a[i__2].r = 0., a[i__2].i = 0.; + } + i__1 = *n - 1; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = i__ + *n * a_dim1; + a[i__2].r = 0., a[i__2].i = 0.; /* L30: */ - } - i__1 = *n + *n * a_dim1; - a[i__1].r = 1., a[i__1].i = 0.; + } + i__1 = *n + *n * a_dim1; + a[i__1].r = 1., a[i__1].i = 0.; /* Generate Q(1:n-1,1:n-1) */ - i__1 = *n - 1; - i__2 = *n - 1; - i__3 = *n - 1; - zungql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], - lwork, &iinfo); + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + zungql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], + lwork, &iinfo); } else { @@ -299,36 +299,36 @@ f"> */ /* column to the right, and set the first row and column of Q to */ /* those of the unit matrix */ - for (j = *n; j >= 2; --j) { - i__1 = j * a_dim1 + 1; - a[i__1].r = 0., a[i__1].i = 0.; - i__1 = *n; - for (i__ = j + 1; i__ <= i__1; ++i__) { - i__2 = i__ + j * a_dim1; - i__3 = i__ + (j - 1) * a_dim1; - a[i__2].r = a[i__3].r, a[i__2].i = a[i__3].i; + for (j = *n; j >= 2; --j) { + i__1 = j * a_dim1 + 1; + a[i__1].r = 0., a[i__1].i = 0.; + i__1 = *n; + for (i__ = j + 1; i__ <= i__1; ++i__) { + i__2 = i__ + j * a_dim1; + i__3 = i__ + (j - 1) * a_dim1; + a[i__2].r = a[i__3].r, a[i__2].i = a[i__3].i; /* L40: */ - } + } /* L50: */ - } - i__1 = a_dim1 + 1; - a[i__1].r = 1., a[i__1].i = 0.; - i__1 = *n; - for (i__ = 2; i__ <= i__1; ++i__) { - i__2 = i__ + a_dim1; - a[i__2].r = 0., a[i__2].i = 0.; + } + i__1 = a_dim1 + 1; + a[i__1].r = 1., a[i__1].i = 0.; + i__1 = *n; + for (i__ = 2; i__ <= i__1; ++i__) { + i__2 = i__ + a_dim1; + a[i__2].r = 0., a[i__2].i = 0.; /* L60: */ - } - if (*n > 1) { + } + if (*n > 1) { /* Generate Q(2:n,2:n) */ - i__1 = *n - 1; - i__2 = *n - 1; - i__3 = *n - 1; - zungqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], - &work[1], lwork, &iinfo); - } + i__1 = *n - 1; + i__2 = *n - 1; + i__3 = *n - 1; + zungqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], + &work[1], lwork, &iinfo); + } } work[1].r = (doublereal) lwkopt, work[1].i = 0.; return 0; @@ -338,5 +338,5 @@ f"> */ } /* zungtr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zunm2l.cpp b/lib/linalg/zunm2l.cpp index d7fc940517..d9bc80e8c7 100644 --- a/lib/linalg/zunm2l.cpp +++ b/lib/linalg/zunm2l.cpp @@ -1,13 +1,13 @@ /* fortran/zunm2l.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -19,7 +19,7 @@ extern "C" { static integer c__1 = 1; -/* > \brief \b ZUNM2L multiplies a general matrix by the unitary matrix from a QL factorization determined by +/* > \brief \b ZUNM2L multiplies a general matrix by the unitary matrix from a QL factorization determined by cgeqlf (unblocked algorithm). */ /* =========== DOCUMENTATION =========== */ @@ -179,10 +179,10 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zunm2l_(char *side, char *trans, integer *m, integer *n, - integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, - doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info, - ftnlen side_len, ftnlen trans_len) +/* Subroutine */ int zunm2l_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info, + ftnlen side_len, ftnlen trans_len) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; @@ -197,10 +197,10 @@ f"> */ logical left; doublecomplex taui; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int zlarf_(char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, - ftnlen); + extern /* Subroutine */ int zlarf_(char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, + ftnlen); logical notran; @@ -247,85 +247,85 @@ f"> */ /* NQ is the order of Q */ if (left) { - nq = *m; + nq = *m; } else { - nq = *n; + nq = *n; } if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! notran && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*m < 0) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*k < 0 || *k > nq) { - *info = -5; + *info = -5; } else if (*lda < max(1,nq)) { - *info = -7; + *info = -7; } else if (*ldc < max(1,*m)) { - *info = -10; + *info = -10; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZUNM2L", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZUNM2L", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { - return 0; + return 0; } if (left && notran || ! left && ! notran) { - i1 = 1; - i2 = *k; - i3 = 1; + i1 = 1; + i2 = *k; + i3 = 1; } else { - i1 = *k; - i2 = 1; - i3 = -1; + i1 = *k; + i2 = 1; + i3 = -1; } if (left) { - ni = *n; + ni = *n; } else { - mi = *m; + mi = *m; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { - if (left) { + if (left) { /* H(i) or H(i)**H is applied to C(1:m-k+i,1:n) */ - mi = *m - *k + i__; - } else { + mi = *m - *k + i__; + } else { /* H(i) or H(i)**H is applied to C(1:m,1:n-k+i) */ - ni = *n - *k + i__; - } + ni = *n - *k + i__; + } /* Apply H(i) or H(i)**H */ - if (notran) { - i__3 = i__; - taui.r = tau[i__3].r, taui.i = tau[i__3].i; - } else { - d_cnjg(&z__1, &tau[i__]); - taui.r = z__1.r, taui.i = z__1.i; - } - i__3 = nq - *k + i__ + i__ * a_dim1; - aii.r = a[i__3].r, aii.i = a[i__3].i; - i__3 = nq - *k + i__ + i__ * a_dim1; - a[i__3].r = 1., a[i__3].i = 0.; - zlarf_(side, &mi, &ni, &a[i__ * a_dim1 + 1], &c__1, &taui, &c__[ - c_offset], ldc, &work[1], (ftnlen)1); - i__3 = nq - *k + i__ + i__ * a_dim1; - a[i__3].r = aii.r, a[i__3].i = aii.i; + if (notran) { + i__3 = i__; + taui.r = tau[i__3].r, taui.i = tau[i__3].i; + } else { + d_cnjg(&z__1, &tau[i__]); + taui.r = z__1.r, taui.i = z__1.i; + } + i__3 = nq - *k + i__ + i__ * a_dim1; + aii.r = a[i__3].r, aii.i = a[i__3].i; + i__3 = nq - *k + i__ + i__ * a_dim1; + a[i__3].r = 1., a[i__3].i = 0.; + zlarf_(side, &mi, &ni, &a[i__ * a_dim1 + 1], &c__1, &taui, &c__[ + c_offset], ldc, &work[1], (ftnlen)1); + i__3 = nq - *k + i__ + i__ * a_dim1; + a[i__3].r = aii.r, a[i__3].i = aii.i; /* L10: */ } return 0; @@ -335,5 +335,5 @@ f"> */ } /* zunm2l_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zunm2r.cpp b/lib/linalg/zunm2r.cpp index 56ad0d944a..a84cf72ba6 100644 --- a/lib/linalg/zunm2r.cpp +++ b/lib/linalg/zunm2r.cpp @@ -1,13 +1,13 @@ /* fortran/zunm2r.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -19,7 +19,7 @@ extern "C" { static integer c__1 = 1; -/* > \brief \b ZUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by +/* > \brief \b ZUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by cgeqrf (unblocked algorithm). */ /* =========== DOCUMENTATION =========== */ @@ -179,10 +179,10 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zunm2r_(char *side, char *trans, integer *m, integer *n, - integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, - doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info, - ftnlen side_len, ftnlen trans_len) +/* Subroutine */ int zunm2r_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info, + ftnlen side_len, ftnlen trans_len) { /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; @@ -197,10 +197,10 @@ f"> */ logical left; doublecomplex taui; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int zlarf_(char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, - ftnlen); + extern /* Subroutine */ int zlarf_(char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, + ftnlen); logical notran; @@ -247,89 +247,89 @@ f"> */ /* NQ is the order of Q */ if (left) { - nq = *m; + nq = *m; } else { - nq = *n; + nq = *n; } if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! notran && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*m < 0) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*k < 0 || *k > nq) { - *info = -5; + *info = -5; } else if (*lda < max(1,nq)) { - *info = -7; + *info = -7; } else if (*ldc < max(1,*m)) { - *info = -10; + *info = -10; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZUNM2R", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZUNM2R", &i__1, (ftnlen)6); + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { - return 0; + return 0; } if (left && ! notran || ! left && notran) { - i1 = 1; - i2 = *k; - i3 = 1; + i1 = 1; + i2 = *k; + i3 = 1; } else { - i1 = *k; - i2 = 1; - i3 = -1; + i1 = *k; + i2 = 1; + i3 = -1; } if (left) { - ni = *n; - jc = 1; + ni = *n; + jc = 1; } else { - mi = *m; - ic = 1; + mi = *m; + ic = 1; } i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { - if (left) { + if (left) { /* H(i) or H(i)**H is applied to C(i:m,1:n) */ - mi = *m - i__ + 1; - ic = i__; - } else { + mi = *m - i__ + 1; + ic = i__; + } else { /* H(i) or H(i)**H is applied to C(1:m,i:n) */ - ni = *n - i__ + 1; - jc = i__; - } + ni = *n - i__ + 1; + jc = i__; + } /* Apply H(i) or H(i)**H */ - if (notran) { - i__3 = i__; - taui.r = tau[i__3].r, taui.i = tau[i__3].i; - } else { - d_cnjg(&z__1, &tau[i__]); - taui.r = z__1.r, taui.i = z__1.i; - } - i__3 = i__ + i__ * a_dim1; - aii.r = a[i__3].r, aii.i = a[i__3].i; - i__3 = i__ + i__ * a_dim1; - a[i__3].r = 1., a[i__3].i = 0.; - zlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &taui, &c__[ic - + jc * c_dim1], ldc, &work[1], (ftnlen)1); - i__3 = i__ + i__ * a_dim1; - a[i__3].r = aii.r, a[i__3].i = aii.i; + if (notran) { + i__3 = i__; + taui.r = tau[i__3].r, taui.i = tau[i__3].i; + } else { + d_cnjg(&z__1, &tau[i__]); + taui.r = z__1.r, taui.i = z__1.i; + } + i__3 = i__ + i__ * a_dim1; + aii.r = a[i__3].r, aii.i = a[i__3].i; + i__3 = i__ + i__ * a_dim1; + a[i__3].r = 1., a[i__3].i = 0.; + zlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &taui, &c__[ic + + jc * c_dim1], ldc, &work[1], (ftnlen)1); + i__3 = i__ + i__ * a_dim1; + a[i__3].r = aii.r, a[i__3].i = aii.i; /* L10: */ } return 0; @@ -339,5 +339,5 @@ f"> */ } /* zunm2r_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zunmql.cpp b/lib/linalg/zunmql.cpp index c7e6134831..facff63c71 100644 --- a/lib/linalg/zunmql.cpp +++ b/lib/linalg/zunmql.cpp @@ -1,13 +1,13 @@ /* fortran/zunmql.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -189,15 +189,15 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zunmql_(char *side, char *trans, integer *m, integer *n, - integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, - doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, - integer *info, ftnlen side_len, ftnlen trans_len) +/* Subroutine */ int zunmql_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, + integer *info, ftnlen side_len, ftnlen trans_len) { /* System generated locals */ address a__1[2]; - integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, - i__5; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, + i__5; char ch__1[2]; /* Builtin functions */ @@ -208,21 +208,21 @@ f"> */ logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; - extern /* Subroutine */ int zunm2l_(char *, char *, integer *, integer *, - integer *, doublecomplex *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, - integer *, integer *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int zunm2l_(char *, char *, integer *, integer *, + integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, + integer *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); logical notran; integer ldwork; - extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen); integer lwkopt; logical lquery; @@ -271,141 +271,141 @@ f"> */ /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { - nq = *m; - nw = max(1,*n); + nq = *m; + nw = max(1,*n); } else { - nq = *n; - nw = max(1,*m); + nq = *n; + nw = max(1,*m); } if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! notran && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*m < 0) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*k < 0 || *k > nq) { - *info = -5; + *info = -5; } else if (*lda < max(1,nq)) { - *info = -7; + *info = -7; } else if (*ldc < max(1,*m)) { - *info = -10; + *info = -10; } else if (*lwork < nw && ! lquery) { - *info = -12; + *info = -12; } if (*info == 0) { /* Compute the workspace requirements */ - if (*m == 0 || *n == 0) { - lwkopt = 1; - } else { + if (*m == 0 || *n == 0) { + lwkopt = 1; + } else { /* Computing MIN */ /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, m, n, k, &c_n1, - (ftnlen)6, (ftnlen)2); - nb = min(i__1,i__2); - lwkopt = nw * nb + 4160; - } - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, m, n, k, &c_n1, + (ftnlen)6, (ftnlen)2); + nb = min(i__1,i__2); + lwkopt = nw * nb + 4160; + } + work[1].r = (doublereal) lwkopt, work[1].i = 0.; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZUNMQL", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZUNMQL", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0) { - return 0; + return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { - if (*lwork < lwkopt) { - nb = (*lwork - 4160) / ldwork; + if (*lwork < lwkopt) { + nb = (*lwork - 4160) / ldwork; /* Computing MAX */ /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNMQL", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nbmin = max(i__1,i__2); - } + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNMQL", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nbmin = max(i__1,i__2); + } } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ - zunm2l_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + zunm2l_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); } else { /* Use blocked code */ - iwt = nw * nb + 1; - if (left && notran || ! left && ! notran) { - i1 = 1; - i2 = *k; - i3 = nb; - } else { - i1 = (*k - 1) / nb * nb + 1; - i2 = 1; - i3 = -nb; - } + iwt = nw * nb + 1; + if (left && notran || ! left && ! notran) { + i1 = 1; + i2 = *k; + i3 = nb; + } else { + i1 = (*k - 1) / nb * nb + 1; + i2 = 1; + i3 = -nb; + } - if (left) { - ni = *n; - } else { - mi = *m; - } + if (left) { + ni = *n; + } else { + mi = *m; + } - i__1 = i2; - i__2 = i3; - for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ - i__4 = nb, i__5 = *k - i__ + 1; - ib = min(i__4,i__5); + i__4 = nb, i__5 = *k - i__ + 1; + ib = min(i__4,i__5); /* Form the triangular factor of the block reflector */ /* H = H(i+ib-1) . . . H(i+1) H(i) */ - i__4 = nq - *k + i__ + ib - 1; - zlarft_((char *)"Backward", (char *)"Columnwise", &i__4, &ib, &a[i__ * a_dim1 + 1] - , lda, &tau[i__], &work[iwt], &c__65, (ftnlen)8, (ftnlen) - 10); - if (left) { + i__4 = nq - *k + i__ + ib - 1; + zlarft_((char *)"Backward", (char *)"Columnwise", &i__4, &ib, &a[i__ * a_dim1 + 1] + , lda, &tau[i__], &work[iwt], &c__65, (ftnlen)8, (ftnlen) + 10); + if (left) { /* H or H**H is applied to C(1:m-k+i+ib-1,1:n) */ - mi = *m - *k + i__ + ib - 1; - } else { + mi = *m - *k + i__ + ib - 1; + } else { /* H or H**H is applied to C(1:m,1:n-k+i+ib-1) */ - ni = *n - *k + i__ + ib - 1; - } + ni = *n - *k + i__ + ib - 1; + } /* Apply H or H**H */ - zlarfb_(side, trans, (char *)"Backward", (char *)"Columnwise", &mi, &ni, &ib, &a[ - i__ * a_dim1 + 1], lda, &work[iwt], &c__65, &c__[c_offset] - , ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen)1, (ftnlen)8, - (ftnlen)10); + zlarfb_(side, trans, (char *)"Backward", (char *)"Columnwise", &mi, &ni, &ib, &a[ + i__ * a_dim1 + 1], lda, &work[iwt], &c__65, &c__[c_offset] + , ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen)1, (ftnlen)8, + (ftnlen)10); /* L10: */ - } + } } work[1].r = (doublereal) lwkopt, work[1].i = 0.; return 0; @@ -415,5 +415,5 @@ f"> */ } /* zunmql_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zunmqr.cpp b/lib/linalg/zunmqr.cpp index dc127fe1aa..8659499dab 100644 --- a/lib/linalg/zunmqr.cpp +++ b/lib/linalg/zunmqr.cpp @@ -1,13 +1,13 @@ /* fortran/zunmqr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -189,15 +189,15 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zunmqr_(char *side, char *trans, integer *m, integer *n, - integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, - doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, - integer *info, ftnlen side_len, ftnlen trans_len) +/* Subroutine */ int zunmqr_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, + integer *info, ftnlen side_len, ftnlen trans_len) { /* System generated locals */ address a__1[2]; - integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, - i__5; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, + i__5; char ch__1[2]; /* Builtin functions */ @@ -208,21 +208,21 @@ f"> */ logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; - extern /* Subroutine */ int zunm2r_(char *, char *, integer *, integer *, - integer *, doublecomplex *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, - integer *, integer *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern /* Subroutine */ int zunm2r_(char *, char *, integer *, integer *, + integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, + ftnlen), xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, + integer *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); logical notran; integer ldwork; - extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, ftnlen, ftnlen); + extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen); integer lwkopt; logical lquery; @@ -271,28 +271,28 @@ f"> */ /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { - nq = *m; - nw = max(1,*n); + nq = *m; + nw = max(1,*n); } else { - nq = *n; - nw = max(1,*m); + nq = *n; + nw = max(1,*m); } if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! notran && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { - *info = -2; + *info = -2; } else if (*m < 0) { - *info = -3; + *info = -3; } else if (*n < 0) { - *info = -4; + *info = -4; } else if (*k < 0 || *k > nq) { - *info = -5; + *info = -5; } else if (*lda < max(1,nq)) { - *info = -7; + *info = -7; } else if (*ldc < max(1,*m)) { - *info = -10; + *info = -10; } else if (*lwork < nw && ! lquery) { - *info = -12; + *info = -12; } if (*info == 0) { @@ -301,112 +301,112 @@ f"> */ /* Computing MIN */ /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nb = min(i__1,i__2); - lwkopt = nw * nb + 4160; - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nb = min(i__1,i__2); + lwkopt = nw * nb + 4160; + work[1].r = (doublereal) lwkopt, work[1].i = 0.; } if (*info != 0) { - i__1 = -(*info); - xerbla_((char *)"ZUNMQR", &i__1, (ftnlen)6); - return 0; + i__1 = -(*info); + xerbla_((char *)"ZUNMQR", &i__1, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || *k == 0) { - work[1].r = 1., work[1].i = 0.; - return 0; + work[1].r = 1., work[1].i = 0.; + return 0; } nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { - if (*lwork < lwkopt) { - nb = (*lwork - 4160) / ldwork; + if (*lwork < lwkopt) { + nb = (*lwork - 4160) / ldwork; /* Computing MAX */ /* Writing concatenation */ - i__3[0] = 1, a__1[0] = side; - i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNMQR", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nbmin = max(i__1,i__2); - } + i__3[0] = 1, a__1[0] = side; + i__3[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNMQR", ch__1, m, n, k, &c_n1, ( + ftnlen)6, (ftnlen)2); + nbmin = max(i__1,i__2); + } } if (nb < nbmin || nb >= *k) { /* Use unblocked code */ - zunm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + zunm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ + c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); } else { /* Use blocked code */ - iwt = nw * nb + 1; - if (left && ! notran || ! left && notran) { - i1 = 1; - i2 = *k; - i3 = nb; - } else { - i1 = (*k - 1) / nb * nb + 1; - i2 = 1; - i3 = -nb; - } + iwt = nw * nb + 1; + if (left && ! notran || ! left && notran) { + i1 = 1; + i2 = *k; + i3 = nb; + } else { + i1 = (*k - 1) / nb * nb + 1; + i2 = 1; + i3 = -nb; + } - if (left) { - ni = *n; - jc = 1; - } else { - mi = *m; - ic = 1; - } + if (left) { + ni = *n; + jc = 1; + } else { + mi = *m; + ic = 1; + } - i__1 = i2; - i__2 = i3; - for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { + i__1 = i2; + i__2 = i3; + for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { /* Computing MIN */ - i__4 = nb, i__5 = *k - i__ + 1; - ib = min(i__4,i__5); + i__4 = nb, i__5 = *k - i__ + 1; + ib = min(i__4,i__5); /* Form the triangular factor of the block reflector */ /* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__4 = nq - i__ + 1; - zlarft_((char *)"Forward", (char *)"Columnwise", &i__4, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[iwt], &c__65, (ftnlen)7, ( - ftnlen)10); - if (left) { + i__4 = nq - i__ + 1; + zlarft_((char *)"Forward", (char *)"Columnwise", &i__4, &ib, &a[i__ + i__ * + a_dim1], lda, &tau[i__], &work[iwt], &c__65, (ftnlen)7, ( + ftnlen)10); + if (left) { /* H or H**H is applied to C(i:m,1:n) */ - mi = *m - i__ + 1; - ic = i__; - } else { + mi = *m - i__ + 1; + ic = i__; + } else { /* H or H**H is applied to C(1:m,i:n) */ - ni = *n - i__ + 1; - jc = i__; - } + ni = *n - i__ + 1; + jc = i__; + } /* Apply H or H**H */ - zlarfb_(side, trans, (char *)"Forward", (char *)"Columnwise", &mi, &ni, &ib, &a[ - i__ + i__ * a_dim1], lda, &work[iwt], &c__65, &c__[ic + - jc * c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen) - 1, (ftnlen)7, (ftnlen)10); + zlarfb_(side, trans, (char *)"Forward", (char *)"Columnwise", &mi, &ni, &ib, &a[ + i__ + i__ * a_dim1], lda, &work[iwt], &c__65, &c__[ic + + jc * c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen) + 1, (ftnlen)7, (ftnlen)10); /* L10: */ - } + } } work[1].r = (doublereal) lwkopt, work[1].i = 0.; return 0; @@ -416,5 +416,5 @@ f"> */ } /* zunmqr_ */ #ifdef __cplusplus - } + } #endif diff --git a/lib/linalg/zunmtr.cpp b/lib/linalg/zunmtr.cpp index ab5e7eacb8..be224d7e93 100644 --- a/lib/linalg/zunmtr.cpp +++ b/lib/linalg/zunmtr.cpp @@ -1,13 +1,13 @@ /* fortran/zunmtr.f -- translated by f2c (version 20200916). You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - http://www.netlib.org/f2c/libf2c.zip + http://www.netlib.org/f2c/libf2c.zip */ #ifdef __cplusplus @@ -192,10 +192,10 @@ f"> */ /* > \ingroup complex16OTHERcomputational */ /* ===================================================================== */ -/* Subroutine */ int zunmtr_(char *side, char *uplo, char *trans, integer *m, - integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, - doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, - integer *info, ftnlen side_len, ftnlen uplo_len, ftnlen trans_len) +/* Subroutine */ int zunmtr_(char *side, char *uplo, char *trans, integer *m, + integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, + integer *info, ftnlen side_len, ftnlen uplo_len, ftnlen trans_len) { /* System generated locals */ address a__1[2]; @@ -212,17 +212,17 @@ f"> */ integer iinfo; logical upper; extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, + integer *, integer *, ftnlen, ftnlen); integer lwkopt; logical lquery; - extern /* Subroutine */ int zunmql_(char *, char *, integer *, integer *, - integer *, doublecomplex *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, integer *, - ftnlen, ftnlen), zunmqr_(char *, char *, integer *, integer *, - integer *, doublecomplex *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, integer *, - ftnlen, ftnlen); + extern /* Subroutine */ int zunmql_(char *, char *, integer *, integer *, + integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, integer *, + ftnlen, ftnlen), zunmqr_(char *, char *, integer *, integer *, + integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, integer *, + ftnlen, ftnlen); /* -- LAPACK computational routine -- */ @@ -267,123 +267,123 @@ f"> */ /* NQ is the order of Q and NW is the minimum dimension of WORK */ if (left) { - nq = *m; - nw = max(1,*n); + nq = *m; + nw = max(1,*n); } else { - nq = *n; - nw = max(1,*m); + nq = *n; + nw = max(1,*m); } if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - *info = -1; + *info = -1; } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - *info = -2; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"C", (ftnlen)1, (ftnlen)1)) { - *info = -3; + *info = -2; + } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, + (char *)"C", (ftnlen)1, (ftnlen)1)) { + *info = -3; } else if (*m < 0) { - *info = -4; + *info = -4; } else if (*n < 0) { - *info = -5; + *info = -5; } else if (*lda < max(1,nq)) { - *info = -7; + *info = -7; } else if (*ldc < max(1,*m)) { - *info = -10; + *info = -10; } else if (*lwork < nw && ! lquery) { - *info = -12; + *info = -12; } if (*info == 0) { - if (upper) { - if (left) { + if (upper) { + if (left) { /* Writing concatenation */ - i__1[0] = 1, a__1[0] = side; - i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); - i__2 = *m - 1; - i__3 = *m - 1; - nb = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, &i__2, n, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); - } else { + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *m - 1; + i__3 = *m - 1; + nb = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, &i__2, n, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } else { /* Writing concatenation */ - i__1[0] = 1, a__1[0] = side; - i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); - i__2 = *n - 1; - i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, m, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); - } - } else { - if (left) { + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, m, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } + } else { + if (left) { /* Writing concatenation */ - i__1[0] = 1, a__1[0] = side; - i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); - i__2 = *m - 1; - i__3 = *m - 1; - nb = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, &i__2, n, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); - } else { + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *m - 1; + i__3 = *m - 1; + nb = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, &i__2, n, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } else { /* Writing concatenation */ - i__1[0] = 1, a__1[0] = side; - i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); - i__2 = *n - 1; - i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, m, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); - } - } - lwkopt = nw * nb; - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + i__1[0] = 1, a__1[0] = side; + i__1[1] = 1, a__1[1] = trans; + s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + i__2 = *n - 1; + i__3 = *n - 1; + nb = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, m, &i__2, &i__3, &c_n1, ( + ftnlen)6, (ftnlen)2); + } + } + lwkopt = nw * nb; + work[1].r = (doublereal) lwkopt, work[1].i = 0.; } if (*info != 0) { - i__2 = -(*info); - xerbla_((char *)"ZUNMTR", &i__2, (ftnlen)6); - return 0; + i__2 = -(*info); + xerbla_((char *)"ZUNMTR", &i__2, (ftnlen)6); + return 0; } else if (lquery) { - return 0; + return 0; } /* Quick return if possible */ if (*m == 0 || *n == 0 || nq == 1) { - work[1].r = 1., work[1].i = 0.; - return 0; + work[1].r = 1., work[1].i = 0.; + return 0; } if (left) { - mi = *m - 1; - ni = *n; + mi = *m - 1; + ni = *n; } else { - mi = *m; - ni = *n - 1; + mi = *m; + ni = *n - 1; } if (upper) { /* Q was determined by a call to ZHETRD with UPLO = 'U' */ - i__2 = nq - 1; - zunmql_(side, trans, &mi, &ni, &i__2, &a[(a_dim1 << 1) + 1], lda, & - tau[1], &c__[c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen) - 1, (ftnlen)1); + i__2 = nq - 1; + zunmql_(side, trans, &mi, &ni, &i__2, &a[(a_dim1 << 1) + 1], lda, & + tau[1], &c__[c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen) + 1, (ftnlen)1); } else { /* Q was determined by a call to ZHETRD with UPLO = 'L' */ - if (left) { - i1 = 2; - i2 = 1; - } else { - i1 = 1; - i2 = 2; - } - i__2 = nq - 1; - zunmqr_(side, trans, &mi, &ni, &i__2, &a[a_dim1 + 2], lda, &tau[1], & - c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, (ftnlen) - 1, (ftnlen)1); + if (left) { + i1 = 2; + i2 = 1; + } else { + i1 = 1; + i2 = 2; + } + i__2 = nq - 1; + zunmqr_(side, trans, &mi, &ni, &i__2, &a[a_dim1 + 2], lda, &tau[1], & + c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, (ftnlen) + 1, (ftnlen)1); } work[1].r = (doublereal) lwkopt, work[1].i = 0.; return 0; @@ -393,5 +393,5 @@ f"> */ } /* zunmtr_ */ #ifdef __cplusplus - } + } #endif From f157ba2389790097e6fd85b1e78e2e1d4086edaa Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 15:31:49 -0500 Subject: [PATCH 29/47] add some f2c runtime functions, remove exception, avoid name conflict with libgfortran --- lib/linalg/convert.sh | 20 ++- lib/linalg/d_lmp_cnjg.cpp | 13 ++ lib/linalg/d_lmp_imag.cpp | 10 ++ lib/linalg/d_lmp_lg10.cpp | 14 ++ lib/linalg/d_lmp_sign.cpp | 12 ++ lib/linalg/dbdsqr.cpp | 8 +- lib/linalg/dcabs1.cpp | 4 +- lib/linalg/dgesvd.cpp | 6 +- lib/linalg/dlabad.cpp | 4 +- lib/linalg/dlacn2.cpp | 8 +- lib/linalg/dlaed0.cpp | 6 +- lib/linalg/dlaed3.cpp | 4 +- lib/linalg/dlaed6.cpp | 4 +- lib/linalg/dlaed7.cpp | 6 +- lib/linalg/dlaed9.cpp | 4 +- lib/linalg/dlaeda.cpp | 10 +- lib/linalg/dlalsa.cpp | 8 +- lib/linalg/dlalsd.cpp | 4 +- lib/linalg/dlamc3.cpp | 68 +++++++++ lib/linalg/dlarfg.cpp | 6 +- lib/linalg/dlartg.cpp | 4 +- lib/linalg/dlasd8.cpp | 4 +- lib/linalg/dlasda.cpp | 6 +- lib/linalg/dlasv2.cpp | 18 +-- lib/linalg/dormbr.cpp | 10 +- lib/linalg/dormlq.cpp | 6 +- lib/linalg/dormql.cpp | 6 +- lib/linalg/dormqr.cpp | 6 +- lib/linalg/dormtr.cpp | 10 +- lib/linalg/dstedc.cpp | 6 +- lib/linalg/dsteqr.cpp | 6 +- lib/linalg/dsterf.cpp | 6 +- lib/linalg/dtrtri.cpp | 4 +- lib/linalg/dznrm2.cpp | 6 +- lib/linalg/i_lmp_dnnt.cpp | 12 ++ lib/linalg/i_lmp_len.cpp | 10 ++ lib/linalg/i_lmp_nint.cpp | 13 ++ lib/linalg/ilaenv.cpp | 250 +++++++++++++++---------------- lib/linalg/iparmq.cpp | 18 +-- lib/linalg/pow_lmp_dd.cpp | 12 ++ lib/linalg/pow_lmp_di.cpp | 31 ++++ lib/linalg/pow_lmp_ii.cpp | 29 ++++ lib/linalg/s_lmp_cat.cpp | 23 +++ lib/linalg/s_lmp_cmp.cpp | 45 ++++++ lib/linalg/s_lmp_copy.cpp | 26 ++++ lib/linalg/static/.clang-format | 23 +++ lib/linalg/static/README | 9 +- lib/linalg/static/d_lmp_cnjg.cpp | 13 ++ lib/linalg/static/d_lmp_imag.cpp | 10 ++ lib/linalg/static/d_lmp_lg10.cpp | 14 ++ lib/linalg/static/d_lmp_sign.cpp | 12 ++ lib/linalg/static/dlamc3.f | 45 ++++++ lib/linalg/static/i_lmp_dnnt.cpp | 12 ++ lib/linalg/static/i_lmp_len.cpp | 10 ++ lib/linalg/static/i_lmp_nint.cpp | 13 ++ lib/linalg/static/pow_lmp_dd.cpp | 12 ++ lib/linalg/static/pow_lmp_di.cpp | 31 ++++ lib/linalg/static/pow_lmp_ii.cpp | 29 ++++ lib/linalg/static/s_lmp_cat.cpp | 23 +++ lib/linalg/static/s_lmp_cmp.cpp | 45 ++++++ lib/linalg/static/s_lmp_copy.cpp | 26 ++++ lib/linalg/static/xerbla.cpp | 47 +++--- lib/linalg/static/z_lmp_abs.cpp | 31 ++++ lib/linalg/static/z_lmp_div.cpp | 31 ++++ lib/linalg/whitespace.conf | 13 ++ lib/linalg/xerbla.cpp | 47 +++--- lib/linalg/z_lmp_abs.cpp | 31 ++++ lib/linalg/z_lmp_div.cpp | 31 ++++ lib/linalg/zdotc.cpp | 6 +- lib/linalg/zdscal.cpp | 6 +- lib/linalg/zgemm.cpp | 14 +- lib/linalg/zgemv.cpp | 6 +- lib/linalg/zgerc.cpp | 6 +- lib/linalg/zhemv.cpp | 10 +- lib/linalg/zher2.cpp | 18 +-- lib/linalg/zher2k.cpp | 34 ++--- lib/linalg/zhpr.cpp | 10 +- lib/linalg/zlacgv.cpp | 6 +- lib/linalg/zlacrm.cpp | 4 +- lib/linalg/zladiv.cpp | 6 +- lib/linalg/zlaed0.cpp | 6 +- lib/linalg/zlaed7.cpp | 6 +- lib/linalg/zlanhe.cpp | 10 +- lib/linalg/zlarfb.cpp | 10 +- lib/linalg/zlarfg.cpp | 8 +- lib/linalg/zlarft.cpp | 6 +- lib/linalg/zlassq.cpp | 4 +- lib/linalg/zstedc.cpp | 6 +- lib/linalg/zsteqr.cpp | 6 +- lib/linalg/ztpmv.cpp | 18 +-- lib/linalg/ztpsv.cpp | 42 +++--- lib/linalg/ztptri.cpp | 6 +- lib/linalg/ztrmm.cpp | 18 +-- lib/linalg/ztrmv.cpp | 18 +-- lib/linalg/zungl2.cpp | 6 +- lib/linalg/zunm2l.cpp | 4 +- lib/linalg/zunm2r.cpp | 4 +- lib/linalg/zunmql.cpp | 6 +- lib/linalg/zunmqr.cpp | 6 +- lib/linalg/zunmtr.cpp | 10 +- 100 files changed, 1233 insertions(+), 437 deletions(-) create mode 100644 lib/linalg/d_lmp_cnjg.cpp create mode 100644 lib/linalg/d_lmp_imag.cpp create mode 100644 lib/linalg/d_lmp_lg10.cpp create mode 100644 lib/linalg/d_lmp_sign.cpp create mode 100644 lib/linalg/dlamc3.cpp create mode 100644 lib/linalg/i_lmp_dnnt.cpp create mode 100644 lib/linalg/i_lmp_len.cpp create mode 100644 lib/linalg/i_lmp_nint.cpp create mode 100644 lib/linalg/pow_lmp_dd.cpp create mode 100644 lib/linalg/pow_lmp_di.cpp create mode 100644 lib/linalg/pow_lmp_ii.cpp create mode 100644 lib/linalg/s_lmp_cat.cpp create mode 100644 lib/linalg/s_lmp_cmp.cpp create mode 100644 lib/linalg/s_lmp_copy.cpp create mode 100644 lib/linalg/static/.clang-format create mode 100644 lib/linalg/static/d_lmp_cnjg.cpp create mode 100644 lib/linalg/static/d_lmp_imag.cpp create mode 100644 lib/linalg/static/d_lmp_lg10.cpp create mode 100644 lib/linalg/static/d_lmp_sign.cpp create mode 100644 lib/linalg/static/dlamc3.f create mode 100644 lib/linalg/static/i_lmp_dnnt.cpp create mode 100644 lib/linalg/static/i_lmp_len.cpp create mode 100644 lib/linalg/static/i_lmp_nint.cpp create mode 100644 lib/linalg/static/pow_lmp_dd.cpp create mode 100644 lib/linalg/static/pow_lmp_di.cpp create mode 100644 lib/linalg/static/pow_lmp_ii.cpp create mode 100644 lib/linalg/static/s_lmp_cat.cpp create mode 100644 lib/linalg/static/s_lmp_cmp.cpp create mode 100644 lib/linalg/static/s_lmp_copy.cpp create mode 100644 lib/linalg/static/z_lmp_abs.cpp create mode 100644 lib/linalg/static/z_lmp_div.cpp create mode 100644 lib/linalg/whitespace.conf create mode 100644 lib/linalg/z_lmp_abs.cpp create mode 100644 lib/linalg/z_lmp_div.cpp diff --git a/lib/linalg/convert.sh b/lib/linalg/convert.sh index c73e0d3393..0b2cdec0f2 100755 --- a/lib/linalg/convert.sh +++ b/lib/linalg/convert.sh @@ -10,20 +10,28 @@ fi # cleanup rm -f *.c *.cpp *.P *~ *.orig *.bak *.rej -# translate files directly, skip those for which we have replacements. +# translate original files directly for f in fortran/*.f do \ b=$(basename $f .f) + # skip files for which we have replacements if test $b == dgetrf2 || test $b == disnan || test $b == dlaisnan || \ test $b == dlamch || test $b == dlarft || test $b == dpotrf2 || \ test $b == lsame || test $b == xerbla || test $b == zlarft then echo Skipping $b else + # convert to C++ with f2c. Make local variables dynamic. f2c -C++ -a -f $f && mv $b.c $b.cpp || exit 2 # silence c++ compiler warnings about string constants sed -i -e 's/\("[^"]\+"\)/(char *)\1/g' -e 's/^extern.*"C"/extern "C"/' \ -e 's/^#include.*"f2c.h"/#include "lmp_f2c.h"/' $b.cpp + # replace libf2c functions with local versions under a different name + sed -i -e 's/s_\(cat\|cmp\|copy\)(/s_lmp_\1(/g' \ + -e 's/d_\(sign\|cnjg\|imag\|lg10\)(/d_lmp_\1(/g' \ + -e 's/z_\(abs\|div\)(/z_lmp_\1(/g' \ + -e 's/i_\(len\|nint\|dnnt\)(/i_lmp_\1(/g' \ + -e 's/pow_\(dd\|di\|ii\)(/pow_lmp_\1(/g' $b.cpp fi done @@ -31,10 +39,17 @@ done for f in static/*.f do \ b=$(basename $f .f) + # convert to C++ with f2c. Make local variables dynamic. f2c -C++ -a -f $f && mv $b.c $b.cpp || exit 2 # silence c++ compiler warnings about string constants sed -i -e 's/\("[^"]\+"\)/(char *)\1/g' -e 's/^extern.*"C"/extern "C"/' \ -e 's/^#include.*"f2c.h"/#include "lmp_f2c.h"/' $b.cpp + # replace libf2c functions with local versions under a different name + sed -i -e 's/s_\(cat\|cmp\|copy\)(/s_lmp_\1(/g' \ + -e 's/d_\(sign\|cnjg\|imag\|lg10\)(/d_lmp_\1(/g' \ + -e 's/z_\(abs\|div\)(/z_lmp_\1(/g' \ + -e 's/i_\(len\|nint\|dnnt\)(/i_lmp_\1(/g' \ + -e 's/pow_\(dd\|di\|ii\)(/pow_lmp_\1(/g' $b.cpp done # copy direct C++ alternatives @@ -42,3 +57,6 @@ for c in static/*.cpp do \ cp -v $c . done + +# fix whitespace +python ../../tools/coding_standard/whitespace.py -c whitespace.conf -f . diff --git a/lib/linalg/d_lmp_cnjg.cpp b/lib/linalg/d_lmp_cnjg.cpp new file mode 100644 index 0000000000..03ca8f98fd --- /dev/null +++ b/lib/linalg/d_lmp_cnjg.cpp @@ -0,0 +1,13 @@ + +#include "lmp_f2c.h" + +extern "C" { + +void d_lmp_cnjg(doublecomplex *r, doublecomplex *z) +{ + doublereal zi = z->i; + + r->r = z->r; + r->i = -zi; +} +} diff --git a/lib/linalg/d_lmp_imag.cpp b/lib/linalg/d_lmp_imag.cpp new file mode 100644 index 0000000000..f0443f7828 --- /dev/null +++ b/lib/linalg/d_lmp_imag.cpp @@ -0,0 +1,10 @@ + +#include "lmp_f2c.h" + +extern "C" { + +double d_lmp_imag(doublecomplex *z) +{ + return (z->i); +} +} diff --git a/lib/linalg/d_lmp_lg10.cpp b/lib/linalg/d_lmp_lg10.cpp new file mode 100644 index 0000000000..ec48c99839 --- /dev/null +++ b/lib/linalg/d_lmp_lg10.cpp @@ -0,0 +1,14 @@ + +#include "lmp_f2c.h" +#undef abs + +static constexpr double log10e = 0.43429448190325182765; + +#include + +extern "C" { +double d_lmp_lg10(doublereal *x) +{ + return (log10e * log(*x)); +} +} diff --git a/lib/linalg/d_lmp_sign.cpp b/lib/linalg/d_lmp_sign.cpp new file mode 100644 index 0000000000..fb0a1e79ff --- /dev/null +++ b/lib/linalg/d_lmp_sign.cpp @@ -0,0 +1,12 @@ + +#include "lmp_f2c.h" + +extern "C" { + +double d_lmp_sign(doublereal *a, doublereal *b) +{ + double x; + x = (*a >= 0 ? *a : -*a); + return (*b >= 0 ? x : -x); +} +} diff --git a/lib/linalg/dbdsqr.cpp b/lib/linalg/dbdsqr.cpp index 5f5c1b1d6f..e8fef63745 100644 --- a/lib/linalg/dbdsqr.cpp +++ b/lib/linalg/dbdsqr.cpp @@ -274,7 +274,7 @@ f"> */ doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ - double pow_dd(doublereal *, doublereal *), sqrt(doublereal), d_sign( + double pow_lmp_dd(doublereal *, doublereal *), sqrt(doublereal), d_lmp_sign( doublereal *, doublereal *); /* Local variables */ @@ -454,7 +454,7 @@ f"> */ /* Computing MAX */ /* Computing MIN */ - d__3 = 100., d__4 = pow_dd(&eps, &c_b15); + d__3 = 100., d__4 = pow_lmp_dd(&eps, &c_b15); d__1 = 10., d__2 = min(d__3,d__4); tolmul = max(d__1,d__2); tol = tolmul * eps; @@ -852,7 +852,7 @@ L90: /* Chase bulge from top to bottom */ /* Save cosines and sines for later singular vector updates */ - f = ((d__1 = d__[ll], abs(d__1)) - shift) * (d_sign(&c_b49, &d__[ + f = ((d__1 = d__[ll], abs(d__1)) - shift) * (d_lmp_sign(&c_b49, &d__[ ll]) + shift / d__[ll]); g = e[ll]; i__1 = m - 1; @@ -912,7 +912,7 @@ L90: /* Chase bulge from bottom to top */ /* Save cosines and sines for later singular vector updates */ - f = ((d__1 = d__[m], abs(d__1)) - shift) * (d_sign(&c_b49, &d__[m] + f = ((d__1 = d__[m], abs(d__1)) - shift) * (d_lmp_sign(&c_b49, &d__[m] ) + shift / d__[m]); g = e[m - 1]; i__1 = ll + 1; diff --git a/lib/linalg/dcabs1.cpp b/lib/linalg/dcabs1.cpp index bdaf645a57..54b2b57eab 100644 --- a/lib/linalg/dcabs1.cpp +++ b/lib/linalg/dcabs1.cpp @@ -66,7 +66,7 @@ doublereal dcabs1_(doublecomplex *z__) doublereal ret_val, d__1, d__2; /* Builtin functions */ - double d_imag(doublecomplex *); + double d_lmp_imag(doublecomplex *); /* -- Reference BLAS level1 routine -- */ @@ -80,7 +80,7 @@ doublereal dcabs1_(doublecomplex *z__) /* .. Intrinsic Functions .. */ - ret_val = (d__1 = z__->r, abs(d__1)) + (d__2 = d_imag(z__), abs(d__2)); + ret_val = (d__1 = z__->r, abs(d__1)) + (d__2 = d_lmp_imag(z__), abs(d__2)); return ret_val; /* End of DCABS1 */ diff --git a/lib/linalg/dgesvd.cpp b/lib/linalg/dgesvd.cpp index 6a2e70640f..b5f4f1e8de 100644 --- a/lib/linalg/dgesvd.cpp +++ b/lib/linalg/dgesvd.cpp @@ -248,7 +248,7 @@ f"> */ char ch__1[2]; /* Builtin functions */ - /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); double sqrt(doublereal); /* Local variables */ @@ -391,7 +391,7 @@ f"> */ /* Writing concatenation */ i__1[0] = 1, a__1[0] = jobu; i__1[1] = 1, a__1[1] = jobvt; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); mnthr = ilaenv_(&c__6, (char *)"DGESVD", ch__1, m, n, &c__0, &c__0, ( ftnlen)6, (ftnlen)2); bdspac = *n * 5; @@ -650,7 +650,7 @@ f"> */ /* Writing concatenation */ i__1[0] = 1, a__1[0] = jobu; i__1[1] = 1, a__1[1] = jobvt; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); mnthr = ilaenv_(&c__6, (char *)"DGESVD", ch__1, m, n, &c__0, &c__0, ( ftnlen)6, (ftnlen)2); bdspac = *m * 5; diff --git a/lib/linalg/dlabad.cpp b/lib/linalg/dlabad.cpp index a753834632..45de813f49 100644 --- a/lib/linalg/dlabad.cpp +++ b/lib/linalg/dlabad.cpp @@ -93,7 +93,7 @@ f"> */ /* Subroutine */ int dlabad_(doublereal *small, doublereal *large) { /* Builtin functions */ - double d_lg10(doublereal *), sqrt(doublereal); + double d_lmp_lg10(doublereal *), sqrt(doublereal); /* -- LAPACK auxiliary routine -- */ @@ -112,7 +112,7 @@ f"> */ /* If it looks like we're on a Cray, take the square root of */ /* SMALL and LARGE to avoid overflow and underflow problems. */ - if (d_lg10(large) > 2e3) { + if (d_lmp_lg10(large) > 2e3) { *small = sqrt(*small); *large = sqrt(*large); } diff --git a/lib/linalg/dlacn2.cpp b/lib/linalg/dlacn2.cpp index 7293447d88..bee9fb7e25 100644 --- a/lib/linalg/dlacn2.cpp +++ b/lib/linalg/dlacn2.cpp @@ -165,7 +165,7 @@ f"> */ doublereal d__1; /* Builtin functions */ - integer i_dnnt(doublereal *); + integer i_lmp_dnnt(doublereal *); /* Local variables */ integer i__; @@ -246,7 +246,7 @@ L20: } else { x[i__] = -1.; } - isgn[i__] = i_dnnt(&x[i__]); + isgn[i__] = i_lmp_dnnt(&x[i__]); /* L30: */ } *kase = 2; @@ -287,7 +287,7 @@ L70: } else { xs = -1.; } - if (i_dnnt(&xs) != isgn[i__]) { + if (i_lmp_dnnt(&xs) != isgn[i__]) { goto L90; } /* L80: */ @@ -308,7 +308,7 @@ L90: } else { x[i__] = -1.; } - isgn[i__] = i_dnnt(&x[i__]); + isgn[i__] = i_lmp_dnnt(&x[i__]); /* L100: */ } *kase = 2; diff --git a/lib/linalg/dlaed0.cpp b/lib/linalg/dlaed0.cpp index 68fee93814..5c40115e77 100644 --- a/lib/linalg/dlaed0.cpp +++ b/lib/linalg/dlaed0.cpp @@ -208,7 +208,7 @@ f"> */ /* Builtin functions */ double log(doublereal); - integer pow_ii(integer *, integer *); + integer pow_lmp_ii(integer *, integer *); /* Local variables */ integer i__, j, k, iq, lgn, msd2, smm1, spm1, spm2; @@ -354,10 +354,10 @@ L10: temp = log((doublereal) (*n)) / log(2.); lgn = (integer) temp; - if (pow_ii(&c__2, &lgn) < *n) { + if (pow_lmp_ii(&c__2, &lgn) < *n) { ++lgn; } - if (pow_ii(&c__2, &lgn) < *n) { + if (pow_lmp_ii(&c__2, &lgn) < *n) { ++lgn; } iprmpt = indxq + *n + 1; diff --git a/lib/linalg/dlaed3.cpp b/lib/linalg/dlaed3.cpp index c1f5e908dc..5c7d2a8596 100644 --- a/lib/linalg/dlaed3.cpp +++ b/lib/linalg/dlaed3.cpp @@ -217,7 +217,7 @@ f"> */ doublereal d__1; /* Builtin functions */ - double sqrt(doublereal), d_sign(doublereal *, doublereal *); + double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); /* Local variables */ integer i__, j, n2, n12, ii, n23, iq2; @@ -374,7 +374,7 @@ f"> */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { d__1 = sqrt(-w[i__]); - w[i__] = d_sign(&d__1, &s[i__]); + w[i__] = d_lmp_sign(&d__1, &s[i__]); /* L70: */ } diff --git a/lib/linalg/dlaed6.cpp b/lib/linalg/dlaed6.cpp index aae975971f..d884bbd67e 100644 --- a/lib/linalg/dlaed6.cpp +++ b/lib/linalg/dlaed6.cpp @@ -165,7 +165,7 @@ f"> */ doublereal d__1, d__2, d__3, d__4; /* Builtin functions */ - double sqrt(doublereal), log(doublereal), pow_di(doublereal *, integer *); + double sqrt(doublereal), log(doublereal), pow_lmp_di(doublereal *, integer *); /* Local variables */ doublereal a, b, c__, f; @@ -281,7 +281,7 @@ f"> */ eps = dlamch_((char *)"Epsilon", (ftnlen)7); base = dlamch_((char *)"Base", (ftnlen)4); i__1 = (integer) (log(dlamch_((char *)"SafMin", (ftnlen)6)) / log(base) / 3.); - small1 = pow_di(&base, &i__1); + small1 = pow_lmp_di(&base, &i__1); sminv1 = 1. / small1; small2 = small1 * small1; sminv2 = sminv1 * sminv1; diff --git a/lib/linalg/dlaed7.cpp b/lib/linalg/dlaed7.cpp index 1751f93559..bc763aa9df 100644 --- a/lib/linalg/dlaed7.cpp +++ b/lib/linalg/dlaed7.cpp @@ -293,7 +293,7 @@ f"> */ integer q_dim1, q_offset, i__1, i__2; /* Builtin functions */ - integer pow_ii(integer *, integer *); + integer pow_lmp_ii(integer *, integer *); /* Local variables */ integer i__, k, n1, n2, is, iw, iz, iq2, ptr, ldq2, indx, curr; @@ -408,11 +408,11 @@ f"> */ /* Form the z-vector which consists of the last row of Q_1 and the */ /* first row of Q_2. */ - ptr = pow_ii(&c__2, tlvls) + 1; + ptr = pow_lmp_ii(&c__2, tlvls) + 1; i__1 = *curlvl - 1; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *tlvls - i__; - ptr += pow_ii(&c__2, &i__2); + ptr += pow_lmp_ii(&c__2, &i__2); /* L10: */ } curr = ptr + *curpbm; diff --git a/lib/linalg/dlaed9.cpp b/lib/linalg/dlaed9.cpp index d6a4f8bca3..f6f01b7098 100644 --- a/lib/linalg/dlaed9.cpp +++ b/lib/linalg/dlaed9.cpp @@ -186,7 +186,7 @@ f"> */ doublereal d__1; /* Builtin functions */ - double sqrt(doublereal), d_sign(doublereal *, doublereal *); + double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); /* Local variables */ integer i__, j; @@ -336,7 +336,7 @@ f"> */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { d__1 = sqrt(-w[i__]); - w[i__] = d_sign(&d__1, &s[i__ + s_dim1]); + w[i__] = d_lmp_sign(&d__1, &s[i__ + s_dim1]); /* L80: */ } diff --git a/lib/linalg/dlaeda.cpp b/lib/linalg/dlaeda.cpp index 39b4c8810f..81389d8db0 100644 --- a/lib/linalg/dlaeda.cpp +++ b/lib/linalg/dlaeda.cpp @@ -198,7 +198,7 @@ f"> */ integer i__1, i__2, i__3; /* Builtin functions */ - integer pow_ii(integer *, integer *); + integer pow_lmp_ii(integer *, integer *); double sqrt(doublereal); /* Local variables */ @@ -277,7 +277,7 @@ f"> */ /* scheme */ i__1 = *curlvl - 1; - curr = ptr + *curpbm * pow_ii(&c__2, curlvl) + pow_ii(&c__2, &i__1) - 1; + curr = ptr + *curpbm * pow_lmp_ii(&c__2, curlvl) + pow_lmp_ii(&c__2, &i__1) - 1; /* Determine size of these matrices. We add HALF to the value of */ /* the SQRT in case the machine underestimates one of these square */ @@ -304,12 +304,12 @@ f"> */ /* rotations and permutation and then multiplying the center matrices */ /* against the current Z. */ - ptr = pow_ii(&c__2, tlvls) + 1; + ptr = pow_lmp_ii(&c__2, tlvls) + 1; i__1 = *curlvl - 1; for (k = 1; k <= i__1; ++k) { i__2 = *curlvl - k; i__3 = *curlvl - k - 1; - curr = ptr + *curpbm * pow_ii(&c__2, &i__2) + pow_ii(&c__2, &i__3) - + curr = ptr + *curpbm * pow_lmp_ii(&c__2, &i__2) + pow_lmp_ii(&c__2, &i__3) - 1; psiz1 = prmptr[curr + 1] - prmptr[curr]; psiz2 = prmptr[curr + 2] - prmptr[curr + 1]; @@ -371,7 +371,7 @@ f"> */ c__1); i__2 = *tlvls - k; - ptr += pow_ii(&c__2, &i__2); + ptr += pow_lmp_ii(&c__2, &i__2); /* L70: */ } diff --git a/lib/linalg/dlalsa.cpp b/lib/linalg/dlalsa.cpp index e68dabd8dd..a428ee8c3d 100644 --- a/lib/linalg/dlalsa.cpp +++ b/lib/linalg/dlalsa.cpp @@ -302,7 +302,7 @@ f"> */ i__2; /* Builtin functions */ - integer pow_ii(integer *, integer *); + integer pow_lmp_ii(integer *, integer *); /* Local variables */ integer i__, j, i1, ic, lf, nd, ll, nl, nr, im1, nlf, nrf, lvl, ndb1, @@ -469,7 +469,7 @@ f"> */ /* Finally go through the left singular vector matrices of all */ /* the other subproblems bottom-up on the tree. */ - j = pow_ii(&c__2, &nlvl); + j = pow_lmp_ii(&c__2, &nlvl); sqre = 0; for (lvl = nlvl; lvl >= 1; --lvl) { @@ -483,7 +483,7 @@ f"> */ ll = 1; } else { i__1 = lvl - 1; - lf = pow_ii(&c__2, &i__1); + lf = pow_lmp_ii(&c__2, &i__1); ll = (lf << 1) - 1; } i__1 = ll; @@ -528,7 +528,7 @@ L50: ll = 1; } else { i__2 = lvl - 1; - lf = pow_ii(&c__2, &i__2); + lf = pow_lmp_ii(&c__2, &i__2); ll = (lf << 1) - 1; } i__2 = lf; diff --git a/lib/linalg/dlalsd.cpp b/lib/linalg/dlalsd.cpp index a141fa6992..f3678a1bfd 100644 --- a/lib/linalg/dlalsd.cpp +++ b/lib/linalg/dlalsd.cpp @@ -211,7 +211,7 @@ f"> */ doublereal d__1; /* Builtin functions */ - double log(doublereal), d_sign(doublereal *, doublereal *); + double log(doublereal), d_lmp_sign(doublereal *, doublereal *); /* Local variables */ integer c__, i__, j, k; @@ -470,7 +470,7 @@ f"> */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = d__[i__], abs(d__1)) < eps) { - d__[i__] = d_sign(&eps, &d__[i__]); + d__[i__] = d_lmp_sign(&eps, &d__[i__]); } /* L50: */ } diff --git a/lib/linalg/dlamc3.cpp b/lib/linalg/dlamc3.cpp new file mode 100644 index 0000000000..a7dbd89bc0 --- /dev/null +++ b/lib/linalg/dlamc3.cpp @@ -0,0 +1,68 @@ +/* static/dlamc3.f -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lmp_f2c.h" + +/* > \brief \b DLAMC3 */ +/* > \details */ +/* > \b Purpose: */ +/* > \verbatim */ +/* > DLAMC3 is intended to force A and B to be stored prior to doing */ +/* > the addition of A and B , for use in situations where optimizers */ +/* > might hold one of these in a register. */ +/* > \endverbatim */ +/* > \author LAPACK is a software package provided by Univ. of Tennessee, Univ. of California Berkeley, Univ. +of Colorado Denver and NAG Ltd.. */ +/* > \date December 2016 */ +/* > \ingroup auxOTHERauxiliary */ +/* > */ +/* > \param[in] A */ +/* > \verbatim */ +/* > A is a DOUBLE PRECISION */ +/* > \endverbatim */ +/* > */ +/* > \param[in] B */ +/* > \verbatim */ +/* > B is a DOUBLE PRECISION */ +/* > The values A and B. */ +/* > \endverbatim */ +/* > */ +doublereal dlamc3_(doublereal *a, doublereal *b) +{ + /* System generated locals */ + doublereal ret_val; + + +/* -- LAPACK auxiliary routine (version 3.7.0) -- */ +/* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ +/* November 2010 */ + +/* .. Scalar Arguments .. */ +/* .. */ +/* ===================================================================== */ + +/* .. Executable Statements .. */ + + ret_val = *a + *b; + + return ret_val; + +/* End of DLAMC3 */ + +} /* dlamc3_ */ + +#ifdef __cplusplus + } +#endif diff --git a/lib/linalg/dlarfg.cpp b/lib/linalg/dlarfg.cpp index 6693e1edb6..546db1171e 100644 --- a/lib/linalg/dlarfg.cpp +++ b/lib/linalg/dlarfg.cpp @@ -130,7 +130,7 @@ f"> */ doublereal d__1; /* Builtin functions */ - double d_sign(doublereal *, doublereal *); + double d_lmp_sign(doublereal *, doublereal *); /* Local variables */ integer j, knt; @@ -189,7 +189,7 @@ f"> */ /* general case */ d__1 = dlapy2_(alpha, &xnorm); - beta = -d_sign(&d__1, alpha); + beta = -d_lmp_sign(&d__1, alpha); safmin = dlamch_((char *)"S", (ftnlen)1) / dlamch_((char *)"E", (ftnlen)1); knt = 0; if (abs(beta) < safmin) { @@ -212,7 +212,7 @@ L10: i__1 = *n - 1; xnorm = dnrm2_(&i__1, &x[1], incx); d__1 = dlapy2_(alpha, &xnorm); - beta = -d_sign(&d__1, alpha); + beta = -d_lmp_sign(&d__1, alpha); } *tau = (beta - *alpha) / beta; i__1 = *n - 1; diff --git a/lib/linalg/dlartg.cpp b/lib/linalg/dlartg.cpp index 3f5832318e..c18a8c6d43 100644 --- a/lib/linalg/dlartg.cpp +++ b/lib/linalg/dlartg.cpp @@ -123,7 +123,7 @@ f"> */ doublereal d__1, d__2; /* Builtin functions */ - double log(doublereal), pow_di(doublereal *, integer *), sqrt(doublereal); + double log(doublereal), pow_lmp_di(doublereal *, integer *), sqrt(doublereal); /* Local variables */ integer i__; @@ -166,7 +166,7 @@ f"> */ eps = dlamch_((char *)"E", (ftnlen)1); d__1 = dlamch_((char *)"B", (ftnlen)1); i__1 = (integer) (log(safmin / eps) / log(dlamch_((char *)"B", (ftnlen)1)) / 2.); - safmn2 = pow_di(&d__1, &i__1); + safmn2 = pow_lmp_di(&d__1, &i__1); safmx2 = 1. / safmn2; /* FIRST = .FALSE. */ /* END IF */ diff --git a/lib/linalg/dlasd8.cpp b/lib/linalg/dlasd8.cpp index 3ec481bb55..5d0890e27b 100644 --- a/lib/linalg/dlasd8.cpp +++ b/lib/linalg/dlasd8.cpp @@ -198,7 +198,7 @@ f"> */ doublereal d__1, d__2; /* Builtin functions */ - double sqrt(doublereal), d_sign(doublereal *, doublereal *); + double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); /* Local variables */ integer i__, j; @@ -368,7 +368,7 @@ f"> */ i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { d__2 = sqrt((d__1 = work[iwk3i + i__], abs(d__1))); - z__[i__] = d_sign(&d__2, &z__[i__]); + z__[i__] = d_lmp_sign(&d__2, &z__[i__]); /* L50: */ } diff --git a/lib/linalg/dlasda.cpp b/lib/linalg/dlasda.cpp index d064a9af51..b50a48f625 100644 --- a/lib/linalg/dlasda.cpp +++ b/lib/linalg/dlasda.cpp @@ -310,7 +310,7 @@ f"> */ z_dim1, z_offset, i__1, i__2; /* Builtin functions */ - integer pow_ii(integer *, integer *); + integer pow_lmp_ii(integer *, integer *); /* Local variables */ integer i__, j, m, i1, ic, lf, nd, ll, nl, vf, nr, vl, im1, ncc, nlf, nrf, @@ -553,7 +553,7 @@ f"> */ /* Now conquer each subproblem bottom-up. */ - j = pow_ii(&c__2, &nlvl); + j = pow_lmp_ii(&c__2, &nlvl); for (lvl = nlvl; lvl >= 1; --lvl) { lvl2 = (lvl << 1) - 1; @@ -565,7 +565,7 @@ f"> */ ll = 1; } else { i__1 = lvl - 1; - lf = pow_ii(&c__2, &i__1); + lf = pow_lmp_ii(&c__2, &i__1); ll = (lf << 1) - 1; } i__1 = ll; diff --git a/lib/linalg/dlasv2.cpp b/lib/linalg/dlasv2.cpp index 7bab630b39..7dde3369fc 100644 --- a/lib/linalg/dlasv2.cpp +++ b/lib/linalg/dlasv2.cpp @@ -167,7 +167,7 @@ f"> */ doublereal d__1; /* Builtin functions */ - double sqrt(doublereal), d_sign(doublereal *, doublereal *); + double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); /* Local variables */ doublereal a, d__, l, m, r__, s, t, fa, ga, ha, ft, gt, ht, mm, tt, clt, @@ -305,9 +305,9 @@ f"> */ /* Note that M is very tiny */ if (l == 0.) { - t = d_sign(&c_b3, &ft) * d_sign(&c_b4, >); + t = d_lmp_sign(&c_b3, &ft) * d_lmp_sign(&c_b4, >); } else { - t = gt / d_sign(&d__, &ft) + m / t; + t = gt / d_lmp_sign(&d__, &ft) + m / t; } } else { t = (m / (s + t) + m / (r__ + l)) * (a + 1.); @@ -334,17 +334,17 @@ f"> */ /* Correct signs of SSMAX and SSMIN */ if (pmax == 1) { - tsign = d_sign(&c_b4, csr) * d_sign(&c_b4, csl) * d_sign(&c_b4, f); + tsign = d_lmp_sign(&c_b4, csr) * d_lmp_sign(&c_b4, csl) * d_lmp_sign(&c_b4, f); } if (pmax == 2) { - tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, csl) * d_sign(&c_b4, g); + tsign = d_lmp_sign(&c_b4, snr) * d_lmp_sign(&c_b4, csl) * d_lmp_sign(&c_b4, g); } if (pmax == 3) { - tsign = d_sign(&c_b4, snr) * d_sign(&c_b4, snl) * d_sign(&c_b4, h__); + tsign = d_lmp_sign(&c_b4, snr) * d_lmp_sign(&c_b4, snl) * d_lmp_sign(&c_b4, h__); } - *ssmax = d_sign(ssmax, &tsign); - d__1 = tsign * d_sign(&c_b4, f) * d_sign(&c_b4, h__); - *ssmin = d_sign(ssmin, &d__1); + *ssmax = d_lmp_sign(ssmax, &tsign); + d__1 = tsign * d_lmp_sign(&c_b4, f) * d_lmp_sign(&c_b4, h__); + *ssmin = d_lmp_sign(ssmin, &d__1); return 0; /* End of DLASV2 */ diff --git a/lib/linalg/dormbr.cpp b/lib/linalg/dormbr.cpp index 69283d95ef..8d6bdd60b0 100644 --- a/lib/linalg/dormbr.cpp +++ b/lib/linalg/dormbr.cpp @@ -227,7 +227,7 @@ f"> */ char ch__1[2]; /* Builtin functions */ - /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i1, i2, nb, mi, ni, nq, nw; @@ -329,7 +329,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *m - 1; i__2 = *m - 1; nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &i__1, n, &i__2, &c_n1, ( @@ -338,7 +338,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *n - 1; i__2 = *n - 1; nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &i__1, &i__2, &c_n1, ( @@ -349,7 +349,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *m - 1; i__2 = *m - 1; nb = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, &i__1, n, &i__2, &c_n1, ( @@ -358,7 +358,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *n - 1; i__2 = *n - 1; nb = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, m, &i__1, &i__2, &c_n1, ( diff --git a/lib/linalg/dormlq.cpp b/lib/linalg/dormlq.cpp index bb14bbfc98..79106afb5c 100644 --- a/lib/linalg/dormlq.cpp +++ b/lib/linalg/dormlq.cpp @@ -201,7 +201,7 @@ f"> */ char ch__1[2]; /* Builtin functions */ - /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__, i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iwt; @@ -302,7 +302,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, m, n, k, &c_n1, ( ftnlen)6, (ftnlen)2); nb = min(i__1,i__2); @@ -334,7 +334,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMLQ", ch__1, m, n, k, &c_n1, ( ftnlen)6, (ftnlen)2); nbmin = max(i__1,i__2); diff --git a/lib/linalg/dormql.cpp b/lib/linalg/dormql.cpp index 70694ed5f9..eea324bc69 100644 --- a/lib/linalg/dormql.cpp +++ b/lib/linalg/dormql.cpp @@ -201,7 +201,7 @@ f"> */ char ch__1[2]; /* Builtin functions */ - /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__, i1, i2, i3, ib, nb, mi, ni, nq, nw, iwt; @@ -303,7 +303,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMQL", ch__1, m, n, k, &c_n1, (ftnlen)6, (ftnlen)2); nb = min(i__1,i__2); @@ -335,7 +335,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMQL", ch__1, m, n, k, &c_n1, ( ftnlen)6, (ftnlen)2); nbmin = max(i__1,i__2); diff --git a/lib/linalg/dormqr.cpp b/lib/linalg/dormqr.cpp index 17aaab62ba..eb43ba8045 100644 --- a/lib/linalg/dormqr.cpp +++ b/lib/linalg/dormqr.cpp @@ -201,7 +201,7 @@ f"> */ char ch__1[2]; /* Builtin functions */ - /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__, i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iwt; @@ -300,7 +300,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, n, k, &c_n1, ( ftnlen)6, (ftnlen)2); nb = min(i__1,i__2); @@ -332,7 +332,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMQR", ch__1, m, n, k, &c_n1, ( ftnlen)6, (ftnlen)2); nbmin = max(i__1,i__2); diff --git a/lib/linalg/dormtr.cpp b/lib/linalg/dormtr.cpp index a55ee5efbe..0f0cdac3db 100644 --- a/lib/linalg/dormtr.cpp +++ b/lib/linalg/dormtr.cpp @@ -203,7 +203,7 @@ f"> */ char ch__1[2]; /* Builtin functions */ - /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i1, i2, nb, mi, ni, nq, nw; @@ -297,7 +297,7 @@ f"> */ /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *m - 1; i__3 = *m - 1; nb = ilaenv_(&c__1, (char *)"DORMQL", ch__1, &i__2, n, &i__3, &c_n1, ( @@ -306,7 +306,7 @@ f"> */ /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *n - 1; i__3 = *n - 1; nb = ilaenv_(&c__1, (char *)"DORMQL", ch__1, m, &i__2, &i__3, &c_n1, ( @@ -317,7 +317,7 @@ f"> */ /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *m - 1; i__3 = *m - 1; nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &i__2, n, &i__3, &c_n1, ( @@ -326,7 +326,7 @@ f"> */ /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *n - 1; i__3 = *n - 1; nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &i__2, &i__3, &c_n1, ( diff --git a/lib/linalg/dstedc.cpp b/lib/linalg/dstedc.cpp index f1b09e0f25..1a55346056 100644 --- a/lib/linalg/dstedc.cpp +++ b/lib/linalg/dstedc.cpp @@ -223,7 +223,7 @@ f"> */ /* Builtin functions */ double log(doublereal); - integer pow_ii(integer *, integer *); + integer pow_lmp_ii(integer *, integer *); double sqrt(doublereal); /* Local variables */ @@ -336,10 +336,10 @@ f"> */ lwmin = *n - 1 << 1; } else { lgn = (integer) (log((doublereal) (*n)) / log(2.)); - if (pow_ii(&c__2, &lgn) < *n) { + if (pow_lmp_ii(&c__2, &lgn) < *n) { ++lgn; } - if (pow_ii(&c__2, &lgn) < *n) { + if (pow_lmp_ii(&c__2, &lgn) < *n) { ++lgn; } if (icompz == 1) { diff --git a/lib/linalg/dsteqr.cpp b/lib/linalg/dsteqr.cpp index 62a13f9d0b..2f590595e7 100644 --- a/lib/linalg/dsteqr.cpp +++ b/lib/linalg/dsteqr.cpp @@ -164,7 +164,7 @@ f"> */ doublereal d__1, d__2; /* Builtin functions */ - double sqrt(doublereal), d_sign(doublereal *, doublereal *); + double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); /* Local variables */ doublereal b, c__, f, g; @@ -441,7 +441,7 @@ L60: g = (d__[l + 1] - p) / (e[l] * 2.); r__ = dlapy2_(&g, &c_b10); - g = d__[m] - p + e[l] / (g + d_sign(&r__, &g)); + g = d__[m] - p + e[l] / (g + d_lmp_sign(&r__, &g)); s = 1.; c__ = 1.; @@ -564,7 +564,7 @@ L110: g = (d__[l - 1] - p) / (e[l - 1] * 2.); r__ = dlapy2_(&g, &c_b10); - g = d__[m] - p + e[l - 1] / (g + d_sign(&r__, &g)); + g = d__[m] - p + e[l - 1] / (g + d_lmp_sign(&r__, &g)); s = 1.; c__ = 1.; diff --git a/lib/linalg/dsterf.cpp b/lib/linalg/dsterf.cpp index 981374d32a..687cbf943b 100644 --- a/lib/linalg/dsterf.cpp +++ b/lib/linalg/dsterf.cpp @@ -116,7 +116,7 @@ f"> */ doublereal d__1, d__2, d__3; /* Builtin functions */ - double sqrt(doublereal), d_sign(doublereal *, doublereal *); + double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); /* Local variables */ doublereal c__; @@ -342,7 +342,7 @@ L70: rte = sqrt(e[l]); sigma = (d__[l + 1] - p) / (rte * 2.); r__ = dlapy2_(&sigma, &c_b33); - sigma = p - rte / (sigma + d_sign(&r__, &sigma)); + sigma = p - rte / (sigma + d_lmp_sign(&r__, &sigma)); c__ = 1.; s = 0.; @@ -440,7 +440,7 @@ L120: rte = sqrt(e[l - 1]); sigma = (d__[l - 1] - p) / (rte * 2.); r__ = dlapy2_(&sigma, &c_b33); - sigma = p - rte / (sigma + d_sign(&r__, &sigma)); + sigma = p - rte / (sigma + d_lmp_sign(&r__, &sigma)); c__ = 1.; s = 0.; diff --git a/lib/linalg/dtrtri.cpp b/lib/linalg/dtrtri.cpp index a80ece791c..91742619b0 100644 --- a/lib/linalg/dtrtri.cpp +++ b/lib/linalg/dtrtri.cpp @@ -142,7 +142,7 @@ f"> */ char ch__1[2]; /* Builtin functions */ - /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer j, jb, nb, nn; @@ -235,7 +235,7 @@ f"> */ /* Writing concatenation */ i__2[0] = 1, a__1[0] = uplo; i__2[1] = 1, a__1[1] = diag; - s_cat(ch__1, a__1, i__2, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__2, &c__2, (ftnlen)2); nb = ilaenv_(&c__1, (char *)"DTRTRI", ch__1, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( ftnlen)2); if (nb <= 1 || nb >= *n) { diff --git a/lib/linalg/dznrm2.cpp b/lib/linalg/dznrm2.cpp index 7a92e63831..5041b7280e 100644 --- a/lib/linalg/dznrm2.cpp +++ b/lib/linalg/dznrm2.cpp @@ -97,7 +97,7 @@ doublereal dznrm2_(integer *n, doublecomplex *x, integer *incx) doublereal ret_val, d__1; /* Builtin functions */ - double d_imag(doublecomplex *), sqrt(doublereal); + double d_lmp_imag(doublecomplex *), sqrt(doublereal); /* Local variables */ integer ix; @@ -153,8 +153,8 @@ doublereal dznrm2_(integer *n, doublecomplex *x, integer *incx) ssq += d__1 * d__1; } } - if (d_imag(&x[ix]) != 0.) { - temp = (d__1 = d_imag(&x[ix]), abs(d__1)); + if (d_lmp_imag(&x[ix]) != 0.) { + temp = (d__1 = d_lmp_imag(&x[ix]), abs(d__1)); if (scale < temp) { /* Computing 2nd power */ d__1 = scale / temp; diff --git a/lib/linalg/i_lmp_dnnt.cpp b/lib/linalg/i_lmp_dnnt.cpp new file mode 100644 index 0000000000..8050697bb9 --- /dev/null +++ b/lib/linalg/i_lmp_dnnt.cpp @@ -0,0 +1,12 @@ + +#include "lmp_f2c.h" + +#undef abs +#include + +extern "C" { +integer i_lmp_dnnt(doublereal *x) +{ + return (integer)(*x >= 0. ? floor(*x + .5) : -floor(.5 - *x)); +} +} diff --git a/lib/linalg/i_lmp_len.cpp b/lib/linalg/i_lmp_len.cpp new file mode 100644 index 0000000000..b6101b29ad --- /dev/null +++ b/lib/linalg/i_lmp_len.cpp @@ -0,0 +1,10 @@ + +#include "lmp_f2c.h" + +extern "C" { + +integer i_lmp_len(char *s, ftnlen n) +{ + return (n); +} +} diff --git a/lib/linalg/i_lmp_nint.cpp b/lib/linalg/i_lmp_nint.cpp new file mode 100644 index 0000000000..f41ca6b3eb --- /dev/null +++ b/lib/linalg/i_lmp_nint.cpp @@ -0,0 +1,13 @@ + +#include "lmp_f2c.h" +#undef abs + +#include + +extern "C" { + +integer i_lmp_nint(real *x) +{ + return (integer)(*x >= 0 ? floor(*x + .5) : -floor(.5 - *x)); +} +} diff --git a/lib/linalg/ilaenv.cpp b/lib/linalg/ilaenv.cpp index 6c94f00e6f..355b2a9429 100644 --- a/lib/linalg/ilaenv.cpp +++ b/lib/linalg/ilaenv.cpp @@ -193,8 +193,8 @@ integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, integer ret_val, i__1, i__2, i__3; /* Builtin functions */ - /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); - integer i_len(char *, ftnlen), s_cmp(char *, char *, ftnlen, ftnlen); + /* Subroutine */ int s_lmp_copy(char *, char *, ftnlen, ftnlen); + integer i_lmp_len(char *, ftnlen), s_lmp_cmp(char *, char *, ftnlen, ftnlen); /* Local variables */ logical twostage; @@ -257,7 +257,7 @@ L10: /* Convert NAME to upper case if the first character is lower case. */ ret_val = 1; - s_copy(subnam, name__, (ftnlen)16, name_len); + s_lmp_copy(subnam, name__, (ftnlen)16, name_len); ic = *(unsigned char *)subnam; iz = 'Z'; if (iz == 90 || iz == 122) { @@ -314,10 +314,10 @@ L10: if (! (cname || sname)) { return ret_val; } - s_copy(c2, subnam + 1, (ftnlen)2, (ftnlen)2); - s_copy(c3, subnam + 3, (ftnlen)3, (ftnlen)3); - s_copy(c4, c3 + 1, (ftnlen)2, (ftnlen)2); - twostage = i_len(subnam, (ftnlen)16) >= 11 && *(unsigned char *)&subnam[ + s_lmp_copy(c2, subnam + 1, (ftnlen)2, (ftnlen)2); + s_lmp_copy(c3, subnam + 3, (ftnlen)3, (ftnlen)3); + s_lmp_copy(c4, c3 + 1, (ftnlen)2, (ftnlen)2); + twostage = i_lmp_len(subnam, (ftnlen)16) >= 11 && *(unsigned char *)&subnam[ 10] == '2'; switch (*ispec) { @@ -336,7 +336,7 @@ L50: nb = 1; - if (s_cmp(subnam + 1, (char *)"LAORH", (ftnlen)5, (ftnlen)5) == 0) { + if (s_lmp_cmp(subnam + 1, (char *)"LAORH", (ftnlen)5, (ftnlen)5) == 0) { /* This is for *LAORHR_GETRFNP routine */ @@ -345,23 +345,23 @@ L50: } else { nb = 32; } - } else if (s_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } - } else if (s_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, - (char *)"RQF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"LQF", (ftnlen) - 3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) + } else if (s_lmp_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_lmp_cmp(c3, + (char *)"RQF", (ftnlen)3, (ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"LQF", (ftnlen) + 3, (ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } - } else if (s_cmp(c3, (char *)"QR ", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"QR ", (ftnlen)3, (ftnlen)3) == 0) { if (*n3 == 1) { if (sname) { /* M*N */ @@ -384,7 +384,7 @@ L50: nb = 1; } } - } else if (s_cmp(c3, (char *)"LQ ", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"LQ ", (ftnlen)3, (ftnlen)3) == 0) { if (*n3 == 2) { if (sname) { /* M*N */ @@ -407,35 +407,35 @@ L50: nb = 1; } } - } else if (s_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } - } else if (s_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } - } else if (s_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } - } else if (s_cmp(c2, (char *)"PO", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c2, (char *)"PO", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } } - } else if (s_cmp(c2, (char *)"SY", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c2, (char *)"SY", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { if (twostage) { nb = 192; @@ -449,65 +449,65 @@ L50: nb = 64; } } - } else if (sname && s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + } else if (sname && s_lmp_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { nb = 32; - } else if (sname && s_cmp(c3, (char *)"GST", (ftnlen)3, (ftnlen)3) == 0) { + } else if (sname && s_lmp_cmp(c3, (char *)"GST", (ftnlen)3, (ftnlen)3) == 0) { nb = 64; } - } else if (cname && s_cmp(c2, (char *)"HE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + } else if (cname && s_lmp_cmp(c2, (char *)"HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { if (twostage) { nb = 192; } else { nb = 64; } - } else if (s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { nb = 32; - } else if (s_cmp(c3, (char *)"GST", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"GST", (ftnlen)3, (ftnlen)3) == 0) { nb = 64; } - } else if (sname && s_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { + } else if (sname && s_lmp_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( ftnlen)2, (ftnlen)2) == 0) { nb = 32; } } else if (*(unsigned char *)c3 == 'M') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( ftnlen)2, (ftnlen)2) == 0) { nb = 32; } } - } else if (cname && s_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { + } else if (cname && s_lmp_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( ftnlen)2, (ftnlen)2) == 0) { nb = 32; } } else if (*(unsigned char *)c3 == 'M') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( ftnlen)2, (ftnlen)2) == 0) { nb = 32; } } - } else if (s_cmp(c2, (char *)"GB", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c2, (char *)"GB", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { if (*n4 <= 64) { nb = 1; @@ -522,8 +522,8 @@ L50: } } } - } else if (s_cmp(c2, (char *)"PB", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c2, (char *)"PB", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { if (*n2 <= 64) { nb = 1; @@ -538,20 +538,20 @@ L50: } } } - } else if (s_cmp(c2, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c2, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } - } else if (s_cmp(c3, (char *)"EVC", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"EVC", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } - } else if (s_cmp(c3, (char *)"SYL", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"SYL", (ftnlen)3, (ftnlen)3) == 0) { /* The upper bound is to prevent overly aggressive scaling. */ if (sname) { /* Computing MIN */ @@ -567,27 +567,27 @@ L50: nb = min(i__1,80); } } - } else if (s_cmp(c2, (char *)"LA", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"UUM", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c2, (char *)"LA", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"UUM", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 64; } else { nb = 64; } - } else if (s_cmp(c3, (char *)"TRS", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"TRS", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { nb = 32; } } - } else if (sname && s_cmp(c2, (char *)"ST", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"EBZ", (ftnlen)3, (ftnlen)3) == 0) { + } else if (sname && s_lmp_cmp(c2, (char *)"ST", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"EBZ", (ftnlen)3, (ftnlen)3) == 0) { nb = 1; } - } else if (s_cmp(c2, (char *)"GG", (ftnlen)2, (ftnlen)2) == 0) { + } else if (s_lmp_cmp(c2, (char *)"GG", (ftnlen)2, (ftnlen)2) == 0) { nb = 32; - if (s_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { + if (s_lmp_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { @@ -603,92 +603,92 @@ L60: /* ISPEC = 2: minimum block size */ nbmin = 2; - if (s_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"RQF", ( - ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"LQF", (ftnlen)3, ( - ftnlen)3) == 0 || s_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) + if (s_lmp_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"RQF", ( + ftnlen)3, (ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"LQF", (ftnlen)3, ( + ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } - } else if (s_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } - } else if (s_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } - } else if (s_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"TRI", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { nbmin = 2; } } - } else if (s_cmp(c2, (char *)"SY", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c2, (char *)"SY", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"TRF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nbmin = 8; } else { nbmin = 8; } - } else if (sname && s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + } else if (sname && s_lmp_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { nbmin = 2; } - } else if (cname && s_cmp(c2, (char *)"HE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + } else if (cname && s_lmp_cmp(c2, (char *)"HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { nbmin = 2; } - } else if (sname && s_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { + } else if (sname && s_lmp_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; } } else if (*(unsigned char *)c3 == 'M') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; } } - } else if (cname && s_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { + } else if (cname && s_lmp_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; } } else if (*(unsigned char *)c3 == 'M') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; } } - } else if (s_cmp(c2, (char *)"GG", (ftnlen)2, (ftnlen)2) == 0) { + } else if (s_lmp_cmp(c2, (char *)"GG", (ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; - if (s_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { + if (s_lmp_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { nbmin = 2; } } @@ -700,62 +700,62 @@ L70: /* ISPEC = 3: crossover point */ nx = 0; - if (s_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"RQF", ( - ftnlen)3, (ftnlen)3) == 0 || s_cmp(c3, (char *)"LQF", (ftnlen)3, ( - ftnlen)3) == 0 || s_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) + if (s_lmp_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"RQF", ( + ftnlen)3, (ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"LQF", (ftnlen)3, ( + ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { nx = 128; } - } else if (s_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"HRD", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { nx = 128; } - } else if (s_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c3, (char *)"BRD", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { nx = 128; } } - } else if (s_cmp(c2, (char *)"SY", (ftnlen)2, (ftnlen)2) == 0) { - if (sname && s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(c2, (char *)"SY", (ftnlen)2, (ftnlen)2) == 0) { + if (sname && s_lmp_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { nx = 32; } - } else if (cname && s_cmp(c2, (char *)"HE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { + } else if (cname && s_lmp_cmp(c2, (char *)"HE", (ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c3, (char *)"TRD", (ftnlen)3, (ftnlen)3) == 0) { nx = 32; } - } else if (sname && s_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { + } else if (sname && s_lmp_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( ftnlen)2, (ftnlen)2) == 0) { nx = 128; } } - } else if (cname && s_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { + } else if (cname && s_lmp_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { - if (s_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_cmp(c4, (char *)"BR", ( + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", + (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( + ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == + 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( + c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( ftnlen)2, (ftnlen)2) == 0) { nx = 128; } } - } else if (s_cmp(c2, (char *)"GG", (ftnlen)2, (ftnlen)2) == 0) { + } else if (s_lmp_cmp(c2, (char *)"GG", (ftnlen)2, (ftnlen)2) == 0) { nx = 128; - if (s_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { + if (s_lmp_cmp(c3, (char *)"HD3", (ftnlen)3, (ftnlen)3) == 0) { nx = 128; } } diff --git a/lib/linalg/iparmq.cpp b/lib/linalg/iparmq.cpp index ad22d9f869..0b8e981525 100644 --- a/lib/linalg/iparmq.cpp +++ b/lib/linalg/iparmq.cpp @@ -255,9 +255,9 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer /* Builtin functions */ double log(doublereal); - integer i_nint(real *); - /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); - integer s_cmp(char *, char *, ftnlen, ftnlen); + integer i_lmp_nint(real *); + /* Subroutine */ int s_lmp_copy(char *, char *, ftnlen, ftnlen); + integer s_lmp_cmp(char *, char *, ftnlen, ftnlen); /* Local variables */ integer i__, ic, nh, ns, iz; @@ -293,7 +293,7 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer if (nh >= 150) { /* Computing MAX */ r__1 = log((real) nh) / log((float)2.); - i__1 = 10, i__2 = nh / i_nint(&r__1); + i__1 = 10, i__2 = nh / i_lmp_nint(&r__1); ns = max(i__1,i__2); } if (nh >= 590) { @@ -356,7 +356,7 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer /* Convert NAME to upper case if the first character is lower case. */ ret_val = 0; - s_copy(subnam, name__, (ftnlen)6, name_len); + s_lmp_copy(subnam, name__, (ftnlen)6, name_len); ic = *(unsigned char *)subnam; iz = 'Z'; if (iz == 90 || iz == 122) { @@ -404,21 +404,21 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer } } - if (s_cmp(subnam + 1, (char *)"GGHRD", (ftnlen)5, (ftnlen)5) == 0 || s_cmp( + if (s_lmp_cmp(subnam + 1, (char *)"GGHRD", (ftnlen)5, (ftnlen)5) == 0 || s_lmp_cmp( subnam + 1, (char *)"GGHD3", (ftnlen)5, (ftnlen)5) == 0) { ret_val = 1; if (nh >= 14) { ret_val = 2; } - } else if (s_cmp(subnam + 3, (char *)"EXC", (ftnlen)3, (ftnlen)3) == 0) { + } else if (s_lmp_cmp(subnam + 3, (char *)"EXC", (ftnlen)3, (ftnlen)3) == 0) { if (nh >= 14) { ret_val = 1; } if (nh >= 14) { ret_val = 2; } - } else if (s_cmp(subnam + 1, (char *)"HSEQR", (ftnlen)5, (ftnlen)5) == 0 || - s_cmp(subnam + 1, (char *)"LAQR", (ftnlen)4, (ftnlen)4) == 0) { + } else if (s_lmp_cmp(subnam + 1, (char *)"HSEQR", (ftnlen)5, (ftnlen)5) == 0 || + s_lmp_cmp(subnam + 1, (char *)"LAQR", (ftnlen)4, (ftnlen)4) == 0) { if (ns >= 14) { ret_val = 1; } diff --git a/lib/linalg/pow_lmp_dd.cpp b/lib/linalg/pow_lmp_dd.cpp new file mode 100644 index 0000000000..4963b04bbc --- /dev/null +++ b/lib/linalg/pow_lmp_dd.cpp @@ -0,0 +1,12 @@ + +#include "lmp_f2c.h" +#undef abs + +#include + +extern "C" { +double pow_lmp_dd(doublereal *ap, doublereal *bp) +{ + return (pow(*ap, *bp)); +} +} diff --git a/lib/linalg/pow_lmp_di.cpp b/lib/linalg/pow_lmp_di.cpp new file mode 100644 index 0000000000..9c3d89d536 --- /dev/null +++ b/lib/linalg/pow_lmp_di.cpp @@ -0,0 +1,31 @@ + +#include "lmp_f2c.h" + +extern "C" { + +double pow_lmp_di(doublereal *ap, integer *bp) +{ + double pow, x; + integer n; + unsigned long u; + + pow = 1; + x = *ap; + n = *bp; + + if (n != 0) { + if (n < 0) { + n = -n; + x = 1 / x; + } + for (u = n;;) { + if (u & 01) pow *= x; + if (u >>= 1) + x *= x; + else + break; + } + } + return (pow); +} +} diff --git a/lib/linalg/pow_lmp_ii.cpp b/lib/linalg/pow_lmp_ii.cpp new file mode 100644 index 0000000000..ff28c8fd5a --- /dev/null +++ b/lib/linalg/pow_lmp_ii.cpp @@ -0,0 +1,29 @@ + +#include "lmp_f2c.h" + +extern "C" { + +integer pow_lmp_ii(integer *ap, integer *bp) +{ + integer pow, x, n; + unsigned long u; + + x = *ap; + n = *bp; + + if (n <= 0) { + if (n == 0 || x == 1) return 1; + if (x != -1) return x == 0 ? 1 / x : 0; + n = -n; + } + u = n; + for (pow = 1;;) { + if (u & 01) pow *= x; + if (u >>= 1) + x *= x; + else + break; + } + return (pow); +} +} diff --git a/lib/linalg/s_lmp_cat.cpp b/lib/linalg/s_lmp_cat.cpp new file mode 100644 index 0000000000..323b0b671d --- /dev/null +++ b/lib/linalg/s_lmp_cat.cpp @@ -0,0 +1,23 @@ + +#include "lmp_f2c.h" + +// concatenate two strings + +extern "C" { +void s_lmp_cat(char *lp, char *rpp[], ftnint rnp[], ftnint *np, ftnlen ll) +{ + ftnlen i, nc; + char *rp; + ftnlen n = *np; + for (i = 0; i < n; ++i) { + nc = ll; + if (rnp[i] < nc) nc = rnp[i]; + ll -= nc; + rp = rpp[i]; + while (--nc >= 0) + *lp++ = *rp++; + } + while (--ll >= 0) + *lp++ = ' '; +} +} diff --git a/lib/linalg/s_lmp_cmp.cpp b/lib/linalg/s_lmp_cmp.cpp new file mode 100644 index 0000000000..b51817defa --- /dev/null +++ b/lib/linalg/s_lmp_cmp.cpp @@ -0,0 +1,45 @@ + +#include "lmp_f2c.h" + +extern "C" { + +// compare two strings + +integer s_lmp_cmp(char *a0, char *b0, ftnlen la, ftnlen lb) +{ + register unsigned char *a, *aend, *b, *bend; + a = (unsigned char *)a0; + b = (unsigned char *)b0; + aend = a + la; + bend = b + lb; + + if (la <= lb) { + while (a < aend) + if (*a != *b) + return (*a - *b); + else { + ++a; + ++b; + } + + while (b < bend) + if (*b != ' ') + return (' ' - *b); + else + ++b; + } else { + while (b < bend) + if (*a == *b) { + ++a; + ++b; + } else + return (*a - *b); + while (a < aend) + if (*a != ' ') + return (*a - ' '); + else + ++a; + } + return (0); +} +} diff --git a/lib/linalg/s_lmp_copy.cpp b/lib/linalg/s_lmp_copy.cpp new file mode 100644 index 0000000000..9b432e08ca --- /dev/null +++ b/lib/linalg/s_lmp_copy.cpp @@ -0,0 +1,26 @@ + +#include "lmp_f2c.h" + +extern "C" { + +/* assign strings: a = b */ + +void s_lmp_copy(register char *a, register char *b, ftnlen la, ftnlen lb) +{ + register char *aend, *bend; + + aend = a + la; + + if (la <= lb) + while (a < aend) + *a++ = *b++; + + else { + bend = b + lb; + while (b < bend) + *a++ = *b++; + while (a < aend) + *a++ = ' '; + } +} +} diff --git a/lib/linalg/static/.clang-format b/lib/linalg/static/.clang-format new file mode 100644 index 0000000000..cb352b37f5 --- /dev/null +++ b/lib/linalg/static/.clang-format @@ -0,0 +1,23 @@ +--- +Language: Cpp +BasedOnStyle: LLVM +AccessModifierOffset: -4 +AlignConsecutiveAssignments: true +AlignEscapedNewlines: Left +AllowShortFunctionsOnASingleLine: Inline +AllowShortLambdasOnASingleLine: None +AllowShortIfStatementsOnASingleLine: WithoutElse +BraceWrapping: + AfterFunction: true +BreakBeforeBraces: Custom +BreakInheritanceList: AfterColon +BreakConstructorInitializers: AfterColon +ColumnLimit: 100 +IndentCaseLabels: true +IndentWidth: 4 +ObjCBlockIndentWidth: 4 +PenaltyBreakAssignment: 4 +Standard: Cpp11 +TabWidth: 4 +UseTab: Never +... diff --git a/lib/linalg/static/README b/lib/linalg/static/README index c06337c2dd..2d0271db7c 100644 --- a/lib/linalg/static/README +++ b/lib/linalg/static/README @@ -1,5 +1,8 @@ -The C++ files in this folder are direct C++ implementations of their -Fortran equivalents using the C++ runtime. -. +The C++ files in this folder are either direct C++ implementations of +their Fortran equivalents using the C++ runtime, or they are adapted +copies of functions from the libf2c runtime. The runtime functions +needed to be renamed to avoid conflics with libgfortran which uses +some of the same function names. + The Fortran files in this folder are modified from their original versions, so that f2c can correctly translate them. diff --git a/lib/linalg/static/d_lmp_cnjg.cpp b/lib/linalg/static/d_lmp_cnjg.cpp new file mode 100644 index 0000000000..03ca8f98fd --- /dev/null +++ b/lib/linalg/static/d_lmp_cnjg.cpp @@ -0,0 +1,13 @@ + +#include "lmp_f2c.h" + +extern "C" { + +void d_lmp_cnjg(doublecomplex *r, doublecomplex *z) +{ + doublereal zi = z->i; + + r->r = z->r; + r->i = -zi; +} +} diff --git a/lib/linalg/static/d_lmp_imag.cpp b/lib/linalg/static/d_lmp_imag.cpp new file mode 100644 index 0000000000..f0443f7828 --- /dev/null +++ b/lib/linalg/static/d_lmp_imag.cpp @@ -0,0 +1,10 @@ + +#include "lmp_f2c.h" + +extern "C" { + +double d_lmp_imag(doublecomplex *z) +{ + return (z->i); +} +} diff --git a/lib/linalg/static/d_lmp_lg10.cpp b/lib/linalg/static/d_lmp_lg10.cpp new file mode 100644 index 0000000000..ec48c99839 --- /dev/null +++ b/lib/linalg/static/d_lmp_lg10.cpp @@ -0,0 +1,14 @@ + +#include "lmp_f2c.h" +#undef abs + +static constexpr double log10e = 0.43429448190325182765; + +#include + +extern "C" { +double d_lmp_lg10(doublereal *x) +{ + return (log10e * log(*x)); +} +} diff --git a/lib/linalg/static/d_lmp_sign.cpp b/lib/linalg/static/d_lmp_sign.cpp new file mode 100644 index 0000000000..fb0a1e79ff --- /dev/null +++ b/lib/linalg/static/d_lmp_sign.cpp @@ -0,0 +1,12 @@ + +#include "lmp_f2c.h" + +extern "C" { + +double d_lmp_sign(doublereal *a, doublereal *b) +{ + double x; + x = (*a >= 0 ? *a : -*a); + return (*b >= 0 ? x : -x); +} +} diff --git a/lib/linalg/static/dlamc3.f b/lib/linalg/static/dlamc3.f new file mode 100644 index 0000000000..1108297707 --- /dev/null +++ b/lib/linalg/static/dlamc3.f @@ -0,0 +1,45 @@ +*> \brief \b DLAMC3 +*> \details +*> \b Purpose: +*> \verbatim +*> DLAMC3 is intended to force A and B to be stored prior to doing +*> the addition of A and B , for use in situations where optimizers +*> might hold one of these in a register. +*> \endverbatim +*> \author LAPACK is a software package provided by Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. +*> \date December 2016 +*> \ingroup auxOTHERauxiliary +*> +*> \param[in] A +*> \verbatim +*> A is a DOUBLE PRECISION +*> \endverbatim +*> +*> \param[in] B +*> \verbatim +*> B is a DOUBLE PRECISION +*> The values A and B. +*> \endverbatim +*> + DOUBLE PRECISION FUNCTION DLAMC3( A, B ) +* +* -- LAPACK auxiliary routine (version 3.7.0) -- +* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. +* November 2010 +* +* .. Scalar Arguments .. + DOUBLE PRECISION A, B +* .. +* ===================================================================== +* +* .. Executable Statements .. +* + DLAMC3 = A + B +* + RETURN +* +* End of DLAMC3 +* + END +* +************************************************************************ diff --git a/lib/linalg/static/i_lmp_dnnt.cpp b/lib/linalg/static/i_lmp_dnnt.cpp new file mode 100644 index 0000000000..8050697bb9 --- /dev/null +++ b/lib/linalg/static/i_lmp_dnnt.cpp @@ -0,0 +1,12 @@ + +#include "lmp_f2c.h" + +#undef abs +#include + +extern "C" { +integer i_lmp_dnnt(doublereal *x) +{ + return (integer)(*x >= 0. ? floor(*x + .5) : -floor(.5 - *x)); +} +} diff --git a/lib/linalg/static/i_lmp_len.cpp b/lib/linalg/static/i_lmp_len.cpp new file mode 100644 index 0000000000..b6101b29ad --- /dev/null +++ b/lib/linalg/static/i_lmp_len.cpp @@ -0,0 +1,10 @@ + +#include "lmp_f2c.h" + +extern "C" { + +integer i_lmp_len(char *s, ftnlen n) +{ + return (n); +} +} diff --git a/lib/linalg/static/i_lmp_nint.cpp b/lib/linalg/static/i_lmp_nint.cpp new file mode 100644 index 0000000000..f41ca6b3eb --- /dev/null +++ b/lib/linalg/static/i_lmp_nint.cpp @@ -0,0 +1,13 @@ + +#include "lmp_f2c.h" +#undef abs + +#include + +extern "C" { + +integer i_lmp_nint(real *x) +{ + return (integer)(*x >= 0 ? floor(*x + .5) : -floor(.5 - *x)); +} +} diff --git a/lib/linalg/static/pow_lmp_dd.cpp b/lib/linalg/static/pow_lmp_dd.cpp new file mode 100644 index 0000000000..4963b04bbc --- /dev/null +++ b/lib/linalg/static/pow_lmp_dd.cpp @@ -0,0 +1,12 @@ + +#include "lmp_f2c.h" +#undef abs + +#include + +extern "C" { +double pow_lmp_dd(doublereal *ap, doublereal *bp) +{ + return (pow(*ap, *bp)); +} +} diff --git a/lib/linalg/static/pow_lmp_di.cpp b/lib/linalg/static/pow_lmp_di.cpp new file mode 100644 index 0000000000..9c3d89d536 --- /dev/null +++ b/lib/linalg/static/pow_lmp_di.cpp @@ -0,0 +1,31 @@ + +#include "lmp_f2c.h" + +extern "C" { + +double pow_lmp_di(doublereal *ap, integer *bp) +{ + double pow, x; + integer n; + unsigned long u; + + pow = 1; + x = *ap; + n = *bp; + + if (n != 0) { + if (n < 0) { + n = -n; + x = 1 / x; + } + for (u = n;;) { + if (u & 01) pow *= x; + if (u >>= 1) + x *= x; + else + break; + } + } + return (pow); +} +} diff --git a/lib/linalg/static/pow_lmp_ii.cpp b/lib/linalg/static/pow_lmp_ii.cpp new file mode 100644 index 0000000000..ff28c8fd5a --- /dev/null +++ b/lib/linalg/static/pow_lmp_ii.cpp @@ -0,0 +1,29 @@ + +#include "lmp_f2c.h" + +extern "C" { + +integer pow_lmp_ii(integer *ap, integer *bp) +{ + integer pow, x, n; + unsigned long u; + + x = *ap; + n = *bp; + + if (n <= 0) { + if (n == 0 || x == 1) return 1; + if (x != -1) return x == 0 ? 1 / x : 0; + n = -n; + } + u = n; + for (pow = 1;;) { + if (u & 01) pow *= x; + if (u >>= 1) + x *= x; + else + break; + } + return (pow); +} +} diff --git a/lib/linalg/static/s_lmp_cat.cpp b/lib/linalg/static/s_lmp_cat.cpp new file mode 100644 index 0000000000..323b0b671d --- /dev/null +++ b/lib/linalg/static/s_lmp_cat.cpp @@ -0,0 +1,23 @@ + +#include "lmp_f2c.h" + +// concatenate two strings + +extern "C" { +void s_lmp_cat(char *lp, char *rpp[], ftnint rnp[], ftnint *np, ftnlen ll) +{ + ftnlen i, nc; + char *rp; + ftnlen n = *np; + for (i = 0; i < n; ++i) { + nc = ll; + if (rnp[i] < nc) nc = rnp[i]; + ll -= nc; + rp = rpp[i]; + while (--nc >= 0) + *lp++ = *rp++; + } + while (--ll >= 0) + *lp++ = ' '; +} +} diff --git a/lib/linalg/static/s_lmp_cmp.cpp b/lib/linalg/static/s_lmp_cmp.cpp new file mode 100644 index 0000000000..b51817defa --- /dev/null +++ b/lib/linalg/static/s_lmp_cmp.cpp @@ -0,0 +1,45 @@ + +#include "lmp_f2c.h" + +extern "C" { + +// compare two strings + +integer s_lmp_cmp(char *a0, char *b0, ftnlen la, ftnlen lb) +{ + register unsigned char *a, *aend, *b, *bend; + a = (unsigned char *)a0; + b = (unsigned char *)b0; + aend = a + la; + bend = b + lb; + + if (la <= lb) { + while (a < aend) + if (*a != *b) + return (*a - *b); + else { + ++a; + ++b; + } + + while (b < bend) + if (*b != ' ') + return (' ' - *b); + else + ++b; + } else { + while (b < bend) + if (*a == *b) { + ++a; + ++b; + } else + return (*a - *b); + while (a < aend) + if (*a != ' ') + return (*a - ' '); + else + ++a; + } + return (0); +} +} diff --git a/lib/linalg/static/s_lmp_copy.cpp b/lib/linalg/static/s_lmp_copy.cpp new file mode 100644 index 0000000000..9b432e08ca --- /dev/null +++ b/lib/linalg/static/s_lmp_copy.cpp @@ -0,0 +1,26 @@ + +#include "lmp_f2c.h" + +extern "C" { + +/* assign strings: a = b */ + +void s_lmp_copy(register char *a, register char *b, ftnlen la, ftnlen lb) +{ + register char *aend, *bend; + + aend = a + la; + + if (la <= lb) + while (a < aend) + *a++ = *b++; + + else { + bend = b + lb; + while (b < bend) + *a++ = *b++; + while (a < aend) + *a++ = ' '; + } +} +} diff --git a/lib/linalg/static/xerbla.cpp b/lib/linalg/static/xerbla.cpp index cf2f7b1c69..325bd7030d 100644 --- a/lib/linalg/static/xerbla.cpp +++ b/lib/linalg/static/xerbla.cpp @@ -1,30 +1,31 @@ -#include -#include - -class LinalgException : public std::exception { - std::string message; - - public: - LinalgException() = delete; - - explicit LinalgException(const std::string &msg) { message = msg; } - const char *what() const noexcept override { return message.c_str(); } -}; - -extern "C" { - #include "lmp_f2c.h" +#undef abs +#include +#include +#include + +extern "C" { + +static constexpr int BUFSZ = 1024; + integer xerbla_(const char *srname, integer *info) { - std::string mesg = " ** On entry to "; - for (int i = 0; i < 1024; ++i) { - if ((srname[i] == '\0') || (srname[i] == ' ')) break; - mesg.push_back(srname[i]); - } - mesg += " parameter number " + std::to_string(*info) + " had an illegal value\n"; - throw LinalgException(mesg); - return 0; + char buf[BUFSZ]; + buf[0] = '\0'; + + strcat(buf, " ** On entry to "); + for (int i = 0; i < BUFSZ - 16; ++i) { + if ((srname[i] == '\0') || (srname[i] == ' ')) { + buf[i + 16] = '\0'; + break; + } + buf[i + 16] = srname[i]; + } + int len = strlen(buf); + snprintf(buf+len, BUFSZ-len, " parameter number %d had an illegal value\n", *info); + exit(1); + return 0; } } diff --git a/lib/linalg/static/z_lmp_abs.cpp b/lib/linalg/static/z_lmp_abs.cpp new file mode 100644 index 0000000000..2b79d56457 --- /dev/null +++ b/lib/linalg/static/z_lmp_abs.cpp @@ -0,0 +1,31 @@ + +#include "lmp_f2c.h" +#undef abs + +#include + +extern "C" { + +static double f__cabs(double real, double imag) +{ + double temp; + + if (real < 0) real = -real; + if (imag < 0) imag = -imag; + if (imag > real) { + temp = real; + real = imag; + imag = temp; + } + if ((real + imag) == real) return (real); + + temp = imag / real; + temp = real * sqrt(1.0 + temp * temp); /*overflow!!*/ + return (temp); +} + +double z_lmp_abs(doublecomplex *z) +{ + return (f__cabs(z->r, z->i)); +} +} diff --git a/lib/linalg/static/z_lmp_div.cpp b/lib/linalg/static/z_lmp_div.cpp new file mode 100644 index 0000000000..5f742506da --- /dev/null +++ b/lib/linalg/static/z_lmp_div.cpp @@ -0,0 +1,31 @@ + +#include "lmp_f2c.h" + +extern "C" { + +void z_lmp_div(doublecomplex *c, doublecomplex *a, doublecomplex *b) +{ + double ratio, den; + double abr, abi, cr; + + if ((abr = b->r) < 0.) abr = -abr; + if ((abi = b->i) < 0.) abi = -abi; + if (abr <= abi) { + if (abi == 0) { + if (a->i != 0 || a->r != 0) abi = 1.; + c->i = c->r = abi / abr; + return; + } + ratio = b->r / b->i; + den = b->i * (1 + ratio * ratio); + cr = (a->r * ratio + a->i) / den; + c->i = (a->i * ratio - a->r) / den; + } else { + ratio = b->i / b->r; + den = b->r * (1 + ratio * ratio); + cr = (a->r + a->i * ratio) / den; + c->i = (a->i - a->r * ratio) / den; + } + c->r = cr; +} +} diff --git a/lib/linalg/whitespace.conf b/lib/linalg/whitespace.conf new file mode 100644 index 0000000000..7988edc506 --- /dev/null +++ b/lib/linalg/whitespace.conf @@ -0,0 +1,13 @@ +--- +recursive: false +include: + - "." + - "static/**" +exclude: + - "Makefile.*" + - "*.py" +patterns: + - "*.cpp" + - "*.h" + - "README" +... diff --git a/lib/linalg/xerbla.cpp b/lib/linalg/xerbla.cpp index cf2f7b1c69..325bd7030d 100644 --- a/lib/linalg/xerbla.cpp +++ b/lib/linalg/xerbla.cpp @@ -1,30 +1,31 @@ -#include -#include - -class LinalgException : public std::exception { - std::string message; - - public: - LinalgException() = delete; - - explicit LinalgException(const std::string &msg) { message = msg; } - const char *what() const noexcept override { return message.c_str(); } -}; - -extern "C" { - #include "lmp_f2c.h" +#undef abs +#include +#include +#include + +extern "C" { + +static constexpr int BUFSZ = 1024; + integer xerbla_(const char *srname, integer *info) { - std::string mesg = " ** On entry to "; - for (int i = 0; i < 1024; ++i) { - if ((srname[i] == '\0') || (srname[i] == ' ')) break; - mesg.push_back(srname[i]); - } - mesg += " parameter number " + std::to_string(*info) + " had an illegal value\n"; - throw LinalgException(mesg); - return 0; + char buf[BUFSZ]; + buf[0] = '\0'; + + strcat(buf, " ** On entry to "); + for (int i = 0; i < BUFSZ - 16; ++i) { + if ((srname[i] == '\0') || (srname[i] == ' ')) { + buf[i + 16] = '\0'; + break; + } + buf[i + 16] = srname[i]; + } + int len = strlen(buf); + snprintf(buf+len, BUFSZ-len, " parameter number %d had an illegal value\n", *info); + exit(1); + return 0; } } diff --git a/lib/linalg/z_lmp_abs.cpp b/lib/linalg/z_lmp_abs.cpp new file mode 100644 index 0000000000..2b79d56457 --- /dev/null +++ b/lib/linalg/z_lmp_abs.cpp @@ -0,0 +1,31 @@ + +#include "lmp_f2c.h" +#undef abs + +#include + +extern "C" { + +static double f__cabs(double real, double imag) +{ + double temp; + + if (real < 0) real = -real; + if (imag < 0) imag = -imag; + if (imag > real) { + temp = real; + real = imag; + imag = temp; + } + if ((real + imag) == real) return (real); + + temp = imag / real; + temp = real * sqrt(1.0 + temp * temp); /*overflow!!*/ + return (temp); +} + +double z_lmp_abs(doublecomplex *z) +{ + return (f__cabs(z->r, z->i)); +} +} diff --git a/lib/linalg/z_lmp_div.cpp b/lib/linalg/z_lmp_div.cpp new file mode 100644 index 0000000000..5f742506da --- /dev/null +++ b/lib/linalg/z_lmp_div.cpp @@ -0,0 +1,31 @@ + +#include "lmp_f2c.h" + +extern "C" { + +void z_lmp_div(doublecomplex *c, doublecomplex *a, doublecomplex *b) +{ + double ratio, den; + double abr, abi, cr; + + if ((abr = b->r) < 0.) abr = -abr; + if ((abi = b->i) < 0.) abi = -abi; + if (abr <= abi) { + if (abi == 0) { + if (a->i != 0 || a->r != 0) abi = 1.; + c->i = c->r = abi / abr; + return; + } + ratio = b->r / b->i; + den = b->i * (1 + ratio * ratio); + cr = (a->r * ratio + a->i) / den; + c->i = (a->i * ratio - a->r) / den; + } else { + ratio = b->i / b->r; + den = b->r * (1 + ratio * ratio); + cr = (a->r + a->i * ratio) / den; + c->i = (a->i - a->r * ratio) / den; + } + c->r = cr; +} +} diff --git a/lib/linalg/zdotc.cpp b/lib/linalg/zdotc.cpp index e0c614e843..2697cc1c2c 100644 --- a/lib/linalg/zdotc.cpp +++ b/lib/linalg/zdotc.cpp @@ -104,7 +104,7 @@ extern "C" { doublecomplex z__1, z__2, z__3; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, ix, iy; @@ -142,7 +142,7 @@ extern "C" { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - d_cnjg(&z__3, &zx[i__]); + d_lmp_cnjg(&z__3, &zx[i__]); i__2 = i__; z__2.r = z__3.r * zy[i__2].r - z__3.i * zy[i__2].i, z__2.i = z__3.r * zy[i__2].i + z__3.i * zy[i__2].r; @@ -164,7 +164,7 @@ extern "C" { } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - d_cnjg(&z__3, &zx[ix]); + d_lmp_cnjg(&z__3, &zx[ix]); i__2 = iy; z__2.r = z__3.r * zy[i__2].r - z__3.i * zy[i__2].i, z__2.i = z__3.r * zy[i__2].i + z__3.i * zy[i__2].r; diff --git a/lib/linalg/zdscal.cpp b/lib/linalg/zdscal.cpp index fd444bdf71..ebe50c247d 100644 --- a/lib/linalg/zdscal.cpp +++ b/lib/linalg/zdscal.cpp @@ -100,7 +100,7 @@ extern "C" { doublecomplex z__1; /* Builtin functions */ - double d_imag(doublecomplex *); + double d_lmp_imag(doublecomplex *); /* Local variables */ integer i__, nincx; @@ -138,7 +138,7 @@ extern "C" { i__2 = i__; i__3 = i__; d__1 = *da * zx[i__3].r; - d__2 = *da * d_imag(&zx[i__]); + d__2 = *da * d_lmp_imag(&zx[i__]); z__1.r = d__1, z__1.i = d__2; zx[i__2].r = z__1.r, zx[i__2].i = z__1.i; } @@ -153,7 +153,7 @@ extern "C" { i__3 = i__; i__4 = i__; d__1 = *da * zx[i__4].r; - d__2 = *da * d_imag(&zx[i__]); + d__2 = *da * d_lmp_imag(&zx[i__]); z__1.r = d__1, z__1.i = d__2; zx[i__3].r = z__1.r, zx[i__3].i = z__1.i; } diff --git a/lib/linalg/zgemm.cpp b/lib/linalg/zgemm.cpp index 53020bef2d..c49b0a4e57 100644 --- a/lib/linalg/zgemm.cpp +++ b/lib/linalg/zgemm.cpp @@ -211,7 +211,7 @@ extern "C" { doublecomplex z__1, z__2, z__3, z__4; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, l, info; @@ -406,7 +406,7 @@ extern "C" { temp.r = 0., temp.i = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { - d_cnjg(&z__3, &a[l + i__ * a_dim1]); + d_lmp_cnjg(&z__3, &a[l + i__ * a_dim1]); i__4 = l + j * b_dim1; z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] @@ -508,7 +508,7 @@ extern "C" { } i__2 = *k; for (l = 1; l <= i__2; ++l) { - d_cnjg(&z__2, &b[j + l * b_dim1]); + d_lmp_cnjg(&z__2, &b[j + l * b_dim1]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; @@ -591,8 +591,8 @@ extern "C" { temp.r = 0., temp.i = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { - d_cnjg(&z__3, &a[l + i__ * a_dim1]); - d_cnjg(&z__4, &b[j + l * b_dim1]); + d_lmp_cnjg(&z__3, &a[l + i__ * a_dim1]); + d_lmp_cnjg(&z__4, &b[j + l * b_dim1]); z__2.r = z__3.r * z__4.r - z__3.i * z__4.i, z__2.i = z__3.r * z__4.i + z__3.i * z__4.r; z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; @@ -632,7 +632,7 @@ extern "C" { temp.r = 0., temp.i = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { - d_cnjg(&z__3, &a[l + i__ * a_dim1]); + d_lmp_cnjg(&z__3, &a[l + i__ * a_dim1]); i__4 = j + l * b_dim1; z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] @@ -677,7 +677,7 @@ extern "C" { i__3 = *k; for (l = 1; l <= i__3; ++l) { i__4 = l + i__ * a_dim1; - d_cnjg(&z__3, &b[j + l * b_dim1]); + d_lmp_cnjg(&z__3, &b[j + l * b_dim1]); z__2.r = a[i__4].r * z__3.r - a[i__4].i * z__3.i, z__2.i = a[i__4].r * z__3.i + a[i__4].i * z__3.r; diff --git a/lib/linalg/zgemv.cpp b/lib/linalg/zgemv.cpp index 99b8cf9d0a..68736014b7 100644 --- a/lib/linalg/zgemv.cpp +++ b/lib/linalg/zgemv.cpp @@ -181,7 +181,7 @@ extern "C" { doublecomplex z__1, z__2, z__3; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; @@ -403,7 +403,7 @@ extern "C" { } else { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - d_cnjg(&z__3, &a[i__ + j * a_dim1]); + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = i__; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3] @@ -443,7 +443,7 @@ extern "C" { } else { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - d_cnjg(&z__3, &a[i__ + j * a_dim1]); + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = ix; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3] diff --git a/lib/linalg/zgerc.cpp b/lib/linalg/zgerc.cpp index 668c4c4f64..04dde8606a 100644 --- a/lib/linalg/zgerc.cpp +++ b/lib/linalg/zgerc.cpp @@ -152,7 +152,7 @@ extern "C" { doublecomplex z__1, z__2; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, ix, jy, kx, info; @@ -226,7 +226,7 @@ extern "C" { for (j = 1; j <= i__1; ++j) { i__2 = jy; if (y[i__2].r != 0. || y[i__2].i != 0.) { - d_cnjg(&z__2, &y[jy]); + d_lmp_cnjg(&z__2, &y[jy]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; @@ -255,7 +255,7 @@ extern "C" { for (j = 1; j <= i__1; ++j) { i__2 = jy; if (y[i__2].r != 0. || y[i__2].i != 0.) { - d_cnjg(&z__2, &y[jy]); + d_lmp_cnjg(&z__2, &y[jy]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; diff --git a/lib/linalg/zhemv.cpp b/lib/linalg/zhemv.cpp index 132915183b..f26dbadf2b 100644 --- a/lib/linalg/zhemv.cpp +++ b/lib/linalg/zhemv.cpp @@ -177,7 +177,7 @@ extern "C" { doublecomplex z__1, z__2, z__3, z__4; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; @@ -333,7 +333,7 @@ extern "C" { .r; z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; y[i__3].r = z__1.r, y[i__3].i = z__1.i; - d_cnjg(&z__3, &a[i__ + j * a_dim1]); + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = i__; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; @@ -375,7 +375,7 @@ extern "C" { .r; z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; y[i__3].r = z__1.r, y[i__3].i = z__1.i; - d_cnjg(&z__3, &a[i__ + j * a_dim1]); + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = ix; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; @@ -429,7 +429,7 @@ extern "C" { .r; z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; y[i__3].r = z__1.r, y[i__3].i = z__1.i; - d_cnjg(&z__3, &a[i__ + j * a_dim1]); + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = i__; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; @@ -476,7 +476,7 @@ extern "C" { .r; z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; y[i__3].r = z__1.r, y[i__3].i = z__1.i; - d_cnjg(&z__3, &a[i__ + j * a_dim1]); + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = ix; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; diff --git a/lib/linalg/zher2.cpp b/lib/linalg/zher2.cpp index 07d95f7917..6f66534dd4 100644 --- a/lib/linalg/zher2.cpp +++ b/lib/linalg/zher2.cpp @@ -173,7 +173,7 @@ extern "C" { doublecomplex z__1, z__2, z__3, z__4; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; @@ -271,7 +271,7 @@ extern "C" { i__3 = j; if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || y[i__3].i != 0.)) { - d_cnjg(&z__2, &y[j]); + d_lmp_cnjg(&z__2, &y[j]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp1.r = z__1.r, temp1.i = z__1.i; @@ -279,7 +279,7 @@ extern "C" { z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] .r; - d_cnjg(&z__1, &z__2); + d_lmp_cnjg(&z__1, &z__2); temp2.r = z__1.r, temp2.i = z__1.i; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { @@ -327,7 +327,7 @@ extern "C" { i__3 = jy; if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || y[i__3].i != 0.)) { - d_cnjg(&z__2, &y[jy]); + d_lmp_cnjg(&z__2, &y[jy]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp1.r = z__1.r, temp1.i = z__1.i; @@ -335,7 +335,7 @@ extern "C" { z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] .r; - d_cnjg(&z__1, &z__2); + d_lmp_cnjg(&z__1, &z__2); temp2.r = z__1.r, temp2.i = z__1.i; ix = kx; iy = ky; @@ -394,7 +394,7 @@ extern "C" { i__3 = j; if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || y[i__3].i != 0.)) { - d_cnjg(&z__2, &y[j]); + d_lmp_cnjg(&z__2, &y[j]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp1.r = z__1.r, temp1.i = z__1.i; @@ -402,7 +402,7 @@ extern "C" { z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] .r; - d_cnjg(&z__1, &z__2); + d_lmp_cnjg(&z__1, &z__2); temp2.r = z__1.r, temp2.i = z__1.i; i__2 = j + j * a_dim1; i__3 = j + j * a_dim1; @@ -450,7 +450,7 @@ extern "C" { i__3 = jy; if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || y[i__3].i != 0.)) { - d_cnjg(&z__2, &y[jy]); + d_lmp_cnjg(&z__2, &y[jy]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp1.r = z__1.r, temp1.i = z__1.i; @@ -458,7 +458,7 @@ extern "C" { z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] .r; - d_cnjg(&z__1, &z__2); + d_lmp_cnjg(&z__1, &z__2); temp2.r = z__1.r, temp2.i = z__1.i; i__2 = j + j * a_dim1; i__3 = j + j * a_dim1; diff --git a/lib/linalg/zher2k.cpp b/lib/linalg/zher2k.cpp index 7b5553add1..01ce32deb9 100644 --- a/lib/linalg/zher2k.cpp +++ b/lib/linalg/zher2k.cpp @@ -223,7 +223,7 @@ extern "C" { doublecomplex z__1, z__2, z__3, z__4, z__5, z__6; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, l, info; @@ -418,7 +418,7 @@ extern "C" { i__4 = j + l * b_dim1; if (a[i__3].r != 0. || a[i__3].i != 0. || (b[i__4].r != 0. || b[i__4].i != 0.)) { - d_cnjg(&z__2, &b[j + l * b_dim1]); + d_lmp_cnjg(&z__2, &b[j + l * b_dim1]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; @@ -427,7 +427,7 @@ extern "C" { z__2.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, z__2.i = alpha->r * a[i__3].i + alpha->i * a[ i__3].r; - d_cnjg(&z__1, &z__2); + d_lmp_cnjg(&z__1, &z__2); temp2.r = z__1.r, temp2.i = z__1.i; i__3 = j - 1; for (i__ = 1; i__ <= i__3; ++i__) { @@ -502,7 +502,7 @@ extern "C" { i__4 = j + l * b_dim1; if (a[i__3].r != 0. || a[i__3].i != 0. || (b[i__4].r != 0. || b[i__4].i != 0.)) { - d_cnjg(&z__2, &b[j + l * b_dim1]); + d_lmp_cnjg(&z__2, &b[j + l * b_dim1]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; @@ -511,7 +511,7 @@ extern "C" { z__2.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, z__2.i = alpha->r * a[i__3].i + alpha->i * a[ i__3].r; - d_cnjg(&z__1, &z__2); + d_lmp_cnjg(&z__1, &z__2); temp2.r = z__1.r, temp2.i = z__1.i; i__3 = *n; for (i__ = j + 1; i__ <= i__3; ++i__) { @@ -565,14 +565,14 @@ extern "C" { temp2.r = 0., temp2.i = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { - d_cnjg(&z__3, &a[l + i__ * a_dim1]); + d_lmp_cnjg(&z__3, &a[l + i__ * a_dim1]); i__4 = l + j * b_dim1; z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] .r; z__1.r = temp1.r + z__2.r, z__1.i = temp1.i + z__2.i; temp1.r = z__1.r, temp1.i = z__1.i; - d_cnjg(&z__3, &b[l + i__ * b_dim1]); + d_lmp_cnjg(&z__3, &b[l + i__ * b_dim1]); i__4 = l + j * a_dim1; z__2.r = z__3.r * a[i__4].r - z__3.i * a[i__4].i, z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4] @@ -587,7 +587,7 @@ extern "C" { z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, z__2.i = alpha->r * temp1.i + alpha->i * temp1.r; - d_cnjg(&z__4, alpha); + d_lmp_cnjg(&z__4, alpha); z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, z__3.i = z__4.r * temp2.i + z__4.i * temp2.r; @@ -601,7 +601,7 @@ extern "C" { z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, z__2.i = alpha->r * temp1.i + alpha->i * temp1.r; - d_cnjg(&z__4, alpha); + d_lmp_cnjg(&z__4, alpha); z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, z__3.i = z__4.r * temp2.i + z__4.i * temp2.r; @@ -616,7 +616,7 @@ extern "C" { z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, z__2.i = alpha->r * temp1.i + alpha->i * temp1.r; - d_cnjg(&z__4, alpha); + d_lmp_cnjg(&z__4, alpha); z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, z__3.i = z__4.r * temp2.i + z__4.i * temp2.r; @@ -633,7 +633,7 @@ extern "C" { temp1.r; z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + z__4.i; - d_cnjg(&z__6, alpha); + d_lmp_cnjg(&z__6, alpha); z__5.r = z__6.r * temp2.r - z__6.i * temp2.i, z__5.i = z__6.r * temp2.i + z__6.i * temp2.r; @@ -655,14 +655,14 @@ extern "C" { temp2.r = 0., temp2.i = 0.; i__3 = *k; for (l = 1; l <= i__3; ++l) { - d_cnjg(&z__3, &a[l + i__ * a_dim1]); + d_lmp_cnjg(&z__3, &a[l + i__ * a_dim1]); i__4 = l + j * b_dim1; z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] .r; z__1.r = temp1.r + z__2.r, z__1.i = temp1.i + z__2.i; temp1.r = z__1.r, temp1.i = z__1.i; - d_cnjg(&z__3, &b[l + i__ * b_dim1]); + d_lmp_cnjg(&z__3, &b[l + i__ * b_dim1]); i__4 = l + j * a_dim1; z__2.r = z__3.r * a[i__4].r - z__3.i * a[i__4].i, z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4] @@ -677,7 +677,7 @@ extern "C" { z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, z__2.i = alpha->r * temp1.i + alpha->i * temp1.r; - d_cnjg(&z__4, alpha); + d_lmp_cnjg(&z__4, alpha); z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, z__3.i = z__4.r * temp2.i + z__4.i * temp2.r; @@ -691,7 +691,7 @@ extern "C" { z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, z__2.i = alpha->r * temp1.i + alpha->i * temp1.r; - d_cnjg(&z__4, alpha); + d_lmp_cnjg(&z__4, alpha); z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, z__3.i = z__4.r * temp2.i + z__4.i * temp2.r; @@ -706,7 +706,7 @@ extern "C" { z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, z__2.i = alpha->r * temp1.i + alpha->i * temp1.r; - d_cnjg(&z__4, alpha); + d_lmp_cnjg(&z__4, alpha); z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, z__3.i = z__4.r * temp2.i + z__4.i * temp2.r; @@ -723,7 +723,7 @@ extern "C" { temp1.r; z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + z__4.i; - d_cnjg(&z__6, alpha); + d_lmp_cnjg(&z__6, alpha); z__5.r = z__6.r * temp2.r - z__6.i * temp2.i, z__5.i = z__6.r * temp2.i + z__6.i * temp2.r; diff --git a/lib/linalg/zhpr.cpp b/lib/linalg/zhpr.cpp index b977b2ce1e..29ed826c46 100644 --- a/lib/linalg/zhpr.cpp +++ b/lib/linalg/zhpr.cpp @@ -152,7 +152,7 @@ extern "C" { doublecomplex z__1, z__2; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, k, kk, ix, jx, kx, info; @@ -231,7 +231,7 @@ extern "C" { for (j = 1; j <= i__1; ++j) { i__2 = j; if (x[i__2].r != 0. || x[i__2].i != 0.) { - d_cnjg(&z__2, &x[j]); + d_lmp_cnjg(&z__2, &x[j]); z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; temp.r = z__1.r, temp.i = z__1.i; k = kk; @@ -271,7 +271,7 @@ extern "C" { for (j = 1; j <= i__1; ++j) { i__2 = jx; if (x[i__2].r != 0. || x[i__2].i != 0.) { - d_cnjg(&z__2, &x[jx]); + d_lmp_cnjg(&z__2, &x[jx]); z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; temp.r = z__1.r, temp.i = z__1.i; ix = kx; @@ -316,7 +316,7 @@ extern "C" { for (j = 1; j <= i__1; ++j) { i__2 = j; if (x[i__2].r != 0. || x[i__2].i != 0.) { - d_cnjg(&z__2, &x[j]); + d_lmp_cnjg(&z__2, &x[j]); z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; temp.r = z__1.r, temp.i = z__1.i; i__2 = kk; @@ -356,7 +356,7 @@ extern "C" { for (j = 1; j <= i__1; ++j) { i__2 = jx; if (x[i__2].r != 0. || x[i__2].i != 0.) { - d_cnjg(&z__2, &x[jx]); + d_lmp_cnjg(&z__2, &x[jx]); z__1.r = *alpha * z__2.r, z__1.i = *alpha * z__2.i; temp.r = z__1.r, temp.i = z__1.i; i__2 = kk; diff --git a/lib/linalg/zlacgv.cpp b/lib/linalg/zlacgv.cpp index 9e9a4050b2..d73cd7b759 100644 --- a/lib/linalg/zlacgv.cpp +++ b/lib/linalg/zlacgv.cpp @@ -97,7 +97,7 @@ f"> */ doublecomplex z__1; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, ioff; @@ -128,7 +128,7 @@ f"> */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__; - d_cnjg(&z__1, &x[i__]); + d_lmp_cnjg(&z__1, &x[i__]); x[i__2].r = z__1.r, x[i__2].i = z__1.i; /* L10: */ } @@ -140,7 +140,7 @@ f"> */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = ioff; - d_cnjg(&z__1, &x[ioff]); + d_lmp_cnjg(&z__1, &x[ioff]); x[i__2].r = z__1.r, x[i__2].i = z__1.i; ioff += *incx; /* L20: */ diff --git a/lib/linalg/zlacrm.cpp b/lib/linalg/zlacrm.cpp index 46508ae4a9..c3415cb29b 100644 --- a/lib/linalg/zlacrm.cpp +++ b/lib/linalg/zlacrm.cpp @@ -146,7 +146,7 @@ f"> */ doublecomplex z__1; /* Builtin functions */ - double d_imag(doublecomplex *); + double d_lmp_imag(doublecomplex *); /* Local variables */ integer i__, j, l; @@ -225,7 +225,7 @@ f"> */ for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - rwork[(j - 1) * *m + i__] = d_imag(&a[i__ + j * a_dim1]); + rwork[(j - 1) * *m + i__] = d_lmp_imag(&a[i__ + j * a_dim1]); /* L50: */ } /* L60: */ diff --git a/lib/linalg/zladiv.cpp b/lib/linalg/zladiv.cpp index 6b065d5ce0..105560e1a5 100644 --- a/lib/linalg/zladiv.cpp +++ b/lib/linalg/zladiv.cpp @@ -88,7 +88,7 @@ f"> */ doublecomplex z__1; /* Builtin functions */ - double d_imag(doublecomplex *); + double d_lmp_imag(doublecomplex *); /* Local variables */ doublereal zi, zr; @@ -114,9 +114,9 @@ f"> */ /* .. Executable Statements .. */ d__1 = x->r; - d__2 = d_imag(x); + d__2 = d_lmp_imag(x); d__3 = y->r; - d__4 = d_imag(y); + d__4 = d_lmp_imag(y); dladiv_(&d__1, &d__2, &d__3, &d__4, &zr, &zi); z__1.r = zr, z__1.i = zi; ret_val->r = z__1.r, ret_val->i = z__1.i; diff --git a/lib/linalg/zlaed0.cpp b/lib/linalg/zlaed0.cpp index 98bc39611d..5895127d75 100644 --- a/lib/linalg/zlaed0.cpp +++ b/lib/linalg/zlaed0.cpp @@ -178,7 +178,7 @@ f"> */ /* Builtin functions */ double log(doublereal); - integer pow_ii(integer *, integer *); + integer pow_lmp_ii(integer *, integer *); /* Local variables */ integer i__, j, k, ll, iq, lgn, msd2, smm1, spm1, spm2; @@ -321,10 +321,10 @@ L10: temp = log((doublereal) (*n)) / log(2.); lgn = (integer) temp; - if (pow_ii(&c__2, &lgn) < *n) { + if (pow_lmp_ii(&c__2, &lgn) < *n) { ++lgn; } - if (pow_ii(&c__2, &lgn) < *n) { + if (pow_lmp_ii(&c__2, &lgn) < *n) { ++lgn; } iprmpt = indxq + *n + 1; diff --git a/lib/linalg/zlaed7.cpp b/lib/linalg/zlaed7.cpp index b20d805e62..11b29341bb 100644 --- a/lib/linalg/zlaed7.cpp +++ b/lib/linalg/zlaed7.cpp @@ -280,7 +280,7 @@ f"> */ integer q_dim1, q_offset, i__1, i__2; /* Builtin functions */ - integer pow_ii(integer *, integer *); + integer pow_lmp_ii(integer *, integer *); /* Local variables */ integer i__, k, n1, n2, iq, iw, iz, ptr, indx, curr, indxc, indxp; @@ -386,11 +386,11 @@ f"> */ /* Form the z-vector which consists of the last row of Q_1 and the */ /* first row of Q_2. */ - ptr = pow_ii(&c__2, tlvls) + 1; + ptr = pow_lmp_ii(&c__2, tlvls) + 1; i__1 = *curlvl - 1; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *tlvls - i__; - ptr += pow_ii(&c__2, &i__2); + ptr += pow_lmp_ii(&c__2, &i__2); /* L10: */ } curr = ptr + *curpbm; diff --git a/lib/linalg/zlanhe.cpp b/lib/linalg/zlanhe.cpp index c54482158a..6db6cc5cef 100644 --- a/lib/linalg/zlanhe.cpp +++ b/lib/linalg/zlanhe.cpp @@ -153,7 +153,7 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, doublereal ret_val, d__1; /* Builtin functions */ - double z_abs(doublecomplex *), sqrt(doublereal); + double z_lmp_abs(doublecomplex *), sqrt(doublereal); /* Local variables */ integer i__, j; @@ -207,7 +207,7 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { - sum = z_abs(&a[i__ + j * a_dim1]); + sum = z_lmp_abs(&a[i__ + j * a_dim1]); if (value < sum || disnan_(&sum)) { value = sum; } @@ -230,7 +230,7 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, } i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { - sum = z_abs(&a[i__ + j * a_dim1]); + sum = z_lmp_abs(&a[i__ + j * a_dim1]); if (value < sum || disnan_(&sum)) { value = sum; } @@ -251,7 +251,7 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, sum = 0.; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { - absa = z_abs(&a[i__ + j * a_dim1]); + absa = z_lmp_abs(&a[i__ + j * a_dim1]); sum += absa; work[i__] += absa; /* L50: */ @@ -280,7 +280,7 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, sum = work[j] + (d__1 = a[i__2].r, abs(d__1)); i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { - absa = z_abs(&a[i__ + j * a_dim1]); + absa = z_lmp_abs(&a[i__ + j * a_dim1]); sum += absa; work[i__] += absa; /* L90: */ diff --git a/lib/linalg/zlarfb.cpp b/lib/linalg/zlarfb.cpp index b09fdf4917..e9015669ca 100644 --- a/lib/linalg/zlarfb.cpp +++ b/lib/linalg/zlarfb.cpp @@ -229,7 +229,7 @@ f"> */ doublecomplex z__1, z__2; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j; @@ -371,7 +371,7 @@ f"> */ for (i__ = 1; i__ <= i__2; ++i__) { i__3 = j + i__ * c_dim1; i__4 = j + i__ * c_dim1; - d_cnjg(&z__2, &work[i__ + j * work_dim1]); + d_lmp_cnjg(&z__2, &work[i__ + j * work_dim1]); z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - z__2.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; @@ -529,7 +529,7 @@ f"> */ for (i__ = 1; i__ <= i__2; ++i__) { i__3 = *m - *k + j + i__ * c_dim1; i__4 = *m - *k + j + i__ * c_dim1; - d_cnjg(&z__2, &work[i__ + j * work_dim1]); + d_lmp_cnjg(&z__2, &work[i__ + j * work_dim1]); z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - z__2.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; @@ -689,7 +689,7 @@ f"> */ for (i__ = 1; i__ <= i__2; ++i__) { i__3 = j + i__ * c_dim1; i__4 = j + i__ * c_dim1; - d_cnjg(&z__2, &work[i__ + j * work_dim1]); + d_lmp_cnjg(&z__2, &work[i__ + j * work_dim1]); z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - z__2.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; @@ -848,7 +848,7 @@ f"> */ for (i__ = 1; i__ <= i__2; ++i__) { i__3 = *m - *k + j + i__ * c_dim1; i__4 = *m - *k + j + i__ * c_dim1; - d_cnjg(&z__2, &work[i__ + j * work_dim1]); + d_lmp_cnjg(&z__2, &work[i__ + j * work_dim1]); z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - z__2.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; diff --git a/lib/linalg/zlarfg.cpp b/lib/linalg/zlarfg.cpp index 71e2add68c..518ba9bcbb 100644 --- a/lib/linalg/zlarfg.cpp +++ b/lib/linalg/zlarfg.cpp @@ -135,7 +135,7 @@ f"> */ doublecomplex z__1, z__2; /* Builtin functions */ - double d_imag(doublecomplex *), d_sign(doublereal *, doublereal *); + double d_lmp_imag(doublecomplex *), d_lmp_sign(doublereal *, doublereal *); /* Local variables */ integer j, knt; @@ -189,7 +189,7 @@ f"> */ i__1 = *n - 1; xnorm = dznrm2_(&i__1, &x[1], incx); alphr = alpha->r; - alphi = d_imag(alpha); + alphi = d_lmp_imag(alpha); if (xnorm == 0. && alphi == 0.) { @@ -201,7 +201,7 @@ f"> */ /* general case */ d__1 = dlapy3_(&alphr, &alphi, &xnorm); - beta = -d_sign(&d__1, &alphr); + beta = -d_lmp_sign(&d__1, &alphr); safmin = dlamch_((char *)"S", (ftnlen)1) / dlamch_((char *)"E", (ftnlen)1); rsafmn = 1. / safmin; @@ -228,7 +228,7 @@ L10: z__1.r = alphr, z__1.i = alphi; alpha->r = z__1.r, alpha->i = z__1.i; d__1 = dlapy3_(&alphr, &alphi, &xnorm); - beta = -d_sign(&d__1, &alphr); + beta = -d_lmp_sign(&d__1, &alphr); } d__1 = (beta - alphr) / beta; d__2 = -alphi / beta; diff --git a/lib/linalg/zlarft.cpp b/lib/linalg/zlarft.cpp index ad5e46b910..391de106cf 100644 --- a/lib/linalg/zlarft.cpp +++ b/lib/linalg/zlarft.cpp @@ -193,7 +193,7 @@ f"> */ doublecomplex z__1, z__2, z__3; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, prevlastv; @@ -281,7 +281,7 @@ L220: i__3 = j + i__ * t_dim1; i__4 = i__; z__2.r = -tau[i__4].r, z__2.i = -tau[i__4].i; - d_cnjg(&z__3, &v[i__ + j * v_dim1]); + d_lmp_cnjg(&z__3, &v[i__ + j * v_dim1]); z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, z__1.i = z__2.r * z__3.i + z__2.i * z__3.r; t[i__3].r = z__1.r, t[i__3].i = z__1.i; @@ -382,7 +382,7 @@ L281: i__2 = j + i__ * t_dim1; i__3 = i__; z__2.r = -tau[i__3].r, z__2.i = -tau[i__3].i; - d_cnjg(&z__3, &v[*n - *k + i__ + j * v_dim1]); + d_lmp_cnjg(&z__3, &v[*n - *k + i__ + j * v_dim1]); z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, z__1.i = z__2.r * z__3.i + z__2.i * z__3.r; diff --git a/lib/linalg/zlassq.cpp b/lib/linalg/zlassq.cpp index 2e2a5ba539..31c0f15f4c 100644 --- a/lib/linalg/zlassq.cpp +++ b/lib/linalg/zlassq.cpp @@ -132,7 +132,7 @@ f"> */ doublereal d__1; /* Builtin functions */ - double d_imag(doublecomplex *); + double d_lmp_imag(doublecomplex *); /* Local variables */ integer ix; @@ -184,7 +184,7 @@ f"> */ *sumsq += d__1 * d__1; } } - temp1 = (d__1 = d_imag(&x[ix]), abs(d__1)); + temp1 = (d__1 = d_lmp_imag(&x[ix]), abs(d__1)); if (temp1 > 0. || disnan_(&temp1)) { if (*scale < temp1) { /* Computing 2nd power */ diff --git a/lib/linalg/zstedc.cpp b/lib/linalg/zstedc.cpp index 1a4d71cf50..fc6d9a782b 100644 --- a/lib/linalg/zstedc.cpp +++ b/lib/linalg/zstedc.cpp @@ -247,7 +247,7 @@ f"> */ /* Builtin functions */ double log(doublereal); - integer pow_ii(integer *, integer *); + integer pow_lmp_ii(integer *, integer *); double sqrt(doublereal); /* Local variables */ @@ -365,10 +365,10 @@ f"> */ lrwmin = *n - 1 << 1; } else if (icompz == 1) { lgn = (integer) (log((doublereal) (*n)) / log(2.)); - if (pow_ii(&c__2, &lgn) < *n) { + if (pow_lmp_ii(&c__2, &lgn) < *n) { ++lgn; } - if (pow_ii(&c__2, &lgn) < *n) { + if (pow_lmp_ii(&c__2, &lgn) < *n) { ++lgn; } lwmin = *n * *n; diff --git a/lib/linalg/zsteqr.cpp b/lib/linalg/zsteqr.cpp index ce75593d28..2085ccbaae 100644 --- a/lib/linalg/zsteqr.cpp +++ b/lib/linalg/zsteqr.cpp @@ -166,7 +166,7 @@ f"> */ doublereal d__1, d__2; /* Builtin functions */ - double sqrt(doublereal), d_sign(doublereal *, doublereal *); + double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); /* Local variables */ doublereal b, c__, f, g; @@ -445,7 +445,7 @@ L60: g = (d__[l + 1] - p) / (e[l] * 2.); r__ = dlapy2_(&g, &c_b41); - g = d__[m] - p + e[l] / (g + d_sign(&r__, &g)); + g = d__[m] - p + e[l] / (g + d_lmp_sign(&r__, &g)); s = 1.; c__ = 1.; @@ -568,7 +568,7 @@ L110: g = (d__[l - 1] - p) / (e[l - 1] * 2.); r__ = dlapy2_(&g, &c_b41); - g = d__[m] - p + e[l - 1] / (g + d_sign(&r__, &g)); + g = d__[m] - p + e[l - 1] / (g + d_lmp_sign(&r__, &g)); s = 1.; c__ = 1.; diff --git a/lib/linalg/ztpmv.cpp b/lib/linalg/ztpmv.cpp index adb1db10f4..9e4a16df42 100644 --- a/lib/linalg/ztpmv.cpp +++ b/lib/linalg/ztpmv.cpp @@ -164,7 +164,7 @@ extern "C" { doublecomplex z__1, z__2, z__3; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, k, kk, ix, jx, kx, info; @@ -432,14 +432,14 @@ extern "C" { } } else { if (nounit) { - d_cnjg(&z__2, &ap[kk]); + d_lmp_cnjg(&z__2, &ap[kk]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } for (i__ = j - 1; i__ >= 1; --i__) { - d_cnjg(&z__3, &ap[k]); + d_lmp_cnjg(&z__3, &ap[k]); i__1 = i__; z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, z__2.i = z__3.r * x[i__1].i + z__3.i * x[ @@ -485,7 +485,7 @@ extern "C" { } } else { if (nounit) { - d_cnjg(&z__2, &ap[kk]); + d_lmp_cnjg(&z__2, &ap[kk]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, z__1.i = temp.r * z__2.i + temp.i * z__2.r; @@ -494,7 +494,7 @@ extern "C" { i__1 = kk - j + 1; for (k = kk - 1; k >= i__1; --k) { ix -= *incx; - d_cnjg(&z__3, &ap[k]); + d_lmp_cnjg(&z__3, &ap[k]); i__2 = ix; z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, z__2.i = z__3.r * x[i__2].i + z__3.i * x[ @@ -543,7 +543,7 @@ extern "C" { } } else { if (nounit) { - d_cnjg(&z__2, &ap[kk]); + d_lmp_cnjg(&z__2, &ap[kk]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, z__1.i = temp.r * z__2.i + temp.i * z__2.r; @@ -551,7 +551,7 @@ extern "C" { } i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { - d_cnjg(&z__3, &ap[k]); + d_lmp_cnjg(&z__3, &ap[k]); i__3 = i__; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[ @@ -598,7 +598,7 @@ extern "C" { } } else { if (nounit) { - d_cnjg(&z__2, &ap[kk]); + d_lmp_cnjg(&z__2, &ap[kk]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, z__1.i = temp.r * z__2.i + temp.i * z__2.r; @@ -607,7 +607,7 @@ extern "C" { i__2 = kk + *n - j; for (k = kk + 1; k <= i__2; ++k) { ix += *incx; - d_cnjg(&z__3, &ap[k]); + d_lmp_cnjg(&z__3, &ap[k]); i__3 = ix; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[ diff --git a/lib/linalg/ztpsv.cpp b/lib/linalg/ztpsv.cpp index c3c564acd2..a1bddbbeb9 100644 --- a/lib/linalg/ztpsv.cpp +++ b/lib/linalg/ztpsv.cpp @@ -166,7 +166,7 @@ extern "C" { doublecomplex z__1, z__2, z__3; /* Builtin functions */ - void z_div(doublecomplex *, doublecomplex *, doublecomplex *), d_cnjg( + void z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *), d_lmp_cnjg( doublecomplex *, doublecomplex *); /* Local variables */ @@ -260,7 +260,7 @@ extern "C" { if (x[i__1].r != 0. || x[i__1].i != 0.) { if (nounit) { i__1 = j; - z_div(&z__1, &x[j], &ap[kk]); + z_lmp_div(&z__1, &x[j], &ap[kk]); x[i__1].r = z__1.r, x[i__1].i = z__1.i; } i__1 = j; @@ -290,7 +290,7 @@ extern "C" { if (x[i__1].r != 0. || x[i__1].i != 0.) { if (nounit) { i__1 = jx; - z_div(&z__1, &x[jx], &ap[kk]); + z_lmp_div(&z__1, &x[jx], &ap[kk]); x[i__1].r = z__1.r, x[i__1].i = z__1.i; } i__1 = jx; @@ -325,7 +325,7 @@ extern "C" { if (x[i__2].r != 0. || x[i__2].i != 0.) { if (nounit) { i__2 = j; - z_div(&z__1, &x[j], &ap[kk]); + z_lmp_div(&z__1, &x[j], &ap[kk]); x[i__2].r = z__1.r, x[i__2].i = z__1.i; } i__2 = j; @@ -357,7 +357,7 @@ extern "C" { if (x[i__2].r != 0. || x[i__2].i != 0.) { if (nounit) { i__2 = jx; - z_div(&z__1, &x[jx], &ap[kk]); + z_lmp_div(&z__1, &x[jx], &ap[kk]); x[i__2].r = z__1.r, x[i__2].i = z__1.i; } i__2 = jx; @@ -411,13 +411,13 @@ extern "C" { /* L90: */ } if (nounit) { - z_div(&z__1, &temp, &ap[kk + j - 1]); + z_lmp_div(&z__1, &temp, &ap[kk + j - 1]); temp.r = z__1.r, temp.i = z__1.i; } } else { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { - d_cnjg(&z__3, &ap[k]); + d_lmp_cnjg(&z__3, &ap[k]); i__3 = i__; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[ @@ -429,8 +429,8 @@ extern "C" { /* L100: */ } if (nounit) { - d_cnjg(&z__2, &ap[kk + j - 1]); - z_div(&z__1, &temp, &z__2); + d_lmp_cnjg(&z__2, &ap[kk + j - 1]); + z_lmp_div(&z__1, &temp, &z__2); temp.r = z__1.r, temp.i = z__1.i; } } @@ -461,13 +461,13 @@ extern "C" { /* L120: */ } if (nounit) { - z_div(&z__1, &temp, &ap[kk + j - 1]); + z_lmp_div(&z__1, &temp, &ap[kk + j - 1]); temp.r = z__1.r, temp.i = z__1.i; } } else { i__2 = kk + j - 2; for (k = kk; k <= i__2; ++k) { - d_cnjg(&z__3, &ap[k]); + d_lmp_cnjg(&z__3, &ap[k]); i__3 = ix; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[ @@ -479,8 +479,8 @@ extern "C" { /* L130: */ } if (nounit) { - d_cnjg(&z__2, &ap[kk + j - 1]); - z_div(&z__1, &temp, &z__2); + d_lmp_cnjg(&z__2, &ap[kk + j - 1]); + z_lmp_div(&z__1, &temp, &z__2); temp.r = z__1.r, temp.i = z__1.i; } } @@ -513,13 +513,13 @@ extern "C" { /* L150: */ } if (nounit) { - z_div(&z__1, &temp, &ap[kk - *n + j]); + z_lmp_div(&z__1, &temp, &ap[kk - *n + j]); temp.r = z__1.r, temp.i = z__1.i; } } else { i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { - d_cnjg(&z__3, &ap[k]); + d_lmp_cnjg(&z__3, &ap[k]); i__2 = i__; z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, z__2.i = z__3.r * x[i__2].i + z__3.i * x[ @@ -531,8 +531,8 @@ extern "C" { /* L160: */ } if (nounit) { - d_cnjg(&z__2, &ap[kk - *n + j]); - z_div(&z__1, &temp, &z__2); + d_lmp_cnjg(&z__2, &ap[kk - *n + j]); + z_lmp_div(&z__1, &temp, &z__2); temp.r = z__1.r, temp.i = z__1.i; } } @@ -563,13 +563,13 @@ extern "C" { /* L180: */ } if (nounit) { - z_div(&z__1, &temp, &ap[kk - *n + j]); + z_lmp_div(&z__1, &temp, &ap[kk - *n + j]); temp.r = z__1.r, temp.i = z__1.i; } } else { i__1 = kk - (*n - (j + 1)); for (k = kk; k >= i__1; --k) { - d_cnjg(&z__3, &ap[k]); + d_lmp_cnjg(&z__3, &ap[k]); i__2 = ix; z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, z__2.i = z__3.r * x[i__2].i + z__3.i * x[ @@ -581,8 +581,8 @@ extern "C" { /* L190: */ } if (nounit) { - d_cnjg(&z__2, &ap[kk - *n + j]); - z_div(&z__1, &temp, &z__2); + d_lmp_cnjg(&z__2, &ap[kk - *n + j]); + z_lmp_div(&z__1, &temp, &z__2); temp.r = z__1.r, temp.i = z__1.i; } } diff --git a/lib/linalg/ztptri.cpp b/lib/linalg/ztptri.cpp index eb5c2988e3..29377adc03 100644 --- a/lib/linalg/ztptri.cpp +++ b/lib/linalg/ztptri.cpp @@ -146,7 +146,7 @@ f"> */ doublecomplex z__1; /* Builtin functions */ - void z_div(doublecomplex *, doublecomplex *, doublecomplex *); + void z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *); /* Local variables */ integer j, jc, jj; @@ -243,7 +243,7 @@ f"> */ for (j = 1; j <= i__1; ++j) { if (nounit) { i__2 = jc + j - 1; - z_div(&z__1, &c_b1, &ap[jc + j - 1]); + z_lmp_div(&z__1, &c_b1, &ap[jc + j - 1]); ap[i__2].r = z__1.r, ap[i__2].i = z__1.i; i__2 = jc + j - 1; z__1.r = -ap[i__2].r, z__1.i = -ap[i__2].i; @@ -272,7 +272,7 @@ f"> */ for (j = *n; j >= 1; --j) { if (nounit) { i__1 = jc; - z_div(&z__1, &c_b1, &ap[jc]); + z_lmp_div(&z__1, &c_b1, &ap[jc]); ap[i__1].r = z__1.r, ap[i__1].i = z__1.i; i__1 = jc; z__1.r = -ap[i__1].r, z__1.i = -ap[i__1].i; diff --git a/lib/linalg/ztrmm.cpp b/lib/linalg/ztrmm.cpp index 3fec24189e..a44eec9bb1 100644 --- a/lib/linalg/ztrmm.cpp +++ b/lib/linalg/ztrmm.cpp @@ -201,7 +201,7 @@ extern "C" { doublecomplex z__1, z__2, z__3; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, k, info; @@ -424,7 +424,7 @@ extern "C" { } } else { if (nounit) { - d_cnjg(&z__2, &a[i__ + i__ * a_dim1]); + d_lmp_cnjg(&z__2, &a[i__ + i__ * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, z__1.i = temp.r * z__2.i + temp.i * z__2.r; @@ -432,7 +432,7 @@ extern "C" { } i__2 = i__ - 1; for (k = 1; k <= i__2; ++k) { - d_cnjg(&z__3, &a[k + i__ * a_dim1]); + d_lmp_cnjg(&z__3, &a[k + i__ * a_dim1]); i__3 = k + j * b_dim1; z__2.r = z__3.r * b[i__3].r - z__3.i * b[i__3] .i, z__2.i = z__3.r * b[i__3].i + @@ -481,7 +481,7 @@ extern "C" { } } else { if (nounit) { - d_cnjg(&z__2, &a[i__ + i__ * a_dim1]); + d_lmp_cnjg(&z__2, &a[i__ + i__ * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, z__1.i = temp.r * z__2.i + temp.i * z__2.r; @@ -489,7 +489,7 @@ extern "C" { } i__3 = *m; for (k = i__ + 1; k <= i__3; ++k) { - d_cnjg(&z__3, &a[k + i__ * a_dim1]); + d_lmp_cnjg(&z__3, &a[k + i__ * a_dim1]); i__4 = k + j * b_dim1; z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4] .i, z__2.i = z__3.r * b[i__4].i + @@ -630,7 +630,7 @@ extern "C" { .i + alpha->i * a[i__3].r; temp.r = z__1.r, temp.i = z__1.i; } else { - d_cnjg(&z__2, &a[j + k * a_dim1]); + d_lmp_cnjg(&z__2, &a[j + k * a_dim1]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; @@ -661,7 +661,7 @@ extern "C" { i__2].r; temp.r = z__1.r, temp.i = z__1.i; } else { - d_cnjg(&z__2, &a[k + k * a_dim1]); + d_lmp_cnjg(&z__2, &a[k + k * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, z__1.i = temp.r * z__2.i + temp.i * z__2.r; @@ -695,7 +695,7 @@ extern "C" { .i + alpha->i * a[i__2].r; temp.r = z__1.r, temp.i = z__1.i; } else { - d_cnjg(&z__2, &a[j + k * a_dim1]); + d_lmp_cnjg(&z__2, &a[j + k * a_dim1]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; @@ -726,7 +726,7 @@ extern "C" { i__1].r; temp.r = z__1.r, temp.i = z__1.i; } else { - d_cnjg(&z__2, &a[k + k * a_dim1]); + d_lmp_cnjg(&z__2, &a[k + k * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, z__1.i = temp.r * z__2.i + temp.i * z__2.r; diff --git a/lib/linalg/ztrmv.cpp b/lib/linalg/ztrmv.cpp index 77f93e41a6..9d9877638f 100644 --- a/lib/linalg/ztrmv.cpp +++ b/lib/linalg/ztrmv.cpp @@ -169,7 +169,7 @@ extern "C" { doublecomplex z__1, z__2, z__3; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, ix, jx, kx, info; @@ -428,14 +428,14 @@ extern "C" { } } else { if (nounit) { - d_cnjg(&z__2, &a[j + j * a_dim1]); + d_lmp_cnjg(&z__2, &a[j + j * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } for (i__ = j - 1; i__ >= 1; --i__) { - d_cnjg(&z__3, &a[i__ + j * a_dim1]); + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__1 = i__; z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, z__2.i = z__3.r * x[i__1].i + z__3.i * x[ @@ -478,7 +478,7 @@ extern "C" { } } else { if (nounit) { - d_cnjg(&z__2, &a[j + j * a_dim1]); + d_lmp_cnjg(&z__2, &a[j + j * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, z__1.i = temp.r * z__2.i + temp.i * z__2.r; @@ -486,7 +486,7 @@ extern "C" { } for (i__ = j - 1; i__ >= 1; --i__) { ix -= *incx; - d_cnjg(&z__3, &a[i__ + j * a_dim1]); + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__1 = ix; z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, z__2.i = z__3.r * x[i__1].i + z__3.i * x[ @@ -531,7 +531,7 @@ extern "C" { } } else { if (nounit) { - d_cnjg(&z__2, &a[j + j * a_dim1]); + d_lmp_cnjg(&z__2, &a[j + j * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, z__1.i = temp.r * z__2.i + temp.i * z__2.r; @@ -539,7 +539,7 @@ extern "C" { } i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { - d_cnjg(&z__3, &a[i__ + j * a_dim1]); + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = i__; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[ @@ -584,7 +584,7 @@ extern "C" { } } else { if (nounit) { - d_cnjg(&z__2, &a[j + j * a_dim1]); + d_lmp_cnjg(&z__2, &a[j + j * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, z__1.i = temp.r * z__2.i + temp.i * z__2.r; @@ -593,7 +593,7 @@ extern "C" { i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { ix += *incx; - d_cnjg(&z__3, &a[i__ + j * a_dim1]); + d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = ix; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = z__3.r * x[i__3].i + z__3.i * x[ diff --git a/lib/linalg/zungl2.cpp b/lib/linalg/zungl2.cpp index d4b85486c6..44213e5927 100644 --- a/lib/linalg/zungl2.cpp +++ b/lib/linalg/zungl2.cpp @@ -139,7 +139,7 @@ f"> */ doublecomplex z__1, z__2; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, j, l; @@ -235,7 +235,7 @@ f"> */ a[i__1].r = 1., a[i__1].i = 0.; i__1 = *m - i__; i__2 = *n - i__ + 1; - d_cnjg(&z__1, &tau[i__]); + d_lmp_cnjg(&z__1, &tau[i__]); zlarf_((char *)"Right", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, & z__1, &a[i__ + 1 + i__ * a_dim1], lda, &work[1], ( ftnlen)5); @@ -248,7 +248,7 @@ f"> */ zlacgv_(&i__1, &a[i__ + (i__ + 1) * a_dim1], lda); } i__1 = i__ + i__ * a_dim1; - d_cnjg(&z__2, &tau[i__]); + d_lmp_cnjg(&z__2, &tau[i__]); z__1.r = 1. - z__2.r, z__1.i = 0. - z__2.i; a[i__1].r = z__1.r, a[i__1].i = z__1.i; diff --git a/lib/linalg/zunm2l.cpp b/lib/linalg/zunm2l.cpp index d9bc80e8c7..3e5b63f574 100644 --- a/lib/linalg/zunm2l.cpp +++ b/lib/linalg/zunm2l.cpp @@ -189,7 +189,7 @@ f"> */ doublecomplex z__1; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, i1, i2, i3, mi, ni, nq; @@ -315,7 +315,7 @@ f"> */ i__3 = i__; taui.r = tau[i__3].r, taui.i = tau[i__3].i; } else { - d_cnjg(&z__1, &tau[i__]); + d_lmp_cnjg(&z__1, &tau[i__]); taui.r = z__1.r, taui.i = z__1.i; } i__3 = nq - *k + i__ + i__ * a_dim1; diff --git a/lib/linalg/zunm2r.cpp b/lib/linalg/zunm2r.cpp index a84cf72ba6..cbfdfb2f42 100644 --- a/lib/linalg/zunm2r.cpp +++ b/lib/linalg/zunm2r.cpp @@ -189,7 +189,7 @@ f"> */ doublecomplex z__1; /* Builtin functions */ - void d_cnjg(doublecomplex *, doublecomplex *); + void d_lmp_cnjg(doublecomplex *, doublecomplex *); /* Local variables */ integer i__, i1, i2, i3, ic, jc, mi, ni, nq; @@ -319,7 +319,7 @@ f"> */ i__3 = i__; taui.r = tau[i__3].r, taui.i = tau[i__3].i; } else { - d_cnjg(&z__1, &tau[i__]); + d_lmp_cnjg(&z__1, &tau[i__]); taui.r = z__1.r, taui.i = z__1.i; } i__3 = i__ + i__ * a_dim1; diff --git a/lib/linalg/zunmql.cpp b/lib/linalg/zunmql.cpp index facff63c71..694c8f776c 100644 --- a/lib/linalg/zunmql.cpp +++ b/lib/linalg/zunmql.cpp @@ -201,7 +201,7 @@ f"> */ char ch__1[2]; /* Builtin functions */ - /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__, i1, i2, i3, ib, nb, mi, ni, nq, nw, iwt; @@ -306,7 +306,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, m, n, k, &c_n1, (ftnlen)6, (ftnlen)2); nb = min(i__1,i__2); @@ -338,7 +338,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNMQL", ch__1, m, n, k, &c_n1, ( ftnlen)6, (ftnlen)2); nbmin = max(i__1,i__2); diff --git a/lib/linalg/zunmqr.cpp b/lib/linalg/zunmqr.cpp index 8659499dab..6718cdc001 100644 --- a/lib/linalg/zunmqr.cpp +++ b/lib/linalg/zunmqr.cpp @@ -201,7 +201,7 @@ f"> */ char ch__1[2]; /* Builtin functions */ - /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i__, i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iwt; @@ -303,7 +303,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, m, n, k, &c_n1, ( ftnlen)6, (ftnlen)2); nb = min(i__1,i__2); @@ -335,7 +335,7 @@ f"> */ /* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNMQR", ch__1, m, n, k, &c_n1, ( ftnlen)6, (ftnlen)2); nbmin = max(i__1,i__2); diff --git a/lib/linalg/zunmtr.cpp b/lib/linalg/zunmtr.cpp index be224d7e93..f4f4f55761 100644 --- a/lib/linalg/zunmtr.cpp +++ b/lib/linalg/zunmtr.cpp @@ -203,7 +203,7 @@ f"> */ char ch__1[2]; /* Builtin functions */ - /* Subroutine */ int s_cat(char *, char **, integer *, integer *, ftnlen); + /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); /* Local variables */ integer i1, i2, nb, mi, ni, nq, nw; @@ -298,7 +298,7 @@ f"> */ /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *m - 1; i__3 = *m - 1; nb = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, &i__2, n, &i__3, &c_n1, ( @@ -307,7 +307,7 @@ f"> */ /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *n - 1; i__3 = *n - 1; nb = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, m, &i__2, &i__3, &c_n1, ( @@ -318,7 +318,7 @@ f"> */ /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *m - 1; i__3 = *m - 1; nb = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, &i__2, n, &i__3, &c_n1, ( @@ -327,7 +327,7 @@ f"> */ /* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; - s_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); + s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *n - 1; i__3 = *n - 1; nb = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, m, &i__2, &i__3, &c_n1, ( From 57713cf9a3f7095f88be791706f18cd9f63ae8a0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 16:31:50 -0500 Subject: [PATCH 30/47] remove redundant comments from generated C++ files. clean up with clang-format. --- lib/linalg/convert.sh | 25 +- lib/linalg/dasum.cpp | 128 +- lib/linalg/daxpy.cpp | 144 +- lib/linalg/dbdsqr.cpp | 699 +----- lib/linalg/dcabs1.cpp | 82 +- lib/linalg/dcopy.cpp | 137 +- lib/linalg/ddot.cpp | 137 +- lib/linalg/dgebd2.cpp | 338 +-- lib/linalg/dgebrd.cpp | 378 +-- lib/linalg/dgecon.cpp | 258 +- lib/linalg/dgelq2.cpp | 218 +- lib/linalg/dgelqf.cpp | 305 +-- lib/linalg/dgelsd.cpp | 795 ++---- lib/linalg/dgelss.cpp | 930 ++------ lib/linalg/dgemm.cpp | 317 +-- lib/linalg/dgemv.cpp | 254 +- lib/linalg/dgeqr2.cpp | 222 +- lib/linalg/dgeqrf.cpp | 311 +-- lib/linalg/dger.cpp | 200 +- lib/linalg/dgesv.cpp | 197 +- lib/linalg/dgesvd.cpp | 3844 +++++++----------------------- lib/linalg/dgetf2.cpp | 216 +- lib/linalg/dgetrf.cpp | 261 +- lib/linalg/dgetrf2.cpp | 271 +-- lib/linalg/dgetri.cpp | 286 +-- lib/linalg/dgetrs.cpp | 249 +- lib/linalg/disnan.cpp | 4 +- lib/linalg/dlabad.cpp | 118 +- lib/linalg/dlabrd.cpp | 510 +--- lib/linalg/dlacn2.cpp | 264 +- lib/linalg/dlacpy.cpp | 164 +- lib/linalg/dladiv.cpp | 221 +- lib/linalg/dlae2.cpp | 171 +- lib/linalg/dlaed0.cpp | 386 +-- lib/linalg/dlaed1.cpp | 292 +-- lib/linalg/dlaed2.cpp | 429 +--- lib/linalg/dlaed3.cpp | 347 +-- lib/linalg/dlaed4.cpp | 595 +---- lib/linalg/dlaed5.cpp | 169 +- lib/linalg/dlaed6.cpp | 296 +-- lib/linalg/dlaed7.cpp | 418 +--- lib/linalg/dlaed8.cpp | 434 +--- lib/linalg/dlaed9.cpp | 289 +-- lib/linalg/dlaeda.cpp | 331 +-- lib/linalg/dlaev2.cpp | 193 +- lib/linalg/dlals0.cpp | 493 +--- lib/linalg/dlalsa.cpp | 475 +--- lib/linalg/dlalsd.cpp | 498 +--- lib/linalg/dlamc3.cpp | 59 +- lib/linalg/dlamch.cpp | 38 +- lib/linalg/dlamrg.cpp | 154 +- lib/linalg/dlange.cpp | 210 +- lib/linalg/dlanst.cpp | 188 +- lib/linalg/dlansy.cpp | 217 +- lib/linalg/dlapy2.cpp | 121 +- lib/linalg/dlapy3.cpp | 127 +- lib/linalg/dlarf.cpp | 236 +- lib/linalg/dlarfb.cpp | 831 +------ lib/linalg/dlarfg.cpp | 191 +- lib/linalg/dlarft.cpp | 336 +-- lib/linalg/dlartg.cpp | 184 +- lib/linalg/dlas2.cpp | 173 +- lib/linalg/dlascl.cpp | 299 +-- lib/linalg/dlasd4.cpp | 629 +---- lib/linalg/dlasd5.cpp | 215 +- lib/linalg/dlasd6.cpp | 460 +--- lib/linalg/dlasd7.cpp | 459 +--- lib/linalg/dlasd8.cpp | 329 +-- lib/linalg/dlasda.cpp | 498 +--- lib/linalg/dlasdq.cpp | 378 +-- lib/linalg/dlasdt.cpp | 176 +- lib/linalg/dlaset.cpp | 195 +- lib/linalg/dlasq1.cpp | 230 +- lib/linalg/dlasq2.cpp | 407 +--- lib/linalg/dlasq3.cpp | 365 +-- lib/linalg/dlasq4.cpp | 306 +-- lib/linalg/dlasq5.cpp | 299 +-- lib/linalg/dlasq6.cpp | 210 +- lib/linalg/dlasr.cpp | 383 +-- lib/linalg/dlasrt.cpp | 198 +- lib/linalg/dlassq.cpp | 163 +- lib/linalg/dlasv2.cpp | 242 +- lib/linalg/dlaswp.cpp | 177 +- lib/linalg/dlatrd.cpp | 424 +--- lib/linalg/dlatrs.cpp | 658 +---- lib/linalg/dnrm2.cpp | 131 +- lib/linalg/dorg2l.cpp | 206 +- lib/linalg/dorg2r.cpp | 207 +- lib/linalg/dorgbr.cpp | 326 +-- lib/linalg/dorgl2.cpp | 203 +- lib/linalg/dorglq.cpp | 307 +-- lib/linalg/dorgql.cpp | 315 +-- lib/linalg/dorgqr.cpp | 309 +-- lib/linalg/dorgtr.cpp | 262 +- lib/linalg/dorm2l.cpp | 264 +- lib/linalg/dorm2r.cpp | 264 +- lib/linalg/dormbr.cpp | 367 +-- lib/linalg/dorml2.cpp | 261 +- lib/linalg/dormlq.cpp | 348 +-- lib/linalg/dormql.cpp | 348 +-- lib/linalg/dormqr.cpp | 348 +-- lib/linalg/dormtr.cpp | 319 +-- lib/linalg/dposv.cpp | 211 +- lib/linalg/dpotf2.cpp | 233 +- lib/linalg/dpotrf.cpp | 287 +-- lib/linalg/dpotrf2.cpp | 245 +- lib/linalg/dpotrs.cpp | 228 +- lib/linalg/drot.cpp | 143 +- lib/linalg/drscl.cpp | 166 +- lib/linalg/dscal.cpp | 134 +- lib/linalg/dstedc.cpp | 448 +--- lib/linalg/dsteqr.cpp | 427 +--- lib/linalg/dsterf.cpp | 300 +-- lib/linalg/dswap.cpp | 137 +- lib/linalg/dsyev.cpp | 298 +-- lib/linalg/dsyevd.cpp | 363 +-- lib/linalg/dsygs2.cpp | 308 +-- lib/linalg/dsygst.cpp | 431 +--- lib/linalg/dsygv.cpp | 338 +-- lib/linalg/dsygvd.cpp | 390 +-- lib/linalg/dsymm.cpp | 319 +-- lib/linalg/dsymv.cpp | 247 +- lib/linalg/dsyr2.cpp | 249 +- lib/linalg/dsyr2k.cpp | 336 +-- lib/linalg/dsyrk.cpp | 293 +-- lib/linalg/dsytd2.cpp | 351 +-- lib/linalg/dsytrd.cpp | 397 +-- lib/linalg/dtrmm.cpp | 326 +-- lib/linalg/dtrmv.cpp | 255 +- lib/linalg/dtrsm.cpp | 354 +-- lib/linalg/dtrsv.cpp | 251 +- lib/linalg/dtrti2.cpp | 213 +- lib/linalg/dtrtri.cpp | 280 +-- lib/linalg/dznrm2.cpp | 134 +- lib/linalg/idamax.cpp | 119 +- lib/linalg/ieeeck.cpp | 145 +- lib/linalg/iladlc.cpp | 124 +- lib/linalg/iladlr.cpp | 128 +- lib/linalg/ilaenv.cpp | 566 ++--- lib/linalg/ilazlc.cpp | 129 +- lib/linalg/ilazlr.cpp | 138 +- lib/linalg/iparmq.cpp | 365 +-- lib/linalg/lsame.cpp | 10 +- lib/linalg/pow_lmp_di.cpp | 4 +- lib/linalg/s_lmp_cmp.cpp | 4 +- lib/linalg/static/.clang-format | 2 +- lib/linalg/static/disnan.cpp | 4 +- lib/linalg/static/dlamch.cpp | 38 +- lib/linalg/static/lsame.cpp | 10 +- lib/linalg/static/pow_lmp_di.cpp | 4 +- lib/linalg/static/s_lmp_cmp.cpp | 4 +- lib/linalg/static/xerbla.cpp | 2 +- lib/linalg/static/z_lmp_div.cpp | 12 +- lib/linalg/whitespace.conf | 13 - lib/linalg/xerbla.cpp | 2 +- lib/linalg/z_lmp_div.cpp | 12 +- lib/linalg/zaxpy.cpp | 150 +- lib/linalg/zcopy.cpp | 131 +- lib/linalg/zdotc.cpp | 154 +- lib/linalg/zdrot.cpp | 151 +- lib/linalg/zdscal.cpp | 132 +- lib/linalg/zgemm.cpp | 483 +--- lib/linalg/zgemv.cpp | 312 +-- lib/linalg/zgerc.cpp | 218 +- lib/linalg/zheev.cpp | 305 +-- lib/linalg/zheevd.cpp | 393 +-- lib/linalg/zhemv.cpp | 321 +-- lib/linalg/zher2.cpp | 342 +-- lib/linalg/zher2k.cpp | 494 +--- lib/linalg/zhetd2.cpp | 369 +-- lib/linalg/zhetrd.cpp | 399 +--- lib/linalg/zhpr.cpp | 257 +- lib/linalg/zlacgv.cpp | 127 +- lib/linalg/zlacpy.cpp | 168 +- lib/linalg/zlacrm.cpp | 206 +- lib/linalg/zladiv.cpp | 122 +- lib/linalg/zlaed0.cpp | 339 +-- lib/linalg/zlaed7.cpp | 403 +--- lib/linalg/zlaed8.cpp | 419 +--- lib/linalg/zlanhe.cpp | 222 +- lib/linalg/zlarf.cpp | 247 +- lib/linalg/zlarfb.cpp | 863 ++----- lib/linalg/zlarfg.cpp | 203 +- lib/linalg/zlarft.cpp | 355 +-- lib/linalg/zlascl.cpp | 299 +-- lib/linalg/zlaset.cpp | 196 +- lib/linalg/zlasr.cpp | 456 +--- lib/linalg/zlassq.cpp | 171 +- lib/linalg/zlatrd.cpp | 446 +--- lib/linalg/zpptrf.cpp | 234 +- lib/linalg/zpptri.cpp | 198 +- lib/linalg/zscal.cpp | 137 +- lib/linalg/zstedc.cpp | 471 +--- lib/linalg/zsteqr.cpp | 432 +--- lib/linalg/zswap.cpp | 130 +- lib/linalg/ztpmv.cpp | 394 +-- lib/linalg/ztpsv.cpp | 348 +-- lib/linalg/ztptri.cpp | 224 +- lib/linalg/ztrmm.cpp | 497 +--- lib/linalg/ztrmv.cpp | 385 +-- lib/linalg/zung2l.cpp | 208 +- lib/linalg/zung2r.cpp | 208 +- lib/linalg/zungl2.cpp | 208 +- lib/linalg/zungql.cpp | 317 +-- lib/linalg/zungqr.cpp | 311 +-- lib/linalg/zungtr.cpp | 263 +- lib/linalg/zunm2l.cpp | 266 +-- lib/linalg/zunm2r.cpp | 266 +-- lib/linalg/zunmql.cpp | 350 +-- lib/linalg/zunmqr.cpp | 350 +-- lib/linalg/zunmtr.cpp | 320 +-- 211 files changed, 6255 insertions(+), 54891 deletions(-) delete mode 100644 lib/linalg/whitespace.conf diff --git a/lib/linalg/convert.sh b/lib/linalg/convert.sh index 0b2cdec0f2..0dba27c9e3 100755 --- a/lib/linalg/convert.sh +++ b/lib/linalg/convert.sh @@ -21,12 +21,15 @@ do \ then echo Skipping $b else - # convert to C++ with f2c. Make local variables dynamic. - f2c -C++ -a -f $f && mv $b.c $b.cpp || exit 2 - # silence c++ compiler warnings about string constants + # convert to C++ with f2c, make local variables dynamic, + # strip comments, and reindent with clang-format. + f2c -C++ -a -f < $f \ + | g++ -fpreprocessed -dD -P -E - \ + | clang-format -style=file:static/.clang-format > $b.cpp || exit 2 + # silence c++ compiler warnings about string constants, use custom f2c header sed -i -e 's/\("[^"]\+"\)/(char *)\1/g' -e 's/^extern.*"C"/extern "C"/' \ -e 's/^#include.*"f2c.h"/#include "lmp_f2c.h"/' $b.cpp - # replace libf2c functions with local versions under a different name + # replace libf2c functions with local versions under different names sed -i -e 's/s_\(cat\|cmp\|copy\)(/s_lmp_\1(/g' \ -e 's/d_\(sign\|cnjg\|imag\|lg10\)(/d_lmp_\1(/g' \ -e 's/z_\(abs\|div\)(/z_lmp_\1(/g' \ @@ -39,12 +42,15 @@ done for f in static/*.f do \ b=$(basename $f .f) - # convert to C++ with f2c. Make local variables dynamic. - f2c -C++ -a -f $f && mv $b.c $b.cpp || exit 2 - # silence c++ compiler warnings about string constants + # convert to C++ with f2c, make local variables dynamic, + # strip comments, and reindent with clang-format. + f2c -C++ -a -f < $f \ + | g++ -fpreprocessed -dD -P -E - \ + | clang-format -style=file:static/.clang-format > $b.cpp || exit 2 + # silence c++ compiler warnings about string constants, use custom f2c header sed -i -e 's/\("[^"]\+"\)/(char *)\1/g' -e 's/^extern.*"C"/extern "C"/' \ -e 's/^#include.*"f2c.h"/#include "lmp_f2c.h"/' $b.cpp - # replace libf2c functions with local versions under a different name + # replace libf2c functions with local versions under different names sed -i -e 's/s_\(cat\|cmp\|copy\)(/s_lmp_\1(/g' \ -e 's/d_\(sign\|cnjg\|imag\|lg10\)(/d_lmp_\1(/g' \ -e 's/z_\(abs\|div\)(/z_lmp_\1(/g' \ @@ -57,6 +63,3 @@ for c in static/*.cpp do \ cp -v $c . done - -# fix whitespace -python ../../tools/coding_standard/whitespace.py -c whitespace.conf -f . diff --git a/lib/linalg/dasum.cpp b/lib/linalg/dasum.cpp index 93e40126c0..faf6f38081 100644 --- a/lib/linalg/dasum.cpp +++ b/lib/linalg/dasum.cpp @@ -1,131 +1,21 @@ -/* fortran/dasum.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DASUM */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* DOUBLE PRECISION FUNCTION DASUM(N,DX,INCX) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION DX(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DASUM takes the sum of the absolute values. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DX */ -/* > \verbatim */ -/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of DX */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, linpack, 3/11/78. */ -/* > modified 3/93 to return if incx .le. 0. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ doublereal dasum_(integer *n, doublereal *dx, integer *incx) { - /* System generated locals */ integer i__1, i__2; doublereal ret_val, d__1, d__2, d__3, d__4, d__5, d__6; - - /* Local variables */ integer i__, m, mp1; doublereal dtemp; integer nincx; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - /* Parameter adjustments */ --dx; - - /* Function Body */ ret_val = 0.; dtemp = 0.; if (*n <= 0 || *incx <= 0) { return ret_val; } if (*incx == 1) { -/* code for increment equal to 1 */ - - -/* clean-up loop */ - m = *n % 6; if (m != 0) { i__1 = m; @@ -140,15 +30,11 @@ doublereal dasum_(integer *n, doublereal *dx, integer *incx) mp1 = m + 1; i__1 = *n; for (i__ = mp1; i__ <= i__1; i__ += 6) { - dtemp = dtemp + (d__1 = dx[i__], abs(d__1)) + (d__2 = dx[i__ + 1], - abs(d__2)) + (d__3 = dx[i__ + 2], abs(d__3)) + (d__4 = - dx[i__ + 3], abs(d__4)) + (d__5 = dx[i__ + 4], abs(d__5)) - + (d__6 = dx[i__ + 5], abs(d__6)); + dtemp = dtemp + (d__1 = dx[i__], abs(d__1)) + (d__2 = dx[i__ + 1], abs(d__2)) + + (d__3 = dx[i__ + 2], abs(d__3)) + (d__4 = dx[i__ + 3], abs(d__4)) + + (d__5 = dx[i__ + 4], abs(d__5)) + (d__6 = dx[i__ + 5], abs(d__6)); } } else { - -/* code for increment not equal to 1 */ - nincx = *n * *incx; i__1 = nincx; i__2 = *incx; @@ -158,11 +44,7 @@ doublereal dasum_(integer *n, doublereal *dx, integer *incx) } ret_val = dtemp; return ret_val; - -/* End of DASUM */ - -} /* dasum_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/daxpy.cpp b/lib/linalg/daxpy.cpp index 54105d1426..1f820f6fc4 100644 --- a/lib/linalg/daxpy.cpp +++ b/lib/linalg/daxpy.cpp @@ -1,137 +1,13 @@ -/* fortran/daxpy.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DAXPY */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DAXPY(N,DA,DX,INCX,DY,INCY) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION DA */ -/* INTEGER INCX,INCY,N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION DX(*),DY(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DAXPY constant times a vector plus a vector. */ -/* > uses unrolled loops for increments equal to one. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DA */ -/* > \verbatim */ -/* > DA is DOUBLE PRECISION */ -/* > On entry, DA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DX */ -/* > \verbatim */ -/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of DX */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DY */ -/* > \verbatim */ -/* > DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > storage spacing between elements of DY */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, linpack, 3/11/78. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int daxpy_(integer *n, doublereal *da, doublereal *dx, - integer *incx, doublereal *dy, integer *incy) +int daxpy_(integer *n, doublereal *da, doublereal *dx, integer *incx, doublereal *dy, integer *incy) { - /* System generated locals */ integer i__1; - - /* Local variables */ integer i__, m, ix, iy, mp1; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - /* Parameter adjustments */ --dy; --dx; - - /* Function Body */ if (*n <= 0) { return 0; } @@ -139,12 +15,6 @@ extern "C" { return 0; } if (*incx == 1 && *incy == 1) { - -/* code for both increments equal to 1 */ - - -/* clean-up loop */ - m = *n % 4; if (m != 0) { i__1 = m; @@ -164,10 +34,6 @@ extern "C" { dy[i__ + 3] += *da * dx[i__ + 3]; } } else { - -/* code for unequal increments or equal increments */ -/* not equal to 1 */ - ix = 1; iy = 1; if (*incx < 0) { @@ -184,11 +50,7 @@ extern "C" { } } return 0; - -/* End of DAXPY */ - -} /* daxpy_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dbdsqr.cpp b/lib/linalg/dbdsqr.cpp index e8fef63745..59498b4ae6 100644 --- a/lib/linalg/dbdsqr.cpp +++ b/lib/linalg/dbdsqr.cpp @@ -1,283 +1,18 @@ -/* fortran/dbdsqr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b15 = -.125; static integer c__1 = 1; static doublereal c_b49 = 1.; static doublereal c_b72 = -1.; - -/* > \brief \b DBDSQR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DBDSQR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, */ -/* LDU, C, LDC, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION C( LDC, * ), D( * ), E( * ), U( LDU, * ), */ -/* $ VT( LDVT, * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DBDSQR computes the singular values and, optionally, the right and/or */ -/* > left singular vectors from the singular value decomposition (SVD) of */ -/* > a real N-by-N (upper or lower) bidiagonal matrix B using the implicit */ -/* > zero-shift QR algorithm. The SVD of B has the form */ -/* > */ -/* > B = Q * S * P**T */ -/* > */ -/* > where S is the diagonal matrix of singular values, Q is an orthogonal */ -/* > matrix of left singular vectors, and P is an orthogonal matrix of */ -/* > right singular vectors. If left singular vectors are requested, this */ -/* > subroutine actually returns U*Q instead of Q, and, if right singular */ -/* > vectors are requested, this subroutine returns P**T*VT instead of */ -/* > P**T, for given real input matrices U and VT. When U and VT are the */ -/* > orthogonal matrices that reduce a general matrix A to bidiagonal */ -/* > form: A = U*B*VT, as computed by DGEBRD, then */ -/* > */ -/* > A = (U*Q) * S * (P**T*VT) */ -/* > */ -/* > is the SVD of A. Optionally, the subroutine may also compute Q**T*C */ -/* > for a given real input matrix C. */ -/* > */ -/* > See "Computing Small Singular Values of Bidiagonal Matrices With */ -/* > Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan, */ -/* > LAPACK Working Note #3 (or SIAM J. Sci. Statist. Comput. vol. 11, */ -/* > no. 5, pp. 873-912, Sept 1990) and */ -/* > (char *)"Accurate singular values and differential qd algorithms," by */ -/* > B. Parlett and V. Fernando, Technical Report CPAM-554, Mathematics */ -/* > Department, University of California at Berkeley, July 1992 */ -/* > for a detailed description of the algorithm. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': B is upper bidiagonal; */ -/* > = 'L': B is lower bidiagonal. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix B. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NCVT */ -/* > \verbatim */ -/* > NCVT is INTEGER */ -/* > The number of columns of the matrix VT. NCVT >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NRU */ -/* > \verbatim */ -/* > NRU is INTEGER */ -/* > The number of rows of the matrix U. NRU >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NCC */ -/* > \verbatim */ -/* > NCC is INTEGER */ -/* > The number of columns of the matrix C. NCC >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the n diagonal elements of the bidiagonal matrix B. */ -/* > On exit, if INFO=0, the singular values of B in decreasing */ -/* > order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > On entry, the N-1 offdiagonal elements of the bidiagonal */ -/* > matrix B. */ -/* > On exit, if INFO = 0, E is destroyed; if INFO > 0, D and E */ -/* > will contain the diagonal and superdiagonal elements of a */ -/* > bidiagonal matrix orthogonally equivalent to the one given */ -/* > as input. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] VT */ -/* > \verbatim */ -/* > VT is DOUBLE PRECISION array, dimension (LDVT, NCVT) */ -/* > On entry, an N-by-NCVT matrix VT. */ -/* > On exit, VT is overwritten by P**T * VT. */ -/* > Not referenced if NCVT = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDVT */ -/* > \verbatim */ -/* > LDVT is INTEGER */ -/* > The leading dimension of the array VT. */ -/* > LDVT >= max(1,N) if NCVT > 0; LDVT >= 1 if NCVT = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] U */ -/* > \verbatim */ -/* > U is DOUBLE PRECISION array, dimension (LDU, N) */ -/* > On entry, an NRU-by-N matrix U. */ -/* > On exit, U is overwritten by U * Q. */ -/* > Not referenced if NRU = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDU */ -/* > \verbatim */ -/* > LDU is INTEGER */ -/* > The leading dimension of the array U. LDU >= max(1,NRU). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension (LDC, NCC) */ -/* > On entry, an N-by-NCC matrix C. */ -/* > On exit, C is overwritten by Q**T * C. */ -/* > Not referenced if NCC = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. */ -/* > LDC >= max(1,N) if NCC > 0; LDC >=1 if NCC = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (4*(N-1)) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: If INFO = -i, the i-th argument had an illegal value */ -/* > > 0: */ -/* > if NCVT = NRU = NCC = 0, */ -/* > = 1, a split was marked by a positive value in E */ -/* > = 2, current block of Z not diagonalized after 30*N */ -/* > iterations (in inner while loop) */ -/* > = 3, termination criterion of outer while loop not met */ -/* > (program created more than N unreduced blocks) */ -/* > else NCVT = NRU = NCC = 0, */ -/* > the algorithm did not converge; D and E contain the */ -/* > elements of a bidiagonal matrix which is orthogonally */ -/* > similar to the input matrix B; if INFO = i, i */ -/* > elements of E have not converged to zero. */ -/* > \endverbatim */ - -/* > \par Internal Parameters: */ -/* ========================= */ -/* > */ -/* > \verbatim */ -/* > TOLMUL DOUBLE PRECISION, default = max(10,min(100,EPS**(-1/8))) */ -/* > TOLMUL controls the convergence criterion of the QR loop. */ -/* > If it is positive, TOLMUL*EPS is the desired relative */ -/* > precision in the computed singular values. */ -/* > If it is negative, abs(TOLMUL*EPS*sigma_max) is the */ -/* > desired absolute accuracy in the computed singular */ -/* > values (corresponds to relative accuracy */ -/* > abs(TOLMUL*EPS) in the largest singular value. */ -/* > abs(TOLMUL) should be between 1 and 1/EPS, and preferably */ -/* > between 10 (for fast convergence) and .1/EPS */ -/* > (for there to be some accuracy in the results). */ -/* > Default is to lose at either one eighth or 2 of the */ -/* > available decimal digits in each computed singular value */ -/* > (whichever is smaller). */ -/* > */ -/* > MAXITR INTEGER, default = 6 */ -/* > MAXITR controls the maximum number of passes of the */ -/* > algorithm through its inner loop. The algorithms stops */ -/* > (and so fails to converge) if the number of passes */ -/* > through the inner loop exceeds MAXITR*N**2. */ -/* > */ -/* > \endverbatim */ - -/* > \par Note: */ -/* =========== */ -/* > */ -/* > \verbatim */ -/* > Bug report from Cezary Dendek. */ -/* > On March 23rd 2017, the INTEGER variable MAXIT = MAXITR*N**2 is */ -/* > removed since it can overflow pretty easily (for N larger or equal */ -/* > than 18,919). We instead use MAXITDIVN = MAXITR*N. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dbdsqr_(char *uplo, integer *n, integer *ncvt, integer * - nru, integer *ncc, doublereal *d__, doublereal *e, doublereal *vt, - integer *ldvt, doublereal *u, integer *ldu, doublereal *c__, integer * - ldc, doublereal *work, integer *info, ftnlen uplo_len) +int dbdsqr_(char *uplo, integer *n, integer *ncvt, integer *nru, integer *ncc, doublereal *d__, + doublereal *e, doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, + doublereal *c__, integer *ldc, doublereal *work, integer *info, ftnlen uplo_len) { - /* System generated locals */ - integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, - i__2; + integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, i__2; doublereal d__1, d__2, d__3, d__4; - - /* Builtin functions */ - double pow_lmp_dd(doublereal *, doublereal *), sqrt(doublereal), d_lmp_sign( - doublereal *, doublereal *); - - /* Local variables */ + double pow_lmp_dd(doublereal *, doublereal *), sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); integer iterdivn; doublereal f, g, h__; integer i__, j, m; @@ -294,61 +29,28 @@ f"> */ doublereal cosl; integer isub, iter; doublereal unfl, sinl, cosr, smin, smax, sinr; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *), dlas2_( - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *), dscal_(integer *, doublereal *, doublereal *, - integer *); + extern int drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *), + dlas2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), + dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal oldcs; - extern /* Subroutine */ int dlasr_(char *, char *, char *, integer *, - integer *, doublereal *, doublereal *, doublereal *, integer *, - ftnlen, ftnlen, ftnlen); + extern int dlasr_(char *, char *, char *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen); integer oldll; doublereal shift, sigmn, oldsn; - extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern int dswap_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal sminl, sigmx; logical lower; - extern /* Subroutine */ int dlasq1_(integer *, doublereal *, doublereal *, - doublereal *, integer *), dlasv2_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *); + extern int dlasq1_(integer *, doublereal *, doublereal *, doublereal *, integer *), + dlasv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); extern doublereal dlamch_(char *, ftnlen); - extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *), xerbla_(char *, - integer *, ftnlen); + extern int dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), + xerbla_(char *, integer *, ftnlen); doublereal sminoa, thresh; logical rotate; doublereal tolmul; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; --e; vt_dim1 = *ldvt; @@ -361,11 +63,9 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; lower = lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1); - if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lower) { + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lower) { *info = -1; } else if (*n < 0) { *info = -2; @@ -375,11 +75,11 @@ f"> */ *info = -4; } else if (*ncc < 0) { *info = -5; - } else if (*ncvt == 0 && *ldvt < 1 || *ncvt > 0 && *ldvt < max(1,*n)) { + } else if (*ncvt == 0 && *ldvt < 1 || *ncvt > 0 && *ldvt < max(1, *n)) { *info = -9; - } else if (*ldu < max(1,*nru)) { + } else if (*ldu < max(1, *nru)) { *info = -11; - } else if (*ncc == 0 && *ldc < 1 || *ncc > 0 && *ldc < max(1,*n)) { + } else if (*ncc == 0 && *ldc < 1 || *ncc > 0 && *ldc < max(1, *n)) { *info = -13; } if (*info != 0) { @@ -393,37 +93,20 @@ f"> */ if (*n == 1) { goto L160; } - -/* ROTATE is true if any singular vectors desired, false otherwise */ - rotate = *ncvt > 0 || *nru > 0 || *ncc > 0; - -/* If no singular vectors desired, use qd algorithm */ - - if (! rotate) { + if (!rotate) { dlasq1_(n, &d__[1], &e[1], &work[1], info); - -/* If INFO equals 2, dqds didn't finish, try to finish */ - if (*info != 2) { return 0; } *info = 0; } - nm1 = *n - 1; nm12 = nm1 + nm1; nm13 = nm12 + nm1; idir = 0; - -/* Get machine constants */ - eps = dlamch_((char *)"Epsilon", (ftnlen)7); unfl = dlamch_((char *)"Safe minimum", (ftnlen)12); - -/* If matrix lower bidiagonal, rotate to be upper bidiagonal */ -/* by applying Givens rotations on the left */ - if (lower) { i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { @@ -433,54 +116,33 @@ f"> */ d__[i__ + 1] = cs * d__[i__ + 1]; work[i__] = cs; work[nm1 + i__] = sn; -/* L10: */ } - -/* Update singular vectors if desired */ - if (*nru > 0) { - dlasr_((char *)"R", (char *)"V", (char *)"F", nru, n, &work[1], &work[*n], &u[u_offset], - ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, n, &work[1], &work[*n], &u[u_offset], ldu, (ftnlen)1, + (ftnlen)1, (ftnlen)1); } if (*ncc > 0) { - dlasr_((char *)"L", (char *)"V", (char *)"F", n, ncc, &work[1], &work[*n], &c__[c_offset], - ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"L", (char *)"V", (char *)"F", n, ncc, &work[1], &work[*n], &c__[c_offset], ldc, (ftnlen)1, + (ftnlen)1, (ftnlen)1); } } - -/* Compute singular values to relative accuracy TOL */ -/* (By setting TOL to be negative, algorithm will compute */ -/* singular values to absolute accuracy ABS(TOL)*norm(input matrix)) */ - -/* Computing MAX */ -/* Computing MIN */ d__3 = 100., d__4 = pow_lmp_dd(&eps, &c_b15); - d__1 = 10., d__2 = min(d__3,d__4); - tolmul = max(d__1,d__2); + d__1 = 10., d__2 = min(d__3, d__4); + tolmul = max(d__1, d__2); tol = tolmul * eps; - -/* Compute approximate maximum, minimum singular values */ - smax = 0.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { -/* Computing MAX */ d__2 = smax, d__3 = (d__1 = d__[i__], abs(d__1)); - smax = max(d__2,d__3); -/* L20: */ + smax = max(d__2, d__3); } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { -/* Computing MAX */ d__2 = smax, d__3 = (d__1 = e[i__], abs(d__1)); - smax = max(d__2,d__3); -/* L30: */ + smax = max(d__2, d__3); } sminl = 0.; if (tol >= 0.) { - -/* Relative accuracy desired */ - sminoa = abs(d__[1]); if (sminoa == 0.) { goto L50; @@ -488,52 +150,30 @@ f"> */ mu = sminoa; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { - mu = (d__2 = d__[i__], abs(d__2)) * (mu / (mu + (d__1 = e[i__ - 1] - , abs(d__1)))); - sminoa = min(sminoa,mu); + mu = (d__2 = d__[i__], abs(d__2)) * (mu / (mu + (d__1 = e[i__ - 1], abs(d__1)))); + sminoa = min(sminoa, mu); if (sminoa == 0.) { goto L50; } -/* L40: */ } -L50: - sminoa /= sqrt((doublereal) (*n)); -/* Computing MAX */ + L50: + sminoa /= sqrt((doublereal)(*n)); d__1 = tol * sminoa, d__2 = *n * (*n * unfl) * 6; - thresh = max(d__1,d__2); + thresh = max(d__1, d__2); } else { - -/* Absolute accuracy desired */ - -/* Computing MAX */ d__1 = abs(tol) * smax, d__2 = *n * (*n * unfl) * 6; - thresh = max(d__1,d__2); + thresh = max(d__1, d__2); } - -/* Prepare for main iteration loop for the singular values */ -/* (MAXIT is the maximum number of passes through the inner */ -/* loop permitted before nonconvergence signalled.) */ - maxitdivn = *n * 6; iterdivn = 0; iter = -1; oldll = -1; oldm = -1; - -/* M points to last element of unconverged part of matrix */ - m = *n; - -/* Begin main iteration loop */ - L60: - -/* Check for convergence or exceeding iteration count */ - if (m <= 1) { goto L160; } - if (iter >= *n) { iter -= *n; ++iterdivn; @@ -541,9 +181,6 @@ L60: goto L200; } } - -/* Find diagonal block of matrix to work on */ - if (tol < 0. && (d__1 = d__[m], abs(d__1)) <= thresh) { d__[m] = 0.; } @@ -560,95 +197,51 @@ L60: if (abse <= thresh) { goto L80; } - smin = min(smin,abss); -/* Computing MAX */ - d__1 = max(smax,abss); - smax = max(d__1,abse); -/* L70: */ + smin = min(smin, abss); + d__1 = max(smax, abss); + smax = max(d__1, abse); } ll = 0; goto L90; L80: e[ll] = 0.; - -/* Matrix splits since E(LL) = 0 */ - if (ll == m - 1) { - -/* Convergence of bottom singular value, return to top of loop */ - --m; goto L60; } L90: ++ll; - -/* E(LL) through E(M-1) are nonzero, E(LL-1) is zero */ - if (ll == m - 1) { - -/* 2 by 2 block, handle separately */ - - dlasv2_(&d__[m - 1], &e[m - 1], &d__[m], &sigmn, &sigmx, &sinr, &cosr, - &sinl, &cosl); + dlasv2_(&d__[m - 1], &e[m - 1], &d__[m], &sigmn, &sigmx, &sinr, &cosr, &sinl, &cosl); d__[m - 1] = sigmx; e[m - 1] = 0.; d__[m] = sigmn; - -/* Compute singular vectors, if desired */ - if (*ncvt > 0) { - drot_(ncvt, &vt[m - 1 + vt_dim1], ldvt, &vt[m + vt_dim1], ldvt, & - cosr, &sinr); + drot_(ncvt, &vt[m - 1 + vt_dim1], ldvt, &vt[m + vt_dim1], ldvt, &cosr, &sinr); } if (*nru > 0) { - drot_(nru, &u[(m - 1) * u_dim1 + 1], &c__1, &u[m * u_dim1 + 1], & - c__1, &cosl, &sinl); + drot_(nru, &u[(m - 1) * u_dim1 + 1], &c__1, &u[m * u_dim1 + 1], &c__1, &cosl, &sinl); } if (*ncc > 0) { - drot_(ncc, &c__[m - 1 + c_dim1], ldc, &c__[m + c_dim1], ldc, & - cosl, &sinl); + drot_(ncc, &c__[m - 1 + c_dim1], ldc, &c__[m + c_dim1], ldc, &cosl, &sinl); } m += -2; goto L60; } - -/* If working on new submatrix, choose shift direction */ -/* (from larger end diagonal element towards smaller) */ - if (ll > oldm || m < oldll) { if ((d__1 = d__[ll], abs(d__1)) >= (d__2 = d__[m], abs(d__2))) { - -/* Chase bulge from top (big end) to bottom (small end) */ - idir = 1; } else { - -/* Chase bulge from bottom (big end) to top (small end) */ - idir = 2; } } - -/* Apply convergence tests */ - if (idir == 1) { - -/* Run convergence test in forward direction */ -/* First apply standard test to bottom of matrix */ - - if ((d__2 = e[m - 1], abs(d__2)) <= abs(tol) * (d__1 = d__[m], abs( - d__1)) || tol < 0. && (d__3 = e[m - 1], abs(d__3)) <= thresh) - { + if ((d__2 = e[m - 1], abs(d__2)) <= abs(tol) * (d__1 = d__[m], abs(d__1)) || + tol < 0. && (d__3 = e[m - 1], abs(d__3)) <= thresh) { e[m - 1] = 0.; goto L60; } - if (tol >= 0.) { - -/* If relative accuracy desired, */ -/* apply convergence criterion forward */ - mu = (d__1 = d__[ll], abs(d__1)); sminl = mu; i__1 = m - 1; @@ -657,29 +250,17 @@ L90: e[lll] = 0.; goto L60; } - mu = (d__2 = d__[lll + 1], abs(d__2)) * (mu / (mu + (d__1 = e[ - lll], abs(d__1)))); - sminl = min(sminl,mu); -/* L100: */ + mu = (d__2 = d__[lll + 1], abs(d__2)) * (mu / (mu + (d__1 = e[lll], abs(d__1)))); + sminl = min(sminl, mu); } } - } else { - -/* Run convergence test in backward direction */ -/* First apply standard test to top of matrix */ - - if ((d__2 = e[ll], abs(d__2)) <= abs(tol) * (d__1 = d__[ll], abs(d__1) - ) || tol < 0. && (d__3 = e[ll], abs(d__3)) <= thresh) { + if ((d__2 = e[ll], abs(d__2)) <= abs(tol) * (d__1 = d__[ll], abs(d__1)) || + tol < 0. && (d__3 = e[ll], abs(d__3)) <= thresh) { e[ll] = 0.; goto L60; } - if (tol >= 0.) { - -/* If relative accuracy desired, */ -/* apply convergence criterion backward */ - mu = (d__1 = d__[m], abs(d__1)); sminl = mu; i__1 = ll; @@ -688,30 +269,17 @@ L90: e[lll] = 0.; goto L60; } - mu = (d__2 = d__[lll], abs(d__2)) * (mu / (mu + (d__1 = e[lll] - , abs(d__1)))); - sminl = min(sminl,mu); -/* L110: */ + mu = (d__2 = d__[lll], abs(d__2)) * (mu / (mu + (d__1 = e[lll], abs(d__1)))); + sminl = min(sminl, mu); } } } oldll = ll; oldm = m; - -/* Compute shift. First, test if shifting would ruin relative */ -/* accuracy, and if so set the shift to zero. */ - -/* Computing MAX */ d__1 = eps, d__2 = tol * .01; - if (tol >= 0. && *n * tol * (sminl / smax) <= max(d__1,d__2)) { - -/* Use a zero shift to avoid loss of relative accuracy */ - + if (tol >= 0. && *n * tol * (sminl / smax) <= max(d__1, d__2)) { shift = 0.; } else { - -/* Compute the shift from 2-by-2 block at end of matrix */ - if (idir == 1) { sll = (d__1 = d__[ll], abs(d__1)); dlas2_(&d__[m - 1], &e[m - 1], &d__[m], &shift, &r__); @@ -719,30 +287,16 @@ L90: sll = (d__1 = d__[m], abs(d__1)); dlas2_(&d__[ll], &e[ll], &d__[ll + 1], &shift, &r__); } - -/* Test if shift negligible, and if so set to zero */ - if (sll > 0.) { -/* Computing 2nd power */ d__1 = shift / sll; if (d__1 * d__1 < eps) { shift = 0.; } } } - -/* Increment iteration count */ - iter = iter + m - ll; - -/* If SHIFT = 0, do simplified QR iteration */ - if (shift == 0.) { if (idir == 1) { - -/* Chase bulge from top to bottom */ -/* Save cosines and sines for later singular vector updates */ - cs = 1.; oldcs = 1.; i__1 = m - 1; @@ -759,43 +313,29 @@ L90: work[i__ - ll + 1 + nm1] = sn; work[i__ - ll + 1 + nm12] = oldcs; work[i__ - ll + 1 + nm13] = oldsn; -/* L120: */ } h__ = d__[m] * cs; d__[m] = h__ * oldcs; e[m - 1] = h__ * oldsn; - -/* Update singular vectors */ - if (*ncvt > 0) { i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncvt, &work[1], &work[*n], &vt[ - ll + vt_dim1], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncvt, &work[1], &work[*n], &vt[ll + vt_dim1], ldvt, + (ftnlen)1, (ftnlen)1, (ftnlen)1); } if (*nru > 0) { i__1 = m - ll + 1; - dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &i__1, &work[nm12 + 1], &work[nm13 - + 1], &u[ll * u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, - (ftnlen)1); + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &i__1, &work[nm12 + 1], &work[nm13 + 1], + &u[ll * u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); } if (*ncc > 0) { i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncc, &work[nm12 + 1], &work[nm13 - + 1], &c__[ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); + dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncc, &work[nm12 + 1], &work[nm13 + 1], + &c__[ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); } - -/* Test convergence */ - if ((d__1 = e[m - 1], abs(d__1)) <= thresh) { e[m - 1] = 0.; } - } else { - -/* Chase bulge from bottom to top */ -/* Save cosines and sines for later singular vector updates */ - cs = 1.; oldcs = 1.; i__1 = ll + 1; @@ -812,48 +352,33 @@ L90: work[i__ - ll + nm1] = -sn; work[i__ - ll + nm12] = oldcs; work[i__ - ll + nm13] = -oldsn; -/* L130: */ } h__ = d__[ll] * cs; d__[ll] = h__ * oldcs; e[ll] = h__ * oldsn; - -/* Update singular vectors */ - if (*ncvt > 0) { i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncvt, &work[nm12 + 1], &work[ - nm13 + 1], &vt[ll + vt_dim1], ldvt, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); + dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncvt, &work[nm12 + 1], &work[nm13 + 1], + &vt[ll + vt_dim1], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); } if (*nru > 0) { i__1 = m - ll + 1; - dlasr_((char *)"R", (char *)"V", (char *)"B", nru, &i__1, &work[1], &work[*n], &u[ll * - u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"R", (char *)"V", (char *)"B", nru, &i__1, &work[1], &work[*n], &u[ll * u_dim1 + 1], ldu, + (ftnlen)1, (ftnlen)1, (ftnlen)1); } if (*ncc > 0) { i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncc, &work[1], &work[*n], &c__[ - ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncc, &work[1], &work[*n], &c__[ll + c_dim1], ldc, + (ftnlen)1, (ftnlen)1, (ftnlen)1); } - -/* Test convergence */ - if ((d__1 = e[ll], abs(d__1)) <= thresh) { e[ll] = 0.; } } } else { - -/* Use nonzero shift */ - if (idir == 1) { - -/* Chase bulge from top to bottom */ -/* Save cosines and sines for later singular vector updates */ - - f = ((d__1 = d__[ll], abs(d__1)) - shift) * (d_lmp_sign(&c_b49, &d__[ - ll]) + shift / d__[ll]); + f = ((d__1 = d__[ll], abs(d__1)) - shift) * + (d_lmp_sign(&c_b49, &d__[ll]) + shift / d__[ll]); g = e[ll]; i__1 = m - 1; for (i__ = ll; i__ <= i__1; ++i__) { @@ -877,43 +402,28 @@ L90: work[i__ - ll + 1 + nm1] = sinr; work[i__ - ll + 1 + nm12] = cosl; work[i__ - ll + 1 + nm13] = sinl; -/* L140: */ } e[m - 1] = f; - -/* Update singular vectors */ - if (*ncvt > 0) { i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncvt, &work[1], &work[*n], &vt[ - ll + vt_dim1], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncvt, &work[1], &work[*n], &vt[ll + vt_dim1], ldvt, + (ftnlen)1, (ftnlen)1, (ftnlen)1); } if (*nru > 0) { i__1 = m - ll + 1; - dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &i__1, &work[nm12 + 1], &work[nm13 - + 1], &u[ll * u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, - (ftnlen)1); + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &i__1, &work[nm12 + 1], &work[nm13 + 1], + &u[ll * u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); } if (*ncc > 0) { i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncc, &work[nm12 + 1], &work[nm13 - + 1], &c__[ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); + dlasr_((char *)"L", (char *)"V", (char *)"F", &i__1, ncc, &work[nm12 + 1], &work[nm13 + 1], + &c__[ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); } - -/* Test convergence */ - if ((d__1 = e[m - 1], abs(d__1)) <= thresh) { e[m - 1] = 0.; } - } else { - -/* Chase bulge from bottom to top */ -/* Save cosines and sines for later singular vector updates */ - - f = ((d__1 = d__[m], abs(d__1)) - shift) * (d_lmp_sign(&c_b49, &d__[m] - ) + shift / d__[m]); + f = ((d__1 = d__[m], abs(d__1)) - shift) * (d_lmp_sign(&c_b49, &d__[m]) + shift / d__[m]); g = e[m - 1]; i__1 = ll + 1; for (i__ = m; i__ >= i__1; --i__) { @@ -937,66 +447,41 @@ L90: work[i__ - ll + nm1] = -sinr; work[i__ - ll + nm12] = cosl; work[i__ - ll + nm13] = -sinl; -/* L150: */ } e[ll] = f; - -/* Test convergence */ - if ((d__1 = e[ll], abs(d__1)) <= thresh) { e[ll] = 0.; } - -/* Update singular vectors if desired */ - if (*ncvt > 0) { i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncvt, &work[nm12 + 1], &work[ - nm13 + 1], &vt[ll + vt_dim1], ldvt, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); + dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncvt, &work[nm12 + 1], &work[nm13 + 1], + &vt[ll + vt_dim1], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); } if (*nru > 0) { i__1 = m - ll + 1; - dlasr_((char *)"R", (char *)"V", (char *)"B", nru, &i__1, &work[1], &work[*n], &u[ll * - u_dim1 + 1], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"R", (char *)"V", (char *)"B", nru, &i__1, &work[1], &work[*n], &u[ll * u_dim1 + 1], ldu, + (ftnlen)1, (ftnlen)1, (ftnlen)1); } if (*ncc > 0) { i__1 = m - ll + 1; - dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncc, &work[1], &work[*n], &c__[ - ll + c_dim1], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"L", (char *)"V", (char *)"B", &i__1, ncc, &work[1], &work[*n], &c__[ll + c_dim1], ldc, + (ftnlen)1, (ftnlen)1, (ftnlen)1); } } } - -/* QR iteration finished, go back and check convergence */ - goto L60; - -/* All singular values converged, so make them positive */ - L160: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (d__[i__] < 0.) { d__[i__] = -d__[i__]; - -/* Change sign of singular vectors, if desired */ - if (*ncvt > 0) { dscal_(ncvt, &c_b72, &vt[i__ + vt_dim1], ldvt); } } -/* L170: */ } - -/* Sort the singular values into decreasing order (insertion sort on */ -/* singular values, but only one transposition per singular vector) */ - i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Scan for smallest D(I) */ - isub = 1; smin = d__[1]; i__2 = *n + 1 - i__; @@ -1005,33 +490,22 @@ L160: isub = j; smin = d__[j]; } -/* L180: */ } if (isub != *n + 1 - i__) { - -/* Swap singular values and vectors */ - d__[isub] = d__[*n + 1 - i__]; d__[*n + 1 - i__] = smin; if (*ncvt > 0) { - dswap_(ncvt, &vt[isub + vt_dim1], ldvt, &vt[*n + 1 - i__ + - vt_dim1], ldvt); + dswap_(ncvt, &vt[isub + vt_dim1], ldvt, &vt[*n + 1 - i__ + vt_dim1], ldvt); } if (*nru > 0) { - dswap_(nru, &u[isub * u_dim1 + 1], &c__1, &u[(*n + 1 - i__) * - u_dim1 + 1], &c__1); + dswap_(nru, &u[isub * u_dim1 + 1], &c__1, &u[(*n + 1 - i__) * u_dim1 + 1], &c__1); } if (*ncc > 0) { - dswap_(ncc, &c__[isub + c_dim1], ldc, &c__[*n + 1 - i__ + - c_dim1], ldc); + dswap_(ncc, &c__[isub + c_dim1], ldc, &c__[*n + 1 - i__ + c_dim1], ldc); } } -/* L190: */ } goto L220; - -/* Maximum number of iterations exceeded, failure to converge */ - L200: *info = 0; i__1 = *n - 1; @@ -1039,15 +513,10 @@ L200: if (e[i__] != 0.) { ++(*info); } -/* L210: */ } L220: return 0; - -/* End of DBDSQR */ - -} /* dbdsqr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dcabs1.cpp b/lib/linalg/dcabs1.cpp index 54b2b57eab..83332f3177 100644 --- a/lib/linalg/dcabs1.cpp +++ b/lib/linalg/dcabs1.cpp @@ -1,92 +1,14 @@ -/* fortran/dcabs1.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DCABS1 */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* DOUBLE PRECISION FUNCTION DCABS1(Z) */ - -/* .. Scalar Arguments .. */ -/* COMPLEX*16 Z */ -/* .. */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DCABS1 computes |Re(.)| + |Im(.)| of a double complex number */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is COMPLEX*16 */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level1 */ - -/* ===================================================================== */ doublereal dcabs1_(doublecomplex *z__) { - /* System generated locals */ doublereal ret_val, d__1, d__2; - - /* Builtin functions */ double d_lmp_imag(doublecomplex *); - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. */ -/* ===================================================================== */ - -/* .. Intrinsic Functions .. */ - ret_val = (d__1 = z__->r, abs(d__1)) + (d__2 = d_lmp_imag(z__), abs(d__2)); return ret_val; - -/* End of DCABS1 */ - -} /* dcabs1_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dcopy.cpp b/lib/linalg/dcopy.cpp index dceb6ad727..1a7d65fc23 100644 --- a/lib/linalg/dcopy.cpp +++ b/lib/linalg/dcopy.cpp @@ -1,140 +1,17 @@ -/* fortran/dcopy.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DCOPY */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DCOPY(N,DX,INCX,DY,INCY) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,INCY,N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION DX(*),DY(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DCOPY copies a vector, x, to a vector, y. */ -/* > uses unrolled loops for increments equal to 1. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DX */ -/* > \verbatim */ -/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of DX */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DY */ -/* > \verbatim */ -/* > DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > storage spacing between elements of DY */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, linpack, 3/11/78. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dcopy_(integer *n, doublereal *dx, integer *incx, - doublereal *dy, integer *incy) +int dcopy_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy) { - /* System generated locals */ integer i__1; - - /* Local variables */ integer i__, m, ix, iy, mp1; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - /* Parameter adjustments */ --dy; --dx; - - /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { - -/* code for both increments equal to 1 */ - - -/* clean-up loop */ - m = *n % 7; if (m != 0) { i__1 = m; @@ -157,10 +34,6 @@ extern "C" { dy[i__ + 6] = dx[i__ + 6]; } } else { - -/* code for unequal increments or equal increments */ -/* not equal to 1 */ - ix = 1; iy = 1; if (*incx < 0) { @@ -177,11 +50,7 @@ extern "C" { } } return 0; - -/* End of DCOPY */ - -} /* dcopy_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/ddot.cpp b/lib/linalg/ddot.cpp index e2319f6803..58a7075238 100644 --- a/lib/linalg/ddot.cpp +++ b/lib/linalg/ddot.cpp @@ -1,144 +1,21 @@ -/* fortran/ddot.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DDOT */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,INCY,N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION DX(*),DY(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DDOT forms the dot product of two vectors. */ -/* > uses unrolled loops for increments equal to one. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DX */ -/* > \verbatim */ -/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of DX */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DY */ -/* > \verbatim */ -/* > DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > storage spacing between elements of DY */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, linpack, 3/11/78. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -doublereal ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, - integer *incy) +doublereal ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy) { - /* System generated locals */ integer i__1; doublereal ret_val; - - /* Local variables */ integer i__, m, ix, iy, mp1; doublereal dtemp; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - /* Parameter adjustments */ --dy; --dx; - - /* Function Body */ ret_val = 0.; dtemp = 0.; if (*n <= 0) { return ret_val; } if (*incx == 1 && *incy == 1) { - -/* code for both increments equal to 1 */ - - -/* clean-up loop */ - m = *n % 5; if (m != 0) { i__1 = m; @@ -158,10 +35,6 @@ doublereal ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, dx[i__ + 4] * dy[i__ + 4]; } } else { - -/* code for unequal increments or equal increments */ -/* not equal to 1 */ - ix = 1; iy = 1; if (*incx < 0) { @@ -179,11 +52,7 @@ doublereal ddot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, } ret_val = dtemp; return ret_val; - -/* End of DDOT */ - -} /* ddot_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgebd2.cpp b/lib/linalg/dgebd2.cpp index 8c95869e21..ea2ff1bce9 100644 --- a/lib/linalg/dgebd2.cpp +++ b/lib/linalg/dgebd2.cpp @@ -1,254 +1,17 @@ -/* fortran/dgebd2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DGEBD2 reduces a general matrix to bidiagonal form using an unblocked algorithm. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGEBD2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGEBD2( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAUP( * ), */ -/* $ TAUQ( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGEBD2 reduces a real general m by n matrix A to upper or lower */ -/* > bidiagonal form B by an orthogonal transformation: Q**T * A * P = B. */ -/* > */ -/* > If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows in the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns in the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the m by n general matrix to be reduced. */ -/* > On exit, */ -/* > if m >= n, the diagonal and the first superdiagonal are */ -/* > overwritten with the upper bidiagonal matrix B; the */ -/* > elements below the diagonal, with the array TAUQ, represent */ -/* > the orthogonal matrix Q as a product of elementary */ -/* > reflectors, and the elements above the first superdiagonal, */ -/* > with the array TAUP, represent the orthogonal matrix P as */ -/* > a product of elementary reflectors; */ -/* > if m < n, the diagonal and the first subdiagonal are */ -/* > overwritten with the lower bidiagonal matrix B; the */ -/* > elements below the first subdiagonal, with the array TAUQ, */ -/* > represent the orthogonal matrix Q as a product of */ -/* > elementary reflectors, and the elements above the diagonal, */ -/* > with the array TAUP, represent the orthogonal matrix P as */ -/* > a product of elementary reflectors. */ -/* > See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The diagonal elements of the bidiagonal matrix B: */ -/* > D(i) = A(i,i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (min(M,N)-1) */ -/* > The off-diagonal elements of the bidiagonal matrix B: */ -/* > if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1; */ -/* > if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAUQ */ -/* > \verbatim */ -/* > TAUQ is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The scalar factors of the elementary reflectors which */ -/* > represent the orthogonal matrix Q. See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAUP */ -/* > \verbatim */ -/* > TAUP is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The scalar factors of the elementary reflectors which */ -/* > represent the orthogonal matrix P. See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (max(M,N)) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The matrices Q and P are represented as products of elementary */ -/* > reflectors: */ -/* > */ -/* > If m >= n, */ -/* > */ -/* > Q = H(1) H(2) . . . H(n) and P = G(1) G(2) . . . G(n-1) */ -/* > */ -/* > Each H(i) and G(i) has the form: */ -/* > */ -/* > H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T */ -/* > */ -/* > where tauq and taup are real scalars, and v and u are real vectors; */ -/* > v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i); */ -/* > u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n); */ -/* > tauq is stored in TAUQ(i) and taup in TAUP(i). */ -/* > */ -/* > If m < n, */ -/* > */ -/* > Q = H(1) H(2) . . . H(m-1) and P = G(1) G(2) . . . G(m) */ -/* > */ -/* > Each H(i) and G(i) has the form: */ -/* > */ -/* > H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T */ -/* > */ -/* > where tauq and taup are real scalars, and v and u are real vectors; */ -/* > v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i); */ -/* > u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n); */ -/* > tauq is stored in TAUQ(i) and taup in TAUP(i). */ -/* > */ -/* > The contents of A on exit are illustrated by the following examples: */ -/* > */ -/* > m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): */ -/* > */ -/* > ( d e u1 u1 u1 ) ( d u1 u1 u1 u1 u1 ) */ -/* > ( v1 d e u2 u2 ) ( e d u2 u2 u2 u2 ) */ -/* > ( v1 v2 d e u3 ) ( v1 e d u3 u3 u3 ) */ -/* > ( v1 v2 v3 d e ) ( v1 v2 e d u4 u4 ) */ -/* > ( v1 v2 v3 v4 d ) ( v1 v2 v3 e d u5 ) */ -/* > ( v1 v2 v3 v4 v5 ) */ -/* > */ -/* > where d and e denote diagonal and off-diagonal elements of B, vi */ -/* > denotes an element of the vector defining H(i), and ui an element of */ -/* > the vector defining G(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dgebd2_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * - taup, doublereal *work, integer *info) +int dgebd2_(integer *m, integer *n, doublereal *a, integer *lda, doublereal *d__, doublereal *e, + doublereal *tauq, doublereal *taup, doublereal *work, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__; - extern /* Subroutine */ int dlarf_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, ftnlen), dlarfg_(integer *, doublereal *, - doublereal *, integer *, doublereal *), xerbla_(char *, integer *, - ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters */ - - /* Parameter adjustments */ + extern int dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, ftnlen), + dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), + xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -257,14 +20,12 @@ f"> */ --tauq; --taup; --work; - - /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -4; } if (*info < 0) { @@ -272,122 +33,73 @@ f"> */ xerbla_((char *)"DGEBD2", &i__1, (ftnlen)6); return 0; } - if (*m >= *n) { - -/* Reduce to upper bidiagonal form */ - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Generate elementary reflector H(i) to annihilate A(i+1:m,i) */ - i__2 = *m - i__ + 1; -/* Computing MIN */ i__3 = i__ + 1; - dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3,*m) + i__ * - a_dim1], &c__1, &tauq[i__]); + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3, *m) + i__ * a_dim1], &c__1, + &tauq[i__]); d__[i__] = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; - -/* Apply H(i) to A(i:m,i+1:n) from the left */ - if (i__ < *n) { i__2 = *m - i__ + 1; i__3 = *n - i__; - dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, & - tauq[i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1] - , (ftnlen)4); + dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, &tauq[i__], + &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], (ftnlen)4); } a[i__ + i__ * a_dim1] = d__[i__]; - if (i__ < *n) { - -/* Generate elementary reflector G(i) to annihilate */ -/* A(i,i+2:n) */ - i__2 = *n - i__; -/* Computing MIN */ i__3 = i__ + 2; - dlarfg_(&i__2, &a[i__ + (i__ + 1) * a_dim1], &a[i__ + min( - i__3,*n) * a_dim1], lda, &taup[i__]); + dlarfg_(&i__2, &a[i__ + (i__ + 1) * a_dim1], &a[i__ + min(i__3, *n) * a_dim1], lda, + &taup[i__]); e[i__] = a[i__ + (i__ + 1) * a_dim1]; a[i__ + (i__ + 1) * a_dim1] = 1.; - -/* Apply G(i) to A(i+1:m,i+1:n) from the right */ - i__2 = *m - i__; i__3 = *n - i__; - dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + (i__ + 1) * a_dim1], - lda, &taup[i__], &a[i__ + 1 + (i__ + 1) * a_dim1], - lda, &work[1], (ftnlen)5); + dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + (i__ + 1) * a_dim1], lda, &taup[i__], + &a[i__ + 1 + (i__ + 1) * a_dim1], lda, &work[1], (ftnlen)5); a[i__ + (i__ + 1) * a_dim1] = e[i__]; } else { taup[i__] = 0.; } -/* L10: */ } } else { - -/* Reduce to lower bidiagonal form */ - i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Generate elementary reflector G(i) to annihilate A(i,i+1:n) */ - i__2 = *n - i__ + 1; -/* Computing MIN */ i__3 = i__ + 1; - dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3,*n) * - a_dim1], lda, &taup[i__]); + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3, *n) * a_dim1], lda, + &taup[i__]); d__[i__] = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; - -/* Apply G(i) to A(i+1:m,i:n) from the right */ - if (i__ < *m) { i__2 = *m - i__; i__3 = *n - i__ + 1; - dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, & - taup[i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1], - (ftnlen)5); + dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, &taup[i__], + &a[i__ + 1 + i__ * a_dim1], lda, &work[1], (ftnlen)5); } a[i__ + i__ * a_dim1] = d__[i__]; - if (i__ < *m) { - -/* Generate elementary reflector H(i) to annihilate */ -/* A(i+2:m,i) */ - i__2 = *m - i__; -/* Computing MIN */ i__3 = i__ + 2; - dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*m) + - i__ * a_dim1], &c__1, &tauq[i__]); + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3, *m) + i__ * a_dim1], &c__1, + &tauq[i__]); e[i__] = a[i__ + 1 + i__ * a_dim1]; a[i__ + 1 + i__ * a_dim1] = 1.; - -/* Apply H(i) to A(i+1:m,i+1:n) from the left */ - i__2 = *m - i__; i__3 = *n - i__; - dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + 1 + i__ * a_dim1], & - c__1, &tauq[i__], &a[i__ + 1 + (i__ + 1) * a_dim1], - lda, &work[1], (ftnlen)4); + dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + 1 + i__ * a_dim1], &c__1, &tauq[i__], + &a[i__ + 1 + (i__ + 1) * a_dim1], lda, &work[1], (ftnlen)4); a[i__ + 1 + i__ * a_dim1] = e[i__]; } else { tauq[i__] = 0.; } -/* L20: */ } } return 0; - -/* End of DGEBD2 */ - -} /* dgebd2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgebrd.cpp b/lib/linalg/dgebrd.cpp index 0be33bde5c..d62e506c41 100644 --- a/lib/linalg/dgebrd.cpp +++ b/lib/linalg/dgebrd.cpp @@ -1,285 +1,32 @@ -/* fortran/dgebrd.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; static doublereal c_b21 = -1.; static doublereal c_b22 = 1.; - -/* > \brief \b DGEBRD */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGEBRD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, */ -/* INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAUP( * ), */ -/* $ TAUQ( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGEBRD reduces a general real M-by-N matrix A to upper or lower */ -/* > bidiagonal form B by an orthogonal transformation: Q**T * A * P = B. */ -/* > */ -/* > If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows in the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns in the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the M-by-N general matrix to be reduced. */ -/* > On exit, */ -/* > if m >= n, the diagonal and the first superdiagonal are */ -/* > overwritten with the upper bidiagonal matrix B; the */ -/* > elements below the diagonal, with the array TAUQ, represent */ -/* > the orthogonal matrix Q as a product of elementary */ -/* > reflectors, and the elements above the first superdiagonal, */ -/* > with the array TAUP, represent the orthogonal matrix P as */ -/* > a product of elementary reflectors; */ -/* > if m < n, the diagonal and the first subdiagonal are */ -/* > overwritten with the lower bidiagonal matrix B; the */ -/* > elements below the first subdiagonal, with the array TAUQ, */ -/* > represent the orthogonal matrix Q as a product of */ -/* > elementary reflectors, and the elements above the diagonal, */ -/* > with the array TAUP, represent the orthogonal matrix P as */ -/* > a product of elementary reflectors. */ -/* > See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The diagonal elements of the bidiagonal matrix B: */ -/* > D(i) = A(i,i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (min(M,N)-1) */ -/* > The off-diagonal elements of the bidiagonal matrix B: */ -/* > if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1; */ -/* > if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAUQ */ -/* > \verbatim */ -/* > TAUQ is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The scalar factors of the elementary reflectors which */ -/* > represent the orthogonal matrix Q. See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAUP */ -/* > \verbatim */ -/* > TAUP is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The scalar factors of the elementary reflectors which */ -/* > represent the orthogonal matrix P. See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The length of the array WORK. LWORK >= max(1,M,N). */ -/* > For optimum performance LWORK >= (M+N)*NB, where NB */ -/* > is the optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The matrices Q and P are represented as products of elementary */ -/* > reflectors: */ -/* > */ -/* > If m >= n, */ -/* > */ -/* > Q = H(1) H(2) . . . H(n) and P = G(1) G(2) . . . G(n-1) */ -/* > */ -/* > Each H(i) and G(i) has the form: */ -/* > */ -/* > H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T */ -/* > */ -/* > where tauq and taup are real scalars, and v and u are real vectors; */ -/* > v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i); */ -/* > u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n); */ -/* > tauq is stored in TAUQ(i) and taup in TAUP(i). */ -/* > */ -/* > If m < n, */ -/* > */ -/* > Q = H(1) H(2) . . . H(m-1) and P = G(1) G(2) . . . G(m) */ -/* > */ -/* > Each H(i) and G(i) has the form: */ -/* > */ -/* > H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T */ -/* > */ -/* > where tauq and taup are real scalars, and v and u are real vectors; */ -/* > v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i); */ -/* > u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n); */ -/* > tauq is stored in TAUQ(i) and taup in TAUP(i). */ -/* > */ -/* > The contents of A on exit are illustrated by the following examples: */ -/* > */ -/* > m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): */ -/* > */ -/* > ( d e u1 u1 u1 ) ( d u1 u1 u1 u1 u1 ) */ -/* > ( v1 d e u2 u2 ) ( e d u2 u2 u2 u2 ) */ -/* > ( v1 v2 d e u3 ) ( v1 e d u3 u3 u3 ) */ -/* > ( v1 v2 v3 d e ) ( v1 v2 e d u4 u4 ) */ -/* > ( v1 v2 v3 v4 d ) ( v1 v2 v3 e d u5 ) */ -/* > ( v1 v2 v3 v4 v5 ) */ -/* > */ -/* > where d and e denote diagonal and off-diagonal elements of B, vi */ -/* > denotes an element of the vector defining H(i), and ui an element of */ -/* > the vector defining G(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dgebrd_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * - taup, doublereal *work, integer *lwork, integer *info) +int dgebrd_(integer *m, integer *n, doublereal *a, integer *lda, doublereal *d__, doublereal *e, + doublereal *tauq, doublereal *taup, doublereal *work, integer *lwork, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; - - /* Local variables */ integer i__, j, nb, nx, ws; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); integer nbmin, iinfo, minmn; - extern /* Subroutine */ int dgebd2_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *), dlabrd_(integer *, integer *, integer * - , doublereal *, integer *, doublereal *, doublereal *, doublereal - *, doublereal *, doublereal *, integer *, doublereal *, integer *) - , xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dgebd2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *), + dlabrd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, + integer *), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); integer ldwrkx, ldwrky, lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -288,26 +35,21 @@ f"> */ --tauq; --taup; --work; - - /* Function Body */ *info = 0; -/* Computing MAX */ - i__1 = 1, i__2 = ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, ( - ftnlen)6, (ftnlen)1); - nb = max(i__1,i__2); + i__1 = 1, i__2 = ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nb = max(i__1, i__2); lwkopt = (*m + *n) * nb; - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -4; - } else /* if(complicated condition) */ { -/* Computing MAX */ - i__1 = max(1,*m); - if (*lwork < max(i__1,*n) && ! lquery) { + } else { + i__1 = max(1, *m); + if (*lwork < max(i__1, *n) && !lquery) { *info = -10; } } @@ -318,39 +60,21 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - - minmn = min(*m,*n); + minmn = min(*m, *n); if (minmn == 0) { work[1] = 1.; return 0; } - - ws = max(*m,*n); + ws = max(*m, *n); ldwrkx = *m; ldwrky = *n; - if (nb > 1 && nb < minmn) { - -/* Set the crossover point NX. */ - -/* Computing MAX */ - i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); - -/* Determine when to switch from blocked to unblocked code. */ - + i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1, i__2); if (nx < minmn) { ws = (*m + *n) * nb; if (*lwork < ws) { - -/* Not enough work space for the optimal NB, consider using */ -/* a smaller block size. */ - - nbmin = ilaenv_(&c__2, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, ( - ftnlen)6, (ftnlen)1); + nbmin = ilaenv_(&c__2, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); if (*lwork >= (*m + *n) * nbmin) { nb = *lwork / (*m + *n); } else { @@ -362,70 +86,44 @@ f"> */ } else { nx = minmn; } - i__1 = minmn - nx; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { - -/* Reduce rows and columns i:i+nb-1 to bidiagonal form and return */ -/* the matrices X and Y which are needed to update the unreduced */ -/* part of the matrix */ - i__3 = *m - i__ + 1; i__4 = *n - i__ + 1; - dlabrd_(&i__3, &i__4, &nb, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[ - i__], &tauq[i__], &taup[i__], &work[1], &ldwrkx, &work[ldwrkx - * nb + 1], &ldwrky); - -/* Update the trailing submatrix A(i+nb:m,i+nb:n), using an update */ -/* of the form A := A - V*Y**T - X*U**T */ - + dlabrd_(&i__3, &i__4, &nb, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], &tauq[i__], + &taup[i__], &work[1], &ldwrkx, &work[ldwrkx * nb + 1], &ldwrky); i__3 = *m - i__ - nb + 1; i__4 = *n - i__ - nb + 1; - dgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &i__4, &nb, &c_b21, &a[i__ - + nb + i__ * a_dim1], lda, &work[ldwrkx * nb + nb + 1], & - ldwrky, &c_b22, &a[i__ + nb + (i__ + nb) * a_dim1], lda, ( - ftnlen)12, (ftnlen)9); + dgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &i__4, &nb, &c_b21, &a[i__ + nb + i__ * a_dim1], + lda, &work[ldwrkx * nb + nb + 1], &ldwrky, &c_b22, + &a[i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)12, (ftnlen)9); i__3 = *m - i__ - nb + 1; i__4 = *n - i__ - nb + 1; - dgemm_((char *)"No transpose", (char *)"No transpose", &i__3, &i__4, &nb, &c_b21, & - work[nb + 1], &ldwrkx, &a[i__ + (i__ + nb) * a_dim1], lda, & - c_b22, &a[i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)12, ( - ftnlen)12); - -/* Copy diagonal and off-diagonal elements of B back into A */ - + dgemm_((char *)"No transpose", (char *)"No transpose", &i__3, &i__4, &nb, &c_b21, &work[nb + 1], &ldwrkx, + &a[i__ + (i__ + nb) * a_dim1], lda, &c_b22, &a[i__ + nb + (i__ + nb) * a_dim1], lda, + (ftnlen)12, (ftnlen)12); if (*m >= *n) { i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { a[j + j * a_dim1] = d__[j]; a[j + (j + 1) * a_dim1] = e[j]; -/* L10: */ } } else { i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { a[j + j * a_dim1] = d__[j]; a[j + 1 + j * a_dim1] = e[j]; -/* L20: */ } } -/* L30: */ } - -/* Use unblocked code to reduce the remainder of the matrix */ - i__2 = *m - i__ + 1; i__1 = *n - i__ + 1; - dgebd2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], & - tauq[i__], &taup[i__], &work[1], &iinfo); - work[1] = (doublereal) ws; + dgebd2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], &tauq[i__], &taup[i__], + &work[1], &iinfo); + work[1] = (doublereal)ws; return 0; - -/* End of DGEBRD */ - -} /* dgebrd_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgecon.cpp b/lib/linalg/dgecon.cpp index 76a0186cc8..01604f5f5d 100644 --- a/lib/linalg/dgecon.cpp +++ b/lib/linalg/dgecon.cpp @@ -1,157 +1,13 @@ -/* fortran/dgecon.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DGECON */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGECON + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, IWORK, */ -/* INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER NORM */ -/* INTEGER INFO, LDA, N */ -/* DOUBLE PRECISION ANORM, RCOND */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IWORK( * ) */ -/* DOUBLE PRECISION A( LDA, * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGECON estimates the reciprocal of the condition number of a general */ -/* > real matrix A, in either the 1-norm or the infinity-norm, using */ -/* > the LU factorization computed by DGETRF. */ -/* > */ -/* > An estimate is obtained for norm(inv(A)), and the reciprocal of the */ -/* > condition number is computed as */ -/* > RCOND = 1 / ( norm(A) * norm(inv(A)) ). */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] NORM */ -/* > \verbatim */ -/* > NORM is CHARACTER*1 */ -/* > Specifies whether the 1-norm condition number or the */ -/* > infinity-norm condition number is required: */ -/* > = '1' or 'O': 1-norm; */ -/* > = 'I': Infinity-norm. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > The factors L and U from the factorization A = P*L*U */ -/* > as computed by DGETRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ANORM */ -/* > \verbatim */ -/* > ANORM is DOUBLE PRECISION */ -/* > If NORM = '1' or 'O', the 1-norm of the original matrix A. */ -/* > If NORM = 'I', the infinity-norm of the original matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RCOND */ -/* > \verbatim */ -/* > RCOND is DOUBLE PRECISION */ -/* > The reciprocal of the condition number of the matrix A, */ -/* > computed as RCOND = 1/(norm(A) * norm(inv(A))). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (4*N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension (N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dgecon_(char *norm, integer *n, doublereal *a, integer * - lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * - iwork, integer *info, ftnlen norm_len) +int dgecon_(char *norm, integer *n, doublereal *a, integer *lda, doublereal *anorm, + doublereal *rcond, doublereal *work, integer *iwork, integer *info, ftnlen norm_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1; doublereal d__1; - - /* Local variables */ doublereal sl; integer ix; doublereal su; @@ -159,64 +15,31 @@ f"> */ doublereal scale; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer isave[3]; - extern /* Subroutine */ int drscl_(integer *, doublereal *, doublereal *, - integer *), dlacn2_(integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *); + extern int drscl_(integer *, doublereal *, doublereal *, integer *), + dlacn2_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, + integer *); extern doublereal dlamch_(char *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); doublereal ainvnm; - extern /* Subroutine */ int dlatrs_(char *, char *, char *, char *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int dlatrs_(char *, char *, char *, char *, integer *, doublereal *, integer *, + doublereal *, doublereal *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen); logical onenrm; char normin[1]; doublereal smlnum; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Local Arrays .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; --iwork; - - /* Function Body */ *info = 0; - onenrm = *(unsigned char *)norm == '1' || lsame_(norm, (char *)"O", (ftnlen)1, ( - ftnlen)1); - if (! onenrm && ! lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1)) { + onenrm = *(unsigned char *)norm == '1' || lsame_(norm, (char *)"O", (ftnlen)1, (ftnlen)1); + if (!onenrm && !lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -4; } else if (*anorm < 0.) { *info = -5; @@ -226,9 +49,6 @@ f"> */ xerbla_((char *)"DGECON", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - *rcond = 0.; if (*n == 0) { *rcond = 1.; @@ -236,11 +56,7 @@ f"> */ } else if (*anorm == 0.) { return 0; } - smlnum = dlamch_((char *)"Safe minimum", (ftnlen)12); - -/* Estimate the norm of inv(A). */ - ainvnm = 0.; *(unsigned char *)normin = 'N'; if (onenrm) { @@ -253,61 +69,33 @@ L10: dlacn2_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase, isave); if (kase != 0) { if (kase == kase1) { - -/* Multiply by inv(L). */ - - dlatrs_((char *)"Lower", (char *)"No transpose", (char *)"Unit", normin, n, &a[a_offset], - lda, &work[1], &sl, &work[(*n << 1) + 1], info, (ftnlen)5, - (ftnlen)12, (ftnlen)4, (ftnlen)1); - -/* Multiply by inv(U). */ - - dlatrs_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", normin, n, &a[ - a_offset], lda, &work[1], &su, &work[*n * 3 + 1], info, ( - ftnlen)5, (ftnlen)12, (ftnlen)8, (ftnlen)1); + dlatrs_((char *)"Lower", (char *)"No transpose", (char *)"Unit", normin, n, &a[a_offset], lda, &work[1], &sl, + &work[(*n << 1) + 1], info, (ftnlen)5, (ftnlen)12, (ftnlen)4, (ftnlen)1); + dlatrs_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", normin, n, &a[a_offset], lda, &work[1], + &su, &work[*n * 3 + 1], info, (ftnlen)5, (ftnlen)12, (ftnlen)8, (ftnlen)1); } else { - -/* Multiply by inv(U**T). */ - - dlatrs_((char *)"Upper", (char *)"Transpose", (char *)"Non-unit", normin, n, &a[a_offset], - lda, &work[1], &su, &work[*n * 3 + 1], info, (ftnlen)5, ( - ftnlen)9, (ftnlen)8, (ftnlen)1); - -/* Multiply by inv(L**T). */ - - dlatrs_((char *)"Lower", (char *)"Transpose", (char *)"Unit", normin, n, &a[a_offset], - lda, &work[1], &sl, &work[(*n << 1) + 1], info, (ftnlen)5, - (ftnlen)9, (ftnlen)4, (ftnlen)1); + dlatrs_((char *)"Upper", (char *)"Transpose", (char *)"Non-unit", normin, n, &a[a_offset], lda, &work[1], &su, + &work[*n * 3 + 1], info, (ftnlen)5, (ftnlen)9, (ftnlen)8, (ftnlen)1); + dlatrs_((char *)"Lower", (char *)"Transpose", (char *)"Unit", normin, n, &a[a_offset], lda, &work[1], &sl, + &work[(*n << 1) + 1], info, (ftnlen)5, (ftnlen)9, (ftnlen)4, (ftnlen)1); } - -/* Divide X by 1/(SL*SU) if doing so will not cause overflow. */ - scale = sl * su; *(unsigned char *)normin = 'Y'; if (scale != 1.) { ix = idamax_(n, &work[1], &c__1); - if (scale < (d__1 = work[ix], abs(d__1)) * smlnum || scale == 0.) - { + if (scale < (d__1 = work[ix], abs(d__1)) * smlnum || scale == 0.) { goto L20; } drscl_(n, &scale, &work[1], &c__1); } goto L10; } - -/* Compute the estimate of the reciprocal condition number. */ - if (ainvnm != 0.) { *rcond = 1. / ainvnm / *anorm; } - L20: return 0; - -/* End of DGECON */ - -} /* dgecon_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgelq2.cpp b/lib/linalg/dgelq2.cpp index fec5ae2c50..dbb3e17a27 100644 --- a/lib/linalg/dgelq2.cpp +++ b/lib/linalg/dgelq2.cpp @@ -1,204 +1,28 @@ -/* fortran/dgelq2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DGELQ2 computes the LQ factorization of a general rectangular matrix using an unblocked algorit -hm. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGELQ2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGELQ2( M, N, A, LDA, TAU, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGELQ2 computes an LQ factorization of a real m-by-n matrix A: */ -/* > */ -/* > A = ( L 0 ) * Q */ -/* > */ -/* > where: */ -/* > */ -/* > Q is a n-by-n orthogonal matrix; */ -/* > L is a lower-triangular m-by-m matrix; */ -/* > 0 is a m-by-(n-m) zero matrix, if m < n. */ -/* > */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the m by n matrix A. */ -/* > On exit, the elements on and below the diagonal of the array */ -/* > contain the m by min(m,n) lower trapezoidal matrix L (L is */ -/* > lower triangular if m <= n); the elements above the diagonal, */ -/* > with the array TAU, represent the orthogonal matrix Q as a */ -/* > product of elementary reflectors (see Further Details). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The scalar factors of the elementary reflectors (see Further */ -/* > Details). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (M) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The matrix Q is represented as a product of elementary reflectors */ -/* > */ -/* > Q = H(k) . . . H(2) H(1), where k = min(m,n). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**T */ -/* > */ -/* > where tau is a real scalar, and v is a real vector with */ -/* > v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n), */ -/* > and tau in TAU(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dgelq2_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *tau, doublereal *work, integer *info) +int dgelq2_(integer *m, integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal *work, + integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, k; doublereal aii; - extern /* Subroutine */ int dlarf_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, ftnlen), dlarfg_(integer *, doublereal *, - doublereal *, integer *, doublereal *), xerbla_(char *, integer *, - ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ + extern int dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, ftnlen), + dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), + xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -4; } if (*info != 0) { @@ -206,40 +30,24 @@ f"> */ xerbla_((char *)"DGELQ2", &i__1, (ftnlen)6); return 0; } - - k = min(*m,*n); - + k = min(*m, *n); i__1 = k; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Generate elementary reflector H(i) to annihilate A(i,i+1:n) */ - i__2 = *n - i__ + 1; -/* Computing MIN */ i__3 = i__ + 1; - dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3,*n) * a_dim1] - , lda, &tau[i__]); + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3, *n) * a_dim1], lda, &tau[i__]); if (i__ < *m) { - -/* Apply H(i) to A(i+1:m,i:n) from the right */ - aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; i__2 = *m - i__; i__3 = *n - i__ + 1; - dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[ - i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1], (ftnlen) - 5); + dlarf_((char *)"Right", &i__2, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[i__], + &a[i__ + 1 + i__ * a_dim1], lda, &work[1], (ftnlen)5); a[i__ + i__ * a_dim1] = aii; } -/* L10: */ } return 0; - -/* End of DGELQ2 */ - -} /* dgelq2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgelqf.cpp b/lib/linalg/dgelqf.cpp index f6e60e5bcf..0d48361669 100644 --- a/lib/linalg/dgelqf.cpp +++ b/lib/linalg/dgelqf.cpp @@ -1,237 +1,45 @@ -/* fortran/dgelqf.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; - -/* > \brief \b DGELQF */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGELQF + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGELQF computes an LQ factorization of a real M-by-N matrix A: */ -/* > */ -/* > A = ( L 0 ) * Q */ -/* > */ -/* > where: */ -/* > */ -/* > Q is a N-by-N orthogonal matrix; */ -/* > L is a lower-triangular M-by-M matrix; */ -/* > 0 is a M-by-(N-M) zero matrix, if M < N. */ -/* > */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the M-by-N matrix A. */ -/* > On exit, the elements on and below the diagonal of the array */ -/* > contain the m-by-min(m,n) lower trapezoidal matrix L (L is */ -/* > lower triangular if m <= n); the elements above the diagonal, */ -/* > with the array TAU, represent the orthogonal matrix Q as a */ -/* > product of elementary reflectors (see Further Details). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The scalar factors of the elementary reflectors (see Further */ -/* > Details). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= max(1,M). */ -/* > For optimum performance LWORK >= M*NB, where NB is the */ -/* > optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The matrix Q is represented as a product of elementary reflectors */ -/* > */ -/* > Q = H(k) . . . H(2) H(1), where k = min(m,n). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**T */ -/* > */ -/* > where tau is a real scalar, and v is a real vector with */ -/* > v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n), */ -/* > and tau in TAU(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dgelqf_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) +int dgelqf_(integer *m, integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal *work, + integer *lwork, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; - - /* Local variables */ integer i__, k, ib, nb, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int dgelq2_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *), dlarfb_(char *, - char *, char *, char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, - ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dgelq2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *), + dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen, ftnlen), + dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; - nb = ilaenv_(&c__1, (char *)"DGELQF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen) - 1); + nb = ilaenv_(&c__1, (char *)"DGELQF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); lwkopt = *m * nb; - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -4; - } else if (*lwork < max(1,*m) && ! lquery) { + } else if (*lwork < max(1, *m) && !lquery) { *info = -7; } if (*info != 0) { @@ -241,105 +49,58 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - - k = min(*m,*n); + k = min(*m, *n); if (k == 0) { work[1] = 1.; return 0; } - nbmin = 2; nx = 0; iws = *m; if (nb > 1 && nb < k) { - -/* Determine when to cross over from blocked to unblocked code. */ - -/* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DGELQF", (char *)" ", m, n, &c_n1, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DGELQF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1, i__2); if (nx < k) { - -/* Determine if workspace is large enough for blocked code. */ - ldwork = *m; iws = ldwork * nb; if (*lwork < iws) { - -/* Not enough workspace to use optimal NB: reduce NB and */ -/* determine the minimum value of NB. */ - nb = *lwork / ldwork; -/* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DGELQF", (char *)" ", m, n, &c_n1, & - c_n1, (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"DGELQF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); } } } - if (nb >= nbmin && nb < k && nx < k) { - -/* Use blocked code initially */ - i__1 = k - nx; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { -/* Computing MIN */ i__3 = k - i__ + 1; - ib = min(i__3,nb); - -/* Compute the LQ factorization of the current block */ -/* A(i:i+ib-1,i:n) */ - + ib = min(i__3, nb); i__3 = *n - i__ + 1; - dgelq2_(&ib, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ - 1], &iinfo); + dgelq2_(&ib, &i__3, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &iinfo); if (i__ + ib <= *m) { - -/* Form the triangular factor of the block reflector */ -/* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__3 = *n - i__ + 1; - dlarft_((char *)"Forward", (char *)"Rowwise", &i__3, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, - (ftnlen)7); - -/* Apply H to A(i+ib:m,i:n) from the right */ - + dlarft_((char *)"Forward", (char *)"Rowwise", &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], + &work[1], &ldwork, (ftnlen)7, (ftnlen)7); i__3 = *m - i__ - ib + 1; i__4 = *n - i__ + 1; - dlarfb_((char *)"Right", (char *)"No transpose", (char *)"Forward", (char *)"Rowwise", &i__3, - &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & - ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[ib + - 1], &ldwork, (ftnlen)5, (ftnlen)12, (ftnlen)7, ( - ftnlen)7); + dlarfb_((char *)"Right", (char *)"No transpose", (char *)"Forward", (char *)"Rowwise", &i__3, &i__4, &ib, + &a[i__ + i__ * a_dim1], lda, &work[1], &ldwork, &a[i__ + ib + i__ * a_dim1], + lda, &work[ib + 1], &ldwork, (ftnlen)5, (ftnlen)12, (ftnlen)7, (ftnlen)7); } -/* L10: */ } } else { i__ = 1; } - -/* Use unblocked code to factor the last or only block. */ - if (i__ <= k) { i__2 = *m - i__ + 1; i__1 = *n - i__ + 1; - dgelq2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1] - , &iinfo); + dgelq2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &iinfo); } - - work[1] = (doublereal) iws; + work[1] = (doublereal)iws; return 0; - -/* End of DGELQF */ - -} /* dgelqf_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgelsd.cpp b/lib/linalg/dgelsd.cpp index ffe7446f85..479d95dd61 100644 --- a/lib/linalg/dgelsd.cpp +++ b/lib/linalg/dgelsd.cpp @@ -1,322 +1,60 @@ -/* fortran/dgelsd.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__6 = 6; static integer c_n1 = -1; static integer c__9 = 9; static integer c__0 = 0; static integer c__1 = 1; static doublereal c_b82 = 0.; - -/* > \brief DGELSD computes the minimum-norm solution to a linear least squares problem for GE matrices */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGELSD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGELSD( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, */ -/* WORK, LWORK, IWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS, RANK */ -/* DOUBLE PRECISION RCOND */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IWORK( * ) */ -/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), S( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGELSD computes the minimum-norm solution to a real linear least */ -/* > squares problem: */ -/* > minimize 2-norm(| b - A*x |) */ -/* > using the singular value decomposition (SVD) of A. A is an M-by-N */ -/* > matrix which may be rank-deficient. */ -/* > */ -/* > Several right hand side vectors b and solution vectors x can be */ -/* > handled in a single call; they are stored as the columns of the */ -/* > M-by-NRHS right hand side matrix B and the N-by-NRHS solution */ -/* > matrix X. */ -/* > */ -/* > The problem is solved in three steps: */ -/* > (1) Reduce the coefficient matrix A to bidiagonal form with */ -/* > Householder transformations, reducing the original problem */ -/* > into a (char *)"bidiagonal least squares problem" (BLS) */ -/* > (2) Solve the BLS using a divide and conquer approach. */ -/* > (3) Apply back all the Householder transformations to solve */ -/* > the original least squares problem. */ -/* > */ -/* > The effective rank of A is determined by treating as zero those */ -/* > singular values which are less than RCOND times the largest singular */ -/* > value. */ -/* > */ -/* > The divide and conquer algorithm makes very mild assumptions about */ -/* > floating point arithmetic. It will work on machines with a guard */ -/* > digit in add/subtract, or on those binary machines without guard */ -/* > digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ -/* > Cray-2. It could conceivably fail on hexadecimal or decimal machines */ -/* > without guard digits, but we know of none. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NRHS */ -/* > \verbatim */ -/* > NRHS is INTEGER */ -/* > The number of right hand sides, i.e., the number of columns */ -/* > of the matrices B and X. NRHS >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the M-by-N matrix A. */ -/* > On exit, A has been destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ -/* > On entry, the M-by-NRHS right hand side matrix B. */ -/* > On exit, B is overwritten by the N-by-NRHS solution */ -/* > matrix X. If m >= n and RANK = n, the residual */ -/* > sum-of-squares for the solution in the i-th column is given */ -/* > by the sum of squares of elements n+1:m in that column. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >= max(1,max(M,N)). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The singular values of A in decreasing order. */ -/* > The condition number of A in the 2-norm = S(1)/S(min(m,n)). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RCOND */ -/* > \verbatim */ -/* > RCOND is DOUBLE PRECISION */ -/* > RCOND is used to determine the effective rank of A. */ -/* > Singular values S(i) <= RCOND*S(1) are treated as zero. */ -/* > If RCOND < 0, machine precision is used instead. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RANK */ -/* > \verbatim */ -/* > RANK is INTEGER */ -/* > The effective rank of A, i.e., the number of singular values */ -/* > which are greater than RCOND*S(1). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK must be at least 1. */ -/* > The exact minimum amount of workspace needed depends on M, */ -/* > N and NRHS. As long as LWORK is at least */ -/* > 12*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS + (SMLSIZ+1)**2, */ -/* > if M is greater than or equal to N or */ -/* > 12*M + 2*M*SMLSIZ + 8*M*NLVL + M*NRHS + (SMLSIZ+1)**2, */ -/* > if M is less than N, the code will execute correctly. */ -/* > SMLSIZ is returned by ILAENV and is equal to the maximum */ -/* > size of the subproblems at the bottom of the computation */ -/* > tree (usually about 25), and */ -/* > NLVL = MAX( 0, INT( LOG_2( MIN( M,N )/(SMLSIZ+1) ) ) + 1 ) */ -/* > For good performance, LWORK should generally be larger. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension (MAX(1,LIWORK)) */ -/* > LIWORK >= max(1, 3 * MINMN * NLVL + 11 * MINMN), */ -/* > where MINMN = MIN( M,N ). */ -/* > On exit, if INFO = 0, IWORK(1) returns the minimum LIWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: the algorithm for computing the SVD failed to converge; */ -/* > if INFO = i, i off-diagonal elements of an intermediate */ -/* > bidiagonal form did not converge to zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEsolve */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ming Gu and Ren-Cang Li, Computer Science Division, University of */ -/* > California at Berkeley, USA \n */ -/* > Osni Marques, LBNL/NERSC, USA \n */ - -/* ===================================================================== */ -/* Subroutine */ int dgelsd_(integer *m, integer *n, integer *nrhs, - doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * - s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, - integer *iwork, integer *info) +int dgelsd_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, + integer *ldb, doublereal *s, doublereal *rcond, integer *rank, doublereal *work, + integer *lwork, integer *iwork, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; - - /* Builtin functions */ double log(doublereal); - - /* Local variables */ integer ie, il, mm; doublereal eps, anrm, bnrm; integer itau, nlvl, iascl, ibscl; doublereal sfmin; integer minmn, maxmn, itaup, itauq, mnthr, nwork; - extern /* Subroutine */ int dlabad_(doublereal *, doublereal *), dgebrd_( - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *, - integer *); - extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, ftnlen); - extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, integer *), - dlalsd_(char *, integer *, integer *, integer *, doublereal *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, integer *, integer *, ftnlen), dlascl_(char *, - integer *, integer *, doublereal *, doublereal *, integer *, - integer *, doublereal *, integer *, integer *, ftnlen), dgeqrf_( - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, integer *), dlacpy_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - ftnlen), dlaset_(char *, integer *, integer *, doublereal *, - doublereal *, doublereal *, integer *, ftnlen), xerbla_(char *, - integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dlabad_(doublereal *, doublereal *), + dgebrd_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, integer *); + extern doublereal dlamch_(char *, ftnlen), + dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *, ftnlen); + extern int dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, integer *), + dlalsd_(char *, integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, integer *, ftnlen), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen), + dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, integer *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); doublereal bignum; - extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *, - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, integer *, - ftnlen, ftnlen, ftnlen); + extern int dormbr_(char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, + integer *, ftnlen, ftnlen, ftnlen); integer wlalsd; - extern /* Subroutine */ int dormlq_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + extern int dormlq_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen); integer ldwork; - extern /* Subroutine */ int dormqr_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + extern int dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen); integer liwork, minwrk, maxwrk; doublereal smlnum; logical lquery; integer smlsiz; - - -/* -- LAPACK driver routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -326,13 +64,10 @@ f"> */ --s; --work; --iwork; - - /* Function Body */ *info = 0; - minmn = min(*m,*n); - maxmn = max(*m,*n); - mnthr = ilaenv_(&c__6, (char *)"DGELSD", (char *)" ", m, n, nrhs, &c_n1, (ftnlen)6, ( - ftnlen)1); + minmn = min(*m, *n); + maxmn = max(*m, *n); + mnthr = ilaenv_(&c__6, (char *)"DGELSD", (char *)" ", m, n, nrhs, &c_n1, (ftnlen)6, (ftnlen)1); lquery = *lwork == -1; if (*m < 0) { *info = -1; @@ -340,158 +75,105 @@ f"> */ *info = -2; } else if (*nrhs < 0) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; - } else if (*ldb < max(1,maxmn)) { + } else if (*ldb < max(1, maxmn)) { *info = -7; } - - smlsiz = ilaenv_(&c__9, (char *)"DGELSD", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( - ftnlen)6, (ftnlen)1); - -/* Compute workspace. */ -/* (Note: Comments in the code beginning (char *)"Workspace:" describe the */ -/* minimal amount of workspace needed at that point in the code, */ -/* as well as the preferred amount for good performance. */ -/* NB refers to the optimal block size for the immediately */ -/* following subroutine, as returned by ILAENV.) */ - + smlsiz = ilaenv_(&c__9, (char *)"DGELSD", (char *)" ", &c__0, &c__0, &c__0, &c__0, (ftnlen)6, (ftnlen)1); minwrk = 1; liwork = 1; - minmn = max(1,minmn); -/* Computing MAX */ - i__1 = (integer) (log((doublereal) minmn / (doublereal) (smlsiz + 1)) / - log(2.)) + 1; - nlvl = max(i__1,0); - + minmn = max(1, minmn); + i__1 = (integer)(log((doublereal)minmn / (doublereal)(smlsiz + 1)) / log(2.)) + 1; + nlvl = max(i__1, 0); if (*info == 0) { maxwrk = 0; liwork = minmn * 3 * nlvl + minmn * 11; mm = *m; if (*m >= *n && *m >= mnthr) { - -/* Path 1a - overdetermined, with many more rows than columns. */ - mm = *n; -/* Computing MAX */ - i__1 = maxwrk, i__2 = *n + *n * ilaenv_(&c__1, (char *)"DGEQRF", (char *)" ", m, - n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); - maxwrk = max(i__1,i__2); -/* Computing MAX */ - i__1 = maxwrk, i__2 = *n + *nrhs * ilaenv_(&c__1, (char *)"DORMQR", (char *)"LT", - m, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)2); - maxwrk = max(i__1,i__2); + i__1 = maxwrk, i__2 = *n + *n * ilaenv_(&c__1, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, &c_n1, + (ftnlen)6, (ftnlen)1); + maxwrk = max(i__1, i__2); + i__1 = maxwrk, i__2 = *n + *nrhs * ilaenv_(&c__1, (char *)"DORMQR", (char *)"LT", m, nrhs, n, &c_n1, + (ftnlen)6, (ftnlen)2); + maxwrk = max(i__1, i__2); } if (*m >= *n) { - -/* Path 1 - overdetermined or exactly determined. */ - -/* Computing MAX */ - i__1 = maxwrk, i__2 = *n * 3 + (mm + *n) * ilaenv_(&c__1, (char *)"DGEBRD" - , (char *)" ", &mm, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); - maxwrk = max(i__1,i__2); -/* Computing MAX */ - i__1 = maxwrk, i__2 = *n * 3 + *nrhs * ilaenv_(&c__1, (char *)"DORMBR", - (char *)"QLT", &mm, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)3); - maxwrk = max(i__1,i__2); -/* Computing MAX */ - i__1 = maxwrk, i__2 = *n * 3 + (*n - 1) * ilaenv_(&c__1, (char *)"DORMBR", - (char *)"PLN", n, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)3); - maxwrk = max(i__1,i__2); -/* Computing 2nd power */ + i__1 = maxwrk, i__2 = *n * 3 + (mm + *n) * ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", &mm, n, &c_n1, + &c_n1, (ftnlen)6, (ftnlen)1); + maxwrk = max(i__1, i__2); + i__1 = maxwrk, i__2 = *n * 3 + *nrhs * ilaenv_(&c__1, (char *)"DORMBR", (char *)"QLT", &mm, nrhs, n, + &c_n1, (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1, i__2); + i__1 = maxwrk, i__2 = *n * 3 + (*n - 1) * ilaenv_(&c__1, (char *)"DORMBR", (char *)"PLN", n, nrhs, n, + &c_n1, (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1, i__2); i__1 = smlsiz + 1; - wlalsd = *n * 9 + (*n << 1) * smlsiz + (*n << 3) * nlvl + *n * * - nrhs + i__1 * i__1; -/* Computing MAX */ + wlalsd = *n * 9 + (*n << 1) * smlsiz + (*n << 3) * nlvl + *n * *nrhs + i__1 * i__1; i__1 = maxwrk, i__2 = *n * 3 + wlalsd; - maxwrk = max(i__1,i__2); -/* Computing MAX */ - i__1 = *n * 3 + mm, i__2 = *n * 3 + *nrhs, i__1 = max(i__1,i__2), - i__2 = *n * 3 + wlalsd; - minwrk = max(i__1,i__2); + maxwrk = max(i__1, i__2); + i__1 = *n * 3 + mm, i__2 = *n * 3 + *nrhs, i__1 = max(i__1, i__2), + i__2 = *n * 3 + wlalsd; + minwrk = max(i__1, i__2); } if (*n > *m) { -/* Computing 2nd power */ i__1 = smlsiz + 1; - wlalsd = *m * 9 + (*m << 1) * smlsiz + (*m << 3) * nlvl + *m * * - nrhs + i__1 * i__1; + wlalsd = *m * 9 + (*m << 1) * smlsiz + (*m << 3) * nlvl + *m * *nrhs + i__1 * i__1; if (*n >= mnthr) { - -/* Path 2a - underdetermined, with many more columns */ -/* than rows. */ - - maxwrk = *m + *m * ilaenv_(&c__1, (char *)"DGELQF", (char *)" ", m, n, &c_n1, - &c_n1, (ftnlen)6, (ftnlen)1); -/* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + (*m << 1) * - ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, m, &c_n1, &c_n1, ( - ftnlen)6, (ftnlen)1); - maxwrk = max(i__1,i__2); -/* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + *nrhs * ilaenv_(& - c__1, (char *)"DORMBR", (char *)"QLT", m, nrhs, m, &c_n1, (ftnlen)6, ( - ftnlen)3); - maxwrk = max(i__1,i__2); -/* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + (*m - 1) * - ilaenv_(&c__1, (char *)"DORMBR", (char *)"PLN", m, nrhs, m, &c_n1, ( - ftnlen)6, (ftnlen)3); - maxwrk = max(i__1,i__2); + maxwrk = *m + *m * ilaenv_(&c__1, (char *)"DGELQF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, + (ftnlen)1); + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + + (*m << 1) * ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, m, &c_n1, &c_n1, + (ftnlen)6, (ftnlen)1); + maxwrk = max(i__1, i__2); + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + + *nrhs * ilaenv_(&c__1, (char *)"DORMBR", (char *)"QLT", m, nrhs, m, &c_n1, + (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1, i__2); + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + + (*m - 1) * ilaenv_(&c__1, (char *)"DORMBR", (char *)"PLN", m, nrhs, m, &c_n1, + (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1, i__2); if (*nrhs > 1) { -/* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + *m + *m * *nrhs; - maxwrk = max(i__1,i__2); + maxwrk = max(i__1, i__2); } else { -/* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + (*m << 1); - maxwrk = max(i__1,i__2); + maxwrk = max(i__1, i__2); } -/* Computing MAX */ - i__1 = maxwrk, i__2 = *m + *nrhs * ilaenv_(&c__1, (char *)"DORMLQ", - (char *)"LT", n, nrhs, m, &c_n1, (ftnlen)6, (ftnlen)2); - maxwrk = max(i__1,i__2); -/* Computing MAX */ + i__1 = maxwrk, i__2 = *m + *nrhs * ilaenv_(&c__1, (char *)"DORMLQ", (char *)"LT", n, nrhs, m, &c_n1, + (ftnlen)6, (ftnlen)2); + maxwrk = max(i__1, i__2); i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + wlalsd; - maxwrk = max(i__1,i__2); -/* XXX: Ensure the Path 2a case below is triggered. The workspace */ -/* calculation should use queries for all routines eventually. */ -/* Computing MAX */ -/* Computing MAX */ - i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = - max(i__3,*nrhs), i__4 = *n - *m * 3; - i__1 = maxwrk, i__2 = (*m << 2) + *m * *m + max(i__3,i__4); - maxwrk = max(i__1,i__2); + maxwrk = max(i__1, i__2); + i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3, i__4), i__3 = max(i__3, *nrhs), + i__4 = *n - *m * 3; + i__1 = maxwrk, i__2 = (*m << 2) + *m * *m + max(i__3, i__4); + maxwrk = max(i__1, i__2); } else { - -/* Path 2 - remaining underdetermined cases. */ - - maxwrk = *m * 3 + (*n + *m) * ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, - n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); -/* Computing MAX */ - i__1 = maxwrk, i__2 = *m * 3 + *nrhs * ilaenv_(&c__1, (char *)"DORMBR" - , (char *)"QLT", m, nrhs, n, &c_n1, (ftnlen)6, (ftnlen)3); - maxwrk = max(i__1,i__2); -/* Computing MAX */ - i__1 = maxwrk, i__2 = *m * 3 + *m * ilaenv_(&c__1, (char *)"DORMBR", - (char *)"PLN", n, nrhs, m, &c_n1, (ftnlen)6, (ftnlen)3); - maxwrk = max(i__1,i__2); -/* Computing MAX */ + maxwrk = *m * 3 + (*n + *m) * ilaenv_(&c__1, (char *)"DGEBRD", (char *)" ", m, n, &c_n1, &c_n1, + (ftnlen)6, (ftnlen)1); + i__1 = maxwrk, i__2 = *m * 3 + *nrhs * ilaenv_(&c__1, (char *)"DORMBR", (char *)"QLT", m, nrhs, n, + &c_n1, (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1, i__2); + i__1 = maxwrk, i__2 = *m * 3 + *m * ilaenv_(&c__1, (char *)"DORMBR", (char *)"PLN", n, nrhs, m, + &c_n1, (ftnlen)6, (ftnlen)3); + maxwrk = max(i__1, i__2); i__1 = maxwrk, i__2 = *m * 3 + wlalsd; - maxwrk = max(i__1,i__2); + maxwrk = max(i__1, i__2); } -/* Computing MAX */ - i__1 = *m * 3 + *nrhs, i__2 = *m * 3 + *m, i__1 = max(i__1,i__2), - i__2 = *m * 3 + wlalsd; - minwrk = max(i__1,i__2); + i__1 = *m * 3 + *nrhs, i__2 = *m * 3 + *m, i__1 = max(i__1, i__2), + i__2 = *m * 3 + wlalsd; + minwrk = max(i__1, i__2); } - minwrk = min(minwrk,maxwrk); - work[1] = (doublereal) maxwrk; + minwrk = min(minwrk, maxwrk); + work[1] = (doublereal)maxwrk; iwork[1] = liwork; - if (*lwork < minwrk && ! lquery) { + if (*lwork < minwrk && !lquery) { *info = -12; } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DGELSD", &i__1, (ftnlen)6); @@ -499,318 +181,161 @@ f"> */ } else if (lquery) { goto L10; } - -/* Quick return if possible. */ - if (*m == 0 || *n == 0) { *rank = 0; return 0; } - -/* Get machine parameters. */ - eps = dlamch_((char *)"P", (ftnlen)1); sfmin = dlamch_((char *)"S", (ftnlen)1); smlnum = sfmin / eps; bignum = 1. / smlnum; dlabad_(&smlnum, &bignum); - -/* Scale A if max entry outside range [SMLNUM,BIGNUM]. */ - anrm = dlange_((char *)"M", m, n, &a[a_offset], lda, &work[1], (ftnlen)1); iascl = 0; if (anrm > 0. && anrm < smlnum) { - -/* Scale matrix norm up to SMLNUM. */ - - dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, info, (ftnlen)1); iascl = 1; } else if (anrm > bignum) { - -/* Scale matrix norm down to BIGNUM. */ - - dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, info, (ftnlen)1); iascl = 2; } else if (anrm == 0.) { - -/* Matrix all zero. Return zero solution. */ - - i__1 = max(*m,*n); - dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[b_offset], ldb, (ftnlen) - 1); + i__1 = max(*m, *n); + dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[b_offset], ldb, (ftnlen)1); dlaset_((char *)"F", &minmn, &c__1, &c_b82, &c_b82, &s[1], &c__1, (ftnlen)1); *rank = 0; goto L10; } - -/* Scale B if max entry outside range [SMLNUM,BIGNUM]. */ - bnrm = dlange_((char *)"M", m, nrhs, &b[b_offset], ldb, &work[1], (ftnlen)1); ibscl = 0; if (bnrm > 0. && bnrm < smlnum) { - -/* Scale matrix norm up to SMLNUM. */ - - dlascl_((char *)"G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, info, (ftnlen)1); ibscl = 1; } else if (bnrm > bignum) { - -/* Scale matrix norm down to BIGNUM. */ - - dlascl_((char *)"G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, info, (ftnlen)1); ibscl = 2; } - -/* If M < N make sure certain entries of B are zero. */ - if (*m < *n) { i__1 = *n - *m; - dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[*m + 1 + b_dim1], ldb, ( - ftnlen)1); + dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[*m + 1 + b_dim1], ldb, (ftnlen)1); } - -/* Overdetermined case. */ - if (*m >= *n) { - -/* Path 1 - overdetermined or exactly determined. */ - mm = *m; if (*m >= mnthr) { - -/* Path 1a - overdetermined, with many more rows than columns. */ - mm = *n; itau = 1; nwork = itau + *n; - -/* Compute A=Q*R. */ -/* (Workspace: need 2*N, prefer N+N*NB) */ - i__1 = *lwork - nwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, - info); - -/* Multiply B by transpose(Q). */ -/* (Workspace: need N+NRHS, prefer N+NRHS*NB) */ - + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, info); i__1 = *lwork - nwork + 1; - dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itau], &b[ - b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( - ftnlen)1); - -/* Zero out below R. */ - + dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itau], &b[b_offset], ldb, + &work[nwork], &i__1, info, (ftnlen)1, (ftnlen)1); if (*n > 1) { i__1 = *n - 1; i__2 = *n - 1; - dlaset_((char *)"L", &i__1, &i__2, &c_b82, &c_b82, &a[a_dim1 + 2], - lda, (ftnlen)1); + dlaset_((char *)"L", &i__1, &i__2, &c_b82, &c_b82, &a[a_dim1 + 2], lda, (ftnlen)1); } } - ie = 1; itauq = ie + *n; itaup = itauq + *n; nwork = itaup + *n; - -/* Bidiagonalize R in A. */ -/* (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB) */ - i__1 = *lwork - nwork + 1; - dgebrd_(&mm, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & - work[itaup], &work[nwork], &i__1, info); - -/* Multiply B by transpose of left bidiagonalizing vectors of R. */ -/* (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB) */ - + dgebrd_(&mm, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__1, info); i__1 = *lwork - nwork + 1; - dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, &work[itauq], - &b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - -/* Solve the bidiagonal least squares problem. */ - - dlalsd_((char *)"U", &smlsiz, n, nrhs, &s[1], &work[ie], &b[b_offset], ldb, - rcond, rank, &work[nwork], &iwork[1], info, (ftnlen)1); + dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, &work[itauq], &b[b_offset], ldb, + &work[nwork], &i__1, info, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlalsd_((char *)"U", &smlsiz, n, nrhs, &s[1], &work[ie], &b[b_offset], ldb, rcond, rank, + &work[nwork], &iwork[1], info, (ftnlen)1); if (*info != 0) { goto L10; } - -/* Multiply B by right bidiagonalizing vectors of R. */ - i__1 = *lwork - nwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"N", n, nrhs, n, &a[a_offset], lda, &work[itaup], & - b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - - } else /* if(complicated condition) */ { -/* Computing MAX */ - i__1 = *m, i__2 = (*m << 1) - 4, i__1 = max(i__1,i__2), i__1 = max( - i__1,*nrhs), i__2 = *n - *m * 3, i__1 = max(i__1,i__2); - if (*n >= mnthr && *lwork >= (*m << 2) + *m * *m + max(i__1,wlalsd)) { - -/* Path 2a - underdetermined, with many more columns than rows */ -/* and sufficient workspace for an efficient algorithm. */ - + dormbr_((char *)"P", (char *)"L", (char *)"N", n, nrhs, n, &a[a_offset], lda, &work[itaup], &b[b_offset], ldb, + &work[nwork], &i__1, info, (ftnlen)1, (ftnlen)1, (ftnlen)1); + } else { + i__1 = *m, i__2 = (*m << 1) - 4, i__1 = max(i__1, i__2), i__1 = max(i__1, *nrhs), + i__2 = *n - *m * 3, i__1 = max(i__1, i__2); + if (*n >= mnthr && *lwork >= (*m << 2) + *m * *m + max(i__1, wlalsd)) { ldwork = *m; -/* Computing MAX */ -/* Computing MAX */ - i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = - max(i__3,*nrhs), i__4 = *n - *m * 3; - i__1 = (*m << 2) + *m * *lda + max(i__3,i__4), i__2 = *m * *lda + - *m + *m * *nrhs, i__1 = max(i__1,i__2), i__2 = (*m << 2) - + *m * *lda + wlalsd; - if (*lwork >= max(i__1,i__2)) { + i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3, i__4), i__3 = max(i__3, *nrhs), + i__4 = *n - *m * 3; + i__1 = (*m << 2) + *m * *lda + max(i__3, i__4), i__2 = *m * *lda + *m + *m * *nrhs, + i__1 = max(i__1, i__2), i__2 = (*m << 2) + *m * *lda + wlalsd; + if (*lwork >= max(i__1, i__2)) { ldwork = *lda; } itau = 1; nwork = *m + 1; - -/* Compute A=L*Q. */ -/* (Workspace: need 2*M, prefer M+M*NB) */ - i__1 = *lwork - nwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, - info); + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[nwork], &i__1, info); il = nwork; - -/* Copy L to WORK(IL), zeroing out above its diagonal. */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[il], &ldwork, (ftnlen) - 1); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[il], &ldwork, (ftnlen)1); i__1 = *m - 1; i__2 = *m - 1; - dlaset_((char *)"U", &i__1, &i__2, &c_b82, &c_b82, &work[il + ldwork], & - ldwork, (ftnlen)1); + dlaset_((char *)"U", &i__1, &i__2, &c_b82, &c_b82, &work[il + ldwork], &ldwork, (ftnlen)1); ie = il + ldwork * *m; itauq = ie + *m; itaup = itauq + *m; nwork = itaup + *m; - -/* Bidiagonalize L in WORK(IL). */ -/* (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB) */ - i__1 = *lwork - nwork + 1; - dgebrd_(m, m, &work[il], &ldwork, &s[1], &work[ie], &work[itauq], - &work[itaup], &work[nwork], &i__1, info); - -/* Multiply B by transpose of left bidiagonalizing vectors of L. */ -/* (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB) */ - + dgebrd_(m, m, &work[il], &ldwork, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__1, info); i__1 = *lwork - nwork + 1; - dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &work[il], &ldwork, &work[ - itauq], &b[b_offset], ldb, &work[nwork], &i__1, info, ( - ftnlen)1, (ftnlen)1, (ftnlen)1); - -/* Solve the bidiagonal least squares problem. */ - - dlalsd_((char *)"U", &smlsiz, m, nrhs, &s[1], &work[ie], &b[b_offset], - ldb, rcond, rank, &work[nwork], &iwork[1], info, (ftnlen) - 1); + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &work[il], &ldwork, &work[itauq], &b[b_offset], ldb, + &work[nwork], &i__1, info, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlalsd_((char *)"U", &smlsiz, m, nrhs, &s[1], &work[ie], &b[b_offset], ldb, rcond, rank, + &work[nwork], &iwork[1], info, (ftnlen)1); if (*info != 0) { goto L10; } - -/* Multiply B by right bidiagonalizing vectors of L. */ - i__1 = *lwork - nwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"N", m, nrhs, m, &work[il], &ldwork, &work[ - itaup], &b[b_offset], ldb, &work[nwork], &i__1, info, ( - ftnlen)1, (ftnlen)1, (ftnlen)1); - -/* Zero out below first M rows of B. */ - + dormbr_((char *)"P", (char *)"L", (char *)"N", m, nrhs, m, &work[il], &ldwork, &work[itaup], &b[b_offset], ldb, + &work[nwork], &i__1, info, (ftnlen)1, (ftnlen)1, (ftnlen)1); i__1 = *n - *m; - dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[*m + 1 + b_dim1], - ldb, (ftnlen)1); + dlaset_((char *)"F", &i__1, nrhs, &c_b82, &c_b82, &b[*m + 1 + b_dim1], ldb, (ftnlen)1); nwork = itau + *m; - -/* Multiply transpose(Q) by B. */ -/* (Workspace: need M+NRHS, prefer M+NRHS*NB) */ - i__1 = *lwork - nwork + 1; - dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, &work[itau], &b[ - b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, ( - ftnlen)1); - + dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, &work[itau], &b[b_offset], ldb, + &work[nwork], &i__1, info, (ftnlen)1, (ftnlen)1); } else { - -/* Path 2 - remaining underdetermined cases. */ - ie = 1; itauq = ie + *m; itaup = itauq + *m; nwork = itaup + *m; - -/* Bidiagonalize A. */ -/* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ - i__1 = *lwork - nwork + 1; - dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & - work[itaup], &work[nwork], &i__1, info); - -/* Multiply B by transpose of left bidiagonalizing vectors. */ -/* (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB) */ - + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[nwork], &i__1, info); i__1 = *lwork - nwork + 1; - dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itauq] - , &b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, - (ftnlen)1, (ftnlen)1); - -/* Solve the bidiagonal least squares problem. */ - - dlalsd_((char *)"L", &smlsiz, m, nrhs, &s[1], &work[ie], &b[b_offset], - ldb, rcond, rank, &work[nwork], &iwork[1], info, (ftnlen) - 1); + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itauq], &b[b_offset], ldb, + &work[nwork], &i__1, info, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlalsd_((char *)"L", &smlsiz, m, nrhs, &s[1], &work[ie], &b[b_offset], ldb, rcond, rank, + &work[nwork], &iwork[1], info, (ftnlen)1); if (*info != 0) { goto L10; } - -/* Multiply B by right bidiagonalizing vectors of A. */ - i__1 = *lwork - nwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"N", n, nrhs, m, &a[a_offset], lda, &work[itaup] - , &b[b_offset], ldb, &work[nwork], &i__1, info, (ftnlen)1, - (ftnlen)1, (ftnlen)1); - + dormbr_((char *)"P", (char *)"L", (char *)"N", n, nrhs, m, &a[a_offset], lda, &work[itaup], &b[b_offset], ldb, + &work[nwork], &i__1, info, (ftnlen)1, (ftnlen)1, (ftnlen)1); } } - -/* Undo scaling. */ - if (iascl == 1) { - dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & - minmn, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], &minmn, info, (ftnlen)1); } else if (iascl == 2) { - dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & - minmn, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], &minmn, info, (ftnlen)1); } if (ibscl == 1) { - dlascl_((char *)"G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, info, (ftnlen)1); } else if (ibscl == 2) { - dlascl_((char *)"G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, info, (ftnlen)1); } - L10: - work[1] = (doublereal) maxwrk; + work[1] = (doublereal)maxwrk; iwork[1] = liwork; return 0; - -/* End of DGELSD */ - -} /* dgelsd_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgelss.cpp b/lib/linalg/dgelss.cpp index 86036f9179..e10906f4e9 100644 --- a/lib/linalg/dgelss.cpp +++ b/lib/linalg/dgelss.cpp @@ -1,298 +1,73 @@ -/* fortran/dgelss.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__6 = 6; static integer c_n1 = -1; static integer c__0 = 0; static doublereal c_b46 = 0.; static integer c__1 = 1; static doublereal c_b79 = 1.; - -/* > \brief DGELSS solves overdetermined or underdetermined systems for GE matrices */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGELSS + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, */ -/* WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS, RANK */ -/* DOUBLE PRECISION RCOND */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), S( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGELSS computes the minimum norm solution to a real linear least */ -/* > squares problem: */ -/* > */ -/* > Minimize 2-norm(| b - A*x |). */ -/* > */ -/* > using the singular value decomposition (SVD) of A. A is an M-by-N */ -/* > matrix which may be rank-deficient. */ -/* > */ -/* > Several right hand side vectors b and solution vectors x can be */ -/* > handled in a single call; they are stored as the columns of the */ -/* > M-by-NRHS right hand side matrix B and the N-by-NRHS solution matrix */ -/* > X. */ -/* > */ -/* > The effective rank of A is determined by treating as zero those */ -/* > singular values which are less than RCOND times the largest singular */ -/* > value. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NRHS */ -/* > \verbatim */ -/* > NRHS is INTEGER */ -/* > The number of right hand sides, i.e., the number of columns */ -/* > of the matrices B and X. NRHS >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the M-by-N matrix A. */ -/* > On exit, the first min(m,n) rows of A are overwritten with */ -/* > its right singular vectors, stored rowwise. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ -/* > On entry, the M-by-NRHS right hand side matrix B. */ -/* > On exit, B is overwritten by the N-by-NRHS solution */ -/* > matrix X. If m >= n and RANK = n, the residual */ -/* > sum-of-squares for the solution in the i-th column is given */ -/* > by the sum of squares of elements n+1:m in that column. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >= max(1,max(M,N)). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The singular values of A in decreasing order. */ -/* > The condition number of A in the 2-norm = S(1)/S(min(m,n)). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RCOND */ -/* > \verbatim */ -/* > RCOND is DOUBLE PRECISION */ -/* > RCOND is used to determine the effective rank of A. */ -/* > Singular values S(i) <= RCOND*S(1) are treated as zero. */ -/* > If RCOND < 0, machine precision is used instead. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RANK */ -/* > \verbatim */ -/* > RANK is INTEGER */ -/* > The effective rank of A, i.e., the number of singular values */ -/* > which are greater than RCOND*S(1). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= 1, and also: */ -/* > LWORK >= 3*min(M,N) + max( 2*min(M,N), max(M,N), NRHS ) */ -/* > For good performance, LWORK should generally be larger. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: the algorithm for computing the SVD failed to converge; */ -/* > if INFO = i, i off-diagonal elements of an intermediate */ -/* > bidiagonal form did not converge to zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEsolve */ - -/* ===================================================================== */ -/* Subroutine */ int dgelss_(integer *m, integer *n, integer *nrhs, - doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * - s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, - integer *info) +int dgelss_(integer *m, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, + integer *ldb, doublereal *s, doublereal *rcond, integer *rank, doublereal *work, + integer *lwork, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; doublereal d__1; - - /* Local variables */ integer i__, bl, ie, il, mm; doublereal dum[1], eps, thr, anrm, bnrm; - integer itau, lwork_dgebrd__, lwork_dgelqf__, lwork_dgeqrf__, - lwork_dorgbr__, lwork_dormbr__, lwork_dormlq__, lwork_dormqr__; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer itau, lwork_dgebrd__, lwork_dgelqf__, lwork_dgeqrf__, lwork_dorgbr__, lwork_dormbr__, + lwork_dormlq__, lwork_dormqr__; + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); integer iascl, ibscl; - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen), drscl_(integer *, - doublereal *, doublereal *, integer *); + extern int dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen), + drscl_(integer *, doublereal *, doublereal *, integer *); integer chunk; doublereal sfmin; integer minmn; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer maxmn, itaup, itauq, mnthr, iwork; - extern /* Subroutine */ int dlabad_(doublereal *, doublereal *), dgebrd_( - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *, - integer *); - extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, ftnlen); + extern int dlabad_(doublereal *, doublereal *), + dgebrd_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, integer *); + extern doublereal dlamch_(char *, ftnlen), + dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *, ftnlen); integer bdspac; - extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, integer *), - dlascl_(char *, integer *, integer *, doublereal *, doublereal *, - integer *, integer *, doublereal *, integer *, integer *, ftnlen), - dgeqrf_(integer *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, integer *), dlacpy_(char *, - integer *, integer *, doublereal *, integer *, doublereal *, - integer *, ftnlen), dlaset_(char *, integer *, integer *, - doublereal *, doublereal *, doublereal *, integer *, ftnlen), - xerbla_(char *, integer *, ftnlen), dbdsqr_(char *, integer *, - integer *, integer *, integer *, doublereal *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen), dorgbr_(char *, - integer *, integer *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, integer *, ftnlen); + extern int dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen), + dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, integer *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen), + dbdsqr_(char *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, ftnlen), + dorgbr_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *, ftnlen); doublereal bignum; - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *, - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, integer *, - ftnlen, ftnlen, ftnlen), dormlq_(char *, char *, integer *, - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, integer *, - ftnlen, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dormbr_(char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, + integer *, ftnlen, ftnlen, ftnlen), + dormlq_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, ftnlen, + ftnlen); integer ldwork; - extern /* Subroutine */ int dormqr_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + extern int dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen); integer minwrk, maxwrk; doublereal smlnum; logical lquery; - - -/* -- LAPACK driver routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Local Arrays .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -301,11 +76,9 @@ f"> */ b -= b_offset; --s; --work; - - /* Function Body */ *info = 0; - minmn = min(*m,*n); - maxmn = max(*m,*n); + minmn = min(*m, *n); + maxmn = max(*m, *n); lquery = *lwork == -1; if (*m < 0) { *info = -1; @@ -313,194 +86,113 @@ f"> */ *info = -2; } else if (*nrhs < 0) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; - } else if (*ldb < max(1,maxmn)) { + } else if (*ldb < max(1, maxmn)) { *info = -7; } - -/* Compute workspace */ -/* (Note: Comments in the code beginning (char *)"Workspace:" describe the */ -/* minimal amount of workspace needed at that point in the code, */ -/* as well as the preferred amount for good performance. */ -/* NB refers to the optimal block size for the immediately */ -/* following subroutine, as returned by ILAENV.) */ - if (*info == 0) { minwrk = 1; maxwrk = 1; if (minmn > 0) { mm = *m; - mnthr = ilaenv_(&c__6, (char *)"DGELSS", (char *)" ", m, n, nrhs, &c_n1, (ftnlen) - 6, (ftnlen)1); + mnthr = ilaenv_(&c__6, (char *)"DGELSS", (char *)" ", m, n, nrhs, &c_n1, (ftnlen)6, (ftnlen)1); if (*m >= *n && *m >= mnthr) { - -/* Path 1a - overdetermined, with many more rows than */ -/* columns */ - -/* Compute space needed for DGEQRF */ dgeqrf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, info); - lwork_dgeqrf__ = (integer) dum[0]; -/* Compute space needed for DORMQR */ - dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, dum, &b[ - b_offset], ldb, dum, &c_n1, info, (ftnlen)1, (ftnlen) - 1); - lwork_dormqr__ = (integer) dum[0]; + lwork_dgeqrf__ = (integer)dum[0]; + dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, dum, &b[b_offset], ldb, dum, &c_n1, + info, (ftnlen)1, (ftnlen)1); + lwork_dormqr__ = (integer)dum[0]; mm = *n; -/* Computing MAX */ i__1 = maxwrk, i__2 = *n + lwork_dgeqrf__; - maxwrk = max(i__1,i__2); -/* Computing MAX */ + maxwrk = max(i__1, i__2); i__1 = maxwrk, i__2 = *n + lwork_dormqr__; - maxwrk = max(i__1,i__2); + maxwrk = max(i__1, i__2); } if (*m >= *n) { - -/* Path 1 - overdetermined or exactly determined */ - -/* Compute workspace needed for DBDSQR */ - -/* Computing MAX */ i__1 = 1, i__2 = *n * 5; - bdspac = max(i__1,i__2); -/* Compute space needed for DGEBRD */ - dgebrd_(&mm, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, - &c_n1, info); - lwork_dgebrd__ = (integer) dum[0]; -/* Compute space needed for DORMBR */ - dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, dum, & - b[b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - lwork_dormbr__ = (integer) dum[0]; -/* Compute space needed for DORGBR */ - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, - info, (ftnlen)1); - lwork_dorgbr__ = (integer) dum[0]; -/* Compute total workspace needed */ -/* Computing MAX */ + bdspac = max(i__1, i__2); + dgebrd_(&mm, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, info); + lwork_dgebrd__ = (integer)dum[0]; + dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, dum, &b[b_offset], ldb, dum, + &c_n1, info, (ftnlen)1, (ftnlen)1, (ftnlen)1); + lwork_dormbr__ = (integer)dum[0]; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, info, (ftnlen)1); + lwork_dorgbr__ = (integer)dum[0]; i__1 = maxwrk, i__2 = *n * 3 + lwork_dgebrd__; - maxwrk = max(i__1,i__2); -/* Computing MAX */ + maxwrk = max(i__1, i__2); i__1 = maxwrk, i__2 = *n * 3 + lwork_dormbr__; - maxwrk = max(i__1,i__2); -/* Computing MAX */ + maxwrk = max(i__1, i__2); i__1 = maxwrk, i__2 = *n * 3 + lwork_dorgbr__; - maxwrk = max(i__1,i__2); - maxwrk = max(maxwrk,bdspac); -/* Computing MAX */ + maxwrk = max(i__1, i__2); + maxwrk = max(maxwrk, bdspac); i__1 = maxwrk, i__2 = *n * *nrhs; - maxwrk = max(i__1,i__2); -/* Computing MAX */ - i__1 = *n * 3 + mm, i__2 = *n * 3 + *nrhs, i__1 = max(i__1, - i__2); - minwrk = max(i__1,bdspac); - maxwrk = max(minwrk,maxwrk); + maxwrk = max(i__1, i__2); + i__1 = *n * 3 + mm, i__2 = *n * 3 + *nrhs, i__1 = max(i__1, i__2); + minwrk = max(i__1, bdspac); + maxwrk = max(minwrk, maxwrk); } if (*n > *m) { - -/* Compute workspace needed for DBDSQR */ - -/* Computing MAX */ i__1 = 1, i__2 = *m * 5; - bdspac = max(i__1,i__2); -/* Computing MAX */ - i__1 = *m * 3 + *nrhs, i__2 = *m * 3 + *n, i__1 = max(i__1, - i__2); - minwrk = max(i__1,bdspac); + bdspac = max(i__1, i__2); + i__1 = *m * 3 + *nrhs, i__2 = *m * 3 + *n, i__1 = max(i__1, i__2); + minwrk = max(i__1, bdspac); if (*n >= mnthr) { - -/* Path 2a - underdetermined, with many more columns */ -/* than rows */ - -/* Compute space needed for DGELQF */ dgelqf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, info); - lwork_dgelqf__ = (integer) dum[0]; -/* Compute space needed for DGEBRD */ - dgebrd_(m, m, &a[a_offset], lda, &s[1], dum, dum, dum, - dum, &c_n1, info); - lwork_dgebrd__ = (integer) dum[0]; -/* Compute space needed for DORMBR */ - dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, dum, - &b[b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - lwork_dormbr__ = (integer) dum[0]; -/* Compute space needed for DORGBR */ - dorgbr_((char *)"P", m, m, m, &a[a_offset], lda, dum, dum, &c_n1, - info, (ftnlen)1); - lwork_dorgbr__ = (integer) dum[0]; -/* Compute space needed for DORMLQ */ - dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, dum, &b[ - b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( - ftnlen)1); - lwork_dormlq__ = (integer) dum[0]; -/* Compute total workspace needed */ + lwork_dgelqf__ = (integer)dum[0]; + dgebrd_(m, m, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, info); + lwork_dgebrd__ = (integer)dum[0]; + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, dum, &b[b_offset], ldb, + dum, &c_n1, info, (ftnlen)1, (ftnlen)1, (ftnlen)1); + lwork_dormbr__ = (integer)dum[0]; + dorgbr_((char *)"P", m, m, m, &a[a_offset], lda, dum, dum, &c_n1, info, (ftnlen)1); + lwork_dorgbr__ = (integer)dum[0]; + dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, dum, &b[b_offset], ldb, dum, + &c_n1, info, (ftnlen)1, (ftnlen)1); + lwork_dormlq__ = (integer)dum[0]; maxwrk = *m + lwork_dgelqf__; -/* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + - lwork_dgebrd__; - maxwrk = max(i__1,i__2); -/* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + - lwork_dormbr__; - maxwrk = max(i__1,i__2); -/* Computing MAX */ - i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + - lwork_dorgbr__; - maxwrk = max(i__1,i__2); -/* Computing MAX */ + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + lwork_dgebrd__; + maxwrk = max(i__1, i__2); + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + lwork_dormbr__; + maxwrk = max(i__1, i__2); + i__1 = maxwrk, i__2 = *m * *m + (*m << 2) + lwork_dorgbr__; + maxwrk = max(i__1, i__2); i__1 = maxwrk, i__2 = *m * *m + *m + bdspac; - maxwrk = max(i__1,i__2); + maxwrk = max(i__1, i__2); if (*nrhs > 1) { -/* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + *m + *m * *nrhs; - maxwrk = max(i__1,i__2); + maxwrk = max(i__1, i__2); } else { -/* Computing MAX */ i__1 = maxwrk, i__2 = *m * *m + (*m << 1); - maxwrk = max(i__1,i__2); + maxwrk = max(i__1, i__2); } -/* Computing MAX */ i__1 = maxwrk, i__2 = *m + lwork_dormlq__; - maxwrk = max(i__1,i__2); + maxwrk = max(i__1, i__2); } else { - -/* Path 2 - underdetermined */ - -/* Compute space needed for DGEBRD */ - dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, - dum, &c_n1, info); - lwork_dgebrd__ = (integer) dum[0]; -/* Compute space needed for DORMBR */ - dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &a[a_offset], lda, dum, - &b[b_offset], ldb, dum, &c_n1, info, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - lwork_dormbr__ = (integer) dum[0]; -/* Compute space needed for DORGBR */ - dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, dum, dum, &c_n1, - info, (ftnlen)1); - lwork_dorgbr__ = (integer) dum[0]; + dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, info); + lwork_dgebrd__ = (integer)dum[0]; + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &a[a_offset], lda, dum, &b[b_offset], ldb, + dum, &c_n1, info, (ftnlen)1, (ftnlen)1, (ftnlen)1); + lwork_dormbr__ = (integer)dum[0]; + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, dum, dum, &c_n1, info, (ftnlen)1); + lwork_dorgbr__ = (integer)dum[0]; maxwrk = *m * 3 + lwork_dgebrd__; -/* Computing MAX */ i__1 = maxwrk, i__2 = *m * 3 + lwork_dormbr__; - maxwrk = max(i__1,i__2); -/* Computing MAX */ + maxwrk = max(i__1, i__2); i__1 = maxwrk, i__2 = *m * 3 + lwork_dorgbr__; - maxwrk = max(i__1,i__2); - maxwrk = max(maxwrk,bdspac); -/* Computing MAX */ + maxwrk = max(i__1, i__2); + maxwrk = max(maxwrk, bdspac); i__1 = maxwrk, i__2 = *n * *nrhs; - maxwrk = max(i__1,i__2); + maxwrk = max(i__1, i__2); } } - maxwrk = max(minwrk,maxwrk); + maxwrk = max(minwrk, maxwrk); } - work[1] = (doublereal) maxwrk; - - if (*lwork < minwrk && ! lquery) { + work[1] = (doublereal)maxwrk; + if (*lwork < minwrk && !lquery) { *info = -12; } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DGELSS", &i__1, (ftnlen)6); @@ -508,160 +200,80 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0) { *rank = 0; return 0; } - -/* Get machine parameters */ - eps = dlamch_((char *)"P", (ftnlen)1); sfmin = dlamch_((char *)"S", (ftnlen)1); smlnum = sfmin / eps; bignum = 1. / smlnum; dlabad_(&smlnum, &bignum); - -/* Scale A if max element outside range [SMLNUM,BIGNUM] */ - anrm = dlange_((char *)"M", m, n, &a[a_offset], lda, &work[1], (ftnlen)1); iascl = 0; if (anrm > 0. && anrm < smlnum) { - -/* Scale matrix norm up to SMLNUM */ - - dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, info, (ftnlen)1); iascl = 1; } else if (anrm > bignum) { - -/* Scale matrix norm down to BIGNUM */ - - dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, info, (ftnlen)1); iascl = 2; } else if (anrm == 0.) { - -/* Matrix all zero. Return zero solution. */ - - i__1 = max(*m,*n); - dlaset_((char *)"F", &i__1, nrhs, &c_b46, &c_b46, &b[b_offset], ldb, (ftnlen) - 1); + i__1 = max(*m, *n); + dlaset_((char *)"F", &i__1, nrhs, &c_b46, &c_b46, &b[b_offset], ldb, (ftnlen)1); dlaset_((char *)"F", &minmn, &c__1, &c_b46, &c_b46, &s[1], &minmn, (ftnlen)1); *rank = 0; goto L70; } - -/* Scale B if max element outside range [SMLNUM,BIGNUM] */ - bnrm = dlange_((char *)"M", m, nrhs, &b[b_offset], ldb, &work[1], (ftnlen)1); ibscl = 0; if (bnrm > 0. && bnrm < smlnum) { - -/* Scale matrix norm up to SMLNUM */ - - dlascl_((char *)"G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bnrm, &smlnum, m, nrhs, &b[b_offset], ldb, info, (ftnlen)1); ibscl = 1; } else if (bnrm > bignum) { - -/* Scale matrix norm down to BIGNUM */ - - dlascl_((char *)"G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bnrm, &bignum, m, nrhs, &b[b_offset], ldb, info, (ftnlen)1); ibscl = 2; } - -/* Overdetermined case */ - if (*m >= *n) { - -/* Path 1 - overdetermined or exactly determined */ - mm = *m; if (*m >= mnthr) { - -/* Path 1a - overdetermined, with many more rows than columns */ - mm = *n; itau = 1; iwork = itau + *n; - -/* Compute A=Q*R */ -/* (Workspace: need 2*N, prefer N+N*NB) */ - i__1 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__1, - info); - -/* Multiply B by transpose(Q) */ -/* (Workspace: need N+NRHS, prefer N+NRHS*NB) */ - + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__1, info); i__1 = *lwork - iwork + 1; - dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itau], &b[ - b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, ( - ftnlen)1); - -/* Zero out below R */ - + dormqr_((char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itau], &b[b_offset], ldb, + &work[iwork], &i__1, info, (ftnlen)1, (ftnlen)1); if (*n > 1) { i__1 = *n - 1; i__2 = *n - 1; - dlaset_((char *)"L", &i__1, &i__2, &c_b46, &c_b46, &a[a_dim1 + 2], - lda, (ftnlen)1); + dlaset_((char *)"L", &i__1, &i__2, &c_b46, &c_b46, &a[a_dim1 + 2], lda, (ftnlen)1); } } - ie = 1; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in A */ -/* (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB) */ - i__1 = *lwork - iwork + 1; - dgebrd_(&mm, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & - work[itaup], &work[iwork], &i__1, info); - -/* Multiply B by transpose of left bidiagonalizing vectors of R */ -/* (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB) */ - + dgebrd_(&mm, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__1, info); i__1 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, &work[itauq], - &b[b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - -/* Generate right bidiagonalizing vectors of R in A */ -/* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) */ - + dormbr_((char *)"Q", (char *)"L", (char *)"T", &mm, nrhs, n, &a[a_offset], lda, &work[itauq], &b[b_offset], ldb, + &work[iwork], &i__1, info, (ftnlen)1, (ftnlen)1, (ftnlen)1); i__1 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], & - i__1, info, (ftnlen)1); + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], &i__1, info, + (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration */ -/* multiply B by transpose of left singular vectors */ -/* compute right singular vectors in A */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, n, &c__0, nrhs, &s[1], &work[ie], &a[a_offset], lda, - dum, &c__1, &b[b_offset], ldb, &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, n, &c__0, nrhs, &s[1], &work[ie], &a[a_offset], lda, dum, &c__1, + &b[b_offset], ldb, &work[iwork], info, (ftnlen)1); if (*info != 0) { goto L70; } - -/* Multiply B by reciprocals of singular values */ - -/* Computing MAX */ d__1 = *rcond * s[1]; - thr = max(d__1,sfmin); + thr = max(d__1, sfmin); if (*rcond < 0.) { -/* Computing MAX */ d__1 = eps * s[1]; - thr = max(d__1,sfmin); + thr = max(d__1, sfmin); } *rank = 0; i__1 = *n; @@ -670,129 +282,73 @@ f"> */ drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); ++(*rank); } else { - dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1], - ldb, (ftnlen)1); + dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1], ldb, (ftnlen)1); } -/* L10: */ } - -/* Multiply B by right singular vectors */ -/* (Workspace: need N, prefer N*NRHS) */ - if (*lwork >= *ldb * *nrhs && *nrhs > 1) { - dgemm_((char *)"T", (char *)"N", n, nrhs, n, &c_b79, &a[a_offset], lda, &b[ - b_offset], ldb, &c_b46, &work[1], ldb, (ftnlen)1, (ftnlen) - 1); - dlacpy_((char *)"G", n, nrhs, &work[1], ldb, &b[b_offset], ldb, (ftnlen)1) - ; + dgemm_((char *)"T", (char *)"N", n, nrhs, n, &c_b79, &a[a_offset], lda, &b[b_offset], ldb, &c_b46, + &work[1], ldb, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"G", n, nrhs, &work[1], ldb, &b[b_offset], ldb, (ftnlen)1); } else if (*nrhs > 1) { chunk = *lwork / *n; i__1 = *nrhs; i__2 = chunk; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { -/* Computing MIN */ i__3 = *nrhs - i__ + 1; - bl = min(i__3,chunk); - dgemm_((char *)"T", (char *)"N", n, &bl, n, &c_b79, &a[a_offset], lda, &b[i__ - * b_dim1 + 1], ldb, &c_b46, &work[1], n, (ftnlen)1, ( - ftnlen)1); - dlacpy_((char *)"G", n, &bl, &work[1], n, &b[i__ * b_dim1 + 1], ldb, ( - ftnlen)1); -/* L20: */ + bl = min(i__3, chunk); + dgemm_((char *)"T", (char *)"N", n, &bl, n, &c_b79, &a[a_offset], lda, &b[i__ * b_dim1 + 1], ldb, + &c_b46, &work[1], n, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"G", n, &bl, &work[1], n, &b[i__ * b_dim1 + 1], ldb, (ftnlen)1); } } else { - dgemv_((char *)"T", n, n, &c_b79, &a[a_offset], lda, &b[b_offset], &c__1, - &c_b46, &work[1], &c__1, (ftnlen)1); + dgemv_((char *)"T", n, n, &c_b79, &a[a_offset], lda, &b[b_offset], &c__1, &c_b46, &work[1], + &c__1, (ftnlen)1); dcopy_(n, &work[1], &c__1, &b[b_offset], &c__1); } - - } else /* if(complicated condition) */ { -/* Computing MAX */ - i__2 = *m, i__1 = (*m << 1) - 4, i__2 = max(i__2,i__1), i__2 = max( - i__2,*nrhs), i__1 = *n - *m * 3; - if (*n >= mnthr && *lwork >= (*m << 2) + *m * *m + max(i__2,i__1)) { - -/* Path 2a - underdetermined, with many more columns than rows */ -/* and sufficient workspace for an efficient algorithm */ - + } else { + i__2 = *m, i__1 = (*m << 1) - 4, i__2 = max(i__2, i__1), i__2 = max(i__2, *nrhs), + i__1 = *n - *m * 3; + if (*n >= mnthr && *lwork >= (*m << 2) + *m * *m + max(i__2, i__1)) { ldwork = *m; -/* Computing MAX */ -/* Computing MAX */ - i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3,i__4), i__3 = - max(i__3,*nrhs), i__4 = *n - *m * 3; - i__2 = (*m << 2) + *m * *lda + max(i__3,i__4), i__1 = *m * *lda + - *m + *m * *nrhs; - if (*lwork >= max(i__2,i__1)) { + i__3 = *m, i__4 = (*m << 1) - 4, i__3 = max(i__3, i__4), i__3 = max(i__3, *nrhs), + i__4 = *n - *m * 3; + i__2 = (*m << 2) + *m * *lda + max(i__3, i__4), i__1 = *m * *lda + *m + *m * *nrhs; + if (*lwork >= max(i__2, i__1)) { ldwork = *lda; } itau = 1; iwork = *m + 1; - -/* Compute A=L*Q */ -/* (Workspace: need 2*M, prefer M+M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, - info); + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, info); il = iwork; - -/* Copy L to WORK(IL), zeroing out above it */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[il], &ldwork, (ftnlen) - 1); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[il], &ldwork, (ftnlen)1); i__2 = *m - 1; i__1 = *m - 1; - dlaset_((char *)"U", &i__2, &i__1, &c_b46, &c_b46, &work[il + ldwork], & - ldwork, (ftnlen)1); + dlaset_((char *)"U", &i__2, &i__1, &c_b46, &c_b46, &work[il + ldwork], &ldwork, (ftnlen)1); ie = il + ldwork * *m; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in WORK(IL) */ -/* (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[il], &ldwork, &s[1], &work[ie], &work[itauq], - &work[itaup], &work[iwork], &i__2, info); - -/* Multiply B by transpose of left bidiagonalizing vectors of L */ -/* (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB) */ - + dgebrd_(m, m, &work[il], &ldwork, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__2, info); i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &work[il], &ldwork, &work[ - itauq], &b[b_offset], ldb, &work[iwork], &i__2, info, ( - ftnlen)1, (ftnlen)1, (ftnlen)1); - -/* Generate right bidiagonalizing vectors of R in WORK(IL) */ -/* (Workspace: need M*M+5*M-1, prefer M*M+4*M+(M-1)*NB) */ - + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, m, &work[il], &ldwork, &work[itauq], &b[b_offset], ldb, + &work[iwork], &i__2, info, (ftnlen)1, (ftnlen)1, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[il], &ldwork, &work[itaup], &work[ - iwork], &i__2, info, (ftnlen)1); + dorgbr_((char *)"P", m, m, m, &work[il], &ldwork, &work[itaup], &work[iwork], &i__2, info, + (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, */ -/* computing right singular vectors of L in WORK(IL) and */ -/* multiplying B by transpose of left singular vectors */ -/* (Workspace: need M*M+M+BDSPAC) */ - - dbdsqr_((char *)"U", m, m, &c__0, nrhs, &s[1], &work[ie], &work[il], & - ldwork, &a[a_offset], lda, &b[b_offset], ldb, &work[iwork] - , info, (ftnlen)1); + dbdsqr_((char *)"U", m, m, &c__0, nrhs, &s[1], &work[ie], &work[il], &ldwork, &a[a_offset], lda, + &b[b_offset], ldb, &work[iwork], info, (ftnlen)1); if (*info != 0) { goto L70; } - -/* Multiply B by reciprocals of singular values */ - -/* Computing MAX */ d__1 = *rcond * s[1]; - thr = max(d__1,sfmin); + thr = max(d__1, sfmin); if (*rcond < 0.) { -/* Computing MAX */ d__1 = eps * s[1]; - thr = max(d__1,sfmin); + thr = max(d__1, sfmin); } *rank = 0; i__2 = *m; @@ -801,112 +357,61 @@ f"> */ drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); ++(*rank); } else { - dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1] - , ldb, (ftnlen)1); + dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1], ldb, (ftnlen)1); } -/* L30: */ } iwork = ie; - -/* Multiply B by right singular vectors of L in WORK(IL) */ -/* (Workspace: need M*M+2*M, prefer M*M+M+M*NRHS) */ - if (*lwork >= *ldb * *nrhs + iwork - 1 && *nrhs > 1) { - dgemm_((char *)"T", (char *)"N", m, nrhs, m, &c_b79, &work[il], &ldwork, &b[ - b_offset], ldb, &c_b46, &work[iwork], ldb, (ftnlen)1, - (ftnlen)1); - dlacpy_((char *)"G", m, nrhs, &work[iwork], ldb, &b[b_offset], ldb, ( - ftnlen)1); + dgemm_((char *)"T", (char *)"N", m, nrhs, m, &c_b79, &work[il], &ldwork, &b[b_offset], ldb, &c_b46, + &work[iwork], ldb, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"G", m, nrhs, &work[iwork], ldb, &b[b_offset], ldb, (ftnlen)1); } else if (*nrhs > 1) { chunk = (*lwork - iwork + 1) / *m; i__2 = *nrhs; i__1 = chunk; - for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += - i__1) { -/* Computing MIN */ + for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { i__3 = *nrhs - i__ + 1; - bl = min(i__3,chunk); - dgemm_((char *)"T", (char *)"N", m, &bl, m, &c_b79, &work[il], &ldwork, & - b[i__ * b_dim1 + 1], ldb, &c_b46, &work[iwork], m, - (ftnlen)1, (ftnlen)1); - dlacpy_((char *)"G", m, &bl, &work[iwork], m, &b[i__ * b_dim1 + 1] - , ldb, (ftnlen)1); -/* L40: */ + bl = min(i__3, chunk); + dgemm_((char *)"T", (char *)"N", m, &bl, m, &c_b79, &work[il], &ldwork, &b[i__ * b_dim1 + 1], + ldb, &c_b46, &work[iwork], m, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"G", m, &bl, &work[iwork], m, &b[i__ * b_dim1 + 1], ldb, (ftnlen)1); } } else { - dgemv_((char *)"T", m, m, &c_b79, &work[il], &ldwork, &b[b_dim1 + 1], - &c__1, &c_b46, &work[iwork], &c__1, (ftnlen)1); + dgemv_((char *)"T", m, m, &c_b79, &work[il], &ldwork, &b[b_dim1 + 1], &c__1, &c_b46, + &work[iwork], &c__1, (ftnlen)1); dcopy_(m, &work[iwork], &c__1, &b[b_dim1 + 1], &c__1); } - -/* Zero out below first M rows of B */ - i__1 = *n - *m; - dlaset_((char *)"F", &i__1, nrhs, &c_b46, &c_b46, &b[*m + 1 + b_dim1], - ldb, (ftnlen)1); + dlaset_((char *)"F", &i__1, nrhs, &c_b46, &c_b46, &b[*m + 1 + b_dim1], ldb, (ftnlen)1); iwork = itau + *m; - -/* Multiply transpose(Q) by B */ -/* (Workspace: need M+NRHS, prefer M+NRHS*NB) */ - i__1 = *lwork - iwork + 1; - dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, &work[itau], &b[ - b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, ( - ftnlen)1); - + dormlq_((char *)"L", (char *)"T", n, nrhs, m, &a[a_offset], lda, &work[itau], &b[b_offset], ldb, + &work[iwork], &i__1, info, (ftnlen)1, (ftnlen)1); } else { - -/* Path 2 - remaining underdetermined cases */ - ie = 1; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize A */ -/* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) */ - i__1 = *lwork - iwork + 1; - dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & - work[itaup], &work[iwork], &i__1, info); - -/* Multiply B by transpose of left bidiagonalizing vectors */ -/* (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB) */ - + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__1, info); i__1 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itauq] - , &b[b_offset], ldb, &work[iwork], &i__1, info, (ftnlen)1, - (ftnlen)1, (ftnlen)1); - -/* Generate right bidiagonalizing vectors in A */ -/* (Workspace: need 4*M, prefer 3*M+M*NB) */ - + dormbr_((char *)"Q", (char *)"L", (char *)"T", m, nrhs, n, &a[a_offset], lda, &work[itauq], &b[b_offset], ldb, + &work[iwork], &i__1, info, (ftnlen)1, (ftnlen)1, (ftnlen)1); i__1 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], &work[ - iwork], &i__1, info, (ftnlen)1); + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], &work[iwork], &i__1, info, + (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, */ -/* computing right singular vectors of A in A and */ -/* multiplying B by transpose of left singular vectors */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"L", m, n, &c__0, nrhs, &s[1], &work[ie], &a[a_offset], - lda, dum, &c__1, &b[b_offset], ldb, &work[iwork], info, ( - ftnlen)1); + dbdsqr_((char *)"L", m, n, &c__0, nrhs, &s[1], &work[ie], &a[a_offset], lda, dum, &c__1, + &b[b_offset], ldb, &work[iwork], info, (ftnlen)1); if (*info != 0) { goto L70; } - -/* Multiply B by reciprocals of singular values */ - -/* Computing MAX */ d__1 = *rcond * s[1]; - thr = max(d__1,sfmin); + thr = max(d__1, sfmin); if (*rcond < 0.) { -/* Computing MAX */ d__1 = eps * s[1]; - thr = max(d__1,sfmin); + thr = max(d__1, sfmin); } *rank = 0; i__1 = *m; @@ -915,74 +420,47 @@ f"> */ drscl_(nrhs, &s[i__], &b[i__ + b_dim1], ldb); ++(*rank); } else { - dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1] - , ldb, (ftnlen)1); + dlaset_((char *)"F", &c__1, nrhs, &c_b46, &c_b46, &b[i__ + b_dim1], ldb, (ftnlen)1); } -/* L50: */ } - -/* Multiply B by right singular vectors of A */ -/* (Workspace: need N, prefer N*NRHS) */ - if (*lwork >= *ldb * *nrhs && *nrhs > 1) { - dgemm_((char *)"T", (char *)"N", n, nrhs, m, &c_b79, &a[a_offset], lda, &b[ - b_offset], ldb, &c_b46, &work[1], ldb, (ftnlen)1, ( - ftnlen)1); - dlacpy_((char *)"F", n, nrhs, &work[1], ldb, &b[b_offset], ldb, ( - ftnlen)1); + dgemm_((char *)"T", (char *)"N", n, nrhs, m, &c_b79, &a[a_offset], lda, &b[b_offset], ldb, &c_b46, + &work[1], ldb, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", n, nrhs, &work[1], ldb, &b[b_offset], ldb, (ftnlen)1); } else if (*nrhs > 1) { chunk = *lwork / *n; i__1 = *nrhs; i__2 = chunk; - for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += - i__2) { -/* Computing MIN */ + for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { i__3 = *nrhs - i__ + 1; - bl = min(i__3,chunk); - dgemm_((char *)"T", (char *)"N", n, &bl, m, &c_b79, &a[a_offset], lda, &b[ - i__ * b_dim1 + 1], ldb, &c_b46, &work[1], n, ( - ftnlen)1, (ftnlen)1); - dlacpy_((char *)"F", n, &bl, &work[1], n, &b[i__ * b_dim1 + 1], - ldb, (ftnlen)1); -/* L60: */ + bl = min(i__3, chunk); + dgemm_((char *)"T", (char *)"N", n, &bl, m, &c_b79, &a[a_offset], lda, &b[i__ * b_dim1 + 1], + ldb, &c_b46, &work[1], n, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", n, &bl, &work[1], n, &b[i__ * b_dim1 + 1], ldb, (ftnlen)1); } } else { - dgemv_((char *)"T", m, n, &c_b79, &a[a_offset], lda, &b[b_offset], & - c__1, &c_b46, &work[1], &c__1, (ftnlen)1); + dgemv_((char *)"T", m, n, &c_b79, &a[a_offset], lda, &b[b_offset], &c__1, &c_b46, &work[1], + &c__1, (ftnlen)1); dcopy_(n, &work[1], &c__1, &b[b_offset], &c__1); } } } - -/* Undo scaling */ - if (iascl == 1) { - dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & - minmn, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, n, nrhs, &b[b_offset], ldb, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], &minmn, info, (ftnlen)1); } else if (iascl == 2) { - dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & - minmn, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, n, nrhs, &b[b_offset], ldb, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], &minmn, info, (ftnlen)1); } if (ibscl == 1) { - dlascl_((char *)"G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &bnrm, n, nrhs, &b[b_offset], ldb, info, (ftnlen)1); } else if (ibscl == 2) { - dlascl_((char *)"G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bignum, &bnrm, n, nrhs, &b[b_offset], ldb, info, (ftnlen)1); } - L70: - work[1] = (doublereal) maxwrk; + work[1] = (doublereal)maxwrk; return 0; - -/* End of DGELSS */ - -} /* dgelss_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgemm.cpp b/lib/linalg/dgemm.cpp index 360584e254..6ffa0440c7 100644 --- a/lib/linalg/dgemm.cpp +++ b/lib/linalg/dgemm.cpp @@ -1,250 +1,18 @@ -/* fortran/dgemm.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DGEMM */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION ALPHA,BETA */ -/* INTEGER K,LDA,LDB,LDC,M,N */ -/* CHARACTER TRANSA,TRANSB */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGEMM performs one of the matrix-matrix operations */ -/* > */ -/* > C := alpha*op( A )*op( B ) + beta*C, */ -/* > */ -/* > where op( X ) is one of */ -/* > */ -/* > op( X ) = X or op( X ) = X**T, */ -/* > */ -/* > alpha and beta are scalars, and A, B and C are matrices, with op( A ) */ -/* > an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] TRANSA */ -/* > \verbatim */ -/* > TRANSA is CHARACTER*1 */ -/* > On entry, TRANSA specifies the form of op( A ) to be used in */ -/* > the matrix multiplication as follows: */ -/* > */ -/* > TRANSA = 'N' or 'n', op( A ) = A. */ -/* > */ -/* > TRANSA = 'T' or 't', op( A ) = A**T. */ -/* > */ -/* > TRANSA = 'C' or 'c', op( A ) = A**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANSB */ -/* > \verbatim */ -/* > TRANSB is CHARACTER*1 */ -/* > On entry, TRANSB specifies the form of op( B ) to be used in */ -/* > the matrix multiplication as follows: */ -/* > */ -/* > TRANSB = 'N' or 'n', op( B ) = B. */ -/* > */ -/* > TRANSB = 'T' or 't', op( B ) = B**T. */ -/* > */ -/* > TRANSB = 'C' or 'c', op( B ) = B**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > On entry, M specifies the number of rows of the matrix */ -/* > op( A ) and of the matrix C. M must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the number of columns of the matrix */ -/* > op( B ) and the number of columns of the matrix C. N must be */ -/* > at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > On entry, K specifies the number of columns of the matrix */ -/* > op( A ) and the number of rows of the matrix op( B ). K must */ -/* > be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION. */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is */ -/* > k when TRANSA = 'N' or 'n', and is m otherwise. */ -/* > Before entry with TRANSA = 'N' or 'n', the leading m by k */ -/* > part of the array A must contain the matrix A, otherwise */ -/* > the leading k by m part of the array A must contain the */ -/* > matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. When TRANSA = 'N' or 'n' then */ -/* > LDA must be at least max( 1, m ), otherwise LDA must be at */ -/* > least max( 1, k ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension ( LDB, kb ), where kb is */ -/* > n when TRANSB = 'N' or 'n', and is k otherwise. */ -/* > Before entry with TRANSB = 'N' or 'n', the leading k by n */ -/* > part of the array B must contain the matrix B, otherwise */ -/* > the leading n by k part of the array B must contain the */ -/* > matrix B. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > On entry, LDB specifies the first dimension of B as declared */ -/* > in the calling (sub) program. When TRANSB = 'N' or 'n' then */ -/* > LDB must be at least max( 1, k ), otherwise LDB must be at */ -/* > least max( 1, n ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is DOUBLE PRECISION. */ -/* > On entry, BETA specifies the scalar beta. When BETA is */ -/* > supplied as zero then C need not be set on input. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension ( LDC, N ) */ -/* > Before entry, the leading m by n part of the array C must */ -/* > contain the matrix C, except when beta is zero, in which */ -/* > case C need not be set on entry. */ -/* > On exit, the array C is overwritten by the m by n matrix */ -/* > ( alpha*op( A )*op( B ) + beta*C ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > On entry, LDC specifies the first dimension of C as declared */ -/* > in the calling (sub) program. LDC must be at least */ -/* > max( 1, m ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level3 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 3 Blas routine. */ -/* > */ -/* > -- Written on 8-February-1989. */ -/* > Jack Dongarra, Argonne National Laboratory. */ -/* > Iain Duff, AERE Harwell. */ -/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ -/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dgemm_(char *transa, char *transb, integer *m, integer * - n, integer *k, doublereal *alpha, doublereal *a, integer *lda, - doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, - integer *ldc, ftnlen transa_len, ftnlen transb_len) +int dgemm_(char *transa, char *transb, integer *m, integer *n, integer *k, doublereal *alpha, + doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *beta, + doublereal *c__, integer *ldc, ftnlen transa_len, ftnlen transb_len) { - /* System generated locals */ - integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, - i__3; - - /* Local variables */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3; integer i__, j, l, info; logical nota, notb; doublereal temp; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nrowa, nrowb; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level3 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Parameters .. */ -/* .. */ - -/* Set NOTA and NOTB as true if A and B respectively are not */ -/* transposed and set NROWA and NROWB as the number of rows of A */ -/* and B respectively. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -254,8 +22,6 @@ extern "C" { c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; - - /* Function Body */ nota = lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1); notb = lsame_(transb, (char *)"N", (ftnlen)1, (ftnlen)1); if (nota) { @@ -268,15 +34,12 @@ extern "C" { } else { nrowb = *n; } - -/* Test the input parameters. */ - info = 0; - if (! nota && ! lsame_(transa, (char *)"C", (ftnlen)1, (ftnlen)1) && ! lsame_( - transa, (char *)"T", (ftnlen)1, (ftnlen)1)) { + if (!nota && !lsame_(transa, (char *)"C", (ftnlen)1, (ftnlen)1) && + !lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! notb && ! lsame_(transb, (char *)"C", (ftnlen)1, (ftnlen)1) && ! - lsame_(transb, (char *)"T", (ftnlen)1, (ftnlen)1)) { + } else if (!notb && !lsame_(transb, (char *)"C", (ftnlen)1, (ftnlen)1) && + !lsame_(transb, (char *)"T", (ftnlen)1, (ftnlen)1)) { info = 2; } else if (*m < 0) { info = 3; @@ -284,26 +47,20 @@ extern "C" { info = 4; } else if (*k < 0) { info = 5; - } else if (*lda < max(1,nrowa)) { + } else if (*lda < max(1, nrowa)) { info = 8; - } else if (*ldb < max(1,nrowb)) { + } else if (*ldb < max(1, nrowb)) { info = 10; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { info = 13; } if (info != 0) { xerbla_((char *)"DGEMM ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*m == 0 || *n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { return 0; } - -/* And if alpha.eq.zero. */ - if (*alpha == 0.) { if (*beta == 0.) { i__1 = *n; @@ -311,9 +68,7 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; -/* L10: */ } -/* L20: */ } } else { i__1 = *n; @@ -321,34 +76,24 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; -/* L30: */ } -/* L40: */ } } return 0; } - -/* Start the operations. */ - if (notb) { if (nota) { - -/* Form C := alpha*A*B + beta*C. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*beta == 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; -/* L50: */ } } else if (*beta != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; -/* L60: */ } } i__2 = *k; @@ -357,16 +102,10 @@ extern "C" { i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; -/* L70: */ } -/* L80: */ } -/* L90: */ } } else { - -/* Form C := alpha*A**T*B + beta*C */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -375,37 +114,28 @@ extern "C" { i__3 = *k; for (l = 1; l <= i__3; ++l) { temp += a[l + i__ * a_dim1] * b[l + j * b_dim1]; -/* L100: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = *alpha * temp; } else { - c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ - i__ + j * c_dim1]; + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[i__ + j * c_dim1]; } -/* L110: */ } -/* L120: */ } } } else { if (nota) { - -/* Form C := alpha*A*B**T + beta*C */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*beta == 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; -/* L130: */ } } else if (*beta != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; -/* L140: */ } } i__2 = *k; @@ -414,16 +144,10 @@ extern "C" { i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; -/* L150: */ } -/* L160: */ } -/* L170: */ } } else { - -/* Form C := alpha*A**T*B**T + beta*C */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -432,27 +156,18 @@ extern "C" { i__3 = *k; for (l = 1; l <= i__3; ++l) { temp += a[l + i__ * a_dim1] * b[j + l * b_dim1]; -/* L180: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = *alpha * temp; } else { - c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ - i__ + j * c_dim1]; + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[i__ + j * c_dim1]; } -/* L190: */ } -/* L200: */ } } } - return 0; - -/* End of DGEMM */ - -} /* dgemm_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgemv.cpp b/lib/linalg/dgemv.cpp index 5e82c1144c..1ec78f9529 100644 --- a/lib/linalg/dgemv.cpp +++ b/lib/linalg/dgemv.cpp @@ -1,231 +1,31 @@ -/* fortran/dgemv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DGEMV */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION ALPHA,BETA */ -/* INTEGER INCX,INCY,LDA,M,N */ -/* CHARACTER TRANS */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A(LDA,*),X(*),Y(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGEMV performs one of the matrix-vector operations */ -/* > */ -/* > y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y, */ -/* > */ -/* > where alpha and beta are scalars, x and y are vectors and A is an */ -/* > m by n matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > On entry, TRANS specifies the operation to be performed as */ -/* > follows: */ -/* > */ -/* > TRANS = 'N' or 'n' y := alpha*A*x + beta*y. */ -/* > */ -/* > TRANS = 'T' or 't' y := alpha*A**T*x + beta*y. */ -/* > */ -/* > TRANS = 'C' or 'c' y := alpha*A**T*x + beta*y. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > On entry, M specifies the number of rows of the matrix A. */ -/* > M must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the number of columns of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION. */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension ( LDA, N ) */ -/* > Before entry, the leading m by n part of the array A must */ -/* > contain the matrix of coefficients. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. LDA must be at least */ -/* > max( 1, m ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' */ -/* > and at least */ -/* > ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. */ -/* > Before entry, the incremented array X must contain the */ -/* > vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is DOUBLE PRECISION. */ -/* > On entry, BETA specifies the scalar beta. When BETA is */ -/* > supplied as zero then Y need not be set on input. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Y */ -/* > \verbatim */ -/* > Y is DOUBLE PRECISION array, dimension at least */ -/* > ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' */ -/* > and at least */ -/* > ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. */ -/* > Before entry with BETA non-zero, the incremented array Y */ -/* > must contain the vector y. On exit, Y is overwritten by the */ -/* > updated vector y. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > On entry, INCY specifies the increment for the elements of */ -/* > Y. INCY must not be zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dgemv_(char *trans, integer *m, integer *n, doublereal * - alpha, doublereal *a, integer *lda, doublereal *x, integer *incx, - doublereal *beta, doublereal *y, integer *incy, ftnlen trans_len) +int dgemv_(char *trans, integer *m, integer *n, doublereal *alpha, doublereal *a, integer *lda, + doublereal *x, integer *incx, doublereal *beta, doublereal *y, integer *incy, + ftnlen trans_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; - - /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; doublereal temp; integer lenx, leny; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --y; - - /* Function Body */ info = 0; - if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"T", ( - ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1) - ) { + if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 1; } else if (*m < 0) { info = 2; } else if (*n < 0) { info = 3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { info = 6; } else if (*incx == 0) { info = 8; @@ -236,16 +36,9 @@ extern "C" { xerbla_((char *)"DGEMV ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) { return 0; } - -/* Set LENX and LENY, the lengths of the vectors x and y, and set */ -/* up the start points in X and Y. */ - if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { lenx = *n; leny = *m; @@ -263,25 +56,17 @@ extern "C" { } else { ky = 1 - (leny - 1) * *incy; } - -/* Start the operations. In this version the elements of A are */ -/* accessed sequentially with one pass through A. */ - -/* First form y := beta*y. */ - if (*beta != 1.) { if (*incy == 1) { if (*beta == 0.) { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = 0.; -/* L10: */ } } else { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = *beta * y[i__]; -/* L20: */ } } } else { @@ -291,14 +76,12 @@ extern "C" { for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = 0.; iy += *incy; -/* L30: */ } } else { i__1 = leny; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = *beta * y[iy]; iy += *incy; -/* L40: */ } } } @@ -307,9 +90,6 @@ extern "C" { return 0; } if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form y := alpha*A*x + y. */ - jx = kx; if (*incy == 1) { i__1 = *n; @@ -318,10 +98,8 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { y[i__] += temp * a[i__ + j * a_dim1]; -/* L50: */ } jx += *incx; -/* L60: */ } } else { i__1 = *n; @@ -332,16 +110,11 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { y[iy] += temp * a[i__ + j * a_dim1]; iy += *incy; -/* L70: */ } jx += *incx; -/* L80: */ } } } else { - -/* Form y := alpha*A**T*x + y. */ - jy = ky; if (*incx == 1) { i__1 = *n; @@ -350,11 +123,9 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp += a[i__ + j * a_dim1] * x[i__]; -/* L90: */ } y[jy] += *alpha * temp; jy += *incy; -/* L100: */ } } else { i__1 = *n; @@ -365,21 +136,14 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { temp += a[i__ + j * a_dim1] * x[ix]; ix += *incx; -/* L110: */ } y[jy] += *alpha * temp; jy += *incy; -/* L120: */ } } } - return 0; - -/* End of DGEMV */ - -} /* dgemv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgeqr2.cpp b/lib/linalg/dgeqr2.cpp index 6cc1bc8400..5c3b885bfb 100644 --- a/lib/linalg/dgeqr2.cpp +++ b/lib/linalg/dgeqr2.cpp @@ -1,209 +1,29 @@ -/* fortran/dgeqr2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DGEQR2 computes the QR factorization of a general rectangular matrix using an unblocked algorit -hm. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGEQR2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGEQR2( M, N, A, LDA, TAU, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGEQR2 computes a QR factorization of a real m-by-n matrix A: */ -/* > */ -/* > A = Q * ( R ), */ -/* > ( 0 ) */ -/* > */ -/* > where: */ -/* > */ -/* > Q is a m-by-m orthogonal matrix; */ -/* > R is an upper-triangular n-by-n matrix; */ -/* > 0 is a (m-n)-by-n zero matrix, if m > n. */ -/* > */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the m by n matrix A. */ -/* > On exit, the elements on and above the diagonal of the array */ -/* > contain the min(m,n) by n upper trapezoidal matrix R (R is */ -/* > upper triangular if m >= n); the elements below the diagonal, */ -/* > with the array TAU, represent the orthogonal matrix Q as a */ -/* > product of elementary reflectors (see Further Details). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The scalar factors of the elementary reflectors (see Further */ -/* > Details). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The matrix Q is represented as a product of elementary reflectors */ -/* > */ -/* > Q = H(1) H(2) . . . H(k), where k = min(m,n). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**T */ -/* > */ -/* > where tau is a real scalar, and v is a real vector with */ -/* > v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), */ -/* > and tau in TAU(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dgeqr2_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *tau, doublereal *work, integer *info) +int dgeqr2_(integer *m, integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal *work, + integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, k; doublereal aii; - extern /* Subroutine */ int dlarf_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, ftnlen), dlarfg_(integer *, doublereal *, - doublereal *, integer *, doublereal *), xerbla_(char *, integer *, - ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ + extern int dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, ftnlen), + dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), + xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -4; } if (*info != 0) { @@ -211,40 +31,24 @@ f"> */ xerbla_((char *)"DGEQR2", &i__1, (ftnlen)6); return 0; } - - k = min(*m,*n); - + k = min(*m, *n); i__1 = k; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Generate elementary reflector H(i) to annihilate A(i+1:m,i) */ - i__2 = *m - i__ + 1; -/* Computing MIN */ i__3 = i__ + 1; - dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3,*m) + i__ * a_dim1] - , &c__1, &tau[i__]); + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3, *m) + i__ * a_dim1], &c__1, &tau[i__]); if (i__ < *n) { - -/* Apply H(i) to A(i:m,i+1:n) from the left */ - aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; i__2 = *m - i__ + 1; i__3 = *n - i__; - dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, &tau[ - i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], ( - ftnlen)4); + dlarf_((char *)"Left", &i__2, &i__3, &a[i__ + i__ * a_dim1], &c__1, &tau[i__], + &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], (ftnlen)4); a[i__ + i__ * a_dim1] = aii; } -/* L10: */ } return 0; - -/* End of DGEQR2 */ - -} /* dgeqr2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgeqrf.cpp b/lib/linalg/dgeqrf.cpp index 57b92689b9..6c70b9f7f7 100644 --- a/lib/linalg/dgeqrf.cpp +++ b/lib/linalg/dgeqrf.cpp @@ -1,240 +1,45 @@ -/* fortran/dgeqrf.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; - -/* > \brief \b DGEQRF */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGEQRF + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGEQRF computes a QR factorization of a real M-by-N matrix A: */ -/* > */ -/* > A = Q * ( R ), */ -/* > ( 0 ) */ -/* > */ -/* > where: */ -/* > */ -/* > Q is a M-by-M orthogonal matrix; */ -/* > R is an upper-triangular N-by-N matrix; */ -/* > 0 is a (M-N)-by-N zero matrix, if M > N. */ -/* > */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the M-by-N matrix A. */ -/* > On exit, the elements on and above the diagonal of the array */ -/* > contain the min(M,N)-by-N upper trapezoidal matrix R (R is */ -/* > upper triangular if m >= n); the elements below the diagonal, */ -/* > with the array TAU, represent the orthogonal matrix Q as a */ -/* > product of min(m,n) elementary reflectors (see Further */ -/* > Details). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The scalar factors of the elementary reflectors (see Further */ -/* > Details). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise. */ -/* > For optimum performance LWORK >= N*NB, where NB is */ -/* > the optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The matrix Q is represented as a product of elementary reflectors */ -/* > */ -/* > Q = H(1) H(2) . . . H(k), where k = min(m,n). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**T */ -/* > */ -/* > where tau is a real scalar, and v is a real vector with */ -/* > v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), */ -/* > and tau in TAU(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dgeqrf_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) +int dgeqrf_(integer *m, integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal *work, + integer *lwork, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; - - /* Local variables */ integer i__, k, ib, nb, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int dgeqr2_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *), dlarfb_(char *, - char *, char *, char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, - ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dgeqr2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *), + dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen, ftnlen), + dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ - k = min(*m,*n); + k = min(*m, *n); *info = 0; - nb = ilaenv_(&c__1, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen) - 1); + nb = ilaenv_(&c__1, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); lquery = *lwork == -1; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -4; - } else if (! lquery) { - if (*lwork <= 0 || *m > 0 && *lwork < max(1,*n)) { + } else if (!lquery) { + if (*lwork <= 0 || *m > 0 && *lwork < max(1, *n)) { *info = -7; } } @@ -248,107 +53,61 @@ f"> */ } else { lwkopt = *n * nb; } - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; return 0; } - -/* Quick return if possible */ - if (k == 0) { work[1] = 1.; return 0; } - nbmin = 2; nx = 0; iws = *n; if (nb > 1 && nb < k) { - -/* Determine when to cross over from blocked to unblocked code. */ - -/* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1, i__2); if (nx < k) { - -/* Determine if workspace is large enough for blocked code. */ - ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { - -/* Not enough workspace to use optimal NB: reduce NB and */ -/* determine the minimum value of NB. */ - nb = *lwork / ldwork; -/* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, & - c_n1, (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"DGEQRF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); } } } - if (nb >= nbmin && nb < k && nx < k) { - -/* Use blocked code initially */ - i__1 = k - nx; i__2 = nb; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { -/* Computing MIN */ i__3 = k - i__ + 1; - ib = min(i__3,nb); - -/* Compute the QR factorization of the current block */ -/* A(i:m,i:i+ib-1) */ - + ib = min(i__3, nb); i__3 = *m - i__ + 1; - dgeqr2_(&i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[ - 1], &iinfo); + dgeqr2_(&i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &iinfo); if (i__ + ib <= *n) { - -/* Form the triangular factor of the block reflector */ -/* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__3 = *m - i__ + 1; - dlarft_((char *)"Forward", (char *)"Columnwise", &i__3, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, - (ftnlen)10); - -/* Apply H**T to A(i:m,i+ib:n) from the left */ - + dlarft_((char *)"Forward", (char *)"Columnwise", &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], + &work[1], &ldwork, (ftnlen)7, (ftnlen)10); i__3 = *m - i__ + 1; i__4 = *n - i__ - ib + 1; - dlarfb_((char *)"Left", (char *)"Transpose", (char *)"Forward", (char *)"Columnwise", &i__3, & - i__4, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & - ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, &work[ib - + 1], &ldwork, (ftnlen)4, (ftnlen)9, (ftnlen)7, ( - ftnlen)10); + dlarfb_((char *)"Left", (char *)"Transpose", (char *)"Forward", (char *)"Columnwise", &i__3, &i__4, &ib, + &a[i__ + i__ * a_dim1], lda, &work[1], &ldwork, + &a[i__ + (i__ + ib) * a_dim1], lda, &work[ib + 1], &ldwork, (ftnlen)4, + (ftnlen)9, (ftnlen)7, (ftnlen)10); } -/* L10: */ } } else { i__ = 1; } - -/* Use unblocked code to factor the last or only block. */ - if (i__ <= k) { i__2 = *m - i__ + 1; i__1 = *n - i__ + 1; - dgeqr2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1] - , &iinfo); + dgeqr2_(&i__2, &i__1, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &iinfo); } - - work[1] = (doublereal) iws; + work[1] = (doublereal)iws; return 0; - -/* End of DGEQRF */ - -} /* dgeqrf_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dger.cpp b/lib/linalg/dger.cpp index 9bb0d19982..46447e29f3 100644 --- a/lib/linalg/dger.cpp +++ b/lib/linalg/dger.cpp @@ -1,191 +1,19 @@ -/* fortran/dger.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DGER */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGER(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION ALPHA */ -/* INTEGER INCX,INCY,LDA,M,N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A(LDA,*),X(*),Y(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGER performs the rank 1 operation */ -/* > */ -/* > A := alpha*x*y**T + A, */ -/* > */ -/* > where alpha is a scalar, x is an m element vector, y is an n element */ -/* > vector and A is an m by n matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > On entry, M specifies the number of rows of the matrix A. */ -/* > M must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the number of columns of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION. */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION array, dimension at least */ -/* > ( 1 + ( m - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array X must contain the m */ -/* > element vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Y */ -/* > \verbatim */ -/* > Y is DOUBLE PRECISION array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCY ) ). */ -/* > Before entry, the incremented array Y must contain the n */ -/* > element vector y. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > On entry, INCY specifies the increment for the elements of */ -/* > Y. INCY must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension ( LDA, N ) */ -/* > Before entry, the leading m by n part of the array A must */ -/* > contain the matrix of coefficients. On exit, A is */ -/* > overwritten by the updated matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. LDA must be at least */ -/* > max( 1, m ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dger_(integer *m, integer *n, doublereal *alpha, - doublereal *x, integer *incx, doublereal *y, integer *incy, - doublereal *a, integer *lda) +int dger_(integer *m, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, + integer *incy, doublereal *a, integer *lda) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; - - /* Local variables */ integer i__, j, ix, jy, kx, info; doublereal temp; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); --x; --y; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ info = 0; if (*m < 0) { info = 1; @@ -195,23 +23,16 @@ extern "C" { info = 5; } else if (*incy == 0) { info = 7; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { info = 9; } if (info != 0) { xerbla_((char *)"DGER ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*m == 0 || *n == 0 || *alpha == 0.) { return 0; } - -/* Start the operations. In this version the elements of A are */ -/* accessed sequentially with one pass through A. */ - if (*incy > 0) { jy = 1; } else { @@ -225,11 +46,9 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] += x[i__] * temp; -/* L10: */ } } jy += *incy; -/* L20: */ } } else { if (*incx > 0) { @@ -246,20 +65,13 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] += x[ix] * temp; ix += *incx; -/* L30: */ } } jy += *incy; -/* L40: */ } } - return 0; - -/* End of DGER */ - -} /* dger_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgesv.cpp b/lib/linalg/dgesv.cpp index c2e0232c37..41f85f4566 100644 --- a/lib/linalg/dgesv.cpp +++ b/lib/linalg/dgesv.cpp @@ -1,176 +1,15 @@ -/* fortran/dgesv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief DGESV computes the solution to system of linear equations A * X = B for GE matrices */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGESV + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, LDB, N, NRHS */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IPIV( * ) */ -/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGESV computes the solution to a real system of linear equations */ -/* > A * X = B, */ -/* > where A is an N-by-N matrix and X and B are N-by-NRHS matrices. */ -/* > */ -/* > The LU decomposition with partial pivoting and row interchanges is */ -/* > used to factor A as */ -/* > A = P * L * U, */ -/* > where P is a permutation matrix, L is unit lower triangular, and U is */ -/* > upper triangular. The factored form of A is then used to solve the */ -/* > system of equations A * X = B. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of linear equations, i.e., the order of the */ -/* > matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NRHS */ -/* > \verbatim */ -/* > NRHS is INTEGER */ -/* > The number of right hand sides, i.e., the number of columns */ -/* > of the matrix B. NRHS >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the N-by-N coefficient matrix A. */ -/* > On exit, the factors L and U from the factorization */ -/* > A = P*L*U; the unit diagonal elements of L are not stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IPIV */ -/* > \verbatim */ -/* > IPIV is INTEGER array, dimension (N) */ -/* > The pivot indices that define the permutation matrix P; */ -/* > row i of the matrix was interchanged with row IPIV(i). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ -/* > On entry, the N-by-NRHS matrix of right hand side matrix B. */ -/* > On exit, if INFO = 0, the N-by-NRHS solution matrix X. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, U(i,i) is exactly zero. The factorization */ -/* > has been completed, but the factor U is exactly */ -/* > singular, so the solution could not be computed. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEsolve */ - -/* ===================================================================== */ -/* Subroutine */ int dgesv_(integer *n, integer *nrhs, doublereal *a, integer - *lda, integer *ipiv, doublereal *b, integer *ldb, integer *info) +int dgesv_(integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, doublereal *b, + integer *ldb, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; - - /* Local variables */ - extern /* Subroutine */ int dgetrf_(integer *, integer *, doublereal *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen), dgetrs_(char *, integer *, integer *, doublereal *, - integer *, integer *, doublereal *, integer *, integer *, ftnlen); - - -/* -- LAPACK driver routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int dgetrf_(integer *, integer *, doublereal *, integer *, integer *, integer *), + xerbla_(char *, integer *, ftnlen), + dgetrs_(char *, integer *, integer *, doublereal *, integer *, integer *, doublereal *, + integer *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -178,16 +17,14 @@ extern "C" { b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; - - /* Function Body */ *info = 0; if (*n < 0) { *info = -1; } else if (*nrhs < 0) { *info = -2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -4; - } else if (*ldb < max(1,*n)) { + } else if (*ldb < max(1, *n)) { *info = -7; } if (*info != 0) { @@ -195,23 +32,13 @@ extern "C" { xerbla_((char *)"DGESV ", &i__1, (ftnlen)6); return 0; } - -/* Compute the LU factorization of A. */ - dgetrf_(n, n, &a[a_offset], lda, &ipiv[1], info); if (*info == 0) { - -/* Solve the system A*X = B, overwriting B with X. */ - - dgetrs_((char *)"No transpose", n, nrhs, &a[a_offset], lda, &ipiv[1], &b[ - b_offset], ldb, info, (ftnlen)12); + dgetrs_((char *)"No transpose", n, nrhs, &a[a_offset], lda, &ipiv[1], &b[b_offset], ldb, info, + (ftnlen)12); } return 0; - -/* End of DGESV */ - -} /* dgesv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgesvd.cpp b/lib/linalg/dgesvd.cpp index b5f4f1e8de..43765bce16 100644 --- a/lib/linalg/dgesvd.cpp +++ b/lib/linalg/dgesvd.cpp @@ -1,22 +1,7 @@ -/* fortran/dgesvd.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__6 = 6; static integer c__0 = 0; static integer c__2 = 2; @@ -24,313 +9,62 @@ static integer c_n1 = -1; static doublereal c_b57 = 0.; static integer c__1 = 1; static doublereal c_b79 = 1.; - -/* > \brief DGESVD computes the singular value decomposition (SVD) for GE matrices */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGESVD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT, */ -/* WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER JOBU, JOBVT */ -/* INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), S( * ), U( LDU, * ), */ -/* $ VT( LDVT, * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGESVD computes the singular value decomposition (SVD) of a real */ -/* > M-by-N matrix A, optionally computing the left and/or right singular */ -/* > vectors. The SVD is written */ -/* > */ -/* > A = U * SIGMA * transpose(V) */ -/* > */ -/* > where SIGMA is an M-by-N matrix which is zero except for its */ -/* > min(m,n) diagonal elements, U is an M-by-M orthogonal matrix, and */ -/* > V is an N-by-N orthogonal matrix. The diagonal elements of SIGMA */ -/* > are the singular values of A; they are real and non-negative, and */ -/* > are returned in descending order. The first min(m,n) columns of */ -/* > U and V are the left and right singular vectors of A. */ -/* > */ -/* > Note that the routine returns V**T, not V. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] JOBU */ -/* > \verbatim */ -/* > JOBU is CHARACTER*1 */ -/* > Specifies options for computing all or part of the matrix U: */ -/* > = 'A': all M columns of U are returned in array U: */ -/* > = 'S': the first min(m,n) columns of U (the left singular */ -/* > vectors) are returned in the array U; */ -/* > = 'O': the first min(m,n) columns of U (the left singular */ -/* > vectors) are overwritten on the array A; */ -/* > = 'N': no columns of U (no left singular vectors) are */ -/* > computed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] JOBVT */ -/* > \verbatim */ -/* > JOBVT is CHARACTER*1 */ -/* > Specifies options for computing all or part of the matrix */ -/* > V**T: */ -/* > = 'A': all N rows of V**T are returned in the array VT; */ -/* > = 'S': the first min(m,n) rows of V**T (the right singular */ -/* > vectors) are returned in the array VT; */ -/* > = 'O': the first min(m,n) rows of V**T (the right singular */ -/* > vectors) are overwritten on the array A; */ -/* > = 'N': no rows of V**T (no right singular vectors) are */ -/* > computed. */ -/* > */ -/* > JOBVT and JOBU cannot both be 'O'. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the input matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the input matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the M-by-N matrix A. */ -/* > On exit, */ -/* > if JOBU = 'O', A is overwritten with the first min(m,n) */ -/* > columns of U (the left singular vectors, */ -/* > stored columnwise); */ -/* > if JOBVT = 'O', A is overwritten with the first min(m,n) */ -/* > rows of V**T (the right singular vectors, */ -/* > stored rowwise); */ -/* > if JOBU .ne. 'O' and JOBVT .ne. 'O', the contents of A */ -/* > are destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION array, dimension (min(M,N)) */ -/* > The singular values of A, sorted so that S(i) >= S(i+1). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] U */ -/* > \verbatim */ -/* > U is DOUBLE PRECISION array, dimension (LDU,UCOL) */ -/* > (LDU,M) if JOBU = 'A' or (LDU,min(M,N)) if JOBU = 'S'. */ -/* > If JOBU = 'A', U contains the M-by-M orthogonal matrix U; */ -/* > if JOBU = 'S', U contains the first min(m,n) columns of U */ -/* > (the left singular vectors, stored columnwise); */ -/* > if JOBU = 'N' or 'O', U is not referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDU */ -/* > \verbatim */ -/* > LDU is INTEGER */ -/* > The leading dimension of the array U. LDU >= 1; if */ -/* > JOBU = 'S' or 'A', LDU >= M. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] VT */ -/* > \verbatim */ -/* > VT is DOUBLE PRECISION array, dimension (LDVT,N) */ -/* > If JOBVT = 'A', VT contains the N-by-N orthogonal matrix */ -/* > V**T; */ -/* > if JOBVT = 'S', VT contains the first min(m,n) rows of */ -/* > V**T (the right singular vectors, stored rowwise); */ -/* > if JOBVT = 'N' or 'O', VT is not referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDVT */ -/* > \verbatim */ -/* > LDVT is INTEGER */ -/* > The leading dimension of the array VT. LDVT >= 1; if */ -/* > JOBVT = 'A', LDVT >= N; if JOBVT = 'S', LDVT >= min(M,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK; */ -/* > if INFO > 0, WORK(2:MIN(M,N)) contains the unconverged */ -/* > superdiagonal elements of an upper bidiagonal matrix B */ -/* > whose diagonal is in S (not necessarily sorted). B */ -/* > satisfies A = U * B * VT, so it has the same singular values */ -/* > as A, and singular vectors related by U and VT. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > LWORK >= MAX(1,5*MIN(M,N)) for the paths (see comments inside code): */ -/* > - PATH 1 (M much larger than N, JOBU='N') */ -/* > - PATH 1t (N much larger than M, JOBVT='N') */ -/* > LWORK >= MAX(1,3*MIN(M,N) + MAX(M,N),5*MIN(M,N)) for the other paths */ -/* > For good performance, LWORK should generally be larger. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: if DBDSQR did not converge, INFO specifies how many */ -/* > superdiagonals of an intermediate bidiagonal form B */ -/* > did not converge to zero. See the description of WORK */ -/* > above for details. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEsing */ - -/* ===================================================================== */ -/* Subroutine */ int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, - doublereal *a, integer *lda, doublereal *s, doublereal *u, integer * - ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, - integer *info, ftnlen jobu_len, ftnlen jobvt_len) +int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, doublereal *a, integer *lda, + doublereal *s, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, + doublereal *work, integer *lwork, integer *info, ftnlen jobu_len, ftnlen jobvt_len) { - /* System generated locals */ address a__1[2]; - integer a_dim1, a_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1[2], - i__2, i__3, i__4; + integer a_dim1, a_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1[2], i__2, i__3, i__4; char ch__1[2]; - - /* Builtin functions */ - /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); double sqrt(doublereal); - - /* Local variables */ integer i__, ie, ir, iu, blk, ncu; doublereal dum[1], eps; integer nru, iscl; doublereal anrm; - integer ierr, itau, ncvt, nrvt, lwork_dgebrd__, lwork_dgelqf__, - lwork_dgeqrf__; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer ierr, itau, ncvt, nrvt, lwork_dgebrd__, lwork_dgelqf__, lwork_dgeqrf__; + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); integer chunk, minmn, wrkbl, itaup, itauq, mnthr, iwork; logical wntua, wntva, wntun, wntuo, wntvn, wntvo, wntus, wntvs; - extern /* Subroutine */ int dgebrd_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *, integer *); - extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, ftnlen); + extern int dgebrd_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, integer *); + extern doublereal dlamch_(char *, ftnlen), + dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *, ftnlen); integer bdspac; - extern /* Subroutine */ int dgelqf_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, integer *), - dlascl_(char *, integer *, integer *, doublereal *, doublereal *, - integer *, integer *, doublereal *, integer *, integer *, ftnlen), - dgeqrf_(integer *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, integer *), dlacpy_(char *, - integer *, integer *, doublereal *, integer *, doublereal *, - integer *, ftnlen), dlaset_(char *, integer *, integer *, - doublereal *, doublereal *, doublereal *, integer *, ftnlen), - dbdsqr_(char *, integer *, integer *, integer *, integer *, - doublereal *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, doublereal *, integer *, - ftnlen), dorgbr_(char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - integer *, ftnlen); + extern int dgelqf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen), + dgeqrf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, integer *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), + dbdsqr_(char *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, ftnlen), + dorgbr_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *, ftnlen); doublereal bignum; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dormbr_(char *, char *, char *, integer *, - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, integer *, - ftnlen, ftnlen, ftnlen), dorglq_(integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - integer *), dorgqr_(integer *, integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, integer *); + extern int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dormbr_(char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, + integer *, ftnlen, ftnlen, ftnlen), + dorglq_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *), + dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *); integer ldwrkr, minwrk, ldwrku, maxwrk; doublereal smlnum; logical lquery, wntuas, wntvas; - integer lwork_dorgbr_p__, lwork_dorgbr_q__, lwork_dorglq_m__, - lwork_dorglq_n__, lwork_dorgqr_m__, lwork_dorgqr_n__; - - -/* -- LAPACK driver routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Local Arrays .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ + integer lwork_dorgbr_p__, lwork_dorgbr_q__, lwork_dorglq_m__, lwork_dorglq_n__, + lwork_dorgqr_m__, lwork_dorgqr_n__; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -342,10 +76,8 @@ f"> */ vt_offset = 1 + vt_dim1; vt -= vt_offset; --work; - - /* Function Body */ *info = 0; - minmn = min(*m,*n); + minmn = min(*m, *n); wntua = lsame_(jobu, (char *)"A", (ftnlen)1, (ftnlen)1); wntus = lsame_(jobu, (char *)"S", (ftnlen)1, (ftnlen)1); wntuas = wntua || wntus; @@ -357,560 +89,357 @@ f"> */ wntvo = lsame_(jobvt, (char *)"O", (ftnlen)1, (ftnlen)1); wntvn = lsame_(jobvt, (char *)"N", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - - if (! (wntua || wntus || wntuo || wntun)) { + if (!(wntua || wntus || wntuo || wntun)) { *info = -1; - } else if (! (wntva || wntvs || wntvo || wntvn) || wntvo && wntuo) { + } else if (!(wntva || wntvs || wntvo || wntvn) || wntvo && wntuo) { *info = -2; } else if (*m < 0) { *info = -3; } else if (*n < 0) { *info = -4; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -6; } else if (*ldu < 1 || wntuas && *ldu < *m) { *info = -9; } else if (*ldvt < 1 || wntva && *ldvt < *n || wntvs && *ldvt < minmn) { *info = -11; } - -/* Compute workspace */ -/* (Note: Comments in the code beginning (char *)"Workspace:" describe the */ -/* minimal amount of workspace needed at that point in the code, */ -/* as well as the preferred amount for good performance. */ -/* NB refers to the optimal block size for the immediately */ -/* following subroutine, as returned by ILAENV.) */ - if (*info == 0) { minwrk = 1; maxwrk = 1; if (*m >= *n && minmn > 0) { - -/* Compute space needed for DBDSQR */ - -/* Writing concatenation */ i__1[0] = 1, a__1[0] = jobu; i__1[1] = 1, a__1[1] = jobvt; s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); - mnthr = ilaenv_(&c__6, (char *)"DGESVD", ch__1, m, n, &c__0, &c__0, ( - ftnlen)6, (ftnlen)2); + mnthr = ilaenv_(&c__6, (char *)"DGESVD", ch__1, m, n, &c__0, &c__0, (ftnlen)6, (ftnlen)2); bdspac = *n * 5; -/* Compute space needed for DGEQRF */ dgeqrf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); - lwork_dgeqrf__ = (integer) dum[0]; -/* Compute space needed for DORGQR */ + lwork_dgeqrf__ = (integer)dum[0]; dorgqr_(m, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); - lwork_dorgqr_n__ = (integer) dum[0]; + lwork_dorgqr_n__ = (integer)dum[0]; dorgqr_(m, m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); - lwork_dorgqr_m__ = (integer) dum[0]; -/* Compute space needed for DGEBRD */ - dgebrd_(n, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, - &ierr); - lwork_dgebrd__ = (integer) dum[0]; -/* Compute space needed for DORGBR P */ - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr, ( - ftnlen)1); - lwork_dorgbr_p__ = (integer) dum[0]; -/* Compute space needed for DORGBR Q */ - dorgbr_((char *)"Q", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr, ( - ftnlen)1); - lwork_dorgbr_q__ = (integer) dum[0]; - + lwork_dorgqr_m__ = (integer)dum[0]; + dgebrd_(n, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, &ierr); + lwork_dgebrd__ = (integer)dum[0]; + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr, (ftnlen)1); + lwork_dorgbr_p__ = (integer)dum[0]; + dorgbr_((char *)"Q", n, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr, (ftnlen)1); + lwork_dorgbr_q__ = (integer)dum[0]; if (*m >= mnthr) { if (wntun) { - -/* Path 1 (M much larger than N, JOBU='N') */ - maxwrk = *n + lwork_dgeqrf__; -/* Computing MAX */ i__2 = maxwrk, i__3 = *n * 3 + lwork_dgebrd__; - maxwrk = max(i__2,i__3); + maxwrk = max(i__2, i__3); if (wntvo || wntvas) { -/* Computing MAX */ i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_p__; - maxwrk = max(i__2,i__3); + maxwrk = max(i__2, i__3); } - maxwrk = max(maxwrk,bdspac); -/* Computing MAX */ + maxwrk = max(maxwrk, bdspac); i__2 = *n << 2; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntuo && wntvn) { - -/* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */ - wrkbl = *n + lwork_dgeqrf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); -/* Computing MAX */ + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n; - maxwrk = max(i__2,i__3); -/* Computing MAX */ + maxwrk = max(i__2, i__3); i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntuo && wntvas) { - -/* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or */ -/* 'A') */ - wrkbl = *n + lwork_dgeqrf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); -/* Computing MAX */ + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); i__2 = *n * *n + wrkbl, i__3 = *n * *n + *m * *n + *n; - maxwrk = max(i__2,i__3); -/* Computing MAX */ + maxwrk = max(i__2, i__3); i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntus && wntvn) { - -/* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */ - wrkbl = *n + lwork_dgeqrf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); maxwrk = *n * *n + wrkbl; -/* Computing MAX */ i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntus && wntvo) { - -/* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */ - wrkbl = *n + lwork_dgeqrf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); maxwrk = (*n << 1) * *n + wrkbl; -/* Computing MAX */ i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntus && wntvas) { - -/* Path 6 (M much larger than N, JOBU='S', JOBVT='S' or */ -/* 'A') */ - wrkbl = *n + lwork_dgeqrf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *n + lwork_dorgqr_n__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); maxwrk = *n * *n + wrkbl; -/* Computing MAX */ i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntua && wntvn) { - -/* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */ - wrkbl = *n + lwork_dgeqrf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); maxwrk = *n * *n + wrkbl; -/* Computing MAX */ i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntua && wntvo) { - -/* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */ - wrkbl = *n + lwork_dgeqrf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); maxwrk = (*n << 1) * *n + wrkbl; -/* Computing MAX */ i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntua && wntvas) { - -/* Path 9 (M much larger than N, JOBU='A', JOBVT='S' or */ -/* 'A') */ - wrkbl = *n + lwork_dgeqrf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *n + lwork_dorgqr_m__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *n * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); maxwrk = *n * *n + wrkbl; -/* Computing MAX */ i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } } else { - -/* Path 10 (M at least N, but not much larger) */ - - dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, & - c_n1, &ierr); - lwork_dgebrd__ = (integer) dum[0]; + dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, &ierr); + lwork_dgebrd__ = (integer)dum[0]; maxwrk = *n * 3 + lwork_dgebrd__; if (wntus || wntuo) { - dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, dum, dum, &c_n1, - &ierr, (ftnlen)1); - lwork_dorgbr_q__ = (integer) dum[0]; -/* Computing MAX */ + dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr, (ftnlen)1); + lwork_dorgbr_q__ = (integer)dum[0]; i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_q__; - maxwrk = max(i__2,i__3); + maxwrk = max(i__2, i__3); } if (wntua) { - dorgbr_((char *)"Q", m, m, n, &a[a_offset], lda, dum, dum, &c_n1, - &ierr, (ftnlen)1); - lwork_dorgbr_q__ = (integer) dum[0]; -/* Computing MAX */ + dorgbr_((char *)"Q", m, m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr, (ftnlen)1); + lwork_dorgbr_q__ = (integer)dum[0]; i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_q__; - maxwrk = max(i__2,i__3); + maxwrk = max(i__2, i__3); } - if (! wntvn) { -/* Computing MAX */ + if (!wntvn) { i__2 = maxwrk, i__3 = *n * 3 + lwork_dorgbr_p__; - maxwrk = max(i__2,i__3); + maxwrk = max(i__2, i__3); } - maxwrk = max(maxwrk,bdspac); -/* Computing MAX */ + maxwrk = max(maxwrk, bdspac); i__2 = *n * 3 + *m; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } } else if (minmn > 0) { - -/* Compute space needed for DBDSQR */ - -/* Writing concatenation */ i__1[0] = 1, a__1[0] = jobu; i__1[1] = 1, a__1[1] = jobvt; s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); - mnthr = ilaenv_(&c__6, (char *)"DGESVD", ch__1, m, n, &c__0, &c__0, ( - ftnlen)6, (ftnlen)2); + mnthr = ilaenv_(&c__6, (char *)"DGESVD", ch__1, m, n, &c__0, &c__0, (ftnlen)6, (ftnlen)2); bdspac = *m * 5; -/* Compute space needed for DGELQF */ dgelqf_(m, n, &a[a_offset], lda, dum, dum, &c_n1, &ierr); - lwork_dgelqf__ = (integer) dum[0]; -/* Compute space needed for DORGLQ */ + lwork_dgelqf__ = (integer)dum[0]; dorglq_(n, n, m, dum, n, dum, dum, &c_n1, &ierr); - lwork_dorglq_n__ = (integer) dum[0]; + lwork_dorglq_n__ = (integer)dum[0]; dorglq_(m, n, m, &a[a_offset], lda, dum, dum, &c_n1, &ierr); - lwork_dorglq_m__ = (integer) dum[0]; -/* Compute space needed for DGEBRD */ - dgebrd_(m, m, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, - &ierr); - lwork_dgebrd__ = (integer) dum[0]; -/* Compute space needed for DORGBR P */ - dorgbr_((char *)"P", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, ( - ftnlen)1); - lwork_dorgbr_p__ = (integer) dum[0]; -/* Compute space needed for DORGBR Q */ - dorgbr_((char *)"Q", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, ( - ftnlen)1); - lwork_dorgbr_q__ = (integer) dum[0]; + lwork_dorglq_m__ = (integer)dum[0]; + dgebrd_(m, m, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, &ierr); + lwork_dgebrd__ = (integer)dum[0]; + dorgbr_((char *)"P", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, (ftnlen)1); + lwork_dorgbr_p__ = (integer)dum[0]; + dorgbr_((char *)"Q", m, m, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, (ftnlen)1); + lwork_dorgbr_q__ = (integer)dum[0]; if (*n >= mnthr) { if (wntvn) { - -/* Path 1t(N much larger than M, JOBVT='N') */ - maxwrk = *m + lwork_dgelqf__; -/* Computing MAX */ i__2 = maxwrk, i__3 = *m * 3 + lwork_dgebrd__; - maxwrk = max(i__2,i__3); + maxwrk = max(i__2, i__3); if (wntuo || wntuas) { -/* Computing MAX */ i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_q__; - maxwrk = max(i__2,i__3); + maxwrk = max(i__2, i__3); } - maxwrk = max(maxwrk,bdspac); -/* Computing MAX */ + maxwrk = max(maxwrk, bdspac); i__2 = *m << 2; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntvo && wntun) { - -/* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */ - wrkbl = *m + lwork_dgelqf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); -/* Computing MAX */ + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m; - maxwrk = max(i__2,i__3); -/* Computing MAX */ + maxwrk = max(i__2, i__3); i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntvo && wntuas) { - -/* Path 3t(N much larger than M, JOBU='S' or 'A', */ -/* JOBVT='O') */ - wrkbl = *m + lwork_dgelqf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); -/* Computing MAX */ + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); i__2 = *m * *m + wrkbl, i__3 = *m * *m + *m * *n + *m; - maxwrk = max(i__2,i__3); -/* Computing MAX */ + maxwrk = max(i__2, i__3); i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntvs && wntun) { - -/* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */ - wrkbl = *m + lwork_dgelqf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); maxwrk = *m * *m + wrkbl; -/* Computing MAX */ i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntvs && wntuo) { - -/* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */ - wrkbl = *m + lwork_dgelqf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); maxwrk = (*m << 1) * *m + wrkbl; -/* Computing MAX */ i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntvs && wntuas) { - -/* Path 6t(N much larger than M, JOBU='S' or 'A', */ -/* JOBVT='S') */ - wrkbl = *m + lwork_dgelqf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *m + lwork_dorglq_m__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); maxwrk = *m * *m + wrkbl; -/* Computing MAX */ i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntva && wntun) { - -/* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */ - wrkbl = *m + lwork_dgelqf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); maxwrk = *m * *m + wrkbl; -/* Computing MAX */ i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntva && wntuo) { - -/* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */ - wrkbl = *m + lwork_dgelqf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); maxwrk = (*m << 1) * *m + wrkbl; -/* Computing MAX */ i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } else if (wntva && wntuas) { - -/* Path 9t(N much larger than M, JOBU='S' or 'A', */ -/* JOBVT='A') */ - wrkbl = *m + lwork_dgelqf__; -/* Computing MAX */ i__2 = wrkbl, i__3 = *m + lwork_dorglq_n__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dgebrd__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_p__; - wrkbl = max(i__2,i__3); -/* Computing MAX */ + wrkbl = max(i__2, i__3); i__2 = wrkbl, i__3 = *m * 3 + lwork_dorgbr_q__; - wrkbl = max(i__2,i__3); - wrkbl = max(wrkbl,bdspac); + wrkbl = max(i__2, i__3); + wrkbl = max(wrkbl, bdspac); maxwrk = *m * *m + wrkbl; -/* Computing MAX */ i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } } else { - -/* Path 10t(N greater than M, but not much larger) */ - - dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, & - c_n1, &ierr); - lwork_dgebrd__ = (integer) dum[0]; + dgebrd_(m, n, &a[a_offset], lda, &s[1], dum, dum, dum, dum, &c_n1, &ierr); + lwork_dgebrd__ = (integer)dum[0]; maxwrk = *m * 3 + lwork_dgebrd__; if (wntvs || wntvo) { -/* Compute space needed for DORGBR P */ - dorgbr_((char *)"P", m, n, m, &a[a_offset], n, dum, dum, &c_n1, & - ierr, (ftnlen)1); - lwork_dorgbr_p__ = (integer) dum[0]; -/* Computing MAX */ + dorgbr_((char *)"P", m, n, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, (ftnlen)1); + lwork_dorgbr_p__ = (integer)dum[0]; i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_p__; - maxwrk = max(i__2,i__3); + maxwrk = max(i__2, i__3); } if (wntva) { - dorgbr_((char *)"P", n, n, m, &a[a_offset], n, dum, dum, &c_n1, & - ierr, (ftnlen)1); - lwork_dorgbr_p__ = (integer) dum[0]; -/* Computing MAX */ + dorgbr_((char *)"P", n, n, m, &a[a_offset], n, dum, dum, &c_n1, &ierr, (ftnlen)1); + lwork_dorgbr_p__ = (integer)dum[0]; i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_p__; - maxwrk = max(i__2,i__3); + maxwrk = max(i__2, i__3); } - if (! wntun) { -/* Computing MAX */ + if (!wntun) { i__2 = maxwrk, i__3 = *m * 3 + lwork_dorgbr_q__; - maxwrk = max(i__2,i__3); + maxwrk = max(i__2, i__3); } - maxwrk = max(maxwrk,bdspac); -/* Computing MAX */ + maxwrk = max(maxwrk, bdspac); i__2 = *m * 3 + *n; - minwrk = max(i__2,bdspac); + minwrk = max(i__2, bdspac); } } - maxwrk = max(maxwrk,minwrk); - work[1] = (doublereal) maxwrk; - - if (*lwork < minwrk && ! lquery) { + maxwrk = max(maxwrk, minwrk); + work[1] = (doublereal)maxwrk; + if (*lwork < minwrk && !lquery) { *info = -13; } } - if (*info != 0) { i__2 = -(*info); xerbla_((char *)"DGESVD", &i__2, (ftnlen)6); @@ -918,1527 +447,676 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0) { return 0; } - -/* Get machine constants */ - eps = dlamch_((char *)"P", (ftnlen)1); smlnum = sqrt(dlamch_((char *)"S", (ftnlen)1)) / eps; bignum = 1. / smlnum; - -/* Scale A if max element outside range [SMLNUM,BIGNUM] */ - anrm = dlange_((char *)"M", m, n, &a[a_offset], lda, dum, (ftnlen)1); iscl = 0; if (anrm > 0. && anrm < smlnum) { iscl = 1; - dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, & - ierr, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &smlnum, m, n, &a[a_offset], lda, &ierr, (ftnlen)1); } else if (anrm > bignum) { iscl = 1; - dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, & - ierr, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anrm, &bignum, m, n, &a[a_offset], lda, &ierr, (ftnlen)1); } - if (*m >= *n) { - -/* A has at least as many rows as columns. If A has sufficiently */ -/* more rows than columns, first reduce using the QR */ -/* decomposition (if sufficient workspace available) */ - if (*m >= mnthr) { - if (wntun) { - -/* Path 1 (M much larger than N, JOBU='N') */ -/* No left singular vectors to be computed */ - itau = 1; iwork = itau + *n; - -/* Compute A=Q*R */ -/* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], & - i__2, &ierr); - -/* Zero out below R */ - + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); if (*n > 1) { i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[a_dim1 + 2], - lda, (ftnlen)1); + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[a_dim1 + 2], lda, (ftnlen)1); } ie = 1; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in A */ -/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__2, &ierr); + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__2, &ierr); ncvt = 0; if (wntvo || wntvas) { - -/* If right singular vectors desired, generate P'. */ -/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], & - work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); ncvt = *n; } iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing right */ -/* singular vectors of A in A if desired */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, &ncvt, &c__0, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, dum, &c__1, dum, &c__1, &work[iwork], - info, (ftnlen)1); - -/* If right singular vectors desired in VT, copy them there */ - + dbdsqr_((char *)"U", n, &ncvt, &c__0, &c__0, &s[1], &work[ie], &a[a_offset], lda, dum, + &c__1, dum, &c__1, &work[iwork], info, (ftnlen)1); if (wntvas) { - dlacpy_((char *)"F", n, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + dlacpy_((char *)"F", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); } - } else if (wntuo && wntvn) { - -/* Path 2 (M much larger than N, JOBU='O', JOBVT='N') */ -/* N left singular vectors to be overwritten on A and */ -/* no right singular vectors to be computed */ - -/* Computing MAX */ i__2 = *n << 2; - if (*lwork >= *n * *n + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + if (*lwork >= *n * *n + max(i__2, bdspac)) { ir = 1; -/* Computing MAX */ i__2 = wrkbl, i__3 = *lda * *n + *n; - if (*lwork >= max(i__2,i__3) + *lda * *n) { - -/* WORK(IU) is LDA by N, WORK(IR) is LDA by N */ - + if (*lwork >= max(i__2, i__3) + *lda * *n) { ldwrku = *lda; ldwrkr = *lda; - } else /* if(complicated condition) */ { -/* Computing MAX */ + } else { i__2 = wrkbl, i__3 = *lda * *n + *n; - if (*lwork >= max(i__2,i__3) + *n * *n) { - -/* WORK(IU) is LDA by N, WORK(IR) is N by N */ - + if (*lwork >= max(i__2, i__3) + *n * *n) { ldwrku = *lda; ldwrkr = *n; } else { - -/* WORK(IU) is LDWRKU by N, WORK(IR) is N by N */ - ldwrku = (*lwork - *n * *n - *n) / *n; ldwrkr = *n; } } itau = ir + ldwrkr * *n; iwork = itau + *n; - -/* Compute A=Q*R */ -/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] - , &i__2, &ierr); - -/* Copy R to WORK(IR) and zero out below it */ - - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr, - (ftnlen)1); + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr, (ftnlen)1); i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + 1], - &ldwrkr, (ftnlen)1); - -/* Generate Q in A */ -/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + 1], &ldwrkr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in WORK(IR) */ -/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__2, &ierr); - -/* Generate left vectors bidiagonalizing R */ -/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ - + dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], & - work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of R in WORK(IR) */ -/* (Workspace: need N*N + BDSPAC) */ - - dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, & - c__1, &work[ir], &ldwrkr, dum, &c__1, &work[iwork] - , info, (ftnlen)1); + dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, &c__1, &work[ir], + &ldwrkr, dum, &c__1, &work[iwork], info, (ftnlen)1); iu = ie + *n; - -/* Multiply Q in A by left singular vectors of R in */ -/* WORK(IR), storing result in WORK(IU) and copying to A */ -/* (Workspace: need N*N + 2*N, prefer N*N + M*N + N) */ - i__2 = *m; i__3 = ldwrku; - for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += - i__3) { -/* Computing MIN */ + for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) { i__4 = *m - i__ + 1; - chunk = min(i__4,ldwrku); - dgemm_((char *)"N", (char *)"N", &chunk, n, n, &c_b79, &a[i__ + - a_dim1], lda, &work[ir], &ldwrkr, &c_b57, & - work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); - dlacpy_((char *)"F", &chunk, n, &work[iu], &ldwrku, &a[i__ + - a_dim1], lda, (ftnlen)1); -/* L10: */ + chunk = min(i__4, ldwrku); + dgemm_((char *)"N", (char *)"N", &chunk, n, n, &c_b79, &a[i__ + a_dim1], lda, &work[ir], + &ldwrkr, &c_b57, &work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", &chunk, n, &work[iu], &ldwrku, &a[i__ + a_dim1], lda, + (ftnlen)1); } - } else { - -/* Insufficient workspace for a fast algorithm */ - ie = 1; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize A */ -/* (Workspace: need 3*N + M, prefer 3*N + (M + N)*NB) */ - i__3 = *lwork - iwork + 1; - dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__3, &ierr); - -/* Generate left vectors bidiagonalizing A */ -/* (Workspace: need 4*N, prefer 3*N + N*NB) */ - + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__3, &ierr); i__3 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, &work[itauq], & - work[iwork], &i__3, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, &work[itauq], &work[iwork], &i__3, + &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of A in A */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, & - c__1, &a[a_offset], lda, dum, &c__1, &work[iwork], - info, (ftnlen)1); - + dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, &c__1, &a[a_offset], + lda, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } else if (wntuo && wntvas) { - -/* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A') */ -/* N left singular vectors to be overwritten on A and */ -/* N right singular vectors to be computed in VT */ - -/* Computing MAX */ i__3 = *n << 2; - if (*lwork >= *n * *n + max(i__3,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + if (*lwork >= *n * *n + max(i__3, bdspac)) { ir = 1; -/* Computing MAX */ i__3 = wrkbl, i__2 = *lda * *n + *n; - if (*lwork >= max(i__3,i__2) + *lda * *n) { - -/* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ - + if (*lwork >= max(i__3, i__2) + *lda * *n) { ldwrku = *lda; ldwrkr = *lda; - } else /* if(complicated condition) */ { -/* Computing MAX */ + } else { i__3 = wrkbl, i__2 = *lda * *n + *n; - if (*lwork >= max(i__3,i__2) + *n * *n) { - -/* WORK(IU) is LDA by N and WORK(IR) is N by N */ - + if (*lwork >= max(i__3, i__2) + *n * *n) { ldwrku = *lda; ldwrkr = *n; } else { - -/* WORK(IU) is LDWRKU by N and WORK(IR) is N by N */ - ldwrku = (*lwork - *n * *n - *n) / *n; ldwrkr = *n; } } itau = ir + ldwrkr * *n; iwork = itau + *n; - -/* Compute A=Q*R */ -/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__3 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] - , &i__3, &ierr); - -/* Copy R to VT, zeroing out below it */ - - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__3, &ierr); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); if (*n > 1) { i__3 = *n - 1; i__2 = *n - 1; - dlaset_((char *)"L", &i__3, &i__2, &c_b57, &c_b57, &vt[ - vt_dim1 + 2], ldvt, (ftnlen)1); + dlaset_((char *)"L", &i__3, &i__2, &c_b57, &c_b57, &vt[vt_dim1 + 2], ldvt, + (ftnlen)1); } - -/* Generate Q in A */ -/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__3 = *lwork - iwork + 1; - dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__3, &ierr); + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__3, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in VT, copying result to WORK(IR) */ -/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ - i__3 = *lwork - iwork + 1; - dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], &i__3, & - ierr); - dlacpy_((char *)"L", n, n, &vt[vt_offset], ldvt, &work[ir], & - ldwrkr, (ftnlen)1); - -/* Generate left vectors bidiagonalizing R in WORK(IR) */ -/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ - + dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__3, &ierr); + dlacpy_((char *)"L", n, n, &vt[vt_offset], ldvt, &work[ir], &ldwrkr, (ftnlen)1); i__3 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], & - work[iwork], &i__3, &ierr, (ftnlen)1); - -/* Generate right vectors bidiagonalizing R in VT */ -/* (Workspace: need N*N + 4*N-1, prefer N*N + 3*N + (N-1)*NB) */ - + dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], &work[iwork], &i__3, + &ierr, (ftnlen)1); i__3 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], - &work[iwork], &i__3, &ierr, (ftnlen)1); + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], &i__3, + &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of R in WORK(IR) and computing right */ -/* singular vectors of R in VT */ -/* (Workspace: need N*N + BDSPAC) */ - - dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &work[ir], &ldwrkr, dum, &c__1, - &work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, &work[ir], + &ldwrkr, dum, &c__1, &work[iwork], info, (ftnlen)1); iu = ie + *n; - -/* Multiply Q in A by left singular vectors of R in */ -/* WORK(IR), storing result in WORK(IU) and copying to A */ -/* (Workspace: need N*N + 2*N, prefer N*N + M*N + N) */ - i__3 = *m; i__2 = ldwrku; - for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += - i__2) { -/* Computing MIN */ + for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += i__2) { i__4 = *m - i__ + 1; - chunk = min(i__4,ldwrku); - dgemm_((char *)"N", (char *)"N", &chunk, n, n, &c_b79, &a[i__ + - a_dim1], lda, &work[ir], &ldwrkr, &c_b57, & - work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); - dlacpy_((char *)"F", &chunk, n, &work[iu], &ldwrku, &a[i__ + - a_dim1], lda, (ftnlen)1); -/* L20: */ + chunk = min(i__4, ldwrku); + dgemm_((char *)"N", (char *)"N", &chunk, n, n, &c_b79, &a[i__ + a_dim1], lda, &work[ir], + &ldwrkr, &c_b57, &work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", &chunk, n, &work[iu], &ldwrku, &a[i__ + a_dim1], lda, + (ftnlen)1); } - } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *n; - -/* Compute A=Q*R */ -/* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] - , &i__2, &ierr); - -/* Copy R to VT, zeroing out below it */ - - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); if (*n > 1) { i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[ - vt_dim1 + 2], ldvt, (ftnlen)1); + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[vt_dim1 + 2], ldvt, + (ftnlen)1); } - -/* Generate Q in A */ -/* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in VT */ -/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], &i__2, & - ierr); - -/* Multiply Q in A by left vectors bidiagonalizing R */ -/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - + dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, & - work[itauq], &a[a_offset], lda, &work[iwork], & - i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); - -/* Generate right vectors bidiagonalizing R in VT */ -/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, &work[itauq], + &a[a_offset], lda, &work[iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], - &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of A in A and computing right */ -/* singular vectors of A in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & - work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &a[a_offset], lda, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } else if (wntus) { - if (wntvn) { - -/* Path 4 (M much larger than N, JOBU='S', JOBVT='N') */ -/* N left singular vectors to be computed in U and */ -/* no right singular vectors to be computed */ - -/* Computing MAX */ i__2 = *n << 2; - if (*lwork >= *n * *n + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + if (*lwork >= *n * *n + max(i__2, bdspac)) { ir = 1; if (*lwork >= wrkbl + *lda * *n) { - -/* WORK(IR) is LDA by N */ - ldwrkr = *lda; } else { - -/* WORK(IR) is N by N */ - ldwrkr = *n; } itau = ir + ldwrkr * *n; iwork = itau + *n; - -/* Compute A=Q*R */ -/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - -/* Copy R to WORK(IR), zeroing out below it */ - - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], & - ldwrkr, (ftnlen)1); + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr, (ftnlen)1); i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + - 1], &ldwrkr, (ftnlen)1); - -/* Generate Q in A */ -/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + 1], &ldwrkr, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & - work[iwork], &i__2, &ierr); + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in WORK(IR) */ -/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Generate left vectors bidiagonalizing R in WORK(IR) */ -/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ - + dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of R in WORK(IR) */ -/* (Workspace: need N*N + BDSPAC) */ - - dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], - dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, & - work[iwork], info, (ftnlen)1); - -/* Multiply Q in A by left singular vectors of R in */ -/* WORK(IR), storing result in U */ -/* (Workspace: need N*N) */ - - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, & - work[ir], &ldwrkr, &c_b57, &u[u_offset], ldu, - (ftnlen)1, (ftnlen)1); - + dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, &c__1, &work[ir], + &ldwrkr, dum, &c__1, &work[iwork], info, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, &work[ir], &ldwrkr, + &c_b57, &u[u_offset], ldu, (ftnlen)1, (ftnlen)1); } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *n; - -/* Compute A=Q*R, copying result to U */ -/* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - -/* Generate Q in U */ -/* (Workspace: need 2*N, prefer N + N*NB) */ - + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); + dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Zero out below R in A */ - if (*n > 1) { i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ - a_dim1 + 2], lda, (ftnlen)1); + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[a_dim1 + 2], lda, + (ftnlen)1); } - -/* Bidiagonalize R in A */ -/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Multiply Q in U by left vectors bidiagonalizing R */ -/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & - work[itauq], &u[u_offset], ldu, &work[iwork], - &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) - ; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, &work[itauq], + &u[u_offset], ldu, &work[iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, + (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of A in U */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], - dum, &c__1, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, &c__1, &u[u_offset], + ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } else if (wntvo) { - -/* Path 5 (M much larger than N, JOBU='S', JOBVT='O') */ -/* N left singular vectors to be computed in U and */ -/* N right singular vectors to be overwritten on A */ - -/* Computing MAX */ i__2 = *n << 2; - if (*lwork >= (*n << 1) * *n + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + if (*lwork >= (*n << 1) * *n + max(i__2, bdspac)) { iu = 1; if (*lwork >= wrkbl + (*lda << 1) * *n) { - -/* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ - ldwrku = *lda; ir = iu + ldwrku * *n; ldwrkr = *lda; } else if (*lwork >= wrkbl + (*lda + *n) * *n) { - -/* WORK(IU) is LDA by N and WORK(IR) is N by N */ - ldwrku = *lda; ir = iu + ldwrku * *n; ldwrkr = *n; } else { - -/* WORK(IU) is N by N and WORK(IR) is N by N */ - ldwrku = *n; ir = iu + ldwrku * *n; ldwrkr = *n; } itau = ir + ldwrkr * *n; iwork = itau + *n; - -/* Compute A=Q*R */ -/* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - -/* Copy R to WORK(IU), zeroing out below it */ - - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], &ldwrku, (ftnlen)1); i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - 1], &ldwrku, (ftnlen)1); - -/* Generate Q in A */ -/* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) */ - + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + 1], &ldwrku, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & - work[iwork], &i__2, &ierr); + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in WORK(IU), copying result to */ -/* WORK(IR) */ -/* (Workspace: need 2*N*N + 4*N, */ -/* prefer 2*N*N+3*N+2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &work[ir], & - ldwrkr, (ftnlen)1); - -/* Generate left bidiagonalizing vectors in WORK(IU) */ -/* (Workspace: need 2*N*N + 4*N, prefer 2*N*N + 3*N + N*NB) */ - + dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &work[ir], &ldwrkr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - -/* Generate right bidiagonalizing vectors in WORK(IR) */ -/* (Workspace: need 2*N*N + 4*N-1, */ -/* prefer 2*N*N+3*N+(N-1)*NB) */ - + dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &work[ir], &ldwrkr, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", n, n, n, &work[ir], &ldwrkr, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of R in WORK(IU) and computing */ -/* right singular vectors of R in WORK(IR) */ -/* (Workspace: need 2*N*N + BDSPAC) */ - - dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &work[ - ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1, - &work[iwork], info, (ftnlen)1); - -/* Multiply Q in A by left singular vectors of R in */ -/* WORK(IU), storing result in U */ -/* (Workspace: need N*N) */ - - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, & - work[iu], &ldwrku, &c_b57, &u[u_offset], ldu, - (ftnlen)1, (ftnlen)1); - -/* Copy right singular vectors of R to A */ -/* (Workspace: need N*N) */ - - dlacpy_((char *)"F", n, n, &work[ir], &ldwrkr, &a[a_offset], - lda, (ftnlen)1); - + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &work[ir], &ldwrkr, + &work[iu], &ldwrku, dum, &c__1, &work[iwork], info, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, &work[iu], &ldwrku, + &c_b57, &u[u_offset], ldu, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", n, n, &work[ir], &ldwrkr, &a[a_offset], lda, (ftnlen)1); } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *n; - -/* Compute A=Q*R, copying result to U */ -/* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - -/* Generate Q in U */ -/* (Workspace: need 2*N, prefer N + N*NB) */ - + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); + dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Zero out below R in A */ - if (*n > 1) { i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ - a_dim1 + 2], lda, (ftnlen)1); + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[a_dim1 + 2], lda, + (ftnlen)1); } - -/* Bidiagonalize R in A */ -/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Multiply Q in U by left vectors bidiagonalizing R */ -/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & - work[itauq], &u[u_offset], ldu, &work[iwork], - &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) - ; - -/* Generate right vectors bidiagonalizing R in A */ -/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, &work[itauq], + &u[u_offset], ldu, &work[iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], - &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of A in U and computing right */ -/* singular vectors of A in A */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, &u[u_offset], ldu, dum, &c__1, - &work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &a[a_offset], lda, + &u[u_offset], ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } else if (wntvas) { - -/* Path 6 (M much larger than N, JOBU='S', JOBVT='S' */ -/* or 'A') */ -/* N left singular vectors to be computed in U and */ -/* N right singular vectors to be computed in VT */ - -/* Computing MAX */ i__2 = *n << 2; - if (*lwork >= *n * *n + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + if (*lwork >= *n * *n + max(i__2, bdspac)) { iu = 1; if (*lwork >= wrkbl + *lda * *n) { - -/* WORK(IU) is LDA by N */ - ldwrku = *lda; } else { - -/* WORK(IU) is N by N */ - ldwrku = *n; } itau = iu + ldwrku * *n; iwork = itau + *n; - -/* Compute A=Q*R */ -/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - -/* Copy R to WORK(IU), zeroing out below it */ - - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], &ldwrku, (ftnlen)1); i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - 1], &ldwrku, (ftnlen)1); - -/* Generate Q in A */ -/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + 1], &ldwrku, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], & - work[iwork], &i__2, &ierr); + dorgqr_(m, n, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in WORK(IU), copying result to VT */ -/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &vt[vt_offset], - ldvt, (ftnlen)1); - -/* Generate left bidiagonalizing vectors in WORK(IU) */ -/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ - + dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &vt[vt_offset], ldvt, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - -/* Generate right bidiagonalizing vectors in VT */ -/* (Workspace: need N*N + 4*N-1, */ -/* prefer N*N+3*N+(N-1)*NB) */ - + dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ - itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) - ; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], + &i__2, &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of R in WORK(IU) and computing */ -/* right singular vectors of R in VT */ -/* (Workspace: need N*N + BDSPAC) */ - - dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &work[iu], &ldwrku, dum, & - c__1, &work[iwork], info, (ftnlen)1); - -/* Multiply Q in A by left singular vectors of R in */ -/* WORK(IU), storing result in U */ -/* (Workspace: need N*N) */ - - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, & - work[iu], &ldwrku, &c_b57, &u[u_offset], ldu, - (ftnlen)1, (ftnlen)1); - + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &work[iu], &ldwrku, dum, &c__1, &work[iwork], info, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &a[a_offset], lda, &work[iu], &ldwrku, + &c_b57, &u[u_offset], ldu, (ftnlen)1, (ftnlen)1); } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *n; - -/* Compute A=Q*R, copying result to U */ -/* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - -/* Generate Q in U */ -/* (Workspace: need 2*N, prefer N + N*NB) */ - + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); - -/* Copy R to VT, zeroing out below it */ - - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + dorgqr_(m, n, n, &u[u_offset], ldu, &work[itau], &work[iwork], &i__2, + &ierr); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); if (*n > 1) { i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[ - vt_dim1 + 2], ldvt, (ftnlen)1); + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[vt_dim1 + 2], ldvt, + (ftnlen)1); } ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in VT */ -/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], - &work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Multiply Q in U by left bidiagonalizing vectors */ -/* in VT */ -/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - + dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, - &work[itauq], &u[u_offset], ldu, &work[iwork], - &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen) - 1); - -/* Generate right bidiagonalizing vectors in VT */ -/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, &work[itauq], + &u[u_offset], ldu, &work[iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ - itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) - ; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], + &i__2, &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of A in U and computing right */ -/* singular vectors of A in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &u[u_offset], ldu, dum, & - c__1, &work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &u[u_offset], ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } - } else if (wntua) { - if (wntvn) { - -/* Path 7 (M much larger than N, JOBU='A', JOBVT='N') */ -/* M left singular vectors to be computed in U and */ -/* no right singular vectors to be computed */ - -/* Computing MAX */ - i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); - if (*lwork >= *n * *n + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2, i__3); + if (*lwork >= *n * *n + max(i__2, bdspac)) { ir = 1; if (*lwork >= wrkbl + *lda * *n) { - -/* WORK(IR) is LDA by N */ - ldwrkr = *lda; } else { - -/* WORK(IR) is N by N */ - ldwrkr = *n; } itau = ir + ldwrkr * *n; iwork = itau + *n; - -/* Compute A=Q*R, copying result to U */ -/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - -/* Copy R to WORK(IR), zeroing out below it */ - - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], & - ldwrkr, (ftnlen)1); + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[ir], &ldwrkr, (ftnlen)1); i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + - 1], &ldwrkr, (ftnlen)1); - -/* Generate Q in U */ -/* (Workspace: need N*N + N + M, prefer N*N + N + M*NB) */ - + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[ir + 1], &ldwrkr, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in WORK(IR) */ -/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Generate left bidiagonalizing vectors in WORK(IR) */ -/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ - + dgebrd_(n, n, &work[ir], &ldwrkr, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", n, n, n, &work[ir], &ldwrkr, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of R in WORK(IR) */ -/* (Workspace: need N*N + BDSPAC) */ - - dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], - dum, &c__1, &work[ir], &ldwrkr, dum, &c__1, & - work[iwork], info, (ftnlen)1); - -/* Multiply Q in U by left singular vectors of R in */ -/* WORK(IR), storing result in A */ -/* (Workspace: need N*N) */ - - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, & - work[ir], &ldwrkr, &c_b57, &a[a_offset], lda, - (ftnlen)1, (ftnlen)1); - -/* Copy left singular vectors of A from A to U */ - - dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - + dbdsqr_((char *)"U", n, &c__0, n, &c__0, &s[1], &work[ie], dum, &c__1, &work[ir], + &ldwrkr, dum, &c__1, &work[iwork], info, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, &work[ir], &ldwrkr, + &c_b57, &a[a_offset], lda, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *n; - -/* Compute A=Q*R, copying result to U */ -/* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - -/* Generate Q in U */ -/* (Workspace: need N + M, prefer N + M*NB) */ - + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Zero out below R in A */ - if (*n > 1) { i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ - a_dim1 + 2], lda, (ftnlen)1); + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[a_dim1 + 2], lda, + (ftnlen)1); } - -/* Bidiagonalize R in A */ -/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Multiply Q in U by left bidiagonalizing vectors */ -/* in A */ -/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & - work[itauq], &u[u_offset], ldu, &work[iwork], - &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) - ; + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, &work[itauq], + &u[u_offset], ldu, &work[iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, + (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of A in U */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], - dum, &c__1, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", n, &c__0, m, &c__0, &s[1], &work[ie], dum, &c__1, &u[u_offset], + ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } else if (wntvo) { - -/* Path 8 (M much larger than N, JOBU='A', JOBVT='O') */ -/* M left singular vectors to be computed in U and */ -/* N right singular vectors to be overwritten on A */ - -/* Computing MAX */ - i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); - if (*lwork >= (*n << 1) * *n + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2, i__3); + if (*lwork >= (*n << 1) * *n + max(i__2, bdspac)) { iu = 1; if (*lwork >= wrkbl + (*lda << 1) * *n) { - -/* WORK(IU) is LDA by N and WORK(IR) is LDA by N */ - ldwrku = *lda; ir = iu + ldwrku * *n; ldwrkr = *lda; } else if (*lwork >= wrkbl + (*lda + *n) * *n) { - -/* WORK(IU) is LDA by N and WORK(IR) is N by N */ - ldwrku = *lda; ir = iu + ldwrku * *n; ldwrkr = *n; } else { - -/* WORK(IU) is N by N and WORK(IR) is N by N */ - ldwrku = *n; ir = iu + ldwrku * *n; ldwrkr = *n; } itau = ir + ldwrkr * *n; iwork = itau + *n; - -/* Compute A=Q*R, copying result to U */ -/* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - -/* Generate Q in U */ -/* (Workspace: need 2*N*N + N + M, prefer 2*N*N + N + M*NB) */ - + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); - -/* Copy R to WORK(IU), zeroing out below it */ - - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &work[iwork], &i__2, + &ierr); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], &ldwrku, (ftnlen)1); i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - 1], &ldwrku, (ftnlen)1); + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + 1], &ldwrku, + (ftnlen)1); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in WORK(IU), copying result to */ -/* WORK(IR) */ -/* (Workspace: need 2*N*N + 4*N, */ -/* prefer 2*N*N+3*N+2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &work[ir], & - ldwrkr, (ftnlen)1); - -/* Generate left bidiagonalizing vectors in WORK(IU) */ -/* (Workspace: need 2*N*N + 4*N, prefer 2*N*N + 3*N + N*NB) */ - + dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &work[ir], &ldwrkr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - -/* Generate right bidiagonalizing vectors in WORK(IR) */ -/* (Workspace: need 2*N*N + 4*N-1, */ -/* prefer 2*N*N+3*N+(N-1)*NB) */ - + dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &work[ir], &ldwrkr, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", n, n, n, &work[ir], &ldwrkr, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of R in WORK(IU) and computing */ -/* right singular vectors of R in WORK(IR) */ -/* (Workspace: need 2*N*N + BDSPAC) */ - - dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &work[ - ir], &ldwrkr, &work[iu], &ldwrku, dum, &c__1, - &work[iwork], info, (ftnlen)1); - -/* Multiply Q in U by left singular vectors of R in */ -/* WORK(IU), storing result in A */ -/* (Workspace: need N*N) */ - - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, & - work[iu], &ldwrku, &c_b57, &a[a_offset], lda, - (ftnlen)1, (ftnlen)1); - -/* Copy left singular vectors of A from A to U */ - - dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - -/* Copy right singular vectors of R from WORK(IR) to A */ - - dlacpy_((char *)"F", n, n, &work[ir], &ldwrkr, &a[a_offset], - lda, (ftnlen)1); - + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &work[ir], &ldwrkr, + &work[iu], &ldwrku, dum, &c__1, &work[iwork], info, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, &work[iu], &ldwrku, + &c_b57, &a[a_offset], lda, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); + dlacpy_((char *)"F", n, n, &work[ir], &ldwrkr, &a[a_offset], lda, (ftnlen)1); } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *n; - -/* Compute A=Q*R, copying result to U */ -/* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - -/* Generate Q in U */ -/* (Workspace: need N + M, prefer N + M*NB) */ - + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Zero out below R in A */ - if (*n > 1) { i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[ - a_dim1 + 2], lda, (ftnlen)1); + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &a[a_dim1 + 2], lda, + (ftnlen)1); } - -/* Bidiagonalize R in A */ -/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Multiply Q in U by left bidiagonalizing vectors */ -/* in A */ -/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - + dgebrd_(n, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, & - work[itauq], &u[u_offset], ldu, &work[iwork], - &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1) - ; - -/* Generate right bidiagonalizing vectors in A */ -/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &a[a_offset], lda, &work[itauq], + &u[u_offset], ldu, &work[iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], - &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of A in U and computing right */ -/* singular vectors of A in A */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, &u[u_offset], ldu, dum, &c__1, - &work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &a[a_offset], lda, + &u[u_offset], ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } else if (wntvas) { - -/* Path 9 (M much larger than N, JOBU='A', JOBVT='S' */ -/* or 'A') */ -/* M left singular vectors to be computed in U and */ -/* N right singular vectors to be computed in VT */ - -/* Computing MAX */ - i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2,i__3); - if (*lwork >= *n * *n + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + i__2 = *n + *m, i__3 = *n << 2, i__2 = max(i__2, i__3); + if (*lwork >= *n * *n + max(i__2, bdspac)) { iu = 1; if (*lwork >= wrkbl + *lda * *n) { - -/* WORK(IU) is LDA by N */ - ldwrku = *lda; } else { - -/* WORK(IU) is N by N */ - ldwrku = *n; } itau = iu + ldwrku * *n; iwork = itau + *n; - -/* Compute A=Q*R, copying result to U */ -/* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - -/* Generate Q in U */ -/* (Workspace: need N*N + N + M, prefer N*N + N + M*NB) */ - + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); - -/* Copy R to WORK(IU), zeroing out below it */ - - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &work[iwork], &i__2, + &ierr); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &work[iu], &ldwrku, (ftnlen)1); i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - 1], &ldwrku, (ftnlen)1); + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &work[iu + 1], &ldwrku, + (ftnlen)1); ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in WORK(IU), copying result to VT */ -/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &vt[vt_offset], - ldvt, (ftnlen)1); - -/* Generate left bidiagonalizing vectors in WORK(IU) */ -/* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) */ - + dgebrd_(n, n, &work[iu], &ldwrku, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", n, n, &work[iu], &ldwrku, &vt[vt_offset], ldvt, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - -/* Generate right bidiagonalizing vectors in VT */ -/* (Workspace: need N*N + 4*N-1, */ -/* prefer N*N+3*N+(N-1)*NB) */ - + dorgbr_((char *)"Q", n, n, n, &work[iu], &ldwrku, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ - itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) - ; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], + &i__2, &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of R in WORK(IU) and computing */ -/* right singular vectors of R in VT */ -/* (Workspace: need N*N + BDSPAC) */ - - dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &work[iu], &ldwrku, dum, & - c__1, &work[iwork], info, (ftnlen)1); - -/* Multiply Q in U by left singular vectors of R in */ -/* WORK(IU), storing result in A */ -/* (Workspace: need N*N) */ - - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, & - work[iu], &ldwrku, &c_b57, &a[a_offset], lda, - (ftnlen)1, (ftnlen)1); - -/* Copy left singular vectors of A from A to U */ - - dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - + dbdsqr_((char *)"U", n, n, n, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &work[iu], &ldwrku, dum, &c__1, &work[iwork], info, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b79, &u[u_offset], ldu, &work[iu], &ldwrku, + &c_b57, &a[a_offset], lda, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *n; - -/* Compute A=Q*R, copying result to U */ -/* (Workspace: need 2*N, prefer N + N*NB) */ - i__2 = *lwork - iwork + 1; - dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); - -/* Generate Q in U */ -/* (Workspace: need N + M, prefer N + M*NB) */ - + dgeqrf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], & - work[iwork], &i__2, &ierr); - -/* Copy R from A to VT, zeroing out below it */ - - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); + dorgqr_(m, m, n, &u[u_offset], ldu, &work[itau], &work[iwork], &i__2, + &ierr); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); if (*n > 1) { i__2 = *n - 1; i__3 = *n - 1; - dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[ - vt_dim1 + 2], ldvt, (ftnlen)1); + dlaset_((char *)"L", &i__2, &i__3, &c_b57, &c_b57, &vt[vt_dim1 + 2], ldvt, + (ftnlen)1); } ie = itau; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize R in VT */ -/* (Workspace: need 4*N, prefer 3*N + 2*N*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], - &work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Multiply Q in U by left bidiagonalizing vectors */ -/* in VT */ -/* (Workspace: need 3*N + M, prefer 3*N + M*NB) */ - + dgebrd_(n, n, &vt[vt_offset], ldvt, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, - &work[itauq], &u[u_offset], ldu, &work[iwork], - &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen) - 1); - -/* Generate right bidiagonalizing vectors in VT */ -/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - + dormbr_((char *)"Q", (char *)"R", (char *)"N", m, n, n, &vt[vt_offset], ldvt, &work[itauq], + &u[u_offset], ldu, &work[iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[ - itaup], &work[iwork], &i__2, &ierr, (ftnlen)1) - ; + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], + &i__2, &ierr, (ftnlen)1); iwork = ie + *n; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of A in U and computing right */ -/* singular vectors of A in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &u[u_offset], ldu, dum, & - c__1, &work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", n, n, m, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &u[u_offset], ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } - } - } else { - -/* M .LT. MNTHR */ - -/* Path 10 (M at least N, but not much larger) */ -/* Reduce to bidiagonal form without QR decomposition */ - ie = 1; itauq = ie + *n; itaup = itauq + *n; iwork = itaup + *n; - -/* Bidiagonalize A */ -/* (Workspace: need 3*N + M, prefer 3*N + (M + N)*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & - work[itaup], &work[iwork], &i__2, &ierr); + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__2, &ierr); if (wntuas) { - -/* If left singular vectors desired in U, copy result to U */ -/* and generate left bidiagonalizing vectors in U */ -/* (Workspace: need 3*N + NCU, prefer 3*N + NCU*NB) */ - - dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, ( - ftnlen)1); + dlacpy_((char *)"L", m, n, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); if (wntus) { ncu = *n; } @@ -2446,40 +1124,24 @@ f"> */ ncu = *m; } i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, &ncu, n, &u[u_offset], ldu, &work[itauq], & - work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, &ncu, n, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); } if (wntvas) { - -/* If right singular vectors desired in VT, copy result to */ -/* VT and generate right bidiagonalizing vectors in VT */ -/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - - dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt, ( - ftnlen)1); + dlacpy_((char *)"U", n, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], & - work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", n, n, n, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); } if (wntuo) { - -/* If left singular vectors desired in A, generate left */ -/* bidiagonalizing vectors in A */ -/* (Workspace: need 4*N, prefer 3*N + N*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, &work[itauq], &work[ - iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, n, n, &a[a_offset], lda, &work[itauq], &work[iwork], &i__2, &ierr, + (ftnlen)1); } if (wntvo) { - -/* If right singular vectors desired in A, generate right */ -/* bidiagonalizing vectors in A */ -/* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[ - iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", n, n, n, &a[a_offset], lda, &work[itaup], &work[iwork], &i__2, &ierr, + (ftnlen)1); } iwork = ie + *n; if (wntuas || wntuo) { @@ -2494,146 +1156,65 @@ f"> */ if (wntvn) { ncvt = 0; } - if (! wntuo && ! wntvo) { - -/* Perform bidiagonal QR iteration, if desired, computing */ -/* left singular vectors in U and computing right singular */ -/* vectors in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); - } else if (! wntuo && wntvo) { - -/* Perform bidiagonal QR iteration, if desired, computing */ -/* left singular vectors in U and computing right singular */ -/* vectors in A */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[ - iwork], info, (ftnlen)1); + if (!wntuo && !wntvo) { + dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &u[u_offset], ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); + } else if (!wntuo && wntvo) { + dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[a_offset], lda, + &u[u_offset], ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); } else { - -/* Perform bidiagonal QR iteration, if desired, computing */ -/* left singular vectors in A and computing right singular */ -/* vectors in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", n, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &a[a_offset], lda, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } - } else { - -/* A has more columns than rows. If A has sufficiently more */ -/* columns than rows, first reduce using the LQ decomposition (if */ -/* sufficient workspace available) */ - if (*n >= mnthr) { - if (wntvn) { - -/* Path 1t(N much larger than M, JOBVT='N') */ -/* No right singular vectors to be computed */ - itau = 1; iwork = itau + *m; - -/* Compute A=L*Q */ -/* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], & - i__2, &ierr); - -/* Zero out above L */ - + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 << 1) + - 1], lda, (ftnlen)1); + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 << 1) + 1], lda, (ftnlen)1); ie = 1; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in A */ -/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__2, &ierr); + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__2, &ierr); if (wntuo || wntuas) { - -/* If left singular vectors desired, generate Q */ -/* (Workspace: need 4*M, prefer 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], & - work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); } iwork = ie + *m; nru = 0; if (wntuo || wntuas) { nru = *m; } - -/* Perform bidiagonal QR iteration, computing left singular */ -/* vectors of A in A if desired */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", m, &c__0, &nru, &c__0, &s[1], &work[ie], dum, & - c__1, &a[a_offset], lda, dum, &c__1, &work[iwork], - info, (ftnlen)1); - -/* If left singular vectors desired in U, copy them there */ - + dbdsqr_((char *)"U", m, &c__0, &nru, &c__0, &s[1], &work[ie], dum, &c__1, &a[a_offset], lda, + dum, &c__1, &work[iwork], info, (ftnlen)1); if (wntuas) { - dlacpy_((char *)"F", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( - ftnlen)1); + dlacpy_((char *)"F", m, m, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); } - } else if (wntvo && wntun) { - -/* Path 2t(N much larger than M, JOBU='N', JOBVT='O') */ -/* M right singular vectors to be overwritten on A and */ -/* no left singular vectors to be computed */ - -/* Computing MAX */ i__2 = *m << 2; - if (*lwork >= *m * *m + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + if (*lwork >= *m * *m + max(i__2, bdspac)) { ir = 1; -/* Computing MAX */ i__2 = wrkbl, i__3 = *lda * *n + *m; - if (*lwork >= max(i__2,i__3) + *lda * *m) { - -/* WORK(IU) is LDA by N and WORK(IR) is LDA by M */ - + if (*lwork >= max(i__2, i__3) + *lda * *m) { ldwrku = *lda; chunk = *n; ldwrkr = *lda; - } else /* if(complicated condition) */ { -/* Computing MAX */ + } else { i__2 = wrkbl, i__3 = *lda * *n + *m; - if (*lwork >= max(i__2,i__3) + *m * *m) { - -/* WORK(IU) is LDA by N and WORK(IR) is M by M */ - + if (*lwork >= max(i__2, i__3) + *m * *m) { ldwrku = *lda; chunk = *n; ldwrkr = *m; } else { - -/* WORK(IU) is M by CHUNK and WORK(IR) is M by M */ - ldwrku = *m; chunk = (*lwork - *m * *m - *m) / *m; ldwrkr = *m; @@ -2641,147 +1222,71 @@ f"> */ } itau = ir + ldwrkr * *m; iwork = itau + *m; - -/* Compute A=L*Q */ -/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] - , &i__2, &ierr); - -/* Copy L to WORK(IR) and zero out above it */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], &ldwrkr, - (ftnlen)1); + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], &ldwrkr, (ftnlen)1); i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + - ldwrkr], &ldwrkr, (ftnlen)1); - -/* Generate Q in A */ -/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + ldwrkr], &ldwrkr, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in WORK(IR) */ -/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__2, &ierr); - -/* Generate right vectors bidiagonalizing L */ -/* (Workspace: need M*M + 4*M-1, prefer M*M + 3*M + (M-1)*NB) */ - + dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup], & - work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing right */ -/* singular vectors of L in WORK(IR) */ -/* (Workspace: need M*M + BDSPAC) */ - - dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], &work[ - ir], &ldwrkr, dum, &c__1, dum, &c__1, &work[iwork] - , info, (ftnlen)1); + dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], &work[ir], &ldwrkr, dum, + &c__1, dum, &c__1, &work[iwork], info, (ftnlen)1); iu = ie + *m; - -/* Multiply right singular vectors of L in WORK(IR) by Q */ -/* in A, storing result in WORK(IU) and copying to A */ -/* (Workspace: need M*M + 2*M, prefer M*M + M*N + M) */ - i__2 = *n; i__3 = chunk; - for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += - i__3) { -/* Computing MIN */ + for (i__ = 1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) { i__4 = *n - i__ + 1; - blk = min(i__4,chunk); - dgemm_((char *)"N", (char *)"N", m, &blk, m, &c_b79, &work[ir], & - ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b57, & - work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); - dlacpy_((char *)"F", m, &blk, &work[iu], &ldwrku, &a[i__ * - a_dim1 + 1], lda, (ftnlen)1); -/* L30: */ + blk = min(i__4, chunk); + dgemm_((char *)"N", (char *)"N", m, &blk, m, &c_b79, &work[ir], &ldwrkr, + &a[i__ * a_dim1 + 1], lda, &c_b57, &work[iu], &ldwrku, (ftnlen)1, + (ftnlen)1); + dlacpy_((char *)"F", m, &blk, &work[iu], &ldwrku, &a[i__ * a_dim1 + 1], lda, + (ftnlen)1); } - } else { - -/* Insufficient workspace for a fast algorithm */ - ie = 1; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize A */ -/* (Workspace: need 3*M + N, prefer 3*M + (M + N)*NB) */ - i__3 = *lwork - iwork + 1; - dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__3, &ierr); - -/* Generate right vectors bidiagonalizing A */ -/* (Workspace: need 4*M, prefer 3*M + M*NB) */ - + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__3, &ierr); i__3 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], & - work[iwork], &i__3, &ierr, (ftnlen)1); + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], &work[iwork], &i__3, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing right */ -/* singular vectors of A in A */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"L", m, n, &c__0, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, dum, &c__1, dum, &c__1, &work[ - iwork], info, (ftnlen)1); - + dbdsqr_((char *)"L", m, n, &c__0, &c__0, &s[1], &work[ie], &a[a_offset], lda, dum, + &c__1, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } else if (wntvo && wntuas) { - -/* Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O') */ -/* M right singular vectors to be overwritten on A and */ -/* M left singular vectors to be computed in U */ - -/* Computing MAX */ i__3 = *m << 2; - if (*lwork >= *m * *m + max(i__3,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + if (*lwork >= *m * *m + max(i__3, bdspac)) { ir = 1; -/* Computing MAX */ i__3 = wrkbl, i__2 = *lda * *n + *m; - if (*lwork >= max(i__3,i__2) + *lda * *m) { - -/* WORK(IU) is LDA by N and WORK(IR) is LDA by M */ - + if (*lwork >= max(i__3, i__2) + *lda * *m) { ldwrku = *lda; chunk = *n; ldwrkr = *lda; - } else /* if(complicated condition) */ { -/* Computing MAX */ + } else { i__3 = wrkbl, i__2 = *lda * *n + *m; - if (*lwork >= max(i__3,i__2) + *m * *m) { - -/* WORK(IU) is LDA by N and WORK(IR) is M by M */ - + if (*lwork >= max(i__3, i__2) + *m * *m) { ldwrku = *lda; chunk = *n; ldwrkr = *m; } else { - -/* WORK(IU) is M by CHUNK and WORK(IR) is M by M */ - ldwrku = *m; chunk = (*lwork - *m * *m - *m) / *m; ldwrkr = *m; @@ -2789,1239 +1294,532 @@ f"> */ } itau = ir + ldwrkr * *m; iwork = itau + *m; - -/* Compute A=L*Q */ -/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__3 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] - , &i__3, &ierr); - -/* Copy L to U, zeroing about above it */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( - ftnlen)1); + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__3, &ierr); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__3 = *m - 1; i__2 = *m - 1; - dlaset_((char *)"U", &i__3, &i__2, &c_b57, &c_b57, &u[(u_dim1 << - 1) + 1], ldu, (ftnlen)1); - -/* Generate Q in A */ -/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - + dlaset_((char *)"U", &i__3, &i__2, &c_b57, &c_b57, &u[(u_dim1 << 1) + 1], ldu, + (ftnlen)1); i__3 = *lwork - iwork + 1; - dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__3, &ierr); + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[iwork], &i__3, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in U, copying result to WORK(IR) */ -/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ - i__3 = *lwork - iwork + 1; - dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__3, &ierr); - dlacpy_((char *)"U", m, m, &u[u_offset], ldu, &work[ir], &ldwrkr, - (ftnlen)1); - -/* Generate right vectors bidiagonalizing L in WORK(IR) */ -/* (Workspace: need M*M + 4*M-1, prefer M*M + 3*M + (M-1)*NB) */ - + dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__3, &ierr); + dlacpy_((char *)"U", m, m, &u[u_offset], ldu, &work[ir], &ldwrkr, (ftnlen)1); i__3 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup], & - work[iwork], &i__3, &ierr, (ftnlen)1); - -/* Generate left vectors bidiagonalizing L in U */ -/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) */ - + dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup], &work[iwork], &i__3, + &ierr, (ftnlen)1); i__3 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], & - work[iwork], &i__3, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__3, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of L in U, and computing right */ -/* singular vectors of L in WORK(IR) */ -/* (Workspace: need M*M + BDSPAC) */ - - dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ir], - &ldwrkr, &u[u_offset], ldu, dum, &c__1, &work[ - iwork], info, (ftnlen)1); + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ir], &ldwrkr, &u[u_offset], + ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); iu = ie + *m; - -/* Multiply right singular vectors of L in WORK(IR) by Q */ -/* in A, storing result in WORK(IU) and copying to A */ -/* (Workspace: need M*M + 2*M, prefer M*M + M*N + M)) */ - i__3 = *n; i__2 = chunk; - for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += - i__2) { -/* Computing MIN */ + for (i__ = 1; i__2 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += i__2) { i__4 = *n - i__ + 1; - blk = min(i__4,chunk); - dgemm_((char *)"N", (char *)"N", m, &blk, m, &c_b79, &work[ir], & - ldwrkr, &a[i__ * a_dim1 + 1], lda, &c_b57, & - work[iu], &ldwrku, (ftnlen)1, (ftnlen)1); - dlacpy_((char *)"F", m, &blk, &work[iu], &ldwrku, &a[i__ * - a_dim1 + 1], lda, (ftnlen)1); -/* L40: */ + blk = min(i__4, chunk); + dgemm_((char *)"N", (char *)"N", m, &blk, m, &c_b79, &work[ir], &ldwrkr, + &a[i__ * a_dim1 + 1], lda, &c_b57, &work[iu], &ldwrku, (ftnlen)1, + (ftnlen)1); + dlacpy_((char *)"F", m, &blk, &work[iu], &ldwrku, &a[i__ * a_dim1 + 1], lda, + (ftnlen)1); } - } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *m; - -/* Compute A=L*Q */ -/* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork] - , &i__2, &ierr); - -/* Copy L to U, zeroing out above it */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( - ftnlen)1); + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 << - 1) + 1], ldu, (ftnlen)1); - -/* Generate Q in A */ -/* (Workspace: need 2*M, prefer M + M*NB) */ - + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 << 1) + 1], ldu, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in U */ -/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[ - itauq], &work[itaup], &work[iwork], &i__2, &ierr); - -/* Multiply right vectors bidiagonalizing L by Q in A */ -/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - + dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, &work[ - itaup], &a[a_offset], lda, &work[iwork], &i__2, & - ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); - -/* Generate left vectors bidiagonalizing L in U */ -/* (Workspace: need 4*M, prefer 3*M + M*NB) */ - + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, &work[itaup], &a[a_offset], + lda, &work[iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], & - work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of A in U and computing right */ -/* singular vectors of A in A */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &a[a_offset], lda, &u[u_offset], + ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } else if (wntvs) { - if (wntun) { - -/* Path 4t(N much larger than M, JOBU='N', JOBVT='S') */ -/* M right singular vectors to be computed in VT and */ -/* no left singular vectors to be computed */ - -/* Computing MAX */ i__2 = *m << 2; - if (*lwork >= *m * *m + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + if (*lwork >= *m * *m + max(i__2, bdspac)) { ir = 1; if (*lwork >= wrkbl + *lda * *m) { - -/* WORK(IR) is LDA by M */ - ldwrkr = *lda; } else { - -/* WORK(IR) is M by M */ - ldwrkr = *m; } itau = ir + ldwrkr * *m; iwork = itau + *m; - -/* Compute A=L*Q */ -/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - -/* Copy L to WORK(IR), zeroing out above it */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], & - ldwrkr, (ftnlen)1); + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], &ldwrkr, (ftnlen)1); i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + - ldwrkr], &ldwrkr, (ftnlen)1); - -/* Generate Q in A */ -/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + ldwrkr], &ldwrkr, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & - work[iwork], &i__2, &ierr); + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in WORK(IR) */ -/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Generate right vectors bidiagonalizing L in */ -/* WORK(IR) */ -/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + (M-1)*NB) */ - + dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing right */ -/* singular vectors of L in WORK(IR) */ -/* (Workspace: need M*M + BDSPAC) */ - - dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], & - work[ir], &ldwrkr, dum, &c__1, dum, &c__1, & - work[iwork], info, (ftnlen)1); - -/* Multiply right singular vectors of L in WORK(IR) by */ -/* Q in A, storing result in VT */ -/* (Workspace: need M*M) */ - - dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[ir], &ldwrkr, - &a[a_offset], lda, &c_b57, &vt[vt_offset], - ldvt, (ftnlen)1, (ftnlen)1); - + dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], &work[ir], &ldwrkr, dum, + &c__1, dum, &c__1, &work[iwork], info, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[ir], &ldwrkr, &a[a_offset], lda, + &c_b57, &vt[vt_offset], ldvt, (ftnlen)1, (ftnlen)1); } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *m; - -/* Compute A=L*Q */ -/* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - -/* Copy result to VT */ - - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - -/* Generate Q in VT */ -/* (Workspace: need 2*M, prefer M + M*NB) */ - + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); + dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Zero out above L in A */ - i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 - << 1) + 1], lda, (ftnlen)1); - -/* Bidiagonalize L in A */ -/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 << 1) + 1], lda, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Multiply right vectors bidiagonalizing L by Q in VT */ -/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & - work[itaup], &vt[vt_offset], ldvt, &work[ - iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, &work[itaup], + &vt[vt_offset], ldvt, &work[iwork], &i__2, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing right */ -/* singular vectors of A in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", m, n, &c__0, &c__0, &s[1], &work[ie], & - vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, & - work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", m, n, &c__0, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + dum, &c__1, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } else if (wntuo) { - -/* Path 5t(N much larger than M, JOBU='O', JOBVT='S') */ -/* M right singular vectors to be computed in VT and */ -/* M left singular vectors to be overwritten on A */ - -/* Computing MAX */ i__2 = *m << 2; - if (*lwork >= (*m << 1) * *m + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + if (*lwork >= (*m << 1) * *m + max(i__2, bdspac)) { iu = 1; if (*lwork >= wrkbl + (*lda << 1) * *m) { - -/* WORK(IU) is LDA by M and WORK(IR) is LDA by M */ - ldwrku = *lda; ir = iu + ldwrku * *m; ldwrkr = *lda; } else if (*lwork >= wrkbl + (*lda + *m) * *m) { - -/* WORK(IU) is LDA by M and WORK(IR) is M by M */ - ldwrku = *lda; ir = iu + ldwrku * *m; ldwrkr = *m; } else { - -/* WORK(IU) is M by M and WORK(IR) is M by M */ - ldwrku = *m; ir = iu + ldwrku * *m; ldwrkr = *m; } itau = ir + ldwrkr * *m; iwork = itau + *m; - -/* Compute A=L*Q */ -/* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - -/* Copy L to WORK(IU), zeroing out below it */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], &ldwrku, (ftnlen)1); i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - ldwrku], &ldwrku, (ftnlen)1); - -/* Generate Q in A */ -/* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) */ - + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + ldwrku], &ldwrku, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & - work[iwork], &i__2, &ierr); + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in WORK(IU), copying result to */ -/* WORK(IR) */ -/* (Workspace: need 2*M*M + 4*M, */ -/* prefer 2*M*M+3*M+2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &work[ir], & - ldwrkr, (ftnlen)1); - -/* Generate right bidiagonalizing vectors in WORK(IU) */ -/* (Workspace: need 2*M*M + 4*M-1, */ -/* prefer 2*M*M+3*M+(M-1)*NB) */ - + dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &work[ir], &ldwrkr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - -/* Generate left bidiagonalizing vectors in WORK(IR) */ -/* (Workspace: need 2*M*M + 4*M, prefer 2*M*M + 3*M + M*NB) */ - + dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &work[ir], &ldwrkr, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, m, &work[ir], &ldwrkr, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of L in WORK(IR) and computing */ -/* right singular vectors of L in WORK(IU) */ -/* (Workspace: need 2*M*M + BDSPAC) */ - - dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ - iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1, - &work[iwork], info, (ftnlen)1); - -/* Multiply right singular vectors of L in WORK(IU) by */ -/* Q in A, storing result in VT */ -/* (Workspace: need M*M) */ - - dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, - &a[a_offset], lda, &c_b57, &vt[vt_offset], - ldvt, (ftnlen)1, (ftnlen)1); - -/* Copy left singular vectors of L to A */ -/* (Workspace: need M*M) */ - - dlacpy_((char *)"F", m, m, &work[ir], &ldwrkr, &a[a_offset], - lda, (ftnlen)1); - + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[iu], &ldwrku, + &work[ir], &ldwrkr, dum, &c__1, &work[iwork], info, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, &a[a_offset], lda, + &c_b57, &vt[vt_offset], ldvt, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, m, &work[ir], &ldwrkr, &a[a_offset], lda, (ftnlen)1); } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *m; - -/* Compute A=L*Q, copying result to VT */ -/* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - -/* Generate Q in VT */ -/* (Workspace: need 2*M, prefer M + M*NB) */ - + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); + dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Zero out above L in A */ - i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 - << 1) + 1], lda, (ftnlen)1); - -/* Bidiagonalize L in A */ -/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 << 1) + 1], lda, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Multiply right vectors bidiagonalizing L by Q in VT */ -/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & - work[itaup], &vt[vt_offset], ldvt, &work[ - iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); - -/* Generate left bidiagonalizing vectors of L in A */ -/* (Workspace: need 4*M, prefer 3*M + M*NB) */ - + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, &work[itaup], + &vt[vt_offset], ldvt, &work[iwork], &i__2, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], - &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, compute left */ -/* singular vectors of A in A and compute right */ -/* singular vectors of A in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &a[a_offset], lda, dum, & - c__1, &work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &a[a_offset], lda, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } else if (wntuas) { - -/* Path 6t(N much larger than M, JOBU='S' or 'A', */ -/* JOBVT='S') */ -/* M right singular vectors to be computed in VT and */ -/* M left singular vectors to be computed in U */ - -/* Computing MAX */ i__2 = *m << 2; - if (*lwork >= *m * *m + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + if (*lwork >= *m * *m + max(i__2, bdspac)) { iu = 1; if (*lwork >= wrkbl + *lda * *m) { - -/* WORK(IU) is LDA by N */ - ldwrku = *lda; } else { - -/* WORK(IU) is LDA by M */ - ldwrku = *m; } itau = iu + ldwrku * *m; iwork = itau + *m; - -/* Compute A=L*Q */ -/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - -/* Copy L to WORK(IU), zeroing out above it */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], &ldwrku, (ftnlen)1); i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - ldwrku], &ldwrku, (ftnlen)1); - -/* Generate Q in A */ -/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + ldwrku], &ldwrku, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &a[a_offset], lda, &work[itau], & - work[iwork], &i__2, &ierr); + dorglq_(m, n, m, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in WORK(IU), copying result to U */ -/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &u[u_offset], - ldu, (ftnlen)1); - -/* Generate right bidiagonalizing vectors in WORK(IU) */ -/* (Workspace: need M*M + 4*M-1, */ -/* prefer M*M+3*M+(M-1)*NB) */ - + dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &u[u_offset], ldu, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - -/* Generate left bidiagonalizing vectors in U */ -/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) */ - + dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], - &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of L in U and computing right */ -/* singular vectors of L in WORK(IU) */ -/* (Workspace: need M*M + BDSPAC) */ - - dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ - iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); - -/* Multiply right singular vectors of L in WORK(IU) by */ -/* Q in A, storing result in VT */ -/* (Workspace: need M*M) */ - - dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, - &a[a_offset], lda, &c_b57, &vt[vt_offset], - ldvt, (ftnlen)1, (ftnlen)1); - + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[iu], &ldwrku, + &u[u_offset], ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, &a[a_offset], lda, + &c_b57, &vt[vt_offset], ldvt, (ftnlen)1, (ftnlen)1); } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *m; - -/* Compute A=L*Q, copying result to VT */ -/* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - -/* Generate Q in VT */ -/* (Workspace: need 2*M, prefer M + M*NB) */ - + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); - -/* Copy L to U, zeroing out above it */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + dorglq_(m, n, m, &vt[vt_offset], ldvt, &work[itau], &work[iwork], &i__2, + &ierr); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 - << 1) + 1], ldu, (ftnlen)1); + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 << 1) + 1], ldu, + (ftnlen)1); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in U */ -/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Multiply right bidiagonalizing vectors in U by Q */ -/* in VT */ -/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - + dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, & - work[itaup], &vt[vt_offset], ldvt, &work[ - iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); - -/* Generate left bidiagonalizing vectors in U */ -/* (Workspace: need 4*M, prefer 3*M + M*NB) */ - + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, &work[itaup], + &vt[vt_offset], ldvt, &work[iwork], &i__2, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], - &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of A in U and computing right */ -/* singular vectors of A in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &u[u_offset], ldu, dum, & - c__1, &work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &u[u_offset], ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } - } else if (wntva) { - if (wntun) { - -/* Path 7t(N much larger than M, JOBU='N', JOBVT='A') */ -/* N right singular vectors to be computed in VT and */ -/* no left singular vectors to be computed */ - -/* Computing MAX */ - i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); - if (*lwork >= *m * *m + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2, i__3); + if (*lwork >= *m * *m + max(i__2, bdspac)) { ir = 1; if (*lwork >= wrkbl + *lda * *m) { - -/* WORK(IR) is LDA by M */ - ldwrkr = *lda; } else { - -/* WORK(IR) is M by M */ - ldwrkr = *m; } itau = ir + ldwrkr * *m; iwork = itau + *m; - -/* Compute A=L*Q, copying result to VT */ -/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - -/* Copy L to WORK(IR), zeroing out above it */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], & - ldwrkr, (ftnlen)1); + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[ir], &ldwrkr, (ftnlen)1); i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + - ldwrkr], &ldwrkr, (ftnlen)1); - -/* Generate Q in VT */ -/* (Workspace: need M*M + M + N, prefer M*M + M + N*NB) */ - + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[ir + ldwrkr], &ldwrkr, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in WORK(IR) */ -/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Generate right bidiagonalizing vectors in WORK(IR) */ -/* (Workspace: need M*M + 4*M-1, */ -/* prefer M*M+3*M+(M-1)*NB) */ - + dgebrd_(m, m, &work[ir], &ldwrkr, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", m, m, m, &work[ir], &ldwrkr, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing right */ -/* singular vectors of L in WORK(IR) */ -/* (Workspace: need M*M + BDSPAC) */ - - dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], & - work[ir], &ldwrkr, dum, &c__1, dum, &c__1, & - work[iwork], info, (ftnlen)1); - -/* Multiply right singular vectors of L in WORK(IR) by */ -/* Q in VT, storing result in A */ -/* (Workspace: need M*M) */ - - dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[ir], &ldwrkr, - &vt[vt_offset], ldvt, &c_b57, &a[a_offset], - lda, (ftnlen)1, (ftnlen)1); - -/* Copy right singular vectors of A from A to VT */ - - dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - + dbdsqr_((char *)"U", m, m, &c__0, &c__0, &s[1], &work[ie], &work[ir], &ldwrkr, dum, + &c__1, dum, &c__1, &work[iwork], info, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[ir], &ldwrkr, &vt[vt_offset], ldvt, + &c_b57, &a[a_offset], lda, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *m; - -/* Compute A=L*Q, copying result to VT */ -/* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - -/* Generate Q in VT */ -/* (Workspace: need M + N, prefer M + N*NB) */ - + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Zero out above L in A */ - i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 - << 1) + 1], lda, (ftnlen)1); - -/* Bidiagonalize L in A */ -/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 << 1) + 1], lda, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Multiply right bidiagonalizing vectors in A by Q */ -/* in VT */ -/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & - work[itaup], &vt[vt_offset], ldvt, &work[ - iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, &work[itaup], + &vt[vt_offset], ldvt, &work[iwork], &i__2, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing right */ -/* singular vectors of A in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", m, n, &c__0, &c__0, &s[1], &work[ie], & - vt[vt_offset], ldvt, dum, &c__1, dum, &c__1, & - work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", m, n, &c__0, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + dum, &c__1, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } else if (wntuo) { - -/* Path 8t(N much larger than M, JOBU='O', JOBVT='A') */ -/* N right singular vectors to be computed in VT and */ -/* M left singular vectors to be overwritten on A */ - -/* Computing MAX */ - i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); - if (*lwork >= (*m << 1) * *m + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2, i__3); + if (*lwork >= (*m << 1) * *m + max(i__2, bdspac)) { iu = 1; if (*lwork >= wrkbl + (*lda << 1) * *m) { - -/* WORK(IU) is LDA by M and WORK(IR) is LDA by M */ - ldwrku = *lda; ir = iu + ldwrku * *m; ldwrkr = *lda; } else if (*lwork >= wrkbl + (*lda + *m) * *m) { - -/* WORK(IU) is LDA by M and WORK(IR) is M by M */ - ldwrku = *lda; ir = iu + ldwrku * *m; ldwrkr = *m; } else { - -/* WORK(IU) is M by M and WORK(IR) is M by M */ - ldwrku = *m; ir = iu + ldwrku * *m; ldwrkr = *m; } itau = ir + ldwrkr * *m; iwork = itau + *m; - -/* Compute A=L*Q, copying result to VT */ -/* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - -/* Generate Q in VT */ -/* (Workspace: need 2*M*M + M + N, prefer 2*M*M + M + N*NB) */ - + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); - -/* Copy L to WORK(IU), zeroing out above it */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &work[iwork], &i__2, + &ierr); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], &ldwrku, (ftnlen)1); i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - ldwrku], &ldwrku, (ftnlen)1); + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + ldwrku], &ldwrku, + (ftnlen)1); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in WORK(IU), copying result to */ -/* WORK(IR) */ -/* (Workspace: need 2*M*M + 4*M, */ -/* prefer 2*M*M+3*M+2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &work[ir], & - ldwrkr, (ftnlen)1); - -/* Generate right bidiagonalizing vectors in WORK(IU) */ -/* (Workspace: need 2*M*M + 4*M-1, */ -/* prefer 2*M*M+3*M+(M-1)*NB) */ - + dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &work[ir], &ldwrkr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - -/* Generate left bidiagonalizing vectors in WORK(IR) */ -/* (Workspace: need 2*M*M + 4*M, prefer 2*M*M + 3*M + M*NB) */ - + dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &work[ir], &ldwrkr, &work[itauq] - , &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, m, &work[ir], &ldwrkr, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of L in WORK(IR) and computing */ -/* right singular vectors of L in WORK(IU) */ -/* (Workspace: need 2*M*M + BDSPAC) */ - - dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ - iu], &ldwrku, &work[ir], &ldwrkr, dum, &c__1, - &work[iwork], info, (ftnlen)1); - -/* Multiply right singular vectors of L in WORK(IU) by */ -/* Q in VT, storing result in A */ -/* (Workspace: need M*M) */ - - dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, - &vt[vt_offset], ldvt, &c_b57, &a[a_offset], - lda, (ftnlen)1, (ftnlen)1); - -/* Copy right singular vectors of A from A to VT */ - - dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - -/* Copy left singular vectors of A from WORK(IR) to A */ - - dlacpy_((char *)"F", m, m, &work[ir], &ldwrkr, &a[a_offset], - lda, (ftnlen)1); - + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[iu], &ldwrku, + &work[ir], &ldwrkr, dum, &c__1, &work[iwork], info, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, &vt[vt_offset], ldvt, + &c_b57, &a[a_offset], lda, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); + dlacpy_((char *)"F", m, m, &work[ir], &ldwrkr, &a[a_offset], lda, (ftnlen)1); } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *m; - -/* Compute A=L*Q, copying result to VT */ -/* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - -/* Generate Q in VT */ -/* (Workspace: need M + N, prefer M + N*NB) */ - + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &work[iwork], &i__2, + &ierr); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Zero out above L in A */ - i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 - << 1) + 1], lda, (ftnlen)1); - -/* Bidiagonalize L in A */ -/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &a[(a_dim1 << 1) + 1], lda, + (ftnlen)1); i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Multiply right bidiagonalizing vectors in A by Q */ -/* in VT */ -/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - + dgebrd_(m, m, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, & - work[itaup], &vt[vt_offset], ldvt, &work[ - iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); - -/* Generate left bidiagonalizing vectors in A */ -/* (Workspace: need 4*M, prefer 3*M + M*NB) */ - + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &a[a_offset], lda, &work[itaup], + &vt[vt_offset], ldvt, &work[iwork], &i__2, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], - &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, m, &a[a_offset], lda, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of A in A and computing right */ -/* singular vectors of A in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &a[a_offset], lda, dum, & - c__1, &work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &a[a_offset], lda, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } else if (wntuas) { - -/* Path 9t(N much larger than M, JOBU='S' or 'A', */ -/* JOBVT='A') */ -/* N right singular vectors to be computed in VT and */ -/* M left singular vectors to be computed in U */ - -/* Computing MAX */ - i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2,i__3); - if (*lwork >= *m * *m + max(i__2,bdspac)) { - -/* Sufficient workspace for a fast algorithm */ - + i__2 = *n + *m, i__3 = *m << 2, i__2 = max(i__2, i__3); + if (*lwork >= *m * *m + max(i__2, bdspac)) { iu = 1; if (*lwork >= wrkbl + *lda * *m) { - -/* WORK(IU) is LDA by M */ - ldwrku = *lda; } else { - -/* WORK(IU) is M by M */ - ldwrku = *m; } itau = iu + ldwrku * *m; iwork = itau + *m; - -/* Compute A=L*Q, copying result to VT */ -/* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - -/* Generate Q in VT */ -/* (Workspace: need M*M + M + N, prefer M*M + M + N*NB) */ - + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); - -/* Copy L to WORK(IU), zeroing out above it */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], & - ldwrku, (ftnlen)1); + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &work[iwork], &i__2, + &ierr); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &work[iu], &ldwrku, (ftnlen)1); i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + - ldwrku], &ldwrku, (ftnlen)1); + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &work[iu + ldwrku], &ldwrku, + (ftnlen)1); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in WORK(IU), copying result to U */ -/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &u[u_offset], - ldu, (ftnlen)1); - -/* Generate right bidiagonalizing vectors in WORK(IU) */ -/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + (M-1)*NB) */ - + dgebrd_(m, m, &work[iu], &ldwrku, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"L", m, m, &work[iu], &ldwrku, &u[u_offset], ldu, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup] - , &work[iwork], &i__2, &ierr, (ftnlen)1); - -/* Generate left bidiagonalizing vectors in U */ -/* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) */ - + dorgbr_((char *)"P", m, m, m, &work[iu], &ldwrku, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], - &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of L in U and computing right */ -/* singular vectors of L in WORK(IU) */ -/* (Workspace: need M*M + BDSPAC) */ - - dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[ - iu], &ldwrku, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); - -/* Multiply right singular vectors of L in WORK(IU) by */ -/* Q in VT, storing result in A */ -/* (Workspace: need M*M) */ - - dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, - &vt[vt_offset], ldvt, &c_b57, &a[a_offset], - lda, (ftnlen)1, (ftnlen)1); - -/* Copy right singular vectors of A from A to VT */ - - dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - + dbdsqr_((char *)"U", m, m, m, &c__0, &s[1], &work[ie], &work[iu], &ldwrku, + &u[u_offset], ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, m, &c_b79, &work[iu], &ldwrku, &vt[vt_offset], ldvt, + &c_b57, &a[a_offset], lda, (ftnlen)1, (ftnlen)1); + dlacpy_((char *)"F", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); } else { - -/* Insufficient workspace for a fast algorithm */ - itau = 1; iwork = itau + *m; - -/* Compute A=L*Q, copying result to VT */ -/* (Workspace: need 2*M, prefer M + M*NB) */ - i__2 = *lwork - iwork + 1; - dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[ - iwork], &i__2, &ierr); - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], - ldvt, (ftnlen)1); - -/* Generate Q in VT */ -/* (Workspace: need M + N, prefer M + N*NB) */ - + dgelqf_(m, n, &a[a_offset], lda, &work[itau], &work[iwork], &i__2, &ierr); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], & - work[iwork], &i__2, &ierr); - -/* Copy L to U, zeroing out above it */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], - ldu, (ftnlen)1); + dorglq_(n, n, m, &vt[vt_offset], ldvt, &work[itau], &work[iwork], &i__2, + &ierr); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__2 = *m - 1; i__3 = *m - 1; - dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 - << 1) + 1], ldu, (ftnlen)1); + dlaset_((char *)"U", &i__2, &i__3, &c_b57, &c_b57, &u[(u_dim1 << 1) + 1], ldu, + (ftnlen)1); ie = itau; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize L in U */ -/* (Workspace: need 4*M, prefer 3*M + 2*M*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], & - work[itauq], &work[itaup], &work[iwork], & - i__2, &ierr); - -/* Multiply right bidiagonalizing vectors in U by Q */ -/* in VT */ -/* (Workspace: need 3*M + N, prefer 3*M + N*NB) */ - + dgebrd_(m, m, &u[u_offset], ldu, &s[1], &work[ie], &work[itauq], + &work[itaup], &work[iwork], &i__2, &ierr); i__2 = *lwork - iwork + 1; - dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, & - work[itaup], &vt[vt_offset], ldvt, &work[ - iwork], &i__2, &ierr, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); - -/* Generate left bidiagonalizing vectors in U */ -/* (Workspace: need 4*M, prefer 3*M + M*NB) */ - + dormbr_((char *)"P", (char *)"L", (char *)"T", m, n, m, &u[u_offset], ldu, &work[itaup], + &vt[vt_offset], ldvt, &work[iwork], &i__2, &ierr, (ftnlen)1, + (ftnlen)1, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], - &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, m, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, + &ierr, (ftnlen)1); iwork = ie + *m; - -/* Perform bidiagonal QR iteration, computing left */ -/* singular vectors of A in U and computing right */ -/* singular vectors of A in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &u[u_offset], ldu, dum, & - c__1, &work[iwork], info, (ftnlen)1); - + dbdsqr_((char *)"U", m, n, m, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &u[u_offset], ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } - } - } else { - -/* N .LT. MNTHR */ - -/* Path 10t(N greater than M, but not much larger) */ -/* Reduce to bidiagonal form without LQ decomposition */ - ie = 1; itauq = ie + *m; itaup = itauq + *m; iwork = itaup + *m; - -/* Bidiagonalize A */ -/* (Workspace: need 3*M + N, prefer 3*M + (M + N)*NB) */ - i__2 = *lwork - iwork + 1; - dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], & - work[itaup], &work[iwork], &i__2, &ierr); + dgebrd_(m, n, &a[a_offset], lda, &s[1], &work[ie], &work[itauq], &work[itaup], + &work[iwork], &i__2, &ierr); if (wntuas) { - -/* If left singular vectors desired in U, copy result to U */ -/* and generate left bidiagonalizing vectors in U */ -/* (Workspace: need 4*M-1, prefer 3*M + (M-1)*NB) */ - - dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, ( - ftnlen)1); + dlacpy_((char *)"L", m, m, &a[a_offset], lda, &u[u_offset], ldu, (ftnlen)1); i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[ - iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, n, &u[u_offset], ldu, &work[itauq], &work[iwork], &i__2, &ierr, + (ftnlen)1); } if (wntvas) { - -/* If right singular vectors desired in VT, copy result to */ -/* VT and generate right bidiagonalizing vectors in VT */ -/* (Workspace: need 3*M + NRVT, prefer 3*M + NRVT*NB) */ - - dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, ( - ftnlen)1); + dlacpy_((char *)"U", m, n, &a[a_offset], lda, &vt[vt_offset], ldvt, (ftnlen)1); if (wntva) { nrvt = *n; } @@ -4029,28 +1827,18 @@ f"> */ nrvt = *m; } i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", &nrvt, n, m, &vt[vt_offset], ldvt, &work[itaup], - &work[iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", &nrvt, n, m, &vt[vt_offset], ldvt, &work[itaup], &work[iwork], &i__2, + &ierr, (ftnlen)1); } if (wntuo) { - -/* If left singular vectors desired in A, generate left */ -/* bidiagonalizing vectors in A */ -/* (Workspace: need 4*M-1, prefer 3*M + (M-1)*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"Q", m, m, n, &a[a_offset], lda, &work[itauq], &work[ - iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"Q", m, m, n, &a[a_offset], lda, &work[itauq], &work[iwork], &i__2, &ierr, + (ftnlen)1); } if (wntvo) { - -/* If right singular vectors desired in A, generate right */ -/* bidiagonalizing vectors in A */ -/* (Workspace: need 4*M, prefer 3*M + M*NB) */ - i__2 = *lwork - iwork + 1; - dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], &work[ - iwork], &i__2, &ierr, (ftnlen)1); + dorgbr_((char *)"P", m, n, m, &a[a_offset], lda, &work[itaup], &work[iwork], &i__2, &ierr, + (ftnlen)1); } iwork = ie + *m; if (wntuas || wntuo) { @@ -4065,94 +1853,54 @@ f"> */ if (wntvn) { ncvt = 0; } - if (! wntuo && ! wntvo) { - -/* Perform bidiagonal QR iteration, if desired, computing */ -/* left singular vectors in U and computing right singular */ -/* vectors in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &u[u_offset], ldu, dum, &c__1, & - work[iwork], info, (ftnlen)1); - } else if (! wntuo && wntvo) { - -/* Perform bidiagonal QR iteration, if desired, computing */ -/* left singular vectors in U and computing right singular */ -/* vectors in A */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[ - a_offset], lda, &u[u_offset], ldu, dum, &c__1, &work[ - iwork], info, (ftnlen)1); + if (!wntuo && !wntvo) { + dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &u[u_offset], ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); + } else if (!wntuo && wntvo) { + dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &a[a_offset], lda, + &u[u_offset], ldu, dum, &c__1, &work[iwork], info, (ftnlen)1); } else { - -/* Perform bidiagonal QR iteration, if desired, computing */ -/* left singular vectors in A and computing right singular */ -/* vectors in VT */ -/* (Workspace: need BDSPAC) */ - - dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[ - vt_offset], ldvt, &a[a_offset], lda, dum, &c__1, & - work[iwork], info, (ftnlen)1); + dbdsqr_((char *)"L", m, &ncvt, &nru, &c__0, &s[1], &work[ie], &vt[vt_offset], ldvt, + &a[a_offset], lda, dum, &c__1, &work[iwork], info, (ftnlen)1); } - } - } - -/* If DBDSQR failed to converge, copy unconverged superdiagonals */ -/* to WORK( 2:MINMN ) */ - if (*info != 0) { if (ie > 2) { i__2 = minmn - 1; for (i__ = 1; i__ <= i__2; ++i__) { work[i__ + 1] = work[i__ + ie - 1]; -/* L50: */ } } if (ie < 2) { for (i__ = minmn - 1; i__ >= 1; --i__) { work[i__ + 1] = work[i__ + ie - 1]; -/* L60: */ } } } - -/* Undo scaling if necessary */ - if (iscl == 1) { if (anrm > bignum) { - dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], & - minmn, &ierr, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &minmn, &c__1, &s[1], &minmn, &ierr, + (ftnlen)1); } if (*info != 0 && anrm > bignum) { i__2 = minmn - 1; - dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &i__2, &c__1, &work[2], - &minmn, &ierr, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &bignum, &anrm, &i__2, &c__1, &work[2], &minmn, &ierr, + (ftnlen)1); } if (anrm < smlnum) { - dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], & - minmn, &ierr, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &minmn, &c__1, &s[1], &minmn, &ierr, + (ftnlen)1); } if (*info != 0 && anrm < smlnum) { i__2 = minmn - 1; - dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &i__2, &c__1, &work[2], - &minmn, &ierr, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &smlnum, &anrm, &i__2, &c__1, &work[2], &minmn, &ierr, + (ftnlen)1); } } - -/* Return optimal workspace in WORK(1) */ - - work[1] = (doublereal) maxwrk; - + work[1] = (doublereal)maxwrk; return 0; - -/* End of DGESVD */ - -} /* dgesvd_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgetf2.cpp b/lib/linalg/dgetf2.cpp index c5951c8703..debebd53a0 100644 --- a/lib/linalg/dgetf2.cpp +++ b/lib/linalg/dgetf2.cpp @@ -1,194 +1,32 @@ -/* fortran/dgetf2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static doublereal c_b8 = -1.; - -/* > \brief \b DGETF2 computes the LU factorization of a general m-by-n matrix using partial pivoting with row - interchanges (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGETF2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGETF2( M, N, A, LDA, IPIV, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IPIV( * ) */ -/* DOUBLE PRECISION A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGETF2 computes an LU factorization of a general m-by-n matrix A */ -/* > using partial pivoting with row interchanges. */ -/* > */ -/* > The factorization has the form */ -/* > A = P * L * U */ -/* > where P is a permutation matrix, L is lower triangular with unit */ -/* > diagonal elements (lower trapezoidal if m > n), and U is upper */ -/* > triangular (upper trapezoidal if m < n). */ -/* > */ -/* > This is the right-looking Level 2 BLAS version of the algorithm. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the m by n matrix to be factored. */ -/* > On exit, the factors L and U from the factorization */ -/* > A = P*L*U; the unit diagonal elements of L are not stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IPIV */ -/* > \verbatim */ -/* > IPIV is INTEGER array, dimension (min(M,N)) */ -/* > The pivot indices; for 1 <= i <= min(M,N), row i of the */ -/* > matrix was interchanged with row IPIV(i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -k, the k-th argument had an illegal value */ -/* > > 0: if INFO = k, U(k,k) is exactly zero. The factorization */ -/* > has been completed, but the factor U is exactly */ -/* > singular, and division by zero will occur if it is used */ -/* > to solve a system of equations. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dgetf2_(integer *m, integer *n, doublereal *a, integer * - lda, integer *ipiv, integer *info) +int dgetf2_(integer *m, integer *n, doublereal *a, integer *lda, integer *ipiv, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; - - /* Local variables */ integer i__, j, jp; - extern /* Subroutine */ int dger_(integer *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *), dscal_(integer *, doublereal *, doublereal *, integer - *); + extern int dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *), + dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sfmin; - extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern int dswap_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal dlamch_(char *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; - - /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -4; } if (*info != 0) { @@ -196,35 +34,19 @@ f"> */ xerbla_((char *)"DGETF2", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0) { return 0; } - -/* Compute machine safe minimum */ - sfmin = dlamch_((char *)"S", (ftnlen)1); - - i__1 = min(*m,*n); + i__1 = min(*m, *n); for (j = 1; j <= i__1; ++j) { - -/* Find pivot and test for singularity. */ - i__2 = *m - j + 1; jp = j - 1 + idamax_(&i__2, &a[j + j * a_dim1], &c__1); ipiv[j] = jp; if (a[jp + j * a_dim1] != 0.) { - -/* Apply the interchange to columns 1:N. */ - if (jp != j) { dswap_(n, &a[j + a_dim1], lda, &a[jp + a_dim1], lda); } - -/* Compute elements J+1:M of J-th column. */ - if (j < *m) { if ((d__1 = a[j + j * a_dim1], abs(d__1)) >= sfmin) { i__2 = *m - j; @@ -234,33 +56,21 @@ f"> */ i__2 = *m - j; for (i__ = 1; i__ <= i__2; ++i__) { a[j + i__ + j * a_dim1] /= a[j + j * a_dim1]; -/* L20: */ } } } - } else if (*info == 0) { - *info = j; } - - if (j < min(*m,*n)) { - -/* Update trailing submatrix. */ - + if (j < min(*m, *n)) { i__2 = *m - j; i__3 = *n - j; - dger_(&i__2, &i__3, &c_b8, &a[j + 1 + j * a_dim1], &c__1, &a[j + ( - j + 1) * a_dim1], lda, &a[j + 1 + (j + 1) * a_dim1], lda); + dger_(&i__2, &i__3, &c_b8, &a[j + 1 + j * a_dim1], &c__1, &a[j + (j + 1) * a_dim1], lda, + &a[j + 1 + (j + 1) * a_dim1], lda); } -/* L10: */ } return 0; - -/* End of DGETF2 */ - -} /* dgetf2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgetrf.cpp b/lib/linalg/dgetrf.cpp index cd1e8b50fe..a41a6ae69f 100644 --- a/lib/linalg/dgetrf.cpp +++ b/lib/linalg/dgetrf.cpp @@ -1,197 +1,38 @@ -/* fortran/dgetrf.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b16 = 1.; static doublereal c_b19 = -1.; - -/* > \brief \b DGETRF */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGETRF + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGETRF( M, N, A, LDA, IPIV, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IPIV( * ) */ -/* DOUBLE PRECISION A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGETRF computes an LU factorization of a general M-by-N matrix A */ -/* > using partial pivoting with row interchanges. */ -/* > */ -/* > The factorization has the form */ -/* > A = P * L * U */ -/* > where P is a permutation matrix, L is lower triangular with unit */ -/* > diagonal elements (lower trapezoidal if m > n), and U is upper */ -/* > triangular (upper trapezoidal if m < n). */ -/* > */ -/* > This is the right-looking Level 3 BLAS version of the algorithm. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the M-by-N matrix to be factored. */ -/* > On exit, the factors L and U from the factorization */ -/* > A = P*L*U; the unit diagonal elements of L are not stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IPIV */ -/* > \verbatim */ -/* > IPIV is INTEGER array, dimension (min(M,N)) */ -/* > The pivot indices; for 1 <= i <= min(M,N), row i of the */ -/* > matrix was interchanged with row IPIV(i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, U(i,i) is exactly zero. The factorization */ -/* > has been completed, but the factor U is exactly */ -/* > singular, and division by zero will occur if it is used */ -/* > to solve a system of equations. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dgetrf_(integer *m, integer *n, doublereal *a, integer * - lda, integer *ipiv, integer *info) +int dgetrf_(integer *m, integer *n, doublereal *a, integer *lda, integer *ipiv, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; - - /* Local variables */ integer i__, j, jb, nb; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); integer iinfo; - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), xerbla_( - char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dlaswp_(integer *, doublereal *, integer *, - integer *, integer *, integer *, integer *), dgetrf2_(integer *, - integer *, doublereal *, integer *, integer *, integer *); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, + integer *), + dgetrf2_(integer *, integer *, doublereal *, integer *, integer *, integer *); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; - - /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -4; } if (*info != 0) { @@ -199,95 +40,51 @@ f"> */ xerbla_((char *)"DGETRF", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0) { return 0; } - -/* Determine the block size for this environment. */ - - nb = ilaenv_(&c__1, (char *)"DGETRF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen) - 1); - if (nb <= 1 || nb >= min(*m,*n)) { - -/* Use unblocked code. */ - + nb = ilaenv_(&c__1, (char *)"DGETRF", (char *)" ", m, n, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + if (nb <= 1 || nb >= min(*m, *n)) { dgetrf2_(m, n, &a[a_offset], lda, &ipiv[1], info); } else { - -/* Use blocked code. */ - - i__1 = min(*m,*n); + i__1 = min(*m, *n); i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { -/* Computing MIN */ - i__3 = min(*m,*n) - j + 1; - jb = min(i__3,nb); - -/* Factor diagonal and subdiagonal blocks and test for exact */ -/* singularity. */ - + i__3 = min(*m, *n) - j + 1; + jb = min(i__3, nb); i__3 = *m - j + 1; dgetrf2_(&i__3, &jb, &a[j + j * a_dim1], lda, &ipiv[j], &iinfo); - -/* Adjust INFO and the pivot indices. */ - if (*info == 0 && iinfo > 0) { *info = iinfo + j - 1; } -/* Computing MIN */ i__4 = *m, i__5 = j + jb - 1; - i__3 = min(i__4,i__5); + i__3 = min(i__4, i__5); for (i__ = j; i__ <= i__3; ++i__) { ipiv[i__] = j - 1 + ipiv[i__]; -/* L10: */ } - -/* Apply interchanges to columns 1:J-1. */ - i__3 = j - 1; i__4 = j + jb - 1; dlaswp_(&i__3, &a[a_offset], lda, &j, &i__4, &ipiv[1], &c__1); - if (j + jb <= *n) { - -/* Apply interchanges to columns J+JB:N. */ - i__3 = *n - j - jb + 1; i__4 = j + jb - 1; - dlaswp_(&i__3, &a[(j + jb) * a_dim1 + 1], lda, &j, &i__4, & - ipiv[1], &c__1); - -/* Compute block row of U. */ - + dlaswp_(&i__3, &a[(j + jb) * a_dim1 + 1], lda, &j, &i__4, &ipiv[1], &c__1); i__3 = *n - j - jb + 1; - dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Unit", &jb, &i__3, & - c_b16, &a[j + j * a_dim1], lda, &a[j + (j + jb) * - a_dim1], lda, (ftnlen)4, (ftnlen)5, (ftnlen)12, ( - ftnlen)4); + dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Unit", &jb, &i__3, &c_b16, + &a[j + j * a_dim1], lda, &a[j + (j + jb) * a_dim1], lda, (ftnlen)4, + (ftnlen)5, (ftnlen)12, (ftnlen)4); if (j + jb <= *m) { - -/* Update trailing submatrix. */ - i__3 = *m - j - jb + 1; i__4 = *n - j - jb + 1; - dgemm_((char *)"No transpose", (char *)"No transpose", &i__3, &i__4, &jb, - &c_b19, &a[j + jb + j * a_dim1], lda, &a[j + (j + - jb) * a_dim1], lda, &c_b16, &a[j + jb + (j + jb) * - a_dim1], lda, (ftnlen)12, (ftnlen)12); + dgemm_((char *)"No transpose", (char *)"No transpose", &i__3, &i__4, &jb, &c_b19, + &a[j + jb + j * a_dim1], lda, &a[j + (j + jb) * a_dim1], lda, &c_b16, + &a[j + jb + (j + jb) * a_dim1], lda, (ftnlen)12, (ftnlen)12); } } -/* L20: */ } } return 0; - -/* End of DGETRF */ - -} /* dgetrf_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgetrf2.cpp b/lib/linalg/dgetrf2.cpp index c7097bbfed..e3f6b1c48d 100644 --- a/lib/linalg/dgetrf2.cpp +++ b/lib/linalg/dgetrf2.cpp @@ -1,201 +1,39 @@ -/* static/dgetrf2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static doublereal c_b13 = 1.; static doublereal c_b16 = -1.; - -/* > \brief \b DGETRF2 */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* RECURSIVE SUBROUTINE DGETRF2( M, N, A, LDA, IPIV, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IPIV( * ) */ -/* DOUBLE PRECISION A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGETRF2 computes an LU factorization of a general M-by-N matrix A */ -/* > using partial pivoting with row interchanges. */ -/* > */ -/* > The factorization has the form */ -/* > A = P * L * U */ -/* > where P is a permutation matrix, L is lower triangular with unit */ -/* > diagonal elements (lower trapezoidal if m > n), and U is upper */ -/* > triangular (upper trapezoidal if m < n). */ -/* > */ -/* > This is the recursive version of the algorithm. It divides */ -/* > the matrix into four submatrices: */ -/* > */ -/* > [ A11 | A12 ] where A11 is n1 by n1 and A22 is n2 by n2 */ -/* > A = [ -----|----- ] with n1 = min(m,n)/2 */ -/* > [ A21 | A22 ] n2 = n-n1 */ -/* > */ -/* > [ A11 ] */ -/* > The subroutine calls itself to factor [ --- ], */ -/* > [ A12 ] */ -/* > [ A12 ] */ -/* > do the swaps on [ --- ], solve A12, update A22, */ -/* > [ A22 ] */ -/* > */ -/* > then calls itself to factor A22 and do the swaps on A21. */ -/* > */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the M-by-N matrix to be factored. */ -/* > On exit, the factors L and U from the factorization */ -/* > A = P*L*U; the unit diagonal elements of L are not stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IPIV */ -/* > \verbatim */ -/* > IPIV is INTEGER array, dimension (min(M,N)) */ -/* > The pivot indices; for 1 <= i <= min(M,N), row i of the */ -/* > matrix was interchanged with row IPIV(i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, U(i,i) is exactly zero. The factorization */ -/* > has been completed, but the factor U is exactly */ -/* > singular, and division by zero will occur if it is used */ -/* > to solve a system of equations. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dgetrf2_(integer *m, integer *n, doublereal *a, integer * - lda, integer *ipiv, integer *info) +int dgetrf2_(integer *m, integer *n, doublereal *a, integer *lda, integer *ipiv, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; - - /* Local variables */ integer i__, n1, n2; doublereal temp; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dgemm_(char *, char *, integer *, integer *, integer * - , doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern int dscal_(integer *, doublereal *, doublereal *, integer *), + dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen, + ftnlen); integer iinfo; doublereal sfmin; - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen); extern doublereal dlamch_(char *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dlaswp_( - integer *, doublereal *, integer *, integer *, integer *, integer - *, integer *); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen), + dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; - - /* Function Body */ *info = 0; if (*m < 0) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -4; } if (*info != 0) { @@ -203,47 +41,24 @@ static doublereal c_b16 = -1.; xerbla_((char *)"DGETRF2", &i__1, (ftnlen)7); return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0) { return 0; } if (*m == 1) { - -/* Use unblocked code for one row case */ -/* Just need to handle IPIV and INFO */ - ipiv[1] = 1; if (a[a_dim1 + 1] == 0.) { *info = 1; } - } else if (*n == 1) { - -/* Use unblocked code for one column case */ - - -/* Compute machine safe minimum */ - sfmin = dlamch_((char *)"S", (ftnlen)1); - -/* Find pivot and test for singularity */ - i__ = idamax_(m, &a[a_dim1 + 1], &c__1); ipiv[1] = i__; if (a[i__ + a_dim1] != 0.) { - -/* Apply the interchange */ - if (i__ != 1) { temp = a[a_dim1 + 1]; a[a_dim1 + 1] = a[i__ + a_dim1]; a[i__ + a_dim1] = temp; } - -/* Compute elements 2:M of the column */ - if ((d__1 = a[a_dim1 + 1], abs(d__1)) >= sfmin) { i__1 = *m - 1; d__1 = 1. / a[a_dim1 + 1]; @@ -252,80 +67,40 @@ static doublereal c_b16 = -1.; i__1 = *m - 1; for (i__ = 1; i__ <= i__1; ++i__) { a[i__ + 1 + a_dim1] /= a[a_dim1 + 1]; -/* L10: */ } } - } else { *info = 1; } - } else { - -/* Use recursive code */ - - n1 = min(*m,*n) / 2; + n1 = min(*m, *n) / 2; n2 = *n - n1; - -/* [ A11 ] */ -/* Factor [ --- ] */ -/* [ A21 ] */ - dgetrf2_(m, &n1, &a[a_offset], lda, &ipiv[1], &iinfo); if (*info == 0 && iinfo > 0) { *info = iinfo; } - -/* [ A12 ] */ -/* Apply interchanges to [ --- ] */ -/* [ A22 ] */ - - dlaswp_(&n2, &a[(n1 + 1) * a_dim1 + 1], lda, &c__1, &n1, &ipiv[1], & - c__1); - -/* Solve A12 */ - - dtrsm_((char *)"L", (char *)"L", (char *)"N", (char *)"U", &n1, &n2, &c_b13, &a[a_offset], lda, &a[( - n1 + 1) * a_dim1 + 1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); - -/* Update A22 */ - + dlaswp_(&n2, &a[(n1 + 1) * a_dim1 + 1], lda, &c__1, &n1, &ipiv[1], &c__1); + dtrsm_((char *)"L", (char *)"L", (char *)"N", (char *)"U", &n1, &n2, &c_b13, &a[a_offset], lda, &a[(n1 + 1) * a_dim1 + 1], + lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); i__1 = *m - n1; - dgemm_((char *)"N", (char *)"N", &i__1, &n2, &n1, &c_b16, &a[n1 + 1 + a_dim1], lda, & - a[(n1 + 1) * a_dim1 + 1], lda, &c_b13, &a[n1 + 1 + (n1 + 1) * - a_dim1], lda, (ftnlen)1, (ftnlen)1); - -/* Factor A22 */ - + dgemm_((char *)"N", (char *)"N", &i__1, &n2, &n1, &c_b16, &a[n1 + 1 + a_dim1], lda, + &a[(n1 + 1) * a_dim1 + 1], lda, &c_b13, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, + (ftnlen)1, (ftnlen)1); i__1 = *m - n1; - dgetrf2_(&i__1, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &ipiv[n1 + - 1], &iinfo); - -/* Adjust INFO and the pivot indices */ - + dgetrf2_(&i__1, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &ipiv[n1 + 1], &iinfo); if (*info == 0 && iinfo > 0) { *info = iinfo + n1; } - i__1 = min(*m,*n); + i__1 = min(*m, *n); for (i__ = n1 + 1; i__ <= i__1; ++i__) { ipiv[i__] += n1; -/* L20: */ } - -/* Apply interchanges to A21 */ - i__1 = n1 + 1; - i__2 = min(*m,*n); + i__2 = min(*m, *n); dlaswp_(&n1, &a[a_dim1 + 1], lda, &i__1, &i__2, &ipiv[1], &c__1); - } return 0; - -/* End of DGETRF2 */ - -} /* dgetrf2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgetri.cpp b/lib/linalg/dgetri.cpp index 368c6701ac..9e522bff50 100644 --- a/lib/linalg/dgetri.cpp +++ b/lib/linalg/dgetri.cpp @@ -1,216 +1,49 @@ -/* fortran/dgetri.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static doublereal c_b20 = -1.; static doublereal c_b22 = 1.; - -/* > \brief \b DGETRI */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGETRI + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDA, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IPIV( * ) */ -/* DOUBLE PRECISION A( LDA, * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGETRI computes the inverse of a matrix using the LU factorization */ -/* > computed by DGETRF. */ -/* > */ -/* > This method inverts U and then computes inv(A) by solving the system */ -/* > inv(A)*L = inv(U) for inv(A). */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the factors L and U from the factorization */ -/* > A = P*L*U as computed by DGETRF. */ -/* > On exit, if INFO = 0, the inverse of the original matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] IPIV */ -/* > \verbatim */ -/* > IPIV is INTEGER array, dimension (N) */ -/* > The pivot indices from DGETRF; for 1<=i<=N, row i of the */ -/* > matrix was interchanged with row IPIV(i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO=0, then WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= max(1,N). */ -/* > For optimal performance LWORK >= N*NB, where NB is */ -/* > the optimal blocksize returned by ILAENV. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, U(i,i) is exactly zero; the matrix is */ -/* > singular and its inverse could not be computed. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dgetri_(integer *n, doublereal *a, integer *lda, integer - *ipiv, doublereal *work, integer *lwork, integer *info) +int dgetri_(integer *n, doublereal *a, integer *lda, integer *ipiv, doublereal *work, + integer *lwork, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, j, jb, nb, jj, jp, nn, iws; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), - dgemv_(char *, integer *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, ftnlen); + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen), + dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen); integer nbmin; - extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, - doublereal *, integer *), dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), xerbla_( - char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dswap_(integer *, doublereal *, integer *, doublereal *, integer *), + dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); integer ldwork; - extern /* Subroutine */ int dtrtri_(char *, char *, integer *, doublereal - *, integer *, integer *, ftnlen, ftnlen); + extern int dtrtri_(char *, char *, integer *, doublereal *, integer *, integer *, ftnlen, + ftnlen); integer lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; --work; - - /* Function Body */ *info = 0; - nb = ilaenv_(&c__1, (char *)"DGETRI", (char *)" ", n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( - ftnlen)1); + nb = ilaenv_(&c__1, (char *)"DGETRI", (char *)" ", n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); lwkopt = *n * nb; - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; lquery = *lwork == -1; if (*n < 0) { *info = -1; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -3; - } else if (*lwork < max(1,*n) && ! lquery) { + } else if (*lwork < max(1, *n) && !lquery) { *info = -6; } if (*info != 0) { @@ -220,124 +53,73 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - -/* Form inv(U). If INFO > 0 from DTRTRI, then U is singular, */ -/* and the inverse is not computed. */ - - dtrtri_((char *)"Upper", (char *)"Non-unit", n, &a[a_offset], lda, info, (ftnlen)5, ( - ftnlen)8); + dtrtri_((char *)"Upper", (char *)"Non-unit", n, &a[a_offset], lda, info, (ftnlen)5, (ftnlen)8); if (*info > 0) { return 0; } - nbmin = 2; ldwork = *n; if (nb > 1 && nb < *n) { -/* Computing MAX */ i__1 = ldwork * nb; - iws = max(i__1,1); + iws = max(i__1, 1); if (*lwork < iws) { nb = *lwork / ldwork; -/* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DGETRI", (char *)" ", n, &c_n1, &c_n1, & - c_n1, (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"DGETRI", (char *)" ", n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); } } else { iws = *n; } - -/* Solve the equation inv(A)*L = inv(U) for inv(A). */ - if (nb < nbmin || nb >= *n) { - -/* Use unblocked code. */ - for (j = *n; j >= 1; --j) { - -/* Copy current column of L to WORK and replace with zeros. */ - i__1 = *n; for (i__ = j + 1; i__ <= i__1; ++i__) { work[i__] = a[i__ + j * a_dim1]; a[i__ + j * a_dim1] = 0.; -/* L10: */ } - -/* Compute current column of inv(A). */ - if (j < *n) { i__1 = *n - j; - dgemv_((char *)"No transpose", n, &i__1, &c_b20, &a[(j + 1) * a_dim1 - + 1], lda, &work[j + 1], &c__1, &c_b22, &a[j * a_dim1 - + 1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", n, &i__1, &c_b20, &a[(j + 1) * a_dim1 + 1], lda, + &work[j + 1], &c__1, &c_b22, &a[j * a_dim1 + 1], &c__1, (ftnlen)12); } -/* L20: */ } } else { - -/* Use blocked code. */ - nn = (*n - 1) / nb * nb + 1; i__1 = -nb; for (j = nn; i__1 < 0 ? j >= 1 : j <= 1; j += i__1) { -/* Computing MIN */ i__2 = nb, i__3 = *n - j + 1; - jb = min(i__2,i__3); - -/* Copy current block column of L to WORK and replace with */ -/* zeros. */ - + jb = min(i__2, i__3); i__2 = j + jb - 1; for (jj = j; jj <= i__2; ++jj) { i__3 = *n; for (i__ = jj + 1; i__ <= i__3; ++i__) { work[i__ + (jj - j) * ldwork] = a[i__ + jj * a_dim1]; a[i__ + jj * a_dim1] = 0.; -/* L30: */ } -/* L40: */ } - -/* Compute current block column of inv(A). */ - if (j + jb <= *n) { i__2 = *n - j - jb + 1; dgemm_((char *)"No transpose", (char *)"No transpose", n, &jb, &i__2, &c_b20, - &a[(j + jb) * a_dim1 + 1], lda, &work[j + jb], & - ldwork, &c_b22, &a[j * a_dim1 + 1], lda, (ftnlen)12, ( - ftnlen)12); + &a[(j + jb) * a_dim1 + 1], lda, &work[j + jb], &ldwork, &c_b22, + &a[j * a_dim1 + 1], lda, (ftnlen)12, (ftnlen)12); } - dtrsm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, &jb, &c_b22, & - work[j], &ldwork, &a[j * a_dim1 + 1], lda, (ftnlen)5, ( - ftnlen)5, (ftnlen)12, (ftnlen)4); -/* L50: */ + dtrsm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, &jb, &c_b22, &work[j], &ldwork, + &a[j * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); } } - -/* Apply column interchanges. */ - for (j = *n - 1; j >= 1; --j) { jp = ipiv[j]; if (jp != j) { dswap_(n, &a[j * a_dim1 + 1], &c__1, &a[jp * a_dim1 + 1], &c__1); } -/* L60: */ } - - work[1] = (doublereal) iws; + work[1] = (doublereal)iws; return 0; - -/* End of DGETRI */ - -} /* dgetri_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dgetrs.cpp b/lib/linalg/dgetrs.cpp index ca10730a0b..c45250cc95 100644 --- a/lib/linalg/dgetrs.cpp +++ b/lib/linalg/dgetrs.cpp @@ -1,191 +1,21 @@ -/* fortran/dgetrs.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static doublereal c_b12 = 1.; static integer c_n1 = -1; - -/* > \brief \b DGETRS */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DGETRS + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DGETRS( TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER TRANS */ -/* INTEGER INFO, LDA, LDB, N, NRHS */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IPIV( * ) */ -/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DGETRS solves a system of linear equations */ -/* > A * X = B or A**T * X = B */ -/* > with a general N-by-N matrix A using the LU factorization computed */ -/* > by DGETRF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > Specifies the form of the system of equations: */ -/* > = 'N': A * X = B (No transpose) */ -/* > = 'T': A**T* X = B (Transpose) */ -/* > = 'C': A**T* X = B (Conjugate transpose = Transpose) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NRHS */ -/* > \verbatim */ -/* > NRHS is INTEGER */ -/* > The number of right hand sides, i.e., the number of columns */ -/* > of the matrix B. NRHS >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > The factors L and U from the factorization A = P*L*U */ -/* > as computed by DGETRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] IPIV */ -/* > \verbatim */ -/* > IPIV is INTEGER array, dimension (N) */ -/* > The pivot indices from DGETRF; for 1<=i<=N, row i of the */ -/* > matrix was interchanged with row IPIV(i). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ -/* > On entry, the right hand side matrix B. */ -/* > On exit, the solution matrix X. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dgetrs_(char *trans, integer *n, integer *nrhs, - doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * - ldb, integer *info, ftnlen trans_len) +int dgetrs_(char *trans, integer *n, integer *nrhs, doublereal *a, integer *lda, integer *ipiv, + doublereal *b, integer *ldb, integer *info, ftnlen trans_len) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; - - /* Local variables */ extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), xerbla_( - char *, integer *, ftnlen), dlaswp_(integer *, doublereal *, - integer *, integer *, integer *, integer *, integer *); + extern int dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + xerbla_(char *, integer *, ftnlen), + dlaswp_(integer *, doublereal *, integer *, integer *, integer *, integer *, integer *); logical notran; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -193,20 +23,18 @@ f"> */ b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; - - /* Function Body */ *info = 0; notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); - if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_( - trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + if (!notran && !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -5; - } else if (*ldb < max(1,*n)) { + } else if (*ldb < max(1, *n)) { *info = -8; } if (*info != 0) { @@ -214,59 +42,24 @@ f"> */ xerbla_((char *)"DGETRS", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0 || *nrhs == 0) { return 0; } - if (notran) { - -/* Solve A * X = B. */ - -/* Apply row interchanges to the right hand sides. */ - dlaswp_(nrhs, &b[b_offset], ldb, &c__1, n, &ipiv[1], &c__1); - -/* Solve L*X = B, overwriting B with X. */ - - dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, nrhs, &c_b12, &a[ - a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)12, (ftnlen)4); - -/* Solve U*X = B, overwriting B with X. */ - - dtrsm_((char *)"Left", (char *)"Upper", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b12, & - a[a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)12, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, nrhs, &c_b12, &a[a_offset], lda, + &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, (ftnlen)12, (ftnlen)4); + dtrsm_((char *)"Left", (char *)"Upper", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b12, &a[a_offset], lda, + &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, (ftnlen)12, (ftnlen)8); } else { - -/* Solve A**T * X = B. */ - -/* Solve U**T *X = B, overwriting B with X. */ - - dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b12, &a[ - a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)9, (ftnlen)8); - -/* Solve L**T *X = B, overwriting B with X. */ - - dtrsm_((char *)"Left", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, nrhs, &c_b12, &a[ - a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)9, (ftnlen)4); - -/* Apply row interchanges to the solution vectors. */ - + dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b12, &a[a_offset], lda, + &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, (ftnlen)9, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, nrhs, &c_b12, &a[a_offset], lda, + &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, (ftnlen)9, (ftnlen)4); dlaswp_(nrhs, &b[b_offset], ldb, &c__1, n, &ipiv[1], &c_n1); } - return 0; - -/* End of DGETRS */ - -} /* dgetrs_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/disnan.cpp b/lib/linalg/disnan.cpp index 9e5bc1094e..dcdaad77e1 100644 --- a/lib/linalg/disnan.cpp +++ b/lib/linalg/disnan.cpp @@ -7,8 +7,8 @@ extern "C" { logical disnan_(const doublereal *din) { - if (!din) return TRUE_; + if (!din) return TRUE_; - return std::isnan(*din) ? TRUE_ : FALSE_; + return std::isnan(*din) ? TRUE_ : FALSE_; } } diff --git a/lib/linalg/dlabad.cpp b/lib/linalg/dlabad.cpp index 45de813f49..790163be3c 100644 --- a/lib/linalg/dlabad.cpp +++ b/lib/linalg/dlabad.cpp @@ -1,128 +1,16 @@ -/* fortran/dlabad.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLABAD */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLABAD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLABAD( SMALL, LARGE ) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION LARGE, SMALL */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLABAD takes as input the values computed by DLAMCH for underflow and */ -/* > overflow, and returns the square root of each of these values if the */ -/* > log of LARGE is sufficiently large. This subroutine is intended to */ -/* > identify machines with a large exponent range, such as the Crays, and */ -/* > redefine the underflow and overflow limits to be the square roots of */ -/* > the values computed by DLAMCH. This subroutine is needed because */ -/* > DLAMCH does not compensate for poor arithmetic in the upper half of */ -/* > the exponent range, as is found on a Cray. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in,out] SMALL */ -/* > \verbatim */ -/* > SMALL is DOUBLE PRECISION */ -/* > On entry, the underflow threshold as computed by DLAMCH. */ -/* > On exit, if LOG10(LARGE) is sufficiently large, the square */ -/* > root of SMALL, otherwise unchanged. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] LARGE */ -/* > \verbatim */ -/* > LARGE is DOUBLE PRECISION */ -/* > On entry, the overflow threshold as computed by DLAMCH. */ -/* > On exit, if LOG10(LARGE) is sufficiently large, the square */ -/* > root of LARGE, otherwise unchanged. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int dlabad_(doublereal *small, doublereal *large) +int dlabad_(doublereal *small, doublereal *large) { - /* Builtin functions */ double d_lmp_lg10(doublereal *), sqrt(doublereal); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* If it looks like we're on a Cray, take the square root of */ -/* SMALL and LARGE to avoid overflow and underflow problems. */ - if (d_lmp_lg10(large) > 2e3) { *small = sqrt(*small); *large = sqrt(*large); } - return 0; - -/* End of DLABAD */ - -} /* dlabad_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlabrd.cpp b/lib/linalg/dlabrd.cpp index a7f9113e5c..d58ebe9a39 100644 --- a/lib/linalg/dlabrd.cpp +++ b/lib/linalg/dlabrd.cpp @@ -1,279 +1,21 @@ -/* fortran/dlabrd.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b4 = -1.; static doublereal c_b5 = 1.; static integer c__1 = 1; static doublereal c_b16 = 0.; - -/* > \brief \b DLABRD reduces the first nb rows and columns of a general matrix to a bidiagonal form. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLABRD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLABRD( M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX, Y, */ -/* LDY ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER LDA, LDX, LDY, M, N, NB */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAUP( * ), */ -/* $ TAUQ( * ), X( LDX, * ), Y( LDY, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLABRD reduces the first NB rows and columns of a real general */ -/* > m by n matrix A to upper or lower bidiagonal form by an orthogonal */ -/* > transformation Q**T * A * P, and returns the matrices X and Y which */ -/* > are needed to apply the transformation to the unreduced part of A. */ -/* > */ -/* > If m >= n, A is reduced to upper bidiagonal form; if m < n, to lower */ -/* > bidiagonal form. */ -/* > */ -/* > This is an auxiliary routine called by DGEBRD */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows in the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns in the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NB */ -/* > \verbatim */ -/* > NB is INTEGER */ -/* > The number of leading rows and columns of A to be reduced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the m by n general matrix to be reduced. */ -/* > On exit, the first NB rows and columns of the matrix are */ -/* > overwritten; the rest of the array is unchanged. */ -/* > If m >= n, elements on and below the diagonal in the first NB */ -/* > columns, with the array TAUQ, represent the orthogonal */ -/* > matrix Q as a product of elementary reflectors; and */ -/* > elements above the diagonal in the first NB rows, with the */ -/* > array TAUP, represent the orthogonal matrix P as a product */ -/* > of elementary reflectors. */ -/* > If m < n, elements below the diagonal in the first NB */ -/* > columns, with the array TAUQ, represent the orthogonal */ -/* > matrix Q as a product of elementary reflectors, and */ -/* > elements on and above the diagonal in the first NB rows, */ -/* > with the array TAUP, represent the orthogonal matrix P as */ -/* > a product of elementary reflectors. */ -/* > See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (NB) */ -/* > The diagonal elements of the first NB rows and columns of */ -/* > the reduced matrix. D(i) = A(i,i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (NB) */ -/* > The off-diagonal elements of the first NB rows and columns of */ -/* > the reduced matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAUQ */ -/* > \verbatim */ -/* > TAUQ is DOUBLE PRECISION array, dimension (NB) */ -/* > The scalar factors of the elementary reflectors which */ -/* > represent the orthogonal matrix Q. See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAUP */ -/* > \verbatim */ -/* > TAUP is DOUBLE PRECISION array, dimension (NB) */ -/* > The scalar factors of the elementary reflectors which */ -/* > represent the orthogonal matrix P. See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION array, dimension (LDX,NB) */ -/* > The m-by-nb matrix X required to update the unreduced part */ -/* > of A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDX */ -/* > \verbatim */ -/* > LDX is INTEGER */ -/* > The leading dimension of the array X. LDX >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] Y */ -/* > \verbatim */ -/* > Y is DOUBLE PRECISION array, dimension (LDY,NB) */ -/* > The n-by-nb matrix Y required to update the unreduced part */ -/* > of A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDY */ -/* > \verbatim */ -/* > LDY is INTEGER */ -/* > The leading dimension of the array Y. LDY >= max(1,N). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The matrices Q and P are represented as products of elementary */ -/* > reflectors: */ -/* > */ -/* > Q = H(1) H(2) . . . H(nb) and P = G(1) G(2) . . . G(nb) */ -/* > */ -/* > Each H(i) and G(i) has the form: */ -/* > */ -/* > H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T */ -/* > */ -/* > where tauq and taup are real scalars, and v and u are real vectors. */ -/* > */ -/* > If m >= n, v(1:i-1) = 0, v(i) = 1, and v(i:m) is stored on exit in */ -/* > A(i:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+1:n) is stored on exit in */ -/* > A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i). */ -/* > */ -/* > If m < n, v(1:i) = 0, v(i+1) = 1, and v(i+1:m) is stored on exit in */ -/* > A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i:n) is stored on exit in */ -/* > A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i). */ -/* > */ -/* > The elements of the vectors v and u together form the m-by-nb matrix */ -/* > V and the nb-by-n matrix U**T which are needed, with X and Y, to apply */ -/* > the transformation to the unreduced part of the matrix, using a block */ -/* > update of the form: A := A - V*Y**T - X*U**T. */ -/* > */ -/* > The contents of A on exit are illustrated by the following examples */ -/* > with nb = 2: */ -/* > */ -/* > m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): */ -/* > */ -/* > ( 1 1 u1 u1 u1 ) ( 1 u1 u1 u1 u1 u1 ) */ -/* > ( v1 1 1 u2 u2 ) ( 1 1 u2 u2 u2 u2 ) */ -/* > ( v1 v2 a a a ) ( v1 1 a a a a ) */ -/* > ( v1 v2 a a a ) ( v1 v2 a a a a ) */ -/* > ( v1 v2 a a a ) ( v1 v2 a a a a ) */ -/* > ( v1 v2 a a a ) */ -/* > */ -/* > where a denotes an element of the original matrix which is unchanged, */ -/* > vi denotes an element of the vector defining H(i), and ui an element */ -/* > of the vector defining G(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlabrd_(integer *m, integer *n, integer *nb, doublereal * - a, integer *lda, doublereal *d__, doublereal *e, doublereal *tauq, - doublereal *taup, doublereal *x, integer *ldx, doublereal *y, integer - *ldy) +int dlabrd_(integer *m, integer *n, integer *nb, doublereal *a, integer *lda, doublereal *d__, + doublereal *e, doublereal *tauq, doublereal *taup, doublereal *x, integer *ldx, + doublereal *y, integer *ldy) { - /* System generated locals */ - integer a_dim1, a_offset, x_dim1, x_offset, y_dim1, y_offset, i__1, i__2, - i__3; - - /* Local variables */ + integer a_dim1, a_offset, x_dim1, x_offset, y_dim1, y_offset, i__1, i__2, i__3; integer i__; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dgemv_(char *, integer *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, ftnlen), dlarfg_(integer *, doublereal *, - doublereal *, integer *, doublereal *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick return if possible */ - - /* Parameter adjustments */ + extern int dscal_(integer *, doublereal *, doublereal *, integer *), + dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen), + dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -287,246 +29,182 @@ f"> */ y_dim1 = *ldy; y_offset = 1 + y_dim1; y -= y_offset; - - /* Function Body */ if (*m <= 0 || *n <= 0) { return 0; } - if (*m >= *n) { - -/* Reduce to upper bidiagonal form */ - i__1 = *nb; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Update A(i:m,i) */ - i__2 = *m - i__ + 1; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + a_dim1], lda, - &y[i__ + y_dim1], ldy, &c_b5, &a[i__ + i__ * a_dim1], & - c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + a_dim1], lda, &y[i__ + y_dim1], + ldy, &c_b5, &a[i__ + i__ * a_dim1], &c__1, (ftnlen)12); i__2 = *m - i__ + 1; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + x_dim1], ldx, - &a[i__ * a_dim1 + 1], &c__1, &c_b5, &a[i__ + i__ * - a_dim1], &c__1, (ftnlen)12); - -/* Generate reflection Q(i) to annihilate A(i+1:m,i) */ - + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + x_dim1], ldx, &a[i__ * a_dim1 + 1], + &c__1, &c_b5, &a[i__ + i__ * a_dim1], &c__1, (ftnlen)12); i__2 = *m - i__ + 1; -/* Computing MIN */ i__3 = i__ + 1; - dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3,*m) + i__ * - a_dim1], &c__1, &tauq[i__]); + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[min(i__3, *m) + i__ * a_dim1], &c__1, + &tauq[i__]); d__[i__] = a[i__ + i__ * a_dim1]; if (i__ < *n) { a[i__ + i__ * a_dim1] = 1.; - -/* Compute Y(i+1:n,i) */ - i__2 = *m - i__ + 1; i__3 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + (i__ + 1) * - a_dim1], lda, &a[i__ + i__ * a_dim1], &c__1, &c_b16, & - y[i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + (i__ + 1) * a_dim1], lda, + &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ + 1 + i__ * y_dim1], &c__1, + (ftnlen)9); i__2 = *m - i__ + 1; i__3 = i__ - 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + a_dim1], - lda, &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ * - y_dim1 + 1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + a_dim1], lda, + &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ * y_dim1 + 1], &c__1, + (ftnlen)9); i__2 = *n - i__; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + 1 + - y_dim1], ldy, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[ - i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + 1 + y_dim1], ldy, + &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[i__ + 1 + i__ * y_dim1], &c__1, + (ftnlen)12); i__2 = *m - i__ + 1; i__3 = i__ - 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &x[i__ + x_dim1], - ldx, &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ * - y_dim1 + 1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &x[i__ + x_dim1], ldx, + &a[i__ + i__ * a_dim1], &c__1, &c_b16, &y[i__ * y_dim1 + 1], &c__1, + (ftnlen)9); i__2 = i__ - 1; i__3 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[(i__ + 1) * - a_dim1 + 1], lda, &y[i__ * y_dim1 + 1], &c__1, &c_b5, - &y[i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[(i__ + 1) * a_dim1 + 1], lda, + &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[i__ + 1 + i__ * y_dim1], &c__1, + (ftnlen)9); i__2 = *n - i__; dscal_(&i__2, &tauq[i__], &y[i__ + 1 + i__ * y_dim1], &c__1); - -/* Update A(i,i+1:n) */ - i__2 = *n - i__; - dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &y[i__ + 1 + - y_dim1], ldy, &a[i__ + a_dim1], lda, &c_b5, &a[i__ + ( - i__ + 1) * a_dim1], lda, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &y[i__ + 1 + y_dim1], ldy, + &a[i__ + a_dim1], lda, &c_b5, &a[i__ + (i__ + 1) * a_dim1], lda, (ftnlen)12); i__2 = i__ - 1; i__3 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[(i__ + 1) * - a_dim1 + 1], lda, &x[i__ + x_dim1], ldx, &c_b5, &a[ - i__ + (i__ + 1) * a_dim1], lda, (ftnlen)9); - -/* Generate reflection P(i) to annihilate A(i,i+2:n) */ - + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[(i__ + 1) * a_dim1 + 1], lda, + &x[i__ + x_dim1], ldx, &c_b5, &a[i__ + (i__ + 1) * a_dim1], lda, (ftnlen)9); i__2 = *n - i__; -/* Computing MIN */ i__3 = i__ + 2; - dlarfg_(&i__2, &a[i__ + (i__ + 1) * a_dim1], &a[i__ + min( - i__3,*n) * a_dim1], lda, &taup[i__]); + dlarfg_(&i__2, &a[i__ + (i__ + 1) * a_dim1], &a[i__ + min(i__3, *n) * a_dim1], lda, + &taup[i__]); e[i__] = a[i__ + (i__ + 1) * a_dim1]; a[i__ + (i__ + 1) * a_dim1] = 1.; - -/* Compute X(i+1:m,i) */ - i__2 = *m - i__; i__3 = *n - i__; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + (i__ - + 1) * a_dim1], lda, &a[i__ + (i__ + 1) * a_dim1], - lda, &c_b16, &x[i__ + 1 + i__ * x_dim1], &c__1, ( - ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + (i__ + 1) * a_dim1], lda, + &a[i__ + (i__ + 1) * a_dim1], lda, &c_b16, &x[i__ + 1 + i__ * x_dim1], &c__1, + (ftnlen)12); i__2 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__, &c_b5, &y[i__ + 1 + y_dim1], - ldy, &a[i__ + (i__ + 1) * a_dim1], lda, &c_b16, &x[ - i__ * x_dim1 + 1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__, &c_b5, &y[i__ + 1 + y_dim1], ldy, + &a[i__ + (i__ + 1) * a_dim1], lda, &c_b16, &x[i__ * x_dim1 + 1], &c__1, + (ftnlen)9); i__2 = *m - i__; - dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &a[i__ + 1 + - a_dim1], lda, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ - i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &a[i__ + 1 + a_dim1], lda, + &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[i__ + 1 + i__ * x_dim1], &c__1, + (ftnlen)12); i__2 = i__ - 1; i__3 = *n - i__; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[(i__ + 1) * - a_dim1 + 1], lda, &a[i__ + (i__ + 1) * a_dim1], lda, & - c_b16, &x[i__ * x_dim1 + 1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[(i__ + 1) * a_dim1 + 1], lda, + &a[i__ + (i__ + 1) * a_dim1], lda, &c_b16, &x[i__ * x_dim1 + 1], &c__1, + (ftnlen)12); i__2 = *m - i__; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + 1 + - x_dim1], ldx, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ - i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + 1 + x_dim1], ldx, + &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[i__ + 1 + i__ * x_dim1], &c__1, + (ftnlen)12); i__2 = *m - i__; dscal_(&i__2, &taup[i__], &x[i__ + 1 + i__ * x_dim1], &c__1); } -/* L10: */ } } else { - -/* Reduce to lower bidiagonal form */ - i__1 = *nb; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Update A(i,i:n) */ - i__2 = *n - i__ + 1; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + y_dim1], ldy, - &a[i__ + a_dim1], lda, &c_b5, &a[i__ + i__ * a_dim1], - lda, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + y_dim1], ldy, &a[i__ + a_dim1], + lda, &c_b5, &a[i__ + i__ * a_dim1], lda, (ftnlen)12); i__2 = i__ - 1; i__3 = *n - i__ + 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[i__ * a_dim1 + 1], - lda, &x[i__ + x_dim1], ldx, &c_b5, &a[i__ + i__ * a_dim1], - lda, (ftnlen)9); - -/* Generate reflection P(i) to annihilate A(i,i+1:n) */ - + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b4, &a[i__ * a_dim1 + 1], lda, &x[i__ + x_dim1], + ldx, &c_b5, &a[i__ + i__ * a_dim1], lda, (ftnlen)9); i__2 = *n - i__ + 1; -/* Computing MIN */ i__3 = i__ + 1; - dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3,*n) * - a_dim1], lda, &taup[i__]); + dlarfg_(&i__2, &a[i__ + i__ * a_dim1], &a[i__ + min(i__3, *n) * a_dim1], lda, + &taup[i__]); d__[i__] = a[i__ + i__ * a_dim1]; if (i__ < *m) { a[i__ + i__ * a_dim1] = 1.; - -/* Compute X(i+1:m,i) */ - i__2 = *m - i__; i__3 = *n - i__ + 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + i__ * - a_dim1], lda, &a[i__ + i__ * a_dim1], lda, &c_b16, & - x[i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + i__ * a_dim1], lda, + &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ + 1 + i__ * x_dim1], &c__1, + (ftnlen)12); i__2 = *n - i__ + 1; i__3 = i__ - 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &y[i__ + y_dim1], - ldy, &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ * - x_dim1 + 1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &y[i__ + y_dim1], ldy, + &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ * x_dim1 + 1], &c__1, (ftnlen)9); i__2 = *m - i__; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + 1 + - a_dim1], lda, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ - i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + 1 + a_dim1], lda, + &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[i__ + 1 + i__ * x_dim1], &c__1, + (ftnlen)12); i__2 = i__ - 1; i__3 = *n - i__ + 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ * a_dim1 + - 1], lda, &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ * - x_dim1 + 1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ * a_dim1 + 1], lda, + &a[i__ + i__ * a_dim1], lda, &c_b16, &x[i__ * x_dim1 + 1], &c__1, + (ftnlen)12); i__2 = *m - i__; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + 1 + - x_dim1], ldx, &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[ - i__ + 1 + i__ * x_dim1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &x[i__ + 1 + x_dim1], ldx, + &x[i__ * x_dim1 + 1], &c__1, &c_b5, &x[i__ + 1 + i__ * x_dim1], &c__1, + (ftnlen)12); i__2 = *m - i__; dscal_(&i__2, &taup[i__], &x[i__ + 1 + i__ * x_dim1], &c__1); - -/* Update A(i+1:m,i) */ - i__2 = *m - i__; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + 1 + - a_dim1], lda, &y[i__ + y_dim1], ldy, &c_b5, &a[i__ + - 1 + i__ * a_dim1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &a[i__ + 1 + a_dim1], lda, + &y[i__ + y_dim1], ldy, &c_b5, &a[i__ + 1 + i__ * a_dim1], &c__1, (ftnlen)12); i__2 = *m - i__; - dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &x[i__ + 1 + - x_dim1], ldx, &a[i__ * a_dim1 + 1], &c__1, &c_b5, &a[ - i__ + 1 + i__ * a_dim1], &c__1, (ftnlen)12); - -/* Generate reflection Q(i) to annihilate A(i+2:m,i) */ - + dgemv_((char *)"No transpose", &i__2, &i__, &c_b4, &x[i__ + 1 + x_dim1], ldx, + &a[i__ * a_dim1 + 1], &c__1, &c_b5, &a[i__ + 1 + i__ * a_dim1], &c__1, + (ftnlen)12); i__2 = *m - i__; -/* Computing MIN */ i__3 = i__ + 2; - dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*m) + - i__ * a_dim1], &c__1, &tauq[i__]); + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3, *m) + i__ * a_dim1], &c__1, + &tauq[i__]); e[i__] = a[i__ + 1 + i__ * a_dim1]; a[i__ + 1 + i__ * a_dim1] = 1.; - -/* Compute Y(i+1:n,i) */ - i__2 = *m - i__; i__3 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + (i__ + - 1) * a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, - &c_b16, &y[i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + (i__ + 1) * a_dim1], lda, + &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[i__ + 1 + i__ * y_dim1], &c__1, + (ftnlen)9); i__2 = *m - i__; i__3 = i__ - 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + a_dim1], - lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[ - i__ * y_dim1 + 1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + a_dim1], lda, + &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[i__ * y_dim1 + 1], &c__1, + (ftnlen)9); i__2 = *n - i__; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + 1 + - y_dim1], ldy, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[ - i__ + 1 + i__ * y_dim1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b4, &y[i__ + 1 + y_dim1], ldy, + &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[i__ + 1 + i__ * y_dim1], &c__1, + (ftnlen)12); i__2 = *m - i__; - dgemv_((char *)"Transpose", &i__2, &i__, &c_b5, &x[i__ + 1 + x_dim1], - ldx, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[ - i__ * y_dim1 + 1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__, &c_b5, &x[i__ + 1 + x_dim1], ldx, + &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &y[i__ * y_dim1 + 1], &c__1, + (ftnlen)9); i__2 = *n - i__; - dgemv_((char *)"Transpose", &i__, &i__2, &c_b4, &a[(i__ + 1) * a_dim1 - + 1], lda, &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[i__ - + 1 + i__ * y_dim1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__, &i__2, &c_b4, &a[(i__ + 1) * a_dim1 + 1], lda, + &y[i__ * y_dim1 + 1], &c__1, &c_b5, &y[i__ + 1 + i__ * y_dim1], &c__1, + (ftnlen)9); i__2 = *n - i__; dscal_(&i__2, &tauq[i__], &y[i__ + 1 + i__ * y_dim1], &c__1); } -/* L20: */ } } return 0; - -/* End of DLABRD */ - -} /* dlabrd_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlacn2.cpp b/lib/linalg/dlacn2.cpp index bee9fb7e25..3f9bea59d8 100644 --- a/lib/linalg/dlacn2.cpp +++ b/lib/linalg/dlacn2.cpp @@ -1,244 +1,53 @@ -/* fortran/dlacn2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matr -ix-vector products. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLACN2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLACN2( N, V, X, ISGN, EST, KASE, ISAVE ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER KASE, N */ -/* DOUBLE PRECISION EST */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER ISGN( * ), ISAVE( 3 ) */ -/* DOUBLE PRECISION V( * ), X( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLACN2 estimates the 1-norm of a square, real matrix A. */ -/* > Reverse communication is used for evaluating matrix-vector products. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix. N >= 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] V */ -/* > \verbatim */ -/* > V is DOUBLE PRECISION array, dimension (N) */ -/* > On the final return, V = A*W, where EST = norm(V)/norm(W) */ -/* > (W is not returned). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION array, dimension (N) */ -/* > On an intermediate return, X should be overwritten by */ -/* > A * X, if KASE=1, */ -/* > A**T * X, if KASE=2, */ -/* > and DLACN2 must be re-called with all the other parameters */ -/* > unchanged. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] ISGN */ -/* > \verbatim */ -/* > ISGN is INTEGER array, dimension (N) */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] EST */ -/* > \verbatim */ -/* > EST is DOUBLE PRECISION */ -/* > On entry with KASE = 1 or 2 and ISAVE(1) = 3, EST should be */ -/* > unchanged from the previous call to DLACN2. */ -/* > On exit, EST is an estimate (a lower bound) for norm(A). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] KASE */ -/* > \verbatim */ -/* > KASE is INTEGER */ -/* > On the initial call to DLACN2, KASE should be 0. */ -/* > On an intermediate return, KASE will be 1 or 2, indicating */ -/* > whether X should be overwritten by A * X or A**T * X. */ -/* > On the final return from DLACN2, KASE will again be 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] ISAVE */ -/* > \verbatim */ -/* > ISAVE is INTEGER array, dimension (3) */ -/* > ISAVE is used to save variables between calls to DLACN2 */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Originally named SONEST, dated March 16, 1988. */ -/* > */ -/* > This is a thread safe version of DLACON, which uses the array ISAVE */ -/* > in place of a SAVE statement, as follows: */ -/* > */ -/* > DLACON DLACN2 */ -/* > JUMP ISAVE(1) */ -/* > J ISAVE(2) */ -/* > ITER ISAVE(3) */ -/* > \endverbatim */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Nick Higham, University of Manchester */ - -/* > \par References: */ -/* ================ */ -/* > */ -/* > N.J. Higham, "FORTRAN codes for estimating the one-norm of */ -/* > a real or complex matrix, with applications to condition estimation", */ -/* > ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988. */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlacn2_(integer *n, doublereal *v, doublereal *x, - integer *isgn, doublereal *est, integer *kase, integer *isave) +int dlacn2_(integer *n, doublereal *v, doublereal *x, integer *isgn, doublereal *est, integer *kase, + integer *isave) { - /* System generated locals */ integer i__1; doublereal d__1; - - /* Builtin functions */ integer i_lmp_dnnt(doublereal *); - - /* Local variables */ integer i__; doublereal xs, temp; extern doublereal dasum_(integer *, doublereal *, integer *); integer jlast; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); extern integer idamax_(integer *, doublereal *, integer *); doublereal altsgn, estold; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --isave; --isgn; --x; --v; - - /* Function Body */ if (*kase == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - x[i__] = 1. / (doublereal) (*n); -/* L10: */ + x[i__] = 1. / (doublereal)(*n); } *kase = 1; isave[1] = 1; return 0; } - switch (isave[1]) { - case 1: goto L20; - case 2: goto L40; - case 3: goto L70; - case 4: goto L110; - case 5: goto L140; + case 1: + goto L20; + case 2: + goto L40; + case 3: + goto L70; + case 4: + goto L110; + case 5: + goto L140; } - -/* ................ ENTRY (ISAVE( 1 ) = 1) */ -/* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY A*X. */ - L20: if (*n == 1) { v[1] = x[1]; *est = abs(v[1]); -/* ... QUIT */ goto L150; } *est = dasum_(n, &x[1], &c__1); - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (x[i__] >= 0.) { @@ -247,35 +56,22 @@ L20: x[i__] = -1.; } isgn[i__] = i_lmp_dnnt(&x[i__]); -/* L30: */ } *kase = 2; isave[1] = 2; return 0; - -/* ................ ENTRY (ISAVE( 1 ) = 2) */ -/* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X. */ - L40: isave[2] = idamax_(n, &x[1], &c__1); isave[3] = 2; - -/* MAIN LOOP - ITERATIONS 2,3,...,ITMAX. */ - L50: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { x[i__] = 0.; -/* L60: */ } x[isave[2]] = 1.; *kase = 1; isave[1] = 3; return 0; - -/* ................ ENTRY (ISAVE( 1 ) = 3) */ -/* X HAS BEEN OVERWRITTEN BY A*X. */ - L70: dcopy_(n, &x[1], &c__1, &v[1], &c__1); estold = *est; @@ -290,17 +86,12 @@ L70: if (i_lmp_dnnt(&xs) != isgn[i__]) { goto L90; } -/* L80: */ } -/* REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED. */ goto L120; - L90: -/* TEST FOR CYCLING. */ if (*est <= estold) { goto L120; } - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (x[i__] >= 0.) { @@ -309,15 +100,10 @@ L90: x[i__] = -1.; } isgn[i__] = i_lmp_dnnt(&x[i__]); -/* L100: */ } *kase = 2; isave[1] = 4; return 0; - -/* ................ ENTRY (ISAVE( 1 ) = 4) */ -/* X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X. */ - L110: jlast = isave[2]; isave[2] = idamax_(n, &x[1], &c__1); @@ -325,40 +111,26 @@ L110: ++isave[3]; goto L50; } - -/* ITERATION COMPLETE. FINAL STAGE. */ - L120: altsgn = 1.; i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - x[i__] = altsgn * ((doublereal) (i__ - 1) / (doublereal) (*n - 1) + - 1.); + x[i__] = altsgn * ((doublereal)(i__ - 1) / (doublereal)(*n - 1) + 1.); altsgn = -altsgn; -/* L130: */ } *kase = 1; isave[1] = 5; return 0; - -/* ................ ENTRY (ISAVE( 1 ) = 5) */ -/* X HAS BEEN OVERWRITTEN BY A*X. */ - L140: - temp = dasum_(n, &x[1], &c__1) / (doublereal) (*n * 3) * 2.; + temp = dasum_(n, &x[1], &c__1) / (doublereal)(*n * 3) * 2.; if (temp > *est) { dcopy_(n, &x[1], &c__1, &v[1], &c__1); *est = temp; } - L150: *kase = 0; return 0; - -/* End of DLACN2 */ - -} /* dlacn2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlacpy.cpp b/lib/linalg/dlacpy.cpp index 813a669202..361ee09b9e 100644 --- a/lib/linalg/dlacpy.cpp +++ b/lib/linalg/dlacpy.cpp @@ -1,172 +1,26 @@ -/* fortran/dlacpy.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLACPY copies all or part of one two-dimensional array to another. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLACPY + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLACPY( UPLO, M, N, A, LDA, B, LDB ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER LDA, LDB, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLACPY copies all or part of a two-dimensional matrix A to another */ -/* > matrix B. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies the part of the matrix A to be copied to B. */ -/* > = 'U': Upper triangular part */ -/* > = 'L': Lower triangular part */ -/* > Otherwise: All of the matrix A */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > The m by n matrix A. If UPLO = 'U', only the upper triangle */ -/* > or trapezoid is accessed; if UPLO = 'L', only the lower */ -/* > triangle or trapezoid is accessed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB,N) */ -/* > On exit, B = A in the locations specified by UPLO. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >= max(1,M). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int dlacpy_(char *uplo, integer *m, integer *n, doublereal * - a, integer *lda, doublereal *b, integer *ldb, ftnlen uplo_len) +int dlacpy_(char *uplo, integer *m, integer *n, doublereal *a, integer *lda, doublereal *b, + integer *ldb, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; - - /* Local variables */ integer i__, j; extern logical lsame_(char *, char *, ftnlen, ftnlen); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; - - /* Function Body */ if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { i__1 = *n; for (j = 1; j <= i__1; ++j) { - i__2 = min(j,*m); + i__2 = min(j, *m); for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; -/* L10: */ } -/* L20: */ } } else if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { i__1 = *n; @@ -174,9 +28,7 @@ f"> */ i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; -/* L30: */ } -/* L40: */ } } else { i__1 = *n; @@ -184,17 +36,11 @@ f"> */ i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = a[i__ + j * a_dim1]; -/* L50: */ } -/* L60: */ } } return 0; - -/* End of DLACPY */ - -} /* dlacpy_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dladiv.cpp b/lib/linalg/dladiv.cpp index d12fb854f0..52f48222b0 100644 --- a/lib/linalg/dladiv.cpp +++ b/lib/linalg/dladiv.cpp @@ -1,156 +1,23 @@ -/* fortran/dladiv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLADIV performs complex division in real arithmetic, avoiding unnecessary overflow. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLADIV + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLADIV( A, B, C, D, P, Q ) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION A, B, C, D, P, Q */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLADIV performs complex division in real arithmetic */ -/* > */ -/* > a + i*b */ -/* > p + i*q = --------- */ -/* > c + i*d */ -/* > */ -/* > The algorithm is due to Michael Baudin and Robert L. Smith */ -/* > and can be found in the paper */ -/* > (char *)"A Robust Complex Division in Scilab" */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION */ -/* > The scalars a, b, c, and d in the above expression. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] P */ -/* > \verbatim */ -/* > P is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[out] Q */ -/* > \verbatim */ -/* > Q is DOUBLE PRECISION */ -/* > The scalars p and q in the above expression. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int dladiv_(doublereal *a, doublereal *b, doublereal *c__, - doublereal *d__, doublereal *p, doublereal *q) +int dladiv_(doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, doublereal *p, + doublereal *q) { - /* System generated locals */ doublereal d__1, d__2; - - /* Local variables */ doublereal s, aa, ab, bb, cc, cd, dd, be, un, ov, eps; extern doublereal dlamch_(char *, ftnlen); - extern /* Subroutine */ int dladiv1_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - + extern int dladiv1_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *); aa = *a; bb = *b; cc = *c__; dd = *d__; -/* Computing MAX */ d__1 = abs(*a), d__2 = abs(*b); - ab = max(d__1,d__2); -/* Computing MAX */ + ab = max(d__1, d__2); d__1 = abs(*c__), d__2 = abs(*d__); - cd = max(d__1,d__2); + cd = max(d__1, d__2); s = 1.; ov = dlamch_((char *)"Overflow threshold", (ftnlen)18); un = dlamch_((char *)"Safe minimum", (ftnlen)12); @@ -184,77 +51,26 @@ f"> */ } *p *= s; *q *= s; - return 0; - -/* End of DLADIV */ - -} /* dladiv_ */ - -/* > \ingroup doubleOTHERauxiliary */ -/* Subroutine */ int dladiv1_(doublereal *a, doublereal *b, doublereal *c__, - doublereal *d__, doublereal *p, doublereal *q) +} +int dladiv1_(doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, doublereal *p, + doublereal *q) { doublereal r__, t; - extern doublereal dladiv2_(doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - + extern doublereal dladiv2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *); r__ = *d__ / *c__; t = 1. / (*c__ + *d__ * r__); *p = dladiv2_(a, b, c__, d__, &r__, &t); *a = -(*a); *q = dladiv2_(b, a, c__, d__, &r__, &t); - return 0; - -/* End of DLADIV1 */ - -} /* dladiv1_ */ - -/* > \ingroup doubleOTHERauxiliary */ -doublereal dladiv2_(doublereal *a, doublereal *b, doublereal *c__, doublereal - *d__, doublereal *r__, doublereal *t) +} +doublereal dladiv2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *d__, doublereal *r__, + doublereal *t) { - /* System generated locals */ doublereal ret_val; - - /* Local variables */ doublereal br; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Executable Statements .. */ - if (*r__ != 0.) { br = *b * *r__; if (br != 0.) { @@ -265,13 +81,8 @@ doublereal dladiv2_(doublereal *a, doublereal *b, doublereal *c__, doublereal } else { ret_val = (*a + *d__ * (*b / *c__)) * *t; } - return ret_val; - -/* End of DLADIV2 */ - -} /* dladiv2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlae2.cpp b/lib/linalg/dlae2.cpp index 7351921b21..985e03a608 100644 --- a/lib/linalg/dlae2.cpp +++ b/lib/linalg/dlae2.cpp @@ -1,155 +1,12 @@ -/* fortran/dlae2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAE2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAE2( A, B, C, RT1, RT2 ) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION A, B, C, RT1, RT2 */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix */ -/* > [ A B ] */ -/* > [ B C ]. */ -/* > On return, RT1 is the eigenvalue of larger absolute value, and RT2 */ -/* > is the eigenvalue of smaller absolute value. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION */ -/* > The (1,1) element of the 2-by-2 matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION */ -/* > The (1,2) and (2,1) elements of the 2-by-2 matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION */ -/* > The (2,2) element of the 2-by-2 matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RT1 */ -/* > \verbatim */ -/* > RT1 is DOUBLE PRECISION */ -/* > The eigenvalue of larger absolute value. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RT2 */ -/* > \verbatim */ -/* > RT2 is DOUBLE PRECISION */ -/* > The eigenvalue of smaller absolute value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > RT1 is accurate to a few ulps barring over/underflow. */ -/* > */ -/* > RT2 may be inaccurate if there is massive cancellation in the */ -/* > determinant A*C-B*B; higher precision or correctly rounded or */ -/* > correctly truncated arithmetic would be needed to compute RT2 */ -/* > accurately in all cases. */ -/* > */ -/* > Overflow is possible only if RT1 is within a factor of 5 of overflow. */ -/* > Underflow is harmless if the input data is 0 or exceeds */ -/* > underflow_threshold / macheps. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlae2_(doublereal *a, doublereal *b, doublereal *c__, - doublereal *rt1, doublereal *rt2) +int dlae2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *rt1, doublereal *rt2) { - /* System generated locals */ doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal ab, df, tb, sm, rt, adf, acmn, acmx; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Compute the eigenvalues */ - sm = *a + *c__; df = *a - *c__; adf = abs(df); @@ -163,48 +20,26 @@ extern "C" { acmn = *a; } if (adf > ab) { -/* Computing 2nd power */ d__1 = ab / adf; rt = adf * sqrt(d__1 * d__1 + 1.); } else if (adf < ab) { -/* Computing 2nd power */ d__1 = adf / ab; rt = ab * sqrt(d__1 * d__1 + 1.); } else { - -/* Includes case AB=ADF=0 */ - rt = ab * sqrt(2.); } if (sm < 0.) { *rt1 = (sm - rt) * .5; - -/* Order of execution important. */ -/* To get fully accurate smaller eigenvalue, */ -/* next line needs to be executed in higher precision. */ - *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else if (sm > 0.) { *rt1 = (sm + rt) * .5; - -/* Order of execution important. */ -/* To get fully accurate smaller eigenvalue, */ -/* next line needs to be executed in higher precision. */ - *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else { - -/* Includes case RT1 = RT2 = 0 */ - *rt1 = rt * .5; *rt2 = rt * -.5; } return 0; - -/* End of DLAE2 */ - -} /* dlae2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaed0.cpp b/lib/linalg/dlaed0.cpp index 5c40115e77..b1a243175b 100644 --- a/lib/linalg/dlaed0.cpp +++ b/lib/linalg/dlaed0.cpp @@ -1,275 +1,48 @@ -/* fortran/dlaed0.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__9 = 9; static integer c__0 = 0; static integer c__2 = 2; static doublereal c_b23 = 1.; static doublereal c_b24 = 0.; static integer c__1 = 1; - -/* > \brief \b DLAED0 used by DSTEDC. Computes all eigenvalues and corresponding eigenvectors of an unreduced -symmetric tridiagonal matrix using the divide and conquer method. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAED0 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAED0( ICOMPQ, QSIZ, N, D, E, Q, LDQ, QSTORE, LDQS, */ -/* WORK, IWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER ICOMPQ, INFO, LDQ, LDQS, N, QSIZ */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IWORK( * ) */ -/* DOUBLE PRECISION D( * ), E( * ), Q( LDQ, * ), QSTORE( LDQS, * ), */ -/* $ WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAED0 computes all eigenvalues and corresponding eigenvectors of a */ -/* > symmetric tridiagonal matrix using the divide and conquer method. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ICOMPQ */ -/* > \verbatim */ -/* > ICOMPQ is INTEGER */ -/* > = 0: Compute eigenvalues only. */ -/* > = 1: Compute eigenvectors of original dense symmetric matrix */ -/* > also. On entry, Q contains the orthogonal matrix used */ -/* > to reduce the original matrix to tridiagonal form. */ -/* > = 2: Compute eigenvalues and eigenvectors of tridiagonal */ -/* > matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] QSIZ */ -/* > \verbatim */ -/* > QSIZ is INTEGER */ -/* > The dimension of the orthogonal matrix used to reduce */ -/* > the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the main diagonal of the tridiagonal matrix. */ -/* > On exit, its eigenvalues. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > The off-diagonal elements of the tridiagonal matrix. */ -/* > On exit, E has been destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Q */ -/* > \verbatim */ -/* > Q is DOUBLE PRECISION array, dimension (LDQ, N) */ -/* > On entry, Q must contain an N-by-N orthogonal matrix. */ -/* > If ICOMPQ = 0 Q is not referenced. */ -/* > If ICOMPQ = 1 On entry, Q is a subset of the columns of the */ -/* > orthogonal matrix used to reduce the full */ -/* > matrix to tridiagonal form corresponding to */ -/* > the subset of the full matrix which is being */ -/* > decomposed at this time. */ -/* > If ICOMPQ = 2 On entry, Q will be the identity matrix. */ -/* > On exit, Q contains the eigenvectors of the */ -/* > tridiagonal matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQ */ -/* > \verbatim */ -/* > LDQ is INTEGER */ -/* > The leading dimension of the array Q. If eigenvectors are */ -/* > desired, then LDQ >= max(1,N). In any case, LDQ >= 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] QSTORE */ -/* > \verbatim */ -/* > QSTORE is DOUBLE PRECISION array, dimension (LDQS, N) */ -/* > Referenced only when ICOMPQ = 1. Used to store parts of */ -/* > the eigenvector matrix when the updating matrix multiplies */ -/* > take place. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQS */ -/* > \verbatim */ -/* > LDQS is INTEGER */ -/* > The leading dimension of the array QSTORE. If ICOMPQ = 1, */ -/* > then LDQS >= max(1,N). In any case, LDQS >= 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, */ -/* > If ICOMPQ = 0 or 1, the dimension of WORK must be at least */ -/* > 1 + 3*N + 2*N*lg N + 3*N**2 */ -/* > ( lg( N ) = smallest integer k */ -/* > such that 2^k >= N ) */ -/* > If ICOMPQ = 2, the dimension of WORK must be at least */ -/* > 4*N + N**2. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, */ -/* > If ICOMPQ = 0 or 1, the dimension of IWORK must be at least */ -/* > 6 + 6*N + 5*N*lg N. */ -/* > ( lg( N ) = smallest integer k */ -/* > such that 2^k >= N ) */ -/* > If ICOMPQ = 2, the dimension of IWORK must be at least */ -/* > 3 + 5*N. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: The algorithm failed to compute an eigenvalue while */ -/* > working on the submatrix lying in rows and columns */ -/* > INFO/(N+1) through mod(INFO,N+1). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Jeff Rutter, Computer Science Division, University of California */ -/* > at Berkeley, USA */ - -/* ===================================================================== */ -/* Subroutine */ int dlaed0_(integer *icompq, integer *qsiz, integer *n, - doublereal *d__, doublereal *e, doublereal *q, integer *ldq, - doublereal *qstore, integer *ldqs, doublereal *work, integer *iwork, - integer *info) +int dlaed0_(integer *icompq, integer *qsiz, integer *n, doublereal *d__, doublereal *e, + doublereal *q, integer *ldq, doublereal *qstore, integer *ldqs, doublereal *work, + integer *iwork, integer *info) { - /* System generated locals */ integer q_dim1, q_offset, qstore_dim1, qstore_offset, i__1, i__2; doublereal d__1; - - /* Builtin functions */ double log(doublereal); integer pow_lmp_ii(integer *, integer *); - - /* Local variables */ integer i__, j, k, iq, lgn, msd2, smm1, spm1, spm2; doublereal temp; integer curr; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); integer iperm; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer indxq, iwrem; - extern /* Subroutine */ int dlaed1_(integer *, doublereal *, doublereal *, - integer *, integer *, doublereal *, integer *, doublereal *, - integer *, integer *); + extern int dlaed1_(integer *, doublereal *, doublereal *, integer *, integer *, doublereal *, + integer *, doublereal *, integer *, integer *); integer iqptr; - extern /* Subroutine */ int dlaed7_(integer *, integer *, integer *, - integer *, integer *, integer *, doublereal *, doublereal *, - integer *, integer *, doublereal *, integer *, doublereal *, - integer *, integer *, integer *, integer *, integer *, doublereal - *, doublereal *, integer *, integer *); + extern int dlaed7_(integer *, integer *, integer *, integer *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *, doublereal *, integer *, + doublereal *, integer *, integer *, integer *, integer *, integer *, + doublereal *, doublereal *, integer *, integer *); integer tlvls; - extern /* Subroutine */ int dlacpy_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen); + extern int dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen); integer igivcl; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); integer igivnm, submat, curprb, subpbs, igivpt; - extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - ftnlen); + extern int dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen); integer curlvl, matsiz, iprmpt, smlsiz; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; --e; q_dim1 = *ldq; @@ -280,19 +53,16 @@ f"> */ qstore -= qstore_offset; --work; --iwork; - - /* Function Body */ *info = 0; - if (*icompq < 0 || *icompq > 2) { *info = -1; - } else if (*icompq == 1 && *qsiz < max(0,*n)) { + } else if (*icompq == 1 && *qsiz < max(0, *n)) { *info = -2; } else if (*n < 0) { *info = -3; - } else if (*ldq < max(1,*n)) { + } else if (*ldq < max(1, *n)) { *info = -7; - } else if (*ldqs < max(1,*n)) { + } else if (*ldqs < max(1, *n)) { *info = -9; } if (*info != 0) { @@ -300,19 +70,10 @@ f"> */ xerbla_((char *)"DLAED0", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - - smlsiz = ilaenv_(&c__9, (char *)"DLAED0", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( - ftnlen)6, (ftnlen)1); - -/* Determine the size and placement of the submatrices, and save in */ -/* the leading elements of IWORK. */ - + smlsiz = ilaenv_(&c__9, (char *)"DLAED0", (char *)" ", &c__0, &c__0, &c__0, &c__0, (ftnlen)6, (ftnlen)1); iwork[1] = *n; subpbs = 1; tlvls = 0; @@ -321,7 +82,6 @@ L10: for (j = subpbs; j >= 1; --j) { iwork[j * 2] = (iwork[j] + 1) / 2; iwork[(j << 1) - 1] = iwork[j] / 2; -/* L20: */ } ++tlvls; subpbs <<= 1; @@ -330,12 +90,7 @@ L10: i__1 = subpbs; for (j = 2; j <= i__1; ++j) { iwork[j] += iwork[j - 1]; -/* L30: */ } - -/* Divide the matrix into SUBPBS submatrices of size at most SMLSIZ+1 */ -/* using rank-1 modifications (cuts). */ - spm1 = subpbs - 1; i__1 = spm1; for (i__ = 1; i__ <= i__1; ++i__) { @@ -343,17 +98,11 @@ L10: smm1 = submat - 1; d__[smm1] -= (d__1 = e[smm1], abs(d__1)); d__[submat] -= (d__1 = e[smm1], abs(d__1)); -/* L40: */ } - indxq = (*n << 2) + 3; if (*icompq != 2) { - -/* Set up workspaces for eigenvalues only/accumulate new vectors */ -/* routine */ - - temp = log((doublereal) (*n)) / log(2.); - lgn = (integer) temp; + temp = log((doublereal)(*n)) / log(2.); + lgn = (integer)temp; if (pow_lmp_ii(&c__2, &lgn) < *n) { ++lgn; } @@ -365,27 +114,17 @@ L10: iqptr = iperm + *n * lgn; igivpt = iqptr + *n + 2; igivcl = igivpt + *n * lgn; - igivnm = 1; iq = igivnm + (*n << 1) * lgn; -/* Computing 2nd power */ i__1 = *n; iwrem = iq + i__1 * i__1 + 1; - -/* Initialize pointers */ - i__1 = subpbs; for (i__ = 0; i__ <= i__1; ++i__) { iwork[iprmpt + i__] = 1; iwork[igivpt + i__] = 1; -/* L50: */ } iwork[iqptr] = 1; } - -/* Solve each submatrix eigenproblem at the bottom of the divide and */ -/* conquer tree. */ - curr = 0; i__1 = spm1; for (i__ = 0; i__ <= i__1; ++i__) { @@ -397,24 +136,22 @@ L10: matsiz = iwork[i__ + 1] - iwork[i__]; } if (*icompq == 2) { - dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &q[submat + - submat * q_dim1], ldq, &work[1], info, (ftnlen)1); + dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &q[submat + submat * q_dim1], ldq, + &work[1], info, (ftnlen)1); if (*info != 0) { goto L130; } } else { - dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &work[iq - 1 + - iwork[iqptr + curr]], &matsiz, &work[1], info, (ftnlen)1); + dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &work[iq - 1 + iwork[iqptr + curr]], + &matsiz, &work[1], info, (ftnlen)1); if (*info != 0) { goto L130; } if (*icompq == 1) { - dgemm_((char *)"N", (char *)"N", qsiz, &matsiz, &matsiz, &c_b23, &q[submat * - q_dim1 + 1], ldq, &work[iq - 1 + iwork[iqptr + curr]], - &matsiz, &c_b24, &qstore[submat * qstore_dim1 + 1], - ldqs, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", qsiz, &matsiz, &matsiz, &c_b23, &q[submat * q_dim1 + 1], ldq, + &work[iq - 1 + iwork[iqptr + curr]], &matsiz, &c_b24, + &qstore[submat * qstore_dim1 + 1], ldqs, (ftnlen)1, (ftnlen)1); } -/* Computing 2nd power */ i__2 = matsiz; iwork[iqptr + curr + 1] = iwork[iqptr + curr] + i__2 * i__2; ++curr; @@ -424,16 +161,8 @@ L10: for (j = submat; j <= i__2; ++j) { iwork[indxq + j] = k; ++k; -/* L60: */ } -/* L70: */ } - -/* Successively merge eigensystems of adjacent submatrices */ -/* into eigensystem for the corresponding larger matrix. */ - -/* while ( SUBPBS > 1 ) */ - curlvl = 1; L80: if (subpbs > 1) { @@ -451,51 +180,32 @@ L80: msd2 = matsiz / 2; ++curprb; } - -/* Merge lower order eigensystems (of size MSD2 and MATSIZ - MSD2) */ -/* into an eigensystem of size MATSIZ. */ -/* DLAED1 is used only for the full eigensystem of a tridiagonal */ -/* matrix. */ -/* DLAED7 handles the cases in which eigenvalues only or eigenvalues */ -/* and eigenvectors of a full symmetric matrix (which was reduced to */ -/* tridiagonal form) are desired. */ - if (*icompq == 2) { - dlaed1_(&matsiz, &d__[submat], &q[submat + submat * q_dim1], - ldq, &iwork[indxq + submat], &e[submat + msd2 - 1], & - msd2, &work[1], &iwork[subpbs + 1], info); + dlaed1_(&matsiz, &d__[submat], &q[submat + submat * q_dim1], ldq, + &iwork[indxq + submat], &e[submat + msd2 - 1], &msd2, &work[1], + &iwork[subpbs + 1], info); } else { - dlaed7_(icompq, &matsiz, qsiz, &tlvls, &curlvl, &curprb, &d__[ - submat], &qstore[submat * qstore_dim1 + 1], ldqs, & - iwork[indxq + submat], &e[submat + msd2 - 1], &msd2, & - work[iq], &iwork[iqptr], &iwork[iprmpt], &iwork[iperm] - , &iwork[igivpt], &iwork[igivcl], &work[igivnm], & - work[iwrem], &iwork[subpbs + 1], info); + dlaed7_(icompq, &matsiz, qsiz, &tlvls, &curlvl, &curprb, &d__[submat], + &qstore[submat * qstore_dim1 + 1], ldqs, &iwork[indxq + submat], + &e[submat + msd2 - 1], &msd2, &work[iq], &iwork[iqptr], &iwork[iprmpt], + &iwork[iperm], &iwork[igivpt], &iwork[igivcl], &work[igivnm], &work[iwrem], + &iwork[subpbs + 1], info); } if (*info != 0) { goto L130; } iwork[i__ / 2 + 1] = iwork[i__ + 2]; -/* L90: */ } subpbs /= 2; ++curlvl; goto L80; } - -/* end while */ - -/* Re-merge the eigenvalues/vectors which were deflated at the final */ -/* merge step. */ - if (*icompq == 1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { j = iwork[indxq + i__]; work[i__] = d__[j]; - dcopy_(qsiz, &qstore[j * qstore_dim1 + 1], &c__1, &q[i__ * q_dim1 - + 1], &c__1); -/* L100: */ + dcopy_(qsiz, &qstore[j * qstore_dim1 + 1], &c__1, &q[i__ * q_dim1 + 1], &c__1); } dcopy_(n, &work[1], &c__1, &d__[1], &c__1); } else if (*icompq == 2) { @@ -504,7 +214,6 @@ L80: j = iwork[indxq + i__]; work[i__] = d__[j]; dcopy_(n, &q[j * q_dim1 + 1], &c__1, &work[*n * i__ + 1], &c__1); -/* L110: */ } dcopy_(n, &work[1], &c__1, &d__[1], &c__1); dlacpy_((char *)"A", n, n, &work[*n + 1], n, &q[q_offset], ldq, (ftnlen)1); @@ -513,22 +222,15 @@ L80: for (i__ = 1; i__ <= i__1; ++i__) { j = iwork[indxq + i__]; work[i__] = d__[j]; -/* L120: */ } dcopy_(n, &work[1], &c__1, &d__[1], &c__1); } goto L140; - L130: *info = submat * (*n + 1) + submat + matsiz - 1; - L140: return 0; - -/* End of DLAED0 */ - -} /* dlaed0_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaed1.cpp b/lib/linalg/dlaed1.cpp index ff6c537c7c..2d40bdfcd8 100644 --- a/lib/linalg/dlaed1.cpp +++ b/lib/linalg/dlaed1.cpp @@ -1,237 +1,26 @@ -/* fortran/dlaed1.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; - -/* > \brief \b DLAED1 used by DSTEDC. Computes the updated eigensystem of a diagonal matrix after modification - by a rank-one symmetric matrix. Used when the original matrix is tridiagonal. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAED1 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAED1( N, D, Q, LDQ, INDXQ, RHO, CUTPNT, WORK, IWORK, */ -/* INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER CUTPNT, INFO, LDQ, N */ -/* DOUBLE PRECISION RHO */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER INDXQ( * ), IWORK( * ) */ -/* DOUBLE PRECISION D( * ), Q( LDQ, * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAED1 computes the updated eigensystem of a diagonal */ -/* > matrix after modification by a rank-one symmetric matrix. This */ -/* > routine is used only for the eigenproblem which requires all */ -/* > eigenvalues and eigenvectors of a tridiagonal matrix. DLAED7 handles */ -/* > the case in which eigenvalues only or eigenvalues and eigenvectors */ -/* > of a full symmetric matrix (which was reduced to tridiagonal form) */ -/* > are desired. */ -/* > */ -/* > T = Q(in) ( D(in) + RHO * Z*Z**T ) Q**T(in) = Q(out) * D(out) * Q**T(out) */ -/* > */ -/* > where Z = Q**T*u, u is a vector of length N with ones in the */ -/* > CUTPNT and CUTPNT + 1 th elements and zeros elsewhere. */ -/* > */ -/* > The eigenvectors of the original matrix are stored in Q, and the */ -/* > eigenvalues are in D. The algorithm consists of three stages: */ -/* > */ -/* > The first stage consists of deflating the size of the problem */ -/* > when there are multiple eigenvalues or if there is a zero in */ -/* > the Z vector. For each such occurrence the dimension of the */ -/* > secular equation problem is reduced by one. This stage is */ -/* > performed by the routine DLAED2. */ -/* > */ -/* > The second stage consists of calculating the updated */ -/* > eigenvalues. This is done by finding the roots of the secular */ -/* > equation via the routine DLAED4 (as called by DLAED3). */ -/* > This routine also calculates the eigenvectors of the current */ -/* > problem. */ -/* > */ -/* > The final stage consists of computing the updated eigenvectors */ -/* > directly using the updated eigenvalues. The eigenvectors for */ -/* > the current problem are multiplied with the eigenvectors from */ -/* > the overall problem. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the eigenvalues of the rank-1-perturbed matrix. */ -/* > On exit, the eigenvalues of the repaired matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Q */ -/* > \verbatim */ -/* > Q is DOUBLE PRECISION array, dimension (LDQ,N) */ -/* > On entry, the eigenvectors of the rank-1-perturbed matrix. */ -/* > On exit, the eigenvectors of the repaired tridiagonal matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQ */ -/* > \verbatim */ -/* > LDQ is INTEGER */ -/* > The leading dimension of the array Q. LDQ >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] INDXQ */ -/* > \verbatim */ -/* > INDXQ is INTEGER array, dimension (N) */ -/* > On entry, the permutation which separately sorts the two */ -/* > subproblems in D into ascending order. */ -/* > On exit, the permutation which will reintegrate the */ -/* > subproblems back into sorted order, */ -/* > i.e. D( INDXQ( I = 1, N ) ) will be in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > The subdiagonal entry used to create the rank-1 modification. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CUTPNT */ -/* > \verbatim */ -/* > CUTPNT is INTEGER */ -/* > The location of the last eigenvalue in the leading sub-matrix. */ -/* > min(1,N) <= CUTPNT <= N/2. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (4*N + N**2) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension (4*N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: if INFO = 1, an eigenvalue did not converge */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Jeff Rutter, Computer Science Division, University of California */ -/* > at Berkeley, USA \n */ -/* > Modified by Francoise Tisseur, University of Tennessee */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlaed1_(integer *n, doublereal *d__, doublereal *q, - integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, - doublereal *work, integer *iwork, integer *info) +int dlaed1_(integer *n, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, + doublereal *rho, integer *cutpnt, doublereal *work, integer *iwork, integer *info) { - /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; - - /* Local variables */ integer i__, k, n1, n2, is, iw, iz, iq2, zpp1, indx, indxc; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer indxp; - extern /* Subroutine */ int dlaed2_(integer *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *, - integer *, integer *, integer *, integer *), dlaed3_(integer *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, doublereal *, doublereal *, integer *, integer *, - doublereal *, doublereal *, integer *); + extern int dlaed2_(integer *, integer *, integer *, doublereal *, doublereal *, integer *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *, integer *, integer *, integer *, integer *), + dlaed3_(integer *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, doublereal *, doublereal *, integer *, integer *, doublereal *, + doublereal *, integer *); integer idlmda; - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen); + extern int dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), + xerbla_(char *, integer *, ftnlen); integer coltyp; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; @@ -239,18 +28,14 @@ f"> */ --indxq; --work; --iwork; - - /* Function Body */ *info = 0; - if (*n < 0) { *info = -1; - } else if (*ldq < max(1,*n)) { + } else if (*ldq < max(1, *n)) { *info = -4; - } else /* if(complicated condition) */ { -/* Computing MIN */ + } else { i__1 = 1, i__2 = *n / 2; - if (min(i__1,i__2) > *cutpnt || *n / 2 < *cutpnt) { + if (min(i__1, i__2) > *cutpnt || *n / 2 < *cutpnt) { *info = -7; } } @@ -259,60 +44,35 @@ f"> */ xerbla_((char *)"DLAED1", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - -/* The following values are integer pointers which indicate */ -/* the portion of the workspace */ -/* used by a particular array in DLAED2 and DLAED3. */ - iz = 1; idlmda = iz + *n; iw = idlmda + *n; iq2 = iw + *n; - indx = 1; indxc = indx + *n; coltyp = indxc + *n; indxp = coltyp + *n; - - -/* Form the z-vector which consists of the last row of Q_1 and the */ -/* first row of Q_2. */ - dcopy_(cutpnt, &q[*cutpnt + q_dim1], ldq, &work[iz], &c__1); zpp1 = *cutpnt + 1; i__1 = *n - *cutpnt; dcopy_(&i__1, &q[zpp1 + zpp1 * q_dim1], ldq, &work[iz + *cutpnt], &c__1); - -/* Deflate eigenvalues. */ - - dlaed2_(&k, n, cutpnt, &d__[1], &q[q_offset], ldq, &indxq[1], rho, &work[ - iz], &work[idlmda], &work[iw], &work[iq2], &iwork[indx], &iwork[ - indxc], &iwork[indxp], &iwork[coltyp], info); - + dlaed2_(&k, n, cutpnt, &d__[1], &q[q_offset], ldq, &indxq[1], rho, &work[iz], &work[idlmda], + &work[iw], &work[iq2], &iwork[indx], &iwork[indxc], &iwork[indxp], &iwork[coltyp], + info); if (*info != 0) { goto L20; } - -/* Solve Secular Equation. */ - if (k != 0) { - is = (iwork[coltyp] + iwork[coltyp + 1]) * *cutpnt + (iwork[coltyp + - 1] + iwork[coltyp + 2]) * (*n - *cutpnt) + iq2; - dlaed3_(&k, n, cutpnt, &d__[1], &q[q_offset], ldq, rho, &work[idlmda], - &work[iq2], &iwork[indxc], &iwork[coltyp], &work[iw], &work[ - is], info); + is = (iwork[coltyp] + iwork[coltyp + 1]) * *cutpnt + + (iwork[coltyp + 1] + iwork[coltyp + 2]) * (*n - *cutpnt) + iq2; + dlaed3_(&k, n, cutpnt, &d__[1], &q[q_offset], ldq, rho, &work[idlmda], &work[iq2], + &iwork[indxc], &iwork[coltyp], &work[iw], &work[is], info); if (*info != 0) { goto L20; } - -/* Prepare the INDXQ sorting permutation. */ - n1 = k; n2 = *n - k; dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); @@ -320,17 +80,11 @@ f"> */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { indxq[i__] = i__; -/* L10: */ } } - L20: return 0; - -/* End of DLAED1 */ - -} /* dlaed1_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaed2.cpp b/lib/linalg/dlaed2.cpp index c56d856171..4f0461bab9 100644 --- a/lib/linalg/dlaed2.cpp +++ b/lib/linalg/dlaed2.cpp @@ -1,301 +1,34 @@ -/* fortran/dlaed2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b3 = -1.; static integer c__1 = 1; - -/* > \brief \b DLAED2 used by DSTEDC. Merges eigenvalues and deflates secular equation. Used when the original - matrix is tridiagonal. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAED2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAED2( K, N, N1, D, Q, LDQ, INDXQ, RHO, Z, DLAMDA, W, */ -/* Q2, INDX, INDXC, INDXP, COLTYP, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDQ, N, N1 */ -/* DOUBLE PRECISION RHO */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER COLTYP( * ), INDX( * ), INDXC( * ), INDXP( * ), */ -/* $ INDXQ( * ) */ -/* DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), Q2( * ), */ -/* $ W( * ), Z( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAED2 merges the two sets of eigenvalues together into a single */ -/* > sorted set. Then it tries to deflate the size of the problem. */ -/* > There are two ways in which deflation can occur: when two or more */ -/* > eigenvalues are close together or if there is a tiny entry in the */ -/* > Z vector. For each such occurrence the order of the related secular */ -/* > equation problem is reduced by one. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[out] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of non-deflated eigenvalues, and the order of the */ -/* > related secular equation. 0 <= K <=N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N1 */ -/* > \verbatim */ -/* > N1 is INTEGER */ -/* > The location of the last eigenvalue in the leading sub-matrix. */ -/* > min(1,N) <= N1 <= N/2. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, D contains the eigenvalues of the two submatrices to */ -/* > be combined. */ -/* > On exit, D contains the trailing (N-K) updated eigenvalues */ -/* > (those which were deflated) sorted into increasing order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Q */ -/* > \verbatim */ -/* > Q is DOUBLE PRECISION array, dimension (LDQ, N) */ -/* > On entry, Q contains the eigenvectors of two submatrices in */ -/* > the two square blocks with corners at (1,1), (N1,N1) */ -/* > and (N1+1, N1+1), (N,N). */ -/* > On exit, Q contains the trailing (N-K) updated eigenvectors */ -/* > (those which were deflated) in its last N-K columns. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQ */ -/* > \verbatim */ -/* > LDQ is INTEGER */ -/* > The leading dimension of the array Q. LDQ >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] INDXQ */ -/* > \verbatim */ -/* > INDXQ is INTEGER array, dimension (N) */ -/* > The permutation which separately sorts the two sub-problems */ -/* > in D into ascending order. Note that elements in the second */ -/* > half of this permutation must first have N1 added to their */ -/* > values. Destroyed on exit. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > On entry, the off-diagonal element associated with the rank-1 */ -/* > cut which originally split the two submatrices which are now */ -/* > being recombined. */ -/* > On exit, RHO has been modified to the value required by */ -/* > DLAED3. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, Z contains the updating vector (the last */ -/* > row of the first sub-eigenvector matrix and the first row of */ -/* > the second sub-eigenvector matrix). */ -/* > On exit, the contents of Z have been destroyed by the updating */ -/* > process. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DLAMDA */ -/* > \verbatim */ -/* > DLAMDA is DOUBLE PRECISION array, dimension (N) */ -/* > A copy of the first K eigenvalues which will be used by */ -/* > DLAED3 to form the secular equation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] W */ -/* > \verbatim */ -/* > W is DOUBLE PRECISION array, dimension (N) */ -/* > The first k values of the final deflation-altered z-vector */ -/* > which will be passed to DLAED3. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] Q2 */ -/* > \verbatim */ -/* > Q2 is DOUBLE PRECISION array, dimension (N1**2+(N-N1)**2) */ -/* > A copy of the first K eigenvectors which will be used by */ -/* > DLAED3 in a matrix multiply (DGEMM) to solve for the new */ -/* > eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INDX */ -/* > \verbatim */ -/* > INDX is INTEGER array, dimension (N) */ -/* > The permutation used to sort the contents of DLAMDA into */ -/* > ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INDXC */ -/* > \verbatim */ -/* > INDXC is INTEGER array, dimension (N) */ -/* > The permutation used to arrange the columns of the deflated */ -/* > Q matrix into three groups: the first group contains non-zero */ -/* > elements only at and above N1, the second contains */ -/* > non-zero elements only below N1, and the third is dense. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INDXP */ -/* > \verbatim */ -/* > INDXP is INTEGER array, dimension (N) */ -/* > The permutation used to place deflated values of D at the end */ -/* > of the array. INDXP(1:K) points to the nondeflated D-values */ -/* > and INDXP(K+1:N) points to the deflated eigenvalues. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] COLTYP */ -/* > \verbatim */ -/* > COLTYP is INTEGER array, dimension (N) */ -/* > During execution, a label which will indicate which of the */ -/* > following types a column in the Q2 matrix is: */ -/* > 1 : non-zero in the upper half only; */ -/* > 2 : dense; */ -/* > 3 : non-zero in the lower half only; */ -/* > 4 : deflated. */ -/* > On exit, COLTYP(i) is the number of columns of type i, */ -/* > for i=1 to 4 only. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Jeff Rutter, Computer Science Division, University of California */ -/* > at Berkeley, USA \n */ -/* > Modified by Francoise Tisseur, University of Tennessee */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlaed2_(integer *k, integer *n, integer *n1, doublereal * - d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, - doublereal *z__, doublereal *dlamda, doublereal *w, doublereal *q2, - integer *indx, integer *indxc, integer *indxp, integer *coltyp, - integer *info) +int dlaed2_(integer *k, integer *n, integer *n1, doublereal *d__, doublereal *q, integer *ldq, + integer *indxq, doublereal *rho, doublereal *z__, doublereal *dlamda, doublereal *w, + doublereal *q2, integer *indx, integer *indxc, integer *indxp, integer *coltyp, + integer *info) { - /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; doublereal d__1, d__2, d__3, d__4; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal c__; integer i__, j; doublereal s, t; integer k2, n2, ct, nj, pj, js, iq1, iq2, n1p1; doublereal eps, tau, tol; integer psm[4], imax, jmax; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *); + extern int drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *); integer ctot[4]; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dcopy_(integer *, doublereal *, integer *, doublereal - *, integer *); - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern int dscal_(integer *, doublereal *, doublereal *, integer *), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), dlacpy_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - ftnlen), xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Arrays .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen); --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; @@ -309,18 +42,14 @@ f"> */ --indxc; --indxp; --coltyp; - - /* Function Body */ *info = 0; - if (*n < 0) { *info = -2; - } else if (*ldq < max(1,*n)) { + } else if (*ldq < max(1, *n)) { *info = -6; - } else /* if(complicated condition) */ { -/* Computing MIN */ + } else { i__1 = 1, i__2 = *n / 2; - if (min(i__1,i__2) > *n1 || *n / 2 < *n1) { + if (min(i__1, i__2) > *n1 || *n / 2 < *n1) { *info = -3; } } @@ -329,66 +58,35 @@ f"> */ xerbla_((char *)"DLAED2", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - n2 = *n - *n1; n1p1 = *n1 + 1; - if (*rho < 0.) { dscal_(&n2, &c_b3, &z__[n1p1], &c__1); } - -/* Normalize z so that norm(z) = 1. Since z is the concatenation of */ -/* two normalized vectors, norm2(z) = sqrt(2). */ - t = 1. / sqrt(2.); dscal_(n, &t, &z__[1], &c__1); - -/* RHO = ABS( norm(z)**2 * RHO ) */ - *rho = (d__1 = *rho * 2., abs(d__1)); - -/* Sort the eigenvalues into increasing order */ - i__1 = *n; for (i__ = n1p1; i__ <= i__1; ++i__) { indxq[i__] += *n1; -/* L10: */ } - -/* re-integrate the deflated parts from the last pass */ - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dlamda[i__] = d__[indxq[i__]]; -/* L20: */ } dlamrg_(n1, &n2, &dlamda[1], &c__1, &c__1, &indxc[1]); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { indx[i__] = indxq[indxc[i__]]; -/* L30: */ } - -/* Calculate the allowable deflation tolerance */ - imax = idamax_(n, &z__[1], &c__1); jmax = idamax_(n, &d__[1], &c__1); eps = dlamch_((char *)"Epsilon", (ftnlen)7); -/* Computing MAX */ - d__3 = (d__1 = d__[jmax], abs(d__1)), d__4 = (d__2 = z__[imax], abs(d__2)) - ; - tol = eps * 8. * max(d__3,d__4); - -/* If the rank-1 modifier is small enough, no more needs to be done */ -/* except to reorganize Q so that its columns correspond with the */ -/* elements in D. */ - + d__3 = (d__1 = d__[jmax], abs(d__1)), d__4 = (d__2 = z__[imax], abs(d__2)); + tol = eps * 8. * max(d__3, d__4); if (*rho * (d__1 = z__[imax], abs(d__1)) <= tol) { *k = 0; iq2 = 1; @@ -398,40 +96,25 @@ f"> */ dcopy_(n, &q[i__ * q_dim1 + 1], &c__1, &q2[iq2], &c__1); dlamda[j] = d__[i__]; iq2 += *n; -/* L40: */ } dlacpy_((char *)"A", n, n, &q2[1], n, &q[q_offset], ldq, (ftnlen)1); dcopy_(n, &dlamda[1], &c__1, &d__[1], &c__1); goto L190; } - -/* If there are multiple eigenvalues then the problem deflates. Here */ -/* the number of equal eigenvalues are found. As each equal */ -/* eigenvalue is found, an elementary reflector is computed to rotate */ -/* the corresponding eigensubspace so that the corresponding */ -/* components of Z are zero in this new basis. */ - i__1 = *n1; for (i__ = 1; i__ <= i__1; ++i__) { coltyp[i__] = 1; -/* L50: */ } i__1 = *n; for (i__ = n1p1; i__ <= i__1; ++i__) { coltyp[i__] = 3; -/* L60: */ } - - *k = 0; k2 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { nj = indx[j]; if (*rho * (d__1 = z__[nj], abs(d__1)) <= tol) { - -/* Deflate due to small z component. */ - --k2; coltyp[nj] = 4; indxp[k2] = nj; @@ -442,7 +125,6 @@ f"> */ pj = nj; goto L80; } -/* L70: */ } L80: ++j; @@ -451,52 +133,34 @@ L80: goto L100; } if (*rho * (d__1 = z__[nj], abs(d__1)) <= tol) { - -/* Deflate due to small z component. */ - --k2; coltyp[nj] = 4; indxp[k2] = nj; } else { - -/* Check if eigenvalues are close enough to allow deflation. */ - s = z__[pj]; c__ = z__[nj]; - -/* Find sqrt(a**2+b**2) without overflow or */ -/* destructive underflow. */ - tau = dlapy2_(&c__, &s); t = d__[nj] - d__[pj]; c__ /= tau; s = -s / tau; if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { - -/* Deflation is possible. */ - z__[nj] = tau; z__[pj] = 0.; if (coltyp[nj] != coltyp[pj]) { coltyp[nj] = 2; } coltyp[pj] = 4; - drot_(n, &q[pj * q_dim1 + 1], &c__1, &q[nj * q_dim1 + 1], &c__1, & - c__, &s); -/* Computing 2nd power */ + drot_(n, &q[pj * q_dim1 + 1], &c__1, &q[nj * q_dim1 + 1], &c__1, &c__, &s); d__1 = c__; -/* Computing 2nd power */ d__2 = s; t = d__[pj] * (d__1 * d__1) + d__[nj] * (d__2 * d__2); -/* Computing 2nd power */ d__1 = s; -/* Computing 2nd power */ d__2 = c__; d__[nj] = d__[pj] * (d__1 * d__1) + d__[nj] * (d__2 * d__2); d__[pj] = t; --k2; i__ = 1; -L90: + L90: if (k2 + i__ <= *n) { if (d__[pj] < d__[indxp[k2 + i__]]) { indxp[k2 + i__ - 1] = indxp[k2 + i__]; @@ -520,42 +184,23 @@ L90: } goto L80; L100: - -/* Record the last eigenvalue. */ - ++(*k); dlamda[*k] = d__[pj]; w[*k] = z__[pj]; indxp[*k] = pj; - -/* Count up the total number of the various types of columns, then */ -/* form a permutation which positions the four column types into */ -/* four uniform groups (although one or more of these groups may be */ -/* empty). */ - for (j = 1; j <= 4; ++j) { ctot[j - 1] = 0; -/* L110: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { ct = coltyp[j]; ++ctot[ct - 1]; -/* L120: */ } - -/* PSM(*) = Position in SubMatrix (of types 1 through 4) */ - psm[0] = 1; psm[1] = ctot[0] + 1; psm[2] = psm[1] + ctot[1]; psm[3] = psm[2] + ctot[2]; *k = *n - ctot[3]; - -/* Fill out the INDXC array so that the permutation which it induces */ -/* will place all type-1 columns first, all type-2 columns next, */ -/* then all type-3's, and finally all type-4's. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { js = indxp[j]; @@ -563,14 +208,7 @@ L100: indx[psm[ct - 1]] = js; indxc[psm[ct - 1]] = j; ++psm[ct - 1]; -/* L130: */ } - -/* Sort the eigenvalues and corresponding eigenvectors into DLAMDA */ -/* and Q2 respectively. The eigenvalues/vectors which were not */ -/* deflated go into the first K slots of DLAMDA and Q2 respectively, */ -/* while those which were deflated go into the last N - K slots. */ - i__ = 1; iq1 = 1; iq2 = (ctot[0] + ctot[1]) * *n1 + 1; @@ -581,9 +219,7 @@ L100: z__[i__] = d__[js]; ++i__; iq1 += *n1; -/* L140: */ } - i__1 = ctot[1]; for (j = 1; j <= i__1; ++j) { js = indx[i__]; @@ -593,9 +229,7 @@ L100: ++i__; iq1 += *n1; iq2 += n2; -/* L150: */ } - i__1 = ctot[2]; for (j = 1; j <= i__1; ++j) { js = indx[i__]; @@ -603,9 +237,7 @@ L100: z__[i__] = d__[js]; ++i__; iq2 += n2; -/* L160: */ } - iq1 = iq2; i__1 = ctot[3]; for (j = 1; j <= i__1; ++j) { @@ -614,33 +246,18 @@ L100: iq2 += *n; z__[i__] = d__[js]; ++i__; -/* L170: */ } - -/* The deflated eigenvalues and their corresponding vectors go back */ -/* into the last N - K slots of D and Q respectively. */ - if (*k < *n) { - dlacpy_((char *)"A", n, &ctot[3], &q2[iq1], n, &q[(*k + 1) * q_dim1 + 1], ldq, - (ftnlen)1); + dlacpy_((char *)"A", n, &ctot[3], &q2[iq1], n, &q[(*k + 1) * q_dim1 + 1], ldq, (ftnlen)1); i__1 = *n - *k; dcopy_(&i__1, &z__[*k + 1], &c__1, &d__[*k + 1], &c__1); } - -/* Copy CTOT into COLTYP for referencing in DLAED3. */ - for (j = 1; j <= 4; ++j) { coltyp[j] = ctot[j - 1]; -/* L180: */ } - L190: return 0; - -/* End of DLAED2 */ - -} /* dlaed2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaed3.cpp b/lib/linalg/dlaed3.cpp index 5c7d2a8596..926b0ecd7a 100644 --- a/lib/linalg/dlaed3.cpp +++ b/lib/linalg/dlaed3.cpp @@ -1,268 +1,32 @@ -/* fortran/dlaed3.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static doublereal c_b22 = 1.; static doublereal c_b23 = 0.; - -/* > \brief \b DLAED3 used by DSTEDC. Finds the roots of the secular equation and updates the eigenvectors. Us -ed when the original matrix is tridiagonal. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAED3 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAED3( K, N, N1, D, Q, LDQ, RHO, DLAMDA, Q2, INDX, */ -/* CTOT, W, S, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDQ, N, N1 */ -/* DOUBLE PRECISION RHO */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER CTOT( * ), INDX( * ) */ -/* DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), Q2( * ), */ -/* $ S( * ), W( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAED3 finds the roots of the secular equation, as defined by the */ -/* > values in D, W, and RHO, between 1 and K. It makes the */ -/* > appropriate calls to DLAED4 and then updates the eigenvectors by */ -/* > multiplying the matrix of eigenvectors of the pair of eigensystems */ -/* > being combined by the matrix of eigenvectors of the K-by-K system */ -/* > which is solved here. */ -/* > */ -/* > This code makes very mild assumptions about floating point */ -/* > arithmetic. It will work on machines with a guard digit in */ -/* > add/subtract, or on those binary machines without guard digits */ -/* > which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. */ -/* > It could conceivably fail on hexadecimal or decimal machines */ -/* > without guard digits, but we know of none. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of terms in the rational function to be solved by */ -/* > DLAED4. K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of rows and columns in the Q matrix. */ -/* > N >= K (deflation may result in N>K). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N1 */ -/* > \verbatim */ -/* > N1 is INTEGER */ -/* > The location of the last eigenvalue in the leading submatrix. */ -/* > min(1,N) <= N1 <= N/2. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > D(I) contains the updated eigenvalues for */ -/* > 1 <= I <= K. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] Q */ -/* > \verbatim */ -/* > Q is DOUBLE PRECISION array, dimension (LDQ,N) */ -/* > Initially the first K columns are used as workspace. */ -/* > On output the columns 1 to K contain */ -/* > the updated eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQ */ -/* > \verbatim */ -/* > LDQ is INTEGER */ -/* > The leading dimension of the array Q. LDQ >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > The value of the parameter in the rank one update equation. */ -/* > RHO >= 0 required. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DLAMDA */ -/* > \verbatim */ -/* > DLAMDA is DOUBLE PRECISION array, dimension (K) */ -/* > The first K elements of this array contain the old roots */ -/* > of the deflated updating problem. These are the poles */ -/* > of the secular equation. May be changed on output by */ -/* > having lowest order bit set to zero on Cray X-MP, Cray Y-MP, */ -/* > Cray-2, or Cray C-90, as described above. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Q2 */ -/* > \verbatim */ -/* > Q2 is DOUBLE PRECISION array, dimension (LDQ2*N) */ -/* > The first K columns of this matrix contain the non-deflated */ -/* > eigenvectors for the split problem. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INDX */ -/* > \verbatim */ -/* > INDX is INTEGER array, dimension (N) */ -/* > The permutation used to arrange the columns of the deflated */ -/* > Q matrix into three groups (see DLAED2). */ -/* > The rows of the eigenvectors found by DLAED4 must be likewise */ -/* > permuted before the matrix multiply can take place. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CTOT */ -/* > \verbatim */ -/* > CTOT is INTEGER array, dimension (4) */ -/* > A count of the total number of the various types of columns */ -/* > in Q, as described in INDX. The fourth column type is any */ -/* > column which has been deflated. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] W */ -/* > \verbatim */ -/* > W is DOUBLE PRECISION array, dimension (K) */ -/* > The first K elements of this array contain the components */ -/* > of the deflation-adjusted updating vector. Destroyed on */ -/* > output. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION array, dimension (N1 + 1)*K */ -/* > Will contain the eigenvectors of the repaired matrix which */ -/* > will be multiplied by the previously accumulated eigenvectors */ -/* > to update the system. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: if INFO = 1, an eigenvalue did not converge */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Jeff Rutter, Computer Science Division, University of California */ -/* > at Berkeley, USA \n */ -/* > Modified by Francoise Tisseur, University of Tennessee */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlaed3_(integer *k, integer *n, integer *n1, doublereal * - d__, doublereal *q, integer *ldq, doublereal *rho, doublereal *dlamda, - doublereal *q2, integer *indx, integer *ctot, doublereal *w, - doublereal *s, integer *info) +int dlaed3_(integer *k, integer *n, integer *n1, doublereal *d__, doublereal *q, integer *ldq, + doublereal *rho, doublereal *dlamda, doublereal *q2, integer *indx, integer *ctot, + doublereal *w, doublereal *s, integer *info) { - /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); - - /* Local variables */ integer i__, j, n2, n12, ii, n23, iq2; doublereal temp; extern doublereal dnrm2_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), - dcopy_(integer *, doublereal *, integer *, doublereal *, integer - *), dlaed4_(integer *, integer *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, integer *); + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), + dlaed4_(integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *); extern doublereal dlamc3_(doublereal *, doublereal *); - extern /* Subroutine */ int dlacpy_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen), - dlaset_(char *, integer *, integer *, doublereal *, doublereal *, - doublereal *, integer *, ftnlen), xerbla_(char *, integer *, - ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen); --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; @@ -273,15 +37,12 @@ f"> */ --ctot; --w; --s; - - /* Function Body */ *info = 0; - if (*k < 0) { *info = -1; } else if (*n < *k) { *info = -2; - } else if (*ldq < max(1,*n)) { + } else if (*ldq < max(1, *n)) { *info = -6; } if (*info != 0) { @@ -289,49 +50,20 @@ f"> */ xerbla_((char *)"DLAED3", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*k == 0) { return 0; } - -/* Modify values DLAMDA(i) to make sure all DLAMDA(i)-DLAMDA(j) can */ -/* be computed with high relative accuracy (barring over/underflow). */ -/* This is a problem on machines without a guard digit in */ -/* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). */ -/* The following code replaces DLAMDA(I) by 2*DLAMDA(I)-DLAMDA(I), */ -/* which on any of these machines zeros out the bottommost */ -/* bit of DLAMDA(I) if it is 1; this makes the subsequent */ -/* subtractions DLAMDA(I)-DLAMDA(J) unproblematic when cancellation */ -/* occurs. On binary machines with a guard digit (almost all */ -/* machines) it does not change DLAMDA(I) at all. On hexadecimal */ -/* and decimal machines with a guard digit, it slightly */ -/* changes the bottommost bits of DLAMDA(I). It does not account */ -/* for hexadecimal or decimal machines without guard digits */ -/* (we know of none). We use a subroutine call to compute */ -/* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating */ -/* this code. */ - i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { dlamda[i__] = dlamc3_(&dlamda[i__], &dlamda[i__]) - dlamda[i__]; -/* L10: */ } - i__1 = *k; for (j = 1; j <= i__1; ++j) { - dlaed4_(k, &j, &dlamda[1], &w[1], &q[j * q_dim1 + 1], rho, &d__[j], - info); - -/* If the zero finder fails, the computation is terminated. */ - + dlaed4_(k, &j, &dlamda[1], &w[1], &q[j * q_dim1 + 1], rho, &d__[j], info); if (*info != 0) { goto L120; } -/* L20: */ } - if (*k == 1) { goto L110; } @@ -344,17 +76,10 @@ f"> */ q[j * q_dim1 + 1] = w[ii]; ii = indx[2]; q[j * q_dim1 + 2] = w[ii]; -/* L30: */ } goto L110; } - -/* Compute updated W. */ - dcopy_(k, &w[1], &c__1, &s[1], &c__1); - -/* Initialize W(I) = Q(I,I) */ - i__1 = *ldq + 1; dcopy_(k, &q[q_offset], &i__1, &w[1], &c__1); i__1 = *k; @@ -362,76 +87,52 @@ f"> */ i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); -/* L40: */ } i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); -/* L50: */ } -/* L60: */ } i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { d__1 = sqrt(-w[i__]); w[i__] = d_lmp_sign(&d__1, &s[i__]); -/* L70: */ } - -/* Compute eigenvectors of the modified rank-1 modification. */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *k; for (i__ = 1; i__ <= i__2; ++i__) { s[i__] = w[i__] / q[i__ + j * q_dim1]; -/* L80: */ } temp = dnrm2_(k, &s[1], &c__1); i__2 = *k; for (i__ = 1; i__ <= i__2; ++i__) { ii = indx[i__]; q[i__ + j * q_dim1] = s[ii] / temp; -/* L90: */ } -/* L100: */ } - -/* Compute the updated eigenvectors. */ - L110: - n2 = *n - *n1; n12 = ctot[1] + ctot[2]; n23 = ctot[2] + ctot[3]; - - dlacpy_((char *)"A", &n23, k, &q[ctot[1] + 1 + q_dim1], ldq, &s[1], &n23, (ftnlen) - 1); + dlacpy_((char *)"A", &n23, k, &q[ctot[1] + 1 + q_dim1], ldq, &s[1], &n23, (ftnlen)1); iq2 = *n1 * n12 + 1; if (n23 != 0) { - dgemm_((char *)"N", (char *)"N", &n2, k, &n23, &c_b22, &q2[iq2], &n2, &s[1], &n23, & - c_b23, &q[*n1 + 1 + q_dim1], ldq, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", &n2, k, &n23, &c_b22, &q2[iq2], &n2, &s[1], &n23, &c_b23, + &q[*n1 + 1 + q_dim1], ldq, (ftnlen)1, (ftnlen)1); } else { - dlaset_((char *)"A", &n2, k, &c_b23, &c_b23, &q[*n1 + 1 + q_dim1], ldq, ( - ftnlen)1); + dlaset_((char *)"A", &n2, k, &c_b23, &c_b23, &q[*n1 + 1 + q_dim1], ldq, (ftnlen)1); } - dlacpy_((char *)"A", &n12, k, &q[q_offset], ldq, &s[1], &n12, (ftnlen)1); if (n12 != 0) { - dgemm_((char *)"N", (char *)"N", n1, k, &n12, &c_b22, &q2[1], n1, &s[1], &n12, &c_b23, - &q[q_offset], ldq, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", n1, k, &n12, &c_b22, &q2[1], n1, &s[1], &n12, &c_b23, &q[q_offset], ldq, + (ftnlen)1, (ftnlen)1); } else { dlaset_((char *)"A", n1, k, &c_b23, &c_b23, &q[q_dim1 + 1], ldq, (ftnlen)1); } - - L120: return 0; - -/* End of DLAED3 */ - -} /* dlaed3_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaed4.cpp b/lib/linalg/dlaed4.cpp index ca532571dd..9bc4f35caf 100644 --- a/lib/linalg/dlaed4.cpp +++ b/lib/linalg/dlaed4.cpp @@ -1,178 +1,13 @@ -/* fortran/dlaed4.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLAED4 used by DSTEDC. Finds a single root of the secular equation. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAED4 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAED4( N, I, D, Z, DELTA, RHO, DLAM, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER I, INFO, N */ -/* DOUBLE PRECISION DLAM, RHO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( * ), DELTA( * ), Z( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > This subroutine computes the I-th updated eigenvalue of a symmetric */ -/* > rank-one modification to a diagonal matrix whose elements are */ -/* > given in the array d, and that */ -/* > */ -/* > D(i) < D(j) for i < j */ -/* > */ -/* > and that RHO > 0. This is arranged by the calling routine, and is */ -/* > no loss in generality. The rank-one modified system is thus */ -/* > */ -/* > diag( D ) + RHO * Z * Z_transpose. */ -/* > */ -/* > where we assume the Euclidean norm of Z is 1. */ -/* > */ -/* > The method consists of approximating the rational functions in the */ -/* > secular equation by simpler interpolating rational functions. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The length of all arrays. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] I */ -/* > \verbatim */ -/* > I is INTEGER */ -/* > The index of the eigenvalue to be computed. 1 <= I <= N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > The original eigenvalues. It is assumed that they are in */ -/* > order, D(I) < D(J) for I < J. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension (N) */ -/* > The components of the updating vector. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DELTA */ -/* > \verbatim */ -/* > DELTA is DOUBLE PRECISION array, dimension (N) */ -/* > If N > 2, DELTA contains (D(j) - lambda_I) in its j-th */ -/* > component. If N = 1, then DELTA(1) = 1. If N = 2, see DLAED5 */ -/* > for detail. The vector DELTA contains the information necessary */ -/* > to construct the eigenvectors by DLAED3 and DLAED9. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > The scalar in the symmetric updating formula. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DLAM */ -/* > \verbatim */ -/* > DLAM is DOUBLE PRECISION */ -/* > The computed lambda_I, the I-th updated eigenvalue. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > > 0: if INFO = 1, the updating process failed. */ -/* > \endverbatim */ - -/* > \par Internal Parameters: */ -/* ========================= */ -/* > */ -/* > \verbatim */ -/* > Logical variable ORGATI (origin-at-i?) is used for distinguishing */ -/* > whether D(i) or D(i+1) is treated as the origin. */ -/* > */ -/* > ORGATI = .true. origin at i */ -/* > ORGATI = .false. origin at i+1 */ -/* > */ -/* > Logical variable SWTCH3 (switch-for-3-poles?) is for noting */ -/* > if we are working with THREE poles! */ -/* > */ -/* > MAXIT is the maximum number of iterations allowed for each */ -/* > eigenvalue. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ren-Cang Li, Computer Science Division, University of California */ -/* > at Berkeley, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlaed4_(integer *n, integer *i__, doublereal *d__, - doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam, - integer *info) +int dlaed4_(integer *n, integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, + doublereal *rho, doublereal *dlam, integer *info) { - /* System generated locals */ integer i__1; doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal a, b, c__; integer j; doublereal w; @@ -186,57 +21,19 @@ f"> */ doublereal temp, prew, temp1, dltlb, dltub, midpt; integer niter; logical swtch; - extern /* Subroutine */ int dlaed5_(integer *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *), dlaed6_(integer *, - logical *, doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *); + extern int dlaed5_(integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *), + dlaed6_(integer *, logical *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *); logical swtch3; extern doublereal dlamch_(char *, ftnlen); logical orgati; doublereal erretm, rhoinv; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Local Arrays .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Since this routine is called in an inner loop, we do no argument */ -/* checking. */ - -/* Quick return for N=1 and 2. */ - - /* Parameter adjustments */ --delta; --z__; --d__; - - /* Function Body */ *info = 0; if (*n == 1) { - -/* Presumably, I=1 upon entry */ - *dlam = d__[1] + *rho * z__[1] * z__[1]; delta[1] = 1.; return 0; @@ -245,54 +42,31 @@ f"> */ dlaed5_(i__, &d__[1], &z__[1], &delta[1], rho, dlam); return 0; } - -/* Compute machine epsilon */ - eps = dlamch_((char *)"Epsilon", (ftnlen)7); rhoinv = 1. / *rho; - -/* The case I = N */ - if (*i__ == *n) { - -/* Initialize some basic variables */ - ii = *n - 1; niter = 1; - -/* Calculate initial guess */ - midpt = *rho / 2.; - -/* If ||Z||_2 is not one, then TEMP should be set to */ -/* RHO * ||Z||_2^2 / TWO */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] = d__[j] - d__[*i__] - midpt; -/* L10: */ } - psi = 0.; i__1 = *n - 2; for (j = 1; j <= i__1; ++j) { psi += z__[j] * z__[j] / delta[j]; -/* L20: */ } - c__ = rhoinv + psi; - w = c__ + z__[ii] * z__[ii] / delta[ii] + z__[*n] * z__[*n] / delta[* - n]; - + w = c__ + z__[ii] * z__[ii] / delta[ii] + z__[*n] * z__[*n] / delta[*n]; if (w <= 0.) { - temp = z__[*n - 1] * z__[*n - 1] / (d__[*n] - d__[*n - 1] + *rho) - + z__[*n] * z__[*n] / *rho; + temp = z__[*n - 1] * z__[*n - 1] / (d__[*n] - d__[*n - 1] + *rho) + + z__[*n] * z__[*n] / *rho; if (c__ <= temp) { tau = *rho; } else { del = d__[*n] - d__[*n - 1]; - a = -c__ * del + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n] - ; + a = -c__ * del + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n]; b = z__[*n] * z__[*n] * del; if (a < 0.) { tau = b * 2. / (sqrt(a * a + b * 4. * c__) - a); @@ -300,10 +74,6 @@ f"> */ tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); } } - -/* It can be proved that */ -/* D(N)+RHO/2 <= LAMBDA(N) < D(N)+TAU <= D(N)+RHO */ - dltlb = midpt; dltub = *rho; } else { @@ -315,22 +85,13 @@ f"> */ } else { tau = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); } - -/* It can be proved that */ -/* D(N) < D(N)+TAU < LAMBDA(N) < D(N)+RHO/2 */ - dltlb = 0.; dltub = midpt; } - i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] = d__[j] - d__[*i__] - tau; -/* L30: */ } - -/* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; psi = 0.; erretm = 0.; @@ -340,64 +101,36 @@ f"> */ psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; -/* L40: */ } erretm = abs(erretm); - -/* Evaluate PHI and the derivative DPHI */ - temp = z__[*n] / delta[*n]; phi = z__[*n] * temp; dphi = temp * temp; - erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi - + dphi); - + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi + dphi); w = rhoinv + phi + psi; - -/* Test for convergence */ - if (abs(w) <= eps * erretm) { *dlam = d__[*i__] + tau; goto L250; } - if (w <= 0.) { - dltlb = max(dltlb,tau); + dltlb = max(dltlb, tau); } else { - dltub = min(dltub,tau); + dltub = min(dltub, tau); } - -/* Calculate the new step */ - ++niter; c__ = w - delta[*n - 1] * dpsi - delta[*n] * dphi; - a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * ( - dpsi + dphi); + a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * (dpsi + dphi); b = delta[*n - 1] * delta[*n] * w; if (c__ < 0.) { c__ = abs(c__); } if (c__ == 0.) { -/* ETA = B/A */ -/* ETA = RHO - TAU */ -/* ETA = DLTUB - TAU */ - -/* Update proposed by Li, Ren-Cang: */ eta = -w / (dpsi + dphi); } else if (a >= 0.) { - eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ - * 2.); + eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { - eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) - ); + eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } - -/* Note, eta should be positive if w is negative, and */ -/* eta should be negative otherwise. However, */ -/* if for some reason caused by roundoff, eta*w > 0, */ -/* we simply use one Newton step instead. This way */ -/* will guarantee eta*w < 0. */ - if (w * eta > 0.) { eta = -w / (dpsi + dphi); } @@ -412,13 +145,8 @@ f"> */ i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] -= eta; -/* L50: */ } - tau += eta; - -/* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; psi = 0.; erretm = 0.; @@ -428,59 +156,32 @@ f"> */ psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; -/* L60: */ } erretm = abs(erretm); - -/* Evaluate PHI and the derivative DPHI */ - temp = z__[*n] / delta[*n]; phi = z__[*n] * temp; dphi = temp * temp; - erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi - + dphi); - + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi + dphi); w = rhoinv + phi + psi; - -/* Main loop to update the values of the array DELTA */ - iter = niter + 1; - for (niter = iter; niter <= 30; ++niter) { - -/* Test for convergence */ - if (abs(w) <= eps * erretm) { *dlam = d__[*i__] + tau; goto L250; } - if (w <= 0.) { - dltlb = max(dltlb,tau); + dltlb = max(dltlb, tau); } else { - dltub = min(dltub,tau); + dltub = min(dltub, tau); } - -/* Calculate the new step */ - c__ = w - delta[*n - 1] * dpsi - delta[*n] * dphi; - a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * - (dpsi + dphi); + a = (delta[*n - 1] + delta[*n]) * w - delta[*n - 1] * delta[*n] * (dpsi + dphi); b = delta[*n - 1] * delta[*n] * w; if (a >= 0.) { - eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( - c__ * 2.); + eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { - eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))); + eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } - -/* Note, eta should be positive if w is negative, and */ -/* eta should be negative otherwise. However, */ -/* if for some reason caused by roundoff, eta*w > 0, */ -/* we simply use one Newton step instead. This way */ -/* will guarantee eta*w < 0. */ - if (w * eta > 0.) { eta = -w / (dpsi + dphi); } @@ -495,13 +196,8 @@ f"> */ i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] -= eta; -/* L70: */ } - tau += eta; - -/* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; psi = 0.; erretm = 0.; @@ -511,113 +207,70 @@ f"> */ psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; -/* L80: */ } erretm = abs(erretm); - -/* Evaluate PHI and the derivative DPHI */ - temp = z__[*n] / delta[*n]; phi = z__[*n] * temp; dphi = temp * temp; - erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * ( - dpsi + dphi); - + erretm = (-phi - psi) * 8. + erretm - phi + rhoinv + abs(tau) * (dpsi + dphi); w = rhoinv + phi + psi; -/* L90: */ } - -/* Return with INFO = 1, NITER = MAXIT and not converged */ - *info = 1; *dlam = d__[*i__] + tau; goto L250; - -/* End for the case I = N */ - } else { - -/* The case for I < N */ - niter = 1; ip1 = *i__ + 1; - -/* Calculate initial guess */ - del = d__[ip1] - d__[*i__]; midpt = del / 2.; i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] = d__[j] - d__[*i__] - midpt; -/* L100: */ } - psi = 0.; i__1 = *i__ - 1; for (j = 1; j <= i__1; ++j) { psi += z__[j] * z__[j] / delta[j]; -/* L110: */ } - phi = 0.; i__1 = *i__ + 2; for (j = *n; j >= i__1; --j) { phi += z__[j] * z__[j] / delta[j]; -/* L120: */ } c__ = rhoinv + psi + phi; - w = c__ + z__[*i__] * z__[*i__] / delta[*i__] + z__[ip1] * z__[ip1] / - delta[ip1]; - + w = c__ + z__[*i__] * z__[*i__] / delta[*i__] + z__[ip1] * z__[ip1] / delta[ip1]; if (w > 0.) { - -/* d(i)< the ith eigenvalue < (d(i)+d(i+1))/2 */ - -/* We choose d(i) as origin. */ - orgati = TRUE_; a = c__ * del + z__[*i__] * z__[*i__] + z__[ip1] * z__[ip1]; b = z__[*i__] * z__[*i__] * del; if (a > 0.) { - tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))); + tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } else { - tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( - c__ * 2.); + tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } dltlb = 0.; dltub = midpt; } else { - -/* (d(i)+d(i+1))/2 <= the ith eigenvalue < d(i+1) */ - -/* We choose d(i+1) as origin. */ - orgati = FALSE_; a = c__ * del - z__[*i__] * z__[*i__] - z__[ip1] * z__[ip1]; b = z__[ip1] * z__[ip1] * del; if (a < 0.) { - tau = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs( - d__1)))); + tau = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))); } else { - tau = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / - (c__ * 2.); + tau = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / (c__ * 2.); } dltlb = -midpt; dltub = 0.; } - if (orgati) { i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] = d__[j] - d__[*i__] - tau; -/* L130: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] = d__[j] - d__[ip1] - tau; -/* L140: */ } } if (orgati) { @@ -627,9 +280,6 @@ f"> */ } iim1 = ii - 1; iip1 = ii + 1; - -/* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; psi = 0.; erretm = 0.; @@ -639,12 +289,8 @@ f"> */ psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; -/* L150: */ } erretm = abs(erretm); - -/* Evaluate PHI and the derivative DPHI */ - dphi = 0.; phi = 0.; i__1 = iip1; @@ -653,14 +299,8 @@ f"> */ phi += z__[j] * temp; dphi += temp * temp; erretm += phi; -/* L160: */ } - w = rhoinv + phi + psi; - -/* W is the value of the secular function with */ -/* its ii-th element removed. */ - swtch3 = FALSE_; if (orgati) { if (w < 0.) { @@ -674,16 +314,11 @@ f"> */ if (ii == 1 || ii == *n) { swtch3 = FALSE_; } - temp = z__[ii] / delta[ii]; dw = dpsi + dphi + temp * temp; temp = z__[ii] * temp; w += temp; - erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + - abs(tau) * dw; - -/* Test for convergence */ - + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + abs(tau) * dw; if (abs(w) <= eps * erretm) { if (orgati) { *dlam = d__[*i__] + tau; @@ -692,66 +327,48 @@ f"> */ } goto L250; } - if (w <= 0.) { - dltlb = max(dltlb,tau); + dltlb = max(dltlb, tau); } else { - dltub = min(dltub,tau); + dltub = min(dltub, tau); } - -/* Calculate the new step */ - ++niter; - if (! swtch3) { + if (!swtch3) { if (orgati) { -/* Computing 2nd power */ d__1 = z__[*i__] / delta[*i__]; - c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * (d__1 * - d__1); + c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * (d__1 * d__1); } else { -/* Computing 2nd power */ d__1 = z__[ip1] / delta[ip1]; - c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * (d__1 * - d__1); + c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * (d__1 * d__1); } - a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] * - dw; + a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] * dw; b = delta[*i__] * delta[ip1] * w; if (c__ == 0.) { if (a == 0.) { if (orgati) { - a = z__[*i__] * z__[*i__] + delta[ip1] * delta[ip1] * - (dpsi + dphi); + a = z__[*i__] * z__[*i__] + delta[ip1] * delta[ip1] * (dpsi + dphi); } else { - a = z__[ip1] * z__[ip1] + delta[*i__] * delta[*i__] * - (dpsi + dphi); + a = z__[ip1] * z__[ip1] + delta[*i__] * delta[*i__] * (dpsi + dphi); } } eta = b / a; } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( - c__ * 2.); + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))); + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } } else { - -/* Interpolation using THREE most relevant poles */ - temp = rhoinv + psi + phi; if (orgati) { temp1 = z__[iim1] / delta[iim1]; temp1 *= temp1; - c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] - d__[ - iip1]) * temp1; + c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] - d__[iip1]) * temp1; zz[0] = z__[iim1] * z__[iim1]; zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + dphi); } else { temp1 = z__[iip1] / delta[iip1]; temp1 *= temp1; - c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] - d__[ - iim1]) * temp1; + c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] - d__[iim1]) * temp1; zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - temp1)); zz[2] = z__[iip1] * z__[iip1]; } @@ -761,13 +378,6 @@ f"> */ goto L250; } } - -/* Note, eta should be positive if w is negative, and */ -/* eta should be negative otherwise. However, */ -/* if for some reason caused by roundoff, eta*w > 0, */ -/* we simply use one Newton step instead. This way */ -/* will guarantee eta*w < 0. */ - if (w * eta >= 0.) { eta = -w / dw; } @@ -779,17 +389,11 @@ f"> */ eta = (dltlb - tau) / 2.; } } - prew = w; - i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] -= eta; -/* L180: */ } - -/* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; psi = 0.; erretm = 0.; @@ -799,12 +403,8 @@ f"> */ psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; -/* L190: */ } erretm = abs(erretm); - -/* Evaluate PHI and the derivative DPHI */ - dphi = 0.; phi = 0.; i__1 = iip1; @@ -813,16 +413,13 @@ f"> */ phi += z__[j] * temp; dphi += temp * temp; erretm += phi; -/* L200: */ } - temp = z__[ii] / delta[ii]; dw = dpsi + dphi + temp * temp; temp = z__[ii] * temp; w = rhoinv + phi + psi + temp; - erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + ( - d__1 = tau + eta, abs(d__1)) * dw; - + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + + (d__1 = tau + eta, abs(d__1)) * dw; swtch = FALSE_; if (orgati) { if (-w > abs(prew) / 10.) { @@ -833,17 +430,9 @@ f"> */ swtch = TRUE_; } } - tau += eta; - -/* Main loop to update the values of the array DELTA */ - iter = niter + 1; - for (niter = iter; niter <= 30; ++niter) { - -/* Test for convergence */ - if (abs(w) <= eps * erretm) { if (orgati) { *dlam = d__[*i__] + tau; @@ -852,27 +441,19 @@ f"> */ } goto L250; } - if (w <= 0.) { - dltlb = max(dltlb,tau); + dltlb = max(dltlb, tau); } else { - dltub = min(dltub,tau); + dltub = min(dltub, tau); } - -/* Calculate the new step */ - - if (! swtch3) { - if (! swtch) { + if (!swtch3) { + if (!swtch) { if (orgati) { -/* Computing 2nd power */ d__1 = z__[*i__] / delta[*i__]; - c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * ( - d__1 * d__1); + c__ = w - delta[ip1] * dw - (d__[*i__] - d__[ip1]) * (d__1 * d__1); } else { -/* Computing 2nd power */ d__1 = z__[ip1] / delta[ip1]; - c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * - (d__1 * d__1); + c__ = w - delta[*i__] * dw - (d__[ip1] - d__[*i__]) * (d__1 * d__1); } } else { temp = z__[ii] / delta[ii]; @@ -883,36 +464,27 @@ f"> */ } c__ = w - delta[*i__] * dpsi - delta[ip1] * dphi; } - a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] - * dw; + a = (delta[*i__] + delta[ip1]) * w - delta[*i__] * delta[ip1] * dw; b = delta[*i__] * delta[ip1] * w; if (c__ == 0.) { if (a == 0.) { - if (! swtch) { + if (!swtch) { if (orgati) { - a = z__[*i__] * z__[*i__] + delta[ip1] * - delta[ip1] * (dpsi + dphi); + a = z__[*i__] * z__[*i__] + delta[ip1] * delta[ip1] * (dpsi + dphi); } else { - a = z__[ip1] * z__[ip1] + delta[*i__] * delta[ - *i__] * (dpsi + dphi); + a = z__[ip1] * z__[ip1] + delta[*i__] * delta[*i__] * (dpsi + dphi); } } else { - a = delta[*i__] * delta[*i__] * dpsi + delta[ip1] - * delta[ip1] * dphi; + a = delta[*i__] * delta[*i__] * dpsi + delta[ip1] * delta[ip1] * dphi; } } eta = b / a; } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) - / (c__ * 2.); + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, - abs(d__1)))); + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } } else { - -/* Interpolation using THREE most relevant poles */ - temp = rhoinv + psi + phi; if (swtch) { c__ = temp - delta[iim1] * dpsi - delta[iip1] * dphi; @@ -922,34 +494,22 @@ f"> */ if (orgati) { temp1 = z__[iim1] / delta[iim1]; temp1 *= temp1; - c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] - - d__[iip1]) * temp1; + c__ = temp - delta[iip1] * (dpsi + dphi) - (d__[iim1] - d__[iip1]) * temp1; zz[0] = z__[iim1] * z__[iim1]; - zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + - dphi); + zz[2] = delta[iip1] * delta[iip1] * (dpsi - temp1 + dphi); } else { temp1 = z__[iip1] / delta[iip1]; temp1 *= temp1; - c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] - - d__[iim1]) * temp1; - zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - - temp1)); + c__ = temp - delta[iim1] * (dpsi + dphi) - (d__[iip1] - d__[iim1]) * temp1; + zz[0] = delta[iim1] * delta[iim1] * (dpsi + (dphi - temp1)); zz[2] = z__[iip1] * z__[iip1]; } } - dlaed6_(&niter, &orgati, &c__, &delta[iim1], zz, &w, &eta, - info); + dlaed6_(&niter, &orgati, &c__, &delta[iim1], zz, &w, &eta, info); if (*info != 0) { goto L250; } } - -/* Note, eta should be positive if w is negative, and */ -/* eta should be negative otherwise. However, */ -/* if for some reason caused by roundoff, eta*w > 0, */ -/* we simply use one Newton step instead. This way */ -/* will guarantee eta*w < 0. */ - if (w * eta >= 0.) { eta = -w / dw; } @@ -961,18 +521,12 @@ f"> */ eta = (dltlb - tau) / 2.; } } - i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] -= eta; -/* L210: */ } - tau += eta; prew = w; - -/* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; psi = 0.; erretm = 0.; @@ -982,12 +536,8 @@ f"> */ psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; -/* L220: */ } erretm = abs(erretm); - -/* Evaluate PHI and the derivative DPHI */ - dphi = 0.; phi = 0.; i__1 = iip1; @@ -996,41 +546,26 @@ f"> */ phi += z__[j] * temp; dphi += temp * temp; erretm += phi; -/* L230: */ } - temp = z__[ii] / delta[ii]; dw = dpsi + dphi + temp * temp; temp = z__[ii] * temp; w = rhoinv + phi + psi + temp; - erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. - + abs(tau) * dw; + erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3. + abs(tau) * dw; if (w * prew > 0. && abs(w) > abs(prew) / 10.) { - swtch = ! swtch; + swtch = !swtch; } - -/* L240: */ } - -/* Return with INFO = 1, NITER = MAXIT and not converged */ - *info = 1; if (orgati) { *dlam = d__[*i__] + tau; } else { *dlam = d__[ip1] + tau; } - } - L250: - return 0; - -/* End of DLAED4 */ - -} /* dlaed4_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaed5.cpp b/lib/linalg/dlaed5.cpp index 558676d269..30671066fa 100644 --- a/lib/linalg/dlaed5.cpp +++ b/lib/linalg/dlaed5.cpp @@ -1,176 +1,22 @@ -/* fortran/dlaed5.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLAED5 used by DSTEDC. Solves the 2-by-2 secular equation. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAED5 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAED5( I, D, Z, DELTA, RHO, DLAM ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER I */ -/* DOUBLE PRECISION DLAM, RHO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( 2 ), DELTA( 2 ), Z( 2 ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > This subroutine computes the I-th eigenvalue of a symmetric rank-one */ -/* > modification of a 2-by-2 diagonal matrix */ -/* > */ -/* > diag( D ) + RHO * Z * transpose(Z) . */ -/* > */ -/* > The diagonal elements in the array D are assumed to satisfy */ -/* > */ -/* > D(i) < D(j) for i < j . */ -/* > */ -/* > We also assume RHO > 0 and that the Euclidean norm of the vector */ -/* > Z is one. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] I */ -/* > \verbatim */ -/* > I is INTEGER */ -/* > The index of the eigenvalue to be computed. I = 1 or I = 2. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (2) */ -/* > The original eigenvalues. We assume D(1) < D(2). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension (2) */ -/* > The components of the updating vector. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DELTA */ -/* > \verbatim */ -/* > DELTA is DOUBLE PRECISION array, dimension (2) */ -/* > The vector DELTA contains the information necessary */ -/* > to construct the eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > The scalar in the symmetric updating formula. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DLAM */ -/* > \verbatim */ -/* > DLAM is DOUBLE PRECISION */ -/* > The computed lambda_I, the I-th updated eigenvalue. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ren-Cang Li, Computer Science Division, University of California */ -/* > at Berkeley, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlaed5_(integer *i__, doublereal *d__, doublereal *z__, - doublereal *delta, doublereal *rho, doublereal *dlam) +int dlaed5_(integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, + doublereal *dlam) { - /* System generated locals */ doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal b, c__, w, del, tau, temp; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --delta; --z__; --d__; - - /* Function Body */ del = d__[2] - d__[1]; if (*i__ == 1) { w = *rho * 2. * (z__[2] * z__[2] - z__[1] * z__[1]) / del + 1.; if (w > 0.) { b = del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[1] * z__[1] * del; - -/* B > ZERO, always */ - tau = c__ * 2. / (b + sqrt((d__1 = b * b - c__ * 4., abs(d__1)))); *dlam = d__[1] + tau; delta[1] = -z__[1] / tau; @@ -191,9 +37,6 @@ f"> */ delta[1] /= temp; delta[2] /= temp; } else { - -/* Now I=2 */ - b = -del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[2] * z__[2] * del; if (b > 0.) { @@ -209,11 +52,7 @@ f"> */ delta[2] /= temp; } return 0; - -/* End of DLAED5 */ - -} /* dlaed5_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaed6.cpp b/lib/linalg/dlaed6.cpp index d884bbd67e..083046b822 100644 --- a/lib/linalg/dlaed6.cpp +++ b/lib/linalg/dlaed6.cpp @@ -1,173 +1,13 @@ -/* fortran/dlaed6.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLAED6 used by DSTEDC. Computes one Newton step in solution of the secular equation. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAED6 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAED6( KNITER, ORGATI, RHO, D, Z, FINIT, TAU, INFO ) */ - -/* .. Scalar Arguments .. */ -/* LOGICAL ORGATI */ -/* INTEGER INFO, KNITER */ -/* DOUBLE PRECISION FINIT, RHO, TAU */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( 3 ), Z( 3 ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAED6 computes the positive or negative root (closest to the origin) */ -/* > of */ -/* > z(1) z(2) z(3) */ -/* > f(x) = rho + --------- + ---------- + --------- */ -/* > d(1)-x d(2)-x d(3)-x */ -/* > */ -/* > It is assumed that */ -/* > */ -/* > if ORGATI = .true. the root is between d(2) and d(3); */ -/* > otherwise it is between d(1) and d(2) */ -/* > */ -/* > This routine will be called by DLAED4 when necessary. In most cases, */ -/* > the root sought is the smallest in magnitude, though it might not be */ -/* > in some extremely rare situations. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] KNITER */ -/* > \verbatim */ -/* > KNITER is INTEGER */ -/* > Refer to DLAED4 for its significance. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ORGATI */ -/* > \verbatim */ -/* > ORGATI is LOGICAL */ -/* > If ORGATI is true, the needed root is between d(2) and */ -/* > d(3); otherwise it is between d(1) and d(2). See */ -/* > DLAED4 for further details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > Refer to the equation f(x) above. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (3) */ -/* > D satisfies d(1) < d(2) < d(3). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension (3) */ -/* > Each of the elements in z must be positive. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] FINIT */ -/* > \verbatim */ -/* > FINIT is DOUBLE PRECISION */ -/* > The value of f at 0. It is more accurate than the one */ -/* > evaluated inside this routine (if someone wants to do */ -/* > so). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION */ -/* > The root of the equation f(x). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > > 0: if INFO = 1, failure to converge */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > 10/02/03: This version has a few statements commented out for thread */ -/* > safety (machine parameters are computed on each entry). SJH. */ -/* > */ -/* > 05/10/06: Modified from a new version of Ren-Cang Li, use */ -/* > Gragg-Thornton-Warner cubic convergent scheme for better stability. */ -/* > \endverbatim */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ren-Cang Li, Computer Science Division, University of California */ -/* > at Berkeley, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlaed6_(integer *kniter, logical *orgati, doublereal * - rho, doublereal *d__, doublereal *z__, doublereal *finit, doublereal * - tau, integer *info) +int dlaed6_(integer *kniter, logical *orgati, doublereal *rho, doublereal *d__, doublereal *z__, + doublereal *finit, doublereal *tau, integer *info) { - /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3, d__4; - - /* Builtin functions */ double sqrt(doublereal), log(doublereal), pow_lmp_di(doublereal *, integer *); - - /* Local variables */ doublereal a, b, c__, f; integer i__; doublereal fc, df, ddf, lbd, eta, ubd, eps, base; @@ -178,38 +18,9 @@ f"> */ doublereal small1, small2, sminv1, sminv2; extern doublereal dlamch_(char *, ftnlen); doublereal dscale[3], sclfac, zscale[3], erretm, sclinv; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Local Arrays .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --z__; --d__; - - /* Function Body */ *info = 0; - if (*orgati) { lbd = d__[2]; ubd = d__[3]; @@ -222,7 +33,6 @@ f"> */ } else { ubd = 0.; } - niter = 1; *tau = 0.; if (*kniter == 2) { @@ -237,20 +47,17 @@ f"> */ a = c__ * (d__[1] + d__[2]) + z__[1] + z__[2]; b = c__ * d__[1] * d__[2] + z__[1] * d__[2] + z__[2] * d__[1]; } -/* Computing MAX */ - d__1 = abs(a), d__2 = abs(b), d__1 = max(d__1,d__2), d__2 = abs(c__); - temp = max(d__1,d__2); + d__1 = abs(a), d__2 = abs(b), d__1 = max(d__1, d__2), d__2 = abs(c__); + temp = max(d__1, d__2); a /= temp; b /= temp; c__ /= temp; if (c__ == 0.) { *tau = b / a; } else if (a <= 0.) { - *tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( - c__ * 2.); + *tau = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { - *tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)) - )); + *tau = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } if (*tau < lbd || *tau > ubd) { *tau = (lbd + ubd) / 2.; @@ -258,9 +65,9 @@ f"> */ if (d__[1] == *tau || d__[2] == *tau || d__[3] == *tau) { *tau = 0.; } else { - temp = *finit + *tau * z__[1] / (d__[1] * (d__[1] - *tau)) + *tau - * z__[2] / (d__[2] * (d__[2] - *tau)) + *tau * z__[3] / ( - d__[3] * (d__[3] - *tau)); + temp = *finit + *tau * z__[1] / (d__[1] * (d__[1] - *tau)) + + *tau * z__[2] / (d__[2] * (d__[2] - *tau)) + + *tau * z__[3] / (d__[3] * (d__[3] - *tau)); if (temp <= 0.) { lbd = *tau; } else { @@ -271,73 +78,43 @@ f"> */ } } } - -/* get machine parameters for possible scaling to avoid overflow */ - -/* modified by Sven: parameters SMALL1, SMINV1, SMALL2, */ -/* SMINV2, EPS are not SAVEd anymore between one call to the */ -/* others but recomputed at each call */ - eps = dlamch_((char *)"Epsilon", (ftnlen)7); base = dlamch_((char *)"Base", (ftnlen)4); - i__1 = (integer) (log(dlamch_((char *)"SafMin", (ftnlen)6)) / log(base) / 3.); + i__1 = (integer)(log(dlamch_((char *)"SafMin", (ftnlen)6)) / log(base) / 3.); small1 = pow_lmp_di(&base, &i__1); sminv1 = 1. / small1; small2 = small1 * small1; sminv2 = sminv1 * sminv1; - -/* Determine if scaling of inputs necessary to avoid overflow */ -/* when computing 1/TEMP**3 */ - if (*orgati) { -/* Computing MIN */ - d__3 = (d__1 = d__[2] - *tau, abs(d__1)), d__4 = (d__2 = d__[3] - * - tau, abs(d__2)); - temp = min(d__3,d__4); + d__3 = (d__1 = d__[2] - *tau, abs(d__1)), d__4 = (d__2 = d__[3] - *tau, abs(d__2)); + temp = min(d__3, d__4); } else { -/* Computing MIN */ - d__3 = (d__1 = d__[1] - *tau, abs(d__1)), d__4 = (d__2 = d__[2] - * - tau, abs(d__2)); - temp = min(d__3,d__4); + d__3 = (d__1 = d__[1] - *tau, abs(d__1)), d__4 = (d__2 = d__[2] - *tau, abs(d__2)); + temp = min(d__3, d__4); } scale = FALSE_; if (temp <= small1) { scale = TRUE_; if (temp <= small2) { - -/* Scale up by power of radix nearest 1/SAFMIN**(2/3) */ - sclfac = sminv2; sclinv = small2; } else { - -/* Scale up by power of radix nearest 1/SAFMIN**(1/3) */ - sclfac = sminv1; sclinv = small1; } - -/* Scaling up safe because D, Z, TAU scaled elsewhere to be O(1) */ - for (i__ = 1; i__ <= 3; ++i__) { dscale[i__ - 1] = d__[i__] * sclfac; zscale[i__ - 1] = z__[i__] * sclfac; -/* L10: */ } *tau *= sclfac; lbd *= sclfac; ubd *= sclfac; } else { - -/* Copy D and Z to DSCALE and ZSCALE */ - for (i__ = 1; i__ <= 3; ++i__) { dscale[i__ - 1] = d__[i__]; zscale[i__ - 1] = z__[i__]; -/* L20: */ } } - fc = 0.; df = 0.; ddf = 0.; @@ -349,10 +126,8 @@ f"> */ fc += temp1 / dscale[i__ - 1]; df += temp2; ddf += temp3; -/* L30: */ } f = *finit + *tau * fc; - if (abs(f) <= 0.) { goto L60; } @@ -361,22 +136,8 @@ f"> */ } else { ubd = *tau; } - -/* Iteration begins -- Use Gragg-Thornton-Warner cubic convergent */ -/* scheme */ - -/* It is not hard to see that */ - -/* 1) Iterations will go up monotonically */ -/* if FINIT < 0; */ - -/* 2) Iterations will go down monotonically */ -/* if FINIT > 0. */ - iter = niter + 1; - for (niter = iter; niter <= 40; ++niter) { - if (*orgati) { temp1 = dscale[1] - *tau; temp2 = dscale[2] - *tau; @@ -387,30 +148,25 @@ f"> */ a = (temp1 + temp2) * f - temp1 * temp2 * df; b = temp1 * temp2 * f; c__ = f - (temp1 + temp2) * df + temp1 * temp2 * ddf; -/* Computing MAX */ - d__1 = abs(a), d__2 = abs(b), d__1 = max(d__1,d__2), d__2 = abs(c__); - temp = max(d__1,d__2); + d__1 = abs(a), d__2 = abs(b), d__1 = max(d__1, d__2), d__2 = abs(c__); + temp = max(d__1, d__2); a /= temp; b /= temp; c__ /= temp; if (c__ == 0.) { eta = b / a; } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ - * 2.); + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) - ); + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } if (f * eta >= 0.) { eta = -f / df; } - *tau += eta; if (*tau < lbd || *tau > ubd) { *tau = (lbd + ubd) / 2.; } - fc = 0.; erretm = 0.; df = 0.; @@ -429,12 +185,10 @@ f"> */ } else { goto L60; } -/* L40: */ } f = *finit + *tau * fc; erretm = (abs(*finit) + abs(*tau) * erretm) * 8. + abs(*tau) * df; - if (abs(f) <= eps * 4. * erretm || ubd - lbd <= eps * 4. * abs(*tau)) - { + if (abs(f) <= eps * 4. * erretm || ubd - lbd <= eps * 4. * abs(*tau)) { goto L60; } if (f <= 0.) { @@ -442,22 +196,14 @@ f"> */ } else { ubd = *tau; } -/* L50: */ } *info = 1; L60: - -/* Undo scaling */ - if (scale) { *tau *= sclinv; } return 0; - -/* End of DLAED6 */ - -} /* dlaed6_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaed7.cpp b/lib/linalg/dlaed7.cpp index bc763aa9df..036fdeff6f 100644 --- a/lib/linalg/dlaed7.cpp +++ b/lib/linalg/dlaed7.cpp @@ -1,348 +1,38 @@ -/* fortran/dlaed7.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__2 = 2; static integer c__1 = 1; static doublereal c_b10 = 1.; static doublereal c_b11 = 0.; static integer c_n1 = -1; - -/* > \brief \b DLAED7 used by DSTEDC. Computes the updated eigensystem of a diagonal matrix after modification - by a rank-one symmetric matrix. Used when the original matrix is dense. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAED7 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAED7( ICOMPQ, N, QSIZ, TLVLS, CURLVL, CURPBM, D, Q, */ -/* LDQ, INDXQ, RHO, CUTPNT, QSTORE, QPTR, PRMPTR, */ -/* PERM, GIVPTR, GIVCOL, GIVNUM, WORK, IWORK, */ -/* INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER CURLVL, CURPBM, CUTPNT, ICOMPQ, INFO, LDQ, N, */ -/* $ QSIZ, TLVLS */ -/* DOUBLE PRECISION RHO */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER GIVCOL( 2, * ), GIVPTR( * ), INDXQ( * ), */ -/* $ IWORK( * ), PERM( * ), PRMPTR( * ), QPTR( * ) */ -/* DOUBLE PRECISION D( * ), GIVNUM( 2, * ), Q( LDQ, * ), */ -/* $ QSTORE( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAED7 computes the updated eigensystem of a diagonal */ -/* > matrix after modification by a rank-one symmetric matrix. This */ -/* > routine is used only for the eigenproblem which requires all */ -/* > eigenvalues and optionally eigenvectors of a dense symmetric matrix */ -/* > that has been reduced to tridiagonal form. DLAED1 handles */ -/* > the case in which all eigenvalues and eigenvectors of a symmetric */ -/* > tridiagonal matrix are desired. */ -/* > */ -/* > T = Q(in) ( D(in) + RHO * Z*Z**T ) Q**T(in) = Q(out) * D(out) * Q**T(out) */ -/* > */ -/* > where Z = Q**Tu, u is a vector of length N with ones in the */ -/* > CUTPNT and CUTPNT + 1 th elements and zeros elsewhere. */ -/* > */ -/* > The eigenvectors of the original matrix are stored in Q, and the */ -/* > eigenvalues are in D. The algorithm consists of three stages: */ -/* > */ -/* > The first stage consists of deflating the size of the problem */ -/* > when there are multiple eigenvalues or if there is a zero in */ -/* > the Z vector. For each such occurrence the dimension of the */ -/* > secular equation problem is reduced by one. This stage is */ -/* > performed by the routine DLAED8. */ -/* > */ -/* > The second stage consists of calculating the updated */ -/* > eigenvalues. This is done by finding the roots of the secular */ -/* > equation via the routine DLAED4 (as called by DLAED9). */ -/* > This routine also calculates the eigenvectors of the current */ -/* > problem. */ -/* > */ -/* > The final stage consists of computing the updated eigenvectors */ -/* > directly using the updated eigenvalues. The eigenvectors for */ -/* > the current problem are multiplied with the eigenvectors from */ -/* > the overall problem. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ICOMPQ */ -/* > \verbatim */ -/* > ICOMPQ is INTEGER */ -/* > = 0: Compute eigenvalues only. */ -/* > = 1: Compute eigenvectors of original dense symmetric matrix */ -/* > also. On entry, Q contains the orthogonal matrix used */ -/* > to reduce the original matrix to tridiagonal form. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] QSIZ */ -/* > \verbatim */ -/* > QSIZ is INTEGER */ -/* > The dimension of the orthogonal matrix used to reduce */ -/* > the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TLVLS */ -/* > \verbatim */ -/* > TLVLS is INTEGER */ -/* > The total number of merging levels in the overall divide and */ -/* > conquer tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CURLVL */ -/* > \verbatim */ -/* > CURLVL is INTEGER */ -/* > The current level in the overall merge routine, */ -/* > 0 <= CURLVL <= TLVLS. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CURPBM */ -/* > \verbatim */ -/* > CURPBM is INTEGER */ -/* > The current problem in the current level in the overall */ -/* > merge routine (counting from upper left to lower right). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the eigenvalues of the rank-1-perturbed matrix. */ -/* > On exit, the eigenvalues of the repaired matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Q */ -/* > \verbatim */ -/* > Q is DOUBLE PRECISION array, dimension (LDQ, N) */ -/* > On entry, the eigenvectors of the rank-1-perturbed matrix. */ -/* > On exit, the eigenvectors of the repaired tridiagonal matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQ */ -/* > \verbatim */ -/* > LDQ is INTEGER */ -/* > The leading dimension of the array Q. LDQ >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INDXQ */ -/* > \verbatim */ -/* > INDXQ is INTEGER array, dimension (N) */ -/* > The permutation which will reintegrate the subproblem just */ -/* > solved back into sorted order, i.e., D( INDXQ( I = 1, N ) ) */ -/* > will be in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > The subdiagonal element used to create the rank-1 */ -/* > modification. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CUTPNT */ -/* > \verbatim */ -/* > CUTPNT is INTEGER */ -/* > Contains the location of the last eigenvalue in the leading */ -/* > sub-matrix. min(1,N) <= CUTPNT <= N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] QSTORE */ -/* > \verbatim */ -/* > QSTORE is DOUBLE PRECISION array, dimension (N**2+1) */ -/* > Stores eigenvectors of submatrices encountered during */ -/* > divide and conquer, packed together. QPTR points to */ -/* > beginning of the submatrices. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] QPTR */ -/* > \verbatim */ -/* > QPTR is INTEGER array, dimension (N+2) */ -/* > List of indices pointing to beginning of submatrices stored */ -/* > in QSTORE. The submatrices are numbered starting at the */ -/* > bottom left of the divide and conquer tree, from left to */ -/* > right and bottom to top. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PRMPTR */ -/* > \verbatim */ -/* > PRMPTR is INTEGER array, dimension (N lg N) */ -/* > Contains a list of pointers which indicate where in PERM a */ -/* > level's permutation is stored. PRMPTR(i+1) - PRMPTR(i) */ -/* > indicates the size of the permutation and also the size of */ -/* > the full, non-deflated problem. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PERM */ -/* > \verbatim */ -/* > PERM is INTEGER array, dimension (N lg N) */ -/* > Contains the permutations (from deflation and sorting) to be */ -/* > applied to each eigenblock. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVPTR */ -/* > \verbatim */ -/* > GIVPTR is INTEGER array, dimension (N lg N) */ -/* > Contains a list of pointers which indicate where in GIVCOL a */ -/* > level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i) */ -/* > indicates the number of Givens rotations. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVCOL */ -/* > \verbatim */ -/* > GIVCOL is INTEGER array, dimension (2, N lg N) */ -/* > Each pair of numbers indicates a pair of columns to take place */ -/* > in a Givens rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVNUM */ -/* > \verbatim */ -/* > GIVNUM is DOUBLE PRECISION array, dimension (2, N lg N) */ -/* > Each number indicates the S value to be used in the */ -/* > corresponding Givens rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (3*N+2*QSIZ*N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension (4*N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: if INFO = 1, an eigenvalue did not converge */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Jeff Rutter, Computer Science Division, University of California */ -/* > at Berkeley, USA */ - -/* ===================================================================== */ -/* Subroutine */ int dlaed7_(integer *icompq, integer *n, integer *qsiz, - integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, - doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer - *cutpnt, doublereal *qstore, integer *qptr, integer *prmptr, integer * - perm, integer *givptr, integer *givcol, doublereal *givnum, - doublereal *work, integer *iwork, integer *info) +int dlaed7_(integer *icompq, integer *n, integer *qsiz, integer *tlvls, integer *curlvl, + integer *curpbm, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, + doublereal *rho, integer *cutpnt, doublereal *qstore, integer *qptr, integer *prmptr, + integer *perm, integer *givptr, integer *givcol, doublereal *givnum, doublereal *work, + integer *iwork, integer *info) { - /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; - - /* Builtin functions */ integer pow_lmp_ii(integer *, integer *); - - /* Local variables */ integer i__, k, n1, n2, is, iw, iz, iq2, ptr, ldq2, indx, curr; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); integer indxc, indxp; - extern /* Subroutine */ int dlaed8_(integer *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, integer *, - doublereal *, integer *, integer *, integer *), dlaed9_(integer *, - integer *, integer *, integer *, doublereal *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - integer *, integer *), dlaeda_(integer *, integer *, integer *, - integer *, integer *, integer *, integer *, integer *, doublereal - *, doublereal *, integer *, doublereal *, doublereal *, integer *) - ; + extern int dlaed8_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, integer *, integer *, integer *, + doublereal *, integer *, integer *, integer *), + dlaed9_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *), + dlaeda_(integer *, integer *, integer *, integer *, integer *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, + integer *); integer idlmda; - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen); + extern int dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), + xerbla_(char *, integer *, ftnlen); integer coltyp; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; @@ -357,19 +47,16 @@ f"> */ givnum -= 3; --work; --iwork; - - /* Function Body */ *info = 0; - if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*icompq == 1 && *qsiz < *n) { *info = -3; - } else if (*ldq < max(1,*n)) { + } else if (*ldq < max(1, *n)) { *info = -9; - } else if (min(1,*n) > *cutpnt || *n < *cutpnt) { + } else if (min(1, *n) > *cutpnt || *n < *cutpnt) { *info = -12; } if (*info != 0) { @@ -377,88 +64,55 @@ f"> */ xerbla_((char *)"DLAED7", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - -/* The following values are for bookkeeping purposes only. They are */ -/* integer pointers which indicate the portion of the workspace */ -/* used by a particular array in DLAED8 and DLAED9. */ - if (*icompq == 1) { ldq2 = *qsiz; } else { ldq2 = *n; } - iz = 1; idlmda = iz + *n; iw = idlmda + *n; iq2 = iw + *n; is = iq2 + *n * ldq2; - indx = 1; indxc = indx + *n; coltyp = indxc + *n; indxp = coltyp + *n; - -/* Form the z-vector which consists of the last row of Q_1 and the */ -/* first row of Q_2. */ - ptr = pow_lmp_ii(&c__2, tlvls) + 1; i__1 = *curlvl - 1; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *tlvls - i__; ptr += pow_lmp_ii(&c__2, &i__2); -/* L10: */ } curr = ptr + *curpbm; - dlaeda_(n, tlvls, curlvl, curpbm, &prmptr[1], &perm[1], &givptr[1], & - givcol[3], &givnum[3], &qstore[1], &qptr[1], &work[iz], &work[iz - + *n], info); - -/* When solving the final problem, we no longer need the stored data, */ -/* so we will overwrite the data from this level onto the previously */ -/* used storage space. */ - + dlaeda_(n, tlvls, curlvl, curpbm, &prmptr[1], &perm[1], &givptr[1], &givcol[3], &givnum[3], + &qstore[1], &qptr[1], &work[iz], &work[iz + *n], info); if (*curlvl == *tlvls) { qptr[curr] = 1; prmptr[curr] = 1; givptr[curr] = 1; } - -/* Sort and Deflate eigenvalues. */ - - dlaed8_(icompq, &k, n, qsiz, &d__[1], &q[q_offset], ldq, &indxq[1], rho, - cutpnt, &work[iz], &work[idlmda], &work[iq2], &ldq2, &work[iw], & - perm[prmptr[curr]], &givptr[curr + 1], &givcol[(givptr[curr] << 1) - + 1], &givnum[(givptr[curr] << 1) + 1], &iwork[indxp], &iwork[ - indx], info); + dlaed8_(icompq, &k, n, qsiz, &d__[1], &q[q_offset], ldq, &indxq[1], rho, cutpnt, &work[iz], + &work[idlmda], &work[iq2], &ldq2, &work[iw], &perm[prmptr[curr]], &givptr[curr + 1], + &givcol[(givptr[curr] << 1) + 1], &givnum[(givptr[curr] << 1) + 1], &iwork[indxp], + &iwork[indx], info); prmptr[curr + 1] = prmptr[curr] + *n; givptr[curr + 1] += givptr[curr]; - -/* Solve Secular Equation. */ - if (k != 0) { - dlaed9_(&k, &c__1, &k, n, &d__[1], &work[is], &k, rho, &work[idlmda], - &work[iw], &qstore[qptr[curr]], &k, info); + dlaed9_(&k, &c__1, &k, n, &d__[1], &work[is], &k, rho, &work[idlmda], &work[iw], + &qstore[qptr[curr]], &k, info); if (*info != 0) { goto L30; } if (*icompq == 1) { - dgemm_((char *)"N", (char *)"N", qsiz, &k, &k, &c_b10, &work[iq2], &ldq2, &qstore[ - qptr[curr]], &k, &c_b11, &q[q_offset], ldq, (ftnlen)1, ( - ftnlen)1); + dgemm_((char *)"N", (char *)"N", qsiz, &k, &k, &c_b10, &work[iq2], &ldq2, &qstore[qptr[curr]], &k, + &c_b11, &q[q_offset], ldq, (ftnlen)1, (ftnlen)1); } -/* Computing 2nd power */ i__1 = k; qptr[curr + 1] = qptr[curr] + i__1 * i__1; - -/* Prepare the INDXQ sorting permutation. */ - n1 = k; n2 = *n - k; dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); @@ -467,17 +121,11 @@ f"> */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { indxq[i__] = i__; -/* L20: */ } } - L30: return 0; - -/* End of DLAED7 */ - -} /* dlaed7_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaed8.cpp b/lib/linalg/dlaed8.cpp index 8d1a7ae4b3..46580ce44f 100644 --- a/lib/linalg/dlaed8.cpp +++ b/lib/linalg/dlaed8.cpp @@ -1,329 +1,34 @@ -/* fortran/dlaed8.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b3 = -1.; static integer c__1 = 1; - -/* > \brief \b DLAED8 used by DSTEDC. Merges eigenvalues and deflates secular equation. Used when the original - matrix is dense. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAED8 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAED8( ICOMPQ, K, N, QSIZ, D, Q, LDQ, INDXQ, RHO, */ -/* CUTPNT, Z, DLAMDA, Q2, LDQ2, W, PERM, GIVPTR, */ -/* GIVCOL, GIVNUM, INDXP, INDX, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER CUTPNT, GIVPTR, ICOMPQ, INFO, K, LDQ, LDQ2, N, */ -/* $ QSIZ */ -/* DOUBLE PRECISION RHO */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER GIVCOL( 2, * ), INDX( * ), INDXP( * ), */ -/* $ INDXQ( * ), PERM( * ) */ -/* DOUBLE PRECISION D( * ), DLAMDA( * ), GIVNUM( 2, * ), */ -/* $ Q( LDQ, * ), Q2( LDQ2, * ), W( * ), Z( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAED8 merges the two sets of eigenvalues together into a single */ -/* > sorted set. Then it tries to deflate the size of the problem. */ -/* > There are two ways in which deflation can occur: when two or more */ -/* > eigenvalues are close together or if there is a tiny element in the */ -/* > Z vector. For each such occurrence the order of the related secular */ -/* > equation problem is reduced by one. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ICOMPQ */ -/* > \verbatim */ -/* > ICOMPQ is INTEGER */ -/* > = 0: Compute eigenvalues only. */ -/* > = 1: Compute eigenvectors of original dense symmetric matrix */ -/* > also. On entry, Q contains the orthogonal matrix used */ -/* > to reduce the original matrix to tridiagonal form. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of non-deflated eigenvalues, and the order of the */ -/* > related secular equation. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] QSIZ */ -/* > \verbatim */ -/* > QSIZ is INTEGER */ -/* > The dimension of the orthogonal matrix used to reduce */ -/* > the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the eigenvalues of the two submatrices to be */ -/* > combined. On exit, the trailing (N-K) updated eigenvalues */ -/* > (those which were deflated) sorted into increasing order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Q */ -/* > \verbatim */ -/* > Q is DOUBLE PRECISION array, dimension (LDQ,N) */ -/* > If ICOMPQ = 0, Q is not referenced. Otherwise, */ -/* > on entry, Q contains the eigenvectors of the partially solved */ -/* > system which has been previously updated in matrix */ -/* > multiplies with other partially solved eigensystems. */ -/* > On exit, Q contains the trailing (N-K) updated eigenvectors */ -/* > (those which were deflated) in its last N-K columns. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQ */ -/* > \verbatim */ -/* > LDQ is INTEGER */ -/* > The leading dimension of the array Q. LDQ >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INDXQ */ -/* > \verbatim */ -/* > INDXQ is INTEGER array, dimension (N) */ -/* > The permutation which separately sorts the two sub-problems */ -/* > in D into ascending order. Note that elements in the second */ -/* > half of this permutation must first have CUTPNT added to */ -/* > their values in order to be accurate. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > On entry, the off-diagonal element associated with the rank-1 */ -/* > cut which originally split the two submatrices which are now */ -/* > being recombined. */ -/* > On exit, RHO has been modified to the value required by */ -/* > DLAED3. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CUTPNT */ -/* > \verbatim */ -/* > CUTPNT is INTEGER */ -/* > The location of the last eigenvalue in the leading */ -/* > sub-matrix. min(1,N) <= CUTPNT <= N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, Z contains the updating vector (the last row of */ -/* > the first sub-eigenvector matrix and the first row of the */ -/* > second sub-eigenvector matrix). */ -/* > On exit, the contents of Z are destroyed by the updating */ -/* > process. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DLAMDA */ -/* > \verbatim */ -/* > DLAMDA is DOUBLE PRECISION array, dimension (N) */ -/* > A copy of the first K eigenvalues which will be used by */ -/* > DLAED3 to form the secular equation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] Q2 */ -/* > \verbatim */ -/* > Q2 is DOUBLE PRECISION array, dimension (LDQ2,N) */ -/* > If ICOMPQ = 0, Q2 is not referenced. Otherwise, */ -/* > a copy of the first K eigenvectors which will be used by */ -/* > DLAED7 in a matrix multiply (DGEMM) to update the new */ -/* > eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQ2 */ -/* > \verbatim */ -/* > LDQ2 is INTEGER */ -/* > The leading dimension of the array Q2. LDQ2 >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] W */ -/* > \verbatim */ -/* > W is DOUBLE PRECISION array, dimension (N) */ -/* > The first k values of the final deflation-altered z-vector and */ -/* > will be passed to DLAED3. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] PERM */ -/* > \verbatim */ -/* > PERM is INTEGER array, dimension (N) */ -/* > The permutations (from deflation and sorting) to be applied */ -/* > to each eigenblock. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVPTR */ -/* > \verbatim */ -/* > GIVPTR is INTEGER */ -/* > The number of Givens rotations which took place in this */ -/* > subproblem. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVCOL */ -/* > \verbatim */ -/* > GIVCOL is INTEGER array, dimension (2, N) */ -/* > Each pair of numbers indicates a pair of columns to take place */ -/* > in a Givens rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVNUM */ -/* > \verbatim */ -/* > GIVNUM is DOUBLE PRECISION array, dimension (2, N) */ -/* > Each number indicates the S value to be used in the */ -/* > corresponding Givens rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INDXP */ -/* > \verbatim */ -/* > INDXP is INTEGER array, dimension (N) */ -/* > The permutation used to place deflated values of D at the end */ -/* > of the array. INDXP(1:K) points to the nondeflated D-values */ -/* > and INDXP(K+1:N) points to the deflated eigenvalues. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INDX */ -/* > \verbatim */ -/* > INDX is INTEGER array, dimension (N) */ -/* > The permutation used to sort the contents of D into ascending */ -/* > order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Jeff Rutter, Computer Science Division, University of California */ -/* > at Berkeley, USA */ - -/* ===================================================================== */ -/* Subroutine */ int dlaed8_(integer *icompq, integer *k, integer *n, integer - *qsiz, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, - doublereal *rho, integer *cutpnt, doublereal *z__, doublereal *dlamda, - doublereal *q2, integer *ldq2, doublereal *w, integer *perm, integer - *givptr, integer *givcol, doublereal *givnum, integer *indxp, integer - *indx, integer *info) +int dlaed8_(integer *icompq, integer *k, integer *n, integer *qsiz, doublereal *d__, doublereal *q, + integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, doublereal *z__, + doublereal *dlamda, doublereal *q2, integer *ldq2, doublereal *w, integer *perm, + integer *givptr, integer *givcol, doublereal *givnum, integer *indxp, integer *indx, + integer *info) { - /* System generated locals */ integer q_dim1, q_offset, q2_dim1, q2_offset, i__1; doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal c__; integer i__, j; doublereal s, t; integer k2, n1, n2, jp, n1p1; doublereal eps, tau, tol; integer jlam, imax, jmax; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *), dscal_( - integer *, doublereal *, doublereal *, integer *), dcopy_(integer - *, doublereal *, integer *, doublereal *, integer *); - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern int drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *), + dscal_(integer *, doublereal *, doublereal *, integer *), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), dlacpy_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - ftnlen), xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ - -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen); --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; @@ -340,21 +45,18 @@ f"> */ givnum -= 3; --indxp; --indx; - - /* Function Body */ *info = 0; - if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*n < 0) { *info = -3; } else if (*icompq == 1 && *qsiz < *n) { *info = -4; - } else if (*ldq < max(1,*n)) { + } else if (*ldq < max(1, *n)) { *info = -7; - } else if (*cutpnt < min(1,*n) || *cutpnt > *n) { + } else if (*cutpnt < min(1, *n) || *cutpnt > *n) { *info = -10; - } else if (*ldq2 < max(1,*n)) { + } else if (*ldq2 < max(1, *n)) { *info = -14; } if (*info != 0) { @@ -362,51 +64,31 @@ f"> */ xerbla_((char *)"DLAED8", &i__1, (ftnlen)6); return 0; } - -/* Need to initialize GIVPTR to O here in case of quick exit */ -/* to prevent an unspecified code behavior (usually sigfault) */ -/* when IWORK array on entry to *stedc is not zeroed */ -/* (or at least some IWORK entries which used in *laed7 for GIVPTR). */ - *givptr = 0; - -/* Quick return if possible */ - if (*n == 0) { return 0; } - n1 = *cutpnt; n2 = *n - n1; n1p1 = n1 + 1; - if (*rho < 0.) { dscal_(&n2, &c_b3, &z__[n1p1], &c__1); } - -/* Normalize z so that norm(z) = 1 */ - t = 1. / sqrt(2.); i__1 = *n; for (j = 1; j <= i__1; ++j) { indx[j] = j; -/* L10: */ } dscal_(n, &t, &z__[1], &c__1); *rho = (d__1 = *rho * 2., abs(d__1)); - -/* Sort the eigenvalues into increasing order */ - i__1 = *n; for (i__ = *cutpnt + 1; i__ <= i__1; ++i__) { indxq[i__] += *cutpnt; -/* L20: */ } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dlamda[i__] = d__[indxq[i__]]; w[i__] = z__[indxq[i__]]; -/* L30: */ } i__ = 1; j = *cutpnt + 1; @@ -415,56 +97,33 @@ f"> */ for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = dlamda[indx[i__]]; z__[i__] = w[indx[i__]]; -/* L40: */ } - -/* Calculate the allowable deflation tolerance */ - imax = idamax_(n, &z__[1], &c__1); jmax = idamax_(n, &d__[1], &c__1); eps = dlamch_((char *)"Epsilon", (ftnlen)7); tol = eps * 8. * (d__1 = d__[jmax], abs(d__1)); - -/* If the rank-1 modifier is small enough, no more needs to be done */ -/* except to reorganize Q so that its columns correspond with the */ -/* elements in D. */ - if (*rho * (d__1 = z__[imax], abs(d__1)) <= tol) { *k = 0; if (*icompq == 0) { i__1 = *n; for (j = 1; j <= i__1; ++j) { perm[j] = indxq[indx[j]]; -/* L50: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { perm[j] = indxq[indx[j]]; - dcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 - + 1], &c__1); -/* L60: */ + dcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1], &c__1); } - dlacpy_((char *)"A", qsiz, n, &q2[q2_dim1 + 1], ldq2, &q[q_dim1 + 1], ldq, - (ftnlen)1); + dlacpy_((char *)"A", qsiz, n, &q2[q2_dim1 + 1], ldq2, &q[q_dim1 + 1], ldq, (ftnlen)1); } return 0; } - -/* If there are multiple eigenvalues then the problem deflates. Here */ -/* the number of equal eigenvalues are found. As each equal */ -/* eigenvalue is found, an elementary reflector is computed to rotate */ -/* the corresponding eigensubspace so that the corresponding */ -/* components of Z are zero in this new basis. */ - *k = 0; k2 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { - -/* Deflate due to small z component. */ - --k2; indxp[k2] = j; if (j == *n) { @@ -474,7 +133,6 @@ f"> */ jlam = j; goto L80; } -/* L70: */ } L80: ++j; @@ -482,49 +140,33 @@ L80: goto L100; } if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { - -/* Deflate due to small z component. */ - --k2; indxp[k2] = j; } else { - -/* Check if eigenvalues are close enough to allow deflation. */ - s = z__[jlam]; c__ = z__[j]; - -/* Find sqrt(a**2+b**2) without overflow or */ -/* destructive underflow. */ - tau = dlapy2_(&c__, &s); t = d__[j] - d__[jlam]; c__ /= tau; s = -s / tau; if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { - -/* Deflation is possible. */ - z__[j] = tau; z__[jlam] = 0.; - -/* Record the appropriate Givens rotation */ - ++(*givptr); givcol[(*givptr << 1) + 1] = indxq[indx[jlam]]; givcol[(*givptr << 1) + 2] = indxq[indx[j]]; givnum[(*givptr << 1) + 1] = c__; givnum[(*givptr << 1) + 2] = s; if (*icompq == 1) { - drot_(qsiz, &q[indxq[indx[jlam]] * q_dim1 + 1], &c__1, &q[ - indxq[indx[j]] * q_dim1 + 1], &c__1, &c__, &s); + drot_(qsiz, &q[indxq[indx[jlam]] * q_dim1 + 1], &c__1, + &q[indxq[indx[j]] * q_dim1 + 1], &c__1, &c__, &s); } t = d__[jlam] * c__ * c__ + d__[j] * s * s; d__[j] = d__[jlam] * s * s + d__[j] * c__ * c__; d__[jlam] = t; --k2; i__ = 1; -L90: + L90: if (k2 + i__ <= *n) { if (d__[jlam] < d__[indxp[k2 + i__]]) { indxp[k2 + i__ - 1] = indxp[k2 + i__]; @@ -548,28 +190,17 @@ L90: } goto L80; L100: - -/* Record the last eigenvalue. */ - ++(*k); w[*k] = z__[jlam]; dlamda[*k] = d__[jlam]; indxp[*k] = jlam; - L110: - -/* Sort the eigenvalues and corresponding eigenvectors into DLAMDA */ -/* and Q2 respectively. The eigenvalues/vectors which were not */ -/* deflated go into the first K slots of DLAMDA and Q2 respectively, */ -/* while those which were deflated go into the last N - K slots. */ - if (*icompq == 0) { i__1 = *n; for (j = 1; j <= i__1; ++j) { jp = indxp[j]; dlamda[j] = d__[jp]; perm[j] = indxq[indx[jp]]; -/* L120: */ } } else { i__1 = *n; @@ -577,15 +208,9 @@ L110: jp = indxp[j]; dlamda[j] = d__[jp]; perm[j] = indxq[indx[jp]]; - dcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1] - , &c__1); -/* L130: */ + dcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1], &c__1); } } - -/* The deflated eigenvalues and their corresponding vectors go back */ -/* into the last N - K slots of D and Q respectively. */ - if (*k < *n) { if (*icompq == 0) { i__1 = *n - *k; @@ -594,17 +219,12 @@ L110: i__1 = *n - *k; dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); i__1 = *n - *k; - dlacpy_((char *)"A", qsiz, &i__1, &q2[(*k + 1) * q2_dim1 + 1], ldq2, &q[(* - k + 1) * q_dim1 + 1], ldq, (ftnlen)1); + dlacpy_((char *)"A", qsiz, &i__1, &q2[(*k + 1) * q2_dim1 + 1], ldq2, &q[(*k + 1) * q_dim1 + 1], + ldq, (ftnlen)1); } } - return 0; - -/* End of DLAED8 */ - -} /* dlaed8_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaed9.cpp b/lib/linalg/dlaed9.cpp index f6f01b7098..2ca15ee0d7 100644 --- a/lib/linalg/dlaed9.cpp +++ b/lib/linalg/dlaed9.cpp @@ -1,229 +1,23 @@ -/* fortran/dlaed9.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DLAED9 used by DSTEDC. Finds the roots of the secular equation and updates the eigenvectors. Us -ed when the original matrix is dense. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAED9 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAED9( K, KSTART, KSTOP, N, D, Q, LDQ, RHO, DLAMDA, W, */ -/* S, LDS, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, KSTART, KSTOP, LDQ, LDS, N */ -/* DOUBLE PRECISION RHO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), S( LDS, * ), */ -/* $ W( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAED9 finds the roots of the secular equation, as defined by the */ -/* > values in D, Z, and RHO, between KSTART and KSTOP. It makes the */ -/* > appropriate calls to DLAED4 and then stores the new matrix of */ -/* > eigenvectors for use in calculating the next level of Z vectors. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of terms in the rational function to be solved by */ -/* > DLAED4. K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] KSTART */ -/* > \verbatim */ -/* > KSTART is INTEGER */ -/* > \endverbatim */ -/* > */ -/* > \param[in] KSTOP */ -/* > \verbatim */ -/* > KSTOP is INTEGER */ -/* > The updated eigenvalues Lambda(I), KSTART <= I <= KSTOP */ -/* > are to be computed. 1 <= KSTART <= KSTOP <= K. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of rows and columns in the Q matrix. */ -/* > N >= K (delation may result in N > K). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > D(I) contains the updated eigenvalues */ -/* > for KSTART <= I <= KSTOP. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] Q */ -/* > \verbatim */ -/* > Q is DOUBLE PRECISION array, dimension (LDQ,N) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQ */ -/* > \verbatim */ -/* > LDQ is INTEGER */ -/* > The leading dimension of the array Q. LDQ >= max( 1, N ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > The value of the parameter in the rank one update equation. */ -/* > RHO >= 0 required. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DLAMDA */ -/* > \verbatim */ -/* > DLAMDA is DOUBLE PRECISION array, dimension (K) */ -/* > The first K elements of this array contain the old roots */ -/* > of the deflated updating problem. These are the poles */ -/* > of the secular equation. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] W */ -/* > \verbatim */ -/* > W is DOUBLE PRECISION array, dimension (K) */ -/* > The first K elements of this array contain the components */ -/* > of the deflation-adjusted updating vector. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION array, dimension (LDS, K) */ -/* > Will contain the eigenvectors of the repaired matrix which */ -/* > will be stored for subsequent Z vector calculation and */ -/* > multiplied by the previously accumulated eigenvectors */ -/* > to update the system. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDS */ -/* > \verbatim */ -/* > LDS is INTEGER */ -/* > The leading dimension of S. LDS >= max( 1, K ). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: if INFO = 1, an eigenvalue did not converge */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Jeff Rutter, Computer Science Division, University of California */ -/* > at Berkeley, USA */ - -/* ===================================================================== */ -/* Subroutine */ int dlaed9_(integer *k, integer *kstart, integer *kstop, - integer *n, doublereal *d__, doublereal *q, integer *ldq, doublereal * - rho, doublereal *dlamda, doublereal *w, doublereal *s, integer *lds, - integer *info) +int dlaed9_(integer *k, integer *kstart, integer *kstop, integer *n, doublereal *d__, doublereal *q, + integer *ldq, doublereal *rho, doublereal *dlamda, doublereal *w, doublereal *s, + integer *lds, integer *info) { - /* System generated locals */ integer q_dim1, q_offset, s_dim1, s_offset, i__1, i__2; doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); - - /* Local variables */ integer i__, j; doublereal temp; extern doublereal dnrm2_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *), dlaed4_(integer *, integer *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *); + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), + dlaed4_(integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *); extern doublereal dlamc3_(doublereal *, doublereal *); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; @@ -233,21 +27,18 @@ f"> */ s_dim1 = *lds; s_offset = 1 + s_dim1; s -= s_offset; - - /* Function Body */ *info = 0; - if (*k < 0) { *info = -1; - } else if (*kstart < 1 || *kstart > max(1,*k)) { + } else if (*kstart < 1 || *kstart > max(1, *k)) { *info = -2; - } else if (max(1,*kstop) < *kstart || *kstop > max(1,*k)) { + } else if (max(1, *kstop) < *kstart || *kstop > max(1, *k)) { *info = -3; } else if (*n < *k) { *info = -4; - } else if (*ldq < max(1,*k)) { + } else if (*ldq < max(1, *k)) { *info = -7; - } else if (*lds < max(1,*k)) { + } else if (*lds < max(1, *k)) { *info = -12; } if (*info != 0) { @@ -255,68 +46,31 @@ f"> */ xerbla_((char *)"DLAED9", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*k == 0) { return 0; } - -/* Modify values DLAMDA(i) to make sure all DLAMDA(i)-DLAMDA(j) can */ -/* be computed with high relative accuracy (barring over/underflow). */ -/* This is a problem on machines without a guard digit in */ -/* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). */ -/* The following code replaces DLAMDA(I) by 2*DLAMDA(I)-DLAMDA(I), */ -/* which on any of these machines zeros out the bottommost */ -/* bit of DLAMDA(I) if it is 1; this makes the subsequent */ -/* subtractions DLAMDA(I)-DLAMDA(J) unproblematic when cancellation */ -/* occurs. On binary machines with a guard digit (almost all */ -/* machines) it does not change DLAMDA(I) at all. On hexadecimal */ -/* and decimal machines with a guard digit, it slightly */ -/* changes the bottommost bits of DLAMDA(I). It does not account */ -/* for hexadecimal or decimal machines without guard digits */ -/* (we know of none). We use a subroutine call to compute */ -/* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating */ -/* this code. */ - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dlamda[i__] = dlamc3_(&dlamda[i__], &dlamda[i__]) - dlamda[i__]; -/* L10: */ } - i__1 = *kstop; for (j = *kstart; j <= i__1; ++j) { - dlaed4_(k, &j, &dlamda[1], &w[1], &q[j * q_dim1 + 1], rho, &d__[j], - info); - -/* If the zero finder fails, the computation is terminated. */ - + dlaed4_(k, &j, &dlamda[1], &w[1], &q[j * q_dim1 + 1], rho, &d__[j], info); if (*info != 0) { goto L120; } -/* L20: */ } - if (*k == 1 || *k == 2) { i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *k; for (j = 1; j <= i__2; ++j) { s[j + i__ * s_dim1] = q[j + i__ * q_dim1]; -/* L30: */ } -/* L40: */ } goto L120; } - -/* Compute updated W. */ - dcopy_(k, &w[1], &c__1, &s[s_offset], &c__1); - -/* Initialize W(I) = Q(I,I) */ - i__1 = *ldq + 1; dcopy_(k, &q[q_offset], &i__1, &w[1], &c__1); i__1 = *k; @@ -324,47 +78,32 @@ f"> */ i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); -/* L50: */ } i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { w[i__] *= q[i__ + j * q_dim1] / (dlamda[i__] - dlamda[j]); -/* L60: */ } -/* L70: */ } i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { d__1 = sqrt(-w[i__]); w[i__] = d_lmp_sign(&d__1, &s[i__ + s_dim1]); -/* L80: */ } - -/* Compute eigenvectors of the modified rank-1 modification. */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *k; for (i__ = 1; i__ <= i__2; ++i__) { q[i__ + j * q_dim1] = w[i__] / q[i__ + j * q_dim1]; -/* L90: */ } temp = dnrm2_(k, &q[j * q_dim1 + 1], &c__1); i__2 = *k; for (i__ = 1; i__ <= i__2; ++i__) { s[i__ + j * s_dim1] = q[i__ + j * q_dim1] / temp; -/* L100: */ } -/* L110: */ } - L120: return 0; - -/* End of DLAED9 */ - -} /* dlaed9_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaeda.cpp b/lib/linalg/dlaeda.cpp index 81389d8db0..32ab3718a3 100644 --- a/lib/linalg/dlaeda.cpp +++ b/lib/linalg/dlaeda.cpp @@ -1,242 +1,26 @@ -/* fortran/dlaeda.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__2 = 2; static integer c__1 = 1; static doublereal c_b24 = 1.; static doublereal c_b26 = 0.; - -/* > \brief \b DLAEDA used by DSTEDC. Computes the Z vector determining the rank-one modification of the diago -nal matrix. Used when the original matrix is dense. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAEDA + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAEDA( N, TLVLS, CURLVL, CURPBM, PRMPTR, PERM, GIVPTR, */ -/* GIVCOL, GIVNUM, Q, QPTR, Z, ZTEMP, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER CURLVL, CURPBM, INFO, N, TLVLS */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER GIVCOL( 2, * ), GIVPTR( * ), PERM( * ), */ -/* $ PRMPTR( * ), QPTR( * ) */ -/* DOUBLE PRECISION GIVNUM( 2, * ), Q( * ), Z( * ), ZTEMP( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAEDA computes the Z vector corresponding to the merge step in the */ -/* > CURLVLth step of the merge process with TLVLS steps for the CURPBMth */ -/* > problem. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TLVLS */ -/* > \verbatim */ -/* > TLVLS is INTEGER */ -/* > The total number of merging levels in the overall divide and */ -/* > conquer tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CURLVL */ -/* > \verbatim */ -/* > CURLVL is INTEGER */ -/* > The current level in the overall merge routine, */ -/* > 0 <= curlvl <= tlvls. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CURPBM */ -/* > \verbatim */ -/* > CURPBM is INTEGER */ -/* > The current problem in the current level in the overall */ -/* > merge routine (counting from upper left to lower right). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PRMPTR */ -/* > \verbatim */ -/* > PRMPTR is INTEGER array, dimension (N lg N) */ -/* > Contains a list of pointers which indicate where in PERM a */ -/* > level's permutation is stored. PRMPTR(i+1) - PRMPTR(i) */ -/* > indicates the size of the permutation and incidentally the */ -/* > size of the full, non-deflated problem. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PERM */ -/* > \verbatim */ -/* > PERM is INTEGER array, dimension (N lg N) */ -/* > Contains the permutations (from deflation and sorting) to be */ -/* > applied to each eigenblock. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVPTR */ -/* > \verbatim */ -/* > GIVPTR is INTEGER array, dimension (N lg N) */ -/* > Contains a list of pointers which indicate where in GIVCOL a */ -/* > level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i) */ -/* > indicates the number of Givens rotations. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVCOL */ -/* > \verbatim */ -/* > GIVCOL is INTEGER array, dimension (2, N lg N) */ -/* > Each pair of numbers indicates a pair of columns to take place */ -/* > in a Givens rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVNUM */ -/* > \verbatim */ -/* > GIVNUM is DOUBLE PRECISION array, dimension (2, N lg N) */ -/* > Each number indicates the S value to be used in the */ -/* > corresponding Givens rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Q */ -/* > \verbatim */ -/* > Q is DOUBLE PRECISION array, dimension (N**2) */ -/* > Contains the square eigenblocks from previous levels, the */ -/* > starting positions for blocks are given by QPTR. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] QPTR */ -/* > \verbatim */ -/* > QPTR is INTEGER array, dimension (N+2) */ -/* > Contains a list of pointers which indicate where in Q an */ -/* > eigenblock is stored. SQRT( QPTR(i+1) - QPTR(i) ) indicates */ -/* > the size of the block. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension (N) */ -/* > On output this vector contains the updating vector (the last */ -/* > row of the first sub-eigenvector matrix and the first row of */ -/* > the second sub-eigenvector matrix). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] ZTEMP */ -/* > \verbatim */ -/* > ZTEMP is DOUBLE PRECISION array, dimension (N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Jeff Rutter, Computer Science Division, University of California */ -/* > at Berkeley, USA */ - -/* ===================================================================== */ -/* Subroutine */ int dlaeda_(integer *n, integer *tlvls, integer *curlvl, - integer *curpbm, integer *prmptr, integer *perm, integer *givptr, - integer *givcol, doublereal *givnum, doublereal *q, integer *qptr, - doublereal *z__, doublereal *ztemp, integer *info) +int dlaeda_(integer *n, integer *tlvls, integer *curlvl, integer *curpbm, integer *prmptr, + integer *perm, integer *givptr, integer *givcol, doublereal *givnum, doublereal *q, + integer *qptr, doublereal *z__, doublereal *ztemp, integer *info) { - /* System generated locals */ integer i__1, i__2, i__3; - - /* Builtin functions */ integer pow_lmp_ii(integer *, integer *); double sqrt(doublereal); - - /* Local variables */ integer i__, k, mid, ptr; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *); + extern int drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *); integer curr, bsiz1, bsiz2, psiz1, psiz2, zptr1; - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen), dcopy_(integer *, - doublereal *, integer *, doublereal *, integer *), xerbla_(char *, - integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), + xerbla_(char *, integer *, ftnlen); --ztemp; --z__; --qptr; @@ -246,10 +30,7 @@ f"> */ --givptr; --perm; --prmptr; - - /* Function Body */ *info = 0; - if (*n < 0) { *info = -1; } @@ -258,129 +39,75 @@ f"> */ xerbla_((char *)"DLAEDA", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - -/* Determine location of first number in second half. */ - mid = *n / 2 + 1; - -/* Gather last/first rows of appropriate eigenblocks into center of Z */ - ptr = 1; - -/* Determine location of lowest level subproblem in the full storage */ -/* scheme */ - i__1 = *curlvl - 1; curr = ptr + *curpbm * pow_lmp_ii(&c__2, curlvl) + pow_lmp_ii(&c__2, &i__1) - 1; - -/* Determine size of these matrices. We add HALF to the value of */ -/* the SQRT in case the machine underestimates one of these square */ -/* roots. */ - - bsiz1 = (integer) (sqrt((doublereal) (qptr[curr + 1] - qptr[curr])) + .5); - bsiz2 = (integer) (sqrt((doublereal) (qptr[curr + 2] - qptr[curr + 1])) + - .5); + bsiz1 = (integer)(sqrt((doublereal)(qptr[curr + 1] - qptr[curr])) + .5); + bsiz2 = (integer)(sqrt((doublereal)(qptr[curr + 2] - qptr[curr + 1])) + .5); i__1 = mid - bsiz1 - 1; for (k = 1; k <= i__1; ++k) { z__[k] = 0.; -/* L10: */ } - dcopy_(&bsiz1, &q[qptr[curr] + bsiz1 - 1], &bsiz1, &z__[mid - bsiz1], & - c__1); + dcopy_(&bsiz1, &q[qptr[curr] + bsiz1 - 1], &bsiz1, &z__[mid - bsiz1], &c__1); dcopy_(&bsiz2, &q[qptr[curr + 1]], &bsiz2, &z__[mid], &c__1); i__1 = *n; for (k = mid + bsiz2; k <= i__1; ++k) { z__[k] = 0.; -/* L20: */ } - -/* Loop through remaining levels 1 -> CURLVL applying the Givens */ -/* rotations and permutation and then multiplying the center matrices */ -/* against the current Z. */ - ptr = pow_lmp_ii(&c__2, tlvls) + 1; i__1 = *curlvl - 1; for (k = 1; k <= i__1; ++k) { i__2 = *curlvl - k; i__3 = *curlvl - k - 1; - curr = ptr + *curpbm * pow_lmp_ii(&c__2, &i__2) + pow_lmp_ii(&c__2, &i__3) - - 1; + curr = ptr + *curpbm * pow_lmp_ii(&c__2, &i__2) + pow_lmp_ii(&c__2, &i__3) - 1; psiz1 = prmptr[curr + 1] - prmptr[curr]; psiz2 = prmptr[curr + 2] - prmptr[curr + 1]; zptr1 = mid - psiz1; - -/* Apply Givens at CURR and CURR+1 */ - i__2 = givptr[curr + 1] - 1; for (i__ = givptr[curr]; i__ <= i__2; ++i__) { - drot_(&c__1, &z__[zptr1 + givcol[(i__ << 1) + 1] - 1], &c__1, & - z__[zptr1 + givcol[(i__ << 1) + 2] - 1], &c__1, &givnum[( - i__ << 1) + 1], &givnum[(i__ << 1) + 2]); -/* L30: */ + drot_(&c__1, &z__[zptr1 + givcol[(i__ << 1) + 1] - 1], &c__1, + &z__[zptr1 + givcol[(i__ << 1) + 2] - 1], &c__1, &givnum[(i__ << 1) + 1], + &givnum[(i__ << 1) + 2]); } i__2 = givptr[curr + 2] - 1; for (i__ = givptr[curr + 1]; i__ <= i__2; ++i__) { - drot_(&c__1, &z__[mid - 1 + givcol[(i__ << 1) + 1]], &c__1, &z__[ - mid - 1 + givcol[(i__ << 1) + 2]], &c__1, &givnum[(i__ << - 1) + 1], &givnum[(i__ << 1) + 2]); -/* L40: */ + drot_(&c__1, &z__[mid - 1 + givcol[(i__ << 1) + 1]], &c__1, + &z__[mid - 1 + givcol[(i__ << 1) + 2]], &c__1, &givnum[(i__ << 1) + 1], + &givnum[(i__ << 1) + 2]); } psiz1 = prmptr[curr + 1] - prmptr[curr]; psiz2 = prmptr[curr + 2] - prmptr[curr + 1]; i__2 = psiz1 - 1; for (i__ = 0; i__ <= i__2; ++i__) { ztemp[i__ + 1] = z__[zptr1 + perm[prmptr[curr] + i__] - 1]; -/* L50: */ } i__2 = psiz2 - 1; for (i__ = 0; i__ <= i__2; ++i__) { - ztemp[psiz1 + i__ + 1] = z__[mid + perm[prmptr[curr + 1] + i__] - - 1]; -/* L60: */ + ztemp[psiz1 + i__ + 1] = z__[mid + perm[prmptr[curr + 1] + i__] - 1]; } - -/* Multiply Blocks at CURR and CURR+1 */ - -/* Determine size of these matrices. We add HALF to the value of */ -/* the SQRT in case the machine underestimates one of these */ -/* square roots. */ - - bsiz1 = (integer) (sqrt((doublereal) (qptr[curr + 1] - qptr[curr])) + - .5); - bsiz2 = (integer) (sqrt((doublereal) (qptr[curr + 2] - qptr[curr + 1]) - ) + .5); + bsiz1 = (integer)(sqrt((doublereal)(qptr[curr + 1] - qptr[curr])) + .5); + bsiz2 = (integer)(sqrt((doublereal)(qptr[curr + 2] - qptr[curr + 1])) + .5); if (bsiz1 > 0) { - dgemv_((char *)"T", &bsiz1, &bsiz1, &c_b24, &q[qptr[curr]], &bsiz1, & - ztemp[1], &c__1, &c_b26, &z__[zptr1], &c__1, (ftnlen)1); + dgemv_((char *)"T", &bsiz1, &bsiz1, &c_b24, &q[qptr[curr]], &bsiz1, &ztemp[1], &c__1, &c_b26, + &z__[zptr1], &c__1, (ftnlen)1); } i__2 = psiz1 - bsiz1; dcopy_(&i__2, &ztemp[bsiz1 + 1], &c__1, &z__[zptr1 + bsiz1], &c__1); if (bsiz2 > 0) { - dgemv_((char *)"T", &bsiz2, &bsiz2, &c_b24, &q[qptr[curr + 1]], &bsiz2, & - ztemp[psiz1 + 1], &c__1, &c_b26, &z__[mid], &c__1, ( - ftnlen)1); + dgemv_((char *)"T", &bsiz2, &bsiz2, &c_b24, &q[qptr[curr + 1]], &bsiz2, &ztemp[psiz1 + 1], + &c__1, &c_b26, &z__[mid], &c__1, (ftnlen)1); } i__2 = psiz2 - bsiz2; - dcopy_(&i__2, &ztemp[psiz1 + bsiz2 + 1], &c__1, &z__[mid + bsiz2], & - c__1); - + dcopy_(&i__2, &ztemp[psiz1 + bsiz2 + 1], &c__1, &z__[mid + bsiz2], &c__1); i__2 = *tlvls - k; ptr += pow_lmp_ii(&c__2, &i__2); -/* L70: */ } - return 0; - -/* End of DLAEDA */ - -} /* dlaeda_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaev2.cpp b/lib/linalg/dlaev2.cpp index 21bdbebe69..454b0b9c40 100644 --- a/lib/linalg/dlaev2.cpp +++ b/lib/linalg/dlaev2.cpp @@ -1,175 +1,15 @@ -/* fortran/dlaev2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLAEV2 computes the eigenvalues and eigenvectors of a 2-by-2 symmetric/Hermitian matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAEV2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAEV2( A, B, C, RT1, RT2, CS1, SN1 ) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION A, B, C, CS1, RT1, RT2, SN1 */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAEV2 computes the eigendecomposition of a 2-by-2 symmetric matrix */ -/* > [ A B ] */ -/* > [ B C ]. */ -/* > On return, RT1 is the eigenvalue of larger absolute value, RT2 is the */ -/* > eigenvalue of smaller absolute value, and (CS1,SN1) is the unit right */ -/* > eigenvector for RT1, giving the decomposition */ -/* > */ -/* > [ CS1 SN1 ] [ A B ] [ CS1 -SN1 ] = [ RT1 0 ] */ -/* > [-SN1 CS1 ] [ B C ] [ SN1 CS1 ] [ 0 RT2 ]. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION */ -/* > The (1,1) element of the 2-by-2 matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION */ -/* > The (1,2) element and the conjugate of the (2,1) element of */ -/* > the 2-by-2 matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION */ -/* > The (2,2) element of the 2-by-2 matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RT1 */ -/* > \verbatim */ -/* > RT1 is DOUBLE PRECISION */ -/* > The eigenvalue of larger absolute value. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RT2 */ -/* > \verbatim */ -/* > RT2 is DOUBLE PRECISION */ -/* > The eigenvalue of smaller absolute value. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] CS1 */ -/* > \verbatim */ -/* > CS1 is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[out] SN1 */ -/* > \verbatim */ -/* > SN1 is DOUBLE PRECISION */ -/* > The vector (CS1, SN1) is a unit right eigenvector for RT1. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > RT1 is accurate to a few ulps barring over/underflow. */ -/* > */ -/* > RT2 may be inaccurate if there is massive cancellation in the */ -/* > determinant A*C-B*B; higher precision or correctly rounded or */ -/* > correctly truncated arithmetic would be needed to compute RT2 */ -/* > accurately in all cases. */ -/* > */ -/* > CS1 and SN1 are accurate to a few ulps barring over/underflow. */ -/* > */ -/* > Overflow is possible only if RT1 is within a factor of 5 of overflow. */ -/* > Underflow is harmless if the input data is 0 or exceeds */ -/* > underflow_threshold / macheps. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlaev2_(doublereal *a, doublereal *b, doublereal *c__, - doublereal *rt1, doublereal *rt2, doublereal *cs1, doublereal *sn1) +int dlaev2_(doublereal *a, doublereal *b, doublereal *c__, doublereal *rt1, doublereal *rt2, + doublereal *cs1, doublereal *sn1) { - /* System generated locals */ doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal ab, df, cs, ct, tb, sm, tn, rt, adf, acs; integer sgn1, sgn2; doublereal acmn, acmx; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Compute the eigenvalues */ - sm = *a + *c__; df = *a - *c__; adf = abs(df); @@ -183,48 +23,27 @@ f"> */ acmn = *a; } if (adf > ab) { -/* Computing 2nd power */ d__1 = ab / adf; rt = adf * sqrt(d__1 * d__1 + 1.); } else if (adf < ab) { -/* Computing 2nd power */ d__1 = adf / ab; rt = ab * sqrt(d__1 * d__1 + 1.); } else { - -/* Includes case AB=ADF=0 */ - rt = ab * sqrt(2.); } if (sm < 0.) { *rt1 = (sm - rt) * .5; sgn1 = -1; - -/* Order of execution important. */ -/* To get fully accurate smaller eigenvalue, */ -/* next line needs to be executed in higher precision. */ - *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else if (sm > 0.) { *rt1 = (sm + rt) * .5; sgn1 = 1; - -/* Order of execution important. */ -/* To get fully accurate smaller eigenvalue, */ -/* next line needs to be executed in higher precision. */ - *rt2 = acmx / *rt1 * acmn - *b / *rt1 * *b; } else { - -/* Includes case RT1 = RT2 = 0 */ - *rt1 = rt * .5; *rt2 = rt * -.5; sgn1 = 1; } - -/* Compute the eigenvector */ - if (df >= 0.) { cs = df + rt; sgn2 = 1; @@ -253,11 +72,7 @@ f"> */ *sn1 = tn; } return 0; - -/* End of DLAEV2 */ - -} /* dlaev2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlals0.cpp b/lib/linalg/dlals0.cpp index 9dfb826915..6623506f7e 100644 --- a/lib/linalg/dlals0.cpp +++ b/lib/linalg/dlals0.cpp @@ -1,359 +1,40 @@ -/* fortran/dlals0.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b5 = -1.; static integer c__1 = 1; static doublereal c_b11 = 1.; static doublereal c_b13 = 0.; static integer c__0 = 0; - -/* > \brief \b DLALS0 applies back multiplying factors in solving the least squares problem using divide and c -onquer SVD approach. Used by sgelsd. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLALS0 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX, */ -/* PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, */ -/* POLES, DIFL, DIFR, Z, K, C, S, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER GIVPTR, ICOMPQ, INFO, K, LDB, LDBX, LDGCOL, */ -/* $ LDGNUM, NL, NR, NRHS, SQRE */ -/* DOUBLE PRECISION C, S */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER GIVCOL( LDGCOL, * ), PERM( * ) */ -/* DOUBLE PRECISION B( LDB, * ), BX( LDBX, * ), DIFL( * ), */ -/* $ DIFR( LDGNUM, * ), GIVNUM( LDGNUM, * ), */ -/* $ POLES( LDGNUM, * ), WORK( * ), Z( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLALS0 applies back the multiplying factors of either the left or the */ -/* > right singular vector matrix of a diagonal matrix appended by a row */ -/* > to the right hand side matrix B in solving the least squares problem */ -/* > using the divide-and-conquer SVD approach. */ -/* > */ -/* > For the left singular vector matrix, three types of orthogonal */ -/* > matrices are involved: */ -/* > */ -/* > (1L) Givens rotations: the number of such rotations is GIVPTR; the */ -/* > pairs of columns/rows they were applied to are stored in GIVCOL; */ -/* > and the C- and S-values of these rotations are stored in GIVNUM. */ -/* > */ -/* > (2L) Permutation. The (NL+1)-st row of B is to be moved to the first */ -/* > row, and for J=2:N, PERM(J)-th row of B is to be moved to the */ -/* > J-th row. */ -/* > */ -/* > (3L) The left singular vector matrix of the remaining matrix. */ -/* > */ -/* > For the right singular vector matrix, four types of orthogonal */ -/* > matrices are involved: */ -/* > */ -/* > (1R) The right singular vector matrix of the remaining matrix. */ -/* > */ -/* > (2R) If SQRE = 1, one extra Givens rotation to generate the right */ -/* > null space. */ -/* > */ -/* > (3R) The inverse transformation of (2L). */ -/* > */ -/* > (4R) The inverse transformation of (1L). */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ICOMPQ */ -/* > \verbatim */ -/* > ICOMPQ is INTEGER */ -/* > Specifies whether singular vectors are to be computed in */ -/* > factored form: */ -/* > = 0: Left singular vector matrix. */ -/* > = 1: Right singular vector matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NL */ -/* > \verbatim */ -/* > NL is INTEGER */ -/* > The row dimension of the upper block. NL >= 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NR */ -/* > \verbatim */ -/* > NR is INTEGER */ -/* > The row dimension of the lower block. NR >= 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] SQRE */ -/* > \verbatim */ -/* > SQRE is INTEGER */ -/* > = 0: the lower block is an NR-by-NR square matrix. */ -/* > = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */ -/* > */ -/* > The bidiagonal matrix has row dimension N = NL + NR + 1, */ -/* > and column dimension M = N + SQRE. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NRHS */ -/* > \verbatim */ -/* > NRHS is INTEGER */ -/* > The number of columns of B and BX. NRHS must be at least 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension ( LDB, NRHS ) */ -/* > On input, B contains the right hand sides of the least */ -/* > squares problem in rows 1 through M. On output, B contains */ -/* > the solution X in rows 1 through N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of B. LDB must be at least */ -/* > max(1,MAX( M, N ) ). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] BX */ -/* > \verbatim */ -/* > BX is DOUBLE PRECISION array, dimension ( LDBX, NRHS ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDBX */ -/* > \verbatim */ -/* > LDBX is INTEGER */ -/* > The leading dimension of BX. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PERM */ -/* > \verbatim */ -/* > PERM is INTEGER array, dimension ( N ) */ -/* > The permutations (from deflation and sorting) applied */ -/* > to the two blocks. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVPTR */ -/* > \verbatim */ -/* > GIVPTR is INTEGER */ -/* > The number of Givens rotations which took place in this */ -/* > subproblem. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVCOL */ -/* > \verbatim */ -/* > GIVCOL is INTEGER array, dimension ( LDGCOL, 2 ) */ -/* > Each pair of numbers indicates a pair of rows/columns */ -/* > involved in a Givens rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDGCOL */ -/* > \verbatim */ -/* > LDGCOL is INTEGER */ -/* > The leading dimension of GIVCOL, must be at least N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVNUM */ -/* > \verbatim */ -/* > GIVNUM is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ -/* > Each number indicates the C or S value used in the */ -/* > corresponding Givens rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDGNUM */ -/* > \verbatim */ -/* > LDGNUM is INTEGER */ -/* > The leading dimension of arrays DIFR, POLES and */ -/* > GIVNUM, must be at least K. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] POLES */ -/* > \verbatim */ -/* > POLES is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ -/* > On entry, POLES(1:K, 1) contains the new singular */ -/* > values obtained from solving the secular equation, and */ -/* > POLES(1:K, 2) is an array containing the poles in the secular */ -/* > equation. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIFL */ -/* > \verbatim */ -/* > DIFL is DOUBLE PRECISION array, dimension ( K ). */ -/* > On entry, DIFL(I) is the distance between I-th updated */ -/* > (undeflated) singular value and the I-th (undeflated) old */ -/* > singular value. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIFR */ -/* > \verbatim */ -/* > DIFR is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ). */ -/* > On entry, DIFR(I, 1) contains the distances between I-th */ -/* > updated (undeflated) singular value and the I+1-th */ -/* > (undeflated) old singular value. And DIFR(I, 2) is the */ -/* > normalizing factor for the I-th right singular vector. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension ( K ) */ -/* > Contain the components of the deflation-adjusted updating row */ -/* > vector. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > Contains the dimension of the non-deflated matrix, */ -/* > This is the order of the related secular equation. 1 <= K <=N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION */ -/* > C contains garbage if SQRE =0 and the C-value of a Givens */ -/* > rotation related to the right null space if SQRE = 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION */ -/* > S contains garbage if SQRE =0 and the S-value of a Givens */ -/* > rotation related to the right null space if SQRE = 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension ( K ) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ming Gu and Ren-Cang Li, Computer Science Division, University of */ -/* > California at Berkeley, USA \n */ -/* > Osni Marques, LBNL/NERSC, USA \n */ - -/* ===================================================================== */ -/* Subroutine */ int dlals0_(integer *icompq, integer *nl, integer *nr, - integer *sqre, integer *nrhs, doublereal *b, integer *ldb, doublereal - *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, - integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal * - poles, doublereal *difl, doublereal *difr, doublereal *z__, integer * - k, doublereal *c__, doublereal *s, doublereal *work, integer *info) +int dlals0_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *nrhs, doublereal *b, + integer *ldb, doublereal *bx, integer *ldbx, integer *perm, integer *givptr, + integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, + doublereal *poles, doublereal *difl, doublereal *difr, doublereal *z__, integer *k, + doublereal *c__, doublereal *s, doublereal *work, integer *info) { - /* System generated locals */ - integer givcol_dim1, givcol_offset, b_dim1, b_offset, bx_dim1, bx_offset, - difr_dim1, difr_offset, givnum_dim1, givnum_offset, poles_dim1, - poles_offset, i__1, i__2; + integer givcol_dim1, givcol_offset, b_dim1, b_offset, bx_dim1, bx_offset, difr_dim1, + difr_offset, givnum_dim1, givnum_offset, poles_dim1, poles_offset, i__1, i__2; doublereal d__1; - - /* Local variables */ integer i__, j, m, n; doublereal dj; integer nlp1; doublereal temp; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *); + extern int drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *); extern doublereal dnrm2_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *); doublereal diflj, difrj, dsigj; - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen), dcopy_(integer *, - doublereal *, integer *, doublereal *, integer *); + extern int dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal dlamc3_(doublereal *, doublereal *); - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dlacpy_(char *, integer *, integer - *, doublereal *, integer *, doublereal *, integer *, ftnlen), - xerbla_(char *, integer *, ftnlen); + extern int dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, ftnlen), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen); doublereal dsigjp; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; @@ -376,11 +57,8 @@ f"> */ --difl; --z__; --work; - - /* Function Body */ *info = 0; n = *nl + *nr + 1; - if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*nl < 1) { @@ -409,37 +87,20 @@ f"> */ xerbla_((char *)"DLALS0", &i__1, (ftnlen)6); return 0; } - m = n + *sqre; nlp1 = *nl + 1; - if (*icompq == 0) { - -/* Apply back orthogonal transformations from the left. */ - -/* Step (1L): apply back the Givens rotations performed. */ - i__1 = *givptr; for (i__ = 1; i__ <= i__1; ++i__) { - drot_(nrhs, &b[givcol[i__ + (givcol_dim1 << 1)] + b_dim1], ldb, & - b[givcol[i__ + givcol_dim1] + b_dim1], ldb, &givnum[i__ + - (givnum_dim1 << 1)], &givnum[i__ + givnum_dim1]); -/* L10: */ + drot_(nrhs, &b[givcol[i__ + (givcol_dim1 << 1)] + b_dim1], ldb, + &b[givcol[i__ + givcol_dim1] + b_dim1], ldb, &givnum[i__ + (givnum_dim1 << 1)], + &givnum[i__ + givnum_dim1]); } - -/* Step (2L): permute rows of B. */ - dcopy_(nrhs, &b[nlp1 + b_dim1], ldb, &bx[bx_dim1 + 1], ldbx); i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { - dcopy_(nrhs, &b[perm[i__] + b_dim1], ldb, &bx[i__ + bx_dim1], - ldbx); -/* L20: */ + dcopy_(nrhs, &b[perm[i__] + b_dim1], ldb, &bx[i__ + bx_dim1], ldbx); } - -/* Step (3L): apply the inverse of the left singular vector */ -/* matrix to BX. */ - if (*k == 1) { dcopy_(nrhs, &bx[bx_offset], ldbx, &b[b_offset], ldb); if (z__[1] < 0.) { @@ -459,58 +120,42 @@ f"> */ work[j] = 0.; } else { work[j] = -poles[j + (poles_dim1 << 1)] * z__[j] / diflj / - (poles[j + (poles_dim1 << 1)] + dj); + (poles[j + (poles_dim1 << 1)] + dj); } i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { - if (z__[i__] == 0. || poles[i__ + (poles_dim1 << 1)] == - 0.) { + if (z__[i__] == 0. || poles[i__ + (poles_dim1 << 1)] == 0.) { work[i__] = 0.; } else { - work[i__] = poles[i__ + (poles_dim1 << 1)] * z__[i__] - / (dlamc3_(&poles[i__ + (poles_dim1 << 1)], & - dsigj) - diflj) / (poles[i__ + (poles_dim1 << - 1)] + dj); + work[i__] = poles[i__ + (poles_dim1 << 1)] * z__[i__] / + (dlamc3_(&poles[i__ + (poles_dim1 << 1)], &dsigj) - diflj) / + (poles[i__ + (poles_dim1 << 1)] + dj); } -/* L30: */ } i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { - if (z__[i__] == 0. || poles[i__ + (poles_dim1 << 1)] == - 0.) { + if (z__[i__] == 0. || poles[i__ + (poles_dim1 << 1)] == 0.) { work[i__] = 0.; } else { - work[i__] = poles[i__ + (poles_dim1 << 1)] * z__[i__] - / (dlamc3_(&poles[i__ + (poles_dim1 << 1)], & - dsigjp) + difrj) / (poles[i__ + (poles_dim1 << - 1)] + dj); + work[i__] = poles[i__ + (poles_dim1 << 1)] * z__[i__] / + (dlamc3_(&poles[i__ + (poles_dim1 << 1)], &dsigjp) + difrj) / + (poles[i__ + (poles_dim1 << 1)] + dj); } -/* L40: */ } work[1] = -1.; temp = dnrm2_(k, &work[1], &c__1); - dgemv_((char *)"T", k, nrhs, &c_b11, &bx[bx_offset], ldbx, &work[1], & - c__1, &c_b13, &b[j + b_dim1], ldb, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &temp, &c_b11, &c__1, nrhs, &b[j + - b_dim1], ldb, info, (ftnlen)1); -/* L50: */ + dgemv_((char *)"T", k, nrhs, &c_b11, &bx[bx_offset], ldbx, &work[1], &c__1, &c_b13, + &b[j + b_dim1], ldb, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &temp, &c_b11, &c__1, nrhs, &b[j + b_dim1], ldb, info, + (ftnlen)1); } } - -/* Move the deflated rows of BX to B also. */ - - if (*k < max(m,n)) { + if (*k < max(m, n)) { i__1 = n - *k; - dlacpy_((char *)"A", &i__1, nrhs, &bx[*k + 1 + bx_dim1], ldbx, &b[*k + 1 - + b_dim1], ldb, (ftnlen)1); + dlacpy_((char *)"A", &i__1, nrhs, &bx[*k + 1 + bx_dim1], ldbx, &b[*k + 1 + b_dim1], ldb, + (ftnlen)1); } } else { - -/* Apply back the right orthogonal transformations. */ - -/* Step (1R): apply back the new right singular vector matrix */ -/* to B. */ - if (*k == 1) { dcopy_(nrhs, &b[b_offset], ldb, &bx[bx_offset], ldbx); } else { @@ -520,8 +165,8 @@ f"> */ if (z__[j] == 0.) { work[j] = 0.; } else { - work[j] = -z__[j] / difl[j] / (dsigj + poles[j + - poles_dim1]) / difr[j + (difr_dim1 << 1)]; + work[j] = -z__[j] / difl[j] / (dsigj + poles[j + poles_dim1]) / + difr[j + (difr_dim1 << 1)]; } i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { @@ -529,11 +174,10 @@ f"> */ work[i__] = 0.; } else { d__1 = -poles[i__ + 1 + (poles_dim1 << 1)]; - work[i__] = z__[j] / (dlamc3_(&dsigj, &d__1) - difr[ - i__ + difr_dim1]) / (dsigj + poles[i__ + - poles_dim1]) / difr[i__ + (difr_dim1 << 1)]; + work[i__] = z__[j] / (dlamc3_(&dsigj, &d__1) - difr[i__ + difr_dim1]) / + (dsigj + poles[i__ + poles_dim1]) / + difr[i__ + (difr_dim1 << 1)]; } -/* L60: */ } i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { @@ -541,62 +185,41 @@ f"> */ work[i__] = 0.; } else { d__1 = -poles[i__ + (poles_dim1 << 1)]; - work[i__] = z__[j] / (dlamc3_(&dsigj, &d__1) - difl[ - i__]) / (dsigj + poles[i__ + poles_dim1]) / - difr[i__ + (difr_dim1 << 1)]; + work[i__] = z__[j] / (dlamc3_(&dsigj, &d__1) - difl[i__]) / + (dsigj + poles[i__ + poles_dim1]) / + difr[i__ + (difr_dim1 << 1)]; } -/* L70: */ } - dgemv_((char *)"T", k, nrhs, &c_b11, &b[b_offset], ldb, &work[1], & - c__1, &c_b13, &bx[j + bx_dim1], ldbx, (ftnlen)1); -/* L80: */ + dgemv_((char *)"T", k, nrhs, &c_b11, &b[b_offset], ldb, &work[1], &c__1, &c_b13, + &bx[j + bx_dim1], ldbx, (ftnlen)1); } } - -/* Step (2R): if SQRE = 1, apply back the rotation that is */ -/* related to the right null space of the subproblem. */ - if (*sqre == 1) { dcopy_(nrhs, &b[m + b_dim1], ldb, &bx[m + bx_dim1], ldbx); - drot_(nrhs, &bx[bx_dim1 + 1], ldbx, &bx[m + bx_dim1], ldbx, c__, - s); + drot_(nrhs, &bx[bx_dim1 + 1], ldbx, &bx[m + bx_dim1], ldbx, c__, s); } - if (*k < max(m,n)) { + if (*k < max(m, n)) { i__1 = n - *k; - dlacpy_((char *)"A", &i__1, nrhs, &b[*k + 1 + b_dim1], ldb, &bx[*k + 1 + - bx_dim1], ldbx, (ftnlen)1); + dlacpy_((char *)"A", &i__1, nrhs, &b[*k + 1 + b_dim1], ldb, &bx[*k + 1 + bx_dim1], ldbx, + (ftnlen)1); } - -/* Step (3R): permute rows of B. */ - dcopy_(nrhs, &bx[bx_dim1 + 1], ldbx, &b[nlp1 + b_dim1], ldb); if (*sqre == 1) { dcopy_(nrhs, &bx[m + bx_dim1], ldbx, &b[m + b_dim1], ldb); } i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { - dcopy_(nrhs, &bx[i__ + bx_dim1], ldbx, &b[perm[i__] + b_dim1], - ldb); -/* L90: */ + dcopy_(nrhs, &bx[i__ + bx_dim1], ldbx, &b[perm[i__] + b_dim1], ldb); } - -/* Step (4R): apply back the Givens rotations performed. */ - for (i__ = *givptr; i__ >= 1; --i__) { d__1 = -givnum[i__ + givnum_dim1]; - drot_(nrhs, &b[givcol[i__ + (givcol_dim1 << 1)] + b_dim1], ldb, & - b[givcol[i__ + givcol_dim1] + b_dim1], ldb, &givnum[i__ + - (givnum_dim1 << 1)], &d__1); -/* L100: */ + drot_(nrhs, &b[givcol[i__ + (givcol_dim1 << 1)] + b_dim1], ldb, + &b[givcol[i__ + givcol_dim1] + b_dim1], ldb, &givnum[i__ + (givnum_dim1 << 1)], + &d__1); } } - return 0; - -/* End of DLALS0 */ - -} /* dlals0_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlalsa.cpp b/lib/linalg/dlalsa.cpp index a428ee8c3d..82b9d56562 100644 --- a/lib/linalg/dlalsa.cpp +++ b/lib/linalg/dlalsa.cpp @@ -1,349 +1,35 @@ -/* fortran/dlalsa.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b7 = 1.; static doublereal c_b8 = 0.; static integer c__2 = 2; - -/* > \brief \b DLALSA computes the SVD of the coefficient matrix in compact form. Used by sgelsd. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLALSA + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLALSA( ICOMPQ, SMLSIZ, N, NRHS, B, LDB, BX, LDBX, U, */ -/* LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR, */ -/* GIVCOL, LDGCOL, PERM, GIVNUM, C, S, WORK, */ -/* IWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER ICOMPQ, INFO, LDB, LDBX, LDGCOL, LDU, N, NRHS, */ -/* $ SMLSIZ */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ), */ -/* $ K( * ), PERM( LDGCOL, * ) */ -/* DOUBLE PRECISION B( LDB, * ), BX( LDBX, * ), C( * ), */ -/* $ DIFL( LDU, * ), DIFR( LDU, * ), */ -/* $ GIVNUM( LDU, * ), POLES( LDU, * ), S( * ), */ -/* $ U( LDU, * ), VT( LDU, * ), WORK( * ), */ -/* $ Z( LDU, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLALSA is an itermediate step in solving the least squares problem */ -/* > by computing the SVD of the coefficient matrix in compact form (The */ -/* > singular vectors are computed as products of simple orthorgonal */ -/* > matrices.). */ -/* > */ -/* > If ICOMPQ = 0, DLALSA applies the inverse of the left singular vector */ -/* > matrix of an upper bidiagonal matrix to the right hand side; and if */ -/* > ICOMPQ = 1, DLALSA applies the right singular vector matrix to the */ -/* > right hand side. The singular vector matrices were generated in */ -/* > compact form by DLALSA. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ICOMPQ */ -/* > \verbatim */ -/* > ICOMPQ is INTEGER */ -/* > Specifies whether the left or the right singular vector */ -/* > matrix is involved. */ -/* > = 0: Left singular vector matrix */ -/* > = 1: Right singular vector matrix */ -/* > \endverbatim */ -/* > */ -/* > \param[in] SMLSIZ */ -/* > \verbatim */ -/* > SMLSIZ is INTEGER */ -/* > The maximum size of the subproblems at the bottom of the */ -/* > computation tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The row and column dimensions of the upper bidiagonal matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NRHS */ -/* > \verbatim */ -/* > NRHS is INTEGER */ -/* > The number of columns of B and BX. NRHS must be at least 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension ( LDB, NRHS ) */ -/* > On input, B contains the right hand sides of the least */ -/* > squares problem in rows 1 through M. */ -/* > On output, B contains the solution X in rows 1 through N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of B in the calling subprogram. */ -/* > LDB must be at least max(1,MAX( M, N ) ). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] BX */ -/* > \verbatim */ -/* > BX is DOUBLE PRECISION array, dimension ( LDBX, NRHS ) */ -/* > On exit, the result of applying the left or right singular */ -/* > vector matrix to B. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDBX */ -/* > \verbatim */ -/* > LDBX is INTEGER */ -/* > The leading dimension of BX. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] U */ -/* > \verbatim */ -/* > U is DOUBLE PRECISION array, dimension ( LDU, SMLSIZ ). */ -/* > On entry, U contains the left singular vector matrices of all */ -/* > subproblems at the bottom level. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDU */ -/* > \verbatim */ -/* > LDU is INTEGER, LDU = > N. */ -/* > The leading dimension of arrays U, VT, DIFL, DIFR, */ -/* > POLES, GIVNUM, and Z. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] VT */ -/* > \verbatim */ -/* > VT is DOUBLE PRECISION array, dimension ( LDU, SMLSIZ+1 ). */ -/* > On entry, VT**T contains the right singular vector matrices of */ -/* > all subproblems at the bottom level. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER array, dimension ( N ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIFL */ -/* > \verbatim */ -/* > DIFL is DOUBLE PRECISION array, dimension ( LDU, NLVL ). */ -/* > where NLVL = INT(log_2 (N/(SMLSIZ+1))) + 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIFR */ -/* > \verbatim */ -/* > DIFR is DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ). */ -/* > On entry, DIFL(*, I) and DIFR(*, 2 * I -1) record */ -/* > distances between singular values on the I-th level and */ -/* > singular values on the (I -1)-th level, and DIFR(*, 2 * I) */ -/* > record the normalizing factors of the right singular vectors */ -/* > matrices of subproblems on I-th level. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension ( LDU, NLVL ). */ -/* > On entry, Z(1, I) contains the components of the deflation- */ -/* > adjusted updating row vector for subproblems on the I-th */ -/* > level. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] POLES */ -/* > \verbatim */ -/* > POLES is DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ). */ -/* > On entry, POLES(*, 2 * I -1: 2 * I) contains the new and old */ -/* > singular values involved in the secular equations on the I-th */ -/* > level. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVPTR */ -/* > \verbatim */ -/* > GIVPTR is INTEGER array, dimension ( N ). */ -/* > On entry, GIVPTR( I ) records the number of Givens */ -/* > rotations performed on the I-th problem on the computation */ -/* > tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVCOL */ -/* > \verbatim */ -/* > GIVCOL is INTEGER array, dimension ( LDGCOL, 2 * NLVL ). */ -/* > On entry, for each I, GIVCOL(*, 2 * I - 1: 2 * I) records the */ -/* > locations of Givens rotations performed on the I-th level on */ -/* > the computation tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDGCOL */ -/* > \verbatim */ -/* > LDGCOL is INTEGER, LDGCOL = > N. */ -/* > The leading dimension of arrays GIVCOL and PERM. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PERM */ -/* > \verbatim */ -/* > PERM is INTEGER array, dimension ( LDGCOL, NLVL ). */ -/* > On entry, PERM(*, I) records permutations done on the I-th */ -/* > level of the computation tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVNUM */ -/* > \verbatim */ -/* > GIVNUM is DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ). */ -/* > On entry, GIVNUM(*, 2 *I -1 : 2 * I) records the C- and S- */ -/* > values of Givens rotations performed on the I-th level on the */ -/* > computation tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension ( N ). */ -/* > On entry, if the I-th subproblem is not square, */ -/* > C( I ) contains the C-value of a Givens rotation related to */ -/* > the right null space of the I-th subproblem. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION array, dimension ( N ). */ -/* > On entry, if the I-th subproblem is not square, */ -/* > S( I ) contains the S-value of a Givens rotation related to */ -/* > the right null space of the I-th subproblem. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension (3*N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ming Gu and Ren-Cang Li, Computer Science Division, University of */ -/* > California at Berkeley, USA \n */ -/* > Osni Marques, LBNL/NERSC, USA \n */ - -/* ===================================================================== */ -/* Subroutine */ int dlalsa_(integer *icompq, integer *smlsiz, integer *n, - integer *nrhs, doublereal *b, integer *ldb, doublereal *bx, integer * - ldbx, doublereal *u, integer *ldu, doublereal *vt, integer *k, - doublereal *difl, doublereal *difr, doublereal *z__, doublereal * - poles, integer *givptr, integer *givcol, integer *ldgcol, integer * - perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal * - work, integer *iwork, integer *info) +int dlalsa_(integer *icompq, integer *smlsiz, integer *n, integer *nrhs, doublereal *b, + integer *ldb, doublereal *bx, integer *ldbx, doublereal *u, integer *ldu, + doublereal *vt, integer *k, doublereal *difl, doublereal *difr, doublereal *z__, + doublereal *poles, integer *givptr, integer *givcol, integer *ldgcol, integer *perm, + doublereal *givnum, doublereal *c__, doublereal *s, doublereal *work, integer *iwork, + integer *info) { - /* System generated locals */ - integer givcol_dim1, givcol_offset, perm_dim1, perm_offset, b_dim1, - b_offset, bx_dim1, bx_offset, difl_dim1, difl_offset, difr_dim1, - difr_offset, givnum_dim1, givnum_offset, poles_dim1, poles_offset, - u_dim1, u_offset, vt_dim1, vt_offset, z_dim1, z_offset, i__1, - i__2; - - /* Builtin functions */ + integer givcol_dim1, givcol_offset, perm_dim1, perm_offset, b_dim1, b_offset, bx_dim1, + bx_offset, difl_dim1, difl_offset, difr_dim1, difr_offset, givnum_dim1, givnum_offset, + poles_dim1, poles_offset, u_dim1, u_offset, vt_dim1, vt_offset, z_dim1, z_offset, i__1, + i__2; integer pow_lmp_ii(integer *, integer *); - - /* Local variables */ - integer i__, j, i1, ic, lf, nd, ll, nl, nr, im1, nlf, nrf, lvl, ndb1, - nlp1, lvl2, nrp1, nlvl, sqre; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + integer i__, j, i1, ic, lf, nd, ll, nl, nr, im1, nlf, nrf, lvl, ndb1, nlp1, lvl2, nrp1, nlvl, + sqre; + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); integer inode, ndiml, ndimr; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *), dlals0_(integer *, integer *, integer *, - integer *, integer *, doublereal *, integer *, doublereal *, - integer *, integer *, integer *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *, doublereal *, doublereal *, doublereal *, - integer *), dlasdt_(integer *, integer *, integer *, integer *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), + dlals0_(integer *, integer *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, integer *, integer *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, doublereal *, doublereal *, integer *), + dlasdt_(integer *, integer *, integer *, integer *, integer *, integer *, integer *), + xerbla_(char *, integer *, ftnlen); b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; @@ -383,10 +69,7 @@ f"> */ --s; --work; --iwork; - - /* Function Body */ *info = 0; - if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*smlsiz < 3) { @@ -409,75 +92,36 @@ f"> */ xerbla_((char *)"DLALSA", &i__1, (ftnlen)6); return 0; } - -/* Book-keeping and setting up the computation tree. */ - inode = 1; ndiml = inode + *n; ndimr = ndiml + *n; - - dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], - smlsiz); - -/* The following code applies back the left singular vector factors. */ -/* For applying back the right singular vector factors, go to 50. */ - + dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], smlsiz); if (*icompq == 1) { goto L50; } - -/* The nodes on the bottom level of the tree were solved */ -/* by DLASDQ. The corresponding left and right singular vector */ -/* matrices are in explicit form. First apply back the left */ -/* singular vector matrices. */ - ndb1 = (nd + 1) / 2; i__1 = nd; for (i__ = ndb1; i__ <= i__1; ++i__) { - -/* IC : center row of each node */ -/* NL : number of rows of left subproblem */ -/* NR : number of rows of right subproblem */ -/* NLF: starting row of the left subproblem */ -/* NRF: starting row of the right subproblem */ - i1 = i__ - 1; ic = iwork[inode + i1]; nl = iwork[ndiml + i1]; nr = iwork[ndimr + i1]; nlf = ic - nl; nrf = ic + 1; - dgemm_((char *)"T", (char *)"N", &nl, nrhs, &nl, &c_b7, &u[nlf + u_dim1], ldu, &b[nlf - + b_dim1], ldb, &c_b8, &bx[nlf + bx_dim1], ldbx, (ftnlen)1, ( - ftnlen)1); - dgemm_((char *)"T", (char *)"N", &nr, nrhs, &nr, &c_b7, &u[nrf + u_dim1], ldu, &b[nrf - + b_dim1], ldb, &c_b8, &bx[nrf + bx_dim1], ldbx, (ftnlen)1, ( - ftnlen)1); -/* L10: */ + dgemm_((char *)"T", (char *)"N", &nl, nrhs, &nl, &c_b7, &u[nlf + u_dim1], ldu, &b[nlf + b_dim1], ldb, &c_b8, + &bx[nlf + bx_dim1], ldbx, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"T", (char *)"N", &nr, nrhs, &nr, &c_b7, &u[nrf + u_dim1], ldu, &b[nrf + b_dim1], ldb, &c_b8, + &bx[nrf + bx_dim1], ldbx, (ftnlen)1, (ftnlen)1); } - -/* Next copy the rows of B that correspond to unchanged rows */ -/* in the bidiagonal matrix to BX. */ - i__1 = nd; for (i__ = 1; i__ <= i__1; ++i__) { ic = iwork[inode + i__ - 1]; dcopy_(nrhs, &b[ic + b_dim1], ldb, &bx[ic + bx_dim1], ldbx); -/* L20: */ } - -/* Finally go through the left singular vector matrices of all */ -/* the other subproblems bottom-up on the tree. */ - j = pow_lmp_ii(&c__2, &nlvl); sqre = 0; - for (lvl = nlvl; lvl >= 1; --lvl) { lvl2 = (lvl << 1) - 1; - -/* find the first node LF and last node LL on */ -/* the current level LVL */ - if (lvl == 1) { lf = 1; ll = 1; @@ -495,34 +139,19 @@ f"> */ nlf = ic - nl; nrf = ic + 1; --j; - dlals0_(icompq, &nl, &nr, &sqre, nrhs, &bx[nlf + bx_dim1], ldbx, & - b[nlf + b_dim1], ldb, &perm[nlf + lvl * perm_dim1], & - givptr[j], &givcol[nlf + lvl2 * givcol_dim1], ldgcol, & - givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * - poles_dim1], &difl[nlf + lvl * difl_dim1], &difr[nlf + - lvl2 * difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[ - j], &s[j], &work[1], info); -/* L30: */ + dlals0_(icompq, &nl, &nr, &sqre, nrhs, &bx[nlf + bx_dim1], ldbx, &b[nlf + b_dim1], ldb, + &perm[nlf + lvl * perm_dim1], &givptr[j], &givcol[nlf + lvl2 * givcol_dim1], + ldgcol, &givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * poles_dim1], + &difl[nlf + lvl * difl_dim1], &difr[nlf + lvl2 * difr_dim1], + &z__[nlf + lvl * z_dim1], &k[j], &c__[j], &s[j], &work[1], info); } -/* L40: */ } goto L90; - -/* ICOMPQ = 1: applying back the right singular vector factors. */ - L50: - -/* First now go through the right singular vector matrices of all */ -/* the tree nodes top-down. */ - j = 0; i__1 = nlvl; for (lvl = 1; lvl <= i__1; ++lvl) { lvl2 = (lvl << 1) - 1; - -/* Find the first node LF and last node LL on */ -/* the current level LVL. */ - if (lvl == 1) { lf = 1; ll = 1; @@ -545,22 +174,13 @@ L50: sqre = 1; } ++j; - dlals0_(icompq, &nl, &nr, &sqre, nrhs, &b[nlf + b_dim1], ldb, &bx[ - nlf + bx_dim1], ldbx, &perm[nlf + lvl * perm_dim1], & - givptr[j], &givcol[nlf + lvl2 * givcol_dim1], ldgcol, & - givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * - poles_dim1], &difl[nlf + lvl * difl_dim1], &difr[nlf + - lvl2 * difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[ - j], &s[j], &work[1], info); -/* L60: */ + dlals0_(icompq, &nl, &nr, &sqre, nrhs, &b[nlf + b_dim1], ldb, &bx[nlf + bx_dim1], ldbx, + &perm[nlf + lvl * perm_dim1], &givptr[j], &givcol[nlf + lvl2 * givcol_dim1], + ldgcol, &givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * poles_dim1], + &difl[nlf + lvl * difl_dim1], &difr[nlf + lvl2 * difr_dim1], + &z__[nlf + lvl * z_dim1], &k[j], &c__[j], &s[j], &work[1], info); } -/* L70: */ } - -/* The nodes on the bottom level of the tree were solved */ -/* by DLASDQ. The corresponding right singular vector */ -/* matrices are in explicit form. Apply them back. */ - ndb1 = (nd + 1) / 2; i__1 = nd; for (i__ = ndb1; i__ <= i__1; ++i__) { @@ -576,23 +196,14 @@ L50: } nlf = ic - nl; nrf = ic + 1; - dgemm_((char *)"T", (char *)"N", &nlp1, nrhs, &nlp1, &c_b7, &vt[nlf + vt_dim1], ldu, & - b[nlf + b_dim1], ldb, &c_b8, &bx[nlf + bx_dim1], ldbx, ( - ftnlen)1, (ftnlen)1); - dgemm_((char *)"T", (char *)"N", &nrp1, nrhs, &nrp1, &c_b7, &vt[nrf + vt_dim1], ldu, & - b[nrf + b_dim1], ldb, &c_b8, &bx[nrf + bx_dim1], ldbx, ( - ftnlen)1, (ftnlen)1); -/* L80: */ + dgemm_((char *)"T", (char *)"N", &nlp1, nrhs, &nlp1, &c_b7, &vt[nlf + vt_dim1], ldu, &b[nlf + b_dim1], ldb, + &c_b8, &bx[nlf + bx_dim1], ldbx, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"T", (char *)"N", &nrp1, nrhs, &nrp1, &c_b7, &vt[nrf + vt_dim1], ldu, &b[nrf + b_dim1], ldb, + &c_b8, &bx[nrf + bx_dim1], ldbx, (ftnlen)1, (ftnlen)1); } - L90: - return 0; - -/* End of DLALSA */ - -} /* dlalsa_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlalsd.cpp b/lib/linalg/dlalsd.cpp index f3678a1bfd..a68eb9b93e 100644 --- a/lib/linalg/dlalsd.cpp +++ b/lib/linalg/dlalsd.cpp @@ -1,219 +1,18 @@ -/* fortran/dlalsd.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static doublereal c_b6 = 0.; static integer c__0 = 0; static doublereal c_b11 = 1.; - -/* > \brief \b DLALSD uses the singular value decomposition of A to solve the least squares problem. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLALSD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, */ -/* RANK, WORK, IWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDB, N, NRHS, RANK, SMLSIZ */ -/* DOUBLE PRECISION RCOND */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IWORK( * ) */ -/* DOUBLE PRECISION B( LDB, * ), D( * ), E( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLALSD uses the singular value decomposition of A to solve the least */ -/* > squares problem of finding X to minimize the Euclidean norm of each */ -/* > column of A*X-B, where A is N-by-N upper bidiagonal, and X and B */ -/* > are N-by-NRHS. The solution X overwrites B. */ -/* > */ -/* > The singular values of A smaller than RCOND times the largest */ -/* > singular value are treated as zero in solving the least squares */ -/* > problem; in this case a minimum norm solution is returned. */ -/* > The actual singular values are returned in D in ascending order. */ -/* > */ -/* > This code makes very mild assumptions about floating point */ -/* > arithmetic. It will work on machines with a guard digit in */ -/* > add/subtract, or on those binary machines without guard digits */ -/* > which subtract like the Cray XMP, Cray YMP, Cray C 90, or Cray 2. */ -/* > It could conceivably fail on hexadecimal or decimal machines */ -/* > without guard digits, but we know of none. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': D and E define an upper bidiagonal matrix. */ -/* > = 'L': D and E define a lower bidiagonal matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] SMLSIZ */ -/* > \verbatim */ -/* > SMLSIZ is INTEGER */ -/* > The maximum size of the subproblems at the bottom of the */ -/* > computation tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The dimension of the bidiagonal matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NRHS */ -/* > \verbatim */ -/* > NRHS is INTEGER */ -/* > The number of columns of B. NRHS must be at least 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry D contains the main diagonal of the bidiagonal */ -/* > matrix. On exit, if INFO = 0, D contains its singular values. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > Contains the super-diagonal entries of the bidiagonal matrix. */ -/* > On exit, E has been destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ -/* > On input, B contains the right hand sides of the least */ -/* > squares problem. On output, B contains the solution X. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of B in the calling subprogram. */ -/* > LDB must be at least max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RCOND */ -/* > \verbatim */ -/* > RCOND is DOUBLE PRECISION */ -/* > The singular values of A less than or equal to RCOND times */ -/* > the largest singular value are treated as zero in solving */ -/* > the least squares problem. If RCOND is negative, */ -/* > machine precision is used instead. */ -/* > For example, if diag(S)*X=B were the least squares problem, */ -/* > where diag(S) is a diagonal matrix of singular values, the */ -/* > solution would be X(i) = B(i) / S(i) if S(i) is greater than */ -/* > RCOND*max(S), and X(i) = 0 if S(i) is less than or equal to */ -/* > RCOND*max(S). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RANK */ -/* > \verbatim */ -/* > RANK is INTEGER */ -/* > The number of singular values of A greater than RCOND times */ -/* > the largest singular value. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension at least */ -/* > (9*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS + (SMLSIZ+1)**2), */ -/* > where NLVL = max(0, INT(log_2 (N/(SMLSIZ+1))) + 1). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension at least */ -/* > (3*N*NLVL + 11*N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: The algorithm failed to compute a singular value while */ -/* > working on the submatrix lying in rows and columns */ -/* > INFO/(N+1) through MOD(INFO,N+1). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ming Gu and Ren-Cang Li, Computer Science Division, University of */ -/* > California at Berkeley, USA \n */ -/* > Osni Marques, LBNL/NERSC, USA \n */ - -/* ===================================================================== */ -/* Subroutine */ int dlalsd_(char *uplo, integer *smlsiz, integer *n, integer - *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, - doublereal *rcond, integer *rank, doublereal *work, integer *iwork, - integer *info, ftnlen uplo_len) +int dlalsd_(char *uplo, integer *smlsiz, integer *n, integer *nrhs, doublereal *d__, doublereal *e, + doublereal *b, integer *ldb, doublereal *rcond, integer *rank, doublereal *work, + integer *iwork, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer b_dim1, b_offset, i__1, i__2; doublereal d__1; - - /* Builtin functions */ double log(doublereal), d_lmp_sign(doublereal *, doublereal *); - - /* Local variables */ integer c__, i__, j, k; doublereal r__; integer s, u, z__; @@ -227,74 +26,42 @@ f"> */ integer difl, difr; doublereal rcnd; integer perm, nsub; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *); + extern int drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *); integer nlvl, sqre, bxst; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), - dcopy_(integer *, doublereal *, integer *, doublereal *, integer - *); + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer poles, sizei, nsize, nwork, icmpq1, icmpq2; extern doublereal dlamch_(char *, ftnlen); - extern /* Subroutine */ int dlasda_(integer *, integer *, integer *, - integer *, doublereal *, doublereal *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *, integer *, integer *, integer *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *, - integer *), dlalsa_(integer *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - doublereal *, doublereal *, integer *, integer *, integer *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - integer *, integer *), dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern int dlasda_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *, integer *, integer *, integer *, + doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *), + dlalsa_(integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dlasdq_(char *, integer *, integer *, integer - *, integer *, integer *, doublereal *, doublereal *, doublereal *, - integer *, doublereal *, integer *, doublereal *, integer *, - doublereal *, integer *, ftnlen), dlacpy_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - ftnlen), dlartg_(doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *), dlaset_(char *, integer *, integer *, - doublereal *, doublereal *, doublereal *, integer *, ftnlen), - xerbla_(char *, integer *, ftnlen); + extern int dlasdq_(char *, integer *, integer *, integer *, integer *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen); integer givcol; - extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, - ftnlen); - extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, - integer *, ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, ftnlen); + extern int dlasrt_(char *, integer *, doublereal *, integer *, ftnlen); doublereal orgnrm; integer givnum, givptr, smlszp; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; --e; b_dim1 = *ldb; @@ -302,10 +69,7 @@ f"> */ b -= b_offset; --work; --iwork; - - /* Function Body */ *info = 0; - if (*n < 0) { *info = -3; } else if (*nrhs < 1) { @@ -318,38 +82,26 @@ f"> */ xerbla_((char *)"DLALSD", &i__1, (ftnlen)6); return 0; } - eps = dlamch_((char *)"Epsilon", (ftnlen)7); - -/* Set up the tolerance. */ - if (*rcond <= 0. || *rcond >= 1.) { rcnd = eps; } else { rcnd = *rcond; } - *rank = 0; - -/* Quick return if possible. */ - if (*n == 0) { return 0; } else if (*n == 1) { if (d__[1] == 0.) { - dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &b[b_offset], ldb, ( - ftnlen)1); + dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &b[b_offset], ldb, (ftnlen)1); } else { *rank = 1; - dlascl_((char *)"G", &c__0, &c__0, &d__[1], &c_b11, &c__1, nrhs, &b[ - b_offset], ldb, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &d__[1], &c_b11, &c__1, nrhs, &b[b_offset], ldb, info, + (ftnlen)1); d__[1] = abs(d__[1]); } return 0; } - -/* Rotate the matrix if it is lower bidiagonal. */ - if (*(unsigned char *)uplo == 'L') { i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { @@ -358,13 +110,11 @@ f"> */ e[i__] = sn * d__[i__ + 1]; d__[i__ + 1] = cs * d__[i__ + 1]; if (*nrhs == 1) { - drot_(&c__1, &b[i__ + b_dim1], &c__1, &b[i__ + 1 + b_dim1], & - c__1, &cs, &sn); + drot_(&c__1, &b[i__ + b_dim1], &c__1, &b[i__ + 1 + b_dim1], &c__1, &cs, &sn); } else { work[(i__ << 1) - 1] = cs; work[i__ * 2] = sn; } -/* L10: */ } if (*nrhs > 1) { i__1 = *nrhs; @@ -373,37 +123,25 @@ f"> */ for (j = 1; j <= i__2; ++j) { cs = work[(j << 1) - 1]; sn = work[j * 2]; - drot_(&c__1, &b[j + i__ * b_dim1], &c__1, &b[j + 1 + i__ * - b_dim1], &c__1, &cs, &sn); -/* L20: */ + drot_(&c__1, &b[j + i__ * b_dim1], &c__1, &b[j + 1 + i__ * b_dim1], &c__1, &cs, + &sn); } -/* L30: */ } } } - -/* Scale. */ - nm1 = *n - 1; orgnrm = dlanst_((char *)"M", n, &d__[1], &e[1], (ftnlen)1); if (orgnrm == 0.) { dlaset_((char *)"A", n, nrhs, &c_b6, &c_b6, &b[b_offset], ldb, (ftnlen)1); return 0; } - - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, &c__1, &d__[1], n, info, ( - ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, &nm1, &c__1, &e[1], &nm1, - info, (ftnlen)1); - -/* If N is smaller than the minimum divide size SMLSIZ, then solve */ -/* the problem with another solver. */ - + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, &c__1, &d__[1], n, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, &nm1, &c__1, &e[1], &nm1, info, (ftnlen)1); if (*n <= *smlsiz) { nwork = *n * *n + 1; dlaset_((char *)"A", n, n, &c_b6, &c_b11, &work[1], n, (ftnlen)1); - dlasdq_((char *)"U", &c__0, n, n, &c__0, nrhs, &d__[1], &e[1], &work[1], n, & - work[1], n, &b[b_offset], ldb, &work[nwork], info, (ftnlen)1); + dlasdq_((char *)"U", &c__0, n, n, &c__0, nrhs, &d__[1], &e[1], &work[1], n, &work[1], n, + &b[b_offset], ldb, &work[nwork], info, (ftnlen)1); if (*info != 0) { return 0; } @@ -411,37 +149,23 @@ f"> */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if (d__[i__] <= tol) { - dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &b[i__ + b_dim1], ldb, - (ftnlen)1); + dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &b[i__ + b_dim1], ldb, (ftnlen)1); } else { - dlascl_((char *)"G", &c__0, &c__0, &d__[i__], &c_b11, &c__1, nrhs, &b[ - i__ + b_dim1], ldb, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &d__[i__], &c_b11, &c__1, nrhs, &b[i__ + b_dim1], ldb, + info, (ftnlen)1); ++(*rank); } -/* L40: */ } - dgemm_((char *)"T", (char *)"N", n, nrhs, n, &c_b11, &work[1], n, &b[b_offset], ldb, & - c_b6, &work[nwork], n, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"T", (char *)"N", n, nrhs, n, &c_b11, &work[1], n, &b[b_offset], ldb, &c_b6, &work[nwork], n, + (ftnlen)1, (ftnlen)1); dlacpy_((char *)"A", n, nrhs, &work[nwork], n, &b[b_offset], ldb, (ftnlen)1); - -/* Unscale. */ - - dlascl_((char *)"G", &c__0, &c__0, &c_b11, &orgnrm, n, &c__1, &d__[1], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &c_b11, &orgnrm, n, &c__1, &d__[1], n, info, (ftnlen)1); dlasrt_((char *)"D", n, &d__[1], info, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, nrhs, &b[b_offset], - ldb, info, (ftnlen)1); - + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, nrhs, &b[b_offset], ldb, info, (ftnlen)1); return 0; } - -/* Book-keeping and setting up some constants. */ - - nlvl = (integer) (log((doublereal) (*n) / (doublereal) (*smlsiz + 1)) / - log(2.)) + 1; - + nlvl = (integer)(log((doublereal)(*n) / (doublereal)(*smlsiz + 1)) / log(2.)) + 1; smlszp = *smlsiz + 1; - u = 1; vt = *smlsiz * *n + 1; difl = vt + smlszp * *n; @@ -453,55 +177,35 @@ f"> */ givnum = poles + (nlvl << 1) * *n; bx = givnum + (nlvl << 1) * *n; nwork = bx + *n * *nrhs; - sizei = *n + 1; k = sizei + *n; givptr = k + *n; perm = givptr + *n; givcol = perm + nlvl * *n; iwk = givcol + (nlvl * *n << 1); - st = 1; sqre = 0; icmpq1 = 1; icmpq2 = 0; nsub = 0; - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = d__[i__], abs(d__1)) < eps) { d__[i__] = d_lmp_sign(&eps, &d__[i__]); } -/* L50: */ } - i__1 = nm1; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = e[i__], abs(d__1)) < eps || i__ == nm1) { ++nsub; iwork[nsub] = st; - -/* Subproblem found. First determine its size and then */ -/* apply divide and conquer on it. */ - if (i__ < nm1) { - -/* A subproblem with E(I) small for I < NM1. */ - nsize = i__ - st + 1; iwork[sizei + nsub - 1] = nsize; } else if ((d__1 = e[i__], abs(d__1)) >= eps) { - -/* A subproblem with E(NM1) not too small but I = NM1. */ - nsize = *n - st + 1; iwork[sizei + nsub - 1] = nsize; } else { - -/* A subproblem with E(NM1) small. This implies an */ -/* 1-by-1 subproblem at D(N), which is not solved */ -/* explicitly. */ - nsize = i__ - st + 1; iwork[sizei + nsub - 1] = nsize; ++nsub; @@ -511,80 +215,50 @@ f"> */ } st1 = st - 1; if (nsize == 1) { - -/* This is a 1-by-1 subproblem and is not solved */ -/* explicitly. */ - dcopy_(nrhs, &b[st + b_dim1], ldb, &work[bx + st1], n); } else if (nsize <= *smlsiz) { - -/* This is a small subproblem and is solved by DLASDQ. */ - - dlaset_((char *)"A", &nsize, &nsize, &c_b6, &c_b11, &work[vt + st1], - n, (ftnlen)1); - dlasdq_((char *)"U", &c__0, &nsize, &nsize, &c__0, nrhs, &d__[st], &e[ - st], &work[vt + st1], n, &work[nwork], n, &b[st + - b_dim1], ldb, &work[nwork], info, (ftnlen)1); + dlaset_((char *)"A", &nsize, &nsize, &c_b6, &c_b11, &work[vt + st1], n, (ftnlen)1); + dlasdq_((char *)"U", &c__0, &nsize, &nsize, &c__0, nrhs, &d__[st], &e[st], &work[vt + st1], + n, &work[nwork], n, &b[st + b_dim1], ldb, &work[nwork], info, (ftnlen)1); if (*info != 0) { return 0; } - dlacpy_((char *)"A", &nsize, nrhs, &b[st + b_dim1], ldb, &work[bx + - st1], n, (ftnlen)1); + dlacpy_((char *)"A", &nsize, nrhs, &b[st + b_dim1], ldb, &work[bx + st1], n, (ftnlen)1); } else { - -/* A large problem. Solve it using divide and conquer. */ - - dlasda_(&icmpq1, smlsiz, &nsize, &sqre, &d__[st], &e[st], & - work[u + st1], n, &work[vt + st1], &iwork[k + st1], & - work[difl + st1], &work[difr + st1], &work[z__ + st1], - &work[poles + st1], &iwork[givptr + st1], &iwork[ - givcol + st1], n, &iwork[perm + st1], &work[givnum + - st1], &work[c__ + st1], &work[s + st1], &work[nwork], - &iwork[iwk], info); + dlasda_(&icmpq1, smlsiz, &nsize, &sqre, &d__[st], &e[st], &work[u + st1], n, + &work[vt + st1], &iwork[k + st1], &work[difl + st1], &work[difr + st1], + &work[z__ + st1], &work[poles + st1], &iwork[givptr + st1], + &iwork[givcol + st1], n, &iwork[perm + st1], &work[givnum + st1], + &work[c__ + st1], &work[s + st1], &work[nwork], &iwork[iwk], info); if (*info != 0) { return 0; } bxst = bx + st1; - dlalsa_(&icmpq2, smlsiz, &nsize, nrhs, &b[st + b_dim1], ldb, & - work[bxst], n, &work[u + st1], n, &work[vt + st1], & - iwork[k + st1], &work[difl + st1], &work[difr + st1], - &work[z__ + st1], &work[poles + st1], &iwork[givptr + - st1], &iwork[givcol + st1], n, &iwork[perm + st1], & - work[givnum + st1], &work[c__ + st1], &work[s + st1], - &work[nwork], &iwork[iwk], info); + dlalsa_(&icmpq2, smlsiz, &nsize, nrhs, &b[st + b_dim1], ldb, &work[bxst], n, + &work[u + st1], n, &work[vt + st1], &iwork[k + st1], &work[difl + st1], + &work[difr + st1], &work[z__ + st1], &work[poles + st1], + &iwork[givptr + st1], &iwork[givcol + st1], n, &iwork[perm + st1], + &work[givnum + st1], &work[c__ + st1], &work[s + st1], &work[nwork], + &iwork[iwk], info); if (*info != 0) { return 0; } } st = i__ + 1; } -/* L60: */ } - -/* Apply the singular values and treat the tiny ones as zero. */ - tol = rcnd * (d__1 = d__[idamax_(n, &d__[1], &c__1)], abs(d__1)); - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Some of the elements in D can be negative because 1-by-1 */ -/* subproblems were not solved explicitly. */ - if ((d__1 = d__[i__], abs(d__1)) <= tol) { - dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &work[bx + i__ - 1], n, ( - ftnlen)1); + dlaset_((char *)"A", &c__1, nrhs, &c_b6, &c_b6, &work[bx + i__ - 1], n, (ftnlen)1); } else { ++(*rank); - dlascl_((char *)"G", &c__0, &c__0, &d__[i__], &c_b11, &c__1, nrhs, &work[ - bx + i__ - 1], n, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &d__[i__], &c_b11, &c__1, nrhs, &work[bx + i__ - 1], n, info, + (ftnlen)1); } d__[i__] = (d__1 = d__[i__], abs(d__1)); -/* L70: */ } - -/* Now apply back the right singular vectors. */ - icmpq2 = 1; i__1 = nsub; for (i__ = 1; i__ <= i__1; ++i__) { @@ -595,38 +269,24 @@ f"> */ if (nsize == 1) { dcopy_(nrhs, &work[bxst], n, &b[st + b_dim1], ldb); } else if (nsize <= *smlsiz) { - dgemm_((char *)"T", (char *)"N", &nsize, nrhs, &nsize, &c_b11, &work[vt + st1], n, - &work[bxst], n, &c_b6, &b[st + b_dim1], ldb, (ftnlen)1, ( - ftnlen)1); + dgemm_((char *)"T", (char *)"N", &nsize, nrhs, &nsize, &c_b11, &work[vt + st1], n, &work[bxst], n, + &c_b6, &b[st + b_dim1], ldb, (ftnlen)1, (ftnlen)1); } else { - dlalsa_(&icmpq2, smlsiz, &nsize, nrhs, &work[bxst], n, &b[st + - b_dim1], ldb, &work[u + st1], n, &work[vt + st1], &iwork[ - k + st1], &work[difl + st1], &work[difr + st1], &work[z__ - + st1], &work[poles + st1], &iwork[givptr + st1], &iwork[ - givcol + st1], n, &iwork[perm + st1], &work[givnum + st1], - &work[c__ + st1], &work[s + st1], &work[nwork], &iwork[ - iwk], info); + dlalsa_(&icmpq2, smlsiz, &nsize, nrhs, &work[bxst], n, &b[st + b_dim1], ldb, + &work[u + st1], n, &work[vt + st1], &iwork[k + st1], &work[difl + st1], + &work[difr + st1], &work[z__ + st1], &work[poles + st1], &iwork[givptr + st1], + &iwork[givcol + st1], n, &iwork[perm + st1], &work[givnum + st1], + &work[c__ + st1], &work[s + st1], &work[nwork], &iwork[iwk], info); if (*info != 0) { return 0; } } -/* L80: */ } - -/* Unscale and sort the singular values. */ - - dlascl_((char *)"G", &c__0, &c__0, &c_b11, &orgnrm, n, &c__1, &d__[1], n, info, ( - ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &c_b11, &orgnrm, n, &c__1, &d__[1], n, info, (ftnlen)1); dlasrt_((char *)"D", n, &d__[1], info, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, nrhs, &b[b_offset], ldb, - info, (ftnlen)1); - + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b11, n, nrhs, &b[b_offset], ldb, info, (ftnlen)1); return 0; - -/* End of DLALSD */ - -} /* dlalsd_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlamc3.cpp b/lib/linalg/dlamc3.cpp index a7dbd89bc0..0c33327867 100644 --- a/lib/linalg/dlamc3.cpp +++ b/lib/linalg/dlamc3.cpp @@ -1,68 +1,13 @@ -/* static/dlamc3.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLAMC3 */ -/* > \details */ -/* > \b Purpose: */ -/* > \verbatim */ -/* > DLAMC3 is intended to force A and B to be stored prior to doing */ -/* > the addition of A and B , for use in situations where optimizers */ -/* > might hold one of these in a register. */ -/* > \endverbatim */ -/* > \author LAPACK is a software package provided by Univ. of Tennessee, Univ. of California Berkeley, Univ. -of Colorado Denver and NAG Ltd.. */ -/* > \date December 2016 */ -/* > \ingroup auxOTHERauxiliary */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is a DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in] B */ -/* > \verbatim */ -/* > B is a DOUBLE PRECISION */ -/* > The values A and B. */ -/* > \endverbatim */ -/* > */ doublereal dlamc3_(doublereal *a, doublereal *b) { - /* System generated locals */ doublereal ret_val; - - -/* -- LAPACK auxiliary routine (version 3.7.0) -- */ -/* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ -/* November 2010 */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* ===================================================================== */ - -/* .. Executable Statements .. */ - ret_val = *a + *b; - return ret_val; - -/* End of DLAMC3 */ - -} /* dlamc3_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlamch.cpp b/lib/linalg/dlamch.cpp index 3d616d95d2..277096e6f3 100644 --- a/lib/linalg/dlamch.cpp +++ b/lib/linalg/dlamch.cpp @@ -12,34 +12,34 @@ extern "C" { doublereal dlamch_(const char *cmach) { - if (!cmach) return 0.0; - char select = toupper(*cmach); + if (!cmach) return 0.0; + char select = toupper(*cmach); - // BLAS assumes rounding not truncation => epsilon is half - const double eps = 0.5 * std::numeric_limits::epsilon(); - if (select == 'E') return eps; + // BLAS assumes rounding not truncation => epsilon is half + const double eps = 0.5 * std::numeric_limits::epsilon(); + if (select == 'E') return eps; - double min = std::numeric_limits::min(); - const double max = std::numeric_limits::max(); - double small = 1.0 / max; - if (small >= min) min = small * (1.0 + eps); - if (select == 'S') return min; + double min = std::numeric_limits::min(); + const double max = std::numeric_limits::max(); + double small = 1.0 / max; + if (small >= min) min = small * (1.0 + eps); + if (select == 'S') return min; - const double radix = std::numeric_limits::radix; - if (select == 'B') return radix; + const double radix = std::numeric_limits::radix; + if (select == 'B') return radix; - if (select == 'P') return eps * radix; + if (select == 'P') return eps * radix; - if (select == 'N') return std::numeric_limits::digits; + if (select == 'N') return std::numeric_limits::digits; - if (select == 'M') return std::numeric_limits::min_exponent; + if (select == 'M') return std::numeric_limits::min_exponent; - if (select == 'U') return min; + if (select == 'U') return min; - if (select == 'L') return std::numeric_limits::max_exponent; + if (select == 'L') return std::numeric_limits::max_exponent; - if (select == 'O') return max; + if (select == 'O') return max; - return 0.0; + return 0.0; } } diff --git a/lib/linalg/dlamrg.cpp b/lib/linalg/dlamrg.cpp index 810d1db154..cb4d918840 100644 --- a/lib/linalg/dlamrg.cpp +++ b/lib/linalg/dlamrg.cpp @@ -1,151 +1,13 @@ -/* fortran/dlamrg.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLAMRG creates a permutation list to merge the entries of two independently sorted sets into a -single set sorted in ascending order. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAMRG + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAMRG( N1, N2, A, DTRD1, DTRD2, INDEX ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER DTRD1, DTRD2, N1, N2 */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER INDEX( * ) */ -/* DOUBLE PRECISION A( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAMRG will create a permutation list which will merge the elements */ -/* > of A (which is composed of two independently sorted sets) into a */ -/* > single set which is sorted in ascending order. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N1 */ -/* > \verbatim */ -/* > N1 is INTEGER */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N2 */ -/* > \verbatim */ -/* > N2 is INTEGER */ -/* > These arguments contain the respective lengths of the two */ -/* > sorted lists to be merged. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (N1+N2) */ -/* > The first N1 elements of A contain a list of numbers which */ -/* > are sorted in either ascending or descending order. Likewise */ -/* > for the final N2 elements. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DTRD1 */ -/* > \verbatim */ -/* > DTRD1 is INTEGER */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DTRD2 */ -/* > \verbatim */ -/* > DTRD2 is INTEGER */ -/* > These are the strides to be taken through the array A. */ -/* > Allowable strides are 1 and -1. They indicate whether a */ -/* > subset of A is sorted in ascending (DTRDx = 1) or descending */ -/* > (DTRDx = -1) order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INDEX */ -/* > \verbatim */ -/* > INDEX is INTEGER array, dimension (N1+N2) */ -/* > On exit this array will contain a permutation such that */ -/* > if B( I ) = A( INDEX( I ) ) for I=1,N1+N2, then B will be */ -/* > sorted in ascending order. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dlamrg_(integer *n1, integer *n2, doublereal *a, integer - *dtrd1, integer *dtrd2, integer *index) +int dlamrg_(integer *n1, integer *n2, doublereal *a, integer *dtrd1, integer *dtrd2, integer *index) { - /* System generated locals */ integer i__1; - - /* Local variables */ integer i__, ind1, ind2, n1sv, n2sv; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --index; --a; - - /* Function Body */ n1sv = *n1; n2sv = *n2; if (*dtrd1 > 0) { @@ -159,7 +21,6 @@ f"> */ ind2 = *n1 + *n2; } i__ = 1; -/* while ( (N1SV > 0) & (N2SV > 0) ) */ L10: if (n1sv > 0 && n2sv > 0) { if (a[ind1] <= a[ind2]) { @@ -175,32 +36,23 @@ L10: } goto L10; } -/* end while */ if (n1sv == 0) { i__1 = n2sv; for (n1sv = 1; n1sv <= i__1; ++n1sv) { index[i__] = ind2; ++i__; ind2 += *dtrd2; -/* L20: */ } } else { -/* N2SV .EQ. 0 */ i__1 = n1sv; for (n2sv = 1; n2sv <= i__1; ++n2sv) { index[i__] = ind1; ++i__; ind1 += *dtrd1; -/* L30: */ } } - return 0; - -/* End of DLAMRG */ - -} /* dlamrg_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlange.cpp b/lib/linalg/dlange.cpp index ab88573259..f6ef58d0b2 100644 --- a/lib/linalg/dlange.cpp +++ b/lib/linalg/dlange.cpp @@ -1,196 +1,27 @@ -/* fortran/dlange.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute -value of any element of a general rectangular matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLANGE + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* DOUBLE PRECISION FUNCTION DLANGE( NORM, M, N, A, LDA, WORK ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER NORM */ -/* INTEGER LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLANGE returns the value of the one norm, or the Frobenius norm, or */ -/* > the infinity norm, or the element of largest absolute value of a */ -/* > real matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \return DLANGE */ -/* > \verbatim */ -/* > */ -/* > DLANGE = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ -/* > ( */ -/* > ( norm1(A), NORM = '1', 'O' or 'o' */ -/* > ( */ -/* > ( normI(A), NORM = 'I' or 'i' */ -/* > ( */ -/* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ -/* > */ -/* > where norm1 denotes the one norm of a matrix (maximum column sum), */ -/* > normI denotes the infinity norm of a matrix (maximum row sum) and */ -/* > normF denotes the Frobenius norm of a matrix (square root of sum of */ -/* > squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] NORM */ -/* > \verbatim */ -/* > NORM is CHARACTER*1 */ -/* > Specifies the value to be returned in DLANGE as described */ -/* > above. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. When M = 0, */ -/* > DLANGE is set to zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. When N = 0, */ -/* > DLANGE is set to zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > The m by n matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(M,1). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ -/* > where LWORK >= M when NORM = 'I'; otherwise, WORK is not */ -/* > referenced. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGEauxiliary */ - -/* ===================================================================== */ -doublereal dlange_(char *norm, integer *m, integer *n, doublereal *a, integer - *lda, doublereal *work, ftnlen norm_len) +doublereal dlange_(char *norm, integer *m, integer *n, doublereal *a, integer *lda, + doublereal *work, ftnlen norm_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal ret_val, d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ integer i__, j; doublereal sum, temp, scale; extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal value; extern logical disnan_(doublereal *); - extern /* Subroutine */ int dlassq_(integer *, doublereal *, integer *, - doublereal *, doublereal *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ + extern int dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; - - /* Function Body */ - if (min(*m,*n) == 0) { + if (min(*m, *n) == 0) { value = 0.; } else if (lsame_(norm, (char *)"M", (ftnlen)1, (ftnlen)1)) { - -/* Find max(abs(A(i,j))). */ - value = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -200,15 +31,9 @@ doublereal dlange_(char *norm, integer *m, integer *n, doublereal *a, integer if (value < temp || disnan_(&temp)) { value = temp; } -/* L10: */ } -/* L20: */ } - } else if (lsame_(norm, (char *)"O", (ftnlen)1, (ftnlen)1) || *(unsigned char *) - norm == '1') { - -/* Find norm1(A). */ - + } else if (lsame_(norm, (char *)"O", (ftnlen)1, (ftnlen)1) || *(unsigned char *)norm == '1') { value = 0.; i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -216,30 +41,22 @@ doublereal dlange_(char *norm, integer *m, integer *n, doublereal *a, integer i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { sum += (d__1 = a[i__ + j * a_dim1], abs(d__1)); -/* L30: */ } if (value < sum || disnan_(&sum)) { value = sum; } -/* L40: */ } } else if (lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1)) { - -/* Find normI(A). */ - i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; -/* L50: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { work[i__] += (d__1 = a[i__ + j * a_dim1], abs(d__1)); -/* L60: */ } -/* L70: */ } value = 0.; i__1 = *m; @@ -248,30 +65,19 @@ doublereal dlange_(char *norm, integer *m, integer *n, doublereal *a, integer if (value < temp || disnan_(&temp)) { value = temp; } -/* L80: */ } - } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", ( - ftnlen)1, (ftnlen)1)) { - -/* Find normF(A). */ - + } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", (ftnlen)1, (ftnlen)1)) { scale = 0.; sum = 1.; i__1 = *n; for (j = 1; j <= i__1; ++j) { dlassq_(m, &a[j * a_dim1 + 1], &c__1, &scale, &sum); -/* L90: */ } value = scale * sqrt(sum); } - ret_val = value; return ret_val; - -/* End of DLANGE */ - -} /* dlange_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlanst.cpp b/lib/linalg/dlanst.cpp index c216660b75..5b401bd0d9 100644 --- a/lib/linalg/dlanst.cpp +++ b/lib/linalg/dlanst.cpp @@ -1,180 +1,24 @@ -/* fortran/dlanst.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DLANST returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele -ment of largest absolute value of a real symmetric tridiagonal matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLANST + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* DOUBLE PRECISION FUNCTION DLANST( NORM, N, D, E ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER NORM */ -/* INTEGER N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( * ), E( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLANST returns the value of the one norm, or the Frobenius norm, or */ -/* > the infinity norm, or the element of largest absolute value of a */ -/* > real symmetric tridiagonal matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \return DLANST */ -/* > \verbatim */ -/* > */ -/* > DLANST = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ -/* > ( */ -/* > ( norm1(A), NORM = '1', 'O' or 'o' */ -/* > ( */ -/* > ( normI(A), NORM = 'I' or 'i' */ -/* > ( */ -/* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ -/* > */ -/* > where norm1 denotes the one norm of a matrix (maximum column sum), */ -/* > normI denotes the infinity norm of a matrix (maximum row sum) and */ -/* > normF denotes the Frobenius norm of a matrix (square root of sum of */ -/* > squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] NORM */ -/* > \verbatim */ -/* > NORM is CHARACTER*1 */ -/* > Specifies the value to be returned in DLANST as described */ -/* > above. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. When N = 0, DLANST is */ -/* > set to zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > The diagonal elements of A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > The (n-1) sub-diagonal or super-diagonal elements of A. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ -doublereal dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e, - ftnlen norm_len) +doublereal dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e, ftnlen norm_len) { - /* System generated locals */ integer i__1; doublereal ret_val, d__1, d__2, d__3; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ integer i__; doublereal sum, scale; extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal anorm; extern logical disnan_(doublereal *); - extern /* Subroutine */ int dlassq_(integer *, doublereal *, integer *, - doublereal *, doublereal *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ + extern int dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); --e; --d__; - - /* Function Body */ if (*n <= 0) { anorm = 0.; } else if (lsame_(norm, (char *)"M", (ftnlen)1, (ftnlen)1)) { - -/* Find max(abs(A(i,j))). */ - anorm = (d__1 = d__[*n], abs(d__1)); i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { @@ -186,13 +30,9 @@ doublereal dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e, if (anorm < sum || disnan_(&sum)) { anorm = sum; } -/* L10: */ } - } else if (lsame_(norm, (char *)"O", (ftnlen)1, (ftnlen)1) || *(unsigned char *) - norm == '1' || lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1)) { - -/* Find norm1(A). */ - + } else if (lsame_(norm, (char *)"O", (ftnlen)1, (ftnlen)1) || *(unsigned char *)norm == '1' || + lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1)) { if (*n == 1) { anorm = abs(d__[1]); } else { @@ -203,19 +43,14 @@ doublereal dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e, } i__1 = *n - 1; for (i__ = 2; i__ <= i__1; ++i__) { - sum = (d__1 = d__[i__], abs(d__1)) + (d__2 = e[i__], abs(d__2) - ) + (d__3 = e[i__ - 1], abs(d__3)); + sum = (d__1 = d__[i__], abs(d__1)) + (d__2 = e[i__], abs(d__2)) + + (d__3 = e[i__ - 1], abs(d__3)); if (anorm < sum || disnan_(&sum)) { anorm = sum; } -/* L20: */ } } - } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", ( - ftnlen)1, (ftnlen)1)) { - -/* Find normF(A). */ - + } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", (ftnlen)1, (ftnlen)1)) { scale = 0.; sum = 1.; if (*n > 1) { @@ -226,14 +61,9 @@ doublereal dlanst_(char *norm, integer *n, doublereal *d__, doublereal *e, dlassq_(n, &d__[1], &c__1, &scale, &sum); anorm = scale * sqrt(sum); } - ret_val = anorm; return ret_val; - -/* End of DLANST */ - -} /* dlanst_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlansy.cpp b/lib/linalg/dlansy.cpp index 8d3cb42b7a..296605e896 100644 --- a/lib/linalg/dlansy.cpp +++ b/lib/linalg/dlansy.cpp @@ -1,204 +1,27 @@ -/* fortran/dlansy.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele -ment of largest absolute value of a real symmetric matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLANSY + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* DOUBLE PRECISION FUNCTION DLANSY( NORM, UPLO, N, A, LDA, WORK ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER NORM, UPLO */ -/* INTEGER LDA, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLANSY returns the value of the one norm, or the Frobenius norm, or */ -/* > the infinity norm, or the element of largest absolute value of a */ -/* > real symmetric matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \return DLANSY */ -/* > \verbatim */ -/* > */ -/* > DLANSY = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ -/* > ( */ -/* > ( norm1(A), NORM = '1', 'O' or 'o' */ -/* > ( */ -/* > ( normI(A), NORM = 'I' or 'i' */ -/* > ( */ -/* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ -/* > */ -/* > where norm1 denotes the one norm of a matrix (maximum column sum), */ -/* > normI denotes the infinity norm of a matrix (maximum row sum) and */ -/* > normF denotes the Frobenius norm of a matrix (square root of sum of */ -/* > squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] NORM */ -/* > \verbatim */ -/* > NORM is CHARACTER*1 */ -/* > Specifies the value to be returned in DLANSY as described */ -/* > above. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies whether the upper or lower triangular part of the */ -/* > symmetric matrix A is to be referenced. */ -/* > = 'U': Upper triangular part of A is referenced */ -/* > = 'L': Lower triangular part of A is referenced */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. When N = 0, DLANSY is */ -/* > set to zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > The symmetric matrix A. If UPLO = 'U', the leading n by n */ -/* > upper triangular part of A contains the upper triangular part */ -/* > of the matrix A, and the strictly lower triangular part of A */ -/* > is not referenced. If UPLO = 'L', the leading n by n lower */ -/* > triangular part of A contains the lower triangular part of */ -/* > the matrix A, and the strictly upper triangular part of A is */ -/* > not referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(N,1). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ -/* > where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ -/* > WORK is not referenced. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleSYauxiliary */ - -/* ===================================================================== */ -doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer - *lda, doublereal *work, ftnlen norm_len, ftnlen uplo_len) +doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer *lda, + doublereal *work, ftnlen norm_len, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal ret_val, d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ integer i__, j; doublereal sum, absa, scale; extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal value; extern logical disnan_(doublereal *); - extern /* Subroutine */ int dlassq_(integer *, doublereal *, integer *, - doublereal *, doublereal *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ + extern int dlassq_(integer *, doublereal *, integer *, doublereal *, doublereal *); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; - - /* Function Body */ if (*n == 0) { value = 0.; } else if (lsame_(norm, (char *)"M", (ftnlen)1, (ftnlen)1)) { - -/* Find max(abs(A(i,j))). */ - value = 0.; if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { i__1 = *n; @@ -209,9 +32,7 @@ doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer if (value < sum || disnan_(&sum)) { value = sum; } -/* L10: */ } -/* L20: */ } } else { i__1 = *n; @@ -222,16 +43,11 @@ doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer if (value < sum || disnan_(&sum)) { value = sum; } -/* L30: */ } -/* L40: */ } } - } else if (lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"O", ( - ftnlen)1, (ftnlen)1) || *(unsigned char *)norm == '1') { - -/* Find normI(A) ( = norm1(A), since A is symmetric). */ - + } else if (lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"O", (ftnlen)1, (ftnlen)1) || + *(unsigned char *)norm == '1') { value = 0.; if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { i__1 = *n; @@ -242,10 +58,8 @@ doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer absa = (d__1 = a[i__ + j * a_dim1], abs(d__1)); sum += absa; work[i__] += absa; -/* L50: */ } work[j] = sum + (d__1 = a[j + j * a_dim1], abs(d__1)); -/* L60: */ } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { @@ -253,13 +67,11 @@ doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer if (value < sum || disnan_(&sum)) { value = sum; } -/* L70: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; -/* L80: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -269,19 +81,13 @@ doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer absa = (d__1 = a[i__ + j * a_dim1], abs(d__1)); sum += absa; work[i__] += absa; -/* L90: */ } if (value < sum || disnan_(&sum)) { value = sum; } -/* L100: */ } } - } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", ( - ftnlen)1, (ftnlen)1)) { - -/* Find normF(A). */ - + } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", (ftnlen)1, (ftnlen)1)) { scale = 0.; sum = 1.; if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { @@ -289,14 +95,12 @@ doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer for (j = 2; j <= i__1; ++j) { i__2 = j - 1; dlassq_(&i__2, &a[j * a_dim1 + 1], &c__1, &scale, &sum); -/* L110: */ } } else { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = *n - j; dlassq_(&i__2, &a[j + 1 + j * a_dim1], &c__1, &scale, &sum); -/* L120: */ } } sum *= 2; @@ -304,14 +108,9 @@ doublereal dlansy_(char *norm, char *uplo, integer *n, doublereal *a, integer dlassq_(n, &a[a_offset], &i__1, &scale, &sum); value = scale * sqrt(sum); } - ret_val = value; return ret_val; - -/* End of DLANSY */ - -} /* dlansy_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlapy2.cpp b/lib/linalg/dlapy2.cpp index d746e1f56a..996878faaa 100644 --- a/lib/linalg/dlapy2.cpp +++ b/lib/linalg/dlapy2.cpp @@ -1,121 +1,16 @@ -/* fortran/dlapy2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLAPY2 returns sqrt(x2+y2). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAPY2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* DOUBLE PRECISION FUNCTION DLAPY2( X, Y ) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION X, Y */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary */ -/* > overflow and unnecessary underflow. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Y */ -/* > \verbatim */ -/* > Y is DOUBLE PRECISION */ -/* > X and Y specify the values x and y. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ doublereal dlapy2_(doublereal *x, doublereal *y) { - /* System generated locals */ doublereal ret_val, d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ logical x_is_nan__, y_is_nan__; doublereal w, z__, xabs, yabs; extern doublereal dlamch_(char *, ftnlen); extern logical disnan_(doublereal *); doublereal hugeval; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - x_is_nan__ = disnan_(x); y_is_nan__ = disnan_(y); if (x_is_nan__) { @@ -125,26 +20,20 @@ doublereal dlapy2_(doublereal *x, doublereal *y) ret_val = *y; } hugeval = dlamch_((char *)"Overflow", (ftnlen)8); - - if (! (x_is_nan__ || y_is_nan__)) { + if (!(x_is_nan__ || y_is_nan__)) { xabs = abs(*x); yabs = abs(*y); - w = max(xabs,yabs); - z__ = min(xabs,yabs); + w = max(xabs, yabs); + z__ = min(xabs, yabs); if (z__ == 0. || w > hugeval) { ret_val = w; } else { -/* Computing 2nd power */ d__1 = z__ / w; ret_val = w * sqrt(d__1 * d__1 + 1.); } } return ret_val; - -/* End of DLAPY2 */ - -} /* dlapy2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlapy3.cpp b/lib/linalg/dlapy3.cpp index 211f60dbf6..c6fd054f4a 100644 --- a/lib/linalg/dlapy3.cpp +++ b/lib/linalg/dlapy3.cpp @@ -1,149 +1,30 @@ -/* fortran/dlapy3.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLAPY3 returns sqrt(x2+y2+z2). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAPY3 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z ) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION X, Y, Z */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause */ -/* > unnecessary overflow and unnecessary underflow. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Y */ -/* > \verbatim */ -/* > Y is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION */ -/* > X, Y and Z specify the values x, y and z. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ doublereal dlapy3_(doublereal *x, doublereal *y, doublereal *z__) { - /* System generated locals */ doublereal ret_val, d__1, d__2, d__3; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal w, xabs, yabs, zabs; extern doublereal dlamch_(char *, ftnlen); doublereal hugeval; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - hugeval = dlamch_((char *)"Overflow", (ftnlen)8); xabs = abs(*x); yabs = abs(*y); zabs = abs(*z__); -/* Computing MAX */ - d__1 = max(xabs,yabs); - w = max(d__1,zabs); + d__1 = max(xabs, yabs); + w = max(d__1, zabs); if (w == 0. || w > hugeval) { -/* W can be zero for max(0,nan,0) */ -/* adding all three entries together will make sure */ -/* NaN will not disappear. */ ret_val = xabs + yabs + zabs; } else { -/* Computing 2nd power */ d__1 = xabs / w; -/* Computing 2nd power */ d__2 = yabs / w; -/* Computing 2nd power */ d__3 = zabs / w; ret_val = w * sqrt(d__1 * d__1 + d__2 * d__2 + d__3 * d__3); } return ret_val; - -/* End of DLAPY3 */ - -} /* dlapy3_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlarf.cpp b/lib/linalg/dlarf.cpp index 8111d5fa2f..8fcb290abb 100644 --- a/lib/linalg/dlarf.cpp +++ b/lib/linalg/dlarf.cpp @@ -1,209 +1,34 @@ -/* fortran/dlarf.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b4 = 1.; static doublereal c_b5 = 0.; static integer c__1 = 1; - -/* > \brief \b DLARF applies an elementary reflector to a general rectangular matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLARF + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE */ -/* INTEGER INCV, LDC, M, N */ -/* DOUBLE PRECISION TAU */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION C( LDC, * ), V( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLARF applies a real elementary reflector H to a real m by n matrix */ -/* > C, from either the left or the right. H is represented in the form */ -/* > */ -/* > H = I - tau * v * v**T */ -/* > */ -/* > where tau is a real scalar and v is a real vector. */ -/* > */ -/* > If tau = 0, then H is taken to be the unit matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': form H * C */ -/* > = 'R': form C * H */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] V */ -/* > \verbatim */ -/* > V is DOUBLE PRECISION array, dimension */ -/* > (1 + (M-1)*abs(INCV)) if SIDE = 'L' */ -/* > or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */ -/* > The vector v in the representation of H. V is not used if */ -/* > TAU = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCV */ -/* > \verbatim */ -/* > INCV is INTEGER */ -/* > The increment between elements of v. INCV <> 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION */ -/* > The value tau in the representation of H. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ -/* > On entry, the m by n matrix C. */ -/* > On exit, C is overwritten by the matrix H * C if SIDE = 'L', */ -/* > or C * H if SIDE = 'R'. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension */ -/* > (N) if SIDE = 'L' */ -/* > or (M) if SIDE = 'R' */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int dlarf_(char *side, integer *m, integer *n, doublereal *v, - integer *incv, doublereal *tau, doublereal *c__, integer *ldc, - doublereal *work, ftnlen side_len) +int dlarf_(char *side, integer *m, integer *n, doublereal *v, integer *incv, doublereal *tau, + doublereal *c__, integer *ldc, doublereal *work, ftnlen side_len) { - /* System generated locals */ integer c_dim1, c_offset; doublereal d__1; - - /* Local variables */ integer i__; logical applyleft; - extern /* Subroutine */ int dger_(integer *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *); + extern int dger_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen); + extern int dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen); integer lastc, lastv; extern integer iladlc_(integer *, integer *, doublereal *, integer *), - iladlr_(integer *, integer *, doublereal *, integer *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ + iladlr_(integer *, integer *, doublereal *, integer *); --v; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ applyleft = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); lastv = 0; lastc = 0; if (*tau != 0.) { -/* Set up variables for scanning V. LASTV begins pointing to the end */ -/* of V. */ if (applyleft) { lastv = *m; } else { @@ -214,62 +39,33 @@ static integer c__1 = 1; } else { i__ = 1; } -/* Look for the last non-zero row in V. */ - while(lastv > 0 && v[i__] == 0.) { + while (lastv > 0 && v[i__] == 0.) { --lastv; i__ -= *incv; } if (applyleft) { -/* Scan for the last non-zero column in C(1:lastv,:). */ lastc = iladlc_(&lastv, n, &c__[c_offset], ldc); } else { -/* Scan for the last non-zero row in C(:,1:lastv). */ lastc = iladlr_(m, &lastv, &c__[c_offset], ldc); } } -/* Note that lastc.eq.0 renders the BLAS operations null; no special */ -/* case is needed at this level. */ if (applyleft) { - -/* Form H * C */ - if (lastv > 0) { - -/* w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1) */ - - dgemv_((char *)"Transpose", &lastv, &lastc, &c_b4, &c__[c_offset], ldc, & - v[1], incv, &c_b5, &work[1], &c__1, (ftnlen)9); - -/* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**T */ - + dgemv_((char *)"Transpose", &lastv, &lastc, &c_b4, &c__[c_offset], ldc, &v[1], incv, &c_b5, + &work[1], &c__1, (ftnlen)9); d__1 = -(*tau); - dger_(&lastv, &lastc, &d__1, &v[1], incv, &work[1], &c__1, &c__[ - c_offset], ldc); + dger_(&lastv, &lastc, &d__1, &v[1], incv, &work[1], &c__1, &c__[c_offset], ldc); } } else { - -/* Form C * H */ - if (lastv > 0) { - -/* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */ - - dgemv_((char *)"No transpose", &lastc, &lastv, &c_b4, &c__[c_offset], ldc, - &v[1], incv, &c_b5, &work[1], &c__1, (ftnlen)12); - -/* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**T */ - + dgemv_((char *)"No transpose", &lastc, &lastv, &c_b4, &c__[c_offset], ldc, &v[1], incv, &c_b5, + &work[1], &c__1, (ftnlen)12); d__1 = -(*tau); - dger_(&lastc, &lastv, &d__1, &work[1], &c__1, &v[1], incv, &c__[ - c_offset], ldc); + dger_(&lastc, &lastv, &d__1, &work[1], &c__1, &v[1], incv, &c__[c_offset], ldc); } } return 0; - -/* End of DLARF */ - -} /* dlarf_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlarfb.cpp b/lib/linalg/dlarfb.cpp index d282b19899..83f301f9d2 100644 --- a/lib/linalg/dlarfb.cpp +++ b/lib/linalg/dlarfb.cpp @@ -1,270 +1,26 @@ -/* fortran/dlarfb.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static doublereal c_b14 = 1.; static doublereal c_b25 = -1.; - -/* > \brief \b DLARFB applies a block reflector or its transpose to a general rectangular matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLARFB + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, */ -/* T, LDT, C, LDC, WORK, LDWORK ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER DIRECT, SIDE, STOREV, TRANS */ -/* INTEGER K, LDC, LDT, LDV, LDWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION C( LDC, * ), T( LDT, * ), V( LDV, * ), */ -/* $ WORK( LDWORK, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLARFB applies a real block reflector H or its transpose H**T to a */ -/* > real m by n matrix C, from either the left or the right. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply H or H**T from the Left */ -/* > = 'R': apply H or H**T from the Right */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': apply H (No transpose) */ -/* > = 'T': apply H**T (Transpose) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIRECT */ -/* > \verbatim */ -/* > DIRECT is CHARACTER*1 */ -/* > Indicates how H is formed from a product of elementary */ -/* > reflectors */ -/* > = 'F': H = H(1) H(2) . . . H(k) (Forward) */ -/* > = 'B': H = H(k) . . . H(2) H(1) (Backward) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] STOREV */ -/* > \verbatim */ -/* > STOREV is CHARACTER*1 */ -/* > Indicates how the vectors which define the elementary */ -/* > reflectors are stored: */ -/* > = 'C': Columnwise */ -/* > = 'R': Rowwise */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The order of the matrix T (= the number of elementary */ -/* > reflectors whose product defines the block reflector). */ -/* > If SIDE = 'L', M >= K >= 0; */ -/* > if SIDE = 'R', N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] V */ -/* > \verbatim */ -/* > V is DOUBLE PRECISION array, dimension */ -/* > (LDV,K) if STOREV = 'C' */ -/* > (LDV,M) if STOREV = 'R' and SIDE = 'L' */ -/* > (LDV,N) if STOREV = 'R' and SIDE = 'R' */ -/* > The matrix V. See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDV */ -/* > \verbatim */ -/* > LDV is INTEGER */ -/* > The leading dimension of the array V. */ -/* > If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */ -/* > if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */ -/* > if STOREV = 'R', LDV >= K. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] T */ -/* > \verbatim */ -/* > T is DOUBLE PRECISION array, dimension (LDT,K) */ -/* > The triangular k by k matrix T in the representation of the */ -/* > block reflector. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDT */ -/* > \verbatim */ -/* > LDT is INTEGER */ -/* > The leading dimension of the array T. LDT >= K. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ -/* > On entry, the m by n matrix C. */ -/* > On exit, C is overwritten by H*C or H**T*C or C*H or C*H**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (LDWORK,K) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDWORK */ -/* > \verbatim */ -/* > LDWORK is INTEGER */ -/* > The leading dimension of the array WORK. */ -/* > If SIDE = 'L', LDWORK >= max(1,N); */ -/* > if SIDE = 'R', LDWORK >= max(1,M). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The shape of the matrix V and the storage of the vectors which define */ -/* > the H(i) is best illustrated by the following example with n = 5 and */ -/* > k = 3. The elements equal to 1 are not stored; the corresponding */ -/* > array elements are modified but restored on exit. The rest of the */ -/* > array is not used. */ -/* > */ -/* > DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ -/* > */ -/* > V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) */ -/* > ( v1 1 ) ( 1 v2 v2 v2 ) */ -/* > ( v1 v2 1 ) ( 1 v3 v3 ) */ -/* > ( v1 v2 v3 ) */ -/* > ( v1 v2 v3 ) */ -/* > */ -/* > DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ -/* > */ -/* > V = ( v1 v2 v3 ) V = ( v1 v1 1 ) */ -/* > ( v1 v2 v3 ) ( v2 v2 v2 1 ) */ -/* > ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) */ -/* > ( 1 v3 ) */ -/* > ( 1 ) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlarfb_(char *side, char *trans, char *direct, char * - storev, integer *m, integer *n, integer *k, doublereal *v, integer * - ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc, - doublereal *work, integer *ldwork, ftnlen side_len, ftnlen trans_len, - ftnlen direct_len, ftnlen storev_len) +int dlarfb_(char *side, char *trans, char *direct, char *storev, integer *m, integer *n, integer *k, + doublereal *v, integer *ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc, + doublereal *work, integer *ldwork, ftnlen side_len, ftnlen trans_len, ftnlen direct_len, + ftnlen storev_len) { - /* System generated locals */ - integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, - work_offset, i__1, i__2; - - /* Local variables */ + integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, work_offset, i__1, + i__2; integer i__, j; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *), dtrmm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), + dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); char transt[1]; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick return if possible */ - - /* Parameter adjustments */ v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; @@ -277,610 +33,279 @@ f"> */ work_dim1 = *ldwork; work_offset = 1 + work_dim1; work -= work_offset; - - /* Function Body */ if (*m <= 0 || *n <= 0) { return 0; } - if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } - if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - -/* Let V = ( V1 ) (first K rows) */ -/* ( V2 ) */ -/* where V1 is unit lower triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Form H * C or H**T * C where C = ( C1 ) */ -/* ( C2 ) */ - -/* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) */ - -/* W := C1**T */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - dcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], - &c__1); -/* L10: */ + dcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); } - -/* W := W * V1 */ - - dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, &v[v_offset], ldv, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); if (*m > *k) { - -/* W := W + C2**T * V2 */ - i__1 = *m - *k; - dgemm_((char *)"Transpose", (char *)"No transpose", n, k, &i__1, &c_b14, & - c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + v_dim1], - ldv, &c_b14, &work[work_offset], ldwork, (ftnlen) - 9, (ftnlen)12); + dgemm_((char *)"Transpose", (char *)"No transpose", n, k, &i__1, &c_b14, &c__[*k + 1 + c_dim1], + ldc, &v[*k + 1 + v_dim1], ldv, &c_b14, &work[work_offset], ldwork, + (ftnlen)9, (ftnlen)12); } - -/* W := W * T**T or W * T */ - - dtrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - V * W**T */ - + dtrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b14, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*m > *k) { - -/* C2 := C2 - V2 * W**T */ - i__1 = *m - *k; - dgemm_((char *)"No transpose", (char *)"Transpose", &i__1, n, k, &c_b25, & - v[*k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc, ( - ftnlen)12, (ftnlen)9); + dgemm_((char *)"No transpose", (char *)"Transpose", &i__1, n, k, &c_b25, &v[*k + 1 + v_dim1], + ldv, &work[work_offset], ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc, + (ftnlen)12, (ftnlen)9); } - -/* W := W * V1**T */ - - dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & - v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) - 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); - -/* C1 := C1 - W**T */ - + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, &v[v_offset], ldv, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; -/* L20: */ } -/* L30: */ } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - -/* Form C * H or C * H**T where C = ( C1 C2 ) */ - -/* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ - -/* W := C1 */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - dcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * - work_dim1 + 1], &c__1); -/* L40: */ + dcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1); } - -/* W := W * V1 */ - - dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, &v[v_offset], ldv, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); if (*n > *k) { - -/* W := W + C2 * V2 */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, & - c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + - 1 + v_dim1], ldv, &c_b14, &work[work_offset], - ldwork, (ftnlen)12, (ftnlen)12); + dgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, &c_b14, + &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + 1 + v_dim1], ldv, &c_b14, + &work[work_offset], ldwork, (ftnlen)12, (ftnlen)12); } - -/* W := W * T or W * T**T */ - - dtrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - W * V**T */ - + dtrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b14, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*n > *k) { - -/* C2 := C2 - W * V2**T */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"Transpose", m, &i__1, k, &c_b25, & - work[work_offset], ldwork, &v[*k + 1 + v_dim1], - ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], ldc, ( - ftnlen)12, (ftnlen)9); + dgemm_((char *)"No transpose", (char *)"Transpose", m, &i__1, k, &c_b25, &work[work_offset], + ldwork, &v[*k + 1 + v_dim1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 + 1], + ldc, (ftnlen)12, (ftnlen)9); } - -/* W := W * V1**T */ - - dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & - v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) - 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); - -/* C1 := C1 - W */ - + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, &v[v_offset], ldv, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; -/* L50: */ } -/* L60: */ } } - } else { - -/* Let V = ( V1 ) */ -/* ( V2 ) (last K rows) */ -/* where V2 is unit upper triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Form H * C or H**T * C where C = ( C1 ) */ -/* ( C2 ) */ - -/* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) */ - -/* W := C2**T */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - dcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * - work_dim1 + 1], &c__1); -/* L70: */ + dcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); } - -/* W := W * V2 */ - dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, - &v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + &v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)12, (ftnlen)4); if (*m > *k) { - -/* W := W + C1**T * V1 */ - i__1 = *m - *k; - dgemm_((char *)"Transpose", (char *)"No transpose", n, k, &i__1, &c_b14, & - c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & - work[work_offset], ldwork, (ftnlen)9, (ftnlen)12); + dgemm_((char *)"Transpose", (char *)"No transpose", n, k, &i__1, &c_b14, &c__[c_offset], ldc, + &v[v_offset], ldv, &c_b14, &work[work_offset], ldwork, (ftnlen)9, + (ftnlen)12); } - -/* W := W * T**T or W * T */ - - dtrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - V * W**T */ - + dtrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b14, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*m > *k) { - -/* C1 := C1 - V1 * W**T */ - i__1 = *m - *k; - dgemm_((char *)"No transpose", (char *)"Transpose", &i__1, n, k, &c_b25, & - v[v_offset], ldv, &work[work_offset], ldwork, & - c_b14, &c__[c_offset], ldc, (ftnlen)12, (ftnlen)9) - ; + dgemm_((char *)"No transpose", (char *)"Transpose", &i__1, n, k, &c_b25, &v[v_offset], ldv, + &work[work_offset], ldwork, &c_b14, &c__[c_offset], ldc, (ftnlen)12, + (ftnlen)9); } - -/* W := W * V2**T */ - - dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & - v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); - -/* C2 := C2 - W**T */ - + dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, + &v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)9, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { - c__[*m - *k + j + i__ * c_dim1] -= work[i__ + j * - work_dim1]; -/* L80: */ + c__[*m - *k + j + i__ * c_dim1] -= work[i__ + j * work_dim1]; } -/* L90: */ } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - -/* Form C * H or C * H**T where C = ( C1 C2 ) */ - -/* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ - -/* W := C2 */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - dcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ - j * work_dim1 + 1], &c__1); -/* L100: */ + dcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], + &c__1); } - -/* W := W * V2 */ - dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, - &v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + &v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)12, (ftnlen)4); if (*n > *k) { - -/* W := W + C1 * V1 */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, & - c_b14, &c__[c_offset], ldc, &v[v_offset], ldv, & - c_b14, &work[work_offset], ldwork, (ftnlen)12, ( - ftnlen)12); + dgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, &c_b14, &c__[c_offset], ldc, + &v[v_offset], ldv, &c_b14, &work[work_offset], ldwork, (ftnlen)12, + (ftnlen)12); } - -/* W := W * T or W * T**T */ - - dtrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - W * V**T */ - + dtrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b14, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*n > *k) { - -/* C1 := C1 - W * V1**T */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"Transpose", m, &i__1, k, &c_b25, & - work[work_offset], ldwork, &v[v_offset], ldv, & - c_b14, &c__[c_offset], ldc, (ftnlen)12, (ftnlen)9) - ; + dgemm_((char *)"No transpose", (char *)"Transpose", m, &i__1, k, &c_b25, &work[work_offset], + ldwork, &v[v_offset], ldv, &c_b14, &c__[c_offset], ldc, (ftnlen)12, + (ftnlen)9); } - -/* W := W * V2**T */ - - dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & - v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); - -/* C2 := C2 - W */ - + dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, + &v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)9, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + (*n - *k + j) * c_dim1] -= work[i__ + j * - work_dim1]; -/* L110: */ + c__[i__ + (*n - *k + j) * c_dim1] -= work[i__ + j * work_dim1]; } -/* L120: */ } } } - } else if (lsame_(storev, (char *)"R", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - -/* Let V = ( V1 V2 ) (V1: first K columns) */ -/* where V1 is unit upper triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Form H * C or H**T * C where C = ( C1 ) */ -/* ( C2 ) */ - -/* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) */ - -/* W := C1**T */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - dcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], - &c__1); -/* L130: */ + dcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); } - -/* W := W * V1**T */ - - dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & - v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) - 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, &v[v_offset], ldv, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); if (*m > *k) { - -/* W := W + C2**T * V2**T */ - i__1 = *m - *k; - dgemm_((char *)"Transpose", (char *)"Transpose", n, k, &i__1, &c_b14, & - c__[*k + 1 + c_dim1], ldc, &v[(*k + 1) * v_dim1 + - 1], ldv, &c_b14, &work[work_offset], ldwork, ( - ftnlen)9, (ftnlen)9); + dgemm_((char *)"Transpose", (char *)"Transpose", n, k, &i__1, &c_b14, &c__[*k + 1 + c_dim1], + ldc, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, &work[work_offset], ldwork, + (ftnlen)9, (ftnlen)9); } - -/* W := W * T**T or W * T */ - - dtrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - V**T * W**T */ - + dtrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b14, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*m > *k) { - -/* C2 := C2 - V2**T * W**T */ - i__1 = *m - *k; - dgemm_((char *)"Transpose", (char *)"Transpose", &i__1, n, k, &c_b25, &v[( - *k + 1) * v_dim1 + 1], ldv, &work[work_offset], - ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc, ( - ftnlen)9, (ftnlen)9); + dgemm_((char *)"Transpose", (char *)"Transpose", &i__1, n, k, &c_b25, &v[(*k + 1) * v_dim1 + 1], + ldv, &work[work_offset], ldwork, &c_b14, &c__[*k + 1 + c_dim1], ldc, + (ftnlen)9, (ftnlen)9); } - -/* W := W * V1 */ - - dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); - -/* C1 := C1 - W**T */ - + dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, &v[v_offset], ldv, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { c__[j + i__ * c_dim1] -= work[i__ + j * work_dim1]; -/* L140: */ } -/* L150: */ } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - -/* Form C * H or C * H**T where C = ( C1 C2 ) */ - -/* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) */ - -/* W := C1 */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - dcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * - work_dim1 + 1], &c__1); -/* L160: */ + dcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1); } - -/* W := W * V1**T */ - - dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & - v[v_offset], ldv, &work[work_offset], ldwork, (ftnlen) - 5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Upper", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, &v[v_offset], ldv, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); if (*n > *k) { - -/* W := W + C2 * V2**T */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"Transpose", m, k, &i__1, &c_b14, & - c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + 1) * - v_dim1 + 1], ldv, &c_b14, &work[work_offset], - ldwork, (ftnlen)12, (ftnlen)9); + dgemm_((char *)"No transpose", (char *)"Transpose", m, k, &i__1, &c_b14, + &c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, + &work[work_offset], ldwork, (ftnlen)12, (ftnlen)9); } - -/* W := W * T or W * T**T */ - - dtrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - W * V */ - + dtrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b14, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*n > *k) { - -/* C2 := C2 - W * V2 */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, & - c_b25, &work[work_offset], ldwork, &v[(*k + 1) * - v_dim1 + 1], ldv, &c_b14, &c__[(*k + 1) * c_dim1 - + 1], ldc, (ftnlen)12, (ftnlen)12); + dgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, &c_b25, &work[work_offset], + ldwork, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b14, + &c__[(*k + 1) * c_dim1 + 1], ldc, (ftnlen)12, (ftnlen)12); } - -/* W := W * V1 */ - - dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); - -/* C1 := C1 - W */ - + dtrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, &v[v_offset], ldv, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] -= work[i__ + j * work_dim1]; -/* L170: */ } -/* L180: */ } - } - } else { - -/* Let V = ( V1 V2 ) (V2: last K columns) */ -/* where V2 is unit lower triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Form H * C or H**T * C where C = ( C1 ) */ -/* ( C2 ) */ - -/* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) */ - -/* W := C2**T */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - dcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * - work_dim1 + 1], &c__1); -/* L190: */ + dcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); } - -/* W := W * V2**T */ - - dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, & - v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[work_offset] - , ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", n, k, &c_b14, + &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)9, (ftnlen)4); if (*m > *k) { - -/* W := W + C1**T * V1**T */ - i__1 = *m - *k; - dgemm_((char *)"Transpose", (char *)"Transpose", n, k, &i__1, &c_b14, & - c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & - work[work_offset], ldwork, (ftnlen)9, (ftnlen)9); + dgemm_((char *)"Transpose", (char *)"Transpose", n, k, &i__1, &c_b14, &c__[c_offset], ldc, + &v[v_offset], ldv, &c_b14, &work[work_offset], ldwork, (ftnlen)9, + (ftnlen)9); } - -/* W := W * T**T or W * T */ - - dtrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - V**T * W**T */ - + dtrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b14, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*m > *k) { - -/* C1 := C1 - V1**T * W**T */ - i__1 = *m - *k; - dgemm_((char *)"Transpose", (char *)"Transpose", &i__1, n, k, &c_b25, &v[ - v_offset], ldv, &work[work_offset], ldwork, & - c_b14, &c__[c_offset], ldc, (ftnlen)9, (ftnlen)9); + dgemm_((char *)"Transpose", (char *)"Transpose", &i__1, n, k, &c_b25, &v[v_offset], ldv, + &work[work_offset], ldwork, &c_b14, &c__[c_offset], ldc, (ftnlen)9, + (ftnlen)9); } - -/* W := W * V2 */ - dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b14, - &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 12, (ftnlen)4); - -/* C2 := C2 - W**T */ - + &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)12, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { - c__[*m - *k + j + i__ * c_dim1] -= work[i__ + j * - work_dim1]; -/* L200: */ + c__[*m - *k + j + i__ * c_dim1] -= work[i__ + j * work_dim1]; } -/* L210: */ } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - -/* Form C * H or C * H' where C = ( C1 C2 ) */ - -/* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) */ - -/* W := C2 */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - dcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ - j * work_dim1 + 1], &c__1); -/* L220: */ + dcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], + &c__1); } - -/* W := W * V2**T */ - - dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, & - v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[work_offset] - , ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)9, (ftnlen)4); + dtrmm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Unit", m, k, &c_b14, + &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)9, (ftnlen)4); if (*n > *k) { - -/* W := W + C1 * V1**T */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"Transpose", m, k, &i__1, &c_b14, & - c__[c_offset], ldc, &v[v_offset], ldv, &c_b14, & - work[work_offset], ldwork, (ftnlen)12, (ftnlen)9); + dgemm_((char *)"No transpose", (char *)"Transpose", m, k, &i__1, &c_b14, &c__[c_offset], ldc, + &v[v_offset], ldv, &c_b14, &work[work_offset], ldwork, (ftnlen)12, + (ftnlen)9); } - -/* W := W * T or W * T**T */ - - dtrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b14, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - W * V */ - + dtrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b14, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*n > *k) { - -/* C1 := C1 - W * V1 */ - i__1 = *n - *k; - dgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, & - c_b25, &work[work_offset], ldwork, &v[v_offset], - ldv, &c_b14, &c__[c_offset], ldc, (ftnlen)12, ( - ftnlen)12); + dgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, &c_b25, &work[work_offset], + ldwork, &v[v_offset], ldv, &c_b14, &c__[c_offset], ldc, (ftnlen)12, + (ftnlen)12); } - -/* W := W * V2 */ - dtrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b14, - &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 12, (ftnlen)4); - -/* C1 := C1 - W */ - + &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)12, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + (*n - *k + j) * c_dim1] -= work[i__ + j * - work_dim1]; -/* L230: */ + c__[i__ + (*n - *k + j) * c_dim1] -= work[i__ + j * work_dim1]; } -/* L240: */ } - } - } } - return 0; - -/* End of DLARFB */ - -} /* dlarfb_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlarfg.cpp b/lib/linalg/dlarfg.cpp index 546db1171e..1dbdd82f66 100644 --- a/lib/linalg/dlarfg.cpp +++ b/lib/linalg/dlarfg.cpp @@ -1,203 +1,36 @@ -/* fortran/dlarfg.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLARFG generates an elementary reflector (Householder matrix). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLARFG + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX, N */ -/* DOUBLE PRECISION ALPHA, TAU */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION X( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLARFG generates a real elementary reflector H of order n, such */ -/* > that */ -/* > */ -/* > H * ( alpha ) = ( beta ), H**T * H = I. */ -/* > ( x ) ( 0 ) */ -/* > */ -/* > where alpha and beta are scalars, and x is an (n-1)-element real */ -/* > vector. H is represented in the form */ -/* > */ -/* > H = I - tau * ( 1 ) * ( 1 v**T ) , */ -/* > ( v ) */ -/* > */ -/* > where tau is a real scalar and v is a real (n-1)-element */ -/* > vector. */ -/* > */ -/* > If the elements of x are all zero, then tau = 0 and H is taken to be */ -/* > the unit matrix. */ -/* > */ -/* > Otherwise 1 <= tau <= 2. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the elementary reflector. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION */ -/* > On entry, the value alpha. */ -/* > On exit, it is overwritten with the value beta. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION array, dimension */ -/* > (1+(N-2)*abs(INCX)) */ -/* > On entry, the vector x. */ -/* > On exit, it is overwritten with the vector v. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > The increment between elements of X. INCX > 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION */ -/* > The value tau. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int dlarfg_(integer *n, doublereal *alpha, doublereal *x, - integer *incx, doublereal *tau) +int dlarfg_(integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *tau) { - /* System generated locals */ integer i__1; doublereal d__1; - - /* Builtin functions */ double d_lmp_sign(doublereal *, doublereal *); - - /* Local variables */ integer j, knt; doublereal beta; extern doublereal dnrm2_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *); doublereal xnorm; - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, ftnlen); doublereal safmin, rsafmn; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --x; - - /* Function Body */ if (*n <= 1) { *tau = 0.; return 0; } - i__1 = *n - 1; xnorm = dnrm2_(&i__1, &x[1], incx); - if (xnorm == 0.) { - -/* H = I */ - *tau = 0.; } else { - -/* general case */ - d__1 = dlapy2_(alpha, &xnorm); beta = -d_lmp_sign(&d__1, alpha); safmin = dlamch_((char *)"S", (ftnlen)1) / dlamch_((char *)"E", (ftnlen)1); knt = 0; if (abs(beta) < safmin) { - -/* XNORM, BETA may be inaccurate; scale X and recompute them */ - rsafmn = 1. / safmin; -L10: + L10: ++knt; i__1 = *n - 1; dscal_(&i__1, &rsafmn, &x[1], incx); @@ -206,9 +39,6 @@ L10: if (abs(beta) < safmin && knt < 20) { goto L10; } - -/* New BETA is at most 1, at least SAFMIN */ - i__1 = *n - 1; xnorm = dnrm2_(&i__1, &x[1], incx); d__1 = dlapy2_(alpha, &xnorm); @@ -218,23 +48,14 @@ L10: i__1 = *n - 1; d__1 = 1. / (*alpha - beta); dscal_(&i__1, &d__1, &x[1], incx); - -/* If ALPHA is subnormal, it may lose relative accuracy */ - i__1 = knt; for (j = 1; j <= i__1; ++j) { beta *= safmin; -/* L20: */ } *alpha = beta; } - return 0; - -/* End of DLARFG */ - -} /* dlarfg_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlarft.cpp b/lib/linalg/dlarft.cpp index bd0874fa3c..79881a08a4 100644 --- a/lib/linalg/dlarft.cpp +++ b/lib/linalg/dlarft.cpp @@ -1,233 +1,21 @@ -/* static/dlarft.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static doublereal c_b7 = 1.; - -/* > \brief \b DLARFT forms the triangular factor T of a block reflector H = I - vtvH */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLARFT + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER DIRECT, STOREV */ -/* INTEGER K, LDT, LDV, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLARFT forms the triangular factor T of a real block reflector H */ -/* > of order n, which is defined as a product of k elementary reflectors. */ -/* > */ -/* > If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */ -/* > */ -/* > If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */ -/* > */ -/* > If STOREV = 'C', the vector which defines the elementary reflector */ -/* > H(i) is stored in the i-th column of the array V, and */ -/* > */ -/* > H = I - V * T * V**T */ -/* > */ -/* > If STOREV = 'R', the vector which defines the elementary reflector */ -/* > H(i) is stored in the i-th row of the array V, and */ -/* > */ -/* > H = I - V**T * T * V */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] DIRECT */ -/* > \verbatim */ -/* > DIRECT is CHARACTER*1 */ -/* > Specifies the order in which the elementary reflectors are */ -/* > multiplied to form the block reflector: */ -/* > = 'F': H = H(1) H(2) . . . H(k) (Forward) */ -/* > = 'B': H = H(k) . . . H(2) H(1) (Backward) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] STOREV */ -/* > \verbatim */ -/* > STOREV is CHARACTER*1 */ -/* > Specifies how the vectors which define the elementary */ -/* > reflectors are stored (see also Further Details): */ -/* > = 'C': columnwise */ -/* > = 'R': rowwise */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the block reflector H. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The order of the triangular factor T (= the number of */ -/* > elementary reflectors). K >= 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] V */ -/* > \verbatim */ -/* > V is DOUBLE PRECISION array, dimension */ -/* > (LDV,K) if STOREV = 'C' */ -/* > (LDV,N) if STOREV = 'R' */ -/* > The matrix V. See further details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDV */ -/* > \verbatim */ -/* > LDV is INTEGER */ -/* > The leading dimension of the array V. */ -/* > If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] T */ -/* > \verbatim */ -/* > T is DOUBLE PRECISION array, dimension (LDT,K) */ -/* > The k by k triangular factor T of the block reflector. */ -/* > If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */ -/* > lower triangular. The rest of the array is not used. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDT */ -/* > \verbatim */ -/* > LDT is INTEGER */ -/* > The leading dimension of the array T. LDT >= K. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The shape of the matrix V and the storage of the vectors which define */ -/* > the H(i) is best illustrated by the following example with n = 5 and */ -/* > k = 3. The elements equal to 1 are not stored. */ -/* > */ -/* > DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ -/* > */ -/* > V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) */ -/* > ( v1 1 ) ( 1 v2 v2 v2 ) */ -/* > ( v1 v2 1 ) ( 1 v3 v3 ) */ -/* > ( v1 v2 v3 ) */ -/* > ( v1 v2 v3 ) */ -/* > */ -/* > DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ -/* > */ -/* > V = ( v1 v2 v3 ) V = ( v1 v1 1 ) */ -/* > ( v1 v2 v3 ) ( v2 v2 v2 1 ) */ -/* > ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) */ -/* > ( 1 v3 ) */ -/* > ( 1 ) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlarft_(char *direct, char *storev, integer *n, integer * - k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, - integer *ldt, ftnlen direct_len, ftnlen storev_len) +int dlarft_(char *direct, char *storev, integer *n, integer *k, doublereal *v, integer *ldv, + doublereal *tau, doublereal *t, integer *ldt, ftnlen direct_len, ftnlen storev_len) { - /* System generated locals */ integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3; doublereal d__1; - - /* Local variables */ integer i__, j, prevlastv; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen); + extern int dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen); integer lastv; - extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick return if possible */ - - /* Parameter adjustments */ + extern int dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen); v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; @@ -235,87 +23,65 @@ f"> */ t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; - - /* Function Body */ if (*n == 0) { return 0; } - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { prevlastv = *n; i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { - prevlastv = max(i__,prevlastv); + prevlastv = max(i__, prevlastv); if (tau[i__] == 0.) { - -/* H(i) = I */ - i__2 = i__; for (j = 1; j <= i__2; ++j) { t[j + i__ * t_dim1] = 0.; } } else { - -/* general case */ - if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { -/* Skip any trailing zeros. */ i__2 = i__ + 1; for (lastv = *n; lastv >= i__2; --lastv) { if (v[lastv + i__ * v_dim1] != 0.) { goto L219; } } -L219: + L219: i__2 = i__ - 1; for (j = 1; j <= i__2; ++j) { t[j + i__ * t_dim1] = -tau[i__] * v[i__ + j * v_dim1]; } - j = min(lastv,prevlastv); - -/* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i) */ - + j = min(lastv, prevlastv); i__2 = j - i__; i__3 = i__ - 1; d__1 = -tau[i__]; - dgemv_((char *)"Transpose", &i__2, &i__3, &d__1, &v[i__ + 1 + - v_dim1], ldv, &v[i__ + 1 + i__ * v_dim1], &c__1, & - c_b7, &t[i__ * t_dim1 + 1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__3, &d__1, &v[i__ + 1 + v_dim1], ldv, + &v[i__ + 1 + i__ * v_dim1], &c__1, &c_b7, &t[i__ * t_dim1 + 1], &c__1, + (ftnlen)9); } else { -/* Skip any trailing zeros. */ i__2 = i__ + 1; for (lastv = *n; lastv >= i__2; --lastv) { if (v[i__ + lastv * v_dim1] != 0.) { goto L235; } } -L235: + L235: i__2 = i__ - 1; for (j = 1; j <= i__2; ++j) { t[j + i__ * t_dim1] = -tau[i__] * v[j + i__ * v_dim1]; } - j = min(lastv,prevlastv); - -/* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T */ - + j = min(lastv, prevlastv); i__2 = i__ - 1; i__3 = j - i__; d__1 = -tau[i__]; - dgemv_((char *)"No transpose", &i__2, &i__3, &d__1, &v[(i__ + 1) * - v_dim1 + 1], ldv, &v[i__ + (i__ + 1) * v_dim1], - ldv, &c_b7, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) - 12); + dgemv_((char *)"No transpose", &i__2, &i__3, &d__1, &v[(i__ + 1) * v_dim1 + 1], ldv, + &v[i__ + (i__ + 1) * v_dim1], ldv, &c_b7, &t[i__ * t_dim1 + 1], &c__1, + (ftnlen)12); } - -/* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */ - i__2 = i__ - 1; - dtrmv_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", &i__2, &t[ - t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) - 5, (ftnlen)12, (ftnlen)8); + dtrmv_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", &i__2, &t[t_offset], ldt, + &t[i__ * t_dim1 + 1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)8); t[i__ + i__ * t_dim1] = tau[i__]; if (i__ > 1) { - prevlastv = max(prevlastv,lastv); + prevlastv = max(prevlastv, lastv); } else { prevlastv = lastv; } @@ -325,79 +91,57 @@ L235: prevlastv = 1; for (i__ = *k; i__ >= 1; --i__) { if (tau[i__] == 0.) { - -/* H(i) = I */ - i__1 = *k; for (j = i__; j <= i__1; ++j) { t[j + i__ * t_dim1] = 0.; } } else { - -/* general case */ - if (i__ < *k) { if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { -/* Skip any leading zeros. */ i__1 = i__ - 1; for (lastv = 1; lastv <= i__1; ++lastv) { if (v[lastv + i__ * v_dim1] != 0.) { goto L280; } } -L280: + L280: i__1 = *k; for (j = i__ + 1; j <= i__1; ++j) { - t[j + i__ * t_dim1] = -tau[i__] * v[*n - *k + i__ - + j * v_dim1]; + t[j + i__ * t_dim1] = -tau[i__] * v[*n - *k + i__ + j * v_dim1]; } - j = max(lastv,prevlastv); - -/* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i) */ - + j = max(lastv, prevlastv); i__1 = *n - *k + i__ - j; i__2 = *k - i__; d__1 = -tau[i__]; - dgemv_((char *)"Transpose", &i__1, &i__2, &d__1, &v[j + (i__ - + 1) * v_dim1], ldv, &v[j + i__ * v_dim1], & - c__1, &c_b7, &t[i__ + 1 + i__ * t_dim1], & - c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__1, &i__2, &d__1, &v[j + (i__ + 1) * v_dim1], ldv, + &v[j + i__ * v_dim1], &c__1, &c_b7, &t[i__ + 1 + i__ * t_dim1], + &c__1, (ftnlen)9); } else { -/* Skip any leading zeros. */ i__1 = i__ - 1; for (lastv = 1; lastv <= i__1; ++lastv) { if (v[i__ + lastv * v_dim1] != 0.) { goto L296; } } -L296: + L296: i__1 = *k; for (j = i__ + 1; j <= i__1; ++j) { - t[j + i__ * t_dim1] = -tau[i__] * v[j + (*n - *k - + i__) * v_dim1]; + t[j + i__ * t_dim1] = -tau[i__] * v[j + (*n - *k + i__) * v_dim1]; } - j = max(lastv,prevlastv); - -/* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T */ - + j = max(lastv, prevlastv); i__1 = *k - i__; i__2 = *n - *k + i__ - j; d__1 = -tau[i__]; - dgemv_((char *)"No transpose", &i__1, &i__2, &d__1, &v[i__ + - 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], - ldv, &c_b7, &t[i__ + 1 + i__ * t_dim1], &c__1, - (ftnlen)12); + dgemv_((char *)"No transpose", &i__1, &i__2, &d__1, &v[i__ + 1 + j * v_dim1], ldv, + &v[i__ + j * v_dim1], ldv, &c_b7, &t[i__ + 1 + i__ * t_dim1], &c__1, + (ftnlen)12); } - -/* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */ - i__1 = *k - i__; - dtrmv_((char *)"Lower", (char *)"No transpose", (char *)"Non-unit", &i__1, &t[i__ - + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * - t_dim1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)8) - ; + dtrmv_((char *)"Lower", (char *)"No transpose", (char *)"Non-unit", &i__1, + &t[i__ + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * t_dim1], &c__1, + (ftnlen)5, (ftnlen)12, (ftnlen)8); if (i__ > 1) { - prevlastv = min(prevlastv,lastv); + prevlastv = min(prevlastv, lastv); } else { prevlastv = lastv; } @@ -407,11 +151,7 @@ L296: } } return 0; - -/* End of DLARFT */ - -} /* dlarft_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlartg.cpp b/lib/linalg/dlartg.cpp index c18a8c6d43..c388e3b2d4 100644 --- a/lib/linalg/dlartg.cpp +++ b/lib/linalg/dlartg.cpp @@ -1,175 +1,24 @@ -/* fortran/dlartg.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLARTG generates a plane rotation with real cosine and real sine. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLARTG + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLARTG( F, G, CS, SN, R ) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION CS, F, G, R, SN */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLARTG generate a plane rotation so that */ -/* > */ -/* > [ CS SN ] . [ F ] = [ R ] where CS**2 + SN**2 = 1. */ -/* > [ -SN CS ] [ G ] [ 0 ] */ -/* > */ -/* > This is a slower, more accurate version of the BLAS1 routine DROTG, */ -/* > with the following other differences: */ -/* > F and G are unchanged on return. */ -/* > If G=0, then CS=1 and SN=0. */ -/* > If F=0 and (G .ne. 0), then CS=0 and SN=1 without doing any */ -/* > floating point operations (saves work in DBDSQR when */ -/* > there are zeros on the diagonal). */ -/* > */ -/* > If F exceeds G in magnitude, CS will be positive. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] F */ -/* > \verbatim */ -/* > F is DOUBLE PRECISION */ -/* > The first component of vector to be rotated. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] G */ -/* > \verbatim */ -/* > G is DOUBLE PRECISION */ -/* > The second component of vector to be rotated. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] CS */ -/* > \verbatim */ -/* > CS is DOUBLE PRECISION */ -/* > The cosine of the rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] SN */ -/* > \verbatim */ -/* > SN is DOUBLE PRECISION */ -/* > The sine of the rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] R */ -/* > \verbatim */ -/* > R is DOUBLE PRECISION */ -/* > The nonzero component of the rotated vector. */ -/* > */ -/* > This version has a few statements commented out for thread safety */ -/* > (machine parameters are computed on each entry). 10 feb 03, SJH. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \date December 2016 */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int dlartg_(doublereal *f, doublereal *g, doublereal *cs, - doublereal *sn, doublereal *r__) +int dlartg_(doublereal *f, doublereal *g, doublereal *cs, doublereal *sn, doublereal *r__) { - /* System generated locals */ integer i__1; doublereal d__1, d__2; - - /* Builtin functions */ double log(doublereal), pow_lmp_di(doublereal *, integer *), sqrt(doublereal); - - /* Local variables */ integer i__; doublereal f1, g1, eps, scale; integer count; doublereal safmn2, safmx2; extern doublereal dlamch_(char *, ftnlen); doublereal safmin; - - -/* -- LAPACK auxiliary routine (version 3.7.0) -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ -/* December 2016 */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* LOGICAL FIRST */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Save statement .. */ -/* SAVE FIRST, SAFMX2, SAFMIN, SAFMN2 */ -/* .. */ -/* .. Data statements .. */ -/* DATA FIRST / .TRUE. / */ -/* .. */ -/* .. Executable Statements .. */ - -/* IF( FIRST ) THEN */ safmin = dlamch_((char *)"S", (ftnlen)1); eps = dlamch_((char *)"E", (ftnlen)1); d__1 = dlamch_((char *)"B", (ftnlen)1); - i__1 = (integer) (log(safmin / eps) / log(dlamch_((char *)"B", (ftnlen)1)) / 2.); + i__1 = (integer)(log(safmin / eps) / log(dlamch_((char *)"B", (ftnlen)1)) / 2.); safmn2 = pow_lmp_di(&d__1, &i__1); safmx2 = 1. / safmn2; -/* FIRST = .FALSE. */ -/* END IF */ if (*g == 0.) { *cs = 1.; *sn = 0.; @@ -181,24 +30,20 @@ f"> */ } else { f1 = *f; g1 = *g; -/* Computing MAX */ d__1 = abs(f1), d__2 = abs(g1); - scale = max(d__1,d__2); + scale = max(d__1, d__2); if (scale >= safmx2) { count = 0; -L10: + L10: ++count; f1 *= safmn2; g1 *= safmn2; -/* Computing MAX */ d__1 = abs(f1), d__2 = abs(g1); - scale = max(d__1,d__2); + scale = max(d__1, d__2); if (scale >= safmx2) { goto L10; } -/* Computing 2nd power */ d__1 = f1; -/* Computing 2nd power */ d__2 = g1; *r__ = sqrt(d__1 * d__1 + d__2 * d__2); *cs = f1 / *r__; @@ -206,23 +51,19 @@ L10: i__1 = count; for (i__ = 1; i__ <= i__1; ++i__) { *r__ *= safmx2; -/* L20: */ } } else if (scale <= safmn2) { count = 0; -L30: + L30: ++count; f1 *= safmx2; g1 *= safmx2; -/* Computing MAX */ d__1 = abs(f1), d__2 = abs(g1); - scale = max(d__1,d__2); + scale = max(d__1, d__2); if (scale <= safmn2) { goto L30; } -/* Computing 2nd power */ d__1 = f1; -/* Computing 2nd power */ d__2 = g1; *r__ = sqrt(d__1 * d__1 + d__2 * d__2); *cs = f1 / *r__; @@ -230,12 +71,9 @@ L30: i__1 = count; for (i__ = 1; i__ <= i__1; ++i__) { *r__ *= safmn2; -/* L40: */ } } else { -/* Computing 2nd power */ d__1 = f1; -/* Computing 2nd power */ d__2 = g1; *r__ = sqrt(d__1 * d__1 + d__2 * d__2); *cs = f1 / *r__; @@ -248,11 +86,7 @@ L30: } } return 0; - -/* End of DLARTG */ - -} /* dlartg_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlas2.cpp b/lib/linalg/dlas2.cpp index c590ed5819..4271202477 100644 --- a/lib/linalg/dlas2.cpp +++ b/lib/linalg/dlas2.cpp @@ -1,177 +1,29 @@ -/* fortran/dlas2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLAS2 computes singular values of a 2-by-2 triangular matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLAS2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLAS2( F, G, H, SSMIN, SSMAX ) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION F, G, H, SSMAX, SSMIN */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLAS2 computes the singular values of the 2-by-2 matrix */ -/* > [ F G ] */ -/* > [ 0 H ]. */ -/* > On return, SSMIN is the smaller singular value and SSMAX is the */ -/* > larger singular value. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] F */ -/* > \verbatim */ -/* > F is DOUBLE PRECISION */ -/* > The (1,1) element of the 2-by-2 matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] G */ -/* > \verbatim */ -/* > G is DOUBLE PRECISION */ -/* > The (1,2) element of the 2-by-2 matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] H */ -/* > \verbatim */ -/* > H is DOUBLE PRECISION */ -/* > The (2,2) element of the 2-by-2 matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] SSMIN */ -/* > \verbatim */ -/* > SSMIN is DOUBLE PRECISION */ -/* > The smaller singular value. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] SSMAX */ -/* > \verbatim */ -/* > SSMAX is DOUBLE PRECISION */ -/* > The larger singular value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Barring over/underflow, all output quantities are correct to within */ -/* > a few units in the last place (ulps), even in the absence of a guard */ -/* > digit in addition/subtraction. */ -/* > */ -/* > In IEEE arithmetic, the code works correctly if one matrix element is */ -/* > infinite. */ -/* > */ -/* > Overflow will not occur unless the largest singular value itself */ -/* > overflows, or is within a few ulps of overflow. (On machines with */ -/* > partial overflow, like the Cray, overflow may occur if the largest */ -/* > singular value is within a factor of 2 of overflow.) */ -/* > */ -/* > Underflow is harmless if underflow is gradual. Otherwise, results */ -/* > may correspond to a matrix modified by perturbations of size near */ -/* > the underflow threshold. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlas2_(doublereal *f, doublereal *g, doublereal *h__, - doublereal *ssmin, doublereal *ssmax) +int dlas2_(doublereal *f, doublereal *g, doublereal *h__, doublereal *ssmin, doublereal *ssmax) { - /* System generated locals */ doublereal d__1, d__2; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal c__, fa, ga, ha, as, at, au, fhmn, fhmx; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ==================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - fa = abs(*f); ga = abs(*g); ha = abs(*h__); - fhmn = min(fa,ha); - fhmx = max(fa,ha); + fhmn = min(fa, ha); + fhmx = max(fa, ha); if (fhmn == 0.) { *ssmin = 0.; if (fhmx == 0.) { *ssmax = ga; } else { -/* Computing 2nd power */ - d__1 = min(fhmx,ga) / max(fhmx,ga); - *ssmax = max(fhmx,ga) * sqrt(d__1 * d__1 + 1.); + d__1 = min(fhmx, ga) / max(fhmx, ga); + *ssmax = max(fhmx, ga) * sqrt(d__1 * d__1 + 1.); } } else { if (ga < fhmx) { as = fhmn / fhmx + 1.; at = (fhmx - fhmn) / fhmx; -/* Computing 2nd power */ d__1 = ga / fhmx; au = d__1 * d__1; c__ = 2. / (sqrt(as * as + au) + sqrt(at * at + au)); @@ -180,19 +32,12 @@ extern "C" { } else { au = fhmx / ga; if (au == 0.) { - -/* Avoid possible harmful underflow if exponent range */ -/* asymmetric (true SSMIN may not underflow even if */ -/* AU underflows) */ - *ssmin = fhmn * fhmx / ga; *ssmax = ga; } else { as = fhmn / fhmx + 1.; at = (fhmx - fhmn) / fhmx; -/* Computing 2nd power */ d__1 = as * au; -/* Computing 2nd power */ d__2 = at * au; c__ = 1. / (sqrt(d__1 * d__1 + 1.) + sqrt(d__2 * d__2 + 1.)); *ssmin = fhmn * c__ * au; @@ -202,11 +47,7 @@ extern "C" { } } return 0; - -/* End of DLAS2 */ - -} /* dlas2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlascl.cpp b/lib/linalg/dlascl.cpp index 7596a5c109..3248e1b8a9 100644 --- a/lib/linalg/dlascl.cpp +++ b/lib/linalg/dlascl.cpp @@ -1,172 +1,11 @@ -/* fortran/dlascl.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASCL + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER TYPE */ -/* INTEGER INFO, KL, KU, LDA, M, N */ -/* DOUBLE PRECISION CFROM, CTO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASCL multiplies the M by N real matrix A by the real scalar */ -/* > CTO/CFROM. This is done without over/underflow as long as the final */ -/* > result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that */ -/* > A may be full, upper triangular, lower triangular, upper Hessenberg, */ -/* > or banded. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] TYPE */ -/* > \verbatim */ -/* > TYPE is CHARACTER*1 */ -/* > TYPE indices the storage type of the input matrix. */ -/* > = 'G': A is a full matrix. */ -/* > = 'L': A is a lower triangular matrix. */ -/* > = 'U': A is an upper triangular matrix. */ -/* > = 'H': A is an upper Hessenberg matrix. */ -/* > = 'B': A is a symmetric band matrix with lower bandwidth KL */ -/* > and upper bandwidth KU and with the only the lower */ -/* > half stored. */ -/* > = 'Q': A is a symmetric band matrix with lower bandwidth KL */ -/* > and upper bandwidth KU and with the only the upper */ -/* > half stored. */ -/* > = 'Z': A is a band matrix with lower bandwidth KL and upper */ -/* > bandwidth KU. See DGBTRF for storage details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] KL */ -/* > \verbatim */ -/* > KL is INTEGER */ -/* > The lower bandwidth of A. Referenced only if TYPE = 'B', */ -/* > 'Q' or 'Z'. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] KU */ -/* > \verbatim */ -/* > KU is INTEGER */ -/* > The upper bandwidth of A. Referenced only if TYPE = 'B', */ -/* > 'Q' or 'Z'. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CFROM */ -/* > \verbatim */ -/* > CFROM is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CTO */ -/* > \verbatim */ -/* > CTO is DOUBLE PRECISION */ -/* > */ -/* > The matrix A is multiplied by CTO/CFROM. A(I,J) is computed */ -/* > without over/underflow if the final result CTO*A(I,J)/CFROM */ -/* > can be represented without over/underflow. CFROM must be */ -/* > nonzero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > The matrix to be multiplied by CTO/CFROM. See TYPE for the */ -/* > storage type. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > If TYPE = 'G', 'L', 'U', 'H', LDA >= max(1,M); */ -/* > TYPE = 'B', LDA >= KL+1; */ -/* > TYPE = 'Q', LDA >= KU+1; */ -/* > TYPE = 'Z', LDA >= 2*KL+KU+1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > 0 - successful exit */ -/* > <0 - if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int dlascl_(char *type__, integer *kl, integer *ku, - doublereal *cfrom, doublereal *cto, integer *m, integer *n, - doublereal *a, integer *lda, integer *info, ftnlen type_len) +int dlascl_(char *type__, integer *kl, integer *ku, doublereal *cfrom, doublereal *cto, integer *m, + integer *n, doublereal *a, integer *lda, integer *info, ftnlen type_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; - - /* Local variables */ integer i__, j, k1, k2, k3, k4; doublereal mul, cto1; logical done; @@ -177,43 +16,12 @@ f"> */ extern doublereal dlamch_(char *, ftnlen); doublereal cfromc; extern logical disnan_(doublereal *); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); doublereal bignum, smlnum; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ *info = 0; - if (lsame_(type__, (char *)"G", (ftnlen)1, (ftnlen)1)) { itype = 0; } else if (lsame_(type__, (char *)"L", (ftnlen)1, (ftnlen)1)) { @@ -231,7 +39,6 @@ f"> */ } else { itype = -1; } - if (itype == -1) { *info = -1; } else if (*cfrom == 0. || disnan_(cfrom)) { @@ -242,59 +49,43 @@ f"> */ *info = -6; } else if (*n < 0 || itype == 4 && *n != *m || itype == 5 && *n != *m) { *info = -7; - } else if (itype <= 3 && *lda < max(1,*m)) { + } else if (itype <= 3 && *lda < max(1, *m)) { *info = -9; } else if (itype >= 4) { -/* Computing MAX */ i__1 = *m - 1; - if (*kl < 0 || *kl > max(i__1,0)) { + if (*kl < 0 || *kl > max(i__1, 0)) { *info = -2; - } else /* if(complicated condition) */ { -/* Computing MAX */ + } else { i__1 = *n - 1; - if (*ku < 0 || *ku > max(i__1,0) || (itype == 4 || itype == 5) && - *kl != *ku) { + if (*ku < 0 || *ku > max(i__1, 0) || (itype == 4 || itype == 5) && *kl != *ku) { *info = -3; - } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < * - ku + 1 || itype == 6 && *lda < (*kl << 1) + *ku + 1) { + } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < *ku + 1 || + itype == 6 && *lda < (*kl << 1) + *ku + 1) { *info = -9; } } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DLASCL", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0 || *m == 0) { return 0; } - -/* Get machine parameters */ - smlnum = dlamch_((char *)"S", (ftnlen)1); bignum = 1. / smlnum; - cfromc = *cfrom; ctoc = *cto; - L10: cfrom1 = cfromc * smlnum; if (cfrom1 == cfromc) { -/* CFROMC is an inf. Multiply by a correctly signed zero for */ -/* finite CTOC, or a NaN if CTOC is infinite. */ mul = ctoc / cfromc; done = TRUE_; cto1 = ctoc; } else { cto1 = ctoc / bignum; if (cto1 == ctoc) { -/* CTOC is either 0 or an inf. In both cases, CTOC itself */ -/* serves as the correct multiplication factor. */ mul = ctoc; done = TRUE_; cfromc = 1.; @@ -314,135 +105,81 @@ L10: } } } - if (itype == 0) { - -/* Full matrix */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; -/* L20: */ } -/* L30: */ } - } else if (itype == 1) { - -/* Lower triangular matrix */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; -/* L40: */ } -/* L50: */ } - } else if (itype == 2) { - -/* Upper triangular matrix */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { - i__2 = min(j,*m); + i__2 = min(j, *m); for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; -/* L60: */ } -/* L70: */ } - } else if (itype == 3) { - -/* Upper Hessenberg matrix */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { -/* Computing MIN */ i__3 = j + 1; - i__2 = min(i__3,*m); + i__2 = min(i__3, *m); for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; -/* L80: */ } -/* L90: */ } - } else if (itype == 4) { - -/* Lower half of a symmetric band matrix */ - k3 = *kl + 1; k4 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { -/* Computing MIN */ i__3 = k3, i__4 = k4 - j; - i__2 = min(i__3,i__4); + i__2 = min(i__3, i__4); for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; -/* L100: */ } -/* L110: */ } - } else if (itype == 5) { - -/* Upper half of a symmetric band matrix */ - k1 = *ku + 2; k3 = *ku + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { -/* Computing MAX */ i__2 = k1 - j; i__3 = k3; - for (i__ = max(i__2,1); i__ <= i__3; ++i__) { + for (i__ = max(i__2, 1); i__ <= i__3; ++i__) { a[i__ + j * a_dim1] *= mul; -/* L120: */ } -/* L130: */ } - } else if (itype == 6) { - -/* Band matrix */ - k1 = *kl + *ku + 2; k2 = *kl + 1; k3 = (*kl << 1) + *ku + 1; k4 = *kl + *ku + 1 + *m; i__1 = *n; for (j = 1; j <= i__1; ++j) { -/* Computing MAX */ i__3 = k1 - j; -/* Computing MIN */ i__4 = k3, i__5 = k4 - j; - i__2 = min(i__4,i__5); - for (i__ = max(i__3,k2); i__ <= i__2; ++i__) { + i__2 = min(i__4, i__5); + for (i__ = max(i__3, k2); i__ <= i__2; ++i__) { a[i__ + j * a_dim1] *= mul; -/* L140: */ } -/* L150: */ } - } - - if (! done) { + if (!done) { goto L10; } - return 0; - -/* End of DLASCL */ - -} /* dlascl_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasd4.cpp b/lib/linalg/dlasd4.cpp index e7922d1199..c51c15370e 100644 --- a/lib/linalg/dlasd4.cpp +++ b/lib/linalg/dlasd4.cpp @@ -1,187 +1,13 @@ -/* fortran/dlasd4.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASD4 computes the square root of the i-th updated eigenvalue of a positive symmetric rank-one - modification to a positive diagonal matrix. Used by dbdsdc. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASD4 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASD4( N, I, D, Z, DELTA, RHO, SIGMA, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER I, INFO, N */ -/* DOUBLE PRECISION RHO, SIGMA */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( * ), DELTA( * ), WORK( * ), Z( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > This subroutine computes the square root of the I-th updated */ -/* > eigenvalue of a positive symmetric rank-one modification to */ -/* > a positive diagonal matrix whose entries are given as the squares */ -/* > of the corresponding entries in the array d, and that */ -/* > */ -/* > 0 <= D(i) < D(j) for i < j */ -/* > */ -/* > and that RHO > 0. This is arranged by the calling routine, and is */ -/* > no loss in generality. The rank-one modified system is thus */ -/* > */ -/* > diag( D ) * diag( D ) + RHO * Z * Z_transpose. */ -/* > */ -/* > where we assume the Euclidean norm of Z is 1. */ -/* > */ -/* > The method consists of approximating the rational functions in the */ -/* > secular equation by simpler interpolating rational functions. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The length of all arrays. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] I */ -/* > \verbatim */ -/* > I is INTEGER */ -/* > The index of the eigenvalue to be computed. 1 <= I <= N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension ( N ) */ -/* > The original eigenvalues. It is assumed that they are in */ -/* > order, 0 <= D(I) < D(J) for I < J. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension ( N ) */ -/* > The components of the updating vector. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DELTA */ -/* > \verbatim */ -/* > DELTA is DOUBLE PRECISION array, dimension ( N ) */ -/* > If N .ne. 1, DELTA contains (D(j) - sigma_I) in its j-th */ -/* > component. If N = 1, then DELTA(1) = 1. The vector DELTA */ -/* > contains the information necessary to construct the */ -/* > (singular) eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > The scalar in the symmetric updating formula. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] SIGMA */ -/* > \verbatim */ -/* > SIGMA is DOUBLE PRECISION */ -/* > The computed sigma_I, the I-th updated eigenvalue. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension ( N ) */ -/* > If N .ne. 1, WORK contains (D(j) + sigma_I) in its j-th */ -/* > component. If N = 1, then WORK( 1 ) = 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > > 0: if INFO = 1, the updating process failed. */ -/* > \endverbatim */ - -/* > \par Internal Parameters: */ -/* ========================= */ -/* > */ -/* > \verbatim */ -/* > Logical variable ORGATI (origin-at-i?) is used for distinguishing */ -/* > whether D(i) or D(i+1) is treated as the origin. */ -/* > */ -/* > ORGATI = .true. origin at i */ -/* > ORGATI = .false. origin at i+1 */ -/* > */ -/* > Logical variable SWTCH3 (switch-for-3-poles?) is for noting */ -/* > if we are working with THREE poles! */ -/* > */ -/* > MAXIT is the maximum number of iterations allowed for each */ -/* > eigenvalue. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ren-Cang Li, Computer Science Division, University of California */ -/* > at Berkeley, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlasd4_(integer *n, integer *i__, doublereal *d__, - doublereal *z__, doublereal *delta, doublereal *rho, doublereal * - sigma, doublereal *work, integer *info) +int dlasd4_(integer *n, integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, + doublereal *rho, doublereal *sigma, doublereal *work, integer *info) { - /* System generated locals */ integer i__1; doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal a, b, c__; integer j; doublereal w, dd[3]; @@ -197,60 +23,22 @@ f"> */ doublereal dtisq; logical swtch; doublereal dtnsq; - extern /* Subroutine */ int dlaed6_(integer *, logical *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *) - , dlasd5_(integer *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *); + extern int dlaed6_(integer *, logical *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *), + dlasd5_(integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *); doublereal delsq2, dtnsq1; logical swtch3; extern doublereal dlamch_(char *, ftnlen); logical orgati; doublereal erretm, dtipsq, rhoinv; logical geomavg; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Local Arrays .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Since this routine is called in an inner loop, we do no argument */ -/* checking. */ - -/* Quick return for N=1 and 2. */ - - /* Parameter adjustments */ --work; --delta; --z__; --d__; - - /* Function Body */ *info = 0; if (*n == 1) { - -/* Presumably, I=1 upon entry */ - *sigma = sqrt(d__[1] * d__[1] + *rho * z__[1] * z__[1]); delta[1] = 1.; work[1] = 1.; @@ -260,63 +48,38 @@ f"> */ dlasd5_(i__, &d__[1], &z__[1], &delta[1], rho, sigma, &work[1]); return 0; } - -/* Compute machine epsilon */ - eps = dlamch_((char *)"Epsilon", (ftnlen)7); rhoinv = 1. / *rho; tau2 = 0.; - -/* The case I = N */ - if (*i__ == *n) { - -/* Initialize some basic variables */ - ii = *n - 1; niter = 1; - -/* Calculate initial guess */ - temp = *rho / 2.; - -/* If ||Z||_2 is not one, then TEMP should be set to */ -/* RHO * ||Z||_2^2 / TWO */ - temp1 = temp / (d__[*n] + sqrt(d__[*n] * d__[*n] + temp)); i__1 = *n; for (j = 1; j <= i__1; ++j) { work[j] = d__[j] + d__[*n] + temp1; delta[j] = d__[j] - d__[*n] - temp1; -/* L10: */ } - psi = 0.; i__1 = *n - 2; for (j = 1; j <= i__1; ++j) { psi += z__[j] * z__[j] / (delta[j] * work[j]); -/* L20: */ } - c__ = rhoinv + psi; - w = c__ + z__[ii] * z__[ii] / (delta[ii] * work[ii]) + z__[*n] * z__[* - n] / (delta[*n] * work[*n]); - + w = c__ + z__[ii] * z__[ii] / (delta[ii] * work[ii]) + + z__[*n] * z__[*n] / (delta[*n] * work[*n]); if (w <= 0.) { temp1 = sqrt(d__[*n] * d__[*n] + *rho); - temp = z__[*n - 1] * z__[*n - 1] / ((d__[*n - 1] + temp1) * (d__[* - n] - d__[*n - 1] + *rho / (d__[*n] + temp1))) + z__[*n] * - z__[*n] / *rho; - -/* The following TAU2 is to approximate */ -/* SIGMA_n^2 - D( N )*D( N ) */ - + temp = + z__[*n - 1] * z__[*n - 1] / + ((d__[*n - 1] + temp1) * (d__[*n] - d__[*n - 1] + *rho / (d__[*n] + temp1))) + + z__[*n] * z__[*n] / *rho; if (c__ <= temp) { tau = *rho; } else { delsq = (d__[*n] - d__[*n - 1]) * (d__[*n] + d__[*n - 1]); - a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[* - n]; + a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n]; b = z__[*n] * z__[*n] * delsq; if (a < 0.) { tau2 = b * 2. / (sqrt(a * a + b * 4. * c__) - a); @@ -325,44 +88,23 @@ f"> */ } tau = tau2 / (d__[*n] + sqrt(d__[*n] * d__[*n] + tau2)); } - -/* It can be proved that */ -/* D(N)^2+RHO/2 <= SIGMA_n^2 < D(N)^2+TAU2 <= D(N)^2+RHO */ - } else { delsq = (d__[*n] - d__[*n - 1]) * (d__[*n] + d__[*n - 1]); a = -c__ * delsq + z__[*n - 1] * z__[*n - 1] + z__[*n] * z__[*n]; b = z__[*n] * z__[*n] * delsq; - -/* The following TAU2 is to approximate */ -/* SIGMA_n^2 - D( N )*D( N ) */ - if (a < 0.) { tau2 = b * 2. / (sqrt(a * a + b * 4. * c__) - a); } else { tau2 = (a + sqrt(a * a + b * 4. * c__)) / (c__ * 2.); } tau = tau2 / (d__[*n] + sqrt(d__[*n] * d__[*n] + tau2)); - -/* It can be proved that */ -/* D(N)^2 < D(N)^2+TAU2 < SIGMA(N)^2 < D(N)^2+RHO/2 */ - } - -/* The following TAU is to approximate SIGMA_n - D( N ) */ - -/* TAU = TAU2 / ( D( N )+SQRT( D( N )*D( N )+TAU2 ) ) */ - *sigma = d__[*n] + tau; i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] = d__[j] - d__[*n] - tau; work[j] = d__[j] + d__[*n] + tau; -/* L30: */ } - -/* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; psi = 0.; erretm = 0.; @@ -372,28 +114,16 @@ f"> */ psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; -/* L40: */ } erretm = abs(erretm); - -/* Evaluate PHI and the derivative DPHI */ - temp = z__[*n] / (delta[*n] * work[*n]); phi = z__[*n] * temp; dphi = temp * temp; erretm = (-phi - psi) * 8. + erretm - phi + rhoinv; -/* $ + ABS( TAU2 )*( DPSI+DPHI ) */ - w = rhoinv + phi + psi; - -/* Test for convergence */ - if (abs(w) <= eps * erretm) { goto L240; } - -/* Calculate the new step */ - ++niter; dtnsq1 = work[*n - 1] * delta[*n - 1]; dtnsq = work[*n] * delta[*n]; @@ -406,19 +136,10 @@ f"> */ if (c__ == 0.) { eta = *rho - *sigma * *sigma; } else if (a >= 0.) { - eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ - * 2.); + eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { - eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1))) - ); + eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } - -/* Note, eta should be positive if w is negative, and */ -/* eta should be negative otherwise. However, */ -/* if for some reason caused by roundoff, eta*w > 0, */ -/* we simply use one Newton step instead. This way */ -/* will guarantee eta*w < 0. */ - if (w * eta > 0.) { eta = -w / (dpsi + dphi); } @@ -426,20 +147,14 @@ f"> */ if (temp > *rho) { eta = *rho + dtnsq; } - eta /= *sigma + sqrt(eta + *sigma * *sigma); tau += eta; *sigma += eta; - i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] -= eta; work[j] += eta; -/* L50: */ } - -/* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; psi = 0.; erretm = 0.; @@ -449,54 +164,29 @@ f"> */ psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; -/* L60: */ } erretm = abs(erretm); - -/* Evaluate PHI and the derivative DPHI */ - tau2 = work[*n] * delta[*n]; temp = z__[*n] / tau2; phi = z__[*n] * temp; dphi = temp * temp; erretm = (-phi - psi) * 8. + erretm - phi + rhoinv; -/* $ + ABS( TAU2 )*( DPSI+DPHI ) */ - w = rhoinv + phi + psi; - -/* Main loop to update the values of the array DELTA */ - iter = niter + 1; - for (niter = iter; niter <= 400; ++niter) { - -/* Test for convergence */ - if (abs(w) <= eps * erretm) { goto L240; } - -/* Calculate the new step */ - dtnsq1 = work[*n - 1] * delta[*n - 1]; dtnsq = work[*n] * delta[*n]; c__ = w - dtnsq1 * dpsi - dtnsq * dphi; a = (dtnsq + dtnsq1) * w - dtnsq1 * dtnsq * (dpsi + dphi); b = dtnsq1 * dtnsq * w; if (a >= 0.) { - eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( - c__ * 2.); + eta = (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { - eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))); + eta = b * 2. / (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } - -/* Note, eta should be positive if w is negative, and */ -/* eta should be negative otherwise. However, */ -/* if for some reason caused by roundoff, eta*w > 0, */ -/* we simply use one Newton step instead. This way */ -/* will guarantee eta*w < 0. */ - if (w * eta > 0.) { eta = -w / (dpsi + dphi); } @@ -504,20 +194,14 @@ f"> */ if (temp <= 0.) { eta /= 2.; } - eta /= *sigma + sqrt(eta + *sigma * *sigma); tau += eta; *sigma += eta; - i__1 = *n; for (j = 1; j <= i__1; ++j) { delta[j] -= eta; work[j] += eta; -/* L70: */ } - -/* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; psi = 0.; erretm = 0.; @@ -527,39 +211,20 @@ f"> */ psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; -/* L80: */ } erretm = abs(erretm); - -/* Evaluate PHI and the derivative DPHI */ - tau2 = work[*n] * delta[*n]; temp = z__[*n] / tau2; phi = z__[*n] * temp; dphi = temp * temp; erretm = (-phi - psi) * 8. + erretm - phi + rhoinv; -/* $ + ABS( TAU2 )*( DPSI+DPHI ) */ - w = rhoinv + phi + psi; -/* L90: */ } - -/* Return with INFO = 1, NITER = MAXIT and not converged */ - *info = 1; goto L240; - -/* End for the case I = N */ - } else { - -/* The case for I < N */ - niter = 1; ip1 = *i__ + 1; - -/* Calculate initial guess */ - delsq = (d__[ip1] - d__[*i__]) * (d__[ip1] + d__[*i__]); delsq2 = delsq / 2.; sq2 = sqrt((d__[*i__] * d__[*i__] + d__[ip1] * d__[ip1]) / 2.); @@ -568,33 +233,22 @@ f"> */ for (j = 1; j <= i__1; ++j) { work[j] = d__[j] + d__[*i__] + temp; delta[j] = d__[j] - d__[*i__] - temp; -/* L100: */ } - psi = 0.; i__1 = *i__ - 1; for (j = 1; j <= i__1; ++j) { psi += z__[j] * z__[j] / (work[j] * delta[j]); -/* L110: */ } - phi = 0.; i__1 = *i__ + 2; for (j = *n; j >= i__1; --j) { phi += z__[j] * z__[j] / (work[j] * delta[j]); -/* L120: */ } c__ = rhoinv + psi + phi; - w = c__ + z__[*i__] * z__[*i__] / (work[*i__] * delta[*i__]) + z__[ - ip1] * z__[ip1] / (work[ip1] * delta[ip1]); - + w = c__ + z__[*i__] * z__[*i__] / (work[*i__] * delta[*i__]) + + z__[ip1] * z__[ip1] / (work[ip1] * delta[ip1]); geomavg = FALSE_; if (w > 0.) { - -/* d(i)^2 < the ith sigma^2 < (d(i)^2+d(i+1)^2)/2 */ - -/* We choose d(i) as origin. */ - orgati = TRUE_; ii = *i__; sglb = 0.; @@ -602,32 +256,19 @@ f"> */ a = c__ * delsq + z__[*i__] * z__[*i__] + z__[ip1] * z__[ip1]; b = z__[*i__] * z__[*i__] * delsq; if (a > 0.) { - tau2 = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))); + tau2 = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } else { - tau2 = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / - (c__ * 2.); + tau2 = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } - -/* TAU2 now is an estimation of SIGMA^2 - D( I )^2. The */ -/* following, however, is the corresponding estimation of */ -/* SIGMA - D( I ). */ - tau = tau2 / (d__[*i__] + sqrt(d__[*i__] * d__[*i__] + tau2)); temp = sqrt(eps); - if (d__[*i__] <= temp * d__[ip1] && (d__1 = z__[*i__], abs(d__1)) - <= temp && d__[*i__] > 0.) { -/* Computing MIN */ + if (d__[*i__] <= temp * d__[ip1] && (d__1 = z__[*i__], abs(d__1)) <= temp && + d__[*i__] > 0.) { d__1 = d__[*i__] * 10.; - tau = min(d__1,sgub); + tau = min(d__1, sgub); geomavg = TRUE_; } } else { - -/* (d(i)^2+d(i+1)^2)/2 <= the ith sigma^2 < d(i+1)^2/2 */ - -/* We choose d(i+1) as origin. */ - orgati = FALSE_; ii = ip1; sglb = -delsq2 / (d__[ii] + sq2); @@ -635,33 +276,20 @@ f"> */ a = c__ * delsq - z__[*i__] * z__[*i__] - z__[ip1] * z__[ip1]; b = z__[ip1] * z__[ip1] * delsq; if (a < 0.) { - tau2 = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs( - d__1)))); + tau2 = b * 2. / (a - sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))); } else { - tau2 = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / - (c__ * 2.); + tau2 = -(a + sqrt((d__1 = a * a + b * 4. * c__, abs(d__1)))) / (c__ * 2.); } - -/* TAU2 now is an estimation of SIGMA^2 - D( IP1 )^2. The */ -/* following, however, is the corresponding estimation of */ -/* SIGMA - D( IP1 ). */ - - tau = tau2 / (d__[ip1] + sqrt((d__1 = d__[ip1] * d__[ip1] + tau2, - abs(d__1)))); + tau = tau2 / (d__[ip1] + sqrt((d__1 = d__[ip1] * d__[ip1] + tau2, abs(d__1)))); } - *sigma = d__[ii] + tau; i__1 = *n; for (j = 1; j <= i__1; ++j) { work[j] = d__[j] + d__[ii] + tau; delta[j] = d__[j] - d__[ii] - tau; -/* L130: */ } iim1 = ii - 1; iip1 = ii + 1; - -/* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; psi = 0.; erretm = 0.; @@ -671,12 +299,8 @@ f"> */ psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; -/* L150: */ } erretm = abs(erretm); - -/* Evaluate PHI and the derivative DPHI */ - dphi = 0.; phi = 0.; i__1 = iip1; @@ -685,14 +309,8 @@ f"> */ phi += z__[j] * temp; dphi += temp * temp; erretm += phi; -/* L160: */ } - w = rhoinv + phi + psi; - -/* W is the value of the secular function with */ -/* its ii-th element removed. */ - swtch3 = FALSE_; if (orgati) { if (w < 0.) { @@ -706,38 +324,27 @@ f"> */ if (ii == 1 || ii == *n) { swtch3 = FALSE_; } - temp = z__[ii] / (work[ii] * delta[ii]); dw = dpsi + dphi + temp * temp; temp = z__[ii] * temp; w += temp; erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.; -/* $ + ABS( TAU2 )*DW */ - -/* Test for convergence */ - if (abs(w) <= eps * erretm) { goto L240; } - if (w <= 0.) { - sglb = max(sglb,tau); + sglb = max(sglb, tau); } else { - sgub = min(sgub,tau); + sgub = min(sgub, tau); } - -/* Calculate the new step */ - ++niter; - if (! swtch3) { + if (!swtch3) { dtipsq = work[ip1] * delta[ip1]; dtisq = work[*i__] * delta[*i__]; if (orgati) { -/* Computing 2nd power */ d__1 = z__[*i__] / dtisq; c__ = w - dtipsq * dw + delsq * (d__1 * d__1); } else { -/* Computing 2nd power */ d__1 = z__[ip1] / dtipsq; c__ = w - dtisq * dw - delsq * (d__1 * d__1); } @@ -746,33 +353,26 @@ f"> */ if (c__ == 0.) { if (a == 0.) { if (orgati) { - a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (dpsi + - dphi); + a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (dpsi + dphi); } else { - a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + - dphi); + a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + dphi); } } eta = b / a; } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / ( - c__ * 2.); + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))); + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } } else { - -/* Interpolation using THREE most relevant poles */ - dtiim = work[iim1] * delta[iim1]; dtiip = work[iip1] * delta[iip1]; temp = rhoinv + psi + phi; if (orgati) { temp1 = z__[iim1] / dtiim; temp1 *= temp1; - c__ = temp - dtiip * (dpsi + dphi) - (d__[iim1] - d__[iip1]) * - (d__[iim1] + d__[iip1]) * temp1; + c__ = temp - dtiip * (dpsi + dphi) - + (d__[iim1] - d__[iip1]) * (d__[iim1] + d__[iip1]) * temp1; zz[0] = z__[iim1] * z__[iim1]; if (dpsi < temp1) { zz[2] = dtiip * dtiip * dphi; @@ -782,8 +382,8 @@ f"> */ } else { temp1 = z__[iip1] / dtiip; temp1 *= temp1; - c__ = temp - dtiim * (dpsi + dphi) - (d__[iip1] - d__[iim1]) * - (d__[iim1] + d__[iip1]) * temp1; + c__ = temp - dtiim * (dpsi + dphi) - + (d__[iip1] - d__[iim1]) * (d__[iim1] + d__[iip1]) * temp1; if (dphi < temp1) { zz[0] = dtiim * dtiim * dpsi; } else { @@ -796,22 +396,15 @@ f"> */ dd[1] = delta[ii] * work[ii]; dd[2] = dtiip; dlaed6_(&niter, &orgati, &c__, dd, zz, &w, &eta, info); - if (*info != 0) { - -/* If INFO is not 0, i.e., DLAED6 failed, switch back */ -/* to 2 pole interpolation. */ - swtch3 = FALSE_; *info = 0; dtipsq = work[ip1] * delta[ip1]; dtisq = work[*i__] * delta[*i__]; if (orgati) { -/* Computing 2nd power */ d__1 = z__[*i__] / dtisq; c__ = w - dtipsq * dw + delsq * (d__1 * d__1); } else { -/* Computing 2nd power */ d__1 = z__[ip1] / dtipsq; c__ = w - dtisq * dw - delsq * (d__1 * d__1); } @@ -820,34 +413,22 @@ f"> */ if (c__ == 0.) { if (a == 0.) { if (orgati) { - a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * ( - dpsi + dphi); + a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (dpsi + dphi); } else { - a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + - dphi); + a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + dphi); } } eta = b / a; } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) - / (c__ * 2.); + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, - abs(d__1)))); + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } } } - -/* Note, eta should be positive if w is negative, and */ -/* eta should be negative otherwise. However, */ -/* if for some reason caused by roundoff, eta*w > 0, */ -/* we simply use one Newton step instead. This way */ -/* will guarantee eta*w < 0. */ - if (w * eta >= 0.) { eta = -w / dw; } - eta /= *sigma + sqrt(*sigma * *sigma + eta); temp = tau + eta; if (temp > sgub || temp < sglb) { @@ -868,21 +449,14 @@ f"> */ } } } - prew = w; - tau += eta; *sigma += eta; - i__1 = *n; for (j = 1; j <= i__1; ++j) { work[j] += eta; delta[j] -= eta; -/* L170: */ } - -/* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; psi = 0.; erretm = 0.; @@ -892,12 +466,8 @@ f"> */ psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; -/* L180: */ } erretm = abs(erretm); - -/* Evaluate PHI and the derivative DPHI */ - dphi = 0.; phi = 0.; i__1 = iip1; @@ -906,17 +476,13 @@ f"> */ phi += z__[j] * temp; dphi += temp * temp; erretm += phi; -/* L190: */ } - tau2 = work[ii] * delta[ii]; temp = z__[ii] / tau2; dw = dpsi + dphi + temp * temp; temp = z__[ii] * temp; w = rhoinv + phi + psi + temp; erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.; -/* $ + ABS( TAU2 )*DW */ - swtch = FALSE_; if (orgati) { if (-w > abs(prew) / 10.) { @@ -927,38 +493,24 @@ f"> */ swtch = TRUE_; } } - -/* Main loop to update the values of the array DELTA and WORK */ - iter = niter + 1; - for (niter = iter; niter <= 400; ++niter) { - -/* Test for convergence */ - if (abs(w) <= eps * erretm) { -/* $ .OR. (SGUB-SGLB).LE.EIGHT*ABS(SGUB+SGLB) ) THEN */ goto L240; } - if (w <= 0.) { - sglb = max(sglb,tau); + sglb = max(sglb, tau); } else { - sgub = min(sgub,tau); + sgub = min(sgub, tau); } - -/* Calculate the new step */ - - if (! swtch3) { + if (!swtch3) { dtipsq = work[ip1] * delta[ip1]; dtisq = work[*i__] * delta[*i__]; - if (! swtch) { + if (!swtch) { if (orgati) { -/* Computing 2nd power */ d__1 = z__[*i__] / dtisq; c__ = w - dtipsq * dw + delsq * (d__1 * d__1); } else { -/* Computing 2nd power */ d__1 = z__[ip1] / dtipsq; c__ = w - dtisq * dw - delsq * (d__1 * d__1); } @@ -975,13 +527,11 @@ f"> */ b = dtipsq * dtisq * w; if (c__ == 0.) { if (a == 0.) { - if (! swtch) { + if (!swtch) { if (orgati) { - a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * - (dpsi + dphi); + a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (dpsi + dphi); } else { - a = z__[ip1] * z__[ip1] + dtisq * dtisq * ( - dpsi + dphi); + a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + dphi); } } else { a = dtisq * dtisq * dpsi + dtipsq * dtipsq * dphi; @@ -989,16 +539,11 @@ f"> */ } eta = b / a; } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) - / (c__ * 2.); + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, - abs(d__1)))); + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } } else { - -/* Interpolation using THREE most relevant poles */ - dtiim = work[iim1] * delta[iim1]; dtiip = work[iip1] * delta[iip1]; temp = rhoinv + psi + phi; @@ -1010,8 +555,7 @@ f"> */ if (orgati) { temp1 = z__[iim1] / dtiim; temp1 *= temp1; - temp2 = (d__[iim1] - d__[iip1]) * (d__[iim1] + d__[ - iip1]) * temp1; + temp2 = (d__[iim1] - d__[iip1]) * (d__[iim1] + d__[iip1]) * temp1; c__ = temp - dtiip * (dpsi + dphi) - temp2; zz[0] = z__[iim1] * z__[iim1]; if (dpsi < temp1) { @@ -1022,8 +566,7 @@ f"> */ } else { temp1 = z__[iip1] / dtiip; temp1 *= temp1; - temp2 = (d__[iip1] - d__[iim1]) * (d__[iim1] + d__[ - iip1]) * temp1; + temp2 = (d__[iip1] - d__[iim1]) * (d__[iim1] + d__[iip1]) * temp1; c__ = temp - dtiim * (dpsi + dphi) - temp2; if (dphi < temp1) { zz[0] = dtiim * dtiim * dpsi; @@ -1037,23 +580,16 @@ f"> */ dd[1] = delta[ii] * work[ii]; dd[2] = dtiip; dlaed6_(&niter, &orgati, &c__, dd, zz, &w, &eta, info); - if (*info != 0) { - -/* If INFO is not 0, i.e., DLAED6 failed, switch */ -/* back to two pole interpolation */ - swtch3 = FALSE_; *info = 0; dtipsq = work[ip1] * delta[ip1]; dtisq = work[*i__] * delta[*i__]; - if (! swtch) { + if (!swtch) { if (orgati) { -/* Computing 2nd power */ d__1 = z__[*i__] / dtisq; c__ = w - dtipsq * dw + delsq * (d__1 * d__1); } else { -/* Computing 2nd power */ d__1 = z__[ip1] / dtipsq; c__ = w - dtisq * dw - delsq * (d__1 * d__1); } @@ -1070,40 +606,27 @@ f"> */ b = dtipsq * dtisq * w; if (c__ == 0.) { if (a == 0.) { - if (! swtch) { + if (!swtch) { if (orgati) { - a = z__[*i__] * z__[*i__] + dtipsq * - dtipsq * (dpsi + dphi); + a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (dpsi + dphi); } else { - a = z__[ip1] * z__[ip1] + dtisq * dtisq * - (dpsi + dphi); + a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + dphi); } } else { - a = dtisq * dtisq * dpsi + dtipsq * dtipsq * - dphi; + a = dtisq * dtisq * dpsi + dtipsq * dtipsq * dphi; } } eta = b / a; } else if (a <= 0.) { - eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs( - d__1)))) / (c__ * 2.); + eta = (a - sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))) / (c__ * 2.); } else { - eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, - abs(d__1)))); + eta = b * 2. / (a + sqrt((d__1 = a * a - b * 4. * c__, abs(d__1)))); } } } - -/* Note, eta should be positive if w is negative, and */ -/* eta should be negative otherwise. However, */ -/* if for some reason caused by roundoff, eta*w > 0, */ -/* we simply use one Newton step instead. This way */ -/* will guarantee eta*w < 0. */ - if (w * eta >= 0.) { eta = -w / dw; } - eta /= *sigma + sqrt(*sigma * *sigma + eta); temp = tau + eta; if (temp > sgub || temp < sglb) { @@ -1124,21 +647,14 @@ f"> */ } } } - prew = w; - tau += eta; *sigma += eta; - i__1 = *n; for (j = 1; j <= i__1; ++j) { work[j] += eta; delta[j] -= eta; -/* L200: */ } - -/* Evaluate PSI and the derivative DPSI */ - dpsi = 0.; psi = 0.; erretm = 0.; @@ -1148,12 +664,8 @@ f"> */ psi += z__[j] * temp; dpsi += temp * temp; erretm += psi; -/* L210: */ } erretm = abs(erretm); - -/* Evaluate PHI and the derivative DPHI */ - dphi = 0.; phi = 0.; i__1 = iip1; @@ -1162,37 +674,22 @@ f"> */ phi += z__[j] * temp; dphi += temp * temp; erretm += phi; -/* L220: */ } - tau2 = work[ii] * delta[ii]; temp = z__[ii] / tau2; dw = dpsi + dphi + temp * temp; temp = z__[ii] * temp; w = rhoinv + phi + psi + temp; erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + abs(temp) * 3.; -/* $ + ABS( TAU2 )*DW */ - if (w * prew > 0. && abs(w) > abs(prew) / 10.) { - swtch = ! swtch; + swtch = !swtch; } - -/* L230: */ } - -/* Return with INFO = 1, NITER = MAXIT and not converged */ - *info = 1; - } - L240: return 0; - -/* End of DLASD4 */ - -} /* dlasd4_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasd5.cpp b/lib/linalg/dlasd5.cpp index a56f570c0b..7bade73f84 100644 --- a/lib/linalg/dlasd5.cpp +++ b/lib/linalg/dlasd5.cpp @@ -1,264 +1,67 @@ -/* fortran/dlasd5.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASD5 computes the square root of the i-th eigenvalue of a positive symmetric rank-one modific -ation of a 2-by-2 diagonal matrix. Used by sbdsdc. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASD5 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASD5( I, D, Z, DELTA, RHO, DSIGMA, WORK ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER I */ -/* DOUBLE PRECISION DSIGMA, RHO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( 2 ), DELTA( 2 ), WORK( 2 ), Z( 2 ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > This subroutine computes the square root of the I-th eigenvalue */ -/* > of a positive symmetric rank-one modification of a 2-by-2 diagonal */ -/* > matrix */ -/* > */ -/* > diag( D ) * diag( D ) + RHO * Z * transpose(Z) . */ -/* > */ -/* > The diagonal entries in the array D are assumed to satisfy */ -/* > */ -/* > 0 <= D(i) < D(j) for i < j . */ -/* > */ -/* > We also assume RHO > 0 and that the Euclidean norm of the vector */ -/* > Z is one. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] I */ -/* > \verbatim */ -/* > I is INTEGER */ -/* > The index of the eigenvalue to be computed. I = 1 or I = 2. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension ( 2 ) */ -/* > The original eigenvalues. We assume 0 <= D(1) < D(2). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension ( 2 ) */ -/* > The components of the updating vector. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DELTA */ -/* > \verbatim */ -/* > DELTA is DOUBLE PRECISION array, dimension ( 2 ) */ -/* > Contains (D(j) - sigma_I) in its j-th component. */ -/* > The vector DELTA contains the information necessary */ -/* > to construct the eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > The scalar in the symmetric updating formula. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DSIGMA */ -/* > \verbatim */ -/* > DSIGMA is DOUBLE PRECISION */ -/* > The computed sigma_I, the I-th updated eigenvalue. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension ( 2 ) */ -/* > WORK contains (D(j) + sigma_I) in its j-th component. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ren-Cang Li, Computer Science Division, University of California */ -/* > at Berkeley, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlasd5_(integer *i__, doublereal *d__, doublereal *z__, - doublereal *delta, doublereal *rho, doublereal *dsigma, doublereal * - work) +int dlasd5_(integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, + doublereal *dsigma, doublereal *work) { - /* System generated locals */ doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal b, c__, w, del, tau, delsq; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --work; --delta; --z__; --d__; - - /* Function Body */ del = d__[2] - d__[1]; delsq = del * (d__[2] + d__[1]); if (*i__ == 1) { - w = *rho * 4. * (z__[2] * z__[2] / (d__[1] + d__[2] * 3.) - z__[1] * - z__[1] / (d__[1] * 3. + d__[2])) / del + 1.; + w = *rho * 4. * + (z__[2] * z__[2] / (d__[1] + d__[2] * 3.) - + z__[1] * z__[1] / (d__[1] * 3. + d__[2])) / + del + + 1.; if (w > 0.) { b = delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[1] * z__[1] * delsq; - -/* B > ZERO, always */ - -/* The following TAU is DSIGMA * DSIGMA - D( 1 ) * D( 1 ) */ - tau = c__ * 2. / (b + sqrt((d__1 = b * b - c__ * 4., abs(d__1)))); - -/* The following TAU is DSIGMA - D( 1 ) */ - tau /= d__[1] + sqrt(d__[1] * d__[1] + tau); *dsigma = d__[1] + tau; delta[1] = -tau; delta[2] = del - tau; work[1] = d__[1] * 2. + tau; work[2] = d__[1] + tau + d__[2]; -/* DELTA( 1 ) = -Z( 1 ) / TAU */ -/* DELTA( 2 ) = Z( 2 ) / ( DEL-TAU ) */ } else { b = -delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[2] * z__[2] * delsq; - -/* The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 ) */ - if (b > 0.) { tau = c__ * -2. / (b + sqrt(b * b + c__ * 4.)); } else { tau = (b - sqrt(b * b + c__ * 4.)) / 2.; } - -/* The following TAU is DSIGMA - D( 2 ) */ - tau /= d__[2] + sqrt((d__1 = d__[2] * d__[2] + tau, abs(d__1))); *dsigma = d__[2] + tau; delta[1] = -(del + tau); delta[2] = -tau; work[1] = d__[1] + tau + d__[2]; work[2] = d__[2] * 2. + tau; -/* DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) */ -/* DELTA( 2 ) = -Z( 2 ) / TAU */ } -/* TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) */ -/* DELTA( 1 ) = DELTA( 1 ) / TEMP */ -/* DELTA( 2 ) = DELTA( 2 ) / TEMP */ } else { - -/* Now I=2 */ - b = -delsq + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[2] * z__[2] * delsq; - -/* The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 ) */ - if (b > 0.) { tau = (b + sqrt(b * b + c__ * 4.)) / 2.; } else { tau = c__ * 2. / (-b + sqrt(b * b + c__ * 4.)); } - -/* The following TAU is DSIGMA - D( 2 ) */ - tau /= d__[2] + sqrt(d__[2] * d__[2] + tau); *dsigma = d__[2] + tau; delta[1] = -(del + tau); delta[2] = -tau; work[1] = d__[1] + tau + d__[2]; work[2] = d__[2] * 2. + tau; -/* DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) */ -/* DELTA( 2 ) = -Z( 2 ) / TAU */ -/* TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) */ -/* DELTA( 1 ) = DELTA( 1 ) / TEMP */ -/* DELTA( 2 ) = DELTA( 2 ) / TEMP */ } return 0; - -/* End of DLASD5 */ - -} /* dlasd5_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasd6.cpp b/lib/linalg/dlasd6.cpp index 48c7d8dd4f..a631245cf5 100644 --- a/lib/linalg/dlasd6.cpp +++ b/lib/linalg/dlasd6.cpp @@ -1,396 +1,35 @@ -/* fortran/dlasd6.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__0 = 0; static doublereal c_b7 = 1.; static integer c__1 = 1; static integer c_n1 = -1; - -/* > \brief \b DLASD6 computes the SVD of an updated upper bidiagonal matrix obtained by merging two smaller o -nes by appending a row. Used by sbdsdc. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASD6 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASD6( ICOMPQ, NL, NR, SQRE, D, VF, VL, ALPHA, BETA, */ -/* IDXQ, PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, */ -/* LDGNUM, POLES, DIFL, DIFR, Z, K, C, S, WORK, */ -/* IWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL, */ -/* $ NR, SQRE */ -/* DOUBLE PRECISION ALPHA, BETA, C, S */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER GIVCOL( LDGCOL, * ), IDXQ( * ), IWORK( * ), */ -/* $ PERM( * ) */ -/* DOUBLE PRECISION D( * ), DIFL( * ), DIFR( * ), */ -/* $ GIVNUM( LDGNUM, * ), POLES( LDGNUM, * ), */ -/* $ VF( * ), VL( * ), WORK( * ), Z( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASD6 computes the SVD of an updated upper bidiagonal matrix B */ -/* > obtained by merging two smaller ones by appending a row. This */ -/* > routine is used only for the problem which requires all singular */ -/* > values and optionally singular vector matrices in factored form. */ -/* > B is an N-by-M matrix with N = NL + NR + 1 and M = N + SQRE. */ -/* > A related subroutine, DLASD1, handles the case in which all singular */ -/* > values and singular vectors of the bidiagonal matrix are desired. */ -/* > */ -/* > DLASD6 computes the SVD as follows: */ -/* > */ -/* > ( D1(in) 0 0 0 ) */ -/* > B = U(in) * ( Z1**T a Z2**T b ) * VT(in) */ -/* > ( 0 0 D2(in) 0 ) */ -/* > */ -/* > = U(out) * ( D(out) 0) * VT(out) */ -/* > */ -/* > where Z**T = (Z1**T a Z2**T b) = u**T VT**T, and u is a vector of dimension M */ -/* > with ALPHA and BETA in the NL+1 and NL+2 th entries and zeros */ -/* > elsewhere; and the entry b is empty if SQRE = 0. */ -/* > */ -/* > The singular values of B can be computed using D1, D2, the first */ -/* > components of all the right singular vectors of the lower block, and */ -/* > the last components of all the right singular vectors of the upper */ -/* > block. These components are stored and updated in VF and VL, */ -/* > respectively, in DLASD6. Hence U and VT are not explicitly */ -/* > referenced. */ -/* > */ -/* > The singular values are stored in D. The algorithm consists of two */ -/* > stages: */ -/* > */ -/* > The first stage consists of deflating the size of the problem */ -/* > when there are multiple singular values or if there is a zero */ -/* > in the Z vector. For each such occurrence the dimension of the */ -/* > secular equation problem is reduced by one. This stage is */ -/* > performed by the routine DLASD7. */ -/* > */ -/* > The second stage consists of calculating the updated */ -/* > singular values. This is done by finding the roots of the */ -/* > secular equation via the routine DLASD4 (as called by DLASD8). */ -/* > This routine also updates VF and VL and computes the distances */ -/* > between the updated singular values and the old singular */ -/* > values. */ -/* > */ -/* > DLASD6 is called from DLASDA. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ICOMPQ */ -/* > \verbatim */ -/* > ICOMPQ is INTEGER */ -/* > Specifies whether singular vectors are to be computed in */ -/* > factored form: */ -/* > = 0: Compute singular values only. */ -/* > = 1: Compute singular vectors in factored form as well. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NL */ -/* > \verbatim */ -/* > NL is INTEGER */ -/* > The row dimension of the upper block. NL >= 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NR */ -/* > \verbatim */ -/* > NR is INTEGER */ -/* > The row dimension of the lower block. NR >= 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] SQRE */ -/* > \verbatim */ -/* > SQRE is INTEGER */ -/* > = 0: the lower block is an NR-by-NR square matrix. */ -/* > = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */ -/* > */ -/* > The bidiagonal matrix has row dimension N = NL + NR + 1, */ -/* > and column dimension M = N + SQRE. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension ( NL+NR+1 ). */ -/* > On entry D(1:NL,1:NL) contains the singular values of the */ -/* > upper block, and D(NL+2:N) contains the singular values */ -/* > of the lower block. On exit D(1:N) contains the singular */ -/* > values of the modified matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] VF */ -/* > \verbatim */ -/* > VF is DOUBLE PRECISION array, dimension ( M ) */ -/* > On entry, VF(1:NL+1) contains the first components of all */ -/* > right singular vectors of the upper block; and VF(NL+2:M) */ -/* > contains the first components of all right singular vectors */ -/* > of the lower block. On exit, VF contains the first components */ -/* > of all right singular vectors of the bidiagonal matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] VL */ -/* > \verbatim */ -/* > VL is DOUBLE PRECISION array, dimension ( M ) */ -/* > On entry, VL(1:NL+1) contains the last components of all */ -/* > right singular vectors of the upper block; and VL(NL+2:M) */ -/* > contains the last components of all right singular vectors of */ -/* > the lower block. On exit, VL contains the last components of */ -/* > all right singular vectors of the bidiagonal matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION */ -/* > Contains the diagonal element associated with the added row. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] BETA */ -/* > \verbatim */ -/* > BETA is DOUBLE PRECISION */ -/* > Contains the off-diagonal element associated with the added */ -/* > row. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] IDXQ */ -/* > \verbatim */ -/* > IDXQ is INTEGER array, dimension ( N ) */ -/* > This contains the permutation which will reintegrate the */ -/* > subproblem just solved back into sorted order, i.e. */ -/* > D( IDXQ( I = 1, N ) ) will be in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] PERM */ -/* > \verbatim */ -/* > PERM is INTEGER array, dimension ( N ) */ -/* > The permutations (from deflation and sorting) to be applied */ -/* > to each block. Not referenced if ICOMPQ = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVPTR */ -/* > \verbatim */ -/* > GIVPTR is INTEGER */ -/* > The number of Givens rotations which took place in this */ -/* > subproblem. Not referenced if ICOMPQ = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVCOL */ -/* > \verbatim */ -/* > GIVCOL is INTEGER array, dimension ( LDGCOL, 2 ) */ -/* > Each pair of numbers indicates a pair of columns to take place */ -/* > in a Givens rotation. Not referenced if ICOMPQ = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDGCOL */ -/* > \verbatim */ -/* > LDGCOL is INTEGER */ -/* > leading dimension of GIVCOL, must be at least N. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVNUM */ -/* > \verbatim */ -/* > GIVNUM is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ -/* > Each number indicates the C or S value to be used in the */ -/* > corresponding Givens rotation. Not referenced if ICOMPQ = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDGNUM */ -/* > \verbatim */ -/* > LDGNUM is INTEGER */ -/* > The leading dimension of GIVNUM and POLES, must be at least N. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] POLES */ -/* > \verbatim */ -/* > POLES is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ -/* > On exit, POLES(1,*) is an array containing the new singular */ -/* > values obtained from solving the secular equation, and */ -/* > POLES(2,*) is an array containing the poles in the secular */ -/* > equation. Not referenced if ICOMPQ = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DIFL */ -/* > \verbatim */ -/* > DIFL is DOUBLE PRECISION array, dimension ( N ) */ -/* > On exit, DIFL(I) is the distance between I-th updated */ -/* > (undeflated) singular value and the I-th (undeflated) old */ -/* > singular value. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DIFR */ -/* > \verbatim */ -/* > DIFR is DOUBLE PRECISION array, */ -/* > dimension ( LDDIFR, 2 ) if ICOMPQ = 1 and */ -/* > dimension ( K ) if ICOMPQ = 0. */ -/* > On exit, DIFR(I,1) = D(I) - DSIGMA(I+1), DIFR(K,1) is not */ -/* > defined and will not be referenced. */ -/* > */ -/* > If ICOMPQ = 1, DIFR(1:K,2) is an array containing the */ -/* > normalizing factors for the right singular vector matrix. */ -/* > */ -/* > See DLASD8 for details on DIFL and DIFR. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension ( M ) */ -/* > The first elements of this array contain the components */ -/* > of the deflation-adjusted updating row vector. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > Contains the dimension of the non-deflated matrix, */ -/* > This is the order of the related secular equation. 1 <= K <=N. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION */ -/* > C contains garbage if SQRE =0 and the C-value of a Givens */ -/* > rotation related to the right null space if SQRE = 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION */ -/* > S contains garbage if SQRE =0 and the S-value of a Givens */ -/* > rotation related to the right null space if SQRE = 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension ( 4 * M ) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension ( 3 * N ) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: if INFO = 1, a singular value did not converge */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ming Gu and Huan Ren, Computer Science Division, University of */ -/* > California at Berkeley, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlasd6_(integer *icompq, integer *nl, integer *nr, - integer *sqre, doublereal *d__, doublereal *vf, doublereal *vl, - doublereal *alpha, doublereal *beta, integer *idxq, integer *perm, - integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, - integer *ldgnum, doublereal *poles, doublereal *difl, doublereal * - difr, doublereal *z__, integer *k, doublereal *c__, doublereal *s, - doublereal *work, integer *iwork, integer *info) +int dlasd6_(integer *icompq, integer *nl, integer *nr, integer *sqre, doublereal *d__, + doublereal *vf, doublereal *vl, doublereal *alpha, doublereal *beta, integer *idxq, + integer *perm, integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, + integer *ldgnum, doublereal *poles, doublereal *difl, doublereal *difr, doublereal *z__, + integer *k, doublereal *c__, doublereal *s, doublereal *work, integer *iwork, + integer *info) { - /* System generated locals */ - integer givcol_dim1, givcol_offset, givnum_dim1, givnum_offset, - poles_dim1, poles_offset, i__1; + integer givcol_dim1, givcol_offset, givnum_dim1, givnum_offset, poles_dim1, poles_offset, i__1; doublereal d__1, d__2; - - /* Local variables */ integer i__, m, n, n1, n2, iw, idx, idxc, idxp, ivfw, ivlw; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *), dlasd7_(integer *, integer *, integer *, - integer *, integer *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, integer *, integer *, - integer *, integer *, integer *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *), dlasd8_( - integer *, integer *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, integer *, doublereal *, - doublereal *, integer *), dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dlamrg_(integer *, integer *, - doublereal *, integer *, integer *, integer *); + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), + dlasd7_(integer *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *, integer *, integer *, integer *, integer *, + integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *), + dlasd8_(integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen), + dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *); integer isigma; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); doublereal orgnrm; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; --vf; --vl; @@ -410,12 +49,9 @@ f"> */ --z__; --work; --iwork; - - /* Function Body */ *info = 0; n = *nl + *nr + 1; m = n + *sqre; - if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*nl < 1) { @@ -434,81 +70,43 @@ f"> */ xerbla_((char *)"DLASD6", &i__1, (ftnlen)6); return 0; } - -/* The following values are for bookkeeping purposes only. They are */ -/* integer pointers which indicate the portion of the workspace */ -/* used by a particular array in DLASD7 and DLASD8. */ - isigma = 1; iw = isigma + n; ivfw = iw + m; ivlw = ivfw + m; - idx = 1; idxc = idx + n; idxp = idxc + n; - -/* Scale. */ - -/* Computing MAX */ d__1 = abs(*alpha), d__2 = abs(*beta); - orgnrm = max(d__1,d__2); + orgnrm = max(d__1, d__2); d__[*nl + 1] = 0.; i__1 = n; for (i__ = 1; i__ <= i__1; ++i__) { if ((d__1 = d__[i__], abs(d__1)) > orgnrm) { orgnrm = (d__1 = d__[i__], abs(d__1)); } -/* L10: */ } - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b7, &n, &c__1, &d__[1], &n, info, ( - ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b7, &n, &c__1, &d__[1], &n, info, (ftnlen)1); *alpha /= orgnrm; *beta /= orgnrm; - -/* Sort and Deflate singular values. */ - - dlasd7_(icompq, nl, nr, sqre, k, &d__[1], &z__[1], &work[iw], &vf[1], & - work[ivfw], &vl[1], &work[ivlw], alpha, beta, &work[isigma], & - iwork[idx], &iwork[idxp], &idxq[1], &perm[1], givptr, &givcol[ - givcol_offset], ldgcol, &givnum[givnum_offset], ldgnum, c__, s, - info); - -/* Solve Secular Equation, compute DIFL, DIFR, and update VF, VL. */ - - dlasd8_(icompq, k, &d__[1], &z__[1], &vf[1], &vl[1], &difl[1], &difr[1], - ldgnum, &work[isigma], &work[iw], info); - -/* Report the possible convergence failure. */ - + dlasd7_(icompq, nl, nr, sqre, k, &d__[1], &z__[1], &work[iw], &vf[1], &work[ivfw], &vl[1], + &work[ivlw], alpha, beta, &work[isigma], &iwork[idx], &iwork[idxp], &idxq[1], &perm[1], + givptr, &givcol[givcol_offset], ldgcol, &givnum[givnum_offset], ldgnum, c__, s, info); + dlasd8_(icompq, k, &d__[1], &z__[1], &vf[1], &vl[1], &difl[1], &difr[1], ldgnum, &work[isigma], + &work[iw], info); if (*info != 0) { return 0; } - -/* Save the poles if ICOMPQ = 1. */ - if (*icompq == 1) { dcopy_(k, &d__[1], &c__1, &poles[poles_dim1 + 1], &c__1); dcopy_(k, &work[isigma], &c__1, &poles[(poles_dim1 << 1) + 1], &c__1); } - -/* Unscale. */ - - dlascl_((char *)"G", &c__0, &c__0, &c_b7, &orgnrm, &n, &c__1, &d__[1], &n, info, ( - ftnlen)1); - -/* Prepare the IDXQ sorting permutation. */ - + dlascl_((char *)"G", &c__0, &c__0, &c_b7, &orgnrm, &n, &c__1, &d__[1], &n, info, (ftnlen)1); n1 = *k; n2 = n - *k; dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &idxq[1]); - return 0; - -/* End of DLASD6 */ - -} /* dlasd6_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasd7.cpp b/lib/linalg/dlasd7.cpp index 89a18cc81f..989771ca01 100644 --- a/lib/linalg/dlasd7.cpp +++ b/lib/linalg/dlasd7.cpp @@ -1,362 +1,31 @@ -/* fortran/dlasd7.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DLASD7 merges the two sets of singular values together into a single sorted set. Then it tries -to deflate the size of the problem. Used by sbdsdc. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASD7 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASD7( ICOMPQ, NL, NR, SQRE, K, D, Z, ZW, VF, VFW, VL, */ -/* VLW, ALPHA, BETA, DSIGMA, IDX, IDXP, IDXQ, */ -/* PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, */ -/* C, S, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL, */ -/* $ NR, SQRE */ -/* DOUBLE PRECISION ALPHA, BETA, C, S */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER GIVCOL( LDGCOL, * ), IDX( * ), IDXP( * ), */ -/* $ IDXQ( * ), PERM( * ) */ -/* DOUBLE PRECISION D( * ), DSIGMA( * ), GIVNUM( LDGNUM, * ), */ -/* $ VF( * ), VFW( * ), VL( * ), VLW( * ), Z( * ), */ -/* $ ZW( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASD7 merges the two sets of singular values together into a single */ -/* > sorted set. Then it tries to deflate the size of the problem. There */ -/* > are two ways in which deflation can occur: when two or more singular */ -/* > values are close together or if there is a tiny entry in the Z */ -/* > vector. For each such occurrence the order of the related */ -/* > secular equation problem is reduced by one. */ -/* > */ -/* > DLASD7 is called from DLASD6. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ICOMPQ */ -/* > \verbatim */ -/* > ICOMPQ is INTEGER */ -/* > Specifies whether singular vectors are to be computed */ -/* > in compact form, as follows: */ -/* > = 0: Compute singular values only. */ -/* > = 1: Compute singular vectors of upper */ -/* > bidiagonal matrix in compact form. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NL */ -/* > \verbatim */ -/* > NL is INTEGER */ -/* > The row dimension of the upper block. NL >= 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NR */ -/* > \verbatim */ -/* > NR is INTEGER */ -/* > The row dimension of the lower block. NR >= 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] SQRE */ -/* > \verbatim */ -/* > SQRE is INTEGER */ -/* > = 0: the lower block is an NR-by-NR square matrix. */ -/* > = 1: the lower block is an NR-by-(NR+1) rectangular matrix. */ -/* > */ -/* > The bidiagonal matrix has */ -/* > N = NL + NR + 1 rows and */ -/* > M = N + SQRE >= N columns. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > Contains the dimension of the non-deflated matrix, this is */ -/* > the order of the related secular equation. 1 <= K <=N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension ( N ) */ -/* > On entry D contains the singular values of the two submatrices */ -/* > to be combined. On exit D contains the trailing (N-K) updated */ -/* > singular values (those which were deflated) sorted into */ -/* > increasing order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension ( M ) */ -/* > On exit Z contains the updating row vector in the secular */ -/* > equation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] ZW */ -/* > \verbatim */ -/* > ZW is DOUBLE PRECISION array, dimension ( M ) */ -/* > Workspace for Z. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] VF */ -/* > \verbatim */ -/* > VF is DOUBLE PRECISION array, dimension ( M ) */ -/* > On entry, VF(1:NL+1) contains the first components of all */ -/* > right singular vectors of the upper block; and VF(NL+2:M) */ -/* > contains the first components of all right singular vectors */ -/* > of the lower block. On exit, VF contains the first components */ -/* > of all right singular vectors of the bidiagonal matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] VFW */ -/* > \verbatim */ -/* > VFW is DOUBLE PRECISION array, dimension ( M ) */ -/* > Workspace for VF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] VL */ -/* > \verbatim */ -/* > VL is DOUBLE PRECISION array, dimension ( M ) */ -/* > On entry, VL(1:NL+1) contains the last components of all */ -/* > right singular vectors of the upper block; and VL(NL+2:M) */ -/* > contains the last components of all right singular vectors */ -/* > of the lower block. On exit, VL contains the last components */ -/* > of all right singular vectors of the bidiagonal matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] VLW */ -/* > \verbatim */ -/* > VLW is DOUBLE PRECISION array, dimension ( M ) */ -/* > Workspace for VL. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION */ -/* > Contains the diagonal element associated with the added row. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is DOUBLE PRECISION */ -/* > Contains the off-diagonal element associated with the added */ -/* > row. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DSIGMA */ -/* > \verbatim */ -/* > DSIGMA is DOUBLE PRECISION array, dimension ( N ) */ -/* > Contains a copy of the diagonal elements (K-1 singular values */ -/* > and one zero) in the secular equation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IDX */ -/* > \verbatim */ -/* > IDX is INTEGER array, dimension ( N ) */ -/* > This will contain the permutation used to sort the contents of */ -/* > D into ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IDXP */ -/* > \verbatim */ -/* > IDXP is INTEGER array, dimension ( N ) */ -/* > This will contain the permutation used to place deflated */ -/* > values of D at the end of the array. On output IDXP(2:K) */ -/* > points to the nondeflated D-values and IDXP(K+1:N) */ -/* > points to the deflated singular values. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] IDXQ */ -/* > \verbatim */ -/* > IDXQ is INTEGER array, dimension ( N ) */ -/* > This contains the permutation which separately sorts the two */ -/* > sub-problems in D into ascending order. Note that entries in */ -/* > the first half of this permutation must first be moved one */ -/* > position backward; and entries in the second half */ -/* > must first have NL+1 added to their values. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] PERM */ -/* > \verbatim */ -/* > PERM is INTEGER array, dimension ( N ) */ -/* > The permutations (from deflation and sorting) to be applied */ -/* > to each singular block. Not referenced if ICOMPQ = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVPTR */ -/* > \verbatim */ -/* > GIVPTR is INTEGER */ -/* > The number of Givens rotations which took place in this */ -/* > subproblem. Not referenced if ICOMPQ = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVCOL */ -/* > \verbatim */ -/* > GIVCOL is INTEGER array, dimension ( LDGCOL, 2 ) */ -/* > Each pair of numbers indicates a pair of columns to take place */ -/* > in a Givens rotation. Not referenced if ICOMPQ = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDGCOL */ -/* > \verbatim */ -/* > LDGCOL is INTEGER */ -/* > The leading dimension of GIVCOL, must be at least N. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVNUM */ -/* > \verbatim */ -/* > GIVNUM is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) */ -/* > Each number indicates the C or S value to be used in the */ -/* > corresponding Givens rotation. Not referenced if ICOMPQ = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDGNUM */ -/* > \verbatim */ -/* > LDGNUM is INTEGER */ -/* > The leading dimension of GIVNUM, must be at least N. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION */ -/* > C contains garbage if SQRE =0 and the C-value of a Givens */ -/* > rotation related to the right null space if SQRE = 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION */ -/* > S contains garbage if SQRE =0 and the S-value of a Givens */ -/* > rotation related to the right null space if SQRE = 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ming Gu and Huan Ren, Computer Science Division, University of */ -/* > California at Berkeley, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlasd7_(integer *icompq, integer *nl, integer *nr, - integer *sqre, integer *k, doublereal *d__, doublereal *z__, - doublereal *zw, doublereal *vf, doublereal *vfw, doublereal *vl, - doublereal *vlw, doublereal *alpha, doublereal *beta, doublereal * - dsigma, integer *idx, integer *idxp, integer *idxq, integer *perm, - integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, - integer *ldgnum, doublereal *c__, doublereal *s, integer *info) +int dlasd7_(integer *icompq, integer *nl, integer *nr, integer *sqre, integer *k, doublereal *d__, + doublereal *z__, doublereal *zw, doublereal *vf, doublereal *vfw, doublereal *vl, + doublereal *vlw, doublereal *alpha, doublereal *beta, doublereal *dsigma, integer *idx, + integer *idxp, integer *idxq, integer *perm, integer *givptr, integer *givcol, + integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal *c__, doublereal *s, + integer *info) { - /* System generated locals */ integer givcol_dim1, givcol_offset, givnum_dim1, givnum_offset, i__1; doublereal d__1, d__2; - - /* Local variables */ integer i__, j, m, n, k2; doublereal z1; integer jp; doublereal eps, tau, tol; integer nlp1, nlp2, idxi, idxj; - extern /* Subroutine */ int drot_(integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *); + extern int drot_(integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + doublereal *); integer idxjp; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer jprev; - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, ftnlen); + extern int dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), + xerbla_(char *, integer *, ftnlen); doublereal hlftol; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ - -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; --z__; --zw; @@ -375,12 +44,9 @@ f"> */ givnum_dim1 = *ldgnum; givnum_offset = 1 + givnum_dim1; givnum -= givnum_offset; - - /* Function Body */ *info = 0; n = *nl + *nr + 1; m = n + *sqre; - if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*nl < 1) { @@ -399,16 +65,11 @@ f"> */ xerbla_((char *)"DLASD7", &i__1, (ftnlen)6); return 0; } - nlp1 = *nl + 1; nlp2 = *nl + 2; if (*icompq == 1) { *givptr = 0; } - -/* Generate the first part of the vector Z and move the singular */ -/* values in the first part of D one position backward. */ - z1 = *alpha * vl[nlp1]; vl[nlp1] = 0.; tau = vf[nlp1]; @@ -418,40 +79,25 @@ f"> */ vf[i__ + 1] = vf[i__]; d__[i__ + 1] = d__[i__]; idxq[i__ + 1] = idxq[i__] + 1; -/* L10: */ } vf[1] = tau; - -/* Generate the second part of the vector Z. */ - i__1 = m; for (i__ = nlp2; i__ <= i__1; ++i__) { z__[i__] = *beta * vf[i__]; vf[i__] = 0.; -/* L20: */ } - -/* Sort the singular values into increasing order */ - i__1 = n; for (i__ = nlp2; i__ <= i__1; ++i__) { idxq[i__] += nlp1; -/* L30: */ } - -/* DSIGMA, IDXC, IDXC, and ZW are used as storage space. */ - i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { dsigma[i__] = d__[idxq[i__]]; zw[i__] = z__[idxq[i__]]; vfw[i__] = vf[idxq[i__]]; vlw[i__] = vl[idxq[i__]]; -/* L40: */ } - dlamrg_(nl, nr, &dsigma[2], &c__1, &c__1, &idx[2]); - i__1 = n; for (i__ = 2; i__ <= i__1; ++i__) { idxi = idx[i__] + 1; @@ -459,46 +105,17 @@ f"> */ z__[i__] = zw[idxi]; vf[i__] = vfw[idxi]; vl[i__] = vlw[idxi]; -/* L50: */ } - -/* Calculate the allowable deflation tolerance */ - eps = dlamch_((char *)"Epsilon", (ftnlen)7); -/* Computing MAX */ d__1 = abs(*alpha), d__2 = abs(*beta); - tol = max(d__1,d__2); -/* Computing MAX */ + tol = max(d__1, d__2); d__2 = (d__1 = d__[n], abs(d__1)); - tol = eps * 64. * max(d__2,tol); - -/* There are 2 kinds of deflation -- first a value in the z-vector */ -/* is small, second two (or more) singular values are very close */ -/* together (their difference is small). */ - -/* If the value in the z-vector is small, we simply permute the */ -/* array so that the corresponding singular value is moved to the */ -/* end. */ - -/* If two values in the D-vector are close, we perform a two-sided */ -/* rotation designed to make one of the corresponding z-vector */ -/* entries zero, and then permute the array so that the deflated */ -/* singular value is moved to the end. */ - -/* If there are multiple singular values then the problem deflates. */ -/* Here the number of equal singular values are found. As each equal */ -/* singular value is found, an elementary reflector is computed to */ -/* rotate the corresponding singular subspace so that the */ -/* corresponding components of Z are zero in this new basis. */ - + tol = eps * 64. * max(d__2, tol); *k = 1; k2 = n + 1; i__1 = n; for (j = 2; j <= i__1; ++j) { if ((d__1 = z__[j], abs(d__1)) <= tol) { - -/* Deflate due to small z component. */ - --k2; idxp[k2] = j; if (j == n) { @@ -508,7 +125,6 @@ f"> */ jprev = j; goto L70; } -/* L60: */ } L70: j = jprev; @@ -518,33 +134,17 @@ L80: goto L90; } if ((d__1 = z__[j], abs(d__1)) <= tol) { - -/* Deflate due to small z component. */ - --k2; idxp[k2] = j; } else { - -/* Check if singular values are close enough to allow deflation. */ - if ((d__1 = d__[j] - d__[jprev], abs(d__1)) <= tol) { - -/* Deflation is possible. */ - *s = z__[jprev]; *c__ = z__[j]; - -/* Find sqrt(a**2+b**2) without overflow or */ -/* destructive underflow. */ - tau = dlapy2_(c__, s); z__[j] = tau; z__[jprev] = 0.; *c__ /= tau; *s = -(*s) / tau; - -/* Record the appropriate Givens rotation */ - if (*icompq == 1) { ++(*givptr); idxjp = idxq[idx[jprev] + 1]; @@ -575,27 +175,17 @@ L80: } goto L80; L90: - -/* Record the last singular value. */ - ++(*k); zw[*k] = z__[jprev]; dsigma[*k] = d__[jprev]; idxp[*k] = jprev; - L100: - -/* Sort the singular values into DSIGMA. The singular values which */ -/* were not deflated go into the first K slots of DSIGMA, except */ -/* that DSIGMA(1) is treated separately. */ - i__1 = n; for (j = 2; j <= i__1; ++j) { jp = idxp[j]; dsigma[j] = d__[jp]; vfw[j] = vf[jp]; vlw[j] = vl[jp]; -/* L110: */ } if (*icompq == 1) { i__1 = n; @@ -605,19 +195,10 @@ L100: if (perm[j] <= nlp1) { --perm[j]; } -/* L120: */ } } - -/* The deflated singular values go back into the last N - K slots of */ -/* D. */ - i__1 = n - *k; dcopy_(&i__1, &dsigma[*k + 1], &c__1, &d__[*k + 1], &c__1); - -/* Determine DSIGMA(1), DSIGMA(2), Z(1), VF(1), VL(1), VF(M), and */ -/* VL(M). */ - dsigma[1] = 0.; hlftol = tol / 2.; if (abs(dsigma[2]) <= hlftol) { @@ -642,22 +223,14 @@ L100: z__[1] = z1; } } - -/* Restore Z, VF, and VL. */ - i__1 = *k - 1; dcopy_(&i__1, &zw[2], &c__1, &z__[2], &c__1); i__1 = n - 1; dcopy_(&i__1, &vfw[2], &c__1, &vf[2], &c__1); i__1 = n - 1; dcopy_(&i__1, &vlw[2], &c__1, &vl[2], &c__1); - return 0; - -/* End of DLASD7 */ - -} /* dlasd7_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasd8.cpp b/lib/linalg/dlasd8.cpp index 5d0890e27b..ba92932435 100644 --- a/lib/linalg/dlasd8.cpp +++ b/lib/linalg/dlasd8.cpp @@ -1,254 +1,35 @@ -/* fortran/dlasd8.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c__0 = 0; static doublereal c_b8 = 1.; - -/* > \brief \b DLASD8 finds the square roots of the roots of the secular equation, and stores, for each elemen -t in D, the distance to its two nearest poles. Used by sbdsdc. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASD8 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASD8( ICOMPQ, K, D, Z, VF, VL, DIFL, DIFR, LDDIFR, */ -/* DSIGMA, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER ICOMPQ, INFO, K, LDDIFR */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( * ), DIFL( * ), DIFR( LDDIFR, * ), */ -/* $ DSIGMA( * ), VF( * ), VL( * ), WORK( * ), */ -/* $ Z( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASD8 finds the square roots of the roots of the secular equation, */ -/* > as defined by the values in DSIGMA and Z. It makes the appropriate */ -/* > calls to DLASD4, and stores, for each element in D, the distance */ -/* > to its two nearest poles (elements in DSIGMA). It also updates */ -/* > the arrays VF and VL, the first and last components of all the */ -/* > right singular vectors of the original bidiagonal matrix. */ -/* > */ -/* > DLASD8 is called from DLASD6. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ICOMPQ */ -/* > \verbatim */ -/* > ICOMPQ is INTEGER */ -/* > Specifies whether singular vectors are to be computed in */ -/* > factored form in the calling routine: */ -/* > = 0: Compute singular values only. */ -/* > = 1: Compute singular vectors in factored form as well. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of terms in the rational function to be solved */ -/* > by DLASD4. K >= 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension ( K ) */ -/* > On output, D contains the updated singular values. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension ( K ) */ -/* > On entry, the first K elements of this array contain the */ -/* > components of the deflation-adjusted updating row vector. */ -/* > On exit, Z is updated. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] VF */ -/* > \verbatim */ -/* > VF is DOUBLE PRECISION array, dimension ( K ) */ -/* > On entry, VF contains information passed through DBEDE8. */ -/* > On exit, VF contains the first K components of the first */ -/* > components of all right singular vectors of the bidiagonal */ -/* > matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] VL */ -/* > \verbatim */ -/* > VL is DOUBLE PRECISION array, dimension ( K ) */ -/* > On entry, VL contains information passed through DBEDE8. */ -/* > On exit, VL contains the first K components of the last */ -/* > components of all right singular vectors of the bidiagonal */ -/* > matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DIFL */ -/* > \verbatim */ -/* > DIFL is DOUBLE PRECISION array, dimension ( K ) */ -/* > On exit, DIFL(I) = D(I) - DSIGMA(I). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DIFR */ -/* > \verbatim */ -/* > DIFR is DOUBLE PRECISION array, */ -/* > dimension ( LDDIFR, 2 ) if ICOMPQ = 1 and */ -/* > dimension ( K ) if ICOMPQ = 0. */ -/* > On exit, DIFR(I,1) = D(I) - DSIGMA(I+1), DIFR(K,1) is not */ -/* > defined and will not be referenced. */ -/* > */ -/* > If ICOMPQ = 1, DIFR(1:K,2) is an array containing the */ -/* > normalizing factors for the right singular vector matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDDIFR */ -/* > \verbatim */ -/* > LDDIFR is INTEGER */ -/* > The leading dimension of DIFR, must be at least K. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DSIGMA */ -/* > \verbatim */ -/* > DSIGMA is DOUBLE PRECISION array, dimension ( K ) */ -/* > On entry, the first K elements of this array contain the old */ -/* > roots of the deflated updating problem. These are the poles */ -/* > of the secular equation. */ -/* > On exit, the elements of DSIGMA may be very slightly altered */ -/* > in value. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (3*K) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: if INFO = 1, a singular value did not converge */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ming Gu and Huan Ren, Computer Science Division, University of */ -/* > California at Berkeley, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlasd8_(integer *icompq, integer *k, doublereal *d__, - doublereal *z__, doublereal *vf, doublereal *vl, doublereal *difl, - doublereal *difr, integer *lddifr, doublereal *dsigma, doublereal * - work, integer *info) +int dlasd8_(integer *icompq, integer *k, doublereal *d__, doublereal *z__, doublereal *vf, + doublereal *vl, doublereal *difl, doublereal *difr, integer *lddifr, doublereal *dsigma, + doublereal *work, integer *info) { - /* System generated locals */ integer difr_dim1, difr_offset, i__1, i__2; doublereal d__1, d__2; - - /* Builtin functions */ double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); - - /* Local variables */ integer i__, j; doublereal dj, rho; integer iwk1, iwk2, iwk3; - extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, - integer *); + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal temp; extern doublereal dnrm2_(integer *, doublereal *, integer *); integer iwk2i, iwk3i; doublereal diflj, difrj, dsigj; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); extern doublereal dlamc3_(doublereal *, doublereal *); - extern /* Subroutine */ int dlasd4_(integer *, integer *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *), dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dlaset_(char *, integer *, integer - *, doublereal *, doublereal *, doublereal *, integer *, ftnlen), - xerbla_(char *, integer *, ftnlen); + extern int dlasd4_(integer *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *), + dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublereal *, integer *, integer *, ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen); doublereal dsigjp; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; --z__; --vf; @@ -259,10 +40,7 @@ f"> */ difr -= difr_offset; --dsigma; --work; - - /* Function Body */ *info = 0; - if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*k < 1) { @@ -275,9 +53,6 @@ f"> */ xerbla_((char *)"DLASD8", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*k == 1) { d__[1] = abs(z__[1]); difl[1] = d__[1]; @@ -287,59 +62,22 @@ f"> */ } return 0; } - -/* Modify values DSIGMA(i) to make sure all DSIGMA(i)-DSIGMA(j) can */ -/* be computed with high relative accuracy (barring over/underflow). */ -/* This is a problem on machines without a guard digit in */ -/* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). */ -/* The following code replaces DSIGMA(I) by 2*DSIGMA(I)-DSIGMA(I), */ -/* which on any of these machines zeros out the bottommost */ -/* bit of DSIGMA(I) if it is 1; this makes the subsequent */ -/* subtractions DSIGMA(I)-DSIGMA(J) unproblematic when cancellation */ -/* occurs. On binary machines with a guard digit (almost all */ -/* machines) it does not change DSIGMA(I) at all. On hexadecimal */ -/* and decimal machines with a guard digit, it slightly */ -/* changes the bottommost bits of DSIGMA(I). It does not account */ -/* for hexadecimal or decimal machines without guard digits */ -/* (we know of none). We use a subroutine call to compute */ -/* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating */ -/* this code. */ - i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { dsigma[i__] = dlamc3_(&dsigma[i__], &dsigma[i__]) - dsigma[i__]; -/* L10: */ } - -/* Book keeping. */ - iwk1 = 1; iwk2 = iwk1 + *k; iwk3 = iwk2 + *k; iwk2i = iwk2 - 1; iwk3i = iwk3 - 1; - -/* Normalize Z. */ - rho = dnrm2_(k, &z__[1], &c__1); - dlascl_((char *)"G", &c__0, &c__0, &rho, &c_b8, k, &c__1, &z__[1], k, info, ( - ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &rho, &c_b8, k, &c__1, &z__[1], k, info, (ftnlen)1); rho *= rho; - -/* Initialize WORK(IWK3). */ - dlaset_((char *)"A", k, &c__1, &c_b8, &c_b8, &work[iwk3], k, (ftnlen)1); - -/* Compute the updated singular values, the arrays DIFL, DIFR, */ -/* and the updated Z. */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - dlasd4_(k, &j, &dsigma[1], &z__[1], &work[iwk1], &rho, &d__[j], &work[ - iwk2], info); - -/* If the root finder fails, report the convergence failure. */ - + dlasd4_(k, &j, &dsigma[1], &z__[1], &work[iwk1], &rho, &d__[j], &work[iwk2], info); if (*info != 0) { return 0; } @@ -348,32 +86,20 @@ f"> */ difr[j + difr_dim1] = -work[j + 1]; i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { - work[iwk3i + i__] = work[iwk3i + i__] * work[i__] * work[iwk2i + - i__] / (dsigma[i__] - dsigma[j]) / (dsigma[i__] + dsigma[ - j]); -/* L20: */ + work[iwk3i + i__] = work[iwk3i + i__] * work[i__] * work[iwk2i + i__] / + (dsigma[i__] - dsigma[j]) / (dsigma[i__] + dsigma[j]); } i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { - work[iwk3i + i__] = work[iwk3i + i__] * work[i__] * work[iwk2i + - i__] / (dsigma[i__] - dsigma[j]) / (dsigma[i__] + dsigma[ - j]); -/* L30: */ + work[iwk3i + i__] = work[iwk3i + i__] * work[i__] * work[iwk2i + i__] / + (dsigma[i__] - dsigma[j]) / (dsigma[i__] + dsigma[j]); } -/* L40: */ } - -/* Compute updated Z. */ - i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { d__2 = sqrt((d__1 = work[iwk3i + i__], abs(d__1))); z__[i__] = d_lmp_sign(&d__2, &z__[i__]); -/* L50: */ } - -/* Update VF and VL. */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { diflj = difl[j]; @@ -386,15 +112,11 @@ f"> */ work[j] = -z__[j] / diflj / (dsigma[j] + dj); i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { - work[i__] = z__[i__] / (dlamc3_(&dsigma[i__], &dsigj) - diflj) / ( - dsigma[i__] + dj); -/* L60: */ + work[i__] = z__[i__] / (dlamc3_(&dsigma[i__], &dsigj) - diflj) / (dsigma[i__] + dj); } i__2 = *k; for (i__ = j + 1; i__ <= i__2; ++i__) { - work[i__] = z__[i__] / (dlamc3_(&dsigma[i__], &dsigjp) + difrj) / - (dsigma[i__] + dj); -/* L70: */ + work[i__] = z__[i__] / (dlamc3_(&dsigma[i__], &dsigjp) + difrj) / (dsigma[i__] + dj); } temp = dnrm2_(k, &work[1], &c__1); work[iwk2i + j] = ddot_(k, &work[1], &c__1, &vf[1], &c__1) / temp; @@ -402,18 +124,11 @@ f"> */ if (*icompq == 1) { difr[j + (difr_dim1 << 1)] = temp; } -/* L80: */ } - dcopy_(k, &work[iwk2], &c__1, &vf[1], &c__1); dcopy_(k, &work[iwk3], &c__1, &vl[1], &c__1); - return 0; - -/* End of DLASD8 */ - -} /* dlasd8_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasda.cpp b/lib/linalg/dlasda.cpp index b50a48f625..47f76ed32d 100644 --- a/lib/linalg/dlasda.cpp +++ b/lib/linalg/dlasda.cpp @@ -1,367 +1,44 @@ -/* fortran/dlasda.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__0 = 0; static doublereal c_b11 = 0.; static doublereal c_b12 = 1.; static integer c__1 = 1; static integer c__2 = 2; - -/* > \brief \b DLASDA computes the singular value decomposition (SVD) of a real upper bidiagonal matrix with d -iagonal d and off-diagonal e. Used by sbdsdc. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASDA + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASDA( ICOMPQ, SMLSIZ, N, SQRE, D, E, U, LDU, VT, K, */ -/* DIFL, DIFR, Z, POLES, GIVPTR, GIVCOL, LDGCOL, */ -/* PERM, GIVNUM, C, S, WORK, IWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER ICOMPQ, INFO, LDGCOL, LDU, N, SMLSIZ, SQRE */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ), */ -/* $ K( * ), PERM( LDGCOL, * ) */ -/* DOUBLE PRECISION C( * ), D( * ), DIFL( LDU, * ), DIFR( LDU, * ), */ -/* $ E( * ), GIVNUM( LDU, * ), POLES( LDU, * ), */ -/* $ S( * ), U( LDU, * ), VT( LDU, * ), WORK( * ), */ -/* $ Z( LDU, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Using a divide and conquer approach, DLASDA computes the singular */ -/* > value decomposition (SVD) of a real upper bidiagonal N-by-M matrix */ -/* > B with diagonal D and offdiagonal E, where M = N + SQRE. The */ -/* > algorithm computes the singular values in the SVD B = U * S * VT. */ -/* > The orthogonal matrices U and VT are optionally computed in */ -/* > compact form. */ -/* > */ -/* > A related subroutine, DLASD0, computes the singular values and */ -/* > the singular vectors in explicit form. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ICOMPQ */ -/* > \verbatim */ -/* > ICOMPQ is INTEGER */ -/* > Specifies whether singular vectors are to be computed */ -/* > in compact form, as follows */ -/* > = 0: Compute singular values only. */ -/* > = 1: Compute singular vectors of upper bidiagonal */ -/* > matrix in compact form. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] SMLSIZ */ -/* > \verbatim */ -/* > SMLSIZ is INTEGER */ -/* > The maximum size of the subproblems at the bottom of the */ -/* > computation tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The row dimension of the upper bidiagonal matrix. This is */ -/* > also the dimension of the main diagonal array D. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] SQRE */ -/* > \verbatim */ -/* > SQRE is INTEGER */ -/* > Specifies the column dimension of the bidiagonal matrix. */ -/* > = 0: The bidiagonal matrix has column dimension M = N; */ -/* > = 1: The bidiagonal matrix has column dimension M = N + 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension ( N ) */ -/* > On entry D contains the main diagonal of the bidiagonal */ -/* > matrix. On exit D, if INFO = 0, contains its singular values. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension ( M-1 ) */ -/* > Contains the subdiagonal entries of the bidiagonal matrix. */ -/* > On exit, E has been destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] U */ -/* > \verbatim */ -/* > U is DOUBLE PRECISION array, */ -/* > dimension ( LDU, SMLSIZ ) if ICOMPQ = 1, and not referenced */ -/* > if ICOMPQ = 0. If ICOMPQ = 1, on exit, U contains the left */ -/* > singular vector matrices of all subproblems at the bottom */ -/* > level. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDU */ -/* > \verbatim */ -/* > LDU is INTEGER, LDU = > N. */ -/* > The leading dimension of arrays U, VT, DIFL, DIFR, POLES, */ -/* > GIVNUM, and Z. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] VT */ -/* > \verbatim */ -/* > VT is DOUBLE PRECISION array, */ -/* > dimension ( LDU, SMLSIZ+1 ) if ICOMPQ = 1, and not referenced */ -/* > if ICOMPQ = 0. If ICOMPQ = 1, on exit, VT**T contains the right */ -/* > singular vector matrices of all subproblems at the bottom */ -/* > level. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] K */ -/* > \verbatim */ -/* > K is INTEGER array, */ -/* > dimension ( N ) if ICOMPQ = 1 and dimension 1 if ICOMPQ = 0. */ -/* > If ICOMPQ = 1, on exit, K(I) is the dimension of the I-th */ -/* > secular equation on the computation tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DIFL */ -/* > \verbatim */ -/* > DIFL is DOUBLE PRECISION array, dimension ( LDU, NLVL ), */ -/* > where NLVL = floor(log_2 (N/SMLSIZ))). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DIFR */ -/* > \verbatim */ -/* > DIFR is DOUBLE PRECISION array, */ -/* > dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1 and */ -/* > dimension ( N ) if ICOMPQ = 0. */ -/* > If ICOMPQ = 1, on exit, DIFL(1:N, I) and DIFR(1:N, 2 * I - 1) */ -/* > record distances between singular values on the I-th */ -/* > level and singular values on the (I -1)-th level, and */ -/* > DIFR(1:N, 2 * I ) contains the normalizing factors for */ -/* > the right singular vector matrix. See DLASD8 for details. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, */ -/* > dimension ( LDU, NLVL ) if ICOMPQ = 1 and */ -/* > dimension ( N ) if ICOMPQ = 0. */ -/* > The first K elements of Z(1, I) contain the components of */ -/* > the deflation-adjusted updating row vector for subproblems */ -/* > on the I-th level. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] POLES */ -/* > \verbatim */ -/* > POLES is DOUBLE PRECISION array, */ -/* > dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1, and not referenced */ -/* > if ICOMPQ = 0. If ICOMPQ = 1, on exit, POLES(1, 2*I - 1) and */ -/* > POLES(1, 2*I) contain the new and old singular values */ -/* > involved in the secular equations on the I-th level. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVPTR */ -/* > \verbatim */ -/* > GIVPTR is INTEGER array, */ -/* > dimension ( N ) if ICOMPQ = 1, and not referenced if */ -/* > ICOMPQ = 0. If ICOMPQ = 1, on exit, GIVPTR( I ) records */ -/* > the number of Givens rotations performed on the I-th */ -/* > problem on the computation tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVCOL */ -/* > \verbatim */ -/* > GIVCOL is INTEGER array, */ -/* > dimension ( LDGCOL, 2 * NLVL ) if ICOMPQ = 1, and not */ -/* > referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I, */ -/* > GIVCOL(1, 2 *I - 1) and GIVCOL(1, 2 *I) record the locations */ -/* > of Givens rotations performed on the I-th level on the */ -/* > computation tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDGCOL */ -/* > \verbatim */ -/* > LDGCOL is INTEGER, LDGCOL = > N. */ -/* > The leading dimension of arrays GIVCOL and PERM. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] PERM */ -/* > \verbatim */ -/* > PERM is INTEGER array, */ -/* > dimension ( LDGCOL, NLVL ) if ICOMPQ = 1, and not referenced */ -/* > if ICOMPQ = 0. If ICOMPQ = 1, on exit, PERM(1, I) records */ -/* > permutations done on the I-th level of the computation tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVNUM */ -/* > \verbatim */ -/* > GIVNUM is DOUBLE PRECISION array, */ -/* > dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1, and not */ -/* > referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I, */ -/* > GIVNUM(1, 2 *I - 1) and GIVNUM(1, 2 *I) record the C- and S- */ -/* > values of Givens rotations performed on the I-th level on */ -/* > the computation tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, */ -/* > dimension ( N ) if ICOMPQ = 1, and dimension 1 if ICOMPQ = 0. */ -/* > If ICOMPQ = 1 and the I-th subproblem is not square, on exit, */ -/* > C( I ) contains the C-value of a Givens rotation related to */ -/* > the right null space of the I-th subproblem. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION array, dimension ( N ) if */ -/* > ICOMPQ = 1, and dimension 1 if ICOMPQ = 0. If ICOMPQ = 1 */ -/* > and the I-th subproblem is not square, on exit, S( I ) */ -/* > contains the S-value of a Givens rotation related to */ -/* > the right null space of the I-th subproblem. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension */ -/* > (6 * N + (SMLSIZ + 1)*(SMLSIZ + 1)). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension (7*N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: if INFO = 1, a singular value did not converge */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ming Gu and Huan Ren, Computer Science Division, University of */ -/* > California at Berkeley, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlasda_(integer *icompq, integer *smlsiz, integer *n, - integer *sqre, doublereal *d__, doublereal *e, doublereal *u, integer - *ldu, doublereal *vt, integer *k, doublereal *difl, doublereal *difr, - doublereal *z__, doublereal *poles, integer *givptr, integer *givcol, - integer *ldgcol, integer *perm, doublereal *givnum, doublereal *c__, - doublereal *s, doublereal *work, integer *iwork, integer *info) +int dlasda_(integer *icompq, integer *smlsiz, integer *n, integer *sqre, doublereal *d__, + doublereal *e, doublereal *u, integer *ldu, doublereal *vt, integer *k, + doublereal *difl, doublereal *difr, doublereal *z__, doublereal *poles, integer *givptr, + integer *givcol, integer *ldgcol, integer *perm, doublereal *givnum, doublereal *c__, + doublereal *s, doublereal *work, integer *iwork, integer *info) { - /* System generated locals */ - integer givcol_dim1, givcol_offset, perm_dim1, perm_offset, difl_dim1, - difl_offset, difr_dim1, difr_offset, givnum_dim1, givnum_offset, - poles_dim1, poles_offset, u_dim1, u_offset, vt_dim1, vt_offset, - z_dim1, z_offset, i__1, i__2; - - /* Builtin functions */ + integer givcol_dim1, givcol_offset, perm_dim1, perm_offset, difl_dim1, difl_offset, difr_dim1, + difr_offset, givnum_dim1, givnum_offset, poles_dim1, poles_offset, u_dim1, u_offset, + vt_dim1, vt_offset, z_dim1, z_offset, i__1, i__2; integer pow_lmp_ii(integer *, integer *); - - /* Local variables */ - integer i__, j, m, i1, ic, lf, nd, ll, nl, vf, nr, vl, im1, ncc, nlf, nrf, - vfi, iwk, vli, lvl, nru, ndb1, nlp1, lvl2, nrp1; + integer i__, j, m, i1, ic, lf, nd, ll, nl, vf, nr, vl, im1, ncc, nlf, nrf, vfi, iwk, vli, lvl, + nru, ndb1, nlp1, lvl2, nrp1; doublereal beta; integer idxq, nlvl; doublereal alpha; integer inode, ndiml, ndimr, idxqi, itemp; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer sqrei; - extern /* Subroutine */ int dlasd6_(integer *, integer *, integer *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, integer *, integer *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - doublereal *, doublereal *, integer *, doublereal *, doublereal *, - doublereal *, integer *, integer *); + extern int dlasd6_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, integer *, integer *, integer *, + integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, integer *, integer *); integer nwork1, nwork2; - extern /* Subroutine */ int dlasdq_(char *, integer *, integer *, integer - *, integer *, integer *, doublereal *, doublereal *, doublereal *, - integer *, doublereal *, integer *, doublereal *, integer *, - doublereal *, integer *, ftnlen), dlasdt_(integer *, integer *, - integer *, integer *, integer *, integer *, integer *), dlaset_( - char *, integer *, integer *, doublereal *, doublereal *, - doublereal *, integer *, ftnlen), xerbla_(char *, integer *, - ftnlen); + extern int dlasdq_(char *, integer *, integer *, integer *, integer *, integer *, doublereal *, + doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen), + dlasdt_(integer *, integer *, integer *, integer *, integer *, integer *, integer *), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen); integer smlszp; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; --e; givnum_dim1 = *ldu; @@ -397,10 +74,7 @@ f"> */ --s; --work; --iwork; - - /* Function Body */ *info = 0; - if (*icompq < 0 || *icompq > 1) { *info = -1; } else if (*smlsiz < 3) { @@ -419,57 +93,33 @@ f"> */ xerbla_((char *)"DLASDA", &i__1, (ftnlen)6); return 0; } - m = *n + *sqre; - -/* If the input matrix is too small, call DLASDQ to find the SVD. */ - if (*n <= *smlsiz) { if (*icompq == 0) { - dlasdq_((char *)"U", sqre, n, &c__0, &c__0, &c__0, &d__[1], &e[1], &vt[ - vt_offset], ldu, &u[u_offset], ldu, &u[u_offset], ldu, & - work[1], info, (ftnlen)1); + dlasdq_((char *)"U", sqre, n, &c__0, &c__0, &c__0, &d__[1], &e[1], &vt[vt_offset], ldu, + &u[u_offset], ldu, &u[u_offset], ldu, &work[1], info, (ftnlen)1); } else { - dlasdq_((char *)"U", sqre, n, &m, n, &c__0, &d__[1], &e[1], &vt[vt_offset] - , ldu, &u[u_offset], ldu, &u[u_offset], ldu, &work[1], - info, (ftnlen)1); + dlasdq_((char *)"U", sqre, n, &m, n, &c__0, &d__[1], &e[1], &vt[vt_offset], ldu, &u[u_offset], + ldu, &u[u_offset], ldu, &work[1], info, (ftnlen)1); } return 0; } - -/* Book-keeping and set up the computation tree. */ - inode = 1; ndiml = inode + *n; ndimr = ndiml + *n; idxq = ndimr + *n; iwk = idxq + *n; - ncc = 0; nru = 0; - smlszp = *smlsiz + 1; vf = 1; vl = vf + m; nwork1 = vl + m; nwork2 = nwork1 + smlszp * smlszp; - - dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], - smlsiz); - -/* for the nodes on bottom level of the tree, solve */ -/* their subproblems by DLASDQ. */ - + dlasdt_(n, &nlvl, &nd, &iwork[inode], &iwork[ndiml], &iwork[ndimr], smlsiz); ndb1 = (nd + 1) / 2; i__1 = nd; for (i__ = ndb1; i__ <= i__1; ++i__) { - -/* IC : center row of each node */ -/* NL : number of rows of left subproblem */ -/* NR : number of rows of right subproblem */ -/* NLF: starting row of the left subproblem */ -/* NRF: starting row of the right subproblem */ - i1 = i__ - 1; ic = iwork[inode + i1]; nl = iwork[ndiml + i1]; @@ -482,25 +132,19 @@ f"> */ vli = vl + nlf - 1; sqrei = 1; if (*icompq == 0) { - dlaset_((char *)"A", &nlp1, &nlp1, &c_b11, &c_b12, &work[nwork1], &smlszp, - (ftnlen)1); - dlasdq_((char *)"U", &sqrei, &nl, &nlp1, &nru, &ncc, &d__[nlf], &e[nlf], & - work[nwork1], &smlszp, &work[nwork2], &nl, &work[nwork2], - &nl, &work[nwork2], info, (ftnlen)1); + dlaset_((char *)"A", &nlp1, &nlp1, &c_b11, &c_b12, &work[nwork1], &smlszp, (ftnlen)1); + dlasdq_((char *)"U", &sqrei, &nl, &nlp1, &nru, &ncc, &d__[nlf], &e[nlf], &work[nwork1], &smlszp, + &work[nwork2], &nl, &work[nwork2], &nl, &work[nwork2], info, (ftnlen)1); itemp = nwork1 + nl * smlszp; dcopy_(&nlp1, &work[nwork1], &c__1, &work[vfi], &c__1); dcopy_(&nlp1, &work[itemp], &c__1, &work[vli], &c__1); } else { - dlaset_((char *)"A", &nl, &nl, &c_b11, &c_b12, &u[nlf + u_dim1], ldu, ( - ftnlen)1); - dlaset_((char *)"A", &nlp1, &nlp1, &c_b11, &c_b12, &vt[nlf + vt_dim1], - ldu, (ftnlen)1); - dlasdq_((char *)"U", &sqrei, &nl, &nlp1, &nl, &ncc, &d__[nlf], &e[nlf], & - vt[nlf + vt_dim1], ldu, &u[nlf + u_dim1], ldu, &u[nlf + - u_dim1], ldu, &work[nwork1], info, (ftnlen)1); + dlaset_((char *)"A", &nl, &nl, &c_b11, &c_b12, &u[nlf + u_dim1], ldu, (ftnlen)1); + dlaset_((char *)"A", &nlp1, &nlp1, &c_b11, &c_b12, &vt[nlf + vt_dim1], ldu, (ftnlen)1); + dlasdq_((char *)"U", &sqrei, &nl, &nlp1, &nl, &ncc, &d__[nlf], &e[nlf], &vt[nlf + vt_dim1], ldu, + &u[nlf + u_dim1], ldu, &u[nlf + u_dim1], ldu, &work[nwork1], info, (ftnlen)1); dcopy_(&nlp1, &vt[nlf + vt_dim1], &c__1, &work[vfi], &c__1); - dcopy_(&nlp1, &vt[nlf + nlp1 * vt_dim1], &c__1, &work[vli], &c__1) - ; + dcopy_(&nlp1, &vt[nlf + nlp1 * vt_dim1], &c__1, &work[vli], &c__1); } if (*info != 0) { return 0; @@ -508,7 +152,6 @@ f"> */ i__2 = nl; for (j = 1; j <= i__2; ++j) { iwork[idxqi + j] = j; -/* L10: */ } if (i__ == nd && *sqre == 0) { sqrei = 0; @@ -520,25 +163,19 @@ f"> */ vli += nlp1; nrp1 = nr + sqrei; if (*icompq == 0) { - dlaset_((char *)"A", &nrp1, &nrp1, &c_b11, &c_b12, &work[nwork1], &smlszp, - (ftnlen)1); - dlasdq_((char *)"U", &sqrei, &nr, &nrp1, &nru, &ncc, &d__[nrf], &e[nrf], & - work[nwork1], &smlszp, &work[nwork2], &nr, &work[nwork2], - &nr, &work[nwork2], info, (ftnlen)1); + dlaset_((char *)"A", &nrp1, &nrp1, &c_b11, &c_b12, &work[nwork1], &smlszp, (ftnlen)1); + dlasdq_((char *)"U", &sqrei, &nr, &nrp1, &nru, &ncc, &d__[nrf], &e[nrf], &work[nwork1], &smlszp, + &work[nwork2], &nr, &work[nwork2], &nr, &work[nwork2], info, (ftnlen)1); itemp = nwork1 + (nrp1 - 1) * smlszp; dcopy_(&nrp1, &work[nwork1], &c__1, &work[vfi], &c__1); dcopy_(&nrp1, &work[itemp], &c__1, &work[vli], &c__1); } else { - dlaset_((char *)"A", &nr, &nr, &c_b11, &c_b12, &u[nrf + u_dim1], ldu, ( - ftnlen)1); - dlaset_((char *)"A", &nrp1, &nrp1, &c_b11, &c_b12, &vt[nrf + vt_dim1], - ldu, (ftnlen)1); - dlasdq_((char *)"U", &sqrei, &nr, &nrp1, &nr, &ncc, &d__[nrf], &e[nrf], & - vt[nrf + vt_dim1], ldu, &u[nrf + u_dim1], ldu, &u[nrf + - u_dim1], ldu, &work[nwork1], info, (ftnlen)1); + dlaset_((char *)"A", &nr, &nr, &c_b11, &c_b12, &u[nrf + u_dim1], ldu, (ftnlen)1); + dlaset_((char *)"A", &nrp1, &nrp1, &c_b11, &c_b12, &vt[nrf + vt_dim1], ldu, (ftnlen)1); + dlasdq_((char *)"U", &sqrei, &nr, &nrp1, &nr, &ncc, &d__[nrf], &e[nrf], &vt[nrf + vt_dim1], ldu, + &u[nrf + u_dim1], ldu, &u[nrf + u_dim1], ldu, &work[nwork1], info, (ftnlen)1); dcopy_(&nrp1, &vt[nrf + vt_dim1], &c__1, &work[vfi], &c__1); - dcopy_(&nrp1, &vt[nrf + nrp1 * vt_dim1], &c__1, &work[vli], &c__1) - ; + dcopy_(&nrp1, &vt[nrf + nrp1 * vt_dim1], &c__1, &work[vli], &c__1); } if (*info != 0) { return 0; @@ -546,20 +183,11 @@ f"> */ i__2 = nr; for (j = 1; j <= i__2; ++j) { iwork[idxqi + j] = j; -/* L20: */ } -/* L30: */ } - -/* Now conquer each subproblem bottom-up. */ - j = pow_lmp_ii(&c__2, &nlvl); for (lvl = nlvl; lvl >= 1; --lvl) { lvl2 = (lvl << 1) - 1; - -/* Find the first node LF and last node LL on */ -/* the current level LVL. */ - if (lvl == 1) { lf = 1; ll = 1; @@ -587,38 +215,28 @@ f"> */ alpha = d__[ic]; beta = e[ic]; if (*icompq == 0) { - dlasd6_(icompq, &nl, &nr, &sqrei, &d__[nlf], &work[vfi], & - work[vli], &alpha, &beta, &iwork[idxqi], &perm[ - perm_offset], &givptr[1], &givcol[givcol_offset], - ldgcol, &givnum[givnum_offset], ldu, &poles[ - poles_offset], &difl[difl_offset], &difr[difr_offset], - &z__[z_offset], &k[1], &c__[1], &s[1], &work[nwork1], - &iwork[iwk], info); + dlasd6_(icompq, &nl, &nr, &sqrei, &d__[nlf], &work[vfi], &work[vli], &alpha, &beta, + &iwork[idxqi], &perm[perm_offset], &givptr[1], &givcol[givcol_offset], + ldgcol, &givnum[givnum_offset], ldu, &poles[poles_offset], + &difl[difl_offset], &difr[difr_offset], &z__[z_offset], &k[1], &c__[1], + &s[1], &work[nwork1], &iwork[iwk], info); } else { --j; - dlasd6_(icompq, &nl, &nr, &sqrei, &d__[nlf], &work[vfi], & - work[vli], &alpha, &beta, &iwork[idxqi], &perm[nlf + - lvl * perm_dim1], &givptr[j], &givcol[nlf + lvl2 * - givcol_dim1], ldgcol, &givnum[nlf + lvl2 * - givnum_dim1], ldu, &poles[nlf + lvl2 * poles_dim1], & - difl[nlf + lvl * difl_dim1], &difr[nlf + lvl2 * - difr_dim1], &z__[nlf + lvl * z_dim1], &k[j], &c__[j], - &s[j], &work[nwork1], &iwork[iwk], info); + dlasd6_(icompq, &nl, &nr, &sqrei, &d__[nlf], &work[vfi], &work[vli], &alpha, &beta, + &iwork[idxqi], &perm[nlf + lvl * perm_dim1], &givptr[j], + &givcol[nlf + lvl2 * givcol_dim1], ldgcol, + &givnum[nlf + lvl2 * givnum_dim1], ldu, &poles[nlf + lvl2 * poles_dim1], + &difl[nlf + lvl * difl_dim1], &difr[nlf + lvl2 * difr_dim1], + &z__[nlf + lvl * z_dim1], &k[j], &c__[j], &s[j], &work[nwork1], &iwork[iwk], + info); } if (*info != 0) { return 0; } -/* L40: */ } -/* L50: */ } - return 0; - -/* End of DLASDA */ - -} /* dlasda_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasdq.cpp b/lib/linalg/dlasdq.cpp index 418be52678..9b97d9258f 100644 --- a/lib/linalg/dlasdq.cpp +++ b/lib/linalg/dlasdq.cpp @@ -1,293 +1,30 @@ -/* fortran/dlasdq.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DLASDQ computes the SVD of a real bidiagonal matrix with diagonal d and off-diagonal e. Used by - sbdsdc. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASDQ + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASDQ( UPLO, SQRE, N, NCVT, NRU, NCC, D, E, VT, LDVT, */ -/* U, LDU, C, LDC, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU, SQRE */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION C( LDC, * ), D( * ), E( * ), U( LDU, * ), */ -/* $ VT( LDVT, * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASDQ computes the singular value decomposition (SVD) of a real */ -/* > (upper or lower) bidiagonal matrix with diagonal D and offdiagonal */ -/* > E, accumulating the transformations if desired. Letting B denote */ -/* > the input bidiagonal matrix, the algorithm computes orthogonal */ -/* > matrices Q and P such that B = Q * S * P**T (P**T denotes the transpose */ -/* > of P). The singular values S are overwritten on D. */ -/* > */ -/* > The input matrix U is changed to U * Q if desired. */ -/* > The input matrix VT is changed to P**T * VT if desired. */ -/* > The input matrix C is changed to Q**T * C if desired. */ -/* > */ -/* > See "Computing Small Singular Values of Bidiagonal Matrices With */ -/* > Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan, */ -/* > LAPACK Working Note #3, for a detailed description of the algorithm. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the input bidiagonal matrix */ -/* > is upper or lower bidiagonal, and whether it is square are */ -/* > not. */ -/* > UPLO = 'U' or 'u' B is upper bidiagonal. */ -/* > UPLO = 'L' or 'l' B is lower bidiagonal. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] SQRE */ -/* > \verbatim */ -/* > SQRE is INTEGER */ -/* > = 0: then the input matrix is N-by-N. */ -/* > = 1: then the input matrix is N-by-(N+1) if UPLU = 'U' and */ -/* > (N+1)-by-N if UPLU = 'L'. */ -/* > */ -/* > The bidiagonal matrix has */ -/* > N = NL + NR + 1 rows and */ -/* > M = N + SQRE >= N columns. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the number of rows and columns */ -/* > in the matrix. N must be at least 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NCVT */ -/* > \verbatim */ -/* > NCVT is INTEGER */ -/* > On entry, NCVT specifies the number of columns of */ -/* > the matrix VT. NCVT must be at least 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NRU */ -/* > \verbatim */ -/* > NRU is INTEGER */ -/* > On entry, NRU specifies the number of rows of */ -/* > the matrix U. NRU must be at least 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NCC */ -/* > \verbatim */ -/* > NCC is INTEGER */ -/* > On entry, NCC specifies the number of columns of */ -/* > the matrix C. NCC must be at least 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, D contains the diagonal entries of the */ -/* > bidiagonal matrix whose SVD is desired. On normal exit, */ -/* > D contains the singular values in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array. */ -/* > dimension is (N-1) if SQRE = 0 and N if SQRE = 1. */ -/* > On entry, the entries of E contain the offdiagonal entries */ -/* > of the bidiagonal matrix whose SVD is desired. On normal */ -/* > exit, E will contain 0. If the algorithm does not converge, */ -/* > D and E will contain the diagonal and superdiagonal entries */ -/* > of a bidiagonal matrix orthogonally equivalent to the one */ -/* > given as input. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] VT */ -/* > \verbatim */ -/* > VT is DOUBLE PRECISION array, dimension (LDVT, NCVT) */ -/* > On entry, contains a matrix which on exit has been */ -/* > premultiplied by P**T, dimension N-by-NCVT if SQRE = 0 */ -/* > and (N+1)-by-NCVT if SQRE = 1 (not referenced if NCVT=0). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDVT */ -/* > \verbatim */ -/* > LDVT is INTEGER */ -/* > On entry, LDVT specifies the leading dimension of VT as */ -/* > declared in the calling (sub) program. LDVT must be at */ -/* > least 1. If NCVT is nonzero LDVT must also be at least N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] U */ -/* > \verbatim */ -/* > U is DOUBLE PRECISION array, dimension (LDU, N) */ -/* > On entry, contains a matrix which on exit has been */ -/* > postmultiplied by Q, dimension NRU-by-N if SQRE = 0 */ -/* > and NRU-by-(N+1) if SQRE = 1 (not referenced if NRU=0). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDU */ -/* > \verbatim */ -/* > LDU is INTEGER */ -/* > On entry, LDU specifies the leading dimension of U as */ -/* > declared in the calling (sub) program. LDU must be at */ -/* > least max( 1, NRU ) . */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension (LDC, NCC) */ -/* > On entry, contains an N-by-NCC matrix which on exit */ -/* > has been premultiplied by Q**T dimension N-by-NCC if SQRE = 0 */ -/* > and (N+1)-by-NCC if SQRE = 1 (not referenced if NCC=0). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > On entry, LDC specifies the leading dimension of C as */ -/* > declared in the calling (sub) program. LDC must be at */ -/* > least 1. If NCC is nonzero, LDC must also be at least N. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (4*N) */ -/* > Workspace. Only referenced if one of NCVT, NRU, or NCC is */ -/* > nonzero, and if N is at least 2. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > On exit, a value of 0 indicates a successful exit. */ -/* > If INFO < 0, argument number -INFO is illegal. */ -/* > If INFO > 0, the algorithm did not converge, and INFO */ -/* > specifies how many superdiagonals did not converge. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ming Gu and Huan Ren, Computer Science Division, University of */ -/* > California at Berkeley, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlasdq_(char *uplo, integer *sqre, integer *n, integer * - ncvt, integer *nru, integer *ncc, doublereal *d__, doublereal *e, - doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, - doublereal *c__, integer *ldc, doublereal *work, integer *info, - ftnlen uplo_len) +int dlasdq_(char *uplo, integer *sqre, integer *n, integer *ncvt, integer *nru, integer *ncc, + doublereal *d__, doublereal *e, doublereal *vt, integer *ldvt, doublereal *u, + integer *ldu, doublereal *c__, integer *ldc, doublereal *work, integer *info, + ftnlen uplo_len) { - /* System generated locals */ - integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, - i__2; - - /* Local variables */ + integer c_dim1, c_offset, u_dim1, u_offset, vt_dim1, vt_offset, i__1, i__2; integer i__, j; doublereal r__, cs, sn; integer np1, isub; doublereal smin; integer sqre1; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dlasr_(char *, char *, char *, integer *, - integer *, doublereal *, doublereal *, doublereal *, integer *, - ftnlen, ftnlen, ftnlen), dswap_(integer *, doublereal *, integer * - , doublereal *, integer *); + extern int dlasr_(char *, char *, char *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen), + dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer iuplo; - extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *), xerbla_(char *, - integer *, ftnlen), dbdsqr_(char *, integer *, integer *, integer - *, integer *, doublereal *, doublereal *, doublereal *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, ftnlen); + extern int dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *), + xerbla_(char *, integer *, ftnlen), + dbdsqr_(char *, integer *, integer *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, + doublereal *, integer *, ftnlen); logical rotate; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; --e; vt_dim1 = *ldvt; @@ -300,8 +37,6 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; iuplo = 0; if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { @@ -322,11 +57,11 @@ f"> */ *info = -5; } else if (*ncc < 0) { *info = -6; - } else if (*ncvt == 0 && *ldvt < 1 || *ncvt > 0 && *ldvt < max(1,*n)) { + } else if (*ncvt == 0 && *ldvt < 1 || *ncvt > 0 && *ldvt < max(1, *n)) { *info = -10; - } else if (*ldu < max(1,*nru)) { + } else if (*ldu < max(1, *nru)) { *info = -12; - } else if (*ncc == 0 && *ldc < 1 || *ncc > 0 && *ldc < max(1,*n)) { + } else if (*ncc == 0 && *ldc < 1 || *ncc > 0 && *ldc < max(1, *n)) { *info = -14; } if (*info != 0) { @@ -337,16 +72,9 @@ f"> */ if (*n == 0) { return 0; } - -/* ROTATE is true if any singular vectors desired, false otherwise */ - rotate = *ncvt > 0 || *nru > 0 || *ncc > 0; np1 = *n + 1; sqre1 = *sqre; - -/* If matrix non-square upper bidiagonal, rotate to be lower */ -/* bidiagonal. The rotations are on the right. */ - if (iuplo == 1 && sqre1 == 1) { i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { @@ -358,7 +86,6 @@ f"> */ work[i__] = cs; work[*n + i__] = sn; } -/* L10: */ } dlartg_(&d__[*n], &e[*n], &cs, &sn, &r__); d__[*n] = r__; @@ -369,18 +96,11 @@ f"> */ } iuplo = 2; sqre1 = 0; - -/* Update singular vectors if desired. */ - if (*ncvt > 0) { - dlasr_((char *)"L", (char *)"V", (char *)"F", &np1, ncvt, &work[1], &work[np1], &vt[ - vt_offset], ldvt, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"L", (char *)"V", (char *)"F", &np1, ncvt, &work[1], &work[np1], &vt[vt_offset], ldvt, (ftnlen)1, + (ftnlen)1, (ftnlen)1); } } - -/* If matrix lower bidiagonal, rotate to be upper bidiagonal */ -/* by applying Givens rotations on the left. */ - if (iuplo == 2) { i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { @@ -392,12 +112,7 @@ f"> */ work[i__] = cs; work[*n + i__] = sn; } -/* L20: */ } - -/* If matrix (N+1)-by-N lower bidiagonal, one additional */ -/* rotation is needed. */ - if (sqre1 == 1) { dlartg_(&d__[*n], &e[*n], &cs, &sn, &r__); d__[*n] = r__; @@ -406,43 +121,29 @@ f"> */ work[*n + *n] = sn; } } - -/* Update singular vectors if desired. */ - if (*nru > 0) { if (sqre1 == 0) { - dlasr_((char *)"R", (char *)"V", (char *)"F", nru, n, &work[1], &work[np1], &u[ - u_offset], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, n, &work[1], &work[np1], &u[u_offset], ldu, (ftnlen)1, + (ftnlen)1, (ftnlen)1); } else { - dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &np1, &work[1], &work[np1], &u[ - u_offset], ldu, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"R", (char *)"V", (char *)"F", nru, &np1, &work[1], &work[np1], &u[u_offset], ldu, (ftnlen)1, + (ftnlen)1, (ftnlen)1); } } if (*ncc > 0) { if (sqre1 == 0) { - dlasr_((char *)"L", (char *)"V", (char *)"F", n, ncc, &work[1], &work[np1], &c__[ - c_offset], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"L", (char *)"V", (char *)"F", n, ncc, &work[1], &work[np1], &c__[c_offset], ldc, (ftnlen)1, + (ftnlen)1, (ftnlen)1); } else { - dlasr_((char *)"L", (char *)"V", (char *)"F", &np1, ncc, &work[1], &work[np1], &c__[ - c_offset], ldc, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"L", (char *)"V", (char *)"F", &np1, ncc, &work[1], &work[np1], &c__[c_offset], ldc, + (ftnlen)1, (ftnlen)1, (ftnlen)1); } } } - -/* Call DBDSQR to compute the SVD of the reduced real */ -/* N-by-N upper bidiagonal matrix. */ - - dbdsqr_((char *)"U", n, ncvt, nru, ncc, &d__[1], &e[1], &vt[vt_offset], ldvt, &u[ - u_offset], ldu, &c__[c_offset], ldc, &work[1], info, (ftnlen)1); - -/* Sort the singular values into ascending order (insertion sort on */ -/* singular values, but only one transposition per singular vector) */ - + dbdsqr_((char *)"U", n, ncvt, nru, ncc, &d__[1], &e[1], &vt[vt_offset], ldvt, &u[u_offset], ldu, + &c__[c_offset], ldc, &work[1], info, (ftnlen)1); i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Scan for smallest D(I). */ - isub = i__; smin = d__[i__]; i__2 = *n; @@ -451,36 +152,23 @@ f"> */ isub = j; smin = d__[j]; } -/* L30: */ } if (isub != i__) { - -/* Swap singular values and vectors. */ - d__[isub] = d__[i__]; d__[i__] = smin; if (*ncvt > 0) { - dswap_(ncvt, &vt[isub + vt_dim1], ldvt, &vt[i__ + vt_dim1], - ldvt); + dswap_(ncvt, &vt[isub + vt_dim1], ldvt, &vt[i__ + vt_dim1], ldvt); } if (*nru > 0) { - dswap_(nru, &u[isub * u_dim1 + 1], &c__1, &u[i__ * u_dim1 + 1] - , &c__1); + dswap_(nru, &u[isub * u_dim1 + 1], &c__1, &u[i__ * u_dim1 + 1], &c__1); } if (*ncc > 0) { - dswap_(ncc, &c__[isub + c_dim1], ldc, &c__[i__ + c_dim1], ldc) - ; + dswap_(ncc, &c__[isub + c_dim1], ldc, &c__[i__ + c_dim1], ldc); } } -/* L40: */ } - return 0; - -/* End of DLASDQ */ - -} /* dlasdq_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasdt.cpp b/lib/linalg/dlasdt.cpp index 77edcf93d4..ddc7df74ba 100644 --- a/lib/linalg/dlasdt.cpp +++ b/lib/linalg/dlasdt.cpp @@ -1,172 +1,21 @@ -/* fortran/dlasdt.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASDT creates a tree of subproblems for bidiagonal divide and conquer. Used by sbdsdc. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASDT + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASDT( N, LVL, ND, INODE, NDIML, NDIMR, MSUB ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER LVL, MSUB, N, ND */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER INODE( * ), NDIML( * ), NDIMR( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASDT creates a tree of subproblems for bidiagonal divide and */ -/* > conquer. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, the number of diagonal elements of the */ -/* > bidiagonal matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] LVL */ -/* > \verbatim */ -/* > LVL is INTEGER */ -/* > On exit, the number of levels on the computation tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] ND */ -/* > \verbatim */ -/* > ND is INTEGER */ -/* > On exit, the number of nodes on the tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INODE */ -/* > \verbatim */ -/* > INODE is INTEGER array, dimension ( N ) */ -/* > On exit, centers of subproblems. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] NDIML */ -/* > \verbatim */ -/* > NDIML is INTEGER array, dimension ( N ) */ -/* > On exit, row dimensions of left children. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] NDIMR */ -/* > \verbatim */ -/* > NDIMR is INTEGER array, dimension ( N ) */ -/* > On exit, row dimensions of right children. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] MSUB */ -/* > \verbatim */ -/* > MSUB is INTEGER */ -/* > On entry, the maximum row dimension each subproblem at the */ -/* > bottom of the tree can be of. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Ming Gu and Huan Ren, Computer Science Division, University of */ -/* > California at Berkeley, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlasdt_(integer *n, integer *lvl, integer *nd, integer * - inode, integer *ndiml, integer *ndimr, integer *msub) +int dlasdt_(integer *n, integer *lvl, integer *nd, integer *inode, integer *ndiml, integer *ndimr, + integer *msub) { - /* System generated locals */ integer i__1, i__2; - - /* Builtin functions */ double log(doublereal); - - /* Local variables */ integer i__, il, ir, maxn; doublereal temp; integer nlvl, llst, ncrnt; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Find the number of levels on the tree. */ - - /* Parameter adjustments */ --ndimr; --ndiml; --inode; - - /* Function Body */ - maxn = max(1,*n); - temp = log((doublereal) maxn / (doublereal) (*msub + 1)) / log(2.); - *lvl = (integer) temp + 1; - + maxn = max(1, *n); + temp = log((doublereal)maxn / (doublereal)(*msub + 1)) / log(2.); + *lvl = (integer)temp + 1; i__ = *n / 2; inode[1] = i__ + 1; ndiml[1] = i__; @@ -176,10 +25,6 @@ f"> */ llst = 1; i__1 = *lvl - 1; for (nlvl = 1; nlvl <= i__1; ++nlvl) { - -/* Constructing the tree at (NLVL+1)-st level. The number of */ -/* nodes created on this level is LLST * 2. */ - i__2 = llst - 1; for (i__ = 0; i__ <= i__2; ++i__) { il += 2; @@ -191,19 +36,12 @@ f"> */ ndiml[ir] = ndimr[ncrnt] / 2; ndimr[ir] = ndimr[ncrnt] - ndiml[ir] - 1; inode[ir] = inode[ncrnt] + ndiml[ir] + 1; -/* L10: */ } llst <<= 1; -/* L20: */ } *nd = (llst << 1) - 1; - return 0; - -/* End of DLASDT */ - -} /* dlasdt_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaset.cpp b/lib/linalg/dlaset.cpp index 4323f948e4..b3cea88292 100644 --- a/lib/linalg/dlaset.cpp +++ b/lib/linalg/dlaset.cpp @@ -1,229 +1,48 @@ -/* fortran/dlaset.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given val -ues. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASET + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASET( UPLO, M, N, ALPHA, BETA, A, LDA ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER LDA, M, N */ -/* DOUBLE PRECISION ALPHA, BETA */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASET initializes an m-by-n matrix A to BETA on the diagonal and */ -/* > ALPHA on the offdiagonals. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies the part of the matrix A to be set. */ -/* > = 'U': Upper triangular part is set; the strictly lower */ -/* > triangular part of A is not changed. */ -/* > = 'L': Lower triangular part is set; the strictly upper */ -/* > triangular part of A is not changed. */ -/* > Otherwise: All of the matrix A is set. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION */ -/* > The constant to which the offdiagonal elements are to be set. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is DOUBLE PRECISION */ -/* > The constant to which the diagonal elements are to be set. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On exit, the leading m-by-n submatrix of A is set as follows: */ -/* > */ -/* > if UPLO = 'U', A(i,j) = ALPHA, 1<=i<=j-1, 1<=j<=n, */ -/* > if UPLO = 'L', A(i,j) = ALPHA, j+1<=i<=m, 1<=j<=n, */ -/* > otherwise, A(i,j) = ALPHA, 1<=i<=m, 1<=j<=n, i.ne.j, */ -/* > */ -/* > and, for all UPLO, A(i,i) = BETA, 1<=i<=min(m,n). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int dlaset_(char *uplo, integer *m, integer *n, doublereal * - alpha, doublereal *beta, doublereal *a, integer *lda, ftnlen uplo_len) +int dlaset_(char *uplo, integer *m, integer *n, doublereal *alpha, doublereal *beta, doublereal *a, + integer *lda, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, j; extern logical lsame_(char *, char *, ftnlen, ftnlen); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - -/* Set the strictly upper triangular or trapezoidal part of the */ -/* array to ALPHA. */ - i__1 = *n; for (j = 2; j <= i__1; ++j) { -/* Computing MIN */ i__3 = j - 1; - i__2 = min(i__3,*m); + i__2 = min(i__3, *m); for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = *alpha; -/* L10: */ } -/* L20: */ } - } else if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Set the strictly lower triangular or trapezoidal part of the */ -/* array to ALPHA. */ - - i__1 = min(*m,*n); + i__1 = min(*m, *n); for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j + 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = *alpha; -/* L30: */ } -/* L40: */ } - } else { - -/* Set the leading m-by-n submatrix to ALPHA. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = *alpha; -/* L50: */ } -/* L60: */ } } - -/* Set the first min(M,N) diagonal elements to BETA. */ - - i__1 = min(*m,*n); + i__1 = min(*m, *n); for (i__ = 1; i__ <= i__1; ++i__) { a[i__ + i__ * a_dim1] = *beta; -/* L70: */ } - return 0; - -/* End of DLASET */ - -} /* dlaset_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasq1.cpp b/lib/linalg/dlasq1.cpp index 0c9e0ca9f2..1a719c6ee3 100644 --- a/lib/linalg/dlasq1.cpp +++ b/lib/linalg/dlasq1.cpp @@ -1,195 +1,33 @@ -/* fortran/dlasq1.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c__2 = 2; static integer c__0 = 0; - -/* > \brief \b DLASQ1 computes the singular values of a real square bidiagonal matrix. Used by sbdsqr. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASQ1 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASQ1( N, D, E, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( * ), E( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASQ1 computes the singular values of a real N-by-N bidiagonal */ -/* > matrix with diagonal D and off-diagonal E. The singular values */ -/* > are computed to high relative accuracy, in the absence of */ -/* > denormalization, underflow and overflow. The algorithm was first */ -/* > presented in */ -/* > */ -/* > (char *)"Accurate singular values and differential qd algorithms" by K. V. */ -/* > Fernando and B. N. Parlett, Numer. Math., Vol-67, No. 2, pp. 191-230, */ -/* > 1994, */ -/* > */ -/* > and the present implementation is described in "An implementation of */ -/* > the dqds Algorithm (Positive Case)", LAPACK Working Note. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of rows and columns in the matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, D contains the diagonal elements of the */ -/* > bidiagonal matrix whose SVD is desired. On normal exit, */ -/* > D contains the singular values in decreasing order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, elements E(1:N-1) contain the off-diagonal elements */ -/* > of the bidiagonal matrix whose SVD is desired. */ -/* > On exit, E is overwritten. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (4*N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: the algorithm failed */ -/* > = 1, a split was marked by a positive value in E */ -/* > = 2, current block of Z not diagonalized after 100*N */ -/* > iterations (in inner while loop) On exit D and E */ -/* > represent a matrix with the same singular values */ -/* > which the calling subroutine could use to finish the */ -/* > computation, or even feed back into DLASQ1 */ -/* > = 3, termination criterion of outer while loop not met */ -/* > (program created more than N unreduced blocks) */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dlasq1_(integer *n, doublereal *d__, doublereal *e, - doublereal *work, integer *info) +int dlasq1_(integer *n, doublereal *d__, doublereal *e, doublereal *work, integer *info) { - /* System generated locals */ integer i__1, i__2; doublereal d__1, d__2, d__3; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ integer i__; doublereal eps; - extern /* Subroutine */ int dlas2_(doublereal *, doublereal *, doublereal - *, doublereal *, doublereal *); + extern int dlas2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal scale; integer iinfo; doublereal sigmn; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal sigmx; - extern /* Subroutine */ int dlasq2_(integer *, doublereal *, integer *); + extern int dlasq2_(integer *, doublereal *, integer *); extern doublereal dlamch_(char *, ftnlen); - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern int dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, ftnlen); doublereal safmin; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dlasrt_( - char *, integer *, doublereal *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen), + dlasrt_(char *, integer *, doublereal *, integer *, ftnlen); --work; --e; --d__; - - /* Function Body */ *info = 0; if (*n < 0) { *info = -1; @@ -207,38 +45,23 @@ f"> */ d__[2] = sigmn; return 0; } - -/* Estimate the largest singular value. */ - sigmx = 0.; i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = (d__1 = d__[i__], abs(d__1)); -/* Computing MAX */ d__2 = sigmx, d__3 = (d__1 = e[i__], abs(d__1)); - sigmx = max(d__2,d__3); -/* L10: */ + sigmx = max(d__2, d__3); } d__[*n] = (d__1 = d__[*n], abs(d__1)); - -/* Early return if SIGMX is zero (matrix is already diagonal). */ - if (sigmx == 0.) { dlasrt_((char *)"D", n, &d__[1], &iinfo, (ftnlen)1); return 0; } - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { -/* Computing MAX */ d__1 = sigmx, d__2 = d__[i__]; - sigmx = max(d__1,d__2); -/* L20: */ + sigmx = max(d__1, d__2); } - -/* Copy D and E into WORK (in the Z format) and scale (squaring the */ -/* input data makes scaling by a power of the radix pointless). */ - eps = dlamch_((char *)"Precision", (ftnlen)9); safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); scale = sqrt(eps / safmin); @@ -247,52 +70,31 @@ f"> */ dcopy_(&i__1, &e[1], &c__1, &work[2], &c__2); i__1 = (*n << 1) - 1; i__2 = (*n << 1) - 1; - dlascl_((char *)"G", &c__0, &c__0, &sigmx, &scale, &i__1, &c__1, &work[1], &i__2, - &iinfo, (ftnlen)1); - -/* Compute the q's and e's. */ - + dlascl_((char *)"G", &c__0, &c__0, &sigmx, &scale, &i__1, &c__1, &work[1], &i__2, &iinfo, (ftnlen)1); i__1 = (*n << 1) - 1; for (i__ = 1; i__ <= i__1; ++i__) { -/* Computing 2nd power */ d__1 = work[i__]; work[i__] = d__1 * d__1; -/* L30: */ } work[*n * 2] = 0.; - dlasq2_(n, &work[1], info); - if (*info == 0) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = sqrt(work[i__]); -/* L40: */ } - dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &d__[1], n, & - iinfo, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &d__[1], n, &iinfo, (ftnlen)1); } else if (*info == 2) { - -/* Maximum number of iterations exceeded. Move data from WORK */ -/* into D and E so the calling subroutine can try to finish */ - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = sqrt(work[(i__ << 1) - 1]); e[i__] = sqrt(work[i__ * 2]); } - dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &d__[1], n, & - iinfo, (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &e[1], n, &iinfo, - (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &d__[1], n, &iinfo, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &scale, &sigmx, n, &c__1, &e[1], n, &iinfo, (ftnlen)1); } - return 0; - -/* End of DLASQ1 */ - -} /* dlasq1_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasq2.cpp b/lib/linalg/dlasq2.cpp index c9e4b30884..37bc963975 100644 --- a/lib/linalg/dlasq2.cpp +++ b/lib/linalg/dlasq2.cpp @@ -1,152 +1,17 @@ -/* fortran/dlasq2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c__2 = 2; static integer c__10 = 10; static integer c__3 = 3; static integer c__4 = 4; - -/* > \brief \b DLASQ2 computes all the eigenvalues of the symmetric positive definite tridiagonal matrix assoc -iated with the qd Array Z to high relative accuracy. Used by sbdsqr and sstegr. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASQ2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASQ2( N, Z, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION Z( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASQ2 computes all the eigenvalues of the symmetric positive */ -/* > definite tridiagonal matrix associated with the qd array Z to high */ -/* > relative accuracy are computed to high relative accuracy, in the */ -/* > absence of denormalization, underflow and overflow. */ -/* > */ -/* > To see the relation of Z to the tridiagonal matrix, let L be a */ -/* > unit lower bidiagonal matrix with subdiagonals Z(2,4,6,,..) and */ -/* > let U be an upper bidiagonal matrix with 1's above and diagonal */ -/* > Z(1,3,5,,..). The tridiagonal is L*U or, if you prefer, the */ -/* > symmetric tridiagonal to which it is similar. */ -/* > */ -/* > Note : DLASQ2 defines a logical variable, IEEE, which is true */ -/* > on machines which follow ieee-754 floating-point standard in their */ -/* > handling of infinities and NaNs, and false otherwise. This variable */ -/* > is passed to DLASQ3. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of rows and columns in the matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension ( 4*N ) */ -/* > On entry Z holds the qd array. On exit, entries 1 to N hold */ -/* > the eigenvalues in decreasing order, Z( 2*N+1 ) holds the */ -/* > trace, and Z( 2*N+2 ) holds the sum of the eigenvalues. If */ -/* > N > 2, then Z( 2*N+3 ) holds the iteration count, Z( 2*N+4 ) */ -/* > holds NDIVS/NIN^2, and Z( 2*N+5 ) holds the percentage of */ -/* > shifts that failed. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if the i-th argument is a scalar and had an illegal */ -/* > value, then INFO = -i, if the i-th argument is an */ -/* > array and the j-entry had an illegal value, then */ -/* > INFO = -(i*100+j) */ -/* > > 0: the algorithm failed */ -/* > = 1, a split was marked by a positive value in E */ -/* > = 2, current block of Z not diagonalized after 100*N */ -/* > iterations (in inner while loop). On exit Z holds */ -/* > a qd array with the same eigenvalues as the given Z. */ -/* > = 3, termination criterion of outer while loop not met */ -/* > (program created more than N unreduced blocks) */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Local Variables: I0:N0 defines a current unreduced segment of Z. */ -/* > The shifts are accumulated in SIGMA. Iteration count is in ITER. */ -/* > Ping-pong is controlled by PP (alternates between 0 and 1). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlasq2_(integer *n, doublereal *z__, integer *info) +int dlasq2_(integer *n, doublereal *z__, integer *info) { - /* System generated locals */ integer i__1, i__2, i__3; doublereal d__1, d__2; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal d__, e, g; integer k; doublereal s, t; @@ -168,60 +33,25 @@ f"> */ integer iinfo; doublereal tempe, tempq; integer ttype; - extern /* Subroutine */ int dlasq3_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - integer *, integer *, integer *, logical *, integer *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *); + extern int dlasq3_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *, integer *, integer *, logical *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *); extern doublereal dlamch_(char *, ftnlen); doublereal deemin; integer iwhila, iwhilb; doublereal oldemn, safmin; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, - integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments. */ -/* (in case DLASQ2 is not called by DLASQ1) */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dlasrt_(char *, integer *, doublereal *, integer *, ftnlen); --z__; - - /* Function Body */ *info = 0; eps = dlamch_((char *)"Precision", (ftnlen)9); safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); tol = eps * 100.; -/* Computing 2nd power */ d__1 = tol; tol2 = d__1 * d__1; - if (*n < 0) { *info = -1; xerbla_((char *)"DLASQ2", &c__1, (ftnlen)6); @@ -229,18 +59,12 @@ f"> */ } else if (*n == 0) { return 0; } else if (*n == 1) { - -/* 1-by-1 case. */ - if (z__[1] < 0.) { *info = -201; xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); } return 0; } else if (*n == 2) { - -/* 2-by-2 case. */ - if (z__[1] < 0.) { *info = -201; xerbla_((char *)"DLASQ2", &c__2, (ftnlen)6); @@ -275,16 +99,12 @@ f"> */ z__[6] = z__[2] + z__[1]; return 0; } - -/* Check for negative data and compute sums of q's and e's. */ - z__[*n * 2] = 0.; emin = z__[2]; qmax = 0.; zmax = 0.; d__ = 0.; e = 0.; - i__1 = *n - 1 << 1; for (k = 1; k <= i__1; k += 2) { if (z__[k] < 0.) { @@ -298,16 +118,12 @@ f"> */ } d__ += z__[k]; e += z__[k + 1]; -/* Computing MAX */ d__1 = qmax, d__2 = z__[k]; - qmax = max(d__1,d__2); -/* Computing MIN */ + qmax = max(d__1, d__2); d__1 = emin, d__2 = z__[k + 1]; - emin = min(d__1,d__2); -/* Computing MAX */ - d__1 = max(qmax,zmax), d__2 = z__[k + 1]; - zmax = max(d__1,d__2); -/* L10: */ + emin = min(d__1, d__2); + d__1 = max(qmax, zmax), d__2 = z__[k + 1]; + zmax = max(d__1, d__2); } if (z__[(*n << 1) - 1] < 0.) { *info = -((*n << 1) + 199); @@ -315,53 +131,32 @@ f"> */ return 0; } d__ += z__[(*n << 1) - 1]; -/* Computing MAX */ d__1 = qmax, d__2 = z__[(*n << 1) - 1]; - qmax = max(d__1,d__2); - zmax = max(qmax,zmax); - -/* Check for diagonality. */ - + qmax = max(d__1, d__2); + zmax = max(qmax, zmax); if (e == 0.) { i__1 = *n; for (k = 2; k <= i__1; ++k) { z__[k] = z__[(k << 1) - 1]; -/* L20: */ } dlasrt_((char *)"D", n, &z__[1], &iinfo, (ftnlen)1); z__[(*n << 1) - 1] = d__; return 0; } - trace = d__ + e; - -/* Check for zero data. */ - if (trace == 0.) { z__[(*n << 1) - 1] = 0.; return 0; } - -/* Check whether the machine is IEEE conformable. */ - - ieee = ilaenv_(&c__10, (char *)"DLASQ2", (char *)"N", &c__1, &c__2, &c__3, &c__4, (ftnlen) - 6, (ftnlen)1) == 1; - -/* Rearrange data for locality: Z=(q1,qq1,e1,ee1,q2,qq2,e2,ee2,...). */ - + ieee = ilaenv_(&c__10, (char *)"DLASQ2", (char *)"N", &c__1, &c__2, &c__3, &c__4, (ftnlen)6, (ftnlen)1) == 1; for (k = *n << 1; k >= 2; k += -2) { z__[k * 2] = 0.; z__[(k << 1) - 1] = z__[k]; z__[(k << 1) - 2] = 0.; z__[(k << 1) - 3] = z__[k - 1]; -/* L30: */ } - i0 = 1; n0 = *n; - -/* Reverse the qd-array, if warranted. */ - if (z__[(i0 << 2) - 3] * 1.5 < z__[(n0 << 2) - 3]) { ipn4 = i0 + n0 << 2; i__1 = i0 + n0 - 1 << 1; @@ -372,16 +167,10 @@ f"> */ temp = z__[i4 - 1]; z__[i4 - 1] = z__[ipn4 - i4 - 5]; z__[ipn4 - i4 - 5] = temp; -/* L40: */ } } - -/* Initial split checking via dqd and Li's test. */ - pp = 0; - for (k = 1; k <= 2; ++k) { - d__ = z__[(n0 << 2) + pp - 3]; i__1 = (i0 << 2) + pp; for (i4 = (n0 - 1 << 2) + pp; i4 >= i__1; i4 += -4) { @@ -391,11 +180,7 @@ f"> */ } else { d__ = z__[i4 - 3] * (d__ / (d__ + z__[i4 - 1])); } -/* L50: */ } - -/* dqd maps Z to ZZ plus Li's test. */ - emin = z__[(i0 << 2) + pp + 1]; d__ = z__[(i0 << 2) + pp - 3]; i__1 = (n0 - 1 << 2) + pp; @@ -407,41 +192,26 @@ f"> */ z__[i4 - (pp << 1)] = 0.; d__ = z__[i4 + 1]; } else if (safmin * z__[i4 + 1] < z__[i4 - (pp << 1) - 2] && - safmin * z__[i4 - (pp << 1) - 2] < z__[i4 + 1]) { + safmin * z__[i4 - (pp << 1) - 2] < z__[i4 + 1]) { temp = z__[i4 + 1] / z__[i4 - (pp << 1) - 2]; z__[i4 - (pp << 1)] = z__[i4 - 1] * temp; d__ *= temp; } else { - z__[i4 - (pp << 1)] = z__[i4 + 1] * (z__[i4 - 1] / z__[i4 - ( - pp << 1) - 2]); + z__[i4 - (pp << 1)] = z__[i4 + 1] * (z__[i4 - 1] / z__[i4 - (pp << 1) - 2]); d__ = z__[i4 + 1] * (d__ / z__[i4 - (pp << 1) - 2]); } -/* Computing MIN */ d__1 = emin, d__2 = z__[i4 - (pp << 1)]; - emin = min(d__1,d__2); -/* L60: */ + emin = min(d__1, d__2); } z__[(n0 << 2) - pp - 2] = d__; - -/* Now find qmax. */ - qmax = z__[(i0 << 2) - pp - 2]; i__1 = (n0 << 2) - pp - 2; for (i4 = (i0 << 2) - pp + 2; i4 <= i__1; i4 += 4) { -/* Computing MAX */ d__1 = qmax, d__2 = z__[i4]; - qmax = max(d__1,d__2); -/* L70: */ + qmax = max(d__1, d__2); } - -/* Prepare for the next iteration on K. */ - pp = 1 - pp; -/* L80: */ } - -/* Initialise variables to pass to DLASQ3. */ - ttype = 0; dmin1 = 0.; dmin2 = 0.; @@ -450,22 +220,14 @@ f"> */ dn2 = 0.; g = 0.; tau = 0.; - iter = 2; nfail = 0; ndiv = n0 - i0 << 1; - i__1 = *n + 1; for (iwhila = 1; iwhila <= i__1; ++iwhila) { if (n0 < 1) { goto L170; } - -/* While array unfinished do */ - -/* E(N0) holds the value of SIGMA when submatrix in I0:N0 */ -/* splits from the rest of the array, but is negated. */ - desig = 0.; if (n0 == *n) { sigma = 0.; @@ -476,10 +238,6 @@ f"> */ *info = 1; return 0; } - -/* Find last unreduced submatrix's top index I0, find QMAX and */ -/* EMIN. Find Gershgorin-type bound if Q's much greater than E's. */ - emax = 0.; if (n0 > i0) { emin = (d__1 = z__[(n0 << 2) - 5], abs(d__1)); @@ -493,27 +251,20 @@ f"> */ goto L100; } if (qmin >= emax * 4.) { -/* Computing MIN */ d__1 = qmin, d__2 = z__[i4 - 3]; - qmin = min(d__1,d__2); -/* Computing MAX */ + qmin = min(d__1, d__2); d__1 = emax, d__2 = z__[i4 - 5]; - emax = max(d__1,d__2); + emax = max(d__1, d__2); } -/* Computing MAX */ d__1 = qmax, d__2 = z__[i4 - 7] + z__[i4 - 5]; - qmax = max(d__1,d__2); -/* Computing MIN */ + qmax = max(d__1, d__2); d__1 = emin, d__2 = z__[i4 - 5]; - emin = min(d__1,d__2); -/* L90: */ + emin = min(d__1, d__2); } i4 = 4; - -L100: + L100: i0 = i4 / 4; pp = 0; - if (n0 - i0 > 1) { dee = z__[(i0 << 2) - 3]; deemin = dee; @@ -525,10 +276,8 @@ L100: deemin = dee; kmin = (i4 + 3) / 4; } -/* L110: */ } - if (kmin - i0 << 1 < n0 - kmin && deemin <= z__[(n0 << 2) - 3] * - .5) { + if (kmin - i0 << 1 < n0 - kmin && deemin <= z__[(n0 << 2) - 3] * .5) { ipn4 = i0 + n0 << 2; pp = 2; i__2 = i0 + n0 - 1 << 1; @@ -545,87 +294,53 @@ L100: temp = z__[i4]; z__[i4] = z__[ipn4 - i4 - 4]; z__[ipn4 - i4 - 4] = temp; -/* L120: */ } } } - -/* Put -(initial shift) into DMIN. */ - -/* Computing MAX */ d__1 = 0., d__2 = qmin - sqrt(qmin) * 2. * sqrt(emax); - dmin__ = -max(d__1,d__2); - -/* Now I0:N0 is unreduced. */ -/* PP = 0 for ping, PP = 1 for pong. */ -/* PP = 2 indicates that flipping was applied to the Z array and */ -/* and that the tests for deflation upon entry in DLASQ3 */ -/* should not be performed. */ - + dmin__ = -max(d__1, d__2); nbig = (n0 - i0 + 1) * 100; i__2 = nbig; for (iwhilb = 1; iwhilb <= i__2; ++iwhilb) { if (i0 > n0) { goto L150; } - -/* While submatrix unfinished take a good dqds step. */ - - dlasq3_(&i0, &n0, &z__[1], &pp, &dmin__, &sigma, &desig, &qmax, & - nfail, &iter, &ndiv, &ieee, &ttype, &dmin1, &dmin2, &dn, & - dn1, &dn2, &g, &tau); - + dlasq3_(&i0, &n0, &z__[1], &pp, &dmin__, &sigma, &desig, &qmax, &nfail, &iter, &ndiv, + &ieee, &ttype, &dmin1, &dmin2, &dn, &dn1, &dn2, &g, &tau); pp = 1 - pp; - -/* When EMIN is very small check for splits. */ - if (pp == 0 && n0 - i0 >= 3) { - if (z__[n0 * 4] <= tol2 * qmax || z__[(n0 << 2) - 1] <= tol2 * - sigma) { + if (z__[n0 * 4] <= tol2 * qmax || z__[(n0 << 2) - 1] <= tol2 * sigma) { splt = i0 - 1; qmax = z__[(i0 << 2) - 3]; emin = z__[(i0 << 2) - 1]; oldemn = z__[i0 * 4]; i__3 = n0 - 3 << 2; for (i4 = i0 << 2; i4 <= i__3; i4 += 4) { - if (z__[i4] <= tol2 * z__[i4 - 3] || z__[i4 - 1] <= - tol2 * sigma) { + if (z__[i4] <= tol2 * z__[i4 - 3] || z__[i4 - 1] <= tol2 * sigma) { z__[i4 - 1] = -sigma; splt = i4 / 4; qmax = 0.; emin = z__[i4 + 3]; oldemn = z__[i4 + 4]; } else { -/* Computing MAX */ d__1 = qmax, d__2 = z__[i4 + 1]; - qmax = max(d__1,d__2); -/* Computing MIN */ + qmax = max(d__1, d__2); d__1 = emin, d__2 = z__[i4 - 1]; - emin = min(d__1,d__2); -/* Computing MIN */ + emin = min(d__1, d__2); d__1 = oldemn, d__2 = z__[i4]; - oldemn = min(d__1,d__2); + oldemn = min(d__1, d__2); } -/* L130: */ } z__[(n0 << 2) - 1] = emin; z__[n0 * 4] = oldemn; i0 = splt + 1; } } - -/* L140: */ } - *info = 2; - -/* Maximum number of iterations exceeded, restore the shift */ -/* SIGMA and place the new d's and e's in a qd array. */ -/* This might need to be done for several blocks */ - i1 = i0; n1 = n0; -L145: + L145: tempq = z__[(i0 << 2) - 3]; z__[(i0 << 2) - 3] += sigma; i__2 = n0; @@ -633,15 +348,11 @@ L145: tempe = z__[(k << 2) - 5]; z__[(k << 2) - 5] *= tempq / z__[(k << 2) - 7]; tempq = z__[(k << 2) - 3]; - z__[(k << 2) - 3] = z__[(k << 2) - 3] + sigma + tempe - z__[(k << - 2) - 5]; + z__[(k << 2) - 3] = z__[(k << 2) - 3] + sigma + tempe - z__[(k << 2) - 5]; } - -/* Prepare to do this on the previous block if there is one */ - if (i1 > 1) { n1 = i1 - 1; - while(i1 >= 2 && z__[(i1 << 2) - 5] >= 0.) { + while (i1 >= 2 && z__[(i1 << 2) - 5] >= 0.) { --i1; } sigma = -z__[(n1 << 2) - 1]; @@ -650,11 +361,6 @@ L145: i__2 = *n; for (k = 1; k <= i__2; ++k) { z__[(k << 1) - 1] = z__[(k << 2) - 3]; - -/* Only the block 1..N0 is unfinished. The rest of the e's */ -/* must be essentially zero, although sometimes other data */ -/* has been stored in them. */ - if (k < n0) { z__[k * 2] = z__[(k << 2) - 1]; } else { @@ -662,55 +368,28 @@ L145: } } return 0; - -/* end IWHILB */ - -L150: - -/* L160: */ - ; + L150:; } - *info = 3; return 0; - -/* end IWHILA */ - L170: - -/* Move q's to the front. */ - i__1 = *n; for (k = 2; k <= i__1; ++k) { z__[k] = z__[(k << 2) - 3]; -/* L180: */ } - -/* Sort and compute sum of eigenvalues. */ - dlasrt_((char *)"D", n, &z__[1], &iinfo, (ftnlen)1); - e = 0.; for (k = *n; k >= 1; --k) { e += z__[k]; -/* L190: */ } - -/* Store trace, sum(eigenvalues) and information on performance. */ - z__[(*n << 1) + 1] = trace; z__[(*n << 1) + 2] = e; - z__[(*n << 1) + 3] = (doublereal) iter; -/* Computing 2nd power */ + z__[(*n << 1) + 3] = (doublereal)iter; i__1 = *n; - z__[(*n << 1) + 4] = (doublereal) ndiv / (doublereal) (i__1 * i__1); - z__[(*n << 1) + 5] = nfail * 100. / (doublereal) iter; + z__[(*n << 1) + 4] = (doublereal)ndiv / (doublereal)(i__1 * i__1); + z__[(*n << 1) + 5] = nfail * 100. / (doublereal)iter; return 0; - -/* End of DLASQ2 */ - -} /* dlasq2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasq3.cpp b/lib/linalg/dlasq3.cpp index f43c67ca34..62819cf77f 100644 --- a/lib/linalg/dlasq3.cpp +++ b/lib/linalg/dlasq3.cpp @@ -1,272 +1,37 @@ -/* fortran/dlasq3.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASQ3 checks for deflation, computes a shift and calls dqds. Used by sbdsqr. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASQ3 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASQ3( I0, N0, Z, PP, DMIN, SIGMA, DESIG, QMAX, NFAIL, */ -/* ITER, NDIV, IEEE, TTYPE, DMIN1, DMIN2, DN, DN1, */ -/* DN2, G, TAU ) */ - -/* .. Scalar Arguments .. */ -/* LOGICAL IEEE */ -/* INTEGER I0, ITER, N0, NDIV, NFAIL, PP */ -/* DOUBLE PRECISION DESIG, DMIN, DMIN1, DMIN2, DN, DN1, DN2, G, */ -/* $ QMAX, SIGMA, TAU */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION Z( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASQ3 checks for deflation, computes a shift (TAU) and calls dqds. */ -/* > In case of failure it changes shifts, and tries again until output */ -/* > is positive. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] I0 */ -/* > \verbatim */ -/* > I0 is INTEGER */ -/* > First index. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] N0 */ -/* > \verbatim */ -/* > N0 is INTEGER */ -/* > Last index. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension ( 4*N0 ) */ -/* > Z holds the qd array. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] PP */ -/* > \verbatim */ -/* > PP is INTEGER */ -/* > PP=0 for ping, PP=1 for pong. */ -/* > PP=2 indicates that flipping was applied to the Z array */ -/* > and that the initial tests for deflation should not be */ -/* > performed. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DMIN */ -/* > \verbatim */ -/* > DMIN is DOUBLE PRECISION */ -/* > Minimum value of d. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] SIGMA */ -/* > \verbatim */ -/* > SIGMA is DOUBLE PRECISION */ -/* > Sum of shifts used in current segment. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DESIG */ -/* > \verbatim */ -/* > DESIG is DOUBLE PRECISION */ -/* > Lower order part of SIGMA */ -/* > \endverbatim */ -/* > */ -/* > \param[in] QMAX */ -/* > \verbatim */ -/* > QMAX is DOUBLE PRECISION */ -/* > Maximum value of q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] NFAIL */ -/* > \verbatim */ -/* > NFAIL is INTEGER */ -/* > Increment NFAIL by 1 each time the shift was too big. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] ITER */ -/* > \verbatim */ -/* > ITER is INTEGER */ -/* > Increment ITER by 1 for each iteration. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] NDIV */ -/* > \verbatim */ -/* > NDIV is INTEGER */ -/* > Increment NDIV by 1 for each division. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] IEEE */ -/* > \verbatim */ -/* > IEEE is LOGICAL */ -/* > Flag for IEEE or non IEEE arithmetic (passed to DLASQ5). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] TTYPE */ -/* > \verbatim */ -/* > TTYPE is INTEGER */ -/* > Shift type. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DMIN1 */ -/* > \verbatim */ -/* > DMIN1 is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DMIN2 */ -/* > \verbatim */ -/* > DMIN2 is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DN */ -/* > \verbatim */ -/* > DN is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DN1 */ -/* > \verbatim */ -/* > DN1 is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DN2 */ -/* > \verbatim */ -/* > DN2 is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] G */ -/* > \verbatim */ -/* > G is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION */ -/* > */ -/* > These are passed as arguments in order to save their values */ -/* > between calls to DLASQ3. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dlasq3_(integer *i0, integer *n0, doublereal *z__, - integer *pp, doublereal *dmin__, doublereal *sigma, doublereal *desig, - doublereal *qmax, integer *nfail, integer *iter, integer *ndiv, - logical *ieee, integer *ttype, doublereal *dmin1, doublereal *dmin2, - doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *g, - doublereal *tau) +int dlasq3_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *dmin__, + doublereal *sigma, doublereal *desig, doublereal *qmax, integer *nfail, integer *iter, + integer *ndiv, logical *ieee, integer *ttype, doublereal *dmin1, doublereal *dmin2, + doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *g, doublereal *tau) { - /* System generated locals */ integer i__1; doublereal d__1, d__2; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal s, t; integer j4, nn; doublereal eps, tol; integer n0in, ipn4; doublereal tol2, temp; - extern /* Subroutine */ int dlasq4_(integer *, integer *, doublereal *, - integer *, integer *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *, - doublereal *), dlasq5_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, logical * - , doublereal *), dlasq6_(integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *); + extern int dlasq4_(integer *, integer *, doublereal *, integer *, integer *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *, integer *, doublereal *), + dlasq5_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + logical *, doublereal *), + dlasq6_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, doublereal *, doublereal *); extern doublereal dlamch_(char *, ftnlen); extern logical disnan_(doublereal *); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Function .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --z__; - - /* Function Body */ n0in = *n0; eps = dlamch_((char *)"Precision", (ftnlen)9); tol = eps * 100.; -/* Computing 2nd power */ d__1 = tol; tol2 = d__1 * d__1; - -/* Check for deflation. */ - L10: - if (*n0 < *i0) { return 0; } @@ -277,31 +42,19 @@ L10: if (*n0 == *i0 + 1) { goto L40; } - -/* Check whether E(N0-1) is negligible, 1 eigenvalue. */ - - if (z__[nn - 5] > tol2 * (*sigma + z__[nn - 3]) && z__[nn - (*pp << 1) - - 4] > tol2 * z__[nn - 7]) { + if (z__[nn - 5] > tol2 * (*sigma + z__[nn - 3]) && + z__[nn - (*pp << 1) - 4] > tol2 * z__[nn - 7]) { goto L30; } - L20: - z__[(*n0 << 2) - 3] = z__[(*n0 << 2) + *pp - 3] + *sigma; --(*n0); goto L10; - -/* Check whether E(N0-2) is negligible, 2 eigenvalues. */ - L30: - - if (z__[nn - 9] > tol2 * *sigma && z__[nn - (*pp << 1) - 8] > tol2 * z__[ - nn - 11]) { + if (z__[nn - 9] > tol2 * *sigma && z__[nn - (*pp << 1) - 8] > tol2 * z__[nn - 11]) { goto L50; } - L40: - if (z__[nn - 3] > z__[nn - 7]) { s = z__[nn - 3]; z__[nn - 3] = z__[nn - 7]; @@ -323,14 +76,10 @@ L40: z__[(*n0 << 2) - 3] = z__[nn - 3] + *sigma; *n0 += -2; goto L10; - L50: if (*pp == 2) { *pp = 0; } - -/* Reverse the qd-array, if warranted. */ - if (*dmin__ <= 0. || *n0 < n0in) { if (z__[(*i0 << 2) + *pp - 3] * 1.5 < z__[(*n0 << 2) + *pp - 3]) { ipn4 = *i0 + *n0 << 2; @@ -348,90 +97,50 @@ L50: temp = z__[j4]; z__[j4] = z__[ipn4 - j4 - 4]; z__[ipn4 - j4 - 4] = temp; -/* L60: */ } if (*n0 - *i0 <= 4) { z__[(*n0 << 2) + *pp - 1] = z__[(*i0 << 2) + *pp - 1]; z__[(*n0 << 2) - *pp] = z__[(*i0 << 2) - *pp]; } -/* Computing MIN */ d__1 = *dmin2, d__2 = z__[(*n0 << 2) + *pp - 1]; - *dmin2 = min(d__1,d__2); -/* Computing MIN */ - d__1 = z__[(*n0 << 2) + *pp - 1], d__2 = z__[(*i0 << 2) + *pp - 1] - , d__1 = min(d__1,d__2), d__2 = z__[(*i0 << 2) + *pp + 3]; - z__[(*n0 << 2) + *pp - 1] = min(d__1,d__2); -/* Computing MIN */ - d__1 = z__[(*n0 << 2) - *pp], d__2 = z__[(*i0 << 2) - *pp], d__1 = - min(d__1,d__2), d__2 = z__[(*i0 << 2) - *pp + 4]; - z__[(*n0 << 2) - *pp] = min(d__1,d__2); -/* Computing MAX */ - d__1 = *qmax, d__2 = z__[(*i0 << 2) + *pp - 3], d__1 = max(d__1, - d__2), d__2 = z__[(*i0 << 2) + *pp + 1]; - *qmax = max(d__1,d__2); + *dmin2 = min(d__1, d__2); + d__1 = z__[(*n0 << 2) + *pp - 1], d__2 = z__[(*i0 << 2) + *pp - 1], + d__1 = min(d__1, d__2), d__2 = z__[(*i0 << 2) + *pp + 3]; + z__[(*n0 << 2) + *pp - 1] = min(d__1, d__2); + d__1 = z__[(*n0 << 2) - *pp], d__2 = z__[(*i0 << 2) - *pp], d__1 = min(d__1, d__2), + d__2 = z__[(*i0 << 2) - *pp + 4]; + z__[(*n0 << 2) - *pp] = min(d__1, d__2); + d__1 = *qmax, d__2 = z__[(*i0 << 2) + *pp - 3], d__1 = max(d__1, d__2), + d__2 = z__[(*i0 << 2) + *pp + 1]; + *qmax = max(d__1, d__2); *dmin__ = -0.; } } - -/* Choose a shift. */ - - dlasq4_(i0, n0, &z__[1], pp, &n0in, dmin__, dmin1, dmin2, dn, dn1, dn2, - tau, ttype, g); - -/* Call dqds until DMIN > 0. */ - + dlasq4_(i0, n0, &z__[1], pp, &n0in, dmin__, dmin1, dmin2, dn, dn1, dn2, tau, ttype, g); L70: - - dlasq5_(i0, n0, &z__[1], pp, tau, sigma, dmin__, dmin1, dmin2, dn, dn1, - dn2, ieee, &eps); - + dlasq5_(i0, n0, &z__[1], pp, tau, sigma, dmin__, dmin1, dmin2, dn, dn1, dn2, ieee, &eps); *ndiv += *n0 - *i0 + 2; ++(*iter); - -/* Check status. */ - if (*dmin__ >= 0. && *dmin1 >= 0.) { - -/* Success. */ - goto L90; - - } else if (*dmin__ < 0. && *dmin1 > 0. && z__[(*n0 - 1 << 2) - *pp] < tol - * (*sigma + *dn1) && abs(*dn) < tol * *sigma) { - -/* Convergence hidden by negative DN. */ - + } else if (*dmin__ < 0. && *dmin1 > 0. && z__[(*n0 - 1 << 2) - *pp] < tol * (*sigma + *dn1) && + abs(*dn) < tol * *sigma) { z__[(*n0 - 1 << 2) - *pp + 2] = 0.; *dmin__ = 0.; goto L90; } else if (*dmin__ < 0.) { - -/* TAU too big. Select new TAU and try again. */ - ++(*nfail); if (*ttype < -22) { - -/* Failed twice. Play it safe. */ - *tau = 0.; } else if (*dmin1 > 0.) { - -/* Late failure. Gives excellent shift. */ - *tau = (*tau + *dmin__) * (1. - eps * 2.); *ttype += -11; } else { - -/* Early failure. Divide by 4. */ - *tau *= .25; *ttype += -12; } goto L70; } else if (disnan_(dmin__)) { - -/* NaN. */ - if (*tau == 0.) { goto L80; } else { @@ -439,20 +148,13 @@ L70: goto L70; } } else { - -/* Possible underflow. Play it safe. */ - goto L80; } - -/* Risk of underflow. */ - L80: dlasq6_(i0, n0, &z__[1], pp, dmin__, dmin1, dmin2, dn, dn1, dn2); *ndiv += *n0 - *i0 + 2; ++(*iter); *tau = 0.; - L90: if (*tau < *sigma) { *desig += *tau; @@ -463,13 +165,8 @@ L90: *desig = *sigma - (t - *tau) + *desig; } *sigma = t; - return 0; - -/* End of DLASQ3 */ - -} /* dlasq3_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasq4.cpp b/lib/linalg/dlasq4.cpp index 9629f53161..524c89a2ac 100644 --- a/lib/linalg/dlasq4.cpp +++ b/lib/linalg/dlasq4.cpp @@ -1,235 +1,29 @@ -/* fortran/dlasq4.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASQ4 computes an approximation to the smallest eigenvalue using values of d from the previous - transform. Used by sbdsqr. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASQ4 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN, */ -/* DN1, DN2, TAU, TTYPE, G ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER I0, N0, N0IN, PP, TTYPE */ -/* DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DN1, DN2, G, TAU */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION Z( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASQ4 computes an approximation TAU to the smallest eigenvalue */ -/* > using values of d from the previous transform. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] I0 */ -/* > \verbatim */ -/* > I0 is INTEGER */ -/* > First index. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N0 */ -/* > \verbatim */ -/* > N0 is INTEGER */ -/* > Last index. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension ( 4*N0 ) */ -/* > Z holds the qd array. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PP */ -/* > \verbatim */ -/* > PP is INTEGER */ -/* > PP=0 for ping, PP=1 for pong. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N0IN */ -/* > \verbatim */ -/* > N0IN is INTEGER */ -/* > The value of N0 at start of EIGTEST. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DMIN */ -/* > \verbatim */ -/* > DMIN is DOUBLE PRECISION */ -/* > Minimum value of d. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DMIN1 */ -/* > \verbatim */ -/* > DMIN1 is DOUBLE PRECISION */ -/* > Minimum value of d, excluding D( N0 ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DMIN2 */ -/* > \verbatim */ -/* > DMIN2 is DOUBLE PRECISION */ -/* > Minimum value of d, excluding D( N0 ) and D( N0-1 ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DN */ -/* > \verbatim */ -/* > DN is DOUBLE PRECISION */ -/* > d(N) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DN1 */ -/* > \verbatim */ -/* > DN1 is DOUBLE PRECISION */ -/* > d(N-1) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DN2 */ -/* > \verbatim */ -/* > DN2 is DOUBLE PRECISION */ -/* > d(N-2) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION */ -/* > This is the shift. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TTYPE */ -/* > \verbatim */ -/* > TTYPE is INTEGER */ -/* > Shift type. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] G */ -/* > \verbatim */ -/* > G is DOUBLE PRECISION */ -/* > G is passed as an argument in order to save its value between */ -/* > calls to DLASQ4. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > CNST1 = 9/16 */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlasq4_(integer *i0, integer *n0, doublereal *z__, - integer *pp, integer *n0in, doublereal *dmin__, doublereal *dmin1, - doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, - doublereal *tau, integer *ttype, doublereal *g) +int dlasq4_(integer *i0, integer *n0, doublereal *z__, integer *pp, integer *n0in, + doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, doublereal *dn, + doublereal *dn1, doublereal *dn2, doublereal *tau, integer *ttype, doublereal *g) { - /* System generated locals */ integer i__1; doublereal d__1, d__2; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal s, a2, b1, b2; integer i4, nn, np; doublereal gam, gap1, gap2; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* A negative DMIN forces the shift to take that absolute value */ -/* TTYPE records the type of shift. */ - - /* Parameter adjustments */ --z__; - - /* Function Body */ if (*dmin__ <= 0.) { *tau = -(*dmin__); *ttype = -1; return 0; } - nn = (*n0 << 2) + *pp; if (*n0in == *n0) { - -/* No eigenvalues deflated. */ - if (*dmin__ == *dn || *dmin__ == *dn1) { - b1 = sqrt(z__[nn - 3]) * sqrt(z__[nn - 5]); b2 = sqrt(z__[nn - 7]) * sqrt(z__[nn - 9]); a2 = z__[nn - 7] + z__[nn - 5]; - -/* Cases 2 and 3. */ - if (*dmin__ == *dn && *dmin1 == *dn1) { gap2 = *dmin2 - a2 - *dmin2 * .25; if (gap2 > 0. && gap2 > b2) { @@ -238,9 +32,8 @@ f"> */ gap1 = a2 - *dn - (b1 + b2); } if (gap1 > 0. && gap1 > b1) { -/* Computing MAX */ d__1 = *dn - b1 / gap1 * b1, d__2 = *dmin__ * .5; - s = max(d__1,d__2); + s = max(d__1, d__2); *ttype = -2; } else { s = 0.; @@ -248,19 +41,14 @@ f"> */ s = *dn - b1; } if (a2 > b1 + b2) { -/* Computing MIN */ d__1 = s, d__2 = a2 - (b1 + b2); - s = min(d__1,d__2); + s = min(d__1, d__2); } -/* Computing MAX */ d__1 = s, d__2 = *dmin__ * .333; - s = max(d__1,d__2); + s = max(d__1, d__2); *ttype = -3; } } else { - -/* Case 4. */ - *ttype = -4; s = *dmin__ * .25; if (*dmin__ == *dn) { @@ -284,9 +72,6 @@ f"> */ b2 = z__[nn - 9] / z__[nn - 11]; np = nn - 13; } - -/* Approximate contribution to norm squared from I < NN-1. */ - a2 += b2; i__1 = (*i0 << 2) - 1 + *pp; for (i4 = np; i4 >= i__1; i4 += -4) { @@ -299,29 +84,19 @@ f"> */ } b2 *= z__[i4] / z__[i4 - 2]; a2 += b2; - if (max(b2,b1) * 100. < a2 || .563 < a2) { + if (max(b2, b1) * 100. < a2 || .563 < a2) { goto L20; } -/* L10: */ } -L20: + L20: a2 *= 1.05; - -/* Rayleigh quotient residual bound. */ - if (a2 < .563) { s = gam * (1. - sqrt(a2)) / (a2 + 1.); } } } else if (*dmin__ == *dn2) { - -/* Case 5. */ - *ttype = -5; s = *dmin__ * .25; - -/* Compute contribution to norm squared from I > NN-2. */ - np = nn - (*pp << 1); b1 = z__[np - 2]; b2 = z__[np - 6]; @@ -330,9 +105,6 @@ L20: return 0; } a2 = z__[np - 8] / b2 * (z__[np - 4] / b1 + 1.); - -/* Approximate contribution to norm squared from I < NN-2. */ - if (*n0 - *i0 > 2) { b2 = z__[nn - 13] / z__[nn - 15]; a2 += b2; @@ -347,22 +119,17 @@ L20: } b2 *= z__[i4] / z__[i4 - 2]; a2 += b2; - if (max(b2,b1) * 100. < a2 || .563 < a2) { + if (max(b2, b1) * 100. < a2 || .563 < a2) { goto L40; } -/* L30: */ } -L40: + L40: a2 *= 1.05; } - if (a2 < .563) { s = gam * (1. - sqrt(a2)) / (a2 + 1.); } } else { - -/* Case 6, no information to guide us. */ - if (*ttype == -6) { *g += (1. - *g) * .333; } else if (*ttype == -18) { @@ -373,15 +140,8 @@ L40: s = *g * *dmin__; *ttype = -6; } - } else if (*n0in == *n0 + 1) { - -/* One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN. */ - if (*dmin1 == *dn1 && *dmin2 == *dn2) { - -/* Cases 7 and 8. */ - *ttype = -7; s = *dmin1 * .333; if (z__[nn - 5] > z__[nn - 7]) { @@ -400,44 +160,31 @@ L40: } b1 *= z__[i4] / z__[i4 - 2]; b2 += b1; - if (max(b1,a2) * 100. < b2) { + if (max(b1, a2) * 100. < b2) { goto L60; } -/* L50: */ } -L60: + L60: b2 = sqrt(b2 * 1.05); -/* Computing 2nd power */ d__1 = b2; a2 = *dmin1 / (d__1 * d__1 + 1.); gap2 = *dmin2 * .5 - a2; if (gap2 > 0. && gap2 > b2 * a2) { -/* Computing MAX */ d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2); - s = max(d__1,d__2); + s = max(d__1, d__2); } else { -/* Computing MAX */ d__1 = s, d__2 = a2 * (1. - b2 * 1.01); - s = max(d__1,d__2); + s = max(d__1, d__2); *ttype = -8; } } else { - -/* Case 9. */ - s = *dmin1 * .25; if (*dmin1 == *dn1) { s = *dmin1 * .5; } *ttype = -9; } - } else if (*n0in == *n0 + 2) { - -/* Two eigenvalues deflated. Use DMIN2, DN2 for DMIN and DN. */ - -/* Cases 10 and 11. */ - if (*dmin2 == *dn2 && z__[nn - 5] * 2. < z__[nn - 7]) { *ttype = -10; s = *dmin2 * .333; @@ -459,43 +206,30 @@ L60: if (b1 * 100. < b2) { goto L80; } -/* L70: */ } -L80: + L80: b2 = sqrt(b2 * 1.05); -/* Computing 2nd power */ d__1 = b2; a2 = *dmin2 / (d__1 * d__1 + 1.); - gap2 = z__[nn - 7] + z__[nn - 9] - sqrt(z__[nn - 11]) * sqrt(z__[ - nn - 9]) - a2; + gap2 = z__[nn - 7] + z__[nn - 9] - sqrt(z__[nn - 11]) * sqrt(z__[nn - 9]) - a2; if (gap2 > 0. && gap2 > b2 * a2) { -/* Computing MAX */ d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2); - s = max(d__1,d__2); + s = max(d__1, d__2); } else { -/* Computing MAX */ d__1 = s, d__2 = a2 * (1. - b2 * 1.01); - s = max(d__1,d__2); + s = max(d__1, d__2); } } else { s = *dmin2 * .25; *ttype = -11; } } else if (*n0in > *n0 + 2) { - -/* Case 12, more than two eigenvalues deflated. No information. */ - s = 0.; *ttype = -12; } - *tau = s; return 0; - -/* End of DLASQ4 */ - -} /* dlasq4_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasq5.cpp b/lib/linalg/dlasq5.cpp index a7cd93932f..b242f3ceb8 100644 --- a/lib/linalg/dlasq5.cpp +++ b/lib/linalg/dlasq5.cpp @@ -1,206 +1,20 @@ -/* fortran/dlasq5.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASQ5 computes one dqds transform in ping-pong form. Used by sbdsqr and sstegr. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASQ5 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, SIGMA, DMIN, DMIN1, DMIN2, DN, */ -/* DNM1, DNM2, IEEE, EPS ) */ - -/* .. Scalar Arguments .. */ -/* LOGICAL IEEE */ -/* INTEGER I0, N0, PP */ -/* DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU, SIGMA, EPS */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION Z( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASQ5 computes one dqds transform in ping-pong form, one */ -/* > version for IEEE machines another for non IEEE machines. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] I0 */ -/* > \verbatim */ -/* > I0 is INTEGER */ -/* > First index. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N0 */ -/* > \verbatim */ -/* > N0 is INTEGER */ -/* > Last index. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension ( 4*N ) */ -/* > Z holds the qd array. EMIN is stored in Z(4*N0) to avoid */ -/* > an extra argument. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PP */ -/* > \verbatim */ -/* > PP is INTEGER */ -/* > PP=0 for ping, PP=1 for pong. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION */ -/* > This is the shift. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] SIGMA */ -/* > \verbatim */ -/* > SIGMA is DOUBLE PRECISION */ -/* > This is the accumulated shift up to this step. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DMIN */ -/* > \verbatim */ -/* > DMIN is DOUBLE PRECISION */ -/* > Minimum value of d. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DMIN1 */ -/* > \verbatim */ -/* > DMIN1 is DOUBLE PRECISION */ -/* > Minimum value of d, excluding D( N0 ). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DMIN2 */ -/* > \verbatim */ -/* > DMIN2 is DOUBLE PRECISION */ -/* > Minimum value of d, excluding D( N0 ) and D( N0-1 ). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DN */ -/* > \verbatim */ -/* > DN is DOUBLE PRECISION */ -/* > d(N0), the last value of d. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DNM1 */ -/* > \verbatim */ -/* > DNM1 is DOUBLE PRECISION */ -/* > d(N0-1). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DNM2 */ -/* > \verbatim */ -/* > DNM2 is DOUBLE PRECISION */ -/* > d(N0-2). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] IEEE */ -/* > \verbatim */ -/* > IEEE is LOGICAL */ -/* > Flag for IEEE or non IEEE arithmetic. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] EPS */ -/* > \verbatim */ -/* > EPS is DOUBLE PRECISION */ -/* > This is the value of epsilon used. */ -/* > \endverbatim */ -/* > */ -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dlasq5_(integer *i0, integer *n0, doublereal *z__, - integer *pp, doublereal *tau, doublereal *sigma, doublereal *dmin__, - doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal * - dnm1, doublereal *dnm2, logical *ieee, doublereal *eps) +int dlasq5_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *tau, + doublereal *sigma, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, + doublereal *dn, doublereal *dnm1, doublereal *dnm2, logical *ieee, doublereal *eps) { - /* System generated locals */ integer i__1; doublereal d__1, d__2; - - /* Local variables */ doublereal d__; integer j4, j4p2; doublereal emin, temp, dthresh; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameter .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --z__; - - /* Function Body */ if (*n0 - *i0 - 1 <= 0) { return 0; } - dthresh = *eps * (*sigma + *tau); if (*tau < dthresh * .5) { *tau = 0.; @@ -211,23 +25,17 @@ f"> */ d__ = z__[j4] - *tau; *dmin__ = d__; *dmin1 = -z__[j4]; - if (*ieee) { - -/* Code for IEEE arithmetic. */ - if (*pp == 0) { i__1 = *n0 - 3 << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { z__[j4 - 2] = d__ + z__[j4 - 1]; temp = z__[j4 + 1] / z__[j4 - 2]; d__ = d__ * temp - *tau; - *dmin__ = min(*dmin__,d__); + *dmin__ = min(*dmin__, d__); z__[j4] = z__[j4 - 1] * temp; -/* Computing MIN */ d__1 = z__[j4]; - emin = min(d__1,emin); -/* L10: */ + emin = min(d__1, emin); } } else { i__1 = *n0 - 3 << 2; @@ -235,17 +43,12 @@ f"> */ z__[j4 - 3] = d__ + z__[j4]; temp = z__[j4 + 2] / z__[j4 - 3]; d__ = d__ * temp - *tau; - *dmin__ = min(*dmin__,d__); + *dmin__ = min(*dmin__, d__); z__[j4 - 1] = z__[j4] * temp; -/* Computing MIN */ d__1 = z__[j4 - 1]; - emin = min(d__1,emin); -/* L20: */ + emin = min(d__1, emin); } } - -/* Unroll last two steps. */ - *dnm2 = d__; *dmin2 = *dmin__; j4 = (*n0 - 2 << 2) - *pp; @@ -253,20 +56,15 @@ f"> */ z__[j4 - 2] = *dnm2 + z__[j4p2]; z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; - *dmin__ = min(*dmin__,*dnm1); - + *dmin__ = min(*dmin__, *dnm1); *dmin1 = *dmin__; j4 += 4; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm1 + z__[j4p2]; z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; - *dmin__ = min(*dmin__,*dn); - + *dmin__ = min(*dmin__, *dn); } else { - -/* Code for non IEEE arithmetic. */ - if (*pp == 0) { i__1 = *n0 - 3 << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { @@ -277,11 +75,9 @@ f"> */ z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]) - *tau; } - *dmin__ = min(*dmin__,d__); -/* Computing MIN */ + *dmin__ = min(*dmin__, d__); d__1 = emin, d__2 = z__[j4]; - emin = min(d__1,d__2); -/* L30: */ + emin = min(d__1, d__2); } } else { i__1 = *n0 - 3 << 2; @@ -293,16 +89,11 @@ f"> */ z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]) - *tau; } - *dmin__ = min(*dmin__,d__); -/* Computing MIN */ + *dmin__ = min(*dmin__, d__); d__1 = emin, d__2 = z__[j4 - 1]; - emin = min(d__1,d__2); -/* L40: */ + emin = min(d__1, d__2); } } - -/* Unroll last two steps. */ - *dnm2 = d__; *dmin2 = *dmin__; j4 = (*n0 - 2 << 2) - *pp; @@ -314,8 +105,7 @@ f"> */ z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; } - *dmin__ = min(*dmin__,*dnm1); - + *dmin__ = min(*dmin__, *dnm1); *dmin1 = *dmin__; j4 += 4; j4p2 = j4 + (*pp << 1) - 1; @@ -326,20 +116,15 @@ f"> */ z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; } - *dmin__ = min(*dmin__,*dn); - + *dmin__ = min(*dmin__, *dn); } } else { -/* This is the version that sets d's to zero if they are small enough */ j4 = (*i0 << 2) + *pp - 3; emin = z__[j4 + 4]; d__ = z__[j4] - *tau; *dmin__ = d__; *dmin1 = -z__[j4]; if (*ieee) { - -/* Code for IEEE arithmetic. */ - if (*pp == 0) { i__1 = *n0 - 3 << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { @@ -349,12 +134,10 @@ f"> */ if (d__ < dthresh) { d__ = 0.; } - *dmin__ = min(*dmin__,d__); + *dmin__ = min(*dmin__, d__); z__[j4] = z__[j4 - 1] * temp; -/* Computing MIN */ d__1 = z__[j4]; - emin = min(d__1,emin); -/* L50: */ + emin = min(d__1, emin); } } else { i__1 = *n0 - 3 << 2; @@ -365,17 +148,12 @@ f"> */ if (d__ < dthresh) { d__ = 0.; } - *dmin__ = min(*dmin__,d__); + *dmin__ = min(*dmin__, d__); z__[j4 - 1] = z__[j4] * temp; -/* Computing MIN */ d__1 = z__[j4 - 1]; - emin = min(d__1,emin); -/* L60: */ + emin = min(d__1, emin); } } - -/* Unroll last two steps. */ - *dnm2 = d__; *dmin2 = *dmin__; j4 = (*n0 - 2 << 2) - *pp; @@ -383,20 +161,15 @@ f"> */ z__[j4 - 2] = *dnm2 + z__[j4p2]; z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; - *dmin__ = min(*dmin__,*dnm1); - + *dmin__ = min(*dmin__, *dnm1); *dmin1 = *dmin__; j4 += 4; j4p2 = j4 + (*pp << 1) - 1; z__[j4 - 2] = *dnm1 + z__[j4p2]; z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; - *dmin__ = min(*dmin__,*dn); - + *dmin__ = min(*dmin__, *dn); } else { - -/* Code for non IEEE arithmetic. */ - if (*pp == 0) { i__1 = *n0 - 3 << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { @@ -410,11 +183,9 @@ f"> */ if (d__ < dthresh) { d__ = 0.; } - *dmin__ = min(*dmin__,d__); -/* Computing MIN */ + *dmin__ = min(*dmin__, d__); d__1 = emin, d__2 = z__[j4]; - emin = min(d__1,d__2); -/* L70: */ + emin = min(d__1, d__2); } } else { i__1 = *n0 - 3 << 2; @@ -429,16 +200,11 @@ f"> */ if (d__ < dthresh) { d__ = 0.; } - *dmin__ = min(*dmin__,d__); -/* Computing MIN */ + *dmin__ = min(*dmin__, d__); d__1 = emin, d__2 = z__[j4 - 1]; - emin = min(d__1,d__2); -/* L80: */ + emin = min(d__1, d__2); } } - -/* Unroll last two steps. */ - *dnm2 = d__; *dmin2 = *dmin__; j4 = (*n0 - 2 << 2) - *pp; @@ -450,8 +216,7 @@ f"> */ z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau; } - *dmin__ = min(*dmin__,*dnm1); - + *dmin__ = min(*dmin__, *dnm1); *dmin1 = *dmin__; j4 += 4; j4p2 = j4 + (*pp << 1) - 1; @@ -462,19 +227,13 @@ f"> */ z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau; } - *dmin__ = min(*dmin__,*dn); - + *dmin__ = min(*dmin__, *dn); } } - z__[j4 + 2] = *dn; z__[(*n0 << 2) - *pp] = emin; return 0; - -/* End of DLASQ5 */ - -} /* dlasq5_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasq6.cpp b/lib/linalg/dlasq6.cpp index 96bda77630..b60dcdd9d6 100644 --- a/lib/linalg/dlasq6.cpp +++ b/lib/linalg/dlasq6.cpp @@ -1,190 +1,27 @@ -/* fortran/dlasq6.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASQ6 computes one dqd transform in ping-pong form. Used by sbdsqr and sstegr. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASQ6 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN, */ -/* DNM1, DNM2 ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER I0, N0, PP */ -/* DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2 */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION Z( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASQ6 computes one dqd (shift equal to zero) transform in */ -/* > ping-pong form, with protection against underflow and overflow. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] I0 */ -/* > \verbatim */ -/* > I0 is INTEGER */ -/* > First index. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N0 */ -/* > \verbatim */ -/* > N0 is INTEGER */ -/* > Last index. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension ( 4*N ) */ -/* > Z holds the qd array. EMIN is stored in Z(4*N0) to avoid */ -/* > an extra argument. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PP */ -/* > \verbatim */ -/* > PP is INTEGER */ -/* > PP=0 for ping, PP=1 for pong. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DMIN */ -/* > \verbatim */ -/* > DMIN is DOUBLE PRECISION */ -/* > Minimum value of d. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DMIN1 */ -/* > \verbatim */ -/* > DMIN1 is DOUBLE PRECISION */ -/* > Minimum value of d, excluding D( N0 ). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DMIN2 */ -/* > \verbatim */ -/* > DMIN2 is DOUBLE PRECISION */ -/* > Minimum value of d, excluding D( N0 ) and D( N0-1 ). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DN */ -/* > \verbatim */ -/* > DN is DOUBLE PRECISION */ -/* > d(N0), the last value of d. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DNM1 */ -/* > \verbatim */ -/* > DNM1 is DOUBLE PRECISION */ -/* > d(N0-1). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DNM2 */ -/* > \verbatim */ -/* > DNM2 is DOUBLE PRECISION */ -/* > d(N0-2). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dlasq6_(integer *i0, integer *n0, doublereal *z__, - integer *pp, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, - doublereal *dn, doublereal *dnm1, doublereal *dnm2) +int dlasq6_(integer *i0, integer *n0, doublereal *z__, integer *pp, doublereal *dmin__, + doublereal *dmin1, doublereal *dmin2, doublereal *dn, doublereal *dnm1, + doublereal *dnm2) { - /* System generated locals */ integer i__1; doublereal d__1, d__2; - - /* Local variables */ doublereal d__; integer j4, j4p2; doublereal emin, temp; extern doublereal dlamch_(char *, ftnlen); doublereal safmin; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameter .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Function .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --z__; - - /* Function Body */ if (*n0 - *i0 - 1 <= 0) { return 0; } - safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); j4 = (*i0 << 2) + *pp - 3; emin = z__[j4 + 4]; d__ = z__[j4]; *dmin__ = d__; - if (*pp == 0) { i__1 = *n0 - 3 << 2; for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) { @@ -194,8 +31,7 @@ f"> */ d__ = z__[j4 + 1]; *dmin__ = d__; emin = 0.; - } else if (safmin * z__[j4 + 1] < z__[j4 - 2] && safmin * z__[j4 - - 2] < z__[j4 + 1]) { + } else if (safmin * z__[j4 + 1] < z__[j4 - 2] && safmin * z__[j4 - 2] < z__[j4 + 1]) { temp = z__[j4 + 1] / z__[j4 - 2]; z__[j4] = z__[j4 - 1] * temp; d__ *= temp; @@ -203,11 +39,9 @@ f"> */ z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]); d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]); } - *dmin__ = min(*dmin__,d__); -/* Computing MIN */ + *dmin__ = min(*dmin__, d__); d__1 = emin, d__2 = z__[j4]; - emin = min(d__1,d__2); -/* L10: */ + emin = min(d__1, d__2); } } else { i__1 = *n0 - 3 << 2; @@ -218,8 +52,7 @@ f"> */ d__ = z__[j4 + 2]; *dmin__ = d__; emin = 0.; - } else if (safmin * z__[j4 + 2] < z__[j4 - 3] && safmin * z__[j4 - - 3] < z__[j4 + 2]) { + } else if (safmin * z__[j4 + 2] < z__[j4 - 3] && safmin * z__[j4 - 3] < z__[j4 + 2]) { temp = z__[j4 + 2] / z__[j4 - 3]; z__[j4 - 1] = z__[j4] * temp; d__ *= temp; @@ -227,16 +60,11 @@ f"> */ z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]); d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]); } - *dmin__ = min(*dmin__,d__); -/* Computing MIN */ + *dmin__ = min(*dmin__, d__); d__1 = emin, d__2 = z__[j4 - 1]; - emin = min(d__1,d__2); -/* L20: */ + emin = min(d__1, d__2); } } - -/* Unroll last two steps. */ - *dnm2 = d__; *dmin2 = *dmin__; j4 = (*n0 - 2 << 2) - *pp; @@ -247,8 +75,7 @@ f"> */ *dnm1 = z__[j4p2 + 2]; *dmin__ = *dnm1; emin = 0.; - } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < - z__[j4p2 + 2]) { + } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < z__[j4p2 + 2]) { temp = z__[j4p2 + 2] / z__[j4 - 2]; z__[j4] = z__[j4p2] * temp; *dnm1 = *dnm2 * temp; @@ -256,8 +83,7 @@ f"> */ z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]); } - *dmin__ = min(*dmin__,*dnm1); - + *dmin__ = min(*dmin__, *dnm1); *dmin1 = *dmin__; j4 += 4; j4p2 = j4 + (*pp << 1) - 1; @@ -267,8 +93,7 @@ f"> */ *dn = z__[j4p2 + 2]; *dmin__ = *dn; emin = 0.; - } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < - z__[j4p2 + 2]) { + } else if (safmin * z__[j4p2 + 2] < z__[j4 - 2] && safmin * z__[j4 - 2] < z__[j4p2 + 2]) { temp = z__[j4p2 + 2] / z__[j4 - 2]; z__[j4] = z__[j4p2] * temp; *dn = *dnm1 * temp; @@ -276,16 +101,11 @@ f"> */ z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]); *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]); } - *dmin__ = min(*dmin__,*dn); - + *dmin__ = min(*dmin__, *dn); z__[j4 + 2] = *dn; z__[(*n0 << 2) - *pp] = emin; return 0; - -/* End of DLASQ6 */ - -} /* dlasq6_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasr.cpp b/lib/linalg/dlasr.cpp index 5baf2cd50c..83784179fa 100644 --- a/lib/linalg/dlasr.cpp +++ b/lib/linalg/dlasr.cpp @@ -1,300 +1,47 @@ -/* fortran/dlasr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASR applies a sequence of plane rotations to a general rectangular matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER DIRECT, PIVOT, SIDE */ -/* INTEGER LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), C( * ), S( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASR applies a sequence of plane rotations to a real matrix A, */ -/* > from either the left or the right. */ -/* > */ -/* > When SIDE = 'L', the transformation takes the form */ -/* > */ -/* > A := P*A */ -/* > */ -/* > and when SIDE = 'R', the transformation takes the form */ -/* > */ -/* > A := A*P**T */ -/* > */ -/* > where P is an orthogonal matrix consisting of a sequence of z plane */ -/* > rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R', */ -/* > and P**T is the transpose of P. */ -/* > */ -/* > When DIRECT = 'F' (Forward sequence), then */ -/* > */ -/* > P = P(z-1) * ... * P(2) * P(1) */ -/* > */ -/* > and when DIRECT = 'B' (Backward sequence), then */ -/* > */ -/* > P = P(1) * P(2) * ... * P(z-1) */ -/* > */ -/* > where P(k) is a plane rotation matrix defined by the 2-by-2 rotation */ -/* > */ -/* > R(k) = ( c(k) s(k) ) */ -/* > = ( -s(k) c(k) ). */ -/* > */ -/* > When PIVOT = 'V' (Variable pivot), the rotation is performed */ -/* > for the plane (k,k+1), i.e., P(k) has the form */ -/* > */ -/* > P(k) = ( 1 ) */ -/* > ( ... ) */ -/* > ( 1 ) */ -/* > ( c(k) s(k) ) */ -/* > ( -s(k) c(k) ) */ -/* > ( 1 ) */ -/* > ( ... ) */ -/* > ( 1 ) */ -/* > */ -/* > where R(k) appears as a rank-2 modification to the identity matrix in */ -/* > rows and columns k and k+1. */ -/* > */ -/* > When PIVOT = 'T' (Top pivot), the rotation is performed for the */ -/* > plane (1,k+1), so P(k) has the form */ -/* > */ -/* > P(k) = ( c(k) s(k) ) */ -/* > ( 1 ) */ -/* > ( ... ) */ -/* > ( 1 ) */ -/* > ( -s(k) c(k) ) */ -/* > ( 1 ) */ -/* > ( ... ) */ -/* > ( 1 ) */ -/* > */ -/* > where R(k) appears in rows and columns 1 and k+1. */ -/* > */ -/* > Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is */ -/* > performed for the plane (k,z), giving P(k) the form */ -/* > */ -/* > P(k) = ( 1 ) */ -/* > ( ... ) */ -/* > ( 1 ) */ -/* > ( c(k) s(k) ) */ -/* > ( 1 ) */ -/* > ( ... ) */ -/* > ( 1 ) */ -/* > ( -s(k) c(k) ) */ -/* > */ -/* > where R(k) appears in rows and columns k and z. The rotations are */ -/* > performed without ever forming P(k) explicitly. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > Specifies whether the plane rotation matrix P is applied to */ -/* > A on the left or the right. */ -/* > = 'L': Left, compute A := P*A */ -/* > = 'R': Right, compute A:= A*P**T */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PIVOT */ -/* > \verbatim */ -/* > PIVOT is CHARACTER*1 */ -/* > Specifies the plane for which P(k) is a plane rotation */ -/* > matrix. */ -/* > = 'V': Variable pivot, the plane (k,k+1) */ -/* > = 'T': Top pivot, the plane (1,k+1) */ -/* > = 'B': Bottom pivot, the plane (k,z) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIRECT */ -/* > \verbatim */ -/* > DIRECT is CHARACTER*1 */ -/* > Specifies whether P is a forward or backward sequence of */ -/* > plane rotations. */ -/* > = 'F': Forward, P = P(z-1)*...*P(2)*P(1) */ -/* > = 'B': Backward, P = P(1)*P(2)*...*P(z-1) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. If m <= 1, an immediate */ -/* > return is effected. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. If n <= 1, an */ -/* > immediate return is effected. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension */ -/* > (M-1) if SIDE = 'L' */ -/* > (N-1) if SIDE = 'R' */ -/* > The cosines c(k) of the plane rotations. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION array, dimension */ -/* > (M-1) if SIDE = 'L' */ -/* > (N-1) if SIDE = 'R' */ -/* > The sines s(k) of the plane rotations. The 2-by-2 plane */ -/* > rotation part of the matrix P(k), R(k), has the form */ -/* > R(k) = ( c(k) s(k) ) */ -/* > ( -s(k) c(k) ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > The M-by-N matrix A. On exit, A is overwritten by P*A if */ -/* > SIDE = 'L' or by A*P**T if SIDE = 'R'. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int dlasr_(char *side, char *pivot, char *direct, integer *m, - integer *n, doublereal *c__, doublereal *s, doublereal *a, integer * - lda, ftnlen side_len, ftnlen pivot_len, ftnlen direct_len) +int dlasr_(char *side, char *pivot, char *direct, integer *m, integer *n, doublereal *c__, + doublereal *s, doublereal *a, integer *lda, ftnlen side_len, ftnlen pivot_len, + ftnlen direct_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; - - /* Local variables */ integer i__, j, info; doublereal temp; extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal ctemp, stemp; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); --c__; --s; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ info = 0; - if (! (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) || lsame_(side, (char *)"R", ( - ftnlen)1, (ftnlen)1))) { + if (!(lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) || lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1))) { info = 1; - } else if (! (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1) || lsame_(pivot, - (char *)"T", (ftnlen)1, (ftnlen)1) || lsame_(pivot, (char *)"B", (ftnlen)1, ( - ftnlen)1))) { + } else if (!(lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1) || + lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1) || + lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1))) { info = 2; - } else if (! (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(direct, - (char *)"B", (ftnlen)1, (ftnlen)1))) { + } else if (!(lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1) || + lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1))) { info = 3; } else if (*m < 0) { info = 4; } else if (*n < 0) { info = 5; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { info = 9; } if (info != 0) { xerbla_((char *)"DLASR ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0) { return 0; } if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Form P * A */ - if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { i__1 = *m - 1; @@ -305,14 +52,10 @@ extern "C" { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[j + 1 + i__ * a_dim1]; - a[j + 1 + i__ * a_dim1] = ctemp * temp - stemp * - a[j + i__ * a_dim1]; - a[j + i__ * a_dim1] = stemp * temp + ctemp * a[j - + i__ * a_dim1]; -/* L10: */ + a[j + 1 + i__ * a_dim1] = ctemp * temp - stemp * a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = stemp * temp + ctemp * a[j + i__ * a_dim1]; } } -/* L20: */ } } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { for (j = *m - 1; j >= 1; --j) { @@ -322,14 +65,10 @@ extern "C" { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = a[j + 1 + i__ * a_dim1]; - a[j + 1 + i__ * a_dim1] = ctemp * temp - stemp * - a[j + i__ * a_dim1]; - a[j + i__ * a_dim1] = stemp * temp + ctemp * a[j - + i__ * a_dim1]; -/* L30: */ + a[j + 1 + i__ * a_dim1] = ctemp * temp - stemp * a[j + i__ * a_dim1]; + a[j + i__ * a_dim1] = stemp * temp + ctemp * a[j + i__ * a_dim1]; } } -/* L40: */ } } } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { @@ -342,14 +81,10 @@ extern "C" { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[j + i__ * a_dim1]; - a[j + i__ * a_dim1] = ctemp * temp - stemp * a[ - i__ * a_dim1 + 1]; - a[i__ * a_dim1 + 1] = stemp * temp + ctemp * a[ - i__ * a_dim1 + 1]; -/* L50: */ + a[j + i__ * a_dim1] = ctemp * temp - stemp * a[i__ * a_dim1 + 1]; + a[i__ * a_dim1 + 1] = stemp * temp + ctemp * a[i__ * a_dim1 + 1]; } } -/* L60: */ } } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { for (j = *m; j >= 2; --j) { @@ -359,14 +94,10 @@ extern "C" { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = a[j + i__ * a_dim1]; - a[j + i__ * a_dim1] = ctemp * temp - stemp * a[ - i__ * a_dim1 + 1]; - a[i__ * a_dim1 + 1] = stemp * temp + ctemp * a[ - i__ * a_dim1 + 1]; -/* L70: */ + a[j + i__ * a_dim1] = ctemp * temp - stemp * a[i__ * a_dim1 + 1]; + a[i__ * a_dim1 + 1] = stemp * temp + ctemp * a[i__ * a_dim1 + 1]; } } -/* L80: */ } } } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { @@ -379,14 +110,10 @@ extern "C" { i__2 = *n; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[j + i__ * a_dim1]; - a[j + i__ * a_dim1] = stemp * a[*m + i__ * a_dim1] - + ctemp * temp; - a[*m + i__ * a_dim1] = ctemp * a[*m + i__ * - a_dim1] - stemp * temp; -/* L90: */ + a[j + i__ * a_dim1] = stemp * a[*m + i__ * a_dim1] + ctemp * temp; + a[*m + i__ * a_dim1] = ctemp * a[*m + i__ * a_dim1] - stemp * temp; } } -/* L100: */ } } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { for (j = *m - 1; j >= 1; --j) { @@ -396,21 +123,14 @@ extern "C" { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { temp = a[j + i__ * a_dim1]; - a[j + i__ * a_dim1] = stemp * a[*m + i__ * a_dim1] - + ctemp * temp; - a[*m + i__ * a_dim1] = ctemp * a[*m + i__ * - a_dim1] - stemp * temp; -/* L110: */ + a[j + i__ * a_dim1] = stemp * a[*m + i__ * a_dim1] + ctemp * temp; + a[*m + i__ * a_dim1] = ctemp * a[*m + i__ * a_dim1] - stemp * temp; } } -/* L120: */ } } } } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - -/* Form A * P**T */ - if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { i__1 = *n - 1; @@ -421,14 +141,10 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[i__ + (j + 1) * a_dim1]; - a[i__ + (j + 1) * a_dim1] = ctemp * temp - stemp * - a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = stemp * temp + ctemp * a[ - i__ + j * a_dim1]; -/* L130: */ + a[i__ + (j + 1) * a_dim1] = ctemp * temp - stemp * a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = stemp * temp + ctemp * a[i__ + j * a_dim1]; } } -/* L140: */ } } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { for (j = *n - 1; j >= 1; --j) { @@ -438,14 +154,10 @@ extern "C" { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { temp = a[i__ + (j + 1) * a_dim1]; - a[i__ + (j + 1) * a_dim1] = ctemp * temp - stemp * - a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = stemp * temp + ctemp * a[ - i__ + j * a_dim1]; -/* L150: */ + a[i__ + (j + 1) * a_dim1] = ctemp * temp - stemp * a[i__ + j * a_dim1]; + a[i__ + j * a_dim1] = stemp * temp + ctemp * a[i__ + j * a_dim1]; } } -/* L160: */ } } } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { @@ -458,14 +170,10 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = ctemp * temp - stemp * a[ - i__ + a_dim1]; - a[i__ + a_dim1] = stemp * temp + ctemp * a[i__ + - a_dim1]; -/* L170: */ + a[i__ + j * a_dim1] = ctemp * temp - stemp * a[i__ + a_dim1]; + a[i__ + a_dim1] = stemp * temp + ctemp * a[i__ + a_dim1]; } } -/* L180: */ } } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { for (j = *n; j >= 2; --j) { @@ -475,14 +183,10 @@ extern "C" { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { temp = a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = ctemp * temp - stemp * a[ - i__ + a_dim1]; - a[i__ + a_dim1] = stemp * temp + ctemp * a[i__ + - a_dim1]; -/* L190: */ + a[i__ + j * a_dim1] = ctemp * temp - stemp * a[i__ + a_dim1]; + a[i__ + a_dim1] = stemp * temp + ctemp * a[i__ + a_dim1]; } } -/* L200: */ } } } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { @@ -495,14 +199,10 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { temp = a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = stemp * a[i__ + *n * a_dim1] - + ctemp * temp; - a[i__ + *n * a_dim1] = ctemp * a[i__ + *n * - a_dim1] - stemp * temp; -/* L210: */ + a[i__ + j * a_dim1] = stemp * a[i__ + *n * a_dim1] + ctemp * temp; + a[i__ + *n * a_dim1] = ctemp * a[i__ + *n * a_dim1] - stemp * temp; } } -/* L220: */ } } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { for (j = *n - 1; j >= 1; --j) { @@ -512,25 +212,16 @@ extern "C" { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { temp = a[i__ + j * a_dim1]; - a[i__ + j * a_dim1] = stemp * a[i__ + *n * a_dim1] - + ctemp * temp; - a[i__ + *n * a_dim1] = ctemp * a[i__ + *n * - a_dim1] - stemp * temp; -/* L230: */ + a[i__ + j * a_dim1] = stemp * a[i__ + *n * a_dim1] + ctemp * temp; + a[i__ + *n * a_dim1] = ctemp * a[i__ + *n * a_dim1] - stemp * temp; } } -/* L240: */ } } } } - return 0; - -/* End of DLASR */ - -} /* dlasr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasrt.cpp b/lib/linalg/dlasrt.cpp index a796f6e568..9724ce322b 100644 --- a/lib/linalg/dlasrt.cpp +++ b/lib/linalg/dlasrt.cpp @@ -1,158 +1,22 @@ -/* fortran/dlasrt.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASRT sorts numbers in increasing or decreasing order. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASRT + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASRT( ID, N, D, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER ID */ -/* INTEGER INFO, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Sort the numbers in D in increasing order (if ID = 'I') or */ -/* > in decreasing order (if ID = 'D' ). */ -/* > */ -/* > Use Quick Sort, reverting to Insertion sort on arrays of */ -/* > size <= 20. Dimension of STACK limits N to about 2**32. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ID */ -/* > \verbatim */ -/* > ID is CHARACTER*1 */ -/* > = 'I': sort D in increasing order; */ -/* > = 'D': sort D in decreasing order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The length of the array D. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the array to be sorted. */ -/* > On exit, D has been sorted into increasing order */ -/* > (D(1) <= ... <= D(N) ) or into decreasing order */ -/* > (D(1) >= ... >= D(N) ), depending on ID. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dlasrt_(char *id, integer *n, doublereal *d__, integer * - info, ftnlen id_len) +int dlasrt_(char *id, integer *n, doublereal *d__, integer *info, ftnlen id_len) { - /* System generated locals */ integer i__1, i__2; - - /* Local variables */ integer i__, j; doublereal d1, d2, d3; integer dir; doublereal tmp; integer endd; extern logical lsame_(char *, char *, ftnlen, ftnlen); - integer stack[64] /* was [2][32] */; + integer stack[64]; doublereal dmnmx; integer start; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); integer stkpnt; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Local Arrays .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; - - /* Function Body */ *info = 0; dir = -1; if (lsame_(id, (char *)"D", (ftnlen)1, (ftnlen)1)) { @@ -170,13 +34,9 @@ f"> */ xerbla_((char *)"DLASRT", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n <= 1) { return 0; } - stkpnt = 1; stack[0] = 1; stack[1] = *n; @@ -185,13 +45,7 @@ L10: endd = stack[(stkpnt << 1) - 1]; --stkpnt; if (endd - start <= 20 && endd - start > 0) { - -/* Do Insertion sort on D( START:ENDD ) */ - if (dir == 0) { - -/* Sort into decreasing order */ - i__1 = endd; for (i__ = start + 1; i__ <= i__1; ++i__) { i__2 = start + 1; @@ -203,16 +57,10 @@ L10: } else { goto L30; } -/* L20: */ } -L30: - ; + L30:; } - } else { - -/* Sort into increasing order */ - i__1 = endd; for (i__ = start + 1; i__ <= i__1; ++i__) { i__2 = start + 1; @@ -224,20 +72,11 @@ L30: } else { goto L50; } -/* L40: */ } -L50: - ; + L50:; } - } - } else if (endd - start > 20) { - -/* Partition D( START:ENDD ) and stack parts, largest one first */ - -/* Choose partition entry as median of 3 */ - d1 = d__[start]; d2 = d__[endd]; i__ = (start + endd) / 2; @@ -259,20 +98,16 @@ L50: dmnmx = d1; } } - if (dir == 0) { - -/* Sort into decreasing order */ - i__ = start - 1; j = endd + 1; -L60: -L70: + L60: + L70: --j; if (d__[j] < dmnmx) { goto L70; } -L80: + L80: ++i__; if (d__[i__] > dmnmx) { goto L80; @@ -299,18 +134,15 @@ L80: stack[(stkpnt << 1) - 1] = j; } } else { - -/* Sort into increasing order */ - i__ = start - 1; j = endd + 1; -L90: -L100: + L90: + L100: --j; if (d__[j] > dmnmx) { goto L100; } -L110: + L110: ++i__; if (d__[i__] < dmnmx) { goto L110; @@ -342,11 +174,7 @@ L110: goto L10; } return 0; - -/* End of DLASRT */ - -} /* dlasrt_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlassq.cpp b/lib/linalg/dlassq.cpp index 76391a54f9..84e8690a14 100644 --- a/lib/linalg/dlassq.cpp +++ b/lib/linalg/dlassq.cpp @@ -1,165 +1,15 @@ -/* fortran/dlassq.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASSQ updates a sum of squares represented in scaled form. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASSQ + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASSQ( N, X, INCX, SCALE, SUMSQ ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX, N */ -/* DOUBLE PRECISION SCALE, SUMSQ */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION X( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASSQ returns the values scl and smsq such that */ -/* > */ -/* > ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq, */ -/* > */ -/* > where x( i ) = X( 1 + ( i - 1 )*INCX ). The value of sumsq is */ -/* > assumed to be non-negative and scl returns the value */ -/* > */ -/* > scl = max( scale, abs( x( i ) ) ). */ -/* > */ -/* > scale and sumsq must be supplied in SCALE and SUMSQ and */ -/* > scl and smsq are overwritten on SCALE and SUMSQ respectively. */ -/* > */ -/* > The routine makes only one pass through the vector x. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of elements to be used from the vector X. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION array, dimension (N) */ -/* > The vector for which a scaled sum of squares is computed. */ -/* > x( i ) = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > The increment between successive values of the vector X. */ -/* > INCX > 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] SCALE */ -/* > \verbatim */ -/* > SCALE is DOUBLE PRECISION */ -/* > On entry, the value scale in the equation above. */ -/* > On exit, SCALE is overwritten with scl , the scaling factor */ -/* > for the sum of squares. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] SUMSQ */ -/* > \verbatim */ -/* > SUMSQ is DOUBLE PRECISION */ -/* > On entry, the value sumsq in the equation above. */ -/* > On exit, SUMSQ is overwritten with smsq , the basic sum of */ -/* > squares from which scl has been factored out. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \date December 2016 */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int dlassq_(integer *n, doublereal *x, integer *incx, - doublereal *scale, doublereal *sumsq) +int dlassq_(integer *n, doublereal *x, integer *incx, doublereal *scale, doublereal *sumsq) { - /* System generated locals */ integer i__1, i__2; doublereal d__1; - - /* Local variables */ integer ix; doublereal absxi; extern logical disnan_(doublereal *); - - -/* -- LAPACK auxiliary routine (version 3.7.0) -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ -/* December 2016 */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --x; - - /* Function Body */ if (*n > 0) { i__1 = (*n - 1) * *incx + 1; i__2 = *incx; @@ -167,25 +17,18 @@ f"> */ absxi = (d__1 = x[ix], abs(d__1)); if (absxi > 0. || disnan_(&absxi)) { if (*scale < absxi) { -/* Computing 2nd power */ d__1 = *scale / absxi; *sumsq = *sumsq * (d__1 * d__1) + 1; *scale = absxi; } else { -/* Computing 2nd power */ d__1 = absxi / *scale; *sumsq += d__1 * d__1; } } -/* L10: */ } } return 0; - -/* End of DLASSQ */ - -} /* dlassq_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlasv2.cpp b/lib/linalg/dlasv2.cpp index 7dde3369fc..6de3269b8f 100644 --- a/lib/linalg/dlasv2.cpp +++ b/lib/linalg/dlasv2.cpp @@ -1,214 +1,25 @@ -/* fortran/dlasv2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b3 = 2.; static doublereal c_b4 = 1.; - -/* > \brief \b DLASV2 computes the singular value decomposition of a 2-by-2 triangular matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASV2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL ) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASV2 computes the singular value decomposition of a 2-by-2 */ -/* > triangular matrix */ -/* > [ F G ] */ -/* > [ 0 H ]. */ -/* > On return, abs(SSMAX) is the larger singular value, abs(SSMIN) is the */ -/* > smaller singular value, and (CSL,SNL) and (CSR,SNR) are the left and */ -/* > right singular vectors for abs(SSMAX), giving the decomposition */ -/* > */ -/* > [ CSL SNL ] [ F G ] [ CSR -SNR ] = [ SSMAX 0 ] */ -/* > [-SNL CSL ] [ 0 H ] [ SNR CSR ] [ 0 SSMIN ]. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] F */ -/* > \verbatim */ -/* > F is DOUBLE PRECISION */ -/* > The (1,1) element of the 2-by-2 matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] G */ -/* > \verbatim */ -/* > G is DOUBLE PRECISION */ -/* > The (1,2) element of the 2-by-2 matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] H */ -/* > \verbatim */ -/* > H is DOUBLE PRECISION */ -/* > The (2,2) element of the 2-by-2 matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] SSMIN */ -/* > \verbatim */ -/* > SSMIN is DOUBLE PRECISION */ -/* > abs(SSMIN) is the smaller singular value. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] SSMAX */ -/* > \verbatim */ -/* > SSMAX is DOUBLE PRECISION */ -/* > abs(SSMAX) is the larger singular value. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] SNL */ -/* > \verbatim */ -/* > SNL is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[out] CSL */ -/* > \verbatim */ -/* > CSL is DOUBLE PRECISION */ -/* > The vector (CSL, SNL) is a unit left singular vector for the */ -/* > singular value abs(SSMAX). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] SNR */ -/* > \verbatim */ -/* > SNR is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[out] CSR */ -/* > \verbatim */ -/* > CSR is DOUBLE PRECISION */ -/* > The vector (CSR, SNR) is a unit right singular vector for the */ -/* > singular value abs(SSMAX). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Any input parameter may be aliased with any output parameter. */ -/* > */ -/* > Barring over/underflow and assuming a guard digit in subtraction, all */ -/* > output quantities are correct to within a few units in the last */ -/* > place (ulps). */ -/* > */ -/* > In IEEE arithmetic, the code works correctly if one matrix element is */ -/* > infinite. */ -/* > */ -/* > Overflow will not occur unless the largest singular value itself */ -/* > overflows or is within a few ulps of overflow. (On machines with */ -/* > partial overflow, like the Cray, overflow may occur if the largest */ -/* > singular value is within a factor of 2 of overflow.) */ -/* > */ -/* > Underflow is harmless if underflow is gradual. Otherwise, results */ -/* > may correspond to a matrix modified by perturbations of size near */ -/* > the underflow threshold. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlasv2_(doublereal *f, doublereal *g, doublereal *h__, - doublereal *ssmin, doublereal *ssmax, doublereal *snr, doublereal * - csr, doublereal *snl, doublereal *csl) +int dlasv2_(doublereal *f, doublereal *g, doublereal *h__, doublereal *ssmin, doublereal *ssmax, + doublereal *snr, doublereal *csr, doublereal *snl, doublereal *csl) { - /* System generated locals */ doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); - - /* Local variables */ - doublereal a, d__, l, m, r__, s, t, fa, ga, ha, ft, gt, ht, mm, tt, clt, - crt, slt, srt; + doublereal a, d__, l, m, r__, s, t, fa, ga, ha, ft, gt, ht, mm, tt, clt, crt, slt, srt; integer pmax; doublereal temp; logical swap; doublereal tsign; extern doublereal dlamch_(char *, ftnlen); logical gasmal; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - ft = *f; fa = abs(ft); ht = *h__; ha = abs(*h__); - -/* PMAX points to the maximum absolute element of matrix */ -/* PMAX = 1 if F largest in absolute values */ -/* PMAX = 2 if G largest in absolute values */ -/* PMAX = 3 if H largest in absolute values */ - pmax = 1; swap = ha > fa; if (swap) { @@ -219,16 +30,10 @@ f"> */ temp = fa; fa = ha; ha = temp; - -/* Now FA .ge. HA */ - } gt = *g; ga = abs(gt); if (ga == 0.) { - -/* Diagonal matrix */ - *ssmin = ha; *ssmax = fa; clt = 1.; @@ -240,9 +45,6 @@ f"> */ if (ga > fa) { pmax = 2; if (fa / ga < dlamch_((char *)"EPS", (ftnlen)3)) { - -/* Case of very large GA */ - gasmal = FALSE_; *ssmax = ga; if (ha > 1.) { @@ -257,53 +59,26 @@ f"> */ } } if (gasmal) { - -/* Normal case */ - d__ = fa - ha; if (d__ == fa) { - -/* Copes with infinite F or H */ - l = 1.; } else { l = d__ / fa; } - -/* Note that 0 .le. L .le. 1 */ - m = gt / ft; - -/* Note that abs(M) .le. 1/macheps */ - t = 2. - l; - -/* Note that T .ge. 1 */ - mm = m * m; tt = t * t; s = sqrt(tt + mm); - -/* Note that 1 .le. S .le. 1 + 1/macheps */ - if (l == 0.) { r__ = abs(m); } else { r__ = sqrt(l * l + mm); } - -/* Note that 0 .le. R .le. 1 + 1/macheps */ - a = (s + r__) * .5; - -/* Note that 1 .le. A .le. 1 + abs(M) */ - *ssmin = ha / a; *ssmax = fa * a; if (mm == 0.) { - -/* Note that M is very tiny */ - if (l == 0.) { t = d_lmp_sign(&c_b3, &ft) * d_lmp_sign(&c_b4, >); } else { @@ -330,9 +105,6 @@ f"> */ *csr = crt; *snr = srt; } - -/* Correct signs of SSMAX and SSMIN */ - if (pmax == 1) { tsign = d_lmp_sign(&c_b4, csr) * d_lmp_sign(&c_b4, csl) * d_lmp_sign(&c_b4, f); } @@ -346,11 +118,7 @@ f"> */ d__1 = tsign * d_lmp_sign(&c_b4, f) * d_lmp_sign(&c_b4, h__); *ssmin = d_lmp_sign(ssmin, &d__1); return 0; - -/* End of DLASV2 */ - -} /* dlasv2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlaswp.cpp b/lib/linalg/dlaswp.cpp index 05d911f30c..d52226729f 100644 --- a/lib/linalg/dlaswp.cpp +++ b/lib/linalg/dlaswp.cpp @@ -1,172 +1,17 @@ -/* fortran/dlaswp.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DLASWP performs a series of row interchanges on a general rectangular matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLASWP + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLASWP( N, A, LDA, K1, K2, IPIV, INCX ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX, K1, K2, LDA, N */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IPIV( * ) */ -/* DOUBLE PRECISION A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLASWP performs a series of row interchanges on the matrix A. */ -/* > One row interchange is initiated for each of rows K1 through K2 of A. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the matrix of column dimension N to which the row */ -/* > interchanges will be applied. */ -/* > On exit, the permuted matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K1 */ -/* > \verbatim */ -/* > K1 is INTEGER */ -/* > The first element of IPIV for which a row interchange will */ -/* > be done. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K2 */ -/* > \verbatim */ -/* > K2 is INTEGER */ -/* > (K2-K1+1) is the number of elements of IPIV for which a row */ -/* > interchange will be done. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] IPIV */ -/* > \verbatim */ -/* > IPIV is INTEGER array, dimension (K1+(K2-K1)*abs(INCX)) */ -/* > The vector of pivot indices. Only the elements in positions */ -/* > K1 through K1+(K2-K1)*abs(INCX) of IPIV are accessed. */ -/* > IPIV(K1+(K-K1)*abs(INCX)) = L implies rows K and L are to be */ -/* > interchanged. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > The increment between successive values of IPIV. If INCX */ -/* > is negative, the pivots are applied in reverse order. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Modified by */ -/* > R. C. Whaley, Computer Science Dept., Univ. of Tenn., Knoxville, USA */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlaswp_(integer *n, doublereal *a, integer *lda, integer - *k1, integer *k2, integer *ipiv, integer *incx) +int dlaswp_(integer *n, doublereal *a, integer *lda, integer *k1, integer *k2, integer *ipiv, + integer *incx) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; - - /* Local variables */ integer i__, j, k, i1, i2, n32, ip, ix, ix0, inc; doublereal temp; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Interchange row I with row IPIV(K1+(I-K1)*abs(INCX)) for each of rows */ -/* K1 through K2. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --ipiv; - - /* Function Body */ if (*incx > 0) { ix0 = *k1; i1 = *k1; @@ -180,7 +25,6 @@ f"> */ } else { return 0; } - n32 = *n / 32 << 5; if (n32 != 0) { i__1 = n32; @@ -188,8 +32,7 @@ f"> */ ix = ix0; i__2 = i2; i__3 = inc; - for (i__ = i1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) - { + for (i__ = i1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3) { ip = ipiv[ix]; if (ip != i__) { i__4 = j + 31; @@ -197,13 +40,10 @@ f"> */ temp = a[i__ + k * a_dim1]; a[i__ + k * a_dim1] = a[ip + k * a_dim1]; a[ip + k * a_dim1] = temp; -/* L10: */ } } ix += *incx; -/* L20: */ } -/* L30: */ } } if (n32 != *n) { @@ -219,20 +59,13 @@ f"> */ temp = a[i__ + k * a_dim1]; a[i__ + k * a_dim1] = a[ip + k * a_dim1]; a[ip + k * a_dim1] = temp; -/* L40: */ } } ix += *incx; -/* L50: */ } } - return 0; - -/* End of DLASWP */ - -} /* dlaswp_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlatrd.cpp b/lib/linalg/dlatrd.cpp index 74fc5fcc87..32b131c233 100644 --- a/lib/linalg/dlatrd.cpp +++ b/lib/linalg/dlatrd.cpp @@ -1,278 +1,26 @@ -/* fortran/dlatrd.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b5 = -1.; static doublereal c_b6 = 1.; static integer c__1 = 1; static doublereal c_b16 = 0.; - -/* > \brief \b DLATRD reduces the first nb rows and columns of a symmetric/Hermitian matrix A to real tridiago -nal form by an orthogonal similarity transformation. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLATRD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER LDA, LDW, N, NB */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), E( * ), TAU( * ), W( LDW, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLATRD reduces NB rows and columns of a real symmetric matrix A to */ -/* > symmetric tridiagonal form by an orthogonal similarity */ -/* > transformation Q**T * A * Q, and returns the matrices V and W which are */ -/* > needed to apply the transformation to the unreduced part of A. */ -/* > */ -/* > If UPLO = 'U', DLATRD reduces the last NB rows and columns of a */ -/* > matrix, of which the upper triangle is supplied; */ -/* > if UPLO = 'L', DLATRD reduces the first NB rows and columns of a */ -/* > matrix, of which the lower triangle is supplied. */ -/* > */ -/* > This is an auxiliary routine called by DSYTRD. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies whether the upper or lower triangular part of the */ -/* > symmetric matrix A is stored: */ -/* > = 'U': Upper triangular */ -/* > = 'L': Lower triangular */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NB */ -/* > \verbatim */ -/* > NB is INTEGER */ -/* > The number of rows and columns to be reduced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ -/* > n-by-n upper triangular part of A contains the upper */ -/* > triangular part of the matrix A, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading n-by-n lower triangular part of A contains the lower */ -/* > triangular part of the matrix A, and the strictly upper */ -/* > triangular part of A is not referenced. */ -/* > On exit: */ -/* > if UPLO = 'U', the last NB columns have been reduced to */ -/* > tridiagonal form, with the diagonal elements overwriting */ -/* > the diagonal elements of A; the elements above the diagonal */ -/* > with the array TAU, represent the orthogonal matrix Q as a */ -/* > product of elementary reflectors; */ -/* > if UPLO = 'L', the first NB columns have been reduced to */ -/* > tridiagonal form, with the diagonal elements overwriting */ -/* > the diagonal elements of A; the elements below the diagonal */ -/* > with the array TAU, represent the orthogonal matrix Q as a */ -/* > product of elementary reflectors. */ -/* > See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= (1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal */ -/* > elements of the last NB columns of the reduced matrix; */ -/* > if UPLO = 'L', E(1:nb) contains the subdiagonal elements of */ -/* > the first NB columns of the reduced matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (N-1) */ -/* > The scalar factors of the elementary reflectors, stored in */ -/* > TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'. */ -/* > See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] W */ -/* > \verbatim */ -/* > W is DOUBLE PRECISION array, dimension (LDW,NB) */ -/* > The n-by-nb matrix W required to update the unreduced part */ -/* > of A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDW */ -/* > \verbatim */ -/* > LDW is INTEGER */ -/* > The leading dimension of the array W. LDW >= max(1,N). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > If UPLO = 'U', the matrix Q is represented as a product of elementary */ -/* > reflectors */ -/* > */ -/* > Q = H(n) H(n-1) . . . H(n-nb+1). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**T */ -/* > */ -/* > where tau is a real scalar, and v is a real vector with */ -/* > v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), */ -/* > and tau in TAU(i-1). */ -/* > */ -/* > If UPLO = 'L', the matrix Q is represented as a product of elementary */ -/* > reflectors */ -/* > */ -/* > Q = H(1) H(2) . . . H(nb). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**T */ -/* > */ -/* > where tau is a real scalar, and v is a real vector with */ -/* > v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), */ -/* > and tau in TAU(i). */ -/* > */ -/* > The elements of the vectors v together form the n-by-nb matrix V */ -/* > which is needed, with W, to apply the transformation to the unreduced */ -/* > part of the matrix, using a symmetric rank-2k update of the form: */ -/* > A := A - V*W**T - W*V**T. */ -/* > */ -/* > The contents of A on exit are illustrated by the following examples */ -/* > with n = 5 and nb = 2: */ -/* > */ -/* > if UPLO = 'U': if UPLO = 'L': */ -/* > */ -/* > ( a a a v4 v5 ) ( d ) */ -/* > ( a a v4 v5 ) ( 1 d ) */ -/* > ( a 1 v5 ) ( v1 1 a ) */ -/* > ( d 1 ) ( v1 v2 a a ) */ -/* > ( d ) ( v1 v2 a a a ) */ -/* > */ -/* > where d denotes a diagonal element of the reduced matrix, a denotes */ -/* > an element of the original matrix that is unchanged, and vi denotes */ -/* > an element of the vector defining H(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlatrd_(char *uplo, integer *n, integer *nb, doublereal * - a, integer *lda, doublereal *e, doublereal *tau, doublereal *w, - integer *ldw, ftnlen uplo_len) +int dlatrd_(char *uplo, integer *n, integer *nb, doublereal *a, integer *lda, doublereal *e, + doublereal *tau, doublereal *w, integer *ldw, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, iw; - extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, - integer *); + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal alpha; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen), daxpy_(integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *), - dsymv_(char *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - ftnlen), dlarfg_(integer *, doublereal *, doublereal *, integer *, - doublereal *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick return if possible */ - - /* Parameter adjustments */ + extern int dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen), + daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), + dsymv_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen), + dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -281,165 +29,119 @@ f"> */ w_dim1 = *ldw; w_offset = 1 + w_dim1; w -= w_offset; - - /* Function Body */ if (*n <= 0) { return 0; } - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - -/* Reduce last NB columns of upper triangle */ - i__1 = *n - *nb + 1; for (i__ = *n; i__ >= i__1; --i__) { iw = i__ - *n + *nb; if (i__ < *n) { - -/* Update A(1:i,i) */ - i__2 = *n - i__; - dgemv_((char *)"No transpose", &i__, &i__2, &c_b5, &a[(i__ + 1) * - a_dim1 + 1], lda, &w[i__ + (iw + 1) * w_dim1], ldw, & - c_b6, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__, &i__2, &c_b5, &a[(i__ + 1) * a_dim1 + 1], lda, + &w[i__ + (iw + 1) * w_dim1], ldw, &c_b6, &a[i__ * a_dim1 + 1], &c__1, + (ftnlen)12); i__2 = *n - i__; - dgemv_((char *)"No transpose", &i__, &i__2, &c_b5, &w[(iw + 1) * - w_dim1 + 1], ldw, &a[i__ + (i__ + 1) * a_dim1], lda, & - c_b6, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__, &i__2, &c_b5, &w[(iw + 1) * w_dim1 + 1], ldw, + &a[i__ + (i__ + 1) * a_dim1], lda, &c_b6, &a[i__ * a_dim1 + 1], &c__1, + (ftnlen)12); } if (i__ > 1) { - -/* Generate elementary reflector H(i) to annihilate */ -/* A(1:i-2,i) */ - i__2 = i__ - 1; - dlarfg_(&i__2, &a[i__ - 1 + i__ * a_dim1], &a[i__ * a_dim1 + - 1], &c__1, &tau[i__ - 1]); + dlarfg_(&i__2, &a[i__ - 1 + i__ * a_dim1], &a[i__ * a_dim1 + 1], &c__1, + &tau[i__ - 1]); e[i__ - 1] = a[i__ - 1 + i__ * a_dim1]; a[i__ - 1 + i__ * a_dim1] = 1.; - -/* Compute W(1:i-1,i) */ - i__2 = i__ - 1; - dsymv_((char *)"Upper", &i__2, &c_b6, &a[a_offset], lda, &a[i__ * - a_dim1 + 1], &c__1, &c_b16, &w[iw * w_dim1 + 1], & - c__1, (ftnlen)5); + dsymv_((char *)"Upper", &i__2, &c_b6, &a[a_offset], lda, &a[i__ * a_dim1 + 1], &c__1, + &c_b16, &w[iw * w_dim1 + 1], &c__1, (ftnlen)5); if (i__ < *n) { i__2 = i__ - 1; i__3 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &w[(iw + 1) * - w_dim1 + 1], ldw, &a[i__ * a_dim1 + 1], &c__1, & - c_b16, &w[i__ + 1 + iw * w_dim1], &c__1, (ftnlen) - 9); + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &w[(iw + 1) * w_dim1 + 1], ldw, + &a[i__ * a_dim1 + 1], &c__1, &c_b16, &w[i__ + 1 + iw * w_dim1], &c__1, + (ftnlen)9); i__2 = i__ - 1; i__3 = *n - i__; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[(i__ + 1) * - a_dim1 + 1], lda, &w[i__ + 1 + iw * w_dim1], & - c__1, &c_b6, &w[iw * w_dim1 + 1], &c__1, (ftnlen) - 12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[(i__ + 1) * a_dim1 + 1], lda, + &w[i__ + 1 + iw * w_dim1], &c__1, &c_b6, &w[iw * w_dim1 + 1], &c__1, + (ftnlen)12); i__2 = i__ - 1; i__3 = *n - i__; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &a[(i__ + 1) * - a_dim1 + 1], lda, &a[i__ * a_dim1 + 1], &c__1, & - c_b16, &w[i__ + 1 + iw * w_dim1], &c__1, (ftnlen) - 9); + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &a[(i__ + 1) * a_dim1 + 1], lda, + &a[i__ * a_dim1 + 1], &c__1, &c_b16, &w[i__ + 1 + iw * w_dim1], &c__1, + (ftnlen)9); i__2 = i__ - 1; i__3 = *n - i__; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[(iw + 1) * - w_dim1 + 1], ldw, &w[i__ + 1 + iw * w_dim1], & - c__1, &c_b6, &w[iw * w_dim1 + 1], &c__1, (ftnlen) - 12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[(iw + 1) * w_dim1 + 1], ldw, + &w[i__ + 1 + iw * w_dim1], &c__1, &c_b6, &w[iw * w_dim1 + 1], &c__1, + (ftnlen)12); } i__2 = i__ - 1; dscal_(&i__2, &tau[i__ - 1], &w[iw * w_dim1 + 1], &c__1); i__2 = i__ - 1; - alpha = tau[i__ - 1] * -.5 * ddot_(&i__2, &w[iw * w_dim1 + 1], - &c__1, &a[i__ * a_dim1 + 1], &c__1); + alpha = tau[i__ - 1] * -.5 * + ddot_(&i__2, &w[iw * w_dim1 + 1], &c__1, &a[i__ * a_dim1 + 1], &c__1); i__2 = i__ - 1; - daxpy_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &w[iw * - w_dim1 + 1], &c__1); + daxpy_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &w[iw * w_dim1 + 1], &c__1); } - -/* L10: */ } } else { - -/* Reduce first NB columns of lower triangle */ - i__1 = *nb; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Update A(i:n,i) */ - i__2 = *n - i__ + 1; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + a_dim1], lda, - &w[i__ + w_dim1], ldw, &c_b6, &a[i__ + i__ * a_dim1], & - c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + a_dim1], lda, &w[i__ + w_dim1], + ldw, &c_b6, &a[i__ + i__ * a_dim1], &c__1, (ftnlen)12); i__2 = *n - i__ + 1; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[i__ + w_dim1], ldw, - &a[i__ + a_dim1], lda, &c_b6, &a[i__ + i__ * a_dim1], & - c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[i__ + w_dim1], ldw, &a[i__ + a_dim1], + lda, &c_b6, &a[i__ + i__ * a_dim1], &c__1, (ftnlen)12); if (i__ < *n) { - -/* Generate elementary reflector H(i) to annihilate */ -/* A(i+2:n,i) */ - i__2 = *n - i__; -/* Computing MIN */ i__3 = i__ + 2; - dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*n) + - i__ * a_dim1], &c__1, &tau[i__]); + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3, *n) + i__ * a_dim1], &c__1, + &tau[i__]); e[i__] = a[i__ + 1 + i__ * a_dim1]; a[i__ + 1 + i__ * a_dim1] = 1.; - -/* Compute W(i+1:n,i) */ - i__2 = *n - i__; - dsymv_((char *)"Lower", &i__2, &c_b6, &a[i__ + 1 + (i__ + 1) * a_dim1] - , lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ - i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)5); + dsymv_((char *)"Lower", &i__2, &c_b6, &a[i__ + 1 + (i__ + 1) * a_dim1], lda, + &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[i__ + 1 + i__ * w_dim1], &c__1, + (ftnlen)5); i__2 = *n - i__; i__3 = i__ - 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &w[i__ + 1 + w_dim1], - ldw, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ - i__ * w_dim1 + 1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &w[i__ + 1 + w_dim1], ldw, + &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[i__ * w_dim1 + 1], &c__1, + (ftnlen)9); i__2 = *n - i__; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + - a_dim1], lda, &w[i__ * w_dim1 + 1], &c__1, &c_b6, &w[ - i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &a[i__ + 1 + a_dim1], lda, + &w[i__ * w_dim1 + 1], &c__1, &c_b6, &w[i__ + 1 + i__ * w_dim1], &c__1, + (ftnlen)12); i__2 = *n - i__; i__3 = i__ - 1; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &a[i__ + 1 + a_dim1], - lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[ - i__ * w_dim1 + 1], &c__1, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b6, &a[i__ + 1 + a_dim1], lda, + &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b16, &w[i__ * w_dim1 + 1], &c__1, + (ftnlen)9); i__2 = *n - i__; i__3 = i__ - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[i__ + 1 + - w_dim1], ldw, &w[i__ * w_dim1 + 1], &c__1, &c_b6, &w[ - i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b5, &w[i__ + 1 + w_dim1], ldw, + &w[i__ * w_dim1 + 1], &c__1, &c_b6, &w[i__ + 1 + i__ * w_dim1], &c__1, + (ftnlen)12); i__2 = *n - i__; dscal_(&i__2, &tau[i__], &w[i__ + 1 + i__ * w_dim1], &c__1); i__2 = *n - i__; - alpha = tau[i__] * -.5 * ddot_(&i__2, &w[i__ + 1 + i__ * - w_dim1], &c__1, &a[i__ + 1 + i__ * a_dim1], &c__1); + alpha = tau[i__] * -.5 * + ddot_(&i__2, &w[i__ + 1 + i__ * w_dim1], &c__1, &a[i__ + 1 + i__ * a_dim1], + &c__1); i__2 = *n - i__; - daxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &w[ - i__ + 1 + i__ * w_dim1], &c__1); + daxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &w[i__ + 1 + i__ * w_dim1], + &c__1); } - -/* L20: */ } } - return 0; - -/* End of DLATRD */ - -} /* dlatrd_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dlatrs.cpp b/lib/linalg/dlatrs.cpp index fc97690682..bd2af669dc 100644 --- a/lib/linalg/dlatrs.cpp +++ b/lib/linalg/dlatrs.cpp @@ -1,356 +1,62 @@ -/* fortran/dlatrs.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static doublereal c_b46 = .5; - -/* > \brief \b DLATRS solves a triangular system of equations with the scale factor set to prevent overflow. -*/ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DLATRS + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE, */ -/* CNORM, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER DIAG, NORMIN, TRANS, UPLO */ -/* INTEGER INFO, LDA, N */ -/* DOUBLE PRECISION SCALE */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), CNORM( * ), X( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DLATRS solves one of the triangular systems */ -/* > */ -/* > A *x = s*b or A**T *x = s*b */ -/* > */ -/* > with scaling to prevent overflow. Here A is an upper or lower */ -/* > triangular matrix, A**T denotes the transpose of A, x and b are */ -/* > n-element vectors, and s is a scaling factor, usually less than */ -/* > or equal to 1, chosen so that the components of x will be less than */ -/* > the overflow threshold. If the unscaled problem will not cause */ -/* > overflow, the Level 2 BLAS routine DTRSV is called. If the matrix A */ -/* > is singular (A(j,j) = 0 for some j), then s is set to 0 and a */ -/* > non-trivial solution to A*x = 0 is returned. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies whether the matrix A is upper or lower triangular. */ -/* > = 'U': Upper triangular */ -/* > = 'L': Lower triangular */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > Specifies the operation applied to A. */ -/* > = 'N': Solve A * x = s*b (No transpose) */ -/* > = 'T': Solve A**T* x = s*b (Transpose) */ -/* > = 'C': Solve A**T* x = s*b (Conjugate transpose = Transpose) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIAG */ -/* > \verbatim */ -/* > DIAG is CHARACTER*1 */ -/* > Specifies whether or not the matrix A is unit triangular. */ -/* > = 'N': Non-unit triangular */ -/* > = 'U': Unit triangular */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NORMIN */ -/* > \verbatim */ -/* > NORMIN is CHARACTER*1 */ -/* > Specifies whether CNORM has been set or not. */ -/* > = 'Y': CNORM contains the column norms on entry */ -/* > = 'N': CNORM is not set on entry. On exit, the norms will */ -/* > be computed and stored in CNORM. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > The triangular matrix A. If UPLO = 'U', the leading n by n */ -/* > upper triangular part of the array A contains the upper */ -/* > triangular matrix, and the strictly lower triangular part of */ -/* > A is not referenced. If UPLO = 'L', the leading n by n lower */ -/* > triangular part of the array A contains the lower triangular */ -/* > matrix, and the strictly upper triangular part of A is not */ -/* > referenced. If DIAG = 'U', the diagonal elements of A are */ -/* > also not referenced and are assumed to be 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max (1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the right hand side b of the triangular system. */ -/* > On exit, X is overwritten by the solution vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] SCALE */ -/* > \verbatim */ -/* > SCALE is DOUBLE PRECISION */ -/* > The scaling factor s for the triangular system */ -/* > A * x = s*b or A**T* x = s*b. */ -/* > If SCALE = 0, the matrix A is singular or badly scaled, and */ -/* > the vector x is an exact or approximate solution to A*x = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] CNORM */ -/* > \verbatim */ -/* > CNORM is DOUBLE PRECISION array, dimension (N) */ -/* > */ -/* > If NORMIN = 'Y', CNORM is an input argument and CNORM(j) */ -/* > contains the norm of the off-diagonal part of the j-th column */ -/* > of A. If TRANS = 'N', CNORM(j) must be greater than or equal */ -/* > to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j) */ -/* > must be greater than or equal to the 1-norm. */ -/* > */ -/* > If NORMIN = 'N', CNORM is an output argument and CNORM(j) */ -/* > returns the 1-norm of the offdiagonal part of the j-th column */ -/* > of A. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -k, the k-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > A rough bound on x is computed; if that is less than overflow, DTRSV */ -/* > is called, otherwise, specific code is used which checks for possible */ -/* > overflow or divide-by-zero at every operation. */ -/* > */ -/* > A columnwise scheme is used for solving A*x = b. The basic algorithm */ -/* > if A is lower triangular is */ -/* > */ -/* > x[1:n] := b[1:n] */ -/* > for j = 1, ..., n */ -/* > x(j) := x(j) / A(j,j) */ -/* > x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j] */ -/* > end */ -/* > */ -/* > Define bounds on the components of x after j iterations of the loop: */ -/* > M(j) = bound on x[1:j] */ -/* > G(j) = bound on x[j+1:n] */ -/* > Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}. */ -/* > */ -/* > Then for iteration j+1 we have */ -/* > M(j+1) <= G(j) / | A(j+1,j+1) | */ -/* > G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] | */ -/* > <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | ) */ -/* > */ -/* > where CNORM(j+1) is greater than or equal to the infinity-norm of */ -/* > column j+1 of A, not counting the diagonal. Hence */ -/* > */ -/* > G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | ) */ -/* > 1<=i<=j */ -/* > and */ -/* > */ -/* > |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| ) */ -/* > 1<=i< j */ -/* > */ -/* > Since |x(j)| <= M(j), we use the Level 2 BLAS routine DTRSV if the */ -/* > reciprocal of the largest M(j), j=1,..,n, is larger than */ -/* > max(underflow, 1/overflow). */ -/* > */ -/* > The bound on x(j) is also used to determine when a step in the */ -/* > columnwise method can be performed without fear of overflow. If */ -/* > the computed bound is greater than a large constant, x is scaled to */ -/* > prevent overflow, but if the bound overflows, x is set to 0, x(j) to */ -/* > 1, and scale to 0, and a non-trivial solution to A*x = 0 is found. */ -/* > */ -/* > Similarly, a row-wise scheme is used to solve A**T*x = b. The basic */ -/* > algorithm for A upper triangular is */ -/* > */ -/* > for j = 1, ..., n */ -/* > x(j) := ( b(j) - A[1:j-1,j]**T * x[1:j-1] ) / A(j,j) */ -/* > end */ -/* > */ -/* > We simultaneously compute two bounds */ -/* > G(j) = bound on ( b(i) - A[1:i-1,i]**T * x[1:i-1] ), 1<=i<=j */ -/* > M(j) = bound on x(i), 1<=i<=j */ -/* > */ -/* > The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we */ -/* > add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1. */ -/* > Then the bound on x(j) is */ -/* > */ -/* > M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) | */ -/* > */ -/* > <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| ) */ -/* > 1<=i<=j */ -/* > */ -/* > and we can safely call DTRSV if 1/M(n) and 1/G(n) are both greater */ -/* > than max(underflow, 1/overflow). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dlatrs_(char *uplo, char *trans, char *diag, char * - normin, integer *n, doublereal *a, integer *lda, doublereal *x, - doublereal *scale, doublereal *cnorm, integer *info, ftnlen uplo_len, - ftnlen trans_len, ftnlen diag_len, ftnlen normin_len) +int dlatrs_(char *uplo, char *trans, char *diag, char *normin, integer *n, doublereal *a, + integer *lda, doublereal *x, doublereal *scale, doublereal *cnorm, integer *info, + ftnlen uplo_len, ftnlen trans_len, ftnlen diag_len, ftnlen normin_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1, d__2, d__3; - - /* Local variables */ integer i__, j; doublereal xj, rec, tjj; integer jinc; - extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, - integer *); + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal xbnd; integer imax; doublereal tmax, tjjs, xmax, grow, sumj; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal tscal, uscal; extern doublereal dasum_(integer *, doublereal *, integer *); integer jlast; - extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *); + extern int daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; - extern /* Subroutine */ int dtrsv_(char *, char *, char *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen); - extern doublereal dlamch_(char *, ftnlen), dlange_(char *, integer *, - integer *, doublereal *, integer *, doublereal *, ftnlen); + extern int dtrsv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen); + extern doublereal dlamch_(char *, ftnlen), + dlange_(char *, integer *, integer *, doublereal *, integer *, doublereal *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); doublereal bignum; logical notran; integer jfirst; doublereal smlnum; logical nounit; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --cnorm; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); - -/* Test the input parameters. */ - - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && ! - lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + } else if (!notran && !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { *info = -2; - } else if (! nounit && ! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { + } else if (!nounit && !lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { *info = -3; - } else if (! lsame_(normin, (char *)"Y", (ftnlen)1, (ftnlen)1) && ! lsame_(normin, - (char *)"N", (ftnlen)1, (ftnlen)1)) { + } else if (!lsame_(normin, (char *)"Y", (ftnlen)1, (ftnlen)1) && + !lsame_(normin, (char *)"N", (ftnlen)1, (ftnlen)1)) { *info = -4; } else if (*n < 0) { *info = -5; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -7; } if (*info != 0) { @@ -358,96 +64,54 @@ f"> */ xerbla_((char *)"DLATRS", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - *scale = 1.; if (*n == 0) { return 0; } - -/* Determine machine dependent parameters to control overflow. */ - - smlnum = dlamch_((char *)"Safe minimum", (ftnlen)12) / dlamch_((char *)"Precision", ( - ftnlen)9); + smlnum = dlamch_((char *)"Safe minimum", (ftnlen)12) / dlamch_((char *)"Precision", (ftnlen)9); bignum = 1. / smlnum; - if (lsame_(normin, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Compute the 1-norm of each column, not including the diagonal. */ - if (upper) { - -/* A is upper triangular. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; cnorm[j] = dasum_(&i__2, &a[j * a_dim1 + 1], &c__1); -/* L10: */ } } else { - -/* A is lower triangular. */ - i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = *n - j; cnorm[j] = dasum_(&i__2, &a[j + 1 + j * a_dim1], &c__1); -/* L20: */ } cnorm[*n] = 0.; } } - -/* Scale the column norms by TSCAL if the maximum element in CNORM is */ -/* greater than BIGNUM. */ - imax = idamax_(n, &cnorm[1], &c__1); tmax = cnorm[imax]; if (tmax <= bignum) { tscal = 1.; } else { - -/* Avoid NaN generation if entries in CNORM exceed the */ -/* overflow threshold */ - if (tmax <= dlamch_((char *)"Overflow", (ftnlen)8)) { -/* Case 1: All entries in CNORM are valid floating-point numbers */ tscal = 1. / (smlnum * tmax); dscal_(n, &tscal, &cnorm[1], &c__1); } else { -/* Case 2: At least one column norm of A cannot be represented */ -/* as floating-point number. Find the offdiagonal entry A( I, J ) */ -/* with the largest absolute value. If this entry is not +/- Infinity, */ -/* use this value as TSCAL. */ tmax = 0.; if (upper) { - -/* A is upper triangular. */ - i__1 = *n; for (j = 2; j <= i__1; ++j) { -/* Computing MAX */ i__2 = j - 1; - d__1 = dlange_((char *)"M", &i__2, &c__1, &a[j * a_dim1 + 1], & - c__1, &sumj, (ftnlen)1); - tmax = max(d__1,tmax); + d__1 = dlange_((char *)"M", &i__2, &c__1, &a[j * a_dim1 + 1], &c__1, &sumj, (ftnlen)1); + tmax = max(d__1, tmax); } } else { - -/* A is lower triangular. */ - i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { -/* Computing MAX */ i__2 = *n - j; - d__1 = dlange_((char *)"M", &i__2, &c__1, &a[j + 1 + j * a_dim1], - &c__1, &sumj, (ftnlen)1); - tmax = max(d__1,tmax); + d__1 = + dlange_((char *)"M", &i__2, &c__1, &a[j + 1 + j * a_dim1], &c__1, &sumj, (ftnlen)1); + tmax = max(d__1, tmax); } } - if (tmax <= dlamch_((char *)"Overflow", (ftnlen)8)) { tscal = 1. / (smlnum * tmax); i__1 = *n; @@ -455,44 +119,31 @@ f"> */ if (cnorm[j] <= dlamch_((char *)"Overflow", (ftnlen)8)) { cnorm[j] *= tscal; } else { -/* Recompute the 1-norm without introducing Infinity */ -/* in the summation */ cnorm[j] = 0.; if (upper) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { - cnorm[j] += tscal * (d__1 = a[i__ + j * - a_dim1], abs(d__1)); + cnorm[j] += tscal * (d__1 = a[i__ + j * a_dim1], abs(d__1)); } } else { i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { - cnorm[j] += tscal * (d__1 = a[i__ + j * - a_dim1], abs(d__1)); + cnorm[j] += tscal * (d__1 = a[i__ + j * a_dim1], abs(d__1)); } } } } } else { -/* At least one entry of A is not a valid floating-point entry. */ -/* Rely on TRSV to propagate Inf and NaN. */ - dtrsv_(uplo, trans, diag, n, &a[a_offset], lda, &x[1], &c__1, - (ftnlen)1, (ftnlen)1, (ftnlen)1); + dtrsv_(uplo, trans, diag, n, &a[a_offset], lda, &x[1], &c__1, (ftnlen)1, (ftnlen)1, + (ftnlen)1); return 0; } } } - -/* Compute a bound on the computed solution vector to see if the */ -/* Level 2 BLAS routine DTRSV can be used. */ - j = idamax_(n, &x[1], &c__1); xmax = (d__1 = x[j], abs(d__1)); xbnd = xmax; if (notran) { - -/* Compute the growth in A * x = b. */ - if (upper) { jfirst = *n; jlast = 1; @@ -502,83 +153,43 @@ f"> */ jlast = *n; jinc = 1; } - if (tscal != 1.) { grow = 0.; goto L50; } - if (nounit) { - -/* A is non-unit triangular. */ - -/* Compute GROW = 1/G(j) and XBND = 1/M(j). */ -/* Initially, G(0) = max{x(i), i=1,...,n}. */ - - grow = 1. / max(xbnd,smlnum); + grow = 1. / max(xbnd, smlnum); xbnd = grow; i__1 = jlast; i__2 = jinc; for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { - -/* Exit the loop if the growth factor is too small. */ - if (grow <= smlnum) { goto L50; } - -/* M(j) = G(j-1) / abs(A(j,j)) */ - tjj = (d__1 = a[j + j * a_dim1], abs(d__1)); -/* Computing MIN */ - d__1 = xbnd, d__2 = min(1.,tjj) * grow; - xbnd = min(d__1,d__2); + d__1 = xbnd, d__2 = min(1., tjj) * grow; + xbnd = min(d__1, d__2); if (tjj + cnorm[j] >= smlnum) { - -/* G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) ) */ - grow *= tjj / (tjj + cnorm[j]); } else { - -/* G(j) could overflow, set GROW to 0. */ - grow = 0.; } -/* L30: */ } grow = xbnd; } else { - -/* A is unit triangular. */ - -/* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. */ - -/* Computing MIN */ - d__1 = 1., d__2 = 1. / max(xbnd,smlnum); - grow = min(d__1,d__2); + d__1 = 1., d__2 = 1. / max(xbnd, smlnum); + grow = min(d__1, d__2); i__2 = jlast; i__1 = jinc; for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { - -/* Exit the loop if the growth factor is too small. */ - if (grow <= smlnum) { goto L50; } - -/* G(j) = G(j-1)*( 1 + CNORM(j) ) */ - grow *= 1. / (cnorm[j] + 1.); -/* L40: */ } } -L50: - - ; + L50:; } else { - -/* Compute the growth in A**T * x = b. */ - if (upper) { jfirst = 1; jlast = *n; @@ -588,108 +199,56 @@ L50: jlast = 1; jinc = -1; } - if (tscal != 1.) { grow = 0.; goto L80; } - if (nounit) { - -/* A is non-unit triangular. */ - -/* Compute GROW = 1/G(j) and XBND = 1/M(j). */ -/* Initially, M(0) = max{x(i), i=1,...,n}. */ - - grow = 1. / max(xbnd,smlnum); + grow = 1. / max(xbnd, smlnum); xbnd = grow; i__1 = jlast; i__2 = jinc; for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { - -/* Exit the loop if the growth factor is too small. */ - if (grow <= smlnum) { goto L80; } - -/* G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) ) */ - xj = cnorm[j] + 1.; -/* Computing MIN */ d__1 = grow, d__2 = xbnd / xj; - grow = min(d__1,d__2); - -/* M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j)) */ - + grow = min(d__1, d__2); tjj = (d__1 = a[j + j * a_dim1], abs(d__1)); if (xj > tjj) { xbnd *= tjj / xj; } -/* L60: */ } - grow = min(grow,xbnd); + grow = min(grow, xbnd); } else { - -/* A is unit triangular. */ - -/* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. */ - -/* Computing MIN */ - d__1 = 1., d__2 = 1. / max(xbnd,smlnum); - grow = min(d__1,d__2); + d__1 = 1., d__2 = 1. / max(xbnd, smlnum); + grow = min(d__1, d__2); i__2 = jlast; i__1 = jinc; for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { - -/* Exit the loop if the growth factor is too small. */ - if (grow <= smlnum) { goto L80; } - -/* G(j) = ( 1 + CNORM(j) )*G(j-1) */ - xj = cnorm[j] + 1.; grow /= xj; -/* L70: */ } } -L80: - ; + L80:; } - if (grow * tscal > smlnum) { - -/* Use the Level 2 BLAS solve if the reciprocal of the bound on */ -/* elements of X is not too small. */ - - dtrsv_(uplo, trans, diag, n, &a[a_offset], lda, &x[1], &c__1, (ftnlen) - 1, (ftnlen)1, (ftnlen)1); + dtrsv_(uplo, trans, diag, n, &a[a_offset], lda, &x[1], &c__1, (ftnlen)1, (ftnlen)1, + (ftnlen)1); } else { - -/* Use a Level 1 BLAS solve, scaling intermediate results. */ - if (xmax > bignum) { - -/* Scale X so that its components are less than or equal to */ -/* BIGNUM in absolute value. */ - *scale = bignum / xmax; dscal_(n, scale, &x[1], &c__1); xmax = bignum; } - if (notran) { - -/* Solve A * x = b */ - i__1 = jlast; i__2 = jinc; for (j = jfirst; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { - -/* Compute x(j) = b(j) / A(j,j), scaling x if necessary. */ - xj = (d__1 = x[j], abs(d__1)); if (nounit) { tjjs = a[j + j * a_dim1] * tscal; @@ -701,14 +260,8 @@ L80: } tjj = abs(tjjs); if (tjj > smlnum) { - -/* abs(A(j,j)) > SMLNUM: */ - if (tjj < 1.) { if (xj > tjj * bignum) { - -/* Scale x by 1/b(j). */ - rec = 1. / xj; dscal_(n, &rec, &x[1], &c__1); *scale *= rec; @@ -718,20 +271,9 @@ L80: x[j] /= tjjs; xj = (d__1 = x[j], abs(d__1)); } else if (tjj > 0.) { - -/* 0 < abs(A(j,j)) <= SMLNUM: */ - if (xj > tjj * bignum) { - -/* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM */ -/* to avoid overflow when dividing by A(j,j). */ - rec = tjj * bignum / xj; if (cnorm[j] > 1.) { - -/* Scale by 1/CNORM(j) to avoid overflow when */ -/* multiplying x(j) times column j. */ - rec /= cnorm[j]; } dscal_(n, &rec, &x[1], &c__1); @@ -741,93 +283,55 @@ L80: x[j] /= tjjs; xj = (d__1 = x[j], abs(d__1)); } else { - -/* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and */ -/* scale = 0, and compute a solution to A*x = 0. */ - i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { x[i__] = 0.; -/* L90: */ } x[j] = 1.; xj = 1.; *scale = 0.; xmax = 0.; } -L100: - -/* Scale x if necessary to avoid overflow when adding a */ -/* multiple of column j of A. */ - + L100: if (xj > 1.) { rec = 1. / xj; if (cnorm[j] > (bignum - xmax) * rec) { - -/* Scale x by 1/(2*abs(x(j))). */ - rec *= .5; dscal_(n, &rec, &x[1], &c__1); *scale *= rec; } } else if (xj * cnorm[j] > bignum - xmax) { - -/* Scale x by 1/2. */ - dscal_(n, &c_b46, &x[1], &c__1); *scale *= .5; } - if (upper) { if (j > 1) { - -/* Compute the update */ -/* x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j) */ - i__3 = j - 1; d__1 = -x[j] * tscal; - daxpy_(&i__3, &d__1, &a[j * a_dim1 + 1], &c__1, &x[1], - &c__1); + daxpy_(&i__3, &d__1, &a[j * a_dim1 + 1], &c__1, &x[1], &c__1); i__3 = j - 1; i__ = idamax_(&i__3, &x[1], &c__1); xmax = (d__1 = x[i__], abs(d__1)); } } else { if (j < *n) { - -/* Compute the update */ -/* x(j+1:n) := x(j+1:n) - x(j) * A(j+1:n,j) */ - i__3 = *n - j; d__1 = -x[j] * tscal; - daxpy_(&i__3, &d__1, &a[j + 1 + j * a_dim1], &c__1, & - x[j + 1], &c__1); + daxpy_(&i__3, &d__1, &a[j + 1 + j * a_dim1], &c__1, &x[j + 1], &c__1); i__3 = *n - j; i__ = j + idamax_(&i__3, &x[j + 1], &c__1); xmax = (d__1 = x[i__], abs(d__1)); } } -/* L110: */ } - } else { - -/* Solve A**T * x = b */ - i__2 = jlast; i__1 = jinc; for (j = jfirst; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { - -/* Compute x(j) = b(j) - sum A(k,j)*x(k). */ -/* k<>j */ - xj = (d__1 = x[j], abs(d__1)); uscal = tscal; - rec = 1. / max(xmax,1.); + rec = 1. / max(xmax, 1.); if (cnorm[j] > (bignum - xj) * rec) { - -/* If x(j) could overflow, scale x by 1/(2*XMAX). */ - rec *= .5; if (nounit) { tjjs = a[j + j * a_dim1] * tscal; @@ -836,12 +340,8 @@ L100: } tjj = abs(tjjs); if (tjj > 1.) { - -/* Divide by A(j,j) when scaling x if A(j,j) > 1. */ - -/* Computing MIN */ d__1 = 1., d__2 = rec * tjj; - rec = min(d__1,d__2); + rec = min(d__1, d__2); uscal /= tjjs; } if (rec < 1.) { @@ -850,46 +350,29 @@ L100: xmax *= rec; } } - sumj = 0.; if (uscal == 1.) { - -/* If the scaling needed for A in the dot product is 1, */ -/* call DDOT to perform the dot product. */ - if (upper) { i__3 = j - 1; - sumj = ddot_(&i__3, &a[j * a_dim1 + 1], &c__1, &x[1], - &c__1); + sumj = ddot_(&i__3, &a[j * a_dim1 + 1], &c__1, &x[1], &c__1); } else if (j < *n) { i__3 = *n - j; - sumj = ddot_(&i__3, &a[j + 1 + j * a_dim1], &c__1, &x[ - j + 1], &c__1); + sumj = ddot_(&i__3, &a[j + 1 + j * a_dim1], &c__1, &x[j + 1], &c__1); } } else { - -/* Otherwise, use in-line code for the dot product. */ - if (upper) { i__3 = j - 1; for (i__ = 1; i__ <= i__3; ++i__) { sumj += a[i__ + j * a_dim1] * uscal * x[i__]; -/* L120: */ } } else if (j < *n) { i__3 = *n; for (i__ = j + 1; i__ <= i__3; ++i__) { sumj += a[i__ + j * a_dim1] * uscal * x[i__]; -/* L130: */ } } } - if (uscal == tscal) { - -/* Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j) */ -/* was not used to scale the dotproduct. */ - x[j] -= sumj; xj = (d__1 = x[j], abs(d__1)); if (nounit) { @@ -900,19 +383,10 @@ L100: goto L150; } } - -/* Compute x(j) = x(j) / A(j,j), scaling if necessary. */ - tjj = abs(tjjs); if (tjj > smlnum) { - -/* abs(A(j,j)) > SMLNUM: */ - if (tjj < 1.) { if (xj > tjj * bignum) { - -/* Scale X by 1/abs(x(j)). */ - rec = 1. / xj; dscal_(n, &rec, &x[1], &c__1); *scale *= rec; @@ -921,13 +395,7 @@ L100: } x[j] /= tjjs; } else if (tjj > 0.) { - -/* 0 < abs(A(j,j)) <= SMLNUM: */ - if (xj > tjj * bignum) { - -/* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM. */ - rec = tjj * bignum / xj; dscal_(n, &rec, &x[1], &c__1); *scale *= rec; @@ -935,50 +403,30 @@ L100: } x[j] /= tjjs; } else { - -/* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and */ -/* scale = 0, and compute a solution to A**T*x = 0. */ - i__3 = *n; for (i__ = 1; i__ <= i__3; ++i__) { x[i__] = 0.; -/* L140: */ } x[j] = 1.; *scale = 0.; xmax = 0.; } -L150: - ; + L150:; } else { - -/* Compute x(j) := x(j) / A(j,j) - sumj if the dot */ -/* product has already been divided by 1/A(j,j). */ - x[j] = x[j] / tjjs - sumj; } -/* Computing MAX */ d__2 = xmax, d__3 = (d__1 = x[j], abs(d__1)); - xmax = max(d__2,d__3); -/* L160: */ + xmax = max(d__2, d__3); } } *scale /= tscal; } - -/* Scale the column norms by 1/TSCAL for return. */ - if (tscal != 1.) { d__1 = 1. / tscal; dscal_(n, &d__1, &cnorm[1], &c__1); } - return 0; - -/* End of DLATRS */ - -} /* dlatrs_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dnrm2.cpp b/lib/linalg/dnrm2.cpp index dc2a59dfbd..fc34e88c78 100644 --- a/lib/linalg/dnrm2.cpp +++ b/lib/linalg/dnrm2.cpp @@ -1,130 +1,15 @@ -/* fortran/dnrm2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DNRM2 */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* DOUBLE PRECISION FUNCTION DNRM2(N,X,INCX) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION X(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DNRM2 returns the euclidean norm of a vector via the function */ -/* > name, so that */ -/* > */ -/* > DNRM2 := sqrt( x'*x ) */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of DX */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \date December 2016 */ - -/* > \ingroup double_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > -- This version written on 25-October-1982. */ -/* > Modified on 14-October-1993 to inline the call to DLASSQ. */ -/* > Sven Hammarling, Nag Ltd. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ doublereal dnrm2_(integer *n, doublereal *x, integer *incx) { - /* System generated locals */ integer i__1, i__2; doublereal ret_val, d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ integer ix; doublereal ssq, norm, scale, absxi; - - -/* -- Reference BLAS level1 routine (version 3.7.0) -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ -/* December 2016 */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - /* Parameter adjustments */ --x; - - /* Function Body */ if (*n < 1 || *incx < 1) { norm = 0.; } else if (*n == 1) { @@ -132,38 +17,26 @@ doublereal dnrm2_(integer *n, doublereal *x, integer *incx) } else { scale = 0.; ssq = 1.; -/* The following loop is equivalent to this call to the LAPACK */ -/* auxiliary routine: */ -/* CALL DLASSQ( N, X, INCX, SCALE, SSQ ) */ - i__1 = (*n - 1) * *incx + 1; i__2 = *incx; for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { if (x[ix] != 0.) { absxi = (d__1 = x[ix], abs(d__1)); if (scale < absxi) { -/* Computing 2nd power */ d__1 = scale / absxi; ssq = ssq * (d__1 * d__1) + 1.; scale = absxi; } else { -/* Computing 2nd power */ d__1 = absxi / scale; ssq += d__1 * d__1; } } -/* L10: */ } norm = scale * sqrt(ssq); } - ret_val = norm; return ret_val; - -/* End of DNRM2. */ - -} /* dnrm2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dorg2l.cpp b/lib/linalg/dorg2l.cpp index a028102645..42899af042 100644 --- a/lib/linalg/dorg2l.cpp +++ b/lib/linalg/dorg2l.cpp @@ -1,186 +1,23 @@ -/* fortran/dorg2l.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DORG2L generates all or part of the orthogonal matrix Q from a QL factorization determined by s -geqlf (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORG2L + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORG2L( M, N, K, A, LDA, TAU, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORG2L generates an m by n real matrix Q with orthonormal columns, */ -/* > which is defined as the last n columns of a product of k elementary */ -/* > reflectors of order m */ -/* > */ -/* > Q = H(k) . . . H(2) H(1) */ -/* > */ -/* > as returned by DGEQLF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix Q. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix Q. M >= N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines the */ -/* > matrix Q. N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the (n-k+i)-th column must contain the vector which */ -/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ -/* > returned by DGEQLF in the last k columns of its array */ -/* > argument A. */ -/* > On exit, the m by n matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The first dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DGEQLF. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument has an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dorg2l_(integer *m, integer *n, integer *k, doublereal * - a, integer *lda, doublereal *tau, doublereal *work, integer *info) +int dorg2l_(integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, + doublereal *work, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; - - /* Local variables */ integer i__, j, l, ii; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dlarf_(char *, integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - ftnlen), xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ + extern int dscal_(integer *, doublereal *, doublereal *, integer *), + dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, ftnlen), + xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; if (*m < 0) { *info = -1; @@ -188,7 +25,7 @@ f"> */ *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; } if (*info != 0) { @@ -196,57 +33,36 @@ f"> */ xerbla_((char *)"DORG2L", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n <= 0) { return 0; } - -/* Initialise columns 1:n-k to columns of the unit matrix */ - i__1 = *n - *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (l = 1; l <= i__2; ++l) { a[l + j * a_dim1] = 0.; -/* L10: */ } a[*m - *n + j + j * a_dim1] = 1.; -/* L20: */ } - i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { ii = *n - *k + i__; - -/* Apply H(i) to A(1:m-k+i,1:n-k+i) from the left */ - a[*m - *n + ii + ii * a_dim1] = 1.; i__2 = *m - *n + ii; i__3 = ii - 1; - dlarf_((char *)"Left", &i__2, &i__3, &a[ii * a_dim1 + 1], &c__1, &tau[i__], & - a[a_offset], lda, &work[1], (ftnlen)4); + dlarf_((char *)"Left", &i__2, &i__3, &a[ii * a_dim1 + 1], &c__1, &tau[i__], &a[a_offset], lda, + &work[1], (ftnlen)4); i__2 = *m - *n + ii - 1; d__1 = -tau[i__]; dscal_(&i__2, &d__1, &a[ii * a_dim1 + 1], &c__1); a[*m - *n + ii + ii * a_dim1] = 1. - tau[i__]; - -/* Set A(m-k+i+1:m,n-k+i) to zero */ - i__2 = *m; for (l = *m - *n + ii + 1; l <= i__2; ++l) { a[l + ii * a_dim1] = 0.; -/* L30: */ } -/* L40: */ } return 0; - -/* End of DORG2L */ - -} /* dorg2l_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dorg2r.cpp b/lib/linalg/dorg2r.cpp index f6d897beb6..b9be1488c9 100644 --- a/lib/linalg/dorg2r.cpp +++ b/lib/linalg/dorg2r.cpp @@ -1,186 +1,23 @@ -/* fortran/dorg2r.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DORG2R generates all or part of the orthogonal matrix Q from a QR factorization determined by s -geqrf (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORG2R + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORG2R( M, N, K, A, LDA, TAU, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORG2R generates an m by n real matrix Q with orthonormal columns, */ -/* > which is defined as the first n columns of a product of k elementary */ -/* > reflectors of order m */ -/* > */ -/* > Q = H(1) H(2) . . . H(k) */ -/* > */ -/* > as returned by DGEQRF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix Q. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix Q. M >= N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines the */ -/* > matrix Q. N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the i-th column must contain the vector which */ -/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ -/* > returned by DGEQRF in the first k columns of its array */ -/* > argument A. */ -/* > On exit, the m-by-n matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The first dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DGEQRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument has an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dorg2r_(integer *m, integer *n, integer *k, doublereal * - a, integer *lda, doublereal *tau, doublereal *work, integer *info) +int dorg2r_(integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, + doublereal *work, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; - - /* Local variables */ integer i__, j, l; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dlarf_(char *, integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - ftnlen), xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ + extern int dscal_(integer *, doublereal *, doublereal *, integer *), + dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, ftnlen), + xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; if (*m < 0) { *info = -1; @@ -188,7 +25,7 @@ f"> */ *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; } if (*info != 0) { @@ -196,37 +33,24 @@ f"> */ xerbla_((char *)"DORG2R", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n <= 0) { return 0; } - -/* Initialise columns k+1:n to columns of the unit matrix */ - i__1 = *n; for (j = *k + 1; j <= i__1; ++j) { i__2 = *m; for (l = 1; l <= i__2; ++l) { a[l + j * a_dim1] = 0.; -/* L10: */ } a[j + j * a_dim1] = 1.; -/* L20: */ } - for (i__ = *k; i__ >= 1; --i__) { - -/* Apply H(i) to A(i:m,i:n) from the left */ - if (i__ < *n) { a[i__ + i__ * a_dim1] = 1.; i__1 = *m - i__ + 1; i__2 = *n - i__; - dlarf_((char *)"Left", &i__1, &i__2, &a[i__ + i__ * a_dim1], &c__1, &tau[ - i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], ( - ftnlen)4); + dlarf_((char *)"Left", &i__1, &i__2, &a[i__ + i__ * a_dim1], &c__1, &tau[i__], + &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], (ftnlen)4); } if (i__ < *m) { i__1 = *m - i__; @@ -234,22 +58,13 @@ f"> */ dscal_(&i__1, &d__1, &a[i__ + 1 + i__ * a_dim1], &c__1); } a[i__ + i__ * a_dim1] = 1. - tau[i__]; - -/* Set A(1:i-1,i) to zero */ - i__1 = i__ - 1; for (l = 1; l <= i__1; ++l) { a[l + i__ * a_dim1] = 0.; -/* L30: */ } -/* L40: */ } return 0; - -/* End of DORG2R */ - -} /* dorg2r_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dorgbr.cpp b/lib/linalg/dorgbr.cpp index a55e8aeca0..27f94eb51f 100644 --- a/lib/linalg/dorgbr.cpp +++ b/lib/linalg/dorgbr.cpp @@ -1,404 +1,140 @@ -/* fortran/dorgbr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c_n1 = -1; - -/* > \brief \b DORGBR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORGBR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORGBR( VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER VECT */ -/* INTEGER INFO, K, LDA, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORGBR generates one of the real orthogonal matrices Q or P**T */ -/* > determined by DGEBRD when reducing a real matrix A to bidiagonal */ -/* > form: A = Q * B * P**T. Q and P**T are defined as products of */ -/* > elementary reflectors H(i) or G(i) respectively. */ -/* > */ -/* > If VECT = 'Q', A is assumed to have been an M-by-K matrix, and Q */ -/* > is of order M: */ -/* > if m >= k, Q = H(1) H(2) . . . H(k) and DORGBR returns the first n */ -/* > columns of Q, where m >= n >= k; */ -/* > if m < k, Q = H(1) H(2) . . . H(m-1) and DORGBR returns Q as an */ -/* > M-by-M matrix. */ -/* > */ -/* > If VECT = 'P', A is assumed to have been a K-by-N matrix, and P**T */ -/* > is of order N: */ -/* > if k < n, P**T = G(k) . . . G(2) G(1) and DORGBR returns the first m */ -/* > rows of P**T, where n >= m >= k; */ -/* > if k >= n, P**T = G(n-1) . . . G(2) G(1) and DORGBR returns P**T as */ -/* > an N-by-N matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] VECT */ -/* > \verbatim */ -/* > VECT is CHARACTER*1 */ -/* > Specifies whether the matrix Q or the matrix P**T is */ -/* > required, as defined in the transformation applied by DGEBRD: */ -/* > = 'Q': generate Q; */ -/* > = 'P': generate P**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix Q or P**T to be returned. */ -/* > M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix Q or P**T to be returned. */ -/* > N >= 0. */ -/* > If VECT = 'Q', M >= N >= min(M,K); */ -/* > if VECT = 'P', N >= M >= min(N,K). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > If VECT = 'Q', the number of columns in the original M-by-K */ -/* > matrix reduced by DGEBRD. */ -/* > If VECT = 'P', the number of rows in the original K-by-N */ -/* > matrix reduced by DGEBRD. */ -/* > K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the vectors which define the elementary reflectors, */ -/* > as returned by DGEBRD. */ -/* > On exit, the M-by-N matrix Q or P**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension */ -/* > (min(M,K)) if VECT = 'Q' */ -/* > (min(N,K)) if VECT = 'P' */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i) or G(i), which determines Q or P**T, as */ -/* > returned by DGEBRD in its array argument TAUQ or TAUP. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= max(1,min(M,N)). */ -/* > For optimum performance LWORK >= min(M,N)*NB, where NB */ -/* > is the optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleGBcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dorgbr_(char *vect, integer *m, integer *n, integer *k, - doublereal *a, integer *lda, doublereal *tau, doublereal *work, - integer *lwork, integer *info, ftnlen vect_len) +int dorgbr_(char *vect, integer *m, integer *n, integer *k, doublereal *a, integer *lda, + doublereal *tau, doublereal *work, integer *lwork, integer *info, ftnlen vect_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, j, mn; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; logical wantq; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dorglq_( - integer *, integer *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, integer *), dorgqr_( - integer *, integer *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, integer *); + extern int xerbla_(char *, integer *, ftnlen), + dorglq_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *), + dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *); integer lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; wantq = lsame_(vect, (char *)"Q", (ftnlen)1, (ftnlen)1); - mn = min(*m,*n); + mn = min(*m, *n); lquery = *lwork == -1; - if (! wantq && ! lsame_(vect, (char *)"P", (ftnlen)1, (ftnlen)1)) { + if (!wantq && !lsame_(vect, (char *)"P", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*m < 0) { *info = -2; - } else if (*n < 0 || wantq && (*n > *m || *n < min(*m,*k)) || ! wantq && ( - *m > *n || *m < min(*n,*k))) { + } else if (*n < 0 || wantq && (*n > *m || *n < min(*m, *k)) || + !wantq && (*m > *n || *m < min(*n, *k))) { *info = -3; } else if (*k < 0) { *info = -4; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -6; - } else if (*lwork < max(1,mn) && ! lquery) { + } else if (*lwork < max(1, mn) && !lquery) { *info = -9; } - if (*info == 0) { work[1] = 1.; if (wantq) { if (*m >= *k) { - dorgqr_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], &c_n1, - &iinfo); + dorgqr_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], &c_n1, &iinfo); } else { if (*m > 1) { i__1 = *m - 1; i__2 = *m - 1; i__3 = *m - 1; - dorgqr_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], & - work[1], &c_n1, &iinfo); + dorgqr_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &c_n1, + &iinfo); } } } else { if (*k < *n) { - dorglq_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], &c_n1, - &iinfo); + dorglq_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], &c_n1, &iinfo); } else { if (*n > 1) { i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; - dorglq_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], & - work[1], &c_n1, &iinfo); + dorglq_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &c_n1, + &iinfo); } } } - lwkopt = (integer) work[1]; - lwkopt = max(lwkopt,mn); + lwkopt = (integer)work[1]; + lwkopt = max(lwkopt, mn); } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DORGBR", &i__1, (ftnlen)6); return 0; } else if (lquery) { - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0) { work[1] = 1.; return 0; } - if (wantq) { - -/* Form Q, determined by a call to DGEBRD to reduce an m-by-k */ -/* matrix */ - if (*m >= *k) { - -/* If m >= k, assume m >= n >= k */ - - dorgqr_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, & - iinfo); - + dorgqr_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, &iinfo); } else { - -/* If m < k, assume m = n */ - -/* Shift the vectors which define the elementary reflectors one */ -/* column to the right, and set the first row and column of Q */ -/* to those of the unit matrix */ - for (j = *m; j >= 2; --j) { a[j * a_dim1 + 1] = 0.; i__1 = *m; for (i__ = j + 1; i__ <= i__1; ++i__) { a[i__ + j * a_dim1] = a[i__ + (j - 1) * a_dim1]; -/* L10: */ } -/* L20: */ } a[a_dim1 + 1] = 1.; i__1 = *m; for (i__ = 2; i__ <= i__1; ++i__) { a[i__ + a_dim1] = 0.; -/* L30: */ } if (*m > 1) { - -/* Form Q(2:m,2:m) */ - i__1 = *m - 1; i__2 = *m - 1; i__3 = *m - 1; - dorgqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[ - 1], &work[1], lwork, &iinfo); + dorgqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], &work[1], lwork, + &iinfo); } } } else { - -/* Form P**T, determined by a call to DGEBRD to reduce a k-by-n */ -/* matrix */ - if (*k < *n) { - -/* If k < n, assume k <= m <= n */ - - dorglq_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, & - iinfo); - + dorglq_(m, n, k, &a[a_offset], lda, &tau[1], &work[1], lwork, &iinfo); } else { - -/* If k >= n, assume m = n */ - -/* Shift the vectors which define the elementary reflectors one */ -/* row downward, and set the first row and column of P**T to */ -/* those of the unit matrix */ - a[a_dim1 + 1] = 1.; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { a[i__ + a_dim1] = 0.; -/* L40: */ } i__1 = *n; for (j = 2; j <= i__1; ++j) { for (i__ = j - 1; i__ >= 2; --i__) { a[i__ + j * a_dim1] = a[i__ - 1 + j * a_dim1]; -/* L50: */ } a[j * a_dim1 + 1] = 0.; -/* L60: */ } if (*n > 1) { - -/* Form P**T(2:n,2:n) */ - i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; - dorglq_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[ - 1], &work[1], lwork, &iinfo); + dorglq_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], &work[1], lwork, + &iinfo); } } } - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; return 0; - -/* End of DORGBR */ - -} /* dorgbr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dorgl2.cpp b/lib/linalg/dorgl2.cpp index 68b6445522..78561a4ba8 100644 --- a/lib/linalg/dorgl2.cpp +++ b/lib/linalg/dorgl2.cpp @@ -1,180 +1,22 @@ -/* fortran/dorgl2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DORGL2 */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORGL2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORGL2( M, N, K, A, LDA, TAU, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORGL2 generates an m by n real matrix Q with orthonormal rows, */ -/* > which is defined as the first m rows of a product of k elementary */ -/* > reflectors of order n */ -/* > */ -/* > Q = H(k) . . . H(2) H(1) */ -/* > */ -/* > as returned by DGELQF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix Q. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix Q. N >= M. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines the */ -/* > matrix Q. M >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the i-th row must contain the vector which defines */ -/* > the elementary reflector H(i), for i = 1,2,...,k, as returned */ -/* > by DGELQF in the first k rows of its array argument A. */ -/* > On exit, the m-by-n matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The first dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DGELQF. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (M) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument has an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dorgl2_(integer *m, integer *n, integer *k, doublereal * - a, integer *lda, doublereal *tau, doublereal *work, integer *info) +int dorgl2_(integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, + doublereal *work, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; - - /* Local variables */ integer i__, j, l; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dlarf_(char *, integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - ftnlen), xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ + extern int dscal_(integer *, doublereal *, doublereal *, integer *), + dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, doublereal *, ftnlen), + xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; if (*m < 0) { *info = -1; @@ -182,7 +24,7 @@ f"> */ *info = -2; } else if (*k < 0 || *k > *m) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; } if (*info != 0) { @@ -190,65 +32,42 @@ f"> */ xerbla_((char *)"DORGL2", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*m <= 0) { return 0; } - if (*k < *m) { - -/* Initialise rows k+1:m to rows of the unit matrix */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (l = *k + 1; l <= i__2; ++l) { a[l + j * a_dim1] = 0.; -/* L10: */ } if (j > *k && j <= *m) { a[j + j * a_dim1] = 1.; } -/* L20: */ } } - for (i__ = *k; i__ >= 1; --i__) { - -/* Apply H(i) to A(i:m,i:n) from the right */ - if (i__ < *n) { if (i__ < *m) { a[i__ + i__ * a_dim1] = 1.; i__1 = *m - i__; i__2 = *n - i__ + 1; - dlarf_((char *)"Right", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, & - tau[i__], &a[i__ + 1 + i__ * a_dim1], lda, &work[1], ( - ftnlen)5); + dlarf_((char *)"Right", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, &tau[i__], + &a[i__ + 1 + i__ * a_dim1], lda, &work[1], (ftnlen)5); } i__1 = *n - i__; d__1 = -tau[i__]; dscal_(&i__1, &d__1, &a[i__ + (i__ + 1) * a_dim1], lda); } a[i__ + i__ * a_dim1] = 1. - tau[i__]; - -/* Set A(i,1:i-1) to zero */ - i__1 = i__ - 1; for (l = 1; l <= i__1; ++l) { a[i__ + l * a_dim1] = 0.; -/* L30: */ } -/* L40: */ } return 0; - -/* End of DORGL2 */ - -} /* dorgl2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dorglq.cpp b/lib/linalg/dorglq.cpp index 96eb224501..a43e7e86d2 100644 --- a/lib/linalg/dorglq.cpp +++ b/lib/linalg/dorglq.cpp @@ -1,215 +1,37 @@ -/* fortran/dorglq.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; - -/* > \brief \b DORGLQ */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORGLQ + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDA, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORGLQ generates an M-by-N real matrix Q with orthonormal rows, */ -/* > which is defined as the first M rows of a product of K elementary */ -/* > reflectors of order N */ -/* > */ -/* > Q = H(k) . . . H(2) H(1) */ -/* > */ -/* > as returned by DGELQF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix Q. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix Q. N >= M. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines the */ -/* > matrix Q. M >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the i-th row must contain the vector which defines */ -/* > the elementary reflector H(i), for i = 1,2,...,k, as returned */ -/* > by DGELQF in the first k rows of its array argument A. */ -/* > On exit, the M-by-N matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The first dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DGELQF. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= max(1,M). */ -/* > For optimum performance LWORK >= M*NB, where NB is */ -/* > the optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument has an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dorglq_(integer *m, integer *n, integer *k, doublereal * - a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, - integer *info) +int dorglq_(integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, + doublereal *work, integer *lwork, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int dorgl2_(integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *), - dlarfb_(char *, char *, char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen, ftnlen), dlarft_(char *, char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dorgl2_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *), + dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen, ftnlen), + dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; nb = ilaenv_(&c__1, (char *)"DORGLQ", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); - lwkopt = max(1,*m) * nb; - work[1] = (doublereal) lwkopt; + lwkopt = max(1, *m) * nb; + work[1] = (doublereal)lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; @@ -217,9 +39,9 @@ f"> */ *info = -2; } else if (*k < 0 || *k > *m) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; - } else if (*lwork < max(1,*m) && ! lquery) { + } else if (*lwork < max(1, *m) && !lquery) { *info = -8; } if (*info != 0) { @@ -229,138 +51,77 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*m <= 0) { work[1] = 1.; return 0; } - nbmin = 2; nx = 0; iws = *m; if (nb > 1 && nb < *k) { - -/* Determine when to cross over from blocked to unblocked code. */ - -/* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGLQ", (char *)" ", m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGLQ", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1, i__2); if (nx < *k) { - -/* Determine if workspace is large enough for blocked code. */ - ldwork = *m; iws = ldwork * nb; if (*lwork < iws) { - -/* Not enough workspace to use optimal NB: reduce NB and */ -/* determine the minimum value of NB. */ - nb = *lwork / ldwork; -/* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORGLQ", (char *)" ", m, n, k, &c_n1, - (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"DORGLQ", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); } } } - if (nb >= nbmin && nb < *k && nx < *k) { - -/* Use blocked code after the last block. */ -/* The first kk rows are handled by the block method. */ - ki = (*k - nx - 1) / nb * nb; -/* Computing MIN */ i__1 = *k, i__2 = ki + nb; - kk = min(i__1,i__2); - -/* Set A(kk+1:m,1:kk) to zero. */ - + kk = min(i__1, i__2); i__1 = kk; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = kk + 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; -/* L10: */ } -/* L20: */ } } else { kk = 0; } - -/* Use unblocked code for the last or only block. */ - if (kk < *m) { i__1 = *m - kk; i__2 = *n - kk; i__3 = *k - kk; - dorgl2_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & - tau[kk + 1], &work[1], &iinfo); + dorgl2_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, &tau[kk + 1], &work[1], + &iinfo); } - if (kk > 0) { - -/* Use blocked code */ - i__1 = -nb; for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { -/* Computing MIN */ i__2 = nb, i__3 = *k - i__ + 1; - ib = min(i__2,i__3); + ib = min(i__2, i__3); if (i__ + ib <= *m) { - -/* Form the triangular factor of the block reflector */ -/* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__2 = *n - i__ + 1; - dlarft_((char *)"Forward", (char *)"Rowwise", &i__2, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, - (ftnlen)7); - -/* Apply H**T to A(i+ib:m,i:n) from the right */ - + dlarft_((char *)"Forward", (char *)"Rowwise", &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], + &work[1], &ldwork, (ftnlen)7, (ftnlen)7); i__2 = *m - i__ - ib + 1; i__3 = *n - i__ + 1; - dlarfb_((char *)"Right", (char *)"Transpose", (char *)"Forward", (char *)"Rowwise", &i__2, & - i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[1], & - ldwork, &a[i__ + ib + i__ * a_dim1], lda, &work[ib + - 1], &ldwork, (ftnlen)5, (ftnlen)9, (ftnlen)7, (ftnlen) - 7); + dlarfb_((char *)"Right", (char *)"Transpose", (char *)"Forward", (char *)"Rowwise", &i__2, &i__3, &ib, + &a[i__ + i__ * a_dim1], lda, &work[1], &ldwork, &a[i__ + ib + i__ * a_dim1], + lda, &work[ib + 1], &ldwork, (ftnlen)5, (ftnlen)9, (ftnlen)7, (ftnlen)7); } - -/* Apply H**T to columns i:n of current block */ - i__2 = *n - i__ + 1; - dorgl2_(&ib, &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & - work[1], &iinfo); - -/* Set columns 1:i-1 of current block to zero */ - + dorgl2_(&ib, &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &iinfo); i__2 = i__ - 1; for (j = 1; j <= i__2; ++j) { i__3 = i__ + ib - 1; for (l = i__; l <= i__3; ++l) { a[l + j * a_dim1] = 0.; -/* L30: */ } -/* L40: */ } -/* L50: */ } } - - work[1] = (doublereal) iws; + work[1] = (doublereal)iws; return 0; - -/* End of DORGLQ */ - -} /* dorglq_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dorgql.cpp b/lib/linalg/dorgql.cpp index 719b7aa685..53c6e01be0 100644 --- a/lib/linalg/dorgql.cpp +++ b/lib/linalg/dorgql.cpp @@ -1,212 +1,33 @@ -/* fortran/dorgql.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; - -/* > \brief \b DORGQL */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORGQL + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDA, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORGQL generates an M-by-N real matrix Q with orthonormal columns, */ -/* > which is defined as the last N columns of a product of K elementary */ -/* > reflectors of order M */ -/* > */ -/* > Q = H(k) . . . H(2) H(1) */ -/* > */ -/* > as returned by DGEQLF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix Q. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix Q. M >= N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines the */ -/* > matrix Q. N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the (n-k+i)-th column must contain the vector which */ -/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ -/* > returned by DGEQLF in the last k columns of its array */ -/* > argument A. */ -/* > On exit, the M-by-N matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The first dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DGEQLF. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= max(1,N). */ -/* > For optimum performance LWORK >= N*NB, where NB is the */ -/* > optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument has an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dorgql_(integer *m, integer *n, integer *k, doublereal * - a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, - integer *info) +int dorgql_(integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, + doublereal *work, integer *lwork, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; - - /* Local variables */ integer i__, j, l, ib, nb, kk, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int dorg2l_(integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *), - dlarfb_(char *, char *, char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen, ftnlen), dlarft_(char *, char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dorg2l_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *), + dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen, ftnlen), + dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; lquery = *lwork == -1; if (*m < 0) { @@ -215,25 +36,21 @@ f"> */ *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; } - if (*info == 0) { if (*n == 0) { lwkopt = 1; } else { - nb = ilaenv_(&c__1, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, ( - ftnlen)1); + nb = ilaenv_(&c__1, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); lwkopt = *n * nb; } - work[1] = (doublereal) lwkopt; - - if (*lwork < max(1,*n) && ! lquery) { + work[1] = (doublereal)lwkopt; + if (*lwork < max(1, *n) && !lquery) { *info = -8; } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DORGQL", &i__1, (ftnlen)6); @@ -241,136 +58,74 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n <= 0) { return 0; } - nbmin = 2; nx = 0; iws = *n; if (nb > 1 && nb < *k) { - -/* Determine when to cross over from blocked to unblocked code. */ - -/* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1, i__2); if (nx < *k) { - -/* Determine if workspace is large enough for blocked code. */ - ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { - -/* Not enough workspace to use optimal NB: reduce NB and */ -/* determine the minimum value of NB. */ - nb = *lwork / ldwork; -/* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, - (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"DORGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); } } } - if (nb >= nbmin && nb < *k && nx < *k) { - -/* Use blocked code after the first block. */ -/* The last kk columns are handled by the block method. */ - -/* Computing MIN */ i__1 = *k, i__2 = (*k - nx + nb - 1) / nb * nb; - kk = min(i__1,i__2); - -/* Set A(m-kk+1:m,1:n-kk) to zero. */ - + kk = min(i__1, i__2); i__1 = *n - kk; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = *m - kk + 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; -/* L10: */ } -/* L20: */ } } else { kk = 0; } - -/* Use unblocked code for the first or only block. */ - i__1 = *m - kk; i__2 = *n - kk; i__3 = *k - kk; - dorg2l_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &iinfo) - ; - + dorg2l_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &iinfo); if (kk > 0) { - -/* Use blocked code */ - i__1 = *k; i__2 = nb; - for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += - i__2) { -/* Computing MIN */ + for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { i__3 = nb, i__4 = *k - i__ + 1; - ib = min(i__3,i__4); + ib = min(i__3, i__4); if (*n - *k + i__ > 1) { - -/* Form the triangular factor of the block reflector */ -/* H = H(i+ib-1) . . . H(i+1) H(i) */ - i__3 = *m - *k + i__ + ib - 1; - dlarft_((char *)"Backward", (char *)"Columnwise", &i__3, &ib, &a[(*n - *k + - i__) * a_dim1 + 1], lda, &tau[i__], &work[1], &ldwork, - (ftnlen)8, (ftnlen)10); - -/* Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left */ - + dlarft_((char *)"Backward", (char *)"Columnwise", &i__3, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, + &tau[i__], &work[1], &ldwork, (ftnlen)8, (ftnlen)10); i__3 = *m - *k + i__ + ib - 1; i__4 = *n - *k + i__ - 1; - dlarfb_((char *)"Left", (char *)"No transpose", (char *)"Backward", (char *)"Columnwise", & - i__3, &i__4, &ib, &a[(*n - *k + i__) * a_dim1 + 1], - lda, &work[1], &ldwork, &a[a_offset], lda, &work[ib + - 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen)8, ( - ftnlen)10); + dlarfb_((char *)"Left", (char *)"No transpose", (char *)"Backward", (char *)"Columnwise", &i__3, &i__4, &ib, + &a[(*n - *k + i__) * a_dim1 + 1], lda, &work[1], &ldwork, &a[a_offset], lda, + &work[ib + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen)8, (ftnlen)10); } - -/* Apply H to rows 1:m-k+i+ib-1 of current block */ - i__3 = *m - *k + i__ + ib - 1; - dorg2l_(&i__3, &ib, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, & - tau[i__], &work[1], &iinfo); - -/* Set rows m-k+i+ib:m of current block to zero */ - + dorg2l_(&i__3, &ib, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, &tau[i__], &work[1], + &iinfo); i__3 = *n - *k + i__ + ib - 1; for (j = *n - *k + i__; j <= i__3; ++j) { i__4 = *m; for (l = *m - *k + i__ + ib; l <= i__4; ++l) { a[l + j * a_dim1] = 0.; -/* L30: */ } -/* L40: */ } -/* L50: */ } } - - work[1] = (doublereal) iws; + work[1] = (doublereal)iws; return 0; - -/* End of DORGQL */ - -} /* dorgql_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dorgqr.cpp b/lib/linalg/dorgqr.cpp index 4fedb08864..9f4e8f5da1 100644 --- a/lib/linalg/dorgqr.cpp +++ b/lib/linalg/dorgqr.cpp @@ -1,216 +1,37 @@ -/* fortran/dorgqr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; - -/* > \brief \b DORGQR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORGQR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDA, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORGQR generates an M-by-N real matrix Q with orthonormal columns, */ -/* > which is defined as the first N columns of a product of K elementary */ -/* > reflectors of order M */ -/* > */ -/* > Q = H(1) H(2) . . . H(k) */ -/* > */ -/* > as returned by DGEQRF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix Q. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix Q. M >= N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines the */ -/* > matrix Q. N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the i-th column must contain the vector which */ -/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ -/* > returned by DGEQRF in the first k columns of its array */ -/* > argument A. */ -/* > On exit, the M-by-N matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The first dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DGEQRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= max(1,N). */ -/* > For optimum performance LWORK >= N*NB, where NB is the */ -/* > optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument has an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dorgqr_(integer *m, integer *n, integer *k, doublereal * - a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, - integer *info) +int dorgqr_(integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, + doublereal *work, integer *lwork, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int dorg2r_(integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *), - dlarfb_(char *, char *, char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen, ftnlen), dlarft_(char *, char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dorg2r_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *), + dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen, ftnlen), + dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; nb = ilaenv_(&c__1, (char *)"DORGQR", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); - lwkopt = max(1,*n) * nb; - work[1] = (doublereal) lwkopt; + lwkopt = max(1, *n) * nb; + work[1] = (doublereal)lwkopt; lquery = *lwork == -1; if (*m < 0) { *info = -1; @@ -218,9 +39,9 @@ f"> */ *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; - } else if (*lwork < max(1,*n) && ! lquery) { + } else if (*lwork < max(1, *n) && !lquery) { *info = -8; } if (*info != 0) { @@ -230,138 +51,78 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n <= 0) { work[1] = 1.; return 0; } - nbmin = 2; nx = 0; iws = *n; if (nb > 1 && nb < *k) { - -/* Determine when to cross over from blocked to unblocked code. */ - -/* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGQR", (char *)" ", m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"DORGQR", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1, i__2); if (nx < *k) { - -/* Determine if workspace is large enough for blocked code. */ - ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { - -/* Not enough workspace to use optimal NB: reduce NB and */ -/* determine the minimum value of NB. */ - nb = *lwork / ldwork; -/* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORGQR", (char *)" ", m, n, k, &c_n1, - (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"DORGQR", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); } } } - if (nb >= nbmin && nb < *k && nx < *k) { - -/* Use blocked code after the last block. */ -/* The first kk columns are handled by the block method. */ - ki = (*k - nx - 1) / nb * nb; -/* Computing MIN */ i__1 = *k, i__2 = ki + nb; - kk = min(i__1,i__2); - -/* Set A(1:kk,kk+1:n) to zero. */ - + kk = min(i__1, i__2); i__1 = *n; for (j = kk + 1; j <= i__1; ++j) { i__2 = kk; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = 0.; -/* L10: */ } -/* L20: */ } } else { kk = 0; } - -/* Use unblocked code for the last or only block. */ - if (kk < *n) { i__1 = *m - kk; i__2 = *n - kk; i__3 = *k - kk; - dorg2r_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & - tau[kk + 1], &work[1], &iinfo); + dorg2r_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, &tau[kk + 1], &work[1], + &iinfo); } - if (kk > 0) { - -/* Use blocked code */ - i__1 = -nb; for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { -/* Computing MIN */ i__2 = nb, i__3 = *k - i__ + 1; - ib = min(i__2,i__3); + ib = min(i__2, i__3); if (i__ + ib <= *n) { - -/* Form the triangular factor of the block reflector */ -/* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__2 = *m - i__ + 1; - dlarft_((char *)"Forward", (char *)"Columnwise", &i__2, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, - (ftnlen)10); - -/* Apply H to A(i:m,i+ib:n) from the left */ - + dlarft_((char *)"Forward", (char *)"Columnwise", &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], + &work[1], &ldwork, (ftnlen)7, (ftnlen)10); i__2 = *m - i__ + 1; i__3 = *n - i__ - ib + 1; - dlarfb_((char *)"Left", (char *)"No transpose", (char *)"Forward", (char *)"Columnwise", & - i__2, &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[ - 1], &ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, & - work[ib + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen) - 7, (ftnlen)10); + dlarfb_((char *)"Left", (char *)"No transpose", (char *)"Forward", (char *)"Columnwise", &i__2, &i__3, &ib, + &a[i__ + i__ * a_dim1], lda, &work[1], &ldwork, + &a[i__ + (i__ + ib) * a_dim1], lda, &work[ib + 1], &ldwork, (ftnlen)4, + (ftnlen)12, (ftnlen)7, (ftnlen)10); } - -/* Apply H to rows i:m of current block */ - i__2 = *m - i__ + 1; - dorg2r_(&i__2, &ib, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & - work[1], &iinfo); - -/* Set rows 1:i-1 of current block to zero */ - + dorg2r_(&i__2, &ib, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &iinfo); i__2 = i__ + ib - 1; for (j = i__; j <= i__2; ++j) { i__3 = i__ - 1; for (l = 1; l <= i__3; ++l) { a[l + j * a_dim1] = 0.; -/* L30: */ } -/* L40: */ } -/* L50: */ } } - - work[1] = (doublereal) iws; + work[1] = (doublereal)iws; return 0; - -/* End of DORGQR */ - -} /* dorgqr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dorgtr.cpp b/lib/linalg/dorgtr.cpp index 0574de0d9b..692b6c4945 100644 --- a/lib/linalg/dorgtr.cpp +++ b/lib/linalg/dorgtr.cpp @@ -1,242 +1,62 @@ -/* fortran/dorgtr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; - -/* > \brief \b DORGTR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORGTR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDA, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORGTR generates a real orthogonal matrix Q which is defined as the */ -/* > product of n-1 elementary reflectors of order N, as returned by */ -/* > DSYTRD: */ -/* > */ -/* > if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), */ -/* > */ -/* > if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A contains elementary reflectors */ -/* > from DSYTRD; */ -/* > = 'L': Lower triangle of A contains elementary reflectors */ -/* > from DSYTRD. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix Q. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the vectors which define the elementary reflectors, */ -/* > as returned by DSYTRD. */ -/* > On exit, the N-by-N orthogonal matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (N-1) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DSYTRD. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= max(1,N-1). */ -/* > For optimum performance LWORK >= (N-1)*NB, where NB is */ -/* > the optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dorgtr_(char *uplo, integer *n, doublereal *a, integer * - lda, doublereal *tau, doublereal *work, integer *lwork, integer *info, - ftnlen uplo_len) +int dorgtr_(char *uplo, integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal *work, + integer *lwork, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, j, nb; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; logical upper; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dorgql_(integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - integer *), dorgqr_(integer *, integer *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, integer *); + extern int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dorgql_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *), + dorgqr_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *); integer lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; lquery = *lwork == -1; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -4; - } else /* if(complicated condition) */ { -/* Computing MAX */ + } else { i__1 = 1, i__2 = *n - 1; - if (*lwork < max(i__1,i__2) && ! lquery) { + if (*lwork < max(i__1, i__2) && !lquery) { *info = -7; } } - if (*info == 0) { if (upper) { i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"DORGQL", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)1); + nb = ilaenv_(&c__1, (char *)"DORGQL", (char *)" ", &i__1, &i__2, &i__3, &c_n1, (ftnlen)6, (ftnlen)1); } else { i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"DORGQR", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)1); + nb = ilaenv_(&c__1, (char *)"DORGQR", (char *)" ", &i__1, &i__2, &i__3, &c_n1, (ftnlen)6, (ftnlen)1); } -/* Computing MAX */ i__1 = 1, i__2 = *n - 1; - lwkopt = max(i__1,i__2) * nb; - work[1] = (doublereal) lwkopt; + lwkopt = max(i__1, i__2) * nb; + work[1] = (doublereal)lwkopt; } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DORGTR", &i__1, (ftnlen)6); @@ -244,88 +64,52 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { work[1] = 1.; return 0; } - if (upper) { - -/* Q was determined by a call to DSYTRD with UPLO = 'U' */ - -/* Shift the vectors which define the elementary reflectors one */ -/* column to the left, and set the last row and column of Q to */ -/* those of the unit matrix */ - i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { a[i__ + j * a_dim1] = a[i__ + (j + 1) * a_dim1]; -/* L10: */ } a[*n + j * a_dim1] = 0.; -/* L20: */ } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { a[i__ + *n * a_dim1] = 0.; -/* L30: */ } a[*n + *n * a_dim1] = 1.; - -/* Generate Q(1:n-1,1:n-1) */ - i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; - dorgql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], - lwork, &iinfo); - + dorgql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], lwork, &iinfo); } else { - -/* Q was determined by a call to DSYTRD with UPLO = 'L'. */ - -/* Shift the vectors which define the elementary reflectors one */ -/* column to the right, and set the first row and column of Q to */ -/* those of the unit matrix */ - for (j = *n; j >= 2; --j) { a[j * a_dim1 + 1] = 0.; i__1 = *n; for (i__ = j + 1; i__ <= i__1; ++i__) { a[i__ + j * a_dim1] = a[i__ + (j - 1) * a_dim1]; -/* L40: */ } -/* L50: */ } a[a_dim1 + 1] = 1.; i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { a[i__ + a_dim1] = 0.; -/* L60: */ } if (*n > 1) { - -/* Generate Q(2:n,2:n) */ - i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; - dorgqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], - &work[1], lwork, &iinfo); + dorgqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], &work[1], lwork, + &iinfo); } } - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; return 0; - -/* End of DORGTR */ - -} /* dorgtr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dorm2l.cpp b/lib/linalg/dorm2l.cpp index 6882f50cdb..35d3b346a5 100644 --- a/lib/linalg/dorm2l.cpp +++ b/lib/linalg/dorm2l.cpp @@ -1,230 +1,21 @@ -/* fortran/dorm2l.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DORM2L multiplies a general matrix by the orthogonal matrix from a QL factorization determined -by sgeqlf (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORM2L + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORM2L( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ -/* WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS */ -/* INTEGER INFO, K, LDA, LDC, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORM2L overwrites the general real m by n matrix C with */ -/* > */ -/* > Q * C if SIDE = 'L' and TRANS = 'N', or */ -/* > */ -/* > Q**T * C if SIDE = 'L' and TRANS = 'T', or */ -/* > */ -/* > C * Q if SIDE = 'R' and TRANS = 'N', or */ -/* > */ -/* > C * Q**T if SIDE = 'R' and TRANS = 'T', */ -/* > */ -/* > where Q is a real orthogonal matrix defined as the product of k */ -/* > elementary reflectors */ -/* > */ -/* > Q = H(k) . . . H(2) H(1) */ -/* > */ -/* > as returned by DGEQLF. Q is of order m if SIDE = 'L' and of order n */ -/* > if SIDE = 'R'. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q or Q**T from the Left */ -/* > = 'R': apply Q or Q**T from the Right */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': apply Q (No transpose) */ -/* > = 'T': apply Q**T (Transpose) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines */ -/* > the matrix Q. */ -/* > If SIDE = 'L', M >= K >= 0; */ -/* > if SIDE = 'R', N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,K) */ -/* > The i-th column must contain the vector which defines the */ -/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ -/* > DGEQLF in the last k columns of its array argument A. */ -/* > A is modified by the routine but restored on exit. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > If SIDE = 'L', LDA >= max(1,M); */ -/* > if SIDE = 'R', LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DGEQLF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ -/* > On entry, the m by n matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension */ -/* > (N) if SIDE = 'L', */ -/* > (M) if SIDE = 'R' */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dorm2l_(char *side, char *trans, integer *m, integer *n, - integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *info, ftnlen side_len, - ftnlen trans_len) +int dorm2l_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, + integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, + integer *info, ftnlen side_len, ftnlen trans_len) { - /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; - - /* Local variables */ integer i__, i1, i2, i3, mi, ni, nq; doublereal aii; logical left; - extern /* Subroutine */ int dlarf_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, ftnlen); + extern int dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); logical notran; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -233,22 +24,17 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); - -/* NQ is the order of Q */ - if (left) { nq = *m; } else { nq = *n; } - if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + } else if (!notran && !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*m < 0) { *info = -3; @@ -256,9 +42,9 @@ f"> */ *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; - } else if (*lda < max(1,nq)) { + } else if (*lda < max(1, nq)) { *info = -7; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -10; } if (*info != 0) { @@ -266,14 +52,10 @@ f"> */ xerbla_((char *)"DORM2L", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0 || *k == 0) { return 0; } - - if (left && notran || ! left && ! notran) { + if (left && notran || !left && !notran) { i1 = 1; i2 = *k; i3 = 1; @@ -282,43 +64,27 @@ f"> */ i2 = 1; i3 = -1; } - if (left) { ni = *n; } else { mi = *m; } - i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { - -/* H(i) is applied to C(1:m-k+i,1:n) */ - mi = *m - *k + i__; } else { - -/* H(i) is applied to C(1:m,1:n-k+i) */ - ni = *n - *k + i__; } - -/* Apply H(i) */ - aii = a[nq - *k + i__ + i__ * a_dim1]; a[nq - *k + i__ + i__ * a_dim1] = 1.; - dlarf_(side, &mi, &ni, &a[i__ * a_dim1 + 1], &c__1, &tau[i__], &c__[ - c_offset], ldc, &work[1], (ftnlen)1); + dlarf_(side, &mi, &ni, &a[i__ * a_dim1 + 1], &c__1, &tau[i__], &c__[c_offset], ldc, + &work[1], (ftnlen)1); a[nq - *k + i__ + i__ * a_dim1] = aii; -/* L10: */ } return 0; - -/* End of DORM2L */ - -} /* dorm2l_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dorm2r.cpp b/lib/linalg/dorm2r.cpp index 1b600a3507..6594725f24 100644 --- a/lib/linalg/dorm2r.cpp +++ b/lib/linalg/dorm2r.cpp @@ -1,230 +1,21 @@ -/* fortran/dorm2r.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined -by sgeqrf (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORM2R + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ -/* WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS */ -/* INTEGER INFO, K, LDA, LDC, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORM2R overwrites the general real m by n matrix C with */ -/* > */ -/* > Q * C if SIDE = 'L' and TRANS = 'N', or */ -/* > */ -/* > Q**T* C if SIDE = 'L' and TRANS = 'T', or */ -/* > */ -/* > C * Q if SIDE = 'R' and TRANS = 'N', or */ -/* > */ -/* > C * Q**T if SIDE = 'R' and TRANS = 'T', */ -/* > */ -/* > where Q is a real orthogonal matrix defined as the product of k */ -/* > elementary reflectors */ -/* > */ -/* > Q = H(1) H(2) . . . H(k) */ -/* > */ -/* > as returned by DGEQRF. Q is of order m if SIDE = 'L' and of order n */ -/* > if SIDE = 'R'. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q or Q**T from the Left */ -/* > = 'R': apply Q or Q**T from the Right */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': apply Q (No transpose) */ -/* > = 'T': apply Q**T (Transpose) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines */ -/* > the matrix Q. */ -/* > If SIDE = 'L', M >= K >= 0; */ -/* > if SIDE = 'R', N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,K) */ -/* > The i-th column must contain the vector which defines the */ -/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ -/* > DGEQRF in the first k columns of its array argument A. */ -/* > A is modified by the routine but restored on exit. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > If SIDE = 'L', LDA >= max(1,M); */ -/* > if SIDE = 'R', LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DGEQRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ -/* > On entry, the m by n matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension */ -/* > (N) if SIDE = 'L', */ -/* > (M) if SIDE = 'R' */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dorm2r_(char *side, char *trans, integer *m, integer *n, - integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *info, ftnlen side_len, - ftnlen trans_len) +int dorm2r_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, + integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, + integer *info, ftnlen side_len, ftnlen trans_len) { - /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; - - /* Local variables */ integer i__, i1, i2, i3, ic, jc, mi, ni, nq; doublereal aii; logical left; - extern /* Subroutine */ int dlarf_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, ftnlen); + extern int dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); logical notran; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -233,22 +24,17 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); - -/* NQ is the order of Q */ - if (left) { nq = *m; } else { nq = *n; } - if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + } else if (!notran && !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*m < 0) { *info = -3; @@ -256,9 +42,9 @@ f"> */ *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; - } else if (*lda < max(1,nq)) { + } else if (*lda < max(1, nq)) { *info = -7; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -10; } if (*info != 0) { @@ -266,14 +52,10 @@ f"> */ xerbla_((char *)"DORM2R", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0 || *k == 0) { return 0; } - - if (left && ! notran || ! left && notran) { + if (left && !notran || !left && notran) { i1 = 1; i2 = *k; i3 = 1; @@ -282,7 +64,6 @@ f"> */ i2 = 1; i3 = -1; } - if (left) { ni = *n; jc = 1; @@ -290,39 +71,24 @@ f"> */ mi = *m; ic = 1; } - i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { - -/* H(i) is applied to C(i:m,1:n) */ - mi = *m - i__ + 1; ic = i__; } else { - -/* H(i) is applied to C(1:m,i:n) */ - ni = *n - i__ + 1; jc = i__; } - -/* Apply H(i) */ - aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; - dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &tau[i__], &c__[ - ic + jc * c_dim1], ldc, &work[1], (ftnlen)1); + dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &tau[i__], &c__[ic + jc * c_dim1], + ldc, &work[1], (ftnlen)1); a[i__ + i__ * a_dim1] = aii; -/* L10: */ } return 0; - -/* End of DORM2R */ - -} /* dorm2r_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dormbr.cpp b/lib/linalg/dormbr.cpp index 8d6bdd60b0..8be8ab13d8 100644 --- a/lib/linalg/dormbr.cpp +++ b/lib/linalg/dormbr.cpp @@ -1,279 +1,36 @@ -/* fortran/dormbr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; - -/* > \brief \b DORMBR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORMBR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORMBR( VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C, */ -/* LDC, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS, VECT */ -/* INTEGER INFO, K, LDA, LDC, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > If VECT = 'Q', DORMBR overwrites the general real M-by-N matrix C */ -/* > with */ -/* > SIDE = 'L' SIDE = 'R' */ -/* > TRANS = 'N': Q * C C * Q */ -/* > TRANS = 'T': Q**T * C C * Q**T */ -/* > */ -/* > If VECT = 'P', DORMBR overwrites the general real M-by-N matrix C */ -/* > with */ -/* > SIDE = 'L' SIDE = 'R' */ -/* > TRANS = 'N': P * C C * P */ -/* > TRANS = 'T': P**T * C C * P**T */ -/* > */ -/* > Here Q and P**T are the orthogonal matrices determined by DGEBRD when */ -/* > reducing a real matrix A to bidiagonal form: A = Q * B * P**T. Q and */ -/* > P**T are defined as products of elementary reflectors H(i) and G(i) */ -/* > respectively. */ -/* > */ -/* > Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the */ -/* > order of the orthogonal matrix Q or P**T that is applied. */ -/* > */ -/* > If VECT = 'Q', A is assumed to have been an NQ-by-K matrix: */ -/* > if nq >= k, Q = H(1) H(2) . . . H(k); */ -/* > if nq < k, Q = H(1) H(2) . . . H(nq-1). */ -/* > */ -/* > If VECT = 'P', A is assumed to have been a K-by-NQ matrix: */ -/* > if k < nq, P = G(1) G(2) . . . G(k); */ -/* > if k >= nq, P = G(1) G(2) . . . G(nq-1). */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] VECT */ -/* > \verbatim */ -/* > VECT is CHARACTER*1 */ -/* > = 'Q': apply Q or Q**T; */ -/* > = 'P': apply P or P**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q, Q**T, P or P**T from the Left; */ -/* > = 'R': apply Q, Q**T, P or P**T from the Right. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': No transpose, apply Q or P; */ -/* > = 'T': Transpose, apply Q**T or P**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > If VECT = 'Q', the number of columns in the original */ -/* > matrix reduced by DGEBRD. */ -/* > If VECT = 'P', the number of rows in the original */ -/* > matrix reduced by DGEBRD. */ -/* > K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension */ -/* > (LDA,min(nq,K)) if VECT = 'Q' */ -/* > (LDA,nq) if VECT = 'P' */ -/* > The vectors which define the elementary reflectors H(i) and */ -/* > G(i), whose products determine the matrices Q and P, as */ -/* > returned by DGEBRD. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > If VECT = 'Q', LDA >= max(1,nq); */ -/* > if VECT = 'P', LDA >= max(1,min(nq,K)). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (min(nq,K)) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i) or G(i) which determines Q or P, as returned */ -/* > by DGEBRD in the array argument TAUQ or TAUP. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ -/* > On entry, the M-by-N matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q */ -/* > or P*C or P**T*C or C*P or C*P**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > If SIDE = 'L', LWORK >= max(1,N); */ -/* > if SIDE = 'R', LWORK >= max(1,M). */ -/* > For optimum performance LWORK >= N*NB if SIDE = 'L', and */ -/* > LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ -/* > blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dormbr_(char *vect, char *side, char *trans, integer *m, - integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, - doublereal *c__, integer *ldc, doublereal *work, integer *lwork, - integer *info, ftnlen vect_len, ftnlen side_len, ftnlen trans_len) +int dormbr_(char *vect, char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, + integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, + integer *lwork, integer *info, ftnlen vect_len, ftnlen side_len, ftnlen trans_len) { - /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2]; char ch__1[2]; - - /* Builtin functions */ - /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); - - /* Local variables */ + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); integer i1, i2, nb, mi, ni, nq, nw; logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dormlq_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dormlq_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen); logical notran; - extern /* Subroutine */ int dormqr_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen); + extern int dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen); logical applyq; char transt[1]; integer lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -282,28 +39,23 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; applyq = lsame_(vect, (char *)"Q", (ftnlen)1, (ftnlen)1); left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - -/* NQ is the order of Q or P and NW is the minimum dimension of WORK */ - if (left) { nq = *m; - nw = max(1,*n); + nw = max(1, *n); } else { nq = *n; - nw = max(1,*m); + nw = max(1, *m); } - if (! applyq && ! lsame_(vect, (char *)"P", (ftnlen)1, (ftnlen)1)) { + if (!applyq && !lsame_(vect, (char *)"P", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + } else if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -2; - } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + } else if (!notran && !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { *info = -3; } else if (*m < 0) { *info = -4; @@ -311,64 +63,53 @@ f"> */ *info = -5; } else if (*k < 0) { *info = -6; - } else /* if(complicated condition) */ { -/* Computing MAX */ - i__1 = 1, i__2 = min(nq,*k); - if (applyq && *lda < max(1,nq) || ! applyq && *lda < max(i__1,i__2)) { + } else { + i__1 = 1, i__2 = min(nq, *k); + if (applyq && *lda < max(1, nq) || !applyq && *lda < max(i__1, i__2)) { *info = -8; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -11; - } else if (*lwork < nw && ! lquery) { + } else if (*lwork < nw && !lquery) { *info = -13; } } - if (*info == 0) { if (applyq) { if (left) { -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *m - 1; i__2 = *m - 1; - nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &i__1, n, &i__2, &c_n1, ( - ftnlen)6, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &i__1, n, &i__2, &c_n1, (ftnlen)6, (ftnlen)2); } else { -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *n - 1; i__2 = *n - 1; - nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &i__1, &i__2, &c_n1, ( - ftnlen)6, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &i__1, &i__2, &c_n1, (ftnlen)6, (ftnlen)2); } } else { if (left) { -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *m - 1; i__2 = *m - 1; - nb = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, &i__1, n, &i__2, &c_n1, ( - ftnlen)6, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, &i__1, n, &i__2, &c_n1, (ftnlen)6, (ftnlen)2); } else { -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); i__1 = *n - 1; i__2 = *n - 1; - nb = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, m, &i__1, &i__2, &c_n1, ( - ftnlen)6, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, m, &i__1, &i__2, &c_n1, (ftnlen)6, (ftnlen)2); } } lwkopt = nw * nb; - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DORMBR", &i__1, (ftnlen)6); @@ -376,29 +117,15 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - work[1] = 1.; if (*m == 0 || *n == 0) { return 0; } - if (applyq) { - -/* Apply Q */ - if (nq >= *k) { - -/* Q was determined by a call to DGEBRD with nq >= k */ - - dormqr_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen)1, ( - ftnlen)1); + dormqr_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[c_offset], ldc, &work[1], + lwork, &iinfo, (ftnlen)1, (ftnlen)1); } else if (nq > 1) { - -/* Q was determined by a call to DGEBRD with nq < k */ - if (left) { mi = *m - 1; ni = *n; @@ -411,30 +138,19 @@ f"> */ i2 = 2; } i__1 = nq - 1; - dormqr_(side, trans, &mi, &ni, &i__1, &a[a_dim1 + 2], lda, &tau[1] - , &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, ( - ftnlen)1, (ftnlen)1); + dormqr_(side, trans, &mi, &ni, &i__1, &a[a_dim1 + 2], lda, &tau[1], + &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, (ftnlen)1, (ftnlen)1); } } else { - -/* Apply P */ - if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } if (nq > *k) { - -/* P was determined by a call to DGEBRD with nq > k */ - - dormlq_(side, transt, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen)1, ( - ftnlen)1); + dormlq_(side, transt, m, n, k, &a[a_offset], lda, &tau[1], &c__[c_offset], ldc, + &work[1], lwork, &iinfo, (ftnlen)1, (ftnlen)1); } else if (nq > 1) { - -/* P was determined by a call to DGEBRD with nq <= k */ - if (left) { mi = *m - 1; ni = *n; @@ -447,18 +163,13 @@ f"> */ i2 = 2; } i__1 = nq - 1; - dormlq_(side, transt, &mi, &ni, &i__1, &a[(a_dim1 << 1) + 1], lda, - &tau[1], &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, & - iinfo, (ftnlen)1, (ftnlen)1); + dormlq_(side, transt, &mi, &ni, &i__1, &a[(a_dim1 << 1) + 1], lda, &tau[1], + &c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, (ftnlen)1, (ftnlen)1); } } - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; return 0; - -/* End of DORMBR */ - -} /* dormbr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dorml2.cpp b/lib/linalg/dorml2.cpp index 7fe1aac941..109315fb14 100644 --- a/lib/linalg/dorml2.cpp +++ b/lib/linalg/dorml2.cpp @@ -1,226 +1,20 @@ -/* fortran/dorml2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DORML2 multiplies a general matrix by the orthogonal matrix from a LQ factorization determined -by sgelqf (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORML2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ -/* WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS */ -/* INTEGER INFO, K, LDA, LDC, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORML2 overwrites the general real m by n matrix C with */ -/* > */ -/* > Q * C if SIDE = 'L' and TRANS = 'N', or */ -/* > */ -/* > Q**T* C if SIDE = 'L' and TRANS = 'T', or */ -/* > */ -/* > C * Q if SIDE = 'R' and TRANS = 'N', or */ -/* > */ -/* > C * Q**T if SIDE = 'R' and TRANS = 'T', */ -/* > */ -/* > where Q is a real orthogonal matrix defined as the product of k */ -/* > elementary reflectors */ -/* > */ -/* > Q = H(k) . . . H(2) H(1) */ -/* > */ -/* > as returned by DGELQF. Q is of order m if SIDE = 'L' and of order n */ -/* > if SIDE = 'R'. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q or Q**T from the Left */ -/* > = 'R': apply Q or Q**T from the Right */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': apply Q (No transpose) */ -/* > = 'T': apply Q**T (Transpose) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines */ -/* > the matrix Q. */ -/* > If SIDE = 'L', M >= K >= 0; */ -/* > if SIDE = 'R', N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension */ -/* > (LDA,M) if SIDE = 'L', */ -/* > (LDA,N) if SIDE = 'R' */ -/* > The i-th row must contain the vector which defines the */ -/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ -/* > DGELQF in the first k rows of its array argument A. */ -/* > A is modified by the routine but restored on exit. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,K). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DGELQF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ -/* > On entry, the m by n matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension */ -/* > (N) if SIDE = 'L', */ -/* > (M) if SIDE = 'R' */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dorml2_(char *side, char *trans, integer *m, integer *n, - integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *info, ftnlen side_len, - ftnlen trans_len) +int dorml2_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, + integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, + integer *info, ftnlen side_len, ftnlen trans_len) { - /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2; - - /* Local variables */ integer i__, i1, i2, i3, ic, jc, mi, ni, nq; doublereal aii; logical left; - extern /* Subroutine */ int dlarf_(char *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, ftnlen); + extern int dlarf_(char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, doublereal *, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); logical notran; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -229,22 +23,17 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); - -/* NQ is the order of Q */ - if (left) { nq = *m; } else { nq = *n; } - if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + } else if (!notran && !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*m < 0) { *info = -3; @@ -252,9 +41,9 @@ f"> */ *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; - } else if (*lda < max(1,*k)) { + } else if (*lda < max(1, *k)) { *info = -7; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -10; } if (*info != 0) { @@ -262,14 +51,10 @@ f"> */ xerbla_((char *)"DORML2", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0 || *k == 0) { return 0; } - - if (left && notran || ! left && ! notran) { + if (left && notran || !left && !notran) { i1 = 1; i2 = *k; i3 = 1; @@ -278,7 +63,6 @@ f"> */ i2 = 1; i3 = -1; } - if (left) { ni = *n; jc = 1; @@ -286,39 +70,24 @@ f"> */ mi = *m; ic = 1; } - i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { - -/* H(i) is applied to C(i:m,1:n) */ - mi = *m - i__ + 1; ic = i__; } else { - -/* H(i) is applied to C(1:m,i:n) */ - ni = *n - i__ + 1; jc = i__; } - -/* Apply H(i) */ - aii = a[i__ + i__ * a_dim1]; a[i__ + i__ * a_dim1] = 1.; - dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], lda, &tau[i__], &c__[ - ic + jc * c_dim1], ldc, &work[1], (ftnlen)1); + dlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], lda, &tau[i__], &c__[ic + jc * c_dim1], ldc, + &work[1], (ftnlen)1); a[i__ + i__ * a_dim1] = aii; -/* L10: */ } return 0; - -/* End of DORML2 */ - -} /* dorml2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dormlq.cpp b/lib/linalg/dormlq.cpp index 79106afb5c..d8bedae2f9 100644 --- a/lib/linalg/dormlq.cpp +++ b/lib/linalg/dormlq.cpp @@ -1,257 +1,39 @@ -/* fortran/dormlq.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static integer c__65 = 65; - -/* > \brief \b DORMLQ */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORMLQ + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORMLQ( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ -/* WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS */ -/* INTEGER INFO, K, LDA, LDC, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORMLQ overwrites the general real M-by-N matrix C with */ -/* > */ -/* > SIDE = 'L' SIDE = 'R' */ -/* > TRANS = 'N': Q * C C * Q */ -/* > TRANS = 'T': Q**T * C C * Q**T */ -/* > */ -/* > where Q is a real orthogonal matrix defined as the product of k */ -/* > elementary reflectors */ -/* > */ -/* > Q = H(k) . . . H(2) H(1) */ -/* > */ -/* > as returned by DGELQF. Q is of order M if SIDE = 'L' and of order N */ -/* > if SIDE = 'R'. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q or Q**T from the Left; */ -/* > = 'R': apply Q or Q**T from the Right. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': No transpose, apply Q; */ -/* > = 'T': Transpose, apply Q**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines */ -/* > the matrix Q. */ -/* > If SIDE = 'L', M >= K >= 0; */ -/* > if SIDE = 'R', N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension */ -/* > (LDA,M) if SIDE = 'L', */ -/* > (LDA,N) if SIDE = 'R' */ -/* > The i-th row must contain the vector which defines the */ -/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ -/* > DGELQF in the first k rows of its array argument A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,K). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DGELQF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ -/* > On entry, the M-by-N matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > If SIDE = 'L', LWORK >= max(1,N); */ -/* > if SIDE = 'R', LWORK >= max(1,M). */ -/* > For good performance, LWORK should generally be larger. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dormlq_(char *side, char *trans, integer *m, integer *n, - integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *lwork, integer *info, - ftnlen side_len, ftnlen trans_len) +int dormlq_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, + integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, + integer *lwork, integer *info, ftnlen side_len, ftnlen trans_len) { - /* System generated locals */ address a__1[2]; - integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, - i__5; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; - - /* Builtin functions */ - /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); - - /* Local variables */ + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); integer i__, i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iwt; logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; - extern /* Subroutine */ int dorml2_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen), dlarfb_(char - *, char *, char *, char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, - ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dorml2_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, ftnlen, + ftnlen), + dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen, ftnlen), + dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); logical notran; integer ldwork; char transt[1]; integer lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -260,25 +42,20 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - -/* NQ is the order of Q and NW is the minimum dimension of WORK */ - if (left) { nq = *m; - nw = max(1,*n); + nw = max(1, *n); } else { nq = *n; - nw = max(1,*m); + nw = max(1, *m); } - if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + } else if (!notran && !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*m < 0) { *info = -3; @@ -286,30 +63,22 @@ f"> */ *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; - } else if (*lda < max(1,*k)) { + } else if (*lda < max(1, *k)) { *info = -7; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -10; - } else if (*lwork < nw && ! lquery) { + } else if (*lwork < nw && !lquery) { *info = -12; } - if (*info == 0) { - -/* Compute the workspace requirements */ - -/* Computing MIN */ -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nb = min(i__1,i__2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMLQ", ch__1, m, n, k, &c_n1, (ftnlen)6, (ftnlen)2); + nb = min(i__1, i__2); lwkopt = nw * nb + 4160; - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DORMLQ", &i__1, (ftnlen)6); @@ -317,42 +86,28 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0 || *k == 0) { work[1] = 1.; return 0; } - nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { if (*lwork < lwkopt) { nb = (*lwork - 4160) / ldwork; -/* Computing MAX */ -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMLQ", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nbmin = max(i__1,i__2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMLQ", ch__1, m, n, k, &c_n1, (ftnlen)6, (ftnlen)2); + nbmin = max(i__1, i__2); } } - if (nb < nbmin || nb >= *k) { - -/* Use unblocked code */ - - dorml2_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + dorml2_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[c_offset], ldc, &work[1], + &iinfo, (ftnlen)1, (ftnlen)1); } else { - -/* Use blocked code */ - iwt = nw * nb + 1; - if (left && notran || ! left && ! notran) { + if (left && notran || !left && !notran) { i1 = 1; i2 = *k; i3 = nb; @@ -361,7 +116,6 @@ f"> */ i2 = 1; i3 = -nb; } - if (left) { ni = *n; jc = 1; @@ -369,56 +123,34 @@ f"> */ mi = *m; ic = 1; } - if (notran) { *(unsigned char *)transt = 'T'; } else { *(unsigned char *)transt = 'N'; } - i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { -/* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; - ib = min(i__4,i__5); - -/* Form the triangular factor of the block reflector */ -/* H = H(i) H(i+1) . . . H(i+ib-1) */ - + ib = min(i__4, i__5); i__4 = nq - i__ + 1; - dlarft_((char *)"Forward", (char *)"Rowwise", &i__4, &ib, &a[i__ + i__ * a_dim1], - lda, &tau[i__], &work[iwt], &c__65, (ftnlen)7, (ftnlen)7); + dlarft_((char *)"Forward", (char *)"Rowwise", &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], + &work[iwt], &c__65, (ftnlen)7, (ftnlen)7); if (left) { - -/* H or H**T is applied to C(i:m,1:n) */ - mi = *m - i__ + 1; ic = i__; } else { - -/* H or H**T is applied to C(1:m,i:n) */ - ni = *n - i__ + 1; jc = i__; } - -/* Apply H or H**T */ - - dlarfb_(side, transt, (char *)"Forward", (char *)"Rowwise", &mi, &ni, &ib, &a[i__ - + i__ * a_dim1], lda, &work[iwt], &c__65, &c__[ic + jc * - c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen)1, ( - ftnlen)7, (ftnlen)7); -/* L10: */ + dlarfb_(side, transt, (char *)"Forward", (char *)"Rowwise", &mi, &ni, &ib, &a[i__ + i__ * a_dim1], lda, + &work[iwt], &c__65, &c__[ic + jc * c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, + (ftnlen)1, (ftnlen)7, (ftnlen)7); } } - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; return 0; - -/* End of DORMLQ */ - -} /* dormlq_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dormql.cpp b/lib/linalg/dormql.cpp index eea324bc69..45c0801c56 100644 --- a/lib/linalg/dormql.cpp +++ b/lib/linalg/dormql.cpp @@ -1,255 +1,37 @@ -/* fortran/dormql.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static integer c__65 = 65; - -/* > \brief \b DORMQL */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORMQL + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORMQL( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ -/* WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS */ -/* INTEGER INFO, K, LDA, LDC, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORMQL overwrites the general real M-by-N matrix C with */ -/* > */ -/* > SIDE = 'L' SIDE = 'R' */ -/* > TRANS = 'N': Q * C C * Q */ -/* > TRANS = 'T': Q**T * C C * Q**T */ -/* > */ -/* > where Q is a real orthogonal matrix defined as the product of k */ -/* > elementary reflectors */ -/* > */ -/* > Q = H(k) . . . H(2) H(1) */ -/* > */ -/* > as returned by DGEQLF. Q is of order M if SIDE = 'L' and of order N */ -/* > if SIDE = 'R'. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q or Q**T from the Left; */ -/* > = 'R': apply Q or Q**T from the Right. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': No transpose, apply Q; */ -/* > = 'T': Transpose, apply Q**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines */ -/* > the matrix Q. */ -/* > If SIDE = 'L', M >= K >= 0; */ -/* > if SIDE = 'R', N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,K) */ -/* > The i-th column must contain the vector which defines the */ -/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ -/* > DGEQLF in the last k columns of its array argument A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > If SIDE = 'L', LDA >= max(1,M); */ -/* > if SIDE = 'R', LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DGEQLF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ -/* > On entry, the M-by-N matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > If SIDE = 'L', LWORK >= max(1,N); */ -/* > if SIDE = 'R', LWORK >= max(1,M). */ -/* > For good performance, LWORK should generally be larger. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dormql_(char *side, char *trans, integer *m, integer *n, - integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *lwork, integer *info, - ftnlen side_len, ftnlen trans_len) +int dormql_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, + integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, + integer *lwork, integer *info, ftnlen side_len, ftnlen trans_len) { - /* System generated locals */ address a__1[2]; - integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, - i__5; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; - - /* Builtin functions */ - /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); - - /* Local variables */ + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); integer i__, i1, i2, i3, ib, nb, mi, ni, nq, nw, iwt; logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; - extern /* Subroutine */ int dorm2l_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen), dlarfb_(char - *, char *, char *, char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, - ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dorm2l_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, ftnlen, + ftnlen), + dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen, ftnlen), + dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); logical notran; integer ldwork, lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -258,25 +40,20 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - -/* NQ is the order of Q and NW is the minimum dimension of WORK */ - if (left) { nq = *m; - nw = max(1,*n); + nw = max(1, *n); } else { nq = *n; - nw = max(1,*m); + nw = max(1, *m); } - if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + } else if (!notran && !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*m < 0) { *info = -3; @@ -284,34 +61,26 @@ f"> */ *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; - } else if (*lda < max(1,nq)) { + } else if (*lda < max(1, nq)) { *info = -7; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -10; - } else if (*lwork < nw && ! lquery) { + } else if (*lwork < nw && !lquery) { *info = -12; } - if (*info == 0) { - -/* Compute the workspace requirements */ - if (*m == 0 || *n == 0) { lwkopt = 1; } else { -/* Computing MIN */ -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMQL", ch__1, m, n, k, &c_n1, - (ftnlen)6, (ftnlen)2); - nb = min(i__1,i__2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMQL", ch__1, m, n, k, &c_n1, (ftnlen)6, (ftnlen)2); + nb = min(i__1, i__2); lwkopt = nw * nb + 4160; } - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DORMQL", &i__1, (ftnlen)6); @@ -319,41 +88,27 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0) { return 0; } - nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { if (*lwork < lwkopt) { nb = (*lwork - 4160) / ldwork; -/* Computing MAX */ -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMQL", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nbmin = max(i__1,i__2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMQL", ch__1, m, n, k, &c_n1, (ftnlen)6, (ftnlen)2); + nbmin = max(i__1, i__2); } } - if (nb < nbmin || nb >= *k) { - -/* Use unblocked code */ - - dorm2l_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + dorm2l_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[c_offset], ldc, &work[1], + &iinfo, (ftnlen)1, (ftnlen)1); } else { - -/* Use blocked code */ - iwt = nw * nb + 1; - if (left && notran || ! left && ! notran) { + if (left && notran || !left && !notran) { i1 = 1; i2 = *k; i3 = nb; @@ -362,55 +117,32 @@ f"> */ i2 = 1; i3 = -nb; } - if (left) { ni = *n; } else { mi = *m; } - i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { -/* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; - ib = min(i__4,i__5); - -/* Form the triangular factor of the block reflector */ -/* H = H(i+ib-1) . . . H(i+1) H(i) */ - + ib = min(i__4, i__5); i__4 = nq - *k + i__ + ib - 1; - dlarft_((char *)"Backward", (char *)"Columnwise", &i__4, &ib, &a[i__ * a_dim1 + 1] - , lda, &tau[i__], &work[iwt], &c__65, (ftnlen)8, (ftnlen) - 10); + dlarft_((char *)"Backward", (char *)"Columnwise", &i__4, &ib, &a[i__ * a_dim1 + 1], lda, &tau[i__], + &work[iwt], &c__65, (ftnlen)8, (ftnlen)10); if (left) { - -/* H or H**T is applied to C(1:m-k+i+ib-1,1:n) */ - mi = *m - *k + i__ + ib - 1; } else { - -/* H or H**T is applied to C(1:m,1:n-k+i+ib-1) */ - ni = *n - *k + i__ + ib - 1; } - -/* Apply H or H**T */ - - dlarfb_(side, trans, (char *)"Backward", (char *)"Columnwise", &mi, &ni, &ib, &a[ - i__ * a_dim1 + 1], lda, &work[iwt], &c__65, &c__[c_offset] - , ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen)1, (ftnlen)8, - (ftnlen)10); -/* L10: */ + dlarfb_(side, trans, (char *)"Backward", (char *)"Columnwise", &mi, &ni, &ib, &a[i__ * a_dim1 + 1], lda, + &work[iwt], &c__65, &c__[c_offset], ldc, &work[1], &ldwork, (ftnlen)1, + (ftnlen)1, (ftnlen)8, (ftnlen)10); } } - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; return 0; - -/* End of DORMQL */ - -} /* dormql_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dormqr.cpp b/lib/linalg/dormqr.cpp index eb43ba8045..25d0c11f60 100644 --- a/lib/linalg/dormqr.cpp +++ b/lib/linalg/dormqr.cpp @@ -1,255 +1,37 @@ -/* fortran/dormqr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static integer c__65 = 65; - -/* > \brief \b DORMQR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORMQR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ -/* WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS */ -/* INTEGER INFO, K, LDA, LDC, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORMQR overwrites the general real M-by-N matrix C with */ -/* > */ -/* > SIDE = 'L' SIDE = 'R' */ -/* > TRANS = 'N': Q * C C * Q */ -/* > TRANS = 'T': Q**T * C C * Q**T */ -/* > */ -/* > where Q is a real orthogonal matrix defined as the product of k */ -/* > elementary reflectors */ -/* > */ -/* > Q = H(1) H(2) . . . H(k) */ -/* > */ -/* > as returned by DGEQRF. Q is of order M if SIDE = 'L' and of order N */ -/* > if SIDE = 'R'. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q or Q**T from the Left; */ -/* > = 'R': apply Q or Q**T from the Right. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': No transpose, apply Q; */ -/* > = 'T': Transpose, apply Q**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines */ -/* > the matrix Q. */ -/* > If SIDE = 'L', M >= K >= 0; */ -/* > if SIDE = 'R', N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,K) */ -/* > The i-th column must contain the vector which defines the */ -/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ -/* > DGEQRF in the first k columns of its array argument A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > If SIDE = 'L', LDA >= max(1,M); */ -/* > if SIDE = 'R', LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DGEQRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ -/* > On entry, the M-by-N matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > If SIDE = 'L', LWORK >= max(1,N); */ -/* > if SIDE = 'R', LWORK >= max(1,M). */ -/* > For good performance, LWORK should generally be larger. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dormqr_(char *side, char *trans, integer *m, integer *n, - integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *lwork, integer *info, - ftnlen side_len, ftnlen trans_len) +int dormqr_(char *side, char *trans, integer *m, integer *n, integer *k, doublereal *a, + integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, + integer *lwork, integer *info, ftnlen side_len, ftnlen trans_len) { - /* System generated locals */ address a__1[2]; - integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, - i__5; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; - - /* Builtin functions */ - /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); - - /* Local variables */ + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); integer i__, i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iwt; logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; - extern /* Subroutine */ int dorm2r_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen), dlarfb_(char - *, char *, char *, char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, - ftnlen), dlarft_(char *, char *, integer *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dorm2r_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, ftnlen, + ftnlen), + dlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen, ftnlen), + dlarft_(char *, char *, integer *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); logical notran; integer ldwork, lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -258,25 +40,20 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - -/* NQ is the order of Q and NW is the minimum dimension of WORK */ - if (left) { nq = *m; - nw = max(1,*n); + nw = max(1, *n); } else { nq = *n; - nw = max(1,*m); + nw = max(1, *m); } - if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! notran && ! lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { + } else if (!notran && !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*m < 0) { *info = -3; @@ -284,30 +61,22 @@ f"> */ *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; - } else if (*lda < max(1,nq)) { + } else if (*lda < max(1, nq)) { *info = -7; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -10; - } else if (*lwork < nw && ! lquery) { + } else if (*lwork < nw && !lquery) { *info = -12; } - if (*info == 0) { - -/* Compute the workspace requirements */ - -/* Computing MIN */ -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nb = min(i__1,i__2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, n, k, &c_n1, (ftnlen)6, (ftnlen)2); + nb = min(i__1, i__2); lwkopt = nw * nb + 4160; - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DORMQR", &i__1, (ftnlen)6); @@ -315,42 +84,28 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0 || *k == 0) { work[1] = 1.; return 0; } - nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { if (*lwork < lwkopt) { nb = (*lwork - 4160) / ldwork; -/* Computing MAX */ -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMQR", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nbmin = max(i__1,i__2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"DORMQR", ch__1, m, n, k, &c_n1, (ftnlen)6, (ftnlen)2); + nbmin = max(i__1, i__2); } } - if (nb < nbmin || nb >= *k) { - -/* Use unblocked code */ - - dorm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + dorm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[c_offset], ldc, &work[1], + &iinfo, (ftnlen)1, (ftnlen)1); } else { - -/* Use blocked code */ - iwt = nw * nb + 1; - if (left && ! notran || ! left && notran) { + if (left && !notran || !left && notran) { i1 = 1; i2 = *k; i3 = nb; @@ -359,7 +114,6 @@ f"> */ i2 = 1; i3 = -nb; } - if (left) { ni = *n; jc = 1; @@ -367,51 +121,29 @@ f"> */ mi = *m; ic = 1; } - i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { -/* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; - ib = min(i__4,i__5); - -/* Form the triangular factor of the block reflector */ -/* H = H(i) H(i+1) . . . H(i+ib-1) */ - + ib = min(i__4, i__5); i__4 = nq - i__ + 1; - dlarft_((char *)"Forward", (char *)"Columnwise", &i__4, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[iwt], &c__65, (ftnlen)7, ( - ftnlen)10); + dlarft_((char *)"Forward", (char *)"Columnwise", &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], + &work[iwt], &c__65, (ftnlen)7, (ftnlen)10); if (left) { - -/* H or H**T is applied to C(i:m,1:n) */ - mi = *m - i__ + 1; ic = i__; } else { - -/* H or H**T is applied to C(1:m,i:n) */ - ni = *n - i__ + 1; jc = i__; } - -/* Apply H or H**T */ - - dlarfb_(side, trans, (char *)"Forward", (char *)"Columnwise", &mi, &ni, &ib, &a[ - i__ + i__ * a_dim1], lda, &work[iwt], &c__65, &c__[ic + - jc * c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen) - 1, (ftnlen)7, (ftnlen)10); -/* L10: */ + dlarfb_(side, trans, (char *)"Forward", (char *)"Columnwise", &mi, &ni, &ib, &a[i__ + i__ * a_dim1], + lda, &work[iwt], &c__65, &c__[ic + jc * c_dim1], ldc, &work[1], &ldwork, + (ftnlen)1, (ftnlen)1, (ftnlen)7, (ftnlen)10); } } - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; return 0; - -/* End of DORMQR */ - -} /* dormqr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dormtr.cpp b/lib/linalg/dormtr.cpp index 0f0cdac3db..9fc489ef42 100644 --- a/lib/linalg/dormtr.cpp +++ b/lib/linalg/dormtr.cpp @@ -1,253 +1,34 @@ -/* fortran/dormtr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; - -/* > \brief \b DORMTR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DORMTR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DORMTR( SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, */ -/* WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS, UPLO */ -/* INTEGER INFO, LDA, LDC, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DORMTR overwrites the general real M-by-N matrix C with */ -/* > */ -/* > SIDE = 'L' SIDE = 'R' */ -/* > TRANS = 'N': Q * C C * Q */ -/* > TRANS = 'T': Q**T * C C * Q**T */ -/* > */ -/* > where Q is a real orthogonal matrix of order nq, with nq = m if */ -/* > SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of */ -/* > nq-1 elementary reflectors, as returned by DSYTRD: */ -/* > */ -/* > if UPLO = 'U', Q = H(nq-1) . . . H(2) H(1); */ -/* > */ -/* > if UPLO = 'L', Q = H(1) H(2) . . . H(nq-1). */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q or Q**T from the Left; */ -/* > = 'R': apply Q or Q**T from the Right. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A contains elementary reflectors */ -/* > from DSYTRD; */ -/* > = 'L': Lower triangle of A contains elementary reflectors */ -/* > from DSYTRD. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': No transpose, apply Q; */ -/* > = 'T': Transpose, apply Q**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension */ -/* > (LDA,M) if SIDE = 'L' */ -/* > (LDA,N) if SIDE = 'R' */ -/* > The vectors which define the elementary reflectors, as */ -/* > returned by DSYTRD. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > LDA >= max(1,M) if SIDE = 'L'; LDA >= max(1,N) if SIDE = 'R'. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension */ -/* > (M-1) if SIDE = 'L' */ -/* > (N-1) if SIDE = 'R' */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by DSYTRD. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension (LDC,N) */ -/* > On entry, the M-by-N matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > If SIDE = 'L', LWORK >= max(1,N); */ -/* > if SIDE = 'R', LWORK >= max(1,M). */ -/* > For optimum performance LWORK >= N*NB if SIDE = 'L', and */ -/* > LWORK >= M*NB if SIDE = 'R', where NB is the optimal */ -/* > blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dormtr_(char *side, char *uplo, char *trans, integer *m, - integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal * - c__, integer *ldc, doublereal *work, integer *lwork, integer *info, - ftnlen side_len, ftnlen uplo_len, ftnlen trans_len) +int dormtr_(char *side, char *uplo, char *trans, integer *m, integer *n, doublereal *a, + integer *lda, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work, + integer *lwork, integer *info, ftnlen side_len, ftnlen uplo_len, ftnlen trans_len) { - /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1[2], i__2, i__3; char ch__1[2]; - - /* Builtin functions */ - /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); - - /* Local variables */ + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); integer i1, i2, nb, mi, ni, nq, nw; logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; logical upper; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dormql_(char *, char *, integer *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen), - dormqr_(char *, char *, integer *, integer *, integer *, - doublereal *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, integer *, ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dormql_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen), + dormqr_(char *, char *, integer *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, ftnlen, + ftnlen); integer lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -256,87 +37,72 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - -/* NQ is the order of Q and NW is the minimum dimension of WORK */ - if (left) { nq = *m; - nw = max(1,*n); + nw = max(1, *n); } else { nq = *n; - nw = max(1,*m); + nw = max(1, *m); } - if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + } else if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -2; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1)) { + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1)) { *info = -3; } else if (*m < 0) { *info = -4; } else if (*n < 0) { *info = -5; - } else if (*lda < max(1,nq)) { + } else if (*lda < max(1, nq)) { *info = -7; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -10; - } else if (*lwork < nw && ! lquery) { + } else if (*lwork < nw && !lquery) { *info = -12; } - if (*info == 0) { if (upper) { if (left) { -/* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *m - 1; i__3 = *m - 1; - nb = ilaenv_(&c__1, (char *)"DORMQL", ch__1, &i__2, n, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DORMQL", ch__1, &i__2, n, &i__3, &c_n1, (ftnlen)6, (ftnlen)2); } else { -/* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *n - 1; i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"DORMQL", ch__1, m, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DORMQL", ch__1, m, &i__2, &i__3, &c_n1, (ftnlen)6, (ftnlen)2); } } else { if (left) { -/* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *m - 1; i__3 = *m - 1; - nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &i__2, n, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, &i__2, n, &i__3, &c_n1, (ftnlen)6, (ftnlen)2); } else { -/* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *n - 1; i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DORMQR", ch__1, m, &i__2, &i__3, &c_n1, (ftnlen)6, (ftnlen)2); } } lwkopt = nw * nb; - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; } - if (*info != 0) { i__2 = -(*info); xerbla_((char *)"DORMTR", &i__2, (ftnlen)6); @@ -344,14 +110,10 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0 || nq == 1) { work[1] = 1.; return 0; } - if (left) { mi = *m - 1; ni = *n; @@ -359,19 +121,11 @@ f"> */ mi = *m; ni = *n - 1; } - if (upper) { - -/* Q was determined by a call to DSYTRD with UPLO = 'U' */ - i__2 = nq - 1; - dormql_(side, trans, &mi, &ni, &i__2, &a[(a_dim1 << 1) + 1], lda, & - tau[1], &c__[c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen) - 1, (ftnlen)1); + dormql_(side, trans, &mi, &ni, &i__2, &a[(a_dim1 << 1) + 1], lda, &tau[1], &c__[c_offset], + ldc, &work[1], lwork, &iinfo, (ftnlen)1, (ftnlen)1); } else { - -/* Q was determined by a call to DSYTRD with UPLO = 'L' */ - if (left) { i1 = 2; i2 = 1; @@ -380,17 +134,12 @@ f"> */ i2 = 2; } i__2 = nq - 1; - dormqr_(side, trans, &mi, &ni, &i__2, &a[a_dim1 + 2], lda, &tau[1], & - c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, (ftnlen) - 1, (ftnlen)1); + dormqr_(side, trans, &mi, &ni, &i__2, &a[a_dim1 + 2], lda, &tau[1], &c__[i1 + i2 * c_dim1], + ldc, &work[1], lwork, &iinfo, (ftnlen)1, (ftnlen)1); } - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; return 0; - -/* End of DORMTR */ - -} /* dormtr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dposv.cpp b/lib/linalg/dposv.cpp index 370c261bf0..c61c591e0a 100644 --- a/lib/linalg/dposv.cpp +++ b/lib/linalg/dposv.cpp @@ -1,207 +1,32 @@ -/* fortran/dposv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief DPOSV computes the solution to system of linear equations A * X = B for PO matrices */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DPOSV + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DPOSV( UPLO, N, NRHS, A, LDA, B, LDB, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDA, LDB, N, NRHS */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DPOSV computes the solution to a real system of linear equations */ -/* > A * X = B, */ -/* > where A is an N-by-N symmetric positive definite matrix and X and B */ -/* > are N-by-NRHS matrices. */ -/* > */ -/* > The Cholesky decomposition is used to factor A as */ -/* > A = U**T* U, if UPLO = 'U', or */ -/* > A = L * L**T, if UPLO = 'L', */ -/* > where U is an upper triangular matrix and L is a lower triangular */ -/* > matrix. The factored form of A is then used to solve the system of */ -/* > equations A * X = B. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A is stored; */ -/* > = 'L': Lower triangle of A is stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of linear equations, i.e., the order of the */ -/* > matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NRHS */ -/* > \verbatim */ -/* > NRHS is INTEGER */ -/* > The number of right hand sides, i.e., the number of columns */ -/* > of the matrix B. NRHS >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ -/* > N-by-N upper triangular part of A contains the upper */ -/* > triangular part of the matrix A, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading N-by-N lower triangular part of A contains the lower */ -/* > triangular part of the matrix A, and the strictly upper */ -/* > triangular part of A is not referenced. */ -/* > */ -/* > On exit, if INFO = 0, the factor U or L from the Cholesky */ -/* > factorization A = U**T*U or A = L*L**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ -/* > On entry, the N-by-NRHS right hand side matrix B. */ -/* > On exit, if INFO = 0, the N-by-NRHS solution matrix X. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, the leading minor of order i of A is not */ -/* > positive definite, so the factorization could not be */ -/* > completed, and the solution has not been computed. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doublePOsolve */ - -/* ===================================================================== */ -/* Subroutine */ int dposv_(char *uplo, integer *n, integer *nrhs, doublereal - *a, integer *lda, doublereal *b, integer *ldb, integer *info, ftnlen - uplo_len) +int dposv_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, + integer *ldb, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; - - /* Local variables */ extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dpotrf_( - char *, integer *, doublereal *, integer *, integer *, ftnlen), - dpotrs_(char *, integer *, integer *, doublereal *, integer *, - doublereal *, integer *, integer *, ftnlen); - - -/* -- LAPACK driver routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen), + dpotrf_(char *, integer *, doublereal *, integer *, integer *, ftnlen), + dpotrs_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; - - /* Function Body */ *info = 0; - if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -5; - } else if (*ldb < max(1,*n)) { + } else if (*ldb < max(1, *n)) { *info = -7; } if (*info != 0) { @@ -209,24 +34,12 @@ extern "C" { xerbla_((char *)"DPOSV ", &i__1, (ftnlen)6); return 0; } - -/* Compute the Cholesky factorization A = U**T*U or A = L*L**T. */ - dpotrf_(uplo, n, &a[a_offset], lda, info, (ftnlen)1); if (*info == 0) { - -/* Solve the system A*X = B, overwriting B with X. */ - - dpotrs_(uplo, n, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info, ( - ftnlen)1); - + dpotrs_(uplo, n, nrhs, &a[a_offset], lda, &b[b_offset], ldb, info, (ftnlen)1); } return 0; - -/* End of DPOSV */ - -} /* dposv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dpotf2.cpp b/lib/linalg/dpotf2.cpp index 987db22578..4a2e84af28 100644 --- a/lib/linalg/dpotf2.cpp +++ b/lib/linalg/dpotf2.cpp @@ -1,201 +1,35 @@ -/* fortran/dpotf2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static doublereal c_b10 = -1.; static doublereal c_b12 = 1.; - -/* > \brief \b DPOTF2 computes the Cholesky factorization of a symmetric/Hermitian positive definite matrix (u -nblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DPOTF2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DPOTF2( UPLO, N, A, LDA, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDA, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DPOTF2 computes the Cholesky factorization of a real symmetric */ -/* > positive definite matrix A. */ -/* > */ -/* > The factorization has the form */ -/* > A = U**T * U , if UPLO = 'U', or */ -/* > A = L * L**T, if UPLO = 'L', */ -/* > where U is an upper triangular matrix and L is lower triangular. */ -/* > */ -/* > This is the unblocked version of the algorithm, calling Level 2 BLAS. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies whether the upper or lower triangular part of the */ -/* > symmetric matrix A is stored. */ -/* > = 'U': Upper triangular */ -/* > = 'L': Lower triangular */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ -/* > n by n upper triangular part of A contains the upper */ -/* > triangular part of the matrix A, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading n by n lower triangular part of A contains the lower */ -/* > triangular part of the matrix A, and the strictly upper */ -/* > triangular part of A is not referenced. */ -/* > */ -/* > On exit, if INFO = 0, the factor U or L from the Cholesky */ -/* > factorization A = U**T *U or A = L*L**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -k, the k-th argument had an illegal value */ -/* > > 0: if INFO = k, the leading minor of order k is not */ -/* > positive definite, and the factorization could not be */ -/* > completed. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doublePOcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dpotf2_(char *uplo, integer *n, doublereal *a, integer * - lda, integer *info, ftnlen uplo_len) +int dpotf2_(char *uplo, integer *n, doublereal *a, integer *lda, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ integer j; doublereal ajj; - extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, - integer *); - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, integer *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dgemv_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - doublereal *, doublereal *, integer *, ftnlen); + extern int dgemv_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen); logical upper; extern logical disnan_(doublereal *); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -4; } if (*info != 0) { @@ -203,92 +37,59 @@ f"> */ xerbla_((char *)"DPOTF2", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - if (upper) { - -/* Compute the Cholesky factorization A = U**T *U. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { - -/* Compute U(J,J) and test for non-positive-definiteness. */ - i__2 = j - 1; - ajj = a[j + j * a_dim1] - ddot_(&i__2, &a[j * a_dim1 + 1], &c__1, - &a[j * a_dim1 + 1], &c__1); + ajj = a[j + j * a_dim1] - + ddot_(&i__2, &a[j * a_dim1 + 1], &c__1, &a[j * a_dim1 + 1], &c__1); if (ajj <= 0. || disnan_(&ajj)) { a[j + j * a_dim1] = ajj; goto L30; } ajj = sqrt(ajj); a[j + j * a_dim1] = ajj; - -/* Compute elements J+1:N of row J. */ - if (j < *n) { i__2 = j - 1; i__3 = *n - j; - dgemv_((char *)"Transpose", &i__2, &i__3, &c_b10, &a[(j + 1) * a_dim1 - + 1], lda, &a[j * a_dim1 + 1], &c__1, &c_b12, &a[j + ( - j + 1) * a_dim1], lda, (ftnlen)9); + dgemv_((char *)"Transpose", &i__2, &i__3, &c_b10, &a[(j + 1) * a_dim1 + 1], lda, + &a[j * a_dim1 + 1], &c__1, &c_b12, &a[j + (j + 1) * a_dim1], lda, (ftnlen)9); i__2 = *n - j; d__1 = 1. / ajj; dscal_(&i__2, &d__1, &a[j + (j + 1) * a_dim1], lda); } -/* L10: */ } } else { - -/* Compute the Cholesky factorization A = L*L**T. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { - -/* Compute L(J,J) and test for non-positive-definiteness. */ - i__2 = j - 1; - ajj = a[j + j * a_dim1] - ddot_(&i__2, &a[j + a_dim1], lda, &a[j - + a_dim1], lda); + ajj = a[j + j * a_dim1] - ddot_(&i__2, &a[j + a_dim1], lda, &a[j + a_dim1], lda); if (ajj <= 0. || disnan_(&ajj)) { a[j + j * a_dim1] = ajj; goto L30; } ajj = sqrt(ajj); a[j + j * a_dim1] = ajj; - -/* Compute elements J+1:N of column J. */ - if (j < *n) { i__2 = *n - j; i__3 = j - 1; - dgemv_((char *)"No transpose", &i__2, &i__3, &c_b10, &a[j + 1 + - a_dim1], lda, &a[j + a_dim1], lda, &c_b12, &a[j + 1 + - j * a_dim1], &c__1, (ftnlen)12); + dgemv_((char *)"No transpose", &i__2, &i__3, &c_b10, &a[j + 1 + a_dim1], lda, + &a[j + a_dim1], lda, &c_b12, &a[j + 1 + j * a_dim1], &c__1, (ftnlen)12); i__2 = *n - j; d__1 = 1. / ajj; dscal_(&i__2, &d__1, &a[j + 1 + j * a_dim1], &c__1); } -/* L20: */ } } goto L40; - L30: *info = j; - L40: return 0; - -/* End of DPOTF2 */ - -} /* dpotf2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dpotrf.cpp b/lib/linalg/dpotrf.cpp index 6dc003ab93..63caf94920 100644 --- a/lib/linalg/dpotrf.cpp +++ b/lib/linalg/dpotrf.cpp @@ -1,198 +1,39 @@ -/* fortran/dpotrf.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b13 = -1.; static doublereal c_b14 = 1.; - -/* > \brief \b DPOTRF */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DPOTRF + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DPOTRF( UPLO, N, A, LDA, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDA, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DPOTRF computes the Cholesky factorization of a real symmetric */ -/* > positive definite matrix A. */ -/* > */ -/* > The factorization has the form */ -/* > A = U**T * U, if UPLO = 'U', or */ -/* > A = L * L**T, if UPLO = 'L', */ -/* > where U is an upper triangular matrix and L is lower triangular. */ -/* > */ -/* > This is the block version of the algorithm, calling Level 3 BLAS. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A is stored; */ -/* > = 'L': Lower triangle of A is stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ -/* > N-by-N upper triangular part of A contains the upper */ -/* > triangular part of the matrix A, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading N-by-N lower triangular part of A contains the lower */ -/* > triangular part of the matrix A, and the strictly upper */ -/* > triangular part of A is not referenced. */ -/* > */ -/* > On exit, if INFO = 0, the factor U or L from the Cholesky */ -/* > factorization A = U**T*U or A = L*L**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, the leading minor of order i is not */ -/* > positive definite, and the factorization could not be */ -/* > completed. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doublePOcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dpotrf_(char *uplo, integer *n, doublereal *a, integer * - lda, integer *info, ftnlen uplo_len) +int dpotrf_(char *uplo, integer *n, doublereal *a, integer *lda, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; - - /* Local variables */ integer j, jb, nb; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen); logical upper; - extern /* Subroutine */ int dsyrk_(char *, char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, doublereal *, - integer *, ftnlen, ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dpotrf2_(char *, integer *, doublereal *, - integer *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int dsyrk_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dpotrf2_(char *, integer *, doublereal *, integer *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -4; } if (*info != 0) { @@ -200,123 +41,71 @@ f"> */ xerbla_((char *)"DPOTRF", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - -/* Determine the block size for this environment. */ - - nb = ilaenv_(&c__1, (char *)"DPOTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( - ftnlen)1); + nb = ilaenv_(&c__1, (char *)"DPOTRF", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); if (nb <= 1 || nb >= *n) { - -/* Use unblocked code. */ - dpotrf2_(uplo, n, &a[a_offset], lda, info, (ftnlen)1); } else { - -/* Use blocked code. */ - if (upper) { - -/* Compute the Cholesky factorization A = U**T*U. */ - i__1 = *n; i__2 = nb; for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) { - -/* Update and factorize the current diagonal block and test */ -/* for non-positive-definiteness. */ - -/* Computing MIN */ i__3 = nb, i__4 = *n - j + 1; - jb = min(i__3,i__4); + jb = min(i__3, i__4); i__3 = j - 1; - dsyrk_((char *)"Upper", (char *)"Transpose", &jb, &i__3, &c_b13, &a[j * - a_dim1 + 1], lda, &c_b14, &a[j + j * a_dim1], lda, ( - ftnlen)5, (ftnlen)9); - dpotrf2_((char *)"Upper", &jb, &a[j + j * a_dim1], lda, info, (ftnlen) - 5); + dsyrk_((char *)"Upper", (char *)"Transpose", &jb, &i__3, &c_b13, &a[j * a_dim1 + 1], lda, &c_b14, + &a[j + j * a_dim1], lda, (ftnlen)5, (ftnlen)9); + dpotrf2_((char *)"Upper", &jb, &a[j + j * a_dim1], lda, info, (ftnlen)5); if (*info != 0) { goto L30; } if (j + jb <= *n) { - -/* Compute the current block row. */ - i__3 = *n - j - jb + 1; i__4 = j - 1; - dgemm_((char *)"Transpose", (char *)"No transpose", &jb, &i__3, &i__4, & - c_b13, &a[j * a_dim1 + 1], lda, &a[(j + jb) * - a_dim1 + 1], lda, &c_b14, &a[j + (j + jb) * - a_dim1], lda, (ftnlen)9, (ftnlen)12); + dgemm_((char *)"Transpose", (char *)"No transpose", &jb, &i__3, &i__4, &c_b13, + &a[j * a_dim1 + 1], lda, &a[(j + jb) * a_dim1 + 1], lda, &c_b14, + &a[j + (j + jb) * a_dim1], lda, (ftnlen)9, (ftnlen)12); i__3 = *n - j - jb + 1; - dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", &jb, & - i__3, &c_b14, &a[j + j * a_dim1], lda, &a[j + (j - + jb) * a_dim1], lda, (ftnlen)4, (ftnlen)5, ( - ftnlen)9, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", &jb, &i__3, &c_b14, + &a[j + j * a_dim1], lda, &a[j + (j + jb) * a_dim1], lda, (ftnlen)4, + (ftnlen)5, (ftnlen)9, (ftnlen)8); } -/* L10: */ } - } else { - -/* Compute the Cholesky factorization A = L*L**T. */ - i__2 = *n; i__1 = nb; for (j = 1; i__1 < 0 ? j >= i__2 : j <= i__2; j += i__1) { - -/* Update and factorize the current diagonal block and test */ -/* for non-positive-definiteness. */ - -/* Computing MIN */ i__3 = nb, i__4 = *n - j + 1; - jb = min(i__3,i__4); + jb = min(i__3, i__4); i__3 = j - 1; - dsyrk_((char *)"Lower", (char *)"No transpose", &jb, &i__3, &c_b13, &a[j + - a_dim1], lda, &c_b14, &a[j + j * a_dim1], lda, ( - ftnlen)5, (ftnlen)12); - dpotrf2_((char *)"Lower", &jb, &a[j + j * a_dim1], lda, info, (ftnlen) - 5); + dsyrk_((char *)"Lower", (char *)"No transpose", &jb, &i__3, &c_b13, &a[j + a_dim1], lda, &c_b14, + &a[j + j * a_dim1], lda, (ftnlen)5, (ftnlen)12); + dpotrf2_((char *)"Lower", &jb, &a[j + j * a_dim1], lda, info, (ftnlen)5); if (*info != 0) { goto L30; } if (j + jb <= *n) { - -/* Compute the current block column. */ - i__3 = *n - j - jb + 1; i__4 = j - 1; - dgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &jb, &i__4, & - c_b13, &a[j + jb + a_dim1], lda, &a[j + a_dim1], - lda, &c_b14, &a[j + jb + j * a_dim1], lda, ( - ftnlen)12, (ftnlen)9); + dgemm_((char *)"No transpose", (char *)"Transpose", &i__3, &jb, &i__4, &c_b13, + &a[j + jb + a_dim1], lda, &a[j + a_dim1], lda, &c_b14, + &a[j + jb + j * a_dim1], lda, (ftnlen)12, (ftnlen)9); i__3 = *n - j - jb + 1; - dtrsm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Non-unit", &i__3, & - jb, &c_b14, &a[j + j * a_dim1], lda, &a[j + jb + - j * a_dim1], lda, (ftnlen)5, (ftnlen)5, (ftnlen)9, - (ftnlen)8); + dtrsm_((char *)"Right", (char *)"Lower", (char *)"Transpose", (char *)"Non-unit", &i__3, &jb, &c_b14, + &a[j + j * a_dim1], lda, &a[j + jb + j * a_dim1], lda, (ftnlen)5, + (ftnlen)5, (ftnlen)9, (ftnlen)8); } -/* L20: */ } } } goto L40; - L30: *info = *info + j - 1; - L40: return 0; - -/* End of DPOTRF */ - -} /* dpotrf_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dpotrf2.cpp b/lib/linalg/dpotrf2.cpp index 61f9c83af6..af2e45eb36 100644 --- a/lib/linalg/dpotrf2.cpp +++ b/lib/linalg/dpotrf2.cpp @@ -1,191 +1,34 @@ -/* static/dpotrf2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b9 = 1.; static doublereal c_b11 = -1.; - -/* > \brief \b DPOTRF2 */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* RECURSIVE SUBROUTINE DPOTRF2( UPLO, N, A, LDA, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDA, N */ -/* .. */ -/* .. Array Arguments .. */ -/* REAL A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DPOTRF2 computes the Cholesky factorization of a real symmetric */ -/* > positive definite matrix A using the recursive algorithm. */ -/* > */ -/* > The factorization has the form */ -/* > A = U**T * U, if UPLO = 'U', or */ -/* > A = L * L**T, if UPLO = 'L', */ -/* > where U is an upper triangular matrix and L is lower triangular. */ -/* > */ -/* > This is the recursive version of the algorithm. It divides */ -/* > the matrix into four submatrices: */ -/* > */ -/* > [ A11 | A12 ] where A11 is n1 by n1 and A22 is n2 by n2 */ -/* > A = [ -----|----- ] with n1 = n/2 */ -/* > [ A21 | A22 ] n2 = n-n1 */ -/* > */ -/* > The subroutine calls itself to factor A11. Update and scale A21 */ -/* > or A12, update A22 then calls itself to factor A22. */ -/* > */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A is stored; */ -/* > = 'L': Lower triangle of A is stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ -/* > N-by-N upper triangular part of A contains the upper */ -/* > triangular part of the matrix A, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading N-by-N lower triangular part of A contains the lower */ -/* > triangular part of the matrix A, and the strictly upper */ -/* > triangular part of A is not referenced. */ -/* > */ -/* > On exit, if INFO = 0, the factor U or L from the Cholesky */ -/* > factorization A = U**T*U or A = L*L**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, the leading minor of order i is not */ -/* > positive definite, and the factorization could not be */ -/* > completed. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doublePOcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dpotrf2_(char *uplo, integer *n, doublereal *a, integer * - lda, integer *info, ftnlen uplo_len) +int dpotrf2_(char *uplo, integer *n, doublereal *a, integer *lda, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ integer n1, n2; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen); logical upper; - extern /* Subroutine */ int dsyrk_(char *, char *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, doublereal *, - integer *, ftnlen, ftnlen); + extern int dsyrk_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, doublereal *, integer *, ftnlen, ftnlen); extern logical disnan_(doublereal *); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -4; } if (*info != 0) { @@ -193,81 +36,39 @@ static doublereal c_b11 = -1.; xerbla_((char *)"DPOTRF2", &i__1, (ftnlen)7); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - -/* N=1 case */ - if (*n == 1) { - -/* Test for non-positive-definiteness */ - if (a[a_dim1 + 1] <= 0. || disnan_(&a[a_dim1 + 1])) { *info = 1; return 0; } - -/* Factor */ - a[a_dim1 + 1] = sqrt(a[a_dim1 + 1]); - -/* Use recursive code */ - } else { n1 = *n / 2; n2 = *n - n1; - -/* Factor A11 */ - dpotrf2_(uplo, &n1, &a[a_dim1 + 1], lda, &iinfo, (ftnlen)1); if (iinfo != 0) { *info = iinfo; return 0; } - -/* Compute the Cholesky factorization A = U**T*U */ - if (upper) { - -/* Update and scale A12 */ - - dtrsm_((char *)"L", (char *)"U", (char *)"T", (char *)"N", &n1, &n2, &c_b9, &a[a_dim1 + 1], lda, & - a[(n1 + 1) * a_dim1 + 1], lda, (ftnlen)1, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); - -/* Update and factor A22 */ - - dsyrk_(uplo, (char *)"T", &n2, &n1, &c_b11, &a[(n1 + 1) * a_dim1 + 1], - lda, &c_b9, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, (ftnlen) - 1, (ftnlen)1); - dpotrf2_(uplo, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &iinfo, ( - ftnlen)1); + dtrsm_((char *)"L", (char *)"U", (char *)"T", (char *)"N", &n1, &n2, &c_b9, &a[a_dim1 + 1], lda, + &a[(n1 + 1) * a_dim1 + 1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dsyrk_(uplo, (char *)"T", &n2, &n1, &c_b11, &a[(n1 + 1) * a_dim1 + 1], lda, &c_b9, + &a[n1 + 1 + (n1 + 1) * a_dim1], lda, (ftnlen)1, (ftnlen)1); + dpotrf2_(uplo, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &iinfo, (ftnlen)1); if (iinfo != 0) { *info = iinfo + n1; return 0; } - -/* Compute the Cholesky factorization A = L*L**T */ - } else { - -/* Update and scale A21 */ - - dtrsm_((char *)"R", (char *)"L", (char *)"T", (char *)"N", &n2, &n1, &c_b9, &a[a_dim1 + 1], lda, & - a[n1 + 1 + a_dim1], lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, - (ftnlen)1); - -/* Update and factor A22 */ - - dsyrk_(uplo, (char *)"N", &n2, &n1, &c_b11, &a[n1 + 1 + a_dim1], lda, & - c_b9, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, (ftnlen)1, ( - ftnlen)1); - dpotrf2_(uplo, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &iinfo, ( - ftnlen)1); + dtrsm_((char *)"R", (char *)"L", (char *)"T", (char *)"N", &n2, &n1, &c_b9, &a[a_dim1 + 1], lda, &a[n1 + 1 + a_dim1], + lda, (ftnlen)1, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dsyrk_(uplo, (char *)"N", &n2, &n1, &c_b11, &a[n1 + 1 + a_dim1], lda, &c_b9, + &a[n1 + 1 + (n1 + 1) * a_dim1], lda, (ftnlen)1, (ftnlen)1); + dpotrf2_(uplo, &n2, &a[n1 + 1 + (n1 + 1) * a_dim1], lda, &iinfo, (ftnlen)1); if (iinfo != 0) { *info = iinfo + n1; return 0; @@ -275,11 +76,7 @@ static doublereal c_b11 = -1.; } } return 0; - -/* End of DPOTRF2 */ - -} /* dpotrf2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dpotrs.cpp b/lib/linalg/dpotrs.cpp index c8cc0e0d68..c9ccf42f6d 100644 --- a/lib/linalg/dpotrs.cpp +++ b/lib/linalg/dpotrs.cpp @@ -1,196 +1,35 @@ -/* fortran/dpotrs.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b9 = 1.; - -/* > \brief \b DPOTRS */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DPOTRS + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DPOTRS( UPLO, N, NRHS, A, LDA, B, LDB, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDA, LDB, N, NRHS */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DPOTRS solves a system of linear equations A*X = B with a symmetric */ -/* > positive definite matrix A using the Cholesky factorization */ -/* > A = U**T*U or A = L*L**T computed by DPOTRF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A is stored; */ -/* > = 'L': Lower triangle of A is stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NRHS */ -/* > \verbatim */ -/* > NRHS is INTEGER */ -/* > The number of right hand sides, i.e., the number of columns */ -/* > of the matrix B. NRHS >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > The triangular factor U or L from the Cholesky factorization */ -/* > A = U**T*U or A = L*L**T, as computed by DPOTRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB,NRHS) */ -/* > On entry, the right hand side matrix B. */ -/* > On exit, the solution matrix X. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doublePOcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dpotrs_(char *uplo, integer *n, integer *nrhs, - doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * - info, ftnlen uplo_len) +int dpotrs_(char *uplo, integer *n, integer *nrhs, doublereal *a, integer *lda, doublereal *b, + integer *ldb, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; - - /* Local variables */ extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen); logical upper; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; } else if (*nrhs < 0) { *info = -3; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -5; - } else if (*ldb < max(1,*n)) { + } else if (*ldb < max(1, *n)) { *info = -7; } if (*info != 0) { @@ -198,51 +37,22 @@ f"> */ xerbla_((char *)"DPOTRS", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0 || *nrhs == 0) { return 0; } - if (upper) { - -/* Solve A*X = B where A = U**T *U. */ - -/* Solve U**T *X = B, overwriting B with X. */ - - dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b9, &a[ - a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)9, (ftnlen)8); - -/* Solve U*X = B, overwriting B with X. */ - - dtrsm_((char *)"Left", (char *)"Upper", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b9, & - a[a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)12, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Upper", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b9, &a[a_offset], lda, + &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, (ftnlen)9, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Upper", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b9, &a[a_offset], lda, + &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, (ftnlen)12, (ftnlen)8); } else { - -/* Solve A*X = B where A = L*L**T. */ - -/* Solve L*X = B, overwriting B with X. */ - - dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b9, & - a[a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)12, (ftnlen)8); - -/* Solve L**T *X = B, overwriting B with X. */ - - dtrsm_((char *)"Left", (char *)"Lower", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b9, &a[ - a_offset], lda, &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, ( - ftnlen)9, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Lower", (char *)"No transpose", (char *)"Non-unit", n, nrhs, &c_b9, &a[a_offset], lda, + &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, (ftnlen)12, (ftnlen)8); + dtrsm_((char *)"Left", (char *)"Lower", (char *)"Transpose", (char *)"Non-unit", n, nrhs, &c_b9, &a[a_offset], lda, + &b[b_offset], ldb, (ftnlen)4, (ftnlen)5, (ftnlen)9, (ftnlen)8); } - return 0; - -/* End of DPOTRS */ - -} /* dpotrs_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/drot.cpp b/lib/linalg/drot.cpp index 1ed9c47a89..aabbf00356 100644 --- a/lib/linalg/drot.cpp +++ b/lib/linalg/drot.cpp @@ -1,146 +1,19 @@ -/* fortran/drot.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DROT */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DROT(N,DX,INCX,DY,INCY,C,S) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION C,S */ -/* INTEGER INCX,INCY,N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION DX(*),DY(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DROT applies a plane rotation. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DX */ -/* > \verbatim */ -/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of DX */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DY */ -/* > \verbatim */ -/* > DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > storage spacing between elements of DY */ -/* > \endverbatim */ -/* > */ -/* > \param[in] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, linpack, 3/11/78. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int drot_(integer *n, doublereal *dx, integer *incx, - doublereal *dy, integer *incy, doublereal *c__, doublereal *s) +int drot_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy, doublereal *c__, + doublereal *s) { - /* System generated locals */ integer i__1; - - /* Local variables */ integer i__, ix, iy; doublereal dtemp; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ - /* Parameter adjustments */ --dy; --dx; - - /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { - -/* code for both increments equal to 1 */ - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dtemp = *c__ * dx[i__] + *s * dy[i__]; @@ -148,10 +21,6 @@ extern "C" { dx[i__] = dtemp; } } else { - -/* code for unequal increments or equal increments not equal */ -/* to 1 */ - ix = 1; iy = 1; if (*incx < 0) { @@ -170,11 +39,7 @@ extern "C" { } } return 0; - -/* End of DROT */ - -} /* drot_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/drscl.cpp b/lib/linalg/drscl.cpp index 10904c478f..90e278a709 100644 --- a/lib/linalg/drscl.cpp +++ b/lib/linalg/drscl.cpp @@ -1,200 +1,46 @@ -/* fortran/drscl.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DRSCL multiplies a vector by the reciprocal of a real scalar. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DRSCL + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DRSCL( N, SA, SX, INCX ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX, N */ -/* DOUBLE PRECISION SA */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION SX( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DRSCL multiplies an n-element real vector x by the real scalar 1/a. */ -/* > This is done without overflow or underflow as long as */ -/* > the final result x/a does not overflow or underflow. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of components of the vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] SA */ -/* > \verbatim */ -/* > SA is DOUBLE PRECISION */ -/* > The scalar a which is used to divide each component of x. */ -/* > SA must be >= 0, or the subroutine will divide by zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] SX */ -/* > \verbatim */ -/* > SX is DOUBLE PRECISION array, dimension */ -/* > (1+(N-1)*abs(INCX)) */ -/* > The n-element vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > The increment between successive values of the vector SX. */ -/* > > 0: SX(1) = X(1) and SX(1+(i-1)*INCX) = x(i), 1< i<= n */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int drscl_(integer *n, doublereal *sa, doublereal *sx, - integer *incx) +int drscl_(integer *n, doublereal *sa, doublereal *sx, integer *incx) { doublereal mul, cden; logical done; doublereal cnum, cden1, cnum1; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dlabad_(doublereal *, doublereal *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *), + dlabad_(doublereal *, doublereal *); extern doublereal dlamch_(char *, ftnlen); doublereal bignum, smlnum; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick return if possible */ - - /* Parameter adjustments */ --sx; - - /* Function Body */ if (*n <= 0) { return 0; } - -/* Get machine parameters */ - smlnum = dlamch_((char *)"S", (ftnlen)1); bignum = 1. / smlnum; dlabad_(&smlnum, &bignum); - -/* Initialize the denominator to SA and the numerator to 1. */ - cden = *sa; cnum = 1.; - L10: cden1 = cden * smlnum; cnum1 = cnum / bignum; if (abs(cden1) > abs(cnum) && cnum != 0.) { - -/* Pre-multiply X by SMLNUM if CDEN is large compared to CNUM. */ - mul = smlnum; done = FALSE_; cden = cden1; } else if (abs(cnum1) > abs(cden)) { - -/* Pre-multiply X by BIGNUM if CDEN is small compared to CNUM. */ - mul = bignum; done = FALSE_; cnum = cnum1; } else { - -/* Multiply X by CNUM / CDEN and return. */ - mul = cnum / cden; done = TRUE_; } - -/* Scale the vector X by MUL */ - dscal_(n, &mul, &sx[1], incx); - - if (! done) { + if (!done) { goto L10; } - return 0; - -/* End of DRSCL */ - -} /* drscl_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dscal.cpp b/lib/linalg/dscal.cpp index e141f7352b..321aedfd73 100644 --- a/lib/linalg/dscal.cpp +++ b/lib/linalg/dscal.cpp @@ -1,137 +1,16 @@ -/* fortran/dscal.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DSCAL */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSCAL(N,DA,DX,INCX) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION DA */ -/* INTEGER INCX,N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION DX(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSCAL scales a vector by a constant. */ -/* > uses unrolled loops for increment equal to 1. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DA */ -/* > \verbatim */ -/* > DA is DOUBLE PRECISION */ -/* > On entry, DA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DX */ -/* > \verbatim */ -/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of DX */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, linpack, 3/11/78. */ -/* > modified 3/93 to return if incx .le. 0. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dscal_(integer *n, doublereal *da, doublereal *dx, - integer *incx) +int dscal_(integer *n, doublereal *da, doublereal *dx, integer *incx) { - /* System generated locals */ integer i__1, i__2; - - /* Local variables */ integer i__, m, mp1, nincx; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. Parameters .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - /* Parameter adjustments */ --dx; - - /* Function Body */ if (*n <= 0 || *incx <= 0 || *da == 1.) { return 0; } if (*incx == 1) { - -/* code for increment equal to 1 */ - - -/* clean-up loop */ - m = *n % 5; if (m != 0) { i__1 = m; @@ -152,9 +31,6 @@ extern "C" { dx[i__ + 4] = *da * dx[i__ + 4]; } } else { - -/* code for increment not equal to 1 */ - nincx = *n * *incx; i__1 = nincx; i__2 = *incx; @@ -163,11 +39,7 @@ extern "C" { } } return 0; - -/* End of DSCAL */ - -} /* dscal_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dstedc.cpp b/lib/linalg/dstedc.cpp index 1a55346056..136723dde7 100644 --- a/lib/linalg/dstedc.cpp +++ b/lib/linalg/dstedc.cpp @@ -1,298 +1,55 @@ -/* fortran/dstedc.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__9 = 9; static integer c__0 = 0; static integer c__2 = 2; static doublereal c_b17 = 0.; static doublereal c_b18 = 1.; static integer c__1 = 1; - -/* > \brief \b DSTEDC */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DSTEDC + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, */ -/* LIWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER COMPZ */ -/* INTEGER INFO, LDZ, LIWORK, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IWORK( * ) */ -/* DOUBLE PRECISION D( * ), E( * ), WORK( * ), Z( LDZ, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSTEDC computes all eigenvalues and, optionally, eigenvectors of a */ -/* > symmetric tridiagonal matrix using the divide and conquer method. */ -/* > The eigenvectors of a full or band real symmetric matrix can also be */ -/* > found if DSYTRD or DSPTRD or DSBTRD has been used to reduce this */ -/* > matrix to tridiagonal form. */ -/* > */ -/* > This code makes very mild assumptions about floating point */ -/* > arithmetic. It will work on machines with a guard digit in */ -/* > add/subtract, or on those binary machines without guard digits */ -/* > which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. */ -/* > It could conceivably fail on hexadecimal or decimal machines */ -/* > without guard digits, but we know of none. See DLAED3 for details. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] COMPZ */ -/* > \verbatim */ -/* > COMPZ is CHARACTER*1 */ -/* > = 'N': Compute eigenvalues only. */ -/* > = 'I': Compute eigenvectors of tridiagonal matrix also. */ -/* > = 'V': Compute eigenvectors of original dense symmetric */ -/* > matrix also. On entry, Z contains the orthogonal */ -/* > matrix used to reduce the original matrix to */ -/* > tridiagonal form. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the diagonal elements of the tridiagonal matrix. */ -/* > On exit, if INFO = 0, the eigenvalues in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > On entry, the subdiagonal elements of the tridiagonal matrix. */ -/* > On exit, E has been destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension (LDZ,N) */ -/* > On entry, if COMPZ = 'V', then Z contains the orthogonal */ -/* > matrix used in the reduction to tridiagonal form. */ -/* > On exit, if INFO = 0, then if COMPZ = 'V', Z contains the */ -/* > orthonormal eigenvectors of the original symmetric matrix, */ -/* > and if COMPZ = 'I', Z contains the orthonormal eigenvectors */ -/* > of the symmetric tridiagonal matrix. */ -/* > If COMPZ = 'N', then Z is not referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDZ */ -/* > \verbatim */ -/* > LDZ is INTEGER */ -/* > The leading dimension of the array Z. LDZ >= 1. */ -/* > If eigenvectors are desired, then LDZ >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > If COMPZ = 'N' or N <= 1 then LWORK must be at least 1. */ -/* > If COMPZ = 'V' and N > 1 then LWORK must be at least */ -/* > ( 1 + 3*N + 2*N*lg N + 4*N**2 ), */ -/* > where lg( N ) = smallest integer k such */ -/* > that 2**k >= N. */ -/* > If COMPZ = 'I' and N > 1 then LWORK must be at least */ -/* > ( 1 + 4*N + N**2 ). */ -/* > Note that for COMPZ = 'I' or 'V', then if N is less than or */ -/* > equal to the minimum divide size, usually 25, then LWORK need */ -/* > only be max(1,2*(N-1)). */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension (MAX(1,LIWORK)) */ -/* > On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LIWORK */ -/* > \verbatim */ -/* > LIWORK is INTEGER */ -/* > The dimension of the array IWORK. */ -/* > If COMPZ = 'N' or N <= 1 then LIWORK must be at least 1. */ -/* > If COMPZ = 'V' and N > 1 then LIWORK must be at least */ -/* > ( 6 + 6*N + 5*N*lg N ). */ -/* > If COMPZ = 'I' and N > 1 then LIWORK must be at least */ -/* > ( 3 + 5*N ). */ -/* > Note that for COMPZ = 'I' or 'V', then if N is less than or */ -/* > equal to the minimum divide size, usually 25, then LIWORK */ -/* > need only be 1. */ -/* > */ -/* > If LIWORK = -1, then a workspace query is assumed; the */ -/* > routine only calculates the optimal size of the IWORK array, */ -/* > returns this value as the first entry of the IWORK array, and */ -/* > no error message related to LIWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: The algorithm failed to compute an eigenvalue while */ -/* > working on the submatrix lying in rows and columns */ -/* > INFO/(N+1) through mod(INFO,N+1). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Jeff Rutter, Computer Science Division, University of California */ -/* > at Berkeley, USA \n */ -/* > Modified by Francoise Tisseur, University of Tennessee */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dstedc_(char *compz, integer *n, doublereal *d__, - doublereal *e, doublereal *z__, integer *ldz, doublereal *work, - integer *lwork, integer *iwork, integer *liwork, integer *info, - ftnlen compz_len) +int dstedc_(char *compz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, + doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info, + ftnlen compz_len) { - /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; - - /* Builtin functions */ double log(doublereal); integer pow_lmp_ii(integer *, integer *); double sqrt(doublereal); - - /* Local variables */ integer i__, j, k, m; doublereal p; integer ii, lgn; doublereal eps, tiny; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern int dswap_(integer *, doublereal *, integer *, doublereal *, integer *); integer lwmin; - extern /* Subroutine */ int dlaed0_(integer *, integer *, integer *, - doublereal *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, integer *, integer *); + extern int dlaed0_(integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, integer *, integer *); integer start; extern doublereal dlamch_(char *, ftnlen); - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dlacpy_(char *, integer *, integer - *, doublereal *, integer *, doublereal *, integer *, ftnlen), - dlaset_(char *, integer *, integer *, doublereal *, doublereal *, - doublereal *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, ftnlen), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); integer finish; - extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, - ftnlen); - extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, - integer *), dlasrt_(char *, integer *, doublereal *, integer *, - ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, ftnlen); + extern int dsterf_(integer *, doublereal *, doublereal *, integer *), + dlasrt_(char *, integer *, doublereal *, integer *, ftnlen); integer liwmin, icompz; - extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - ftnlen); + extern int dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen); doublereal orgnrm; logical lquery; integer smlsiz, storez, strtrw; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; --e; z_dim1 = *ldz; @@ -300,11 +57,8 @@ f"> */ z__ -= z_offset; --work; --iwork; - - /* Function Body */ *info = 0; lquery = *lwork == -1 || *liwork == -1; - if (lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1)) { icompz = 0; } else if (lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1)) { @@ -318,16 +72,11 @@ f"> */ *info = -1; } else if (*n < 0) { *info = -2; - } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { + } else if (*ldz < 1 || icompz > 0 && *ldz < max(1, *n)) { *info = -6; } - if (*info == 0) { - -/* Compute the workspace requirements */ - - smlsiz = ilaenv_(&c__9, (char *)"DSTEDC", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( - ftnlen)6, (ftnlen)1); + smlsiz = ilaenv_(&c__9, (char *)"DSTEDC", (char *)" ", &c__0, &c__0, &c__0, &c__0, (ftnlen)6, (ftnlen)1); if (*n <= 1 || icompz == 0) { liwmin = 1; lwmin = 1; @@ -335,7 +84,7 @@ f"> */ liwmin = 1; lwmin = *n - 1 << 1; } else { - lgn = (integer) (log((doublereal) (*n)) / log(2.)); + lgn = (integer)(log((doublereal)(*n)) / log(2.)); if (pow_lmp_ii(&c__2, &lgn) < *n) { ++lgn; } @@ -343,27 +92,23 @@ f"> */ ++lgn; } if (icompz == 1) { -/* Computing 2nd power */ i__1 = *n; lwmin = *n * 3 + 1 + (*n << 1) * lgn + (i__1 * i__1 << 2); liwmin = *n * 6 + 6 + *n * 5 * lgn; } else if (icompz == 2) { -/* Computing 2nd power */ i__1 = *n; lwmin = (*n << 2) + 1 + i__1 * i__1; liwmin = *n * 5 + 3; } } - work[1] = (doublereal) lwmin; + work[1] = (doublereal)lwmin; iwork[1] = liwmin; - - if (*lwork < lwmin && ! lquery) { + if (*lwork < lwmin && !lquery) { *info = -8; - } else if (*liwork < liwmin && ! lquery) { + } else if (*liwork < liwmin && !lquery) { *info = -10; } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DSTEDC", &i__1, (ftnlen)6); @@ -371,9 +116,6 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } @@ -383,135 +125,75 @@ f"> */ } return 0; } - -/* If the following conditional clause is removed, then the routine */ -/* will use the Divide and Conquer routine to compute only the */ -/* eigenvalues, which requires (3N + 3N**2) real workspace and */ -/* (2 + 5N + 2N lg(N)) integer workspace. */ -/* Since on many architectures DSTERF is much faster than any other */ -/* algorithm for finding eigenvalues only, it is used here */ -/* as the default. If the conditional clause is removed, then */ -/* information on the size of workspace needs to be changed. */ - -/* If COMPZ = 'N', use DSTERF to compute the eigenvalues. */ - if (icompz == 0) { dsterf_(n, &d__[1], &e[1], info); goto L50; } - -/* If N is smaller than the minimum divide size (SMLSIZ+1), then */ -/* solve the problem with another solver. */ - if (*n <= smlsiz) { - - dsteqr_(compz, n, &d__[1], &e[1], &z__[z_offset], ldz, &work[1], info, - (ftnlen)1); - + dsteqr_(compz, n, &d__[1], &e[1], &z__[z_offset], ldz, &work[1], info, (ftnlen)1); } else { - -/* If COMPZ = 'V', the Z matrix must be stored elsewhere for later */ -/* use. */ - if (icompz == 1) { storez = *n * *n + 1; } else { storez = 1; } - if (icompz == 2) { - dlaset_((char *)"Full", n, n, &c_b17, &c_b18, &z__[z_offset], ldz, ( - ftnlen)4); + dlaset_((char *)"Full", n, n, &c_b17, &c_b18, &z__[z_offset], ldz, (ftnlen)4); } - -/* Scale. */ - orgnrm = dlanst_((char *)"M", n, &d__[1], &e[1], (ftnlen)1); if (orgnrm == 0.) { goto L50; } - eps = dlamch_((char *)"Epsilon", (ftnlen)7); - start = 1; - -/* while ( START <= N ) */ - -L10: + L10: if (start <= *n) { - -/* Let FINISH be the position of the next subdiagonal entry */ -/* such that E( FINISH ) <= TINY or FINISH = N if no such */ -/* subdiagonal exists. The matrix identified by the elements */ -/* between START and FINISH constitutes an independent */ -/* sub-problem. */ - finish = start; -L20: + L20: if (finish < *n) { - tiny = eps * sqrt((d__1 = d__[finish], abs(d__1))) * sqrt(( - d__2 = d__[finish + 1], abs(d__2))); + tiny = eps * sqrt((d__1 = d__[finish], abs(d__1))) * + sqrt((d__2 = d__[finish + 1], abs(d__2))); if ((d__1 = e[finish], abs(d__1)) > tiny) { ++finish; goto L20; } } - -/* (Sub) Problem determined. Compute its size and solve it. */ - m = finish - start + 1; if (m == 1) { start = finish + 1; goto L10; } if (m > smlsiz) { - -/* Scale. */ - orgnrm = dlanst_((char *)"M", &m, &d__[start], &e[start], (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &m, &c__1, &d__[ - start], &m, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &m, &c__1, &d__[start], &m, info, + (ftnlen)1); i__1 = m - 1; i__2 = m - 1; - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &i__1, &c__1, &e[ - start], &i__2, info, (ftnlen)1); - + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &i__1, &c__1, &e[start], &i__2, info, + (ftnlen)1); if (icompz == 1) { strtrw = 1; } else { strtrw = start; } - dlaed0_(&icompz, n, &m, &d__[start], &e[start], &z__[strtrw + - start * z_dim1], ldz, &work[1], n, &work[storez], & - iwork[1], info); + dlaed0_(&icompz, n, &m, &d__[start], &e[start], &z__[strtrw + start * z_dim1], ldz, + &work[1], n, &work[storez], &iwork[1], info); if (*info != 0) { - *info = (*info / (m + 1) + start - 1) * (*n + 1) + *info % - (m + 1) + start - 1; + *info = (*info / (m + 1) + start - 1) * (*n + 1) + *info % (m + 1) + start - 1; goto L50; } - -/* Scale back. */ - - dlascl_((char *)"G", &c__0, &c__0, &c_b18, &orgnrm, &m, &c__1, &d__[ - start], &m, info, (ftnlen)1); - + dlascl_((char *)"G", &c__0, &c__0, &c_b18, &orgnrm, &m, &c__1, &d__[start], &m, info, + (ftnlen)1); } else { if (icompz == 1) { - -/* Since QR won't update a Z matrix which is larger than */ -/* the length of D, we must solve the sub-problem in a */ -/* workspace and then multiply back into Z. */ - - dsteqr_((char *)"I", &m, &d__[start], &e[start], &work[1], &m, & - work[m * m + 1], info, (ftnlen)1); - dlacpy_((char *)"A", n, &m, &z__[start * z_dim1 + 1], ldz, &work[ - storez], n, (ftnlen)1); - dgemm_((char *)"N", (char *)"N", n, &m, &m, &c_b18, &work[storez], n, & - work[1], &m, &c_b17, &z__[start * z_dim1 + 1], - ldz, (ftnlen)1, (ftnlen)1); + dsteqr_((char *)"I", &m, &d__[start], &e[start], &work[1], &m, &work[m * m + 1], info, + (ftnlen)1); + dlacpy_((char *)"A", n, &m, &z__[start * z_dim1 + 1], ldz, &work[storez], n, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", n, &m, &m, &c_b18, &work[storez], n, &work[1], &m, &c_b17, + &z__[start * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1); } else if (icompz == 2) { - dsteqr_((char *)"I", &m, &d__[start], &e[start], &z__[start + - start * z_dim1], ldz, &work[1], info, (ftnlen)1); + dsteqr_((char *)"I", &m, &d__[start], &e[start], &z__[start + start * z_dim1], ldz, + &work[1], info, (ftnlen)1); } else { dsterf_(&m, &d__[start], &e[start], info); } @@ -520,23 +202,12 @@ L20: goto L50; } } - start = finish + 1; goto L10; } - -/* endwhile */ - if (icompz == 0) { - -/* Use Quick Sort */ - dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); - } else { - -/* Use Selection Sort to minimize swaps of eigenvectors */ - i__1 = *n; for (ii = 2; ii <= i__1; ++ii) { i__ = ii - 1; @@ -548,29 +219,20 @@ L20: k = j; p = d__[j]; } -/* L30: */ } if (k != i__) { d__[k] = d__[i__]; d__[i__] = p; - dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 - + 1], &c__1); + dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], &c__1); } -/* L40: */ } } } - L50: - work[1] = (doublereal) lwmin; + work[1] = (doublereal)lwmin; iwork[1] = liwmin; - return 0; - -/* End of DSTEDC */ - -} /* dstedc_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsteqr.cpp b/lib/linalg/dsteqr.cpp index 2f590595e7..4a611d4102 100644 --- a/lib/linalg/dsteqr.cpp +++ b/lib/linalg/dsteqr.cpp @@ -1,172 +1,18 @@ -/* fortran/dsteqr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b9 = 0.; static doublereal c_b10 = 1.; static integer c__0 = 0; static integer c__1 = 1; static integer c__2 = 2; - -/* > \brief \b DSTEQR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DSTEQR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER COMPZ */ -/* INTEGER INFO, LDZ, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( * ), E( * ), WORK( * ), Z( LDZ, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSTEQR computes all eigenvalues and, optionally, eigenvectors of a */ -/* > symmetric tridiagonal matrix using the implicit QL or QR method. */ -/* > The eigenvectors of a full or band symmetric matrix can also be found */ -/* > if DSYTRD or DSPTRD or DSBTRD has been used to reduce this matrix to */ -/* > tridiagonal form. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] COMPZ */ -/* > \verbatim */ -/* > COMPZ is CHARACTER*1 */ -/* > = 'N': Compute eigenvalues only. */ -/* > = 'V': Compute eigenvalues and eigenvectors of the original */ -/* > symmetric matrix. On entry, Z must contain the */ -/* > orthogonal matrix used to reduce the original matrix */ -/* > to tridiagonal form. */ -/* > = 'I': Compute eigenvalues and eigenvectors of the */ -/* > tridiagonal matrix. Z is initialized to the identity */ -/* > matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the diagonal elements of the tridiagonal matrix. */ -/* > On exit, if INFO = 0, the eigenvalues in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > On entry, the (n-1) subdiagonal elements of the tridiagonal */ -/* > matrix. */ -/* > On exit, E has been destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension (LDZ, N) */ -/* > On entry, if COMPZ = 'V', then Z contains the orthogonal */ -/* > matrix used in the reduction to tridiagonal form. */ -/* > On exit, if INFO = 0, then if COMPZ = 'V', Z contains the */ -/* > orthonormal eigenvectors of the original symmetric matrix, */ -/* > and if COMPZ = 'I', Z contains the orthonormal eigenvectors */ -/* > of the symmetric tridiagonal matrix. */ -/* > If COMPZ = 'N', then Z is not referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDZ */ -/* > \verbatim */ -/* > LDZ is INTEGER */ -/* > The leading dimension of the array Z. LDZ >= 1, and if */ -/* > eigenvectors are desired, then LDZ >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (max(1,2*N-2)) */ -/* > If COMPZ = 'N', then WORK is not referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: the algorithm has failed to find all the eigenvalues in */ -/* > a total of 30*N iterations; if INFO = i, then i */ -/* > elements of E have not converged to zero; on exit, D */ -/* > and E contain the elements of a symmetric tridiagonal */ -/* > matrix which is orthogonally similar to the original */ -/* > matrix. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dsteqr_(char *compz, integer *n, doublereal *d__, - doublereal *e, doublereal *z__, integer *ldz, doublereal *work, - integer *info, ftnlen compz_len) +int dsteqr_(char *compz, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ldz, + doublereal *work, integer *info, ftnlen compz_len) { - /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; - - /* Builtin functions */ double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); - - /* Local variables */ doublereal b, c__, f, g; integer i__, j, k, l, m; doublereal p, r__, s; @@ -175,76 +21,38 @@ f"> */ integer lsv; doublereal tst, eps2; integer lend, jtot; - extern /* Subroutine */ int dlae2_(doublereal *, doublereal *, doublereal - *, doublereal *, doublereal *); + extern int dlae2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dlasr_(char *, char *, char *, integer *, - integer *, doublereal *, doublereal *, doublereal *, integer *, - ftnlen, ftnlen, ftnlen); + extern int dlasr_(char *, char *, char *, integer *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen, ftnlen, ftnlen); doublereal anorm; - extern /* Subroutine */ int dswap_(integer *, doublereal *, integer *, - doublereal *, integer *), dlaev2_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *); + extern int dswap_(integer *, doublereal *, integer *, doublereal *, integer *), + dlaev2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *); integer lendm1, lendp1; - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, ftnlen); integer iscale; - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dlaset_(char *, integer *, integer - *, doublereal *, doublereal *, doublereal *, integer *, ftnlen); + extern int dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen); doublereal safmin; - extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *); + extern int dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal safmax; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, - ftnlen); - extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, - integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, ftnlen); + extern int dlasrt_(char *, integer *, doublereal *, integer *, ftnlen); integer lendsv; doublereal ssfmin; integer nmaxit, icompz; doublereal ssfmax; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; --e; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; - - /* Function Body */ *info = 0; - if (lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1)) { icompz = 0; } else if (lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1)) { @@ -258,7 +66,7 @@ f"> */ *info = -1; } else if (*n < 0) { *info = -2; - } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { + } else if (*ldz < 1 || icompz > 0 && *ldz < max(1, *n)) { *info = -6; } if (*info != 0) { @@ -266,48 +74,29 @@ f"> */ xerbla_((char *)"DSTEQR", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - if (*n == 1) { if (icompz == 2) { z__[z_dim1 + 1] = 1.; } return 0; } - -/* Determine the unit roundoff and over/underflow thresholds. */ - eps = dlamch_((char *)"E", (ftnlen)1); -/* Computing 2nd power */ d__1 = eps; eps2 = d__1 * d__1; safmin = dlamch_((char *)"S", (ftnlen)1); safmax = 1. / safmin; ssfmax = sqrt(safmax) / 3.; ssfmin = sqrt(safmin) / eps2; - -/* Compute the eigenvalues and eigenvectors of the tridiagonal */ -/* matrix. */ - if (icompz == 2) { dlaset_((char *)"Full", n, n, &c_b9, &c_b10, &z__[z_offset], ldz, (ftnlen)4); } - nmaxit = *n * 30; jtot = 0; - -/* Determine where the matrix splits and choose QL or QR iteration */ -/* for each block, according to whether top or bottom diagonal */ -/* element is smaller. */ - l1 = 1; nm1 = *n - 1; - L10: if (l1 > *n) { goto L160; @@ -322,16 +111,14 @@ L10: if (tst == 0.) { goto L30; } - if (tst <= sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m - + 1], abs(d__2))) * eps) { + if (tst <= + sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m + 1], abs(d__2))) * eps) { e[m] = 0.; goto L30; } -/* L20: */ } } m = *n; - L30: l = l1; lsv = l; @@ -341,9 +128,6 @@ L30: if (lend == l) { goto L10; } - -/* Scale submatrix in rows and columns L to LEND */ - i__1 = lend - l + 1; anorm = dlanst_((char *)"M", &i__1, &d__[l], &e[l], (ftnlen)1); iscale = 0; @@ -353,53 +137,36 @@ L30: if (anorm > ssfmax) { iscale = 1; i__1 = lend - l + 1; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, info, (ftnlen)1); i__1 = lend - l; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, info, (ftnlen)1); } else if (anorm < ssfmin) { iscale = 2; i__1 = lend - l + 1; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, info, (ftnlen)1); i__1 = lend - l; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, info, (ftnlen)1); } - -/* Choose between QL and QR iteration */ - if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { lend = lsv; l = lendsv; } - if (lend > l) { - -/* QL Iteration */ - -/* Look for small subdiagonal element. */ - -L40: + L40: if (l != lend) { lendm1 = lend - 1; i__1 = lendm1; for (m = l; m <= i__1; ++m) { -/* Computing 2nd power */ d__2 = (d__1 = e[m], abs(d__1)); tst = d__2 * d__2; - if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m - + 1], abs(d__2)) + safmin) { + if (tst <= + eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m + 1], abs(d__2)) + safmin) { goto L60; } -/* L50: */ } } - m = lend; - -L60: + L60: if (m < lend) { e[m] = 0.; } @@ -407,18 +174,13 @@ L60: if (m == l) { goto L80; } - -/* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ -/* to compute its eigensystem. */ - if (m == l + 1) { if (icompz > 0) { dlaev2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s); work[l] = c__; work[*n - 1 + l] = s; - dlasr_((char *)"R", (char *)"V", (char *)"B", n, &c__2, &work[l], &work[*n - 1 + l], & - z__[l * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); + dlasr_((char *)"R", (char *)"V", (char *)"B", n, &c__2, &work[l], &work[*n - 1 + l], &z__[l * z_dim1 + 1], + ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); } else { dlae2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2); } @@ -431,24 +193,16 @@ L60: } goto L140; } - if (jtot == nmaxit) { goto L140; } ++jtot; - -/* Form shift. */ - g = (d__[l + 1] - p) / (e[l] * 2.); r__ = dlapy2_(&g, &c_b10); g = d__[m] - p + e[l] / (g + d_lmp_sign(&r__, &g)); - s = 1.; c__ = 1.; p = 0.; - -/* Inner loop */ - mm1 = m - 1; i__1 = l; for (i__ = mm1; i__ >= i__1; --i__) { @@ -463,65 +217,42 @@ L60: p = s * r__; d__[i__ + 1] = g + p; g = c__ * r__ - b; - -/* If eigenvectors are desired, then save rotations. */ - if (icompz > 0) { work[i__] = c__; work[*n - 1 + i__] = -s; } - -/* L70: */ } - -/* If eigenvectors are desired, then apply saved rotations. */ - if (icompz > 0) { mm = m - l + 1; - dlasr_((char *)"R", (char *)"V", (char *)"B", n, &mm, &work[l], &work[*n - 1 + l], &z__[l - * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"R", (char *)"V", (char *)"B", n, &mm, &work[l], &work[*n - 1 + l], &z__[l * z_dim1 + 1], ldz, + (ftnlen)1, (ftnlen)1, (ftnlen)1); } - d__[l] -= p; e[l] = g; goto L40; - -/* Eigenvalue found. */ - -L80: + L80: d__[l] = p; - ++l; if (l <= lend) { goto L40; } goto L140; - } else { - -/* QR Iteration */ - -/* Look for small superdiagonal element. */ - -L90: + L90: if (l != lend) { lendp1 = lend + 1; i__1 = lendp1; for (m = l; m >= i__1; --m) { -/* Computing 2nd power */ d__2 = (d__1 = e[m - 1], abs(d__1)); tst = d__2 * d__2; - if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m - - 1], abs(d__2)) + safmin) { + if (tst <= + eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m - 1], abs(d__2)) + safmin) { goto L110; } -/* L100: */ } } - m = lend; - -L110: + L110: if (m > lend) { e[m - 1] = 0.; } @@ -529,19 +260,13 @@ L110: if (m == l) { goto L130; } - -/* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ -/* to compute its eigensystem. */ - if (m == l - 1) { if (icompz > 0) { - dlaev2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s) - ; + dlaev2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s); work[m] = c__; work[*n - 1 + m] = s; - dlasr_((char *)"R", (char *)"V", (char *)"F", n, &c__2, &work[m], &work[*n - 1 + m], & - z__[(l - 1) * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, - (ftnlen)1); + dlasr_((char *)"R", (char *)"V", (char *)"F", n, &c__2, &work[m], &work[*n - 1 + m], + &z__[(l - 1) * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); } else { dlae2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2); } @@ -554,24 +279,16 @@ L110: } goto L140; } - if (jtot == nmaxit) { goto L140; } ++jtot; - -/* Form shift. */ - g = (d__[l - 1] - p) / (e[l - 1] * 2.); r__ = dlapy2_(&g, &c_b10); g = d__[m] - p + e[l - 1] / (g + d_lmp_sign(&r__, &g)); - s = 1.; c__ = 1.; p = 0.; - -/* Inner loop */ - lm1 = l - 1; i__1 = lm1; for (i__ = m; i__ <= i__1; ++i__) { @@ -586,64 +303,39 @@ L110: p = s * r__; d__[i__] = g + p; g = c__ * r__ - b; - -/* If eigenvectors are desired, then save rotations. */ - if (icompz > 0) { work[i__] = c__; work[*n - 1 + i__] = s; } - -/* L120: */ } - -/* If eigenvectors are desired, then apply saved rotations. */ - if (icompz > 0) { mm = l - m + 1; - dlasr_((char *)"R", (char *)"V", (char *)"F", n, &mm, &work[m], &work[*n - 1 + m], &z__[m - * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); + dlasr_((char *)"R", (char *)"V", (char *)"F", n, &mm, &work[m], &work[*n - 1 + m], &z__[m * z_dim1 + 1], ldz, + (ftnlen)1, (ftnlen)1, (ftnlen)1); } - d__[l] -= p; e[lm1] = g; goto L90; - -/* Eigenvalue found. */ - -L130: + L130: d__[l] = p; - --l; if (l >= lend) { goto L90; } goto L140; - } - -/* Undo scaling if necessary */ - L140: if (iscale == 1) { i__1 = lendsv - lsv + 1; - dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], - n, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], n, info, (ftnlen)1); i__1 = lendsv - lsv; - dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n, info, (ftnlen)1); } else if (iscale == 2) { i__1 = lendsv - lsv + 1; - dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], - n, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], n, info, (ftnlen)1); i__1 = lendsv - lsv; - dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n, info, (ftnlen)1); } - -/* Check for no convergence to an eigenvalue after a total */ -/* of N*MAXIT iterations. */ - if (jtot < nmaxit) { goto L10; } @@ -652,23 +344,12 @@ L140: if (e[i__] != 0.) { ++(*info); } -/* L150: */ } goto L190; - -/* Order eigenvalues and eigenvectors. */ - L160: if (icompz == 0) { - -/* Use Quick Sort */ - dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); - } else { - -/* Use Selection Sort to minimize swaps of eigenvectors */ - i__1 = *n; for (ii = 2; ii <= i__1; ++ii) { i__ = ii - 1; @@ -680,25 +361,17 @@ L160: k = j; p = d__[j]; } -/* L170: */ } if (k != i__) { d__[k] = d__[i__]; d__[i__] = p; - dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], - &c__1); + dswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], &c__1); } -/* L180: */ } } - L190: return 0; - -/* End of DSTEQR */ - -} /* dsteqr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsterf.cpp b/lib/linalg/dsterf.cpp index 687cbf943b..438cc47dc3 100644 --- a/lib/linalg/dsterf.cpp +++ b/lib/linalg/dsterf.cpp @@ -1,124 +1,15 @@ -/* fortran/dsterf.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__0 = 0; static integer c__1 = 1; static doublereal c_b33 = 1.; - -/* > \brief \b DSTERF */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DSTERF + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSTERF( N, D, E, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( * ), E( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSTERF computes all eigenvalues of a symmetric tridiagonal matrix */ -/* > using the Pal-Walker-Kahan variant of the QL or QR algorithm. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the n diagonal elements of the tridiagonal matrix. */ -/* > On exit, if INFO = 0, the eigenvalues in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > On entry, the (n-1) subdiagonal elements of the tridiagonal */ -/* > matrix. */ -/* > On exit, E has been destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: the algorithm failed to find all of the eigenvalues in */ -/* > a total of 30*N iterations; if INFO = i, then i */ -/* > elements of E have not converged to zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup auxOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dsterf_(integer *n, doublereal *d__, doublereal *e, - integer *info) +int dsterf_(integer *n, doublereal *d__, doublereal *e, integer *info) { - /* System generated locals */ integer i__1; doublereal d__1, d__2, d__3; - - /* Builtin functions */ double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); - - /* Local variables */ doublereal c__; integer i__, l, m; doublereal p, r__, s; @@ -129,62 +20,24 @@ f"> */ integer lend; doublereal rmax; integer jtot; - extern /* Subroutine */ int dlae2_(doublereal *, doublereal *, doublereal - *, doublereal *, doublereal *); + extern int dlae2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal gamma, alpha, sigma, anorm; - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, ftnlen); integer iscale; - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern int dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, ftnlen); doublereal oldgam, safmin; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); doublereal safmax; - extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, - ftnlen); - extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, - integer *, ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, ftnlen); + extern int dlasrt_(char *, integer *, doublereal *, integer *, ftnlen); integer lendsv; doublereal ssfmin; integer nmaxit; doublereal ssfmax; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --e; --d__; - - /* Function Body */ *info = 0; - -/* Quick return if possible */ - if (*n < 0) { *info = -1; i__1 = -(*info); @@ -194,11 +47,7 @@ f"> */ if (*n <= 1) { return 0; } - -/* Determine the unit roundoff for this environment. */ - eps = dlamch_((char *)"E", (ftnlen)1); -/* Computing 2nd power */ d__1 = eps; eps2 = d__1 * d__1; safmin = dlamch_((char *)"S", (ftnlen)1); @@ -206,19 +55,10 @@ f"> */ ssfmax = sqrt(safmax) / 3.; ssfmin = sqrt(safmin) / eps2; rmax = dlamch_((char *)"O", (ftnlen)1); - -/* Compute the eigenvalues of the tridiagonal matrix. */ - nmaxit = *n * 30; sigma = 0.; jtot = 0; - -/* Determine where the matrix splits and choose QL or QR iteration */ -/* for each block, according to whether top or bottom diagonal */ -/* element is smaller. */ - l1 = 1; - L10: if (l1 > *n) { goto L170; @@ -228,15 +68,13 @@ L10: } i__1 = *n - 1; for (m = l1; m <= i__1; ++m) { - if ((d__3 = e[m], abs(d__3)) <= sqrt((d__1 = d__[m], abs(d__1))) * - sqrt((d__2 = d__[m + 1], abs(d__2))) * eps) { + if ((d__3 = e[m], abs(d__3)) <= + sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m + 1], abs(d__2))) * eps) { e[m] = 0.; goto L30; } -/* L20: */ } m = *n; - L30: l = l1; lsv = l; @@ -246,9 +84,6 @@ L30: if (lend == l) { goto L10; } - -/* Scale submatrix in rows and columns L to LEND */ - i__1 = lend - l + 1; anorm = dlanst_((char *)"M", &i__1, &d__[l], &e[l], (ftnlen)1); iscale = 0; @@ -258,56 +93,37 @@ L30: if (anorm > ssfmax) { iscale = 1; i__1 = lend - l + 1; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, info, (ftnlen)1); i__1 = lend - l; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, info, (ftnlen)1); } else if (anorm < ssfmin) { iscale = 2; i__1 = lend - l + 1; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, info, (ftnlen)1); i__1 = lend - l; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, info, (ftnlen)1); } - i__1 = lend - 1; for (i__ = l; i__ <= i__1; ++i__) { -/* Computing 2nd power */ d__1 = e[i__]; e[i__] = d__1 * d__1; -/* L40: */ } - -/* Choose between QL and QR iteration */ - if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { lend = lsv; l = lendsv; } - if (lend >= l) { - -/* QL Iteration */ - -/* Look for small subdiagonal element. */ - -L50: + L50: if (l != lend) { i__1 = lend - 1; for (m = l; m <= i__1; ++m) { - if ((d__2 = e[m], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m - + 1], abs(d__1))) { + if ((d__2 = e[m], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m + 1], abs(d__1))) { goto L70; } -/* L60: */ } } m = lend; - -L70: + L70: if (m < lend) { e[m] = 0.; } @@ -315,10 +131,6 @@ L70: if (m == l) { goto L90; } - -/* If remaining matrix is 2 by 2, use DLAE2 to compute its */ -/* eigenvalues. */ - if (m == l + 1) { rte = sqrt(e[l]); dlae2_(&d__[l], &rte, &d__[l + 1], &rt1, &rt2); @@ -331,26 +143,18 @@ L70: } goto L150; } - if (jtot == nmaxit) { goto L150; } ++jtot; - -/* Form shift. */ - rte = sqrt(e[l]); sigma = (d__[l + 1] - p) / (rte * 2.); r__ = dlapy2_(&sigma, &c_b33); sigma = p - rte / (sigma + d_lmp_sign(&r__, &sigma)); - c__ = 1.; s = 0.; gamma = d__[m] - sigma; p = gamma * gamma; - -/* Inner loop */ - i__1 = l; for (i__ = m - 1; i__ >= i__1; --i__) { bb = e[i__]; @@ -370,42 +174,27 @@ L70: } else { p = oldc * bb; } -/* L80: */ } - e[l] = s * p; d__[l] = sigma + gamma; goto L50; - -/* Eigenvalue found. */ - -L90: + L90: d__[l] = p; - ++l; if (l <= lend) { goto L50; } goto L150; - } else { - -/* QR Iteration */ - -/* Look for small superdiagonal element. */ - -L100: + L100: i__1 = lend + 1; for (m = l; m >= i__1; --m) { - if ((d__2 = e[m - 1], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m - - 1], abs(d__1))) { + if ((d__2 = e[m - 1], abs(d__2)) <= eps2 * (d__1 = d__[m] * d__[m - 1], abs(d__1))) { goto L120; } -/* L110: */ } m = lend; - -L120: + L120: if (m > lend) { e[m - 1] = 0.; } @@ -413,10 +202,6 @@ L120: if (m == l) { goto L140; } - -/* If remaining matrix is 2 by 2, use DLAE2 to compute its */ -/* eigenvalues. */ - if (m == l - 1) { rte = sqrt(e[l - 1]); dlae2_(&d__[l], &rte, &d__[l - 1], &rt1, &rt2); @@ -429,26 +214,18 @@ L120: } goto L150; } - if (jtot == nmaxit) { goto L150; } ++jtot; - -/* Form shift. */ - rte = sqrt(e[l - 1]); sigma = (d__[l - 1] - p) / (rte * 2.); r__ = dlapy2_(&sigma, &c_b33); sigma = p - rte / (sigma + d_lmp_sign(&r__, &sigma)); - c__ = 1.; s = 0.; gamma = d__[m] - sigma; p = gamma * gamma; - -/* Inner loop */ - i__1 = l - 1; for (i__ = m; i__ <= i__1; ++i__) { bb = e[i__]; @@ -468,43 +245,27 @@ L120: } else { p = oldc * bb; } -/* L130: */ } - e[l - 1] = s * p; d__[l] = sigma + gamma; goto L100; - -/* Eigenvalue found. */ - -L140: + L140: d__[l] = p; - --l; if (l >= lend) { goto L100; } goto L150; - } - -/* Undo scaling if necessary */ - L150: if (iscale == 1) { i__1 = lendsv - lsv + 1; - dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], - n, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], n, info, (ftnlen)1); } if (iscale == 2) { i__1 = lendsv - lsv + 1; - dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], - n, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], n, info, (ftnlen)1); } - -/* Check for no convergence to an eigenvalue after a total */ -/* of N*MAXIT iterations. */ - if (jtot < nmaxit) { goto L10; } @@ -513,22 +274,13 @@ L150: if (e[i__] != 0.) { ++(*info); } -/* L160: */ } goto L180; - -/* Sort eigenvalues in increasing order. */ - L170: dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); - L180: return 0; - -/* End of DSTERF */ - -} /* dsterf_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dswap.cpp b/lib/linalg/dswap.cpp index 4cb6a77f67..e3b98c9151 100644 --- a/lib/linalg/dswap.cpp +++ b/lib/linalg/dswap.cpp @@ -1,141 +1,18 @@ -/* fortran/dswap.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DSWAP */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSWAP(N,DX,INCX,DY,INCY) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,INCY,N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION DX(*),DY(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSWAP interchanges two vectors. */ -/* > uses unrolled loops for increments equal to 1. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DX */ -/* > \verbatim */ -/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of DX */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] DY */ -/* > \verbatim */ -/* > DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > storage spacing between elements of DY */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, linpack, 3/11/78. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dswap_(integer *n, doublereal *dx, integer *incx, - doublereal *dy, integer *incy) +int dswap_(integer *n, doublereal *dx, integer *incx, doublereal *dy, integer *incy) { - /* System generated locals */ integer i__1; - - /* Local variables */ integer i__, m, ix, iy, mp1; doublereal dtemp; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - /* Parameter adjustments */ --dy; --dx; - - /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { - -/* code for both increments equal to 1 */ - - -/* clean-up loop */ - m = *n % 3; if (m != 0) { i__1 = m; @@ -162,10 +39,6 @@ extern "C" { dy[i__ + 2] = dtemp; } } else { - -/* code for unequal increments or equal increments not equal */ -/* to 1 */ - ix = 1; iy = 1; if (*incx < 0) { @@ -184,11 +57,7 @@ extern "C" { } } return 0; - -/* End of DSWAP */ - -} /* dswap_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsyev.cpp b/lib/linalg/dsyev.cpp index a222fc4b09..ccbdd9e998 100644 --- a/lib/linalg/dsyev.cpp +++ b/lib/linalg/dsyev.cpp @@ -1,277 +1,80 @@ -/* fortran/dsyev.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__0 = 0; static doublereal c_b17 = 1.; - -/* > \brief DSYEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matr -ices */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DSYEV + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER JOBZ, UPLO */ -/* INTEGER INFO, LDA, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYEV computes all eigenvalues and, optionally, eigenvectors of a */ -/* > real symmetric matrix A. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] JOBZ */ -/* > \verbatim */ -/* > JOBZ is CHARACTER*1 */ -/* > = 'N': Compute eigenvalues only; */ -/* > = 'V': Compute eigenvalues and eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A is stored; */ -/* > = 'L': Lower triangle of A is stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA, N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the */ -/* > leading N-by-N upper triangular part of A contains the */ -/* > upper triangular part of the matrix A. If UPLO = 'L', */ -/* > the leading N-by-N lower triangular part of A contains */ -/* > the lower triangular part of the matrix A. */ -/* > On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ -/* > orthonormal eigenvectors of the matrix A. */ -/* > If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') */ -/* > or the upper triangle (if UPLO='U') of A, including the */ -/* > diagonal, is destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] W */ -/* > \verbatim */ -/* > W is DOUBLE PRECISION array, dimension (N) */ -/* > If INFO = 0, the eigenvalues in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The length of the array WORK. LWORK >= max(1,3*N-1). */ -/* > For optimal efficiency, LWORK >= (NB+2)*N, */ -/* > where NB is the blocksize for DSYTRD returned by ILAENV. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, the algorithm failed to converge; i */ -/* > off-diagonal elements of an intermediate tridiagonal */ -/* > form did not converge to zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleSYeigen */ - -/* ===================================================================== */ -/* Subroutine */ int dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, - integer *lda, doublereal *w, doublereal *work, integer *lwork, - integer *info, ftnlen jobz_len, ftnlen uplo_len) +int dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *w, + doublereal *work, integer *lwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ integer nb; doublereal eps; integer inde; doublereal anrm; integer imax; doublereal rmin, rmax; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; logical lower, wantz; extern doublereal dlamch_(char *, ftnlen); integer iscale; - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern int dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, ftnlen); doublereal safmin; - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); doublereal bignum; integer indtau; - extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, - integer *); - extern doublereal dlansy_(char *, char *, integer *, doublereal *, - integer *, doublereal *, ftnlen, ftnlen); + extern int dsterf_(integer *, doublereal *, doublereal *, integer *); + extern doublereal dlansy_(char *, char *, integer *, doublereal *, integer *, doublereal *, + ftnlen, ftnlen); integer indwrk; - extern /* Subroutine */ int dorgtr_(char *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, integer *, - ftnlen), dsteqr_(char *, integer *, doublereal *, doublereal *, - doublereal *, integer *, doublereal *, integer *, ftnlen), - dsytrd_(char *, integer *, doublereal *, integer *, doublereal *, - doublereal *, doublereal *, doublereal *, integer *, integer *, - ftnlen); + extern int dorgtr_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, + integer *, integer *, ftnlen), + dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen), + dsytrd_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *, integer *, ftnlen); integer llwork; doublereal smlnum; integer lwkopt; logical lquery; - - -/* -- LAPACK driver routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --w; --work; - - /* Function Body */ wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); lower = lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - *info = 0; - if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + if (!(wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { *info = -1; - } else if (! (lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { + } else if (!(lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { *info = -2; } else if (*n < 0) { *info = -3; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -5; } - if (*info == 0) { - nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, - (ftnlen)1); -/* Computing MAX */ + nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); i__1 = 1, i__2 = (nb + 2) * *n; - lwkopt = max(i__1,i__2); - work[1] = (doublereal) lwkopt; - -/* Computing MAX */ + lwkopt = max(i__1, i__2); + work[1] = (doublereal)lwkopt; i__1 = 1, i__2 = *n * 3 - 1; - if (*lwork < max(i__1,i__2) && ! lquery) { + if (*lwork < max(i__1, i__2) && !lquery) { *info = -8; } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DSYEV ", &i__1, (ftnlen)6); @@ -279,13 +82,9 @@ ices */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - if (*n == 1) { w[1] = a[a_dim1 + 1]; work[1] = 2.; @@ -294,20 +93,13 @@ ices */ } return 0; } - -/* Get machine constants. */ - safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); eps = dlamch_((char *)"Precision", (ftnlen)9); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); - -/* Scale matrix to allowable range, if necessary. */ - - anrm = dlansy_((char *)"M", uplo, n, &a[a_offset], lda, &work[1], (ftnlen)1, ( - ftnlen)1); + anrm = dlansy_((char *)"M", uplo, n, &a[a_offset], lda, &work[1], (ftnlen)1, (ftnlen)1); iscale = 0; if (anrm > 0. && anrm < rmin) { iscale = 1; @@ -317,33 +109,21 @@ ices */ sigma = rmax / anrm; } if (iscale == 1) { - dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, - info, (ftnlen)1); + dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, info, (ftnlen)1); } - -/* Call DSYTRD to reduce symmetric matrix to tridiagonal form. */ - inde = 1; indtau = inde + *n; indwrk = indtau + *n; llwork = *lwork - indwrk + 1; - dsytrd_(uplo, n, &a[a_offset], lda, &w[1], &work[inde], &work[indtau], & - work[indwrk], &llwork, &iinfo, (ftnlen)1); - -/* For eigenvalues only, call DSTERF. For eigenvectors, first call */ -/* DORGTR to generate the orthogonal matrix, then call DSTEQR. */ - - if (! wantz) { + dsytrd_(uplo, n, &a[a_offset], lda, &w[1], &work[inde], &work[indtau], &work[indwrk], &llwork, + &iinfo, (ftnlen)1); + if (!wantz) { dsterf_(n, &w[1], &work[inde], info); } else { - dorgtr_(uplo, n, &a[a_offset], lda, &work[indtau], &work[indwrk], & - llwork, &iinfo, (ftnlen)1); - dsteqr_(jobz, n, &w[1], &work[inde], &a[a_offset], lda, &work[indtau], - info, (ftnlen)1); + dorgtr_(uplo, n, &a[a_offset], lda, &work[indtau], &work[indwrk], &llwork, &iinfo, + (ftnlen)1); + dsteqr_(jobz, n, &w[1], &work[inde], &a[a_offset], lda, &work[indtau], info, (ftnlen)1); } - -/* If matrix was scaled, then rescale eigenvalues appropriately. */ - if (iscale == 1) { if (*info == 0) { imax = *n; @@ -353,17 +133,9 @@ ices */ d__1 = 1. / sigma; dscal_(&imax, &d__1, &w[1], &c__1); } - -/* Set WORK(1) to optimal workspace size. */ - - work[1] = (doublereal) lwkopt; - + work[1] = (doublereal)lwkopt; return 0; - -/* End of DSYEV */ - -} /* dsyev_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsyevd.cpp b/lib/linalg/dsyevd.cpp index 2f8d5a145b..5c02bc14da 100644 --- a/lib/linalg/dsyevd.cpp +++ b/lib/linalg/dsyevd.cpp @@ -1,230 +1,23 @@ -/* fortran/dsyevd.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__0 = 0; static doublereal c_b17 = 1.; - -/* > \brief DSYEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY mat -rices */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DSYEVD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK, */ -/* LIWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER JOBZ, UPLO */ -/* INTEGER INFO, LDA, LIWORK, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IWORK( * ) */ -/* DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYEVD computes all eigenvalues and, optionally, eigenvectors of a */ -/* > real symmetric matrix A. If eigenvectors are desired, it uses a */ -/* > divide and conquer algorithm. */ -/* > */ -/* > The divide and conquer algorithm makes very mild assumptions about */ -/* > floating point arithmetic. It will work on machines with a guard */ -/* > digit in add/subtract, or on those binary machines without guard */ -/* > digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ -/* > Cray-2. It could conceivably fail on hexadecimal or decimal machines */ -/* > without guard digits, but we know of none. */ -/* > */ -/* > Because of large use of BLAS of level 3, DSYEVD needs N**2 more */ -/* > workspace than DSYEVX. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] JOBZ */ -/* > \verbatim */ -/* > JOBZ is CHARACTER*1 */ -/* > = 'N': Compute eigenvalues only; */ -/* > = 'V': Compute eigenvalues and eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A is stored; */ -/* > = 'L': Lower triangle of A is stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA, N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the */ -/* > leading N-by-N upper triangular part of A contains the */ -/* > upper triangular part of the matrix A. If UPLO = 'L', */ -/* > the leading N-by-N lower triangular part of A contains */ -/* > the lower triangular part of the matrix A. */ -/* > On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ -/* > orthonormal eigenvectors of the matrix A. */ -/* > If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') */ -/* > or the upper triangle (if UPLO='U') of A, including the */ -/* > diagonal, is destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] W */ -/* > \verbatim */ -/* > W is DOUBLE PRECISION array, dimension (N) */ -/* > If INFO = 0, the eigenvalues in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, */ -/* > dimension (LWORK) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > If N <= 1, LWORK must be at least 1. */ -/* > If JOBZ = 'N' and N > 1, LWORK must be at least 2*N+1. */ -/* > If JOBZ = 'V' and N > 1, LWORK must be at least */ -/* > 1 + 6*N + 2*N**2. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal sizes of the WORK and IWORK */ -/* > arrays, returns these values as the first entries of the WORK */ -/* > and IWORK arrays, and no error message related to LWORK or */ -/* > LIWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension (MAX(1,LIWORK)) */ -/* > On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LIWORK */ -/* > \verbatim */ -/* > LIWORK is INTEGER */ -/* > The dimension of the array IWORK. */ -/* > If N <= 1, LIWORK must be at least 1. */ -/* > If JOBZ = 'N' and N > 1, LIWORK must be at least 1. */ -/* > If JOBZ = 'V' and N > 1, LIWORK must be at least 3 + 5*N. */ -/* > */ -/* > If LIWORK = -1, then a workspace query is assumed; the */ -/* > routine only calculates the optimal sizes of the WORK and */ -/* > IWORK arrays, returns these values as the first entries of */ -/* > the WORK and IWORK arrays, and no error message related to */ -/* > LWORK or LIWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i and JOBZ = 'N', then the algorithm failed */ -/* > to converge; i off-diagonal elements of an intermediate */ -/* > tridiagonal form did not converge to zero; */ -/* > if INFO = i and JOBZ = 'V', then the algorithm failed */ -/* > to compute an eigenvalue while working on the submatrix */ -/* > lying in rows and columns INFO/(N+1) through */ -/* > mod(INFO,N+1). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleSYeigen */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Jeff Rutter, Computer Science Division, University of California */ -/* > at Berkeley, USA \n */ -/* > Modified by Francoise Tisseur, University of Tennessee \n */ -/* > Modified description of INFO. Sven, 16 Feb 05. \n */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dsyevd_(char *jobz, char *uplo, integer *n, doublereal * - a, integer *lda, doublereal *w, doublereal *work, integer *lwork, - integer *iwork, integer *liwork, integer *info, ftnlen jobz_len, - ftnlen uplo_len) +int dsyevd_(char *jobz, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *w, + doublereal *work, integer *lwork, integer *iwork, integer *liwork, integer *info, + ftnlen jobz_len, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal eps; integer inde; doublereal anrm, rmin, rmax; integer lopt; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo, lwmin, liopt; @@ -232,85 +25,49 @@ f"> */ integer indwk2, llwrk2; extern doublereal dlamch_(char *, ftnlen); integer iscale; - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dstedc_(char *, integer *, - doublereal *, doublereal *, doublereal *, integer *, doublereal *, - integer *, integer *, integer *, integer *, ftnlen), dlacpy_( - char *, integer *, integer *, doublereal *, integer *, doublereal - *, integer *, ftnlen); + extern int dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, ftnlen), + dstedc_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, integer *, integer *, integer *, integer *, ftnlen), + dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen); doublereal safmin; - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); doublereal bignum; integer indtau; - extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, - integer *); - extern doublereal dlansy_(char *, char *, integer *, doublereal *, - integer *, doublereal *, ftnlen, ftnlen); + extern int dsterf_(integer *, doublereal *, doublereal *, integer *); + extern doublereal dlansy_(char *, char *, integer *, doublereal *, integer *, doublereal *, + ftnlen, ftnlen); integer indwrk, liwmin; - extern /* Subroutine */ int dormtr_(char *, char *, char *, integer *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, integer *, ftnlen, ftnlen, - ftnlen), dsytrd_(char *, integer *, doublereal *, integer *, - doublereal *, doublereal *, doublereal *, doublereal *, integer *, - integer *, ftnlen); + extern int dormtr_(char *, char *, char *, integer *, integer *, doublereal *, integer *, + doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, + ftnlen, ftnlen, ftnlen), + dsytrd_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, doublereal *, integer *, integer *, ftnlen); integer llwork; doublereal smlnum; logical lquery; - - -/* -- LAPACK driver routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ - -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --w; --work; --iwork; - - /* Function Body */ wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); lower = lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1 || *liwork == -1; - *info = 0; - if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + if (!(wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { *info = -1; - } else if (! (lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { + } else if (!(lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { *info = -2; } else if (*n < 0) { *info = -3; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -5; } - if (*info == 0) { if (*n <= 1) { liwmin = 1; @@ -320,29 +77,25 @@ f"> */ } else { if (wantz) { liwmin = *n * 5 + 3; -/* Computing 2nd power */ i__1 = *n; lwmin = *n * 6 + 1 + (i__1 * i__1 << 1); } else { liwmin = 1; lwmin = (*n << 1) + 1; } -/* Computing MAX */ - i__1 = lwmin, i__2 = (*n << 1) + *n * ilaenv_(&c__1, (char *)"DSYTRD", - uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); - lopt = max(i__1,i__2); + i__1 = lwmin, i__2 = (*n << 1) + *n * ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, + &c_n1, (ftnlen)6, (ftnlen)1); + lopt = max(i__1, i__2); liopt = liwmin; } - work[1] = (doublereal) lopt; + work[1] = (doublereal)lopt; iwork[1] = liopt; - - if (*lwork < lwmin && ! lquery) { + if (*lwork < lwmin && !lquery) { *info = -8; - } else if (*liwork < liwmin && ! lquery) { + } else if (*liwork < liwmin && !lquery) { *info = -10; } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DSYEVD", &i__1, (ftnlen)6); @@ -350,13 +103,9 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - if (*n == 1) { w[1] = a[a_dim1 + 1]; if (wantz) { @@ -364,20 +113,13 @@ f"> */ } return 0; } - -/* Get machine constants. */ - safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); eps = dlamch_((char *)"Precision", (ftnlen)9); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); - -/* Scale matrix to allowable range, if necessary. */ - - anrm = dlansy_((char *)"M", uplo, n, &a[a_offset], lda, &work[1], (ftnlen)1, ( - ftnlen)1); + anrm = dlansy_((char *)"M", uplo, n, &a[a_offset], lda, &work[1], (ftnlen)1, (ftnlen)1); iscale = 0; if (anrm > 0. && anrm < rmin) { iscale = 1; @@ -387,54 +129,33 @@ f"> */ sigma = rmax / anrm; } if (iscale == 1) { - dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, - info, (ftnlen)1); + dlascl_(uplo, &c__0, &c__0, &c_b17, &sigma, n, n, &a[a_offset], lda, info, (ftnlen)1); } - -/* Call DSYTRD to reduce symmetric matrix to tridiagonal form. */ - inde = 1; indtau = inde + *n; indwrk = indtau + *n; llwork = *lwork - indwrk + 1; indwk2 = indwrk + *n * *n; llwrk2 = *lwork - indwk2 + 1; - - dsytrd_(uplo, n, &a[a_offset], lda, &w[1], &work[inde], &work[indtau], & - work[indwrk], &llwork, &iinfo, (ftnlen)1); - -/* For eigenvalues only, call DSTERF. For eigenvectors, first call */ -/* DSTEDC to generate the eigenvector matrix, WORK(INDWRK), of the */ -/* tridiagonal matrix, then call DORMTR to multiply it by the */ -/* Householder transformations stored in A. */ - - if (! wantz) { + dsytrd_(uplo, n, &a[a_offset], lda, &w[1], &work[inde], &work[indtau], &work[indwrk], &llwork, + &iinfo, (ftnlen)1); + if (!wantz) { dsterf_(n, &w[1], &work[inde], info); } else { - dstedc_((char *)"I", n, &w[1], &work[inde], &work[indwrk], n, &work[indwk2], & - llwrk2, &iwork[1], liwork, info, (ftnlen)1); - dormtr_((char *)"L", uplo, (char *)"N", n, n, &a[a_offset], lda, &work[indtau], &work[ - indwrk], n, &work[indwk2], &llwrk2, &iinfo, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); + dstedc_((char *)"I", n, &w[1], &work[inde], &work[indwrk], n, &work[indwk2], &llwrk2, &iwork[1], + liwork, info, (ftnlen)1); + dormtr_((char *)"L", uplo, (char *)"N", n, n, &a[a_offset], lda, &work[indtau], &work[indwrk], n, + &work[indwk2], &llwrk2, &iinfo, (ftnlen)1, (ftnlen)1, (ftnlen)1); dlacpy_((char *)"A", n, n, &work[indwrk], n, &a[a_offset], lda, (ftnlen)1); } - -/* If matrix was scaled, then rescale eigenvalues appropriately. */ - if (iscale == 1) { d__1 = 1. / sigma; dscal_(n, &d__1, &w[1], &c__1); } - - work[1] = (doublereal) lopt; + work[1] = (doublereal)lopt; iwork[1] = liopt; - return 0; - -/* End of DSYEVD */ - -} /* dsyevd_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsygs2.cpp b/lib/linalg/dsygs2.cpp index 785aeb4f27..c0b2972537 100644 --- a/lib/linalg/dsygs2.cpp +++ b/lib/linalg/dsygs2.cpp @@ -1,226 +1,45 @@ -/* fortran/dsygs2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b6 = -1.; static integer c__1 = 1; static doublereal c_b27 = 1.; - -/* > \brief \b DSYGS2 reduces a symmetric definite generalized eigenproblem to standard form, using the factor -ization results obtained from spotrf (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DSYGS2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, ITYPE, LDA, LDB, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYGS2 reduces a real symmetric-definite generalized eigenproblem */ -/* > to standard form. */ -/* > */ -/* > If ITYPE = 1, the problem is A*x = lambda*B*x, */ -/* > and A is overwritten by inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T) */ -/* > */ -/* > If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or */ -/* > B*A*x = lambda*x, and A is overwritten by U*A*U**T or L**T *A*L. */ -/* > */ -/* > B must have been previously factorized as U**T *U or L*L**T by DPOTRF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ITYPE */ -/* > \verbatim */ -/* > ITYPE is INTEGER */ -/* > = 1: compute inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T); */ -/* > = 2 or 3: compute U*A*U**T or L**T *A*L. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies whether the upper or lower triangular part of the */ -/* > symmetric matrix A is stored, and how B has been factorized. */ -/* > = 'U': Upper triangular */ -/* > = 'L': Lower triangular */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrices A and B. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ -/* > n by n upper triangular part of A contains the upper */ -/* > triangular part of the matrix A, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading n by n lower triangular part of A contains the lower */ -/* > triangular part of the matrix A, and the strictly upper */ -/* > triangular part of A is not referenced. */ -/* > */ -/* > On exit, if INFO = 0, the transformed matrix, stored in the */ -/* > same format as A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB,N) */ -/* > The triangular factor from the Cholesky factorization of B, */ -/* > as returned by DPOTRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleSYcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dsygs2_(integer *itype, char *uplo, integer *n, - doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * - info, ftnlen uplo_len) +int dsygs2_(integer *itype, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *b, + integer *ldb, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; doublereal d__1; - - /* Local variables */ integer k; doublereal ct, akk, bkk; - extern /* Subroutine */ int dsyr2_(char *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, ftnlen), dscal_(integer *, doublereal *, doublereal *, - integer *); + extern int dsyr2_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen), + dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *); + extern int daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; - extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen), dtrsv_(char *, char *, char *, integer *, doublereal *, - integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen), - xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen), + dtrsv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, integer *, + ftnlen, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (*itype < 1 || *itype > 3) { *info = -1; - } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + } else if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*n < 0) { *info = -3; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -5; - } else if (*ldb < max(1,*n)) { + } else if (*ldb < max(1, *n)) { *info = -7; } if (*info != 0) { @@ -228,20 +47,12 @@ f"> */ xerbla_((char *)"DSYGS2", &i__1, (ftnlen)6); return 0; } - if (*itype == 1) { if (upper) { - -/* Compute inv(U**T)*A*inv(U) */ - i__1 = *n; for (k = 1; k <= i__1; ++k) { - -/* Update the upper triangle of A(k:n,k:n) */ - akk = a[k + k * a_dim1]; bkk = b[k + k * b_dim1]; -/* Computing 2nd power */ d__1 = bkk; akk /= d__1 * d__1; a[k + k * a_dim1] = akk; @@ -251,34 +62,25 @@ f"> */ dscal_(&i__2, &d__1, &a[k + (k + 1) * a_dim1], lda); ct = akk * -.5; i__2 = *n - k; - daxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + ( - k + 1) * a_dim1], lda); + daxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + (k + 1) * a_dim1], + lda); i__2 = *n - k; dsyr2_(uplo, &i__2, &c_b6, &a[k + (k + 1) * a_dim1], lda, - &b[k + (k + 1) * b_dim1], ldb, &a[k + 1 + (k + 1) - * a_dim1], lda, (ftnlen)1); + &b[k + (k + 1) * b_dim1], ldb, &a[k + 1 + (k + 1) * a_dim1], lda, + (ftnlen)1); i__2 = *n - k; - daxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + ( - k + 1) * a_dim1], lda); + daxpy_(&i__2, &ct, &b[k + (k + 1) * b_dim1], ldb, &a[k + (k + 1) * a_dim1], + lda); i__2 = *n - k; - dtrsv_(uplo, (char *)"Transpose", (char *)"Non-unit", &i__2, &b[k + 1 + ( - k + 1) * b_dim1], ldb, &a[k + (k + 1) * a_dim1], - lda, (ftnlen)1, (ftnlen)9, (ftnlen)8); + dtrsv_(uplo, (char *)"Transpose", (char *)"Non-unit", &i__2, &b[k + 1 + (k + 1) * b_dim1], ldb, + &a[k + (k + 1) * a_dim1], lda, (ftnlen)1, (ftnlen)9, (ftnlen)8); } -/* L10: */ } } else { - -/* Compute inv(L)*A*inv(L**T) */ - i__1 = *n; for (k = 1; k <= i__1; ++k) { - -/* Update the lower triangle of A(k:n,k:n) */ - akk = a[k + k * a_dim1]; bkk = b[k + k * b_dim1]; -/* Computing 2nd power */ d__1 = bkk; akk /= d__1 * d__1; a[k + k * a_dim1] = akk; @@ -288,94 +90,68 @@ f"> */ dscal_(&i__2, &d__1, &a[k + 1 + k * a_dim1], &c__1); ct = akk * -.5; i__2 = *n - k; - daxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + - 1 + k * a_dim1], &c__1); + daxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + k * a_dim1], + &c__1); i__2 = *n - k; dsyr2_(uplo, &i__2, &c_b6, &a[k + 1 + k * a_dim1], &c__1, - &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + (k + 1) - * a_dim1], lda, (ftnlen)1); + &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + (k + 1) * a_dim1], lda, + (ftnlen)1); i__2 = *n - k; - daxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + - 1 + k * a_dim1], &c__1); + daxpy_(&i__2, &ct, &b[k + 1 + k * b_dim1], &c__1, &a[k + 1 + k * a_dim1], + &c__1); i__2 = *n - k; - dtrsv_(uplo, (char *)"No transpose", (char *)"Non-unit", &i__2, &b[k + 1 - + (k + 1) * b_dim1], ldb, &a[k + 1 + k * a_dim1], - &c__1, (ftnlen)1, (ftnlen)12, (ftnlen)8); + dtrsv_(uplo, (char *)"No transpose", (char *)"Non-unit", &i__2, &b[k + 1 + (k + 1) * b_dim1], + ldb, &a[k + 1 + k * a_dim1], &c__1, (ftnlen)1, (ftnlen)12, (ftnlen)8); } -/* L20: */ } } } else { if (upper) { - -/* Compute U*A*U**T */ - i__1 = *n; for (k = 1; k <= i__1; ++k) { - -/* Update the upper triangle of A(1:k,1:k) */ - akk = a[k + k * a_dim1]; bkk = b[k + k * b_dim1]; i__2 = k - 1; - dtrmv_(uplo, (char *)"No transpose", (char *)"Non-unit", &i__2, &b[b_offset], - ldb, &a[k * a_dim1 + 1], &c__1, (ftnlen)1, (ftnlen)12, - (ftnlen)8); + dtrmv_(uplo, (char *)"No transpose", (char *)"Non-unit", &i__2, &b[b_offset], ldb, + &a[k * a_dim1 + 1], &c__1, (ftnlen)1, (ftnlen)12, (ftnlen)8); ct = akk * .5; i__2 = k - 1; - daxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + - 1], &c__1); + daxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + 1], &c__1); i__2 = k - 1; - dsyr2_(uplo, &i__2, &c_b27, &a[k * a_dim1 + 1], &c__1, &b[k * - b_dim1 + 1], &c__1, &a[a_offset], lda, (ftnlen)1); + dsyr2_(uplo, &i__2, &c_b27, &a[k * a_dim1 + 1], &c__1, &b[k * b_dim1 + 1], &c__1, + &a[a_offset], lda, (ftnlen)1); i__2 = k - 1; - daxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + - 1], &c__1); + daxpy_(&i__2, &ct, &b[k * b_dim1 + 1], &c__1, &a[k * a_dim1 + 1], &c__1); i__2 = k - 1; dscal_(&i__2, &bkk, &a[k * a_dim1 + 1], &c__1); -/* Computing 2nd power */ d__1 = bkk; a[k + k * a_dim1] = akk * (d__1 * d__1); -/* L30: */ } } else { - -/* Compute L**T *A*L */ - i__1 = *n; for (k = 1; k <= i__1; ++k) { - -/* Update the lower triangle of A(1:k,1:k) */ - akk = a[k + k * a_dim1]; bkk = b[k + k * b_dim1]; i__2 = k - 1; - dtrmv_(uplo, (char *)"Transpose", (char *)"Non-unit", &i__2, &b[b_offset], - ldb, &a[k + a_dim1], lda, (ftnlen)1, (ftnlen)9, ( - ftnlen)8); + dtrmv_(uplo, (char *)"Transpose", (char *)"Non-unit", &i__2, &b[b_offset], ldb, &a[k + a_dim1], lda, + (ftnlen)1, (ftnlen)9, (ftnlen)8); ct = akk * .5; i__2 = k - 1; daxpy_(&i__2, &ct, &b[k + b_dim1], ldb, &a[k + a_dim1], lda); i__2 = k - 1; - dsyr2_(uplo, &i__2, &c_b27, &a[k + a_dim1], lda, &b[k + - b_dim1], ldb, &a[a_offset], lda, (ftnlen)1); + dsyr2_(uplo, &i__2, &c_b27, &a[k + a_dim1], lda, &b[k + b_dim1], ldb, &a[a_offset], + lda, (ftnlen)1); i__2 = k - 1; daxpy_(&i__2, &ct, &b[k + b_dim1], ldb, &a[k + a_dim1], lda); i__2 = k - 1; dscal_(&i__2, &bkk, &a[k + a_dim1], lda); -/* Computing 2nd power */ d__1 = bkk; a[k + k * a_dim1] = akk * (d__1 * d__1); -/* L40: */ } } } return 0; - -/* End of DSYGS2 */ - -} /* dsygs2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsygst.cpp b/lib/linalg/dsygst.cpp index 0ad89918d3..dcf546a181 100644 --- a/lib/linalg/dsygst.cpp +++ b/lib/linalg/dsygst.cpp @@ -1,231 +1,52 @@ -/* fortran/dsygst.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b14 = 1.; static doublereal c_b16 = -.5; static doublereal c_b19 = -1.; static doublereal c_b52 = .5; - -/* > \brief \b DSYGST */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DSYGST + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, ITYPE, LDA, LDB, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYGST reduces a real symmetric-definite generalized eigenproblem */ -/* > to standard form. */ -/* > */ -/* > If ITYPE = 1, the problem is A*x = lambda*B*x, */ -/* > and A is overwritten by inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T) */ -/* > */ -/* > If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or */ -/* > B*A*x = lambda*x, and A is overwritten by U*A*U**T or L**T*A*L. */ -/* > */ -/* > B must have been previously factorized as U**T*U or L*L**T by DPOTRF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ITYPE */ -/* > \verbatim */ -/* > ITYPE is INTEGER */ -/* > = 1: compute inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T); */ -/* > = 2 or 3: compute U*A*U**T or L**T*A*L. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A is stored and B is factored as */ -/* > U**T*U; */ -/* > = 'L': Lower triangle of A is stored and B is factored as */ -/* > L*L**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrices A and B. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ -/* > N-by-N upper triangular part of A contains the upper */ -/* > triangular part of the matrix A, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading N-by-N lower triangular part of A contains the lower */ -/* > triangular part of the matrix A, and the strictly upper */ -/* > triangular part of A is not referenced. */ -/* > */ -/* > On exit, if INFO = 0, the transformed matrix, stored in the */ -/* > same format as A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB,N) */ -/* > The triangular factor from the Cholesky factorization of B, */ -/* > as returned by DPOTRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleSYcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dsygst_(integer *itype, char *uplo, integer *n, - doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * - info, ftnlen uplo_len) +int dsygst_(integer *itype, char *uplo, integer *n, doublereal *a, integer *lda, doublereal *b, + integer *ldb, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; - - /* Local variables */ integer k, kb, nb; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), dsymm_( - char *, char *, integer *, integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *, doublereal *, doublereal *, - integer *, ftnlen, ftnlen); + extern int dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + dsymm_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); logical upper; - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), dsygs2_( - integer *, char *, integer *, doublereal *, integer *, doublereal - *, integer *, integer *, ftnlen), dsyr2k_(char *, char *, integer - *, integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen) - , xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + dsygs2_(integer *, char *, integer *, doublereal *, integer *, doublereal *, integer *, + integer *, ftnlen), + dsyr2k_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); if (*itype < 1 || *itype > 3) { *info = -1; - } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + } else if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*n < 0) { *info = -3; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -5; - } else if (*ldb < max(1,*n)) { + } else if (*ldb < max(1, *n)) { *info = -7; } if (*info != 0) { @@ -233,204 +54,138 @@ f"> */ xerbla_((char *)"DSYGST", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - -/* Determine the block size for this environment. */ - - nb = ilaenv_(&c__1, (char *)"DSYGST", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( - ftnlen)1); - + nb = ilaenv_(&c__1, (char *)"DSYGST", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); if (nb <= 1 || nb >= *n) { - -/* Use unblocked code */ - - dsygs2_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, ( - ftnlen)1); + dsygs2_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, (ftnlen)1); } else { - -/* Use blocked code */ - if (*itype == 1) { if (upper) { - -/* Compute inv(U**T)*A*inv(U) */ - i__1 = *n; i__2 = nb; for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { -/* Computing MIN */ i__3 = *n - k + 1; - kb = min(i__3,nb); - -/* Update the upper triangle of A(k:n,k:n) */ - - dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + - k * b_dim1], ldb, info, (ftnlen)1); + kb = min(i__3, nb); + dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + k * b_dim1], ldb, + info, (ftnlen)1); if (k + kb <= *n) { i__3 = *n - k - kb + 1; - dtrsm_((char *)"Left", uplo, (char *)"Transpose", (char *)"Non-unit", &kb, & - i__3, &c_b14, &b[k + k * b_dim1], ldb, &a[k + - (k + kb) * a_dim1], lda, (ftnlen)4, (ftnlen)1, - (ftnlen)9, (ftnlen)8); + dtrsm_((char *)"Left", uplo, (char *)"Transpose", (char *)"Non-unit", &kb, &i__3, &c_b14, + &b[k + k * b_dim1], ldb, &a[k + (k + kb) * a_dim1], lda, (ftnlen)4, + (ftnlen)1, (ftnlen)9, (ftnlen)8); i__3 = *n - k - kb + 1; - dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b16, &a[k + k * - a_dim1], lda, &b[k + (k + kb) * b_dim1], ldb, - &c_b14, &a[k + (k + kb) * a_dim1], lda, ( - ftnlen)4, (ftnlen)1); + dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b16, &a[k + k * a_dim1], lda, + &b[k + (k + kb) * b_dim1], ldb, &c_b14, &a[k + (k + kb) * a_dim1], + lda, (ftnlen)4, (ftnlen)1); i__3 = *n - k - kb + 1; - dsyr2k_(uplo, (char *)"Transpose", &i__3, &kb, &c_b19, &a[k + - (k + kb) * a_dim1], lda, &b[k + (k + kb) * - b_dim1], ldb, &c_b14, &a[k + kb + (k + kb) * - a_dim1], lda, (ftnlen)1, (ftnlen)9); + dsyr2k_(uplo, (char *)"Transpose", &i__3, &kb, &c_b19, &a[k + (k + kb) * a_dim1], + lda, &b[k + (k + kb) * b_dim1], ldb, &c_b14, + &a[k + kb + (k + kb) * a_dim1], lda, (ftnlen)1, (ftnlen)9); i__3 = *n - k - kb + 1; - dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b16, &a[k + k * - a_dim1], lda, &b[k + (k + kb) * b_dim1], ldb, - &c_b14, &a[k + (k + kb) * a_dim1], lda, ( - ftnlen)4, (ftnlen)1); + dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b16, &a[k + k * a_dim1], lda, + &b[k + (k + kb) * b_dim1], ldb, &c_b14, &a[k + (k + kb) * a_dim1], + lda, (ftnlen)4, (ftnlen)1); i__3 = *n - k - kb + 1; - dtrsm_((char *)"Right", uplo, (char *)"No transpose", (char *)"Non-unit", &kb, - &i__3, &c_b14, &b[k + kb + (k + kb) * b_dim1] - , ldb, &a[k + (k + kb) * a_dim1], lda, ( - ftnlen)5, (ftnlen)1, (ftnlen)12, (ftnlen)8); + dtrsm_((char *)"Right", uplo, (char *)"No transpose", (char *)"Non-unit", &kb, &i__3, &c_b14, + &b[k + kb + (k + kb) * b_dim1], ldb, &a[k + (k + kb) * a_dim1], lda, + (ftnlen)5, (ftnlen)1, (ftnlen)12, (ftnlen)8); } -/* L10: */ } } else { - -/* Compute inv(L)*A*inv(L**T) */ - i__2 = *n; i__1 = nb; for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { -/* Computing MIN */ i__3 = *n - k + 1; - kb = min(i__3,nb); - -/* Update the lower triangle of A(k:n,k:n) */ - - dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + - k * b_dim1], ldb, info, (ftnlen)1); + kb = min(i__3, nb); + dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + k * b_dim1], ldb, + info, (ftnlen)1); if (k + kb <= *n) { i__3 = *n - k - kb + 1; - dtrsm_((char *)"Right", uplo, (char *)"Transpose", (char *)"Non-unit", &i__3, - &kb, &c_b14, &b[k + k * b_dim1], ldb, &a[k + - kb + k * a_dim1], lda, (ftnlen)5, (ftnlen)1, ( - ftnlen)9, (ftnlen)8); + dtrsm_((char *)"Right", uplo, (char *)"Transpose", (char *)"Non-unit", &i__3, &kb, &c_b14, + &b[k + k * b_dim1], ldb, &a[k + kb + k * a_dim1], lda, (ftnlen)5, + (ftnlen)1, (ftnlen)9, (ftnlen)8); i__3 = *n - k - kb + 1; - dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b16, &a[k + k * - a_dim1], lda, &b[k + kb + k * b_dim1], ldb, & - c_b14, &a[k + kb + k * a_dim1], lda, (ftnlen) - 5, (ftnlen)1); + dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b16, &a[k + k * a_dim1], lda, + &b[k + kb + k * b_dim1], ldb, &c_b14, &a[k + kb + k * a_dim1], lda, + (ftnlen)5, (ftnlen)1); i__3 = *n - k - kb + 1; - dsyr2k_(uplo, (char *)"No transpose", &i__3, &kb, &c_b19, &a[ - k + kb + k * a_dim1], lda, &b[k + kb + k * - b_dim1], ldb, &c_b14, &a[k + kb + (k + kb) * - a_dim1], lda, (ftnlen)1, (ftnlen)12); + dsyr2k_(uplo, (char *)"No transpose", &i__3, &kb, &c_b19, &a[k + kb + k * a_dim1], + lda, &b[k + kb + k * b_dim1], ldb, &c_b14, + &a[k + kb + (k + kb) * a_dim1], lda, (ftnlen)1, (ftnlen)12); i__3 = *n - k - kb + 1; - dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b16, &a[k + k * - a_dim1], lda, &b[k + kb + k * b_dim1], ldb, & - c_b14, &a[k + kb + k * a_dim1], lda, (ftnlen) - 5, (ftnlen)1); + dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b16, &a[k + k * a_dim1], lda, + &b[k + kb + k * b_dim1], ldb, &c_b14, &a[k + kb + k * a_dim1], lda, + (ftnlen)5, (ftnlen)1); i__3 = *n - k - kb + 1; - dtrsm_((char *)"Left", uplo, (char *)"No transpose", (char *)"Non-unit", & - i__3, &kb, &c_b14, &b[k + kb + (k + kb) * - b_dim1], ldb, &a[k + kb + k * a_dim1], lda, ( - ftnlen)4, (ftnlen)1, (ftnlen)12, (ftnlen)8); + dtrsm_((char *)"Left", uplo, (char *)"No transpose", (char *)"Non-unit", &i__3, &kb, &c_b14, + &b[k + kb + (k + kb) * b_dim1], ldb, &a[k + kb + k * a_dim1], lda, + (ftnlen)4, (ftnlen)1, (ftnlen)12, (ftnlen)8); } -/* L20: */ } } } else { if (upper) { - -/* Compute U*A*U**T */ - i__1 = *n; i__2 = nb; for (k = 1; i__2 < 0 ? k >= i__1 : k <= i__1; k += i__2) { -/* Computing MIN */ i__3 = *n - k + 1; - kb = min(i__3,nb); - -/* Update the upper triangle of A(1:k+kb-1,1:k+kb-1) */ - + kb = min(i__3, nb); i__3 = k - 1; - dtrmm_((char *)"Left", uplo, (char *)"No transpose", (char *)"Non-unit", &i__3, & - kb, &c_b14, &b[b_offset], ldb, &a[k * a_dim1 + 1], - lda, (ftnlen)4, (ftnlen)1, (ftnlen)12, (ftnlen)8) - ; + dtrmm_((char *)"Left", uplo, (char *)"No transpose", (char *)"Non-unit", &i__3, &kb, &c_b14, + &b[b_offset], ldb, &a[k * a_dim1 + 1], lda, (ftnlen)4, (ftnlen)1, + (ftnlen)12, (ftnlen)8); i__3 = k - 1; - dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b52, &a[k + k * - a_dim1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, &a[ - k * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)1); + dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b52, &a[k + k * a_dim1], lda, + &b[k * b_dim1 + 1], ldb, &c_b14, &a[k * a_dim1 + 1], lda, (ftnlen)5, + (ftnlen)1); i__3 = k - 1; - dsyr2k_(uplo, (char *)"No transpose", &i__3, &kb, &c_b14, &a[k * - a_dim1 + 1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, - &a[a_offset], lda, (ftnlen)1, (ftnlen)12); + dsyr2k_(uplo, (char *)"No transpose", &i__3, &kb, &c_b14, &a[k * a_dim1 + 1], lda, + &b[k * b_dim1 + 1], ldb, &c_b14, &a[a_offset], lda, (ftnlen)1, + (ftnlen)12); i__3 = k - 1; - dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b52, &a[k + k * - a_dim1], lda, &b[k * b_dim1 + 1], ldb, &c_b14, &a[ - k * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)1); + dsymm_((char *)"Right", uplo, &i__3, &kb, &c_b52, &a[k + k * a_dim1], lda, + &b[k * b_dim1 + 1], ldb, &c_b14, &a[k * a_dim1 + 1], lda, (ftnlen)5, + (ftnlen)1); i__3 = k - 1; - dtrmm_((char *)"Right", uplo, (char *)"Transpose", (char *)"Non-unit", &i__3, &kb, - &c_b14, &b[k + k * b_dim1], ldb, &a[k * a_dim1 + - 1], lda, (ftnlen)5, (ftnlen)1, (ftnlen)9, (ftnlen) - 8); - dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + - k * b_dim1], ldb, info, (ftnlen)1); -/* L30: */ + dtrmm_((char *)"Right", uplo, (char *)"Transpose", (char *)"Non-unit", &i__3, &kb, &c_b14, + &b[k + k * b_dim1], ldb, &a[k * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)1, + (ftnlen)9, (ftnlen)8); + dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + k * b_dim1], ldb, + info, (ftnlen)1); } } else { - -/* Compute L**T*A*L */ - i__2 = *n; i__1 = nb; for (k = 1; i__1 < 0 ? k >= i__2 : k <= i__2; k += i__1) { -/* Computing MIN */ i__3 = *n - k + 1; - kb = min(i__3,nb); - -/* Update the lower triangle of A(1:k+kb-1,1:k+kb-1) */ - + kb = min(i__3, nb); i__3 = k - 1; - dtrmm_((char *)"Right", uplo, (char *)"No transpose", (char *)"Non-unit", &kb, & - i__3, &c_b14, &b[b_offset], ldb, &a[k + a_dim1], - lda, (ftnlen)5, (ftnlen)1, (ftnlen)12, (ftnlen)8); + dtrmm_((char *)"Right", uplo, (char *)"No transpose", (char *)"Non-unit", &kb, &i__3, &c_b14, + &b[b_offset], ldb, &a[k + a_dim1], lda, (ftnlen)5, (ftnlen)1, (ftnlen)12, + (ftnlen)8); i__3 = k - 1; - dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b52, &a[k + k * - a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[k + - a_dim1], lda, (ftnlen)4, (ftnlen)1); + dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b52, &a[k + k * a_dim1], lda, + &b[k + b_dim1], ldb, &c_b14, &a[k + a_dim1], lda, (ftnlen)4, (ftnlen)1); i__3 = k - 1; - dsyr2k_(uplo, (char *)"Transpose", &i__3, &kb, &c_b14, &a[k + - a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[ - a_offset], lda, (ftnlen)1, (ftnlen)9); + dsyr2k_(uplo, (char *)"Transpose", &i__3, &kb, &c_b14, &a[k + a_dim1], lda, + &b[k + b_dim1], ldb, &c_b14, &a[a_offset], lda, (ftnlen)1, (ftnlen)9); i__3 = k - 1; - dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b52, &a[k + k * - a_dim1], lda, &b[k + b_dim1], ldb, &c_b14, &a[k + - a_dim1], lda, (ftnlen)4, (ftnlen)1); + dsymm_((char *)"Left", uplo, &kb, &i__3, &c_b52, &a[k + k * a_dim1], lda, + &b[k + b_dim1], ldb, &c_b14, &a[k + a_dim1], lda, (ftnlen)4, (ftnlen)1); i__3 = k - 1; - dtrmm_((char *)"Left", uplo, (char *)"Transpose", (char *)"Non-unit", &kb, &i__3, - &c_b14, &b[k + k * b_dim1], ldb, &a[k + a_dim1], - lda, (ftnlen)4, (ftnlen)1, (ftnlen)9, (ftnlen)8); - dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + - k * b_dim1], ldb, info, (ftnlen)1); -/* L40: */ + dtrmm_((char *)"Left", uplo, (char *)"Transpose", (char *)"Non-unit", &kb, &i__3, &c_b14, + &b[k + k * b_dim1], ldb, &a[k + a_dim1], lda, (ftnlen)4, (ftnlen)1, + (ftnlen)9, (ftnlen)8); + dsygs2_(itype, uplo, &kb, &a[k + k * a_dim1], lda, &b[k + k * b_dim1], ldb, + info, (ftnlen)1); } } } } return 0; - -/* End of DSYGST */ - -} /* dsygst_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsygv.cpp b/lib/linalg/dsygv.cpp index bc7ed2cc76..62194ee354 100644 --- a/lib/linalg/dsygv.cpp +++ b/lib/linalg/dsygv.cpp @@ -1,263 +1,37 @@ -/* fortran/dsygv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static doublereal c_b16 = 1.; - -/* > \brief \b DSYGV */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DSYGV + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYGV( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, */ -/* LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER JOBZ, UPLO */ -/* INTEGER INFO, ITYPE, LDA, LDB, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), W( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYGV computes all the eigenvalues, and optionally, the eigenvectors */ -/* > of a real generalized symmetric-definite eigenproblem, of the form */ -/* > A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. */ -/* > Here A and B are assumed to be symmetric and B is also */ -/* > positive definite. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ITYPE */ -/* > \verbatim */ -/* > ITYPE is INTEGER */ -/* > Specifies the problem type to be solved: */ -/* > = 1: A*x = (lambda)*B*x */ -/* > = 2: A*B*x = (lambda)*x */ -/* > = 3: B*A*x = (lambda)*x */ -/* > \endverbatim */ -/* > */ -/* > \param[in] JOBZ */ -/* > \verbatim */ -/* > JOBZ is CHARACTER*1 */ -/* > = 'N': Compute eigenvalues only; */ -/* > = 'V': Compute eigenvalues and eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangles of A and B are stored; */ -/* > = 'L': Lower triangles of A and B are stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrices A and B. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA, N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the */ -/* > leading N-by-N upper triangular part of A contains the */ -/* > upper triangular part of the matrix A. If UPLO = 'L', */ -/* > the leading N-by-N lower triangular part of A contains */ -/* > the lower triangular part of the matrix A. */ -/* > */ -/* > On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ -/* > matrix Z of eigenvectors. The eigenvectors are normalized */ -/* > as follows: */ -/* > if ITYPE = 1 or 2, Z**T*B*Z = I; */ -/* > if ITYPE = 3, Z**T*inv(B)*Z = I. */ -/* > If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') */ -/* > or the lower triangle (if UPLO='L') of A, including the */ -/* > diagonal, is destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB, N) */ -/* > On entry, the symmetric positive definite matrix B. */ -/* > If UPLO = 'U', the leading N-by-N upper triangular part of B */ -/* > contains the upper triangular part of the matrix B. */ -/* > If UPLO = 'L', the leading N-by-N lower triangular part of B */ -/* > contains the lower triangular part of the matrix B. */ -/* > */ -/* > On exit, if INFO <= N, the part of B containing the matrix is */ -/* > overwritten by the triangular factor U or L from the Cholesky */ -/* > factorization B = U**T*U or B = L*L**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] W */ -/* > \verbatim */ -/* > W is DOUBLE PRECISION array, dimension (N) */ -/* > If INFO = 0, the eigenvalues in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The length of the array WORK. LWORK >= max(1,3*N-1). */ -/* > For optimal efficiency, LWORK >= (NB+2)*N, */ -/* > where NB is the blocksize for DSYTRD returned by ILAENV. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: DPOTRF or DSYEV returned an error code: */ -/* > <= N: if INFO = i, DSYEV failed to converge; */ -/* > i off-diagonal elements of an intermediate */ -/* > tridiagonal form did not converge to zero; */ -/* > > N: if INFO = N + i, for 1 <= i <= N, then the leading */ -/* > minor of order i of B is not positive definite. */ -/* > The factorization of B could not be completed and */ -/* > no eigenvalues or eigenvectors were computed. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleSYeigen */ - -/* ===================================================================== */ -/* Subroutine */ int dsygv_(integer *itype, char *jobz, char *uplo, integer * - n, doublereal *a, integer *lda, doublereal *b, integer *ldb, - doublereal *w, doublereal *work, integer *lwork, integer *info, - ftnlen jobz_len, ftnlen uplo_len) +int dsygv_(integer *itype, char *jobz, char *uplo, integer *n, doublereal *a, integer *lda, + doublereal *b, integer *ldb, doublereal *w, doublereal *work, integer *lwork, + integer *info, ftnlen jobz_len, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2; - - /* Local variables */ integer nb, neig; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen); char trans[1]; - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen); logical upper; - extern /* Subroutine */ int dsyev_(char *, char *, integer *, doublereal * - , integer *, doublereal *, doublereal *, integer *, integer *, - ftnlen, ftnlen); + extern int dsyev_(char *, char *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *, ftnlen, ftnlen); logical wantz; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int dpotrf_(char *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int dpotrf_(char *, integer *, doublereal *, integer *, integer *, ftnlen); integer lwkmin; - extern /* Subroutine */ int dsygst_(integer *, char *, integer *, - doublereal *, integer *, doublereal *, integer *, integer *, - ftnlen); + extern int dsygst_(integer *, char *, integer *, doublereal *, integer *, doublereal *, + integer *, integer *, ftnlen); integer lwkopt; logical lquery; - - -/* -- LAPACK driver routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -266,43 +40,34 @@ static doublereal c_b16 = 1.; b -= b_offset; --w; --work; - - /* Function Body */ wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - *info = 0; if (*itype < 1 || *itype > 3) { *info = -1; - } else if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + } else if (!(wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { *info = -2; - } else if (! (upper || lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1))) { + } else if (!(upper || lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1))) { *info = -3; } else if (*n < 0) { *info = -4; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -6; - } else if (*ldb < max(1,*n)) { + } else if (*ldb < max(1, *n)) { *info = -8; } - if (*info == 0) { -/* Computing MAX */ i__1 = 1, i__2 = *n * 3 - 1; - lwkmin = max(i__1,i__2); - nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, - (ftnlen)1); -/* Computing MAX */ + lwkmin = max(i__1, i__2); + nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); i__1 = lwkmin, i__2 = (nb + 2) * *n; - lwkopt = max(i__1,i__2); - work[1] = (doublereal) lwkopt; - - if (*lwork < lwkmin && ! lquery) { + lwkopt = max(i__1, i__2); + work[1] = (doublereal)lwkopt; + if (*lwork < lwkmin && !lquery) { *info = -11; } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DSYGV ", &i__1, (ftnlen)6); @@ -310,75 +75,42 @@ static doublereal c_b16 = 1.; } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - -/* Form a Cholesky factorization of B. */ - dpotrf_(uplo, n, &b[b_offset], ldb, info, (ftnlen)1); if (*info != 0) { *info = *n + *info; return 0; } - -/* Transform problem to standard eigenvalue problem and solve. */ - - dsygst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, ( - ftnlen)1); - dsyev_(jobz, uplo, n, &a[a_offset], lda, &w[1], &work[1], lwork, info, ( - ftnlen)1, (ftnlen)1); - + dsygst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, (ftnlen)1); + dsyev_(jobz, uplo, n, &a[a_offset], lda, &w[1], &work[1], lwork, info, (ftnlen)1, (ftnlen)1); if (wantz) { - -/* Backtransform eigenvectors to the original problem. */ - neig = *n; if (*info > 0) { neig = *info - 1; } if (*itype == 1 || *itype == 2) { - -/* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; */ -/* backtransform eigenvectors: x = inv(L)**T*y or inv(U)*y */ - if (upper) { *(unsigned char *)trans = 'N'; } else { *(unsigned char *)trans = 'T'; } - - dtrsm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, &neig, &c_b16, &b[ - b_offset], ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, ( - ftnlen)1, (ftnlen)8); - + dtrsm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, &neig, &c_b16, &b[b_offset], ldb, + &a[a_offset], lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, (ftnlen)8); } else if (*itype == 3) { - -/* For B*A*x=(lambda)*x; */ -/* backtransform eigenvectors: x = L*y or U**T*y */ - if (upper) { *(unsigned char *)trans = 'T'; } else { *(unsigned char *)trans = 'N'; } - - dtrmm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, &neig, &c_b16, &b[ - b_offset], ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, ( - ftnlen)1, (ftnlen)8); + dtrmm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, &neig, &c_b16, &b[b_offset], ldb, + &a[a_offset], lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, (ftnlen)8); } } - - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; return 0; - -/* End of DSYGV */ - -} /* dsygv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsygvd.cpp b/lib/linalg/dsygvd.cpp index c44f6239f6..59c69d21d1 100644 --- a/lib/linalg/dsygvd.cpp +++ b/lib/linalg/dsygvd.cpp @@ -1,310 +1,34 @@ -/* fortran/dsygvd.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b11 = 1.; - -/* > \brief \b DSYGVD */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DSYGVD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYGVD( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, */ -/* LWORK, IWORK, LIWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER JOBZ, UPLO */ -/* INTEGER INFO, ITYPE, LDA, LDB, LIWORK, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IWORK( * ) */ -/* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), W( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYGVD computes all the eigenvalues, and optionally, the eigenvectors */ -/* > of a real generalized symmetric-definite eigenproblem, of the form */ -/* > A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. Here A and */ -/* > B are assumed to be symmetric and B is also positive definite. */ -/* > If eigenvectors are desired, it uses a divide and conquer algorithm. */ -/* > */ -/* > The divide and conquer algorithm makes very mild assumptions about */ -/* > floating point arithmetic. It will work on machines with a guard */ -/* > digit in add/subtract, or on those binary machines without guard */ -/* > digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ -/* > Cray-2. It could conceivably fail on hexadecimal or decimal machines */ -/* > without guard digits, but we know of none. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ITYPE */ -/* > \verbatim */ -/* > ITYPE is INTEGER */ -/* > Specifies the problem type to be solved: */ -/* > = 1: A*x = (lambda)*B*x */ -/* > = 2: A*B*x = (lambda)*x */ -/* > = 3: B*A*x = (lambda)*x */ -/* > \endverbatim */ -/* > */ -/* > \param[in] JOBZ */ -/* > \verbatim */ -/* > JOBZ is CHARACTER*1 */ -/* > = 'N': Compute eigenvalues only; */ -/* > = 'V': Compute eigenvalues and eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangles of A and B are stored; */ -/* > = 'L': Lower triangles of A and B are stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrices A and B. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA, N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the */ -/* > leading N-by-N upper triangular part of A contains the */ -/* > upper triangular part of the matrix A. If UPLO = 'L', */ -/* > the leading N-by-N lower triangular part of A contains */ -/* > the lower triangular part of the matrix A. */ -/* > */ -/* > On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ -/* > matrix Z of eigenvectors. The eigenvectors are normalized */ -/* > as follows: */ -/* > if ITYPE = 1 or 2, Z**T*B*Z = I; */ -/* > if ITYPE = 3, Z**T*inv(B)*Z = I. */ -/* > If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') */ -/* > or the lower triangle (if UPLO='L') of A, including the */ -/* > diagonal, is destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB, N) */ -/* > On entry, the symmetric matrix B. If UPLO = 'U', the */ -/* > leading N-by-N upper triangular part of B contains the */ -/* > upper triangular part of the matrix B. If UPLO = 'L', */ -/* > the leading N-by-N lower triangular part of B contains */ -/* > the lower triangular part of the matrix B. */ -/* > */ -/* > On exit, if INFO <= N, the part of B containing the matrix is */ -/* > overwritten by the triangular factor U or L from the Cholesky */ -/* > factorization B = U**T*U or B = L*L**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] W */ -/* > \verbatim */ -/* > W is DOUBLE PRECISION array, dimension (N) */ -/* > If INFO = 0, the eigenvalues in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > If N <= 1, LWORK >= 1. */ -/* > If JOBZ = 'N' and N > 1, LWORK >= 2*N+1. */ -/* > If JOBZ = 'V' and N > 1, LWORK >= 1 + 6*N + 2*N**2. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal sizes of the WORK and IWORK */ -/* > arrays, returns these values as the first entries of the WORK */ -/* > and IWORK arrays, and no error message related to LWORK or */ -/* > LIWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension (MAX(1,LIWORK)) */ -/* > On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LIWORK */ -/* > \verbatim */ -/* > LIWORK is INTEGER */ -/* > The dimension of the array IWORK. */ -/* > If N <= 1, LIWORK >= 1. */ -/* > If JOBZ = 'N' and N > 1, LIWORK >= 1. */ -/* > If JOBZ = 'V' and N > 1, LIWORK >= 3 + 5*N. */ -/* > */ -/* > If LIWORK = -1, then a workspace query is assumed; the */ -/* > routine only calculates the optimal sizes of the WORK and */ -/* > IWORK arrays, returns these values as the first entries of */ -/* > the WORK and IWORK arrays, and no error message related to */ -/* > LWORK or LIWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: DPOTRF or DSYEVD returned an error code: */ -/* > <= N: if INFO = i and JOBZ = 'N', then the algorithm */ -/* > failed to converge; i off-diagonal elements of an */ -/* > intermediate tridiagonal form did not converge to */ -/* > zero; */ -/* > if INFO = i and JOBZ = 'V', then the algorithm */ -/* > failed to compute an eigenvalue while working on */ -/* > the submatrix lying in rows and columns INFO/(N+1) */ -/* > through mod(INFO,N+1); */ -/* > > N: if INFO = N + i, for 1 <= i <= N, then the leading */ -/* > minor of order i of B is not positive definite. */ -/* > The factorization of B could not be completed and */ -/* > no eigenvalues or eigenvectors were computed. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleSYeigen */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Modified so that no backsubstitution is performed if DSYEVD fails to */ -/* > converge (NEIG in old code could be greater than N causing out of */ -/* > bounds reference to A - reported by Ralf Meyer). Also corrected the */ -/* > description of INFO and the test on ITYPE. Sven, 16 Feb 05. */ -/* > \endverbatim */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dsygvd_(integer *itype, char *jobz, char *uplo, integer * - n, doublereal *a, integer *lda, doublereal *b, integer *ldb, - doublereal *w, doublereal *work, integer *lwork, integer *iwork, - integer *liwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) +int dsygvd_(integer *itype, char *jobz, char *uplo, integer *n, doublereal *a, integer *lda, + doublereal *b, integer *ldb, doublereal *w, doublereal *work, integer *lwork, + integer *iwork, integer *liwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1; doublereal d__1, d__2; - - /* Local variables */ integer lopt; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen); integer lwmin; char trans[1]; integer liopt; - extern /* Subroutine */ int dtrsm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen); logical upper, wantz; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen), dpotrf_( - char *, integer *, doublereal *, integer *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen), + dpotrf_(char *, integer *, doublereal *, integer *, integer *, ftnlen); integer liwmin; - extern /* Subroutine */ int dsyevd_(char *, char *, integer *, doublereal - *, integer *, doublereal *, doublereal *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen), dsygst_(integer *, char *, - integer *, doublereal *, integer *, doublereal *, integer *, - integer *, ftnlen); + extern int dsyevd_(char *, char *, integer *, doublereal *, integer *, doublereal *, + doublereal *, integer *, integer *, integer *, integer *, ftnlen, ftnlen), + dsygst_(integer *, char *, integer *, doublereal *, integer *, doublereal *, integer *, + integer *, ftnlen); logical lquery; - - -/* -- LAPACK driver routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -314,19 +38,15 @@ f"> */ --w; --work; --iwork; - - /* Function Body */ wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1 || *liwork == -1; - *info = 0; if (*n <= 1) { liwmin = 1; lwmin = 1; } else if (wantz) { liwmin = *n * 5 + 3; -/* Computing 2nd power */ i__1 = *n; lwmin = *n * 6 + 1 + (i__1 * i__1 << 1); } else { @@ -337,29 +57,26 @@ f"> */ liopt = liwmin; if (*itype < 1 || *itype > 3) { *info = -1; - } else if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + } else if (!(wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { *info = -2; - } else if (! (upper || lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1))) { + } else if (!(upper || lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1))) { *info = -3; } else if (*n < 0) { *info = -4; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -6; - } else if (*ldb < max(1,*n)) { + } else if (*ldb < max(1, *n)) { *info = -8; } - if (*info == 0) { - work[1] = (doublereal) lopt; + work[1] = (doublereal)lopt; iwork[1] = liopt; - - if (*lwork < lwmin && ! lquery) { + if (*lwork < lwmin && !lquery) { *info = -11; - } else if (*liwork < liwmin && ! lquery) { + } else if (*liwork < liwmin && !lquery) { *info = -13; } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DSYGVD", &i__1, (ftnlen)6); @@ -367,79 +84,44 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - -/* Form a Cholesky factorization of B. */ - dpotrf_(uplo, n, &b[b_offset], ldb, info, (ftnlen)1); if (*info != 0) { *info = *n + *info; return 0; } - -/* Transform problem to standard eigenvalue problem and solve. */ - - dsygst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, ( - ftnlen)1); - dsyevd_(jobz, uplo, n, &a[a_offset], lda, &w[1], &work[1], lwork, &iwork[ - 1], liwork, info, (ftnlen)1, (ftnlen)1); -/* Computing MAX */ - d__1 = (doublereal) lopt; - lopt = (integer) max(d__1,work[1]); -/* Computing MAX */ - d__1 = (doublereal) liopt, d__2 = (doublereal) iwork[1]; - liopt = (integer) max(d__1,d__2); - + dsygst_(itype, uplo, n, &a[a_offset], lda, &b[b_offset], ldb, info, (ftnlen)1); + dsyevd_(jobz, uplo, n, &a[a_offset], lda, &w[1], &work[1], lwork, &iwork[1], liwork, info, + (ftnlen)1, (ftnlen)1); + d__1 = (doublereal)lopt; + lopt = (integer)max(d__1, work[1]); + d__1 = (doublereal)liopt, d__2 = (doublereal)iwork[1]; + liopt = (integer)max(d__1, d__2); if (wantz && *info == 0) { - -/* Backtransform eigenvectors to the original problem. */ - if (*itype == 1 || *itype == 2) { - -/* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; */ -/* backtransform eigenvectors: x = inv(L)**T*y or inv(U)*y */ - if (upper) { *(unsigned char *)trans = 'N'; } else { *(unsigned char *)trans = 'T'; } - - dtrsm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, n, &c_b11, &b[b_offset] - , ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, - (ftnlen)8); - + dtrsm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, n, &c_b11, &b[b_offset], ldb, &a[a_offset], + lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, (ftnlen)8); } else if (*itype == 3) { - -/* For B*A*x=(lambda)*x; */ -/* backtransform eigenvectors: x = L*y or U**T*y */ - if (upper) { *(unsigned char *)trans = 'T'; } else { *(unsigned char *)trans = 'N'; } - - dtrmm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, n, &c_b11, &b[b_offset] - , ldb, &a[a_offset], lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, - (ftnlen)8); + dtrmm_((char *)"Left", uplo, trans, (char *)"Non-unit", n, n, &c_b11, &b[b_offset], ldb, &a[a_offset], + lda, (ftnlen)4, (ftnlen)1, (ftnlen)1, (ftnlen)8); } } - - work[1] = (doublereal) lopt; + work[1] = (doublereal)lopt; iwork[1] = liopt; - return 0; - -/* End of DSYGVD */ - -} /* dsygvd_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsymm.cpp b/lib/linalg/dsymm.cpp index 83538c9c27..f50e24cf3c 100644 --- a/lib/linalg/dsymm.cpp +++ b/lib/linalg/dsymm.cpp @@ -1,250 +1,18 @@ -/* fortran/dsymm.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DSYMM */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION ALPHA,BETA */ -/* INTEGER LDA,LDB,LDC,M,N */ -/* CHARACTER SIDE,UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYMM performs one of the matrix-matrix operations */ -/* > */ -/* > C := alpha*A*B + beta*C, */ -/* > */ -/* > or */ -/* > */ -/* > C := alpha*B*A + beta*C, */ -/* > */ -/* > where alpha and beta are scalars, A is a symmetric matrix and B and */ -/* > C are m by n matrices. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > On entry, SIDE specifies whether the symmetric matrix A */ -/* > appears on the left or right in the operation as follows: */ -/* > */ -/* > SIDE = 'L' or 'l' C := alpha*A*B + beta*C, */ -/* > */ -/* > SIDE = 'R' or 'r' C := alpha*B*A + beta*C, */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the upper or lower */ -/* > triangular part of the symmetric matrix A is to be */ -/* > referenced as follows: */ -/* > */ -/* > UPLO = 'U' or 'u' Only the upper triangular part of the */ -/* > symmetric matrix is to be referenced. */ -/* > */ -/* > UPLO = 'L' or 'l' Only the lower triangular part of the */ -/* > symmetric matrix is to be referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > On entry, M specifies the number of rows of the matrix C. */ -/* > M must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the number of columns of the matrix C. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION. */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is */ -/* > m when SIDE = 'L' or 'l' and is n otherwise. */ -/* > Before entry with SIDE = 'L' or 'l', the m by m part of */ -/* > the array A must contain the symmetric matrix, such that */ -/* > when UPLO = 'U' or 'u', the leading m by m upper triangular */ -/* > part of the array A must contain the upper triangular part */ -/* > of the symmetric matrix and the strictly lower triangular */ -/* > part of A is not referenced, and when UPLO = 'L' or 'l', */ -/* > the leading m by m lower triangular part of the array A */ -/* > must contain the lower triangular part of the symmetric */ -/* > matrix and the strictly upper triangular part of A is not */ -/* > referenced. */ -/* > Before entry with SIDE = 'R' or 'r', the n by n part of */ -/* > the array A must contain the symmetric matrix, such that */ -/* > when UPLO = 'U' or 'u', the leading n by n upper triangular */ -/* > part of the array A must contain the upper triangular part */ -/* > of the symmetric matrix and the strictly lower triangular */ -/* > part of A is not referenced, and when UPLO = 'L' or 'l', */ -/* > the leading n by n lower triangular part of the array A */ -/* > must contain the lower triangular part of the symmetric */ -/* > matrix and the strictly upper triangular part of A is not */ -/* > referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. When SIDE = 'L' or 'l' then */ -/* > LDA must be at least max( 1, m ), otherwise LDA must be at */ -/* > least max( 1, n ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension ( LDB, N ) */ -/* > Before entry, the leading m by n part of the array B must */ -/* > contain the matrix B. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > On entry, LDB specifies the first dimension of B as declared */ -/* > in the calling (sub) program. LDB must be at least */ -/* > max( 1, m ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is DOUBLE PRECISION. */ -/* > On entry, BETA specifies the scalar beta. When BETA is */ -/* > supplied as zero then C need not be set on input. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension ( LDC, N ) */ -/* > Before entry, the leading m by n part of the array C must */ -/* > contain the matrix C, except when beta is zero, in which */ -/* > case C need not be set on entry. */ -/* > On exit, the array C is overwritten by the m by n updated */ -/* > matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > On entry, LDC specifies the first dimension of C as declared */ -/* > in the calling (sub) program. LDC must be at least */ -/* > max( 1, m ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level3 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 3 Blas routine. */ -/* > */ -/* > -- Written on 8-February-1989. */ -/* > Jack Dongarra, Argonne National Laboratory. */ -/* > Iain Duff, AERE Harwell. */ -/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ -/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dsymm_(char *side, char *uplo, integer *m, integer *n, - doublereal *alpha, doublereal *a, integer *lda, doublereal *b, - integer *ldb, doublereal *beta, doublereal *c__, integer *ldc, ftnlen - side_len, ftnlen uplo_len) +int dsymm_(char *side, char *uplo, integer *m, integer *n, doublereal *alpha, doublereal *a, + integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, + integer *ldc, ftnlen side_len, ftnlen uplo_len) { - /* System generated locals */ - integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, - i__3; - - /* Local variables */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3; integer i__, j, k, info; doublereal temp1, temp2; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nrowa; logical upper; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level3 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Parameters .. */ -/* .. */ - -/* Set NROWA as the number of rows of A. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -254,47 +22,35 @@ extern "C" { c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; - - /* Function Body */ if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { nrowa = *m; } else { nrowa = *n; } upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - -/* Test the input parameters. */ - info = 0; - if (! lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) && ! lsame_(side, (char *)"R", ( - ftnlen)1, (ftnlen)1)) { + if (!lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + } else if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 2; } else if (*m < 0) { info = 3; } else if (*n < 0) { info = 4; - } else if (*lda < max(1,nrowa)) { + } else if (*lda < max(1, nrowa)) { info = 7; - } else if (*ldb < max(1,*m)) { + } else if (*ldb < max(1, *m)) { info = 9; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { info = 12; } if (info != 0) { xerbla_((char *)"DSYMM ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*m == 0 || *n == 0 || *alpha == 0. && *beta == 1.) { return 0; } - -/* And when alpha.eq.zero. */ - if (*alpha == 0.) { if (*beta == 0.) { i__1 = *n; @@ -302,9 +58,7 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; -/* L10: */ } -/* L20: */ } } else { i__1 = *n; @@ -312,20 +66,12 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; -/* L30: */ } -/* L40: */ } } return 0; } - -/* Start the operations. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Form C := alpha*A*B + beta*C. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -337,19 +83,14 @@ extern "C" { for (k = 1; k <= i__3; ++k) { c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; -/* L50: */ } if (*beta == 0.) { - c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] - + *alpha * temp2; + c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + *alpha * temp2; } else { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] - + temp1 * a[i__ + i__ * a_dim1] + *alpha * - temp2; + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * a[i__ + i__ * a_dim1] + *alpha * temp2; } -/* L60: */ } -/* L70: */ } } else { i__1 = *n; @@ -361,25 +102,17 @@ extern "C" { for (k = i__ + 1; k <= i__2; ++k) { c__[k + j * c_dim1] += temp1 * a[k + i__ * a_dim1]; temp2 += b[k + j * b_dim1] * a[k + i__ * a_dim1]; -/* L80: */ } if (*beta == 0.) { - c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] - + *alpha * temp2; + c__[i__ + j * c_dim1] = temp1 * a[i__ + i__ * a_dim1] + *alpha * temp2; } else { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] - + temp1 * a[i__ + i__ * a_dim1] + *alpha * - temp2; + c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + + temp1 * a[i__ + i__ * a_dim1] + *alpha * temp2; } -/* L90: */ } -/* L100: */ } } } else { - -/* Form C := alpha*B*A + beta*C. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { temp1 = *alpha * a[j + j * a_dim1]; @@ -387,14 +120,12 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = temp1 * b[i__ + j * b_dim1]; -/* L110: */ } } else { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] + - temp1 * b[i__ + j * b_dim1]; -/* L120: */ + c__[i__ + j * c_dim1] = + *beta * c__[i__ + j * c_dim1] + temp1 * b[i__ + j * b_dim1]; } } i__2 = j - 1; @@ -407,9 +138,7 @@ extern "C" { i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; -/* L130: */ } -/* L140: */ } i__2 = *n; for (k = j + 1; k <= i__2; ++k) { @@ -421,20 +150,12 @@ extern "C" { i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { c__[i__ + j * c_dim1] += temp1 * b[i__ + k * b_dim1]; -/* L150: */ } -/* L160: */ } -/* L170: */ } } - return 0; - -/* End of DSYMM */ - -} /* dsymm_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsymv.cpp b/lib/linalg/dsymv.cpp index 542c12c97c..07fea66571 100644 --- a/lib/linalg/dsymv.cpp +++ b/lib/linalg/dsymv.cpp @@ -1,223 +1,26 @@ -/* fortran/dsymv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DSYMV */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION ALPHA,BETA */ -/* INTEGER INCX,INCY,LDA,N */ -/* CHARACTER UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A(LDA,*),X(*),Y(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYMV performs the matrix-vector operation */ -/* > */ -/* > y := alpha*A*x + beta*y, */ -/* > */ -/* > where alpha and beta are scalars, x and y are n element vectors and */ -/* > A is an n by n symmetric matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the upper or lower */ -/* > triangular part of the array A is to be referenced as */ -/* > follows: */ -/* > */ -/* > UPLO = 'U' or 'u' Only the upper triangular part of A */ -/* > is to be referenced. */ -/* > */ -/* > UPLO = 'L' or 'l' Only the lower triangular part of A */ -/* > is to be referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION. */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension ( LDA, N ) */ -/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ -/* > upper triangular part of the array A must contain the upper */ -/* > triangular part of the symmetric matrix and the strictly */ -/* > lower triangular part of A is not referenced. */ -/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ -/* > lower triangular part of the array A must contain the lower */ -/* > triangular part of the symmetric matrix and the strictly */ -/* > upper triangular part of A is not referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. LDA must be at least */ -/* > max( 1, n ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array X must contain the n */ -/* > element vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is DOUBLE PRECISION. */ -/* > On entry, BETA specifies the scalar beta. When BETA is */ -/* > supplied as zero then Y need not be set on input. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Y */ -/* > \verbatim */ -/* > Y is DOUBLE PRECISION array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCY ) ). */ -/* > Before entry, the incremented array Y must contain the n */ -/* > element vector y. On exit, Y is overwritten by the updated */ -/* > vector y. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > On entry, INCY specifies the increment for the elements of */ -/* > Y. INCY must not be zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dsymv_(char *uplo, integer *n, doublereal *alpha, - doublereal *a, integer *lda, doublereal *x, integer *incx, doublereal - *beta, doublereal *y, integer *incy, ftnlen uplo_len) +int dsymv_(char *uplo, integer *n, doublereal *alpha, doublereal *a, integer *lda, doublereal *x, + integer *incx, doublereal *beta, doublereal *y, integer *incy, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; - - /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; doublereal temp1, temp2; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --y; - - /* Function Body */ info = 0; - if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; } else if (*n < 0) { info = 2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { info = 5; } else if (*incx == 0) { info = 7; @@ -228,15 +31,9 @@ extern "C" { xerbla_((char *)"DSYMV ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*n == 0 || *alpha == 0. && *beta == 1.) { return 0; } - -/* Set up the start points in X and Y. */ - if (*incx > 0) { kx = 1; } else { @@ -247,26 +44,17 @@ extern "C" { } else { ky = 1 - (*n - 1) * *incy; } - -/* Start the operations. In this version the elements of A are */ -/* accessed sequentially with one pass through the triangular part */ -/* of A. */ - -/* First form y := beta*y. */ - if (*beta != 1.) { if (*incy == 1) { if (*beta == 0.) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = 0.; -/* L10: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[i__] = *beta * y[i__]; -/* L20: */ } } } else { @@ -276,14 +64,12 @@ extern "C" { for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = 0.; iy += *incy; -/* L30: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { y[iy] = *beta * y[iy]; iy += *incy; -/* L40: */ } } } @@ -292,9 +78,6 @@ extern "C" { return 0; } if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - -/* Form y when A is stored in upper triangle. */ - if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -304,10 +87,8 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { y[i__] += temp1 * a[i__ + j * a_dim1]; temp2 += a[i__ + j * a_dim1] * x[i__]; -/* L50: */ } y[j] = y[j] + temp1 * a[j + j * a_dim1] + *alpha * temp2; -/* L60: */ } } else { jx = kx; @@ -324,18 +105,13 @@ extern "C" { temp2 += a[i__ + j * a_dim1] * x[ix]; ix += *incx; iy += *incy; -/* L70: */ } y[jy] = y[jy] + temp1 * a[j + j * a_dim1] + *alpha * temp2; jx += *incx; jy += *incy; -/* L80: */ } } } else { - -/* Form y when A is stored in lower triangle. */ - if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -346,10 +122,8 @@ extern "C" { for (i__ = j + 1; i__ <= i__2; ++i__) { y[i__] += temp1 * a[i__ + j * a_dim1]; temp2 += a[i__ + j * a_dim1] * x[i__]; -/* L90: */ } y[j] += *alpha * temp2; -/* L100: */ } } else { jx = kx; @@ -367,22 +141,15 @@ extern "C" { iy += *incy; y[iy] += temp1 * a[i__ + j * a_dim1]; temp2 += a[i__ + j * a_dim1] * x[ix]; -/* L110: */ } y[jy] += *alpha * temp2; jx += *incx; jy += *incy; -/* L120: */ } } } - return 0; - -/* End of DSYMV */ - -} /* dsymv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsyr2.cpp b/lib/linalg/dsyr2.cpp index d4395ee996..b3e43c9b9b 100644 --- a/lib/linalg/dsyr2.cpp +++ b/lib/linalg/dsyr2.cpp @@ -1,214 +1,22 @@ -/* fortran/dsyr2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DSYR2 */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYR2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION ALPHA */ -/* INTEGER INCX,INCY,LDA,N */ -/* CHARACTER UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A(LDA,*),X(*),Y(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYR2 performs the symmetric rank 2 operation */ -/* > */ -/* > A := alpha*x*y**T + alpha*y*x**T + A, */ -/* > */ -/* > where alpha is a scalar, x and y are n element vectors and A is an n */ -/* > by n symmetric matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the upper or lower */ -/* > triangular part of the array A is to be referenced as */ -/* > follows: */ -/* > */ -/* > UPLO = 'U' or 'u' Only the upper triangular part of A */ -/* > is to be referenced. */ -/* > */ -/* > UPLO = 'L' or 'l' Only the lower triangular part of A */ -/* > is to be referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION. */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array X must contain the n */ -/* > element vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Y */ -/* > \verbatim */ -/* > Y is DOUBLE PRECISION array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCY ) ). */ -/* > Before entry, the incremented array Y must contain the n */ -/* > element vector y. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > On entry, INCY specifies the increment for the elements of */ -/* > Y. INCY must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension ( LDA, N ) */ -/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ -/* > upper triangular part of the array A must contain the upper */ -/* > triangular part of the symmetric matrix and the strictly */ -/* > lower triangular part of A is not referenced. On exit, the */ -/* > upper triangular part of the array A is overwritten by the */ -/* > upper triangular part of the updated matrix. */ -/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ -/* > lower triangular part of the array A must contain the lower */ -/* > triangular part of the symmetric matrix and the strictly */ -/* > upper triangular part of A is not referenced. On exit, the */ -/* > lower triangular part of the array A is overwritten by the */ -/* > lower triangular part of the updated matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. LDA must be at least */ -/* > max( 1, n ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dsyr2_(char *uplo, integer *n, doublereal *alpha, - doublereal *x, integer *incx, doublereal *y, integer *incy, - doublereal *a, integer *lda, ftnlen uplo_len) +int dsyr2_(char *uplo, integer *n, doublereal *alpha, doublereal *x, integer *incx, doublereal *y, + integer *incy, doublereal *a, integer *lda, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; - - /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; doublereal temp1, temp2; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); --x; --y; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ info = 0; - if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; } else if (*n < 0) { info = 2; @@ -216,23 +24,16 @@ extern "C" { info = 5; } else if (*incy == 0) { info = 7; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { info = 9; } if (info != 0) { xerbla_((char *)"DSYR2 ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*n == 0 || *alpha == 0.) { return 0; } - -/* Set up the start points in X and Y if the increments are not both */ -/* unity. */ - if (*incx != 1 || *incy != 1) { if (*incx > 0) { kx = 1; @@ -247,15 +48,7 @@ extern "C" { jx = kx; jy = ky; } - -/* Start the operations. In this version the elements of A are */ -/* accessed sequentially with one pass through the triangular part */ -/* of A. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - -/* Form A when A is stored in the upper triangle. */ - if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -264,12 +57,9 @@ extern "C" { temp2 = *alpha * x[j]; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[i__] * - temp1 + y[i__] * temp2; -/* L10: */ + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[i__] * temp1 + y[i__] * temp2; } } -/* L20: */ } } else { i__1 = *n; @@ -281,22 +71,16 @@ extern "C" { iy = ky; i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[ix] * - temp1 + y[iy] * temp2; + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[ix] * temp1 + y[iy] * temp2; ix += *incx; iy += *incy; -/* L30: */ } } jx += *incx; jy += *incy; -/* L40: */ } } } else { - -/* Form A when A is stored in the lower triangle. */ - if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -305,12 +89,9 @@ extern "C" { temp2 = *alpha * x[j]; i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[i__] * - temp1 + y[i__] * temp2; -/* L50: */ + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[i__] * temp1 + y[i__] * temp2; } } -/* L60: */ } } else { i__1 = *n; @@ -322,26 +103,18 @@ extern "C" { iy = jy; i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { - a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[ix] * - temp1 + y[iy] * temp2; + a[i__ + j * a_dim1] = a[i__ + j * a_dim1] + x[ix] * temp1 + y[iy] * temp2; ix += *incx; iy += *incy; -/* L70: */ } } jx += *incx; jy += *incy; -/* L80: */ } } } - return 0; - -/* End of DSYR2 */ - -} /* dsyr2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsyr2k.cpp b/lib/linalg/dsyr2k.cpp index 29f16539b2..9928b2e618 100644 --- a/lib/linalg/dsyr2k.cpp +++ b/lib/linalg/dsyr2k.cpp @@ -1,253 +1,18 @@ -/* fortran/dsyr2k.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DSYR2K */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION ALPHA,BETA */ -/* INTEGER K,LDA,LDB,LDC,N */ -/* CHARACTER TRANS,UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYR2K performs one of the symmetric rank 2k operations */ -/* > */ -/* > C := alpha*A*B**T + alpha*B*A**T + beta*C, */ -/* > */ -/* > or */ -/* > */ -/* > C := alpha*A**T*B + alpha*B**T*A + beta*C, */ -/* > */ -/* > where alpha and beta are scalars, C is an n by n symmetric matrix */ -/* > and A and B are n by k matrices in the first case and k by n */ -/* > matrices in the second case. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the upper or lower */ -/* > triangular part of the array C is to be referenced as */ -/* > follows: */ -/* > */ -/* > UPLO = 'U' or 'u' Only the upper triangular part of C */ -/* > is to be referenced. */ -/* > */ -/* > UPLO = 'L' or 'l' Only the lower triangular part of C */ -/* > is to be referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > On entry, TRANS specifies the operation to be performed as */ -/* > follows: */ -/* > */ -/* > TRANS = 'N' or 'n' C := alpha*A*B**T + alpha*B*A**T + */ -/* > beta*C. */ -/* > */ -/* > TRANS = 'T' or 't' C := alpha*A**T*B + alpha*B**T*A + */ -/* > beta*C. */ -/* > */ -/* > TRANS = 'C' or 'c' C := alpha*A**T*B + alpha*B**T*A + */ -/* > beta*C. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix C. N must be */ -/* > at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > On entry with TRANS = 'N' or 'n', K specifies the number */ -/* > of columns of the matrices A and B, and on entry with */ -/* > TRANS = 'T' or 't' or 'C' or 'c', K specifies the number */ -/* > of rows of the matrices A and B. K must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION. */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is */ -/* > k when TRANS = 'N' or 'n', and is n otherwise. */ -/* > Before entry with TRANS = 'N' or 'n', the leading n by k */ -/* > part of the array A must contain the matrix A, otherwise */ -/* > the leading k by n part of the array A must contain the */ -/* > matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. When TRANS = 'N' or 'n' */ -/* > then LDA must be at least max( 1, n ), otherwise LDA must */ -/* > be at least max( 1, k ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension ( LDB, kb ), where kb is */ -/* > k when TRANS = 'N' or 'n', and is n otherwise. */ -/* > Before entry with TRANS = 'N' or 'n', the leading n by k */ -/* > part of the array B must contain the matrix B, otherwise */ -/* > the leading k by n part of the array B must contain the */ -/* > matrix B. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > On entry, LDB specifies the first dimension of B as declared */ -/* > in the calling (sub) program. When TRANS = 'N' or 'n' */ -/* > then LDB must be at least max( 1, n ), otherwise LDB must */ -/* > be at least max( 1, k ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is DOUBLE PRECISION. */ -/* > On entry, BETA specifies the scalar beta. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension ( LDC, N ) */ -/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ -/* > upper triangular part of the array C must contain the upper */ -/* > triangular part of the symmetric matrix and the strictly */ -/* > lower triangular part of C is not referenced. On exit, the */ -/* > upper triangular part of the array C is overwritten by the */ -/* > upper triangular part of the updated matrix. */ -/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ -/* > lower triangular part of the array C must contain the lower */ -/* > triangular part of the symmetric matrix and the strictly */ -/* > upper triangular part of C is not referenced. On exit, the */ -/* > lower triangular part of the array C is overwritten by the */ -/* > lower triangular part of the updated matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > On entry, LDC specifies the first dimension of C as declared */ -/* > in the calling (sub) program. LDC must be at least */ -/* > max( 1, n ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level3 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 3 Blas routine. */ -/* > */ -/* > */ -/* > -- Written on 8-February-1989. */ -/* > Jack Dongarra, Argonne National Laboratory. */ -/* > Iain Duff, AERE Harwell. */ -/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ -/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dsyr2k_(char *uplo, char *trans, integer *n, integer *k, - doublereal *alpha, doublereal *a, integer *lda, doublereal *b, - integer *ldb, doublereal *beta, doublereal *c__, integer *ldc, ftnlen - uplo_len, ftnlen trans_len) +int dsyr2k_(char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, + integer *lda, doublereal *b, integer *ldb, doublereal *beta, doublereal *c__, + integer *ldc, ftnlen uplo_len, ftnlen trans_len) { - /* System generated locals */ - integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, - i__3; - - /* Local variables */ + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3; integer i__, j, l, info; doublereal temp1, temp2; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nrowa; logical upper; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level3 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Parameters .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -257,46 +22,37 @@ extern "C" { c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; - - /* Function Body */ if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { nrowa = *n; } else { nrowa = *k; } upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - info = 0; - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 2; } else if (*n < 0) { info = 3; } else if (*k < 0) { info = 4; - } else if (*lda < max(1,nrowa)) { + } else if (*lda < max(1, nrowa)) { info = 7; - } else if (*ldb < max(1,nrowa)) { + } else if (*ldb < max(1, nrowa)) { info = 9; - } else if (*ldc < max(1,*n)) { + } else if (*ldc < max(1, *n)) { info = 12; } if (info != 0) { xerbla_((char *)"DSYR2K", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { return 0; } - -/* And when alpha.eq.zero. */ - if (*alpha == 0.) { if (upper) { if (*beta == 0.) { @@ -305,9 +61,7 @@ extern "C" { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; -/* L10: */ } -/* L20: */ } } else { i__1 = *n; @@ -315,9 +69,7 @@ extern "C" { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; -/* L30: */ } -/* L40: */ } } } else { @@ -327,9 +79,7 @@ extern "C" { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; -/* L50: */ } -/* L60: */ } } else { i__1 = *n; @@ -337,21 +87,13 @@ extern "C" { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; -/* L70: */ } -/* L80: */ } } } return 0; } - -/* Start the operations. */ - if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form C := alpha*A*B**T + alpha*B*A**T + C. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -359,13 +101,11 @@ extern "C" { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; -/* L90: */ } } else if (*beta != 1.) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; -/* L100: */ } } i__2 = *k; @@ -375,15 +115,12 @@ extern "C" { temp2 = *alpha * a[j + l * a_dim1]; i__3 = j; for (i__ = 1; i__ <= i__3; ++i__) { - c__[i__ + j * c_dim1] = c__[i__ + j * c_dim1] + a[ - i__ + l * a_dim1] * temp1 + b[i__ + l * - b_dim1] * temp2; -/* L110: */ + c__[i__ + j * c_dim1] = c__[i__ + j * c_dim1] + + a[i__ + l * a_dim1] * temp1 + + b[i__ + l * b_dim1] * temp2; } } -/* L120: */ } -/* L130: */ } } else { i__1 = *n; @@ -392,13 +129,11 @@ extern "C" { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; -/* L140: */ } } else if (*beta != 1.) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; -/* L150: */ } } i__2 = *k; @@ -408,21 +143,15 @@ extern "C" { temp2 = *alpha * a[j + l * a_dim1]; i__3 = *n; for (i__ = j; i__ <= i__3; ++i__) { - c__[i__ + j * c_dim1] = c__[i__ + j * c_dim1] + a[ - i__ + l * a_dim1] * temp1 + b[i__ + l * - b_dim1] * temp2; -/* L160: */ + c__[i__ + j * c_dim1] = c__[i__ + j * c_dim1] + + a[i__ + l * a_dim1] * temp1 + + b[i__ + l * b_dim1] * temp2; } } -/* L170: */ } -/* L180: */ } } } else { - -/* Form C := alpha*A**T*B + alpha*B**T*A + C. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -434,18 +163,14 @@ extern "C" { for (l = 1; l <= i__3; ++l) { temp1 += a[l + i__ * a_dim1] * b[l + j * b_dim1]; temp2 += b[l + i__ * b_dim1] * a[l + j * a_dim1]; -/* L190: */ } if (*beta == 0.) { - c__[i__ + j * c_dim1] = *alpha * temp1 + *alpha * - temp2; + c__[i__ + j * c_dim1] = *alpha * temp1 + *alpha * temp2; } else { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] - + *alpha * temp1 + *alpha * temp2; + c__[i__ + j * c_dim1] = + *beta * c__[i__ + j * c_dim1] + *alpha * temp1 + *alpha * temp2; } -/* L200: */ } -/* L210: */ } } else { i__1 = *n; @@ -458,28 +183,19 @@ extern "C" { for (l = 1; l <= i__3; ++l) { temp1 += a[l + i__ * a_dim1] * b[l + j * b_dim1]; temp2 += b[l + i__ * b_dim1] * a[l + j * a_dim1]; -/* L220: */ } if (*beta == 0.) { - c__[i__ + j * c_dim1] = *alpha * temp1 + *alpha * - temp2; + c__[i__ + j * c_dim1] = *alpha * temp1 + *alpha * temp2; } else { - c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1] - + *alpha * temp1 + *alpha * temp2; + c__[i__ + j * c_dim1] = + *beta * c__[i__ + j * c_dim1] + *alpha * temp1 + *alpha * temp2; } -/* L230: */ } -/* L240: */ } } } - return 0; - -/* End of DSYR2K */ - -} /* dsyr2k_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsyrk.cpp b/lib/linalg/dsyrk.cpp index 4fb3e554f9..1c383f311f 100644 --- a/lib/linalg/dsyrk.cpp +++ b/lib/linalg/dsyrk.cpp @@ -1,272 +1,53 @@ -/* fortran/dsyrk.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DSYRK */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION ALPHA,BETA */ -/* INTEGER K,LDA,LDC,N */ -/* CHARACTER TRANS,UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A(LDA,*),C(LDC,*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYRK performs one of the symmetric rank k operations */ -/* > */ -/* > C := alpha*A*A**T + beta*C, */ -/* > */ -/* > or */ -/* > */ -/* > C := alpha*A**T*A + beta*C, */ -/* > */ -/* > where alpha and beta are scalars, C is an n by n symmetric matrix */ -/* > and A is an n by k matrix in the first case and a k by n matrix */ -/* > in the second case. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the upper or lower */ -/* > triangular part of the array C is to be referenced as */ -/* > follows: */ -/* > */ -/* > UPLO = 'U' or 'u' Only the upper triangular part of C */ -/* > is to be referenced. */ -/* > */ -/* > UPLO = 'L' or 'l' Only the lower triangular part of C */ -/* > is to be referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > On entry, TRANS specifies the operation to be performed as */ -/* > follows: */ -/* > */ -/* > TRANS = 'N' or 'n' C := alpha*A*A**T + beta*C. */ -/* > */ -/* > TRANS = 'T' or 't' C := alpha*A**T*A + beta*C. */ -/* > */ -/* > TRANS = 'C' or 'c' C := alpha*A**T*A + beta*C. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix C. N must be */ -/* > at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > On entry with TRANS = 'N' or 'n', K specifies the number */ -/* > of columns of the matrix A, and on entry with */ -/* > TRANS = 'T' or 't' or 'C' or 'c', K specifies the number */ -/* > of rows of the matrix A. K must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION. */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is */ -/* > k when TRANS = 'N' or 'n', and is n otherwise. */ -/* > Before entry with TRANS = 'N' or 'n', the leading n by k */ -/* > part of the array A must contain the matrix A, otherwise */ -/* > the leading k by n part of the array A must contain the */ -/* > matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. When TRANS = 'N' or 'n' */ -/* > then LDA must be at least max( 1, n ), otherwise LDA must */ -/* > be at least max( 1, k ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is DOUBLE PRECISION. */ -/* > On entry, BETA specifies the scalar beta. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension ( LDC, N ) */ -/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ -/* > upper triangular part of the array C must contain the upper */ -/* > triangular part of the symmetric matrix and the strictly */ -/* > lower triangular part of C is not referenced. On exit, the */ -/* > upper triangular part of the array C is overwritten by the */ -/* > upper triangular part of the updated matrix. */ -/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ -/* > lower triangular part of the array C must contain the lower */ -/* > triangular part of the symmetric matrix and the strictly */ -/* > upper triangular part of C is not referenced. On exit, the */ -/* > lower triangular part of the array C is overwritten by the */ -/* > lower triangular part of the updated matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > On entry, LDC specifies the first dimension of C as declared */ -/* > in the calling (sub) program. LDC must be at least */ -/* > max( 1, n ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level3 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 3 Blas routine. */ -/* > */ -/* > -- Written on 8-February-1989. */ -/* > Jack Dongarra, Argonne National Laboratory. */ -/* > Iain Duff, AERE Harwell. */ -/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ -/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dsyrk_(char *uplo, char *trans, integer *n, integer *k, - doublereal *alpha, doublereal *a, integer *lda, doublereal *beta, - doublereal *c__, integer *ldc, ftnlen uplo_len, ftnlen trans_len) +int dsyrk_(char *uplo, char *trans, integer *n, integer *k, doublereal *alpha, doublereal *a, + integer *lda, doublereal *beta, doublereal *c__, integer *ldc, ftnlen uplo_len, + ftnlen trans_len) { - /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, j, l, info; doublereal temp; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nrowa; logical upper; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level3 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Parameters .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; - - /* Function Body */ if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { nrowa = *n; } else { nrowa = *k; } upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - info = 0; - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 2; } else if (*n < 0) { info = 3; } else if (*k < 0) { info = 4; - } else if (*lda < max(1,nrowa)) { + } else if (*lda < max(1, nrowa)) { info = 7; - } else if (*ldc < max(1,*n)) { + } else if (*ldc < max(1, *n)) { info = 10; } if (info != 0) { xerbla_((char *)"DSYRK ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*n == 0 || (*alpha == 0. || *k == 0) && *beta == 1.) { return 0; } - -/* And when alpha.eq.zero. */ - if (*alpha == 0.) { if (upper) { if (*beta == 0.) { @@ -275,9 +56,7 @@ extern "C" { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; -/* L10: */ } -/* L20: */ } } else { i__1 = *n; @@ -285,9 +64,7 @@ extern "C" { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; -/* L30: */ } -/* L40: */ } } } else { @@ -297,9 +74,7 @@ extern "C" { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; -/* L50: */ } -/* L60: */ } } else { i__1 = *n; @@ -307,21 +82,13 @@ extern "C" { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; -/* L70: */ } -/* L80: */ } } } return 0; } - -/* Start the operations. */ - if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form C := alpha*A*A**T + beta*C. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -329,13 +96,11 @@ extern "C" { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; -/* L90: */ } } else if (*beta != 1.) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; -/* L100: */ } } i__2 = *k; @@ -344,14 +109,10 @@ extern "C" { temp = *alpha * a[j + l * a_dim1]; i__3 = j; for (i__ = 1; i__ <= i__3; ++i__) { - c__[i__ + j * c_dim1] += temp * a[i__ + l * - a_dim1]; -/* L110: */ + c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; } } -/* L120: */ } -/* L130: */ } } else { i__1 = *n; @@ -360,13 +121,11 @@ extern "C" { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = 0.; -/* L140: */ } } else if (*beta != 1.) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { c__[i__ + j * c_dim1] = *beta * c__[i__ + j * c_dim1]; -/* L150: */ } } i__2 = *k; @@ -375,20 +134,13 @@ extern "C" { temp = *alpha * a[j + l * a_dim1]; i__3 = *n; for (i__ = j; i__ <= i__3; ++i__) { - c__[i__ + j * c_dim1] += temp * a[i__ + l * - a_dim1]; -/* L160: */ + c__[i__ + j * c_dim1] += temp * a[i__ + l * a_dim1]; } } -/* L170: */ } -/* L180: */ } } } else { - -/* Form C := alpha*A**T*A + beta*C. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -398,17 +150,13 @@ extern "C" { i__3 = *k; for (l = 1; l <= i__3; ++l) { temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; -/* L190: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = *alpha * temp; } else { - c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ - i__ + j * c_dim1]; + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[i__ + j * c_dim1]; } -/* L200: */ } -/* L210: */ } } else { i__1 = *n; @@ -419,27 +167,18 @@ extern "C" { i__3 = *k; for (l = 1; l <= i__3; ++l) { temp += a[l + i__ * a_dim1] * a[l + j * a_dim1]; -/* L220: */ } if (*beta == 0.) { c__[i__ + j * c_dim1] = *alpha * temp; } else { - c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[ - i__ + j * c_dim1]; + c__[i__ + j * c_dim1] = *alpha * temp + *beta * c__[i__ + j * c_dim1]; } -/* L230: */ } -/* L240: */ } } } - return 0; - -/* End of DSYRK */ - -} /* dsyrk_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsytd2.cpp b/lib/linalg/dsytd2.cpp index acf22710af..57362588af 100644 --- a/lib/linalg/dsytd2.cpp +++ b/lib/linalg/dsytd2.cpp @@ -1,269 +1,40 @@ -/* fortran/dsytd2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static doublereal c_b8 = 0.; static doublereal c_b14 = -1.; - -/* > \brief \b DSYTD2 reduces a symmetric matrix to real symmetric tridiagonal form by an orthogonal similarit -y transformation (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DSYTD2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYTD2( UPLO, N, A, LDA, D, E, TAU, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDA, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAU( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYTD2 reduces a real symmetric matrix A to symmetric tridiagonal */ -/* > form T by an orthogonal similarity transformation: Q**T * A * Q = T. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies whether the upper or lower triangular part of the */ -/* > symmetric matrix A is stored: */ -/* > = 'U': Upper triangular */ -/* > = 'L': Lower triangular */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ -/* > n-by-n upper triangular part of A contains the upper */ -/* > triangular part of the matrix A, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading n-by-n lower triangular part of A contains the lower */ -/* > triangular part of the matrix A, and the strictly upper */ -/* > triangular part of A is not referenced. */ -/* > On exit, if UPLO = 'U', the diagonal and first superdiagonal */ -/* > of A are overwritten by the corresponding elements of the */ -/* > tridiagonal matrix T, and the elements above the first */ -/* > superdiagonal, with the array TAU, represent the orthogonal */ -/* > matrix Q as a product of elementary reflectors; if UPLO */ -/* > = 'L', the diagonal and first subdiagonal of A are over- */ -/* > written by the corresponding elements of the tridiagonal */ -/* > matrix T, and the elements below the first subdiagonal, with */ -/* > the array TAU, represent the orthogonal matrix Q as a product */ -/* > of elementary reflectors. See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > The diagonal elements of the tridiagonal matrix T: */ -/* > D(i) = A(i,i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > The off-diagonal elements of the tridiagonal matrix T: */ -/* > E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (N-1) */ -/* > The scalar factors of the elementary reflectors (see Further */ -/* > Details). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleSYcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > If UPLO = 'U', the matrix Q is represented as a product of elementary */ -/* > reflectors */ -/* > */ -/* > Q = H(n-1) . . . H(2) H(1). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**T */ -/* > */ -/* > where tau is a real scalar, and v is a real vector with */ -/* > v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in */ -/* > A(1:i-1,i+1), and tau in TAU(i). */ -/* > */ -/* > If UPLO = 'L', the matrix Q is represented as a product of elementary */ -/* > reflectors */ -/* > */ -/* > Q = H(1) H(2) . . . H(n-1). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**T */ -/* > */ -/* > where tau is a real scalar, and v is a real vector with */ -/* > v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), */ -/* > and tau in TAU(i). */ -/* > */ -/* > The contents of A on exit are illustrated by the following examples */ -/* > with n = 5: */ -/* > */ -/* > if UPLO = 'U': if UPLO = 'L': */ -/* > */ -/* > ( d e v2 v3 v4 ) ( d ) */ -/* > ( d e v3 v4 ) ( e d ) */ -/* > ( d e v4 ) ( v1 e d ) */ -/* > ( d e ) ( v1 v2 e d ) */ -/* > ( d ) ( v1 v2 v3 e d ) */ -/* > */ -/* > where d and e denote diagonal and off-diagonal elements of T, and vi */ -/* > denotes an element of the vector defining H(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dsytd2_(char *uplo, integer *n, doublereal *a, integer * - lda, doublereal *d__, doublereal *e, doublereal *tau, integer *info, - ftnlen uplo_len) +int dsytd2_(char *uplo, integer *n, doublereal *a, integer *lda, doublereal *d__, doublereal *e, + doublereal *tau, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__; - extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, - integer *); + extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, integer *); doublereal taui; - extern /* Subroutine */ int dsyr2_(char *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - integer *, ftnlen); + extern int dsyr2_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, integer *, ftnlen); doublereal alpha; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, - integer *, doublereal *, integer *); + extern int daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); logical upper; - extern /* Subroutine */ int dsymv_(char *, integer *, doublereal *, - doublereal *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, ftnlen), dlarfg_(integer *, doublereal *, - doublereal *, integer *, doublereal *), xerbla_(char *, integer * - , ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters */ - - /* Parameter adjustments */ + extern int dsymv_(char *, integer *, doublereal *, doublereal *, integer *, doublereal *, + integer *, doublereal *, doublereal *, integer *, ftnlen), + dlarfg_(integer *, doublereal *, doublereal *, integer *, doublereal *), + xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --d__; --e; --tau; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -4; } if (*info != 0) { @@ -271,119 +42,57 @@ f"> */ xerbla_((char *)"DSYTD2", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n <= 0) { return 0; } - if (upper) { - -/* Reduce the upper triangle of A */ - for (i__ = *n - 1; i__ >= 1; --i__) { - -/* Generate elementary reflector H(i) = I - tau * v * v**T */ -/* to annihilate A(1:i-1,i+1) */ - - dlarfg_(&i__, &a[i__ + (i__ + 1) * a_dim1], &a[(i__ + 1) * a_dim1 - + 1], &c__1, &taui); + dlarfg_(&i__, &a[i__ + (i__ + 1) * a_dim1], &a[(i__ + 1) * a_dim1 + 1], &c__1, &taui); e[i__] = a[i__ + (i__ + 1) * a_dim1]; - if (taui != 0.) { - -/* Apply H(i) from both sides to A(1:i,1:i) */ - a[i__ + (i__ + 1) * a_dim1] = 1.; - -/* Compute x := tau * A * v storing x in TAU(1:i) */ - - dsymv_(uplo, &i__, &taui, &a[a_offset], lda, &a[(i__ + 1) * - a_dim1 + 1], &c__1, &c_b8, &tau[1], &c__1, (ftnlen)1); - -/* Compute w := x - 1/2 * tau * (x**T * v) * v */ - - alpha = taui * -.5 * ddot_(&i__, &tau[1], &c__1, &a[(i__ + 1) - * a_dim1 + 1], &c__1); - daxpy_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[ - 1], &c__1); - -/* Apply the transformation as a rank-2 update: */ -/* A := A - v * w**T - w * v**T */ - - dsyr2_(uplo, &i__, &c_b14, &a[(i__ + 1) * a_dim1 + 1], &c__1, - &tau[1], &c__1, &a[a_offset], lda, (ftnlen)1); - + dsymv_(uplo, &i__, &taui, &a[a_offset], lda, &a[(i__ + 1) * a_dim1 + 1], &c__1, + &c_b8, &tau[1], &c__1, (ftnlen)1); + alpha = taui * -.5 * ddot_(&i__, &tau[1], &c__1, &a[(i__ + 1) * a_dim1 + 1], &c__1); + daxpy_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[1], &c__1); + dsyr2_(uplo, &i__, &c_b14, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[1], &c__1, + &a[a_offset], lda, (ftnlen)1); a[i__ + (i__ + 1) * a_dim1] = e[i__]; } d__[i__ + 1] = a[i__ + 1 + (i__ + 1) * a_dim1]; tau[i__] = taui; -/* L10: */ } d__[1] = a[a_dim1 + 1]; } else { - -/* Reduce the lower triangle of A */ - i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Generate elementary reflector H(i) = I - tau * v * v**T */ -/* to annihilate A(i+2:n,i) */ - i__2 = *n - i__; -/* Computing MIN */ i__3 = i__ + 2; - dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3,*n) + i__ * - a_dim1], &c__1, &taui); + dlarfg_(&i__2, &a[i__ + 1 + i__ * a_dim1], &a[min(i__3, *n) + i__ * a_dim1], &c__1, + &taui); e[i__] = a[i__ + 1 + i__ * a_dim1]; - if (taui != 0.) { - -/* Apply H(i) from both sides to A(i+1:n,i+1:n) */ - a[i__ + 1 + i__ * a_dim1] = 1.; - -/* Compute x := tau * A * v storing y in TAU(i:n-1) */ - i__2 = *n - i__; - dsymv_(uplo, &i__2, &taui, &a[i__ + 1 + (i__ + 1) * a_dim1], - lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b8, &tau[ - i__], &c__1, (ftnlen)1); - -/* Compute w := x - 1/2 * tau * (x**T * v) * v */ - + dsymv_(uplo, &i__2, &taui, &a[i__ + 1 + (i__ + 1) * a_dim1], lda, + &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b8, &tau[i__], &c__1, (ftnlen)1); i__2 = *n - i__; - alpha = taui * -.5 * ddot_(&i__2, &tau[i__], &c__1, &a[i__ + - 1 + i__ * a_dim1], &c__1); + alpha = + taui * -.5 * ddot_(&i__2, &tau[i__], &c__1, &a[i__ + 1 + i__ * a_dim1], &c__1); i__2 = *n - i__; - daxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[ - i__], &c__1); - -/* Apply the transformation as a rank-2 update: */ -/* A := A - v * w**T - w * v**T */ - + daxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[i__], &c__1); i__2 = *n - i__; - dsyr2_(uplo, &i__2, &c_b14, &a[i__ + 1 + i__ * a_dim1], &c__1, - &tau[i__], &c__1, &a[i__ + 1 + (i__ + 1) * a_dim1], - lda, (ftnlen)1); - + dsyr2_(uplo, &i__2, &c_b14, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[i__], &c__1, + &a[i__ + 1 + (i__ + 1) * a_dim1], lda, (ftnlen)1); a[i__ + 1 + i__ * a_dim1] = e[i__]; } d__[i__] = a[i__ + i__ * a_dim1]; tau[i__] = taui; -/* L20: */ } d__[*n] = a[*n + *n * a_dim1]; } - return 0; - -/* End of DSYTD2 */ - -} /* dsytd2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dsytrd.cpp b/lib/linalg/dsytrd.cpp index b29df9fb10..a414b9a530 100644 --- a/lib/linalg/dsytrd.cpp +++ b/lib/linalg/dsytrd.cpp @@ -1,274 +1,32 @@ -/* fortran/dsytrd.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; static doublereal c_b22 = -1.; static doublereal c_b23 = 1.; - -/* > \brief \b DSYTRD */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DSYTRD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DSYTRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDA, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAU( * ), */ -/* $ WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DSYTRD reduces a real symmetric matrix A to real symmetric */ -/* > tridiagonal form T by an orthogonal similarity transformation: */ -/* > Q**T * A * Q = T. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A is stored; */ -/* > = 'L': Lower triangle of A is stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the symmetric matrix A. If UPLO = 'U', the leading */ -/* > N-by-N upper triangular part of A contains the upper */ -/* > triangular part of the matrix A, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading N-by-N lower triangular part of A contains the lower */ -/* > triangular part of the matrix A, and the strictly upper */ -/* > triangular part of A is not referenced. */ -/* > On exit, if UPLO = 'U', the diagonal and first superdiagonal */ -/* > of A are overwritten by the corresponding elements of the */ -/* > tridiagonal matrix T, and the elements above the first */ -/* > superdiagonal, with the array TAU, represent the orthogonal */ -/* > matrix Q as a product of elementary reflectors; if UPLO */ -/* > = 'L', the diagonal and first subdiagonal of A are over- */ -/* > written by the corresponding elements of the tridiagonal */ -/* > matrix T, and the elements below the first subdiagonal, with */ -/* > the array TAU, represent the orthogonal matrix Q as a product */ -/* > of elementary reflectors. See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > The diagonal elements of the tridiagonal matrix T: */ -/* > D(i) = A(i,i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > The off-diagonal elements of the tridiagonal matrix T: */ -/* > E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is DOUBLE PRECISION array, dimension (N-1) */ -/* > The scalar factors of the elementary reflectors (see Further */ -/* > Details). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= 1. */ -/* > For optimum performance LWORK >= N*NB, where NB is the */ -/* > optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleSYcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > If UPLO = 'U', the matrix Q is represented as a product of elementary */ -/* > reflectors */ -/* > */ -/* > Q = H(n-1) . . . H(2) H(1). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**T */ -/* > */ -/* > where tau is a real scalar, and v is a real vector with */ -/* > v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in */ -/* > A(1:i-1,i+1), and tau in TAU(i). */ -/* > */ -/* > If UPLO = 'L', the matrix Q is represented as a product of elementary */ -/* > reflectors */ -/* > */ -/* > Q = H(1) H(2) . . . H(n-1). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**T */ -/* > */ -/* > where tau is a real scalar, and v is a real vector with */ -/* > v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), */ -/* > and tau in TAU(i). */ -/* > */ -/* > The contents of A on exit are illustrated by the following examples */ -/* > with n = 5: */ -/* > */ -/* > if UPLO = 'U': if UPLO = 'L': */ -/* > */ -/* > ( d e v2 v3 v4 ) ( d ) */ -/* > ( d e v3 v4 ) ( e d ) */ -/* > ( d e v4 ) ( v1 e d ) */ -/* > ( d e ) ( v1 v2 e d ) */ -/* > ( d ) ( v1 v2 v3 e d ) */ -/* > */ -/* > where d and e denote diagonal and off-diagonal elements of T, and vi */ -/* > denotes an element of the vector defining H(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dsytrd_(char *uplo, integer *n, doublereal *a, integer * - lda, doublereal *d__, doublereal *e, doublereal *tau, doublereal * - work, integer *lwork, integer *info, ftnlen uplo_len) +int dsytrd_(char *uplo, integer *n, doublereal *a, integer *lda, doublereal *d__, doublereal *e, + doublereal *tau, doublereal *work, integer *lwork, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, j, nb, kk, nx, iws; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; logical upper; - extern /* Subroutine */ int dsytd2_(char *, integer *, doublereal *, - integer *, doublereal *, doublereal *, doublereal *, integer *, - ftnlen), dsyr2k_(char *, char *, integer *, integer *, doublereal - *, doublereal *, integer *, doublereal *, integer *, doublereal *, - doublereal *, integer *, ftnlen, ftnlen), dlatrd_(char *, - integer *, integer *, doublereal *, integer *, doublereal *, - doublereal *, doublereal *, integer *, ftnlen), xerbla_(char *, - integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dsytd2_(char *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen), + dsyr2k_(char *, char *, integer *, integer *, doublereal *, doublereal *, integer *, + doublereal *, integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen), + dlatrd_(char *, integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, + doublereal *, integer *, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); integer ldwork, lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -276,31 +34,23 @@ f"> */ --e; --tau; --work; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -4; - } else if (*lwork < 1 && ! lquery) { + } else if (*lwork < 1 && !lquery) { *info = -9; } - if (*info == 0) { - -/* Determine the block size. */ - - nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, - (ftnlen)1); + nb = ilaenv_(&c__1, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); lwkopt = *n * nb; - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"DSYTRD", &i__1, (ftnlen)6); @@ -308,42 +58,24 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { work[1] = 1.; return 0; } - nx = *n; iws = 1; if (nb > 1 && nb < *n) { - -/* Determine when to cross over from blocked to unblocked code */ -/* (last block is always handled by unblocked code). */ - -/* Computing MAX */ - i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, & - c_n1, (ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); + i__1 = nb, + i__2 = ilaenv_(&c__3, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1, i__2); if (nx < *n) { - -/* Determine if workspace is large enough for blocked code. */ - ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { - -/* Not enough workspace to use optimal NB: determine the */ -/* minimum value of NB, and reduce NB or force use of */ -/* unblocked code by setting NX = N. */ - -/* Computing MAX */ i__1 = *lwork / ldwork; - nb = max(i__1,1); - nbmin = ilaenv_(&c__2, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, - (ftnlen)6, (ftnlen)1); + nb = max(i__1, 1); + nbmin = + ilaenv_(&c__2, (char *)"DSYTRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); if (nb < nbmin) { nx = *n; } @@ -354,101 +86,48 @@ f"> */ } else { nb = 1; } - if (upper) { - -/* Reduce the upper triangle of A. */ -/* Columns 1:kk are handled by the unblocked method. */ - kk = *n - (*n - nx + nb - 1) / nb * nb; i__1 = kk + 1; i__2 = -nb; - for (i__ = *n - nb + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += - i__2) { - -/* Reduce columns i:i+nb-1 to tridiagonal form and form the */ -/* matrix W which is needed to update the unreduced part of */ -/* the matrix */ - + for (i__ = *n - nb + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { i__3 = i__ + nb - 1; - dlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], & - work[1], &ldwork, (ftnlen)1); - -/* Update the unreduced submatrix A(1:i-1,1:i-1), using an */ -/* update of the form: A := A - V*W**T - W*V**T */ - + dlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], &work[1], &ldwork, + (ftnlen)1); i__3 = i__ - 1; - dsyr2k_(uplo, (char *)"No transpose", &i__3, &nb, &c_b22, &a[i__ * a_dim1 - + 1], lda, &work[1], &ldwork, &c_b23, &a[a_offset], lda, ( - ftnlen)1, (ftnlen)12); - -/* Copy superdiagonal elements back into A, and diagonal */ -/* elements into D */ - + dsyr2k_(uplo, (char *)"No transpose", &i__3, &nb, &c_b22, &a[i__ * a_dim1 + 1], lda, &work[1], + &ldwork, &c_b23, &a[a_offset], lda, (ftnlen)1, (ftnlen)12); i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { a[j - 1 + j * a_dim1] = e[j - 1]; d__[j] = a[j + j * a_dim1]; -/* L10: */ } -/* L20: */ } - -/* Use unblocked code to reduce the last or only block */ - - dsytd2_(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo, - (ftnlen)1); + dsytd2_(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo, (ftnlen)1); } else { - -/* Reduce the lower triangle of A */ - i__2 = *n - nx; i__1 = nb; for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { - -/* Reduce columns i:i+nb-1 to tridiagonal form and form the */ -/* matrix W which is needed to update the unreduced part of */ -/* the matrix */ - i__3 = *n - i__ + 1; - dlatrd_(uplo, &i__3, &nb, &a[i__ + i__ * a_dim1], lda, &e[i__], & - tau[i__], &work[1], &ldwork, (ftnlen)1); - -/* Update the unreduced submatrix A(i+ib:n,i+ib:n), using */ -/* an update of the form: A := A - V*W**T - W*V**T */ - + dlatrd_(uplo, &i__3, &nb, &a[i__ + i__ * a_dim1], lda, &e[i__], &tau[i__], &work[1], + &ldwork, (ftnlen)1); i__3 = *n - i__ - nb + 1; - dsyr2k_(uplo, (char *)"No transpose", &i__3, &nb, &c_b22, &a[i__ + nb + - i__ * a_dim1], lda, &work[nb + 1], &ldwork, &c_b23, &a[ - i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)1, (ftnlen) - 12); - -/* Copy subdiagonal elements back into A, and diagonal */ -/* elements into D */ - + dsyr2k_(uplo, (char *)"No transpose", &i__3, &nb, &c_b22, &a[i__ + nb + i__ * a_dim1], lda, + &work[nb + 1], &ldwork, &c_b23, &a[i__ + nb + (i__ + nb) * a_dim1], lda, + (ftnlen)1, (ftnlen)12); i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { a[j + 1 + j * a_dim1] = e[j]; d__[j] = a[j + j * a_dim1]; -/* L30: */ } -/* L40: */ } - -/* Use unblocked code to reduce the last or only block */ - i__1 = *n - i__ + 1; - dsytd2_(uplo, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], - &tau[i__], &iinfo, (ftnlen)1); + dsytd2_(uplo, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], &tau[i__], &iinfo, + (ftnlen)1); } - - work[1] = (doublereal) lwkopt; + work[1] = (doublereal)lwkopt; return 0; - -/* End of DSYTRD */ - -} /* dsytrd_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dtrmm.cpp b/lib/linalg/dtrmm.cpp index 1a61cf72b1..1ef32afb54 100644 --- a/lib/linalg/dtrmm.cpp +++ b/lib/linalg/dtrmm.cpp @@ -1,247 +1,26 @@ -/* fortran/dtrmm.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DTRMM */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION ALPHA */ -/* INTEGER LDA,LDB,M,N */ -/* CHARACTER DIAG,SIDE,TRANSA,UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A(LDA,*),B(LDB,*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DTRMM performs one of the matrix-matrix operations */ -/* > */ -/* > B := alpha*op( A )*B, or B := alpha*B*op( A ), */ -/* > */ -/* > where alpha is a scalar, B is an m by n matrix, A is a unit, or */ -/* > non-unit, upper or lower triangular matrix and op( A ) is one of */ -/* > */ -/* > op( A ) = A or op( A ) = A**T. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > On entry, SIDE specifies whether op( A ) multiplies B from */ -/* > the left or right as follows: */ -/* > */ -/* > SIDE = 'L' or 'l' B := alpha*op( A )*B. */ -/* > */ -/* > SIDE = 'R' or 'r' B := alpha*B*op( A ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the matrix A is an upper or */ -/* > lower triangular matrix as follows: */ -/* > */ -/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ -/* > */ -/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANSA */ -/* > \verbatim */ -/* > TRANSA is CHARACTER*1 */ -/* > On entry, TRANSA specifies the form of op( A ) to be used in */ -/* > the matrix multiplication as follows: */ -/* > */ -/* > TRANSA = 'N' or 'n' op( A ) = A. */ -/* > */ -/* > TRANSA = 'T' or 't' op( A ) = A**T. */ -/* > */ -/* > TRANSA = 'C' or 'c' op( A ) = A**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIAG */ -/* > \verbatim */ -/* > DIAG is CHARACTER*1 */ -/* > On entry, DIAG specifies whether or not A is unit triangular */ -/* > as follows: */ -/* > */ -/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ -/* > */ -/* > DIAG = 'N' or 'n' A is not assumed to be unit */ -/* > triangular. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > On entry, M specifies the number of rows of B. M must be at */ -/* > least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the number of columns of B. N must be */ -/* > at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION. */ -/* > On entry, ALPHA specifies the scalar alpha. When alpha is */ -/* > zero then A is not referenced and B need not be set before */ -/* > entry. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension ( LDA, k ), where k is m */ -/* > when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. */ -/* > Before entry with UPLO = 'U' or 'u', the leading k by k */ -/* > upper triangular part of the array A must contain the upper */ -/* > triangular matrix and the strictly lower triangular part of */ -/* > A is not referenced. */ -/* > Before entry with UPLO = 'L' or 'l', the leading k by k */ -/* > lower triangular part of the array A must contain the lower */ -/* > triangular matrix and the strictly upper triangular part of */ -/* > A is not referenced. */ -/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ -/* > A are not referenced either, but are assumed to be unity. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. When SIDE = 'L' or 'l' then */ -/* > LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' */ -/* > then LDA must be at least max( 1, n ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension ( LDB, N ) */ -/* > Before entry, the leading m by n part of the array B must */ -/* > contain the matrix B, and on exit is overwritten by the */ -/* > transformed matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > On entry, LDB specifies the first dimension of B as declared */ -/* > in the calling (sub) program. LDB must be at least */ -/* > max( 1, m ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level3 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 3 Blas routine. */ -/* > */ -/* > -- Written on 8-February-1989. */ -/* > Jack Dongarra, Argonne National Laboratory. */ -/* > Iain Duff, AERE Harwell. */ -/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ -/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dtrmm_(char *side, char *uplo, char *transa, char *diag, - integer *m, integer *n, doublereal *alpha, doublereal *a, integer * - lda, doublereal *b, integer *ldb, ftnlen side_len, ftnlen uplo_len, - ftnlen transa_len, ftnlen diag_len) +int dtrmm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, + doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, + ftnlen side_len, ftnlen uplo_len, ftnlen transa_len, ftnlen diag_len) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, j, k, info; doublereal temp; logical lside; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nrowa; logical upper; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); logical nounit; - - -/* -- Reference BLAS level3 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Parameters .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; - - /* Function Body */ lside = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); if (lside) { nrowa = *m; @@ -250,61 +29,46 @@ extern "C" { } nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - info = 0; - if (! lside && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!lside && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + } else if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 2; - } else if (! lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { + } else if (!lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(transa, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 3; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { + } else if (!lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && + !lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1)) { info = 4; } else if (*m < 0) { info = 5; } else if (*n < 0) { info = 6; - } else if (*lda < max(1,nrowa)) { + } else if (*lda < max(1, nrowa)) { info = 9; - } else if (*ldb < max(1,*m)) { + } else if (*ldb < max(1, *m)) { info = 11; } if (info != 0) { xerbla_((char *)"DTRMM ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*m == 0 || *n == 0) { return 0; } - -/* And when alpha.eq.zero. */ - if (*alpha == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; -/* L10: */ } -/* L20: */ } return 0; } - -/* Start the operations. */ - if (lside) { if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form B := alpha*A*B. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -314,18 +78,14 @@ extern "C" { temp = *alpha * b[k + j * b_dim1]; i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { - b[i__ + j * b_dim1] += temp * a[i__ + k * - a_dim1]; -/* L30: */ + b[i__ + j * b_dim1] += temp * a[i__ + k * a_dim1]; } if (nounit) { temp *= a[k + k * a_dim1]; } b[k + j * b_dim1] = temp; } -/* L40: */ } -/* L50: */ } } else { i__1 = *n; @@ -339,20 +99,13 @@ extern "C" { } i__2 = *m; for (i__ = k + 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] += temp * a[i__ + k * - a_dim1]; -/* L60: */ + b[i__ + j * b_dim1] += temp * a[i__ + k * a_dim1]; } } -/* L70: */ } -/* L80: */ } } } else { - -/* Form B := alpha*A**T*B. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -364,12 +117,9 @@ extern "C" { i__2 = i__ - 1; for (k = 1; k <= i__2; ++k) { temp += a[k + i__ * a_dim1] * b[k + j * b_dim1]; -/* L90: */ } b[i__ + j * b_dim1] = *alpha * temp; -/* L100: */ } -/* L110: */ } } else { i__1 = *n; @@ -383,20 +133,14 @@ extern "C" { i__3 = *m; for (k = i__ + 1; k <= i__3; ++k) { temp += a[k + i__ * a_dim1] * b[k + j * b_dim1]; -/* L120: */ } b[i__ + j * b_dim1] = *alpha * temp; -/* L130: */ } -/* L140: */ } } } } else { if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form B := alpha*B*A. */ - if (upper) { for (j = *n; j >= 1; --j) { temp = *alpha; @@ -406,7 +150,6 @@ extern "C" { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; -/* L150: */ } i__1 = j - 1; for (k = 1; k <= i__1; ++k) { @@ -414,14 +157,10 @@ extern "C" { temp = *alpha * a[k + j * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] += temp * b[i__ + k * - b_dim1]; -/* L160: */ + b[i__ + j * b_dim1] += temp * b[i__ + k * b_dim1]; } } -/* L170: */ } -/* L180: */ } } else { i__1 = *n; @@ -433,7 +172,6 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; -/* L190: */ } i__2 = *n; for (k = j + 1; k <= i__2; ++k) { @@ -441,20 +179,13 @@ extern "C" { temp = *alpha * a[k + j * a_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { - b[i__ + j * b_dim1] += temp * b[i__ + k * - b_dim1]; -/* L200: */ + b[i__ + j * b_dim1] += temp * b[i__ + k * b_dim1]; } } -/* L210: */ } -/* L220: */ } } } else { - -/* Form B := alpha*B*A**T. */ - if (upper) { i__1 = *n; for (k = 1; k <= i__1; ++k) { @@ -464,12 +195,9 @@ extern "C" { temp = *alpha * a[j + k * a_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { - b[i__ + j * b_dim1] += temp * b[i__ + k * - b_dim1]; -/* L230: */ + b[i__ + j * b_dim1] += temp * b[i__ + k * b_dim1]; } } -/* L240: */ } temp = *alpha; if (nounit) { @@ -479,10 +207,8 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; -/* L250: */ } } -/* L260: */ } } else { for (k = *n; k >= 1; --k) { @@ -492,12 +218,9 @@ extern "C" { temp = *alpha * a[j + k * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] += temp * b[i__ + k * - b_dim1]; -/* L270: */ + b[i__ + j * b_dim1] += temp * b[i__ + k * b_dim1]; } } -/* L280: */ } temp = *alpha; if (nounit) { @@ -507,21 +230,14 @@ extern "C" { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; -/* L290: */ } } -/* L300: */ } } } } - return 0; - -/* End of DTRMM */ - -} /* dtrmm_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dtrmv.cpp b/lib/linalg/dtrmv.cpp index 597fcae137..3631f6fb24 100644 --- a/lib/linalg/dtrmv.cpp +++ b/lib/linalg/dtrmv.cpp @@ -1,225 +1,33 @@ -/* fortran/dtrmv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DTRMV */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,LDA,N */ -/* CHARACTER DIAG,TRANS,UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A(LDA,*),X(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DTRMV performs one of the matrix-vector operations */ -/* > */ -/* > x := A*x, or x := A**T*x, */ -/* > */ -/* > where x is an n element vector and A is an n by n unit, or non-unit, */ -/* > upper or lower triangular matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the matrix is an upper or */ -/* > lower triangular matrix as follows: */ -/* > */ -/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ -/* > */ -/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > On entry, TRANS specifies the operation to be performed as */ -/* > follows: */ -/* > */ -/* > TRANS = 'N' or 'n' x := A*x. */ -/* > */ -/* > TRANS = 'T' or 't' x := A**T*x. */ -/* > */ -/* > TRANS = 'C' or 'c' x := A**T*x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIAG */ -/* > \verbatim */ -/* > DIAG is CHARACTER*1 */ -/* > On entry, DIAG specifies whether or not A is unit */ -/* > triangular as follows: */ -/* > */ -/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ -/* > */ -/* > DIAG = 'N' or 'n' A is not assumed to be unit */ -/* > triangular. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension ( LDA, N ) */ -/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ -/* > upper triangular part of the array A must contain the upper */ -/* > triangular matrix and the strictly lower triangular part of */ -/* > A is not referenced. */ -/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ -/* > lower triangular part of the array A must contain the lower */ -/* > triangular matrix and the strictly upper triangular part of */ -/* > A is not referenced. */ -/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ -/* > A are not referenced either, but are assumed to be unity. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. LDA must be at least */ -/* > max( 1, n ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array X must contain the n */ -/* > element vector x. On exit, X is overwritten with the */ -/* > transformed vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dtrmv_(char *uplo, char *trans, char *diag, integer *n, - doublereal *a, integer *lda, doublereal *x, integer *incx, ftnlen - uplo_len, ftnlen trans_len, ftnlen diag_len) +int dtrmv_(char *uplo, char *trans, char *diag, integer *n, doublereal *a, integer *lda, + doublereal *x, integer *incx, ftnlen uplo_len, ftnlen trans_len, ftnlen diag_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; - - /* Local variables */ integer i__, j, ix, jx, kx, info; doublereal temp; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); logical nounit; - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; - - /* Function Body */ info = 0; - if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 2; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { + } else if (!lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && + !lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1)) { info = 3; } else if (*n < 0) { info = 4; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { info = 6; } else if (*incx == 0) { info = 8; @@ -228,31 +36,16 @@ extern "C" { xerbla_((char *)"DTRMV ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*n == 0) { return 0; } - nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); - -/* Set up the start point in X if the increment is not unity. This */ -/* will be ( N - 1 )*INCX too small for descending loops. */ - if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } - -/* Start the operations. In this version the elements of A are */ -/* accessed sequentially with one pass through A. */ - if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form x := A*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { if (*incx == 1) { i__1 = *n; @@ -262,13 +55,11 @@ extern "C" { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { x[i__] += temp * a[i__ + j * a_dim1]; -/* L10: */ } if (nounit) { x[j] *= a[j + j * a_dim1]; } } -/* L20: */ } } else { jx = kx; @@ -281,14 +72,12 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { x[ix] += temp * a[i__ + j * a_dim1]; ix += *incx; -/* L30: */ } if (nounit) { x[jx] *= a[j + j * a_dim1]; } } jx += *incx; -/* L40: */ } } } else { @@ -299,13 +88,11 @@ extern "C" { i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { x[i__] += temp * a[i__ + j * a_dim1]; -/* L50: */ } if (nounit) { x[j] *= a[j + j * a_dim1]; } } -/* L60: */ } } else { kx += (*n - 1) * *incx; @@ -318,21 +105,16 @@ extern "C" { for (i__ = *n; i__ >= i__1; --i__) { x[ix] += temp * a[i__ + j * a_dim1]; ix -= *incx; -/* L70: */ } if (nounit) { x[jx] *= a[j + j * a_dim1]; } } jx -= *incx; -/* L80: */ } } } } else { - -/* Form x := A**T*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { if (*incx == 1) { for (j = *n; j >= 1; --j) { @@ -342,10 +124,8 @@ extern "C" { } for (i__ = j - 1; i__ >= 1; --i__) { temp += a[i__ + j * a_dim1] * x[i__]; -/* L90: */ } x[j] = temp; -/* L100: */ } } else { jx = kx + (*n - 1) * *incx; @@ -358,11 +138,9 @@ extern "C" { for (i__ = j - 1; i__ >= 1; --i__) { ix -= *incx; temp += a[i__ + j * a_dim1] * x[ix]; -/* L110: */ } x[jx] = temp; jx -= *incx; -/* L120: */ } } } else { @@ -376,10 +154,8 @@ extern "C" { i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { temp += a[i__ + j * a_dim1] * x[i__]; -/* L130: */ } x[j] = temp; -/* L140: */ } } else { jx = kx; @@ -394,22 +170,15 @@ extern "C" { for (i__ = j + 1; i__ <= i__2; ++i__) { ix += *incx; temp += a[i__ + j * a_dim1] * x[ix]; -/* L150: */ } x[jx] = temp; jx += *incx; -/* L160: */ } } } } - return 0; - -/* End of DTRMV */ - -} /* dtrmv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dtrsm.cpp b/lib/linalg/dtrsm.cpp index 8b815c5300..9c0873f8dc 100644 --- a/lib/linalg/dtrsm.cpp +++ b/lib/linalg/dtrsm.cpp @@ -1,251 +1,26 @@ -/* fortran/dtrsm.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DTRSM */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION ALPHA */ -/* INTEGER LDA,LDB,M,N */ -/* CHARACTER DIAG,SIDE,TRANSA,UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A(LDA,*),B(LDB,*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DTRSM solves one of the matrix equations */ -/* > */ -/* > op( A )*X = alpha*B, or X*op( A ) = alpha*B, */ -/* > */ -/* > where alpha is a scalar, X and B are m by n matrices, A is a unit, or */ -/* > non-unit, upper or lower triangular matrix and op( A ) is one of */ -/* > */ -/* > op( A ) = A or op( A ) = A**T. */ -/* > */ -/* > The matrix X is overwritten on B. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > On entry, SIDE specifies whether op( A ) appears on the left */ -/* > or right of X as follows: */ -/* > */ -/* > SIDE = 'L' or 'l' op( A )*X = alpha*B. */ -/* > */ -/* > SIDE = 'R' or 'r' X*op( A ) = alpha*B. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the matrix A is an upper or */ -/* > lower triangular matrix as follows: */ -/* > */ -/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ -/* > */ -/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANSA */ -/* > \verbatim */ -/* > TRANSA is CHARACTER*1 */ -/* > On entry, TRANSA specifies the form of op( A ) to be used in */ -/* > the matrix multiplication as follows: */ -/* > */ -/* > TRANSA = 'N' or 'n' op( A ) = A. */ -/* > */ -/* > TRANSA = 'T' or 't' op( A ) = A**T. */ -/* > */ -/* > TRANSA = 'C' or 'c' op( A ) = A**T. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIAG */ -/* > \verbatim */ -/* > DIAG is CHARACTER*1 */ -/* > On entry, DIAG specifies whether or not A is unit triangular */ -/* > as follows: */ -/* > */ -/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ -/* > */ -/* > DIAG = 'N' or 'n' A is not assumed to be unit */ -/* > triangular. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > On entry, M specifies the number of rows of B. M must be at */ -/* > least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the number of columns of B. N must be */ -/* > at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION. */ -/* > On entry, ALPHA specifies the scalar alpha. When alpha is */ -/* > zero then A is not referenced and B need not be set before */ -/* > entry. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension ( LDA, k ), */ -/* > where k is m when SIDE = 'L' or 'l' */ -/* > and k is n when SIDE = 'R' or 'r'. */ -/* > Before entry with UPLO = 'U' or 'u', the leading k by k */ -/* > upper triangular part of the array A must contain the upper */ -/* > triangular matrix and the strictly lower triangular part of */ -/* > A is not referenced. */ -/* > Before entry with UPLO = 'L' or 'l', the leading k by k */ -/* > lower triangular part of the array A must contain the lower */ -/* > triangular matrix and the strictly upper triangular part of */ -/* > A is not referenced. */ -/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ -/* > A are not referenced either, but are assumed to be unity. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. When SIDE = 'L' or 'l' then */ -/* > LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' */ -/* > then LDA must be at least max( 1, n ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension ( LDB, N ) */ -/* > Before entry, the leading m by n part of the array B must */ -/* > contain the right-hand side matrix B, and on exit is */ -/* > overwritten by the solution matrix X. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > On entry, LDB specifies the first dimension of B as declared */ -/* > in the calling (sub) program. LDB must be at least */ -/* > max( 1, m ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level3 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 3 Blas routine. */ -/* > */ -/* > */ -/* > -- Written on 8-February-1989. */ -/* > Jack Dongarra, Argonne National Laboratory. */ -/* > Iain Duff, AERE Harwell. */ -/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ -/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int dtrsm_(char *side, char *uplo, char *transa, char *diag, - integer *m, integer *n, doublereal *alpha, doublereal *a, integer * - lda, doublereal *b, integer *ldb, ftnlen side_len, ftnlen uplo_len, - ftnlen transa_len, ftnlen diag_len) +int dtrsm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, + doublereal *alpha, doublereal *a, integer *lda, doublereal *b, integer *ldb, + ftnlen side_len, ftnlen uplo_len, ftnlen transa_len, ftnlen diag_len) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, j, k, info; doublereal temp; logical lside; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nrowa; logical upper; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); logical nounit; - - -/* -- Reference BLAS level3 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Parameters .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; - - /* Function Body */ lside = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); if (lside) { nrowa = *m; @@ -254,70 +29,53 @@ extern "C" { } nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - info = 0; - if (! lside && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!lside && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + } else if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 2; - } else if (! lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { + } else if (!lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(transa, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 3; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { + } else if (!lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && + !lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1)) { info = 4; } else if (*m < 0) { info = 5; } else if (*n < 0) { info = 6; - } else if (*lda < max(1,nrowa)) { + } else if (*lda < max(1, nrowa)) { info = 9; - } else if (*ldb < max(1,*m)) { + } else if (*ldb < max(1, *m)) { info = 11; } if (info != 0) { xerbla_((char *)"DTRSM ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*m == 0 || *n == 0) { return 0; } - -/* And when alpha.eq.zero. */ - if (*alpha == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = 0.; -/* L10: */ } -/* L20: */ } return 0; } - -/* Start the operations. */ - if (lside) { if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form B := alpha*inv( A )*B. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*alpha != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] - ; -/* L30: */ + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1]; } } for (k = *m; k >= 1; --k) { @@ -327,14 +85,10 @@ extern "C" { } i__2 = k - 1; for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ - i__ + k * a_dim1]; -/* L40: */ + b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[i__ + k * a_dim1]; } } -/* L50: */ } -/* L60: */ } } else { i__1 = *n; @@ -342,9 +96,7 @@ extern "C" { if (*alpha != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] - ; -/* L70: */ + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1]; } } i__2 = *m; @@ -355,20 +107,13 @@ extern "C" { } i__3 = *m; for (i__ = k + 1; i__ <= i__3; ++i__) { - b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[ - i__ + k * a_dim1]; -/* L80: */ + b[i__ + j * b_dim1] -= b[k + j * b_dim1] * a[i__ + k * a_dim1]; } } -/* L90: */ } -/* L100: */ } } } else { - -/* Form B := alpha*inv( A**T )*B. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -378,15 +123,12 @@ extern "C" { i__3 = i__ - 1; for (k = 1; k <= i__3; ++k) { temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; -/* L110: */ } if (nounit) { temp /= a[i__ + i__ * a_dim1]; } b[i__ + j * b_dim1] = temp; -/* L120: */ } -/* L130: */ } } else { i__1 = *n; @@ -396,32 +138,24 @@ extern "C" { i__2 = *m; for (k = i__ + 1; k <= i__2; ++k) { temp -= a[k + i__ * a_dim1] * b[k + j * b_dim1]; -/* L140: */ } if (nounit) { temp /= a[i__ + i__ * a_dim1]; } b[i__ + j * b_dim1] = temp; -/* L150: */ } -/* L160: */ } } } } else { if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form B := alpha*B*inv( A ). */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*alpha != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] - ; -/* L170: */ + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1]; } } i__2 = j - 1; @@ -429,31 +163,24 @@ extern "C" { if (a[k + j * a_dim1] != 0.) { i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { - b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ - i__ + k * b_dim1]; -/* L180: */ + b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[i__ + k * b_dim1]; } } -/* L190: */ } if (nounit) { temp = 1. / a[j + j * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; -/* L200: */ } } -/* L210: */ } } else { for (j = *n; j >= 1; --j) { if (*alpha != 1.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { - b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1] - ; -/* L220: */ + b[i__ + j * b_dim1] = *alpha * b[i__ + j * b_dim1]; } } i__1 = *n; @@ -461,28 +188,20 @@ extern "C" { if (a[k + j * a_dim1] != 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[ - i__ + k * b_dim1]; -/* L230: */ + b[i__ + j * b_dim1] -= a[k + j * a_dim1] * b[i__ + k * b_dim1]; } } -/* L240: */ } if (nounit) { temp = 1. / a[j + j * a_dim1]; i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + j * b_dim1] = temp * b[i__ + j * b_dim1]; -/* L250: */ } } -/* L260: */ } } } else { - -/* Form B := alpha*B*inv( A**T ). */ - if (upper) { for (k = *n; k >= 1; --k) { if (nounit) { @@ -490,7 +209,6 @@ extern "C" { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; -/* L270: */ } } i__1 = k - 1; @@ -499,22 +217,16 @@ extern "C" { temp = a[j + k * a_dim1]; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + j * b_dim1] -= temp * b[i__ + k * - b_dim1]; -/* L280: */ + b[i__ + j * b_dim1] -= temp * b[i__ + k * b_dim1]; } } -/* L290: */ } if (*alpha != 1.) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { - b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] - ; -/* L300: */ + b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1]; } } -/* L310: */ } } else { i__1 = *n; @@ -524,7 +236,6 @@ extern "C" { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { b[i__ + k * b_dim1] = temp * b[i__ + k * b_dim1]; -/* L320: */ } } i__2 = *n; @@ -533,33 +244,22 @@ extern "C" { temp = a[j + k * a_dim1]; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { - b[i__ + j * b_dim1] -= temp * b[i__ + k * - b_dim1]; -/* L330: */ + b[i__ + j * b_dim1] -= temp * b[i__ + k * b_dim1]; } } -/* L340: */ } if (*alpha != 1.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { - b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1] - ; -/* L350: */ + b[i__ + k * b_dim1] = *alpha * b[i__ + k * b_dim1]; } } -/* L360: */ } } } } - return 0; - -/* End of DTRSM */ - -} /* dtrsm_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dtrsv.cpp b/lib/linalg/dtrsv.cpp index 4044c819f6..51d3436ebf 100644 --- a/lib/linalg/dtrsv.cpp +++ b/lib/linalg/dtrsv.cpp @@ -1,221 +1,33 @@ -/* fortran/dtrsv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DTRSV */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,LDA,N */ -/* CHARACTER DIAG,TRANS,UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A(LDA,*),X(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DTRSV solves one of the systems of equations */ -/* > */ -/* > A*x = b, or A**T*x = b, */ -/* > */ -/* > where b and x are n element vectors and A is an n by n unit, or */ -/* > non-unit, upper or lower triangular matrix. */ -/* > */ -/* > No test for singularity or near-singularity is included in this */ -/* > routine. Such tests must be performed before calling this routine. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the matrix is an upper or */ -/* > lower triangular matrix as follows: */ -/* > */ -/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ -/* > */ -/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > On entry, TRANS specifies the equations to be solved as */ -/* > follows: */ -/* > */ -/* > TRANS = 'N' or 'n' A*x = b. */ -/* > */ -/* > TRANS = 'T' or 't' A**T*x = b. */ -/* > */ -/* > TRANS = 'C' or 'c' A**T*x = b. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIAG */ -/* > \verbatim */ -/* > DIAG is CHARACTER*1 */ -/* > On entry, DIAG specifies whether or not A is unit */ -/* > triangular as follows: */ -/* > */ -/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ -/* > */ -/* > DIAG = 'N' or 'n' A is not assumed to be unit */ -/* > triangular. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension ( LDA, N ) */ -/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ -/* > upper triangular part of the array A must contain the upper */ -/* > triangular matrix and the strictly lower triangular part of */ -/* > A is not referenced. */ -/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ -/* > lower triangular part of the array A must contain the lower */ -/* > triangular matrix and the strictly upper triangular part of */ -/* > A is not referenced. */ -/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ -/* > A are not referenced either, but are assumed to be unity. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. LDA must be at least */ -/* > max( 1, n ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] X */ -/* > \verbatim */ -/* > X is DOUBLE PRECISION array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array X must contain the n */ -/* > element right-hand side vector b. On exit, X is overwritten */ -/* > with the solution vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > */ -/* > Level 2 Blas routine. */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup double_blas_level1 */ - -/* ===================================================================== */ -/* Subroutine */ int dtrsv_(char *uplo, char *trans, char *diag, integer *n, - doublereal *a, integer *lda, doublereal *x, integer *incx, ftnlen - uplo_len, ftnlen trans_len, ftnlen diag_len) +int dtrsv_(char *uplo, char *trans, char *diag, integer *n, doublereal *a, integer *lda, + doublereal *x, integer *incx, ftnlen uplo_len, ftnlen trans_len, ftnlen diag_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; - - /* Local variables */ integer i__, j, ix, jx, kx, info; doublereal temp; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); logical nounit; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; - - /* Function Body */ info = 0; - if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 2; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { + } else if (!lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && + !lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1)) { info = 3; } else if (*n < 0) { info = 4; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { info = 6; } else if (*incx == 0) { info = 8; @@ -224,31 +36,16 @@ extern "C" { xerbla_((char *)"DTRSV ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*n == 0) { return 0; } - nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); - -/* Set up the start point in X if the increment is not unity. This */ -/* will be ( N - 1 )*INCX too small for descending loops. */ - if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } - -/* Start the operations. In this version the elements of A are */ -/* accessed sequentially with one pass through A. */ - if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form x := inv( A )*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { if (*incx == 1) { for (j = *n; j >= 1; --j) { @@ -259,10 +56,8 @@ extern "C" { temp = x[j]; for (i__ = j - 1; i__ >= 1; --i__) { x[i__] -= temp * a[i__ + j * a_dim1]; -/* L10: */ } } -/* L20: */ } } else { jx = kx + (*n - 1) * *incx; @@ -276,11 +71,9 @@ extern "C" { for (i__ = j - 1; i__ >= 1; --i__) { ix -= *incx; x[ix] -= temp * a[i__ + j * a_dim1]; -/* L30: */ } } jx -= *incx; -/* L40: */ } } } else { @@ -295,10 +88,8 @@ extern "C" { i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { x[i__] -= temp * a[i__ + j * a_dim1]; -/* L50: */ } } -/* L60: */ } } else { jx = kx; @@ -314,18 +105,13 @@ extern "C" { for (i__ = j + 1; i__ <= i__2; ++i__) { ix += *incx; x[ix] -= temp * a[i__ + j * a_dim1]; -/* L70: */ } } jx += *incx; -/* L80: */ } } } } else { - -/* Form x := inv( A**T )*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { if (*incx == 1) { i__1 = *n; @@ -334,13 +120,11 @@ extern "C" { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { temp -= a[i__ + j * a_dim1] * x[i__]; -/* L90: */ } if (nounit) { temp /= a[j + j * a_dim1]; } x[j] = temp; -/* L100: */ } } else { jx = kx; @@ -352,14 +136,12 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { temp -= a[i__ + j * a_dim1] * x[ix]; ix += *incx; -/* L110: */ } if (nounit) { temp /= a[j + j * a_dim1]; } x[jx] = temp; jx += *incx; -/* L120: */ } } } else { @@ -369,13 +151,11 @@ extern "C" { i__1 = j + 1; for (i__ = *n; i__ >= i__1; --i__) { temp -= a[i__ + j * a_dim1] * x[i__]; -/* L130: */ } if (nounit) { temp /= a[j + j * a_dim1]; } x[j] = temp; -/* L140: */ } } else { kx += (*n - 1) * *incx; @@ -387,25 +167,18 @@ extern "C" { for (i__ = *n; i__ >= i__1; --i__) { temp -= a[i__ + j * a_dim1] * x[ix]; ix -= *incx; -/* L150: */ } if (nounit) { temp /= a[j + j * a_dim1]; } x[jx] = temp; jx -= *incx; -/* L160: */ } } } } - return 0; - -/* End of DTRSV */ - -} /* dtrsv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dtrti2.cpp b/lib/linalg/dtrti2.cpp index 79cc64b359..a0e26f9268 100644 --- a/lib/linalg/dtrti2.cpp +++ b/lib/linalg/dtrti2.cpp @@ -1,195 +1,34 @@ -/* fortran/dtrti2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b DTRTI2 computes the inverse of a triangular matrix (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DTRTI2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DTRTI2( UPLO, DIAG, N, A, LDA, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER DIAG, UPLO */ -/* INTEGER INFO, LDA, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DTRTI2 computes the inverse of a real upper or lower triangular */ -/* > matrix. */ -/* > */ -/* > This is the Level 2 BLAS version of the algorithm. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies whether the matrix A is upper or lower triangular. */ -/* > = 'U': Upper triangular */ -/* > = 'L': Lower triangular */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIAG */ -/* > \verbatim */ -/* > DIAG is CHARACTER*1 */ -/* > Specifies whether or not the matrix A is unit triangular. */ -/* > = 'N': Non-unit triangular */ -/* > = 'U': Unit triangular */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the triangular matrix A. If UPLO = 'U', the */ -/* > leading n by n upper triangular part of the array A contains */ -/* > the upper triangular matrix, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading n by n lower triangular part of the array A contains */ -/* > the lower triangular matrix, and the strictly upper */ -/* > triangular part of A is not referenced. If DIAG = 'U', the */ -/* > diagonal elements of A are also not referenced and are */ -/* > assumed to be 1. */ -/* > */ -/* > On exit, the (triangular) inverse of the original matrix, in */ -/* > the same storage format. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -k, the k-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dtrti2_(char *uplo, char *diag, integer *n, doublereal * - a, integer *lda, integer *info, ftnlen uplo_len, ftnlen diag_len) +int dtrti2_(char *uplo, char *diag, integer *n, doublereal *a, integer *lda, integer *info, + ftnlen uplo_len, ftnlen diag_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; - - /* Local variables */ integer j; doublereal ajj; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *); extern logical lsame_(char *, char *, ftnlen, ftnlen); logical upper; - extern /* Subroutine */ int dtrmv_(char *, char *, char *, integer *, - doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); + extern int dtrmv_(char *, char *, char *, integer *, doublereal *, integer *, doublereal *, + integer *, ftnlen, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); logical nounit; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! nounit && ! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { + } else if (!nounit && !lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*n < 0) { *info = -3; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -5; } if (*info != 0) { @@ -197,11 +36,7 @@ f"> */ xerbla_((char *)"DTRTI2", &i__1, (ftnlen)6); return 0; } - if (upper) { - -/* Compute inverse of upper triangular matrix. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { if (nounit) { @@ -210,21 +45,13 @@ f"> */ } else { ajj = -1.; } - -/* Compute elements 1:j-1 of j-th column. */ - i__2 = j - 1; - dtrmv_((char *)"Upper", (char *)"No transpose", diag, &i__2, &a[a_offset], lda, & - a[j * a_dim1 + 1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen) - 1); + dtrmv_((char *)"Upper", (char *)"No transpose", diag, &i__2, &a[a_offset], lda, &a[j * a_dim1 + 1], + &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)1); i__2 = j - 1; dscal_(&i__2, &ajj, &a[j * a_dim1 + 1], &c__1); -/* L10: */ } } else { - -/* Compute inverse of lower triangular matrix. */ - for (j = *n; j >= 1; --j) { if (nounit) { a[j + j * a_dim1] = 1. / a[j + j * a_dim1]; @@ -233,26 +60,16 @@ f"> */ ajj = -1.; } if (j < *n) { - -/* Compute elements j+1:n of j-th column. */ - i__1 = *n - j; - dtrmv_((char *)"Lower", (char *)"No transpose", diag, &i__1, &a[j + 1 + (j + - 1) * a_dim1], lda, &a[j + 1 + j * a_dim1], &c__1, ( - ftnlen)5, (ftnlen)12, (ftnlen)1); + dtrmv_((char *)"Lower", (char *)"No transpose", diag, &i__1, &a[j + 1 + (j + 1) * a_dim1], lda, + &a[j + 1 + j * a_dim1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)1); i__1 = *n - j; dscal_(&i__1, &ajj, &a[j + 1 + j * a_dim1], &c__1); } -/* L20: */ } } - return 0; - -/* End of DTRTI2 */ - -} /* dtrti2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dtrtri.cpp b/lib/linalg/dtrtri.cpp index 91742619b0..55c6b1b01f 100644 --- a/lib/linalg/dtrtri.cpp +++ b/lib/linalg/dtrtri.cpp @@ -1,208 +1,46 @@ -/* fortran/dtrtri.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static doublereal c_b18 = 1.; static doublereal c_b22 = -1.; - -/* > \brief \b DTRTRI */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download DTRTRI + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE DTRTRI( UPLO, DIAG, N, A, LDA, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER DIAG, UPLO */ -/* INTEGER INFO, LDA, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DTRTRI computes the inverse of a real upper or lower triangular */ -/* > matrix A. */ -/* > */ -/* > This is the Level 3 BLAS version of the algorithm. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': A is upper triangular; */ -/* > = 'L': A is lower triangular. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIAG */ -/* > \verbatim */ -/* > DIAG is CHARACTER*1 */ -/* > = 'N': A is non-unit triangular; */ -/* > = 'U': A is unit triangular. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > On entry, the triangular matrix A. If UPLO = 'U', the */ -/* > leading N-by-N upper triangular part of the array A contains */ -/* > the upper triangular matrix, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading N-by-N lower triangular part of the array A contains */ -/* > the lower triangular matrix, and the strictly upper */ -/* > triangular part of A is not referenced. If DIAG = 'U', the */ -/* > diagonal elements of A are also not referenced and are */ -/* > assumed to be 1. */ -/* > On exit, the (triangular) inverse of the original matrix, in */ -/* > the same storage format. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, A(i,i) is exactly zero. The triangular */ -/* > matrix is singular and its inverse can not be computed. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup doubleOTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int dtrtri_(char *uplo, char *diag, integer *n, doublereal * - a, integer *lda, integer *info, ftnlen uplo_len, ftnlen diag_len) +int dtrtri_(char *uplo, char *diag, integer *n, doublereal *a, integer *lda, integer *info, + ftnlen uplo_len, ftnlen diag_len) { - /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, i__1, i__2[2], i__3, i__4, i__5; char ch__1[2]; - - /* Builtin functions */ - /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); - - /* Local variables */ + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); integer j, jb, nb, nn; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int dtrmm_(char *, char *, char *, char *, - integer *, integer *, doublereal *, doublereal *, integer *, - doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen), dtrsm_( - char *, char *, char *, char *, integer *, integer *, doublereal * - , doublereal *, integer *, doublereal *, integer *, ftnlen, - ftnlen, ftnlen, ftnlen); + extern int dtrmm_(char *, char *, char *, char *, integer *, integer *, doublereal *, + doublereal *, integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + dtrsm_(char *, char *, char *, char *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); logical upper; - extern /* Subroutine */ int dtrti2_(char *, char *, integer *, doublereal - *, integer *, integer *, ftnlen, ftnlen), xerbla_(char *, integer - *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dtrti2_(char *, char *, integer *, doublereal *, integer *, integer *, ftnlen, + ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); logical nounit; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! nounit && ! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { + } else if (!nounit && !lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*n < 0) { *info = -3; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -5; } if (*info != 0) { @@ -210,112 +48,62 @@ f"> */ xerbla_((char *)"DTRTRI", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - -/* Check for singularity if non-unit. */ - if (nounit) { i__1 = *n; for (*info = 1; *info <= i__1; ++(*info)) { if (a[*info + *info * a_dim1] == 0.) { return 0; } -/* L10: */ } *info = 0; } - -/* Determine the block size for this environment. */ - -/* Writing concatenation */ i__2[0] = 1, a__1[0] = uplo; i__2[1] = 1, a__1[1] = diag; s_lmp_cat(ch__1, a__1, i__2, &c__2, (ftnlen)2); - nb = ilaenv_(&c__1, (char *)"DTRTRI", ch__1, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, ( - ftnlen)2); + nb = ilaenv_(&c__1, (char *)"DTRTRI", ch__1, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)2); if (nb <= 1 || nb >= *n) { - -/* Use unblocked code */ - dtrti2_(uplo, diag, n, &a[a_offset], lda, info, (ftnlen)1, (ftnlen)1); } else { - -/* Use blocked code */ - if (upper) { - -/* Compute inverse of upper triangular matrix */ - i__1 = *n; i__3 = nb; for (j = 1; i__3 < 0 ? j >= i__1 : j <= i__1; j += i__3) { -/* Computing MIN */ i__4 = nb, i__5 = *n - j + 1; - jb = min(i__4,i__5); - -/* Compute rows 1:j-1 of current block column */ - + jb = min(i__4, i__5); i__4 = j - 1; - dtrmm_((char *)"Left", (char *)"Upper", (char *)"No transpose", diag, &i__4, &jb, & - c_b18, &a[a_offset], lda, &a[j * a_dim1 + 1], lda, ( - ftnlen)4, (ftnlen)5, (ftnlen)12, (ftnlen)1); + dtrmm_((char *)"Left", (char *)"Upper", (char *)"No transpose", diag, &i__4, &jb, &c_b18, &a[a_offset], lda, + &a[j * a_dim1 + 1], lda, (ftnlen)4, (ftnlen)5, (ftnlen)12, (ftnlen)1); i__4 = j - 1; - dtrsm_((char *)"Right", (char *)"Upper", (char *)"No transpose", diag, &i__4, &jb, & - c_b22, &a[j + j * a_dim1], lda, &a[j * a_dim1 + 1], - lda, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)1); - -/* Compute inverse of current diagonal block */ - - dtrti2_((char *)"Upper", diag, &jb, &a[j + j * a_dim1], lda, info, ( - ftnlen)5, (ftnlen)1); -/* L20: */ + dtrsm_((char *)"Right", (char *)"Upper", (char *)"No transpose", diag, &i__4, &jb, &c_b22, + &a[j + j * a_dim1], lda, &a[j * a_dim1 + 1], lda, (ftnlen)5, (ftnlen)5, + (ftnlen)12, (ftnlen)1); + dtrti2_((char *)"Upper", diag, &jb, &a[j + j * a_dim1], lda, info, (ftnlen)5, (ftnlen)1); } } else { - -/* Compute inverse of lower triangular matrix */ - nn = (*n - 1) / nb * nb + 1; i__3 = -nb; for (j = nn; i__3 < 0 ? j >= 1 : j <= 1; j += i__3) { -/* Computing MIN */ i__1 = nb, i__4 = *n - j + 1; - jb = min(i__1,i__4); + jb = min(i__1, i__4); if (j + jb <= *n) { - -/* Compute rows j+jb:n of current block column */ - i__1 = *n - j - jb + 1; - dtrmm_((char *)"Left", (char *)"Lower", (char *)"No transpose", diag, &i__1, &jb, - &c_b18, &a[j + jb + (j + jb) * a_dim1], lda, &a[j - + jb + j * a_dim1], lda, (ftnlen)4, (ftnlen)5, ( - ftnlen)12, (ftnlen)1); + dtrmm_((char *)"Left", (char *)"Lower", (char *)"No transpose", diag, &i__1, &jb, &c_b18, + &a[j + jb + (j + jb) * a_dim1], lda, &a[j + jb + j * a_dim1], lda, + (ftnlen)4, (ftnlen)5, (ftnlen)12, (ftnlen)1); i__1 = *n - j - jb + 1; - dtrsm_((char *)"Right", (char *)"Lower", (char *)"No transpose", diag, &i__1, &jb, - &c_b22, &a[j + j * a_dim1], lda, &a[j + jb + j * - a_dim1], lda, (ftnlen)5, (ftnlen)5, (ftnlen)12, ( - ftnlen)1); + dtrsm_((char *)"Right", (char *)"Lower", (char *)"No transpose", diag, &i__1, &jb, &c_b22, + &a[j + j * a_dim1], lda, &a[j + jb + j * a_dim1], lda, (ftnlen)5, + (ftnlen)5, (ftnlen)12, (ftnlen)1); } - -/* Compute inverse of current diagonal block */ - - dtrti2_((char *)"Lower", diag, &jb, &a[j + j * a_dim1], lda, info, ( - ftnlen)5, (ftnlen)1); -/* L30: */ + dtrti2_((char *)"Lower", diag, &jb, &a[j + j * a_dim1], lda, info, (ftnlen)5, (ftnlen)1); } } } - return 0; - -/* End of DTRTRI */ - -} /* dtrtri_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/dznrm2.cpp b/lib/linalg/dznrm2.cpp index 5041b7280e..f636330367 100644 --- a/lib/linalg/dznrm2.cpp +++ b/lib/linalg/dznrm2.cpp @@ -1,140 +1,20 @@ -/* fortran/dznrm2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b DZNRM2 */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* DOUBLE PRECISION FUNCTION DZNRM2(N,X,INCX) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 X(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > DZNRM2 returns the euclidean norm of a vector via the function */ -/* > name, so that */ -/* > */ -/* > DZNRM2 := sqrt( x**H*x ) */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 array, dimension (N) */ -/* > complex vector with N elements */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of X */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \date December 2016 */ - -/* > \ingroup double_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > -- This version written on 25-October-1982. */ -/* > Modified on 14-October-1993 to inline the call to ZLASSQ. */ -/* > Sven Hammarling, Nag Ltd. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ doublereal dznrm2_(integer *n, doublecomplex *x, integer *incx) { - /* System generated locals */ integer i__1, i__2, i__3; doublereal ret_val, d__1; - - /* Builtin functions */ double d_lmp_imag(doublecomplex *), sqrt(doublereal); - - /* Local variables */ integer ix; doublereal ssq, temp, norm, scale; - - -/* -- Reference BLAS level1 routine (version 3.7.0) -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ -/* December 2016 */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - /* Parameter adjustments */ --x; - - /* Function Body */ if (*n < 1 || *incx < 1) { norm = 0.; } else { scale = 0.; ssq = 1.; -/* The following loop is equivalent to this call to the LAPACK */ -/* auxiliary routine: */ -/* CALL ZLASSQ( N, X, INCX, SCALE, SSQ ) */ - i__1 = (*n - 1) * *incx + 1; i__2 = *incx; for (ix = 1; i__2 < 0 ? ix >= i__1 : ix <= i__1; ix += i__2) { @@ -143,12 +23,10 @@ doublereal dznrm2_(integer *n, doublecomplex *x, integer *incx) i__3 = ix; temp = (d__1 = x[i__3].r, abs(d__1)); if (scale < temp) { -/* Computing 2nd power */ d__1 = scale / temp; ssq = ssq * (d__1 * d__1) + 1.; scale = temp; } else { -/* Computing 2nd power */ d__1 = temp / scale; ssq += d__1 * d__1; } @@ -156,28 +34,20 @@ doublereal dznrm2_(integer *n, doublecomplex *x, integer *incx) if (d_lmp_imag(&x[ix]) != 0.) { temp = (d__1 = d_lmp_imag(&x[ix]), abs(d__1)); if (scale < temp) { -/* Computing 2nd power */ d__1 = scale / temp; ssq = ssq * (d__1 * d__1) + 1.; scale = temp; } else { -/* Computing 2nd power */ d__1 = temp / scale; ssq += d__1 * d__1; } } -/* L10: */ } norm = scale * sqrt(ssq); } - ret_val = norm; return ret_val; - -/* End of DZNRM2. */ - -} /* dznrm2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/idamax.cpp b/lib/linalg/idamax.cpp index e50c15bd38..ab2c24dc15 100644 --- a/lib/linalg/idamax.cpp +++ b/lib/linalg/idamax.cpp @@ -1,119 +1,14 @@ -/* fortran/idamax.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b IDAMAX */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* INTEGER FUNCTION IDAMAX(N,DX,INCX) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION DX(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > IDAMAX finds the index of the first element having maximum absolute value. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DX */ -/* > \verbatim */ -/* > DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of DX */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup aux_blas */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, linpack, 3/11/78. */ -/* > modified 3/93 to return if incx .le. 0. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ integer idamax_(integer *n, doublereal *dx, integer *incx) { - /* System generated locals */ integer ret_val, i__1; doublereal d__1; - - /* Local variables */ integer i__, ix; doublereal dmax__; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - /* Parameter adjustments */ --dx; - - /* Function Body */ ret_val = 0; if (*n < 1 || *incx <= 0) { return ret_val; @@ -123,9 +18,6 @@ integer idamax_(integer *n, doublereal *dx, integer *incx) return ret_val; } if (*incx == 1) { - -/* code for increment equal to 1 */ - dmax__ = abs(dx[1]); i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { @@ -135,9 +27,6 @@ integer idamax_(integer *n, doublereal *dx, integer *incx) } } } else { - -/* code for increment not equal to 1 */ - ix = 1; dmax__ = abs(dx[1]); ix += *incx; @@ -151,11 +40,7 @@ integer idamax_(integer *n, doublereal *dx, integer *incx) } } return ret_val; - -/* End of IDAMAX */ - -} /* idamax_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/ieeeck.cpp b/lib/linalg/ieeeck.cpp index 783a87df9d..c8cf58ba81 100644 --- a/lib/linalg/ieeeck.cpp +++ b/lib/linalg/ieeeck.cpp @@ -1,228 +1,87 @@ -/* fortran/ieeeck.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b IEEECK */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download IEEECK + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER ISPEC */ -/* REAL ONE, ZERO */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > IEEECK is called from the ILAENV to verify that Infinity and */ -/* > possibly NaN arithmetic is safe (i.e. will not trap). */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ISPEC */ -/* > \verbatim */ -/* > ISPEC is INTEGER */ -/* > Specifies whether to test just for infinity arithmetic */ -/* > or whether to test for infinity and NaN arithmetic. */ -/* > = 0: Verify infinity arithmetic only. */ -/* > = 1: Verify infinity and NaN arithmetic. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ZERO */ -/* > \verbatim */ -/* > ZERO is REAL */ -/* > Must contain the value 0.0 */ -/* > This is passed to prevent the compiler from optimizing */ -/* > away this code. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ONE */ -/* > \verbatim */ -/* > ONE is REAL */ -/* > Must contain the value 1.0 */ -/* > This is passed to prevent the compiler from optimizing */ -/* > away this code. */ -/* > */ -/* > RETURN VALUE: INTEGER */ -/* > = 0: Arithmetic failed to produce the correct answers */ -/* > = 1: Arithmetic produced the correct answers */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ integer ieeeck_(integer *ispec, real *zero, real *one) { - /* System generated locals */ integer ret_val; - - /* Local variables */ real nan1, nan2, nan3, nan4, nan5, nan6, neginf, posinf, negzro, newzro; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Executable Statements .. */ ret_val = 1; - posinf = *one / *zero; if (posinf <= *one) { ret_val = 0; return ret_val; } - neginf = -(*one) / *zero; if (neginf >= *zero) { ret_val = 0; return ret_val; } - negzro = *one / (neginf + *one); if (negzro != *zero) { ret_val = 0; return ret_val; } - neginf = *one / negzro; if (neginf >= *zero) { ret_val = 0; return ret_val; } - newzro = negzro + *zero; if (newzro != *zero) { ret_val = 0; return ret_val; } - posinf = *one / newzro; if (posinf <= *one) { ret_val = 0; return ret_val; } - neginf *= posinf; if (neginf >= *zero) { ret_val = 0; return ret_val; } - posinf *= posinf; if (posinf <= *one) { ret_val = 0; return ret_val; } - - - - -/* Return if we were only asked to check infinity arithmetic */ - if (*ispec == 0) { return ret_val; } - nan1 = posinf + neginf; - nan2 = posinf / neginf; - nan3 = posinf / posinf; - nan4 = posinf * *zero; - nan5 = neginf * negzro; - nan6 = nan5 * *zero; - if (nan1 == nan1) { ret_val = 0; return ret_val; } - if (nan2 == nan2) { ret_val = 0; return ret_val; } - if (nan3 == nan3) { ret_val = 0; return ret_val; } - if (nan4 == nan4) { ret_val = 0; return ret_val; } - if (nan5 == nan5) { ret_val = 0; return ret_val; } - if (nan6 == nan6) { ret_val = 0; return ret_val; } - return ret_val; -} /* ieeeck_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/iladlc.cpp b/lib/linalg/iladlc.cpp index 20355f1a94..019cf7f056 100644 --- a/lib/linalg/iladlc.cpp +++ b/lib/linalg/iladlc.cpp @@ -1,138 +1,19 @@ -/* fortran/iladlc.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ILADLC scans a matrix for its last non-zero column. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ILADLC + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* INTEGER FUNCTION ILADLC( M, N, A, LDA ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER M, N, LDA */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ILADLC scans A for its last non-zero column. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > The m by n matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ integer iladlc_(integer *m, integer *n, doublereal *a, integer *lda) { - /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1; - - /* Local variables */ integer i__; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick test for the common case where one corner is non-zero. */ - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ if (*n == 0) { ret_val = *n; } else if (a[*n * a_dim1 + 1] != 0. || a[*m + *n * a_dim1] != 0.) { ret_val = *n; } else { -/* Now scan each column from the end, returning with the first non-zero. */ for (ret_val = *n; ret_val >= 1; --ret_val) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { @@ -143,8 +24,7 @@ integer iladlc_(integer *m, integer *n, doublereal *a, integer *lda) } } return ret_val; -} /* iladlc_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/iladlr.cpp b/lib/linalg/iladlr.cpp index a68f2a665e..9718267951 100644 --- a/lib/linalg/iladlr.cpp +++ b/lib/linalg/iladlr.cpp @@ -1,151 +1,31 @@ -/* fortran/iladlr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ILADLR scans a matrix for its last non-zero row. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ILADLR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* INTEGER FUNCTION ILADLR( M, N, A, LDA ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER M, N, LDA */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ILADLR scans A for its last non-zero row. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is DOUBLE PRECISION array, dimension (LDA,N) */ -/* > The m by n matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* ===================================================================== */ integer iladlr_(integer *m, integer *n, doublereal *a, integer *lda) { - /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1; - - /* Local variables */ integer i__, j; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick test for the common case where one corner is non-zero. */ - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ if (*m == 0) { ret_val = *m; } else if (a[*m + a_dim1] != 0. || a[*m + *n * a_dim1] != 0.) { ret_val = *m; } else { -/* Scan up each column tracking the last zero row seen. */ ret_val = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__ = *m; - while(a[max(i__,1) + j * a_dim1] == 0. && i__ >= 1) { + while (a[max(i__, 1) + j * a_dim1] == 0. && i__ >= 1) { --i__; } - ret_val = max(ret_val,i__); + ret_val = max(ret_val, i__); } } return ret_val; -} /* iladlr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/ilaenv.cpp b/lib/linalg/ilaenv.cpp index 355b2a9429..1cc1c571f1 100644 --- a/lib/linalg/ilaenv.cpp +++ b/lib/linalg/ilaenv.cpp @@ -1,202 +1,17 @@ -/* fortran/ilaenv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static real c_b176 = (float)0.; static real c_b177 = (float)1.; static integer c__0 = 0; - -/* > \brief \b ILAENV */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ILAENV + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER*( * ) NAME, OPTS */ -/* INTEGER ISPEC, N1, N2, N3, N4 */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ILAENV is called from the LAPACK routines to choose problem-dependent */ -/* > parameters for the local environment. See ISPEC for a description of */ -/* > the parameters. */ -/* > */ -/* > ILAENV returns an INTEGER */ -/* > if ILAENV >= 0: ILAENV returns the value of the parameter specified by ISPEC */ -/* > if ILAENV < 0: if ILAENV = -k, the k-th argument had an illegal value. */ -/* > */ -/* > This version provides a set of parameters which should give good, */ -/* > but not optimal, performance on many of the currently available */ -/* > computers. Users are encouraged to modify this subroutine to set */ -/* > the tuning parameters for their particular machine using the option */ -/* > and problem size information in the arguments. */ -/* > */ -/* > This routine will not function correctly if it is converted to all */ -/* > lower case. Converting it to all upper case is allowed. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ISPEC */ -/* > \verbatim */ -/* > ISPEC is INTEGER */ -/* > Specifies the parameter to be returned as the value of */ -/* > ILAENV. */ -/* > = 1: the optimal blocksize; if this value is 1, an unblocked */ -/* > algorithm will give the best performance. */ -/* > = 2: the minimum block size for which the block routine */ -/* > should be used; if the usable block size is less than */ -/* > this value, an unblocked routine should be used. */ -/* > = 3: the crossover point (in a block routine, for N less */ -/* > than this value, an unblocked routine should be used) */ -/* > = 4: the number of shifts, used in the nonsymmetric */ -/* > eigenvalue routines (DEPRECATED) */ -/* > = 5: the minimum column dimension for blocking to be used; */ -/* > rectangular blocks must have dimension at least k by m, */ -/* > where k is given by ILAENV(2,...) and m by ILAENV(5,...) */ -/* > = 6: the crossover point for the SVD (when reducing an m by n */ -/* > matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds */ -/* > this value, a QR factorization is used first to reduce */ -/* > the matrix to a triangular form.) */ -/* > = 7: the number of processors */ -/* > = 8: the crossover point for the multishift QR method */ -/* > for nonsymmetric eigenvalue problems (DEPRECATED) */ -/* > = 9: maximum size of the subproblems at the bottom of the */ -/* > computation tree in the divide-and-conquer algorithm */ -/* > (used by xGELSD and xGESDD) */ -/* > =10: ieee infinity and NaN arithmetic can be trusted not to trap */ -/* > =11: infinity arithmetic can be trusted not to trap */ -/* > 12 <= ISPEC <= 17: */ -/* > xHSEQR or related subroutines, */ -/* > see IPARMQ for detailed explanation */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NAME */ -/* > \verbatim */ -/* > NAME is CHARACTER*(*) */ -/* > The name of the calling subroutine, in either upper case or */ -/* > lower case. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] OPTS */ -/* > \verbatim */ -/* > OPTS is CHARACTER*(*) */ -/* > The character options to the subroutine NAME, concatenated */ -/* > into a single character string. For example, UPLO = 'U', */ -/* > TRANS = 'T', and DIAG = 'N' for a triangular routine would */ -/* > be specified as OPTS = 'UTN'. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N1 */ -/* > \verbatim */ -/* > N1 is INTEGER */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N2 */ -/* > \verbatim */ -/* > N2 is INTEGER */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N3 */ -/* > \verbatim */ -/* > N3 is INTEGER */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N4 */ -/* > \verbatim */ -/* > N4 is INTEGER */ -/* > Problem dimensions for the subroutine NAME; these may not all */ -/* > be required. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The following conventions have been used when calling ILAENV from the */ -/* > LAPACK routines: */ -/* > 1) OPTS is a concatenation of all of the character options to */ -/* > subroutine NAME, in the same order that they appear in the */ -/* > argument list for NAME, even if they are not used in determining */ -/* > the value of the parameter specified by ISPEC. */ -/* > 2) The problem dimensions N1, N2, N3, N4 are specified in the order */ -/* > that they appear in the argument list for NAME. N1 is used */ -/* > first, N2 second, and so on, and unused problem dimensions are */ -/* > passed a value of -1. */ -/* > 3) The parameter value returned by ILAENV is checked for validity in */ -/* > the calling subroutine. For example, ILAENV is used to retrieve */ -/* > the optimal blocksize for STRTRI as follows: */ -/* > */ -/* > NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 ) */ -/* > IF( NB.LE.1 ) NB = MAX( 1, N ) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, - integer *n2, integer *n3, integer *n4, ftnlen name_len, ftnlen - opts_len) +integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, integer *n2, integer *n3, + integer *n4, ftnlen name_len, ftnlen opts_len) { - /* System generated locals */ integer ret_val, i__1, i__2, i__3; - - /* Builtin functions */ - /* Subroutine */ int s_lmp_copy(char *, char *, ftnlen, ftnlen); + int s_lmp_copy(char *, char *, ftnlen, ftnlen); integer i_lmp_len(char *, ftnlen), s_lmp_cmp(char *, char *, ftnlen, ftnlen); - - /* Local variables */ logical twostage; integer i__; char c1[1], c2[2], c3[3], c4[2]; @@ -206,140 +21,103 @@ integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1, logical sname; extern integer ieeeck_(integer *, real *, real *); char subnam[16]; - extern integer iparmq_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - + extern integer iparmq_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); switch (*ispec) { - case 1: goto L10; - case 2: goto L10; - case 3: goto L10; - case 4: goto L80; - case 5: goto L90; - case 6: goto L100; - case 7: goto L110; - case 8: goto L120; - case 9: goto L130; - case 10: goto L140; - case 11: goto L150; - case 12: goto L160; - case 13: goto L160; - case 14: goto L160; - case 15: goto L160; - case 16: goto L160; - case 17: goto L160; + case 1: + goto L10; + case 2: + goto L10; + case 3: + goto L10; + case 4: + goto L80; + case 5: + goto L90; + case 6: + goto L100; + case 7: + goto L110; + case 8: + goto L120; + case 9: + goto L130; + case 10: + goto L140; + case 11: + goto L150; + case 12: + goto L160; + case 13: + goto L160; + case 14: + goto L160; + case 15: + goto L160; + case 16: + goto L160; + case 17: + goto L160; } - -/* Invalid value for ISPEC */ - ret_val = -1; return ret_val; - L10: - -/* Convert NAME to upper case if the first character is lower case. */ - ret_val = 1; s_lmp_copy(subnam, name__, (ftnlen)16, name_len); ic = *(unsigned char *)subnam; iz = 'Z'; if (iz == 90 || iz == 122) { - -/* ASCII character set */ - if (ic >= 97 && ic <= 122) { - *(unsigned char *)subnam = (char) (ic - 32); + *(unsigned char *)subnam = (char)(ic - 32); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 97 && ic <= 122) { - *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + *(unsigned char *)&subnam[i__ - 1] = (char)(ic - 32); } -/* L20: */ } } - } else if (iz == 233 || iz == 169) { - -/* EBCDIC character set */ - - if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 && - ic <= 169) { - *(unsigned char *)subnam = (char) (ic + 64); + if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 && ic <= 169) { + *(unsigned char *)subnam = (char)(ic + 64); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; - if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= - 162 && ic <= 169) { - *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); + if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 && ic <= 169) { + *(unsigned char *)&subnam[i__ - 1] = (char)(ic + 64); } -/* L30: */ } } - } else if (iz == 218 || iz == 250) { - -/* Prime machines: ASCII+128 */ - if (ic >= 225 && ic <= 250) { - *(unsigned char *)subnam = (char) (ic - 32); + *(unsigned char *)subnam = (char)(ic - 32); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 225 && ic <= 250) { - *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + *(unsigned char *)&subnam[i__ - 1] = (char)(ic - 32); } -/* L40: */ } } } - *(unsigned char *)c1 = *(unsigned char *)subnam; sname = *(unsigned char *)c1 == 'S' || *(unsigned char *)c1 == 'D'; cname = *(unsigned char *)c1 == 'C' || *(unsigned char *)c1 == 'Z'; - if (! (cname || sname)) { + if (!(cname || sname)) { return ret_val; } s_lmp_copy(c2, subnam + 1, (ftnlen)2, (ftnlen)2); s_lmp_copy(c3, subnam + 3, (ftnlen)3, (ftnlen)3); s_lmp_copy(c4, c3 + 1, (ftnlen)2, (ftnlen)2); - twostage = i_lmp_len(subnam, (ftnlen)16) >= 11 && *(unsigned char *)&subnam[ - 10] == '2'; - + twostage = i_lmp_len(subnam, (ftnlen)16) >= 11 && *(unsigned char *)&subnam[10] == '2'; switch (*ispec) { - case 1: goto L50; - case 2: goto L60; - case 3: goto L70; + case 1: + goto L50; + case 2: + goto L60; + case 3: + goto L70; } - L50: - -/* ISPEC = 1: block size */ - -/* In these examples, separate code is provided for setting NB for */ -/* real and complex. We assume that NB will take the same value in */ -/* single or double precision. */ - nb = 1; - if (s_lmp_cmp(subnam + 1, (char *)"LAORH", (ftnlen)5, (ftnlen)5) == 0) { - -/* This is for *LAORHR_GETRFNP routine */ - if (sname) { nb = 32; } else { @@ -352,10 +130,10 @@ L50: } else { nb = 64; } - } else if (s_lmp_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_lmp_cmp(c3, - (char *)"RQF", (ftnlen)3, (ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"LQF", (ftnlen) - 3, (ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) - == 0) { + } else if (s_lmp_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || + s_lmp_cmp(c3, (char *)"RQF", (ftnlen)3, (ftnlen)3) == 0 || + s_lmp_cmp(c3, (char *)"LQF", (ftnlen)3, (ftnlen)3) == 0 || + s_lmp_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nb = 32; } else { @@ -364,7 +142,6 @@ L50: } else if (s_lmp_cmp(c3, (char *)"QR ", (ftnlen)3, (ftnlen)3) == 0) { if (*n3 == 1) { if (sname) { -/* M*N */ if (*n1 * *n2 <= 131072 || *n1 <= 8192) { nb = *n1; } else { @@ -387,7 +164,6 @@ L50: } else if (s_lmp_cmp(c3, (char *)"LQ ", (ftnlen)3, (ftnlen)3) == 0) { if (*n3 == 2) { if (sname) { -/* M*N */ if (*n1 * *n2 <= 131072 || *n1 <= 8192) { nb = *n1; } else { @@ -468,41 +244,45 @@ L50: } } else if (sname && s_lmp_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { - if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"RQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"BR", (ftnlen)2, (ftnlen)2) == 0) { nb = 32; } } else if (*(unsigned char *)c3 == 'M') { - if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"RQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"BR", (ftnlen)2, (ftnlen)2) == 0) { nb = 32; } } } else if (cname && s_lmp_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { - if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"RQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"BR", (ftnlen)2, (ftnlen)2) == 0) { nb = 32; } } else if (*(unsigned char *)c3 == 'M') { - if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"RQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"BR", (ftnlen)2, (ftnlen)2) == 0) { nb = 32; } } @@ -552,19 +332,14 @@ L50: nb = 64; } } else if (s_lmp_cmp(c3, (char *)"SYL", (ftnlen)3, (ftnlen)3) == 0) { -/* The upper bound is to prevent overly aggressive scaling. */ if (sname) { -/* Computing MIN */ -/* Computing MAX */ - i__2 = 48, i__3 = (min(*n1,*n2) << 4) / 100; - i__1 = max(i__2,i__3); - nb = min(i__1,240); + i__2 = 48, i__3 = (min(*n1, *n2) << 4) / 100; + i__1 = max(i__2, i__3); + nb = min(i__1, 240); } else { -/* Computing MIN */ -/* Computing MAX */ - i__2 = 24, i__3 = (min(*n1,*n2) << 3) / 100; - i__1 = max(i__2,i__3); - nb = min(i__1,80); + i__2 = 24, i__3 = (min(*n1, *n2) << 3) / 100; + i__1 = max(i__2, i__3); + nb = min(i__1, 80); } } } else if (s_lmp_cmp(c2, (char *)"LA", (ftnlen)2, (ftnlen)2) == 0) { @@ -597,17 +372,13 @@ L50: } ret_val = nb; return ret_val; - L60: - -/* ISPEC = 2: minimum block size */ - nbmin = 2; if (s_lmp_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_lmp_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"RQF", ( - ftnlen)3, (ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"LQF", (ftnlen)3, ( - ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) - { + if (s_lmp_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || + s_lmp_cmp(c3, (char *)"RQF", (ftnlen)3, (ftnlen)3) == 0 || + s_lmp_cmp(c3, (char *)"LQF", (ftnlen)3, (ftnlen)3) == 0 || + s_lmp_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nbmin = 2; } else { @@ -648,41 +419,45 @@ L60: } } else if (sname && s_lmp_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { - if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"RQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"BR", (ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; } } else if (*(unsigned char *)c3 == 'M') { - if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"RQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"BR", (ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; } } } else if (cname && s_lmp_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { - if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"RQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"BR", (ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; } } else if (*(unsigned char *)c3 == 'M') { - if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"RQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"BR", (ftnlen)2, (ftnlen)2) == 0) { nbmin = 2; } } @@ -694,17 +469,13 @@ L60: } ret_val = nbmin; return ret_val; - L70: - -/* ISPEC = 3: crossover point */ - nx = 0; if (s_lmp_cmp(c2, (char *)"GE", (ftnlen)2, (ftnlen)2) == 0) { - if (s_lmp_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"RQF", ( - ftnlen)3, (ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"LQF", (ftnlen)3, ( - ftnlen)3) == 0 || s_lmp_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) - { + if (s_lmp_cmp(c3, (char *)"QRF", (ftnlen)3, (ftnlen)3) == 0 || + s_lmp_cmp(c3, (char *)"RQF", (ftnlen)3, (ftnlen)3) == 0 || + s_lmp_cmp(c3, (char *)"LQF", (ftnlen)3, (ftnlen)3) == 0 || + s_lmp_cmp(c3, (char *)"QLF", (ftnlen)3, (ftnlen)3) == 0) { if (sname) { nx = 128; } else { @@ -733,23 +504,25 @@ L70: } } else if (sname && s_lmp_cmp(c2, (char *)"OR", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { - if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"RQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"BR", (ftnlen)2, (ftnlen)2) == 0) { nx = 128; } } } else if (cname && s_lmp_cmp(c2, (char *)"UN", (ftnlen)2, (ftnlen)2) == 0) { if (*(unsigned char *)c3 == 'G') { - if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"RQ", - (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, ( - ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == - 0 || s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp( - c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || s_lmp_cmp(c4, (char *)"BR", ( - ftnlen)2, (ftnlen)2) == 0) { + if (s_lmp_cmp(c4, (char *)"QR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"RQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"LQ", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"QL", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"HR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"TR", (ftnlen)2, (ftnlen)2) == 0 || + s_lmp_cmp(c4, (char *)"BR", (ftnlen)2, (ftnlen)2) == 0) { nx = 128; } } @@ -761,85 +534,40 @@ L70: } ret_val = nx; return ret_val; - L80: - -/* ISPEC = 4: number of shifts (used by xHSEQR) */ - ret_val = 6; return ret_val; - L90: - -/* ISPEC = 5: minimum column dimension (not used) */ - ret_val = 2; return ret_val; - L100: - -/* ISPEC = 6: crossover point for SVD (used by xGELSS and xGESVD) */ - - ret_val = (integer) ((real) min(*n1,*n2) * (float)1.6); + ret_val = (integer)((real)min(*n1, *n2) * (float)1.6); return ret_val; - L110: - -/* ISPEC = 7: number of processors (not used) */ - ret_val = 1; return ret_val; - L120: - -/* ISPEC = 8: crossover point for multishift (used by xHSEQR) */ - ret_val = 50; return ret_val; - L130: - -/* ISPEC = 9: maximum size of the subproblems at the bottom of the */ -/* computation tree in the divide-and-conquer algorithm */ -/* (used by xGELSD and xGESDD) */ - ret_val = 25; return ret_val; - L140: - -/* ISPEC = 10: ieee and infinity NaN arithmetic can be trusted not to trap */ - -/* ILAENV = 0 */ ret_val = 1; if (ret_val == 1) { ret_val = ieeeck_(&c__1, &c_b176, &c_b177); } return ret_val; - L150: - -/* ISPEC = 11: ieee infinity arithmetic can be trusted not to trap */ - -/* ILAENV = 0 */ ret_val = 1; if (ret_val == 1) { ret_val = ieeeck_(&c__0, &c_b176, &c_b177); } return ret_val; - L160: - -/* 12 <= ISPEC <= 17: xHSEQR or related subroutines. */ - - ret_val = iparmq_(ispec, name__, opts, n1, n2, n3, n4, name_len, opts_len) - ; + ret_val = iparmq_(ispec, name__, opts, n1, n2, n3, n4, name_len, opts_len); return ret_val; - -/* End of ILAENV */ - -} /* ilaenv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/ilazlc.cpp b/lib/linalg/ilazlc.cpp index eb3f9ed604..6832710dac 100644 --- a/lib/linalg/ilazlc.cpp +++ b/lib/linalg/ilazlc.cpp @@ -1,142 +1,22 @@ -/* fortran/ilazlc.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ILAZLC scans a matrix for its last non-zero column. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ILAZLC + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* INTEGER FUNCTION ILAZLC( M, N, A, LDA ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER M, N, LDA */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ILAZLC scans A for its last non-zero column. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > The m by n matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* ===================================================================== */ integer ilazlc_(integer *m, integer *n, doublecomplex *a, integer *lda) { - /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1, i__2; - - /* Local variables */ integer i__; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick test for the common case where one corner is non-zero. */ - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ if (*n == 0) { ret_val = *n; - } else /* if(complicated condition) */ { + } else { i__1 = *n * a_dim1 + 1; i__2 = *m + *n * a_dim1; - if (a[i__1].r != 0. || a[i__1].i != 0. || (a[i__2].r != 0. || a[i__2] - .i != 0.)) { + if (a[i__1].r != 0. || a[i__1].i != 0. || (a[i__2].r != 0. || a[i__2].i != 0.)) { ret_val = *n; } else { -/* Now scan each column from the end, returning with the first non-zero. */ for (ret_val = *n; ret_val >= 1; --ret_val) { i__1 = *m; for (i__ = 1; i__ <= i__1; ++i__) { @@ -149,8 +29,7 @@ integer ilazlc_(integer *m, integer *n, doublecomplex *a, integer *lda) } } return ret_val; -} /* ilazlc_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/ilazlr.cpp b/lib/linalg/ilazlr.cpp index ebef3fa0e1..dd741985be 100644 --- a/lib/linalg/ilazlr.cpp +++ b/lib/linalg/ilazlr.cpp @@ -1,159 +1,37 @@ -/* fortran/ilazlr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ILAZLR scans a matrix for its last non-zero row. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ILAZLR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* INTEGER FUNCTION ILAZLR( M, N, A, LDA ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER M, N, LDA */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ILAZLR scans A for its last non-zero row. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > The m by n matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* ===================================================================== */ integer ilazlr_(integer *m, integer *n, doublecomplex *a, integer *lda) { - /* System generated locals */ integer a_dim1, a_offset, ret_val, i__1, i__2; - - /* Local variables */ integer i__, j; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick test for the common case where one corner is non-zero. */ - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ if (*m == 0) { ret_val = *m; - } else /* if(complicated condition) */ { + } else { i__1 = *m + a_dim1; i__2 = *m + *n * a_dim1; - if (a[i__1].r != 0. || a[i__1].i != 0. || (a[i__2].r != 0. || a[i__2] - .i != 0.)) { + if (a[i__1].r != 0. || a[i__1].i != 0. || (a[i__2].r != 0. || a[i__2].i != 0.)) { ret_val = *m; } else { -/* Scan up each column tracking the last zero row seen. */ ret_val = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { i__ = *m; - for(;;) { /* while(complicated condition) */ - i__2 = max(i__,1) + j * a_dim1; - if (!(a[i__2].r == 0. && a[i__2].i == 0. && i__ >= 1)) - break; + for (;;) { + i__2 = max(i__, 1) + j * a_dim1; + if (!(a[i__2].r == 0. && a[i__2].i == 0. && i__ >= 1)) break; --i__; } - ret_val = max(ret_val,i__); + ret_val = max(ret_val, i__); } } } return ret_val; -} /* ilazlr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/iparmq.cpp b/lib/linalg/iparmq.cpp index 0b8e981525..3ed8cd778a 100644 --- a/lib/linalg/iparmq.cpp +++ b/lib/linalg/iparmq.cpp @@ -1,287 +1,19 @@ -/* fortran/iparmq.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b IPARMQ */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download IPARMQ + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER IHI, ILO, ISPEC, LWORK, N */ -/* CHARACTER NAME*( * ), OPTS*( * ) */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > This program sets problem and machine dependent parameters */ -/* > useful for xHSEQR and related subroutines for eigenvalue */ -/* > problems. It is called whenever */ -/* > IPARMQ is called with 12 <= ISPEC <= 16 */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] ISPEC */ -/* > \verbatim */ -/* > ISPEC is INTEGER */ -/* > ISPEC specifies which tunable parameter IPARMQ should */ -/* > return. */ -/* > */ -/* > ISPEC=12: (INMIN) Matrices of order nmin or less */ -/* > are sent directly to xLAHQR, the implicit */ -/* > double shift QR algorithm. NMIN must be */ -/* > at least 11. */ -/* > */ -/* > ISPEC=13: (INWIN) Size of the deflation window. */ -/* > This is best set greater than or equal to */ -/* > the number of simultaneous shifts NS. */ -/* > Larger matrices benefit from larger deflation */ -/* > windows. */ -/* > */ -/* > ISPEC=14: (INIBL) Determines when to stop nibbling and */ -/* > invest in an (expensive) multi-shift QR sweep. */ -/* > If the aggressive early deflation subroutine */ -/* > finds LD converged eigenvalues from an order */ -/* > NW deflation window and LD > (NW*NIBBLE)/100, */ -/* > then the next QR sweep is skipped and early */ -/* > deflation is applied immediately to the */ -/* > remaining active diagonal block. Setting */ -/* > IPARMQ(ISPEC=14) = 0 causes TTQRE to skip a */ -/* > multi-shift QR sweep whenever early deflation */ -/* > finds a converged eigenvalue. Setting */ -/* > IPARMQ(ISPEC=14) greater than or equal to 100 */ -/* > prevents TTQRE from skipping a multi-shift */ -/* > QR sweep. */ -/* > */ -/* > ISPEC=15: (NSHFTS) The number of simultaneous shifts in */ -/* > a multi-shift QR iteration. */ -/* > */ -/* > ISPEC=16: (IACC22) IPARMQ is set to 0, 1 or 2 with the */ -/* > following meanings. */ -/* > 0: During the multi-shift QR/QZ sweep, */ -/* > blocked eigenvalue reordering, blocked */ -/* > Hessenberg-triangular reduction, */ -/* > reflections and/or rotations are not */ -/* > accumulated when updating the */ -/* > far-from-diagonal matrix entries. */ -/* > 1: During the multi-shift QR/QZ sweep, */ -/* > blocked eigenvalue reordering, blocked */ -/* > Hessenberg-triangular reduction, */ -/* > reflections and/or rotations are */ -/* > accumulated, and matrix-matrix */ -/* > multiplication is used to update the */ -/* > far-from-diagonal matrix entries. */ -/* > 2: During the multi-shift QR/QZ sweep, */ -/* > blocked eigenvalue reordering, blocked */ -/* > Hessenberg-triangular reduction, */ -/* > reflections and/or rotations are */ -/* > accumulated, and 2-by-2 block structure */ -/* > is exploited during matrix-matrix */ -/* > multiplies. */ -/* > (If xTRMM is slower than xGEMM, then */ -/* > IPARMQ(ISPEC=16)=1 may be more efficient than */ -/* > IPARMQ(ISPEC=16)=2 despite the greater level of */ -/* > arithmetic work implied by the latter choice.) */ -/* > */ -/* > ISPEC=17: (ICOST) An estimate of the relative cost of flops */ -/* > within the near-the-diagonal shift chase compared */ -/* > to flops within the BLAS calls of a QZ sweep. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NAME */ -/* > \verbatim */ -/* > NAME is CHARACTER string */ -/* > Name of the calling subroutine */ -/* > \endverbatim */ -/* > */ -/* > \param[in] OPTS */ -/* > \verbatim */ -/* > OPTS is CHARACTER string */ -/* > This is a concatenation of the string arguments to */ -/* > TTQRE. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > N is the order of the Hessenberg matrix H. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ILO */ -/* > \verbatim */ -/* > ILO is INTEGER */ -/* > \endverbatim */ -/* > */ -/* > \param[in] IHI */ -/* > \verbatim */ -/* > IHI is INTEGER */ -/* > It is assumed that H is already upper triangular */ -/* > in rows and columns 1:ILO-1 and IHI+1:N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The amount of workspace available. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup OTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Little is known about how best to choose these parameters. */ -/* > It is possible to use different values of the parameters */ -/* > for each of CHSEQR, DHSEQR, SHSEQR and ZHSEQR. */ -/* > */ -/* > It is probably best to choose different parameters for */ -/* > different matrices and different parameters at different */ -/* > times during the iteration, but this has not been */ -/* > implemented --- yet. */ -/* > */ -/* > */ -/* > The best choices of most of the parameters depend */ -/* > in an ill-understood way on the relative execution */ -/* > rate of xLAQR3 and xLAQR5 and on the nature of each */ -/* > particular eigenvalue problem. Experiment may be the */ -/* > only practical way to determine which choices are most */ -/* > effective. */ -/* > */ -/* > Following is a list of default values supplied by IPARMQ. */ -/* > These defaults may be adjusted in order to attain better */ -/* > performance in any particular computational environment. */ -/* > */ -/* > IPARMQ(ISPEC=12) The xLAHQR vs xLAQR0 crossover point. */ -/* > Default: 75. (Must be at least 11.) */ -/* > */ -/* > IPARMQ(ISPEC=13) Recommended deflation window size. */ -/* > This depends on ILO, IHI and NS, the */ -/* > number of simultaneous shifts returned */ -/* > by IPARMQ(ISPEC=15). The default for */ -/* > (IHI-ILO+1) <= 500 is NS. The default */ -/* > for (IHI-ILO+1) > 500 is 3*NS/2. */ -/* > */ -/* > IPARMQ(ISPEC=14) Nibble crossover point. Default: 14. */ -/* > */ -/* > IPARMQ(ISPEC=15) Number of simultaneous shifts, NS. */ -/* > a multi-shift QR iteration. */ -/* > */ -/* > If IHI-ILO+1 is ... */ -/* > */ -/* > greater than ...but less ... the */ -/* > or equal to ... than default is */ -/* > */ -/* > 0 30 NS = 2+ */ -/* > 30 60 NS = 4+ */ -/* > 60 150 NS = 10 */ -/* > 150 590 NS = ** */ -/* > 590 3000 NS = 64 */ -/* > 3000 6000 NS = 128 */ -/* > 6000 infinity NS = 256 */ -/* > */ -/* > (+) By default matrices of this order are */ -/* > passed to the implicit double shift routine */ -/* > xLAHQR. See IPARMQ(ISPEC=12) above. These */ -/* > values of NS are used only in case of a rare */ -/* > xLAHQR failure. */ -/* > */ -/* > (**) The asterisks (**) indicate an ad-hoc */ -/* > function increasing from 10 to 64. */ -/* > */ -/* > IPARMQ(ISPEC=16) Select structured matrix multiply. */ -/* > (See ISPEC=16 above for details.) */ -/* > Default: 3. */ -/* > */ -/* > IPARMQ(ISPEC=17) Relative cost heuristic for blocksize selection. */ -/* > Expressed as a percentage. */ -/* > Default: 10. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer - *ilo, integer *ihi, integer *lwork, ftnlen name_len, ftnlen opts_len) +integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer *ilo, integer *ihi, + integer *lwork, ftnlen name_len, ftnlen opts_len) { - /* System generated locals */ integer ret_val, i__1, i__2; real r__1; - - /* Builtin functions */ double log(doublereal); integer i_lmp_nint(real *); - /* Subroutine */ int s_lmp_copy(char *, char *, ftnlen, ftnlen); + int s_lmp_copy(char *, char *, ftnlen, ftnlen); integer s_lmp_cmp(char *, char *, ftnlen, ftnlen); - - /* Local variables */ integer i__, ic, nh, ns, iz; char subnam[6]; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ - -/* ================================================================ */ -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ if (*ispec == 15 || *ispec == 13 || *ispec == 16) { - -/* ==== Set the number simultaneous shifts ==== */ - nh = *ihi - *ilo + 1; ns = 2; if (nh >= 30) { @@ -291,10 +23,9 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer ns = 10; } if (nh >= 150) { -/* Computing MAX */ - r__1 = log((real) nh) / log((float)2.); + r__1 = log((real)nh) / log((float)2.); i__1 = 10, i__2 = nh / i_lmp_nint(&r__1); - ns = max(i__1,i__2); + ns = max(i__1, i__2); } if (nh >= 590) { ns = 64; @@ -305,107 +36,60 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer if (nh >= 6000) { ns = 256; } -/* Computing MAX */ i__1 = 2, i__2 = ns - ns % 2; - ns = max(i__1,i__2); + ns = max(i__1, i__2); } - if (*ispec == 12) { - - -/* ===== Matrices of order smaller than NMIN get sent */ -/* . to xLAHQR, the classic double shift algorithm. */ -/* . This must be at least 11. ==== */ - ret_val = 75; - } else if (*ispec == 14) { - -/* ==== INIBL: skip a multi-shift qr iteration and */ -/* . whenever aggressive early deflation finds */ -/* . at least (NIBBLE*(window size)/100) deflations. ==== */ - ret_val = 14; - } else if (*ispec == 15) { - -/* ==== NSHFTS: The number of simultaneous shifts ===== */ - ret_val = ns; - } else if (*ispec == 13) { - -/* ==== NW: deflation window size. ==== */ - if (nh <= 500) { ret_val = ns; } else { ret_val = ns * 3 / 2; } - } else if (*ispec == 16) { - -/* ==== IACC22: Whether to accumulate reflections */ -/* . before updating the far-from-diagonal elements */ -/* . and whether to use 2-by-2 block structure while */ -/* . doing it. A small amount of work could be saved */ -/* . by making this choice dependent also upon the */ -/* . NH=IHI-ILO+1. */ - - -/* Convert NAME to upper case if the first character is lower case. */ - ret_val = 0; s_lmp_copy(subnam, name__, (ftnlen)6, name_len); ic = *(unsigned char *)subnam; iz = 'Z'; if (iz == 90 || iz == 122) { - -/* ASCII character set */ - if (ic >= 97 && ic <= 122) { - *(unsigned char *)subnam = (char) (ic - 32); + *(unsigned char *)subnam = (char)(ic - 32); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 97 && ic <= 122) { - *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + *(unsigned char *)&subnam[i__ - 1] = (char)(ic - 32); } } } - } else if (iz == 233 || iz == 169) { - -/* EBCDIC character set */ - - if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 - && ic <= 169) { - *(unsigned char *)subnam = (char) (ic + 64); + if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || ic >= 162 && ic <= 169) { + *(unsigned char *)subnam = (char)(ic + 64); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 129 && ic <= 137 || ic >= 145 && ic <= 153 || - ic >= 162 && ic <= 169) { - *(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64); + ic >= 162 && ic <= 169) { + *(unsigned char *)&subnam[i__ - 1] = (char)(ic + 64); } } } - } else if (iz == 218 || iz == 250) { - -/* Prime machines: ASCII+128 */ - if (ic >= 225 && ic <= 250) { - *(unsigned char *)subnam = (char) (ic - 32); + *(unsigned char *)subnam = (char)(ic - 32); for (i__ = 2; i__ <= 6; ++i__) { ic = *(unsigned char *)&subnam[i__ - 1]; if (ic >= 225 && ic <= 250) { - *(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32); + *(unsigned char *)&subnam[i__ - 1] = (char)(ic - 32); } } } } - - if (s_lmp_cmp(subnam + 1, (char *)"GGHRD", (ftnlen)5, (ftnlen)5) == 0 || s_lmp_cmp( - subnam + 1, (char *)"GGHD3", (ftnlen)5, (ftnlen)5) == 0) { + if (s_lmp_cmp(subnam + 1, (char *)"GGHRD", (ftnlen)5, (ftnlen)5) == 0 || + s_lmp_cmp(subnam + 1, (char *)"GGHD3", (ftnlen)5, (ftnlen)5) == 0) { ret_val = 1; if (nh >= 14) { ret_val = 2; @@ -418,7 +102,7 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer ret_val = 2; } } else if (s_lmp_cmp(subnam + 1, (char *)"HSEQR", (ftnlen)5, (ftnlen)5) == 0 || - s_lmp_cmp(subnam + 1, (char *)"LAQR", (ftnlen)4, (ftnlen)4) == 0) { + s_lmp_cmp(subnam + 1, (char *)"LAQR", (ftnlen)4, (ftnlen)4) == 0) { if (ns >= 14) { ret_val = 1; } @@ -426,24 +110,13 @@ integer iparmq_(integer *ispec, char *name__, char *opts, integer *n, integer ret_val = 2; } } - } else if (*ispec == 17) { - -/* === Relative cost of near-the-diagonal chase vs */ -/* BLAS updates === */ - ret_val = 10; } else { -/* ===== invalid value of ispec ===== */ ret_val = -1; - } - -/* ==== End of IPARMQ ==== */ - return ret_val; -} /* iparmq_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/lsame.cpp b/lib/linalg/lsame.cpp index dcb89e3d00..480ae93bc9 100644 --- a/lib/linalg/lsame.cpp +++ b/lib/linalg/lsame.cpp @@ -7,11 +7,11 @@ extern "C" { logical lsame_(const char *a, const char *b) { - char ua, ub; - if (!a || !b) return FALSE_; + char ua, ub; + if (!a || !b) return FALSE_; - ua = toupper(*a); - ub = toupper(*b); - return (ua == ub) ? TRUE_ : FALSE_; + ua = toupper(*a); + ub = toupper(*b); + return (ua == ub) ? TRUE_ : FALSE_; } } diff --git a/lib/linalg/pow_lmp_di.cpp b/lib/linalg/pow_lmp_di.cpp index 9c3d89d536..83a0da1a87 100644 --- a/lib/linalg/pow_lmp_di.cpp +++ b/lib/linalg/pow_lmp_di.cpp @@ -10,8 +10,8 @@ double pow_lmp_di(doublereal *ap, integer *bp) unsigned long u; pow = 1; - x = *ap; - n = *bp; + x = *ap; + n = *bp; if (n != 0) { if (n < 0) { diff --git a/lib/linalg/s_lmp_cmp.cpp b/lib/linalg/s_lmp_cmp.cpp index b51817defa..73b011a799 100644 --- a/lib/linalg/s_lmp_cmp.cpp +++ b/lib/linalg/s_lmp_cmp.cpp @@ -8,8 +8,8 @@ extern "C" { integer s_lmp_cmp(char *a0, char *b0, ftnlen la, ftnlen lb) { register unsigned char *a, *aend, *b, *bend; - a = (unsigned char *)a0; - b = (unsigned char *)b0; + a = (unsigned char *)a0; + b = (unsigned char *)b0; aend = a + la; bend = b + lb; diff --git a/lib/linalg/static/.clang-format b/lib/linalg/static/.clang-format index cb352b37f5..8856e00947 100644 --- a/lib/linalg/static/.clang-format +++ b/lib/linalg/static/.clang-format @@ -2,7 +2,7 @@ Language: Cpp BasedOnStyle: LLVM AccessModifierOffset: -4 -AlignConsecutiveAssignments: true +AlignConsecutiveAssignments: false AlignEscapedNewlines: Left AllowShortFunctionsOnASingleLine: Inline AllowShortLambdasOnASingleLine: None diff --git a/lib/linalg/static/disnan.cpp b/lib/linalg/static/disnan.cpp index 9e5bc1094e..dcdaad77e1 100644 --- a/lib/linalg/static/disnan.cpp +++ b/lib/linalg/static/disnan.cpp @@ -7,8 +7,8 @@ extern "C" { logical disnan_(const doublereal *din) { - if (!din) return TRUE_; + if (!din) return TRUE_; - return std::isnan(*din) ? TRUE_ : FALSE_; + return std::isnan(*din) ? TRUE_ : FALSE_; } } diff --git a/lib/linalg/static/dlamch.cpp b/lib/linalg/static/dlamch.cpp index 3d616d95d2..277096e6f3 100644 --- a/lib/linalg/static/dlamch.cpp +++ b/lib/linalg/static/dlamch.cpp @@ -12,34 +12,34 @@ extern "C" { doublereal dlamch_(const char *cmach) { - if (!cmach) return 0.0; - char select = toupper(*cmach); + if (!cmach) return 0.0; + char select = toupper(*cmach); - // BLAS assumes rounding not truncation => epsilon is half - const double eps = 0.5 * std::numeric_limits::epsilon(); - if (select == 'E') return eps; + // BLAS assumes rounding not truncation => epsilon is half + const double eps = 0.5 * std::numeric_limits::epsilon(); + if (select == 'E') return eps; - double min = std::numeric_limits::min(); - const double max = std::numeric_limits::max(); - double small = 1.0 / max; - if (small >= min) min = small * (1.0 + eps); - if (select == 'S') return min; + double min = std::numeric_limits::min(); + const double max = std::numeric_limits::max(); + double small = 1.0 / max; + if (small >= min) min = small * (1.0 + eps); + if (select == 'S') return min; - const double radix = std::numeric_limits::radix; - if (select == 'B') return radix; + const double radix = std::numeric_limits::radix; + if (select == 'B') return radix; - if (select == 'P') return eps * radix; + if (select == 'P') return eps * radix; - if (select == 'N') return std::numeric_limits::digits; + if (select == 'N') return std::numeric_limits::digits; - if (select == 'M') return std::numeric_limits::min_exponent; + if (select == 'M') return std::numeric_limits::min_exponent; - if (select == 'U') return min; + if (select == 'U') return min; - if (select == 'L') return std::numeric_limits::max_exponent; + if (select == 'L') return std::numeric_limits::max_exponent; - if (select == 'O') return max; + if (select == 'O') return max; - return 0.0; + return 0.0; } } diff --git a/lib/linalg/static/lsame.cpp b/lib/linalg/static/lsame.cpp index dcb89e3d00..480ae93bc9 100644 --- a/lib/linalg/static/lsame.cpp +++ b/lib/linalg/static/lsame.cpp @@ -7,11 +7,11 @@ extern "C" { logical lsame_(const char *a, const char *b) { - char ua, ub; - if (!a || !b) return FALSE_; + char ua, ub; + if (!a || !b) return FALSE_; - ua = toupper(*a); - ub = toupper(*b); - return (ua == ub) ? TRUE_ : FALSE_; + ua = toupper(*a); + ub = toupper(*b); + return (ua == ub) ? TRUE_ : FALSE_; } } diff --git a/lib/linalg/static/pow_lmp_di.cpp b/lib/linalg/static/pow_lmp_di.cpp index 9c3d89d536..83a0da1a87 100644 --- a/lib/linalg/static/pow_lmp_di.cpp +++ b/lib/linalg/static/pow_lmp_di.cpp @@ -10,8 +10,8 @@ double pow_lmp_di(doublereal *ap, integer *bp) unsigned long u; pow = 1; - x = *ap; - n = *bp; + x = *ap; + n = *bp; if (n != 0) { if (n < 0) { diff --git a/lib/linalg/static/s_lmp_cmp.cpp b/lib/linalg/static/s_lmp_cmp.cpp index b51817defa..73b011a799 100644 --- a/lib/linalg/static/s_lmp_cmp.cpp +++ b/lib/linalg/static/s_lmp_cmp.cpp @@ -8,8 +8,8 @@ extern "C" { integer s_lmp_cmp(char *a0, char *b0, ftnlen la, ftnlen lb) { register unsigned char *a, *aend, *b, *bend; - a = (unsigned char *)a0; - b = (unsigned char *)b0; + a = (unsigned char *)a0; + b = (unsigned char *)b0; aend = a + la; bend = b + lb; diff --git a/lib/linalg/static/xerbla.cpp b/lib/linalg/static/xerbla.cpp index 325bd7030d..6346126c67 100644 --- a/lib/linalg/static/xerbla.cpp +++ b/lib/linalg/static/xerbla.cpp @@ -24,7 +24,7 @@ integer xerbla_(const char *srname, integer *info) buf[i + 16] = srname[i]; } int len = strlen(buf); - snprintf(buf+len, BUFSZ-len, " parameter number %d had an illegal value\n", *info); + snprintf(buf + len, BUFSZ - len, " parameter number %d had an illegal value\n", *info); exit(1); return 0; } diff --git a/lib/linalg/static/z_lmp_div.cpp b/lib/linalg/static/z_lmp_div.cpp index 5f742506da..66218f8fc8 100644 --- a/lib/linalg/static/z_lmp_div.cpp +++ b/lib/linalg/static/z_lmp_div.cpp @@ -17,14 +17,14 @@ void z_lmp_div(doublecomplex *c, doublecomplex *a, doublecomplex *b) return; } ratio = b->r / b->i; - den = b->i * (1 + ratio * ratio); - cr = (a->r * ratio + a->i) / den; - c->i = (a->i * ratio - a->r) / den; + den = b->i * (1 + ratio * ratio); + cr = (a->r * ratio + a->i) / den; + c->i = (a->i * ratio - a->r) / den; } else { ratio = b->i / b->r; - den = b->r * (1 + ratio * ratio); - cr = (a->r + a->i * ratio) / den; - c->i = (a->i - a->r * ratio) / den; + den = b->r * (1 + ratio * ratio); + cr = (a->r + a->i * ratio) / den; + c->i = (a->i - a->r * ratio) / den; } c->r = cr; } diff --git a/lib/linalg/whitespace.conf b/lib/linalg/whitespace.conf deleted file mode 100644 index 7988edc506..0000000000 --- a/lib/linalg/whitespace.conf +++ /dev/null @@ -1,13 +0,0 @@ ---- -recursive: false -include: - - "." - - "static/**" -exclude: - - "Makefile.*" - - "*.py" -patterns: - - "*.cpp" - - "*.h" - - "README" -... diff --git a/lib/linalg/xerbla.cpp b/lib/linalg/xerbla.cpp index 325bd7030d..6346126c67 100644 --- a/lib/linalg/xerbla.cpp +++ b/lib/linalg/xerbla.cpp @@ -24,7 +24,7 @@ integer xerbla_(const char *srname, integer *info) buf[i + 16] = srname[i]; } int len = strlen(buf); - snprintf(buf+len, BUFSZ-len, " parameter number %d had an illegal value\n", *info); + snprintf(buf + len, BUFSZ - len, " parameter number %d had an illegal value\n", *info); exit(1); return 0; } diff --git a/lib/linalg/z_lmp_div.cpp b/lib/linalg/z_lmp_div.cpp index 5f742506da..66218f8fc8 100644 --- a/lib/linalg/z_lmp_div.cpp +++ b/lib/linalg/z_lmp_div.cpp @@ -17,14 +17,14 @@ void z_lmp_div(doublecomplex *c, doublecomplex *a, doublecomplex *b) return; } ratio = b->r / b->i; - den = b->i * (1 + ratio * ratio); - cr = (a->r * ratio + a->i) / den; - c->i = (a->i * ratio - a->r) / den; + den = b->i * (1 + ratio * ratio); + cr = (a->r * ratio + a->i) / den; + c->i = (a->i * ratio - a->r) / den; } else { ratio = b->i / b->r; - den = b->r * (1 + ratio * ratio); - cr = (a->r + a->i * ratio) / den; - c->i = (a->i - a->r * ratio) / den; + den = b->r * (1 + ratio * ratio); + cr = (a->r + a->i * ratio) / den; + c->i = (a->i - a->r * ratio) / den; } c->r = cr; } diff --git a/lib/linalg/zaxpy.cpp b/lib/linalg/zaxpy.cpp index 6939872757..13c4e819db 100644 --- a/lib/linalg/zaxpy.cpp +++ b/lib/linalg/zaxpy.cpp @@ -1,138 +1,16 @@ -/* fortran/zaxpy.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZAXPY */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZAXPY(N,ZA,ZX,INCX,ZY,INCY) */ - -/* .. Scalar Arguments .. */ -/* COMPLEX*16 ZA */ -/* INTEGER INCX,INCY,N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 ZX(*),ZY(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZAXPY constant times a vector plus a vector. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ZA */ -/* > \verbatim */ -/* > ZA is COMPLEX*16 */ -/* > On entry, ZA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ZX */ -/* > \verbatim */ -/* > ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of ZX */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] ZY */ -/* > \verbatim */ -/* > ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > storage spacing between elements of ZY */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, 3/11/78. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zaxpy_(integer *n, doublecomplex *za, doublecomplex *zx, - integer *incx, doublecomplex *zy, integer *incy) +int zaxpy_(integer *n, doublecomplex *za, doublecomplex *zx, integer *incx, doublecomplex *zy, + integer *incy) { - /* System generated locals */ integer i__1, i__2, i__3, i__4; doublecomplex z__1, z__2; - - /* Local variables */ integer i__, ix, iy; extern doublereal dcabs1_(doublecomplex *); - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ - /* Parameter adjustments */ --zy; --zx; - - /* Function Body */ if (*n <= 0) { return 0; } @@ -140,24 +18,17 @@ extern "C" { return 0; } if (*incx == 1 && *incy == 1) { - -/* code for both increments equal to 1 */ - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__; i__3 = i__; i__4 = i__; - z__2.r = za->r * zx[i__4].r - za->i * zx[i__4].i, z__2.i = za->r * - zx[i__4].i + za->i * zx[i__4].r; + z__2.r = za->r * zx[i__4].r - za->i * zx[i__4].i, + z__2.i = za->r * zx[i__4].i + za->i * zx[i__4].r; z__1.r = zy[i__3].r + z__2.r, z__1.i = zy[i__3].i + z__2.i; zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; } } else { - -/* code for unequal increments or equal increments */ -/* not equal to 1 */ - ix = 1; iy = 1; if (*incx < 0) { @@ -171,21 +42,16 @@ extern "C" { i__2 = iy; i__3 = iy; i__4 = ix; - z__2.r = za->r * zx[i__4].r - za->i * zx[i__4].i, z__2.i = za->r * - zx[i__4].i + za->i * zx[i__4].r; + z__2.r = za->r * zx[i__4].r - za->i * zx[i__4].i, + z__2.i = za->r * zx[i__4].i + za->i * zx[i__4].r; z__1.r = zy[i__3].r + z__2.r, z__1.i = zy[i__3].i + z__2.i; zy[i__2].r = z__1.r, zy[i__2].i = z__1.i; ix += *incx; iy += *incy; } } - return 0; - -/* End of ZAXPY */ - -} /* zaxpy_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zcopy.cpp b/lib/linalg/zcopy.cpp index 97d1250228..4ec6ae0b78 100644 --- a/lib/linalg/zcopy.cpp +++ b/lib/linalg/zcopy.cpp @@ -1,134 +1,17 @@ -/* fortran/zcopy.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZCOPY */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZCOPY(N,ZX,INCX,ZY,INCY) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,INCY,N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 ZX(*),ZY(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZCOPY copies a vector, x, to a vector, y. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ZX */ -/* > \verbatim */ -/* > ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of ZX */ -/* > \endverbatim */ -/* > */ -/* > \param[out] ZY */ -/* > \verbatim */ -/* > ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > storage spacing between elements of ZY */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, linpack, 4/11/78. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zcopy_(integer *n, doublecomplex *zx, integer *incx, - doublecomplex *zy, integer *incy) +int zcopy_(integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy) { - /* System generated locals */ integer i__1, i__2, i__3; - - /* Local variables */ integer i__, ix, iy; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ - /* Parameter adjustments */ --zy; --zx; - - /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { - -/* code for both increments equal to 1 */ - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__; @@ -136,10 +19,6 @@ extern "C" { zy[i__2].r = zx[i__3].r, zy[i__2].i = zx[i__3].i; } } else { - -/* code for unequal increments or equal increments */ -/* not equal to 1 */ - ix = 1; iy = 1; if (*incx < 0) { @@ -158,11 +37,7 @@ extern "C" { } } return 0; - -/* End of ZCOPY */ - -} /* zcopy_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zdotc.cpp b/lib/linalg/zdotc.cpp index 2697cc1c2c..0bf457ed45 100644 --- a/lib/linalg/zdotc.cpp +++ b/lib/linalg/zdotc.cpp @@ -1,159 +1,33 @@ -/* fortran/zdotc.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZDOTC */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* COMPLEX*16 FUNCTION ZDOTC(N,ZX,INCX,ZY,INCY) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,INCY,N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 ZX(*),ZY(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZDOTC forms the dot product of two complex vectors */ -/* > ZDOTC = X^H * Y */ -/* > */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ZX */ -/* > \verbatim */ -/* > ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of ZX */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ZY */ -/* > \verbatim */ -/* > ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > storage spacing between elements of ZY */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, 3/11/78. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Double Complex */ VOID zdotc_(doublecomplex * ret_val, integer *n, - doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy) +VOID zdotc_(doublecomplex *ret_val, integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, + integer *incy) { - /* System generated locals */ integer i__1, i__2; doublecomplex z__1, z__2, z__3; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, ix, iy; doublecomplex ztemp; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - /* Parameter adjustments */ --zy; --zx; - - /* Function Body */ ztemp.r = 0., ztemp.i = 0.; - ret_val->r = 0., ret_val->i = 0.; + ret_val->r = 0., ret_val->i = 0.; if (*n <= 0) { - return ; + return; } if (*incx == 1 && *incy == 1) { - -/* code for both increments equal to 1 */ - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d_lmp_cnjg(&z__3, &zx[i__]); i__2 = i__; - z__2.r = z__3.r * zy[i__2].r - z__3.i * zy[i__2].i, z__2.i = - z__3.r * zy[i__2].i + z__3.i * zy[i__2].r; + z__2.r = z__3.r * zy[i__2].r - z__3.i * zy[i__2].i, + z__2.i = z__3.r * zy[i__2].i + z__3.i * zy[i__2].r; z__1.r = ztemp.r + z__2.r, z__1.i = ztemp.i + z__2.i; ztemp.r = z__1.r, ztemp.i = z__1.i; } } else { - -/* code for unequal increments or equal increments */ -/* not equal to 1 */ - ix = 1; iy = 1; if (*incx < 0) { @@ -166,21 +40,17 @@ extern "C" { for (i__ = 1; i__ <= i__1; ++i__) { d_lmp_cnjg(&z__3, &zx[ix]); i__2 = iy; - z__2.r = z__3.r * zy[i__2].r - z__3.i * zy[i__2].i, z__2.i = - z__3.r * zy[i__2].i + z__3.i * zy[i__2].r; + z__2.r = z__3.r * zy[i__2].r - z__3.i * zy[i__2].i, + z__2.i = z__3.r * zy[i__2].i + z__3.i * zy[i__2].r; z__1.r = ztemp.r + z__2.r, z__1.i = ztemp.i + z__2.i; ztemp.r = z__1.r, ztemp.i = z__1.i; ix += *incx; iy += *incy; } } - ret_val->r = ztemp.r, ret_val->i = ztemp.i; - return ; - -/* End of ZDOTC */ - -} /* zdotc_ */ - + ret_val->r = ztemp.r, ret_val->i = ztemp.i; + return; +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zdrot.cpp b/lib/linalg/zdrot.cpp index e4c66f5480..fb9cc8995f 100644 --- a/lib/linalg/zdrot.cpp +++ b/lib/linalg/zdrot.cpp @@ -1,155 +1,20 @@ -/* fortran/zdrot.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZDROT */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZDROT( N, ZX, INCX, ZY, INCY, C, S ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX, INCY, N */ -/* DOUBLE PRECISION C, S */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 ZX( * ), ZY( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Applies a plane rotation, where the cos and sin (c and s) are real */ -/* > and the vectors cx and cy are complex. */ -/* > jack dongarra, linpack, 3/11/78. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the vectors cx and cy. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] ZX */ -/* > \verbatim */ -/* > ZX is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( N - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array ZX must contain the n */ -/* > element vector cx. On exit, ZX is overwritten by the updated */ -/* > vector cx. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > ZX. INCX must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] ZY */ -/* > \verbatim */ -/* > ZY is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( N - 1 )*abs( INCY ) ). */ -/* > Before entry, the incremented array ZY must contain the n */ -/* > element vector cy. On exit, ZY is overwritten by the updated */ -/* > vector cy. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > On entry, INCY specifies the increment for the elements of */ -/* > ZY. INCY must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION */ -/* > On entry, C specifies the cosine, cos. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION */ -/* > On entry, S specifies the sine, sin. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level1 */ - -/* ===================================================================== */ -/* Subroutine */ int zdrot_(integer *n, doublecomplex *zx, integer *incx, - doublecomplex *zy, integer *incy, doublereal *c__, doublereal *s) +int zdrot_(integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy, + doublereal *c__, doublereal *s) { - /* System generated locals */ integer i__1, i__2, i__3, i__4; doublecomplex z__1, z__2, z__3; - - /* Local variables */ integer i__, ix, iy; doublecomplex ctemp; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --zy; --zx; - - /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { - -/* code for both increments equal to 1 */ - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__; @@ -169,10 +34,6 @@ extern "C" { zx[i__2].r = ctemp.r, zx[i__2].i = ctemp.i; } } else { - -/* code for unequal increments or equal increments not equal */ -/* to 1 */ - ix = 1; iy = 1; if (*incx < 0) { @@ -203,11 +64,7 @@ extern "C" { } } return 0; - -/* End of ZDROT */ - -} /* zdrot_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zdscal.cpp b/lib/linalg/zdscal.cpp index ebe50c247d..d9b2773739 100644 --- a/lib/linalg/zdscal.cpp +++ b/lib/linalg/zdscal.cpp @@ -1,138 +1,19 @@ -/* fortran/zdscal.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZDSCAL */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZDSCAL(N,DA,ZX,INCX) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION DA */ -/* INTEGER INCX,N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 ZX(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZDSCAL scales a vector by a constant. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DA */ -/* > \verbatim */ -/* > DA is DOUBLE PRECISION */ -/* > On entry, DA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] ZX */ -/* > \verbatim */ -/* > ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of ZX */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, 3/11/78. */ -/* > modified 3/93 to return if incx .le. 0. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zdscal_(integer *n, doublereal *da, doublecomplex *zx, - integer *incx) +int zdscal_(integer *n, doublereal *da, doublecomplex *zx, integer *incx) { - /* System generated locals */ integer i__1, i__2, i__3, i__4; doublereal d__1, d__2; doublecomplex z__1; - - /* Builtin functions */ double d_lmp_imag(doublecomplex *); - - /* Local variables */ integer i__, nincx; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. Parameters .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - /* Parameter adjustments */ --zx; - - /* Function Body */ if (*n <= 0 || *incx <= 0 || *da == 1.) { return 0; } if (*incx == 1) { - -/* code for increment equal to 1 */ - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__; @@ -143,9 +24,6 @@ extern "C" { zx[i__2].r = z__1.r, zx[i__2].i = z__1.i; } } else { - -/* code for increment not equal to 1 */ - nincx = *n * *incx; i__1 = nincx; i__2 = *incx; @@ -159,11 +37,7 @@ extern "C" { } } return 0; - -/* End of ZDSCAL */ - -} /* zdscal_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zgemm.cpp b/lib/linalg/zgemm.cpp index c49b0a4e57..75c72106ef 100644 --- a/lib/linalg/zgemm.cpp +++ b/lib/linalg/zgemm.cpp @@ -1,256 +1,22 @@ -/* fortran/zgemm.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZGEMM */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) */ - -/* .. Scalar Arguments .. */ -/* COMPLEX*16 ALPHA,BETA */ -/* INTEGER K,LDA,LDB,LDC,M,N */ -/* CHARACTER TRANSA,TRANSB */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZGEMM performs one of the matrix-matrix operations */ -/* > */ -/* > C := alpha*op( A )*op( B ) + beta*C, */ -/* > */ -/* > where op( X ) is one of */ -/* > */ -/* > op( X ) = X or op( X ) = X**T or op( X ) = X**H, */ -/* > */ -/* > alpha and beta are scalars, and A, B and C are matrices, with op( A ) */ -/* > an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] TRANSA */ -/* > \verbatim */ -/* > TRANSA is CHARACTER*1 */ -/* > On entry, TRANSA specifies the form of op( A ) to be used in */ -/* > the matrix multiplication as follows: */ -/* > */ -/* > TRANSA = 'N' or 'n', op( A ) = A. */ -/* > */ -/* > TRANSA = 'T' or 't', op( A ) = A**T. */ -/* > */ -/* > TRANSA = 'C' or 'c', op( A ) = A**H. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANSB */ -/* > \verbatim */ -/* > TRANSB is CHARACTER*1 */ -/* > On entry, TRANSB specifies the form of op( B ) to be used in */ -/* > the matrix multiplication as follows: */ -/* > */ -/* > TRANSB = 'N' or 'n', op( B ) = B. */ -/* > */ -/* > TRANSB = 'T' or 't', op( B ) = B**T. */ -/* > */ -/* > TRANSB = 'C' or 'c', op( B ) = B**H. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > On entry, M specifies the number of rows of the matrix */ -/* > op( A ) and of the matrix C. M must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the number of columns of the matrix */ -/* > op( B ) and the number of columns of the matrix C. N must be */ -/* > at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > On entry, K specifies the number of columns of the matrix */ -/* > op( A ) and the number of rows of the matrix op( B ). K must */ -/* > be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is COMPLEX*16 */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension ( LDA, ka ), where ka is */ -/* > k when TRANSA = 'N' or 'n', and is m otherwise. */ -/* > Before entry with TRANSA = 'N' or 'n', the leading m by k */ -/* > part of the array A must contain the matrix A, otherwise */ -/* > the leading k by m part of the array A must contain the */ -/* > matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. When TRANSA = 'N' or 'n' then */ -/* > LDA must be at least max( 1, m ), otherwise LDA must be at */ -/* > least max( 1, k ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] B */ -/* > \verbatim */ -/* > B is COMPLEX*16 array, dimension ( LDB, kb ), where kb is */ -/* > n when TRANSB = 'N' or 'n', and is k otherwise. */ -/* > Before entry with TRANSB = 'N' or 'n', the leading k by n */ -/* > part of the array B must contain the matrix B, otherwise */ -/* > the leading n by k part of the array B must contain the */ -/* > matrix B. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > On entry, LDB specifies the first dimension of B as declared */ -/* > in the calling (sub) program. When TRANSB = 'N' or 'n' then */ -/* > LDB must be at least max( 1, k ), otherwise LDB must be at */ -/* > least max( 1, n ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is COMPLEX*16 */ -/* > On entry, BETA specifies the scalar beta. When BETA is */ -/* > supplied as zero then C need not be set on input. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is COMPLEX*16 array, dimension ( LDC, N ) */ -/* > Before entry, the leading m by n part of the array C must */ -/* > contain the matrix C, except when beta is zero, in which */ -/* > case C need not be set on entry. */ -/* > On exit, the array C is overwritten by the m by n matrix */ -/* > ( alpha*op( A )*op( B ) + beta*C ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > On entry, LDC specifies the first dimension of C as declared */ -/* > in the calling (sub) program. LDC must be at least */ -/* > max( 1, m ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level3 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 3 Blas routine. */ -/* > */ -/* > -- Written on 8-February-1989. */ -/* > Jack Dongarra, Argonne National Laboratory. */ -/* > Iain Duff, AERE Harwell. */ -/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ -/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zgemm_(char *transa, char *transb, integer *m, integer * - n, integer *k, doublecomplex *alpha, doublecomplex *a, integer *lda, - doublecomplex *b, integer *ldb, doublecomplex *beta, doublecomplex * - c__, integer *ldc, ftnlen transa_len, ftnlen transb_len) +int zgemm_(char *transa, char *transb, integer *m, integer *n, integer *k, doublecomplex *alpha, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, doublecomplex *beta, + doublecomplex *c__, integer *ldc, ftnlen transa_len, ftnlen transb_len) { - /* System generated locals */ - integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, - i__3, i__4, i__5, i__6; + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3, i__4, i__5, + i__6; doublecomplex z__1, z__2, z__3, z__4; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j, l, info; logical nota, notb; doublecomplex temp; logical conja, conjb; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nrowa, nrowb; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level3 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Parameters .. */ -/* .. */ - -/* Set NOTA and NOTB as true if A and B respectively are not */ -/* conjugated or transposed, set CONJA and CONJB as true if A and */ -/* B respectively are to be transposed but not conjugated and set */ -/* NROWA and NROWB as the number of rows of A and B respectively. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -260,8 +26,6 @@ extern "C" { c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; - - /* Function Body */ nota = lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1); notb = lsame_(transb, (char *)"N", (ftnlen)1, (ftnlen)1); conja = lsame_(transa, (char *)"C", (ftnlen)1, (ftnlen)1); @@ -276,14 +40,10 @@ extern "C" { } else { nrowb = *n; } - -/* Test the input parameters. */ - info = 0; - if (! nota && ! conja && ! lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1)) { + if (!nota && !conja && !lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! notb && ! conjb && ! lsame_(transb, (char *)"T", (ftnlen)1, (ftnlen) - 1)) { + } else if (!notb && !conjb && !lsame_(transb, (char *)"T", (ftnlen)1, (ftnlen)1)) { info = 2; } else if (*m < 0) { info = 3; @@ -291,27 +51,21 @@ extern "C" { info = 4; } else if (*k < 0) { info = 5; - } else if (*lda < max(1,nrowa)) { + } else if (*lda < max(1, nrowa)) { info = 8; - } else if (*ldb < max(1,nrowb)) { + } else if (*ldb < max(1, nrowb)) { info = 10; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { info = 13; } if (info != 0) { xerbla_((char *)"ZGEMM ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - - if (*m == 0 || *n == 0 || (alpha->r == 0. && alpha->i == 0. || *k == 0) && - (beta->r == 1. && beta->i == 0.)) { + if (*m == 0 || *n == 0 || + (alpha->r == 0. && alpha->i == 0. || *k == 0) && (beta->r == 1. && beta->i == 0.)) { return 0; } - -/* And when alpha.eq.zero. */ - if (alpha->r == 0. && alpha->i == 0.) { if (beta->r == 0. && beta->i == 0.) { i__1 = *n; @@ -320,9 +74,7 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; c__[i__3].r = 0., c__[i__3].i = 0.; -/* L10: */ } -/* L20: */ } } else { i__1 = *n; @@ -332,24 +84,15 @@ extern "C" { i__3 = i__ + j * c_dim1; i__4 = i__ + j * c_dim1; z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, - z__1.i = beta->r * c__[i__4].i + beta->i * c__[ - i__4].r; + z__1.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L30: */ } -/* L40: */ } } return 0; } - -/* Start the operations. */ - if (notb) { if (nota) { - -/* Form C := alpha*A*B + beta*C. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { if (beta->r == 0. && beta->i == 0.) { @@ -357,26 +100,22 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; c__[i__3].r = 0., c__[i__3].i = 0.; -/* L50: */ } } else if (beta->r != 1. || beta->i != 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; i__4 = i__ + j * c_dim1; - z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__1.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; + z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__1.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L60: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { i__3 = l + j * b_dim1; z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, - z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3] - .r; + z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3].r; temp.r = z__1.r, temp.i = z__1.i; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { @@ -384,21 +123,13 @@ extern "C" { i__5 = i__ + j * c_dim1; i__6 = i__ + l * a_dim1; z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, - z__2.i = temp.r * a[i__6].i + temp.i * a[i__6] - .r; - z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + - z__2.i; + z__2.i = temp.r * a[i__6].i + temp.i * a[i__6].r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + z__2.i; c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; -/* L70: */ } -/* L80: */ } -/* L90: */ } } else if (conja) { - -/* Form C := alpha*A**H*B + beta*C. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -409,38 +140,28 @@ extern "C" { d_lmp_cnjg(&z__3, &a[l + i__ * a_dim1]); i__4 = l + j * b_dim1; z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, - z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] - .r; + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4].r; z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L100: */ } if (beta->r == 0. && beta->i == 0.) { i__3 = i__ + j * c_dim1; z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; + z__1.i = alpha->r * temp.i + alpha->i * temp.r; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } else { i__3 = i__ + j * c_dim1; z__2.r = alpha->r * temp.r - alpha->i * temp.i, - z__2.i = alpha->r * temp.i + alpha->i * - temp.r; + z__2.i = alpha->r * temp.i + alpha->i * temp.r; i__4 = i__ + j * c_dim1; - z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__3.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__3.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } -/* L110: */ } -/* L120: */ } } else { - -/* Form C := alpha*A**T*B + beta*C */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -450,41 +171,31 @@ extern "C" { for (l = 1; l <= i__3; ++l) { i__4 = l + i__ * a_dim1; i__5 = l + j * b_dim1; - z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * b[i__5] - .i, z__2.i = a[i__4].r * b[i__5].i + a[i__4] - .i * b[i__5].r; + z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * b[i__5].i, + z__2.i = a[i__4].r * b[i__5].i + a[i__4].i * b[i__5].r; z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L130: */ } if (beta->r == 0. && beta->i == 0.) { i__3 = i__ + j * c_dim1; z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; + z__1.i = alpha->r * temp.i + alpha->i * temp.r; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } else { i__3 = i__ + j * c_dim1; z__2.r = alpha->r * temp.r - alpha->i * temp.i, - z__2.i = alpha->r * temp.i + alpha->i * - temp.r; + z__2.i = alpha->r * temp.i + alpha->i * temp.r; i__4 = i__ + j * c_dim1; - z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__3.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__3.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } -/* L140: */ } -/* L150: */ } } } else if (nota) { if (conjb) { - -/* Form C := alpha*A*B**H + beta*C. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { if (beta->r == 0. && beta->i == 0.) { @@ -492,25 +203,22 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; c__[i__3].r = 0., c__[i__3].i = 0.; -/* L160: */ } } else if (beta->r != 1. || beta->i != 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; i__4 = i__ + j * c_dim1; - z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__1.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; + z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__1.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L170: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { d_lmp_cnjg(&z__2, &b[j + l * b_dim1]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { @@ -518,21 +226,13 @@ extern "C" { i__5 = i__ + j * c_dim1; i__6 = i__ + l * a_dim1; z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, - z__2.i = temp.r * a[i__6].i + temp.i * a[i__6] - .r; - z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + - z__2.i; + z__2.i = temp.r * a[i__6].i + temp.i * a[i__6].r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + z__2.i; c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; -/* L180: */ } -/* L190: */ } -/* L200: */ } } else { - -/* Form C := alpha*A*B**T + beta*C */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { if (beta->r == 0. && beta->i == 0.) { @@ -540,26 +240,22 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; c__[i__3].r = 0., c__[i__3].i = 0.; -/* L210: */ } } else if (beta->r != 1. || beta->i != 0.) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; i__4 = i__ + j * c_dim1; - z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__1.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; + z__1.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__1.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L220: */ } } i__2 = *k; for (l = 1; l <= i__2; ++l) { i__3 = j + l * b_dim1; z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, - z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3] - .r; + z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3].r; temp.r = z__1.r, temp.i = z__1.i; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { @@ -567,23 +263,15 @@ extern "C" { i__5 = i__ + j * c_dim1; i__6 = i__ + l * a_dim1; z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, - z__2.i = temp.r * a[i__6].i + temp.i * a[i__6] - .r; - z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + - z__2.i; + z__2.i = temp.r * a[i__6].i + temp.i * a[i__6].r; + z__1.r = c__[i__5].r + z__2.r, z__1.i = c__[i__5].i + z__2.i; c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; -/* L230: */ } -/* L240: */ } -/* L250: */ } } } else if (conja) { if (conjb) { - -/* Form C := alpha*A**H*B**H + beta*C. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -593,38 +281,29 @@ extern "C" { for (l = 1; l <= i__3; ++l) { d_lmp_cnjg(&z__3, &a[l + i__ * a_dim1]); d_lmp_cnjg(&z__4, &b[j + l * b_dim1]); - z__2.r = z__3.r * z__4.r - z__3.i * z__4.i, z__2.i = - z__3.r * z__4.i + z__3.i * z__4.r; + z__2.r = z__3.r * z__4.r - z__3.i * z__4.i, + z__2.i = z__3.r * z__4.i + z__3.i * z__4.r; z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L260: */ } if (beta->r == 0. && beta->i == 0.) { i__3 = i__ + j * c_dim1; z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; + z__1.i = alpha->r * temp.i + alpha->i * temp.r; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } else { i__3 = i__ + j * c_dim1; z__2.r = alpha->r * temp.r - alpha->i * temp.i, - z__2.i = alpha->r * temp.i + alpha->i * - temp.r; + z__2.i = alpha->r * temp.i + alpha->i * temp.r; i__4 = i__ + j * c_dim1; - z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__3.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__3.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } -/* L270: */ } -/* L280: */ } } else { - -/* Form C := alpha*A**H*B**T + beta*C */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -635,40 +314,30 @@ extern "C" { d_lmp_cnjg(&z__3, &a[l + i__ * a_dim1]); i__4 = j + l * b_dim1; z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, - z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] - .r; + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4].r; z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L290: */ } if (beta->r == 0. && beta->i == 0.) { i__3 = i__ + j * c_dim1; z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; + z__1.i = alpha->r * temp.i + alpha->i * temp.r; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } else { i__3 = i__ + j * c_dim1; z__2.r = alpha->r * temp.r - alpha->i * temp.i, - z__2.i = alpha->r * temp.i + alpha->i * - temp.r; + z__2.i = alpha->r * temp.i + alpha->i * temp.r; i__4 = i__ + j * c_dim1; - z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__3.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__3.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } -/* L300: */ } -/* L310: */ } } } else { if (conjb) { - -/* Form C := alpha*A**T*B**H + beta*C */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -679,38 +348,28 @@ extern "C" { i__4 = l + i__ * a_dim1; d_lmp_cnjg(&z__3, &b[j + l * b_dim1]); z__2.r = a[i__4].r * z__3.r - a[i__4].i * z__3.i, - z__2.i = a[i__4].r * z__3.i + a[i__4].i * - z__3.r; + z__2.i = a[i__4].r * z__3.i + a[i__4].i * z__3.r; z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L320: */ } if (beta->r == 0. && beta->i == 0.) { i__3 = i__ + j * c_dim1; z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; + z__1.i = alpha->r * temp.i + alpha->i * temp.r; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } else { i__3 = i__ + j * c_dim1; z__2.r = alpha->r * temp.r - alpha->i * temp.i, - z__2.i = alpha->r * temp.i + alpha->i * - temp.r; + z__2.i = alpha->r * temp.i + alpha->i * temp.r; i__4 = i__ + j * c_dim1; - z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__3.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__3.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } -/* L330: */ } -/* L340: */ } } else { - -/* Form C := alpha*A**T*B**T + beta*C */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -720,44 +379,32 @@ extern "C" { for (l = 1; l <= i__3; ++l) { i__4 = l + i__ * a_dim1; i__5 = j + l * b_dim1; - z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * b[i__5] - .i, z__2.i = a[i__4].r * b[i__5].i + a[i__4] - .i * b[i__5].r; + z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * b[i__5].i, + z__2.i = a[i__4].r * b[i__5].i + a[i__4].i * b[i__5].r; z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L350: */ } if (beta->r == 0. && beta->i == 0.) { i__3 = i__ + j * c_dim1; z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; + z__1.i = alpha->r * temp.i + alpha->i * temp.r; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } else { i__3 = i__ + j * c_dim1; z__2.r = alpha->r * temp.r - alpha->i * temp.i, - z__2.i = alpha->r * temp.i + alpha->i * - temp.r; + z__2.i = alpha->r * temp.i + alpha->i * temp.r; i__4 = i__ + j * c_dim1; - z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4] - .i, z__3.i = beta->r * c__[i__4].i + beta->i * - c__[i__4].r; + z__3.r = beta->r * c__[i__4].r - beta->i * c__[i__4].i, + z__3.i = beta->r * c__[i__4].i + beta->i * c__[i__4].r; z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } -/* L360: */ } -/* L370: */ } } } - return 0; - -/* End of ZGEMM */ - -} /* zgemm_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zgemv.cpp b/lib/linalg/zgemv.cpp index 68736014b7..ddf5377740 100644 --- a/lib/linalg/zgemv.cpp +++ b/lib/linalg/zgemv.cpp @@ -1,239 +1,34 @@ -/* fortran/zgemv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZGEMV */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) */ - -/* .. Scalar Arguments .. */ -/* COMPLEX*16 ALPHA,BETA */ -/* INTEGER INCX,INCY,LDA,M,N */ -/* CHARACTER TRANS */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A(LDA,*),X(*),Y(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZGEMV performs one of the matrix-vector operations */ -/* > */ -/* > y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y, or */ -/* > */ -/* > y := alpha*A**H*x + beta*y, */ -/* > */ -/* > where alpha and beta are scalars, x and y are vectors and A is an */ -/* > m by n matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > On entry, TRANS specifies the operation to be performed as */ -/* > follows: */ -/* > */ -/* > TRANS = 'N' or 'n' y := alpha*A*x + beta*y. */ -/* > */ -/* > TRANS = 'T' or 't' y := alpha*A**T*x + beta*y. */ -/* > */ -/* > TRANS = 'C' or 'c' y := alpha*A**H*x + beta*y. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > On entry, M specifies the number of rows of the matrix A. */ -/* > M must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the number of columns of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is COMPLEX*16 */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension ( LDA, N ) */ -/* > Before entry, the leading m by n part of the array A must */ -/* > contain the matrix of coefficients. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. LDA must be at least */ -/* > max( 1, m ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' */ -/* > and at least */ -/* > ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. */ -/* > Before entry, the incremented array X must contain the */ -/* > vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is COMPLEX*16 */ -/* > On entry, BETA specifies the scalar beta. When BETA is */ -/* > supplied as zero then Y need not be set on input. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Y */ -/* > \verbatim */ -/* > Y is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' */ -/* > and at least */ -/* > ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. */ -/* > Before entry with BETA non-zero, the incremented array Y */ -/* > must contain the vector y. On exit, Y is overwritten by the */ -/* > updated vector y. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > On entry, INCY specifies the increment for the elements of */ -/* > Y. INCY must not be zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zgemv_(char *trans, integer *m, integer *n, - doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * - x, integer *incx, doublecomplex *beta, doublecomplex *y, integer * - incy, ftnlen trans_len) +int zgemv_(char *trans, integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, + integer *lda, doublecomplex *x, integer *incx, doublecomplex *beta, doublecomplex *y, + integer *incy, ftnlen trans_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; doublecomplex z__1, z__2, z__3; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; doublecomplex temp; integer lenx, leny; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); logical noconj; - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --y; - - /* Function Body */ info = 0; - if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"T", ( - ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1) - ) { + if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 1; } else if (*m < 0) { info = 2; } else if (*n < 0) { info = 3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { info = 6; } else if (*incx == 0) { info = 8; @@ -244,19 +39,11 @@ extern "C" { xerbla_((char *)"ZGEMV ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - - if (*m == 0 || *n == 0 || alpha->r == 0. && alpha->i == 0. && (beta->r == - 1. && beta->i == 0.)) { + if (*m == 0 || *n == 0 || + alpha->r == 0. && alpha->i == 0. && (beta->r == 1. && beta->i == 0.)) { return 0; } - noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); - -/* Set LENX and LENY, the lengths of the vectors x and y, and set */ -/* up the start points in X and Y. */ - if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { lenx = *n; leny = *m; @@ -274,12 +61,6 @@ extern "C" { } else { ky = 1 - (leny - 1) * *incy; } - -/* Start the operations. In this version the elements of A are */ -/* accessed sequentially with one pass through A. */ - -/* First form y := beta*y. */ - if (beta->r != 1. || beta->i != 0.) { if (*incy == 1) { if (beta->r == 0. && beta->i == 0.) { @@ -287,7 +68,6 @@ extern "C" { for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__; y[i__2].r = 0., y[i__2].i = 0.; -/* L10: */ } } else { i__1 = leny; @@ -295,10 +75,8 @@ extern "C" { i__2 = i__; i__3 = i__; z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, - z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] - .r; + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3].r; y[i__2].r = z__1.r, y[i__2].i = z__1.i; -/* L20: */ } } } else { @@ -309,7 +87,6 @@ extern "C" { i__2 = iy; y[i__2].r = 0., y[i__2].i = 0.; iy += *incy; -/* L30: */ } } else { i__1 = leny; @@ -317,11 +94,9 @@ extern "C" { i__2 = iy; i__3 = iy; z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, - z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] - .r; + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3].r; y[i__2].r = z__1.r, y[i__2].i = z__1.i; iy += *incy; -/* L40: */ } } } @@ -330,37 +105,32 @@ extern "C" { return 0; } if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form y := alpha*A*x + y. */ - jx = kx; if (*incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = jx; - z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = - alpha->r * x[i__2].i + alpha->i * x[i__2].r; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; temp.r = z__1.r, temp.i = z__1.i; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__; i__4 = i__; i__5 = i__ + j * a_dim1; - z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, z__2.i = - temp.r * a[i__5].i + temp.i * a[i__5].r; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, + z__2.i = temp.r * a[i__5].i + temp.i * a[i__5].r; z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; y[i__3].r = z__1.r, y[i__3].i = z__1.i; -/* L50: */ } jx += *incx; -/* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = jx; - z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = - alpha->r * x[i__2].i + alpha->i * x[i__2].r; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; temp.r = z__1.r, temp.i = z__1.i; iy = ky; i__2 = *m; @@ -368,21 +138,16 @@ extern "C" { i__3 = iy; i__4 = iy; i__5 = i__ + j * a_dim1; - z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, z__2.i = - temp.r * a[i__5].i + temp.i * a[i__5].r; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, + z__2.i = temp.r * a[i__5].i + temp.i * a[i__5].r; z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; y[i__3].r = z__1.r, y[i__3].i = z__1.i; iy += *incy; -/* L70: */ } jx += *incx; -/* L80: */ } } } else { - -/* Form y := alpha*A**T*x + y or y := alpha*A**H*x + y. */ - jy = ky; if (*incx == 1) { i__1 = *n; @@ -393,12 +158,10 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; i__4 = i__; - z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4] - .i, z__2.i = a[i__3].r * x[i__4].i + a[i__3] - .i * x[i__4].r; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4].i, + z__2.i = a[i__3].r * x[i__4].i + a[i__3].i * x[i__4].r; z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L90: */ } } else { i__2 = *m; @@ -406,21 +169,18 @@ extern "C" { d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = i__; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3] - .r; + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L100: */ } } i__2 = jy; i__3 = jy; - z__2.r = alpha->r * temp.r - alpha->i * temp.i, z__2.i = - alpha->r * temp.i + alpha->i * temp.r; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * temp.r; z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; y[i__2].r = z__1.r, y[i__2].i = z__1.i; jy += *incy; -/* L110: */ } } else { i__1 = *n; @@ -432,13 +192,11 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; i__4 = ix; - z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4] - .i, z__2.i = a[i__3].r * x[i__4].i + a[i__3] - .i * x[i__4].r; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4].i, + z__2.i = a[i__3].r * x[i__4].i + a[i__3].i * x[i__4].r; z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; ix += *incx; -/* L120: */ } } else { i__2 = *m; @@ -446,32 +204,24 @@ extern "C" { d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = ix; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3] - .r; + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; ix += *incx; -/* L130: */ } } i__2 = jy; i__3 = jy; - z__2.r = alpha->r * temp.r - alpha->i * temp.i, z__2.i = - alpha->r * temp.i + alpha->i * temp.r; + z__2.r = alpha->r * temp.r - alpha->i * temp.i, + z__2.i = alpha->r * temp.i + alpha->i * temp.r; z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; y[i__2].r = z__1.r, y[i__2].i = z__1.i; jy += *incy; -/* L140: */ } } } - return 0; - -/* End of ZGEMV */ - -} /* zgemv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zgerc.cpp b/lib/linalg/zgerc.cpp index 04dde8606a..b22e3f3e6d 100644 --- a/lib/linalg/zgerc.cpp +++ b/lib/linalg/zgerc.cpp @@ -1,195 +1,21 @@ -/* fortran/zgerc.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZGERC */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZGERC(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) */ - -/* .. Scalar Arguments .. */ -/* COMPLEX*16 ALPHA */ -/* INTEGER INCX,INCY,LDA,M,N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A(LDA,*),X(*),Y(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZGERC performs the rank 1 operation */ -/* > */ -/* > A := alpha*x*y**H + A, */ -/* > */ -/* > where alpha is a scalar, x is an m element vector, y is an n element */ -/* > vector and A is an m by n matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > On entry, M specifies the number of rows of the matrix A. */ -/* > M must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the number of columns of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is COMPLEX*16 */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( m - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array X must contain the m */ -/* > element vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Y */ -/* > \verbatim */ -/* > Y is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCY ) ). */ -/* > Before entry, the incremented array Y must contain the n */ -/* > element vector y. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > On entry, INCY specifies the increment for the elements of */ -/* > Y. INCY must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension ( LDA, N ) */ -/* > Before entry, the leading m by n part of the array A must */ -/* > contain the matrix of coefficients. On exit, A is */ -/* > overwritten by the updated matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. LDA must be at least */ -/* > max( 1, m ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zgerc_(integer *m, integer *n, doublecomplex *alpha, - doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, - doublecomplex *a, integer *lda) +int zgerc_(integer *m, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, + doublecomplex *y, integer *incy, doublecomplex *a, integer *lda) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; doublecomplex z__1, z__2; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j, ix, jy, kx, info; doublecomplex temp; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); --x; --y; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ info = 0; if (*m < 0) { info = 1; @@ -199,23 +25,16 @@ extern "C" { info = 5; } else if (*incy == 0) { info = 7; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { info = 9; } if (info != 0) { xerbla_((char *)"ZGERC ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*m == 0 || *n == 0 || alpha->r == 0. && alpha->i == 0.) { return 0; } - -/* Start the operations. In this version the elements of A are */ -/* accessed sequentially with one pass through A. */ - if (*incy > 0) { jy = 1; } else { @@ -227,23 +46,21 @@ extern "C" { i__2 = jy; if (y[i__2].r != 0. || y[i__2].i != 0.) { d_lmp_cnjg(&z__2, &y[jy]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; i__4 = i__ + j * a_dim1; i__5 = i__; - z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, z__2.i = - x[i__5].r * temp.i + x[i__5].i * temp.r; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L10: */ } } jy += *incy; -/* L20: */ } } else { if (*incx > 0) { @@ -256,8 +73,8 @@ extern "C" { i__2 = jy; if (y[i__2].r != 0. || y[i__2].i != 0.) { d_lmp_cnjg(&z__2, &y[jy]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; ix = kx; i__2 = *m; @@ -265,25 +82,18 @@ extern "C" { i__3 = i__ + j * a_dim1; i__4 = i__ + j * a_dim1; i__5 = ix; - z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, z__2.i = - x[i__5].r * temp.i + x[i__5].i * temp.r; + z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; z__1.r = a[i__4].r + z__2.r, z__1.i = a[i__4].i + z__2.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; ix += *incx; -/* L30: */ } } jy += *incy; -/* L40: */ } } - return 0; - -/* End of ZGERC */ - -} /* zgerc_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zheev.cpp b/lib/linalg/zheev.cpp index 52661d9511..1238239431 100644 --- a/lib/linalg/zheev.cpp +++ b/lib/linalg/zheev.cpp @@ -1,188 +1,25 @@ -/* fortran/zheev.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__0 = 0; static doublereal c_b18 = 1.; - -/* > \brief ZHEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matr -ices */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZHEEV + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZHEEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, */ -/* INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER JOBZ, UPLO */ -/* INTEGER INFO, LDA, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION RWORK( * ), W( * ) */ -/* COMPLEX*16 A( LDA, * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZHEEV computes all eigenvalues and, optionally, eigenvectors of a */ -/* > complex Hermitian matrix A. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] JOBZ */ -/* > \verbatim */ -/* > JOBZ is CHARACTER*1 */ -/* > = 'N': Compute eigenvalues only; */ -/* > = 'V': Compute eigenvalues and eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A is stored; */ -/* > = 'L': Lower triangle of A is stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA, N) */ -/* > On entry, the Hermitian matrix A. If UPLO = 'U', the */ -/* > leading N-by-N upper triangular part of A contains the */ -/* > upper triangular part of the matrix A. If UPLO = 'L', */ -/* > the leading N-by-N lower triangular part of A contains */ -/* > the lower triangular part of the matrix A. */ -/* > On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ -/* > orthonormal eigenvectors of the matrix A. */ -/* > If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') */ -/* > or the upper triangle (if UPLO='U') of A, including the */ -/* > diagonal, is destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] W */ -/* > \verbatim */ -/* > W is DOUBLE PRECISION array, dimension (N) */ -/* > If INFO = 0, the eigenvalues in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The length of the array WORK. LWORK >= max(1,2*N-1). */ -/* > For optimal efficiency, LWORK >= (NB+1)*N, */ -/* > where NB is the blocksize for ZHETRD returned by ILAENV. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RWORK */ -/* > \verbatim */ -/* > RWORK is DOUBLE PRECISION array, dimension (max(1, 3*N-2)) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, the algorithm failed to converge; i */ -/* > off-diagonal elements of an intermediate tridiagonal */ -/* > form did not converge to zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16HEeigen */ - -/* ===================================================================== */ -/* Subroutine */ int zheev_(char *jobz, char *uplo, integer *n, doublecomplex - *a, integer *lda, doublereal *w, doublecomplex *work, integer *lwork, - doublereal *rwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) +int zheev_(char *jobz, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *w, + doublecomplex *work, integer *lwork, doublereal *rwork, integer *info, ftnlen jobz_len, + ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ integer nb; doublereal eps; integer inde; doublereal anrm; integer imax; doublereal rmin, rmax; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; @@ -190,95 +27,56 @@ ices */ extern doublereal dlamch_(char *, ftnlen); integer iscale; doublereal safmin; - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); doublereal bignum; - extern doublereal zlanhe_(char *, char *, integer *, doublecomplex *, - integer *, doublereal *, ftnlen, ftnlen); + extern doublereal zlanhe_(char *, char *, integer *, doublecomplex *, integer *, doublereal *, + ftnlen, ftnlen); integer indtau; - extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, - integer *), zlascl_(char *, integer *, integer *, doublereal *, - doublereal *, integer *, integer *, doublecomplex *, integer *, - integer *, ftnlen); + extern int dsterf_(integer *, doublereal *, doublereal *, integer *), + zlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublecomplex *, integer *, integer *, ftnlen); integer indwrk; - extern /* Subroutine */ int zhetrd_(char *, integer *, doublecomplex *, - integer *, doublereal *, doublereal *, doublecomplex *, - doublecomplex *, integer *, integer *, ftnlen); + extern int zhetrd_(char *, integer *, doublecomplex *, integer *, doublereal *, doublereal *, + doublecomplex *, doublecomplex *, integer *, integer *, ftnlen); integer llwork; doublereal smlnum; integer lwkopt; logical lquery; - extern /* Subroutine */ int zsteqr_(char *, integer *, doublereal *, - doublereal *, doublecomplex *, integer *, doublereal *, integer *, - ftnlen), zungtr_(char *, integer *, doublecomplex *, integer *, - doublecomplex *, doublecomplex *, integer *, integer *, ftnlen); - - -/* -- LAPACK driver routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int zsteqr_(char *, integer *, doublereal *, doublereal *, doublecomplex *, integer *, + doublereal *, integer *, ftnlen), + zungtr_(char *, integer *, doublecomplex *, integer *, doublecomplex *, doublecomplex *, + integer *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --w; --work; --rwork; - - /* Function Body */ wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); lower = lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - *info = 0; - if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + if (!(wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { *info = -1; - } else if (! (lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { + } else if (!(lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { *info = -2; } else if (*n < 0) { *info = -3; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -5; } - if (*info == 0) { - nb = ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, - (ftnlen)1); -/* Computing MAX */ + nb = ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); i__1 = 1, i__2 = (nb + 1) * *n; - lwkopt = max(i__1,i__2); - work[1].r = (doublereal) lwkopt, work[1].i = 0.; - -/* Computing MAX */ + lwkopt = max(i__1, i__2); + work[1].r = (doublereal)lwkopt, work[1].i = 0.; i__1 = 1, i__2 = (*n << 1) - 1; - if (*lwork < max(i__1,i__2) && ! lquery) { + if (*lwork < max(i__1, i__2) && !lquery) { *info = -8; } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"ZHEEV ", &i__1, (ftnlen)6); @@ -286,13 +84,9 @@ ices */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - if (*n == 1) { i__1 = a_dim1 + 1; w[1] = a[i__1].r; @@ -303,20 +97,13 @@ ices */ } return 0; } - -/* Get machine constants. */ - safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); eps = dlamch_((char *)"Precision", (ftnlen)9); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); - -/* Scale matrix to allowable range, if necessary. */ - - anrm = zlanhe_((char *)"M", uplo, n, &a[a_offset], lda, &rwork[1], (ftnlen)1, ( - ftnlen)1); + anrm = zlanhe_((char *)"M", uplo, n, &a[a_offset], lda, &rwork[1], (ftnlen)1, (ftnlen)1); iscale = 0; if (anrm > 0. && anrm < rmin) { iscale = 1; @@ -326,34 +113,22 @@ ices */ sigma = rmax / anrm; } if (iscale == 1) { - zlascl_(uplo, &c__0, &c__0, &c_b18, &sigma, n, n, &a[a_offset], lda, - info, (ftnlen)1); + zlascl_(uplo, &c__0, &c__0, &c_b18, &sigma, n, n, &a[a_offset], lda, info, (ftnlen)1); } - -/* Call ZHETRD to reduce Hermitian matrix to tridiagonal form. */ - inde = 1; indtau = 1; indwrk = indtau + *n; llwork = *lwork - indwrk + 1; - zhetrd_(uplo, n, &a[a_offset], lda, &w[1], &rwork[inde], &work[indtau], & - work[indwrk], &llwork, &iinfo, (ftnlen)1); - -/* For eigenvalues only, call DSTERF. For eigenvectors, first call */ -/* ZUNGTR to generate the unitary matrix, then call ZSTEQR. */ - - if (! wantz) { + zhetrd_(uplo, n, &a[a_offset], lda, &w[1], &rwork[inde], &work[indtau], &work[indwrk], &llwork, + &iinfo, (ftnlen)1); + if (!wantz) { dsterf_(n, &w[1], &rwork[inde], info); } else { - zungtr_(uplo, n, &a[a_offset], lda, &work[indtau], &work[indwrk], & - llwork, &iinfo, (ftnlen)1); + zungtr_(uplo, n, &a[a_offset], lda, &work[indtau], &work[indwrk], &llwork, &iinfo, + (ftnlen)1); indwrk = inde + *n; - zsteqr_(jobz, n, &w[1], &rwork[inde], &a[a_offset], lda, &rwork[ - indwrk], info, (ftnlen)1); + zsteqr_(jobz, n, &w[1], &rwork[inde], &a[a_offset], lda, &rwork[indwrk], info, (ftnlen)1); } - -/* If matrix was scaled, then rescale eigenvalues appropriately. */ - if (iscale == 1) { if (*info == 0) { imax = *n; @@ -363,17 +138,9 @@ ices */ d__1 = 1. / sigma; dscal_(&imax, &d__1, &w[1], &c__1); } - -/* Set WORK(1) to optimal complex workspace size. */ - - work[1].r = (doublereal) lwkopt, work[1].i = 0.; - + work[1].r = (doublereal)lwkopt, work[1].i = 0.; return 0; - -/* End of ZHEEV */ - -} /* zheev_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zheevd.cpp b/lib/linalg/zheevd.cpp index 83747a7962..094bf2216d 100644 --- a/lib/linalg/zheevd.cpp +++ b/lib/linalg/zheevd.cpp @@ -1,254 +1,25 @@ -/* fortran/zheevd.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__0 = 0; static doublereal c_b18 = 1.; - -/* > \brief ZHEEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE mat -rices */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZHEEVD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZHEEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, */ -/* LRWORK, IWORK, LIWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER JOBZ, UPLO */ -/* INTEGER INFO, LDA, LIWORK, LRWORK, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IWORK( * ) */ -/* DOUBLE PRECISION RWORK( * ), W( * ) */ -/* COMPLEX*16 A( LDA, * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZHEEVD computes all eigenvalues and, optionally, eigenvectors of a */ -/* > complex Hermitian matrix A. If eigenvectors are desired, it uses a */ -/* > divide and conquer algorithm. */ -/* > */ -/* > The divide and conquer algorithm makes very mild assumptions about */ -/* > floating point arithmetic. It will work on machines with a guard */ -/* > digit in add/subtract, or on those binary machines without guard */ -/* > digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or */ -/* > Cray-2. It could conceivably fail on hexadecimal or decimal machines */ -/* > without guard digits, but we know of none. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] JOBZ */ -/* > \verbatim */ -/* > JOBZ is CHARACTER*1 */ -/* > = 'N': Compute eigenvalues only; */ -/* > = 'V': Compute eigenvalues and eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A is stored; */ -/* > = 'L': Lower triangle of A is stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA, N) */ -/* > On entry, the Hermitian matrix A. If UPLO = 'U', the */ -/* > leading N-by-N upper triangular part of A contains the */ -/* > upper triangular part of the matrix A. If UPLO = 'L', */ -/* > the leading N-by-N lower triangular part of A contains */ -/* > the lower triangular part of the matrix A. */ -/* > On exit, if JOBZ = 'V', then if INFO = 0, A contains the */ -/* > orthonormal eigenvectors of the matrix A. */ -/* > If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') */ -/* > or the upper triangle (if UPLO='U') of A, including the */ -/* > diagonal, is destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] W */ -/* > \verbatim */ -/* > W is DOUBLE PRECISION array, dimension (N) */ -/* > If INFO = 0, the eigenvalues in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The length of the array WORK. */ -/* > If N <= 1, LWORK must be at least 1. */ -/* > If JOBZ = 'N' and N > 1, LWORK must be at least N + 1. */ -/* > If JOBZ = 'V' and N > 1, LWORK must be at least 2*N + N**2. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal sizes of the WORK, RWORK and */ -/* > IWORK arrays, returns these values as the first entries of */ -/* > the WORK, RWORK and IWORK arrays, and no error message */ -/* > related to LWORK or LRWORK or LIWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RWORK */ -/* > \verbatim */ -/* > RWORK is DOUBLE PRECISION array, */ -/* > dimension (LRWORK) */ -/* > On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LRWORK */ -/* > \verbatim */ -/* > LRWORK is INTEGER */ -/* > The dimension of the array RWORK. */ -/* > If N <= 1, LRWORK must be at least 1. */ -/* > If JOBZ = 'N' and N > 1, LRWORK must be at least N. */ -/* > If JOBZ = 'V' and N > 1, LRWORK must be at least */ -/* > 1 + 5*N + 2*N**2. */ -/* > */ -/* > If LRWORK = -1, then a workspace query is assumed; the */ -/* > routine only calculates the optimal sizes of the WORK, RWORK */ -/* > and IWORK arrays, returns these values as the first entries */ -/* > of the WORK, RWORK and IWORK arrays, and no error message */ -/* > related to LWORK or LRWORK or LIWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension (MAX(1,LIWORK)) */ -/* > On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LIWORK */ -/* > \verbatim */ -/* > LIWORK is INTEGER */ -/* > The dimension of the array IWORK. */ -/* > If N <= 1, LIWORK must be at least 1. */ -/* > If JOBZ = 'N' and N > 1, LIWORK must be at least 1. */ -/* > If JOBZ = 'V' and N > 1, LIWORK must be at least 3 + 5*N. */ -/* > */ -/* > If LIWORK = -1, then a workspace query is assumed; the */ -/* > routine only calculates the optimal sizes of the WORK, RWORK */ -/* > and IWORK arrays, returns these values as the first entries */ -/* > of the WORK, RWORK and IWORK arrays, and no error message */ -/* > related to LWORK or LRWORK or LIWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i and JOBZ = 'N', then the algorithm failed */ -/* > to converge; i off-diagonal elements of an intermediate */ -/* > tridiagonal form did not converge to zero; */ -/* > if INFO = i and JOBZ = 'V', then the algorithm failed */ -/* > to compute an eigenvalue while working on the submatrix */ -/* > lying in rows and columns INFO/(N+1) through */ -/* > mod(INFO,N+1). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16HEeigen */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > Modified description of INFO. Sven, 16 Feb 05. */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Jeff Rutter, Computer Science Division, University of California */ -/* > at Berkeley, USA */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zheevd_(char *jobz, char *uplo, integer *n, - doublecomplex *a, integer *lda, doublereal *w, doublecomplex *work, - integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, - integer *liwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) +int zheevd_(char *jobz, char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *w, + doublecomplex *work, integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, + integer *liwork, integer *info, ftnlen jobz_len, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal eps; integer inde; doublereal anrm; integer imax; doublereal rmin, rmax; integer lopt; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *); + extern int dscal_(integer *, doublereal *, doublereal *, integer *); doublereal sigma; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo, lwmin, liopt; @@ -259,61 +30,30 @@ f"> */ extern doublereal dlamch_(char *, ftnlen); integer iscale; doublereal safmin; - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); doublereal bignum; - extern doublereal zlanhe_(char *, char *, integer *, doublecomplex *, - integer *, doublereal *, ftnlen, ftnlen); + extern doublereal zlanhe_(char *, char *, integer *, doublecomplex *, integer *, doublereal *, + ftnlen, ftnlen); integer indtau; - extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, - integer *), zlascl_(char *, integer *, integer *, doublereal *, - doublereal *, integer *, integer *, doublecomplex *, integer *, - integer *, ftnlen), zstedc_(char *, integer *, doublereal *, - doublereal *, doublecomplex *, integer *, doublecomplex *, - integer *, doublereal *, integer *, integer *, integer *, integer - *, ftnlen); + extern int dsterf_(integer *, doublereal *, doublereal *, integer *), + zlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, integer *, + doublecomplex *, integer *, integer *, ftnlen), + zstedc_(char *, integer *, doublereal *, doublereal *, doublecomplex *, integer *, + doublecomplex *, integer *, doublereal *, integer *, integer *, integer *, + integer *, ftnlen); integer indrwk, indwrk, liwmin; - extern /* Subroutine */ int zhetrd_(char *, integer *, doublecomplex *, - integer *, doublereal *, doublereal *, doublecomplex *, - doublecomplex *, integer *, integer *, ftnlen), zlacpy_(char *, - integer *, integer *, doublecomplex *, integer *, doublecomplex *, - integer *, ftnlen); + extern int zhetrd_(char *, integer *, doublecomplex *, integer *, doublereal *, doublereal *, + doublecomplex *, doublecomplex *, integer *, integer *, ftnlen), + zlacpy_(char *, integer *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, ftnlen); integer lrwmin, llwork; doublereal smlnum; logical lquery; - extern /* Subroutine */ int zunmtr_(char *, char *, char *, integer *, - integer *, doublecomplex *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, integer *, - ftnlen, ftnlen, ftnlen); - - -/* -- LAPACK driver routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int zunmtr_(char *, char *, char *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, integer *, + integer *, ftnlen, ftnlen, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -321,23 +61,19 @@ f"> */ --work; --rwork; --iwork; - - /* Function Body */ wantz = lsame_(jobz, (char *)"V", (ftnlen)1, (ftnlen)1); lower = lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1 || *lrwork == -1 || *liwork == -1; - *info = 0; - if (! (wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { + if (!(wantz || lsame_(jobz, (char *)"N", (ftnlen)1, (ftnlen)1))) { *info = -1; - } else if (! (lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { + } else if (!(lower || lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1))) { *info = -2; } else if (*n < 0) { *info = -3; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -5; } - if (*info == 0) { if (*n <= 1) { lwmin = 1; @@ -349,7 +85,6 @@ f"> */ } else { if (wantz) { lwmin = (*n << 1) + *n * *n; -/* Computing 2nd power */ i__1 = *n; lrwmin = *n * 5 + 1 + (i__1 * i__1 << 1); liwmin = *n * 5 + 3; @@ -358,26 +93,23 @@ f"> */ lrwmin = *n; liwmin = 1; } -/* Computing MAX */ - i__1 = lwmin, i__2 = *n + *n * ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, & - c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); - lopt = max(i__1,i__2); + i__1 = lwmin, i__2 = *n + *n * ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, + (ftnlen)6, (ftnlen)1); + lopt = max(i__1, i__2); lropt = lrwmin; liopt = liwmin; } - work[1].r = (doublereal) lopt, work[1].i = 0.; - rwork[1] = (doublereal) lropt; + work[1].r = (doublereal)lopt, work[1].i = 0.; + rwork[1] = (doublereal)lropt; iwork[1] = liopt; - - if (*lwork < lwmin && ! lquery) { + if (*lwork < lwmin && !lquery) { *info = -8; - } else if (*lrwork < lrwmin && ! lquery) { + } else if (*lrwork < lrwmin && !lquery) { *info = -10; - } else if (*liwork < liwmin && ! lquery) { + } else if (*liwork < liwmin && !lquery) { *info = -12; } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"ZHEEVD", &i__1, (ftnlen)6); @@ -385,13 +117,9 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - if (*n == 1) { i__1 = a_dim1 + 1; w[1] = a[i__1].r; @@ -401,20 +129,13 @@ f"> */ } return 0; } - -/* Get machine constants. */ - safmin = dlamch_((char *)"Safe minimum", (ftnlen)12); eps = dlamch_((char *)"Precision", (ftnlen)9); smlnum = safmin / eps; bignum = 1. / smlnum; rmin = sqrt(smlnum); rmax = sqrt(bignum); - -/* Scale matrix to allowable range, if necessary. */ - - anrm = zlanhe_((char *)"M", uplo, n, &a[a_offset], lda, &rwork[1], (ftnlen)1, ( - ftnlen)1); + anrm = zlanhe_((char *)"M", uplo, n, &a[a_offset], lda, &rwork[1], (ftnlen)1, (ftnlen)1); iscale = 0; if (anrm > 0. && anrm < rmin) { iscale = 1; @@ -424,12 +145,8 @@ f"> */ sigma = rmax / anrm; } if (iscale == 1) { - zlascl_(uplo, &c__0, &c__0, &c_b18, &sigma, n, n, &a[a_offset], lda, - info, (ftnlen)1); + zlascl_(uplo, &c__0, &c__0, &c_b18, &sigma, n, n, &a[a_offset], lda, info, (ftnlen)1); } - -/* Call ZHETRD to reduce Hermitian matrix to tridiagonal form. */ - inde = 1; indtau = 1; indwrk = indtau + *n; @@ -438,29 +155,17 @@ f"> */ llwork = *lwork - indwrk + 1; llwrk2 = *lwork - indwk2 + 1; llrwk = *lrwork - indrwk + 1; - zhetrd_(uplo, n, &a[a_offset], lda, &w[1], &rwork[inde], &work[indtau], & - work[indwrk], &llwork, &iinfo, (ftnlen)1); - -/* For eigenvalues only, call DSTERF. For eigenvectors, first call */ -/* ZSTEDC to generate the eigenvector matrix, WORK(INDWRK), of the */ -/* tridiagonal matrix, then call ZUNMTR to multiply it to the */ -/* Householder transformations represented as Householder vectors in */ -/* A. */ - - if (! wantz) { + zhetrd_(uplo, n, &a[a_offset], lda, &w[1], &rwork[inde], &work[indtau], &work[indwrk], &llwork, + &iinfo, (ftnlen)1); + if (!wantz) { dsterf_(n, &w[1], &rwork[inde], info); } else { - zstedc_((char *)"I", n, &w[1], &rwork[inde], &work[indwrk], n, &work[indwk2], - &llwrk2, &rwork[indrwk], &llrwk, &iwork[1], liwork, info, ( - ftnlen)1); - zunmtr_((char *)"L", uplo, (char *)"N", n, n, &a[a_offset], lda, &work[indtau], &work[ - indwrk], n, &work[indwk2], &llwrk2, &iinfo, (ftnlen)1, ( - ftnlen)1, (ftnlen)1); + zstedc_((char *)"I", n, &w[1], &rwork[inde], &work[indwrk], n, &work[indwk2], &llwrk2, + &rwork[indrwk], &llrwk, &iwork[1], liwork, info, (ftnlen)1); + zunmtr_((char *)"L", uplo, (char *)"N", n, n, &a[a_offset], lda, &work[indtau], &work[indwrk], n, + &work[indwk2], &llwrk2, &iinfo, (ftnlen)1, (ftnlen)1, (ftnlen)1); zlacpy_((char *)"A", n, n, &work[indwrk], n, &a[a_offset], lda, (ftnlen)1); } - -/* If matrix was scaled, then rescale eigenvalues appropriately. */ - if (iscale == 1) { if (*info == 0) { imax = *n; @@ -470,17 +175,11 @@ f"> */ d__1 = 1. / sigma; dscal_(&imax, &d__1, &w[1], &c__1); } - - work[1].r = (doublereal) lopt, work[1].i = 0.; - rwork[1] = (doublereal) lropt; + work[1].r = (doublereal)lopt, work[1].i = 0.; + rwork[1] = (doublereal)lropt; iwork[1] = liopt; - return 0; - -/* End of ZHEEVD */ - -} /* zheevd_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zhemv.cpp b/lib/linalg/zhemv.cpp index f26dbadf2b..566e74fab6 100644 --- a/lib/linalg/zhemv.cpp +++ b/lib/linalg/zhemv.cpp @@ -1,230 +1,30 @@ -/* fortran/zhemv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZHEMV */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZHEMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) */ - -/* .. Scalar Arguments .. */ -/* COMPLEX*16 ALPHA,BETA */ -/* INTEGER INCX,INCY,LDA,N */ -/* CHARACTER UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A(LDA,*),X(*),Y(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZHEMV performs the matrix-vector operation */ -/* > */ -/* > y := alpha*A*x + beta*y, */ -/* > */ -/* > where alpha and beta are scalars, x and y are n element vectors and */ -/* > A is an n by n hermitian matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the upper or lower */ -/* > triangular part of the array A is to be referenced as */ -/* > follows: */ -/* > */ -/* > UPLO = 'U' or 'u' Only the upper triangular part of A */ -/* > is to be referenced. */ -/* > */ -/* > UPLO = 'L' or 'l' Only the lower triangular part of A */ -/* > is to be referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is COMPLEX*16 */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension ( LDA, N ) */ -/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ -/* > upper triangular part of the array A must contain the upper */ -/* > triangular part of the hermitian matrix and the strictly */ -/* > lower triangular part of A is not referenced. */ -/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ -/* > lower triangular part of the array A must contain the lower */ -/* > triangular part of the hermitian matrix and the strictly */ -/* > upper triangular part of A is not referenced. */ -/* > Note that the imaginary parts of the diagonal elements need */ -/* > not be set and are assumed to be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. LDA must be at least */ -/* > max( 1, n ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array X must contain the n */ -/* > element vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is COMPLEX*16 */ -/* > On entry, BETA specifies the scalar beta. When BETA is */ -/* > supplied as zero then Y need not be set on input. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Y */ -/* > \verbatim */ -/* > Y is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCY ) ). */ -/* > Before entry, the incremented array Y must contain the n */ -/* > element vector y. On exit, Y is overwritten by the updated */ -/* > vector y. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > On entry, INCY specifies the increment for the elements of */ -/* > Y. INCY must not be zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zhemv_(char *uplo, integer *n, doublecomplex *alpha, - doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, - doublecomplex *beta, doublecomplex *y, integer *incy, ftnlen uplo_len) +int zhemv_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *a, integer *lda, + doublecomplex *x, integer *incx, doublecomplex *beta, doublecomplex *y, integer *incy, + ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; doublereal d__1; doublecomplex z__1, z__2, z__3, z__4; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; doublecomplex temp1, temp2; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; --y; - - /* Function Body */ info = 0; - if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; } else if (*n < 0) { info = 2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { info = 5; } else if (*incx == 0) { info = 7; @@ -235,16 +35,9 @@ extern "C" { xerbla_((char *)"ZHEMV ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - - if (*n == 0 || alpha->r == 0. && alpha->i == 0. && (beta->r == 1. && - beta->i == 0.)) { + if (*n == 0 || alpha->r == 0. && alpha->i == 0. && (beta->r == 1. && beta->i == 0.)) { return 0; } - -/* Set up the start points in X and Y. */ - if (*incx > 0) { kx = 1; } else { @@ -255,13 +48,6 @@ extern "C" { } else { ky = 1 - (*n - 1) * *incy; } - -/* Start the operations. In this version the elements of A are */ -/* accessed sequentially with one pass through the triangular part */ -/* of A. */ - -/* First form y := beta*y. */ - if (beta->r != 1. || beta->i != 0.) { if (*incy == 1) { if (beta->r == 0. && beta->i == 0.) { @@ -269,7 +55,6 @@ extern "C" { for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__; y[i__2].r = 0., y[i__2].i = 0.; -/* L10: */ } } else { i__1 = *n; @@ -277,10 +62,8 @@ extern "C" { i__2 = i__; i__3 = i__; z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, - z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] - .r; + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3].r; y[i__2].r = z__1.r, y[i__2].i = z__1.i; -/* L20: */ } } } else { @@ -291,7 +74,6 @@ extern "C" { i__2 = iy; y[i__2].r = 0., y[i__2].i = 0.; iy += *incy; -/* L30: */ } } else { i__1 = *n; @@ -299,11 +81,9 @@ extern "C" { i__2 = iy; i__3 = iy; z__1.r = beta->r * y[i__3].r - beta->i * y[i__3].i, - z__1.i = beta->r * y[i__3].i + beta->i * y[i__3] - .r; + z__1.i = beta->r * y[i__3].i + beta->i * y[i__3].r; y[i__2].r = z__1.r, y[i__2].i = z__1.i; iy += *incy; -/* L40: */ } } } @@ -312,15 +92,12 @@ extern "C" { return 0; } if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - -/* Form y when A is stored in upper triangle. */ - if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; - z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = - alpha->r * x[i__2].i + alpha->i * x[i__2].r; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; temp1.r = z__1.r, temp1.i = z__1.i; temp2.r = 0., temp2.i = 0.; i__2 = j - 1; @@ -329,17 +106,15 @@ extern "C" { i__4 = i__; i__5 = i__ + j * a_dim1; z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, - z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] - .r; + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5].r; z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; y[i__3].r = z__1.r, y[i__3].i = z__1.i; d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = i__; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = - z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; temp2.r = z__1.r, temp2.i = z__1.i; -/* L50: */ } i__2 = j; i__3 = j; @@ -347,11 +122,10 @@ extern "C" { d__1 = a[i__4].r; z__3.r = d__1 * temp1.r, z__3.i = d__1 * temp1.i; z__2.r = y[i__3].r + z__3.r, z__2.i = y[i__3].i + z__3.i; - z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, z__4.i = - alpha->r * temp2.i + alpha->i * temp2.r; + z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, + z__4.i = alpha->r * temp2.i + alpha->i * temp2.r; z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; y[i__2].r = z__1.r, y[i__2].i = z__1.i; -/* L60: */ } } else { jx = kx; @@ -359,8 +133,8 @@ extern "C" { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = jx; - z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = - alpha->r * x[i__2].i + alpha->i * x[i__2].r; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; temp1.r = z__1.r, temp1.i = z__1.i; temp2.r = 0., temp2.i = 0.; ix = kx; @@ -371,19 +145,17 @@ extern "C" { i__4 = iy; i__5 = i__ + j * a_dim1; z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, - z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] - .r; + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5].r; z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; y[i__3].r = z__1.r, y[i__3].i = z__1.i; d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = ix; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = - z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; temp2.r = z__1.r, temp2.i = z__1.i; ix += *incx; iy += *incy; -/* L70: */ } i__2 = jy; i__3 = jy; @@ -391,25 +163,21 @@ extern "C" { d__1 = a[i__4].r; z__3.r = d__1 * temp1.r, z__3.i = d__1 * temp1.i; z__2.r = y[i__3].r + z__3.r, z__2.i = y[i__3].i + z__3.i; - z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, z__4.i = - alpha->r * temp2.i + alpha->i * temp2.r; + z__4.r = alpha->r * temp2.r - alpha->i * temp2.i, + z__4.i = alpha->r * temp2.i + alpha->i * temp2.r; z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; y[i__2].r = z__1.r, y[i__2].i = z__1.i; jx += *incx; jy += *incy; -/* L80: */ } } } else { - -/* Form y when A is stored in lower triangle. */ - if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; - z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = - alpha->r * x[i__2].i + alpha->i * x[i__2].r; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; temp1.r = z__1.r, temp1.i = z__1.i; temp2.r = 0., temp2.i = 0.; i__2 = j; @@ -425,25 +193,22 @@ extern "C" { i__4 = i__; i__5 = i__ + j * a_dim1; z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, - z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] - .r; + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5].r; z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; y[i__3].r = z__1.r, y[i__3].i = z__1.i; d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = i__; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = - z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; temp2.r = z__1.r, temp2.i = z__1.i; -/* L90: */ } i__2 = j; i__3 = j; - z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, z__2.i = - alpha->r * temp2.i + alpha->i * temp2.r; + z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, + z__2.i = alpha->r * temp2.i + alpha->i * temp2.r; z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; y[i__2].r = z__1.r, y[i__2].i = z__1.i; -/* L100: */ } } else { jx = kx; @@ -451,8 +216,8 @@ extern "C" { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = jx; - z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, z__1.i = - alpha->r * x[i__2].i + alpha->i * x[i__2].r; + z__1.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, + z__1.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; temp1.r = z__1.r, temp1.i = z__1.i; temp2.r = 0., temp2.i = 0.; i__2 = jy; @@ -472,37 +237,29 @@ extern "C" { i__4 = iy; i__5 = i__ + j * a_dim1; z__2.r = temp1.r * a[i__5].r - temp1.i * a[i__5].i, - z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5] - .r; + z__2.i = temp1.r * a[i__5].i + temp1.i * a[i__5].r; z__1.r = y[i__4].r + z__2.r, z__1.i = y[i__4].i + z__2.i; y[i__3].r = z__1.r, y[i__3].i = z__1.i; d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = ix; - z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, z__2.i = - z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; temp2.r = z__1.r, temp2.i = z__1.i; -/* L110: */ } i__2 = jy; i__3 = jy; - z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, z__2.i = - alpha->r * temp2.i + alpha->i * temp2.r; + z__2.r = alpha->r * temp2.r - alpha->i * temp2.i, + z__2.i = alpha->r * temp2.i + alpha->i * temp2.r; z__1.r = y[i__3].r + z__2.r, z__1.i = y[i__3].i + z__2.i; y[i__2].r = z__1.r, y[i__2].i = z__1.i; jx += *incx; jy += *incy; -/* L120: */ } } } - return 0; - -/* End of ZHEMV */ - -} /* zhemv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zher2.cpp b/lib/linalg/zher2.cpp index 6f66534dd4..d70b5f04e2 100644 --- a/lib/linalg/zher2.cpp +++ b/lib/linalg/zher2.cpp @@ -1,222 +1,25 @@ -/* fortran/zher2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZHER2 */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZHER2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) */ - -/* .. Scalar Arguments .. */ -/* COMPLEX*16 ALPHA */ -/* INTEGER INCX,INCY,LDA,N */ -/* CHARACTER UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A(LDA,*),X(*),Y(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZHER2 performs the hermitian rank 2 operation */ -/* > */ -/* > A := alpha*x*y**H + conjg( alpha )*y*x**H + A, */ -/* > */ -/* > where alpha is a scalar, x and y are n element vectors and A is an n */ -/* > by n hermitian matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the upper or lower */ -/* > triangular part of the array A is to be referenced as */ -/* > follows: */ -/* > */ -/* > UPLO = 'U' or 'u' Only the upper triangular part of A */ -/* > is to be referenced. */ -/* > */ -/* > UPLO = 'L' or 'l' Only the lower triangular part of A */ -/* > is to be referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is COMPLEX*16 */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array X must contain the n */ -/* > element vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Y */ -/* > \verbatim */ -/* > Y is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCY ) ). */ -/* > Before entry, the incremented array Y must contain the n */ -/* > element vector y. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > On entry, INCY specifies the increment for the elements of */ -/* > Y. INCY must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension ( LDA, N ) */ -/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ -/* > upper triangular part of the array A must contain the upper */ -/* > triangular part of the hermitian matrix and the strictly */ -/* > lower triangular part of A is not referenced. On exit, the */ -/* > upper triangular part of the array A is overwritten by the */ -/* > upper triangular part of the updated matrix. */ -/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ -/* > lower triangular part of the array A must contain the lower */ -/* > triangular part of the hermitian matrix and the strictly */ -/* > upper triangular part of A is not referenced. On exit, the */ -/* > lower triangular part of the array A is overwritten by the */ -/* > lower triangular part of the updated matrix. */ -/* > Note that the imaginary parts of the diagonal elements need */ -/* > not be set, they are assumed to be zero, and on exit they */ -/* > are set to zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. LDA must be at least */ -/* > max( 1, n ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zher2_(char *uplo, integer *n, doublecomplex *alpha, - doublecomplex *x, integer *incx, doublecomplex *y, integer *incy, - doublecomplex *a, integer *lda, ftnlen uplo_len) +int zher2_(char *uplo, integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, + doublecomplex *y, integer *incy, doublecomplex *a, integer *lda, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5, i__6; doublereal d__1; doublecomplex z__1, z__2, z__3, z__4; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j, ix, iy, jx, jy, kx, ky, info; doublecomplex temp1, temp2; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); --x; --y; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ info = 0; - if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; } else if (*n < 0) { info = 2; @@ -224,23 +27,16 @@ extern "C" { info = 5; } else if (*incy == 0) { info = 7; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { info = 9; } if (info != 0) { xerbla_((char *)"ZHER2 ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*n == 0 || alpha->r == 0. && alpha->i == 0.) { return 0; } - -/* Set up the start points in X and Y if the increments are not both */ -/* unity. */ - if (*incx != 1 || *incy != 1) { if (*incx > 0) { kx = 1; @@ -255,30 +51,20 @@ extern "C" { jx = kx; jy = ky; } - -/* Start the operations. In this version the elements of A are */ -/* accessed sequentially with one pass through the triangular part */ -/* of A. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - -/* Form A when A is stored in the upper triangle. */ - if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; i__3 = j; - if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || - y[i__3].i != 0.)) { + if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || y[i__3].i != 0.)) { d_lmp_cnjg(&z__2, &y[j]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp1.r = z__1.r, temp1.i = z__1.i; i__2 = j; z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, - z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] - .r; + z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; d_lmp_cnjg(&z__1, &z__2); temp2.r = z__1.r, temp2.i = z__1.i; i__2 = j - 1; @@ -287,28 +73,22 @@ extern "C" { i__4 = i__ + j * a_dim1; i__5 = i__; z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, - z__3.i = x[i__5].r * temp1.i + x[i__5].i * - temp1.r; - z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + - z__3.i; + z__3.i = x[i__5].r * temp1.i + x[i__5].i * temp1.r; + z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + z__3.i; i__6 = i__; z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, - z__4.i = y[i__6].r * temp2.i + y[i__6].i * - temp2.r; + z__4.i = y[i__6].r * temp2.i + y[i__6].i * temp2.r; z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L10: */ } i__2 = j + j * a_dim1; i__3 = j + j * a_dim1; i__4 = j; z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, - z__2.i = x[i__4].r * temp1.i + x[i__4].i * - temp1.r; + z__2.i = x[i__4].r * temp1.i + x[i__4].i * temp1.r; i__5 = j; z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, - z__3.i = y[i__5].r * temp2.i + y[i__5].i * - temp2.r; + z__3.i = y[i__5].r * temp2.i + y[i__5].i * temp2.r; z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; d__1 = a[i__3].r + z__1.r; a[i__2].r = d__1, a[i__2].i = 0.; @@ -318,23 +98,20 @@ extern "C" { d__1 = a[i__3].r; a[i__2].r = d__1, a[i__2].i = 0.; } -/* L20: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = jx; i__3 = jy; - if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || - y[i__3].i != 0.)) { + if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || y[i__3].i != 0.)) { d_lmp_cnjg(&z__2, &y[jy]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp1.r = z__1.r, temp1.i = z__1.i; i__2 = jx; z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, - z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] - .r; + z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; d_lmp_cnjg(&z__1, &z__2); temp2.r = z__1.r, temp2.i = z__1.i; ix = kx; @@ -345,30 +122,24 @@ extern "C" { i__4 = i__ + j * a_dim1; i__5 = ix; z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, - z__3.i = x[i__5].r * temp1.i + x[i__5].i * - temp1.r; - z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + - z__3.i; + z__3.i = x[i__5].r * temp1.i + x[i__5].i * temp1.r; + z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + z__3.i; i__6 = iy; z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, - z__4.i = y[i__6].r * temp2.i + y[i__6].i * - temp2.r; + z__4.i = y[i__6].r * temp2.i + y[i__6].i * temp2.r; z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; ix += *incx; iy += *incy; -/* L30: */ } i__2 = j + j * a_dim1; i__3 = j + j * a_dim1; i__4 = jx; z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, - z__2.i = x[i__4].r * temp1.i + x[i__4].i * - temp1.r; + z__2.i = x[i__4].r * temp1.i + x[i__4].i * temp1.r; i__5 = jy; z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, - z__3.i = y[i__5].r * temp2.i + y[i__5].i * - temp2.r; + z__3.i = y[i__5].r * temp2.i + y[i__5].i * temp2.r; z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; d__1 = a[i__3].r + z__1.r; a[i__2].r = d__1, a[i__2].i = 0.; @@ -380,40 +151,32 @@ extern "C" { } jx += *incx; jy += *incy; -/* L40: */ } } } else { - -/* Form A when A is stored in the lower triangle. */ - if (*incx == 1 && *incy == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; i__3 = j; - if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || - y[i__3].i != 0.)) { + if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || y[i__3].i != 0.)) { d_lmp_cnjg(&z__2, &y[j]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp1.r = z__1.r, temp1.i = z__1.i; i__2 = j; z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, - z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] - .r; + z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; d_lmp_cnjg(&z__1, &z__2); temp2.r = z__1.r, temp2.i = z__1.i; i__2 = j + j * a_dim1; i__3 = j + j * a_dim1; i__4 = j; z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, - z__2.i = x[i__4].r * temp1.i + x[i__4].i * - temp1.r; + z__2.i = x[i__4].r * temp1.i + x[i__4].i * temp1.r; i__5 = j; z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, - z__3.i = y[i__5].r * temp2.i + y[i__5].i * - temp2.r; + z__3.i = y[i__5].r * temp2.i + y[i__5].i * temp2.r; z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; d__1 = a[i__3].r + z__1.r; a[i__2].r = d__1, a[i__2].i = 0.; @@ -423,17 +186,13 @@ extern "C" { i__4 = i__ + j * a_dim1; i__5 = i__; z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, - z__3.i = x[i__5].r * temp1.i + x[i__5].i * - temp1.r; - z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + - z__3.i; + z__3.i = x[i__5].r * temp1.i + x[i__5].i * temp1.r; + z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + z__3.i; i__6 = i__; z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, - z__4.i = y[i__6].r * temp2.i + y[i__6].i * - temp2.r; + z__4.i = y[i__6].r * temp2.i + y[i__6].i * temp2.r; z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L50: */ } } else { i__2 = j + j * a_dim1; @@ -441,35 +200,30 @@ extern "C" { d__1 = a[i__3].r; a[i__2].r = d__1, a[i__2].i = 0.; } -/* L60: */ } } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = jx; i__3 = jy; - if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || - y[i__3].i != 0.)) { + if (x[i__2].r != 0. || x[i__2].i != 0. || (y[i__3].r != 0. || y[i__3].i != 0.)) { d_lmp_cnjg(&z__2, &y[jy]); - z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, z__1.i = - alpha->r * z__2.i + alpha->i * z__2.r; + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp1.r = z__1.r, temp1.i = z__1.i; i__2 = jx; z__2.r = alpha->r * x[i__2].r - alpha->i * x[i__2].i, - z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2] - .r; + z__2.i = alpha->r * x[i__2].i + alpha->i * x[i__2].r; d_lmp_cnjg(&z__1, &z__2); temp2.r = z__1.r, temp2.i = z__1.i; i__2 = j + j * a_dim1; i__3 = j + j * a_dim1; i__4 = jx; z__2.r = x[i__4].r * temp1.r - x[i__4].i * temp1.i, - z__2.i = x[i__4].r * temp1.i + x[i__4].i * - temp1.r; + z__2.i = x[i__4].r * temp1.i + x[i__4].i * temp1.r; i__5 = jy; z__3.r = y[i__5].r * temp2.r - y[i__5].i * temp2.i, - z__3.i = y[i__5].r * temp2.i + y[i__5].i * - temp2.r; + z__3.i = y[i__5].r * temp2.i + y[i__5].i * temp2.r; z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; d__1 = a[i__3].r + z__1.r; a[i__2].r = d__1, a[i__2].i = 0.; @@ -483,17 +237,13 @@ extern "C" { i__4 = i__ + j * a_dim1; i__5 = ix; z__3.r = x[i__5].r * temp1.r - x[i__5].i * temp1.i, - z__3.i = x[i__5].r * temp1.i + x[i__5].i * - temp1.r; - z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + - z__3.i; + z__3.i = x[i__5].r * temp1.i + x[i__5].i * temp1.r; + z__2.r = a[i__4].r + z__3.r, z__2.i = a[i__4].i + z__3.i; i__6 = iy; z__4.r = y[i__6].r * temp2.r - y[i__6].i * temp2.i, - z__4.i = y[i__6].r * temp2.i + y[i__6].i * - temp2.r; + z__4.i = y[i__6].r * temp2.i + y[i__6].i * temp2.r; z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L70: */ } } else { i__2 = j + j * a_dim1; @@ -503,17 +253,11 @@ extern "C" { } jx += *incx; jy += *incy; -/* L80: */ } } } - return 0; - -/* End of ZHER2 */ - -} /* zher2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zher2k.cpp b/lib/linalg/zher2k.cpp index 01ce32deb9..c98e401dd3 100644 --- a/lib/linalg/zher2k.cpp +++ b/lib/linalg/zher2k.cpp @@ -1,264 +1,22 @@ -/* fortran/zher2k.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZHER2K */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZHER2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) */ - -/* .. Scalar Arguments .. */ -/* COMPLEX*16 ALPHA */ -/* DOUBLE PRECISION BETA */ -/* INTEGER K,LDA,LDB,LDC,N */ -/* CHARACTER TRANS,UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZHER2K performs one of the hermitian rank 2k operations */ -/* > */ -/* > C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C, */ -/* > */ -/* > or */ -/* > */ -/* > C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C, */ -/* > */ -/* > where alpha and beta are scalars with beta real, C is an n by n */ -/* > hermitian matrix and A and B are n by k matrices in the first case */ -/* > and k by n matrices in the second case. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the upper or lower */ -/* > triangular part of the array C is to be referenced as */ -/* > follows: */ -/* > */ -/* > UPLO = 'U' or 'u' Only the upper triangular part of C */ -/* > is to be referenced. */ -/* > */ -/* > UPLO = 'L' or 'l' Only the lower triangular part of C */ -/* > is to be referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > On entry, TRANS specifies the operation to be performed as */ -/* > follows: */ -/* > */ -/* > TRANS = 'N' or 'n' C := alpha*A*B**H + */ -/* > conjg( alpha )*B*A**H + */ -/* > beta*C. */ -/* > */ -/* > TRANS = 'C' or 'c' C := alpha*A**H*B + */ -/* > conjg( alpha )*B**H*A + */ -/* > beta*C. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix C. N must be */ -/* > at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > On entry with TRANS = 'N' or 'n', K specifies the number */ -/* > of columns of the matrices A and B, and on entry with */ -/* > TRANS = 'C' or 'c', K specifies the number of rows of the */ -/* > matrices A and B. K must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is COMPLEX*16 . */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension ( LDA, ka ), where ka is */ -/* > k when TRANS = 'N' or 'n', and is n otherwise. */ -/* > Before entry with TRANS = 'N' or 'n', the leading n by k */ -/* > part of the array A must contain the matrix A, otherwise */ -/* > the leading k by n part of the array A must contain the */ -/* > matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. When TRANS = 'N' or 'n' */ -/* > then LDA must be at least max( 1, n ), otherwise LDA must */ -/* > be at least max( 1, k ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] B */ -/* > \verbatim */ -/* > B is COMPLEX*16 array, dimension ( LDB, kb ), where kb is */ -/* > k when TRANS = 'N' or 'n', and is n otherwise. */ -/* > Before entry with TRANS = 'N' or 'n', the leading n by k */ -/* > part of the array B must contain the matrix B, otherwise */ -/* > the leading k by n part of the array B must contain the */ -/* > matrix B. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > On entry, LDB specifies the first dimension of B as declared */ -/* > in the calling (sub) program. When TRANS = 'N' or 'n' */ -/* > then LDB must be at least max( 1, n ), otherwise LDB must */ -/* > be at least max( 1, k ). */ -/* > Unchanged on exit. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is DOUBLE PRECISION . */ -/* > On entry, BETA specifies the scalar beta. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is COMPLEX*16 array, dimension ( LDC, N ) */ -/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ -/* > upper triangular part of the array C must contain the upper */ -/* > triangular part of the hermitian matrix and the strictly */ -/* > lower triangular part of C is not referenced. On exit, the */ -/* > upper triangular part of the array C is overwritten by the */ -/* > upper triangular part of the updated matrix. */ -/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ -/* > lower triangular part of the array C must contain the lower */ -/* > triangular part of the hermitian matrix and the strictly */ -/* > upper triangular part of C is not referenced. On exit, the */ -/* > lower triangular part of the array C is overwritten by the */ -/* > lower triangular part of the updated matrix. */ -/* > Note that the imaginary parts of the diagonal elements need */ -/* > not be set, they are assumed to be zero, and on exit they */ -/* > are set to zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > On entry, LDC specifies the first dimension of C as declared */ -/* > in the calling (sub) program. LDC must be at least */ -/* > max( 1, n ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level3 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 3 Blas routine. */ -/* > */ -/* > -- Written on 8-February-1989. */ -/* > Jack Dongarra, Argonne National Laboratory. */ -/* > Iain Duff, AERE Harwell. */ -/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ -/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ -/* > */ -/* > -- Modified 8-Nov-93 to set C(J,J) to DBLE( C(J,J) ) when BETA = 1. */ -/* > Ed Anderson, Cray Research Inc. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zher2k_(char *uplo, char *trans, integer *n, integer *k, - doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex * - b, integer *ldb, doublereal *beta, doublecomplex *c__, integer *ldc, - ftnlen uplo_len, ftnlen trans_len) +int zher2k_(char *uplo, char *trans, integer *n, integer *k, doublecomplex *alpha, doublecomplex *a, + integer *lda, doublecomplex *b, integer *ldb, doublereal *beta, doublecomplex *c__, + integer *ldc, ftnlen uplo_len, ftnlen trans_len) { - /* System generated locals */ - integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, - i__3, i__4, i__5, i__6, i__7; + integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, i__3, i__4, i__5, + i__6, i__7; doublereal d__1; doublecomplex z__1, z__2, z__3, z__4, z__5, z__6; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j, l, info; doublecomplex temp1, temp2; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nrowa; logical upper; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level3 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Parameters .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -268,46 +26,36 @@ extern "C" { c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; - - /* Function Body */ if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { nrowa = *n; } else { nrowa = *k; } upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - info = 0; - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"C", (ftnlen)1, (ftnlen)1)) { + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 2; } else if (*n < 0) { info = 3; } else if (*k < 0) { info = 4; - } else if (*lda < max(1,nrowa)) { + } else if (*lda < max(1, nrowa)) { info = 7; - } else if (*ldb < max(1,nrowa)) { + } else if (*ldb < max(1, nrowa)) { info = 9; - } else if (*ldc < max(1,*n)) { + } else if (*ldc < max(1, *n)) { info = 12; } if (info != 0) { xerbla_((char *)"ZHER2K", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - - if (*n == 0 || (alpha->r == 0. && alpha->i == 0. || *k == 0) && *beta == - 1.) { + if (*n == 0 || (alpha->r == 0. && alpha->i == 0. || *k == 0) && *beta == 1.) { return 0; } - -/* And when alpha.eq.zero. */ - if (alpha->r == 0. && alpha->i == 0.) { if (upper) { if (*beta == 0.) { @@ -317,9 +65,7 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; c__[i__3].r = 0., c__[i__3].i = 0.; -/* L10: */ } -/* L20: */ } } else { i__1 = *n; @@ -328,16 +74,13 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; i__4 = i__ + j * c_dim1; - z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ - i__4].i; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[i__4].i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L30: */ } i__2 = j + j * c_dim1; i__3 = j + j * c_dim1; d__1 = *beta * c__[i__3].r; c__[i__2].r = d__1, c__[i__2].i = 0.; -/* L40: */ } } } else { @@ -348,9 +91,7 @@ extern "C" { for (i__ = j; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; c__[i__3].r = 0., c__[i__3].i = 0.; -/* L50: */ } -/* L60: */ } } else { i__1 = *n; @@ -363,25 +104,15 @@ extern "C" { for (i__ = j + 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; i__4 = i__ + j * c_dim1; - z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ - i__4].i; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[i__4].i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L70: */ } -/* L80: */ } } } return 0; } - -/* Start the operations. */ - if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form C := alpha*A*B**H + conjg( alpha )*B*A**H + */ -/* C. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -390,17 +121,14 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; c__[i__3].r = 0., c__[i__3].i = 0.; -/* L90: */ } } else if (*beta != 1.) { i__2 = j - 1; for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; i__4 = i__ + j * c_dim1; - z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ - i__4].i; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[i__4].i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L100: */ } i__2 = j + j * c_dim1; i__3 = j + j * c_dim1; @@ -416,17 +144,15 @@ extern "C" { for (l = 1; l <= i__2; ++l) { i__3 = j + l * a_dim1; i__4 = j + l * b_dim1; - if (a[i__3].r != 0. || a[i__3].i != 0. || (b[i__4].r != - 0. || b[i__4].i != 0.)) { + if (a[i__3].r != 0. || a[i__3].i != 0. || + (b[i__4].r != 0. || b[i__4].i != 0.)) { d_lmp_cnjg(&z__2, &b[j + l * b_dim1]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, - z__1.i = alpha->r * z__2.i + alpha->i * - z__2.r; + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp1.r = z__1.r, temp1.i = z__1.i; i__3 = j + l * a_dim1; z__2.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, - z__2.i = alpha->r * a[i__3].i + alpha->i * a[ - i__3].r; + z__2.i = alpha->r * a[i__3].i + alpha->i * a[i__3].r; d_lmp_cnjg(&z__1, &z__2); temp2.r = z__1.r, temp2.i = z__1.i; i__3 = j - 1; @@ -434,37 +160,28 @@ extern "C" { i__4 = i__ + j * c_dim1; i__5 = i__ + j * c_dim1; i__6 = i__ + l * a_dim1; - z__3.r = a[i__6].r * temp1.r - a[i__6].i * - temp1.i, z__3.i = a[i__6].r * temp1.i + a[ - i__6].i * temp1.r; - z__2.r = c__[i__5].r + z__3.r, z__2.i = c__[i__5] - .i + z__3.i; + z__3.r = a[i__6].r * temp1.r - a[i__6].i * temp1.i, + z__3.i = a[i__6].r * temp1.i + a[i__6].i * temp1.r; + z__2.r = c__[i__5].r + z__3.r, z__2.i = c__[i__5].i + z__3.i; i__7 = i__ + l * b_dim1; - z__4.r = b[i__7].r * temp2.r - b[i__7].i * - temp2.i, z__4.i = b[i__7].r * temp2.i + b[ - i__7].i * temp2.r; - z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + - z__4.i; + z__4.r = b[i__7].r * temp2.r - b[i__7].i * temp2.i, + z__4.i = b[i__7].r * temp2.i + b[i__7].i * temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; -/* L110: */ } i__3 = j + j * c_dim1; i__4 = j + j * c_dim1; i__5 = j + l * a_dim1; z__2.r = a[i__5].r * temp1.r - a[i__5].i * temp1.i, - z__2.i = a[i__5].r * temp1.i + a[i__5].i * - temp1.r; + z__2.i = a[i__5].r * temp1.i + a[i__5].i * temp1.r; i__6 = j + l * b_dim1; z__3.r = b[i__6].r * temp2.r - b[i__6].i * temp2.i, - z__3.i = b[i__6].r * temp2.i + b[i__6].i * - temp2.r; + z__3.i = b[i__6].r * temp2.i + b[i__6].i * temp2.r; z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; d__1 = c__[i__4].r + z__1.r; c__[i__3].r = d__1, c__[i__3].i = 0.; } -/* L120: */ } -/* L130: */ } } else { i__1 = *n; @@ -474,17 +191,14 @@ extern "C" { for (i__ = j; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; c__[i__3].r = 0., c__[i__3].i = 0.; -/* L140: */ } } else if (*beta != 1.) { i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { i__3 = i__ + j * c_dim1; i__4 = i__ + j * c_dim1; - z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[ - i__4].i; + z__1.r = *beta * c__[i__4].r, z__1.i = *beta * c__[i__4].i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L150: */ } i__2 = j + j * c_dim1; i__3 = j + j * c_dim1; @@ -500,17 +214,15 @@ extern "C" { for (l = 1; l <= i__2; ++l) { i__3 = j + l * a_dim1; i__4 = j + l * b_dim1; - if (a[i__3].r != 0. || a[i__3].i != 0. || (b[i__4].r != - 0. || b[i__4].i != 0.)) { + if (a[i__3].r != 0. || a[i__3].i != 0. || + (b[i__4].r != 0. || b[i__4].i != 0.)) { d_lmp_cnjg(&z__2, &b[j + l * b_dim1]); z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, - z__1.i = alpha->r * z__2.i + alpha->i * - z__2.r; + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp1.r = z__1.r, temp1.i = z__1.i; i__3 = j + l * a_dim1; z__2.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, - z__2.i = alpha->r * a[i__3].i + alpha->i * a[ - i__3].r; + z__2.i = alpha->r * a[i__3].i + alpha->i * a[i__3].r; d_lmp_cnjg(&z__1, &z__2); temp2.r = z__1.r, temp2.i = z__1.i; i__3 = *n; @@ -518,44 +230,31 @@ extern "C" { i__4 = i__ + j * c_dim1; i__5 = i__ + j * c_dim1; i__6 = i__ + l * a_dim1; - z__3.r = a[i__6].r * temp1.r - a[i__6].i * - temp1.i, z__3.i = a[i__6].r * temp1.i + a[ - i__6].i * temp1.r; - z__2.r = c__[i__5].r + z__3.r, z__2.i = c__[i__5] - .i + z__3.i; + z__3.r = a[i__6].r * temp1.r - a[i__6].i * temp1.i, + z__3.i = a[i__6].r * temp1.i + a[i__6].i * temp1.r; + z__2.r = c__[i__5].r + z__3.r, z__2.i = c__[i__5].i + z__3.i; i__7 = i__ + l * b_dim1; - z__4.r = b[i__7].r * temp2.r - b[i__7].i * - temp2.i, z__4.i = b[i__7].r * temp2.i + b[ - i__7].i * temp2.r; - z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + - z__4.i; + z__4.r = b[i__7].r * temp2.r - b[i__7].i * temp2.i, + z__4.i = b[i__7].r * temp2.i + b[i__7].i * temp2.r; + z__1.r = z__2.r + z__4.r, z__1.i = z__2.i + z__4.i; c__[i__4].r = z__1.r, c__[i__4].i = z__1.i; -/* L160: */ } i__3 = j + j * c_dim1; i__4 = j + j * c_dim1; i__5 = j + l * a_dim1; z__2.r = a[i__5].r * temp1.r - a[i__5].i * temp1.i, - z__2.i = a[i__5].r * temp1.i + a[i__5].i * - temp1.r; + z__2.i = a[i__5].r * temp1.i + a[i__5].i * temp1.r; i__6 = j + l * b_dim1; z__3.r = b[i__6].r * temp2.r - b[i__6].i * temp2.i, - z__3.i = b[i__6].r * temp2.i + b[i__6].i * - temp2.r; + z__3.i = b[i__6].r * temp2.i + b[i__6].i * temp2.r; z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; d__1 = c__[i__4].r + z__1.r; c__[i__3].r = d__1, c__[i__3].i = 0.; } -/* L170: */ } -/* L180: */ } } } else { - -/* Form C := alpha*A**H*B + conjg( alpha )*B**H*A + */ -/* C. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -568,45 +267,36 @@ extern "C" { d_lmp_cnjg(&z__3, &a[l + i__ * a_dim1]); i__4 = l + j * b_dim1; z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, - z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] - .r; + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4].r; z__1.r = temp1.r + z__2.r, z__1.i = temp1.i + z__2.i; temp1.r = z__1.r, temp1.i = z__1.i; d_lmp_cnjg(&z__3, &b[l + i__ * b_dim1]); i__4 = l + j * a_dim1; z__2.r = z__3.r * a[i__4].r - z__3.i * a[i__4].i, - z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4] - .r; + z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4].r; z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; temp2.r = z__1.r, temp2.i = z__1.i; -/* L190: */ } if (i__ == j) { if (*beta == 0.) { i__3 = j + j * c_dim1; z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__2.i = alpha->r * temp1.i + alpha->i * - temp1.r; + z__2.i = alpha->r * temp1.i + alpha->i * temp1.r; d_lmp_cnjg(&z__4, alpha); z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, - z__3.i = z__4.r * temp2.i + z__4.i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.i = z__4.r * temp2.i + z__4.i * temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; d__1 = z__1.r; c__[i__3].r = d__1, c__[i__3].i = 0.; } else { i__3 = j + j * c_dim1; i__4 = j + j * c_dim1; z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__2.i = alpha->r * temp1.i + alpha->i * - temp1.r; + z__2.i = alpha->r * temp1.i + alpha->i * temp1.r; d_lmp_cnjg(&z__4, alpha); z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, - z__3.i = z__4.r * temp2.i + z__4.i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.i = z__4.r * temp2.i + z__4.i * temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; d__1 = *beta * c__[i__4].r + z__1.r; c__[i__3].r = d__1, c__[i__3].i = 0.; } @@ -614,37 +304,27 @@ extern "C" { if (*beta == 0.) { i__3 = i__ + j * c_dim1; z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__2.i = alpha->r * temp1.i + alpha->i * - temp1.r; + z__2.i = alpha->r * temp1.i + alpha->i * temp1.r; d_lmp_cnjg(&z__4, alpha); z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, - z__3.i = z__4.r * temp2.i + z__4.i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.i = z__4.r * temp2.i + z__4.i * temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } else { i__3 = i__ + j * c_dim1; i__4 = i__ + j * c_dim1; - z__3.r = *beta * c__[i__4].r, z__3.i = *beta * - c__[i__4].i; + z__3.r = *beta * c__[i__4].r, z__3.i = *beta * c__[i__4].i; z__4.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__4.i = alpha->r * temp1.i + alpha->i * - temp1.r; - z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + - z__4.i; + z__4.i = alpha->r * temp1.i + alpha->i * temp1.r; + z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + z__4.i; d_lmp_cnjg(&z__6, alpha); z__5.r = z__6.r * temp2.r - z__6.i * temp2.i, - z__5.i = z__6.r * temp2.i + z__6.i * - temp2.r; - z__1.r = z__2.r + z__5.r, z__1.i = z__2.i + - z__5.i; + z__5.i = z__6.r * temp2.i + z__6.i * temp2.r; + z__1.r = z__2.r + z__5.r, z__1.i = z__2.i + z__5.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } } -/* L200: */ } -/* L210: */ } } else { i__1 = *n; @@ -658,45 +338,36 @@ extern "C" { d_lmp_cnjg(&z__3, &a[l + i__ * a_dim1]); i__4 = l + j * b_dim1; z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, - z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4] - .r; + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4].r; z__1.r = temp1.r + z__2.r, z__1.i = temp1.i + z__2.i; temp1.r = z__1.r, temp1.i = z__1.i; d_lmp_cnjg(&z__3, &b[l + i__ * b_dim1]); i__4 = l + j * a_dim1; z__2.r = z__3.r * a[i__4].r - z__3.i * a[i__4].i, - z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4] - .r; + z__2.i = z__3.r * a[i__4].i + z__3.i * a[i__4].r; z__1.r = temp2.r + z__2.r, z__1.i = temp2.i + z__2.i; temp2.r = z__1.r, temp2.i = z__1.i; -/* L220: */ } if (i__ == j) { if (*beta == 0.) { i__3 = j + j * c_dim1; z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__2.i = alpha->r * temp1.i + alpha->i * - temp1.r; + z__2.i = alpha->r * temp1.i + alpha->i * temp1.r; d_lmp_cnjg(&z__4, alpha); z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, - z__3.i = z__4.r * temp2.i + z__4.i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.i = z__4.r * temp2.i + z__4.i * temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; d__1 = z__1.r; c__[i__3].r = d__1, c__[i__3].i = 0.; } else { i__3 = j + j * c_dim1; i__4 = j + j * c_dim1; z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__2.i = alpha->r * temp1.i + alpha->i * - temp1.r; + z__2.i = alpha->r * temp1.i + alpha->i * temp1.r; d_lmp_cnjg(&z__4, alpha); z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, - z__3.i = z__4.r * temp2.i + z__4.i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.i = z__4.r * temp2.i + z__4.i * temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; d__1 = *beta * c__[i__4].r + z__1.r; c__[i__3].r = d__1, c__[i__3].i = 0.; } @@ -704,47 +375,32 @@ extern "C" { if (*beta == 0.) { i__3 = i__ + j * c_dim1; z__2.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__2.i = alpha->r * temp1.i + alpha->i * - temp1.r; + z__2.i = alpha->r * temp1.i + alpha->i * temp1.r; d_lmp_cnjg(&z__4, alpha); z__3.r = z__4.r * temp2.r - z__4.i * temp2.i, - z__3.i = z__4.r * temp2.i + z__4.i * - temp2.r; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.i = z__4.r * temp2.i + z__4.i * temp2.r; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } else { i__3 = i__ + j * c_dim1; i__4 = i__ + j * c_dim1; - z__3.r = *beta * c__[i__4].r, z__3.i = *beta * - c__[i__4].i; + z__3.r = *beta * c__[i__4].r, z__3.i = *beta * c__[i__4].i; z__4.r = alpha->r * temp1.r - alpha->i * temp1.i, - z__4.i = alpha->r * temp1.i + alpha->i * - temp1.r; - z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + - z__4.i; + z__4.i = alpha->r * temp1.i + alpha->i * temp1.r; + z__2.r = z__3.r + z__4.r, z__2.i = z__3.i + z__4.i; d_lmp_cnjg(&z__6, alpha); z__5.r = z__6.r * temp2.r - z__6.i * temp2.i, - z__5.i = z__6.r * temp2.i + z__6.i * - temp2.r; - z__1.r = z__2.r + z__5.r, z__1.i = z__2.i + - z__5.i; + z__5.i = z__6.r * temp2.i + z__6.i * temp2.r; + z__1.r = z__2.r + z__5.r, z__1.i = z__2.i + z__5.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; } } -/* L230: */ } -/* L240: */ } } } - return 0; - -/* End of ZHER2K */ - -} /* zher2k_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zhetd2.cpp b/lib/linalg/zhetd2.cpp index 71ad2aeab4..46ec1316e0 100644 --- a/lib/linalg/zhetd2.cpp +++ b/lib/linalg/zhetd2.cpp @@ -1,272 +1,44 @@ -/* fortran/zhetd2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - -static doublecomplex c_b2 = {0.,0.}; +static doublecomplex c_b2 = {0., 0.}; static integer c__1 = 1; - -/* > \brief \b ZHETD2 reduces a Hermitian matrix to real symmetric tridiagonal form by an unitary similarity t -ransformation (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZHETD2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZHETD2( UPLO, N, A, LDA, D, E, TAU, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDA, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( * ), E( * ) */ -/* COMPLEX*16 A( LDA, * ), TAU( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZHETD2 reduces a complex Hermitian matrix A to real symmetric */ -/* > tridiagonal form T by a unitary similarity transformation: */ -/* > Q**H * A * Q = T. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies whether the upper or lower triangular part of the */ -/* > Hermitian matrix A is stored: */ -/* > = 'U': Upper triangular */ -/* > = 'L': Lower triangular */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > On entry, the Hermitian matrix A. If UPLO = 'U', the leading */ -/* > n-by-n upper triangular part of A contains the upper */ -/* > triangular part of the matrix A, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading n-by-n lower triangular part of A contains the lower */ -/* > triangular part of the matrix A, and the strictly upper */ -/* > triangular part of A is not referenced. */ -/* > On exit, if UPLO = 'U', the diagonal and first superdiagonal */ -/* > of A are overwritten by the corresponding elements of the */ -/* > tridiagonal matrix T, and the elements above the first */ -/* > superdiagonal, with the array TAU, represent the unitary */ -/* > matrix Q as a product of elementary reflectors; if UPLO */ -/* > = 'L', the diagonal and first subdiagonal of A are over- */ -/* > written by the corresponding elements of the tridiagonal */ -/* > matrix T, and the elements below the first subdiagonal, with */ -/* > the array TAU, represent the unitary matrix Q as a product */ -/* > of elementary reflectors. See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > The diagonal elements of the tridiagonal matrix T: */ -/* > D(i) = A(i,i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > The off-diagonal elements of the tridiagonal matrix T: */ -/* > E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (N-1) */ -/* > The scalar factors of the elementary reflectors (see Further */ -/* > Details). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16HEcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > If UPLO = 'U', the matrix Q is represented as a product of elementary */ -/* > reflectors */ -/* > */ -/* > Q = H(n-1) . . . H(2) H(1). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**H */ -/* > */ -/* > where tau is a complex scalar, and v is a complex vector with */ -/* > v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in */ -/* > A(1:i-1,i+1), and tau in TAU(i). */ -/* > */ -/* > If UPLO = 'L', the matrix Q is represented as a product of elementary */ -/* > reflectors */ -/* > */ -/* > Q = H(1) H(2) . . . H(n-1). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**H */ -/* > */ -/* > where tau is a complex scalar, and v is a complex vector with */ -/* > v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), */ -/* > and tau in TAU(i). */ -/* > */ -/* > The contents of A on exit are illustrated by the following examples */ -/* > with n = 5: */ -/* > */ -/* > if UPLO = 'U': if UPLO = 'L': */ -/* > */ -/* > ( d e v2 v3 v4 ) ( d ) */ -/* > ( d e v3 v4 ) ( e d ) */ -/* > ( d e v4 ) ( v1 e d ) */ -/* > ( d e ) ( v1 v2 e d ) */ -/* > ( d ) ( v1 v2 v3 e d ) */ -/* > */ -/* > where d and e denote diagonal and off-diagonal elements of T, and vi */ -/* > denotes an element of the vector defining H(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zhetd2_(char *uplo, integer *n, doublecomplex *a, - integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, - integer *info, ftnlen uplo_len) +int zhetd2_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, + doublecomplex *tau, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublereal d__1; doublecomplex z__1, z__2, z__3, z__4; - - /* Local variables */ integer i__; doublecomplex taui; - extern /* Subroutine */ int zher2_(char *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, ftnlen); + extern int zher2_(char *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen); doublecomplex alpha; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *); - extern /* Subroutine */ int zhemv_(char *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, doublecomplex *, integer *, ftnlen); + extern VOID zdotc_(doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *); + extern int zhemv_(char *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, integer *, + ftnlen); logical upper; - extern /* Subroutine */ int zaxpy_(integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *), xerbla_( - char *, integer *, ftnlen), zlarfg_(integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters */ - - /* Parameter adjustments */ + extern int zaxpy_(integer *, doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *), + xerbla_(char *, integer *, ftnlen), + zlarfg_(integer *, doublecomplex *, doublecomplex *, integer *, doublecomplex *); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --d__; --e; --tau; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -4; } if (*info != 0) { @@ -274,63 +46,35 @@ f"> */ xerbla_((char *)"ZHETD2", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n <= 0) { return 0; } - if (upper) { - -/* Reduce the upper triangle of A */ - i__1 = *n + *n * a_dim1; i__2 = *n + *n * a_dim1; d__1 = a[i__2].r; a[i__1].r = d__1, a[i__1].i = 0.; for (i__ = *n - 1; i__ >= 1; --i__) { - -/* Generate elementary reflector H(i) = I - tau * v * v**H */ -/* to annihilate A(1:i-1,i+1) */ - i__1 = i__ + (i__ + 1) * a_dim1; alpha.r = a[i__1].r, alpha.i = a[i__1].i; zlarfg_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &taui); e[i__] = alpha.r; - if (taui.r != 0. || taui.i != 0.) { - -/* Apply H(i) from both sides to A(1:i,1:i) */ - i__1 = i__ + (i__ + 1) * a_dim1; a[i__1].r = 1., a[i__1].i = 0.; - -/* Compute x := tau * A * v storing x in TAU(1:i) */ - - zhemv_(uplo, &i__, &taui, &a[a_offset], lda, &a[(i__ + 1) * - a_dim1 + 1], &c__1, &c_b2, &tau[1], &c__1, (ftnlen)1); - -/* Compute w := x - 1/2 * tau * (x**H * v) * v */ - + zhemv_(uplo, &i__, &taui, &a[a_offset], lda, &a[(i__ + 1) * a_dim1 + 1], &c__1, + &c_b2, &tau[1], &c__1, (ftnlen)1); z__3.r = -.5, z__3.i = -0.; - z__2.r = z__3.r * taui.r - z__3.i * taui.i, z__2.i = z__3.r * - taui.i + z__3.i * taui.r; - zdotc_(&z__4, &i__, &tau[1], &c__1, &a[(i__ + 1) * a_dim1 + 1] - , &c__1); - z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * - z__4.i + z__2.i * z__4.r; + z__2.r = z__3.r * taui.r - z__3.i * taui.i, + z__2.i = z__3.r * taui.i + z__3.i * taui.r; + zdotc_(&z__4, &i__, &tau[1], &c__1, &a[(i__ + 1) * a_dim1 + 1], &c__1); + z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, + z__1.i = z__2.r * z__4.i + z__2.i * z__4.r; alpha.r = z__1.r, alpha.i = z__1.i; - zaxpy_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[ - 1], &c__1); - -/* Apply the transformation as a rank-2 update: */ -/* A := A - v * w**H - w * v**H */ - + zaxpy_(&i__, &alpha, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[1], &c__1); z__1.r = -1., z__1.i = -0.; - zher2_(uplo, &i__, &z__1, &a[(i__ + 1) * a_dim1 + 1], &c__1, & - tau[1], &c__1, &a[a_offset], lda, (ftnlen)1); - + zher2_(uplo, &i__, &z__1, &a[(i__ + 1) * a_dim1 + 1], &c__1, &tau[1], &c__1, + &a[a_offset], lda, (ftnlen)1); } else { i__1 = i__ + i__ * a_dim1; i__2 = i__ + i__ * a_dim1; @@ -344,71 +88,42 @@ f"> */ d__[i__ + 1] = a[i__1].r; i__1 = i__; tau[i__1].r = taui.r, tau[i__1].i = taui.i; -/* L10: */ } i__1 = a_dim1 + 1; d__[1] = a[i__1].r; } else { - -/* Reduce the lower triangle of A */ - i__1 = a_dim1 + 1; i__2 = a_dim1 + 1; d__1 = a[i__2].r; a[i__1].r = d__1, a[i__1].i = 0.; i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Generate elementary reflector H(i) = I - tau * v * v**H */ -/* to annihilate A(i+2:n,i) */ - i__2 = i__ + 1 + i__ * a_dim1; alpha.r = a[i__2].r, alpha.i = a[i__2].i; i__2 = *n - i__; -/* Computing MIN */ i__3 = i__ + 2; - zlarfg_(&i__2, &alpha, &a[min(i__3,*n) + i__ * a_dim1], &c__1, & - taui); + zlarfg_(&i__2, &alpha, &a[min(i__3, *n) + i__ * a_dim1], &c__1, &taui); e[i__] = alpha.r; - if (taui.r != 0. || taui.i != 0.) { - -/* Apply H(i) from both sides to A(i+1:n,i+1:n) */ - i__2 = i__ + 1 + i__ * a_dim1; a[i__2].r = 1., a[i__2].i = 0.; - -/* Compute x := tau * A * v storing y in TAU(i:n-1) */ - i__2 = *n - i__; - zhemv_(uplo, &i__2, &taui, &a[i__ + 1 + (i__ + 1) * a_dim1], - lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b2, &tau[ - i__], &c__1, (ftnlen)1); - -/* Compute w := x - 1/2 * tau * (x**H * v) * v */ - + zhemv_(uplo, &i__2, &taui, &a[i__ + 1 + (i__ + 1) * a_dim1], lda, + &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b2, &tau[i__], &c__1, (ftnlen)1); z__3.r = -.5, z__3.i = -0.; - z__2.r = z__3.r * taui.r - z__3.i * taui.i, z__2.i = z__3.r * - taui.i + z__3.i * taui.r; + z__2.r = z__3.r * taui.r - z__3.i * taui.i, + z__2.i = z__3.r * taui.i + z__3.i * taui.r; i__2 = *n - i__; - zdotc_(&z__4, &i__2, &tau[i__], &c__1, &a[i__ + 1 + i__ * - a_dim1], &c__1); - z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * - z__4.i + z__2.i * z__4.r; + zdotc_(&z__4, &i__2, &tau[i__], &c__1, &a[i__ + 1 + i__ * a_dim1], &c__1); + z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, + z__1.i = z__2.r * z__4.i + z__2.i * z__4.r; alpha.r = z__1.r, alpha.i = z__1.i; i__2 = *n - i__; - zaxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[ - i__], &c__1); - -/* Apply the transformation as a rank-2 update: */ -/* A := A - v * w**H - w * v**H */ - + zaxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[i__], &c__1); i__2 = *n - i__; z__1.r = -1., z__1.i = -0.; - zher2_(uplo, &i__2, &z__1, &a[i__ + 1 + i__ * a_dim1], &c__1, - &tau[i__], &c__1, &a[i__ + 1 + (i__ + 1) * a_dim1], - lda, (ftnlen)1); - + zher2_(uplo, &i__2, &z__1, &a[i__ + 1 + i__ * a_dim1], &c__1, &tau[i__], &c__1, + &a[i__ + 1 + (i__ + 1) * a_dim1], lda, (ftnlen)1); } else { i__2 = i__ + 1 + (i__ + 1) * a_dim1; i__3 = i__ + 1 + (i__ + 1) * a_dim1; @@ -422,18 +137,12 @@ f"> */ d__[i__] = a[i__2].r; i__2 = i__; tau[i__2].r = taui.r, tau[i__2].i = taui.i; -/* L20: */ } i__1 = *n + *n * a_dim1; d__[*n] = a[i__1].r; } - return 0; - -/* End of ZHETD2 */ - -} /* zhetd2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zhetrd.cpp b/lib/linalg/zhetrd.cpp index ed3de347ef..94df1e8159 100644 --- a/lib/linalg/zhetrd.cpp +++ b/lib/linalg/zhetrd.cpp @@ -1,275 +1,33 @@ -/* fortran/zhetrd.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; static doublereal c_b23 = 1.; - -/* > \brief \b ZHETRD */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZHETRD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZHETRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDA, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( * ), E( * ) */ -/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZHETRD reduces a complex Hermitian matrix A to real symmetric */ -/* > tridiagonal form T by a unitary similarity transformation: */ -/* > Q**H * A * Q = T. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A is stored; */ -/* > = 'L': Lower triangle of A is stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > On entry, the Hermitian matrix A. If UPLO = 'U', the leading */ -/* > N-by-N upper triangular part of A contains the upper */ -/* > triangular part of the matrix A, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading N-by-N lower triangular part of A contains the lower */ -/* > triangular part of the matrix A, and the strictly upper */ -/* > triangular part of A is not referenced. */ -/* > On exit, if UPLO = 'U', the diagonal and first superdiagonal */ -/* > of A are overwritten by the corresponding elements of the */ -/* > tridiagonal matrix T, and the elements above the first */ -/* > superdiagonal, with the array TAU, represent the unitary */ -/* > matrix Q as a product of elementary reflectors; if UPLO */ -/* > = 'L', the diagonal and first subdiagonal of A are over- */ -/* > written by the corresponding elements of the tridiagonal */ -/* > matrix T, and the elements below the first subdiagonal, with */ -/* > the array TAU, represent the unitary matrix Q as a product */ -/* > of elementary reflectors. See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > The diagonal elements of the tridiagonal matrix T: */ -/* > D(i) = A(i,i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > The off-diagonal elements of the tridiagonal matrix T: */ -/* > E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (N-1) */ -/* > The scalar factors of the elementary reflectors (see Further */ -/* > Details). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= 1. */ -/* > For optimum performance LWORK >= N*NB, where NB is the */ -/* > optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16HEcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > If UPLO = 'U', the matrix Q is represented as a product of elementary */ -/* > reflectors */ -/* > */ -/* > Q = H(n-1) . . . H(2) H(1). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**H */ -/* > */ -/* > where tau is a complex scalar, and v is a complex vector with */ -/* > v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in */ -/* > A(1:i-1,i+1), and tau in TAU(i). */ -/* > */ -/* > If UPLO = 'L', the matrix Q is represented as a product of elementary */ -/* > reflectors */ -/* > */ -/* > Q = H(1) H(2) . . . H(n-1). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**H */ -/* > */ -/* > where tau is a complex scalar, and v is a complex vector with */ -/* > v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), */ -/* > and tau in TAU(i). */ -/* > */ -/* > The contents of A on exit are illustrated by the following examples */ -/* > with n = 5: */ -/* > */ -/* > if UPLO = 'U': if UPLO = 'L': */ -/* > */ -/* > ( d e v2 v3 v4 ) ( d ) */ -/* > ( d e v3 v4 ) ( e d ) */ -/* > ( d e v4 ) ( v1 e d ) */ -/* > ( d e ) ( v1 v2 e d ) */ -/* > ( d ) ( v1 v2 v3 e d ) */ -/* > */ -/* > where d and e denote diagonal and off-diagonal elements of T, and vi */ -/* > denotes an element of the vector defining H(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zhetrd_(char *uplo, integer *n, doublecomplex *a, - integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, - doublecomplex *work, integer *lwork, integer *info, ftnlen uplo_len) +int zhetrd_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, + doublecomplex *tau, doublecomplex *work, integer *lwork, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; doublecomplex z__1; - - /* Local variables */ integer i__, j, nb, kk, nx, iws; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; logical upper; - extern /* Subroutine */ int zhetd2_(char *, integer *, doublecomplex *, - integer *, doublereal *, doublereal *, doublecomplex *, integer *, - ftnlen), zher2k_(char *, char *, integer *, integer *, - doublecomplex *, doublecomplex *, integer *, doublecomplex *, - integer *, doublereal *, doublecomplex *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int zlatrd_(char *, integer *, integer *, - doublecomplex *, integer *, doublereal *, doublecomplex *, - doublecomplex *, integer *, ftnlen); + extern int zhetd2_(char *, integer *, doublecomplex *, integer *, doublereal *, doublereal *, + doublecomplex *, integer *, ftnlen), + zher2k_(char *, char *, integer *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublereal *, doublecomplex *, integer *, ftnlen, + ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int zlatrd_(char *, integer *, integer *, doublecomplex *, integer *, doublereal *, + doublecomplex *, doublecomplex *, integer *, ftnlen); integer ldwork, lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -277,31 +35,23 @@ f"> */ --e; --tau; --work; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -4; - } else if (*lwork < 1 && ! lquery) { + } else if (*lwork < 1 && !lquery) { *info = -9; } - if (*info == 0) { - -/* Determine the block size. */ - - nb = ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, - (ftnlen)1); + nb = ilaenv_(&c__1, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); lwkopt = *n * nb; - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"ZHETRD", &i__1, (ftnlen)6); @@ -309,42 +59,24 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { work[1].r = 1., work[1].i = 0.; return 0; } - nx = *n; iws = 1; if (nb > 1 && nb < *n) { - -/* Determine when to cross over from blocked to unblocked code */ -/* (last block is always handled by unblocked code). */ - -/* Computing MAX */ - i__1 = nb, i__2 = ilaenv_(&c__3, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, & - c_n1, (ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); + i__1 = nb, + i__2 = ilaenv_(&c__3, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1, i__2); if (nx < *n) { - -/* Determine if workspace is large enough for blocked code. */ - ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { - -/* Not enough workspace to use optimal NB: determine the */ -/* minimum value of NB, and reduce NB or force use of */ -/* unblocked code by setting NX = N. */ - -/* Computing MAX */ i__1 = *lwork / ldwork; - nb = max(i__1,1); - nbmin = ilaenv_(&c__2, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, - (ftnlen)6, (ftnlen)1); + nb = max(i__1, 1); + nbmin = + ilaenv_(&c__2, (char *)"ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1); if (nb < nbmin) { nx = *n; } @@ -355,38 +87,18 @@ f"> */ } else { nb = 1; } - if (upper) { - -/* Reduce the upper triangle of A. */ -/* Columns 1:kk are handled by the unblocked method. */ - kk = *n - (*n - nx + nb - 1) / nb * nb; i__1 = kk + 1; i__2 = -nb; - for (i__ = *n - nb + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += - i__2) { - -/* Reduce columns i:i+nb-1 to tridiagonal form and form the */ -/* matrix W which is needed to update the unreduced part of */ -/* the matrix */ - + for (i__ = *n - nb + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { i__3 = i__ + nb - 1; - zlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], & - work[1], &ldwork, (ftnlen)1); - -/* Update the unreduced submatrix A(1:i-1,1:i-1), using an */ -/* update of the form: A := A - V*W**H - W*V**H */ - + zlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], &work[1], &ldwork, + (ftnlen)1); i__3 = i__ - 1; z__1.r = -1., z__1.i = -0.; - zher2k_(uplo, (char *)"No transpose", &i__3, &nb, &z__1, &a[i__ * a_dim1 - + 1], lda, &work[1], &ldwork, &c_b23, &a[a_offset], lda, ( - ftnlen)1, (ftnlen)12); - -/* Copy superdiagonal elements back into A, and diagonal */ -/* elements into D */ - + zher2k_(uplo, (char *)"No transpose", &i__3, &nb, &z__1, &a[i__ * a_dim1 + 1], lda, &work[1], + &ldwork, &c_b23, &a[a_offset], lda, (ftnlen)1, (ftnlen)12); i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { i__4 = j - 1 + j * a_dim1; @@ -394,44 +106,21 @@ f"> */ a[i__4].r = e[i__5], a[i__4].i = 0.; i__4 = j + j * a_dim1; d__[j] = a[i__4].r; -/* L10: */ } -/* L20: */ } - -/* Use unblocked code to reduce the last or only block */ - - zhetd2_(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo, - (ftnlen)1); + zhetd2_(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo, (ftnlen)1); } else { - -/* Reduce the lower triangle of A */ - i__2 = *n - nx; i__1 = nb; for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) { - -/* Reduce columns i:i+nb-1 to tridiagonal form and form the */ -/* matrix W which is needed to update the unreduced part of */ -/* the matrix */ - i__3 = *n - i__ + 1; - zlatrd_(uplo, &i__3, &nb, &a[i__ + i__ * a_dim1], lda, &e[i__], & - tau[i__], &work[1], &ldwork, (ftnlen)1); - -/* Update the unreduced submatrix A(i+nb:n,i+nb:n), using */ -/* an update of the form: A := A - V*W**H - W*V**H */ - + zlatrd_(uplo, &i__3, &nb, &a[i__ + i__ * a_dim1], lda, &e[i__], &tau[i__], &work[1], + &ldwork, (ftnlen)1); i__3 = *n - i__ - nb + 1; z__1.r = -1., z__1.i = -0.; - zher2k_(uplo, (char *)"No transpose", &i__3, &nb, &z__1, &a[i__ + nb + - i__ * a_dim1], lda, &work[nb + 1], &ldwork, &c_b23, &a[ - i__ + nb + (i__ + nb) * a_dim1], lda, (ftnlen)1, (ftnlen) - 12); - -/* Copy subdiagonal elements back into A, and diagonal */ -/* elements into D */ - + zher2k_(uplo, (char *)"No transpose", &i__3, &nb, &z__1, &a[i__ + nb + i__ * a_dim1], lda, + &work[nb + 1], &ldwork, &c_b23, &a[i__ + nb + (i__ + nb) * a_dim1], lda, + (ftnlen)1, (ftnlen)12); i__3 = i__ + nb - 1; for (j = i__; j <= i__3; ++j) { i__4 = j + 1 + j * a_dim1; @@ -439,25 +128,15 @@ f"> */ a[i__4].r = e[i__5], a[i__4].i = 0.; i__4 = j + j * a_dim1; d__[j] = a[i__4].r; -/* L30: */ } -/* L40: */ } - -/* Use unblocked code to reduce the last or only block */ - i__1 = *n - i__ + 1; - zhetd2_(uplo, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], - &tau[i__], &iinfo, (ftnlen)1); + zhetd2_(uplo, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], &tau[i__], &iinfo, + (ftnlen)1); } - - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; return 0; - -/* End of ZHETRD */ - -} /* zhetrd_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zhpr.cpp b/lib/linalg/zhpr.cpp index 29ed826c46..9e1e441830 100644 --- a/lib/linalg/zhpr.cpp +++ b/lib/linalg/zhpr.cpp @@ -1,198 +1,22 @@ -/* fortran/zhpr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZHPR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZHPR(UPLO,N,ALPHA,X,INCX,AP) */ - -/* .. Scalar Arguments .. */ -/* DOUBLE PRECISION ALPHA */ -/* INTEGER INCX,N */ -/* CHARACTER UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 AP(*),X(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZHPR performs the hermitian rank 1 operation */ -/* > */ -/* > A := alpha*x*x**H + A, */ -/* > */ -/* > where alpha is a real scalar, x is an n element vector and A is an */ -/* > n by n hermitian matrix, supplied in packed form. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the upper or lower */ -/* > triangular part of the matrix A is supplied in the packed */ -/* > array AP as follows: */ -/* > */ -/* > UPLO = 'U' or 'u' The upper triangular part of A is */ -/* > supplied in AP. */ -/* > */ -/* > UPLO = 'L' or 'l' The lower triangular part of A is */ -/* > supplied in AP. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is DOUBLE PRECISION. */ -/* > On entry, ALPHA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array X must contain the n */ -/* > element vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] AP */ -/* > \verbatim */ -/* > AP is COMPLEX*16 array, dimension at least */ -/* > ( ( n*( n + 1 ) )/2 ). */ -/* > Before entry with UPLO = 'U' or 'u', the array AP must */ -/* > contain the upper triangular part of the hermitian matrix */ -/* > packed sequentially, column by column, so that AP( 1 ) */ -/* > contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 ) */ -/* > and a( 2, 2 ) respectively, and so on. On exit, the array */ -/* > AP is overwritten by the upper triangular part of the */ -/* > updated matrix. */ -/* > Before entry with UPLO = 'L' or 'l', the array AP must */ -/* > contain the lower triangular part of the hermitian matrix */ -/* > packed sequentially, column by column, so that AP( 1 ) */ -/* > contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 ) */ -/* > and a( 3, 1 ) respectively, and so on. On exit, the array */ -/* > AP is overwritten by the lower triangular part of the */ -/* > updated matrix. */ -/* > Note that the imaginary parts of the diagonal elements need */ -/* > not be set, they are assumed to be zero, and on exit they */ -/* > are set to zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zhpr_(char *uplo, integer *n, doublereal *alpha, - doublecomplex *x, integer *incx, doublecomplex *ap, ftnlen uplo_len) +int zhpr_(char *uplo, integer *n, doublereal *alpha, doublecomplex *x, integer *incx, + doublecomplex *ap, ftnlen uplo_len) { - /* System generated locals */ integer i__1, i__2, i__3, i__4, i__5; doublereal d__1; doublecomplex z__1, z__2; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j, k, kk, ix, jx, kx, info; doublecomplex temp; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); --ap; --x; - - /* Function Body */ info = 0; - if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; } else if (*n < 0) { info = 2; @@ -203,29 +27,16 @@ extern "C" { xerbla_((char *)"ZHPR ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*n == 0 || *alpha == 0.) { return 0; } - -/* Set the start point in X if the increment is not unity. */ - if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } - -/* Start the operations. In this version the elements of the array AP */ -/* are accessed sequentially with one pass through AP. */ - kk = 1; if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - -/* Form A when upper triangle is stored in AP. */ - if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -241,19 +52,16 @@ extern "C" { i__4 = k; i__5 = i__; z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, - z__2.i = x[i__5].r * temp.i + x[i__5].i * - temp.r; - z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + - z__2.i; + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + z__2.i; ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; ++k; -/* L10: */ } i__2 = kk + j - 1; i__3 = kk + j - 1; i__4 = j; - z__1.r = x[i__4].r * temp.r - x[i__4].i * temp.i, z__1.i = - x[i__4].r * temp.i + x[i__4].i * temp.r; + z__1.r = x[i__4].r * temp.r - x[i__4].i * temp.i, + z__1.i = x[i__4].r * temp.i + x[i__4].i * temp.r; d__1 = ap[i__3].r + z__1.r; ap[i__2].r = d__1, ap[i__2].i = 0.; } else { @@ -263,7 +71,6 @@ extern "C" { ap[i__2].r = d__1, ap[i__2].i = 0.; } kk += j; -/* L20: */ } } else { jx = kx; @@ -281,19 +88,16 @@ extern "C" { i__4 = k; i__5 = ix; z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, - z__2.i = x[i__5].r * temp.i + x[i__5].i * - temp.r; - z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + - z__2.i; + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + z__2.i; ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; ix += *incx; -/* L30: */ } i__2 = kk + j - 1; i__3 = kk + j - 1; i__4 = jx; - z__1.r = x[i__4].r * temp.r - x[i__4].i * temp.i, z__1.i = - x[i__4].r * temp.i + x[i__4].i * temp.r; + z__1.r = x[i__4].r * temp.r - x[i__4].i * temp.i, + z__1.i = x[i__4].r * temp.i + x[i__4].i * temp.r; d__1 = ap[i__3].r + z__1.r; ap[i__2].r = d__1, ap[i__2].i = 0.; } else { @@ -304,13 +108,9 @@ extern "C" { } jx += *incx; kk += j; -/* L40: */ } } } else { - -/* Form A when lower triangle is stored in AP. */ - if (*incx == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -322,8 +122,8 @@ extern "C" { i__2 = kk; i__3 = kk; i__4 = j; - z__1.r = temp.r * x[i__4].r - temp.i * x[i__4].i, z__1.i = - temp.r * x[i__4].i + temp.i * x[i__4].r; + z__1.r = temp.r * x[i__4].r - temp.i * x[i__4].i, + z__1.i = temp.r * x[i__4].i + temp.i * x[i__4].r; d__1 = ap[i__3].r + z__1.r; ap[i__2].r = d__1, ap[i__2].i = 0.; k = kk + 1; @@ -333,13 +133,10 @@ extern "C" { i__4 = k; i__5 = i__; z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, - z__2.i = x[i__5].r * temp.i + x[i__5].i * - temp.r; - z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + - z__2.i; + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + z__2.i; ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; ++k; -/* L50: */ } } else { i__2 = kk; @@ -348,7 +145,6 @@ extern "C" { ap[i__2].r = d__1, ap[i__2].i = 0.; } kk = kk + *n - j + 1; -/* L60: */ } } else { jx = kx; @@ -362,8 +158,8 @@ extern "C" { i__2 = kk; i__3 = kk; i__4 = jx; - z__1.r = temp.r * x[i__4].r - temp.i * x[i__4].i, z__1.i = - temp.r * x[i__4].i + temp.i * x[i__4].r; + z__1.r = temp.r * x[i__4].r - temp.i * x[i__4].i, + z__1.i = temp.r * x[i__4].i + temp.i * x[i__4].r; d__1 = ap[i__3].r + z__1.r; ap[i__2].r = d__1, ap[i__2].i = 0.; ix = jx; @@ -374,12 +170,9 @@ extern "C" { i__4 = k; i__5 = ix; z__2.r = x[i__5].r * temp.r - x[i__5].i * temp.i, - z__2.i = x[i__5].r * temp.i + x[i__5].i * - temp.r; - z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + - z__2.i; + z__2.i = x[i__5].r * temp.i + x[i__5].i * temp.r; + z__1.r = ap[i__4].r + z__2.r, z__1.i = ap[i__4].i + z__2.i; ap[i__3].r = z__1.r, ap[i__3].i = z__1.i; -/* L70: */ } } else { i__2 = kk; @@ -389,17 +182,11 @@ extern "C" { } jx += *incx; kk = kk + *n - j + 1; -/* L80: */ } } } - return 0; - -/* End of ZHPR */ - -} /* zhpr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlacgv.cpp b/lib/linalg/zlacgv.cpp index d73cd7b759..bf6a1e8a42 100644 --- a/lib/linalg/zlacgv.cpp +++ b/lib/linalg/zlacgv.cpp @@ -1,136 +1,20 @@ -/* fortran/zlacgv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZLACGV conjugates a complex vector. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLACGV + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLACGV( N, X, INCX ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 X( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLACGV conjugates a complex vector of length N. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The length of the vector X. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 array, dimension */ -/* > (1+(N-1)*abs(INCX)) */ -/* > On entry, the vector of length N to be conjugated. */ -/* > On exit, X is overwritten with conjg(X). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > The spacing between successive elements of X. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int zlacgv_(integer *n, doublecomplex *x, integer *incx) +int zlacgv_(integer *n, doublecomplex *x, integer *incx) { - /* System generated locals */ integer i__1, i__2; doublecomplex z__1; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, ioff; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --x; - - /* Function Body */ if (*incx == 1) { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__; d_lmp_cnjg(&z__1, &x[i__]); x[i__2].r = z__1.r, x[i__2].i = z__1.i; -/* L10: */ } } else { ioff = 1; @@ -143,15 +27,10 @@ f"> */ d_lmp_cnjg(&z__1, &x[ioff]); x[i__2].r = z__1.r, x[i__2].i = z__1.i; ioff += *incx; -/* L20: */ } } return 0; - -/* End of ZLACGV */ - -} /* zlacgv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlacpy.cpp b/lib/linalg/zlacpy.cpp index 4a68cd9e07..18db0fac60 100644 --- a/lib/linalg/zlacpy.cpp +++ b/lib/linalg/zlacpy.cpp @@ -1,177 +1,29 @@ -/* fortran/zlacpy.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZLACPY copies all or part of one two-dimensional array to another. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLACPY + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLACPY( UPLO, M, N, A, LDA, B, LDB ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER LDA, LDB, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ), B( LDB, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLACPY copies all or part of a two-dimensional matrix A to another */ -/* > matrix B. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies the part of the matrix A to be copied to B. */ -/* > = 'U': Upper triangular part */ -/* > = 'L': Lower triangular part */ -/* > Otherwise: All of the matrix A */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > The m by n matrix A. If UPLO = 'U', only the upper trapezium */ -/* > is accessed; if UPLO = 'L', only the lower trapezium is */ -/* > accessed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] B */ -/* > \verbatim */ -/* > B is COMPLEX*16 array, dimension (LDB,N) */ -/* > On exit, B = A in the locations specified by UPLO. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >= max(1,M). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int zlacpy_(char *uplo, integer *m, integer *n, - doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, - ftnlen uplo_len) +int zlacpy_(char *uplo, integer *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, + integer *ldb, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4; - - /* Local variables */ integer i__, j; extern logical lsame_(char *, char *, ftnlen, ftnlen); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; - - /* Function Body */ if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { i__1 = *n; for (j = 1; j <= i__1; ++j) { - i__2 = min(j,*m); + i__2 = min(j, *m); for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * b_dim1; i__4 = i__ + j * a_dim1; b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; -/* L10: */ } -/* L20: */ } - } else if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -180,11 +32,8 @@ f"> */ i__3 = i__ + j * b_dim1; i__4 = i__ + j * a_dim1; b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; -/* L30: */ } -/* L40: */ } - } else { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -193,18 +42,11 @@ f"> */ i__3 = i__ + j * b_dim1; i__4 = i__ + j * a_dim1; b[i__3].r = a[i__4].r, b[i__3].i = a[i__4].i; -/* L50: */ } -/* L60: */ } } - return 0; - -/* End of ZLACPY */ - -} /* zlacpy_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlacrm.cpp b/lib/linalg/zlacrm.cpp index c3415cb29b..4d736ac15f 100644 --- a/lib/linalg/zlacrm.cpp +++ b/lib/linalg/zlacrm.cpp @@ -1,184 +1,20 @@ -/* fortran/zlacrm.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b6 = 1.; static doublereal c_b7 = 0.; - -/* > \brief \b ZLACRM multiplies a complex matrix by a square real matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLACRM + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLACRM( M, N, A, LDA, B, LDB, C, LDC, RWORK ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER LDA, LDB, LDC, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION B( LDB, * ), RWORK( * ) */ -/* COMPLEX*16 A( LDA, * ), C( LDC, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLACRM performs a very simple matrix-matrix multiplication: */ -/* > C := A * B, */ -/* > where A is M by N and complex; B is N by N and real; */ -/* > C is M by N and complex. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A and of the matrix C. */ -/* > M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns and rows of the matrix B and */ -/* > the number of columns of the matrix C. */ -/* > N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA, N) */ -/* > On entry, A contains the M by N matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >=max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] B */ -/* > \verbatim */ -/* > B is DOUBLE PRECISION array, dimension (LDB, N) */ -/* > On entry, B contains the N by N matrix B. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > The leading dimension of the array B. LDB >=max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] C */ -/* > \verbatim */ -/* > C is COMPLEX*16 array, dimension (LDC, N) */ -/* > On exit, C contains the M by N matrix C. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >=max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RWORK */ -/* > \verbatim */ -/* > RWORK is DOUBLE PRECISION array, dimension (2*M*N) */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int zlacrm_(integer *m, integer *n, doublecomplex *a, - integer *lda, doublereal *b, integer *ldb, doublecomplex *c__, - integer *ldc, doublereal *rwork) +int zlacrm_(integer *m, integer *n, doublecomplex *a, integer *lda, doublereal *b, integer *ldb, + doublecomplex *c__, integer *ldc, doublereal *rwork) { - /* System generated locals */ - integer b_dim1, b_offset, a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, - i__3, i__4, i__5; + integer b_dim1, b_offset, a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3, i__4, i__5; doublereal d__1; doublecomplex z__1; - - /* Builtin functions */ double d_lmp_imag(doublecomplex *); - - /* Local variables */ integer i__, j, l; - extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - integer *, doublereal *, doublereal *, integer *, ftnlen, ftnlen); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick return if possible. */ - - /* Parameter adjustments */ + extern int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, + ftnlen, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -189,26 +25,20 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --rwork; - - /* Function Body */ if (*m == 0 || *n == 0) { return 0; } - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; rwork[(j - 1) * *m + i__] = a[i__3].r; -/* L10: */ } -/* L20: */ } - l = *m * *n + 1; - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b6, &rwork[1], m, &b[b_offset], ldb, &c_b7, & - rwork[l], m, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b6, &rwork[1], m, &b[b_offset], ldb, &c_b7, &rwork[l], m, + (ftnlen)1, (ftnlen)1); i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -216,22 +46,17 @@ f"> */ i__3 = i__ + j * c_dim1; i__4 = l + (j - 1) * *m + i__ - 1; c__[i__3].r = rwork[i__4], c__[i__3].i = 0.; -/* L30: */ } -/* L40: */ } - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { rwork[(j - 1) * *m + i__] = d_lmp_imag(&a[i__ + j * a_dim1]); -/* L50: */ } -/* L60: */ } - dgemm_((char *)"N", (char *)"N", m, n, n, &c_b6, &rwork[1], m, &b[b_offset], ldb, &c_b7, & - rwork[l], m, (ftnlen)1, (ftnlen)1); + dgemm_((char *)"N", (char *)"N", m, n, n, &c_b6, &rwork[1], m, &b[b_offset], ldb, &c_b7, &rwork[l], m, + (ftnlen)1, (ftnlen)1); i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -242,17 +67,10 @@ f"> */ i__5 = l + (j - 1) * *m + i__ - 1; z__1.r = d__1, z__1.i = rwork[i__5]; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L70: */ } -/* L80: */ } - return 0; - -/* End of ZLACRM */ - -} /* zlacrm_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zladiv.cpp b/lib/linalg/zladiv.cpp index 105560e1a5..ec130d40d9 100644 --- a/lib/linalg/zladiv.cpp +++ b/lib/linalg/zladiv.cpp @@ -1,132 +1,24 @@ -/* fortran/zladiv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZLADIV performs complex division in real arithmetic, avoiding unnecessary overflow. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLADIV + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* COMPLEX*16 FUNCTION ZLADIV( X, Y ) */ - -/* .. Scalar Arguments .. */ -/* COMPLEX*16 X, Y */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLADIV := X / Y, where X and Y are complex. The computation of X / Y */ -/* > will not overflow on an intermediary step unless the results */ -/* > overflows. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Y */ -/* > \verbatim */ -/* > Y is COMPLEX*16 */ -/* > The complex scalars X and Y. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* ===================================================================== */ -/* Double Complex */ VOID zladiv_(doublecomplex * ret_val, doublecomplex *x, - doublecomplex *y) +VOID zladiv_(doublecomplex *ret_val, doublecomplex *x, doublecomplex *y) { - /* System generated locals */ doublereal d__1, d__2, d__3, d__4; doublecomplex z__1; - - /* Builtin functions */ double d_lmp_imag(doublecomplex *); - - /* Local variables */ doublereal zi, zr; - extern /* Subroutine */ int dladiv_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - + extern int dladiv_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *); d__1 = x->r; d__2 = d_lmp_imag(x); d__3 = y->r; d__4 = d_lmp_imag(y); dladiv_(&d__1, &d__2, &d__3, &d__4, &zr, &zi); z__1.r = zr, z__1.i = zi; - ret_val->r = z__1.r, ret_val->i = z__1.i; - - return ; - -/* End of ZLADIV */ - -} /* zladiv_ */ - + ret_val->r = z__1.r, ret_val->i = z__1.i; + return; +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlaed0.cpp b/lib/linalg/zlaed0.cpp index 5895127d75..6729b532c9 100644 --- a/lib/linalg/zlaed0.cpp +++ b/lib/linalg/zlaed0.cpp @@ -1,241 +1,39 @@ -/* fortran/zlaed0.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__9 = 9; static integer c__0 = 0; static integer c__2 = 2; static integer c__1 = 1; - -/* > \brief \b ZLAED0 used by ZSTEDC. Computes all eigenvalues and corresponding eigenvectors of an unreduced -symmetric tridiagonal matrix using the divide and conquer method. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLAED0 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLAED0( QSIZ, N, D, E, Q, LDQ, QSTORE, LDQS, RWORK, */ -/* IWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, LDQ, LDQS, N, QSIZ */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IWORK( * ) */ -/* DOUBLE PRECISION D( * ), E( * ), RWORK( * ) */ -/* COMPLEX*16 Q( LDQ, * ), QSTORE( LDQS, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Using the divide and conquer method, ZLAED0 computes all eigenvalues */ -/* > of a symmetric tridiagonal matrix which is one diagonal block of */ -/* > those from reducing a dense or band Hermitian matrix and */ -/* > corresponding eigenvectors of the dense or band matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] QSIZ */ -/* > \verbatim */ -/* > QSIZ is INTEGER */ -/* > The dimension of the unitary matrix used to reduce */ -/* > the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the diagonal elements of the tridiagonal matrix. */ -/* > On exit, the eigenvalues in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > On entry, the off-diagonal elements of the tridiagonal matrix. */ -/* > On exit, E has been destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Q */ -/* > \verbatim */ -/* > Q is COMPLEX*16 array, dimension (LDQ,N) */ -/* > On entry, Q must contain an QSIZ x N matrix whose columns */ -/* > unitarily orthonormal. It is a part of the unitary matrix */ -/* > that reduces the full dense Hermitian matrix to a */ -/* > (reducible) symmetric tridiagonal matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQ */ -/* > \verbatim */ -/* > LDQ is INTEGER */ -/* > The leading dimension of the array Q. LDQ >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, */ -/* > the dimension of IWORK must be at least */ -/* > 6 + 6*N + 5*N*lg N */ -/* > ( lg( N ) = smallest integer k */ -/* > such that 2^k >= N ) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RWORK */ -/* > \verbatim */ -/* > RWORK is DOUBLE PRECISION array, */ -/* > dimension (1 + 3*N + 2*N*lg N + 3*N**2) */ -/* > ( lg( N ) = smallest integer k */ -/* > such that 2^k >= N ) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] QSTORE */ -/* > \verbatim */ -/* > QSTORE is COMPLEX*16 array, dimension (LDQS, N) */ -/* > Used to store parts of */ -/* > the eigenvector matrix when the updating matrix multiplies */ -/* > take place. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQS */ -/* > \verbatim */ -/* > LDQS is INTEGER */ -/* > The leading dimension of the array QSTORE. */ -/* > LDQS >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: The algorithm failed to compute an eigenvalue while */ -/* > working on the submatrix lying in rows and columns */ -/* > INFO/(N+1) through mod(INFO,N+1). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zlaed0_(integer *qsiz, integer *n, doublereal *d__, - doublereal *e, doublecomplex *q, integer *ldq, doublecomplex *qstore, - integer *ldqs, doublereal *rwork, integer *iwork, integer *info) +int zlaed0_(integer *qsiz, integer *n, doublereal *d__, doublereal *e, doublecomplex *q, + integer *ldq, doublecomplex *qstore, integer *ldqs, doublereal *rwork, integer *iwork, + integer *info) { - /* System generated locals */ integer q_dim1, q_offset, qstore_dim1, qstore_offset, i__1, i__2; doublereal d__1; - - /* Builtin functions */ double log(doublereal); integer pow_lmp_ii(integer *, integer *); - - /* Local variables */ integer i__, j, k, ll, iq, lgn, msd2, smm1, spm1, spm2; doublereal temp; integer curr, iperm; - extern /* Subroutine */ int dcopy_(integer *, doublereal *, integer *, - doublereal *, integer *); + extern int dcopy_(integer *, doublereal *, integer *, doublereal *, integer *); integer indxq, iwrem, iqptr, tlvls; - extern /* Subroutine */ int zcopy_(integer *, doublecomplex *, integer *, - doublecomplex *, integer *), zlaed7_(integer *, integer *, - integer *, integer *, integer *, integer *, doublereal *, - doublecomplex *, integer *, doublereal *, integer *, doublereal *, - integer *, integer *, integer *, integer *, integer *, - doublereal *, doublecomplex *, doublereal *, integer *, integer *) - ; + extern int zcopy_(integer *, doublecomplex *, integer *, doublecomplex *, integer *), + zlaed7_(integer *, integer *, integer *, integer *, integer *, integer *, doublereal *, + doublecomplex *, integer *, doublereal *, integer *, doublereal *, integer *, + integer *, integer *, integer *, integer *, doublereal *, doublecomplex *, + doublereal *, integer *, integer *); integer igivcl; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int zlacrm_(integer *, integer *, doublecomplex *, - integer *, doublereal *, integer *, doublecomplex *, integer *, - doublereal *); + extern int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int zlacrm_(integer *, integer *, doublecomplex *, integer *, doublereal *, integer *, + doublecomplex *, integer *, doublereal *); integer igivnm, submat, curprb, subpbs, igivpt; - extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - ftnlen); + extern int dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen); integer curlvl, matsiz, iprmpt, smlsiz; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* Warning: N could be as big as QSIZ! */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; --e; q_dim1 = *ldq; @@ -246,21 +44,14 @@ f"> */ qstore -= qstore_offset; --rwork; --iwork; - - /* Function Body */ *info = 0; - -/* IF( ICOMPQ .LT. 0 .OR. ICOMPQ .GT. 2 ) THEN */ -/* INFO = -1 */ -/* ELSE IF( ( ICOMPQ .EQ. 1 ) .AND. ( QSIZ .LT. MAX( 0, N ) ) ) */ -/* $ THEN */ - if (*qsiz < max(0,*n)) { + if (*qsiz < max(0, *n)) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*ldq < max(1,*n)) { + } else if (*ldq < max(1, *n)) { *info = -6; - } else if (*ldqs < max(1,*n)) { + } else if (*ldqs < max(1, *n)) { *info = -8; } if (*info != 0) { @@ -268,19 +59,10 @@ f"> */ xerbla_((char *)"ZLAED0", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - - smlsiz = ilaenv_(&c__9, (char *)"ZLAED0", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( - ftnlen)6, (ftnlen)1); - -/* Determine the size and placement of the submatrices, and save in */ -/* the leading elements of IWORK. */ - + smlsiz = ilaenv_(&c__9, (char *)"ZLAED0", (char *)" ", &c__0, &c__0, &c__0, &c__0, (ftnlen)6, (ftnlen)1); iwork[1] = *n; subpbs = 1; tlvls = 0; @@ -289,7 +71,6 @@ L10: for (j = subpbs; j >= 1; --j) { iwork[j * 2] = (iwork[j] + 1) / 2; iwork[(j << 1) - 1] = iwork[j] / 2; -/* L20: */ } ++tlvls; subpbs <<= 1; @@ -298,12 +79,7 @@ L10: i__1 = subpbs; for (j = 2; j <= i__1; ++j) { iwork[j] += iwork[j - 1]; -/* L30: */ } - -/* Divide the matrix into SUBPBS submatrices of size at most SMLSIZ+1 */ -/* using rank-1 modifications (cuts). */ - spm1 = subpbs - 1; i__1 = spm1; for (i__ = 1; i__ <= i__1; ++i__) { @@ -311,16 +87,10 @@ L10: smm1 = submat - 1; d__[smm1] -= (d__1 = e[smm1], abs(d__1)); d__[submat] -= (d__1 = e[smm1], abs(d__1)); -/* L40: */ } - indxq = (*n << 2) + 3; - -/* Set up workspaces for eigenvalues only/accumulate new vectors */ -/* routine */ - - temp = log((doublereal) (*n)) / log(2.); - lgn = (integer) temp; + temp = log((doublereal)(*n)) / log(2.); + lgn = (integer)temp; if (pow_lmp_ii(&c__2, &lgn) < *n) { ++lgn; } @@ -332,24 +102,16 @@ L10: iqptr = iperm + *n * lgn; igivpt = iqptr + *n + 2; igivcl = igivpt + *n * lgn; - igivnm = 1; iq = igivnm + (*n << 1) * lgn; -/* Computing 2nd power */ i__1 = *n; iwrem = iq + i__1 * i__1 + 1; -/* Initialize pointers */ i__1 = subpbs; for (i__ = 0; i__ <= i__1; ++i__) { iwork[iprmpt + i__] = 1; iwork[igivpt + i__] = 1; -/* L50: */ } iwork[iqptr] = 1; - -/* Solve each submatrix eigenproblem at the bottom of the divide and */ -/* conquer tree. */ - curr = 0; i__1 = spm1; for (i__ = 0; i__ <= i__1; ++i__) { @@ -361,12 +123,10 @@ L10: matsiz = iwork[i__ + 1] - iwork[i__]; } ll = iq - 1 + iwork[iqptr + curr]; - dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &rwork[ll], &matsiz, & - rwork[1], info, (ftnlen)1); - zlacrm_(qsiz, &matsiz, &q[submat * q_dim1 + 1], ldq, &rwork[ll], & - matsiz, &qstore[submat * qstore_dim1 + 1], ldqs, &rwork[iwrem] - ); -/* Computing 2nd power */ + dsteqr_((char *)"I", &matsiz, &d__[submat], &e[submat], &rwork[ll], &matsiz, &rwork[1], info, + (ftnlen)1); + zlacrm_(qsiz, &matsiz, &q[submat * q_dim1 + 1], ldq, &rwork[ll], &matsiz, + &qstore[submat * qstore_dim1 + 1], ldqs, &rwork[iwrem]); i__2 = matsiz; iwork[iqptr + curr + 1] = iwork[iqptr + curr] + i__2 * i__2; ++curr; @@ -379,16 +139,8 @@ L10: for (j = submat; j <= i__2; ++j) { iwork[indxq + j] = k; ++k; -/* L60: */ } -/* L70: */ } - -/* Successively merge eigensystems of adjacent submatrices */ -/* into eigensystem for the corresponding larger matrix. */ - -/* while ( SUBPBS > 1 ) */ - curlvl = 1; L80: if (subpbs > 1) { @@ -406,53 +158,30 @@ L80: msd2 = matsiz / 2; ++curprb; } - -/* Merge lower order eigensystems (of size MSD2 and MATSIZ - MSD2) */ -/* into an eigensystem of size MATSIZ. ZLAED7 handles the case */ -/* when the eigenvectors of a full or band Hermitian matrix (which */ -/* was reduced to tridiagonal form) are desired. */ - -/* I am free to use Q as a valuable working space until Loop 150. */ - - zlaed7_(&matsiz, &msd2, qsiz, &tlvls, &curlvl, &curprb, &d__[ - submat], &qstore[submat * qstore_dim1 + 1], ldqs, &e[ - submat + msd2 - 1], &iwork[indxq + submat], &rwork[iq], & - iwork[iqptr], &iwork[iprmpt], &iwork[iperm], &iwork[ - igivpt], &iwork[igivcl], &rwork[igivnm], &q[submat * - q_dim1 + 1], &rwork[iwrem], &iwork[subpbs + 1], info); + zlaed7_(&matsiz, &msd2, qsiz, &tlvls, &curlvl, &curprb, &d__[submat], + &qstore[submat * qstore_dim1 + 1], ldqs, &e[submat + msd2 - 1], + &iwork[indxq + submat], &rwork[iq], &iwork[iqptr], &iwork[iprmpt], + &iwork[iperm], &iwork[igivpt], &iwork[igivcl], &rwork[igivnm], + &q[submat * q_dim1 + 1], &rwork[iwrem], &iwork[subpbs + 1], info); if (*info > 0) { *info = submat * (*n + 1) + submat + matsiz - 1; return 0; } iwork[i__ / 2 + 1] = iwork[i__ + 2]; -/* L90: */ } subpbs /= 2; ++curlvl; goto L80; } - -/* end while */ - -/* Re-merge the eigenvalues/vectors which were deflated at the final */ -/* merge step. */ - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { j = iwork[indxq + i__]; rwork[i__] = d__[j]; - zcopy_(qsiz, &qstore[j * qstore_dim1 + 1], &c__1, &q[i__ * q_dim1 + 1] - , &c__1); -/* L100: */ + zcopy_(qsiz, &qstore[j * qstore_dim1 + 1], &c__1, &q[i__ * q_dim1 + 1], &c__1); } dcopy_(n, &rwork[1], &c__1, &d__[1], &c__1); - return 0; - -/* End of ZLAED0 */ - -} /* zlaed0_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlaed7.cpp b/lib/linalg/zlaed7.cpp index 11b29341bb..1a045d7edd 100644 --- a/lib/linalg/zlaed7.cpp +++ b/lib/linalg/zlaed7.cpp @@ -1,331 +1,35 @@ -/* fortran/zlaed7.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__2 = 2; static integer c__1 = 1; static integer c_n1 = -1; - -/* > \brief \b ZLAED7 used by ZSTEDC. Computes the updated eigensystem of a diagonal matrix after modification - by a rank-one symmetric matrix. Used when the original matrix is dense. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLAED7 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLAED7( N, CUTPNT, QSIZ, TLVLS, CURLVL, CURPBM, D, Q, */ -/* LDQ, RHO, INDXQ, QSTORE, QPTR, PRMPTR, PERM, */ -/* GIVPTR, GIVCOL, GIVNUM, WORK, RWORK, IWORK, */ -/* INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER CURLVL, CURPBM, CUTPNT, INFO, LDQ, N, QSIZ, */ -/* $ TLVLS */ -/* DOUBLE PRECISION RHO */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER GIVCOL( 2, * ), GIVPTR( * ), INDXQ( * ), */ -/* $ IWORK( * ), PERM( * ), PRMPTR( * ), QPTR( * ) */ -/* DOUBLE PRECISION D( * ), GIVNUM( 2, * ), QSTORE( * ), RWORK( * ) */ -/* COMPLEX*16 Q( LDQ, * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLAED7 computes the updated eigensystem of a diagonal */ -/* > matrix after modification by a rank-one symmetric matrix. This */ -/* > routine is used only for the eigenproblem which requires all */ -/* > eigenvalues and optionally eigenvectors of a dense or banded */ -/* > Hermitian matrix that has been reduced to tridiagonal form. */ -/* > */ -/* > T = Q(in) ( D(in) + RHO * Z*Z**H ) Q**H(in) = Q(out) * D(out) * Q**H(out) */ -/* > */ -/* > where Z = Q**Hu, u is a vector of length N with ones in the */ -/* > CUTPNT and CUTPNT + 1 th elements and zeros elsewhere. */ -/* > */ -/* > The eigenvectors of the original matrix are stored in Q, and the */ -/* > eigenvalues are in D. The algorithm consists of three stages: */ -/* > */ -/* > The first stage consists of deflating the size of the problem */ -/* > when there are multiple eigenvalues or if there is a zero in */ -/* > the Z vector. For each such occurrence the dimension of the */ -/* > secular equation problem is reduced by one. This stage is */ -/* > performed by the routine DLAED2. */ -/* > */ -/* > The second stage consists of calculating the updated */ -/* > eigenvalues. This is done by finding the roots of the secular */ -/* > equation via the routine DLAED4 (as called by SLAED3). */ -/* > This routine also calculates the eigenvectors of the current */ -/* > problem. */ -/* > */ -/* > The final stage consists of computing the updated eigenvectors */ -/* > directly using the updated eigenvalues. The eigenvectors for */ -/* > the current problem are multiplied with the eigenvectors from */ -/* > the overall problem. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CUTPNT */ -/* > \verbatim */ -/* > CUTPNT is INTEGER */ -/* > Contains the location of the last eigenvalue in the leading */ -/* > sub-matrix. min(1,N) <= CUTPNT <= N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] QSIZ */ -/* > \verbatim */ -/* > QSIZ is INTEGER */ -/* > The dimension of the unitary matrix used to reduce */ -/* > the full matrix to tridiagonal form. QSIZ >= N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TLVLS */ -/* > \verbatim */ -/* > TLVLS is INTEGER */ -/* > The total number of merging levels in the overall divide and */ -/* > conquer tree. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CURLVL */ -/* > \verbatim */ -/* > CURLVL is INTEGER */ -/* > The current level in the overall merge routine, */ -/* > 0 <= curlvl <= tlvls. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CURPBM */ -/* > \verbatim */ -/* > CURPBM is INTEGER */ -/* > The current problem in the current level in the overall */ -/* > merge routine (counting from upper left to lower right). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the eigenvalues of the rank-1-perturbed matrix. */ -/* > On exit, the eigenvalues of the repaired matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Q */ -/* > \verbatim */ -/* > Q is COMPLEX*16 array, dimension (LDQ,N) */ -/* > On entry, the eigenvectors of the rank-1-perturbed matrix. */ -/* > On exit, the eigenvectors of the repaired tridiagonal matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQ */ -/* > \verbatim */ -/* > LDQ is INTEGER */ -/* > The leading dimension of the array Q. LDQ >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > Contains the subdiagonal element used to create the rank-1 */ -/* > modification. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INDXQ */ -/* > \verbatim */ -/* > INDXQ is INTEGER array, dimension (N) */ -/* > This contains the permutation which will reintegrate the */ -/* > subproblem just solved back into sorted order, */ -/* > ie. D( INDXQ( I = 1, N ) ) will be in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension (4*N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RWORK */ -/* > \verbatim */ -/* > RWORK is DOUBLE PRECISION array, */ -/* > dimension (3*N+2*QSIZ*N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (QSIZ*N) */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] QSTORE */ -/* > \verbatim */ -/* > QSTORE is DOUBLE PRECISION array, dimension (N**2+1) */ -/* > Stores eigenvectors of submatrices encountered during */ -/* > divide and conquer, packed together. QPTR points to */ -/* > beginning of the submatrices. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] QPTR */ -/* > \verbatim */ -/* > QPTR is INTEGER array, dimension (N+2) */ -/* > List of indices pointing to beginning of submatrices stored */ -/* > in QSTORE. The submatrices are numbered starting at the */ -/* > bottom left of the divide and conquer tree, from left to */ -/* > right and bottom to top. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PRMPTR */ -/* > \verbatim */ -/* > PRMPTR is INTEGER array, dimension (N lg N) */ -/* > Contains a list of pointers which indicate where in PERM a */ -/* > level's permutation is stored. PRMPTR(i+1) - PRMPTR(i) */ -/* > indicates the size of the permutation and also the size of */ -/* > the full, non-deflated problem. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PERM */ -/* > \verbatim */ -/* > PERM is INTEGER array, dimension (N lg N) */ -/* > Contains the permutations (from deflation and sorting) to be */ -/* > applied to each eigenblock. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVPTR */ -/* > \verbatim */ -/* > GIVPTR is INTEGER array, dimension (N lg N) */ -/* > Contains a list of pointers which indicate where in GIVCOL a */ -/* > level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i) */ -/* > indicates the number of Givens rotations. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVCOL */ -/* > \verbatim */ -/* > GIVCOL is INTEGER array, dimension (2, N lg N) */ -/* > Each pair of numbers indicates a pair of columns to take place */ -/* > in a Givens rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] GIVNUM */ -/* > \verbatim */ -/* > GIVNUM is DOUBLE PRECISION array, dimension (2, N lg N) */ -/* > Each number indicates the S value to be used in the */ -/* > corresponding Givens rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: if INFO = 1, an eigenvalue did not converge */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zlaed7_(integer *n, integer *cutpnt, integer *qsiz, - integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, - doublecomplex *q, integer *ldq, doublereal *rho, integer *indxq, - doublereal *qstore, integer *qptr, integer *prmptr, integer *perm, - integer *givptr, integer *givcol, doublereal *givnum, doublecomplex * - work, doublereal *rwork, integer *iwork, integer *info) +int zlaed7_(integer *n, integer *cutpnt, integer *qsiz, integer *tlvls, integer *curlvl, + integer *curpbm, doublereal *d__, doublecomplex *q, integer *ldq, doublereal *rho, + integer *indxq, doublereal *qstore, integer *qptr, integer *prmptr, integer *perm, + integer *givptr, integer *givcol, doublereal *givnum, doublecomplex *work, + doublereal *rwork, integer *iwork, integer *info) { - /* System generated locals */ integer q_dim1, q_offset, i__1, i__2; - - /* Builtin functions */ integer pow_lmp_ii(integer *, integer *); - - /* Local variables */ integer i__, k, n1, n2, iq, iw, iz, ptr, indx, curr, indxc, indxp; - extern /* Subroutine */ int dlaed9_(integer *, integer *, integer *, - integer *, doublereal *, doublereal *, integer *, doublereal *, - doublereal *, doublereal *, doublereal *, integer *, integer *), - zlaed8_(integer *, integer *, integer *, doublecomplex *, integer - *, doublereal *, doublereal *, integer *, doublereal *, - doublereal *, doublecomplex *, integer *, doublereal *, integer *, - integer *, integer *, integer *, integer *, integer *, - doublereal *, integer *), dlaeda_(integer *, integer *, integer *, - integer *, integer *, integer *, integer *, integer *, - doublereal *, doublereal *, integer *, doublereal *, doublereal *, - integer *); + extern int dlaed9_(integer *, integer *, integer *, integer *, doublereal *, doublereal *, + integer *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, + integer *), + zlaed8_(integer *, integer *, integer *, doublecomplex *, integer *, doublereal *, + doublereal *, integer *, doublereal *, doublereal *, doublecomplex *, integer *, + doublereal *, integer *, integer *, integer *, integer *, integer *, integer *, + doublereal *, integer *), + dlaeda_(integer *, integer *, integer *, integer *, integer *, integer *, integer *, + integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, + integer *); integer idlmda; - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen), zlacrm_(integer *, integer *, doublecomplex *, integer *, - doublereal *, integer *, doublecomplex *, integer *, doublereal * - ); + extern int dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), + xerbla_(char *, integer *, ftnlen), + zlacrm_(integer *, integer *, doublecomplex *, integer *, doublereal *, integer *, + doublecomplex *, integer *, doublereal *); integer coltyp; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --d__; q_dim1 = *ldq; q_offset = 1 + q_dim1; @@ -341,20 +45,14 @@ f"> */ --work; --rwork; --iwork; - - /* Function Body */ *info = 0; - -/* IF( ICOMPQ.LT.0 .OR. ICOMPQ.GT.1 ) THEN */ -/* INFO = -1 */ -/* ELSE IF( N.LT.0 ) THEN */ if (*n < 0) { *info = -1; - } else if (min(1,*n) > *cutpnt || *n < *cutpnt) { + } else if (min(1, *n) > *cutpnt || *n < *cutpnt) { *info = -2; } else if (*qsiz < *n) { *info = -3; - } else if (*ldq < max(1,*n)) { + } else if (*ldq < max(1, *n)) { *info = -9; } if (*info != 0) { @@ -362,77 +60,46 @@ f"> */ xerbla_((char *)"ZLAED7", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - -/* The following values are for bookkeeping purposes only. They are */ -/* integer pointers which indicate the portion of the workspace */ -/* used by a particular array in DLAED2 and SLAED3. */ - iz = 1; idlmda = iz + *n; iw = idlmda + *n; iq = iw + *n; - indx = 1; indxc = indx + *n; coltyp = indxc + *n; indxp = coltyp + *n; - -/* Form the z-vector which consists of the last row of Q_1 and the */ -/* first row of Q_2. */ - ptr = pow_lmp_ii(&c__2, tlvls) + 1; i__1 = *curlvl - 1; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *tlvls - i__; ptr += pow_lmp_ii(&c__2, &i__2); -/* L10: */ } curr = ptr + *curpbm; - dlaeda_(n, tlvls, curlvl, curpbm, &prmptr[1], &perm[1], &givptr[1], & - givcol[3], &givnum[3], &qstore[1], &qptr[1], &rwork[iz], &rwork[ - iz + *n], info); - -/* When solving the final problem, we no longer need the stored data, */ -/* so we will overwrite the data from this level onto the previously */ -/* used storage space. */ - + dlaeda_(n, tlvls, curlvl, curpbm, &prmptr[1], &perm[1], &givptr[1], &givcol[3], &givnum[3], + &qstore[1], &qptr[1], &rwork[iz], &rwork[iz + *n], info); if (*curlvl == *tlvls) { qptr[curr] = 1; prmptr[curr] = 1; givptr[curr] = 1; } - -/* Sort and Deflate eigenvalues. */ - - zlaed8_(&k, n, qsiz, &q[q_offset], ldq, &d__[1], rho, cutpnt, &rwork[iz], - &rwork[idlmda], &work[1], qsiz, &rwork[iw], &iwork[indxp], &iwork[ - indx], &indxq[1], &perm[prmptr[curr]], &givptr[curr + 1], &givcol[ - (givptr[curr] << 1) + 1], &givnum[(givptr[curr] << 1) + 1], info); + zlaed8_(&k, n, qsiz, &q[q_offset], ldq, &d__[1], rho, cutpnt, &rwork[iz], &rwork[idlmda], + &work[1], qsiz, &rwork[iw], &iwork[indxp], &iwork[indx], &indxq[1], &perm[prmptr[curr]], + &givptr[curr + 1], &givcol[(givptr[curr] << 1) + 1], &givnum[(givptr[curr] << 1) + 1], + info); prmptr[curr + 1] = prmptr[curr] + *n; givptr[curr + 1] += givptr[curr]; - -/* Solve Secular Equation. */ - if (k != 0) { - dlaed9_(&k, &c__1, &k, n, &d__[1], &rwork[iq], &k, rho, &rwork[idlmda] - , &rwork[iw], &qstore[qptr[curr]], &k, info); - zlacrm_(qsiz, &k, &work[1], qsiz, &qstore[qptr[curr]], &k, &q[ - q_offset], ldq, &rwork[iq]); -/* Computing 2nd power */ + dlaed9_(&k, &c__1, &k, n, &d__[1], &rwork[iq], &k, rho, &rwork[idlmda], &rwork[iw], + &qstore[qptr[curr]], &k, info); + zlacrm_(qsiz, &k, &work[1], qsiz, &qstore[qptr[curr]], &k, &q[q_offset], ldq, &rwork[iq]); i__1 = k; qptr[curr + 1] = qptr[curr] + i__1 * i__1; if (*info != 0) { return 0; } - -/* Prepare the INDXQ sorting premutation. */ - n1 = k; n2 = *n - k; dlamrg_(&n1, &n2, &d__[1], &c__1, &c_n1, &indxq[1]); @@ -441,16 +108,10 @@ f"> */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { indxq[i__] = i__; -/* L20: */ } } - return 0; - -/* End of ZLAED7 */ - -} /* zlaed7_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlaed8.cpp b/lib/linalg/zlaed8.cpp index 77c07f385e..d29b380587 100644 --- a/lib/linalg/zlaed8.cpp +++ b/lib/linalg/zlaed8.cpp @@ -1,315 +1,35 @@ -/* fortran/zlaed8.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b3 = -1.; static integer c__1 = 1; - -/* > \brief \b ZLAED8 used by ZSTEDC. Merges eigenvalues and deflates secular equation. Used when the original - matrix is dense. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLAED8 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLAED8( K, N, QSIZ, Q, LDQ, D, RHO, CUTPNT, Z, DLAMDA, */ -/* Q2, LDQ2, W, INDXP, INDX, INDXQ, PERM, GIVPTR, */ -/* GIVCOL, GIVNUM, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER CUTPNT, GIVPTR, INFO, K, LDQ, LDQ2, N, QSIZ */ -/* DOUBLE PRECISION RHO */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER GIVCOL( 2, * ), INDX( * ), INDXP( * ), */ -/* $ INDXQ( * ), PERM( * ) */ -/* DOUBLE PRECISION D( * ), DLAMDA( * ), GIVNUM( 2, * ), W( * ), */ -/* $ Z( * ) */ -/* COMPLEX*16 Q( LDQ, * ), Q2( LDQ2, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLAED8 merges the two sets of eigenvalues together into a single */ -/* > sorted set. Then it tries to deflate the size of the problem. */ -/* > There are two ways in which deflation can occur: when two or more */ -/* > eigenvalues are close together or if there is a tiny element in the */ -/* > Z vector. For each such occurrence the order of the related secular */ -/* > equation problem is reduced by one. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[out] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > Contains the number of non-deflated eigenvalues. */ -/* > This is the order of the related secular equation. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] QSIZ */ -/* > \verbatim */ -/* > QSIZ is INTEGER */ -/* > The dimension of the unitary matrix used to reduce */ -/* > the dense or band matrix to tridiagonal form. */ -/* > QSIZ >= N if ICOMPQ = 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Q */ -/* > \verbatim */ -/* > Q is COMPLEX*16 array, dimension (LDQ,N) */ -/* > On entry, Q contains the eigenvectors of the partially solved */ -/* > system which has been previously updated in matrix */ -/* > multiplies with other partially solved eigensystems. */ -/* > On exit, Q contains the trailing (N-K) updated eigenvectors */ -/* > (those which were deflated) in its last N-K columns. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQ */ -/* > \verbatim */ -/* > LDQ is INTEGER */ -/* > The leading dimension of the array Q. LDQ >= max( 1, N ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, D contains the eigenvalues of the two submatrices to */ -/* > be combined. On exit, D contains the trailing (N-K) updated */ -/* > eigenvalues (those which were deflated) sorted into increasing */ -/* > order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] RHO */ -/* > \verbatim */ -/* > RHO is DOUBLE PRECISION */ -/* > Contains the off diagonal element associated with the rank-1 */ -/* > cut which originally split the two submatrices which are now */ -/* > being recombined. RHO is modified during the computation to */ -/* > the value required by DLAED3. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CUTPNT */ -/* > \verbatim */ -/* > CUTPNT is INTEGER */ -/* > Contains the location of the last eigenvalue in the leading */ -/* > sub-matrix. MIN(1,N) <= CUTPNT <= N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] Z */ -/* > \verbatim */ -/* > Z is DOUBLE PRECISION array, dimension (N) */ -/* > On input this vector contains the updating vector (the last */ -/* > row of the first sub-eigenvector matrix and the first row of */ -/* > the second sub-eigenvector matrix). The contents of Z are */ -/* > destroyed during the updating process. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] DLAMDA */ -/* > \verbatim */ -/* > DLAMDA is DOUBLE PRECISION array, dimension (N) */ -/* > Contains a copy of the first K eigenvalues which will be used */ -/* > by DLAED3 to form the secular equation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] Q2 */ -/* > \verbatim */ -/* > Q2 is COMPLEX*16 array, dimension (LDQ2,N) */ -/* > If ICOMPQ = 0, Q2 is not referenced. Otherwise, */ -/* > Contains a copy of the first K eigenvectors which will be used */ -/* > by DLAED7 in a matrix multiply (DGEMM) to update the new */ -/* > eigenvectors. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDQ2 */ -/* > \verbatim */ -/* > LDQ2 is INTEGER */ -/* > The leading dimension of the array Q2. LDQ2 >= max( 1, N ). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] W */ -/* > \verbatim */ -/* > W is DOUBLE PRECISION array, dimension (N) */ -/* > This will hold the first k values of the final */ -/* > deflation-altered z-vector and will be passed to DLAED3. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INDXP */ -/* > \verbatim */ -/* > INDXP is INTEGER array, dimension (N) */ -/* > This will contain the permutation used to place deflated */ -/* > values of D at the end of the array. On output INDXP(1:K) */ -/* > points to the nondeflated D-values and INDXP(K+1:N) */ -/* > points to the deflated eigenvalues. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INDX */ -/* > \verbatim */ -/* > INDX is INTEGER array, dimension (N) */ -/* > This will contain the permutation used to sort the contents of */ -/* > D into ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INDXQ */ -/* > \verbatim */ -/* > INDXQ is INTEGER array, dimension (N) */ -/* > This contains the permutation which separately sorts the two */ -/* > sub-problems in D into ascending order. Note that elements in */ -/* > the second half of this permutation must first have CUTPNT */ -/* > added to their values in order to be accurate. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] PERM */ -/* > \verbatim */ -/* > PERM is INTEGER array, dimension (N) */ -/* > Contains the permutations (from deflation and sorting) to be */ -/* > applied to each eigenblock. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVPTR */ -/* > \verbatim */ -/* > GIVPTR is INTEGER */ -/* > Contains the number of Givens rotations which took place in */ -/* > this subproblem. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVCOL */ -/* > \verbatim */ -/* > GIVCOL is INTEGER array, dimension (2, N) */ -/* > Each pair of numbers indicates a pair of columns to take place */ -/* > in a Givens rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] GIVNUM */ -/* > \verbatim */ -/* > GIVNUM is DOUBLE PRECISION array, dimension (2, N) */ -/* > Each number indicates the S value to be used in the */ -/* > corresponding Givens rotation. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zlaed8_(integer *k, integer *n, integer *qsiz, - doublecomplex *q, integer *ldq, doublereal *d__, doublereal *rho, - integer *cutpnt, doublereal *z__, doublereal *dlamda, doublecomplex * - q2, integer *ldq2, doublereal *w, integer *indxp, integer *indx, - integer *indxq, integer *perm, integer *givptr, integer *givcol, - doublereal *givnum, integer *info) +int zlaed8_(integer *k, integer *n, integer *qsiz, doublecomplex *q, integer *ldq, doublereal *d__, + doublereal *rho, integer *cutpnt, doublereal *z__, doublereal *dlamda, + doublecomplex *q2, integer *ldq2, doublereal *w, integer *indxp, integer *indx, + integer *indxq, integer *perm, integer *givptr, integer *givcol, doublereal *givnum, + integer *info) { - /* System generated locals */ integer q_dim1, q_offset, q2_dim1, q2_offset, i__1; doublereal d__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ doublereal c__; integer i__, j; doublereal s, t; integer k2, n1, n2, jp, n1p1; doublereal eps, tau, tol; integer jlam, imax, jmax; - extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, - integer *), dcopy_(integer *, doublereal *, integer *, doublereal - *, integer *), zdrot_(integer *, doublecomplex *, integer *, - doublecomplex *, integer *, doublereal *, doublereal *), zcopy_( - integer *, doublecomplex *, integer *, doublecomplex *, integer *) - ; - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern int dscal_(integer *, doublereal *, doublereal *, integer *), + dcopy_(integer *, doublereal *, integer *, doublereal *, integer *), + zdrot_(integer *, doublecomplex *, integer *, doublecomplex *, integer *, doublereal *, + doublereal *), + zcopy_(integer *, doublecomplex *, integer *, doublecomplex *, integer *); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, ftnlen); extern integer idamax_(integer *, doublereal *, integer *); - extern /* Subroutine */ int dlamrg_(integer *, integer *, doublereal *, - integer *, integer *, integer *), xerbla_(char *, integer *, - ftnlen), zlacpy_(char *, integer *, integer *, doublecomplex *, - integer *, doublecomplex *, integer *, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int dlamrg_(integer *, integer *, doublereal *, integer *, integer *, integer *), + xerbla_(char *, integer *, ftnlen), + zlacpy_(char *, integer *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, ftnlen); q_dim1 = *ldq; q_offset = 1 + q_dim1; q -= q_offset; @@ -326,19 +46,16 @@ f"> */ --perm; givcol -= 3; givnum -= 3; - - /* Function Body */ *info = 0; - if (*n < 0) { *info = -2; } else if (*qsiz < *n) { *info = -3; - } else if (*ldq < max(1,*n)) { + } else if (*ldq < max(1, *n)) { *info = -5; - } else if (*cutpnt < min(1,*n) || *cutpnt > *n) { + } else if (*cutpnt < min(1, *n) || *cutpnt > *n) { *info = -8; - } else if (*ldq2 < max(1,*n)) { + } else if (*ldq2 < max(1, *n)) { *info = -12; } if (*info != 0) { @@ -346,51 +63,31 @@ f"> */ xerbla_((char *)"ZLAED8", &i__1, (ftnlen)6); return 0; } - -/* Need to initialize GIVPTR to O here in case of quick exit */ -/* to prevent an unspecified code behavior (usually sigfault) */ -/* when IWORK array on entry to *stedc is not zeroed */ -/* (or at least some IWORK entries which used in *laed7 for GIVPTR). */ - *givptr = 0; - -/* Quick return if possible */ - if (*n == 0) { return 0; } - n1 = *cutpnt; n2 = *n - n1; n1p1 = n1 + 1; - if (*rho < 0.) { dscal_(&n2, &c_b3, &z__[n1p1], &c__1); } - -/* Normalize z so that norm(z) = 1 */ - t = 1. / sqrt(2.); i__1 = *n; for (j = 1; j <= i__1; ++j) { indx[j] = j; -/* L10: */ } dscal_(n, &t, &z__[1], &c__1); *rho = (d__1 = *rho * 2., abs(d__1)); - -/* Sort the eigenvalues into increasing order */ - i__1 = *n; for (i__ = *cutpnt + 1; i__ <= i__1; ++i__) { indxq[i__] += *cutpnt; -/* L20: */ } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { dlamda[i__] = d__[indxq[i__]]; w[i__] = z__[indxq[i__]]; -/* L30: */ } i__ = 1; j = *cutpnt + 1; @@ -399,48 +96,26 @@ f"> */ for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = dlamda[indx[i__]]; z__[i__] = w[indx[i__]]; -/* L40: */ } - -/* Calculate the allowable deflation tolerance */ - imax = idamax_(n, &z__[1], &c__1); jmax = idamax_(n, &d__[1], &c__1); eps = dlamch_((char *)"Epsilon", (ftnlen)7); tol = eps * 8. * (d__1 = d__[jmax], abs(d__1)); - -/* If the rank-1 modifier is small enough, no more needs to be done */ -/* -- except to reorganize Q so that its columns correspond with the */ -/* elements in D. */ - if (*rho * (d__1 = z__[imax], abs(d__1)) <= tol) { *k = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { perm[j] = indxq[indx[j]]; - zcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1] - , &c__1); -/* L50: */ + zcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1], &c__1); } - zlacpy_((char *)"A", qsiz, n, &q2[q2_dim1 + 1], ldq2, &q[q_dim1 + 1], ldq, ( - ftnlen)1); + zlacpy_((char *)"A", qsiz, n, &q2[q2_dim1 + 1], ldq2, &q[q_dim1 + 1], ldq, (ftnlen)1); return 0; } - -/* If there are multiple eigenvalues then the problem deflates. Here */ -/* the number of equal eigenvalues are found. As each equal */ -/* eigenvalue is found, an elementary reflector is computed to rotate */ -/* the corresponding eigensubspace so that the corresponding */ -/* components of Z are zero in this new basis. */ - *k = 0; k2 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { - -/* Deflate due to small z component. */ - --k2; indxp[k2] = j; if (j == *n) { @@ -450,7 +125,6 @@ f"> */ jlam = j; goto L70; } -/* L60: */ } L70: ++j; @@ -458,47 +132,31 @@ L70: goto L90; } if (*rho * (d__1 = z__[j], abs(d__1)) <= tol) { - -/* Deflate due to small z component. */ - --k2; indxp[k2] = j; } else { - -/* Check if eigenvalues are close enough to allow deflation. */ - s = z__[jlam]; c__ = z__[j]; - -/* Find sqrt(a**2+b**2) without overflow or */ -/* destructive underflow. */ - tau = dlapy2_(&c__, &s); t = d__[j] - d__[jlam]; c__ /= tau; s = -s / tau; if ((d__1 = t * c__ * s, abs(d__1)) <= tol) { - -/* Deflation is possible. */ - z__[j] = tau; z__[jlam] = 0.; - -/* Record the appropriate Givens rotation */ - ++(*givptr); givcol[(*givptr << 1) + 1] = indxq[indx[jlam]]; givcol[(*givptr << 1) + 2] = indxq[indx[j]]; givnum[(*givptr << 1) + 1] = c__; givnum[(*givptr << 1) + 2] = s; - zdrot_(qsiz, &q[indxq[indx[jlam]] * q_dim1 + 1], &c__1, &q[indxq[ - indx[j]] * q_dim1 + 1], &c__1, &c__, &s); + zdrot_(qsiz, &q[indxq[indx[jlam]] * q_dim1 + 1], &c__1, &q[indxq[indx[j]] * q_dim1 + 1], + &c__1, &c__, &s); t = d__[jlam] * c__ * c__ + d__[j] * s * s; d__[j] = d__[jlam] * s * s + d__[j] * c__ * c__; d__[jlam] = t; --k2; i__ = 1; -L80: + L80: if (k2 + i__ <= *n) { if (d__[jlam] < d__[indxp[k2 + i__]]) { indxp[k2 + i__ - 1] = indxp[k2 + i__]; @@ -522,48 +180,27 @@ L80: } goto L70; L90: - -/* Record the last eigenvalue. */ - ++(*k); w[*k] = z__[jlam]; dlamda[*k] = d__[jlam]; indxp[*k] = jlam; - L100: - -/* Sort the eigenvalues and corresponding eigenvectors into DLAMDA */ -/* and Q2 respectively. The eigenvalues/vectors which were not */ -/* deflated go into the first K slots of DLAMDA and Q2 respectively, */ -/* while those which were deflated go into the last N - K slots. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { jp = indxp[j]; dlamda[j] = d__[jp]; perm[j] = indxq[indx[jp]]; - zcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1], & - c__1); -/* L110: */ + zcopy_(qsiz, &q[perm[j] * q_dim1 + 1], &c__1, &q2[j * q2_dim1 + 1], &c__1); } - -/* The deflated eigenvalues and their corresponding vectors go back */ -/* into the last N - K slots of D and Q respectively. */ - if (*k < *n) { i__1 = *n - *k; dcopy_(&i__1, &dlamda[*k + 1], &c__1, &d__[*k + 1], &c__1); i__1 = *n - *k; - zlacpy_((char *)"A", qsiz, &i__1, &q2[(*k + 1) * q2_dim1 + 1], ldq2, &q[(*k + - 1) * q_dim1 + 1], ldq, (ftnlen)1); + zlacpy_((char *)"A", qsiz, &i__1, &q2[(*k + 1) * q2_dim1 + 1], ldq2, &q[(*k + 1) * q_dim1 + 1], ldq, + (ftnlen)1); } - return 0; - -/* End of ZLAED8 */ - -} /* zlaed8_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlanhe.cpp b/lib/linalg/zlanhe.cpp index 6db6cc5cef..e0538d3084 100644 --- a/lib/linalg/zlanhe.cpp +++ b/lib/linalg/zlanhe.cpp @@ -1,206 +1,27 @@ -/* fortran/zlanhe.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b ZLANHE returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the ele -ment of largest absolute value of a complex Hermitian matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLANHE + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* DOUBLE PRECISION FUNCTION ZLANHE( NORM, UPLO, N, A, LDA, WORK ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER NORM, UPLO */ -/* INTEGER LDA, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION WORK( * ) */ -/* COMPLEX*16 A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLANHE returns the value of the one norm, or the Frobenius norm, or */ -/* > the infinity norm, or the element of largest absolute value of a */ -/* > complex hermitian matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \return ZLANHE */ -/* > \verbatim */ -/* > */ -/* > ZLANHE = ( max(abs(A(i,j))), NORM = 'M' or 'm' */ -/* > ( */ -/* > ( norm1(A), NORM = '1', 'O' or 'o' */ -/* > ( */ -/* > ( normI(A), NORM = 'I' or 'i' */ -/* > ( */ -/* > ( normF(A), NORM = 'F', 'f', 'E' or 'e' */ -/* > */ -/* > where norm1 denotes the one norm of a matrix (maximum column sum), */ -/* > normI denotes the infinity norm of a matrix (maximum row sum) and */ -/* > normF denotes the Frobenius norm of a matrix (square root of sum of */ -/* > squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] NORM */ -/* > \verbatim */ -/* > NORM is CHARACTER*1 */ -/* > Specifies the value to be returned in ZLANHE as described */ -/* > above. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies whether the upper or lower triangular part of the */ -/* > hermitian matrix A is to be referenced. */ -/* > = 'U': Upper triangular part of A is referenced */ -/* > = 'L': Lower triangular part of A is referenced */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. When N = 0, ZLANHE is */ -/* > set to zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > The hermitian matrix A. If UPLO = 'U', the leading n by n */ -/* > upper triangular part of A contains the upper triangular part */ -/* > of the matrix A, and the strictly lower triangular part of A */ -/* > is not referenced. If UPLO = 'L', the leading n by n lower */ -/* > triangular part of A contains the lower triangular part of */ -/* > the matrix A, and the strictly upper triangular part of A is */ -/* > not referenced. Note that the imaginary parts of the diagonal */ -/* > elements need not be set and are assumed to be zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(N,1). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)), */ -/* > where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, */ -/* > WORK is not referenced. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16HEauxiliary */ - -/* ===================================================================== */ -doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, - integer *lda, doublereal *work, ftnlen norm_len, ftnlen uplo_len) +doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, integer *lda, + doublereal *work, ftnlen norm_len, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; doublereal ret_val, d__1; - - /* Builtin functions */ double z_lmp_abs(doublecomplex *), sqrt(doublereal); - - /* Local variables */ integer i__, j; doublereal sum, absa, scale; extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal value; extern logical disnan_(doublereal *); - extern /* Subroutine */ int zlassq_(integer *, doublecomplex *, integer *, - doublereal *, doublereal *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ + extern int zlassq_(integer *, doublecomplex *, integer *, doublereal *, doublereal *); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; - - /* Function Body */ if (*n == 0) { value = 0.; } else if (lsame_(norm, (char *)"M", (ftnlen)1, (ftnlen)1)) { - -/* Find max(abs(A(i,j))). */ - value = 0.; if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { i__1 = *n; @@ -211,14 +32,12 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, if (value < sum || disnan_(&sum)) { value = sum; } -/* L10: */ } i__2 = j + j * a_dim1; sum = (d__1 = a[i__2].r, abs(d__1)); if (value < sum || disnan_(&sum)) { value = sum; } -/* L20: */ } } else { i__1 = *n; @@ -234,16 +53,11 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, if (value < sum || disnan_(&sum)) { value = sum; } -/* L30: */ } -/* L40: */ } } - } else if (lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"O", ( - ftnlen)1, (ftnlen)1) || *(unsigned char *)norm == '1') { - -/* Find normI(A) ( = norm1(A), since A is hermitian). */ - + } else if (lsame_(norm, (char *)"I", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"O", (ftnlen)1, (ftnlen)1) || + *(unsigned char *)norm == '1') { value = 0.; if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { i__1 = *n; @@ -254,11 +68,9 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, absa = z_lmp_abs(&a[i__ + j * a_dim1]); sum += absa; work[i__] += absa; -/* L50: */ } i__2 = j + j * a_dim1; work[j] = sum + (d__1 = a[i__2].r, abs(d__1)); -/* L60: */ } i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { @@ -266,13 +78,11 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, if (value < sum || disnan_(&sum)) { value = sum; } -/* L70: */ } } else { i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { work[i__] = 0.; -/* L80: */ } i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -283,19 +93,13 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, absa = z_lmp_abs(&a[i__ + j * a_dim1]); sum += absa; work[i__] += absa; -/* L90: */ } if (value < sum || disnan_(&sum)) { value = sum; } -/* L100: */ } } - } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", ( - ftnlen)1, (ftnlen)1)) { - -/* Find normF(A). */ - + } else if (lsame_(norm, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(norm, (char *)"E", (ftnlen)1, (ftnlen)1)) { scale = 0.; sum = 1.; if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { @@ -303,14 +107,12 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, for (j = 2; j <= i__1; ++j) { i__2 = j - 1; zlassq_(&i__2, &a[j * a_dim1 + 1], &c__1, &scale, &sum); -/* L110: */ } } else { i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = *n - j; zlassq_(&i__2, &a[j + 1 + j * a_dim1], &c__1, &scale, &sum); -/* L120: */ } } sum *= 2; @@ -321,28 +123,20 @@ doublereal zlanhe_(char *norm, char *uplo, integer *n, doublecomplex *a, i__2 = i__ + i__ * a_dim1; absa = (d__1 = a[i__2].r, abs(d__1)); if (scale < absa) { -/* Computing 2nd power */ d__1 = scale / absa; sum = sum * (d__1 * d__1) + 1.; scale = absa; } else { -/* Computing 2nd power */ d__1 = absa / scale; sum += d__1 * d__1; } } -/* L130: */ } value = scale * sqrt(sum); } - ret_val = value; return ret_val; - -/* End of ZLANHE */ - -} /* zlanhe_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlarf.cpp b/lib/linalg/zlarf.cpp index 7bee520eae..7f7468bcf9 100644 --- a/lib/linalg/zlarf.cpp +++ b/lib/linalg/zlarf.cpp @@ -1,213 +1,35 @@ -/* fortran/zlarf.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - -static doublecomplex c_b1 = {1.,0.}; -static doublecomplex c_b2 = {0.,0.}; +static doublecomplex c_b1 = {1., 0.}; +static doublecomplex c_b2 = {0., 0.}; static integer c__1 = 1; - -/* > \brief \b ZLARF applies an elementary reflector to a general rectangular matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLARF + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE */ -/* INTEGER INCV, LDC, M, N */ -/* COMPLEX*16 TAU */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLARF applies a complex elementary reflector H to a complex M-by-N */ -/* > matrix C, from either the left or the right. H is represented in the */ -/* > form */ -/* > */ -/* > H = I - tau * v * v**H */ -/* > */ -/* > where tau is a complex scalar and v is a complex vector. */ -/* > */ -/* > If tau = 0, then H is taken to be the unit matrix. */ -/* > */ -/* > To apply H**H, supply conjg(tau) instead */ -/* > tau. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': form H * C */ -/* > = 'R': form C * H */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] V */ -/* > \verbatim */ -/* > V is COMPLEX*16 array, dimension */ -/* > (1 + (M-1)*abs(INCV)) if SIDE = 'L' */ -/* > or (1 + (N-1)*abs(INCV)) if SIDE = 'R' */ -/* > The vector v in the representation of H. V is not used if */ -/* > TAU = 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCV */ -/* > \verbatim */ -/* > INCV is INTEGER */ -/* > The increment between elements of v. INCV <> 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 */ -/* > The value tau in the representation of H. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is COMPLEX*16 array, dimension (LDC,N) */ -/* > On entry, the M-by-N matrix C. */ -/* > On exit, C is overwritten by the matrix H * C if SIDE = 'L', */ -/* > or C * H if SIDE = 'R'. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension */ -/* > (N) if SIDE = 'L' */ -/* > or (M) if SIDE = 'R' */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int zlarf_(char *side, integer *m, integer *n, doublecomplex - *v, integer *incv, doublecomplex *tau, doublecomplex *c__, integer * - ldc, doublecomplex *work, ftnlen side_len) +int zlarf_(char *side, integer *m, integer *n, doublecomplex *v, integer *incv, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, ftnlen side_len) { - /* System generated locals */ integer c_dim1, c_offset, i__1; doublecomplex z__1; - - /* Local variables */ integer i__; logical applyleft; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer lastc; - extern /* Subroutine */ int zgerc_(integer *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *), zgemv_(char *, integer *, integer *, - doublecomplex *, doublecomplex *, integer *, doublecomplex *, - integer *, doublecomplex *, doublecomplex *, integer *, ftnlen); + extern int zgerc_(integer *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *), + zgemv_(char *, integer *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, integer *, ftnlen); integer lastv; extern integer ilazlc_(integer *, integer *, doublecomplex *, integer *), - ilazlr_(integer *, integer *, doublecomplex *, integer *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ + ilazlr_(integer *, integer *, doublecomplex *, integer *); --v; c_dim1 = *ldc; c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ applyleft = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); lastv = 0; lastc = 0; if (tau->r != 0. || tau->i != 0.) { -/* Set up variables for scanning V. LASTV begins pointing to the end */ -/* of V. */ if (applyleft) { lastv = *m; } else { @@ -218,66 +40,35 @@ static integer c__1 = 1; } else { i__ = 1; } -/* Look for the last non-zero row in V. */ - for(;;) { /* while(complicated condition) */ + for (;;) { i__1 = i__; - if (!(lastv > 0 && (v[i__1].r == 0. && v[i__1].i == 0.))) - break; + if (!(lastv > 0 && (v[i__1].r == 0. && v[i__1].i == 0.))) break; --lastv; i__ -= *incv; } if (applyleft) { -/* Scan for the last non-zero column in C(1:lastv,:). */ lastc = ilazlc_(&lastv, n, &c__[c_offset], ldc); } else { -/* Scan for the last non-zero row in C(:,1:lastv). */ lastc = ilazlr_(m, &lastv, &c__[c_offset], ldc); } } -/* Note that lastc.eq.0 renders the BLAS operations null; no special */ -/* case is needed at this level. */ if (applyleft) { - -/* Form H * C */ - if (lastv > 0) { - -/* w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1) */ - - zgemv_((char *)"Conjugate transpose", &lastv, &lastc, &c_b1, &c__[ - c_offset], ldc, &v[1], incv, &c_b2, &work[1], &c__1, ( - ftnlen)19); - -/* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H */ - + zgemv_((char *)"Conjugate transpose", &lastv, &lastc, &c_b1, &c__[c_offset], ldc, &v[1], incv, + &c_b2, &work[1], &c__1, (ftnlen)19); z__1.r = -tau->r, z__1.i = -tau->i; - zgerc_(&lastv, &lastc, &z__1, &v[1], incv, &work[1], &c__1, &c__[ - c_offset], ldc); + zgerc_(&lastv, &lastc, &z__1, &v[1], incv, &work[1], &c__1, &c__[c_offset], ldc); } } else { - -/* Form C * H */ - if (lastv > 0) { - -/* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) */ - - zgemv_((char *)"No transpose", &lastc, &lastv, &c_b1, &c__[c_offset], ldc, - &v[1], incv, &c_b2, &work[1], &c__1, (ftnlen)12); - -/* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H */ - + zgemv_((char *)"No transpose", &lastc, &lastv, &c_b1, &c__[c_offset], ldc, &v[1], incv, &c_b2, + &work[1], &c__1, (ftnlen)12); z__1.r = -tau->r, z__1.i = -tau->i; - zgerc_(&lastc, &lastv, &z__1, &work[1], &c__1, &v[1], incv, &c__[ - c_offset], ldc); + zgerc_(&lastc, &lastv, &z__1, &work[1], &c__1, &v[1], incv, &c__[c_offset], ldc); } } return 0; - -/* End of ZLARF */ - -} /* zlarf_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlarfb.cpp b/lib/linalg/zlarfb.cpp index e9015669ca..6b0d62e99f 100644 --- a/lib/linalg/zlarfb.cpp +++ b/lib/linalg/zlarfb.cpp @@ -1,277 +1,29 @@ -/* fortran/zlarfb.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - -static doublecomplex c_b1 = {1.,0.}; +static doublecomplex c_b1 = {1., 0.}; static integer c__1 = 1; - -/* > \brief \b ZLARFB applies a block reflector or its conjugate-transpose to a general rectangular matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLARFB + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, */ -/* T, LDT, C, LDC, WORK, LDWORK ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER DIRECT, SIDE, STOREV, TRANS */ -/* INTEGER K, LDC, LDT, LDV, LDWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 C( LDC, * ), T( LDT, * ), V( LDV, * ), */ -/* $ WORK( LDWORK, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLARFB applies a complex block reflector H or its transpose H**H to a */ -/* > complex M-by-N matrix C, from either the left or the right. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply H or H**H from the Left */ -/* > = 'R': apply H or H**H from the Right */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': apply H (No transpose) */ -/* > = 'C': apply H**H (Conjugate transpose) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIRECT */ -/* > \verbatim */ -/* > DIRECT is CHARACTER*1 */ -/* > Indicates how H is formed from a product of elementary */ -/* > reflectors */ -/* > = 'F': H = H(1) H(2) . . . H(k) (Forward) */ -/* > = 'B': H = H(k) . . . H(2) H(1) (Backward) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] STOREV */ -/* > \verbatim */ -/* > STOREV is CHARACTER*1 */ -/* > Indicates how the vectors which define the elementary */ -/* > reflectors are stored: */ -/* > = 'C': Columnwise */ -/* > = 'R': Rowwise */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The order of the matrix T (= the number of elementary */ -/* > reflectors whose product defines the block reflector). */ -/* > If SIDE = 'L', M >= K >= 0; */ -/* > if SIDE = 'R', N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] V */ -/* > \verbatim */ -/* > V is COMPLEX*16 array, dimension */ -/* > (LDV,K) if STOREV = 'C' */ -/* > (LDV,M) if STOREV = 'R' and SIDE = 'L' */ -/* > (LDV,N) if STOREV = 'R' and SIDE = 'R' */ -/* > See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDV */ -/* > \verbatim */ -/* > LDV is INTEGER */ -/* > The leading dimension of the array V. */ -/* > If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); */ -/* > if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); */ -/* > if STOREV = 'R', LDV >= K. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] T */ -/* > \verbatim */ -/* > T is COMPLEX*16 array, dimension (LDT,K) */ -/* > The triangular K-by-K matrix T in the representation of the */ -/* > block reflector. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDT */ -/* > \verbatim */ -/* > LDT is INTEGER */ -/* > The leading dimension of the array T. LDT >= K. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is COMPLEX*16 array, dimension (LDC,N) */ -/* > On entry, the M-by-N matrix C. */ -/* > On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (LDWORK,K) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDWORK */ -/* > \verbatim */ -/* > LDWORK is INTEGER */ -/* > The leading dimension of the array WORK. */ -/* > If SIDE = 'L', LDWORK >= max(1,N); */ -/* > if SIDE = 'R', LDWORK >= max(1,M). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The shape of the matrix V and the storage of the vectors which define */ -/* > the H(i) is best illustrated by the following example with n = 5 and */ -/* > k = 3. The elements equal to 1 are not stored; the corresponding */ -/* > array elements are modified but restored on exit. The rest of the */ -/* > array is not used. */ -/* > */ -/* > DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ -/* > */ -/* > V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) */ -/* > ( v1 1 ) ( 1 v2 v2 v2 ) */ -/* > ( v1 v2 1 ) ( 1 v3 v3 ) */ -/* > ( v1 v2 v3 ) */ -/* > ( v1 v2 v3 ) */ -/* > */ -/* > DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ -/* > */ -/* > V = ( v1 v2 v3 ) V = ( v1 v1 1 ) */ -/* > ( v1 v2 v3 ) ( v2 v2 v2 1 ) */ -/* > ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) */ -/* > ( 1 v3 ) */ -/* > ( 1 ) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zlarfb_(char *side, char *trans, char *direct, char * - storev, integer *m, integer *n, integer *k, doublecomplex *v, integer - *ldv, doublecomplex *t, integer *ldt, doublecomplex *c__, integer * - ldc, doublecomplex *work, integer *ldwork, ftnlen side_len, ftnlen - trans_len, ftnlen direct_len, ftnlen storev_len) +int zlarfb_(char *side, char *trans, char *direct, char *storev, integer *m, integer *n, integer *k, + doublecomplex *v, integer *ldv, doublecomplex *t, integer *ldt, doublecomplex *c__, + integer *ldc, doublecomplex *work, integer *ldwork, ftnlen side_len, ftnlen trans_len, + ftnlen direct_len, ftnlen storev_len) { - /* System generated locals */ - integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, - work_offset, i__1, i__2, i__3, i__4, i__5; + integer c_dim1, c_offset, t_dim1, t_offset, v_dim1, v_offset, work_dim1, work_offset, i__1, + i__2, i__3, i__4, i__5; doublecomplex z__1, z__2; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int zgemm_(char *, char *, integer *, integer *, - integer *, doublecomplex *, doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, ftnlen, ftnlen), zcopy_(integer *, doublecomplex *, - integer *, doublecomplex *, integer *), ztrmm_(char *, char *, - char *, char *, integer *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, - ftnlen, ftnlen, ftnlen), zlacgv_(integer *, doublecomplex *, - integer *); + extern int zgemm_(char *, char *, integer *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, ftnlen, ftnlen), + zcopy_(integer *, doublecomplex *, integer *, doublecomplex *, integer *), + ztrmm_(char *, char *, char *, char *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, + ftnlen), + zlacgv_(integer *, doublecomplex *, integer *); char transt[1]; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick return if possible */ - - /* Parameter adjustments */ v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; @@ -284,87 +36,42 @@ f"> */ work_dim1 = *ldwork; work_offset = 1 + work_dim1; work -= work_offset; - - /* Function Body */ if (*m <= 0 || *n <= 0) { return 0; } - if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { *(unsigned char *)transt = 'C'; } else { *(unsigned char *)transt = 'N'; } - if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - -/* Let V = ( V1 ) (first K rows) */ -/* ( V2 ) */ -/* where V1 is unit lower triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Form H * C or H**H * C where C = ( C1 ) */ -/* ( C2 ) */ - -/* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) */ - -/* W := C1**H */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - zcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], - &c__1); + zcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); zlacgv_(n, &work[j * work_dim1 + 1], &c__1); -/* L10: */ } - -/* W := W * V1 */ - - ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, &v[v_offset], ldv, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); if (*m > *k) { - -/* W := W + C2**H * V2 */ - i__1 = *m - *k; - zgemm_((char *)"Conjugate transpose", (char *)"No transpose", n, k, &i__1, - &c_b1, &c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + - v_dim1], ldv, &c_b1, &work[work_offset], ldwork, ( - ftnlen)19, (ftnlen)12); + zgemm_((char *)"Conjugate transpose", (char *)"No transpose", n, k, &i__1, &c_b1, + &c__[*k + 1 + c_dim1], ldc, &v[*k + 1 + v_dim1], ldv, &c_b1, + &work[work_offset], ldwork, (ftnlen)19, (ftnlen)12); } - -/* W := W * T**H or W * T */ - - ztrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - V * W**H */ - + ztrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b1, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*m > *k) { - -/* C2 := C2 - V2 * W**H */ - i__1 = *m - *k; z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"No transpose", (char *)"Conjugate transpose", &i__1, n, k, - &z__1, &v[*k + 1 + v_dim1], ldv, &work[ - work_offset], ldwork, &c_b1, &c__[*k + 1 + c_dim1] - , ldc, (ftnlen)12, (ftnlen)19); + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", &i__1, n, k, &z__1, + &v[*k + 1 + v_dim1], ldv, &work[work_offset], ldwork, &c_b1, + &c__[*k + 1 + c_dim1], ldc, (ftnlen)12, (ftnlen)19); } - -/* W := W * V1**H */ - - ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", n, k, - &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, - (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); - -/* C1 := C1 - W**H */ - + ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", n, k, &c_b1, &v[v_offset], + ldv, &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)19, + (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *n; @@ -372,73 +79,35 @@ f"> */ i__3 = j + i__ * c_dim1; i__4 = j + i__ * c_dim1; d_lmp_cnjg(&z__2, &work[i__ + j * work_dim1]); - z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - - z__2.i; + z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - z__2.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L20: */ } -/* L30: */ } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - -/* Form C * H or C * H**H where C = ( C1 C2 ) */ - -/* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ - -/* W := C1 */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - zcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * - work_dim1 + 1], &c__1); -/* L40: */ + zcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1); } - -/* W := W * V1 */ - - ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, &v[v_offset], ldv, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); if (*n > *k) { - -/* W := W + C2 * V2 */ - i__1 = *n - *k; zgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, &c_b1, - &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + 1 + - v_dim1], ldv, &c_b1, &work[work_offset], ldwork, ( - ftnlen)12, (ftnlen)12); + &c__[(*k + 1) * c_dim1 + 1], ldc, &v[*k + 1 + v_dim1], ldv, &c_b1, + &work[work_offset], ldwork, (ftnlen)12, (ftnlen)12); } - -/* W := W * T or W * T**H */ - - ztrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - W * V**H */ - + ztrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b1, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*n > *k) { - -/* C2 := C2 - W * V2**H */ - i__1 = *n - *k; z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, &i__1, k, - &z__1, &work[work_offset], ldwork, &v[*k + 1 + - v_dim1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 1], - ldc, (ftnlen)12, (ftnlen)19); + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, &i__1, k, &z__1, + &work[work_offset], ldwork, &v[*k + 1 + v_dim1], ldv, &c_b1, + &c__[(*k + 1) * c_dim1 + 1], ldc, (ftnlen)12, (ftnlen)19); } - -/* W := W * V1**H */ - - ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", m, k, - &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, - (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); - -/* C1 := C1 - W */ - + ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", m, k, &c_b1, &v[v_offset], + ldv, &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)19, + (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -446,83 +115,39 @@ f"> */ i__3 = i__ + j * c_dim1; i__4 = i__ + j * c_dim1; i__5 = i__ + j * work_dim1; - z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ - i__4].i - work[i__5].i; + z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[i__4].i - work[i__5].i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L50: */ } -/* L60: */ } } - } else { - -/* Let V = ( V1 ) */ -/* ( V2 ) (last K rows) */ -/* where V2 is unit upper triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Form H * C or H**H * C where C = ( C1 ) */ -/* ( C2 ) */ - -/* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) */ - -/* W := C2**H */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - zcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * - work_dim1 + 1], &c__1); + zcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); zlacgv_(n, &work[j * work_dim1 + 1], &c__1); -/* L70: */ } - -/* W := W * V2 */ - ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, - &v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + &v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)12, (ftnlen)4); if (*m > *k) { - -/* W := W + C1**H * V1 */ - i__1 = *m - *k; - zgemm_((char *)"Conjugate transpose", (char *)"No transpose", n, k, &i__1, - &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv, & - c_b1, &work[work_offset], ldwork, (ftnlen)19, ( - ftnlen)12); + zgemm_((char *)"Conjugate transpose", (char *)"No transpose", n, k, &i__1, &c_b1, + &c__[c_offset], ldc, &v[v_offset], ldv, &c_b1, &work[work_offset], + ldwork, (ftnlen)19, (ftnlen)12); } - -/* W := W * T**H or W * T */ - - ztrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - V * W**H */ - + ztrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b1, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*m > *k) { - -/* C1 := C1 - V1 * W**H */ - i__1 = *m - *k; z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"No transpose", (char *)"Conjugate transpose", &i__1, n, k, - &z__1, &v[v_offset], ldv, &work[work_offset], - ldwork, &c_b1, &c__[c_offset], ldc, (ftnlen)12, ( - ftnlen)19); + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", &i__1, n, k, &z__1, &v[v_offset], + ldv, &work[work_offset], ldwork, &c_b1, &c__[c_offset], ldc, (ftnlen)12, + (ftnlen)19); } - -/* W := W * V2**H */ - - ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", n, k, - &c_b1, &v[*m - *k + 1 + v_dim1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 19, (ftnlen)4); - -/* C2 := C2 - W**H */ - + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", n, k, &c_b1, + &v[*m - *k + 1 + v_dim1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)19, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *n; @@ -530,74 +155,37 @@ f"> */ i__3 = *m - *k + j + i__ * c_dim1; i__4 = *m - *k + j + i__ * c_dim1; d_lmp_cnjg(&z__2, &work[i__ + j * work_dim1]); - z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - - z__2.i; + z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - z__2.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L80: */ } -/* L90: */ } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - -/* Form C * H or C * H**H where C = ( C1 C2 ) */ - -/* W := C * V = (C1*V1 + C2*V2) (stored in WORK) */ - -/* W := C2 */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - zcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ - j * work_dim1 + 1], &c__1); -/* L100: */ + zcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], + &c__1); } - -/* W := W * V2 */ - ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, - &v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], - ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); + &v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)12, (ftnlen)4); if (*n > *k) { - -/* W := W + C1 * V1 */ - i__1 = *n - *k; - zgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, &c_b1, - &c__[c_offset], ldc, &v[v_offset], ldv, &c_b1, & - work[work_offset], ldwork, (ftnlen)12, (ftnlen)12) - ; + zgemm_((char *)"No transpose", (char *)"No transpose", m, k, &i__1, &c_b1, &c__[c_offset], ldc, + &v[v_offset], ldv, &c_b1, &work[work_offset], ldwork, (ftnlen)12, + (ftnlen)12); } - -/* W := W * T or W * T**H */ - - ztrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - W * V**H */ - + ztrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b1, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*n > *k) { - -/* C1 := C1 - W * V1**H */ - i__1 = *n - *k; z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, &i__1, k, - &z__1, &work[work_offset], ldwork, &v[v_offset], - ldv, &c_b1, &c__[c_offset], ldc, (ftnlen)12, ( - ftnlen)19); + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, &i__1, k, &z__1, + &work[work_offset], ldwork, &v[v_offset], ldv, &c_b1, &c__[c_offset], + ldc, (ftnlen)12, (ftnlen)19); } - -/* W := W * V2**H */ - - ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", m, k, - &c_b1, &v[*n - *k + 1 + v_dim1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 19, (ftnlen)4); - -/* C2 := C2 - W */ - + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", m, k, &c_b1, + &v[*n - *k + 1 + v_dim1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)19, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -605,84 +193,40 @@ f"> */ i__3 = i__ + (*n - *k + j) * c_dim1; i__4 = i__ + (*n - *k + j) * c_dim1; i__5 = i__ + j * work_dim1; - z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ - i__4].i - work[i__5].i; + z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[i__4].i - work[i__5].i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L110: */ } -/* L120: */ } } } - } else if (lsame_(storev, (char *)"R", (ftnlen)1, (ftnlen)1)) { - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { - -/* Let V = ( V1 V2 ) (V1: first K columns) */ -/* where V1 is unit upper triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Form H * C or H**H * C where C = ( C1 ) */ -/* ( C2 ) */ - -/* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) */ - -/* W := C1**H */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - zcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], - &c__1); + zcopy_(n, &c__[j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); zlacgv_(n, &work[j * work_dim1 + 1], &c__1); -/* L130: */ } - -/* W := W * V1**H */ - - ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", n, k, - &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, - (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", n, k, &c_b1, &v[v_offset], + ldv, &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)19, + (ftnlen)4); if (*m > *k) { - -/* W := W + C2**H * V2**H */ - i__1 = *m - *k; - zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", n, k, - &i__1, &c_b1, &c__[*k + 1 + c_dim1], ldc, &v[(*k - + 1) * v_dim1 + 1], ldv, &c_b1, &work[work_offset] - , ldwork, (ftnlen)19, (ftnlen)19); + zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", n, k, &i__1, &c_b1, + &c__[*k + 1 + c_dim1], ldc, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b1, + &work[work_offset], ldwork, (ftnlen)19, (ftnlen)19); } - -/* W := W * T**H or W * T */ - - ztrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - V**H * W**H */ - + ztrmm_((char *)"Right", (char *)"Upper", transt, (char *)"Non-unit", n, k, &c_b1, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*m > *k) { - -/* C2 := C2 - V2**H * W**H */ - i__1 = *m - *k; z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", & - i__1, n, k, &z__1, &v[(*k + 1) * v_dim1 + 1], ldv, - &work[work_offset], ldwork, &c_b1, &c__[*k + 1 + - c_dim1], ldc, (ftnlen)19, (ftnlen)19); + zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", &i__1, n, k, &z__1, + &v[(*k + 1) * v_dim1 + 1], ldv, &work[work_offset], ldwork, &c_b1, + &c__[*k + 1 + c_dim1], ldc, (ftnlen)19, (ftnlen)19); } - -/* W := W * V1 */ - - ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); - -/* C1 := C1 - W**H */ - + ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, &v[v_offset], ldv, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *n; @@ -690,73 +234,35 @@ f"> */ i__3 = j + i__ * c_dim1; i__4 = j + i__ * c_dim1; d_lmp_cnjg(&z__2, &work[i__ + j * work_dim1]); - z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - - z__2.i; + z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - z__2.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L140: */ } -/* L150: */ } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - -/* Form C * H or C * H**H where C = ( C1 C2 ) */ - -/* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) */ - -/* W := C1 */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - zcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * - work_dim1 + 1], &c__1); -/* L160: */ + zcopy_(m, &c__[j * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], &c__1); } - -/* W := W * V1**H */ - - ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", m, k, - &c_b1, &v[v_offset], ldv, &work[work_offset], ldwork, - (ftnlen)5, (ftnlen)5, (ftnlen)19, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Upper", (char *)"Conjugate transpose", (char *)"Unit", m, k, &c_b1, &v[v_offset], + ldv, &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)19, + (ftnlen)4); if (*n > *k) { - -/* W := W + C2 * V2**H */ - i__1 = *n - *k; - zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, k, &i__1, - &c_b1, &c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k - + 1) * v_dim1 + 1], ldv, &c_b1, &work[work_offset] - , ldwork, (ftnlen)12, (ftnlen)19); + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, k, &i__1, &c_b1, + &c__[(*k + 1) * c_dim1 + 1], ldc, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b1, + &work[work_offset], ldwork, (ftnlen)12, (ftnlen)19); } - -/* W := W * T or W * T**H */ - - ztrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - W * V */ - + ztrmm_((char *)"Right", (char *)"Upper", trans, (char *)"Non-unit", m, k, &c_b1, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*n > *k) { - -/* C2 := C2 - W * V2 */ - i__1 = *n - *k; z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, &z__1, - &work[work_offset], ldwork, &v[(*k + 1) * v_dim1 - + 1], ldv, &c_b1, &c__[(*k + 1) * c_dim1 + 1], - ldc, (ftnlen)12, (ftnlen)12); + zgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, &z__1, &work[work_offset], + ldwork, &v[(*k + 1) * v_dim1 + 1], ldv, &c_b1, + &c__[(*k + 1) * c_dim1 + 1], ldc, (ftnlen)12, (ftnlen)12); } - -/* W := W * V1 */ - - ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, - &v[v_offset], ldv, &work[work_offset], ldwork, ( - ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); - -/* C1 := C1 - W */ - + ztrmm_((char *)"Right", (char *)"Upper", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, &v[v_offset], ldv, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)12, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -764,84 +270,39 @@ f"> */ i__3 = i__ + j * c_dim1; i__4 = i__ + j * c_dim1; i__5 = i__ + j * work_dim1; - z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ - i__4].i - work[i__5].i; + z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[i__4].i - work[i__5].i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L170: */ } -/* L180: */ } - } - } else { - -/* Let V = ( V1 V2 ) (V2: last K columns) */ -/* where V2 is unit lower triangular. */ - if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Form H * C or H**H * C where C = ( C1 ) */ -/* ( C2 ) */ - -/* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) */ - -/* W := C2**H */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - zcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * - work_dim1 + 1], &c__1); + zcopy_(n, &c__[*m - *k + j + c_dim1], ldc, &work[j * work_dim1 + 1], &c__1); zlacgv_(n, &work[j * work_dim1 + 1], &c__1); -/* L190: */ } - -/* W := W * V2**H */ - - ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", n, k, - &c_b1, &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 19, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", n, k, &c_b1, + &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)19, (ftnlen)4); if (*m > *k) { - -/* W := W + C1**H * V1**H */ - i__1 = *m - *k; - zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", n, k, - &i__1, &c_b1, &c__[c_offset], ldc, &v[v_offset], - ldv, &c_b1, &work[work_offset], ldwork, (ftnlen) - 19, (ftnlen)19); + zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", n, k, &i__1, &c_b1, + &c__[c_offset], ldc, &v[v_offset], ldv, &c_b1, &work[work_offset], + ldwork, (ftnlen)19, (ftnlen)19); } - -/* W := W * T**H or W * T */ - - ztrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - V**H * W**H */ - + ztrmm_((char *)"Right", (char *)"Lower", transt, (char *)"Non-unit", n, k, &c_b1, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*m > *k) { - -/* C1 := C1 - V1**H * W**H */ - i__1 = *m - *k; z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", & - i__1, n, k, &z__1, &v[v_offset], ldv, &work[ - work_offset], ldwork, &c_b1, &c__[c_offset], ldc, - (ftnlen)19, (ftnlen)19); + zgemm_((char *)"Conjugate transpose", (char *)"Conjugate transpose", &i__1, n, k, &z__1, + &v[v_offset], ldv, &work[work_offset], ldwork, &c_b1, &c__[c_offset], + ldc, (ftnlen)19, (ftnlen)19); } - -/* W := W * V2 */ - ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", n, k, &c_b1, - &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 12, (ftnlen)4); - -/* C2 := C2 - W**H */ - + &v[(*m - *k + 1) * v_dim1 + 1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)12, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *n; @@ -849,75 +310,37 @@ f"> */ i__3 = *m - *k + j + i__ * c_dim1; i__4 = *m - *k + j + i__ * c_dim1; d_lmp_cnjg(&z__2, &work[i__ + j * work_dim1]); - z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - - z__2.i; + z__1.r = c__[i__4].r - z__2.r, z__1.i = c__[i__4].i - z__2.i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L200: */ } -/* L210: */ } - } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - -/* Form C * H or C * H**H where C = ( C1 C2 ) */ - -/* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) */ - -/* W := C2 */ - i__1 = *k; for (j = 1; j <= i__1; ++j) { - zcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[ - j * work_dim1 + 1], &c__1); -/* L220: */ + zcopy_(m, &c__[(*n - *k + j) * c_dim1 + 1], &c__1, &work[j * work_dim1 + 1], + &c__1); } - -/* W := W * V2**H */ - - ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", m, k, - &c_b1, &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 19, (ftnlen)4); + ztrmm_((char *)"Right", (char *)"Lower", (char *)"Conjugate transpose", (char *)"Unit", m, k, &c_b1, + &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)19, (ftnlen)4); if (*n > *k) { - -/* W := W + C1 * V1**H */ - i__1 = *n - *k; - zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, k, &i__1, - &c_b1, &c__[c_offset], ldc, &v[v_offset], ldv, & - c_b1, &work[work_offset], ldwork, (ftnlen)12, ( - ftnlen)19); + zgemm_((char *)"No transpose", (char *)"Conjugate transpose", m, k, &i__1, &c_b1, + &c__[c_offset], ldc, &v[v_offset], ldv, &c_b1, &work[work_offset], + ldwork, (ftnlen)12, (ftnlen)19); } - -/* W := W * T or W * T**H */ - - ztrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b1, &t[ - t_offset], ldt, &work[work_offset], ldwork, (ftnlen)5, - (ftnlen)5, (ftnlen)1, (ftnlen)8); - -/* C := C - W * V */ - + ztrmm_((char *)"Right", (char *)"Lower", trans, (char *)"Non-unit", m, k, &c_b1, &t[t_offset], ldt, + &work[work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen)1, (ftnlen)8); if (*n > *k) { - -/* C1 := C1 - W * V1 */ - i__1 = *n - *k; z__1.r = -1., z__1.i = -0.; - zgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, &z__1, - &work[work_offset], ldwork, &v[v_offset], ldv, & - c_b1, &c__[c_offset], ldc, (ftnlen)12, (ftnlen)12) - ; + zgemm_((char *)"No transpose", (char *)"No transpose", m, &i__1, k, &z__1, &work[work_offset], + ldwork, &v[v_offset], ldv, &c_b1, &c__[c_offset], ldc, (ftnlen)12, + (ftnlen)12); } - -/* W := W * V2 */ - ztrmm_((char *)"Right", (char *)"Lower", (char *)"No transpose", (char *)"Unit", m, k, &c_b1, - &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[ - work_offset], ldwork, (ftnlen)5, (ftnlen)5, (ftnlen) - 12, (ftnlen)4); - -/* C1 := C1 - W */ - + &v[(*n - *k + 1) * v_dim1 + 1], ldv, &work[work_offset], ldwork, (ftnlen)5, + (ftnlen)5, (ftnlen)12, (ftnlen)4); i__1 = *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -925,25 +348,15 @@ f"> */ i__3 = i__ + (*n - *k + j) * c_dim1; i__4 = i__ + (*n - *k + j) * c_dim1; i__5 = i__ + j * work_dim1; - z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[ - i__4].i - work[i__5].i; + z__1.r = c__[i__4].r - work[i__5].r, z__1.i = c__[i__4].i - work[i__5].i; c__[i__3].r = z__1.r, c__[i__3].i = z__1.i; -/* L230: */ } -/* L240: */ } - } - } } - return 0; - -/* End of ZLARFB */ - -} /* zlarfb_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlarfg.cpp b/lib/linalg/zlarfg.cpp index 518ba9bcbb..84f5efad01 100644 --- a/lib/linalg/zlarfg.cpp +++ b/lib/linalg/zlarfg.cpp @@ -1,216 +1,43 @@ -/* fortran/zlarfg.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - -static doublecomplex c_b5 = {1.,0.}; - -/* > \brief \b ZLARFG generates an elementary reflector (Householder matrix). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLARFG + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX, N */ -/* COMPLEX*16 ALPHA, TAU */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 X( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLARFG generates a complex elementary reflector H of order n, such */ -/* > that */ -/* > */ -/* > H**H * ( alpha ) = ( beta ), H**H * H = I. */ -/* > ( x ) ( 0 ) */ -/* > */ -/* > where alpha and beta are scalars, with beta real, and x is an */ -/* > (n-1)-element complex vector. H is represented in the form */ -/* > */ -/* > H = I - tau * ( 1 ) * ( 1 v**H ) , */ -/* > ( v ) */ -/* > */ -/* > where tau is a complex scalar and v is a complex (n-1)-element */ -/* > vector. Note that H is not hermitian. */ -/* > */ -/* > If the elements of x are all zero and alpha is real, then tau = 0 */ -/* > and H is taken to be the unit matrix. */ -/* > */ -/* > Otherwise 1 <= real(tau) <= 2 and abs(tau-1) <= 1 . */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the elementary reflector. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] ALPHA */ -/* > \verbatim */ -/* > ALPHA is COMPLEX*16 */ -/* > On entry, the value alpha. */ -/* > On exit, it is overwritten with the value beta. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 array, dimension */ -/* > (1+(N-2)*abs(INCX)) */ -/* > On entry, the vector x. */ -/* > On exit, it is overwritten with the vector v. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > The increment between elements of X. INCX > 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 */ -/* > The value tau. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int zlarfg_(integer *n, doublecomplex *alpha, doublecomplex * - x, integer *incx, doublecomplex *tau) +static doublecomplex c_b5 = {1., 0.}; +int zlarfg_(integer *n, doublecomplex *alpha, doublecomplex *x, integer *incx, doublecomplex *tau) { - /* System generated locals */ integer i__1; doublereal d__1, d__2; doublecomplex z__1, z__2; - - /* Builtin functions */ double d_lmp_imag(doublecomplex *), d_lmp_sign(doublereal *, doublereal *); - - /* Local variables */ integer j, knt; doublereal beta, alphi, alphr; - extern /* Subroutine */ int zscal_(integer *, doublecomplex *, - doublecomplex *, integer *); + extern int zscal_(integer *, doublecomplex *, doublecomplex *, integer *); doublereal xnorm; extern doublereal dlapy3_(doublereal *, doublereal *, doublereal *), - dznrm2_(integer *, doublecomplex *, integer *), dlamch_(char *, - ftnlen); + dznrm2_(integer *, doublecomplex *, integer *), dlamch_(char *, ftnlen); doublereal safmin; - extern /* Subroutine */ int zdscal_(integer *, doublereal *, - doublecomplex *, integer *); + extern int zdscal_(integer *, doublereal *, doublecomplex *, integer *); doublereal rsafmn; - extern /* Double Complex */ VOID zladiv_(doublecomplex *, doublecomplex *, - doublecomplex *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ + extern VOID zladiv_(doublecomplex *, doublecomplex *, doublecomplex *); --x; - - /* Function Body */ if (*n <= 0) { tau->r = 0., tau->i = 0.; return 0; } - i__1 = *n - 1; xnorm = dznrm2_(&i__1, &x[1], incx); alphr = alpha->r; alphi = d_lmp_imag(alpha); - if (xnorm == 0. && alphi == 0.) { - -/* H = I */ - tau->r = 0., tau->i = 0.; } else { - -/* general case */ - d__1 = dlapy3_(&alphr, &alphi, &xnorm); beta = -d_lmp_sign(&d__1, &alphr); safmin = dlamch_((char *)"S", (ftnlen)1) / dlamch_((char *)"E", (ftnlen)1); rsafmn = 1. / safmin; - knt = 0; if (abs(beta) < safmin) { - -/* XNORM, BETA may be inaccurate; scale X and recompute them */ - -L10: + L10: ++knt; i__1 = *n - 1; zdscal_(&i__1, &rsafmn, &x[1], incx); @@ -220,9 +47,6 @@ L10: if (abs(beta) < safmin && knt < 20) { goto L10; } - -/* New BETA is at most 1, at least SAFMIN */ - i__1 = *n - 1; xnorm = dznrm2_(&i__1, &x[1], incx); z__1.r = alphr, z__1.i = alphi; @@ -239,23 +63,14 @@ L10: alpha->r = z__1.r, alpha->i = z__1.i; i__1 = *n - 1; zscal_(&i__1, alpha, &x[1], incx); - -/* If ALPHA is subnormal, it may lose relative accuracy */ - i__1 = knt; for (j = 1; j <= i__1; ++j) { beta *= safmin; -/* L20: */ } alpha->r = beta, alpha->i = 0.; } - return 0; - -/* End of ZLARFG */ - -} /* zlarfg_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlarft.cpp b/lib/linalg/zlarft.cpp index 391de106cf..f778f646d2 100644 --- a/lib/linalg/zlarft.cpp +++ b/lib/linalg/zlarft.cpp @@ -1,239 +1,26 @@ -/* static/zlarft.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - -static doublecomplex c_b1 = {1.,0.}; +static doublecomplex c_b1 = {1., 0.}; static integer c__1 = 1; - -/* > \brief \b ZLARFT forms the triangular factor T of a block reflector H = I - vtvH */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLARFT + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER DIRECT, STOREV */ -/* INTEGER K, LDT, LDV, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLARFT forms the triangular factor T of a complex block reflector H */ -/* > of order n, which is defined as a product of k elementary reflectors. */ -/* > */ -/* > If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; */ -/* > */ -/* > If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. */ -/* > */ -/* > If STOREV = 'C', the vector which defines the elementary reflector */ -/* > H(i) is stored in the i-th column of the array V, and */ -/* > */ -/* > H = I - V * T * V**H */ -/* > */ -/* > If STOREV = 'R', the vector which defines the elementary reflector */ -/* > H(i) is stored in the i-th row of the array V, and */ -/* > */ -/* > H = I - V**H * T * V */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] DIRECT */ -/* > \verbatim */ -/* > DIRECT is CHARACTER*1 */ -/* > Specifies the order in which the elementary reflectors are */ -/* > multiplied to form the block reflector: */ -/* > = 'F': H = H(1) H(2) . . . H(k) (Forward) */ -/* > = 'B': H = H(k) . . . H(2) H(1) (Backward) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] STOREV */ -/* > \verbatim */ -/* > STOREV is CHARACTER*1 */ -/* > Specifies how the vectors which define the elementary */ -/* > reflectors are stored (see also Further Details): */ -/* > = 'C': columnwise */ -/* > = 'R': rowwise */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the block reflector H. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The order of the triangular factor T (= the number of */ -/* > elementary reflectors). K >= 1. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] V */ -/* > \verbatim */ -/* > V is COMPLEX*16 array, dimension */ -/* > (LDV,K) if STOREV = 'C' */ -/* > (LDV,N) if STOREV = 'R' */ -/* > The matrix V. See further details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDV */ -/* > \verbatim */ -/* > LDV is INTEGER */ -/* > The leading dimension of the array V. */ -/* > If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] T */ -/* > \verbatim */ -/* > T is COMPLEX*16 array, dimension (LDT,K) */ -/* > The k by k triangular factor T of the block reflector. */ -/* > If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is */ -/* > lower triangular. The rest of the array is not used. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDT */ -/* > \verbatim */ -/* > LDT is INTEGER */ -/* > The leading dimension of the array T. LDT >= K. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The shape of the matrix V and the storage of the vectors which define */ -/* > the H(i) is best illustrated by the following example with n = 5 and */ -/* > k = 3. The elements equal to 1 are not stored. */ -/* > */ -/* > DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': */ -/* > */ -/* > V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) */ -/* > ( v1 1 ) ( 1 v2 v2 v2 ) */ -/* > ( v1 v2 1 ) ( 1 v3 v3 ) */ -/* > ( v1 v2 v3 ) */ -/* > ( v1 v2 v3 ) */ -/* > */ -/* > DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': */ -/* > */ -/* > V = ( v1 v2 v3 ) V = ( v1 v1 1 ) */ -/* > ( v1 v2 v3 ) ( v2 v2 v2 1 ) */ -/* > ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) */ -/* > ( 1 v3 ) */ -/* > ( 1 ) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zlarft_(char *direct, char *storev, integer *n, integer * - k, doublecomplex *v, integer *ldv, doublecomplex *tau, doublecomplex * - t, integer *ldt, ftnlen direct_len, ftnlen storev_len) +int zlarft_(char *direct, char *storev, integer *n, integer *k, doublecomplex *v, integer *ldv, + doublecomplex *tau, doublecomplex *t, integer *ldt, ftnlen direct_len, + ftnlen storev_len) { - /* System generated locals */ integer t_dim1, t_offset, v_dim1, v_offset, i__1, i__2, i__3, i__4, i__5; doublecomplex z__1, z__2, z__3; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j, prevlastv; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int zgemm_(char *, char *, integer *, integer *, - integer *, doublecomplex *, doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, ftnlen, ftnlen), zgemv_(char *, integer *, integer *, - doublecomplex *, doublecomplex *, integer *, doublecomplex *, - integer *, doublecomplex *, doublecomplex *, integer *, ftnlen); + extern int zgemm_(char *, char *, integer *, integer *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, ftnlen, ftnlen), + zgemv_(char *, integer *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, integer *, ftnlen); integer lastv; - extern /* Subroutine */ int ztrmv_(char *, char *, char *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, - ftnlen, ftnlen); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick return if possible */ - - /* Parameter adjustments */ + extern int ztrmv_(char *, char *, char *, integer *, doublecomplex *, integer *, + doublecomplex *, integer *, ftnlen, ftnlen, ftnlen); v_dim1 = *ldv; v_offset = 1 + v_dim1; v -= v_offset; @@ -241,33 +28,23 @@ f"> */ t_dim1 = *ldt; t_offset = 1 + t_dim1; t -= t_offset; - - /* Function Body */ if (*n == 0) { return 0; } - if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { prevlastv = *n; i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { - prevlastv = max(prevlastv,i__); + prevlastv = max(prevlastv, i__); i__2 = i__; if (tau[i__2].r == 0. && tau[i__2].i == 0.) { - -/* H(i) = I */ - i__2 = i__; for (j = 1; j <= i__2; ++j) { i__3 = j + i__ * t_dim1; t[i__3].r = 0., t[i__3].i = 0.; } } else { - -/* general case */ - if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { -/* Skip any trailing zeros. */ i__2 = i__ + 1; for (lastv = *n; lastv >= i__2; --lastv) { i__3 = lastv + i__ * v_dim1; @@ -275,31 +52,26 @@ f"> */ goto L220; } } -L220: + L220: i__2 = i__ - 1; for (j = 1; j <= i__2; ++j) { i__3 = j + i__ * t_dim1; i__4 = i__; z__2.r = -tau[i__4].r, z__2.i = -tau[i__4].i; d_lmp_cnjg(&z__3, &v[i__ + j * v_dim1]); - z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, z__1.i = - z__2.r * z__3.i + z__2.i * z__3.r; + z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, + z__1.i = z__2.r * z__3.i + z__2.i * z__3.r; t[i__3].r = z__1.r, t[i__3].i = z__1.i; } - j = min(lastv,prevlastv); - -/* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) */ - + j = min(lastv, prevlastv); i__2 = j - i__; i__3 = i__ - 1; i__4 = i__; z__1.r = -tau[i__4].r, z__1.i = -tau[i__4].i; - zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &z__1, &v[i__ - + 1 + v_dim1], ldv, &v[i__ + 1 + i__ * v_dim1], & - c__1, &c_b1, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) - 19); + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &z__1, &v[i__ + 1 + v_dim1], ldv, + &v[i__ + 1 + i__ * v_dim1], &c__1, &c_b1, &t[i__ * t_dim1 + 1], &c__1, + (ftnlen)19); } else { -/* Skip any trailing zeros. */ i__2 = i__ + 1; for (lastv = *n; lastv >= i__2; --lastv) { i__3 = i__ + lastv * v_dim1; @@ -307,7 +79,7 @@ L220: goto L236; } } -L236: + L236: i__2 = i__ - 1; for (j = 1; j <= i__2; ++j) { i__3 = j + i__ * t_dim1; @@ -315,35 +87,26 @@ L236: z__2.r = -tau[i__4].r, z__2.i = -tau[i__4].i; i__5 = j + i__ * v_dim1; z__1.r = z__2.r * v[i__5].r - z__2.i * v[i__5].i, - z__1.i = z__2.r * v[i__5].i + z__2.i * v[i__5] - .r; + z__1.i = z__2.r * v[i__5].i + z__2.i * v[i__5].r; t[i__3].r = z__1.r, t[i__3].i = z__1.i; } - j = min(lastv,prevlastv); - -/* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H */ - + j = min(lastv, prevlastv); i__2 = i__ - 1; i__3 = j - i__; i__4 = i__; z__1.r = -tau[i__4].r, z__1.i = -tau[i__4].i; - zgemm_((char *)"N", (char *)"C", &i__2, &c__1, &i__3, &z__1, &v[(i__ + 1) - * v_dim1 + 1], ldv, &v[i__ + (i__ + 1) * v_dim1], - ldv, &c_b1, &t[i__ * t_dim1 + 1], ldt, (ftnlen)1, - (ftnlen)1); + zgemm_((char *)"N", (char *)"C", &i__2, &c__1, &i__3, &z__1, &v[(i__ + 1) * v_dim1 + 1], ldv, + &v[i__ + (i__ + 1) * v_dim1], ldv, &c_b1, &t[i__ * t_dim1 + 1], ldt, + (ftnlen)1, (ftnlen)1); } - -/* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) */ - i__2 = i__ - 1; - ztrmv_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", &i__2, &t[ - t_offset], ldt, &t[i__ * t_dim1 + 1], &c__1, (ftnlen) - 5, (ftnlen)12, (ftnlen)8); + ztrmv_((char *)"Upper", (char *)"No transpose", (char *)"Non-unit", &i__2, &t[t_offset], ldt, + &t[i__ * t_dim1 + 1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)8); i__2 = i__ + i__ * t_dim1; i__3 = i__; t[i__2].r = tau[i__3].r, t[i__2].i = tau[i__3].i; if (i__ > 1) { - prevlastv = max(prevlastv,lastv); + prevlastv = max(prevlastv, lastv); } else { prevlastv = lastv; } @@ -354,21 +117,14 @@ L236: for (i__ = *k; i__ >= 1; --i__) { i__1 = i__; if (tau[i__1].r == 0. && tau[i__1].i == 0.) { - -/* H(i) = I */ - i__1 = *k; for (j = i__; j <= i__1; ++j) { i__2 = j + i__ * t_dim1; t[i__2].r = 0., t[i__2].i = 0.; } } else { - -/* general case */ - if (i__ < *k) { if (lsame_(storev, (char *)"C", (ftnlen)1, (ftnlen)1)) { -/* Skip any leading zeros. */ i__1 = i__ - 1; for (lastv = 1; lastv <= i__1; ++lastv) { i__2 = lastv + i__ * v_dim1; @@ -376,7 +132,7 @@ L236: goto L281; } } -L281: + L281: i__1 = *k; for (j = i__ + 1; j <= i__1; ++j) { i__2 = j + i__ * t_dim1; @@ -384,24 +140,18 @@ L281: z__2.r = -tau[i__3].r, z__2.i = -tau[i__3].i; d_lmp_cnjg(&z__3, &v[*n - *k + i__ + j * v_dim1]); z__1.r = z__2.r * z__3.r - z__2.i * z__3.i, - z__1.i = z__2.r * z__3.i + z__2.i * - z__3.r; + z__1.i = z__2.r * z__3.i + z__2.i * z__3.r; t[i__2].r = z__1.r, t[i__2].i = z__1.i; } - j = max(lastv,prevlastv); - -/* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) */ - + j = max(lastv, prevlastv); i__1 = *n - *k + i__ - j; i__2 = *k - i__; i__3 = i__; z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i; - zgemv_((char *)"Conjugate transpose", &i__1, &i__2, &z__1, &v[ - j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * - v_dim1], &c__1, &c_b1, &t[i__ + 1 + i__ * - t_dim1], &c__1, (ftnlen)19); + zgemv_((char *)"Conjugate transpose", &i__1, &i__2, &z__1, + &v[j + (i__ + 1) * v_dim1], ldv, &v[j + i__ * v_dim1], &c__1, &c_b1, + &t[i__ + 1 + i__ * t_dim1], &c__1, (ftnlen)19); } else { -/* Skip any leading zeros. */ i__1 = i__ - 1; for (lastv = 1; lastv <= i__1; ++lastv) { i__2 = i__ + lastv * v_dim1; @@ -409,7 +159,7 @@ L281: goto L297; } } -L297: + L297: i__1 = *k; for (j = i__ + 1; j <= i__1; ++j) { i__2 = j + i__ * t_dim1; @@ -417,33 +167,24 @@ L297: z__2.r = -tau[i__3].r, z__2.i = -tau[i__3].i; i__4 = j + (*n - *k + i__) * v_dim1; z__1.r = z__2.r * v[i__4].r - z__2.i * v[i__4].i, - z__1.i = z__2.r * v[i__4].i + z__2.i * v[ - i__4].r; + z__1.i = z__2.r * v[i__4].i + z__2.i * v[i__4].r; t[i__2].r = z__1.r, t[i__2].i = z__1.i; } - j = max(lastv,prevlastv); - -/* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H */ - + j = max(lastv, prevlastv); i__1 = *k - i__; i__2 = *n - *k + i__ - j; i__3 = i__; z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i; - zgemm_((char *)"N", (char *)"C", &i__1, &c__1, &i__2, &z__1, &v[i__ + - 1 + j * v_dim1], ldv, &v[i__ + j * v_dim1], - ldv, &c_b1, &t[i__ + 1 + i__ * t_dim1], ldt, ( - ftnlen)1, (ftnlen)1); + zgemm_((char *)"N", (char *)"C", &i__1, &c__1, &i__2, &z__1, &v[i__ + 1 + j * v_dim1], ldv, + &v[i__ + j * v_dim1], ldv, &c_b1, &t[i__ + 1 + i__ * t_dim1], ldt, + (ftnlen)1, (ftnlen)1); } - -/* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) */ - i__1 = *k - i__; - ztrmv_((char *)"Lower", (char *)"No transpose", (char *)"Non-unit", &i__1, &t[i__ - + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * - t_dim1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)8) - ; + ztrmv_((char *)"Lower", (char *)"No transpose", (char *)"Non-unit", &i__1, + &t[i__ + 1 + (i__ + 1) * t_dim1], ldt, &t[i__ + 1 + i__ * t_dim1], &c__1, + (ftnlen)5, (ftnlen)12, (ftnlen)8); if (i__ > 1) { - prevlastv = min(prevlastv,lastv); + prevlastv = min(prevlastv, lastv); } else { prevlastv = lastv; } @@ -455,11 +196,7 @@ L297: } } return 0; - -/* End of ZLARFT */ - -} /* zlarft_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlascl.cpp b/lib/linalg/zlascl.cpp index 8cea99ddb0..293da0739e 100644 --- a/lib/linalg/zlascl.cpp +++ b/lib/linalg/zlascl.cpp @@ -1,173 +1,12 @@ -/* fortran/zlascl.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLASCL + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER TYPE */ -/* INTEGER INFO, KL, KU, LDA, M, N */ -/* DOUBLE PRECISION CFROM, CTO */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLASCL multiplies the M by N complex matrix A by the real scalar */ -/* > CTO/CFROM. This is done without over/underflow as long as the final */ -/* > result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that */ -/* > A may be full, upper triangular, lower triangular, upper Hessenberg, */ -/* > or banded. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] TYPE */ -/* > \verbatim */ -/* > TYPE is CHARACTER*1 */ -/* > TYPE indices the storage type of the input matrix. */ -/* > = 'G': A is a full matrix. */ -/* > = 'L': A is a lower triangular matrix. */ -/* > = 'U': A is an upper triangular matrix. */ -/* > = 'H': A is an upper Hessenberg matrix. */ -/* > = 'B': A is a symmetric band matrix with lower bandwidth KL */ -/* > and upper bandwidth KU and with the only the lower */ -/* > half stored. */ -/* > = 'Q': A is a symmetric band matrix with lower bandwidth KL */ -/* > and upper bandwidth KU and with the only the upper */ -/* > half stored. */ -/* > = 'Z': A is a band matrix with lower bandwidth KL and upper */ -/* > bandwidth KU. See ZGBTRF for storage details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] KL */ -/* > \verbatim */ -/* > KL is INTEGER */ -/* > The lower bandwidth of A. Referenced only if TYPE = 'B', */ -/* > 'Q' or 'Z'. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] KU */ -/* > \verbatim */ -/* > KU is INTEGER */ -/* > The upper bandwidth of A. Referenced only if TYPE = 'B', */ -/* > 'Q' or 'Z'. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CFROM */ -/* > \verbatim */ -/* > CFROM is DOUBLE PRECISION */ -/* > \endverbatim */ -/* > */ -/* > \param[in] CTO */ -/* > \verbatim */ -/* > CTO is DOUBLE PRECISION */ -/* > */ -/* > The matrix A is multiplied by CTO/CFROM. A(I,J) is computed */ -/* > without over/underflow if the final result CTO*A(I,J)/CFROM */ -/* > can be represented without over/underflow. CFROM must be */ -/* > nonzero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > The matrix to be multiplied by CTO/CFROM. See TYPE for the */ -/* > storage type. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > If TYPE = 'G', 'L', 'U', 'H', LDA >= max(1,M); */ -/* > TYPE = 'B', LDA >= KL+1; */ -/* > TYPE = 'Q', LDA >= KU+1; */ -/* > TYPE = 'Z', LDA >= 2*KL+KU+1. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > 0 - successful exit */ -/* > <0 - if INFO = -i, the i-th argument had an illegal value. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int zlascl_(char *type__, integer *kl, integer *ku, - doublereal *cfrom, doublereal *cto, integer *m, integer *n, - doublecomplex *a, integer *lda, integer *info, ftnlen type_len) +int zlascl_(char *type__, integer *kl, integer *ku, doublereal *cfrom, doublereal *cto, integer *m, + integer *n, doublecomplex *a, integer *lda, integer *info, ftnlen type_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; doublecomplex z__1; - - /* Local variables */ integer i__, j, k1, k2, k3, k4; doublereal mul, cto1; logical done; @@ -178,43 +17,12 @@ f"> */ extern doublereal dlamch_(char *, ftnlen); doublereal cfromc; extern logical disnan_(doublereal *); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); doublereal bignum, smlnum; - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ *info = 0; - if (lsame_(type__, (char *)"G", (ftnlen)1, (ftnlen)1)) { itype = 0; } else if (lsame_(type__, (char *)"L", (ftnlen)1, (ftnlen)1)) { @@ -232,7 +40,6 @@ f"> */ } else { itype = -1; } - if (itype == -1) { *info = -1; } else if (*cfrom == 0. || disnan_(cfrom)) { @@ -243,59 +50,43 @@ f"> */ *info = -6; } else if (*n < 0 || itype == 4 && *n != *m || itype == 5 && *n != *m) { *info = -7; - } else if (itype <= 3 && *lda < max(1,*m)) { + } else if (itype <= 3 && *lda < max(1, *m)) { *info = -9; } else if (itype >= 4) { -/* Computing MAX */ i__1 = *m - 1; - if (*kl < 0 || *kl > max(i__1,0)) { + if (*kl < 0 || *kl > max(i__1, 0)) { *info = -2; - } else /* if(complicated condition) */ { -/* Computing MAX */ + } else { i__1 = *n - 1; - if (*ku < 0 || *ku > max(i__1,0) || (itype == 4 || itype == 5) && - *kl != *ku) { + if (*ku < 0 || *ku > max(i__1, 0) || (itype == 4 || itype == 5) && *kl != *ku) { *info = -3; - } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < * - ku + 1 || itype == 6 && *lda < (*kl << 1) + *ku + 1) { + } else if (itype == 4 && *lda < *kl + 1 || itype == 5 && *lda < *ku + 1 || + itype == 6 && *lda < (*kl << 1) + *ku + 1) { *info = -9; } } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"ZLASCL", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0 || *m == 0) { return 0; } - -/* Get machine parameters */ - smlnum = dlamch_((char *)"S", (ftnlen)1); bignum = 1. / smlnum; - cfromc = *cfrom; ctoc = *cto; - L10: cfrom1 = cfromc * smlnum; if (cfrom1 == cfromc) { -/* CFROMC is an inf. Multiply by a correctly signed zero for */ -/* finite CTOC, or a NaN if CTOC is infinite. */ mul = ctoc / cfromc; done = TRUE_; cto1 = ctoc; } else { cto1 = ctoc / bignum; if (cto1 == ctoc) { -/* CTOC is either 0 or an inf. In both cases, CTOC itself */ -/* serves as the correct multiplication factor. */ mul = ctoc; done = TRUE_; cfromc = 1.; @@ -315,11 +106,7 @@ L10: } } } - if (itype == 0) { - -/* Full matrix */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -328,15 +115,9 @@ L10: i__4 = i__ + j * a_dim1; z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L20: */ } -/* L30: */ } - } else if (itype == 1) { - -/* Lower triangular matrix */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; @@ -345,126 +126,82 @@ L10: i__4 = i__ + j * a_dim1; z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L40: */ } -/* L50: */ } - } else if (itype == 2) { - -/* Upper triangular matrix */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { - i__2 = min(j,*m); + i__2 = min(j, *m); for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; i__4 = i__ + j * a_dim1; z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L60: */ } -/* L70: */ } - } else if (itype == 3) { - -/* Upper Hessenberg matrix */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { -/* Computing MIN */ i__3 = j + 1; - i__2 = min(i__3,*m); + i__2 = min(i__3, *m); for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; i__4 = i__ + j * a_dim1; z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L80: */ } -/* L90: */ } - } else if (itype == 4) { - -/* Lower half of a symmetric band matrix */ - k3 = *kl + 1; k4 = *n + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { -/* Computing MIN */ i__3 = k3, i__4 = k4 - j; - i__2 = min(i__3,i__4); + i__2 = min(i__3, i__4); for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; i__4 = i__ + j * a_dim1; z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L100: */ } -/* L110: */ } - } else if (itype == 5) { - -/* Upper half of a symmetric band matrix */ - k1 = *ku + 2; k3 = *ku + 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { -/* Computing MAX */ i__2 = k1 - j; i__3 = k3; - for (i__ = max(i__2,1); i__ <= i__3; ++i__) { + for (i__ = max(i__2, 1); i__ <= i__3; ++i__) { i__2 = i__ + j * a_dim1; i__4 = i__ + j * a_dim1; z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; -/* L120: */ } -/* L130: */ } - } else if (itype == 6) { - -/* Band matrix */ - k1 = *kl + *ku + 2; k2 = *kl + 1; k3 = (*kl << 1) + *ku + 1; k4 = *kl + *ku + 1 + *m; i__1 = *n; for (j = 1; j <= i__1; ++j) { -/* Computing MAX */ i__3 = k1 - j; -/* Computing MIN */ i__4 = k3, i__5 = k4 - j; - i__2 = min(i__4,i__5); - for (i__ = max(i__3,k2); i__ <= i__2; ++i__) { + i__2 = min(i__4, i__5); + for (i__ = max(i__3, k2); i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; i__4 = i__ + j * a_dim1; z__1.r = mul * a[i__4].r, z__1.i = mul * a[i__4].i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L140: */ } -/* L150: */ } - } - - if (! done) { + if (!done) { goto L10; } - return 0; - -/* End of ZLASCL */ - -} /* zlascl_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlaset.cpp b/lib/linalg/zlaset.cpp index 782cc99055..dc5dd4740c 100644 --- a/lib/linalg/zlaset.cpp +++ b/lib/linalg/zlaset.cpp @@ -1,240 +1,62 @@ -/* fortran/zlaset.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given val -ues. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLASET + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLASET( UPLO, M, N, ALPHA, BETA, A, LDA ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER LDA, M, N */ -/* COMPLEX*16 ALPHA, BETA */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLASET initializes a 2-D array A to BETA on the diagonal and */ -/* > ALPHA on the offdiagonals. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies the part of the matrix A to be set. */ -/* > = 'U': Upper triangular part is set. The lower triangle */ -/* > is unchanged. */ -/* > = 'L': Lower triangular part is set. The upper triangle */ -/* > is unchanged. */ -/* > Otherwise: All of the matrix A is set. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > On entry, M specifies the number of rows of A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the number of columns of A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is COMPLEX*16 */ -/* > All the offdiagonal array elements are set to ALPHA. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] BETA */ -/* > \verbatim */ -/* > BETA is COMPLEX*16 */ -/* > All the diagonal array elements are set to BETA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > On entry, the m by n matrix A. */ -/* > On exit, A(i,j) = ALPHA, 1 <= i <= m, 1 <= j <= n, i.ne.j; */ -/* > A(i,i) = BETA , 1 <= i <= min(m,n) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int zlaset_(char *uplo, integer *m, integer *n, - doublecomplex *alpha, doublecomplex *beta, doublecomplex *a, integer * - lda, ftnlen uplo_len) +int zlaset_(char *uplo, integer *m, integer *n, doublecomplex *alpha, doublecomplex *beta, + doublecomplex *a, integer *lda, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; - - /* Local variables */ integer i__, j; extern logical lsame_(char *, char *, ftnlen, ftnlen); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - -/* Set the diagonal to BETA and the strictly upper triangular */ -/* part of the array to ALPHA. */ - i__1 = *n; for (j = 2; j <= i__1; ++j) { -/* Computing MIN */ i__3 = j - 1; - i__2 = min(i__3,*m); + i__2 = min(i__3, *m); for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; a[i__3].r = alpha->r, a[i__3].i = alpha->i; -/* L10: */ } -/* L20: */ } - i__1 = min(*n,*m); + i__1 = min(*n, *m); for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__ + i__ * a_dim1; a[i__2].r = beta->r, a[i__2].i = beta->i; -/* L30: */ } - } else if (lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Set the diagonal to BETA and the strictly lower triangular */ -/* part of the array to ALPHA. */ - - i__1 = min(*m,*n); + i__1 = min(*m, *n); for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = j + 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; a[i__3].r = alpha->r, a[i__3].i = alpha->i; -/* L40: */ } -/* L50: */ } - i__1 = min(*n,*m); + i__1 = min(*n, *m); for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__ + i__ * a_dim1; a[i__2].r = beta->r, a[i__2].i = beta->i; -/* L60: */ } - } else { - -/* Set the array to BETA on the diagonal and ALPHA on the */ -/* offdiagonal. */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; a[i__3].r = alpha->r, a[i__3].i = alpha->i; -/* L70: */ } -/* L80: */ } - i__1 = min(*m,*n); + i__1 = min(*m, *n); for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__ + i__ * a_dim1; a[i__2].r = beta->r, a[i__2].i = beta->i; -/* L90: */ } } - return 0; - -/* End of ZLASET */ - -} /* zlaset_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlasr.cpp b/lib/linalg/zlasr.cpp index 51c9797679..06dc5606d2 100644 --- a/lib/linalg/zlasr.cpp +++ b/lib/linalg/zlasr.cpp @@ -1,302 +1,48 @@ -/* fortran/zlasr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZLASR applies a sequence of plane rotations to a general rectangular matrix. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLASR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER DIRECT, PIVOT, SIDE */ -/* INTEGER LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION C( * ), S( * ) */ -/* COMPLEX*16 A( LDA, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLASR applies a sequence of real plane rotations to a complex matrix */ -/* > A, from either the left or the right. */ -/* > */ -/* > When SIDE = 'L', the transformation takes the form */ -/* > */ -/* > A := P*A */ -/* > */ -/* > and when SIDE = 'R', the transformation takes the form */ -/* > */ -/* > A := A*P**T */ -/* > */ -/* > where P is an orthogonal matrix consisting of a sequence of z plane */ -/* > rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R', */ -/* > and P**T is the transpose of P. */ -/* > */ -/* > When DIRECT = 'F' (Forward sequence), then */ -/* > */ -/* > P = P(z-1) * ... * P(2) * P(1) */ -/* > */ -/* > and when DIRECT = 'B' (Backward sequence), then */ -/* > */ -/* > P = P(1) * P(2) * ... * P(z-1) */ -/* > */ -/* > where P(k) is a plane rotation matrix defined by the 2-by-2 rotation */ -/* > */ -/* > R(k) = ( c(k) s(k) ) */ -/* > = ( -s(k) c(k) ). */ -/* > */ -/* > When PIVOT = 'V' (Variable pivot), the rotation is performed */ -/* > for the plane (k,k+1), i.e., P(k) has the form */ -/* > */ -/* > P(k) = ( 1 ) */ -/* > ( ... ) */ -/* > ( 1 ) */ -/* > ( c(k) s(k) ) */ -/* > ( -s(k) c(k) ) */ -/* > ( 1 ) */ -/* > ( ... ) */ -/* > ( 1 ) */ -/* > */ -/* > where R(k) appears as a rank-2 modification to the identity matrix in */ -/* > rows and columns k and k+1. */ -/* > */ -/* > When PIVOT = 'T' (Top pivot), the rotation is performed for the */ -/* > plane (1,k+1), so P(k) has the form */ -/* > */ -/* > P(k) = ( c(k) s(k) ) */ -/* > ( 1 ) */ -/* > ( ... ) */ -/* > ( 1 ) */ -/* > ( -s(k) c(k) ) */ -/* > ( 1 ) */ -/* > ( ... ) */ -/* > ( 1 ) */ -/* > */ -/* > where R(k) appears in rows and columns 1 and k+1. */ -/* > */ -/* > Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is */ -/* > performed for the plane (k,z), giving P(k) the form */ -/* > */ -/* > P(k) = ( 1 ) */ -/* > ( ... ) */ -/* > ( 1 ) */ -/* > ( c(k) s(k) ) */ -/* > ( 1 ) */ -/* > ( ... ) */ -/* > ( 1 ) */ -/* > ( -s(k) c(k) ) */ -/* > */ -/* > where R(k) appears in rows and columns k and z. The rotations are */ -/* > performed without ever forming P(k) explicitly. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > Specifies whether the plane rotation matrix P is applied to */ -/* > A on the left or the right. */ -/* > = 'L': Left, compute A := P*A */ -/* > = 'R': Right, compute A:= A*P**T */ -/* > \endverbatim */ -/* > */ -/* > \param[in] PIVOT */ -/* > \verbatim */ -/* > PIVOT is CHARACTER*1 */ -/* > Specifies the plane for which P(k) is a plane rotation */ -/* > matrix. */ -/* > = 'V': Variable pivot, the plane (k,k+1) */ -/* > = 'T': Top pivot, the plane (1,k+1) */ -/* > = 'B': Bottom pivot, the plane (k,z) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIRECT */ -/* > \verbatim */ -/* > DIRECT is CHARACTER*1 */ -/* > Specifies whether P is a forward or backward sequence of */ -/* > plane rotations. */ -/* > = 'F': Forward, P = P(z-1)*...*P(2)*P(1) */ -/* > = 'B': Backward, P = P(1)*P(2)*...*P(z-1) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix A. If m <= 1, an immediate */ -/* > return is effected. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix A. If n <= 1, an */ -/* > immediate return is effected. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] C */ -/* > \verbatim */ -/* > C is DOUBLE PRECISION array, dimension */ -/* > (M-1) if SIDE = 'L' */ -/* > (N-1) if SIDE = 'R' */ -/* > The cosines c(k) of the plane rotations. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] S */ -/* > \verbatim */ -/* > S is DOUBLE PRECISION array, dimension */ -/* > (M-1) if SIDE = 'L' */ -/* > (N-1) if SIDE = 'R' */ -/* > The sines s(k) of the plane rotations. The 2-by-2 plane */ -/* > rotation part of the matrix P(k), R(k), has the form */ -/* > R(k) = ( c(k) s(k) ) */ -/* > ( -s(k) c(k) ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > The M-by-N matrix A. On exit, A is overwritten by P*A if */ -/* > SIDE = 'R' or by A*P**T if SIDE = 'L'. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int zlasr_(char *side, char *pivot, char *direct, integer *m, - integer *n, doublereal *c__, doublereal *s, doublecomplex *a, - integer *lda, ftnlen side_len, ftnlen pivot_len, ftnlen direct_len) +int zlasr_(char *side, char *pivot, char *direct, integer *m, integer *n, doublereal *c__, + doublereal *s, doublecomplex *a, integer *lda, ftnlen side_len, ftnlen pivot_len, + ftnlen direct_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; doublecomplex z__1, z__2, z__3; - - /* Local variables */ integer i__, j, info; doublecomplex temp; extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal ctemp, stemp; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters */ - - /* Parameter adjustments */ + extern int xerbla_(char *, integer *, ftnlen); --c__; --s; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; - - /* Function Body */ info = 0; - if (! (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) || lsame_(side, (char *)"R", ( - ftnlen)1, (ftnlen)1))) { + if (!(lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1) || lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1))) { info = 1; - } else if (! (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1) || lsame_(pivot, - (char *)"T", (ftnlen)1, (ftnlen)1) || lsame_(pivot, (char *)"B", (ftnlen)1, ( - ftnlen)1))) { + } else if (!(lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1) || + lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1) || + lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1))) { info = 2; - } else if (! (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1) || lsame_(direct, - (char *)"B", (ftnlen)1, (ftnlen)1))) { + } else if (!(lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1) || + lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1))) { info = 3; } else if (*m < 0) { info = 4; } else if (*n < 0) { info = 5; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { info = 9; } if (info != 0) { xerbla_((char *)"ZLASR ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0) { return 0; } if (lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1)) { - -/* Form P * A */ - if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { i__1 = *m - 1; @@ -311,23 +57,17 @@ extern "C" { i__3 = j + 1 + i__ * a_dim1; z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; i__4 = j + i__ * a_dim1; - z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ - i__4].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; + z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; i__3 = j + i__ * a_dim1; z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; i__4 = j + i__ * a_dim1; - z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ - i__4].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L10: */ } } -/* L20: */ } } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { for (j = *m - 1; j >= 1; --j) { @@ -341,23 +81,17 @@ extern "C" { i__2 = j + 1 + i__ * a_dim1; z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; i__3 = j + i__ * a_dim1; - z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ - i__3].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; + z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[i__3].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; i__2 = j + i__ * a_dim1; z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; i__3 = j + i__ * a_dim1; - z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ - i__3].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; -/* L30: */ } } -/* L40: */ } } } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { @@ -374,23 +108,17 @@ extern "C" { i__3 = j + i__ * a_dim1; z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; i__4 = i__ * a_dim1 + 1; - z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ - i__4].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; + z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; i__3 = i__ * a_dim1 + 1; z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; i__4 = i__ * a_dim1 + 1; - z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ - i__4].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L50: */ } } -/* L60: */ } } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { for (j = *m; j >= 2; --j) { @@ -404,23 +132,17 @@ extern "C" { i__2 = j + i__ * a_dim1; z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; i__3 = i__ * a_dim1 + 1; - z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ - i__3].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; + z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[i__3].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; i__2 = i__ * a_dim1 + 1; z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; i__3 = i__ * a_dim1 + 1; - z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ - i__3].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; -/* L70: */ } } -/* L80: */ } } } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { @@ -436,24 +158,18 @@ extern "C" { temp.r = a[i__3].r, temp.i = a[i__3].i; i__3 = j + i__ * a_dim1; i__4 = *m + i__ * a_dim1; - z__2.r = stemp * a[i__4].r, z__2.i = stemp * a[ - i__4].i; + z__2.r = stemp * a[i__4].r, z__2.i = stemp * a[i__4].i; z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; i__3 = *m + i__ * a_dim1; i__4 = *m + i__ * a_dim1; - z__2.r = ctemp * a[i__4].r, z__2.i = ctemp * a[ - i__4].i; + z__2.r = ctemp * a[i__4].r, z__2.i = ctemp * a[i__4].i; z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L90: */ } } -/* L100: */ } } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { for (j = *m - 1; j >= 1; --j) { @@ -466,31 +182,22 @@ extern "C" { temp.r = a[i__2].r, temp.i = a[i__2].i; i__2 = j + i__ * a_dim1; i__3 = *m + i__ * a_dim1; - z__2.r = stemp * a[i__3].r, z__2.i = stemp * a[ - i__3].i; + z__2.r = stemp * a[i__3].r, z__2.i = stemp * a[i__3].i; z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; i__2 = *m + i__ * a_dim1; i__3 = *m + i__ * a_dim1; - z__2.r = ctemp * a[i__3].r, z__2.i = ctemp * a[ - i__3].i; + z__2.r = ctemp * a[i__3].r, z__2.i = ctemp * a[i__3].i; z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; -/* L110: */ } } -/* L120: */ } } } } else if (lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { - -/* Form A * P**T */ - if (lsame_(pivot, (char *)"V", (ftnlen)1, (ftnlen)1)) { if (lsame_(direct, (char *)"F", (ftnlen)1, (ftnlen)1)) { i__1 = *n - 1; @@ -505,23 +212,17 @@ extern "C" { i__3 = i__ + (j + 1) * a_dim1; z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; i__4 = i__ + j * a_dim1; - z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ - i__4].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; + z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; i__3 = i__ + j * a_dim1; z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; i__4 = i__ + j * a_dim1; - z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ - i__4].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L130: */ } } -/* L140: */ } } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { for (j = *n - 1; j >= 1; --j) { @@ -535,23 +236,17 @@ extern "C" { i__2 = i__ + (j + 1) * a_dim1; z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; i__3 = i__ + j * a_dim1; - z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ - i__3].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; + z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[i__3].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; i__2 = i__ + j * a_dim1; z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; i__3 = i__ + j * a_dim1; - z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ - i__3].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; -/* L150: */ } } -/* L160: */ } } } else if (lsame_(pivot, (char *)"T", (ftnlen)1, (ftnlen)1)) { @@ -568,23 +263,17 @@ extern "C" { i__3 = i__ + j * a_dim1; z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; i__4 = i__ + a_dim1; - z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[ - i__4].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; + z__3.r = stemp * a[i__4].r, z__3.i = stemp * a[i__4].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; i__3 = i__ + a_dim1; z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; i__4 = i__ + a_dim1; - z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[ - i__4].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.r = ctemp * a[i__4].r, z__3.i = ctemp * a[i__4].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L170: */ } } -/* L180: */ } } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { for (j = *n; j >= 2; --j) { @@ -598,23 +287,17 @@ extern "C" { i__2 = i__ + j * a_dim1; z__2.r = ctemp * temp.r, z__2.i = ctemp * temp.i; i__3 = i__ + a_dim1; - z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[ - i__3].i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; + z__3.r = stemp * a[i__3].r, z__3.i = stemp * a[i__3].i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; i__2 = i__ + a_dim1; z__2.r = stemp * temp.r, z__2.i = stemp * temp.i; i__3 = i__ + a_dim1; - z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[ - i__3].i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__3.r = ctemp * a[i__3].r, z__3.i = ctemp * a[i__3].i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; -/* L190: */ } } -/* L200: */ } } } else if (lsame_(pivot, (char *)"B", (ftnlen)1, (ftnlen)1)) { @@ -630,24 +313,18 @@ extern "C" { temp.r = a[i__3].r, temp.i = a[i__3].i; i__3 = i__ + j * a_dim1; i__4 = i__ + *n * a_dim1; - z__2.r = stemp * a[i__4].r, z__2.i = stemp * a[ - i__4].i; + z__2.r = stemp * a[i__4].r, z__2.i = stemp * a[i__4].i; z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; i__3 = i__ + *n * a_dim1; i__4 = i__ + *n * a_dim1; - z__2.r = ctemp * a[i__4].r, z__2.i = ctemp * a[ - i__4].i; + z__2.r = ctemp * a[i__4].r, z__2.i = ctemp * a[i__4].i; z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; a[i__3].r = z__1.r, a[i__3].i = z__1.i; -/* L210: */ } } -/* L220: */ } } else if (lsame_(direct, (char *)"B", (ftnlen)1, (ftnlen)1)) { for (j = *n - 1; j >= 1; --j) { @@ -660,35 +337,24 @@ extern "C" { temp.r = a[i__2].r, temp.i = a[i__2].i; i__2 = i__ + j * a_dim1; i__3 = i__ + *n * a_dim1; - z__2.r = stemp * a[i__3].r, z__2.i = stemp * a[ - i__3].i; + z__2.r = stemp * a[i__3].r, z__2.i = stemp * a[i__3].i; z__3.r = ctemp * temp.r, z__3.i = ctemp * temp.i; - z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + - z__3.i; + z__1.r = z__2.r + z__3.r, z__1.i = z__2.i + z__3.i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; i__2 = i__ + *n * a_dim1; i__3 = i__ + *n * a_dim1; - z__2.r = ctemp * a[i__3].r, z__2.i = ctemp * a[ - i__3].i; + z__2.r = ctemp * a[i__3].r, z__2.i = ctemp * a[i__3].i; z__3.r = stemp * temp.r, z__3.i = stemp * temp.i; - z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - - z__3.i; + z__1.r = z__2.r - z__3.r, z__1.i = z__2.i - z__3.i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; -/* L230: */ } } -/* L240: */ } } } } - return 0; - -/* End of ZLASR */ - -} /* zlasr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlassq.cpp b/lib/linalg/zlassq.cpp index 31c0f15f4c..b60831044f 100644 --- a/lib/linalg/zlassq.cpp +++ b/lib/linalg/zlassq.cpp @@ -1,171 +1,16 @@ -/* fortran/zlassq.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZLASSQ updates a sum of squares represented in scaled form. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLASSQ + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLASSQ( N, X, INCX, SCALE, SUMSQ ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX, N */ -/* DOUBLE PRECISION SCALE, SUMSQ */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 X( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLASSQ returns the values scl and ssq such that */ -/* > */ -/* > ( scl**2 )*ssq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq, */ -/* > */ -/* > where x( i ) = abs( X( 1 + ( i - 1 )*INCX ) ). The value of sumsq is */ -/* > assumed to be at least unity and the value of ssq will then satisfy */ -/* > */ -/* > 1.0 .le. ssq .le. ( sumsq + 2*n ). */ -/* > */ -/* > scale is assumed to be non-negative and scl returns the value */ -/* > */ -/* > scl = max( scale, abs( real( x( i ) ) ), abs( aimag( x( i ) ) ) ), */ -/* > i */ -/* > */ -/* > scale and sumsq must be supplied in SCALE and SUMSQ respectively. */ -/* > SCALE and SUMSQ are overwritten by scl and ssq respectively. */ -/* > */ -/* > The routine makes only one pass through the vector X. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of elements to be used from the vector X. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 array, dimension (N) */ -/* > The vector x as described above. */ -/* > x( i ) = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > The increment between successive values of the vector X. */ -/* > INCX > 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] SCALE */ -/* > \verbatim */ -/* > SCALE is DOUBLE PRECISION */ -/* > On entry, the value scale in the equation above. */ -/* > On exit, SCALE is overwritten with the value scl . */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] SUMSQ */ -/* > \verbatim */ -/* > SUMSQ is DOUBLE PRECISION */ -/* > On entry, the value sumsq in the equation above. */ -/* > On exit, SUMSQ is overwritten with the value ssq . */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \date December 2016 */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* ===================================================================== */ -/* Subroutine */ int zlassq_(integer *n, doublecomplex *x, integer *incx, - doublereal *scale, doublereal *sumsq) +int zlassq_(integer *n, doublecomplex *x, integer *incx, doublereal *scale, doublereal *sumsq) { - /* System generated locals */ integer i__1, i__2, i__3; doublereal d__1; - - /* Builtin functions */ double d_lmp_imag(doublecomplex *); - - /* Local variables */ integer ix; doublereal temp1; extern logical disnan_(doublereal *); - - -/* -- LAPACK auxiliary routine (version 3.7.0) -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ -/* December 2016 */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - - /* Parameter adjustments */ --x; - - /* Function Body */ if (*n > 0) { i__1 = (*n - 1) * *incx + 1; i__2 = *incx; @@ -174,12 +19,10 @@ f"> */ temp1 = (d__1 = x[i__3].r, abs(d__1)); if (temp1 > 0. || disnan_(&temp1)) { if (*scale < temp1) { -/* Computing 2nd power */ d__1 = *scale / temp1; *sumsq = *sumsq * (d__1 * d__1) + 1; *scale = temp1; } else { -/* Computing 2nd power */ d__1 = temp1 / *scale; *sumsq += d__1 * d__1; } @@ -187,26 +30,18 @@ f"> */ temp1 = (d__1 = d_lmp_imag(&x[ix]), abs(d__1)); if (temp1 > 0. || disnan_(&temp1)) { if (*scale < temp1) { -/* Computing 2nd power */ d__1 = *scale / temp1; *sumsq = *sumsq * (d__1 * d__1) + 1; *scale = temp1; } else { -/* Computing 2nd power */ d__1 = temp1 / *scale; *sumsq += d__1 * d__1; } } -/* L10: */ } } - return 0; - -/* End of ZLASSQ */ - -} /* zlassq_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zlatrd.cpp b/lib/linalg/zlatrd.cpp index d471ea96eb..4f2a1750df 100644 --- a/lib/linalg/zlatrd.cpp +++ b/lib/linalg/zlatrd.cpp @@ -1,282 +1,30 @@ -/* fortran/zlatrd.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - -static doublecomplex c_b1 = {0.,0.}; -static doublecomplex c_b2 = {1.,0.}; +static doublecomplex c_b1 = {0., 0.}; +static doublecomplex c_b2 = {1., 0.}; static integer c__1 = 1; - -/* > \brief \b ZLATRD reduces the first nb rows and columns of a symmetric/Hermitian matrix A to real tridiago -nal form by an unitary similarity transformation. */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZLATRD + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER LDA, LDW, N, NB */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION E( * ) */ -/* COMPLEX*16 A( LDA, * ), TAU( * ), W( LDW, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZLATRD reduces NB rows and columns of a complex Hermitian matrix A to */ -/* > Hermitian tridiagonal form by a unitary similarity */ -/* > transformation Q**H * A * Q, and returns the matrices V and W which are */ -/* > needed to apply the transformation to the unreduced part of A. */ -/* > */ -/* > If UPLO = 'U', ZLATRD reduces the last NB rows and columns of a */ -/* > matrix, of which the upper triangle is supplied; */ -/* > if UPLO = 'L', ZLATRD reduces the first NB rows and columns of a */ -/* > matrix, of which the lower triangle is supplied. */ -/* > */ -/* > This is an auxiliary routine called by ZHETRD. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > Specifies whether the upper or lower triangular part of the */ -/* > Hermitian matrix A is stored: */ -/* > = 'U': Upper triangular */ -/* > = 'L': Lower triangular */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] NB */ -/* > \verbatim */ -/* > NB is INTEGER */ -/* > The number of rows and columns to be reduced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > On entry, the Hermitian matrix A. If UPLO = 'U', the leading */ -/* > n-by-n upper triangular part of A contains the upper */ -/* > triangular part of the matrix A, and the strictly lower */ -/* > triangular part of A is not referenced. If UPLO = 'L', the */ -/* > leading n-by-n lower triangular part of A contains the lower */ -/* > triangular part of the matrix A, and the strictly upper */ -/* > triangular part of A is not referenced. */ -/* > On exit: */ -/* > if UPLO = 'U', the last NB columns have been reduced to */ -/* > tridiagonal form, with the diagonal elements overwriting */ -/* > the diagonal elements of A; the elements above the diagonal */ -/* > with the array TAU, represent the unitary matrix Q as a */ -/* > product of elementary reflectors; */ -/* > if UPLO = 'L', the first NB columns have been reduced to */ -/* > tridiagonal form, with the diagonal elements overwriting */ -/* > the diagonal elements of A; the elements below the diagonal */ -/* > with the array TAU, represent the unitary matrix Q as a */ -/* > product of elementary reflectors. */ -/* > See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal */ -/* > elements of the last NB columns of the reduced matrix; */ -/* > if UPLO = 'L', E(1:nb) contains the subdiagonal elements of */ -/* > the first NB columns of the reduced matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (N-1) */ -/* > The scalar factors of the elementary reflectors, stored in */ -/* > TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'. */ -/* > See Further Details. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] W */ -/* > \verbatim */ -/* > W is COMPLEX*16 array, dimension (LDW,NB) */ -/* > The n-by-nb matrix W required to update the unreduced part */ -/* > of A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDW */ -/* > \verbatim */ -/* > LDW is INTEGER */ -/* > The leading dimension of the array W. LDW >= max(1,N). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERauxiliary */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > If UPLO = 'U', the matrix Q is represented as a product of elementary */ -/* > reflectors */ -/* > */ -/* > Q = H(n) H(n-1) . . . H(n-nb+1). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**H */ -/* > */ -/* > where tau is a complex scalar, and v is a complex vector with */ -/* > v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), */ -/* > and tau in TAU(i-1). */ -/* > */ -/* > If UPLO = 'L', the matrix Q is represented as a product of elementary */ -/* > reflectors */ -/* > */ -/* > Q = H(1) H(2) . . . H(nb). */ -/* > */ -/* > Each H(i) has the form */ -/* > */ -/* > H(i) = I - tau * v * v**H */ -/* > */ -/* > where tau is a complex scalar, and v is a complex vector with */ -/* > v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), */ -/* > and tau in TAU(i). */ -/* > */ -/* > The elements of the vectors v together form the n-by-nb matrix V */ -/* > which is needed, with W, to apply the transformation to the unreduced */ -/* > part of the matrix, using a Hermitian rank-2k update of the form: */ -/* > A := A - V*W**H - W*V**H. */ -/* > */ -/* > The contents of A on exit are illustrated by the following examples */ -/* > with n = 5 and nb = 2: */ -/* > */ -/* > if UPLO = 'U': if UPLO = 'L': */ -/* > */ -/* > ( a a a v4 v5 ) ( d ) */ -/* > ( a a v4 v5 ) ( 1 d ) */ -/* > ( a 1 v5 ) ( v1 1 a ) */ -/* > ( d 1 ) ( v1 v2 a a ) */ -/* > ( d ) ( v1 v2 a a a ) */ -/* > */ -/* > where d denotes a diagonal element of the reduced matrix, a denotes */ -/* > an element of the original matrix that is unchanged, and vi denotes */ -/* > an element of the vector defining H(i). */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zlatrd_(char *uplo, integer *n, integer *nb, - doublecomplex *a, integer *lda, doublereal *e, doublecomplex *tau, - doublecomplex *w, integer *ldw, ftnlen uplo_len) +int zlatrd_(char *uplo, integer *n, integer *nb, doublecomplex *a, integer *lda, doublereal *e, + doublecomplex *tau, doublecomplex *w, integer *ldw, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, w_dim1, w_offset, i__1, i__2, i__3; doublereal d__1; doublecomplex z__1, z__2, z__3, z__4; - - /* Local variables */ integer i__, iw; doublecomplex alpha; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int zscal_(integer *, doublecomplex *, - doublecomplex *, integer *); - extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *); - extern /* Subroutine */ int zgemv_(char *, integer *, integer *, - doublecomplex *, doublecomplex *, integer *, doublecomplex *, - integer *, doublecomplex *, doublecomplex *, integer *, ftnlen), - zhemv_(char *, integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *, integer *, doublecomplex *, - doublecomplex *, integer *, ftnlen), zaxpy_(integer *, - doublecomplex *, doublecomplex *, integer *, doublecomplex *, - integer *), zlarfg_(integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *), zlacgv_(integer *, doublecomplex *, - integer *); - - -/* -- LAPACK auxiliary routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Quick return if possible */ - - /* Parameter adjustments */ + extern int zscal_(integer *, doublecomplex *, doublecomplex *, integer *); + extern VOID zdotc_(doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *); + extern int zgemv_(char *, integer *, integer *, doublecomplex *, doublecomplex *, integer *, + doublecomplex *, integer *, doublecomplex *, doublecomplex *, integer *, + ftnlen), + zhemv_(char *, integer *, doublecomplex *, doublecomplex *, integer *, doublecomplex *, + integer *, doublecomplex *, doublecomplex *, integer *, ftnlen), + zaxpy_(integer *, doublecomplex *, doublecomplex *, integer *, doublecomplex *, integer *), + zlarfg_(integer *, doublecomplex *, doublecomplex *, integer *, doublecomplex *), + zlacgv_(integer *, doublecomplex *, integer *); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -285,23 +33,14 @@ f"> */ w_dim1 = *ldw; w_offset = 1 + w_dim1; w -= w_offset; - - /* Function Body */ if (*n <= 0) { return 0; } - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { - -/* Reduce last NB columns of upper triangle */ - i__1 = *n - *nb + 1; for (i__ = *n; i__ >= i__1; --i__) { iw = i__ - *n + *nb; if (i__ < *n) { - -/* Update A(1:i,i) */ - i__2 = i__ + i__ * a_dim1; i__3 = i__ + i__ * a_dim1; d__1 = a[i__3].r; @@ -310,18 +49,18 @@ f"> */ zlacgv_(&i__2, &w[i__ + (iw + 1) * w_dim1], ldw); i__2 = *n - i__; z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__, &i__2, &z__1, &a[(i__ + 1) * - a_dim1 + 1], lda, &w[i__ + (iw + 1) * w_dim1], ldw, & - c_b2, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); + zgemv_((char *)"No transpose", &i__, &i__2, &z__1, &a[(i__ + 1) * a_dim1 + 1], lda, + &w[i__ + (iw + 1) * w_dim1], ldw, &c_b2, &a[i__ * a_dim1 + 1], &c__1, + (ftnlen)12); i__2 = *n - i__; zlacgv_(&i__2, &w[i__ + (iw + 1) * w_dim1], ldw); i__2 = *n - i__; zlacgv_(&i__2, &a[i__ + (i__ + 1) * a_dim1], lda); i__2 = *n - i__; z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__, &i__2, &z__1, &w[(iw + 1) * - w_dim1 + 1], ldw, &a[i__ + (i__ + 1) * a_dim1], lda, & - c_b2, &a[i__ * a_dim1 + 1], &c__1, (ftnlen)12); + zgemv_((char *)"No transpose", &i__, &i__2, &z__1, &w[(iw + 1) * w_dim1 + 1], ldw, + &a[i__ + (i__ + 1) * a_dim1], lda, &c_b2, &a[i__ * a_dim1 + 1], &c__1, + (ftnlen)12); i__2 = *n - i__; zlacgv_(&i__2, &a[i__ + (i__ + 1) * a_dim1], lda); i__2 = i__ + i__ * a_dim1; @@ -330,81 +69,58 @@ f"> */ a[i__2].r = d__1, a[i__2].i = 0.; } if (i__ > 1) { - -/* Generate elementary reflector H(i) to annihilate */ -/* A(1:i-2,i) */ - i__2 = i__ - 1 + i__ * a_dim1; alpha.r = a[i__2].r, alpha.i = a[i__2].i; i__2 = i__ - 1; - zlarfg_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &tau[i__ - - 1]); + zlarfg_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &tau[i__ - 1]); e[i__ - 1] = alpha.r; i__2 = i__ - 1 + i__ * a_dim1; a[i__2].r = 1., a[i__2].i = 0.; - -/* Compute W(1:i-1,i) */ - i__2 = i__ - 1; - zhemv_((char *)"Upper", &i__2, &c_b2, &a[a_offset], lda, &a[i__ * - a_dim1 + 1], &c__1, &c_b1, &w[iw * w_dim1 + 1], &c__1, - (ftnlen)5); + zhemv_((char *)"Upper", &i__2, &c_b2, &a[a_offset], lda, &a[i__ * a_dim1 + 1], &c__1, &c_b1, + &w[iw * w_dim1 + 1], &c__1, (ftnlen)5); if (i__ < *n) { i__2 = i__ - 1; i__3 = *n - i__; - zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &w[(iw - + 1) * w_dim1 + 1], ldw, &a[i__ * a_dim1 + 1], & - c__1, &c_b1, &w[i__ + 1 + iw * w_dim1], &c__1, ( - ftnlen)19); + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &w[(iw + 1) * w_dim1 + 1], + ldw, &a[i__ * a_dim1 + 1], &c__1, &c_b1, &w[i__ + 1 + iw * w_dim1], + &c__1, (ftnlen)19); i__2 = i__ - 1; i__3 = *n - i__; z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[(i__ + 1) * - a_dim1 + 1], lda, &w[i__ + 1 + iw * w_dim1], & - c__1, &c_b2, &w[iw * w_dim1 + 1], &c__1, (ftnlen) - 12); + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[(i__ + 1) * a_dim1 + 1], lda, + &w[i__ + 1 + iw * w_dim1], &c__1, &c_b2, &w[iw * w_dim1 + 1], &c__1, + (ftnlen)12); i__2 = i__ - 1; i__3 = *n - i__; - zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &a[( - i__ + 1) * a_dim1 + 1], lda, &a[i__ * a_dim1 + 1], - &c__1, &c_b1, &w[i__ + 1 + iw * w_dim1], &c__1, ( - ftnlen)19); + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &a[(i__ + 1) * a_dim1 + 1], + lda, &a[i__ * a_dim1 + 1], &c__1, &c_b1, &w[i__ + 1 + iw * w_dim1], + &c__1, (ftnlen)19); i__2 = i__ - 1; i__3 = *n - i__; z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[(iw + 1) * - w_dim1 + 1], ldw, &w[i__ + 1 + iw * w_dim1], & - c__1, &c_b2, &w[iw * w_dim1 + 1], &c__1, (ftnlen) - 12); + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[(iw + 1) * w_dim1 + 1], ldw, + &w[i__ + 1 + iw * w_dim1], &c__1, &c_b2, &w[iw * w_dim1 + 1], &c__1, + (ftnlen)12); } i__2 = i__ - 1; zscal_(&i__2, &tau[i__ - 1], &w[iw * w_dim1 + 1], &c__1); z__3.r = -.5, z__3.i = -0.; i__2 = i__ - 1; - z__2.r = z__3.r * tau[i__2].r - z__3.i * tau[i__2].i, z__2.i = - z__3.r * tau[i__2].i + z__3.i * tau[i__2].r; + z__2.r = z__3.r * tau[i__2].r - z__3.i * tau[i__2].i, + z__2.i = z__3.r * tau[i__2].i + z__3.i * tau[i__2].r; i__3 = i__ - 1; - zdotc_(&z__4, &i__3, &w[iw * w_dim1 + 1], &c__1, &a[i__ * - a_dim1 + 1], &c__1); - z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * - z__4.i + z__2.i * z__4.r; + zdotc_(&z__4, &i__3, &w[iw * w_dim1 + 1], &c__1, &a[i__ * a_dim1 + 1], &c__1); + z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, + z__1.i = z__2.r * z__4.i + z__2.i * z__4.r; alpha.r = z__1.r, alpha.i = z__1.i; i__2 = i__ - 1; - zaxpy_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &w[iw * - w_dim1 + 1], &c__1); + zaxpy_(&i__2, &alpha, &a[i__ * a_dim1 + 1], &c__1, &w[iw * w_dim1 + 1], &c__1); } - -/* L10: */ } } else { - -/* Reduce first NB columns of lower triangle */ - i__1 = *nb; for (i__ = 1; i__ <= i__1; ++i__) { - -/* Update A(i:n,i) */ - i__2 = i__ + i__ * a_dim1; i__3 = i__ + i__ * a_dim1; d__1 = a[i__3].r; @@ -414,9 +130,8 @@ f"> */ i__2 = *n - i__ + 1; i__3 = i__ - 1; z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[i__ + a_dim1], lda, - &w[i__ + w_dim1], ldw, &c_b2, &a[i__ + i__ * a_dim1], & - c__1, (ftnlen)12); + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[i__ + a_dim1], lda, &w[i__ + w_dim1], + ldw, &c_b2, &a[i__ + i__ * a_dim1], &c__1, (ftnlen)12); i__2 = i__ - 1; zlacgv_(&i__2, &w[i__ + w_dim1], ldw); i__2 = i__ - 1; @@ -424,9 +139,8 @@ f"> */ i__2 = *n - i__ + 1; i__3 = i__ - 1; z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[i__ + w_dim1], ldw, - &a[i__ + a_dim1], lda, &c_b2, &a[i__ + i__ * a_dim1], & - c__1, (ftnlen)12); + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[i__ + w_dim1], ldw, &a[i__ + a_dim1], + lda, &c_b2, &a[i__ + i__ * a_dim1], &c__1, (ftnlen)12); i__2 = i__ - 1; zlacgv_(&i__2, &a[i__ + a_dim1], lda); i__2 = i__ + i__ * a_dim1; @@ -434,76 +148,60 @@ f"> */ d__1 = a[i__3].r; a[i__2].r = d__1, a[i__2].i = 0.; if (i__ < *n) { - -/* Generate elementary reflector H(i) to annihilate */ -/* A(i+2:n,i) */ - i__2 = i__ + 1 + i__ * a_dim1; alpha.r = a[i__2].r, alpha.i = a[i__2].i; i__2 = *n - i__; -/* Computing MIN */ i__3 = i__ + 2; - zlarfg_(&i__2, &alpha, &a[min(i__3,*n) + i__ * a_dim1], &c__1, - &tau[i__]); + zlarfg_(&i__2, &alpha, &a[min(i__3, *n) + i__ * a_dim1], &c__1, &tau[i__]); e[i__] = alpha.r; i__2 = i__ + 1 + i__ * a_dim1; a[i__2].r = 1., a[i__2].i = 0.; - -/* Compute W(i+1:n,i) */ - i__2 = *n - i__; - zhemv_((char *)"Lower", &i__2, &c_b2, &a[i__ + 1 + (i__ + 1) * a_dim1] - , lda, &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b1, &w[ - i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)5); + zhemv_((char *)"Lower", &i__2, &c_b2, &a[i__ + 1 + (i__ + 1) * a_dim1], lda, + &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b1, &w[i__ + 1 + i__ * w_dim1], &c__1, + (ftnlen)5); i__2 = *n - i__; i__3 = i__ - 1; - zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &w[i__ + 1 - + w_dim1], ldw, &a[i__ + 1 + i__ * a_dim1], &c__1, & - c_b1, &w[i__ * w_dim1 + 1], &c__1, (ftnlen)19); + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &w[i__ + 1 + w_dim1], ldw, + &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b1, &w[i__ * w_dim1 + 1], &c__1, + (ftnlen)19); i__2 = *n - i__; i__3 = i__ - 1; z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[i__ + 1 + - a_dim1], lda, &w[i__ * w_dim1 + 1], &c__1, &c_b2, &w[ - i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &a[i__ + 1 + a_dim1], lda, + &w[i__ * w_dim1 + 1], &c__1, &c_b2, &w[i__ + 1 + i__ * w_dim1], &c__1, + (ftnlen)12); i__2 = *n - i__; i__3 = i__ - 1; - zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &a[i__ + 1 - + a_dim1], lda, &a[i__ + 1 + i__ * a_dim1], &c__1, & - c_b1, &w[i__ * w_dim1 + 1], &c__1, (ftnlen)19); + zgemv_((char *)"Conjugate transpose", &i__2, &i__3, &c_b2, &a[i__ + 1 + a_dim1], lda, + &a[i__ + 1 + i__ * a_dim1], &c__1, &c_b1, &w[i__ * w_dim1 + 1], &c__1, + (ftnlen)19); i__2 = *n - i__; i__3 = i__ - 1; z__1.r = -1., z__1.i = -0.; - zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[i__ + 1 + - w_dim1], ldw, &w[i__ * w_dim1 + 1], &c__1, &c_b2, &w[ - i__ + 1 + i__ * w_dim1], &c__1, (ftnlen)12); + zgemv_((char *)"No transpose", &i__2, &i__3, &z__1, &w[i__ + 1 + w_dim1], ldw, + &w[i__ * w_dim1 + 1], &c__1, &c_b2, &w[i__ + 1 + i__ * w_dim1], &c__1, + (ftnlen)12); i__2 = *n - i__; zscal_(&i__2, &tau[i__], &w[i__ + 1 + i__ * w_dim1], &c__1); z__3.r = -.5, z__3.i = -0.; i__2 = i__; - z__2.r = z__3.r * tau[i__2].r - z__3.i * tau[i__2].i, z__2.i = - z__3.r * tau[i__2].i + z__3.i * tau[i__2].r; + z__2.r = z__3.r * tau[i__2].r - z__3.i * tau[i__2].i, + z__2.i = z__3.r * tau[i__2].i + z__3.i * tau[i__2].r; i__3 = *n - i__; - zdotc_(&z__4, &i__3, &w[i__ + 1 + i__ * w_dim1], &c__1, &a[ - i__ + 1 + i__ * a_dim1], &c__1); - z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, z__1.i = z__2.r * - z__4.i + z__2.i * z__4.r; + zdotc_(&z__4, &i__3, &w[i__ + 1 + i__ * w_dim1], &c__1, &a[i__ + 1 + i__ * a_dim1], + &c__1); + z__1.r = z__2.r * z__4.r - z__2.i * z__4.i, + z__1.i = z__2.r * z__4.i + z__2.i * z__4.r; alpha.r = z__1.r, alpha.i = z__1.i; i__2 = *n - i__; - zaxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &w[ - i__ + 1 + i__ * w_dim1], &c__1); + zaxpy_(&i__2, &alpha, &a[i__ + 1 + i__ * a_dim1], &c__1, &w[i__ + 1 + i__ * w_dim1], + &c__1); } - -/* L20: */ } } - return 0; - -/* End of ZLATRD */ - -} /* zlatrd_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zpptrf.cpp b/lib/linalg/zpptrf.cpp index d14e3678be..7c7049c6a1 100644 --- a/lib/linalg/zpptrf.cpp +++ b/lib/linalg/zpptrf.cpp @@ -1,203 +1,31 @@ -/* fortran/zpptrf.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static doublereal c_b16 = -1.; - -/* > \brief \b ZPPTRF */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZPPTRF + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZPPTRF( UPLO, N, AP, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 AP( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZPPTRF computes the Cholesky factorization of a complex Hermitian */ -/* > positive definite matrix A stored in packed format. */ -/* > */ -/* > The factorization has the form */ -/* > A = U**H * U, if UPLO = 'U', or */ -/* > A = L * L**H, if UPLO = 'L', */ -/* > where U is an upper triangular matrix and L is lower triangular. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A is stored; */ -/* > = 'L': Lower triangle of A is stored. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] AP */ -/* > \verbatim */ -/* > AP is COMPLEX*16 array, dimension (N*(N+1)/2) */ -/* > On entry, the upper or lower triangle of the Hermitian matrix */ -/* > A, packed columnwise in a linear array. The j-th column of A */ -/* > is stored in the array AP as follows: */ -/* > if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ -/* > if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. */ -/* > See below for further details. */ -/* > */ -/* > On exit, if INFO = 0, the triangular factor U or L from the */ -/* > Cholesky factorization A = U**H*U or A = L*L**H, in the same */ -/* > storage format as A. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, the leading minor of order i is not */ -/* > positive definite, and the factorization could not be */ -/* > completed. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > The packed storage scheme is illustrated by the following example */ -/* > when N = 4, UPLO = 'U': */ -/* > */ -/* > Two-dimensional storage of the Hermitian matrix A: */ -/* > */ -/* > a11 a12 a13 a14 */ -/* > a22 a23 a24 */ -/* > a33 a34 (aij = conjg(aji)) */ -/* > a44 */ -/* > */ -/* > Packed storage of the upper triangle of A: */ -/* > */ -/* > AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ] */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zpptrf_(char *uplo, integer *n, doublecomplex *ap, - integer *info, ftnlen uplo_len) +int zpptrf_(char *uplo, integer *n, doublecomplex *ap, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer i__1, i__2, i__3; doublereal d__1; doublecomplex z__1; - - /* Builtin functions */ double sqrt(doublereal); - - /* Local variables */ integer j, jc, jj; doublereal ajj; - extern /* Subroutine */ int zhpr_(char *, integer *, doublereal *, - doublecomplex *, integer *, doublecomplex *, ftnlen); + extern int zhpr_(char *, integer *, doublereal *, doublecomplex *, integer *, doublecomplex *, + ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *); + extern VOID zdotc_(doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *); logical upper; - extern /* Subroutine */ int ztpsv_(char *, char *, char *, integer *, - doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen), zdscal_(integer *, - doublereal *, doublecomplex *, integer *); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int ztpsv_(char *, char *, char *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen), + zdscal_(integer *, doublereal *, doublecomplex *, integer *); --ap; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; @@ -207,33 +35,20 @@ f"> */ xerbla_((char *)"ZPPTRF", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - if (upper) { - -/* Compute the Cholesky factorization A = U**H * U. */ - jj = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { jc = jj + 1; jj += j; - -/* Compute elements 1:J-1 of column J. */ - if (j > 1) { i__2 = j - 1; - ztpsv_((char *)"Upper", (char *)"Conjugate transpose", (char *)"Non-unit", &i__2, &ap[ - 1], &ap[jc], &c__1, (ftnlen)5, (ftnlen)19, (ftnlen)8); + ztpsv_((char *)"Upper", (char *)"Conjugate transpose", (char *)"Non-unit", &i__2, &ap[1], &ap[jc], &c__1, + (ftnlen)5, (ftnlen)19, (ftnlen)8); } - -/* Compute U(J,J) and test for non-positive-definiteness. */ - i__2 = jj; i__3 = j - 1; zdotc_(&z__1, &i__3, &ap[jc], &c__1, &ap[jc], &c__1); @@ -246,18 +61,11 @@ f"> */ i__2 = jj; d__1 = sqrt(ajj); ap[i__2].r = d__1, ap[i__2].i = 0.; -/* L10: */ } } else { - -/* Compute the Cholesky factorization A = L * L**H. */ - jj = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { - -/* Compute L(J,J) and test for non-positive-definiteness. */ - i__2 = jj; ajj = ap[i__2].r; if (ajj <= 0.) { @@ -268,34 +76,22 @@ f"> */ ajj = sqrt(ajj); i__2 = jj; ap[i__2].r = ajj, ap[i__2].i = 0.; - -/* Compute elements J+1:N of column J and update the trailing */ -/* submatrix. */ - if (j < *n) { i__2 = *n - j; d__1 = 1. / ajj; zdscal_(&i__2, &d__1, &ap[jj + 1], &c__1); i__2 = *n - j; - zhpr_((char *)"Lower", &i__2, &c_b16, &ap[jj + 1], &c__1, &ap[jj + *n - - j + 1], (ftnlen)5); + zhpr_((char *)"Lower", &i__2, &c_b16, &ap[jj + 1], &c__1, &ap[jj + *n - j + 1], (ftnlen)5); jj = jj + *n - j + 1; } -/* L20: */ } } goto L40; - L30: *info = j; - L40: return 0; - -/* End of ZPPTRF */ - -} /* zpptrf_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zpptri.cpp b/lib/linalg/zpptri.cpp index e804683c79..947af9b38d 100644 --- a/lib/linalg/zpptri.cpp +++ b/lib/linalg/zpptri.cpp @@ -1,176 +1,32 @@ -/* fortran/zpptri.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static doublereal c_b8 = 1.; static integer c__1 = 1; - -/* > \brief \b ZPPTRI */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZPPTRI + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZPPTRI( UPLO, N, AP, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 AP( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZPPTRI computes the inverse of a complex Hermitian positive definite */ -/* > matrix A using the Cholesky factorization A = U**H*U or A = L*L**H */ -/* > computed by ZPPTRF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangular factor is stored in AP; */ -/* > = 'L': Lower triangular factor is stored in AP. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] AP */ -/* > \verbatim */ -/* > AP is COMPLEX*16 array, dimension (N*(N+1)/2) */ -/* > On entry, the triangular factor U or L from the Cholesky */ -/* > factorization A = U**H*U or A = L*L**H, packed columnwise as */ -/* > a linear array. The j-th column of U or L is stored in the */ -/* > array AP as follows: */ -/* > if UPLO = 'U', AP(i + (j-1)*j/2) = U(i,j) for 1<=i<=j; */ -/* > if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = L(i,j) for j<=i<=n. */ -/* > */ -/* > On exit, the upper or lower triangle of the (Hermitian) */ -/* > inverse of A, overwriting the input factor U or L. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, the (i,i) element of the factor U or L is */ -/* > zero, and the inverse could not be computed. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zpptri_(char *uplo, integer *n, doublecomplex *ap, - integer *info, ftnlen uplo_len) +int zpptri_(char *uplo, integer *n, doublecomplex *ap, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer i__1, i__2, i__3; doublereal d__1; doublecomplex z__1; - - /* Local variables */ integer j, jc, jj; doublereal ajj; integer jjn; - extern /* Subroutine */ int zhpr_(char *, integer *, doublereal *, - doublecomplex *, integer *, doublecomplex *, ftnlen); + extern int zhpr_(char *, integer *, doublereal *, doublecomplex *, integer *, doublecomplex *, + ftnlen); extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Double Complex */ VOID zdotc_(doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *); + extern VOID zdotc_(doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *); logical upper; - extern /* Subroutine */ int ztpmv_(char *, char *, char *, integer *, - doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen), zdscal_(integer *, - doublereal *, doublecomplex *, integer *), ztptri_(char *, char *, - integer *, doublecomplex *, integer *, ftnlen, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int ztpmv_(char *, char *, char *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen), + zdscal_(integer *, doublereal *, doublecomplex *, integer *), + ztptri_(char *, char *, integer *, doublecomplex *, integer *, ftnlen, ftnlen); --ap; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; @@ -180,23 +36,14 @@ f"> */ xerbla_((char *)"ZPPTRI", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - -/* Invert the triangular Cholesky factor U or L. */ - ztptri_(uplo, (char *)"Non-unit", n, &ap[1], info, (ftnlen)1, (ftnlen)8); if (*info > 0) { return 0; } if (upper) { - -/* Compute the product inv(U) * inv(U)**H. */ - jj = 0; i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -204,19 +51,13 @@ f"> */ jj += j; if (j > 1) { i__2 = j - 1; - zhpr_((char *)"Upper", &i__2, &c_b8, &ap[jc], &c__1, &ap[1], (ftnlen) - 5); + zhpr_((char *)"Upper", &i__2, &c_b8, &ap[jc], &c__1, &ap[1], (ftnlen)5); } i__2 = jj; ajj = ap[i__2].r; zdscal_(&j, &ajj, &ap[jc], &c__1); -/* L10: */ } - } else { - -/* Compute the product inv(L)**H * inv(L). */ - jj = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -228,21 +69,14 @@ f"> */ ap[i__2].r = d__1, ap[i__2].i = 0.; if (j < *n) { i__2 = *n - j; - ztpmv_((char *)"Lower", (char *)"Conjugate transpose", (char *)"Non-unit", &i__2, &ap[ - jjn], &ap[jj + 1], &c__1, (ftnlen)5, (ftnlen)19, ( - ftnlen)8); + ztpmv_((char *)"Lower", (char *)"Conjugate transpose", (char *)"Non-unit", &i__2, &ap[jjn], &ap[jj + 1], + &c__1, (ftnlen)5, (ftnlen)19, (ftnlen)8); } jj = jjn; -/* L20: */ } } - return 0; - -/* End of ZPPTRI */ - -} /* zpptri_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zscal.cpp b/lib/linalg/zscal.cpp index 6efc02ee5e..ee91d39b21 100644 --- a/lib/linalg/zscal.cpp +++ b/lib/linalg/zscal.cpp @@ -1,162 +1,39 @@ -/* fortran/zscal.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZSCAL */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZSCAL(N,ZA,ZX,INCX) */ - -/* .. Scalar Arguments .. */ -/* COMPLEX*16 ZA */ -/* INTEGER INCX,N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 ZX(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZSCAL scales a vector by a constant. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ZA */ -/* > \verbatim */ -/* > ZA is COMPLEX*16 */ -/* > On entry, ZA specifies the scalar alpha. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] ZX */ -/* > \verbatim */ -/* > ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of ZX */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, 3/11/78. */ -/* > modified 3/93 to return if incx .le. 0. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zscal_(integer *n, doublecomplex *za, doublecomplex *zx, - integer *incx) +int zscal_(integer *n, doublecomplex *za, doublecomplex *zx, integer *incx) { - /* System generated locals */ integer i__1, i__2, i__3, i__4; doublecomplex z__1; - - /* Local variables */ integer i__, nincx; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. Parameters .. */ -/* .. */ - /* Parameter adjustments */ --zx; - - /* Function Body */ if (*n <= 0 || *incx <= 0 || za->r == 1. && za->i == 0.) { return 0; } if (*incx == 1) { - -/* code for increment equal to 1 */ - i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__; i__3 = i__; - z__1.r = za->r * zx[i__3].r - za->i * zx[i__3].i, z__1.i = za->r * - zx[i__3].i + za->i * zx[i__3].r; + z__1.r = za->r * zx[i__3].r - za->i * zx[i__3].i, + z__1.i = za->r * zx[i__3].i + za->i * zx[i__3].r; zx[i__2].r = z__1.r, zx[i__2].i = z__1.i; } } else { - -/* code for increment not equal to 1 */ - nincx = *n * *incx; i__1 = nincx; i__2 = *incx; for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { i__3 = i__; i__4 = i__; - z__1.r = za->r * zx[i__4].r - za->i * zx[i__4].i, z__1.i = za->r * - zx[i__4].i + za->i * zx[i__4].r; + z__1.r = za->r * zx[i__4].r - za->i * zx[i__4].i, + z__1.i = za->r * zx[i__4].i + za->i * zx[i__4].r; zx[i__3].r = z__1.r, zx[i__3].i = z__1.i; } } return 0; - -/* End of ZSCAL */ - -} /* zscal_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zstedc.cpp b/lib/linalg/zstedc.cpp index fc6d9a782b..99804fef30 100644 --- a/lib/linalg/zstedc.cpp +++ b/lib/linalg/zstedc.cpp @@ -1,324 +1,57 @@ -/* fortran/zstedc.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__9 = 9; static integer c__0 = 0; static integer c__2 = 2; static doublereal c_b17 = 0.; static doublereal c_b18 = 1.; static integer c__1 = 1; - -/* > \brief \b ZSTEDC */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZSTEDC + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, */ -/* LRWORK, IWORK, LIWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER COMPZ */ -/* INTEGER INFO, LDZ, LIWORK, LRWORK, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* INTEGER IWORK( * ) */ -/* DOUBLE PRECISION D( * ), E( * ), RWORK( * ) */ -/* COMPLEX*16 WORK( * ), Z( LDZ, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZSTEDC computes all eigenvalues and, optionally, eigenvectors of a */ -/* > symmetric tridiagonal matrix using the divide and conquer method. */ -/* > The eigenvectors of a full or band complex Hermitian matrix can also */ -/* > be found if ZHETRD or ZHPTRD or ZHBTRD has been used to reduce this */ -/* > matrix to tridiagonal form. */ -/* > */ -/* > This code makes very mild assumptions about floating point */ -/* > arithmetic. It will work on machines with a guard digit in */ -/* > add/subtract, or on those binary machines without guard digits */ -/* > which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. */ -/* > It could conceivably fail on hexadecimal or decimal machines */ -/* > without guard digits, but we know of none. See DLAED3 for details. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] COMPZ */ -/* > \verbatim */ -/* > COMPZ is CHARACTER*1 */ -/* > = 'N': Compute eigenvalues only. */ -/* > = 'I': Compute eigenvectors of tridiagonal matrix also. */ -/* > = 'V': Compute eigenvectors of original Hermitian matrix */ -/* > also. On entry, Z contains the unitary matrix used */ -/* > to reduce the original matrix to tridiagonal form. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The dimension of the symmetric tridiagonal matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the diagonal elements of the tridiagonal matrix. */ -/* > On exit, if INFO = 0, the eigenvalues in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > On entry, the subdiagonal elements of the tridiagonal matrix. */ -/* > On exit, E has been destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Z */ -/* > \verbatim */ -/* > Z is COMPLEX*16 array, dimension (LDZ,N) */ -/* > On entry, if COMPZ = 'V', then Z contains the unitary */ -/* > matrix used in the reduction to tridiagonal form. */ -/* > On exit, if INFO = 0, then if COMPZ = 'V', Z contains the */ -/* > orthonormal eigenvectors of the original Hermitian matrix, */ -/* > and if COMPZ = 'I', Z contains the orthonormal eigenvectors */ -/* > of the symmetric tridiagonal matrix. */ -/* > If COMPZ = 'N', then Z is not referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDZ */ -/* > \verbatim */ -/* > LDZ is INTEGER */ -/* > The leading dimension of the array Z. LDZ >= 1. */ -/* > If eigenvectors are desired, then LDZ >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > If COMPZ = 'N' or 'I', or N <= 1, LWORK must be at least 1. */ -/* > If COMPZ = 'V' and N > 1, LWORK must be at least N*N. */ -/* > Note that for COMPZ = 'V', then if N is less than or */ -/* > equal to the minimum divide size, usually 25, then LWORK need */ -/* > only be 1. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal sizes of the WORK, RWORK and */ -/* > IWORK arrays, returns these values as the first entries of */ -/* > the WORK, RWORK and IWORK arrays, and no error message */ -/* > related to LWORK or LRWORK or LIWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] RWORK */ -/* > \verbatim */ -/* > RWORK is DOUBLE PRECISION array, dimension (MAX(1,LRWORK)) */ -/* > On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LRWORK */ -/* > \verbatim */ -/* > LRWORK is INTEGER */ -/* > The dimension of the array RWORK. */ -/* > If COMPZ = 'N' or N <= 1, LRWORK must be at least 1. */ -/* > If COMPZ = 'V' and N > 1, LRWORK must be at least */ -/* > 1 + 3*N + 2*N*lg N + 4*N**2 , */ -/* > where lg( N ) = smallest integer k such */ -/* > that 2**k >= N. */ -/* > If COMPZ = 'I' and N > 1, LRWORK must be at least */ -/* > 1 + 4*N + 2*N**2 . */ -/* > Note that for COMPZ = 'I' or 'V', then if N is less than or */ -/* > equal to the minimum divide size, usually 25, then LRWORK */ -/* > need only be max(1,2*(N-1)). */ -/* > */ -/* > If LRWORK = -1, then a workspace query is assumed; the */ -/* > routine only calculates the optimal sizes of the WORK, RWORK */ -/* > and IWORK arrays, returns these values as the first entries */ -/* > of the WORK, RWORK and IWORK arrays, and no error message */ -/* > related to LWORK or LRWORK or LIWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] IWORK */ -/* > \verbatim */ -/* > IWORK is INTEGER array, dimension (MAX(1,LIWORK)) */ -/* > On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LIWORK */ -/* > \verbatim */ -/* > LIWORK is INTEGER */ -/* > The dimension of the array IWORK. */ -/* > If COMPZ = 'N' or N <= 1, LIWORK must be at least 1. */ -/* > If COMPZ = 'V' or N > 1, LIWORK must be at least */ -/* > 6 + 6*N + 5*N*lg N. */ -/* > If COMPZ = 'I' or N > 1, LIWORK must be at least */ -/* > 3 + 5*N . */ -/* > Note that for COMPZ = 'I' or 'V', then if N is less than or */ -/* > equal to the minimum divide size, usually 25, then LIWORK */ -/* > need only be 1. */ -/* > */ -/* > If LIWORK = -1, then a workspace query is assumed; the */ -/* > routine only calculates the optimal sizes of the WORK, RWORK */ -/* > and IWORK arrays, returns these values as the first entries */ -/* > of the WORK, RWORK and IWORK arrays, and no error message */ -/* > related to LWORK or LRWORK or LIWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit. */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value. */ -/* > > 0: The algorithm failed to compute an eigenvalue while */ -/* > working on the submatrix lying in rows and columns */ -/* > INFO/(N+1) through mod(INFO,N+1). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* > \par Contributors: */ -/* ================== */ -/* > */ -/* > Jeff Rutter, Computer Science Division, University of California */ -/* > at Berkeley, USA */ - -/* ===================================================================== */ -/* Subroutine */ int zstedc_(char *compz, integer *n, doublereal *d__, - doublereal *e, doublecomplex *z__, integer *ldz, doublecomplex *work, - integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, - integer *liwork, integer *info, ftnlen compz_len) +int zstedc_(char *compz, integer *n, doublereal *d__, doublereal *e, doublecomplex *z__, + integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer *lrwork, + integer *iwork, integer *liwork, integer *info, ftnlen compz_len) { - /* System generated locals */ integer z_dim1, z_offset, i__1, i__2, i__3, i__4; doublereal d__1, d__2; - - /* Builtin functions */ double log(doublereal); integer pow_lmp_ii(integer *, integer *); double sqrt(doublereal); - - /* Local variables */ integer i__, j, k, m; doublereal p; integer ii, ll, lgn; doublereal eps, tiny; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer lwmin, start; - extern /* Subroutine */ int zswap_(integer *, doublecomplex *, integer *, - doublecomplex *, integer *), zlaed0_(integer *, integer *, - doublereal *, doublereal *, doublecomplex *, integer *, - doublecomplex *, integer *, doublereal *, integer *, integer *); + extern int zswap_(integer *, doublecomplex *, integer *, doublecomplex *, integer *), + zlaed0_(integer *, integer *, doublereal *, doublereal *, doublecomplex *, integer *, + doublecomplex *, integer *, doublereal *, integer *, integer *); extern doublereal dlamch_(char *, ftnlen); - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen), dstedc_(char *, integer *, - doublereal *, doublereal *, doublereal *, integer *, doublereal *, - integer *, integer *, integer *, integer *, ftnlen), dlaset_( - char *, integer *, integer *, doublereal *, doublereal *, - doublereal *, integer *, ftnlen), xerbla_(char *, integer *, - ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, ftnlen), + dstedc_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, integer *, integer *, integer *, integer *, ftnlen), + dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, + ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); integer finish; - extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, - ftnlen); - extern /* Subroutine */ int dsterf_(integer *, doublereal *, doublereal *, - integer *), zlacrm_(integer *, integer *, doublecomplex *, - integer *, doublereal *, integer *, doublecomplex *, integer *, - doublereal *); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, ftnlen); + extern int dsterf_(integer *, doublereal *, doublereal *, integer *), + zlacrm_(integer *, integer *, doublecomplex *, integer *, doublereal *, integer *, + doublecomplex *, integer *, doublereal *); integer liwmin, icompz; - extern /* Subroutine */ int dsteqr_(char *, integer *, doublereal *, - doublereal *, doublereal *, integer *, doublereal *, integer *, - ftnlen), zlacpy_(char *, integer *, integer *, doublecomplex *, - integer *, doublecomplex *, integer *, ftnlen); + extern int dsteqr_(char *, integer *, doublereal *, doublereal *, doublereal *, integer *, + doublereal *, integer *, ftnlen), + zlacpy_(char *, integer *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, ftnlen); doublereal orgnrm; integer lrwmin; logical lquery; integer smlsiz; - extern /* Subroutine */ int zsteqr_(char *, integer *, doublereal *, - doublereal *, doublecomplex *, integer *, doublereal *, integer *, - ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int zsteqr_(char *, integer *, doublereal *, doublereal *, doublecomplex *, integer *, + doublereal *, integer *, ftnlen); --d__; --e; z_dim1 = *ldz; @@ -327,11 +60,8 @@ f"> */ --work; --rwork; --iwork; - - /* Function Body */ *info = 0; lquery = *lwork == -1 || *lrwork == -1 || *liwork == -1; - if (lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1)) { icompz = 0; } else if (lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1)) { @@ -345,16 +75,11 @@ f"> */ *info = -1; } else if (*n < 0) { *info = -2; - } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { + } else if (*ldz < 1 || icompz > 0 && *ldz < max(1, *n)) { *info = -6; } - if (*info == 0) { - -/* Compute the workspace requirements */ - - smlsiz = ilaenv_(&c__9, (char *)"ZSTEDC", (char *)" ", &c__0, &c__0, &c__0, &c__0, ( - ftnlen)6, (ftnlen)1); + smlsiz = ilaenv_(&c__9, (char *)"ZSTEDC", (char *)" ", &c__0, &c__0, &c__0, &c__0, (ftnlen)6, (ftnlen)1); if (*n <= 1 || icompz == 0) { lwmin = 1; liwmin = 1; @@ -364,7 +89,7 @@ f"> */ liwmin = 1; lrwmin = *n - 1 << 1; } else if (icompz == 1) { - lgn = (integer) (log((doublereal) (*n)) / log(2.)); + lgn = (integer)(log((doublereal)(*n)) / log(2.)); if (pow_lmp_ii(&c__2, &lgn) < *n) { ++lgn; } @@ -372,30 +97,26 @@ f"> */ ++lgn; } lwmin = *n * *n; -/* Computing 2nd power */ i__1 = *n; lrwmin = *n * 3 + 1 + (*n << 1) * lgn + (i__1 * i__1 << 2); liwmin = *n * 6 + 6 + *n * 5 * lgn; } else if (icompz == 2) { lwmin = 1; -/* Computing 2nd power */ i__1 = *n; lrwmin = (*n << 2) + 1 + (i__1 * i__1 << 1); liwmin = *n * 5 + 3; } - work[1].r = (doublereal) lwmin, work[1].i = 0.; - rwork[1] = (doublereal) lrwmin; + work[1].r = (doublereal)lwmin, work[1].i = 0.; + rwork[1] = (doublereal)lrwmin; iwork[1] = liwmin; - - if (*lwork < lwmin && ! lquery) { + if (*lwork < lwmin && !lquery) { *info = -8; - } else if (*lrwork < lrwmin && ! lquery) { + } else if (*lrwork < lrwmin && !lquery) { *info = -10; - } else if (*liwork < liwmin && ! lquery) { + } else if (*liwork < liwmin && !lquery) { *info = -12; } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"ZSTEDC", &i__1, (ftnlen)6); @@ -403,9 +124,6 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } @@ -416,41 +134,19 @@ f"> */ } return 0; } - -/* If the following conditional clause is removed, then the routine */ -/* will use the Divide and Conquer routine to compute only the */ -/* eigenvalues, which requires (3N + 3N**2) real workspace and */ -/* (2 + 5N + 2N lg(N)) integer workspace. */ -/* Since on many architectures DSTERF is much faster than any other */ -/* algorithm for finding eigenvalues only, it is used here */ -/* as the default. If the conditional clause is removed, then */ -/* information on the size of workspace needs to be changed. */ - -/* If COMPZ = 'N', use DSTERF to compute the eigenvalues. */ - if (icompz == 0) { dsterf_(n, &d__[1], &e[1], info); goto L70; } - -/* If N is smaller than the minimum divide size (SMLSIZ+1), then */ -/* solve the problem with another solver. */ - if (*n <= smlsiz) { - - zsteqr_(compz, n, &d__[1], &e[1], &z__[z_offset], ldz, &rwork[1], - info, (ftnlen)1); - + zsteqr_(compz, n, &d__[1], &e[1], &z__[z_offset], ldz, &rwork[1], info, (ftnlen)1); } else { - -/* If COMPZ = 'I', we simply call DSTEDC instead. */ - if (icompz == 2) { dlaset_((char *)"Full", n, n, &c_b17, &c_b18, &rwork[1], n, (ftnlen)4); ll = *n * *n + 1; i__1 = *lrwork - ll + 1; - dstedc_((char *)"I", n, &d__[1], &e[1], &rwork[1], n, &rwork[ll], &i__1, & - iwork[1], liwork, info, (ftnlen)1); + dstedc_((char *)"I", n, &d__[1], &e[1], &rwork[1], n, &rwork[ll], &i__1, &iwork[1], liwork, + info, (ftnlen)1); i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; @@ -458,99 +154,59 @@ f"> */ i__3 = i__ + j * z_dim1; i__4 = (j - 1) * *n + i__; z__[i__3].r = rwork[i__4], z__[i__3].i = 0.; -/* L10: */ } -/* L20: */ } goto L70; } - -/* From now on, only option left to be handled is COMPZ = 'V', */ -/* i.e. ICOMPZ = 1. */ - -/* Scale. */ - orgnrm = dlanst_((char *)"M", n, &d__[1], &e[1], (ftnlen)1); if (orgnrm == 0.) { goto L70; } - eps = dlamch_((char *)"Epsilon", (ftnlen)7); - start = 1; - -/* while ( START <= N ) */ - -L30: + L30: if (start <= *n) { - -/* Let FINISH be the position of the next subdiagonal entry */ -/* such that E( FINISH ) <= TINY or FINISH = N if no such */ -/* subdiagonal exists. The matrix identified by the elements */ -/* between START and FINISH constitutes an independent */ -/* sub-problem. */ - finish = start; -L40: + L40: if (finish < *n) { - tiny = eps * sqrt((d__1 = d__[finish], abs(d__1))) * sqrt(( - d__2 = d__[finish + 1], abs(d__2))); + tiny = eps * sqrt((d__1 = d__[finish], abs(d__1))) * + sqrt((d__2 = d__[finish + 1], abs(d__2))); if ((d__1 = e[finish], abs(d__1)) > tiny) { ++finish; goto L40; } } - -/* (Sub) Problem determined. Compute its size and solve it. */ - m = finish - start + 1; if (m > smlsiz) { - -/* Scale. */ - orgnrm = dlanst_((char *)"M", &m, &d__[start], &e[start], (ftnlen)1); - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &m, &c__1, &d__[ - start], &m, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &m, &c__1, &d__[start], &m, info, + (ftnlen)1); i__1 = m - 1; i__2 = m - 1; - dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &i__1, &c__1, &e[ - start], &i__2, info, (ftnlen)1); - - zlaed0_(n, &m, &d__[start], &e[start], &z__[start * z_dim1 + - 1], ldz, &work[1], n, &rwork[1], &iwork[1], info); + dlascl_((char *)"G", &c__0, &c__0, &orgnrm, &c_b18, &i__1, &c__1, &e[start], &i__2, info, + (ftnlen)1); + zlaed0_(n, &m, &d__[start], &e[start], &z__[start * z_dim1 + 1], ldz, &work[1], n, + &rwork[1], &iwork[1], info); if (*info > 0) { - *info = (*info / (m + 1) + start - 1) * (*n + 1) + *info % - (m + 1) + start - 1; + *info = (*info / (m + 1) + start - 1) * (*n + 1) + *info % (m + 1) + start - 1; goto L70; } - -/* Scale back. */ - - dlascl_((char *)"G", &c__0, &c__0, &c_b18, &orgnrm, &m, &c__1, &d__[ - start], &m, info, (ftnlen)1); - + dlascl_((char *)"G", &c__0, &c__0, &c_b18, &orgnrm, &m, &c__1, &d__[start], &m, info, + (ftnlen)1); } else { - dsteqr_((char *)"I", &m, &d__[start], &e[start], &rwork[1], &m, & - rwork[m * m + 1], info, (ftnlen)1); - zlacrm_(n, &m, &z__[start * z_dim1 + 1], ldz, &rwork[1], &m, & - work[1], n, &rwork[m * m + 1]); - zlacpy_((char *)"A", n, &m, &work[1], n, &z__[start * z_dim1 + 1], - ldz, (ftnlen)1); + dsteqr_((char *)"I", &m, &d__[start], &e[start], &rwork[1], &m, &rwork[m * m + 1], info, + (ftnlen)1); + zlacrm_(n, &m, &z__[start * z_dim1 + 1], ldz, &rwork[1], &m, &work[1], n, + &rwork[m * m + 1]); + zlacpy_((char *)"A", n, &m, &work[1], n, &z__[start * z_dim1 + 1], ldz, (ftnlen)1); if (*info > 0) { *info = start * (*n + 1) + finish; goto L70; } } - start = finish + 1; goto L30; } - -/* endwhile */ - - -/* Use Selection Sort to minimize swaps of eigenvectors */ - i__1 = *n; for (ii = 2; ii <= i__1; ++ii) { i__ = ii - 1; @@ -562,29 +218,20 @@ L40: k = j; p = d__[j]; } -/* L50: */ } if (k != i__) { d__[k] = d__[i__]; d__[i__] = p; - zswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], - &c__1); + zswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], &c__1); } -/* L60: */ } } - L70: - work[1].r = (doublereal) lwmin, work[1].i = 0.; - rwork[1] = (doublereal) lrwmin; + work[1].r = (doublereal)lwmin, work[1].i = 0.; + rwork[1] = (doublereal)lrwmin; iwork[1] = liwmin; - return 0; - -/* End of ZSTEDC */ - -} /* zstedc_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zsteqr.cpp b/lib/linalg/zsteqr.cpp index 2085ccbaae..acf4f9168b 100644 --- a/lib/linalg/zsteqr.cpp +++ b/lib/linalg/zsteqr.cpp @@ -1,174 +1,19 @@ -/* fortran/zsteqr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - -static doublecomplex c_b1 = {0.,0.}; -static doublecomplex c_b2 = {1.,0.}; +static doublecomplex c_b1 = {0., 0.}; +static doublecomplex c_b2 = {1., 0.}; static integer c__0 = 0; static integer c__1 = 1; static integer c__2 = 2; static doublereal c_b41 = 1.; - -/* > \brief \b ZSTEQR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZSTEQR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER COMPZ */ -/* INTEGER INFO, LDZ, N */ -/* .. */ -/* .. Array Arguments .. */ -/* DOUBLE PRECISION D( * ), E( * ), WORK( * ) */ -/* COMPLEX*16 Z( LDZ, * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZSTEQR computes all eigenvalues and, optionally, eigenvectors of a */ -/* > symmetric tridiagonal matrix using the implicit QL or QR method. */ -/* > The eigenvectors of a full or band complex Hermitian matrix can also */ -/* > be found if ZHETRD or ZHPTRD or ZHBTRD has been used to reduce this */ -/* > matrix to tridiagonal form. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] COMPZ */ -/* > \verbatim */ -/* > COMPZ is CHARACTER*1 */ -/* > = 'N': Compute eigenvalues only. */ -/* > = 'V': Compute eigenvalues and eigenvectors of the original */ -/* > Hermitian matrix. On entry, Z must contain the */ -/* > unitary matrix used to reduce the original matrix */ -/* > to tridiagonal form. */ -/* > = 'I': Compute eigenvalues and eigenvectors of the */ -/* > tridiagonal matrix. Z is initialized to the identity */ -/* > matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] D */ -/* > \verbatim */ -/* > D is DOUBLE PRECISION array, dimension (N) */ -/* > On entry, the diagonal elements of the tridiagonal matrix. */ -/* > On exit, if INFO = 0, the eigenvalues in ascending order. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] E */ -/* > \verbatim */ -/* > E is DOUBLE PRECISION array, dimension (N-1) */ -/* > On entry, the (n-1) subdiagonal elements of the tridiagonal */ -/* > matrix. */ -/* > On exit, E has been destroyed. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] Z */ -/* > \verbatim */ -/* > Z is COMPLEX*16 array, dimension (LDZ, N) */ -/* > On entry, if COMPZ = 'V', then Z contains the unitary */ -/* > matrix used in the reduction to tridiagonal form. */ -/* > On exit, if INFO = 0, then if COMPZ = 'V', Z contains the */ -/* > orthonormal eigenvectors of the original Hermitian matrix, */ -/* > and if COMPZ = 'I', Z contains the orthonormal eigenvectors */ -/* > of the symmetric tridiagonal matrix. */ -/* > If COMPZ = 'N', then Z is not referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDZ */ -/* > \verbatim */ -/* > LDZ is INTEGER */ -/* > The leading dimension of the array Z. LDZ >= 1, and if */ -/* > eigenvectors are desired, then LDZ >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is DOUBLE PRECISION array, dimension (max(1,2*N-2)) */ -/* > If COMPZ = 'N', then WORK is not referenced. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: the algorithm has failed to find all the eigenvalues in */ -/* > a total of 30*N iterations; if INFO = i, then i */ -/* > elements of E have not converged to zero; on exit, D */ -/* > and E contain the elements of a symmetric tridiagonal */ -/* > matrix which is unitarily similar to the original */ -/* > matrix. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zsteqr_(char *compz, integer *n, doublereal *d__, - doublereal *e, doublecomplex *z__, integer *ldz, doublereal *work, - integer *info, ftnlen compz_len) +int zsteqr_(char *compz, integer *n, doublereal *d__, doublereal *e, doublecomplex *z__, + integer *ldz, doublereal *work, integer *info, ftnlen compz_len) { - /* System generated locals */ integer z_dim1, z_offset, i__1, i__2; doublereal d__1, d__2; - - /* Builtin functions */ double sqrt(doublereal), d_lmp_sign(doublereal *, doublereal *); - - /* Local variables */ doublereal b, c__, f, g; integer i__, j, k, l, m; doublereal p, r__, s; @@ -177,77 +22,38 @@ f"> */ integer lsv; doublereal tst, eps2; integer lend, jtot; - extern /* Subroutine */ int dlae2_(doublereal *, doublereal *, doublereal - *, doublereal *, doublereal *); + extern int dlae2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); extern logical lsame_(char *, char *, ftnlen, ftnlen); doublereal anorm; - extern /* Subroutine */ int zlasr_(char *, char *, char *, integer *, - integer *, doublereal *, doublereal *, doublecomplex *, integer *, - ftnlen, ftnlen, ftnlen), zswap_(integer *, doublecomplex *, - integer *, doublecomplex *, integer *), dlaev2_(doublereal *, - doublereal *, doublereal *, doublereal *, doublereal *, - doublereal *, doublereal *); + extern int zlasr_(char *, char *, char *, integer *, integer *, doublereal *, doublereal *, + doublecomplex *, integer *, ftnlen, ftnlen, ftnlen), + zswap_(integer *, doublecomplex *, integer *, doublecomplex *, integer *), + dlaev2_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, + doublereal *); integer lendm1, lendp1; - extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, - ftnlen); + extern doublereal dlapy2_(doublereal *, doublereal *), dlamch_(char *, ftnlen); integer iscale; - extern /* Subroutine */ int dlascl_(char *, integer *, integer *, - doublereal *, doublereal *, integer *, integer *, doublereal *, - integer *, integer *, ftnlen); + extern int dlascl_(char *, integer *, integer *, doublereal *, doublereal *, integer *, + integer *, doublereal *, integer *, integer *, ftnlen); doublereal safmin; - extern /* Subroutine */ int dlartg_(doublereal *, doublereal *, - doublereal *, doublereal *, doublereal *); + extern int dlartg_(doublereal *, doublereal *, doublereal *, doublereal *, doublereal *); doublereal safmax; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, - ftnlen); - extern /* Subroutine */ int dlasrt_(char *, integer *, doublereal *, - integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + extern doublereal dlanst_(char *, integer *, doublereal *, doublereal *, ftnlen); + extern int dlasrt_(char *, integer *, doublereal *, integer *, ftnlen); integer lendsv; doublereal ssfmin; integer nmaxit, icompz; doublereal ssfmax; - extern /* Subroutine */ int zlaset_(char *, integer *, integer *, - doublecomplex *, doublecomplex *, doublecomplex *, integer *, - ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ + extern int zlaset_(char *, integer *, integer *, doublecomplex *, doublecomplex *, + doublecomplex *, integer *, ftnlen); --d__; --e; z_dim1 = *ldz; z_offset = 1 + z_dim1; z__ -= z_offset; --work; - - /* Function Body */ *info = 0; - if (lsame_(compz, (char *)"N", (ftnlen)1, (ftnlen)1)) { icompz = 0; } else if (lsame_(compz, (char *)"V", (ftnlen)1, (ftnlen)1)) { @@ -261,7 +67,7 @@ f"> */ *info = -1; } else if (*n < 0) { *info = -2; - } else if (*ldz < 1 || icompz > 0 && *ldz < max(1,*n)) { + } else if (*ldz < 1 || icompz > 0 && *ldz < max(1, *n)) { *info = -6; } if (*info != 0) { @@ -269,13 +75,9 @@ f"> */ xerbla_((char *)"ZSTEQR", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n == 0) { return 0; } - if (*n == 1) { if (icompz == 2) { i__1 = z_dim1 + 1; @@ -283,35 +85,20 @@ f"> */ } return 0; } - -/* Determine the unit roundoff and over/underflow thresholds. */ - eps = dlamch_((char *)"E", (ftnlen)1); -/* Computing 2nd power */ d__1 = eps; eps2 = d__1 * d__1; safmin = dlamch_((char *)"S", (ftnlen)1); safmax = 1. / safmin; ssfmax = sqrt(safmax) / 3.; ssfmin = sqrt(safmin) / eps2; - -/* Compute the eigenvalues and eigenvectors of the tridiagonal */ -/* matrix. */ - if (icompz == 2) { zlaset_((char *)"Full", n, n, &c_b1, &c_b2, &z__[z_offset], ldz, (ftnlen)4); } - nmaxit = *n * 30; jtot = 0; - -/* Determine where the matrix splits and choose QL or QR iteration */ -/* for each block, according to whether top or bottom diagonal */ -/* element is smaller. */ - l1 = 1; nm1 = *n - 1; - L10: if (l1 > *n) { goto L160; @@ -326,16 +113,14 @@ L10: if (tst == 0.) { goto L30; } - if (tst <= sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m - + 1], abs(d__2))) * eps) { + if (tst <= + sqrt((d__1 = d__[m], abs(d__1))) * sqrt((d__2 = d__[m + 1], abs(d__2))) * eps) { e[m] = 0.; goto L30; } -/* L20: */ } } m = *n; - L30: l = l1; lsv = l; @@ -345,9 +130,6 @@ L30: if (lend == l) { goto L10; } - -/* Scale submatrix in rows and columns L to LEND */ - i__1 = lend - l + 1; anorm = dlanst_((char *)"I", &i__1, &d__[l], &e[l], (ftnlen)1); iscale = 0; @@ -357,53 +139,36 @@ L30: if (anorm > ssfmax) { iscale = 1; i__1 = lend - l + 1; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n, info, (ftnlen)1); i__1 = lend - l; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n, info, (ftnlen)1); } else if (anorm < ssfmin) { iscale = 2; i__1 = lend - l + 1; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n, info, (ftnlen)1); i__1 = lend - l; - dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n, info, (ftnlen)1); } - -/* Choose between QL and QR iteration */ - if ((d__1 = d__[lend], abs(d__1)) < (d__2 = d__[l], abs(d__2))) { lend = lsv; l = lendsv; } - if (lend > l) { - -/* QL Iteration */ - -/* Look for small subdiagonal element. */ - -L40: + L40: if (l != lend) { lendm1 = lend - 1; i__1 = lendm1; for (m = l; m <= i__1; ++m) { -/* Computing 2nd power */ d__2 = (d__1 = e[m], abs(d__1)); tst = d__2 * d__2; - if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m - + 1], abs(d__2)) + safmin) { + if (tst <= + eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m + 1], abs(d__2)) + safmin) { goto L60; } -/* L50: */ } } - m = lend; - -L60: + L60: if (m < lend) { e[m] = 0.; } @@ -411,18 +176,13 @@ L60: if (m == l) { goto L80; } - -/* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ -/* to compute its eigensystem. */ - if (m == l + 1) { if (icompz > 0) { dlaev2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s); work[l] = c__; work[*n - 1 + l] = s; - zlasr_((char *)"R", (char *)"V", (char *)"B", n, &c__2, &work[l], &work[*n - 1 + l], & - z__[l * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, ( - ftnlen)1); + zlasr_((char *)"R", (char *)"V", (char *)"B", n, &c__2, &work[l], &work[*n - 1 + l], &z__[l * z_dim1 + 1], + ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); } else { dlae2_(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2); } @@ -435,24 +195,16 @@ L60: } goto L140; } - if (jtot == nmaxit) { goto L140; } ++jtot; - -/* Form shift. */ - g = (d__[l + 1] - p) / (e[l] * 2.); r__ = dlapy2_(&g, &c_b41); g = d__[m] - p + e[l] / (g + d_lmp_sign(&r__, &g)); - s = 1.; c__ = 1.; p = 0.; - -/* Inner loop */ - mm1 = m - 1; i__1 = l; for (i__ = mm1; i__ >= i__1; --i__) { @@ -467,65 +219,42 @@ L60: p = s * r__; d__[i__ + 1] = g + p; g = c__ * r__ - b; - -/* If eigenvectors are desired, then save rotations. */ - if (icompz > 0) { work[i__] = c__; work[*n - 1 + i__] = -s; } - -/* L70: */ } - -/* If eigenvectors are desired, then apply saved rotations. */ - if (icompz > 0) { mm = m - l + 1; - zlasr_((char *)"R", (char *)"V", (char *)"B", n, &mm, &work[l], &work[*n - 1 + l], &z__[l - * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); + zlasr_((char *)"R", (char *)"V", (char *)"B", n, &mm, &work[l], &work[*n - 1 + l], &z__[l * z_dim1 + 1], ldz, + (ftnlen)1, (ftnlen)1, (ftnlen)1); } - d__[l] -= p; e[l] = g; goto L40; - -/* Eigenvalue found. */ - -L80: + L80: d__[l] = p; - ++l; if (l <= lend) { goto L40; } goto L140; - } else { - -/* QR Iteration */ - -/* Look for small superdiagonal element. */ - -L90: + L90: if (l != lend) { lendp1 = lend + 1; i__1 = lendp1; for (m = l; m >= i__1; --m) { -/* Computing 2nd power */ d__2 = (d__1 = e[m - 1], abs(d__1)); tst = d__2 * d__2; - if (tst <= eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m - - 1], abs(d__2)) + safmin) { + if (tst <= + eps2 * (d__1 = d__[m], abs(d__1)) * (d__2 = d__[m - 1], abs(d__2)) + safmin) { goto L110; } -/* L100: */ } } - m = lend; - -L110: + L110: if (m > lend) { e[m - 1] = 0.; } @@ -533,19 +262,13 @@ L110: if (m == l) { goto L130; } - -/* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 */ -/* to compute its eigensystem. */ - if (m == l - 1) { if (icompz > 0) { - dlaev2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s) - ; + dlaev2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s); work[m] = c__; work[*n - 1 + m] = s; - zlasr_((char *)"R", (char *)"V", (char *)"F", n, &c__2, &work[m], &work[*n - 1 + m], & - z__[(l - 1) * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, - (ftnlen)1); + zlasr_((char *)"R", (char *)"V", (char *)"F", n, &c__2, &work[m], &work[*n - 1 + m], + &z__[(l - 1) * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); } else { dlae2_(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2); } @@ -558,24 +281,16 @@ L110: } goto L140; } - if (jtot == nmaxit) { goto L140; } ++jtot; - -/* Form shift. */ - g = (d__[l - 1] - p) / (e[l - 1] * 2.); r__ = dlapy2_(&g, &c_b41); g = d__[m] - p + e[l - 1] / (g + d_lmp_sign(&r__, &g)); - s = 1.; c__ = 1.; p = 0.; - -/* Inner loop */ - lm1 = l - 1; i__1 = lm1; for (i__ = m; i__ <= i__1; ++i__) { @@ -590,89 +305,53 @@ L110: p = s * r__; d__[i__] = g + p; g = c__ * r__ - b; - -/* If eigenvectors are desired, then save rotations. */ - if (icompz > 0) { work[i__] = c__; work[*n - 1 + i__] = s; } - -/* L120: */ } - -/* If eigenvectors are desired, then apply saved rotations. */ - if (icompz > 0) { mm = l - m + 1; - zlasr_((char *)"R", (char *)"V", (char *)"F", n, &mm, &work[m], &work[*n - 1 + m], &z__[m - * z_dim1 + 1], ldz, (ftnlen)1, (ftnlen)1, (ftnlen)1); + zlasr_((char *)"R", (char *)"V", (char *)"F", n, &mm, &work[m], &work[*n - 1 + m], &z__[m * z_dim1 + 1], ldz, + (ftnlen)1, (ftnlen)1, (ftnlen)1); } - d__[l] -= p; e[lm1] = g; goto L90; - -/* Eigenvalue found. */ - -L130: + L130: d__[l] = p; - --l; if (l >= lend) { goto L90; } goto L140; - } - -/* Undo scaling if necessary */ - L140: if (iscale == 1) { i__1 = lendsv - lsv + 1; - dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], - n, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv], n, info, (ftnlen)1); i__1 = lendsv - lsv; - dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n, info, (ftnlen)1); } else if (iscale == 2) { i__1 = lendsv - lsv + 1; - dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], - n, info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv], n, info, (ftnlen)1); i__1 = lendsv - lsv; - dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n, - info, (ftnlen)1); + dlascl_((char *)"G", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n, info, (ftnlen)1); } - -/* Check for no convergence to an eigenvalue after a total */ -/* of N*MAXIT iterations. */ - if (jtot == nmaxit) { i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { if (e[i__] != 0.) { ++(*info); } -/* L150: */ } return 0; } goto L10; - -/* Order eigenvalues and eigenvectors. */ - L160: if (icompz == 0) { - -/* Use Quick Sort */ - dlasrt_((char *)"I", n, &d__[1], info, (ftnlen)1); - } else { - -/* Use Selection Sort to minimize swaps of eigenvectors */ - i__1 = *n; for (ii = 2; ii <= i__1; ++ii) { i__ = ii - 1; @@ -684,23 +363,16 @@ L160: k = j; p = d__[j]; } -/* L170: */ } if (k != i__) { d__[k] = d__[i__]; d__[i__] = p; - zswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], - &c__1); + zswap_(n, &z__[i__ * z_dim1 + 1], &c__1, &z__[k * z_dim1 + 1], &c__1); } -/* L180: */ } } return 0; - -/* End of ZSTEQR */ - -} /* zsteqr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zswap.cpp b/lib/linalg/zswap.cpp index ff04833b04..1ead5a7262 100644 --- a/lib/linalg/zswap.cpp +++ b/lib/linalg/zswap.cpp @@ -1,134 +1,18 @@ -/* fortran/zswap.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZSWAP */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZSWAP(N,ZX,INCX,ZY,INCY) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,INCY,N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 ZX(*),ZY(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZSWAP interchanges two vectors. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > number of elements in input vector(s) */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] ZX */ -/* > \verbatim */ -/* > ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > storage spacing between elements of ZX */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] ZY */ -/* > \verbatim */ -/* > ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCY */ -/* > \verbatim */ -/* > INCY is INTEGER */ -/* > storage spacing between elements of ZY */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level1 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > jack dongarra, 3/11/78. */ -/* > modified 12/3/93, array(1) declarations changed to array(*) */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int zswap_(integer *n, doublecomplex *zx, integer *incx, - doublecomplex *zy, integer *incy) +int zswap_(integer *n, doublecomplex *zx, integer *incx, doublecomplex *zy, integer *incy) { - /* System generated locals */ integer i__1, i__2, i__3; - - /* Local variables */ integer i__, ix, iy; doublecomplex ztemp; - - -/* -- Reference BLAS level1 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ - /* Parameter adjustments */ --zy; --zx; - - /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { - -/* code for both increments equal to 1 */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__; @@ -140,10 +24,6 @@ extern "C" { zy[i__2].r = ztemp.r, zy[i__2].i = ztemp.i; } } else { - -/* code for unequal increments or equal increments not equal */ -/* to 1 */ - ix = 1; iy = 1; if (*incx < 0) { @@ -166,11 +46,7 @@ extern "C" { } } return 0; - -/* End of ZSWAP */ - -} /* zswap_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/ztpmv.cpp b/lib/linalg/ztpmv.cpp index 9e4a16df42..41c8602cea 100644 --- a/lib/linalg/ztpmv.cpp +++ b/lib/linalg/ztpmv.cpp @@ -1,218 +1,29 @@ -/* fortran/ztpmv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZTPMV */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,N */ -/* CHARACTER DIAG,TRANS,UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 AP(*),X(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZTPMV performs one of the matrix-vector operations */ -/* > */ -/* > x := A*x, or x := A**T*x, or x := A**H*x, */ -/* > */ -/* > where x is an n element vector and A is an n by n unit, or non-unit, */ -/* > upper or lower triangular matrix, supplied in packed form. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the matrix is an upper or */ -/* > lower triangular matrix as follows: */ -/* > */ -/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ -/* > */ -/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > On entry, TRANS specifies the operation to be performed as */ -/* > follows: */ -/* > */ -/* > TRANS = 'N' or 'n' x := A*x. */ -/* > */ -/* > TRANS = 'T' or 't' x := A**T*x. */ -/* > */ -/* > TRANS = 'C' or 'c' x := A**H*x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIAG */ -/* > \verbatim */ -/* > DIAG is CHARACTER*1 */ -/* > On entry, DIAG specifies whether or not A is unit */ -/* > triangular as follows: */ -/* > */ -/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ -/* > */ -/* > DIAG = 'N' or 'n' A is not assumed to be unit */ -/* > triangular. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] AP */ -/* > \verbatim */ -/* > AP is COMPLEX*16 array, dimension at least */ -/* > ( ( n*( n + 1 ) )/2 ). */ -/* > Before entry with UPLO = 'U' or 'u', the array AP must */ -/* > contain the upper triangular matrix packed sequentially, */ -/* > column by column, so that AP( 1 ) contains a( 1, 1 ), */ -/* > AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 ) */ -/* > respectively, and so on. */ -/* > Before entry with UPLO = 'L' or 'l', the array AP must */ -/* > contain the lower triangular matrix packed sequentially, */ -/* > column by column, so that AP( 1 ) contains a( 1, 1 ), */ -/* > AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 ) */ -/* > respectively, and so on. */ -/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ -/* > A are not referenced, but are assumed to be unity. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array X must contain the n */ -/* > element vector x. On exit, X is overwritten with the */ -/* > transformed vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int ztpmv_(char *uplo, char *trans, char *diag, integer *n, - doublecomplex *ap, doublecomplex *x, integer *incx, ftnlen uplo_len, - ftnlen trans_len, ftnlen diag_len) +int ztpmv_(char *uplo, char *trans, char *diag, integer *n, doublecomplex *ap, doublecomplex *x, + integer *incx, ftnlen uplo_len, ftnlen trans_len, ftnlen diag_len) { - /* System generated locals */ integer i__1, i__2, i__3, i__4, i__5; doublecomplex z__1, z__2, z__3; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j, k, kk, ix, jx, kx, info; doublecomplex temp; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); logical noconj, nounit; - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --x; --ap; - - /* Function Body */ info = 0; - if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 2; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { + } else if (!lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && + !lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1)) { info = 3; } else if (*n < 0) { info = 4; @@ -223,32 +34,17 @@ extern "C" { xerbla_((char *)"ZTPMV ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*n == 0) { return 0; } - noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); - -/* Set up the start point in X if the increment is not unity. This */ -/* will be ( N - 1 )*INCX too small for descending loops. */ - if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } - -/* Start the operations. In this version the elements of AP are */ -/* accessed sequentially with one pass through AP. */ - if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form x:= A*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { kk = 1; if (*incx == 1) { @@ -264,27 +60,22 @@ extern "C" { i__3 = i__; i__4 = i__; i__5 = k; - z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] - .i, z__2.i = temp.r * ap[i__5].i + temp.i - * ap[i__5].r; - z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + - z__2.i; + z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5].i, + z__2.i = temp.r * ap[i__5].i + temp.i * ap[i__5].r; + z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + z__2.i; x[i__3].r = z__1.r, x[i__3].i = z__1.i; ++k; -/* L10: */ } if (nounit) { i__2 = j; i__3 = j; i__4 = kk + j - 1; - z__1.r = x[i__3].r * ap[i__4].r - x[i__3].i * ap[ - i__4].i, z__1.i = x[i__3].r * ap[i__4].i - + x[i__3].i * ap[i__4].r; + z__1.r = x[i__3].r * ap[i__4].r - x[i__3].i * ap[i__4].i, + z__1.i = x[i__3].r * ap[i__4].i + x[i__3].i * ap[i__4].r; x[i__2].r = z__1.r, x[i__2].i = z__1.i; } } kk += j; -/* L20: */ } } else { jx = kx; @@ -300,28 +91,23 @@ extern "C" { i__3 = ix; i__4 = ix; i__5 = k; - z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] - .i, z__2.i = temp.r * ap[i__5].i + temp.i - * ap[i__5].r; - z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + - z__2.i; + z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5].i, + z__2.i = temp.r * ap[i__5].i + temp.i * ap[i__5].r; + z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + z__2.i; x[i__3].r = z__1.r, x[i__3].i = z__1.i; ix += *incx; -/* L30: */ } if (nounit) { i__2 = jx; i__3 = jx; i__4 = kk + j - 1; - z__1.r = x[i__3].r * ap[i__4].r - x[i__3].i * ap[ - i__4].i, z__1.i = x[i__3].r * ap[i__4].i - + x[i__3].i * ap[i__4].r; + z__1.r = x[i__3].r * ap[i__4].r - x[i__3].i * ap[i__4].i, + z__1.i = x[i__3].r * ap[i__4].i + x[i__3].i * ap[i__4].r; x[i__2].r = z__1.r, x[i__2].i = z__1.i; } } jx += *incx; kk += j; -/* L40: */ } } } else { @@ -338,27 +124,22 @@ extern "C" { i__2 = i__; i__3 = i__; i__4 = k; - z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4] - .i, z__2.i = temp.r * ap[i__4].i + temp.i - * ap[i__4].r; - z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + - z__2.i; + z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4].i, + z__2.i = temp.r * ap[i__4].i + temp.i * ap[i__4].r; + z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + z__2.i; x[i__2].r = z__1.r, x[i__2].i = z__1.i; --k; -/* L50: */ } if (nounit) { i__1 = j; i__2 = j; i__3 = kk - *n + j; - z__1.r = x[i__2].r * ap[i__3].r - x[i__2].i * ap[ - i__3].i, z__1.i = x[i__2].r * ap[i__3].i - + x[i__2].i * ap[i__3].r; + z__1.r = x[i__2].r * ap[i__3].r - x[i__2].i * ap[i__3].i, + z__1.i = x[i__2].r * ap[i__3].i + x[i__2].i * ap[i__3].r; x[i__1].r = z__1.r, x[i__1].i = z__1.i; } } kk -= *n - j + 1; -/* L60: */ } } else { kx += (*n - 1) * *incx; @@ -374,35 +155,27 @@ extern "C" { i__2 = ix; i__3 = ix; i__4 = k; - z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4] - .i, z__2.i = temp.r * ap[i__4].i + temp.i - * ap[i__4].r; - z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + - z__2.i; + z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4].i, + z__2.i = temp.r * ap[i__4].i + temp.i * ap[i__4].r; + z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + z__2.i; x[i__2].r = z__1.r, x[i__2].i = z__1.i; ix -= *incx; -/* L70: */ } if (nounit) { i__1 = jx; i__2 = jx; i__3 = kk - *n + j; - z__1.r = x[i__2].r * ap[i__3].r - x[i__2].i * ap[ - i__3].i, z__1.i = x[i__2].r * ap[i__3].i - + x[i__2].i * ap[i__3].r; + z__1.r = x[i__2].r * ap[i__3].r - x[i__2].i * ap[i__3].i, + z__1.i = x[i__2].r * ap[i__3].i + x[i__2].i * ap[i__3].r; x[i__1].r = z__1.r, x[i__1].i = z__1.i; } } jx -= *incx; kk -= *n - j + 1; -/* L80: */ } } } } else { - -/* Form x := A**T*x or x := A**H*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { kk = *n * (*n + 1) / 2; if (*incx == 1) { @@ -413,48 +186,39 @@ extern "C" { if (noconj) { if (nounit) { i__1 = kk; - z__1.r = temp.r * ap[i__1].r - temp.i * ap[i__1] - .i, z__1.i = temp.r * ap[i__1].i + temp.i - * ap[i__1].r; + z__1.r = temp.r * ap[i__1].r - temp.i * ap[i__1].i, + z__1.i = temp.r * ap[i__1].i + temp.i * ap[i__1].r; temp.r = z__1.r, temp.i = z__1.i; } for (i__ = j - 1; i__ >= 1; --i__) { i__1 = k; i__2 = i__; - z__2.r = ap[i__1].r * x[i__2].r - ap[i__1].i * x[ - i__2].i, z__2.i = ap[i__1].r * x[i__2].i - + ap[i__1].i * x[i__2].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.r = ap[i__1].r * x[i__2].r - ap[i__1].i * x[i__2].i, + z__2.i = ap[i__1].r * x[i__2].i + ap[i__1].i * x[i__2].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; --k; -/* L90: */ } } else { if (nounit) { d_lmp_cnjg(&z__2, &ap[kk]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; + z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } for (i__ = j - 1; i__ >= 1; --i__) { d_lmp_cnjg(&z__3, &ap[k]); i__1 = i__; z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, - z__2.i = z__3.r * x[i__1].i + z__3.i * x[ - i__1].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.i = z__3.r * x[i__1].i + z__3.i * x[i__1].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; --k; -/* L100: */ } } i__1 = j; x[i__1].r = temp.r, x[i__1].i = temp.i; kk -= j; -/* L110: */ } } else { jx = kx + (*n - 1) * *incx; @@ -465,9 +229,8 @@ extern "C" { if (noconj) { if (nounit) { i__1 = kk; - z__1.r = temp.r * ap[i__1].r - temp.i * ap[i__1] - .i, z__1.i = temp.r * ap[i__1].i + temp.i - * ap[i__1].r; + z__1.r = temp.r * ap[i__1].r - temp.i * ap[i__1].i, + z__1.i = temp.r * ap[i__1].i + temp.i * ap[i__1].r; temp.r = z__1.r, temp.i = z__1.i; } i__1 = kk - j + 1; @@ -475,20 +238,16 @@ extern "C" { ix -= *incx; i__2 = k; i__3 = ix; - z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[ - i__3].i, z__2.i = ap[i__2].r * x[i__3].i - + ap[i__2].i * x[i__3].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[i__3].i, + z__2.i = ap[i__2].r * x[i__3].i + ap[i__2].i * x[i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L120: */ } } else { if (nounit) { d_lmp_cnjg(&z__2, &ap[kk]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; + z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } i__1 = kk - j + 1; @@ -497,19 +256,15 @@ extern "C" { d_lmp_cnjg(&z__3, &ap[k]); i__2 = ix; z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, - z__2.i = z__3.r * x[i__2].i + z__3.i * x[ - i__2].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.i = z__3.r * x[i__2].i + z__3.i * x[i__2].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L130: */ } } i__1 = jx; x[i__1].r = temp.r, x[i__1].i = temp.i; jx -= *incx; kk -= j; -/* L140: */ } } } else { @@ -523,30 +278,25 @@ extern "C" { if (noconj) { if (nounit) { i__2 = kk; - z__1.r = temp.r * ap[i__2].r - temp.i * ap[i__2] - .i, z__1.i = temp.r * ap[i__2].i + temp.i - * ap[i__2].r; + z__1.r = temp.r * ap[i__2].r - temp.i * ap[i__2].i, + z__1.i = temp.r * ap[i__2].i + temp.i * ap[i__2].r; temp.r = z__1.r, temp.i = z__1.i; } i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { i__3 = k; i__4 = i__; - z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ - i__4].i, z__2.i = ap[i__3].r * x[i__4].i - + ap[i__3].i * x[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[i__4].i, + z__2.i = ap[i__3].r * x[i__4].i + ap[i__3].i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; ++k; -/* L150: */ } } else { if (nounit) { d_lmp_cnjg(&z__2, &ap[kk]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; + z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } i__2 = *n; @@ -554,19 +304,15 @@ extern "C" { d_lmp_cnjg(&z__3, &ap[k]); i__3 = i__; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[ - i__3].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; ++k; -/* L160: */ } } i__2 = j; x[i__2].r = temp.r, x[i__2].i = temp.i; kk += *n - j + 1; -/* L170: */ } } else { jx = kx; @@ -578,9 +324,8 @@ extern "C" { if (noconj) { if (nounit) { i__2 = kk; - z__1.r = temp.r * ap[i__2].r - temp.i * ap[i__2] - .i, z__1.i = temp.r * ap[i__2].i + temp.i - * ap[i__2].r; + z__1.r = temp.r * ap[i__2].r - temp.i * ap[i__2].i, + z__1.i = temp.r * ap[i__2].i + temp.i * ap[i__2].r; temp.r = z__1.r, temp.i = z__1.i; } i__2 = kk + *n - j; @@ -588,20 +333,16 @@ extern "C" { ix += *incx; i__3 = k; i__4 = ix; - z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ - i__4].i, z__2.i = ap[i__3].r * x[i__4].i - + ap[i__3].i * x[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[i__4].i, + z__2.i = ap[i__3].r * x[i__4].i + ap[i__3].i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L180: */ } } else { if (nounit) { d_lmp_cnjg(&z__2, &ap[kk]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; + z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } i__2 = kk + *n - j; @@ -610,30 +351,21 @@ extern "C" { d_lmp_cnjg(&z__3, &ap[k]); i__3 = ix; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[ - i__3].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L190: */ } } i__2 = jx; x[i__2].r = temp.r, x[i__2].i = temp.i; jx += *incx; kk += *n - j + 1; -/* L200: */ } } } } - return 0; - -/* End of ZTPMV */ - -} /* ztpmv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/ztpsv.cpp b/lib/linalg/ztpsv.cpp index a1bddbbeb9..483dcc4513 100644 --- a/lib/linalg/ztpsv.cpp +++ b/lib/linalg/ztpsv.cpp @@ -1,221 +1,30 @@ -/* fortran/ztpsv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZTPSV */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,N */ -/* CHARACTER DIAG,TRANS,UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 AP(*),X(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZTPSV solves one of the systems of equations */ -/* > */ -/* > A*x = b, or A**T*x = b, or A**H*x = b, */ -/* > */ -/* > where b and x are n element vectors and A is an n by n unit, or */ -/* > non-unit, upper or lower triangular matrix, supplied in packed form. */ -/* > */ -/* > No test for singularity or near-singularity is included in this */ -/* > routine. Such tests must be performed before calling this routine. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the matrix is an upper or */ -/* > lower triangular matrix as follows: */ -/* > */ -/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ -/* > */ -/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > On entry, TRANS specifies the equations to be solved as */ -/* > follows: */ -/* > */ -/* > TRANS = 'N' or 'n' A*x = b. */ -/* > */ -/* > TRANS = 'T' or 't' A**T*x = b. */ -/* > */ -/* > TRANS = 'C' or 'c' A**H*x = b. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIAG */ -/* > \verbatim */ -/* > DIAG is CHARACTER*1 */ -/* > On entry, DIAG specifies whether or not A is unit */ -/* > triangular as follows: */ -/* > */ -/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ -/* > */ -/* > DIAG = 'N' or 'n' A is not assumed to be unit */ -/* > triangular. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] AP */ -/* > \verbatim */ -/* > AP is COMPLEX*16 array, dimension at least */ -/* > ( ( n*( n + 1 ) )/2 ). */ -/* > Before entry with UPLO = 'U' or 'u', the array AP must */ -/* > contain the upper triangular matrix packed sequentially, */ -/* > column by column, so that AP( 1 ) contains a( 1, 1 ), */ -/* > AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 ) */ -/* > respectively, and so on. */ -/* > Before entry with UPLO = 'L' or 'l', the array AP must */ -/* > contain the lower triangular matrix packed sequentially, */ -/* > column by column, so that AP( 1 ) contains a( 1, 1 ), */ -/* > AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 ) */ -/* > respectively, and so on. */ -/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ -/* > A are not referenced, but are assumed to be unity. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array X must contain the n */ -/* > element right-hand side vector b. On exit, X is overwritten */ -/* > with the solution vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int ztpsv_(char *uplo, char *trans, char *diag, integer *n, - doublecomplex *ap, doublecomplex *x, integer *incx, ftnlen uplo_len, - ftnlen trans_len, ftnlen diag_len) +int ztpsv_(char *uplo, char *trans, char *diag, integer *n, doublecomplex *ap, doublecomplex *x, + integer *incx, ftnlen uplo_len, ftnlen trans_len, ftnlen diag_len) { - /* System generated locals */ integer i__1, i__2, i__3, i__4, i__5; doublecomplex z__1, z__2, z__3; - - /* Builtin functions */ - void z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *), d_lmp_cnjg( - doublecomplex *, doublecomplex *); - - /* Local variables */ + void z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *), + d_lmp_cnjg(doublecomplex *, doublecomplex *); integer i__, j, k, kk, ix, jx, kx, info; doublecomplex temp; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); logical noconj, nounit; - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --x; --ap; - - /* Function Body */ info = 0; - if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 2; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { + } else if (!lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && + !lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1)) { info = 3; } else if (*n < 0) { info = 4; @@ -226,32 +35,17 @@ extern "C" { xerbla_((char *)"ZTPSV ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*n == 0) { return 0; } - noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); - -/* Set up the start point in X if the increment is not unity. This */ -/* will be ( N - 1 )*INCX too small for descending loops. */ - if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } - -/* Start the operations. In this version the elements of AP are */ -/* accessed sequentially with one pass through AP. */ - if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form x := inv( A )*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { kk = *n * (*n + 1) / 2; if (*incx == 1) { @@ -270,18 +64,14 @@ extern "C" { i__1 = i__; i__2 = i__; i__3 = k; - z__2.r = temp.r * ap[i__3].r - temp.i * ap[i__3] - .i, z__2.i = temp.r * ap[i__3].i + temp.i - * ap[i__3].r; - z__1.r = x[i__2].r - z__2.r, z__1.i = x[i__2].i - - z__2.i; + z__2.r = temp.r * ap[i__3].r - temp.i * ap[i__3].i, + z__2.i = temp.r * ap[i__3].i + temp.i * ap[i__3].r; + z__1.r = x[i__2].r - z__2.r, z__1.i = x[i__2].i - z__2.i; x[i__1].r = z__1.r, x[i__1].i = z__1.i; --k; -/* L10: */ } } kk -= j; -/* L20: */ } } else { jx = kx + (*n - 1) * *incx; @@ -302,18 +92,14 @@ extern "C" { i__2 = ix; i__3 = ix; i__4 = k; - z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4] - .i, z__2.i = temp.r * ap[i__4].i + temp.i - * ap[i__4].r; - z__1.r = x[i__3].r - z__2.r, z__1.i = x[i__3].i - - z__2.i; + z__2.r = temp.r * ap[i__4].r - temp.i * ap[i__4].i, + z__2.i = temp.r * ap[i__4].i + temp.i * ap[i__4].r; + z__1.r = x[i__3].r - z__2.r, z__1.i = x[i__3].i - z__2.i; x[i__2].r = z__1.r, x[i__2].i = z__1.i; -/* L30: */ } } jx -= *incx; kk -= j; -/* L40: */ } } } else { @@ -336,18 +122,14 @@ extern "C" { i__3 = i__; i__4 = i__; i__5 = k; - z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] - .i, z__2.i = temp.r * ap[i__5].i + temp.i - * ap[i__5].r; - z__1.r = x[i__4].r - z__2.r, z__1.i = x[i__4].i - - z__2.i; + z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5].i, + z__2.i = temp.r * ap[i__5].i + temp.i * ap[i__5].r; + z__1.r = x[i__4].r - z__2.r, z__1.i = x[i__4].i - z__2.i; x[i__3].r = z__1.r, x[i__3].i = z__1.i; ++k; -/* L50: */ } } kk += *n - j + 1; -/* L60: */ } } else { jx = kx; @@ -369,25 +151,18 @@ extern "C" { i__3 = ix; i__4 = ix; i__5 = k; - z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5] - .i, z__2.i = temp.r * ap[i__5].i + temp.i - * ap[i__5].r; - z__1.r = x[i__4].r - z__2.r, z__1.i = x[i__4].i - - z__2.i; + z__2.r = temp.r * ap[i__5].r - temp.i * ap[i__5].i, + z__2.i = temp.r * ap[i__5].i + temp.i * ap[i__5].r; + z__1.r = x[i__4].r - z__2.r, z__1.i = x[i__4].i - z__2.i; x[i__3].r = z__1.r, x[i__3].i = z__1.i; -/* L70: */ } } jx += *incx; kk += *n - j + 1; -/* L80: */ } } } } else { - -/* Form x := inv( A**T )*x or x := inv( A**H )*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { kk = 1; if (*incx == 1) { @@ -401,14 +176,11 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { i__3 = k; i__4 = i__; - z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ - i__4].i, z__2.i = ap[i__3].r * x[i__4].i - + ap[i__3].i * x[i__4].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; + z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[i__4].i, + z__2.i = ap[i__3].r * x[i__4].i + ap[i__3].i * x[i__4].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; temp.r = z__1.r, temp.i = z__1.i; ++k; -/* L90: */ } if (nounit) { z_lmp_div(&z__1, &temp, &ap[kk + j - 1]); @@ -420,13 +192,10 @@ extern "C" { d_lmp_cnjg(&z__3, &ap[k]); i__3 = i__; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[ - i__3].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; temp.r = z__1.r, temp.i = z__1.i; ++k; -/* L100: */ } if (nounit) { d_lmp_cnjg(&z__2, &ap[kk + j - 1]); @@ -437,7 +206,6 @@ extern "C" { i__2 = j; x[i__2].r = temp.r, x[i__2].i = temp.i; kk += j; -/* L110: */ } } else { jx = kx; @@ -451,14 +219,11 @@ extern "C" { for (k = kk; k <= i__2; ++k) { i__3 = k; i__4 = ix; - z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[ - i__4].i, z__2.i = ap[i__3].r * x[i__4].i - + ap[i__3].i * x[i__4].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; + z__2.r = ap[i__3].r * x[i__4].r - ap[i__3].i * x[i__4].i, + z__2.i = ap[i__3].r * x[i__4].i + ap[i__3].i * x[i__4].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; temp.r = z__1.r, temp.i = z__1.i; ix += *incx; -/* L120: */ } if (nounit) { z_lmp_div(&z__1, &temp, &ap[kk + j - 1]); @@ -470,13 +235,10 @@ extern "C" { d_lmp_cnjg(&z__3, &ap[k]); i__3 = ix; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[ - i__3].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; temp.r = z__1.r, temp.i = z__1.i; ix += *incx; -/* L130: */ } if (nounit) { d_lmp_cnjg(&z__2, &ap[kk + j - 1]); @@ -488,7 +250,6 @@ extern "C" { x[i__2].r = temp.r, x[i__2].i = temp.i; jx += *incx; kk += j; -/* L140: */ } } } else { @@ -503,14 +264,11 @@ extern "C" { for (i__ = *n; i__ >= i__1; --i__) { i__2 = k; i__3 = i__; - z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[ - i__3].i, z__2.i = ap[i__2].r * x[i__3].i - + ap[i__2].i * x[i__3].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; + z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[i__3].i, + z__2.i = ap[i__2].r * x[i__3].i + ap[i__2].i * x[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; temp.r = z__1.r, temp.i = z__1.i; --k; -/* L150: */ } if (nounit) { z_lmp_div(&z__1, &temp, &ap[kk - *n + j]); @@ -522,13 +280,10 @@ extern "C" { d_lmp_cnjg(&z__3, &ap[k]); i__2 = i__; z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, - z__2.i = z__3.r * x[i__2].i + z__3.i * x[ - i__2].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; + z__2.i = z__3.r * x[i__2].i + z__3.i * x[i__2].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; temp.r = z__1.r, temp.i = z__1.i; --k; -/* L160: */ } if (nounit) { d_lmp_cnjg(&z__2, &ap[kk - *n + j]); @@ -539,7 +294,6 @@ extern "C" { i__1 = j; x[i__1].r = temp.r, x[i__1].i = temp.i; kk -= *n - j + 1; -/* L170: */ } } else { kx += (*n - 1) * *incx; @@ -553,14 +307,11 @@ extern "C" { for (k = kk; k >= i__1; --k) { i__2 = k; i__3 = ix; - z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[ - i__3].i, z__2.i = ap[i__2].r * x[i__3].i - + ap[i__2].i * x[i__3].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; + z__2.r = ap[i__2].r * x[i__3].r - ap[i__2].i * x[i__3].i, + z__2.i = ap[i__2].r * x[i__3].i + ap[i__2].i * x[i__3].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; temp.r = z__1.r, temp.i = z__1.i; ix -= *incx; -/* L180: */ } if (nounit) { z_lmp_div(&z__1, &temp, &ap[kk - *n + j]); @@ -572,13 +323,10 @@ extern "C" { d_lmp_cnjg(&z__3, &ap[k]); i__2 = ix; z__2.r = z__3.r * x[i__2].r - z__3.i * x[i__2].i, - z__2.i = z__3.r * x[i__2].i + z__3.i * x[ - i__2].r; - z__1.r = temp.r - z__2.r, z__1.i = temp.i - - z__2.i; + z__2.i = z__3.r * x[i__2].i + z__3.i * x[i__2].r; + z__1.r = temp.r - z__2.r, z__1.i = temp.i - z__2.i; temp.r = z__1.r, temp.i = z__1.i; ix -= *incx; -/* L190: */ } if (nounit) { d_lmp_cnjg(&z__2, &ap[kk - *n + j]); @@ -590,18 +338,12 @@ extern "C" { x[i__1].r = temp.r, x[i__1].i = temp.i; jx -= *incx; kk -= *n - j + 1; -/* L200: */ } } } } - return 0; - -/* End of ZTPSV */ - -} /* ztpsv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/ztptri.cpp b/lib/linalg/ztptri.cpp index 29377adc03..86129d42d3 100644 --- a/lib/linalg/ztptri.cpp +++ b/lib/linalg/ztptri.cpp @@ -1,200 +1,32 @@ -/* fortran/ztptri.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - -static doublecomplex c_b1 = {1.,0.}; +static doublecomplex c_b1 = {1., 0.}; static integer c__1 = 1; - -/* > \brief \b ZTPTRI */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZTPTRI + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZTPTRI( UPLO, DIAG, N, AP, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER DIAG, UPLO */ -/* INTEGER INFO, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 AP( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZTPTRI computes the inverse of a complex upper or lower triangular */ -/* > matrix A stored in packed format. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': A is upper triangular; */ -/* > = 'L': A is lower triangular. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIAG */ -/* > \verbatim */ -/* > DIAG is CHARACTER*1 */ -/* > = 'N': A is non-unit triangular; */ -/* > = 'U': A is unit triangular. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix A. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] AP */ -/* > \verbatim */ -/* > AP is COMPLEX*16 array, dimension (N*(N+1)/2) */ -/* > On entry, the upper or lower triangular matrix A, stored */ -/* > columnwise in a linear array. The j-th column of A is stored */ -/* > in the array AP as follows: */ -/* > if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; */ -/* > if UPLO = 'L', AP(i + (j-1)*((2*n-j)/2) = A(i,j) for j<=i<=n. */ -/* > See below for further details. */ -/* > On exit, the (triangular) inverse of the original matrix, in */ -/* > the same packed storage format. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > > 0: if INFO = i, A(i,i) is exactly zero. The triangular */ -/* > matrix is singular and its inverse can not be computed. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > A triangular matrix A can be transferred to packed storage using one */ -/* > of the following program segments: */ -/* > */ -/* > UPLO = 'U': UPLO = 'L': */ -/* > */ -/* > JC = 1 JC = 1 */ -/* > DO 2 J = 1, N DO 2 J = 1, N */ -/* > DO 1 I = 1, J DO 1 I = J, N */ -/* > AP(JC+I-1) = A(I,J) AP(JC+I-J) = A(I,J) */ -/* > 1 CONTINUE 1 CONTINUE */ -/* > JC = JC + J JC = JC + N - J + 1 */ -/* > 2 CONTINUE 2 CONTINUE */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int ztptri_(char *uplo, char *diag, integer *n, - doublecomplex *ap, integer *info, ftnlen uplo_len, ftnlen diag_len) +int ztptri_(char *uplo, char *diag, integer *n, doublecomplex *ap, integer *info, ftnlen uplo_len, + ftnlen diag_len) { - /* System generated locals */ integer i__1, i__2; doublecomplex z__1; - - /* Builtin functions */ void z_lmp_div(doublecomplex *, doublecomplex *, doublecomplex *); - - /* Local variables */ integer j, jc, jj; doublecomplex ajj; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int zscal_(integer *, doublecomplex *, - doublecomplex *, integer *); + extern int zscal_(integer *, doublecomplex *, doublecomplex *, integer *); logical upper; - extern /* Subroutine */ int ztpmv_(char *, char *, char *, integer *, - doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); + extern int ztpmv_(char *, char *, char *, integer *, doublecomplex *, doublecomplex *, + integer *, ftnlen, ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); integer jclast; logical nounit; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ --ap; - - /* Function Body */ *info = 0; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! nounit && ! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { + } else if (!nounit && !lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*n < 0) { *info = -3; @@ -204,9 +36,6 @@ f"> */ xerbla_((char *)"ZTPTRI", &i__1, (ftnlen)6); return 0; } - -/* Check for singularity if non-unit. */ - if (nounit) { if (upper) { jj = 0; @@ -217,7 +46,6 @@ f"> */ if (ap[i__2].r == 0. && ap[i__2].i == 0.) { return 0; } -/* L10: */ } } else { jj = 1; @@ -228,16 +56,11 @@ f"> */ return 0; } jj = jj + *n - *info + 1; -/* L20: */ } } *info = 0; } - if (upper) { - -/* Compute inverse of upper triangular matrix. */ - jc = 1; i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -252,22 +75,14 @@ f"> */ z__1.r = -1., z__1.i = -0.; ajj.r = z__1.r, ajj.i = z__1.i; } - -/* Compute elements 1:j-1 of j-th column. */ - i__2 = j - 1; - ztpmv_((char *)"Upper", (char *)"No transpose", diag, &i__2, &ap[1], &ap[jc], & - c__1, (ftnlen)5, (ftnlen)12, (ftnlen)1); + ztpmv_((char *)"Upper", (char *)"No transpose", diag, &i__2, &ap[1], &ap[jc], &c__1, (ftnlen)5, + (ftnlen)12, (ftnlen)1); i__2 = j - 1; zscal_(&i__2, &ajj, &ap[jc], &c__1); jc += j; -/* L30: */ } - } else { - -/* Compute inverse of lower triangular matrix. */ - jc = *n * (*n + 1) / 2; for (j = *n; j >= 1; --j) { if (nounit) { @@ -282,27 +97,18 @@ f"> */ ajj.r = z__1.r, ajj.i = z__1.i; } if (j < *n) { - -/* Compute elements j+1:n of j-th column. */ - i__1 = *n - j; - ztpmv_((char *)"Lower", (char *)"No transpose", diag, &i__1, &ap[jclast], &ap[ - jc + 1], &c__1, (ftnlen)5, (ftnlen)12, (ftnlen)1); + ztpmv_((char *)"Lower", (char *)"No transpose", diag, &i__1, &ap[jclast], &ap[jc + 1], &c__1, + (ftnlen)5, (ftnlen)12, (ftnlen)1); i__1 = *n - j; zscal_(&i__1, &ajj, &ap[jc + 1], &c__1); } jclast = jc; jc = jc - *n + j - 2; -/* L40: */ } } - return 0; - -/* End of ZTPTRI */ - -} /* ztptri_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/ztrmm.cpp b/lib/linalg/ztrmm.cpp index a44eec9bb1..579080dce5 100644 --- a/lib/linalg/ztrmm.cpp +++ b/lib/linalg/ztrmm.cpp @@ -1,252 +1,28 @@ -/* fortran/ztrmm.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZTRMM */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) */ - -/* .. Scalar Arguments .. */ -/* COMPLEX*16 ALPHA */ -/* INTEGER LDA,LDB,M,N */ -/* CHARACTER DIAG,SIDE,TRANSA,UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A(LDA,*),B(LDB,*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZTRMM performs one of the matrix-matrix operations */ -/* > */ -/* > B := alpha*op( A )*B, or B := alpha*B*op( A ) */ -/* > */ -/* > where alpha is a scalar, B is an m by n matrix, A is a unit, or */ -/* > non-unit, upper or lower triangular matrix and op( A ) is one of */ -/* > */ -/* > op( A ) = A or op( A ) = A**T or op( A ) = A**H. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > On entry, SIDE specifies whether op( A ) multiplies B from */ -/* > the left or right as follows: */ -/* > */ -/* > SIDE = 'L' or 'l' B := alpha*op( A )*B. */ -/* > */ -/* > SIDE = 'R' or 'r' B := alpha*B*op( A ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the matrix A is an upper or */ -/* > lower triangular matrix as follows: */ -/* > */ -/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ -/* > */ -/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANSA */ -/* > \verbatim */ -/* > TRANSA is CHARACTER*1 */ -/* > On entry, TRANSA specifies the form of op( A ) to be used in */ -/* > the matrix multiplication as follows: */ -/* > */ -/* > TRANSA = 'N' or 'n' op( A ) = A. */ -/* > */ -/* > TRANSA = 'T' or 't' op( A ) = A**T. */ -/* > */ -/* > TRANSA = 'C' or 'c' op( A ) = A**H. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIAG */ -/* > \verbatim */ -/* > DIAG is CHARACTER*1 */ -/* > On entry, DIAG specifies whether or not A is unit triangular */ -/* > as follows: */ -/* > */ -/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ -/* > */ -/* > DIAG = 'N' or 'n' A is not assumed to be unit */ -/* > triangular. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > On entry, M specifies the number of rows of B. M must be at */ -/* > least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the number of columns of B. N must be */ -/* > at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] ALPHA */ -/* > \verbatim */ -/* > ALPHA is COMPLEX*16 */ -/* > On entry, ALPHA specifies the scalar alpha. When alpha is */ -/* > zero then A is not referenced and B need not be set before */ -/* > entry. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension ( LDA, k ), where k is m */ -/* > when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. */ -/* > Before entry with UPLO = 'U' or 'u', the leading k by k */ -/* > upper triangular part of the array A must contain the upper */ -/* > triangular matrix and the strictly lower triangular part of */ -/* > A is not referenced. */ -/* > Before entry with UPLO = 'L' or 'l', the leading k by k */ -/* > lower triangular part of the array A must contain the lower */ -/* > triangular matrix and the strictly upper triangular part of */ -/* > A is not referenced. */ -/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ -/* > A are not referenced either, but are assumed to be unity. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. When SIDE = 'L' or 'l' then */ -/* > LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' */ -/* > then LDA must be at least max( 1, n ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] B */ -/* > \verbatim */ -/* > B is COMPLEX*16 array, dimension ( LDB, N ). */ -/* > Before entry, the leading m by n part of the array B must */ -/* > contain the matrix B, and on exit is overwritten by the */ -/* > transformed matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDB */ -/* > \verbatim */ -/* > LDB is INTEGER */ -/* > On entry, LDB specifies the first dimension of B as declared */ -/* > in the calling (sub) program. LDB must be at least */ -/* > max( 1, m ). */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level3 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 3 Blas routine. */ -/* > */ -/* > -- Written on 8-February-1989. */ -/* > Jack Dongarra, Argonne National Laboratory. */ -/* > Iain Duff, AERE Harwell. */ -/* > Jeremy Du Croz, Numerical Algorithms Group Ltd. */ -/* > Sven Hammarling, Numerical Algorithms Group Ltd. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int ztrmm_(char *side, char *uplo, char *transa, char *diag, - integer *m, integer *n, doublecomplex *alpha, doublecomplex *a, - integer *lda, doublecomplex *b, integer *ldb, ftnlen side_len, ftnlen - uplo_len, ftnlen transa_len, ftnlen diag_len) +int ztrmm_(char *side, char *uplo, char *transa, char *diag, integer *m, integer *n, + doublecomplex *alpha, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + ftnlen side_len, ftnlen uplo_len, ftnlen transa_len, ftnlen diag_len) { - /* System generated locals */ - integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4, i__5, - i__6; + integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3, i__4, i__5, i__6; doublecomplex z__1, z__2, z__3; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j, k, info; doublecomplex temp; logical lside; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nrowa; logical upper; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); logical noconj, nounit; - - -/* -- Reference BLAS level3 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. Parameters .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; b_dim1 = *ldb; b_offset = 1 + b_dim1; b -= b_offset; - - /* Function Body */ lside = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); if (lside) { nrowa = *m; @@ -256,41 +32,34 @@ extern "C" { noconj = lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1); nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - info = 0; - if (! lside && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!lside && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + } else if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 2; - } else if (! lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(transa, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { + } else if (!lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(transa, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(transa, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 3; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { + } else if (!lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && + !lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1)) { info = 4; } else if (*m < 0) { info = 5; } else if (*n < 0) { info = 6; - } else if (*lda < max(1,nrowa)) { + } else if (*lda < max(1, nrowa)) { info = 9; - } else if (*ldb < max(1,*m)) { + } else if (*ldb < max(1, *m)) { info = 11; } if (info != 0) { xerbla_((char *)"ZTRMM ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*m == 0 || *n == 0) { return 0; } - -/* And when alpha.eq.zero. */ - if (alpha->r == 0. && alpha->i == 0.) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -298,20 +67,12 @@ extern "C" { for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * b_dim1; b[i__3].r = 0., b[i__3].i = 0.; -/* L10: */ } -/* L20: */ } return 0; } - -/* Start the operations. */ - if (lside) { if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form B := alpha*A*B. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -320,36 +81,29 @@ extern "C" { i__3 = k + j * b_dim1; if (b[i__3].r != 0. || b[i__3].i != 0.) { i__3 = k + j * b_dim1; - z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3] - .i, z__1.i = alpha->r * b[i__3].i + - alpha->i * b[i__3].r; + z__1.r = alpha->r * b[i__3].r - alpha->i * b[i__3].i, + z__1.i = alpha->r * b[i__3].i + alpha->i * b[i__3].r; temp.r = z__1.r, temp.i = z__1.i; i__3 = k - 1; for (i__ = 1; i__ <= i__3; ++i__) { i__4 = i__ + j * b_dim1; i__5 = i__ + j * b_dim1; i__6 = i__ + k * a_dim1; - z__2.r = temp.r * a[i__6].r - temp.i * a[i__6] - .i, z__2.i = temp.r * a[i__6].i + - temp.i * a[i__6].r; - z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5] - .i + z__2.i; + z__2.r = temp.r * a[i__6].r - temp.i * a[i__6].i, + z__2.i = temp.r * a[i__6].i + temp.i * a[i__6].r; + z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5].i + z__2.i; b[i__4].r = z__1.r, b[i__4].i = z__1.i; -/* L30: */ } if (nounit) { i__3 = k + k * a_dim1; - z__1.r = temp.r * a[i__3].r - temp.i * a[i__3] - .i, z__1.i = temp.r * a[i__3].i + - temp.i * a[i__3].r; + z__1.r = temp.r * a[i__3].r - temp.i * a[i__3].i, + z__1.i = temp.r * a[i__3].i + temp.i * a[i__3].r; temp.r = z__1.r, temp.i = z__1.i; } i__3 = k + j * b_dim1; b[i__3].r = temp.r, b[i__3].i = temp.i; } -/* L40: */ } -/* L50: */ } } else { i__1 = *n; @@ -358,9 +112,8 @@ extern "C" { i__2 = k + j * b_dim1; if (b[i__2].r != 0. || b[i__2].i != 0.) { i__2 = k + j * b_dim1; - z__1.r = alpha->r * b[i__2].r - alpha->i * b[i__2] - .i, z__1.i = alpha->r * b[i__2].i + - alpha->i * b[i__2].r; + z__1.r = alpha->r * b[i__2].r - alpha->i * b[i__2].i, + z__1.i = alpha->r * b[i__2].i + alpha->i * b[i__2].r; temp.r = z__1.r, temp.i = z__1.i; i__2 = k + j * b_dim1; b[i__2].r = temp.r, b[i__2].i = temp.i; @@ -368,9 +121,8 @@ extern "C" { i__2 = k + j * b_dim1; i__3 = k + j * b_dim1; i__4 = k + k * a_dim1; - z__1.r = b[i__3].r * a[i__4].r - b[i__3].i * - a[i__4].i, z__1.i = b[i__3].r * a[ - i__4].i + b[i__3].i * a[i__4].r; + z__1.r = b[i__3].r * a[i__4].r - b[i__3].i * a[i__4].i, + z__1.i = b[i__3].r * a[i__4].i + b[i__3].i * a[i__4].r; b[i__2].r = z__1.r, b[i__2].i = z__1.i; } i__2 = *m; @@ -378,24 +130,16 @@ extern "C" { i__3 = i__ + j * b_dim1; i__4 = i__ + j * b_dim1; i__5 = i__ + k * a_dim1; - z__2.r = temp.r * a[i__5].r - temp.i * a[i__5] - .i, z__2.i = temp.r * a[i__5].i + - temp.i * a[i__5].r; - z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4] - .i + z__2.i; + z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, + z__2.i = temp.r * a[i__5].i + temp.i * a[i__5].r; + z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4].i + z__2.i; b[i__3].r = z__1.r, b[i__3].i = z__1.i; -/* L60: */ } } -/* L70: */ } -/* L80: */ } } } else { - -/* Form B := alpha*A**T*B or B := alpha*A**H*B. */ - if (upper) { i__1 = *n; for (j = 1; j <= i__1; ++j) { @@ -405,52 +149,41 @@ extern "C" { if (noconj) { if (nounit) { i__2 = i__ + i__ * a_dim1; - z__1.r = temp.r * a[i__2].r - temp.i * a[i__2] - .i, z__1.i = temp.r * a[i__2].i + - temp.i * a[i__2].r; + z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, + z__1.i = temp.r * a[i__2].i + temp.i * a[i__2].r; temp.r = z__1.r, temp.i = z__1.i; } i__2 = i__ - 1; for (k = 1; k <= i__2; ++k) { i__3 = k + i__ * a_dim1; i__4 = k + j * b_dim1; - z__2.r = a[i__3].r * b[i__4].r - a[i__3].i * - b[i__4].i, z__2.i = a[i__3].r * b[ - i__4].i + a[i__3].i * b[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.r = a[i__3].r * b[i__4].r - a[i__3].i * b[i__4].i, + z__2.i = a[i__3].r * b[i__4].i + a[i__3].i * b[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L90: */ } } else { if (nounit) { d_lmp_cnjg(&z__2, &a[i__ + i__ * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; + z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } i__2 = i__ - 1; for (k = 1; k <= i__2; ++k) { d_lmp_cnjg(&z__3, &a[k + i__ * a_dim1]); i__3 = k + j * b_dim1; - z__2.r = z__3.r * b[i__3].r - z__3.i * b[i__3] - .i, z__2.i = z__3.r * b[i__3].i + - z__3.i * b[i__3].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.r = z__3.r * b[i__3].r - z__3.i * b[i__3].i, + z__2.i = z__3.r * b[i__3].i + z__3.i * b[i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L100: */ } } i__2 = i__ + j * b_dim1; z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; + z__1.i = alpha->r * temp.i + alpha->i * temp.r; b[i__2].r = z__1.r, b[i__2].i = z__1.i; -/* L110: */ } -/* L120: */ } } else { i__1 = *n; @@ -462,68 +195,53 @@ extern "C" { if (noconj) { if (nounit) { i__3 = i__ + i__ * a_dim1; - z__1.r = temp.r * a[i__3].r - temp.i * a[i__3] - .i, z__1.i = temp.r * a[i__3].i + - temp.i * a[i__3].r; + z__1.r = temp.r * a[i__3].r - temp.i * a[i__3].i, + z__1.i = temp.r * a[i__3].i + temp.i * a[i__3].r; temp.r = z__1.r, temp.i = z__1.i; } i__3 = *m; for (k = i__ + 1; k <= i__3; ++k) { i__4 = k + i__ * a_dim1; i__5 = k + j * b_dim1; - z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * - b[i__5].i, z__2.i = a[i__4].r * b[ - i__5].i + a[i__4].i * b[i__5].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.r = a[i__4].r * b[i__5].r - a[i__4].i * b[i__5].i, + z__2.i = a[i__4].r * b[i__5].i + a[i__4].i * b[i__5].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L130: */ } } else { if (nounit) { d_lmp_cnjg(&z__2, &a[i__ + i__ * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; + z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } i__3 = *m; for (k = i__ + 1; k <= i__3; ++k) { d_lmp_cnjg(&z__3, &a[k + i__ * a_dim1]); i__4 = k + j * b_dim1; - z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4] - .i, z__2.i = z__3.r * b[i__4].i + - z__3.i * b[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.r = z__3.r * b[i__4].r - z__3.i * b[i__4].i, + z__2.i = z__3.r * b[i__4].i + z__3.i * b[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L140: */ } } i__3 = i__ + j * b_dim1; z__1.r = alpha->r * temp.r - alpha->i * temp.i, - z__1.i = alpha->r * temp.i + alpha->i * - temp.r; + z__1.i = alpha->r * temp.i + alpha->i * temp.r; b[i__3].r = z__1.r, b[i__3].i = z__1.i; -/* L150: */ } -/* L160: */ } } } } else { if (lsame_(transa, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form B := alpha*B*A. */ - if (upper) { for (j = *n; j >= 1; --j) { temp.r = alpha->r, temp.i = alpha->i; if (nounit) { i__1 = j + j * a_dim1; z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, - z__1.i = temp.r * a[i__1].i + temp.i * a[i__1] - .r; + z__1.i = temp.r * a[i__1].i + temp.i * a[i__1].r; temp.r = z__1.r, temp.i = z__1.i; } i__1 = *m; @@ -531,37 +249,29 @@ extern "C" { i__2 = i__ + j * b_dim1; i__3 = i__ + j * b_dim1; z__1.r = temp.r * b[i__3].r - temp.i * b[i__3].i, - z__1.i = temp.r * b[i__3].i + temp.i * b[i__3] - .r; + z__1.i = temp.r * b[i__3].i + temp.i * b[i__3].r; b[i__2].r = z__1.r, b[i__2].i = z__1.i; -/* L170: */ } i__1 = j - 1; for (k = 1; k <= i__1; ++k) { i__2 = k + j * a_dim1; if (a[i__2].r != 0. || a[i__2].i != 0.) { i__2 = k + j * a_dim1; - z__1.r = alpha->r * a[i__2].r - alpha->i * a[i__2] - .i, z__1.i = alpha->r * a[i__2].i + - alpha->i * a[i__2].r; + z__1.r = alpha->r * a[i__2].r - alpha->i * a[i__2].i, + z__1.i = alpha->r * a[i__2].i + alpha->i * a[i__2].r; temp.r = z__1.r, temp.i = z__1.i; i__2 = *m; for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * b_dim1; i__4 = i__ + j * b_dim1; i__5 = i__ + k * b_dim1; - z__2.r = temp.r * b[i__5].r - temp.i * b[i__5] - .i, z__2.i = temp.r * b[i__5].i + - temp.i * b[i__5].r; - z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4] - .i + z__2.i; + z__2.r = temp.r * b[i__5].r - temp.i * b[i__5].i, + z__2.i = temp.r * b[i__5].i + temp.i * b[i__5].r; + z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4].i + z__2.i; b[i__3].r = z__1.r, b[i__3].i = z__1.i; -/* L180: */ } } -/* L190: */ } -/* L200: */ } } else { i__1 = *n; @@ -570,8 +280,7 @@ extern "C" { if (nounit) { i__2 = j + j * a_dim1; z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, - z__1.i = temp.r * a[i__2].i + temp.i * a[i__2] - .r; + z__1.i = temp.r * a[i__2].i + temp.i * a[i__2].r; temp.r = z__1.r, temp.i = z__1.i; } i__2 = *m; @@ -579,43 +288,32 @@ extern "C" { i__3 = i__ + j * b_dim1; i__4 = i__ + j * b_dim1; z__1.r = temp.r * b[i__4].r - temp.i * b[i__4].i, - z__1.i = temp.r * b[i__4].i + temp.i * b[i__4] - .r; + z__1.i = temp.r * b[i__4].i + temp.i * b[i__4].r; b[i__3].r = z__1.r, b[i__3].i = z__1.i; -/* L210: */ } i__2 = *n; for (k = j + 1; k <= i__2; ++k) { i__3 = k + j * a_dim1; if (a[i__3].r != 0. || a[i__3].i != 0.) { i__3 = k + j * a_dim1; - z__1.r = alpha->r * a[i__3].r - alpha->i * a[i__3] - .i, z__1.i = alpha->r * a[i__3].i + - alpha->i * a[i__3].r; + z__1.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, + z__1.i = alpha->r * a[i__3].i + alpha->i * a[i__3].r; temp.r = z__1.r, temp.i = z__1.i; i__3 = *m; for (i__ = 1; i__ <= i__3; ++i__) { i__4 = i__ + j * b_dim1; i__5 = i__ + j * b_dim1; i__6 = i__ + k * b_dim1; - z__2.r = temp.r * b[i__6].r - temp.i * b[i__6] - .i, z__2.i = temp.r * b[i__6].i + - temp.i * b[i__6].r; - z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5] - .i + z__2.i; + z__2.r = temp.r * b[i__6].r - temp.i * b[i__6].i, + z__2.i = temp.r * b[i__6].i + temp.i * b[i__6].r; + z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5].i + z__2.i; b[i__4].r = z__1.r, b[i__4].i = z__1.i; -/* L220: */ } } -/* L230: */ } -/* L240: */ } } } else { - -/* Form B := alpha*B*A**T or B := alpha*B*A**H. */ - if (upper) { i__1 = *n; for (k = 1; k <= i__1; ++k) { @@ -625,15 +323,13 @@ extern "C" { if (a[i__3].r != 0. || a[i__3].i != 0.) { if (noconj) { i__3 = j + k * a_dim1; - z__1.r = alpha->r * a[i__3].r - alpha->i * a[ - i__3].i, z__1.i = alpha->r * a[i__3] - .i + alpha->i * a[i__3].r; + z__1.r = alpha->r * a[i__3].r - alpha->i * a[i__3].i, + z__1.i = alpha->r * a[i__3].i + alpha->i * a[i__3].r; temp.r = z__1.r, temp.i = z__1.i; } else { d_lmp_cnjg(&z__2, &a[j + k * a_dim1]); - z__1.r = alpha->r * z__2.r - alpha->i * - z__2.i, z__1.i = alpha->r * z__2.i + - alpha->i * z__2.r; + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } i__3 = *m; @@ -641,30 +337,24 @@ extern "C" { i__4 = i__ + j * b_dim1; i__5 = i__ + j * b_dim1; i__6 = i__ + k * b_dim1; - z__2.r = temp.r * b[i__6].r - temp.i * b[i__6] - .i, z__2.i = temp.r * b[i__6].i + - temp.i * b[i__6].r; - z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5] - .i + z__2.i; + z__2.r = temp.r * b[i__6].r - temp.i * b[i__6].i, + z__2.i = temp.r * b[i__6].i + temp.i * b[i__6].r; + z__1.r = b[i__5].r + z__2.r, z__1.i = b[i__5].i + z__2.i; b[i__4].r = z__1.r, b[i__4].i = z__1.i; -/* L250: */ } } -/* L260: */ } temp.r = alpha->r, temp.i = alpha->i; if (nounit) { if (noconj) { i__2 = k + k * a_dim1; z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, - z__1.i = temp.r * a[i__2].i + temp.i * a[ - i__2].r; + z__1.i = temp.r * a[i__2].i + temp.i * a[i__2].r; temp.r = z__1.r, temp.i = z__1.i; } else { d_lmp_cnjg(&z__2, &a[k + k * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; + z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } } @@ -674,13 +364,10 @@ extern "C" { i__3 = i__ + k * b_dim1; i__4 = i__ + k * b_dim1; z__1.r = temp.r * b[i__4].r - temp.i * b[i__4].i, - z__1.i = temp.r * b[i__4].i + temp.i * b[ - i__4].r; + z__1.i = temp.r * b[i__4].i + temp.i * b[i__4].r; b[i__3].r = z__1.r, b[i__3].i = z__1.i; -/* L270: */ } } -/* L280: */ } } else { for (k = *n; k >= 1; --k) { @@ -690,15 +377,13 @@ extern "C" { if (a[i__2].r != 0. || a[i__2].i != 0.) { if (noconj) { i__2 = j + k * a_dim1; - z__1.r = alpha->r * a[i__2].r - alpha->i * a[ - i__2].i, z__1.i = alpha->r * a[i__2] - .i + alpha->i * a[i__2].r; + z__1.r = alpha->r * a[i__2].r - alpha->i * a[i__2].i, + z__1.i = alpha->r * a[i__2].i + alpha->i * a[i__2].r; temp.r = z__1.r, temp.i = z__1.i; } else { d_lmp_cnjg(&z__2, &a[j + k * a_dim1]); - z__1.r = alpha->r * z__2.r - alpha->i * - z__2.i, z__1.i = alpha->r * z__2.i + - alpha->i * z__2.r; + z__1.r = alpha->r * z__2.r - alpha->i * z__2.i, + z__1.i = alpha->r * z__2.i + alpha->i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } i__2 = *m; @@ -706,30 +391,24 @@ extern "C" { i__3 = i__ + j * b_dim1; i__4 = i__ + j * b_dim1; i__5 = i__ + k * b_dim1; - z__2.r = temp.r * b[i__5].r - temp.i * b[i__5] - .i, z__2.i = temp.r * b[i__5].i + - temp.i * b[i__5].r; - z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4] - .i + z__2.i; + z__2.r = temp.r * b[i__5].r - temp.i * b[i__5].i, + z__2.i = temp.r * b[i__5].i + temp.i * b[i__5].r; + z__1.r = b[i__4].r + z__2.r, z__1.i = b[i__4].i + z__2.i; b[i__3].r = z__1.r, b[i__3].i = z__1.i; -/* L290: */ } } -/* L300: */ } temp.r = alpha->r, temp.i = alpha->i; if (nounit) { if (noconj) { i__1 = k + k * a_dim1; z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, - z__1.i = temp.r * a[i__1].i + temp.i * a[ - i__1].r; + z__1.i = temp.r * a[i__1].i + temp.i * a[i__1].r; temp.r = z__1.r, temp.i = z__1.i; } else { d_lmp_cnjg(&z__2, &a[k + k * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; + z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } } @@ -739,24 +418,16 @@ extern "C" { i__2 = i__ + k * b_dim1; i__3 = i__ + k * b_dim1; z__1.r = temp.r * b[i__3].r - temp.i * b[i__3].i, - z__1.i = temp.r * b[i__3].i + temp.i * b[ - i__3].r; + z__1.i = temp.r * b[i__3].i + temp.i * b[i__3].r; b[i__2].r = z__1.r, b[i__2].i = z__1.i; -/* L310: */ } } -/* L320: */ } } } } - return 0; - -/* End of ZTRMM */ - -} /* ztrmm_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/ztrmv.cpp b/lib/linalg/ztrmv.cpp index 9d9877638f..dff4c36ef6 100644 --- a/lib/linalg/ztrmv.cpp +++ b/lib/linalg/ztrmv.cpp @@ -1,229 +1,35 @@ -/* fortran/ztrmv.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZTRMV */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INCX,LDA,N */ -/* CHARACTER DIAG,TRANS,UPLO */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A(LDA,*),X(*) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZTRMV performs one of the matrix-vector operations */ -/* > */ -/* > x := A*x, or x := A**T*x, or x := A**H*x, */ -/* > */ -/* > where x is an n element vector and A is an n by n unit, or non-unit, */ -/* > upper or lower triangular matrix. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > On entry, UPLO specifies whether the matrix is an upper or */ -/* > lower triangular matrix as follows: */ -/* > */ -/* > UPLO = 'U' or 'u' A is an upper triangular matrix. */ -/* > */ -/* > UPLO = 'L' or 'l' A is a lower triangular matrix. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > On entry, TRANS specifies the operation to be performed as */ -/* > follows: */ -/* > */ -/* > TRANS = 'N' or 'n' x := A*x. */ -/* > */ -/* > TRANS = 'T' or 't' x := A**T*x. */ -/* > */ -/* > TRANS = 'C' or 'c' x := A**H*x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] DIAG */ -/* > \verbatim */ -/* > DIAG is CHARACTER*1 */ -/* > On entry, DIAG specifies whether or not A is unit */ -/* > triangular as follows: */ -/* > */ -/* > DIAG = 'U' or 'u' A is assumed to be unit triangular. */ -/* > */ -/* > DIAG = 'N' or 'n' A is not assumed to be unit */ -/* > triangular. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > On entry, N specifies the order of the matrix A. */ -/* > N must be at least zero. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension ( LDA, N ). */ -/* > Before entry with UPLO = 'U' or 'u', the leading n by n */ -/* > upper triangular part of the array A must contain the upper */ -/* > triangular matrix and the strictly lower triangular part of */ -/* > A is not referenced. */ -/* > Before entry with UPLO = 'L' or 'l', the leading n by n */ -/* > lower triangular part of the array A must contain the lower */ -/* > triangular matrix and the strictly upper triangular part of */ -/* > A is not referenced. */ -/* > Note that when DIAG = 'U' or 'u', the diagonal elements of */ -/* > A are not referenced either, but are assumed to be unity. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > On entry, LDA specifies the first dimension of A as declared */ -/* > in the calling (sub) program. LDA must be at least */ -/* > max( 1, n ). */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] X */ -/* > \verbatim */ -/* > X is COMPLEX*16 array, dimension at least */ -/* > ( 1 + ( n - 1 )*abs( INCX ) ). */ -/* > Before entry, the incremented array X must contain the n */ -/* > element vector x. On exit, X is overwritten with the */ -/* > transformed vector x. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] INCX */ -/* > \verbatim */ -/* > INCX is INTEGER */ -/* > On entry, INCX specifies the increment for the elements of */ -/* > X. INCX must not be zero. */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16_blas_level2 */ - -/* > \par Further Details: */ -/* ===================== */ -/* > */ -/* > \verbatim */ -/* > */ -/* > Level 2 Blas routine. */ -/* > The vector and matrix arguments are not referenced when N = 0, or M = 0 */ -/* > */ -/* > -- Written on 22-October-1986. */ -/* > Jack Dongarra, Argonne National Lab. */ -/* > Jeremy Du Croz, Nag Central Office. */ -/* > Sven Hammarling, Nag Central Office. */ -/* > Richard Hanson, Sandia National Labs. */ -/* > \endverbatim */ -/* > */ -/* ===================================================================== */ -/* Subroutine */ int ztrmv_(char *uplo, char *trans, char *diag, integer *n, - doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, - ftnlen uplo_len, ftnlen trans_len, ftnlen diag_len) +int ztrmv_(char *uplo, char *trans, char *diag, integer *n, doublecomplex *a, integer *lda, + doublecomplex *x, integer *incx, ftnlen uplo_len, ftnlen trans_len, ftnlen diag_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; doublecomplex z__1, z__2, z__3; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j, ix, jx, kx, info; doublecomplex temp; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); logical noconj, nounit; - - -/* -- Reference BLAS level2 routine -- */ -/* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ - -/* Test the input parameters. */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --x; - - /* Function Body */ info = 0; - if (! lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(uplo, (char *)"L", ( - ftnlen)1, (ftnlen)1)) { + if (!lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1) && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { info = 1; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"T", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, (char *)"C", (ftnlen)1, ( - ftnlen)1)) { + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { info = 2; - } else if (! lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && ! lsame_(diag, - (char *)"N", (ftnlen)1, (ftnlen)1)) { + } else if (!lsame_(diag, (char *)"U", (ftnlen)1, (ftnlen)1) && + !lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1)) { info = 3; } else if (*n < 0) { info = 4; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { info = 6; } else if (*incx == 0) { info = 8; @@ -232,32 +38,17 @@ extern "C" { xerbla_((char *)"ZTRMV ", &info, (ftnlen)6); return 0; } - -/* Quick return if possible. */ - if (*n == 0) { return 0; } - noconj = lsame_(trans, (char *)"T", (ftnlen)1, (ftnlen)1); nounit = lsame_(diag, (char *)"N", (ftnlen)1, (ftnlen)1); - -/* Set up the start point in X if the increment is not unity. This */ -/* will be ( N - 1 )*INCX too small for descending loops. */ - if (*incx <= 0) { kx = 1 - (*n - 1) * *incx; } else if (*incx != 1) { kx = 1; } - -/* Start the operations. In this version the elements of A are */ -/* accessed sequentially with one pass through A. */ - if (lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1)) { - -/* Form x := A*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { if (*incx == 1) { i__1 = *n; @@ -272,24 +63,19 @@ extern "C" { i__4 = i__; i__5 = i__ + j * a_dim1; z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, - z__2.i = temp.r * a[i__5].i + temp.i * a[ - i__5].r; - z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + - z__2.i; + z__2.i = temp.r * a[i__5].i + temp.i * a[i__5].r; + z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + z__2.i; x[i__3].r = z__1.r, x[i__3].i = z__1.i; -/* L10: */ } if (nounit) { i__2 = j; i__3 = j; i__4 = j + j * a_dim1; - z__1.r = x[i__3].r * a[i__4].r - x[i__3].i * a[ - i__4].i, z__1.i = x[i__3].r * a[i__4].i + - x[i__3].i * a[i__4].r; + z__1.r = x[i__3].r * a[i__4].r - x[i__3].i * a[i__4].i, + z__1.i = x[i__3].r * a[i__4].i + x[i__3].i * a[i__4].r; x[i__2].r = z__1.r, x[i__2].i = z__1.i; } } -/* L20: */ } } else { jx = kx; @@ -306,26 +92,21 @@ extern "C" { i__4 = ix; i__5 = i__ + j * a_dim1; z__2.r = temp.r * a[i__5].r - temp.i * a[i__5].i, - z__2.i = temp.r * a[i__5].i + temp.i * a[ - i__5].r; - z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + - z__2.i; + z__2.i = temp.r * a[i__5].i + temp.i * a[i__5].r; + z__1.r = x[i__4].r + z__2.r, z__1.i = x[i__4].i + z__2.i; x[i__3].r = z__1.r, x[i__3].i = z__1.i; ix += *incx; -/* L30: */ } if (nounit) { i__2 = jx; i__3 = jx; i__4 = j + j * a_dim1; - z__1.r = x[i__3].r * a[i__4].r - x[i__3].i * a[ - i__4].i, z__1.i = x[i__3].r * a[i__4].i + - x[i__3].i * a[i__4].r; + z__1.r = x[i__3].r * a[i__4].r - x[i__3].i * a[i__4].i, + z__1.i = x[i__3].r * a[i__4].i + x[i__3].i * a[i__4].r; x[i__2].r = z__1.r, x[i__2].i = z__1.i; } } jx += *incx; -/* L40: */ } } } else { @@ -341,24 +122,19 @@ extern "C" { i__3 = i__; i__4 = i__ + j * a_dim1; z__2.r = temp.r * a[i__4].r - temp.i * a[i__4].i, - z__2.i = temp.r * a[i__4].i + temp.i * a[ - i__4].r; - z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + - z__2.i; + z__2.i = temp.r * a[i__4].i + temp.i * a[i__4].r; + z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + z__2.i; x[i__2].r = z__1.r, x[i__2].i = z__1.i; -/* L50: */ } if (nounit) { i__1 = j; i__2 = j; i__3 = j + j * a_dim1; - z__1.r = x[i__2].r * a[i__3].r - x[i__2].i * a[ - i__3].i, z__1.i = x[i__2].r * a[i__3].i + - x[i__2].i * a[i__3].r; + z__1.r = x[i__2].r * a[i__3].r - x[i__2].i * a[i__3].i, + z__1.i = x[i__2].r * a[i__3].i + x[i__2].i * a[i__3].r; x[i__1].r = z__1.r, x[i__1].i = z__1.i; } } -/* L60: */ } } else { kx += (*n - 1) * *incx; @@ -375,33 +151,25 @@ extern "C" { i__3 = ix; i__4 = i__ + j * a_dim1; z__2.r = temp.r * a[i__4].r - temp.i * a[i__4].i, - z__2.i = temp.r * a[i__4].i + temp.i * a[ - i__4].r; - z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + - z__2.i; + z__2.i = temp.r * a[i__4].i + temp.i * a[i__4].r; + z__1.r = x[i__3].r + z__2.r, z__1.i = x[i__3].i + z__2.i; x[i__2].r = z__1.r, x[i__2].i = z__1.i; ix -= *incx; -/* L70: */ } if (nounit) { i__1 = jx; i__2 = jx; i__3 = j + j * a_dim1; - z__1.r = x[i__2].r * a[i__3].r - x[i__2].i * a[ - i__3].i, z__1.i = x[i__2].r * a[i__3].i + - x[i__2].i * a[i__3].r; + z__1.r = x[i__2].r * a[i__3].r - x[i__2].i * a[i__3].i, + z__1.i = x[i__2].r * a[i__3].i + x[i__2].i * a[i__3].r; x[i__1].r = z__1.r, x[i__1].i = z__1.i; } } jx -= *incx; -/* L80: */ } } } } else { - -/* Form x := A**T*x or x := A**H*x. */ - if (lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1)) { if (*incx == 1) { for (j = *n; j >= 1; --j) { @@ -411,44 +179,35 @@ extern "C" { if (nounit) { i__1 = j + j * a_dim1; z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, - z__1.i = temp.r * a[i__1].i + temp.i * a[ - i__1].r; + z__1.i = temp.r * a[i__1].i + temp.i * a[i__1].r; temp.r = z__1.r, temp.i = z__1.i; } for (i__ = j - 1; i__ >= 1; --i__) { i__1 = i__ + j * a_dim1; i__2 = i__; - z__2.r = a[i__1].r * x[i__2].r - a[i__1].i * x[ - i__2].i, z__2.i = a[i__1].r * x[i__2].i + - a[i__1].i * x[i__2].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.r = a[i__1].r * x[i__2].r - a[i__1].i * x[i__2].i, + z__2.i = a[i__1].r * x[i__2].i + a[i__1].i * x[i__2].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L90: */ } } else { if (nounit) { d_lmp_cnjg(&z__2, &a[j + j * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; + z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } for (i__ = j - 1; i__ >= 1; --i__) { d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__1 = i__; z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, - z__2.i = z__3.r * x[i__1].i + z__3.i * x[ - i__1].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.i = z__3.r * x[i__1].i + z__3.i * x[i__1].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L100: */ } } i__1 = j; x[i__1].r = temp.r, x[i__1].i = temp.i; -/* L110: */ } } else { jx = kx + (*n - 1) * *incx; @@ -460,28 +219,23 @@ extern "C" { if (nounit) { i__1 = j + j * a_dim1; z__1.r = temp.r * a[i__1].r - temp.i * a[i__1].i, - z__1.i = temp.r * a[i__1].i + temp.i * a[ - i__1].r; + z__1.i = temp.r * a[i__1].i + temp.i * a[i__1].r; temp.r = z__1.r, temp.i = z__1.i; } for (i__ = j - 1; i__ >= 1; --i__) { ix -= *incx; i__1 = i__ + j * a_dim1; i__2 = ix; - z__2.r = a[i__1].r * x[i__2].r - a[i__1].i * x[ - i__2].i, z__2.i = a[i__1].r * x[i__2].i + - a[i__1].i * x[i__2].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.r = a[i__1].r * x[i__2].r - a[i__1].i * x[i__2].i, + z__2.i = a[i__1].r * x[i__2].i + a[i__1].i * x[i__2].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L120: */ } } else { if (nounit) { d_lmp_cnjg(&z__2, &a[j + j * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; + z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } for (i__ = j - 1; i__ >= 1; --i__) { @@ -489,18 +243,14 @@ extern "C" { d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__1 = ix; z__2.r = z__3.r * x[i__1].r - z__3.i * x[i__1].i, - z__2.i = z__3.r * x[i__1].i + z__3.i * x[ - i__1].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.i = z__3.r * x[i__1].i + z__3.i * x[i__1].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L130: */ } } i__1 = jx; x[i__1].r = temp.r, x[i__1].i = temp.i; jx -= *incx; -/* L140: */ } } } else { @@ -513,28 +263,23 @@ extern "C" { if (nounit) { i__2 = j + j * a_dim1; z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, - z__1.i = temp.r * a[i__2].i + temp.i * a[ - i__2].r; + z__1.i = temp.r * a[i__2].i + temp.i * a[i__2].r; temp.r = z__1.r, temp.i = z__1.i; } i__2 = *n; for (i__ = j + 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; i__4 = i__; - z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[ - i__4].i, z__2.i = a[i__3].r * x[i__4].i + - a[i__3].i * x[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4].i, + z__2.i = a[i__3].r * x[i__4].i + a[i__3].i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L150: */ } } else { if (nounit) { d_lmp_cnjg(&z__2, &a[j + j * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; + z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } i__2 = *n; @@ -542,17 +287,13 @@ extern "C" { d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = i__; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[ - i__3].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L160: */ } } i__2 = j; x[i__2].r = temp.r, x[i__2].i = temp.i; -/* L170: */ } } else { jx = kx; @@ -565,8 +306,7 @@ extern "C" { if (nounit) { i__2 = j + j * a_dim1; z__1.r = temp.r * a[i__2].r - temp.i * a[i__2].i, - z__1.i = temp.r * a[i__2].i + temp.i * a[ - i__2].r; + z__1.i = temp.r * a[i__2].i + temp.i * a[i__2].r; temp.r = z__1.r, temp.i = z__1.i; } i__2 = *n; @@ -574,20 +314,16 @@ extern "C" { ix += *incx; i__3 = i__ + j * a_dim1; i__4 = ix; - z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[ - i__4].i, z__2.i = a[i__3].r * x[i__4].i + - a[i__3].i * x[i__4].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.r = a[i__3].r * x[i__4].r - a[i__3].i * x[i__4].i, + z__2.i = a[i__3].r * x[i__4].i + a[i__3].i * x[i__4].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L180: */ } } else { if (nounit) { d_lmp_cnjg(&z__2, &a[j + j * a_dim1]); z__1.r = temp.r * z__2.r - temp.i * z__2.i, - z__1.i = temp.r * z__2.i + temp.i * - z__2.r; + z__1.i = temp.r * z__2.i + temp.i * z__2.r; temp.r = z__1.r, temp.i = z__1.i; } i__2 = *n; @@ -596,29 +332,20 @@ extern "C" { d_lmp_cnjg(&z__3, &a[i__ + j * a_dim1]); i__3 = ix; z__2.r = z__3.r * x[i__3].r - z__3.i * x[i__3].i, - z__2.i = z__3.r * x[i__3].i + z__3.i * x[ - i__3].r; - z__1.r = temp.r + z__2.r, z__1.i = temp.i + - z__2.i; + z__2.i = z__3.r * x[i__3].i + z__3.i * x[i__3].r; + z__1.r = temp.r + z__2.r, z__1.i = temp.i + z__2.i; temp.r = z__1.r, temp.i = z__1.i; -/* L190: */ } } i__2 = jx; x[i__2].r = temp.r, x[i__2].i = temp.i; jx += *incx; -/* L200: */ } } } } - return 0; - -/* End of ZTRMV */ - -} /* ztrmv_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zung2l.cpp b/lib/linalg/zung2l.cpp index 4c4f96c5b0..ab3da15caa 100644 --- a/lib/linalg/zung2l.cpp +++ b/lib/linalg/zung2l.cpp @@ -1,188 +1,23 @@ -/* fortran/zung2l.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b ZUNG2L generates all or part of the unitary matrix Q from a QL factorization determined by cgeq -lf (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZUNG2L + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZUNG2L( M, N, K, A, LDA, TAU, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZUNG2L generates an m by n complex matrix Q with orthonormal columns, */ -/* > which is defined as the last n columns of a product of k elementary */ -/* > reflectors of order m */ -/* > */ -/* > Q = H(k) . . . H(2) H(1) */ -/* > */ -/* > as returned by ZGEQLF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix Q. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix Q. M >= N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines the */ -/* > matrix Q. N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > On entry, the (n-k+i)-th column must contain the vector which */ -/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ -/* > returned by ZGEQLF in the last k columns of its array */ -/* > argument A. */ -/* > On exit, the m-by-n matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The first dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by ZGEQLF. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument has an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zung2l_(integer *m, integer *n, integer *k, - doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * - work, integer *info) +int zung2l_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *work, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublecomplex z__1; - - /* Local variables */ integer i__, j, l, ii; - extern /* Subroutine */ int zscal_(integer *, doublecomplex *, - doublecomplex *, integer *), zlarf_(char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, - ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ + extern int zscal_(integer *, doublecomplex *, doublecomplex *, integer *), + zlarf_(char *, integer *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, ftnlen), + xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; if (*m < 0) { *info = -1; @@ -190,7 +25,7 @@ f"> */ *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; } if (*info != 0) { @@ -198,40 +33,28 @@ f"> */ xerbla_((char *)"ZUNG2L", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n <= 0) { return 0; } - -/* Initialise columns 1:n-k to columns of the unit matrix */ - i__1 = *n - *k; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (l = 1; l <= i__2; ++l) { i__3 = l + j * a_dim1; a[i__3].r = 0., a[i__3].i = 0.; -/* L10: */ } i__2 = *m - *n + j + j * a_dim1; a[i__2].r = 1., a[i__2].i = 0.; -/* L20: */ } - i__1 = *k; for (i__ = 1; i__ <= i__1; ++i__) { ii = *n - *k + i__; - -/* Apply H(i) to A(1:m-k+i,1:n-k+i) from the left */ - i__2 = *m - *n + ii + ii * a_dim1; a[i__2].r = 1., a[i__2].i = 0.; i__2 = *m - *n + ii; i__3 = ii - 1; - zlarf_((char *)"Left", &i__2, &i__3, &a[ii * a_dim1 + 1], &c__1, &tau[i__], & - a[a_offset], lda, &work[1], (ftnlen)4); + zlarf_((char *)"Left", &i__2, &i__3, &a[ii * a_dim1 + 1], &c__1, &tau[i__], &a[a_offset], lda, + &work[1], (ftnlen)4); i__2 = *m - *n + ii - 1; i__3 = i__; z__1.r = -tau[i__3].r, z__1.i = -tau[i__3].i; @@ -240,23 +63,14 @@ f"> */ i__3 = i__; z__1.r = 1. - tau[i__3].r, z__1.i = 0. - tau[i__3].i; a[i__2].r = z__1.r, a[i__2].i = z__1.i; - -/* Set A(m-k+i+1:m,n-k+i) to zero */ - i__2 = *m; for (l = *m - *n + ii + 1; l <= i__2; ++l) { i__3 = l + ii * a_dim1; a[i__3].r = 0., a[i__3].i = 0.; -/* L30: */ } -/* L40: */ } return 0; - -/* End of ZUNG2L */ - -} /* zung2l_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zung2r.cpp b/lib/linalg/zung2r.cpp index 044df4d2b0..20b7b0957e 100644 --- a/lib/linalg/zung2r.cpp +++ b/lib/linalg/zung2r.cpp @@ -1,187 +1,23 @@ -/* fortran/zung2r.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b ZUNG2R */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZUNG2R + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZUNG2R( M, N, K, A, LDA, TAU, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZUNG2R generates an m by n complex matrix Q with orthonormal columns, */ -/* > which is defined as the first n columns of a product of k elementary */ -/* > reflectors of order m */ -/* > */ -/* > Q = H(1) H(2) . . . H(k) */ -/* > */ -/* > as returned by ZGEQRF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix Q. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix Q. M >= N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines the */ -/* > matrix Q. N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > On entry, the i-th column must contain the vector which */ -/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ -/* > returned by ZGEQRF in the first k columns of its array */ -/* > argument A. */ -/* > On exit, the m by n matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The first dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by ZGEQRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (N) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument has an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zung2r_(integer *m, integer *n, integer *k, - doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * - work, integer *info) +int zung2r_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *work, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublecomplex z__1; - - /* Local variables */ integer i__, j, l; - extern /* Subroutine */ int zscal_(integer *, doublecomplex *, - doublecomplex *, integer *), zlarf_(char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, - ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ + extern int zscal_(integer *, doublecomplex *, doublecomplex *, integer *), + zlarf_(char *, integer *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, ftnlen), + xerbla_(char *, integer *, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; if (*m < 0) { *info = -1; @@ -189,7 +25,7 @@ f"> */ *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; } if (*info != 0) { @@ -197,40 +33,27 @@ f"> */ xerbla_((char *)"ZUNG2R", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*n <= 0) { return 0; } - -/* Initialise columns k+1:n to columns of the unit matrix */ - i__1 = *n; for (j = *k + 1; j <= i__1; ++j) { i__2 = *m; for (l = 1; l <= i__2; ++l) { i__3 = l + j * a_dim1; a[i__3].r = 0., a[i__3].i = 0.; -/* L10: */ } i__2 = j + j * a_dim1; a[i__2].r = 1., a[i__2].i = 0.; -/* L20: */ } - for (i__ = *k; i__ >= 1; --i__) { - -/* Apply H(i) to A(i:m,i:n) from the left */ - if (i__ < *n) { i__1 = i__ + i__ * a_dim1; a[i__1].r = 1., a[i__1].i = 0.; i__1 = *m - i__ + 1; i__2 = *n - i__; - zlarf_((char *)"Left", &i__1, &i__2, &a[i__ + i__ * a_dim1], &c__1, &tau[ - i__], &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], ( - ftnlen)4); + zlarf_((char *)"Left", &i__1, &i__2, &a[i__ + i__ * a_dim1], &c__1, &tau[i__], + &a[i__ + (i__ + 1) * a_dim1], lda, &work[1], (ftnlen)4); } if (i__ < *m) { i__1 = *m - i__; @@ -242,23 +65,14 @@ f"> */ i__2 = i__; z__1.r = 1. - tau[i__2].r, z__1.i = 0. - tau[i__2].i; a[i__1].r = z__1.r, a[i__1].i = z__1.i; - -/* Set A(1:i-1,i) to zero */ - i__1 = i__ - 1; for (l = 1; l <= i__1; ++l) { i__2 = l + i__ * a_dim1; a[i__2].r = 0., a[i__2].i = 0.; -/* L30: */ } -/* L40: */ } return 0; - -/* End of ZUNG2R */ - -} /* zung2r_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zungl2.cpp b/lib/linalg/zungl2.cpp index 44213e5927..7ac8d65292 100644 --- a/lib/linalg/zungl2.cpp +++ b/lib/linalg/zungl2.cpp @@ -1,186 +1,23 @@ -/* fortran/zungl2.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* > \brief \b ZUNGL2 generates all or part of the unitary matrix Q from an LQ factorization determined by cge -lqf (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZUNGL2 + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZUNGL2( M, N, K, A, LDA, TAU, WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDA, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZUNGL2 generates an m-by-n complex matrix Q with orthonormal rows, */ -/* > which is defined as the first m rows of a product of k elementary */ -/* > reflectors of order n */ -/* > */ -/* > Q = H(k)**H . . . H(2)**H H(1)**H */ -/* > */ -/* > as returned by ZGELQF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix Q. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix Q. N >= M. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines the */ -/* > matrix Q. M >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > On entry, the i-th row must contain the vector which defines */ -/* > the elementary reflector H(i), for i = 1,2,...,k, as returned */ -/* > by ZGELQF in the first k rows of its array argument A. */ -/* > On exit, the m by n matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The first dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by ZGELQF. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (M) */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument has an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zungl2_(integer *m, integer *n, integer *k, - doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * - work, integer *info) +int zungl2_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *work, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; doublecomplex z__1, z__2; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, j, l; - extern /* Subroutine */ int zscal_(integer *, doublecomplex *, - doublecomplex *, integer *), zlarf_(char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, - ftnlen), zlacgv_(integer *, doublecomplex *, integer *); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ + extern int zscal_(integer *, doublecomplex *, doublecomplex *, integer *), + zlarf_(char *, integer *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, ftnlen), + xerbla_(char *, integer *, ftnlen), zlacgv_(integer *, doublecomplex *, integer *); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; if (*m < 0) { *info = -1; @@ -188,7 +25,7 @@ f"> */ *info = -2; } else if (*k < 0 || *k > *m) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; } if (*info != 0) { @@ -196,37 +33,24 @@ f"> */ xerbla_((char *)"ZUNGL2", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*m <= 0) { return 0; } - if (*k < *m) { - -/* Initialise rows k+1:m to rows of the unit matrix */ - i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (l = *k + 1; l <= i__2; ++l) { i__3 = l + j * a_dim1; a[i__3].r = 0., a[i__3].i = 0.; -/* L10: */ } if (j > *k && j <= *m) { i__2 = j + j * a_dim1; a[i__2].r = 1., a[i__2].i = 0.; } -/* L20: */ } } - for (i__ = *k; i__ >= 1; --i__) { - -/* Apply H(i)**H to A(i:m,i:n) from the right */ - if (i__ < *n) { i__1 = *n - i__; zlacgv_(&i__1, &a[i__ + (i__ + 1) * a_dim1], lda); @@ -236,9 +60,8 @@ f"> */ i__1 = *m - i__; i__2 = *n - i__ + 1; d_lmp_cnjg(&z__1, &tau[i__]); - zlarf_((char *)"Right", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, & - z__1, &a[i__ + 1 + i__ * a_dim1], lda, &work[1], ( - ftnlen)5); + zlarf_((char *)"Right", &i__1, &i__2, &a[i__ + i__ * a_dim1], lda, &z__1, + &a[i__ + 1 + i__ * a_dim1], lda, &work[1], (ftnlen)5); } i__1 = *n - i__; i__2 = i__; @@ -251,23 +74,14 @@ f"> */ d_lmp_cnjg(&z__2, &tau[i__]); z__1.r = 1. - z__2.r, z__1.i = 0. - z__2.i; a[i__1].r = z__1.r, a[i__1].i = z__1.i; - -/* Set A(i,1:i-1) to zero */ - i__1 = i__ - 1; for (l = 1; l <= i__1; ++l) { i__2 = i__ + l * a_dim1; a[i__2].r = 0., a[i__2].i = 0.; -/* L30: */ } -/* L40: */ } return 0; - -/* End of ZUNGL2 */ - -} /* zungl2_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zungql.cpp b/lib/linalg/zungql.cpp index 8ee03838d4..4250c31d03 100644 --- a/lib/linalg/zungql.cpp +++ b/lib/linalg/zungql.cpp @@ -1,215 +1,34 @@ -/* fortran/zungql.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; - -/* > \brief \b ZUNGQL */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZUNGQL + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZUNGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDA, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZUNGQL generates an M-by-N complex matrix Q with orthonormal columns, */ -/* > which is defined as the last N columns of a product of K elementary */ -/* > reflectors of order M */ -/* > */ -/* > Q = H(k) . . . H(2) H(1) */ -/* > */ -/* > as returned by ZGEQLF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix Q. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix Q. M >= N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines the */ -/* > matrix Q. N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > On entry, the (n-k+i)-th column must contain the vector which */ -/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ -/* > returned by ZGEQLF in the last k columns of its array */ -/* > argument A. */ -/* > On exit, the M-by-N matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The first dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by ZGEQLF. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= max(1,N). */ -/* > For optimum performance LWORK >= N*NB, where NB is the */ -/* > optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument has an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zungql_(integer *m, integer *n, integer *k, - doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * - work, integer *lwork, integer *info) +int zungql_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *work, integer *lwork, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; - - /* Local variables */ integer i__, j, l, ib, nb, kk, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int zung2l_(integer *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, - integer *, integer *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int zung2l_(integer *, integer *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int zlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); integer ldwork; - extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, ftnlen, ftnlen); + extern int zlarft_(char *, char *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen); logical lquery; integer lwkopt; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; lquery = *lwork == -1; if (*m < 0) { @@ -218,25 +37,21 @@ f"> */ *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; } - if (*info == 0) { if (*n == 0) { lwkopt = 1; } else { - nb = ilaenv_(&c__1, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, ( - ftnlen)1); + nb = ilaenv_(&c__1, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); lwkopt = *n * nb; } - work[1].r = (doublereal) lwkopt, work[1].i = 0.; - - if (*lwork < max(1,*n) && ! lquery) { + work[1].r = (doublereal)lwkopt, work[1].i = 0.; + if (*lwork < max(1, *n) && !lquery) { *info = -8; } } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"ZUNGQL", &i__1, (ftnlen)6); @@ -244,138 +59,76 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n <= 0) { return 0; } - nbmin = 2; nx = 0; iws = *n; if (nb > 1 && nb < *k) { - -/* Determine when to cross over from blocked to unblocked code. */ - -/* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1, i__2); if (nx < *k) { - -/* Determine if workspace is large enough for blocked code. */ - ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { - -/* Not enough workspace to use optimal NB: reduce NB and */ -/* determine the minimum value of NB. */ - nb = *lwork / ldwork; -/* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, - (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"ZUNGQL", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); } } } - if (nb >= nbmin && nb < *k && nx < *k) { - -/* Use blocked code after the first block. */ -/* The last kk columns are handled by the block method. */ - -/* Computing MIN */ i__1 = *k, i__2 = (*k - nx + nb - 1) / nb * nb; - kk = min(i__1,i__2); - -/* Set A(m-kk+1:m,1:n-kk) to zero. */ - + kk = min(i__1, i__2); i__1 = *n - kk; for (j = 1; j <= i__1; ++j) { i__2 = *m; for (i__ = *m - kk + 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; a[i__3].r = 0., a[i__3].i = 0.; -/* L10: */ } -/* L20: */ } } else { kk = 0; } - -/* Use unblocked code for the first or only block. */ - i__1 = *m - kk; i__2 = *n - kk; i__3 = *k - kk; - zung2l_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &iinfo) - ; - + zung2l_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], &iinfo); if (kk > 0) { - -/* Use blocked code */ - i__1 = *k; i__2 = nb; - for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += - i__2) { -/* Computing MIN */ + for (i__ = *k - kk + 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { i__3 = nb, i__4 = *k - i__ + 1; - ib = min(i__3,i__4); + ib = min(i__3, i__4); if (*n - *k + i__ > 1) { - -/* Form the triangular factor of the block reflector */ -/* H = H(i+ib-1) . . . H(i+1) H(i) */ - i__3 = *m - *k + i__ + ib - 1; - zlarft_((char *)"Backward", (char *)"Columnwise", &i__3, &ib, &a[(*n - *k + - i__) * a_dim1 + 1], lda, &tau[i__], &work[1], &ldwork, - (ftnlen)8, (ftnlen)10); - -/* Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left */ - + zlarft_((char *)"Backward", (char *)"Columnwise", &i__3, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, + &tau[i__], &work[1], &ldwork, (ftnlen)8, (ftnlen)10); i__3 = *m - *k + i__ + ib - 1; i__4 = *n - *k + i__ - 1; - zlarfb_((char *)"Left", (char *)"No transpose", (char *)"Backward", (char *)"Columnwise", & - i__3, &i__4, &ib, &a[(*n - *k + i__) * a_dim1 + 1], - lda, &work[1], &ldwork, &a[a_offset], lda, &work[ib + - 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen)8, ( - ftnlen)10); + zlarfb_((char *)"Left", (char *)"No transpose", (char *)"Backward", (char *)"Columnwise", &i__3, &i__4, &ib, + &a[(*n - *k + i__) * a_dim1 + 1], lda, &work[1], &ldwork, &a[a_offset], lda, + &work[ib + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen)8, (ftnlen)10); } - -/* Apply H to rows 1:m-k+i+ib-1 of current block */ - i__3 = *m - *k + i__ + ib - 1; - zung2l_(&i__3, &ib, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, & - tau[i__], &work[1], &iinfo); - -/* Set rows m-k+i+ib:m of current block to zero */ - + zung2l_(&i__3, &ib, &ib, &a[(*n - *k + i__) * a_dim1 + 1], lda, &tau[i__], &work[1], + &iinfo); i__3 = *n - *k + i__ + ib - 1; for (j = *n - *k + i__; j <= i__3; ++j) { i__4 = *m; for (l = *m - *k + i__ + ib; l <= i__4; ++l) { i__5 = l + j * a_dim1; a[i__5].r = 0., a[i__5].i = 0.; -/* L30: */ } -/* L40: */ } -/* L50: */ } } - - work[1].r = (doublereal) iws, work[1].i = 0.; + work[1].r = (doublereal)iws, work[1].i = 0.; return 0; - -/* End of ZUNGQL */ - -} /* zungql_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zungqr.cpp b/lib/linalg/zungqr.cpp index a79c87eedd..5368d9130d 100644 --- a/lib/linalg/zungqr.cpp +++ b/lib/linalg/zungqr.cpp @@ -1,219 +1,38 @@ -/* fortran/zungqr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__3 = 3; static integer c__2 = 2; - -/* > \brief \b ZUNGQR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZUNGQR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZUNGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* INTEGER INFO, K, LDA, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZUNGQR generates an M-by-N complex matrix Q with orthonormal columns, */ -/* > which is defined as the first N columns of a product of K elementary */ -/* > reflectors of order M */ -/* > */ -/* > Q = H(1) H(2) . . . H(k) */ -/* > */ -/* > as returned by ZGEQRF. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix Q. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix Q. M >= N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines the */ -/* > matrix Q. N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > On entry, the i-th column must contain the vector which */ -/* > defines the elementary reflector H(i), for i = 1,2,...,k, as */ -/* > returned by ZGEQRF in the first k columns of its array */ -/* > argument A. */ -/* > On exit, the M-by-N matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The first dimension of the array A. LDA >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by ZGEQRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= max(1,N). */ -/* > For optimum performance LWORK >= N*NB, where NB is the */ -/* > optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument has an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zungqr_(integer *m, integer *n, integer *k, - doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * - work, integer *lwork, integer *info) +int zungqr_(integer *m, integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *work, integer *lwork, integer *info) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; - - /* Local variables */ integer i__, j, l, ib, nb, ki, kk, nx, iws, nbmin, iinfo; - extern /* Subroutine */ int zung2r_(integer *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, - integer *, integer *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int zung2r_(integer *, integer *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int zlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); integer ldwork; - extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, ftnlen, ftnlen); + extern int zlarft_(char *, char *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen); integer lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; nb = ilaenv_(&c__1, (char *)"ZUNGQR", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); - lwkopt = max(1,*n) * nb; - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + lwkopt = max(1, *n) * nb; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; lquery = *lwork == -1; if (*m < 0) { *info = -1; @@ -221,9 +40,9 @@ f"> */ *info = -2; } else if (*k < 0 || *k > *n) { *info = -3; - } else if (*lda < max(1,*m)) { + } else if (*lda < max(1, *m)) { *info = -5; - } else if (*lwork < max(1,*n) && ! lquery) { + } else if (*lwork < max(1, *n) && !lquery) { *info = -8; } if (*info != 0) { @@ -233,140 +52,80 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n <= 0) { work[1].r = 1., work[1].i = 0.; return 0; } - nbmin = 2; nx = 0; iws = *n; if (nb > 1 && nb < *k) { - -/* Determine when to cross over from blocked to unblocked code. */ - -/* Computing MAX */ - i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"ZUNGQR", (char *)" ", m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)1); - nx = max(i__1,i__2); + i__1 = 0, i__2 = ilaenv_(&c__3, (char *)"ZUNGQR", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + nx = max(i__1, i__2); if (nx < *k) { - -/* Determine if workspace is large enough for blocked code. */ - ldwork = *n; iws = ldwork * nb; if (*lwork < iws) { - -/* Not enough workspace to use optimal NB: reduce NB and */ -/* determine the minimum value of NB. */ - nb = *lwork / ldwork; -/* Computing MAX */ - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNGQR", (char *)" ", m, n, k, &c_n1, - (ftnlen)6, (ftnlen)1); - nbmin = max(i__1,i__2); + i__1 = 2, + i__2 = ilaenv_(&c__2, (char *)"ZUNGQR", (char *)" ", m, n, k, &c_n1, (ftnlen)6, (ftnlen)1); + nbmin = max(i__1, i__2); } } } - if (nb >= nbmin && nb < *k && nx < *k) { - -/* Use blocked code after the last block. */ -/* The first kk columns are handled by the block method. */ - ki = (*k - nx - 1) / nb * nb; -/* Computing MIN */ i__1 = *k, i__2 = ki + nb; - kk = min(i__1,i__2); - -/* Set A(1:kk,kk+1:n) to zero. */ - + kk = min(i__1, i__2); i__1 = *n; for (j = kk + 1; j <= i__1; ++j) { i__2 = kk; for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * a_dim1; a[i__3].r = 0., a[i__3].i = 0.; -/* L10: */ } -/* L20: */ } } else { kk = 0; } - -/* Use unblocked code for the last or only block. */ - if (kk < *n) { i__1 = *m - kk; i__2 = *n - kk; i__3 = *k - kk; - zung2r_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, & - tau[kk + 1], &work[1], &iinfo); + zung2r_(&i__1, &i__2, &i__3, &a[kk + 1 + (kk + 1) * a_dim1], lda, &tau[kk + 1], &work[1], + &iinfo); } - if (kk > 0) { - -/* Use blocked code */ - i__1 = -nb; for (i__ = ki + 1; i__1 < 0 ? i__ >= 1 : i__ <= 1; i__ += i__1) { -/* Computing MIN */ i__2 = nb, i__3 = *k - i__ + 1; - ib = min(i__2,i__3); + ib = min(i__2, i__3); if (i__ + ib <= *n) { - -/* Form the triangular factor of the block reflector */ -/* H = H(i) H(i+1) . . . H(i+ib-1) */ - i__2 = *m - i__ + 1; - zlarft_((char *)"Forward", (char *)"Columnwise", &i__2, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[1], &ldwork, (ftnlen)7, - (ftnlen)10); - -/* Apply H to A(i:m,i+ib:n) from the left */ - + zlarft_((char *)"Forward", (char *)"Columnwise", &i__2, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], + &work[1], &ldwork, (ftnlen)7, (ftnlen)10); i__2 = *m - i__ + 1; i__3 = *n - i__ - ib + 1; - zlarfb_((char *)"Left", (char *)"No transpose", (char *)"Forward", (char *)"Columnwise", & - i__2, &i__3, &ib, &a[i__ + i__ * a_dim1], lda, &work[ - 1], &ldwork, &a[i__ + (i__ + ib) * a_dim1], lda, & - work[ib + 1], &ldwork, (ftnlen)4, (ftnlen)12, (ftnlen) - 7, (ftnlen)10); + zlarfb_((char *)"Left", (char *)"No transpose", (char *)"Forward", (char *)"Columnwise", &i__2, &i__3, &ib, + &a[i__ + i__ * a_dim1], lda, &work[1], &ldwork, + &a[i__ + (i__ + ib) * a_dim1], lda, &work[ib + 1], &ldwork, (ftnlen)4, + (ftnlen)12, (ftnlen)7, (ftnlen)10); } - -/* Apply H to rows i:m of current block */ - i__2 = *m - i__ + 1; - zung2r_(&i__2, &ib, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], & - work[1], &iinfo); - -/* Set rows 1:i-1 of current block to zero */ - + zung2r_(&i__2, &ib, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], &work[1], &iinfo); i__2 = i__ + ib - 1; for (j = i__; j <= i__2; ++j) { i__3 = i__ - 1; for (l = 1; l <= i__3; ++l) { i__4 = l + j * a_dim1; a[i__4].r = 0., a[i__4].i = 0.; -/* L30: */ } -/* L40: */ } -/* L50: */ } } - - work[1].r = (doublereal) iws, work[1].i = 0.; + work[1].r = (doublereal)iws, work[1].i = 0.; return 0; - -/* End of ZUNGQR */ - -} /* zungqr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zungtr.cpp b/lib/linalg/zungtr.cpp index 86c03cb474..9a2ba97b64 100644 --- a/lib/linalg/zungtr.cpp +++ b/lib/linalg/zungtr.cpp @@ -1,243 +1,62 @@ -/* fortran/zungtr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; - -/* > \brief \b ZUNGTR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZUNGTR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZUNGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER UPLO */ -/* INTEGER INFO, LDA, LWORK, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZUNGTR generates a complex unitary matrix Q which is defined as the */ -/* > product of n-1 elementary reflectors of order N, as returned by */ -/* > ZHETRD: */ -/* > */ -/* > if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), */ -/* > */ -/* > if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A contains elementary reflectors */ -/* > from ZHETRD; */ -/* > = 'L': Lower triangle of A contains elementary reflectors */ -/* > from ZHETRD. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The order of the matrix Q. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,N) */ -/* > On entry, the vectors which define the elementary reflectors, */ -/* > as returned by ZHETRD. */ -/* > On exit, the N-by-N unitary matrix Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. LDA >= N. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (N-1) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by ZHETRD. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. LWORK >= N-1. */ -/* > For optimum performance LWORK >= (N-1)*NB, where NB is */ -/* > the optimal blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zungtr_(char *uplo, integer *n, doublecomplex *a, - integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, - integer *info, ftnlen uplo_len) +int zungtr_(char *uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *work, integer *lwork, integer *info, ftnlen uplo_len) { - /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; - - /* Local variables */ integer i__, j, nb; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; logical upper; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); integer lwkopt; logical lquery; - extern /* Subroutine */ int zungql_(integer *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, integer *), zungqr_(integer *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, integer *); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ + extern int zungql_(integer *, integer *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, integer *), + zungqr_(integer *, integer *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, integer *); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --tau; --work; - - /* Function Body */ *info = 0; lquery = *lwork == -1; upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); - if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -1; } else if (*n < 0) { *info = -2; - } else if (*lda < max(1,*n)) { + } else if (*lda < max(1, *n)) { *info = -4; - } else /* if(complicated condition) */ { -/* Computing MAX */ + } else { i__1 = 1, i__2 = *n - 1; - if (*lwork < max(i__1,i__2) && ! lquery) { + if (*lwork < max(i__1, i__2) && !lquery) { *info = -7; } } - if (*info == 0) { if (upper) { i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"ZUNGQL", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)1); + nb = ilaenv_(&c__1, (char *)"ZUNGQL", (char *)" ", &i__1, &i__2, &i__3, &c_n1, (ftnlen)6, (ftnlen)1); } else { i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"ZUNGQR", (char *)" ", &i__1, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)1); + nb = ilaenv_(&c__1, (char *)"ZUNGQR", (char *)" ", &i__1, &i__2, &i__3, &c_n1, (ftnlen)6, (ftnlen)1); } -/* Computing MAX */ i__1 = 1, i__2 = *n - 1; - lwkopt = max(i__1,i__2) * nb; - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + lwkopt = max(i__1, i__2) * nb; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"ZUNGTR", &i__1, (ftnlen)6); @@ -245,22 +64,11 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*n == 0) { work[1].r = 1., work[1].i = 0.; return 0; } - if (upper) { - -/* Q was determined by a call to ZHETRD with UPLO = 'U' */ - -/* Shift the vectors which define the elementary reflectors one */ -/* column to the left, and set the last row and column of Q to */ -/* those of the unit matrix */ - i__1 = *n - 1; for (j = 1; j <= i__1; ++j) { i__2 = j - 1; @@ -268,37 +76,22 @@ f"> */ i__3 = i__ + j * a_dim1; i__4 = i__ + (j + 1) * a_dim1; a[i__3].r = a[i__4].r, a[i__3].i = a[i__4].i; -/* L10: */ } i__2 = *n + j * a_dim1; a[i__2].r = 0., a[i__2].i = 0.; -/* L20: */ } i__1 = *n - 1; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = i__ + *n * a_dim1; a[i__2].r = 0., a[i__2].i = 0.; -/* L30: */ } i__1 = *n + *n * a_dim1; a[i__1].r = 1., a[i__1].i = 0.; - -/* Generate Q(1:n-1,1:n-1) */ - i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; - zungql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], - lwork, &iinfo); - + zungql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], lwork, &iinfo); } else { - -/* Q was determined by a call to ZHETRD with UPLO = 'L'. */ - -/* Shift the vectors which define the elementary reflectors one */ -/* column to the right, and set the first row and column of Q to */ -/* those of the unit matrix */ - for (j = *n; j >= 2; --j) { i__1 = j * a_dim1 + 1; a[i__1].r = 0., a[i__1].i = 0.; @@ -307,9 +100,7 @@ f"> */ i__2 = i__ + j * a_dim1; i__3 = i__ + (j - 1) * a_dim1; a[i__2].r = a[i__3].r, a[i__2].i = a[i__3].i; -/* L40: */ } -/* L50: */ } i__1 = a_dim1 + 1; a[i__1].r = 1., a[i__1].i = 0.; @@ -317,26 +108,18 @@ f"> */ for (i__ = 2; i__ <= i__1; ++i__) { i__2 = i__ + a_dim1; a[i__2].r = 0., a[i__2].i = 0.; -/* L60: */ } if (*n > 1) { - -/* Generate Q(2:n,2:n) */ - i__1 = *n - 1; i__2 = *n - 1; i__3 = *n - 1; - zungqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], - &work[1], lwork, &iinfo); + zungqr_(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], &work[1], lwork, + &iinfo); } } - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; return 0; - -/* End of ZUNGTR */ - -} /* zungtr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zunm2l.cpp b/lib/linalg/zunm2l.cpp index 3e5b63f574..6358ee33a3 100644 --- a/lib/linalg/zunm2l.cpp +++ b/lib/linalg/zunm2l.cpp @@ -1,235 +1,24 @@ -/* fortran/zunm2l.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b ZUNM2L multiplies a general matrix by the unitary matrix from a QL factorization determined by -cgeqlf (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZUNM2L + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZUNM2L( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ -/* WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS */ -/* INTEGER INFO, K, LDA, LDC, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZUNM2L overwrites the general complex m-by-n matrix C with */ -/* > */ -/* > Q * C if SIDE = 'L' and TRANS = 'N', or */ -/* > */ -/* > Q**H* C if SIDE = 'L' and TRANS = 'C', or */ -/* > */ -/* > C * Q if SIDE = 'R' and TRANS = 'N', or */ -/* > */ -/* > C * Q**H if SIDE = 'R' and TRANS = 'C', */ -/* > */ -/* > where Q is a complex unitary matrix defined as the product of k */ -/* > elementary reflectors */ -/* > */ -/* > Q = H(k) . . . H(2) H(1) */ -/* > */ -/* > as returned by ZGEQLF. Q is of order m if SIDE = 'L' and of order n */ -/* > if SIDE = 'R'. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q or Q**H from the Left */ -/* > = 'R': apply Q or Q**H from the Right */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': apply Q (No transpose) */ -/* > = 'C': apply Q**H (Conjugate transpose) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines */ -/* > the matrix Q. */ -/* > If SIDE = 'L', M >= K >= 0; */ -/* > if SIDE = 'R', N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,K) */ -/* > The i-th column must contain the vector which defines the */ -/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ -/* > ZGEQLF in the last k columns of its array argument A. */ -/* > A is modified by the routine but restored on exit. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > If SIDE = 'L', LDA >= max(1,M); */ -/* > if SIDE = 'R', LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by ZGEQLF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is COMPLEX*16 array, dimension (LDC,N) */ -/* > On entry, the m-by-n matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension */ -/* > (N) if SIDE = 'L', */ -/* > (M) if SIDE = 'R' */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zunm2l_(char *side, char *trans, integer *m, integer *n, - integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, - doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info, - ftnlen side_len, ftnlen trans_len) +int zunm2l_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, + integer *info, ftnlen side_len, ftnlen trans_len) { - /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; doublecomplex z__1; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, i1, i2, i3, mi, ni, nq; doublecomplex aii; logical left; doublecomplex taui; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int zlarf_(char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, - ftnlen); + extern int zlarf_(char *, integer *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, ftnlen), + xerbla_(char *, integer *, ftnlen); logical notran; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -238,22 +27,17 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); - -/* NQ is the order of Q */ - if (left) { nq = *m; } else { nq = *n; } - if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! notran && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + } else if (!notran && !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*m < 0) { *info = -3; @@ -261,9 +45,9 @@ f"> */ *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; - } else if (*lda < max(1,nq)) { + } else if (*lda < max(1, nq)) { *info = -7; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -10; } if (*info != 0) { @@ -271,14 +55,10 @@ f"> */ xerbla_((char *)"ZUNM2L", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0 || *k == 0) { return 0; } - - if (left && notran || ! left && ! notran) { + if (left && notran || !left && !notran) { i1 = 1; i2 = *k; i3 = 1; @@ -287,30 +67,19 @@ f"> */ i2 = 1; i3 = -1; } - if (left) { ni = *n; } else { mi = *m; } - i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { - -/* H(i) or H(i)**H is applied to C(1:m-k+i,1:n) */ - mi = *m - *k + i__; } else { - -/* H(i) or H(i)**H is applied to C(1:m,1:n-k+i) */ - ni = *n - *k + i__; } - -/* Apply H(i) or H(i)**H */ - if (notran) { i__3 = i__; taui.r = tau[i__3].r, taui.i = tau[i__3].i; @@ -322,18 +91,13 @@ f"> */ aii.r = a[i__3].r, aii.i = a[i__3].i; i__3 = nq - *k + i__ + i__ * a_dim1; a[i__3].r = 1., a[i__3].i = 0.; - zlarf_(side, &mi, &ni, &a[i__ * a_dim1 + 1], &c__1, &taui, &c__[ - c_offset], ldc, &work[1], (ftnlen)1); + zlarf_(side, &mi, &ni, &a[i__ * a_dim1 + 1], &c__1, &taui, &c__[c_offset], ldc, &work[1], + (ftnlen)1); i__3 = nq - *k + i__ + i__ * a_dim1; a[i__3].r = aii.r, a[i__3].i = aii.i; -/* L10: */ } return 0; - -/* End of ZUNM2L */ - -} /* zunm2l_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zunm2r.cpp b/lib/linalg/zunm2r.cpp index cbfdfb2f42..e1c04b13f5 100644 --- a/lib/linalg/zunm2r.cpp +++ b/lib/linalg/zunm2r.cpp @@ -1,235 +1,24 @@ -/* fortran/zunm2r.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; - -/* > \brief \b ZUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by -cgeqrf (unblocked algorithm). */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZUNM2R + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZUNM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ -/* WORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS */ -/* INTEGER INFO, K, LDA, LDC, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZUNM2R overwrites the general complex m-by-n matrix C with */ -/* > */ -/* > Q * C if SIDE = 'L' and TRANS = 'N', or */ -/* > */ -/* > Q**H* C if SIDE = 'L' and TRANS = 'C', or */ -/* > */ -/* > C * Q if SIDE = 'R' and TRANS = 'N', or */ -/* > */ -/* > C * Q**H if SIDE = 'R' and TRANS = 'C', */ -/* > */ -/* > where Q is a complex unitary matrix defined as the product of k */ -/* > elementary reflectors */ -/* > */ -/* > Q = H(1) H(2) . . . H(k) */ -/* > */ -/* > as returned by ZGEQRF. Q is of order m if SIDE = 'L' and of order n */ -/* > if SIDE = 'R'. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q or Q**H from the Left */ -/* > = 'R': apply Q or Q**H from the Right */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': apply Q (No transpose) */ -/* > = 'C': apply Q**H (Conjugate transpose) */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines */ -/* > the matrix Q. */ -/* > If SIDE = 'L', M >= K >= 0; */ -/* > if SIDE = 'R', N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,K) */ -/* > The i-th column must contain the vector which defines the */ -/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ -/* > ZGEQRF in the first k columns of its array argument A. */ -/* > A is modified by the routine but restored on exit. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > If SIDE = 'L', LDA >= max(1,M); */ -/* > if SIDE = 'R', LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by ZGEQRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is COMPLEX*16 array, dimension (LDC,N) */ -/* > On entry, the m-by-n matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension */ -/* > (N) if SIDE = 'L', */ -/* > (M) if SIDE = 'R' */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zunm2r_(char *side, char *trans, integer *m, integer *n, - integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, - doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info, - ftnlen side_len, ftnlen trans_len) +int zunm2r_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, + integer *info, ftnlen side_len, ftnlen trans_len) { - /* System generated locals */ integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3; doublecomplex z__1; - - /* Builtin functions */ void d_lmp_cnjg(doublecomplex *, doublecomplex *); - - /* Local variables */ integer i__, i1, i2, i3, ic, jc, mi, ni, nq; doublecomplex aii; logical left; doublecomplex taui; extern logical lsame_(char *, char *, ftnlen, ftnlen); - extern /* Subroutine */ int zlarf_(char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, doublecomplex *, ftnlen), xerbla_(char *, integer *, - ftnlen); + extern int zlarf_(char *, integer *, integer *, doublecomplex *, integer *, doublecomplex *, + doublecomplex *, integer *, doublecomplex *, ftnlen), + xerbla_(char *, integer *, ftnlen); logical notran; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -238,22 +27,17 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); - -/* NQ is the order of Q */ - if (left) { nq = *m; } else { nq = *n; } - if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! notran && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + } else if (!notran && !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*m < 0) { *info = -3; @@ -261,9 +45,9 @@ f"> */ *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; - } else if (*lda < max(1,nq)) { + } else if (*lda < max(1, nq)) { *info = -7; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -10; } if (*info != 0) { @@ -271,14 +55,10 @@ f"> */ xerbla_((char *)"ZUNM2R", &i__1, (ftnlen)6); return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0 || *k == 0) { return 0; } - - if (left && ! notran || ! left && notran) { + if (left && !notran || !left && notran) { i1 = 1; i2 = *k; i3 = 1; @@ -287,7 +67,6 @@ f"> */ i2 = 1; i3 = -1; } - if (left) { ni = *n; jc = 1; @@ -295,26 +74,16 @@ f"> */ mi = *m; ic = 1; } - i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { if (left) { - -/* H(i) or H(i)**H is applied to C(i:m,1:n) */ - mi = *m - i__ + 1; ic = i__; } else { - -/* H(i) or H(i)**H is applied to C(1:m,i:n) */ - ni = *n - i__ + 1; jc = i__; } - -/* Apply H(i) or H(i)**H */ - if (notran) { i__3 = i__; taui.r = tau[i__3].r, taui.i = tau[i__3].i; @@ -326,18 +95,13 @@ f"> */ aii.r = a[i__3].r, aii.i = a[i__3].i; i__3 = i__ + i__ * a_dim1; a[i__3].r = 1., a[i__3].i = 0.; - zlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &taui, &c__[ic - + jc * c_dim1], ldc, &work[1], (ftnlen)1); + zlarf_(side, &mi, &ni, &a[i__ + i__ * a_dim1], &c__1, &taui, &c__[ic + jc * c_dim1], ldc, + &work[1], (ftnlen)1); i__3 = i__ + i__ * a_dim1; a[i__3].r = aii.r, a[i__3].i = aii.i; -/* L10: */ } return 0; - -/* End of ZUNM2R */ - -} /* zunm2r_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zunmql.cpp b/lib/linalg/zunmql.cpp index 694c8f776c..11eca14656 100644 --- a/lib/linalg/zunmql.cpp +++ b/lib/linalg/zunmql.cpp @@ -1,258 +1,38 @@ -/* fortran/zunmql.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static integer c__65 = 65; - -/* > \brief \b ZUNMQL */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZUNMQL + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZUNMQL( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ -/* WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS */ -/* INTEGER INFO, K, LDA, LDC, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZUNMQL overwrites the general complex M-by-N matrix C with */ -/* > */ -/* > SIDE = 'L' SIDE = 'R' */ -/* > TRANS = 'N': Q * C C * Q */ -/* > TRANS = 'C': Q**H * C C * Q**H */ -/* > */ -/* > where Q is a complex unitary matrix defined as the product of k */ -/* > elementary reflectors */ -/* > */ -/* > Q = H(k) . . . H(2) H(1) */ -/* > */ -/* > as returned by ZGEQLF. Q is of order M if SIDE = 'L' and of order N */ -/* > if SIDE = 'R'. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q or Q**H from the Left; */ -/* > = 'R': apply Q or Q**H from the Right. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': No transpose, apply Q; */ -/* > = 'C': Conjugate transpose, apply Q**H. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines */ -/* > the matrix Q. */ -/* > If SIDE = 'L', M >= K >= 0; */ -/* > if SIDE = 'R', N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,K) */ -/* > The i-th column must contain the vector which defines the */ -/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ -/* > ZGEQLF in the last k columns of its array argument A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > If SIDE = 'L', LDA >= max(1,M); */ -/* > if SIDE = 'R', LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by ZGEQLF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is COMPLEX*16 array, dimension (LDC,N) */ -/* > On entry, the M-by-N matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > If SIDE = 'L', LWORK >= max(1,N); */ -/* > if SIDE = 'R', LWORK >= max(1,M). */ -/* > For good performance, LWORK should generally be larger. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zunmql_(char *side, char *trans, integer *m, integer *n, - integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, - doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, - integer *info, ftnlen side_len, ftnlen trans_len) +int zunmql_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, + integer *lwork, integer *info, ftnlen side_len, ftnlen trans_len) { - /* System generated locals */ address a__1[2]; - integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, - i__5; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; - - /* Builtin functions */ - /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); - - /* Local variables */ + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); integer i__, i1, i2, i3, ib, nb, mi, ni, nq, nw, iwt; logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; - extern /* Subroutine */ int zunm2l_(char *, char *, integer *, integer *, - integer *, doublecomplex *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, - integer *, integer *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int zunm2l_(char *, char *, integer *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, integer *, + ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int zlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); logical notran; integer ldwork; - extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, ftnlen, ftnlen); + extern int zlarft_(char *, char *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen); integer lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -261,25 +41,20 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - -/* NQ is the order of Q and NW is the minimum dimension of WORK */ - if (left) { nq = *m; - nw = max(1,*n); + nw = max(1, *n); } else { nq = *n; - nw = max(1,*m); + nw = max(1, *m); } - if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! notran && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + } else if (!notran && !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*m < 0) { *info = -3; @@ -287,34 +62,26 @@ f"> */ *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; - } else if (*lda < max(1,nq)) { + } else if (*lda < max(1, nq)) { *info = -7; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -10; - } else if (*lwork < nw && ! lquery) { + } else if (*lwork < nw && !lquery) { *info = -12; } - if (*info == 0) { - -/* Compute the workspace requirements */ - if (*m == 0 || *n == 0) { lwkopt = 1; } else { -/* Computing MIN */ -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, m, n, k, &c_n1, - (ftnlen)6, (ftnlen)2); - nb = min(i__1,i__2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, m, n, k, &c_n1, (ftnlen)6, (ftnlen)2); + nb = min(i__1, i__2); lwkopt = nw * nb + 4160; } - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"ZUNMQL", &i__1, (ftnlen)6); @@ -322,41 +89,27 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0) { return 0; } - nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { if (*lwork < lwkopt) { nb = (*lwork - 4160) / ldwork; -/* Computing MAX */ -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNMQL", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nbmin = max(i__1,i__2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNMQL", ch__1, m, n, k, &c_n1, (ftnlen)6, (ftnlen)2); + nbmin = max(i__1, i__2); } } - if (nb < nbmin || nb >= *k) { - -/* Use unblocked code */ - - zunm2l_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + zunm2l_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[c_offset], ldc, &work[1], + &iinfo, (ftnlen)1, (ftnlen)1); } else { - -/* Use blocked code */ - iwt = nw * nb + 1; - if (left && notran || ! left && ! notran) { + if (left && notran || !left && !notran) { i1 = 1; i2 = *k; i3 = nb; @@ -365,55 +118,32 @@ f"> */ i2 = 1; i3 = -nb; } - if (left) { ni = *n; } else { mi = *m; } - i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { -/* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; - ib = min(i__4,i__5); - -/* Form the triangular factor of the block reflector */ -/* H = H(i+ib-1) . . . H(i+1) H(i) */ - + ib = min(i__4, i__5); i__4 = nq - *k + i__ + ib - 1; - zlarft_((char *)"Backward", (char *)"Columnwise", &i__4, &ib, &a[i__ * a_dim1 + 1] - , lda, &tau[i__], &work[iwt], &c__65, (ftnlen)8, (ftnlen) - 10); + zlarft_((char *)"Backward", (char *)"Columnwise", &i__4, &ib, &a[i__ * a_dim1 + 1], lda, &tau[i__], + &work[iwt], &c__65, (ftnlen)8, (ftnlen)10); if (left) { - -/* H or H**H is applied to C(1:m-k+i+ib-1,1:n) */ - mi = *m - *k + i__ + ib - 1; } else { - -/* H or H**H is applied to C(1:m,1:n-k+i+ib-1) */ - ni = *n - *k + i__ + ib - 1; } - -/* Apply H or H**H */ - - zlarfb_(side, trans, (char *)"Backward", (char *)"Columnwise", &mi, &ni, &ib, &a[ - i__ * a_dim1 + 1], lda, &work[iwt], &c__65, &c__[c_offset] - , ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen)1, (ftnlen)8, - (ftnlen)10); -/* L10: */ + zlarfb_(side, trans, (char *)"Backward", (char *)"Columnwise", &mi, &ni, &ib, &a[i__ * a_dim1 + 1], lda, + &work[iwt], &c__65, &c__[c_offset], ldc, &work[1], &ldwork, (ftnlen)1, + (ftnlen)1, (ftnlen)8, (ftnlen)10); } } - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; return 0; - -/* End of ZUNMQL */ - -} /* zunmql_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zunmqr.cpp b/lib/linalg/zunmqr.cpp index 6718cdc001..7a82cd0681 100644 --- a/lib/linalg/zunmqr.cpp +++ b/lib/linalg/zunmqr.cpp @@ -1,258 +1,38 @@ -/* fortran/zunmqr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; static integer c__65 = 65; - -/* > \brief \b ZUNMQR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZUNMQR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZUNMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, */ -/* WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS */ -/* INTEGER INFO, K, LDA, LDC, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZUNMQR overwrites the general complex M-by-N matrix C with */ -/* > */ -/* > SIDE = 'L' SIDE = 'R' */ -/* > TRANS = 'N': Q * C C * Q */ -/* > TRANS = 'C': Q**H * C C * Q**H */ -/* > */ -/* > where Q is a complex unitary matrix defined as the product of k */ -/* > elementary reflectors */ -/* > */ -/* > Q = H(1) H(2) . . . H(k) */ -/* > */ -/* > as returned by ZGEQRF. Q is of order M if SIDE = 'L' and of order N */ -/* > if SIDE = 'R'. */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q or Q**H from the Left; */ -/* > = 'R': apply Q or Q**H from the Right. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': No transpose, apply Q; */ -/* > = 'C': Conjugate transpose, apply Q**H. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] K */ -/* > \verbatim */ -/* > K is INTEGER */ -/* > The number of elementary reflectors whose product defines */ -/* > the matrix Q. */ -/* > If SIDE = 'L', M >= K >= 0; */ -/* > if SIDE = 'R', N >= K >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension (LDA,K) */ -/* > The i-th column must contain the vector which defines the */ -/* > elementary reflector H(i), for i = 1,2,...,k, as returned by */ -/* > ZGEQRF in the first k columns of its array argument A. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > If SIDE = 'L', LDA >= max(1,M); */ -/* > if SIDE = 'R', LDA >= max(1,N). */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension (K) */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by ZGEQRF. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is COMPLEX*16 array, dimension (LDC,N) */ -/* > On entry, the M-by-N matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > If SIDE = 'L', LWORK >= max(1,N); */ -/* > if SIDE = 'R', LWORK >= max(1,M). */ -/* > For good performance, LWORK should generally be larger. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zunmqr_(char *side, char *trans, integer *m, integer *n, - integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, - doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, - integer *info, ftnlen side_len, ftnlen trans_len) +int zunmqr_(char *side, char *trans, integer *m, integer *n, integer *k, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, + integer *lwork, integer *info, ftnlen side_len, ftnlen trans_len) { - /* System generated locals */ address a__1[2]; - integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, - i__5; + integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3[2], i__4, i__5; char ch__1[2]; - - /* Builtin functions */ - /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); - - /* Local variables */ + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); integer i__, i1, i2, i3, ib, ic, jc, nb, mi, ni, nq, nw, iwt; logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer nbmin, iinfo; - extern /* Subroutine */ int zunm2r_(char *, char *, integer *, integer *, - integer *, doublecomplex *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, ftnlen, - ftnlen), xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); - extern /* Subroutine */ int zlarfb_(char *, char *, char *, char *, - integer *, integer *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, doublecomplex *, integer *, - doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); + extern int zunm2r_(char *, char *, integer *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, integer *, + ftnlen, ftnlen), + xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); + extern int zlarfb_(char *, char *, char *, char *, integer *, integer *, integer *, + doublecomplex *, integer *, doublecomplex *, integer *, doublecomplex *, + integer *, doublecomplex *, integer *, ftnlen, ftnlen, ftnlen, ftnlen); logical notran; integer ldwork; - extern /* Subroutine */ int zlarft_(char *, char *, integer *, integer *, - doublecomplex *, integer *, doublecomplex *, doublecomplex *, - integer *, ftnlen, ftnlen); + extern int zlarft_(char *, char *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, ftnlen, ftnlen); integer lwkopt; logical lquery; - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Parameters .. */ -/* .. */ -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -261,25 +41,20 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); notran = lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - -/* NQ is the order of Q and NW is the minimum dimension of WORK */ - if (left) { nq = *m; - nw = max(1,*n); + nw = max(1, *n); } else { nq = *n; - nw = max(1,*m); + nw = max(1, *m); } - if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! notran && ! lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { + } else if (!notran && !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { *info = -2; } else if (*m < 0) { *info = -3; @@ -287,30 +62,22 @@ f"> */ *info = -4; } else if (*k < 0 || *k > nq) { *info = -5; - } else if (*lda < max(1,nq)) { + } else if (*lda < max(1, nq)) { *info = -7; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -10; - } else if (*lwork < nw && ! lquery) { + } else if (*lwork < nw && !lquery) { *info = -12; } - if (*info == 0) { - -/* Compute the workspace requirements */ - -/* Computing MIN */ -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nb = min(i__1,i__2); + i__1 = 64, i__2 = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, m, n, k, &c_n1, (ftnlen)6, (ftnlen)2); + nb = min(i__1, i__2); lwkopt = nw * nb + 4160; - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; } - if (*info != 0) { i__1 = -(*info); xerbla_((char *)"ZUNMQR", &i__1, (ftnlen)6); @@ -318,42 +85,28 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0 || *k == 0) { work[1].r = 1., work[1].i = 0.; return 0; } - nbmin = 2; ldwork = nw; if (nb > 1 && nb < *k) { if (*lwork < lwkopt) { nb = (*lwork - 4160) / ldwork; -/* Computing MAX */ -/* Writing concatenation */ i__3[0] = 1, a__1[0] = side; i__3[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__3, &c__2, (ftnlen)2); - i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNMQR", ch__1, m, n, k, &c_n1, ( - ftnlen)6, (ftnlen)2); - nbmin = max(i__1,i__2); + i__1 = 2, i__2 = ilaenv_(&c__2, (char *)"ZUNMQR", ch__1, m, n, k, &c_n1, (ftnlen)6, (ftnlen)2); + nbmin = max(i__1, i__2); } } - if (nb < nbmin || nb >= *k) { - -/* Use unblocked code */ - - zunm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[ - c_offset], ldc, &work[1], &iinfo, (ftnlen)1, (ftnlen)1); + zunm2r_(side, trans, m, n, k, &a[a_offset], lda, &tau[1], &c__[c_offset], ldc, &work[1], + &iinfo, (ftnlen)1, (ftnlen)1); } else { - -/* Use blocked code */ - iwt = nw * nb + 1; - if (left && ! notran || ! left && notran) { + if (left && !notran || !left && notran) { i1 = 1; i2 = *k; i3 = nb; @@ -362,7 +115,6 @@ f"> */ i2 = 1; i3 = -nb; } - if (left) { ni = *n; jc = 1; @@ -370,51 +122,29 @@ f"> */ mi = *m; ic = 1; } - i__1 = i2; i__2 = i3; for (i__ = i1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) { -/* Computing MIN */ i__4 = nb, i__5 = *k - i__ + 1; - ib = min(i__4,i__5); - -/* Form the triangular factor of the block reflector */ -/* H = H(i) H(i+1) . . . H(i+ib-1) */ - + ib = min(i__4, i__5); i__4 = nq - i__ + 1; - zlarft_((char *)"Forward", (char *)"Columnwise", &i__4, &ib, &a[i__ + i__ * - a_dim1], lda, &tau[i__], &work[iwt], &c__65, (ftnlen)7, ( - ftnlen)10); + zlarft_((char *)"Forward", (char *)"Columnwise", &i__4, &ib, &a[i__ + i__ * a_dim1], lda, &tau[i__], + &work[iwt], &c__65, (ftnlen)7, (ftnlen)10); if (left) { - -/* H or H**H is applied to C(i:m,1:n) */ - mi = *m - i__ + 1; ic = i__; } else { - -/* H or H**H is applied to C(1:m,i:n) */ - ni = *n - i__ + 1; jc = i__; } - -/* Apply H or H**H */ - - zlarfb_(side, trans, (char *)"Forward", (char *)"Columnwise", &mi, &ni, &ib, &a[ - i__ + i__ * a_dim1], lda, &work[iwt], &c__65, &c__[ic + - jc * c_dim1], ldc, &work[1], &ldwork, (ftnlen)1, (ftnlen) - 1, (ftnlen)7, (ftnlen)10); -/* L10: */ + zlarfb_(side, trans, (char *)"Forward", (char *)"Columnwise", &mi, &ni, &ib, &a[i__ + i__ * a_dim1], + lda, &work[iwt], &c__65, &c__[ic + jc * c_dim1], ldc, &work[1], &ldwork, + (ftnlen)1, (ftnlen)1, (ftnlen)7, (ftnlen)10); } } - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; return 0; - -/* End of ZUNMQR */ - -} /* zunmqr_ */ - +} #ifdef __cplusplus - } +} #endif diff --git a/lib/linalg/zunmtr.cpp b/lib/linalg/zunmtr.cpp index f4f4f55761..86530bb9c6 100644 --- a/lib/linalg/zunmtr.cpp +++ b/lib/linalg/zunmtr.cpp @@ -1,254 +1,34 @@ -/* fortran/zunmtr.f -- translated by f2c (version 20200916). - You must link the resulting object file with libf2c: - on Microsoft Windows system, link with libf2c.lib; - on Linux or Unix systems, link with .../path/to/libf2c.a -lm - or, if you install libf2c.a in a standard place, with -lf2c -lm - -- in that order, at the end of the command line, as in - cc *.o -lf2c -lm - Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., - - http://www.netlib.org/f2c/libf2c.zip -*/ - #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" - -/* Table of constant values */ - static integer c__1 = 1; static integer c_n1 = -1; static integer c__2 = 2; - -/* > \brief \b ZUNMTR */ - -/* =========== DOCUMENTATION =========== */ - -/* Online html documentation available at */ -/* http://www.netlib.org/lapack/explore-html/ */ - -/* > \htmlonly */ -/* > Download ZUNMTR + dependencies */ -/* > */ -/* > [TGZ] */ -/* > */ -/* > [ZIP] */ -/* > */ -/* > [TXT] */ -/* > \endhtmlonly */ - -/* Definition: */ -/* =========== */ - -/* SUBROUTINE ZUNMTR( SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, */ -/* WORK, LWORK, INFO ) */ - -/* .. Scalar Arguments .. */ -/* CHARACTER SIDE, TRANS, UPLO */ -/* INTEGER INFO, LDA, LDC, LWORK, M, N */ -/* .. */ -/* .. Array Arguments .. */ -/* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) */ -/* .. */ - - -/* > \par Purpose: */ -/* ============= */ -/* > */ -/* > \verbatim */ -/* > */ -/* > ZUNMTR overwrites the general complex M-by-N matrix C with */ -/* > */ -/* > SIDE = 'L' SIDE = 'R' */ -/* > TRANS = 'N': Q * C C * Q */ -/* > TRANS = 'C': Q**H * C C * Q**H */ -/* > */ -/* > where Q is a complex unitary matrix of order nq, with nq = m if */ -/* > SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of */ -/* > nq-1 elementary reflectors, as returned by ZHETRD: */ -/* > */ -/* > if UPLO = 'U', Q = H(nq-1) . . . H(2) H(1); */ -/* > */ -/* > if UPLO = 'L', Q = H(1) H(2) . . . H(nq-1). */ -/* > \endverbatim */ - -/* Arguments: */ -/* ========== */ - -/* > \param[in] SIDE */ -/* > \verbatim */ -/* > SIDE is CHARACTER*1 */ -/* > = 'L': apply Q or Q**H from the Left; */ -/* > = 'R': apply Q or Q**H from the Right. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] UPLO */ -/* > \verbatim */ -/* > UPLO is CHARACTER*1 */ -/* > = 'U': Upper triangle of A contains elementary reflectors */ -/* > from ZHETRD; */ -/* > = 'L': Lower triangle of A contains elementary reflectors */ -/* > from ZHETRD. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TRANS */ -/* > \verbatim */ -/* > TRANS is CHARACTER*1 */ -/* > = 'N': No transpose, apply Q; */ -/* > = 'C': Conjugate transpose, apply Q**H. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] M */ -/* > \verbatim */ -/* > M is INTEGER */ -/* > The number of rows of the matrix C. M >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] N */ -/* > \verbatim */ -/* > N is INTEGER */ -/* > The number of columns of the matrix C. N >= 0. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] A */ -/* > \verbatim */ -/* > A is COMPLEX*16 array, dimension */ -/* > (LDA,M) if SIDE = 'L' */ -/* > (LDA,N) if SIDE = 'R' */ -/* > The vectors which define the elementary reflectors, as */ -/* > returned by ZHETRD. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDA */ -/* > \verbatim */ -/* > LDA is INTEGER */ -/* > The leading dimension of the array A. */ -/* > LDA >= max(1,M) if SIDE = 'L'; LDA >= max(1,N) if SIDE = 'R'. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] TAU */ -/* > \verbatim */ -/* > TAU is COMPLEX*16 array, dimension */ -/* > (M-1) if SIDE = 'L' */ -/* > (N-1) if SIDE = 'R' */ -/* > TAU(i) must contain the scalar factor of the elementary */ -/* > reflector H(i), as returned by ZHETRD. */ -/* > \endverbatim */ -/* > */ -/* > \param[in,out] C */ -/* > \verbatim */ -/* > C is COMPLEX*16 array, dimension (LDC,N) */ -/* > On entry, the M-by-N matrix C. */ -/* > On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LDC */ -/* > \verbatim */ -/* > LDC is INTEGER */ -/* > The leading dimension of the array C. LDC >= max(1,M). */ -/* > \endverbatim */ -/* > */ -/* > \param[out] WORK */ -/* > \verbatim */ -/* > WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) */ -/* > On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */ -/* > \endverbatim */ -/* > */ -/* > \param[in] LWORK */ -/* > \verbatim */ -/* > LWORK is INTEGER */ -/* > The dimension of the array WORK. */ -/* > If SIDE = 'L', LWORK >= max(1,N); */ -/* > if SIDE = 'R', LWORK >= max(1,M). */ -/* > For optimum performance LWORK >= N*NB if SIDE = 'L', and */ -/* > LWORK >=M*NB if SIDE = 'R', where NB is the optimal */ -/* > blocksize. */ -/* > */ -/* > If LWORK = -1, then a workspace query is assumed; the routine */ -/* > only calculates the optimal size of the WORK array, returns */ -/* > this value as the first entry of the WORK array, and no error */ -/* > message related to LWORK is issued by XERBLA. */ -/* > \endverbatim */ -/* > */ -/* > \param[out] INFO */ -/* > \verbatim */ -/* > INFO is INTEGER */ -/* > = 0: successful exit */ -/* > < 0: if INFO = -i, the i-th argument had an illegal value */ -/* > \endverbatim */ - -/* Authors: */ -/* ======== */ - -/* > \author Univ. of Tennessee */ -/* > \author Univ. of California Berkeley */ -/* > \author Univ. of Colorado Denver */ -/* > \author NAG Ltd. */ - -/* > \ingroup complex16OTHERcomputational */ - -/* ===================================================================== */ -/* Subroutine */ int zunmtr_(char *side, char *uplo, char *trans, integer *m, - integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, - doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, - integer *info, ftnlen side_len, ftnlen uplo_len, ftnlen trans_len) +int zunmtr_(char *side, char *uplo, char *trans, integer *m, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, + integer *lwork, integer *info, ftnlen side_len, ftnlen uplo_len, ftnlen trans_len) { - /* System generated locals */ address a__1[2]; integer a_dim1, a_offset, c_dim1, c_offset, i__1[2], i__2, i__3; char ch__1[2]; - - /* Builtin functions */ - /* Subroutine */ int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); - - /* Local variables */ + int s_lmp_cat(char *, char **, integer *, integer *, ftnlen); integer i1, i2, nb, mi, ni, nq, nw; logical left; extern logical lsame_(char *, char *, ftnlen, ftnlen); integer iinfo; logical upper; - extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen); - extern integer ilaenv_(integer *, char *, char *, integer *, integer *, - integer *, integer *, ftnlen, ftnlen); + extern int xerbla_(char *, integer *, ftnlen); + extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, + ftnlen, ftnlen); integer lwkopt; logical lquery; - extern /* Subroutine */ int zunmql_(char *, char *, integer *, integer *, - integer *, doublecomplex *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, integer *, - ftnlen, ftnlen), zunmqr_(char *, char *, integer *, integer *, - integer *, doublecomplex *, integer *, doublecomplex *, - doublecomplex *, integer *, doublecomplex *, integer *, integer *, - ftnlen, ftnlen); - - -/* -- LAPACK computational routine -- */ -/* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ -/* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ - -/* .. Scalar Arguments .. */ -/* .. */ -/* .. Array Arguments .. */ -/* .. */ - -/* ===================================================================== */ - -/* .. Local Scalars .. */ -/* .. */ -/* .. External Functions .. */ -/* .. */ -/* .. External Subroutines .. */ -/* .. */ -/* .. Intrinsic Functions .. */ -/* .. */ -/* .. Executable Statements .. */ - -/* Test the input arguments */ - - /* Parameter adjustments */ + extern int zunmql_(char *, char *, integer *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, integer *, + integer *, ftnlen, ftnlen), + zunmqr_(char *, char *, integer *, integer *, integer *, doublecomplex *, integer *, + doublecomplex *, doublecomplex *, integer *, doublecomplex *, integer *, integer *, + ftnlen, ftnlen); a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; @@ -257,87 +37,72 @@ f"> */ c_offset = 1 + c_dim1; c__ -= c_offset; --work; - - /* Function Body */ *info = 0; left = lsame_(side, (char *)"L", (ftnlen)1, (ftnlen)1); upper = lsame_(uplo, (char *)"U", (ftnlen)1, (ftnlen)1); lquery = *lwork == -1; - -/* NQ is the order of Q and NW is the minimum dimension of WORK */ - if (left) { nq = *m; - nw = max(1,*n); + nw = max(1, *n); } else { nq = *n; - nw = max(1,*m); + nw = max(1, *m); } - if (! left && ! lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { + if (!left && !lsame_(side, (char *)"R", (ftnlen)1, (ftnlen)1)) { *info = -1; - } else if (! upper && ! lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { + } else if (!upper && !lsame_(uplo, (char *)"L", (ftnlen)1, (ftnlen)1)) { *info = -2; - } else if (! lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && ! lsame_(trans, - (char *)"C", (ftnlen)1, (ftnlen)1)) { + } else if (!lsame_(trans, (char *)"N", (ftnlen)1, (ftnlen)1) && + !lsame_(trans, (char *)"C", (ftnlen)1, (ftnlen)1)) { *info = -3; } else if (*m < 0) { *info = -4; } else if (*n < 0) { *info = -5; - } else if (*lda < max(1,nq)) { + } else if (*lda < max(1, nq)) { *info = -7; - } else if (*ldc < max(1,*m)) { + } else if (*ldc < max(1, *m)) { *info = -10; - } else if (*lwork < nw && ! lquery) { + } else if (*lwork < nw && !lquery) { *info = -12; } - if (*info == 0) { if (upper) { if (left) { -/* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *m - 1; i__3 = *m - 1; - nb = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, &i__2, n, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, &i__2, n, &i__3, &c_n1, (ftnlen)6, (ftnlen)2); } else { -/* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *n - 1; i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, m, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"ZUNMQL", ch__1, m, &i__2, &i__3, &c_n1, (ftnlen)6, (ftnlen)2); } } else { if (left) { -/* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *m - 1; i__3 = *m - 1; - nb = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, &i__2, n, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, &i__2, n, &i__3, &c_n1, (ftnlen)6, (ftnlen)2); } else { -/* Writing concatenation */ i__1[0] = 1, a__1[0] = side; i__1[1] = 1, a__1[1] = trans; s_lmp_cat(ch__1, a__1, i__1, &c__2, (ftnlen)2); i__2 = *n - 1; i__3 = *n - 1; - nb = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, m, &i__2, &i__3, &c_n1, ( - ftnlen)6, (ftnlen)2); + nb = ilaenv_(&c__1, (char *)"ZUNMQR", ch__1, m, &i__2, &i__3, &c_n1, (ftnlen)6, (ftnlen)2); } } lwkopt = nw * nb; - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; } - if (*info != 0) { i__2 = -(*info); xerbla_((char *)"ZUNMTR", &i__2, (ftnlen)6); @@ -345,14 +110,10 @@ f"> */ } else if (lquery) { return 0; } - -/* Quick return if possible */ - if (*m == 0 || *n == 0 || nq == 1) { work[1].r = 1., work[1].i = 0.; return 0; } - if (left) { mi = *m - 1; ni = *n; @@ -360,19 +121,11 @@ f"> */ mi = *m; ni = *n - 1; } - if (upper) { - -/* Q was determined by a call to ZHETRD with UPLO = 'U' */ - i__2 = nq - 1; - zunmql_(side, trans, &mi, &ni, &i__2, &a[(a_dim1 << 1) + 1], lda, & - tau[1], &c__[c_offset], ldc, &work[1], lwork, &iinfo, (ftnlen) - 1, (ftnlen)1); + zunmql_(side, trans, &mi, &ni, &i__2, &a[(a_dim1 << 1) + 1], lda, &tau[1], &c__[c_offset], + ldc, &work[1], lwork, &iinfo, (ftnlen)1, (ftnlen)1); } else { - -/* Q was determined by a call to ZHETRD with UPLO = 'L' */ - if (left) { i1 = 2; i2 = 1; @@ -381,17 +134,12 @@ f"> */ i2 = 2; } i__2 = nq - 1; - zunmqr_(side, trans, &mi, &ni, &i__2, &a[a_dim1 + 2], lda, &tau[1], & - c__[i1 + i2 * c_dim1], ldc, &work[1], lwork, &iinfo, (ftnlen) - 1, (ftnlen)1); + zunmqr_(side, trans, &mi, &ni, &i__2, &a[a_dim1 + 2], lda, &tau[1], &c__[i1 + i2 * c_dim1], + ldc, &work[1], lwork, &iinfo, (ftnlen)1, (ftnlen)1); } - work[1].r = (doublereal) lwkopt, work[1].i = 0.; + work[1].r = (doublereal)lwkopt, work[1].i = 0.; return 0; - -/* End of ZUNMTR */ - -} /* zunmtr_ */ - +} #ifdef __cplusplus - } +} #endif From 9d06a3b9a101ece5f508fda9ecc629031f34e060 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 17:18:33 -0500 Subject: [PATCH 31/47] with linalg now being C++, a few more packages can be built natively on Windows --- cmake/presets/windows.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmake/presets/windows.cmake b/cmake/presets/windows.cmake index 21be0efefb..e93cd35daa 100644 --- a/cmake/presets/windows.cmake +++ b/cmake/presets/windows.cmake @@ -1,6 +1,7 @@ set(WIN_PACKAGES AMOEBA ASPHERE + AWPMD BOCS BODY BPM @@ -20,6 +21,7 @@ set(WIN_PACKAGES DPD-SMOOTH DRUDE EFF + ELECTRODE EXTRA-COMPUTE EXTRA-DUMP EXTRA-FIX @@ -35,6 +37,7 @@ set(WIN_PACKAGES MEAM MISC ML-IAP + ML-POD ML-SNAP MOFFF MOLECULE From dba3eb0cf7d27a6bf384da03b0cdb29005fa2b7f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 17:39:38 -0500 Subject: [PATCH 32/47] make AWPMD compatible with MSVC and c++-linalg on Windows --- lib/awpmd/ivutils/include/erf.h | 19 ------ lib/awpmd/ivutils/include/lapack_inter.h | 67 +++++++------------ lib/awpmd/systems/interact/TCP/wpmd.h | 2 - lib/awpmd/systems/interact/TCP/wpmd_split.cpp | 2 - 4 files changed, 25 insertions(+), 65 deletions(-) delete mode 100644 lib/awpmd/ivutils/include/erf.h diff --git a/lib/awpmd/ivutils/include/erf.h b/lib/awpmd/ivutils/include/erf.h deleted file mode 100644 index b1cdbcb9dc..0000000000 --- a/lib/awpmd/ivutils/include/erf.h +++ /dev/null @@ -1,19 +0,0 @@ -# ifndef ERF_H -# define ERF_H - -# ifdef _WIN32 - -# ifdef __cplusplus -extern "C" { -# endif - -double erf(double x); -double erfc(double x); - -# ifdef __cplusplus -} -# endif - -# endif - -# endif diff --git a/lib/awpmd/ivutils/include/lapack_inter.h b/lib/awpmd/ivutils/include/lapack_inter.h index ac3e062b5b..a48ea5d821 100644 --- a/lib/awpmd/ivutils/include/lapack_inter.h +++ b/lib/awpmd/ivutils/include/lapack_inter.h @@ -1,53 +1,36 @@ // Interface for LAPACK function -# ifndef LAPACK_INTER_H -# define LAPACK_INTER_H +#ifndef LAPACK_INTER_H +#define LAPACK_INTER_H #include typedef int lapack_int; typedef complex lapack_complex_float; typedef complex lapack_complex_double; -#if defined(_WIN32) && !defined(__MINGW32__) +#define DGETRF dgetrf_ +#define DGETRS dgetrs_ +#define DGETRI dgetri_ +#define ZPPTRF zpptrf_ +#define ZPPTRI zpptri_ - //#define MKL_Complex8 lapack_complex_float - //#define MKL_Complex16 lapack_complex_double - #include "mkl.h" - - inline void ZPPTRF( char* uplo, const lapack_int* n, lapack_complex_double* ap, lapack_int* info ) { - ZPPTRF(uplo, (int*)n, (MKL_Complex16*)ap, (int*)info); - } - inline void ZPPTRI( char* uplo, const lapack_int* n, lapack_complex_double* ap, lapack_int* info ){ - ZPPTRI(uplo, (int*)n, (MKL_Complex16*)ap, (int*)info); - } - -#else - - #define DGETRF dgetrf_ - #define DGETRS dgetrs_ - #define DGETRI dgetri_ - #define ZPPTRF zpptrf_ - #define ZPPTRI zpptri_ - - #ifdef __cplusplus - extern "C" { - #endif /* __cplusplus */ - void dgetrf_( const lapack_int* m, const lapack_int* n, double* a, const lapack_int* lda, - lapack_int* ipiv, lapack_int* info ); - void dgetrs_( const char* trans, const lapack_int* n, const lapack_int* nrhs, - const double* a, const lapack_int* lda, const lapack_int* ipiv, - double* b, const lapack_int* ldb, lapack_int* info ); - void dgetri_( const lapack_int* n, double* a, const lapack_int* lda, - const lapack_int* ipiv, double* work, const lapack_int* lwork, - lapack_int* info ); - void zpptrf_( const char* uplo, const lapack_int* n, lapack_complex_double* ap, - lapack_int* info ); - void zpptri_( const char* uplo, const lapack_int* n, lapack_complex_double* ap, - lapack_int* info ); - #ifdef __cplusplus - } - #endif /* __cplusplus */ - -#endif +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +void dgetrf_(const lapack_int *m, const lapack_int *n, double *a, + const lapack_int *lda, lapack_int *ipiv, lapack_int *info); +void dgetrs_(const char *trans, const lapack_int *n, const lapack_int *nrhs, + const double *a, const lapack_int *lda, const lapack_int *ipiv, + double *b, const lapack_int *ldb, lapack_int *info); +void dgetri_(const lapack_int *n, double *a, const lapack_int *lda, + const lapack_int *ipiv, double *work, const lapack_int *lwork, + lapack_int *info); +void zpptrf_(const char *uplo, const lapack_int *n, lapack_complex_double *ap, + lapack_int *info); +void zpptri_(const char *uplo, const lapack_int *n, lapack_complex_double *ap, + lapack_int *info); +#ifdef __cplusplus +} +#endif /* __cplusplus */ #endif /* lapack_intER_H */ diff --git a/lib/awpmd/systems/interact/TCP/wpmd.h b/lib/awpmd/systems/interact/TCP/wpmd.h index 4c65440014..06ac5886c3 100644 --- a/lib/awpmd/systems/interact/TCP/wpmd.h +++ b/lib/awpmd/systems/interact/TCP/wpmd.h @@ -149,10 +149,8 @@ # include "pairhash.h" # include "TCP/tcpdefs.h" # include "wavepacket.h" -# include "erf.h" # include "cerf.h" - using namespace std; # include "lapack_inter.h" diff --git a/lib/awpmd/systems/interact/TCP/wpmd_split.cpp b/lib/awpmd/systems/interact/TCP/wpmd_split.cpp index f85b1ebf59..46a5776fef 100644 --- a/lib/awpmd/systems/interact/TCP/wpmd_split.cpp +++ b/lib/awpmd/systems/interact/TCP/wpmd_split.cpp @@ -1,6 +1,4 @@ # include "wpmd_split.h" -//# include "erf.h" - void AWPMD_split::resize(int flag){ for(int s=0;s<2;s++){ From 6e60131f1449f737ad59ed61f8410444207c15be Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 20:53:53 -0500 Subject: [PATCH 33/47] Windows portability changes --- cmake/CMakeSettings.json | 6 +++--- lib/colvars/colvarbias_meta.cpp | 2 +- lib/colvars/colvarproxy.cpp | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cmake/CMakeSettings.json b/cmake/CMakeSettings.json index c139114c0b..205b443bf1 100644 --- a/cmake/CMakeSettings.json +++ b/cmake/CMakeSettings.json @@ -72,7 +72,7 @@ "configurationType": "Debug", "buildRoot": "${workspaceRoot}\\build\\${name}", "installRoot": "${workspaceRoot}\\install\\${name}", - "cmakeCommandArgs": "-C ${workspaceRoot}\\cmake\\presets\\windows.cmake -DCMAKE_C_COMPILER=clang-cl.exe -DCMAKE_CXX_COMPILER=clang-cl.exe", + "cmakeCommandArgs": "-C ${workspaceRoot}\\cmake\\presets\\windows.cmake -DCMAKE_C_COMPILER=clang-cl.exe -DCMAKE_CXX_COMPILER=clang-cl.exe -DBUILD_MPI=off", "buildCommandArgs": "", "ctestCommandArgs": "", "inheritEnvironments": [ "clang_cl_x64" ], @@ -105,7 +105,7 @@ "configurationType": "Release", "buildRoot": "${workspaceRoot}\\build\\${name}", "installRoot": "${workspaceRoot}\\install\\${name}", - "cmakeCommandArgs": "-C ${workspaceRoot}\\cmake\\presets\\windows.cmake -DCMAKE_C_COMPILER=clang-cl.exe -DCMAKE_CXX_COMPILER=clang-cl.exe", + "cmakeCommandArgs": "-C ${workspaceRoot}\\cmake\\presets\\windows.cmake -DCMAKE_C_COMPILER=clang-cl.exe -DCMAKE_CXX_COMPILER=clang-cl.exe -DBUILD_MPI=off", "buildCommandArgs": "", "ctestCommandArgs": "-V", "inheritEnvironments": [ "clang_cl_x64" ], @@ -305,4 +305,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/lib/colvars/colvarbias_meta.cpp b/lib/colvars/colvarbias_meta.cpp index 911a1d89c1..0b31479276 100644 --- a/lib/colvars/colvarbias_meta.cpp +++ b/lib/colvars/colvarbias_meta.cpp @@ -14,7 +14,7 @@ #include // used to set the absolute path of a replica file -#if defined(WIN32) && !defined(__CYGWIN__) +#if defined(_WIN32) && !defined(__CYGWIN__) #include #define CHDIR ::_chdir #define GETCWD ::_getcwd diff --git a/lib/colvars/colvarproxy.cpp b/lib/colvars/colvarproxy.cpp index c091df828c..3d4c9c439b 100644 --- a/lib/colvars/colvarproxy.cpp +++ b/lib/colvars/colvarproxy.cpp @@ -8,10 +8,10 @@ // Colvars repository at GitHub. // Using access() to check if a file exists (until we can assume C++14/17) -#if !defined(WIN32) || defined(__CYGWIN__) +#if !defined(_WIN32) || defined(__CYGWIN__) #include #endif -#if defined(WIN32) +#if defined(_WIN32) #include #endif @@ -678,7 +678,7 @@ int colvarproxy_io::backup_file(char const *filename) // Simplified version of NAMD_file_exists() int exit_code; do { -#if defined(WIN32) && !defined(__CYGWIN__) +#if defined(_WIN32) && !defined(__CYGWIN__) // We could use _access_s here, but it is probably too new exit_code = _access(filename, 00); #else @@ -708,7 +708,7 @@ int colvarproxy_io::backup_file(char const *filename) int colvarproxy_io::remove_file(char const *filename) { int error_code = COLVARS_OK; -#if defined(WIN32) && !defined(__CYGWIN__) +#if defined(_WIN32) && !defined(__CYGWIN__) // Because the file may be open by other processes, rename it to filename.old std::string const renamed_file(std::string(filename)+".old"); // It may still be there from an interrupted run, so remove it to be safe @@ -741,7 +741,7 @@ int colvarproxy_io::remove_file(char const *filename) int colvarproxy_io::rename_file(char const *filename, char const *newfilename) { int error_code = COLVARS_OK; -#if defined(WIN32) && !defined(__CYGWIN__) +#if defined(_WIN32) && !defined(__CYGWIN__) // On straight Windows, must remove the destination before renaming it error_code |= remove_file(newfilename); #endif From 4552a2791d8ad9bf8392907b042e7e1d47c173f3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Dec 2022 21:41:31 -0500 Subject: [PATCH 34/47] add explicit dependency and link on linalg when used --- cmake/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 4351c40d75..21157afc7a 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -445,6 +445,7 @@ if(PKG_MSCG OR PKG_ATC OR PKG_AWPMD OR PKG_ML-QUIP OR PKG_ML-POD OR PKG_LATTE OR set_target_properties(linalg PROPERTIES OUTPUT_NAME lammps_linalg${LAMMPS_MACHINE}) set(BLAS_LIBRARIES "$") set(LAPACK_LIBRARIES "$") + target_link_libraries(lammps PRIVATE linalg) else() list(APPEND LAPACK_LIBRARIES ${BLAS_LIBRARIES}) endif() From 57790ef35ffd576d3600ad339f0d0d9b4a22cf29 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 31 Dec 2022 16:59:25 -0500 Subject: [PATCH 35/47] remove fortran sources and update README with pointer to the conversion package --- lib/linalg/README | 11 +- lib/linalg/convert.sh | 65 - lib/linalg/fortran/dasum.f | 131 -- lib/linalg/fortran/daxpy.f | 152 -- lib/linalg/fortran/dbdsqr.f | 864 -------- lib/linalg/fortran/dcabs1.f | 66 - lib/linalg/fortran/dcopy.f | 146 -- lib/linalg/fortran/ddot.f | 148 -- lib/linalg/fortran/dgebd2.f | 317 --- lib/linalg/fortran/dgebrd.f | 349 --- lib/linalg/fortran/dgecon.f | 258 --- lib/linalg/fortran/dgelq2.f | 197 -- lib/linalg/fortran/dgelqf.f | 274 --- lib/linalg/fortran/dgelsd.f | 626 ------ lib/linalg/fortran/dgelss.f | 744 ------- lib/linalg/fortran/dgemm.f | 379 ---- lib/linalg/fortran/dgemv.f | 327 --- lib/linalg/fortran/dgeqr2.f | 198 -- lib/linalg/fortran/dgeqrf.f | 282 --- lib/linalg/fortran/dger.f | 224 -- lib/linalg/fortran/dgesv.f | 176 -- lib/linalg/fortran/dgesvd.f | 3501 ------------------------------ lib/linalg/fortran/dgetf2.f | 210 -- lib/linalg/fortran/dgetrf.f | 222 -- lib/linalg/fortran/dgetrf2.f | 269 --- lib/linalg/fortran/dgetri.f | 258 --- lib/linalg/fortran/dgetrs.f | 222 -- lib/linalg/fortran/disnan.f | 77 - lib/linalg/fortran/dlabad.f | 102 - lib/linalg/fortran/dlabrd.f | 378 ---- lib/linalg/fortran/dlacn2.f | 304 --- lib/linalg/fortran/dlacpy.f | 153 -- lib/linalg/fortran/dladiv.f | 251 --- lib/linalg/fortran/dlae2.f | 182 -- lib/linalg/fortran/dlaed0.f | 431 ---- lib/linalg/fortran/dlaed1.f | 271 --- lib/linalg/fortran/dlaed2.f | 536 ----- lib/linalg/fortran/dlaed3.f | 350 --- lib/linalg/fortran/dlaed4.f | 917 -------- lib/linalg/fortran/dlaed5.f | 186 -- lib/linalg/fortran/dlaed6.f | 407 ---- lib/linalg/fortran/dlaed7.f | 404 ---- lib/linalg/fortran/dlaed8.f | 521 ----- lib/linalg/fortran/dlaed9.f | 291 --- lib/linalg/fortran/dlaeda.f | 305 --- lib/linalg/fortran/dlaev2.f | 235 -- lib/linalg/fortran/dlaisnan.f | 88 - lib/linalg/fortran/dlals0.f | 496 ----- lib/linalg/fortran/dlalsa.f | 490 ----- lib/linalg/fortran/dlalsd.f | 520 ----- lib/linalg/fortran/dlamch.f | 189 -- lib/linalg/fortran/dlamrg.f | 168 -- lib/linalg/fortran/dlange.f | 208 -- lib/linalg/fortran/dlanst.f | 183 -- lib/linalg/fortran/dlansy.f | 238 -- lib/linalg/fortran/dlapy2.f | 117 - lib/linalg/fortran/dlapy3.f | 112 - lib/linalg/fortran/dlarf.f | 224 -- lib/linalg/fortran/dlarfb.f | 709 ------ lib/linalg/fortran/dlarfg.f | 193 -- lib/linalg/fortran/dlarft.f | 323 --- lib/linalg/fortran/dlartg.f | 204 -- lib/linalg/fortran/dlas2.f | 180 -- lib/linalg/fortran/dlascl.f | 367 ---- lib/linalg/fortran/dlasd4.f | 1058 --------- lib/linalg/fortran/dlasd5.f | 228 -- lib/linalg/fortran/dlasd6.f | 440 ---- lib/linalg/fortran/dlasd7.f | 577 ----- lib/linalg/fortran/dlasd8.f | 339 --- lib/linalg/fortran/dlasda.f | 511 ----- lib/linalg/fortran/dlasdq.f | 410 ---- lib/linalg/fortran/dlasdt.f | 169 -- lib/linalg/fortran/dlaset.f | 181 -- lib/linalg/fortran/dlasq1.f | 221 -- lib/linalg/fortran/dlasq2.f | 586 ----- lib/linalg/fortran/dlasq3.f | 418 ---- lib/linalg/fortran/dlasq4.f | 421 ---- lib/linalg/fortran/dlasq5.f | 407 ---- lib/linalg/fortran/dlasq6.f | 251 --- lib/linalg/fortran/dlasr.f | 433 ---- lib/linalg/fortran/dlasrt.f | 300 --- lib/linalg/fortran/dlassq.f | 155 -- lib/linalg/fortran/dlasv2.f | 322 --- lib/linalg/fortran/dlaswp.f | 190 -- lib/linalg/fortran/dlatrd.f | 333 --- lib/linalg/fortran/dlatrs.f | 843 ------- lib/linalg/fortran/dnrm2.f | 132 -- lib/linalg/fortran/dorg2l.f | 195 -- lib/linalg/fortran/dorg2r.f | 197 -- lib/linalg/fortran/dorgbr.f | 334 --- lib/linalg/fortran/dorgl2.f | 201 -- lib/linalg/fortran/dorglq.f | 286 --- lib/linalg/fortran/dorgql.f | 293 --- lib/linalg/fortran/dorgqr.f | 287 --- lib/linalg/fortran/dorgtr.f | 252 --- lib/linalg/fortran/dorm2l.f | 275 --- lib/linalg/fortran/dorm2r.f | 279 --- lib/linalg/fortran/dormbr.f | 369 ---- lib/linalg/fortran/dorml2.f | 279 --- lib/linalg/fortran/dormlq.f | 344 --- lib/linalg/fortran/dormql.f | 336 --- lib/linalg/fortran/dormqr.f | 337 --- lib/linalg/fortran/dormtr.f | 307 --- lib/linalg/fortran/dposv.f | 190 -- lib/linalg/fortran/dpotf2.f | 227 -- lib/linalg/fortran/dpotrf.f | 243 --- lib/linalg/fortran/dpotrf2.f | 234 -- lib/linalg/fortran/dpotrs.f | 201 -- lib/linalg/fortran/drot.f | 142 -- lib/linalg/fortran/drscl.f | 171 -- lib/linalg/fortran/dscal.f | 139 -- lib/linalg/fortran/dstedc.f | 479 ---- lib/linalg/fortran/dsteqr.f | 569 ----- lib/linalg/fortran/dsterf.f | 423 ---- lib/linalg/fortran/dswap.f | 153 -- lib/linalg/fortran/dsyev.f | 283 --- lib/linalg/fortran/dsyevd.f | 354 --- lib/linalg/fortran/dsygs2.f | 280 --- lib/linalg/fortran/dsygst.f | 318 --- lib/linalg/fortran/dsygv.f | 311 --- lib/linalg/fortran/dsygvd.f | 377 ---- lib/linalg/fortran/dsymm.f | 364 ---- lib/linalg/fortran/dsymv.f | 330 --- lib/linalg/fortran/dsyr2.f | 295 --- lib/linalg/fortran/dsyr2k.f | 396 ---- lib/linalg/fortran/dsyrk.f | 361 --- lib/linalg/fortran/dsytd2.f | 320 --- lib/linalg/fortran/dsytrd.f | 373 ---- lib/linalg/fortran/dtrmm.f | 412 ---- lib/linalg/fortran/dtrmv.f | 339 --- lib/linalg/fortran/dtrsm.f | 440 ---- lib/linalg/fortran/dtrsv.f | 335 --- lib/linalg/fortran/dtrti2.f | 209 -- lib/linalg/fortran/dtrtri.f | 239 -- lib/linalg/fortran/dznrm2.f | 140 -- lib/linalg/fortran/idamax.f | 126 -- lib/linalg/fortran/ieeeck.f | 200 -- lib/linalg/fortran/iladlc.f | 115 - lib/linalg/fortran/iladlr.f | 118 - lib/linalg/fortran/ilaenv.f | 730 ------- lib/linalg/fortran/ilazlc.f | 115 - lib/linalg/fortran/ilazlr.f | 118 - lib/linalg/fortran/iparmq.f | 406 ---- lib/linalg/fortran/lsame.f | 122 -- lib/linalg/fortran/xerbla.f | 96 - lib/linalg/fortran/zaxpy.f | 139 -- lib/linalg/fortran/zcopy.f | 125 -- lib/linalg/fortran/zdotc.f | 134 -- lib/linalg/fortran/zdrot.f | 153 -- lib/linalg/fortran/zdscal.f | 123 -- lib/linalg/fortran/zgemm.f | 477 ---- lib/linalg/fortran/zgemv.f | 347 --- lib/linalg/fortran/zgerc.f | 224 -- lib/linalg/fortran/zheev.f | 295 --- lib/linalg/fortran/zheevd.f | 395 ---- lib/linalg/fortran/zhemv.f | 334 --- lib/linalg/fortran/zher2.f | 314 --- lib/linalg/fortran/zher2k.f | 440 ---- lib/linalg/fortran/zhetd2.f | 331 --- lib/linalg/fortran/zhetrd.f | 375 ---- lib/linalg/fortran/zhpr.f | 276 --- lib/linalg/fortran/zlacgv.f | 113 - lib/linalg/fortran/zlacpy.f | 156 -- lib/linalg/fortran/zlacrm.f | 182 -- lib/linalg/fortran/zladiv.f | 94 - lib/linalg/fortran/zlaed0.f | 368 ---- lib/linalg/fortran/zlaed7.f | 382 ---- lib/linalg/fortran/zlaed8.f | 483 ----- lib/linalg/fortran/zlanhe.f | 255 --- lib/linalg/fortran/zlarf.f | 229 -- lib/linalg/fortran/zlarfb.f | 730 ------- lib/linalg/fortran/zlarfg.f | 200 -- lib/linalg/fortran/zlarft.f | 324 --- lib/linalg/fortran/zlascl.f | 367 ---- lib/linalg/fortran/zlaset.f | 181 -- lib/linalg/fortran/zlasr.f | 436 ---- lib/linalg/fortran/zlassq.f | 168 -- lib/linalg/fortran/zlatrd.f | 355 --- lib/linalg/fortran/zpptrf.f | 238 -- lib/linalg/fortran/zpptri.f | 187 -- lib/linalg/fortran/zscal.f | 121 -- lib/linalg/fortran/zstedc.f | 483 ----- lib/linalg/fortran/zsteqr.f | 573 ----- lib/linalg/fortran/zswap.f | 129 -- lib/linalg/fortran/ztpmv.f | 385 ---- lib/linalg/fortran/ztpsv.f | 387 ---- lib/linalg/fortran/ztptri.f | 239 -- lib/linalg/fortran/ztrmm.f | 449 ---- lib/linalg/fortran/ztrmv.f | 370 ---- lib/linalg/fortran/zung2l.f | 196 -- lib/linalg/fortran/zung2r.f | 198 -- lib/linalg/fortran/zungl2.f | 204 -- lib/linalg/fortran/zungql.f | 293 --- lib/linalg/fortran/zungqr.f | 287 --- lib/linalg/fortran/zungtr.f | 253 --- lib/linalg/fortran/zunm2l.f | 278 --- lib/linalg/fortran/zunm2r.f | 283 --- lib/linalg/fortran/zunmql.f | 336 --- lib/linalg/fortran/zunmqr.f | 337 --- lib/linalg/fortran/zunmtr.f | 307 --- lib/linalg/s_lmp_cmp.cpp | 2 +- lib/linalg/s_lmp_copy.cpp | 4 +- lib/linalg/static/.clang-format | 23 - lib/linalg/static/README | 8 - lib/linalg/static/d_lmp_cnjg.cpp | 13 - lib/linalg/static/d_lmp_imag.cpp | 10 - lib/linalg/static/d_lmp_lg10.cpp | 14 - lib/linalg/static/d_lmp_sign.cpp | 12 - lib/linalg/static/dgetrf2.f | 269 --- lib/linalg/static/disnan.cpp | 14 - lib/linalg/static/dlamc3.f | 45 - lib/linalg/static/dlamch.cpp | 45 - lib/linalg/static/dlarft.f | 327 --- lib/linalg/static/dpotrf2.f | 234 -- lib/linalg/static/i_lmp_dnnt.cpp | 12 - lib/linalg/static/i_lmp_len.cpp | 10 - lib/linalg/static/i_lmp_nint.cpp | 13 - lib/linalg/static/lsame.cpp | 17 - lib/linalg/static/pow_lmp_dd.cpp | 12 - lib/linalg/static/pow_lmp_di.cpp | 31 - lib/linalg/static/pow_lmp_ii.cpp | 29 - lib/linalg/static/s_lmp_cat.cpp | 23 - lib/linalg/static/s_lmp_cmp.cpp | 45 - lib/linalg/static/s_lmp_copy.cpp | 26 - lib/linalg/static/xerbla.cpp | 31 - lib/linalg/static/z_lmp_abs.cpp | 31 - lib/linalg/static/z_lmp_div.cpp | 31 - lib/linalg/static/zlarft.f | 328 --- 228 files changed, 10 insertions(+), 64902 deletions(-) delete mode 100755 lib/linalg/convert.sh delete mode 100644 lib/linalg/fortran/dasum.f delete mode 100644 lib/linalg/fortran/daxpy.f delete mode 100644 lib/linalg/fortran/dbdsqr.f delete mode 100644 lib/linalg/fortran/dcabs1.f delete mode 100644 lib/linalg/fortran/dcopy.f delete mode 100644 lib/linalg/fortran/ddot.f delete mode 100644 lib/linalg/fortran/dgebd2.f delete mode 100644 lib/linalg/fortran/dgebrd.f delete mode 100644 lib/linalg/fortran/dgecon.f delete mode 100644 lib/linalg/fortran/dgelq2.f delete mode 100644 lib/linalg/fortran/dgelqf.f delete mode 100644 lib/linalg/fortran/dgelsd.f delete mode 100644 lib/linalg/fortran/dgelss.f delete mode 100644 lib/linalg/fortran/dgemm.f delete mode 100644 lib/linalg/fortran/dgemv.f delete mode 100644 lib/linalg/fortran/dgeqr2.f delete mode 100644 lib/linalg/fortran/dgeqrf.f delete mode 100644 lib/linalg/fortran/dger.f delete mode 100644 lib/linalg/fortran/dgesv.f delete mode 100644 lib/linalg/fortran/dgesvd.f delete mode 100644 lib/linalg/fortran/dgetf2.f delete mode 100644 lib/linalg/fortran/dgetrf.f delete mode 100644 lib/linalg/fortran/dgetrf2.f delete mode 100644 lib/linalg/fortran/dgetri.f delete mode 100644 lib/linalg/fortran/dgetrs.f delete mode 100644 lib/linalg/fortran/disnan.f delete mode 100644 lib/linalg/fortran/dlabad.f delete mode 100644 lib/linalg/fortran/dlabrd.f delete mode 100644 lib/linalg/fortran/dlacn2.f delete mode 100644 lib/linalg/fortran/dlacpy.f delete mode 100644 lib/linalg/fortran/dladiv.f delete mode 100644 lib/linalg/fortran/dlae2.f delete mode 100644 lib/linalg/fortran/dlaed0.f delete mode 100644 lib/linalg/fortran/dlaed1.f delete mode 100644 lib/linalg/fortran/dlaed2.f delete mode 100644 lib/linalg/fortran/dlaed3.f delete mode 100644 lib/linalg/fortran/dlaed4.f delete mode 100644 lib/linalg/fortran/dlaed5.f delete mode 100644 lib/linalg/fortran/dlaed6.f delete mode 100644 lib/linalg/fortran/dlaed7.f delete mode 100644 lib/linalg/fortran/dlaed8.f delete mode 100644 lib/linalg/fortran/dlaed9.f delete mode 100644 lib/linalg/fortran/dlaeda.f delete mode 100644 lib/linalg/fortran/dlaev2.f delete mode 100644 lib/linalg/fortran/dlaisnan.f delete mode 100644 lib/linalg/fortran/dlals0.f delete mode 100644 lib/linalg/fortran/dlalsa.f delete mode 100644 lib/linalg/fortran/dlalsd.f delete mode 100644 lib/linalg/fortran/dlamch.f delete mode 100644 lib/linalg/fortran/dlamrg.f delete mode 100644 lib/linalg/fortran/dlange.f delete mode 100644 lib/linalg/fortran/dlanst.f delete mode 100644 lib/linalg/fortran/dlansy.f delete mode 100644 lib/linalg/fortran/dlapy2.f delete mode 100644 lib/linalg/fortran/dlapy3.f delete mode 100644 lib/linalg/fortran/dlarf.f delete mode 100644 lib/linalg/fortran/dlarfb.f delete mode 100644 lib/linalg/fortran/dlarfg.f delete mode 100644 lib/linalg/fortran/dlarft.f delete mode 100644 lib/linalg/fortran/dlartg.f delete mode 100644 lib/linalg/fortran/dlas2.f delete mode 100644 lib/linalg/fortran/dlascl.f delete mode 100644 lib/linalg/fortran/dlasd4.f delete mode 100644 lib/linalg/fortran/dlasd5.f delete mode 100644 lib/linalg/fortran/dlasd6.f delete mode 100644 lib/linalg/fortran/dlasd7.f delete mode 100644 lib/linalg/fortran/dlasd8.f delete mode 100644 lib/linalg/fortran/dlasda.f delete mode 100644 lib/linalg/fortran/dlasdq.f delete mode 100644 lib/linalg/fortran/dlasdt.f delete mode 100644 lib/linalg/fortran/dlaset.f delete mode 100644 lib/linalg/fortran/dlasq1.f delete mode 100644 lib/linalg/fortran/dlasq2.f delete mode 100644 lib/linalg/fortran/dlasq3.f delete mode 100644 lib/linalg/fortran/dlasq4.f delete mode 100644 lib/linalg/fortran/dlasq5.f delete mode 100644 lib/linalg/fortran/dlasq6.f delete mode 100644 lib/linalg/fortran/dlasr.f delete mode 100644 lib/linalg/fortran/dlasrt.f delete mode 100644 lib/linalg/fortran/dlassq.f delete mode 100644 lib/linalg/fortran/dlasv2.f delete mode 100644 lib/linalg/fortran/dlaswp.f delete mode 100644 lib/linalg/fortran/dlatrd.f delete mode 100644 lib/linalg/fortran/dlatrs.f delete mode 100644 lib/linalg/fortran/dnrm2.f delete mode 100644 lib/linalg/fortran/dorg2l.f delete mode 100644 lib/linalg/fortran/dorg2r.f delete mode 100644 lib/linalg/fortran/dorgbr.f delete mode 100644 lib/linalg/fortran/dorgl2.f delete mode 100644 lib/linalg/fortran/dorglq.f delete mode 100644 lib/linalg/fortran/dorgql.f delete mode 100644 lib/linalg/fortran/dorgqr.f delete mode 100644 lib/linalg/fortran/dorgtr.f delete mode 100644 lib/linalg/fortran/dorm2l.f delete mode 100644 lib/linalg/fortran/dorm2r.f delete mode 100644 lib/linalg/fortran/dormbr.f delete mode 100644 lib/linalg/fortran/dorml2.f delete mode 100644 lib/linalg/fortran/dormlq.f delete mode 100644 lib/linalg/fortran/dormql.f delete mode 100644 lib/linalg/fortran/dormqr.f delete mode 100644 lib/linalg/fortran/dormtr.f delete mode 100644 lib/linalg/fortran/dposv.f delete mode 100644 lib/linalg/fortran/dpotf2.f delete mode 100644 lib/linalg/fortran/dpotrf.f delete mode 100644 lib/linalg/fortran/dpotrf2.f delete mode 100644 lib/linalg/fortran/dpotrs.f delete mode 100644 lib/linalg/fortran/drot.f delete mode 100644 lib/linalg/fortran/drscl.f delete mode 100644 lib/linalg/fortran/dscal.f delete mode 100644 lib/linalg/fortran/dstedc.f delete mode 100644 lib/linalg/fortran/dsteqr.f delete mode 100644 lib/linalg/fortran/dsterf.f delete mode 100644 lib/linalg/fortran/dswap.f delete mode 100644 lib/linalg/fortran/dsyev.f delete mode 100644 lib/linalg/fortran/dsyevd.f delete mode 100644 lib/linalg/fortran/dsygs2.f delete mode 100644 lib/linalg/fortran/dsygst.f delete mode 100644 lib/linalg/fortran/dsygv.f delete mode 100644 lib/linalg/fortran/dsygvd.f delete mode 100644 lib/linalg/fortran/dsymm.f delete mode 100644 lib/linalg/fortran/dsymv.f delete mode 100644 lib/linalg/fortran/dsyr2.f delete mode 100644 lib/linalg/fortran/dsyr2k.f delete mode 100644 lib/linalg/fortran/dsyrk.f delete mode 100644 lib/linalg/fortran/dsytd2.f delete mode 100644 lib/linalg/fortran/dsytrd.f delete mode 100644 lib/linalg/fortran/dtrmm.f delete mode 100644 lib/linalg/fortran/dtrmv.f delete mode 100644 lib/linalg/fortran/dtrsm.f delete mode 100644 lib/linalg/fortran/dtrsv.f delete mode 100644 lib/linalg/fortran/dtrti2.f delete mode 100644 lib/linalg/fortran/dtrtri.f delete mode 100644 lib/linalg/fortran/dznrm2.f delete mode 100644 lib/linalg/fortran/idamax.f delete mode 100644 lib/linalg/fortran/ieeeck.f delete mode 100644 lib/linalg/fortran/iladlc.f delete mode 100644 lib/linalg/fortran/iladlr.f delete mode 100644 lib/linalg/fortran/ilaenv.f delete mode 100644 lib/linalg/fortran/ilazlc.f delete mode 100644 lib/linalg/fortran/ilazlr.f delete mode 100644 lib/linalg/fortran/iparmq.f delete mode 100644 lib/linalg/fortran/lsame.f delete mode 100644 lib/linalg/fortran/xerbla.f delete mode 100644 lib/linalg/fortran/zaxpy.f delete mode 100644 lib/linalg/fortran/zcopy.f delete mode 100644 lib/linalg/fortran/zdotc.f delete mode 100644 lib/linalg/fortran/zdrot.f delete mode 100644 lib/linalg/fortran/zdscal.f delete mode 100644 lib/linalg/fortran/zgemm.f delete mode 100644 lib/linalg/fortran/zgemv.f delete mode 100644 lib/linalg/fortran/zgerc.f delete mode 100644 lib/linalg/fortran/zheev.f delete mode 100644 lib/linalg/fortran/zheevd.f delete mode 100644 lib/linalg/fortran/zhemv.f delete mode 100644 lib/linalg/fortran/zher2.f delete mode 100644 lib/linalg/fortran/zher2k.f delete mode 100644 lib/linalg/fortran/zhetd2.f delete mode 100644 lib/linalg/fortran/zhetrd.f delete mode 100644 lib/linalg/fortran/zhpr.f delete mode 100644 lib/linalg/fortran/zlacgv.f delete mode 100644 lib/linalg/fortran/zlacpy.f delete mode 100644 lib/linalg/fortran/zlacrm.f delete mode 100644 lib/linalg/fortran/zladiv.f delete mode 100644 lib/linalg/fortran/zlaed0.f delete mode 100644 lib/linalg/fortran/zlaed7.f delete mode 100644 lib/linalg/fortran/zlaed8.f delete mode 100644 lib/linalg/fortran/zlanhe.f delete mode 100644 lib/linalg/fortran/zlarf.f delete mode 100644 lib/linalg/fortran/zlarfb.f delete mode 100644 lib/linalg/fortran/zlarfg.f delete mode 100644 lib/linalg/fortran/zlarft.f delete mode 100644 lib/linalg/fortran/zlascl.f delete mode 100644 lib/linalg/fortran/zlaset.f delete mode 100644 lib/linalg/fortran/zlasr.f delete mode 100644 lib/linalg/fortran/zlassq.f delete mode 100644 lib/linalg/fortran/zlatrd.f delete mode 100644 lib/linalg/fortran/zpptrf.f delete mode 100644 lib/linalg/fortran/zpptri.f delete mode 100644 lib/linalg/fortran/zscal.f delete mode 100644 lib/linalg/fortran/zstedc.f delete mode 100644 lib/linalg/fortran/zsteqr.f delete mode 100644 lib/linalg/fortran/zswap.f delete mode 100644 lib/linalg/fortran/ztpmv.f delete mode 100644 lib/linalg/fortran/ztpsv.f delete mode 100644 lib/linalg/fortran/ztptri.f delete mode 100644 lib/linalg/fortran/ztrmm.f delete mode 100644 lib/linalg/fortran/ztrmv.f delete mode 100644 lib/linalg/fortran/zung2l.f delete mode 100644 lib/linalg/fortran/zung2r.f delete mode 100644 lib/linalg/fortran/zungl2.f delete mode 100644 lib/linalg/fortran/zungql.f delete mode 100644 lib/linalg/fortran/zungqr.f delete mode 100644 lib/linalg/fortran/zungtr.f delete mode 100644 lib/linalg/fortran/zunm2l.f delete mode 100644 lib/linalg/fortran/zunm2r.f delete mode 100644 lib/linalg/fortran/zunmql.f delete mode 100644 lib/linalg/fortran/zunmqr.f delete mode 100644 lib/linalg/fortran/zunmtr.f delete mode 100644 lib/linalg/static/.clang-format delete mode 100644 lib/linalg/static/README delete mode 100644 lib/linalg/static/d_lmp_cnjg.cpp delete mode 100644 lib/linalg/static/d_lmp_imag.cpp delete mode 100644 lib/linalg/static/d_lmp_lg10.cpp delete mode 100644 lib/linalg/static/d_lmp_sign.cpp delete mode 100644 lib/linalg/static/dgetrf2.f delete mode 100644 lib/linalg/static/disnan.cpp delete mode 100644 lib/linalg/static/dlamc3.f delete mode 100644 lib/linalg/static/dlamch.cpp delete mode 100644 lib/linalg/static/dlarft.f delete mode 100644 lib/linalg/static/dpotrf2.f delete mode 100644 lib/linalg/static/i_lmp_dnnt.cpp delete mode 100644 lib/linalg/static/i_lmp_len.cpp delete mode 100644 lib/linalg/static/i_lmp_nint.cpp delete mode 100644 lib/linalg/static/lsame.cpp delete mode 100644 lib/linalg/static/pow_lmp_dd.cpp delete mode 100644 lib/linalg/static/pow_lmp_di.cpp delete mode 100644 lib/linalg/static/pow_lmp_ii.cpp delete mode 100644 lib/linalg/static/s_lmp_cat.cpp delete mode 100644 lib/linalg/static/s_lmp_cmp.cpp delete mode 100644 lib/linalg/static/s_lmp_copy.cpp delete mode 100644 lib/linalg/static/xerbla.cpp delete mode 100644 lib/linalg/static/z_lmp_abs.cpp delete mode 100644 lib/linalg/static/z_lmp_div.cpp delete mode 100644 lib/linalg/static/zlarft.f diff --git a/lib/linalg/README b/lib/linalg/README index 68f17d9986..6c04225d17 100644 --- a/lib/linalg/README +++ b/lib/linalg/README @@ -1,10 +1,13 @@ This directory has generic BLAS and LAPACK source files needed by the ATC, AWPMD, ELECTRODE, LATTE, and ML-POD packages (and possibly by other packages) in the future that can be used instead of platform or vendor -optimized BLAS/LAPACK library. For increased portability, the -BLAS/LAPACK source files have been translated to C++ with f2c. A few -subroutines using Fortran runtime functions have been re-implemented -in C++. Please see the convert.sh script for how the conversion was done. +optimized BLAS/LAPACK library. To simplify installation, these files +have been translated from the Fortran versions of the BLAS and LAPACK +references source files at https://netlib.org/lapack/ to C++ with f2c. +The package with the tools to do the translation and the matching +original Fortran sources are at https://github.com/lammps/linalg. +Please note that even through the files are C++ source code the +resulting library will follow the Fortran binary conventions. Note that this is an *incomplete* subset of full BLAS/LAPACK. diff --git a/lib/linalg/convert.sh b/lib/linalg/convert.sh deleted file mode 100755 index 0dba27c9e3..0000000000 --- a/lib/linalg/convert.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash - -has_f2c=$(type f2c > /dev/null 2>&1 && echo 1 || echo 0) -if test ${has_f2c} -eq 0 -then - echo "Must have f2c installed to run this script" - exit 1 -fi - -# cleanup -rm -f *.c *.cpp *.P *~ *.orig *.bak *.rej - -# translate original files directly -for f in fortran/*.f -do \ - b=$(basename $f .f) - # skip files for which we have replacements - if test $b == dgetrf2 || test $b == disnan || test $b == dlaisnan || \ - test $b == dlamch || test $b == dlarft || test $b == dpotrf2 || \ - test $b == lsame || test $b == xerbla || test $b == zlarft - then - echo Skipping $b - else - # convert to C++ with f2c, make local variables dynamic, - # strip comments, and reindent with clang-format. - f2c -C++ -a -f < $f \ - | g++ -fpreprocessed -dD -P -E - \ - | clang-format -style=file:static/.clang-format > $b.cpp || exit 2 - # silence c++ compiler warnings about string constants, use custom f2c header - sed -i -e 's/\("[^"]\+"\)/(char *)\1/g' -e 's/^extern.*"C"/extern "C"/' \ - -e 's/^#include.*"f2c.h"/#include "lmp_f2c.h"/' $b.cpp - # replace libf2c functions with local versions under different names - sed -i -e 's/s_\(cat\|cmp\|copy\)(/s_lmp_\1(/g' \ - -e 's/d_\(sign\|cnjg\|imag\|lg10\)(/d_lmp_\1(/g' \ - -e 's/z_\(abs\|div\)(/z_lmp_\1(/g' \ - -e 's/i_\(len\|nint\|dnnt\)(/i_lmp_\1(/g' \ - -e 's/pow_\(dd\|di\|ii\)(/pow_lmp_\1(/g' $b.cpp - fi -done - -# translate modified versions -for f in static/*.f -do \ - b=$(basename $f .f) - # convert to C++ with f2c, make local variables dynamic, - # strip comments, and reindent with clang-format. - f2c -C++ -a -f < $f \ - | g++ -fpreprocessed -dD -P -E - \ - | clang-format -style=file:static/.clang-format > $b.cpp || exit 2 - # silence c++ compiler warnings about string constants, use custom f2c header - sed -i -e 's/\("[^"]\+"\)/(char *)\1/g' -e 's/^extern.*"C"/extern "C"/' \ - -e 's/^#include.*"f2c.h"/#include "lmp_f2c.h"/' $b.cpp - # replace libf2c functions with local versions under different names - sed -i -e 's/s_\(cat\|cmp\|copy\)(/s_lmp_\1(/g' \ - -e 's/d_\(sign\|cnjg\|imag\|lg10\)(/d_lmp_\1(/g' \ - -e 's/z_\(abs\|div\)(/z_lmp_\1(/g' \ - -e 's/i_\(len\|nint\|dnnt\)(/i_lmp_\1(/g' \ - -e 's/pow_\(dd\|di\|ii\)(/pow_lmp_\1(/g' $b.cpp -done - -# copy direct C++ alternatives -for c in static/*.cpp -do \ - cp -v $c . -done diff --git a/lib/linalg/fortran/dasum.f b/lib/linalg/fortran/dasum.f deleted file mode 100644 index 9a360b5acd..0000000000 --- a/lib/linalg/fortran/dasum.f +++ /dev/null @@ -1,131 +0,0 @@ -*> \brief \b DASUM -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DASUM(N,DX,INCX) -* -* .. Scalar Arguments .. -* INTEGER INCX,N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION DX(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DASUM takes the sum of the absolute values. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] DX -*> \verbatim -*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of DX -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, linpack, 3/11/78. -*> modified 3/93 to return if incx .le. 0. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - DOUBLE PRECISION FUNCTION DASUM(N,DX,INCX) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,N -* .. -* .. Array Arguments .. - DOUBLE PRECISION DX(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - DOUBLE PRECISION DTEMP - INTEGER I,M,MP1,NINCX -* .. -* .. Intrinsic Functions .. - INTRINSIC DABS,MOD -* .. - DASUM = 0.0d0 - DTEMP = 0.0d0 - IF (N.LE.0 .OR. INCX.LE.0) RETURN - IF (INCX.EQ.1) THEN -* code for increment equal to 1 -* -* -* clean-up loop -* - M = MOD(N,6) - IF (M.NE.0) THEN - DO I = 1,M - DTEMP = DTEMP + DABS(DX(I)) - END DO - IF (N.LT.6) THEN - DASUM = DTEMP - RETURN - END IF - END IF - MP1 = M + 1 - DO I = MP1,N,6 - DTEMP = DTEMP + DABS(DX(I)) + DABS(DX(I+1)) + - $ DABS(DX(I+2)) + DABS(DX(I+3)) + - $ DABS(DX(I+4)) + DABS(DX(I+5)) - END DO - ELSE -* -* code for increment not equal to 1 -* - NINCX = N*INCX - DO I = 1,NINCX,INCX - DTEMP = DTEMP + DABS(DX(I)) - END DO - END IF - DASUM = DTEMP - RETURN -* -* End of DASUM -* - END diff --git a/lib/linalg/fortran/daxpy.f b/lib/linalg/fortran/daxpy.f deleted file mode 100644 index 421f7c630b..0000000000 --- a/lib/linalg/fortran/daxpy.f +++ /dev/null @@ -1,152 +0,0 @@ -*> \brief \b DAXPY -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DAXPY(N,DA,DX,INCX,DY,INCY) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION DA -* INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION DX(*),DY(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DAXPY constant times a vector plus a vector. -*> uses unrolled loops for increments equal to one. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] DA -*> \verbatim -*> DA is DOUBLE PRECISION -*> On entry, DA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] DX -*> \verbatim -*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of DX -*> \endverbatim -*> -*> \param[in,out] DY -*> \verbatim -*> DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> storage spacing between elements of DY -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, linpack, 3/11/78. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DAXPY(N,DA,DX,INCX,DY,INCY) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION DA - INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. - DOUBLE PRECISION DX(*),DY(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I,IX,IY,M,MP1 -* .. -* .. Intrinsic Functions .. - INTRINSIC MOD -* .. - IF (N.LE.0) RETURN - IF (DA.EQ.0.0d0) RETURN - IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN -* -* code for both increments equal to 1 -* -* -* clean-up loop -* - M = MOD(N,4) - IF (M.NE.0) THEN - DO I = 1,M - DY(I) = DY(I) + DA*DX(I) - END DO - END IF - IF (N.LT.4) RETURN - MP1 = M + 1 - DO I = MP1,N,4 - DY(I) = DY(I) + DA*DX(I) - DY(I+1) = DY(I+1) + DA*DX(I+1) - DY(I+2) = DY(I+2) + DA*DX(I+2) - DY(I+3) = DY(I+3) + DA*DX(I+3) - END DO - ELSE -* -* code for unequal increments or equal increments -* not equal to 1 -* - IX = 1 - IY = 1 - IF (INCX.LT.0) IX = (-N+1)*INCX + 1 - IF (INCY.LT.0) IY = (-N+1)*INCY + 1 - DO I = 1,N - DY(IY) = DY(IY) + DA*DX(IX) - IX = IX + INCX - IY = IY + INCY - END DO - END IF - RETURN -* -* End of DAXPY -* - END diff --git a/lib/linalg/fortran/dbdsqr.f b/lib/linalg/fortran/dbdsqr.f deleted file mode 100644 index c220a5875d..0000000000 --- a/lib/linalg/fortran/dbdsqr.f +++ /dev/null @@ -1,864 +0,0 @@ -*> \brief \b DBDSQR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DBDSQR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, -* LDU, C, LDC, WORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU -* .. -* .. Array Arguments .. -* DOUBLE PRECISION C( LDC, * ), D( * ), E( * ), U( LDU, * ), -* $ VT( LDVT, * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DBDSQR computes the singular values and, optionally, the right and/or -*> left singular vectors from the singular value decomposition (SVD) of -*> a real N-by-N (upper or lower) bidiagonal matrix B using the implicit -*> zero-shift QR algorithm. The SVD of B has the form -*> -*> B = Q * S * P**T -*> -*> where S is the diagonal matrix of singular values, Q is an orthogonal -*> matrix of left singular vectors, and P is an orthogonal matrix of -*> right singular vectors. If left singular vectors are requested, this -*> subroutine actually returns U*Q instead of Q, and, if right singular -*> vectors are requested, this subroutine returns P**T*VT instead of -*> P**T, for given real input matrices U and VT. When U and VT are the -*> orthogonal matrices that reduce a general matrix A to bidiagonal -*> form: A = U*B*VT, as computed by DGEBRD, then -*> -*> A = (U*Q) * S * (P**T*VT) -*> -*> is the SVD of A. Optionally, the subroutine may also compute Q**T*C -*> for a given real input matrix C. -*> -*> See "Computing Small Singular Values of Bidiagonal Matrices With -*> Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan, -*> LAPACK Working Note #3 (or SIAM J. Sci. Statist. Comput. vol. 11, -*> no. 5, pp. 873-912, Sept 1990) and -*> "Accurate singular values and differential qd algorithms," by -*> B. Parlett and V. Fernando, Technical Report CPAM-554, Mathematics -*> Department, University of California at Berkeley, July 1992 -*> for a detailed description of the algorithm. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': B is upper bidiagonal; -*> = 'L': B is lower bidiagonal. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix B. N >= 0. -*> \endverbatim -*> -*> \param[in] NCVT -*> \verbatim -*> NCVT is INTEGER -*> The number of columns of the matrix VT. NCVT >= 0. -*> \endverbatim -*> -*> \param[in] NRU -*> \verbatim -*> NRU is INTEGER -*> The number of rows of the matrix U. NRU >= 0. -*> \endverbatim -*> -*> \param[in] NCC -*> \verbatim -*> NCC is INTEGER -*> The number of columns of the matrix C. NCC >= 0. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the n diagonal elements of the bidiagonal matrix B. -*> On exit, if INFO=0, the singular values of B in decreasing -*> order. -*> \endverbatim -*> -*> \param[in,out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> On entry, the N-1 offdiagonal elements of the bidiagonal -*> matrix B. -*> On exit, if INFO = 0, E is destroyed; if INFO > 0, D and E -*> will contain the diagonal and superdiagonal elements of a -*> bidiagonal matrix orthogonally equivalent to the one given -*> as input. -*> \endverbatim -*> -*> \param[in,out] VT -*> \verbatim -*> VT is DOUBLE PRECISION array, dimension (LDVT, NCVT) -*> On entry, an N-by-NCVT matrix VT. -*> On exit, VT is overwritten by P**T * VT. -*> Not referenced if NCVT = 0. -*> \endverbatim -*> -*> \param[in] LDVT -*> \verbatim -*> LDVT is INTEGER -*> The leading dimension of the array VT. -*> LDVT >= max(1,N) if NCVT > 0; LDVT >= 1 if NCVT = 0. -*> \endverbatim -*> -*> \param[in,out] U -*> \verbatim -*> U is DOUBLE PRECISION array, dimension (LDU, N) -*> On entry, an NRU-by-N matrix U. -*> On exit, U is overwritten by U * Q. -*> Not referenced if NRU = 0. -*> \endverbatim -*> -*> \param[in] LDU -*> \verbatim -*> LDU is INTEGER -*> The leading dimension of the array U. LDU >= max(1,NRU). -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC, NCC) -*> On entry, an N-by-NCC matrix C. -*> On exit, C is overwritten by Q**T * C. -*> Not referenced if NCC = 0. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. -*> LDC >= max(1,N) if NCC > 0; LDC >=1 if NCC = 0. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (4*(N-1)) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: If INFO = -i, the i-th argument had an illegal value -*> > 0: -*> if NCVT = NRU = NCC = 0, -*> = 1, a split was marked by a positive value in E -*> = 2, current block of Z not diagonalized after 30*N -*> iterations (in inner while loop) -*> = 3, termination criterion of outer while loop not met -*> (program created more than N unreduced blocks) -*> else NCVT = NRU = NCC = 0, -*> the algorithm did not converge; D and E contain the -*> elements of a bidiagonal matrix which is orthogonally -*> similar to the input matrix B; if INFO = i, i -*> elements of E have not converged to zero. -*> \endverbatim -* -*> \par Internal Parameters: -* ========================= -*> -*> \verbatim -*> TOLMUL DOUBLE PRECISION, default = max(10,min(100,EPS**(-1/8))) -*> TOLMUL controls the convergence criterion of the QR loop. -*> If it is positive, TOLMUL*EPS is the desired relative -*> precision in the computed singular values. -*> If it is negative, abs(TOLMUL*EPS*sigma_max) is the -*> desired absolute accuracy in the computed singular -*> values (corresponds to relative accuracy -*> abs(TOLMUL*EPS) in the largest singular value. -*> abs(TOLMUL) should be between 1 and 1/EPS, and preferably -*> between 10 (for fast convergence) and .1/EPS -*> (for there to be some accuracy in the results). -*> Default is to lose at either one eighth or 2 of the -*> available decimal digits in each computed singular value -*> (whichever is smaller). -*> -*> MAXITR INTEGER, default = 6 -*> MAXITR controls the maximum number of passes of the -*> algorithm through its inner loop. The algorithms stops -*> (and so fails to converge) if the number of passes -*> through the inner loop exceeds MAXITR*N**2. -*> -*> \endverbatim -* -*> \par Note: -* =========== -*> -*> \verbatim -*> Bug report from Cezary Dendek. -*> On March 23rd 2017, the INTEGER variable MAXIT = MAXITR*N**2 is -*> removed since it can overflow pretty easily (for N larger or equal -*> than 18,919). We instead use MAXITDIVN = MAXITR*N. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -* ===================================================================== - SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, - $ LDU, C, LDC, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU -* .. -* .. Array Arguments .. - DOUBLE PRECISION C( LDC, * ), D( * ), E( * ), U( LDU, * ), - $ VT( LDVT, * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D0 ) - DOUBLE PRECISION NEGONE - PARAMETER ( NEGONE = -1.0D0 ) - DOUBLE PRECISION HNDRTH - PARAMETER ( HNDRTH = 0.01D0 ) - DOUBLE PRECISION TEN - PARAMETER ( TEN = 10.0D0 ) - DOUBLE PRECISION HNDRD - PARAMETER ( HNDRD = 100.0D0 ) - DOUBLE PRECISION MEIGTH - PARAMETER ( MEIGTH = -0.125D0 ) - INTEGER MAXITR - PARAMETER ( MAXITR = 6 ) -* .. -* .. Local Scalars .. - LOGICAL LOWER, ROTATE - INTEGER I, IDIR, ISUB, ITER, ITERDIVN, J, LL, LLL, M, - $ MAXITDIVN, NM1, NM12, NM13, OLDLL, OLDM - DOUBLE PRECISION ABSE, ABSS, COSL, COSR, CS, EPS, F, G, H, MU, - $ OLDCS, OLDSN, R, SHIFT, SIGMN, SIGMX, SINL, - $ SINR, SLL, SMAX, SMIN, SMINL, SMINOA, - $ SN, THRESH, TOL, TOLMUL, UNFL -* .. -* .. External Functions .. - LOGICAL LSAME - DOUBLE PRECISION DLAMCH - EXTERNAL LSAME, DLAMCH -* .. -* .. External Subroutines .. - EXTERNAL DLARTG, DLAS2, DLASQ1, DLASR, DLASV2, DROT, - $ DSCAL, DSWAP, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, MAX, MIN, SIGN, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - LOWER = LSAME( UPLO, 'L' ) - IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LOWER ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( NCVT.LT.0 ) THEN - INFO = -3 - ELSE IF( NRU.LT.0 ) THEN - INFO = -4 - ELSE IF( NCC.LT.0 ) THEN - INFO = -5 - ELSE IF( ( NCVT.EQ.0 .AND. LDVT.LT.1 ) .OR. - $ ( NCVT.GT.0 .AND. LDVT.LT.MAX( 1, N ) ) ) THEN - INFO = -9 - ELSE IF( LDU.LT.MAX( 1, NRU ) ) THEN - INFO = -11 - ELSE IF( ( NCC.EQ.0 .AND. LDC.LT.1 ) .OR. - $ ( NCC.GT.0 .AND. LDC.LT.MAX( 1, N ) ) ) THEN - INFO = -13 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DBDSQR', -INFO ) - RETURN - END IF - IF( N.EQ.0 ) - $ RETURN - IF( N.EQ.1 ) - $ GO TO 160 -* -* ROTATE is true if any singular vectors desired, false otherwise -* - ROTATE = ( NCVT.GT.0 ) .OR. ( NRU.GT.0 ) .OR. ( NCC.GT.0 ) -* -* If no singular vectors desired, use qd algorithm -* - IF( .NOT.ROTATE ) THEN - CALL DLASQ1( N, D, E, WORK, INFO ) -* -* If INFO equals 2, dqds didn't finish, try to finish -* - IF( INFO .NE. 2 ) RETURN - INFO = 0 - END IF -* - NM1 = N - 1 - NM12 = NM1 + NM1 - NM13 = NM12 + NM1 - IDIR = 0 -* -* Get machine constants -* - EPS = DLAMCH( 'Epsilon' ) - UNFL = DLAMCH( 'Safe minimum' ) -* -* If matrix lower bidiagonal, rotate to be upper bidiagonal -* by applying Givens rotations on the left -* - IF( LOWER ) THEN - DO 10 I = 1, N - 1 - CALL DLARTG( D( I ), E( I ), CS, SN, R ) - D( I ) = R - E( I ) = SN*D( I+1 ) - D( I+1 ) = CS*D( I+1 ) - WORK( I ) = CS - WORK( NM1+I ) = SN - 10 CONTINUE -* -* Update singular vectors if desired -* - IF( NRU.GT.0 ) - $ CALL DLASR( 'R', 'V', 'F', NRU, N, WORK( 1 ), WORK( N ), U, - $ LDU ) - IF( NCC.GT.0 ) - $ CALL DLASR( 'L', 'V', 'F', N, NCC, WORK( 1 ), WORK( N ), C, - $ LDC ) - END IF -* -* Compute singular values to relative accuracy TOL -* (By setting TOL to be negative, algorithm will compute -* singular values to absolute accuracy ABS(TOL)*norm(input matrix)) -* - TOLMUL = MAX( TEN, MIN( HNDRD, EPS**MEIGTH ) ) - TOL = TOLMUL*EPS -* -* Compute approximate maximum, minimum singular values -* - SMAX = ZERO - DO 20 I = 1, N - SMAX = MAX( SMAX, ABS( D( I ) ) ) - 20 CONTINUE - DO 30 I = 1, N - 1 - SMAX = MAX( SMAX, ABS( E( I ) ) ) - 30 CONTINUE - SMINL = ZERO - IF( TOL.GE.ZERO ) THEN -* -* Relative accuracy desired -* - SMINOA = ABS( D( 1 ) ) - IF( SMINOA.EQ.ZERO ) - $ GO TO 50 - MU = SMINOA - DO 40 I = 2, N - MU = ABS( D( I ) )*( MU / ( MU+ABS( E( I-1 ) ) ) ) - SMINOA = MIN( SMINOA, MU ) - IF( SMINOA.EQ.ZERO ) - $ GO TO 50 - 40 CONTINUE - 50 CONTINUE - SMINOA = SMINOA / SQRT( DBLE( N ) ) - THRESH = MAX( TOL*SMINOA, MAXITR*(N*(N*UNFL)) ) - ELSE -* -* Absolute accuracy desired -* - THRESH = MAX( ABS( TOL )*SMAX, MAXITR*(N*(N*UNFL)) ) - END IF -* -* Prepare for main iteration loop for the singular values -* (MAXIT is the maximum number of passes through the inner -* loop permitted before nonconvergence signalled.) -* - MAXITDIVN = MAXITR*N - ITERDIVN = 0 - ITER = -1 - OLDLL = -1 - OLDM = -1 -* -* M points to last element of unconverged part of matrix -* - M = N -* -* Begin main iteration loop -* - 60 CONTINUE -* -* Check for convergence or exceeding iteration count -* - IF( M.LE.1 ) - $ GO TO 160 -* - IF( ITER.GE.N ) THEN - ITER = ITER - N - ITERDIVN = ITERDIVN + 1 - IF( ITERDIVN.GE.MAXITDIVN ) - $ GO TO 200 - END IF -* -* Find diagonal block of matrix to work on -* - IF( TOL.LT.ZERO .AND. ABS( D( M ) ).LE.THRESH ) - $ D( M ) = ZERO - SMAX = ABS( D( M ) ) - SMIN = SMAX - DO 70 LLL = 1, M - 1 - LL = M - LLL - ABSS = ABS( D( LL ) ) - ABSE = ABS( E( LL ) ) - IF( TOL.LT.ZERO .AND. ABSS.LE.THRESH ) - $ D( LL ) = ZERO - IF( ABSE.LE.THRESH ) - $ GO TO 80 - SMIN = MIN( SMIN, ABSS ) - SMAX = MAX( SMAX, ABSS, ABSE ) - 70 CONTINUE - LL = 0 - GO TO 90 - 80 CONTINUE - E( LL ) = ZERO -* -* Matrix splits since E(LL) = 0 -* - IF( LL.EQ.M-1 ) THEN -* -* Convergence of bottom singular value, return to top of loop -* - M = M - 1 - GO TO 60 - END IF - 90 CONTINUE - LL = LL + 1 -* -* E(LL) through E(M-1) are nonzero, E(LL-1) is zero -* - IF( LL.EQ.M-1 ) THEN -* -* 2 by 2 block, handle separately -* - CALL DLASV2( D( M-1 ), E( M-1 ), D( M ), SIGMN, SIGMX, SINR, - $ COSR, SINL, COSL ) - D( M-1 ) = SIGMX - E( M-1 ) = ZERO - D( M ) = SIGMN -* -* Compute singular vectors, if desired -* - IF( NCVT.GT.0 ) - $ CALL DROT( NCVT, VT( M-1, 1 ), LDVT, VT( M, 1 ), LDVT, COSR, - $ SINR ) - IF( NRU.GT.0 ) - $ CALL DROT( NRU, U( 1, M-1 ), 1, U( 1, M ), 1, COSL, SINL ) - IF( NCC.GT.0 ) - $ CALL DROT( NCC, C( M-1, 1 ), LDC, C( M, 1 ), LDC, COSL, - $ SINL ) - M = M - 2 - GO TO 60 - END IF -* -* If working on new submatrix, choose shift direction -* (from larger end diagonal element towards smaller) -* - IF( LL.GT.OLDM .OR. M.LT.OLDLL ) THEN - IF( ABS( D( LL ) ).GE.ABS( D( M ) ) ) THEN -* -* Chase bulge from top (big end) to bottom (small end) -* - IDIR = 1 - ELSE -* -* Chase bulge from bottom (big end) to top (small end) -* - IDIR = 2 - END IF - END IF -* -* Apply convergence tests -* - IF( IDIR.EQ.1 ) THEN -* -* Run convergence test in forward direction -* First apply standard test to bottom of matrix -* - IF( ABS( E( M-1 ) ).LE.ABS( TOL )*ABS( D( M ) ) .OR. - $ ( TOL.LT.ZERO .AND. ABS( E( M-1 ) ).LE.THRESH ) ) THEN - E( M-1 ) = ZERO - GO TO 60 - END IF -* - IF( TOL.GE.ZERO ) THEN -* -* If relative accuracy desired, -* apply convergence criterion forward -* - MU = ABS( D( LL ) ) - SMINL = MU - DO 100 LLL = LL, M - 1 - IF( ABS( E( LLL ) ).LE.TOL*MU ) THEN - E( LLL ) = ZERO - GO TO 60 - END IF - MU = ABS( D( LLL+1 ) )*( MU / ( MU+ABS( E( LLL ) ) ) ) - SMINL = MIN( SMINL, MU ) - 100 CONTINUE - END IF -* - ELSE -* -* Run convergence test in backward direction -* First apply standard test to top of matrix -* - IF( ABS( E( LL ) ).LE.ABS( TOL )*ABS( D( LL ) ) .OR. - $ ( TOL.LT.ZERO .AND. ABS( E( LL ) ).LE.THRESH ) ) THEN - E( LL ) = ZERO - GO TO 60 - END IF -* - IF( TOL.GE.ZERO ) THEN -* -* If relative accuracy desired, -* apply convergence criterion backward -* - MU = ABS( D( M ) ) - SMINL = MU - DO 110 LLL = M - 1, LL, -1 - IF( ABS( E( LLL ) ).LE.TOL*MU ) THEN - E( LLL ) = ZERO - GO TO 60 - END IF - MU = ABS( D( LLL ) )*( MU / ( MU+ABS( E( LLL ) ) ) ) - SMINL = MIN( SMINL, MU ) - 110 CONTINUE - END IF - END IF - OLDLL = LL - OLDM = M -* -* Compute shift. First, test if shifting would ruin relative -* accuracy, and if so set the shift to zero. -* - IF( TOL.GE.ZERO .AND. N*TOL*( SMINL / SMAX ).LE. - $ MAX( EPS, HNDRTH*TOL ) ) THEN -* -* Use a zero shift to avoid loss of relative accuracy -* - SHIFT = ZERO - ELSE -* -* Compute the shift from 2-by-2 block at end of matrix -* - IF( IDIR.EQ.1 ) THEN - SLL = ABS( D( LL ) ) - CALL DLAS2( D( M-1 ), E( M-1 ), D( M ), SHIFT, R ) - ELSE - SLL = ABS( D( M ) ) - CALL DLAS2( D( LL ), E( LL ), D( LL+1 ), SHIFT, R ) - END IF -* -* Test if shift negligible, and if so set to zero -* - IF( SLL.GT.ZERO ) THEN - IF( ( SHIFT / SLL )**2.LT.EPS ) - $ SHIFT = ZERO - END IF - END IF -* -* Increment iteration count -* - ITER = ITER + M - LL -* -* If SHIFT = 0, do simplified QR iteration -* - IF( SHIFT.EQ.ZERO ) THEN - IF( IDIR.EQ.1 ) THEN -* -* Chase bulge from top to bottom -* Save cosines and sines for later singular vector updates -* - CS = ONE - OLDCS = ONE - DO 120 I = LL, M - 1 - CALL DLARTG( D( I )*CS, E( I ), CS, SN, R ) - IF( I.GT.LL ) - $ E( I-1 ) = OLDSN*R - CALL DLARTG( OLDCS*R, D( I+1 )*SN, OLDCS, OLDSN, D( I ) ) - WORK( I-LL+1 ) = CS - WORK( I-LL+1+NM1 ) = SN - WORK( I-LL+1+NM12 ) = OLDCS - WORK( I-LL+1+NM13 ) = OLDSN - 120 CONTINUE - H = D( M )*CS - D( M ) = H*OLDCS - E( M-1 ) = H*OLDSN -* -* Update singular vectors -* - IF( NCVT.GT.0 ) - $ CALL DLASR( 'L', 'V', 'F', M-LL+1, NCVT, WORK( 1 ), - $ WORK( N ), VT( LL, 1 ), LDVT ) - IF( NRU.GT.0 ) - $ CALL DLASR( 'R', 'V', 'F', NRU, M-LL+1, WORK( NM12+1 ), - $ WORK( NM13+1 ), U( 1, LL ), LDU ) - IF( NCC.GT.0 ) - $ CALL DLASR( 'L', 'V', 'F', M-LL+1, NCC, WORK( NM12+1 ), - $ WORK( NM13+1 ), C( LL, 1 ), LDC ) -* -* Test convergence -* - IF( ABS( E( M-1 ) ).LE.THRESH ) - $ E( M-1 ) = ZERO -* - ELSE -* -* Chase bulge from bottom to top -* Save cosines and sines for later singular vector updates -* - CS = ONE - OLDCS = ONE - DO 130 I = M, LL + 1, -1 - CALL DLARTG( D( I )*CS, E( I-1 ), CS, SN, R ) - IF( I.LT.M ) - $ E( I ) = OLDSN*R - CALL DLARTG( OLDCS*R, D( I-1 )*SN, OLDCS, OLDSN, D( I ) ) - WORK( I-LL ) = CS - WORK( I-LL+NM1 ) = -SN - WORK( I-LL+NM12 ) = OLDCS - WORK( I-LL+NM13 ) = -OLDSN - 130 CONTINUE - H = D( LL )*CS - D( LL ) = H*OLDCS - E( LL ) = H*OLDSN -* -* Update singular vectors -* - IF( NCVT.GT.0 ) - $ CALL DLASR( 'L', 'V', 'B', M-LL+1, NCVT, WORK( NM12+1 ), - $ WORK( NM13+1 ), VT( LL, 1 ), LDVT ) - IF( NRU.GT.0 ) - $ CALL DLASR( 'R', 'V', 'B', NRU, M-LL+1, WORK( 1 ), - $ WORK( N ), U( 1, LL ), LDU ) - IF( NCC.GT.0 ) - $ CALL DLASR( 'L', 'V', 'B', M-LL+1, NCC, WORK( 1 ), - $ WORK( N ), C( LL, 1 ), LDC ) -* -* Test convergence -* - IF( ABS( E( LL ) ).LE.THRESH ) - $ E( LL ) = ZERO - END IF - ELSE -* -* Use nonzero shift -* - IF( IDIR.EQ.1 ) THEN -* -* Chase bulge from top to bottom -* Save cosines and sines for later singular vector updates -* - F = ( ABS( D( LL ) )-SHIFT )* - $ ( SIGN( ONE, D( LL ) )+SHIFT / D( LL ) ) - G = E( LL ) - DO 140 I = LL, M - 1 - CALL DLARTG( F, G, COSR, SINR, R ) - IF( I.GT.LL ) - $ E( I-1 ) = R - F = COSR*D( I ) + SINR*E( I ) - E( I ) = COSR*E( I ) - SINR*D( I ) - G = SINR*D( I+1 ) - D( I+1 ) = COSR*D( I+1 ) - CALL DLARTG( F, G, COSL, SINL, R ) - D( I ) = R - F = COSL*E( I ) + SINL*D( I+1 ) - D( I+1 ) = COSL*D( I+1 ) - SINL*E( I ) - IF( I.LT.M-1 ) THEN - G = SINL*E( I+1 ) - E( I+1 ) = COSL*E( I+1 ) - END IF - WORK( I-LL+1 ) = COSR - WORK( I-LL+1+NM1 ) = SINR - WORK( I-LL+1+NM12 ) = COSL - WORK( I-LL+1+NM13 ) = SINL - 140 CONTINUE - E( M-1 ) = F -* -* Update singular vectors -* - IF( NCVT.GT.0 ) - $ CALL DLASR( 'L', 'V', 'F', M-LL+1, NCVT, WORK( 1 ), - $ WORK( N ), VT( LL, 1 ), LDVT ) - IF( NRU.GT.0 ) - $ CALL DLASR( 'R', 'V', 'F', NRU, M-LL+1, WORK( NM12+1 ), - $ WORK( NM13+1 ), U( 1, LL ), LDU ) - IF( NCC.GT.0 ) - $ CALL DLASR( 'L', 'V', 'F', M-LL+1, NCC, WORK( NM12+1 ), - $ WORK( NM13+1 ), C( LL, 1 ), LDC ) -* -* Test convergence -* - IF( ABS( E( M-1 ) ).LE.THRESH ) - $ E( M-1 ) = ZERO -* - ELSE -* -* Chase bulge from bottom to top -* Save cosines and sines for later singular vector updates -* - F = ( ABS( D( M ) )-SHIFT )*( SIGN( ONE, D( M ) )+SHIFT / - $ D( M ) ) - G = E( M-1 ) - DO 150 I = M, LL + 1, -1 - CALL DLARTG( F, G, COSR, SINR, R ) - IF( I.LT.M ) - $ E( I ) = R - F = COSR*D( I ) + SINR*E( I-1 ) - E( I-1 ) = COSR*E( I-1 ) - SINR*D( I ) - G = SINR*D( I-1 ) - D( I-1 ) = COSR*D( I-1 ) - CALL DLARTG( F, G, COSL, SINL, R ) - D( I ) = R - F = COSL*E( I-1 ) + SINL*D( I-1 ) - D( I-1 ) = COSL*D( I-1 ) - SINL*E( I-1 ) - IF( I.GT.LL+1 ) THEN - G = SINL*E( I-2 ) - E( I-2 ) = COSL*E( I-2 ) - END IF - WORK( I-LL ) = COSR - WORK( I-LL+NM1 ) = -SINR - WORK( I-LL+NM12 ) = COSL - WORK( I-LL+NM13 ) = -SINL - 150 CONTINUE - E( LL ) = F -* -* Test convergence -* - IF( ABS( E( LL ) ).LE.THRESH ) - $ E( LL ) = ZERO -* -* Update singular vectors if desired -* - IF( NCVT.GT.0 ) - $ CALL DLASR( 'L', 'V', 'B', M-LL+1, NCVT, WORK( NM12+1 ), - $ WORK( NM13+1 ), VT( LL, 1 ), LDVT ) - IF( NRU.GT.0 ) - $ CALL DLASR( 'R', 'V', 'B', NRU, M-LL+1, WORK( 1 ), - $ WORK( N ), U( 1, LL ), LDU ) - IF( NCC.GT.0 ) - $ CALL DLASR( 'L', 'V', 'B', M-LL+1, NCC, WORK( 1 ), - $ WORK( N ), C( LL, 1 ), LDC ) - END IF - END IF -* -* QR iteration finished, go back and check convergence -* - GO TO 60 -* -* All singular values converged, so make them positive -* - 160 CONTINUE - DO 170 I = 1, N - IF( D( I ).LT.ZERO ) THEN - D( I ) = -D( I ) -* -* Change sign of singular vectors, if desired -* - IF( NCVT.GT.0 ) - $ CALL DSCAL( NCVT, NEGONE, VT( I, 1 ), LDVT ) - END IF - 170 CONTINUE -* -* Sort the singular values into decreasing order (insertion sort on -* singular values, but only one transposition per singular vector) -* - DO 190 I = 1, N - 1 -* -* Scan for smallest D(I) -* - ISUB = 1 - SMIN = D( 1 ) - DO 180 J = 2, N + 1 - I - IF( D( J ).LE.SMIN ) THEN - ISUB = J - SMIN = D( J ) - END IF - 180 CONTINUE - IF( ISUB.NE.N+1-I ) THEN -* -* Swap singular values and vectors -* - D( ISUB ) = D( N+1-I ) - D( N+1-I ) = SMIN - IF( NCVT.GT.0 ) - $ CALL DSWAP( NCVT, VT( ISUB, 1 ), LDVT, VT( N+1-I, 1 ), - $ LDVT ) - IF( NRU.GT.0 ) - $ CALL DSWAP( NRU, U( 1, ISUB ), 1, U( 1, N+1-I ), 1 ) - IF( NCC.GT.0 ) - $ CALL DSWAP( NCC, C( ISUB, 1 ), LDC, C( N+1-I, 1 ), LDC ) - END IF - 190 CONTINUE - GO TO 220 -* -* Maximum number of iterations exceeded, failure to converge -* - 200 CONTINUE - INFO = 0 - DO 210 I = 1, N - 1 - IF( E( I ).NE.ZERO ) - $ INFO = INFO + 1 - 210 CONTINUE - 220 CONTINUE - RETURN -* -* End of DBDSQR -* - END diff --git a/lib/linalg/fortran/dcabs1.f b/lib/linalg/fortran/dcabs1.f deleted file mode 100644 index f6212a8595..0000000000 --- a/lib/linalg/fortran/dcabs1.f +++ /dev/null @@ -1,66 +0,0 @@ -*> \brief \b DCABS1 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DCABS1(Z) -* -* .. Scalar Arguments .. -* COMPLEX*16 Z -* .. -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DCABS1 computes |Re(.)| + |Im(.)| of a double complex number -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] Z -*> \verbatim -*> Z is COMPLEX*16 -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level1 -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DCABS1(Z) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - COMPLEX*16 Z -* .. -* .. -* ===================================================================== -* -* .. Intrinsic Functions .. - INTRINSIC ABS,DBLE,DIMAG -* - DCABS1 = ABS(DBLE(Z)) + ABS(DIMAG(Z)) - RETURN -* -* End of DCABS1 -* - END diff --git a/lib/linalg/fortran/dcopy.f b/lib/linalg/fortran/dcopy.f deleted file mode 100644 index ded46c5ecf..0000000000 --- a/lib/linalg/fortran/dcopy.f +++ /dev/null @@ -1,146 +0,0 @@ -*> \brief \b DCOPY -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DCOPY(N,DX,INCX,DY,INCY) -* -* .. Scalar Arguments .. -* INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION DX(*),DY(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DCOPY copies a vector, x, to a vector, y. -*> uses unrolled loops for increments equal to 1. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] DX -*> \verbatim -*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of DX -*> \endverbatim -*> -*> \param[out] DY -*> \verbatim -*> DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> storage spacing between elements of DY -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, linpack, 3/11/78. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DCOPY(N,DX,INCX,DY,INCY) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. - DOUBLE PRECISION DX(*),DY(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I,IX,IY,M,MP1 -* .. -* .. Intrinsic Functions .. - INTRINSIC MOD -* .. - IF (N.LE.0) RETURN - IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN -* -* code for both increments equal to 1 -* -* -* clean-up loop -* - M = MOD(N,7) - IF (M.NE.0) THEN - DO I = 1,M - DY(I) = DX(I) - END DO - IF (N.LT.7) RETURN - END IF - MP1 = M + 1 - DO I = MP1,N,7 - DY(I) = DX(I) - DY(I+1) = DX(I+1) - DY(I+2) = DX(I+2) - DY(I+3) = DX(I+3) - DY(I+4) = DX(I+4) - DY(I+5) = DX(I+5) - DY(I+6) = DX(I+6) - END DO - ELSE -* -* code for unequal increments or equal increments -* not equal to 1 -* - IX = 1 - IY = 1 - IF (INCX.LT.0) IX = (-N+1)*INCX + 1 - IF (INCY.LT.0) IY = (-N+1)*INCY + 1 - DO I = 1,N - DY(IY) = DX(IX) - IX = IX + INCX - IY = IY + INCY - END DO - END IF - RETURN -* -* End of DCOPY -* - END diff --git a/lib/linalg/fortran/ddot.f b/lib/linalg/fortran/ddot.f deleted file mode 100644 index 683a04bd46..0000000000 --- a/lib/linalg/fortran/ddot.f +++ /dev/null @@ -1,148 +0,0 @@ -*> \brief \b DDOT -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY) -* -* .. Scalar Arguments .. -* INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION DX(*),DY(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DDOT forms the dot product of two vectors. -*> uses unrolled loops for increments equal to one. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] DX -*> \verbatim -*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of DX -*> \endverbatim -*> -*> \param[in] DY -*> \verbatim -*> DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> storage spacing between elements of DY -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, linpack, 3/11/78. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. - DOUBLE PRECISION DX(*),DY(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - DOUBLE PRECISION DTEMP - INTEGER I,IX,IY,M,MP1 -* .. -* .. Intrinsic Functions .. - INTRINSIC MOD -* .. - DDOT = 0.0d0 - DTEMP = 0.0d0 - IF (N.LE.0) RETURN - IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN -* -* code for both increments equal to 1 -* -* -* clean-up loop -* - M = MOD(N,5) - IF (M.NE.0) THEN - DO I = 1,M - DTEMP = DTEMP + DX(I)*DY(I) - END DO - IF (N.LT.5) THEN - DDOT=DTEMP - RETURN - END IF - END IF - MP1 = M + 1 - DO I = MP1,N,5 - DTEMP = DTEMP + DX(I)*DY(I) + DX(I+1)*DY(I+1) + - $ DX(I+2)*DY(I+2) + DX(I+3)*DY(I+3) + DX(I+4)*DY(I+4) - END DO - ELSE -* -* code for unequal increments or equal increments -* not equal to 1 -* - IX = 1 - IY = 1 - IF (INCX.LT.0) IX = (-N+1)*INCX + 1 - IF (INCY.LT.0) IY = (-N+1)*INCY + 1 - DO I = 1,N - DTEMP = DTEMP + DX(IX)*DY(IY) - IX = IX + INCX - IY = IY + INCY - END DO - END IF - DDOT = DTEMP - RETURN -* -* End of DDOT -* - END diff --git a/lib/linalg/fortran/dgebd2.f b/lib/linalg/fortran/dgebd2.f deleted file mode 100644 index daaa187aff..0000000000 --- a/lib/linalg/fortran/dgebd2.f +++ /dev/null @@ -1,317 +0,0 @@ -*> \brief \b DGEBD2 reduces a general matrix to bidiagonal form using an unblocked algorithm. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGEBD2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGEBD2( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAUP( * ), -* $ TAUQ( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGEBD2 reduces a real general m by n matrix A to upper or lower -*> bidiagonal form B by an orthogonal transformation: Q**T * A * P = B. -*> -*> If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows in the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns in the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the m by n general matrix to be reduced. -*> On exit, -*> if m >= n, the diagonal and the first superdiagonal are -*> overwritten with the upper bidiagonal matrix B; the -*> elements below the diagonal, with the array TAUQ, represent -*> the orthogonal matrix Q as a product of elementary -*> reflectors, and the elements above the first superdiagonal, -*> with the array TAUP, represent the orthogonal matrix P as -*> a product of elementary reflectors; -*> if m < n, the diagonal and the first subdiagonal are -*> overwritten with the lower bidiagonal matrix B; the -*> elements below the first subdiagonal, with the array TAUQ, -*> represent the orthogonal matrix Q as a product of -*> elementary reflectors, and the elements above the diagonal, -*> with the array TAUP, represent the orthogonal matrix P as -*> a product of elementary reflectors. -*> See Further Details. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (min(M,N)) -*> The diagonal elements of the bidiagonal matrix B: -*> D(i) = A(i,i). -*> \endverbatim -*> -*> \param[out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (min(M,N)-1) -*> The off-diagonal elements of the bidiagonal matrix B: -*> if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1; -*> if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1. -*> \endverbatim -*> -*> \param[out] TAUQ -*> \verbatim -*> TAUQ is DOUBLE PRECISION array, dimension (min(M,N)) -*> The scalar factors of the elementary reflectors which -*> represent the orthogonal matrix Q. See Further Details. -*> \endverbatim -*> -*> \param[out] TAUP -*> \verbatim -*> TAUP is DOUBLE PRECISION array, dimension (min(M,N)) -*> The scalar factors of the elementary reflectors which -*> represent the orthogonal matrix P. See Further Details. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (max(M,N)) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The matrices Q and P are represented as products of elementary -*> reflectors: -*> -*> If m >= n, -*> -*> Q = H(1) H(2) . . . H(n) and P = G(1) G(2) . . . G(n-1) -*> -*> Each H(i) and G(i) has the form: -*> -*> H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T -*> -*> where tauq and taup are real scalars, and v and u are real vectors; -*> v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i); -*> u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n); -*> tauq is stored in TAUQ(i) and taup in TAUP(i). -*> -*> If m < n, -*> -*> Q = H(1) H(2) . . . H(m-1) and P = G(1) G(2) . . . G(m) -*> -*> Each H(i) and G(i) has the form: -*> -*> H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T -*> -*> where tauq and taup are real scalars, and v and u are real vectors; -*> v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i); -*> u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n); -*> tauq is stored in TAUQ(i) and taup in TAUP(i). -*> -*> The contents of A on exit are illustrated by the following examples: -*> -*> m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): -*> -*> ( d e u1 u1 u1 ) ( d u1 u1 u1 u1 u1 ) -*> ( v1 d e u2 u2 ) ( e d u2 u2 u2 u2 ) -*> ( v1 v2 d e u3 ) ( v1 e d u3 u3 u3 ) -*> ( v1 v2 v3 d e ) ( v1 v2 e d u4 u4 ) -*> ( v1 v2 v3 v4 d ) ( v1 v2 v3 e d u5 ) -*> ( v1 v2 v3 v4 v5 ) -*> -*> where d and e denote diagonal and off-diagonal elements of B, vi -*> denotes an element of the vector defining H(i), and ui an element of -*> the vector defining G(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DGEBD2( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAUP( * ), - $ TAUQ( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I -* .. -* .. External Subroutines .. - EXTERNAL DLARF, DLARFG, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -4 - END IF - IF( INFO.LT.0 ) THEN - CALL XERBLA( 'DGEBD2', -INFO ) - RETURN - END IF -* - IF( M.GE.N ) THEN -* -* Reduce to upper bidiagonal form -* - DO 10 I = 1, N -* -* Generate elementary reflector H(i) to annihilate A(i+1:m,i) -* - CALL DLARFG( M-I+1, A( I, I ), A( MIN( I+1, M ), I ), 1, - $ TAUQ( I ) ) - D( I ) = A( I, I ) - A( I, I ) = ONE -* -* Apply H(i) to A(i:m,i+1:n) from the left -* - IF( I.LT.N ) - $ CALL DLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAUQ( I ), - $ A( I, I+1 ), LDA, WORK ) - A( I, I ) = D( I ) -* - IF( I.LT.N ) THEN -* -* Generate elementary reflector G(i) to annihilate -* A(i,i+2:n) -* - CALL DLARFG( N-I, A( I, I+1 ), A( I, MIN( I+2, N ) ), - $ LDA, TAUP( I ) ) - E( I ) = A( I, I+1 ) - A( I, I+1 ) = ONE -* -* Apply G(i) to A(i+1:m,i+1:n) from the right -* - CALL DLARF( 'Right', M-I, N-I, A( I, I+1 ), LDA, - $ TAUP( I ), A( I+1, I+1 ), LDA, WORK ) - A( I, I+1 ) = E( I ) - ELSE - TAUP( I ) = ZERO - END IF - 10 CONTINUE - ELSE -* -* Reduce to lower bidiagonal form -* - DO 20 I = 1, M -* -* Generate elementary reflector G(i) to annihilate A(i,i+1:n) -* - CALL DLARFG( N-I+1, A( I, I ), A( I, MIN( I+1, N ) ), LDA, - $ TAUP( I ) ) - D( I ) = A( I, I ) - A( I, I ) = ONE -* -* Apply G(i) to A(i+1:m,i:n) from the right -* - IF( I.LT.M ) - $ CALL DLARF( 'Right', M-I, N-I+1, A( I, I ), LDA, - $ TAUP( I ), A( I+1, I ), LDA, WORK ) - A( I, I ) = D( I ) -* - IF( I.LT.M ) THEN -* -* Generate elementary reflector H(i) to annihilate -* A(i+2:m,i) -* - CALL DLARFG( M-I, A( I+1, I ), A( MIN( I+2, M ), I ), 1, - $ TAUQ( I ) ) - E( I ) = A( I+1, I ) - A( I+1, I ) = ONE -* -* Apply H(i) to A(i+1:m,i+1:n) from the left -* - CALL DLARF( 'Left', M-I, N-I, A( I+1, I ), 1, TAUQ( I ), - $ A( I+1, I+1 ), LDA, WORK ) - A( I+1, I ) = E( I ) - ELSE - TAUQ( I ) = ZERO - END IF - 20 CONTINUE - END IF - RETURN -* -* End of DGEBD2 -* - END diff --git a/lib/linalg/fortran/dgebrd.f b/lib/linalg/fortran/dgebrd.f deleted file mode 100644 index 0f0d1651a7..0000000000 --- a/lib/linalg/fortran/dgebrd.f +++ /dev/null @@ -1,349 +0,0 @@ -*> \brief \b DGEBRD -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGEBRD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, -* INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAUP( * ), -* $ TAUQ( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGEBRD reduces a general real M-by-N matrix A to upper or lower -*> bidiagonal form B by an orthogonal transformation: Q**T * A * P = B. -*> -*> If m >= n, B is upper bidiagonal; if m < n, B is lower bidiagonal. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows in the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns in the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the M-by-N general matrix to be reduced. -*> On exit, -*> if m >= n, the diagonal and the first superdiagonal are -*> overwritten with the upper bidiagonal matrix B; the -*> elements below the diagonal, with the array TAUQ, represent -*> the orthogonal matrix Q as a product of elementary -*> reflectors, and the elements above the first superdiagonal, -*> with the array TAUP, represent the orthogonal matrix P as -*> a product of elementary reflectors; -*> if m < n, the diagonal and the first subdiagonal are -*> overwritten with the lower bidiagonal matrix B; the -*> elements below the first subdiagonal, with the array TAUQ, -*> represent the orthogonal matrix Q as a product of -*> elementary reflectors, and the elements above the diagonal, -*> with the array TAUP, represent the orthogonal matrix P as -*> a product of elementary reflectors. -*> See Further Details. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (min(M,N)) -*> The diagonal elements of the bidiagonal matrix B: -*> D(i) = A(i,i). -*> \endverbatim -*> -*> \param[out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (min(M,N)-1) -*> The off-diagonal elements of the bidiagonal matrix B: -*> if m >= n, E(i) = A(i,i+1) for i = 1,2,...,n-1; -*> if m < n, E(i) = A(i+1,i) for i = 1,2,...,m-1. -*> \endverbatim -*> -*> \param[out] TAUQ -*> \verbatim -*> TAUQ is DOUBLE PRECISION array, dimension (min(M,N)) -*> The scalar factors of the elementary reflectors which -*> represent the orthogonal matrix Q. See Further Details. -*> \endverbatim -*> -*> \param[out] TAUP -*> \verbatim -*> TAUP is DOUBLE PRECISION array, dimension (min(M,N)) -*> The scalar factors of the elementary reflectors which -*> represent the orthogonal matrix P. See Further Details. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The length of the array WORK. LWORK >= max(1,M,N). -*> For optimum performance LWORK >= (M+N)*NB, where NB -*> is the optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The matrices Q and P are represented as products of elementary -*> reflectors: -*> -*> If m >= n, -*> -*> Q = H(1) H(2) . . . H(n) and P = G(1) G(2) . . . G(n-1) -*> -*> Each H(i) and G(i) has the form: -*> -*> H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T -*> -*> where tauq and taup are real scalars, and v and u are real vectors; -*> v(1:i-1) = 0, v(i) = 1, and v(i+1:m) is stored on exit in A(i+1:m,i); -*> u(1:i) = 0, u(i+1) = 1, and u(i+2:n) is stored on exit in A(i,i+2:n); -*> tauq is stored in TAUQ(i) and taup in TAUP(i). -*> -*> If m < n, -*> -*> Q = H(1) H(2) . . . H(m-1) and P = G(1) G(2) . . . G(m) -*> -*> Each H(i) and G(i) has the form: -*> -*> H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T -*> -*> where tauq and taup are real scalars, and v and u are real vectors; -*> v(1:i) = 0, v(i+1) = 1, and v(i+2:m) is stored on exit in A(i+2:m,i); -*> u(1:i-1) = 0, u(i) = 1, and u(i+1:n) is stored on exit in A(i,i+1:n); -*> tauq is stored in TAUQ(i) and taup in TAUP(i). -*> -*> The contents of A on exit are illustrated by the following examples: -*> -*> m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): -*> -*> ( d e u1 u1 u1 ) ( d u1 u1 u1 u1 u1 ) -*> ( v1 d e u2 u2 ) ( e d u2 u2 u2 u2 ) -*> ( v1 v2 d e u3 ) ( v1 e d u3 u3 u3 ) -*> ( v1 v2 v3 d e ) ( v1 v2 e d u4 u4 ) -*> ( v1 v2 v3 v4 d ) ( v1 v2 v3 e d u5 ) -*> ( v1 v2 v3 v4 v5 ) -*> -*> where d and e denote diagonal and off-diagonal elements of B, vi -*> denotes an element of the vector defining H(i), and ui an element of -*> the vector defining G(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, - $ INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAUP( * ), - $ TAUQ( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER I, IINFO, J, LDWRKX, LDWRKY, LWKOPT, MINMN, NB, - $ NBMIN, NX, WS -* .. -* .. External Subroutines .. - EXTERNAL DGEBD2, DGEMM, DLABRD, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, MAX, MIN -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. Executable Statements .. -* -* Test the input parameters -* - INFO = 0 - NB = MAX( 1, ILAENV( 1, 'DGEBRD', ' ', M, N, -1, -1 ) ) - LWKOPT = ( M+N )*NB - WORK( 1 ) = DBLE( LWKOPT ) - LQUERY = ( LWORK.EQ.-1 ) - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -4 - ELSE IF( LWORK.LT.MAX( 1, M, N ) .AND. .NOT.LQUERY ) THEN - INFO = -10 - END IF - IF( INFO.LT.0 ) THEN - CALL XERBLA( 'DGEBRD', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - MINMN = MIN( M, N ) - IF( MINMN.EQ.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - WS = MAX( M, N ) - LDWRKX = M - LDWRKY = N -* - IF( NB.GT.1 .AND. NB.LT.MINMN ) THEN -* -* Set the crossover point NX. -* - NX = MAX( NB, ILAENV( 3, 'DGEBRD', ' ', M, N, -1, -1 ) ) -* -* Determine when to switch from blocked to unblocked code. -* - IF( NX.LT.MINMN ) THEN - WS = ( M+N )*NB - IF( LWORK.LT.WS ) THEN -* -* Not enough work space for the optimal NB, consider using -* a smaller block size. -* - NBMIN = ILAENV( 2, 'DGEBRD', ' ', M, N, -1, -1 ) - IF( LWORK.GE.( M+N )*NBMIN ) THEN - NB = LWORK / ( M+N ) - ELSE - NB = 1 - NX = MINMN - END IF - END IF - END IF - ELSE - NX = MINMN - END IF -* - DO 30 I = 1, MINMN - NX, NB -* -* Reduce rows and columns i:i+nb-1 to bidiagonal form and return -* the matrices X and Y which are needed to update the unreduced -* part of the matrix -* - CALL DLABRD( M-I+1, N-I+1, NB, A( I, I ), LDA, D( I ), E( I ), - $ TAUQ( I ), TAUP( I ), WORK, LDWRKX, - $ WORK( LDWRKX*NB+1 ), LDWRKY ) -* -* Update the trailing submatrix A(i+nb:m,i+nb:n), using an update -* of the form A := A - V*Y**T - X*U**T -* - CALL DGEMM( 'No transpose', 'Transpose', M-I-NB+1, N-I-NB+1, - $ NB, -ONE, A( I+NB, I ), LDA, - $ WORK( LDWRKX*NB+NB+1 ), LDWRKY, ONE, - $ A( I+NB, I+NB ), LDA ) - CALL DGEMM( 'No transpose', 'No transpose', M-I-NB+1, N-I-NB+1, - $ NB, -ONE, WORK( NB+1 ), LDWRKX, A( I, I+NB ), LDA, - $ ONE, A( I+NB, I+NB ), LDA ) -* -* Copy diagonal and off-diagonal elements of B back into A -* - IF( M.GE.N ) THEN - DO 10 J = I, I + NB - 1 - A( J, J ) = D( J ) - A( J, J+1 ) = E( J ) - 10 CONTINUE - ELSE - DO 20 J = I, I + NB - 1 - A( J, J ) = D( J ) - A( J+1, J ) = E( J ) - 20 CONTINUE - END IF - 30 CONTINUE -* -* Use unblocked code to reduce the remainder of the matrix -* - CALL DGEBD2( M-I+1, N-I+1, A( I, I ), LDA, D( I ), E( I ), - $ TAUQ( I ), TAUP( I ), WORK, IINFO ) - WORK( 1 ) = WS - RETURN -* -* End of DGEBRD -* - END diff --git a/lib/linalg/fortran/dgecon.f b/lib/linalg/fortran/dgecon.f deleted file mode 100644 index aa10dee9a2..0000000000 --- a/lib/linalg/fortran/dgecon.f +++ /dev/null @@ -1,258 +0,0 @@ -*> \brief \b DGECON -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGECON + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, IWORK, -* INFO ) -* -* .. Scalar Arguments .. -* CHARACTER NORM -* INTEGER INFO, LDA, N -* DOUBLE PRECISION ANORM, RCOND -* .. -* .. Array Arguments .. -* INTEGER IWORK( * ) -* DOUBLE PRECISION A( LDA, * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGECON estimates the reciprocal of the condition number of a general -*> real matrix A, in either the 1-norm or the infinity-norm, using -*> the LU factorization computed by DGETRF. -*> -*> An estimate is obtained for norm(inv(A)), and the reciprocal of the -*> condition number is computed as -*> RCOND = 1 / ( norm(A) * norm(inv(A)) ). -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] NORM -*> \verbatim -*> NORM is CHARACTER*1 -*> Specifies whether the 1-norm condition number or the -*> infinity-norm condition number is required: -*> = '1' or 'O': 1-norm; -*> = 'I': Infinity-norm. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The factors L and U from the factorization A = P*L*U -*> as computed by DGETRF. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] ANORM -*> \verbatim -*> ANORM is DOUBLE PRECISION -*> If NORM = '1' or 'O', the 1-norm of the original matrix A. -*> If NORM = 'I', the infinity-norm of the original matrix A. -*> \endverbatim -*> -*> \param[out] RCOND -*> \verbatim -*> RCOND is DOUBLE PRECISION -*> The reciprocal of the condition number of the matrix A, -*> computed as RCOND = 1/(norm(A) * norm(inv(A))). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (4*N) -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension (N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -* ===================================================================== - SUBROUTINE DGECON( NORM, N, A, LDA, ANORM, RCOND, WORK, IWORK, - $ INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER NORM - INTEGER INFO, LDA, N - DOUBLE PRECISION ANORM, RCOND -* .. -* .. Array Arguments .. - INTEGER IWORK( * ) - DOUBLE PRECISION A( LDA, * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL ONENRM - CHARACTER NORMIN - INTEGER IX, KASE, KASE1 - DOUBLE PRECISION AINVNM, SCALE, SL, SMLNUM, SU -* .. -* .. Local Arrays .. - INTEGER ISAVE( 3 ) -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER IDAMAX - DOUBLE PRECISION DLAMCH - EXTERNAL LSAME, IDAMAX, DLAMCH -* .. -* .. External Subroutines .. - EXTERNAL DLACN2, DLATRS, DRSCL, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' ) - IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -4 - ELSE IF( ANORM.LT.ZERO ) THEN - INFO = -5 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGECON', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - RCOND = ZERO - IF( N.EQ.0 ) THEN - RCOND = ONE - RETURN - ELSE IF( ANORM.EQ.ZERO ) THEN - RETURN - END IF -* - SMLNUM = DLAMCH( 'Safe minimum' ) -* -* Estimate the norm of inv(A). -* - AINVNM = ZERO - NORMIN = 'N' - IF( ONENRM ) THEN - KASE1 = 1 - ELSE - KASE1 = 2 - END IF - KASE = 0 - 10 CONTINUE - CALL DLACN2( N, WORK( N+1 ), WORK, IWORK, AINVNM, KASE, ISAVE ) - IF( KASE.NE.0 ) THEN - IF( KASE.EQ.KASE1 ) THEN -* -* Multiply by inv(L). -* - CALL DLATRS( 'Lower', 'No transpose', 'Unit', NORMIN, N, A, - $ LDA, WORK, SL, WORK( 2*N+1 ), INFO ) -* -* Multiply by inv(U). -* - CALL DLATRS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N, - $ A, LDA, WORK, SU, WORK( 3*N+1 ), INFO ) - ELSE -* -* Multiply by inv(U**T). -* - CALL DLATRS( 'Upper', 'Transpose', 'Non-unit', NORMIN, N, A, - $ LDA, WORK, SU, WORK( 3*N+1 ), INFO ) -* -* Multiply by inv(L**T). -* - CALL DLATRS( 'Lower', 'Transpose', 'Unit', NORMIN, N, A, - $ LDA, WORK, SL, WORK( 2*N+1 ), INFO ) - END IF -* -* Divide X by 1/(SL*SU) if doing so will not cause overflow. -* - SCALE = SL*SU - NORMIN = 'Y' - IF( SCALE.NE.ONE ) THEN - IX = IDAMAX( N, WORK, 1 ) - IF( SCALE.LT.ABS( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO ) - $ GO TO 20 - CALL DRSCL( N, SCALE, WORK, 1 ) - END IF - GO TO 10 - END IF -* -* Compute the estimate of the reciprocal condition number. -* - IF( AINVNM.NE.ZERO ) - $ RCOND = ( ONE / AINVNM ) / ANORM -* - 20 CONTINUE - RETURN -* -* End of DGECON -* - END diff --git a/lib/linalg/fortran/dgelq2.f b/lib/linalg/fortran/dgelq2.f deleted file mode 100644 index 9915c57d47..0000000000 --- a/lib/linalg/fortran/dgelq2.f +++ /dev/null @@ -1,197 +0,0 @@ -*> \brief \b DGELQ2 computes the LQ factorization of a general rectangular matrix using an unblocked algorithm. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGELQ2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGELQ2( M, N, A, LDA, TAU, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGELQ2 computes an LQ factorization of a real m-by-n matrix A: -*> -*> A = ( L 0 ) * Q -*> -*> where: -*> -*> Q is a n-by-n orthogonal matrix; -*> L is a lower-triangular m-by-m matrix; -*> 0 is a m-by-(n-m) zero matrix, if m < n. -*> -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the m by n matrix A. -*> On exit, the elements on and below the diagonal of the array -*> contain the m by min(m,n) lower trapezoidal matrix L (L is -*> lower triangular if m <= n); the elements above the diagonal, -*> with the array TAU, represent the orthogonal matrix Q as a -*> product of elementary reflectors (see Further Details). -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (min(M,N)) -*> The scalar factors of the elementary reflectors (see Further -*> Details). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (M) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The matrix Q is represented as a product of elementary reflectors -*> -*> Q = H(k) . . . H(2) H(1), where k = min(m,n). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**T -*> -*> where tau is a real scalar, and v is a real vector with -*> v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n), -*> and tau in TAU(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DGELQ2( M, N, A, LDA, TAU, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, K - DOUBLE PRECISION AII -* .. -* .. External Subroutines .. - EXTERNAL DLARF, DLARFG, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -4 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGELQ2', -INFO ) - RETURN - END IF -* - K = MIN( M, N ) -* - DO 10 I = 1, K -* -* Generate elementary reflector H(i) to annihilate A(i,i+1:n) -* - CALL DLARFG( N-I+1, A( I, I ), A( I, MIN( I+1, N ) ), LDA, - $ TAU( I ) ) - IF( I.LT.M ) THEN -* -* Apply H(i) to A(i+1:m,i:n) from the right -* - AII = A( I, I ) - A( I, I ) = ONE - CALL DLARF( 'Right', M-I, N-I+1, A( I, I ), LDA, TAU( I ), - $ A( I+1, I ), LDA, WORK ) - A( I, I ) = AII - END IF - 10 CONTINUE - RETURN -* -* End of DGELQ2 -* - END diff --git a/lib/linalg/fortran/dgelqf.f b/lib/linalg/fortran/dgelqf.f deleted file mode 100644 index ed3372f965..0000000000 --- a/lib/linalg/fortran/dgelqf.f +++ /dev/null @@ -1,274 +0,0 @@ -*> \brief \b DGELQF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGELQF + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGELQF computes an LQ factorization of a real M-by-N matrix A: -*> -*> A = ( L 0 ) * Q -*> -*> where: -*> -*> Q is a N-by-N orthogonal matrix; -*> L is a lower-triangular M-by-M matrix; -*> 0 is a M-by-(N-M) zero matrix, if M < N. -*> -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the M-by-N matrix A. -*> On exit, the elements on and below the diagonal of the array -*> contain the m-by-min(m,n) lower trapezoidal matrix L (L is -*> lower triangular if m <= n); the elements above the diagonal, -*> with the array TAU, represent the orthogonal matrix Q as a -*> product of elementary reflectors (see Further Details). -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (min(M,N)) -*> The scalar factors of the elementary reflectors (see Further -*> Details). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= max(1,M). -*> For optimum performance LWORK >= M*NB, where NB is the -*> optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The matrix Q is represented as a product of elementary reflectors -*> -*> Q = H(k) . . . H(2) H(1), where k = min(m,n). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**T -*> -*> where tau is a real scalar, and v is a real vector with -*> v(1:i-1) = 0 and v(i) = 1; v(i+1:n) is stored on exit in A(i,i+1:n), -*> and tau in TAU(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DGELQF( M, N, A, LDA, TAU, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB, - $ NBMIN, NX -* .. -* .. External Subroutines .. - EXTERNAL DGELQ2, DLARFB, DLARFT, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - NB = ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 ) - LWKOPT = M*NB - WORK( 1 ) = LWKOPT - LQUERY = ( LWORK.EQ.-1 ) - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -4 - ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN - INFO = -7 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGELQF', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - K = MIN( M, N ) - IF( K.EQ.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - NBMIN = 2 - NX = 0 - IWS = M - IF( NB.GT.1 .AND. NB.LT.K ) THEN -* -* Determine when to cross over from blocked to unblocked code. -* - NX = MAX( 0, ILAENV( 3, 'DGELQF', ' ', M, N, -1, -1 ) ) - IF( NX.LT.K ) THEN -* -* Determine if workspace is large enough for blocked code. -* - LDWORK = M - IWS = LDWORK*NB - IF( LWORK.LT.IWS ) THEN -* -* Not enough workspace to use optimal NB: reduce NB and -* determine the minimum value of NB. -* - NB = LWORK / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'DGELQF', ' ', M, N, -1, - $ -1 ) ) - END IF - END IF - END IF -* - IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN -* -* Use blocked code initially -* - DO 10 I = 1, K - NX, NB - IB = MIN( K-I+1, NB ) -* -* Compute the LQ factorization of the current block -* A(i:i+ib-1,i:n) -* - CALL DGELQ2( IB, N-I+1, A( I, I ), LDA, TAU( I ), WORK, - $ IINFO ) - IF( I+IB.LE.M ) THEN -* -* Form the triangular factor of the block reflector -* H = H(i) H(i+1) . . . H(i+ib-1) -* - CALL DLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I, I ), - $ LDA, TAU( I ), WORK, LDWORK ) -* -* Apply H to A(i+ib:m,i:n) from the right -* - CALL DLARFB( 'Right', 'No transpose', 'Forward', - $ 'Rowwise', M-I-IB+1, N-I+1, IB, A( I, I ), - $ LDA, WORK, LDWORK, A( I+IB, I ), LDA, - $ WORK( IB+1 ), LDWORK ) - END IF - 10 CONTINUE - ELSE - I = 1 - END IF -* -* Use unblocked code to factor the last or only block. -* - IF( I.LE.K ) - $ CALL DGELQ2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK, - $ IINFO ) -* - WORK( 1 ) = IWS - RETURN -* -* End of DGELQF -* - END diff --git a/lib/linalg/fortran/dgelsd.f b/lib/linalg/fortran/dgelsd.f deleted file mode 100644 index b3b3d8b2d3..0000000000 --- a/lib/linalg/fortran/dgelsd.f +++ /dev/null @@ -1,626 +0,0 @@ -*> \brief DGELSD computes the minimum-norm solution to a linear least squares problem for GE matrices -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGELSD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGELSD( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, -* WORK, LWORK, IWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS, RANK -* DOUBLE PRECISION RCOND -* .. -* .. Array Arguments .. -* INTEGER IWORK( * ) -* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), S( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGELSD computes the minimum-norm solution to a real linear least -*> squares problem: -*> minimize 2-norm(| b - A*x |) -*> using the singular value decomposition (SVD) of A. A is an M-by-N -*> matrix which may be rank-deficient. -*> -*> Several right hand side vectors b and solution vectors x can be -*> handled in a single call; they are stored as the columns of the -*> M-by-NRHS right hand side matrix B and the N-by-NRHS solution -*> matrix X. -*> -*> The problem is solved in three steps: -*> (1) Reduce the coefficient matrix A to bidiagonal form with -*> Householder transformations, reducing the original problem -*> into a "bidiagonal least squares problem" (BLS) -*> (2) Solve the BLS using a divide and conquer approach. -*> (3) Apply back all the Householder transformations to solve -*> the original least squares problem. -*> -*> The effective rank of A is determined by treating as zero those -*> singular values which are less than RCOND times the largest singular -*> value. -*> -*> The divide and conquer algorithm makes very mild assumptions about -*> floating point arithmetic. It will work on machines with a guard -*> digit in add/subtract, or on those binary machines without guard -*> digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or -*> Cray-2. It could conceivably fail on hexadecimal or decimal machines -*> without guard digits, but we know of none. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of A. N >= 0. -*> \endverbatim -*> -*> \param[in] NRHS -*> \verbatim -*> NRHS is INTEGER -*> The number of right hand sides, i.e., the number of columns -*> of the matrices B and X. NRHS >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the M-by-N matrix A. -*> On exit, A has been destroyed. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB,NRHS) -*> On entry, the M-by-NRHS right hand side matrix B. -*> On exit, B is overwritten by the N-by-NRHS solution -*> matrix X. If m >= n and RANK = n, the residual -*> sum-of-squares for the solution in the i-th column is given -*> by the sum of squares of elements n+1:m in that column. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >= max(1,max(M,N)). -*> \endverbatim -*> -*> \param[out] S -*> \verbatim -*> S is DOUBLE PRECISION array, dimension (min(M,N)) -*> The singular values of A in decreasing order. -*> The condition number of A in the 2-norm = S(1)/S(min(m,n)). -*> \endverbatim -*> -*> \param[in] RCOND -*> \verbatim -*> RCOND is DOUBLE PRECISION -*> RCOND is used to determine the effective rank of A. -*> Singular values S(i) <= RCOND*S(1) are treated as zero. -*> If RCOND < 0, machine precision is used instead. -*> \endverbatim -*> -*> \param[out] RANK -*> \verbatim -*> RANK is INTEGER -*> The effective rank of A, i.e., the number of singular values -*> which are greater than RCOND*S(1). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK must be at least 1. -*> The exact minimum amount of workspace needed depends on M, -*> N and NRHS. As long as LWORK is at least -*> 12*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS + (SMLSIZ+1)**2, -*> if M is greater than or equal to N or -*> 12*M + 2*M*SMLSIZ + 8*M*NLVL + M*NRHS + (SMLSIZ+1)**2, -*> if M is less than N, the code will execute correctly. -*> SMLSIZ is returned by ILAENV and is equal to the maximum -*> size of the subproblems at the bottom of the computation -*> tree (usually about 25), and -*> NLVL = MAX( 0, INT( LOG_2( MIN( M,N )/(SMLSIZ+1) ) ) + 1 ) -*> For good performance, LWORK should generally be larger. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension (MAX(1,LIWORK)) -*> LIWORK >= max(1, 3 * MINMN * NLVL + 11 * MINMN), -*> where MINMN = MIN( M,N ). -*> On exit, if INFO = 0, IWORK(1) returns the minimum LIWORK. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: the algorithm for computing the SVD failed to converge; -*> if INFO = i, i off-diagonal elements of an intermediate -*> bidiagonal form did not converge to zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEsolve -* -*> \par Contributors: -* ================== -*> -*> Ming Gu and Ren-Cang Li, Computer Science Division, University of -*> California at Berkeley, USA \n -*> Osni Marques, LBNL/NERSC, USA \n -* -* ===================================================================== - SUBROUTINE DGELSD( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, - $ WORK, LWORK, IWORK, INFO ) -* -* -- LAPACK driver routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS, RANK - DOUBLE PRECISION RCOND -* .. -* .. Array Arguments .. - INTEGER IWORK( * ) - DOUBLE PRECISION A( LDA, * ), B( LDB, * ), S( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE, TWO - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER IASCL, IBSCL, IE, IL, ITAU, ITAUP, ITAUQ, - $ LDWORK, LIWORK, MAXMN, MAXWRK, MINMN, MINWRK, - $ MM, MNTHR, NLVL, NWORK, SMLSIZ, WLALSD - DOUBLE PRECISION ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM -* .. -* .. External Subroutines .. - EXTERNAL DGEBRD, DGELQF, DGEQRF, DLABAD, DLACPY, DLALSD, - $ DLASCL, DLASET, DORMBR, DORMLQ, DORMQR, XERBLA -* .. -* .. External Functions .. - INTEGER ILAENV - DOUBLE PRECISION DLAMCH, DLANGE - EXTERNAL ILAENV, DLAMCH, DLANGE -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, INT, LOG, MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input arguments. -* - INFO = 0 - MINMN = MIN( M, N ) - MAXMN = MAX( M, N ) - MNTHR = ILAENV( 6, 'DGELSD', ' ', M, N, NRHS, -1 ) - LQUERY = ( LWORK.EQ.-1 ) - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( NRHS.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - ELSE IF( LDB.LT.MAX( 1, MAXMN ) ) THEN - INFO = -7 - END IF -* - SMLSIZ = ILAENV( 9, 'DGELSD', ' ', 0, 0, 0, 0 ) -* -* Compute workspace. -* (Note: Comments in the code beginning "Workspace:" describe the -* minimal amount of workspace needed at that point in the code, -* as well as the preferred amount for good performance. -* NB refers to the optimal block size for the immediately -* following subroutine, as returned by ILAENV.) -* - MINWRK = 1 - LIWORK = 1 - MINMN = MAX( 1, MINMN ) - NLVL = MAX( INT( LOG( DBLE( MINMN ) / DBLE( SMLSIZ+1 ) ) / - $ LOG( TWO ) ) + 1, 0 ) -* - IF( INFO.EQ.0 ) THEN - MAXWRK = 0 - LIWORK = 3*MINMN*NLVL + 11*MINMN - MM = M - IF( M.GE.N .AND. M.GE.MNTHR ) THEN -* -* Path 1a - overdetermined, with many more rows than columns. -* - MM = N - MAXWRK = MAX( MAXWRK, N+N*ILAENV( 1, 'DGEQRF', ' ', M, N, - $ -1, -1 ) ) - MAXWRK = MAX( MAXWRK, N+NRHS* - $ ILAENV( 1, 'DORMQR', 'LT', M, NRHS, N, -1 ) ) - END IF - IF( M.GE.N ) THEN -* -* Path 1 - overdetermined or exactly determined. -* - MAXWRK = MAX( MAXWRK, 3*N+( MM+N )* - $ ILAENV( 1, 'DGEBRD', ' ', MM, N, -1, -1 ) ) - MAXWRK = MAX( MAXWRK, 3*N+NRHS* - $ ILAENV( 1, 'DORMBR', 'QLT', MM, NRHS, N, -1 ) ) - MAXWRK = MAX( MAXWRK, 3*N+( N-1 )* - $ ILAENV( 1, 'DORMBR', 'PLN', N, NRHS, N, -1 ) ) - WLALSD = 9*N+2*N*SMLSIZ+8*N*NLVL+N*NRHS+(SMLSIZ+1)**2 - MAXWRK = MAX( MAXWRK, 3*N+WLALSD ) - MINWRK = MAX( 3*N+MM, 3*N+NRHS, 3*N+WLALSD ) - END IF - IF( N.GT.M ) THEN - WLALSD = 9*M+2*M*SMLSIZ+8*M*NLVL+M*NRHS+(SMLSIZ+1)**2 - IF( N.GE.MNTHR ) THEN -* -* Path 2a - underdetermined, with many more columns -* than rows. -* - MAXWRK = M + M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 ) - MAXWRK = MAX( MAXWRK, M*M+4*M+2*M* - $ ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) ) - MAXWRK = MAX( MAXWRK, M*M+4*M+NRHS* - $ ILAENV( 1, 'DORMBR', 'QLT', M, NRHS, M, -1 ) ) - MAXWRK = MAX( MAXWRK, M*M+4*M+( M-1 )* - $ ILAENV( 1, 'DORMBR', 'PLN', M, NRHS, M, -1 ) ) - IF( NRHS.GT.1 ) THEN - MAXWRK = MAX( MAXWRK, M*M+M+M*NRHS ) - ELSE - MAXWRK = MAX( MAXWRK, M*M+2*M ) - END IF - MAXWRK = MAX( MAXWRK, M+NRHS* - $ ILAENV( 1, 'DORMLQ', 'LT', N, NRHS, M, -1 ) ) - MAXWRK = MAX( MAXWRK, M*M+4*M+WLALSD ) -! XXX: Ensure the Path 2a case below is triggered. The workspace -! calculation should use queries for all routines eventually. - MAXWRK = MAX( MAXWRK, - $ 4*M+M*M+MAX( M, 2*M-4, NRHS, N-3*M ) ) - ELSE -* -* Path 2 - remaining underdetermined cases. -* - MAXWRK = 3*M + ( N+M )*ILAENV( 1, 'DGEBRD', ' ', M, N, - $ -1, -1 ) - MAXWRK = MAX( MAXWRK, 3*M+NRHS* - $ ILAENV( 1, 'DORMBR', 'QLT', M, NRHS, N, -1 ) ) - MAXWRK = MAX( MAXWRK, 3*M+M* - $ ILAENV( 1, 'DORMBR', 'PLN', N, NRHS, M, -1 ) ) - MAXWRK = MAX( MAXWRK, 3*M+WLALSD ) - END IF - MINWRK = MAX( 3*M+NRHS, 3*M+M, 3*M+WLALSD ) - END IF - MINWRK = MIN( MINWRK, MAXWRK ) - WORK( 1 ) = MAXWRK - IWORK( 1 ) = LIWORK - - IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN - INFO = -12 - END IF - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGELSD', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - GO TO 10 - END IF -* -* Quick return if possible. -* - IF( M.EQ.0 .OR. N.EQ.0 ) THEN - RANK = 0 - RETURN - END IF -* -* Get machine parameters. -* - EPS = DLAMCH( 'P' ) - SFMIN = DLAMCH( 'S' ) - SMLNUM = SFMIN / EPS - BIGNUM = ONE / SMLNUM - CALL DLABAD( SMLNUM, BIGNUM ) -* -* Scale A if max entry outside range [SMLNUM,BIGNUM]. -* - ANRM = DLANGE( 'M', M, N, A, LDA, WORK ) - IASCL = 0 - IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN -* -* Scale matrix norm up to SMLNUM. -* - CALL DLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO ) - IASCL = 1 - ELSE IF( ANRM.GT.BIGNUM ) THEN -* -* Scale matrix norm down to BIGNUM. -* - CALL DLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO ) - IASCL = 2 - ELSE IF( ANRM.EQ.ZERO ) THEN -* -* Matrix all zero. Return zero solution. -* - CALL DLASET( 'F', MAX( M, N ), NRHS, ZERO, ZERO, B, LDB ) - CALL DLASET( 'F', MINMN, 1, ZERO, ZERO, S, 1 ) - RANK = 0 - GO TO 10 - END IF -* -* Scale B if max entry outside range [SMLNUM,BIGNUM]. -* - BNRM = DLANGE( 'M', M, NRHS, B, LDB, WORK ) - IBSCL = 0 - IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN -* -* Scale matrix norm up to SMLNUM. -* - CALL DLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO ) - IBSCL = 1 - ELSE IF( BNRM.GT.BIGNUM ) THEN -* -* Scale matrix norm down to BIGNUM. -* - CALL DLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO ) - IBSCL = 2 - END IF -* -* If M < N make sure certain entries of B are zero. -* - IF( M.LT.N ) - $ CALL DLASET( 'F', N-M, NRHS, ZERO, ZERO, B( M+1, 1 ), LDB ) -* -* Overdetermined case. -* - IF( M.GE.N ) THEN -* -* Path 1 - overdetermined or exactly determined. -* - MM = M - IF( M.GE.MNTHR ) THEN -* -* Path 1a - overdetermined, with many more rows than columns. -* - MM = N - ITAU = 1 - NWORK = ITAU + N -* -* Compute A=Q*R. -* (Workspace: need 2*N, prefer N+N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ), - $ LWORK-NWORK+1, INFO ) -* -* Multiply B by transpose(Q). -* (Workspace: need N+NRHS, prefer N+NRHS*NB) -* - CALL DORMQR( 'L', 'T', M, NRHS, N, A, LDA, WORK( ITAU ), B, - $ LDB, WORK( NWORK ), LWORK-NWORK+1, INFO ) -* -* Zero out below R. -* - IF( N.GT.1 ) THEN - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ), LDA ) - END IF - END IF -* - IE = 1 - ITAUQ = IE + N - ITAUP = ITAUQ + N - NWORK = ITAUP + N -* -* Bidiagonalize R in A. -* (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB) -* - CALL DGEBRD( MM, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1, - $ INFO ) -* -* Multiply B by transpose of left bidiagonalizing vectors of R. -* (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB) -* - CALL DORMBR( 'Q', 'L', 'T', MM, NRHS, N, A, LDA, WORK( ITAUQ ), - $ B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO ) -* -* Solve the bidiagonal least squares problem. -* - CALL DLALSD( 'U', SMLSIZ, N, NRHS, S, WORK( IE ), B, LDB, - $ RCOND, RANK, WORK( NWORK ), IWORK, INFO ) - IF( INFO.NE.0 ) THEN - GO TO 10 - END IF -* -* Multiply B by right bidiagonalizing vectors of R. -* - CALL DORMBR( 'P', 'L', 'N', N, NRHS, N, A, LDA, WORK( ITAUP ), - $ B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO ) -* - ELSE IF( N.GE.MNTHR .AND. LWORK.GE.4*M+M*M+ - $ MAX( M, 2*M-4, NRHS, N-3*M, WLALSD ) ) THEN -* -* Path 2a - underdetermined, with many more columns than rows -* and sufficient workspace for an efficient algorithm. -* - LDWORK = M - IF( LWORK.GE.MAX( 4*M+M*LDA+MAX( M, 2*M-4, NRHS, N-3*M ), - $ M*LDA+M+M*NRHS, 4*M+M*LDA+WLALSD ) )LDWORK = LDA - ITAU = 1 - NWORK = M + 1 -* -* Compute A=L*Q. -* (Workspace: need 2*M, prefer M+M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ), - $ LWORK-NWORK+1, INFO ) - IL = NWORK -* -* Copy L to WORK(IL), zeroing out above its diagonal. -* - CALL DLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWORK ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, WORK( IL+LDWORK ), - $ LDWORK ) - IE = IL + LDWORK*M - ITAUQ = IE + M - ITAUP = ITAUQ + M - NWORK = ITAUP + M -* -* Bidiagonalize L in WORK(IL). -* (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB) -* - CALL DGEBRD( M, M, WORK( IL ), LDWORK, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), WORK( NWORK ), - $ LWORK-NWORK+1, INFO ) -* -* Multiply B by transpose of left bidiagonalizing vectors of L. -* (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB) -* - CALL DORMBR( 'Q', 'L', 'T', M, NRHS, M, WORK( IL ), LDWORK, - $ WORK( ITAUQ ), B, LDB, WORK( NWORK ), - $ LWORK-NWORK+1, INFO ) -* -* Solve the bidiagonal least squares problem. -* - CALL DLALSD( 'U', SMLSIZ, M, NRHS, S, WORK( IE ), B, LDB, - $ RCOND, RANK, WORK( NWORK ), IWORK, INFO ) - IF( INFO.NE.0 ) THEN - GO TO 10 - END IF -* -* Multiply B by right bidiagonalizing vectors of L. -* - CALL DORMBR( 'P', 'L', 'N', M, NRHS, M, WORK( IL ), LDWORK, - $ WORK( ITAUP ), B, LDB, WORK( NWORK ), - $ LWORK-NWORK+1, INFO ) -* -* Zero out below first M rows of B. -* - CALL DLASET( 'F', N-M, NRHS, ZERO, ZERO, B( M+1, 1 ), LDB ) - NWORK = ITAU + M -* -* Multiply transpose(Q) by B. -* (Workspace: need M+NRHS, prefer M+NRHS*NB) -* - CALL DORMLQ( 'L', 'T', N, NRHS, M, A, LDA, WORK( ITAU ), B, - $ LDB, WORK( NWORK ), LWORK-NWORK+1, INFO ) -* - ELSE -* -* Path 2 - remaining underdetermined cases. -* - IE = 1 - ITAUQ = IE + M - ITAUP = ITAUQ + M - NWORK = ITAUP + M -* -* Bidiagonalize A. -* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) -* - CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1, - $ INFO ) -* -* Multiply B by transpose of left bidiagonalizing vectors. -* (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB) -* - CALL DORMBR( 'Q', 'L', 'T', M, NRHS, N, A, LDA, WORK( ITAUQ ), - $ B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO ) -* -* Solve the bidiagonal least squares problem. -* - CALL DLALSD( 'L', SMLSIZ, M, NRHS, S, WORK( IE ), B, LDB, - $ RCOND, RANK, WORK( NWORK ), IWORK, INFO ) - IF( INFO.NE.0 ) THEN - GO TO 10 - END IF -* -* Multiply B by right bidiagonalizing vectors of A. -* - CALL DORMBR( 'P', 'L', 'N', N, NRHS, M, A, LDA, WORK( ITAUP ), - $ B, LDB, WORK( NWORK ), LWORK-NWORK+1, INFO ) -* - END IF -* -* Undo scaling. -* - IF( IASCL.EQ.1 ) THEN - CALL DLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO ) - CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN, - $ INFO ) - ELSE IF( IASCL.EQ.2 ) THEN - CALL DLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO ) - CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN, - $ INFO ) - END IF - IF( IBSCL.EQ.1 ) THEN - CALL DLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO ) - ELSE IF( IBSCL.EQ.2 ) THEN - CALL DLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO ) - END IF -* - 10 CONTINUE - WORK( 1 ) = MAXWRK - IWORK( 1 ) = LIWORK - RETURN -* -* End of DGELSD -* - END diff --git a/lib/linalg/fortran/dgelss.f b/lib/linalg/fortran/dgelss.f deleted file mode 100644 index c4190f2e09..0000000000 --- a/lib/linalg/fortran/dgelss.f +++ /dev/null @@ -1,744 +0,0 @@ -*> \brief DGELSS solves overdetermined or underdetermined systems for GE matrices -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGELSS + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, -* WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS, RANK -* DOUBLE PRECISION RCOND -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), S( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGELSS computes the minimum norm solution to a real linear least -*> squares problem: -*> -*> Minimize 2-norm(| b - A*x |). -*> -*> using the singular value decomposition (SVD) of A. A is an M-by-N -*> matrix which may be rank-deficient. -*> -*> Several right hand side vectors b and solution vectors x can be -*> handled in a single call; they are stored as the columns of the -*> M-by-NRHS right hand side matrix B and the N-by-NRHS solution matrix -*> X. -*> -*> The effective rank of A is determined by treating as zero those -*> singular values which are less than RCOND times the largest singular -*> value. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in] NRHS -*> \verbatim -*> NRHS is INTEGER -*> The number of right hand sides, i.e., the number of columns -*> of the matrices B and X. NRHS >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the M-by-N matrix A. -*> On exit, the first min(m,n) rows of A are overwritten with -*> its right singular vectors, stored rowwise. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB,NRHS) -*> On entry, the M-by-NRHS right hand side matrix B. -*> On exit, B is overwritten by the N-by-NRHS solution -*> matrix X. If m >= n and RANK = n, the residual -*> sum-of-squares for the solution in the i-th column is given -*> by the sum of squares of elements n+1:m in that column. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >= max(1,max(M,N)). -*> \endverbatim -*> -*> \param[out] S -*> \verbatim -*> S is DOUBLE PRECISION array, dimension (min(M,N)) -*> The singular values of A in decreasing order. -*> The condition number of A in the 2-norm = S(1)/S(min(m,n)). -*> \endverbatim -*> -*> \param[in] RCOND -*> \verbatim -*> RCOND is DOUBLE PRECISION -*> RCOND is used to determine the effective rank of A. -*> Singular values S(i) <= RCOND*S(1) are treated as zero. -*> If RCOND < 0, machine precision is used instead. -*> \endverbatim -*> -*> \param[out] RANK -*> \verbatim -*> RANK is INTEGER -*> The effective rank of A, i.e., the number of singular values -*> which are greater than RCOND*S(1). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= 1, and also: -*> LWORK >= 3*min(M,N) + max( 2*min(M,N), max(M,N), NRHS ) -*> For good performance, LWORK should generally be larger. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: the algorithm for computing the SVD failed to converge; -*> if INFO = i, i off-diagonal elements of an intermediate -*> bidiagonal form did not converge to zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEsolve -* -* ===================================================================== - SUBROUTINE DGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, - $ WORK, LWORK, INFO ) -* -* -- LAPACK driver routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS, RANK - DOUBLE PRECISION RCOND -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), B( LDB, * ), S( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER BDSPAC, BL, CHUNK, I, IASCL, IBSCL, IE, IL, - $ ITAU, ITAUP, ITAUQ, IWORK, LDWORK, MAXMN, - $ MAXWRK, MINMN, MINWRK, MM, MNTHR - INTEGER LWORK_DGEQRF, LWORK_DORMQR, LWORK_DGEBRD, - $ LWORK_DORMBR, LWORK_DORGBR, LWORK_DORMLQ, - $ LWORK_DGELQF - DOUBLE PRECISION ANRM, BIGNUM, BNRM, EPS, SFMIN, SMLNUM, THR -* .. -* .. Local Arrays .. - DOUBLE PRECISION DUM( 1 ) -* .. -* .. External Subroutines .. - EXTERNAL DBDSQR, DCOPY, DGEBRD, DGELQF, DGEMM, DGEMV, - $ DGEQRF, DLABAD, DLACPY, DLASCL, DLASET, DORGBR, - $ DORMBR, DORMLQ, DORMQR, DRSCL, XERBLA -* .. -* .. External Functions .. - INTEGER ILAENV - DOUBLE PRECISION DLAMCH, DLANGE - EXTERNAL ILAENV, DLAMCH, DLANGE -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - MINMN = MIN( M, N ) - MAXMN = MAX( M, N ) - LQUERY = ( LWORK.EQ.-1 ) - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( NRHS.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - ELSE IF( LDB.LT.MAX( 1, MAXMN ) ) THEN - INFO = -7 - END IF -* -* Compute workspace -* (Note: Comments in the code beginning "Workspace:" describe the -* minimal amount of workspace needed at that point in the code, -* as well as the preferred amount for good performance. -* NB refers to the optimal block size for the immediately -* following subroutine, as returned by ILAENV.) -* - IF( INFO.EQ.0 ) THEN - MINWRK = 1 - MAXWRK = 1 - IF( MINMN.GT.0 ) THEN - MM = M - MNTHR = ILAENV( 6, 'DGELSS', ' ', M, N, NRHS, -1 ) - IF( M.GE.N .AND. M.GE.MNTHR ) THEN -* -* Path 1a - overdetermined, with many more rows than -* columns -* -* Compute space needed for DGEQRF - CALL DGEQRF( M, N, A, LDA, DUM(1), DUM(1), -1, INFO ) - LWORK_DGEQRF = INT( DUM(1) ) -* Compute space needed for DORMQR - CALL DORMQR( 'L', 'T', M, NRHS, N, A, LDA, DUM(1), B, - $ LDB, DUM(1), -1, INFO ) - LWORK_DORMQR = INT( DUM(1) ) - MM = N - MAXWRK = MAX( MAXWRK, N + LWORK_DGEQRF ) - MAXWRK = MAX( MAXWRK, N + LWORK_DORMQR ) - END IF - IF( M.GE.N ) THEN -* -* Path 1 - overdetermined or exactly determined -* -* Compute workspace needed for DBDSQR -* - BDSPAC = MAX( 1, 5*N ) -* Compute space needed for DGEBRD - CALL DGEBRD( MM, N, A, LDA, S, DUM(1), DUM(1), - $ DUM(1), DUM(1), -1, INFO ) - LWORK_DGEBRD = INT( DUM(1) ) -* Compute space needed for DORMBR - CALL DORMBR( 'Q', 'L', 'T', MM, NRHS, N, A, LDA, DUM(1), - $ B, LDB, DUM(1), -1, INFO ) - LWORK_DORMBR = INT( DUM(1) ) -* Compute space needed for DORGBR - CALL DORGBR( 'P', N, N, N, A, LDA, DUM(1), - $ DUM(1), -1, INFO ) - LWORK_DORGBR = INT( DUM(1) ) -* Compute total workspace needed - MAXWRK = MAX( MAXWRK, 3*N + LWORK_DGEBRD ) - MAXWRK = MAX( MAXWRK, 3*N + LWORK_DORMBR ) - MAXWRK = MAX( MAXWRK, 3*N + LWORK_DORGBR ) - MAXWRK = MAX( MAXWRK, BDSPAC ) - MAXWRK = MAX( MAXWRK, N*NRHS ) - MINWRK = MAX( 3*N + MM, 3*N + NRHS, BDSPAC ) - MAXWRK = MAX( MINWRK, MAXWRK ) - END IF - IF( N.GT.M ) THEN -* -* Compute workspace needed for DBDSQR -* - BDSPAC = MAX( 1, 5*M ) - MINWRK = MAX( 3*M+NRHS, 3*M+N, BDSPAC ) - IF( N.GE.MNTHR ) THEN -* -* Path 2a - underdetermined, with many more columns -* than rows -* -* Compute space needed for DGELQF - CALL DGELQF( M, N, A, LDA, DUM(1), DUM(1), - $ -1, INFO ) - LWORK_DGELQF = INT( DUM(1) ) -* Compute space needed for DGEBRD - CALL DGEBRD( M, M, A, LDA, S, DUM(1), DUM(1), - $ DUM(1), DUM(1), -1, INFO ) - LWORK_DGEBRD = INT( DUM(1) ) -* Compute space needed for DORMBR - CALL DORMBR( 'Q', 'L', 'T', M, NRHS, N, A, LDA, - $ DUM(1), B, LDB, DUM(1), -1, INFO ) - LWORK_DORMBR = INT( DUM(1) ) -* Compute space needed for DORGBR - CALL DORGBR( 'P', M, M, M, A, LDA, DUM(1), - $ DUM(1), -1, INFO ) - LWORK_DORGBR = INT( DUM(1) ) -* Compute space needed for DORMLQ - CALL DORMLQ( 'L', 'T', N, NRHS, M, A, LDA, DUM(1), - $ B, LDB, DUM(1), -1, INFO ) - LWORK_DORMLQ = INT( DUM(1) ) -* Compute total workspace needed - MAXWRK = M + LWORK_DGELQF - MAXWRK = MAX( MAXWRK, M*M + 4*M + LWORK_DGEBRD ) - MAXWRK = MAX( MAXWRK, M*M + 4*M + LWORK_DORMBR ) - MAXWRK = MAX( MAXWRK, M*M + 4*M + LWORK_DORGBR ) - MAXWRK = MAX( MAXWRK, M*M + M + BDSPAC ) - IF( NRHS.GT.1 ) THEN - MAXWRK = MAX( MAXWRK, M*M + M + M*NRHS ) - ELSE - MAXWRK = MAX( MAXWRK, M*M + 2*M ) - END IF - MAXWRK = MAX( MAXWRK, M + LWORK_DORMLQ ) - ELSE -* -* Path 2 - underdetermined -* -* Compute space needed for DGEBRD - CALL DGEBRD( M, N, A, LDA, S, DUM(1), DUM(1), - $ DUM(1), DUM(1), -1, INFO ) - LWORK_DGEBRD = INT( DUM(1) ) -* Compute space needed for DORMBR - CALL DORMBR( 'Q', 'L', 'T', M, NRHS, M, A, LDA, - $ DUM(1), B, LDB, DUM(1), -1, INFO ) - LWORK_DORMBR = INT( DUM(1) ) -* Compute space needed for DORGBR - CALL DORGBR( 'P', M, N, M, A, LDA, DUM(1), - $ DUM(1), -1, INFO ) - LWORK_DORGBR = INT( DUM(1) ) - MAXWRK = 3*M + LWORK_DGEBRD - MAXWRK = MAX( MAXWRK, 3*M + LWORK_DORMBR ) - MAXWRK = MAX( MAXWRK, 3*M + LWORK_DORGBR ) - MAXWRK = MAX( MAXWRK, BDSPAC ) - MAXWRK = MAX( MAXWRK, N*NRHS ) - END IF - END IF - MAXWRK = MAX( MINWRK, MAXWRK ) - END IF - WORK( 1 ) = MAXWRK -* - IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) - $ INFO = -12 - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGELSS', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 ) THEN - RANK = 0 - RETURN - END IF -* -* Get machine parameters -* - EPS = DLAMCH( 'P' ) - SFMIN = DLAMCH( 'S' ) - SMLNUM = SFMIN / EPS - BIGNUM = ONE / SMLNUM - CALL DLABAD( SMLNUM, BIGNUM ) -* -* Scale A if max element outside range [SMLNUM,BIGNUM] -* - ANRM = DLANGE( 'M', M, N, A, LDA, WORK ) - IASCL = 0 - IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN -* -* Scale matrix norm up to SMLNUM -* - CALL DLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO ) - IASCL = 1 - ELSE IF( ANRM.GT.BIGNUM ) THEN -* -* Scale matrix norm down to BIGNUM -* - CALL DLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO ) - IASCL = 2 - ELSE IF( ANRM.EQ.ZERO ) THEN -* -* Matrix all zero. Return zero solution. -* - CALL DLASET( 'F', MAX( M, N ), NRHS, ZERO, ZERO, B, LDB ) - CALL DLASET( 'F', MINMN, 1, ZERO, ZERO, S, MINMN ) - RANK = 0 - GO TO 70 - END IF -* -* Scale B if max element outside range [SMLNUM,BIGNUM] -* - BNRM = DLANGE( 'M', M, NRHS, B, LDB, WORK ) - IBSCL = 0 - IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN -* -* Scale matrix norm up to SMLNUM -* - CALL DLASCL( 'G', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO ) - IBSCL = 1 - ELSE IF( BNRM.GT.BIGNUM ) THEN -* -* Scale matrix norm down to BIGNUM -* - CALL DLASCL( 'G', 0, 0, BNRM, BIGNUM, M, NRHS, B, LDB, INFO ) - IBSCL = 2 - END IF -* -* Overdetermined case -* - IF( M.GE.N ) THEN -* -* Path 1 - overdetermined or exactly determined -* - MM = M - IF( M.GE.MNTHR ) THEN -* -* Path 1a - overdetermined, with many more rows than columns -* - MM = N - ITAU = 1 - IWORK = ITAU + N -* -* Compute A=Q*R -* (Workspace: need 2*N, prefer N+N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ), - $ LWORK-IWORK+1, INFO ) -* -* Multiply B by transpose(Q) -* (Workspace: need N+NRHS, prefer N+NRHS*NB) -* - CALL DORMQR( 'L', 'T', M, NRHS, N, A, LDA, WORK( ITAU ), B, - $ LDB, WORK( IWORK ), LWORK-IWORK+1, INFO ) -* -* Zero out below R -* - IF( N.GT.1 ) - $ CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ), LDA ) - END IF -* - IE = 1 - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in A -* (Workspace: need 3*N+MM, prefer 3*N+(MM+N)*NB) -* - CALL DGEBRD( MM, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1, - $ INFO ) -* -* Multiply B by transpose of left bidiagonalizing vectors of R -* (Workspace: need 3*N+NRHS, prefer 3*N+NRHS*NB) -* - CALL DORMBR( 'Q', 'L', 'T', MM, NRHS, N, A, LDA, WORK( ITAUQ ), - $ B, LDB, WORK( IWORK ), LWORK-IWORK+1, INFO ) -* -* Generate right bidiagonalizing vectors of R in A -* (Workspace: need 4*N-1, prefer 3*N+(N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, INFO ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration -* multiply B by transpose of left singular vectors -* compute right singular vectors in A -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, N, 0, NRHS, S, WORK( IE ), A, LDA, DUM, - $ 1, B, LDB, WORK( IWORK ), INFO ) - IF( INFO.NE.0 ) - $ GO TO 70 -* -* Multiply B by reciprocals of singular values -* - THR = MAX( RCOND*S( 1 ), SFMIN ) - IF( RCOND.LT.ZERO ) - $ THR = MAX( EPS*S( 1 ), SFMIN ) - RANK = 0 - DO 10 I = 1, N - IF( S( I ).GT.THR ) THEN - CALL DRSCL( NRHS, S( I ), B( I, 1 ), LDB ) - RANK = RANK + 1 - ELSE - CALL DLASET( 'F', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB ) - END IF - 10 CONTINUE -* -* Multiply B by right singular vectors -* (Workspace: need N, prefer N*NRHS) -* - IF( LWORK.GE.LDB*NRHS .AND. NRHS.GT.1 ) THEN - CALL DGEMM( 'T', 'N', N, NRHS, N, ONE, A, LDA, B, LDB, ZERO, - $ WORK, LDB ) - CALL DLACPY( 'G', N, NRHS, WORK, LDB, B, LDB ) - ELSE IF( NRHS.GT.1 ) THEN - CHUNK = LWORK / N - DO 20 I = 1, NRHS, CHUNK - BL = MIN( NRHS-I+1, CHUNK ) - CALL DGEMM( 'T', 'N', N, BL, N, ONE, A, LDA, B( 1, I ), - $ LDB, ZERO, WORK, N ) - CALL DLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB ) - 20 CONTINUE - ELSE - CALL DGEMV( 'T', N, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 ) - CALL DCOPY( N, WORK, 1, B, 1 ) - END IF -* - ELSE IF( N.GE.MNTHR .AND. LWORK.GE.4*M+M*M+ - $ MAX( M, 2*M-4, NRHS, N-3*M ) ) THEN -* -* Path 2a - underdetermined, with many more columns than rows -* and sufficient workspace for an efficient algorithm -* - LDWORK = M - IF( LWORK.GE.MAX( 4*M+M*LDA+MAX( M, 2*M-4, NRHS, N-3*M ), - $ M*LDA+M+M*NRHS ) )LDWORK = LDA - ITAU = 1 - IWORK = M + 1 -* -* Compute A=L*Q -* (Workspace: need 2*M, prefer M+M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ), - $ LWORK-IWORK+1, INFO ) - IL = IWORK -* -* Copy L to WORK(IL), zeroing out above it -* - CALL DLACPY( 'L', M, M, A, LDA, WORK( IL ), LDWORK ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, WORK( IL+LDWORK ), - $ LDWORK ) - IE = IL + LDWORK*M - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in WORK(IL) -* (Workspace: need M*M+5*M, prefer M*M+4*M+2*M*NB) -* - CALL DGEBRD( M, M, WORK( IL ), LDWORK, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, INFO ) -* -* Multiply B by transpose of left bidiagonalizing vectors of L -* (Workspace: need M*M+4*M+NRHS, prefer M*M+4*M+NRHS*NB) -* - CALL DORMBR( 'Q', 'L', 'T', M, NRHS, M, WORK( IL ), LDWORK, - $ WORK( ITAUQ ), B, LDB, WORK( IWORK ), - $ LWORK-IWORK+1, INFO ) -* -* Generate right bidiagonalizing vectors of R in WORK(IL) -* (Workspace: need M*M+5*M-1, prefer M*M+4*M+(M-1)*NB) -* - CALL DORGBR( 'P', M, M, M, WORK( IL ), LDWORK, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, INFO ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, -* computing right singular vectors of L in WORK(IL) and -* multiplying B by transpose of left singular vectors -* (Workspace: need M*M+M+BDSPAC) -* - CALL DBDSQR( 'U', M, M, 0, NRHS, S, WORK( IE ), WORK( IL ), - $ LDWORK, A, LDA, B, LDB, WORK( IWORK ), INFO ) - IF( INFO.NE.0 ) - $ GO TO 70 -* -* Multiply B by reciprocals of singular values -* - THR = MAX( RCOND*S( 1 ), SFMIN ) - IF( RCOND.LT.ZERO ) - $ THR = MAX( EPS*S( 1 ), SFMIN ) - RANK = 0 - DO 30 I = 1, M - IF( S( I ).GT.THR ) THEN - CALL DRSCL( NRHS, S( I ), B( I, 1 ), LDB ) - RANK = RANK + 1 - ELSE - CALL DLASET( 'F', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB ) - END IF - 30 CONTINUE - IWORK = IE -* -* Multiply B by right singular vectors of L in WORK(IL) -* (Workspace: need M*M+2*M, prefer M*M+M+M*NRHS) -* - IF( LWORK.GE.LDB*NRHS+IWORK-1 .AND. NRHS.GT.1 ) THEN - CALL DGEMM( 'T', 'N', M, NRHS, M, ONE, WORK( IL ), LDWORK, - $ B, LDB, ZERO, WORK( IWORK ), LDB ) - CALL DLACPY( 'G', M, NRHS, WORK( IWORK ), LDB, B, LDB ) - ELSE IF( NRHS.GT.1 ) THEN - CHUNK = ( LWORK-IWORK+1 ) / M - DO 40 I = 1, NRHS, CHUNK - BL = MIN( NRHS-I+1, CHUNK ) - CALL DGEMM( 'T', 'N', M, BL, M, ONE, WORK( IL ), LDWORK, - $ B( 1, I ), LDB, ZERO, WORK( IWORK ), M ) - CALL DLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ), - $ LDB ) - 40 CONTINUE - ELSE - CALL DGEMV( 'T', M, M, ONE, WORK( IL ), LDWORK, B( 1, 1 ), - $ 1, ZERO, WORK( IWORK ), 1 ) - CALL DCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 ) - END IF -* -* Zero out below first M rows of B -* - CALL DLASET( 'F', N-M, NRHS, ZERO, ZERO, B( M+1, 1 ), LDB ) - IWORK = ITAU + M -* -* Multiply transpose(Q) by B -* (Workspace: need M+NRHS, prefer M+NRHS*NB) -* - CALL DORMLQ( 'L', 'T', N, NRHS, M, A, LDA, WORK( ITAU ), B, - $ LDB, WORK( IWORK ), LWORK-IWORK+1, INFO ) -* - ELSE -* -* Path 2 - remaining underdetermined cases -* - IE = 1 - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize A -* (Workspace: need 3*M+N, prefer 3*M+(M+N)*NB) -* - CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1, - $ INFO ) -* -* Multiply B by transpose of left bidiagonalizing vectors -* (Workspace: need 3*M+NRHS, prefer 3*M+NRHS*NB) -* - CALL DORMBR( 'Q', 'L', 'T', M, NRHS, N, A, LDA, WORK( ITAUQ ), - $ B, LDB, WORK( IWORK ), LWORK-IWORK+1, INFO ) -* -* Generate right bidiagonalizing vectors in A -* (Workspace: need 4*M, prefer 3*M+M*NB) -* - CALL DORGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, INFO ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, -* computing right singular vectors of A in A and -* multiplying B by transpose of left singular vectors -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'L', M, N, 0, NRHS, S, WORK( IE ), A, LDA, DUM, - $ 1, B, LDB, WORK( IWORK ), INFO ) - IF( INFO.NE.0 ) - $ GO TO 70 -* -* Multiply B by reciprocals of singular values -* - THR = MAX( RCOND*S( 1 ), SFMIN ) - IF( RCOND.LT.ZERO ) - $ THR = MAX( EPS*S( 1 ), SFMIN ) - RANK = 0 - DO 50 I = 1, M - IF( S( I ).GT.THR ) THEN - CALL DRSCL( NRHS, S( I ), B( I, 1 ), LDB ) - RANK = RANK + 1 - ELSE - CALL DLASET( 'F', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB ) - END IF - 50 CONTINUE -* -* Multiply B by right singular vectors of A -* (Workspace: need N, prefer N*NRHS) -* - IF( LWORK.GE.LDB*NRHS .AND. NRHS.GT.1 ) THEN - CALL DGEMM( 'T', 'N', N, NRHS, M, ONE, A, LDA, B, LDB, ZERO, - $ WORK, LDB ) - CALL DLACPY( 'F', N, NRHS, WORK, LDB, B, LDB ) - ELSE IF( NRHS.GT.1 ) THEN - CHUNK = LWORK / N - DO 60 I = 1, NRHS, CHUNK - BL = MIN( NRHS-I+1, CHUNK ) - CALL DGEMM( 'T', 'N', N, BL, M, ONE, A, LDA, B( 1, I ), - $ LDB, ZERO, WORK, N ) - CALL DLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB ) - 60 CONTINUE - ELSE - CALL DGEMV( 'T', M, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 ) - CALL DCOPY( N, WORK, 1, B, 1 ) - END IF - END IF -* -* Undo scaling -* - IF( IASCL.EQ.1 ) THEN - CALL DLASCL( 'G', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO ) - CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN, - $ INFO ) - ELSE IF( IASCL.EQ.2 ) THEN - CALL DLASCL( 'G', 0, 0, ANRM, BIGNUM, N, NRHS, B, LDB, INFO ) - CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN, - $ INFO ) - END IF - IF( IBSCL.EQ.1 ) THEN - CALL DLASCL( 'G', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO ) - ELSE IF( IBSCL.EQ.2 ) THEN - CALL DLASCL( 'G', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO ) - END IF -* - 70 CONTINUE - WORK( 1 ) = MAXWRK - RETURN -* -* End of DGELSS -* - END diff --git a/lib/linalg/fortran/dgemm.f b/lib/linalg/fortran/dgemm.f deleted file mode 100644 index 8c1b4f2066..0000000000 --- a/lib/linalg/fortran/dgemm.f +++ /dev/null @@ -1,379 +0,0 @@ -*> \brief \b DGEMM -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION ALPHA,BETA -* INTEGER K,LDA,LDB,LDC,M,N -* CHARACTER TRANSA,TRANSB -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGEMM performs one of the matrix-matrix operations -*> -*> C := alpha*op( A )*op( B ) + beta*C, -*> -*> where op( X ) is one of -*> -*> op( X ) = X or op( X ) = X**T, -*> -*> alpha and beta are scalars, and A, B and C are matrices, with op( A ) -*> an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] TRANSA -*> \verbatim -*> TRANSA is CHARACTER*1 -*> On entry, TRANSA specifies the form of op( A ) to be used in -*> the matrix multiplication as follows: -*> -*> TRANSA = 'N' or 'n', op( A ) = A. -*> -*> TRANSA = 'T' or 't', op( A ) = A**T. -*> -*> TRANSA = 'C' or 'c', op( A ) = A**T. -*> \endverbatim -*> -*> \param[in] TRANSB -*> \verbatim -*> TRANSB is CHARACTER*1 -*> On entry, TRANSB specifies the form of op( B ) to be used in -*> the matrix multiplication as follows: -*> -*> TRANSB = 'N' or 'n', op( B ) = B. -*> -*> TRANSB = 'T' or 't', op( B ) = B**T. -*> -*> TRANSB = 'C' or 'c', op( B ) = B**T. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> On entry, M specifies the number of rows of the matrix -*> op( A ) and of the matrix C. M must be at least zero. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the number of columns of the matrix -*> op( B ) and the number of columns of the matrix C. N must be -*> at least zero. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> On entry, K specifies the number of columns of the matrix -*> op( A ) and the number of rows of the matrix op( B ). K must -*> be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION. -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is -*> k when TRANSA = 'N' or 'n', and is m otherwise. -*> Before entry with TRANSA = 'N' or 'n', the leading m by k -*> part of the array A must contain the matrix A, otherwise -*> the leading k by m part of the array A must contain the -*> matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. When TRANSA = 'N' or 'n' then -*> LDA must be at least max( 1, m ), otherwise LDA must be at -*> least max( 1, k ). -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension ( LDB, kb ), where kb is -*> n when TRANSB = 'N' or 'n', and is k otherwise. -*> Before entry with TRANSB = 'N' or 'n', the leading k by n -*> part of the array B must contain the matrix B, otherwise -*> the leading n by k part of the array B must contain the -*> matrix B. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> On entry, LDB specifies the first dimension of B as declared -*> in the calling (sub) program. When TRANSB = 'N' or 'n' then -*> LDB must be at least max( 1, k ), otherwise LDB must be at -*> least max( 1, n ). -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is DOUBLE PRECISION. -*> On entry, BETA specifies the scalar beta. When BETA is -*> supplied as zero then C need not be set on input. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension ( LDC, N ) -*> Before entry, the leading m by n part of the array C must -*> contain the matrix C, except when beta is zero, in which -*> case C need not be set on entry. -*> On exit, the array C is overwritten by the m by n matrix -*> ( alpha*op( A )*op( B ) + beta*C ). -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> On entry, LDC specifies the first dimension of C as declared -*> in the calling (sub) program. LDC must be at least -*> max( 1, m ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level3 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 3 Blas routine. -*> -*> -- Written on 8-February-1989. -*> Jack Dongarra, Argonne National Laboratory. -*> Iain Duff, AERE Harwell. -*> Jeremy Du Croz, Numerical Algorithms Group Ltd. -*> Sven Hammarling, Numerical Algorithms Group Ltd. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) -* -* -- Reference BLAS level3 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION ALPHA,BETA - INTEGER K,LDA,LDB,LDC,M,N - CHARACTER TRANSA,TRANSB -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) -* .. -* -* ===================================================================== -* -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP - INTEGER I,INFO,J,L,NROWA,NROWB - LOGICAL NOTA,NOTB -* .. -* .. Parameters .. - DOUBLE PRECISION ONE,ZERO - PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) -* .. -* -* Set NOTA and NOTB as true if A and B respectively are not -* transposed and set NROWA and NROWB as the number of rows of A -* and B respectively. -* - NOTA = LSAME(TRANSA,'N') - NOTB = LSAME(TRANSB,'N') - IF (NOTA) THEN - NROWA = M - ELSE - NROWA = K - END IF - IF (NOTB) THEN - NROWB = K - ELSE - NROWB = N - END IF -* -* Test the input parameters. -* - INFO = 0 - IF ((.NOT.NOTA) .AND. (.NOT.LSAME(TRANSA,'C')) .AND. - + (.NOT.LSAME(TRANSA,'T'))) THEN - INFO = 1 - ELSE IF ((.NOT.NOTB) .AND. (.NOT.LSAME(TRANSB,'C')) .AND. - + (.NOT.LSAME(TRANSB,'T'))) THEN - INFO = 2 - ELSE IF (M.LT.0) THEN - INFO = 3 - ELSE IF (N.LT.0) THEN - INFO = 4 - ELSE IF (K.LT.0) THEN - INFO = 5 - ELSE IF (LDA.LT.MAX(1,NROWA)) THEN - INFO = 8 - ELSE IF (LDB.LT.MAX(1,NROWB)) THEN - INFO = 10 - ELSE IF (LDC.LT.MAX(1,M)) THEN - INFO = 13 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DGEMM ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((M.EQ.0) .OR. (N.EQ.0) .OR. - + (((ALPHA.EQ.ZERO).OR. (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN -* -* And if alpha.eq.zero. -* - IF (ALPHA.EQ.ZERO) THEN - IF (BETA.EQ.ZERO) THEN - DO 20 J = 1,N - DO 10 I = 1,M - C(I,J) = ZERO - 10 CONTINUE - 20 CONTINUE - ELSE - DO 40 J = 1,N - DO 30 I = 1,M - C(I,J) = BETA*C(I,J) - 30 CONTINUE - 40 CONTINUE - END IF - RETURN - END IF -* -* Start the operations. -* - IF (NOTB) THEN - IF (NOTA) THEN -* -* Form C := alpha*A*B + beta*C. -* - DO 90 J = 1,N - IF (BETA.EQ.ZERO) THEN - DO 50 I = 1,M - C(I,J) = ZERO - 50 CONTINUE - ELSE IF (BETA.NE.ONE) THEN - DO 60 I = 1,M - C(I,J) = BETA*C(I,J) - 60 CONTINUE - END IF - DO 80 L = 1,K - TEMP = ALPHA*B(L,J) - DO 70 I = 1,M - C(I,J) = C(I,J) + TEMP*A(I,L) - 70 CONTINUE - 80 CONTINUE - 90 CONTINUE - ELSE -* -* Form C := alpha*A**T*B + beta*C -* - DO 120 J = 1,N - DO 110 I = 1,M - TEMP = ZERO - DO 100 L = 1,K - TEMP = TEMP + A(L,I)*B(L,J) - 100 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = ALPHA*TEMP - ELSE - C(I,J) = ALPHA*TEMP + BETA*C(I,J) - END IF - 110 CONTINUE - 120 CONTINUE - END IF - ELSE - IF (NOTA) THEN -* -* Form C := alpha*A*B**T + beta*C -* - DO 170 J = 1,N - IF (BETA.EQ.ZERO) THEN - DO 130 I = 1,M - C(I,J) = ZERO - 130 CONTINUE - ELSE IF (BETA.NE.ONE) THEN - DO 140 I = 1,M - C(I,J) = BETA*C(I,J) - 140 CONTINUE - END IF - DO 160 L = 1,K - TEMP = ALPHA*B(J,L) - DO 150 I = 1,M - C(I,J) = C(I,J) + TEMP*A(I,L) - 150 CONTINUE - 160 CONTINUE - 170 CONTINUE - ELSE -* -* Form C := alpha*A**T*B**T + beta*C -* - DO 200 J = 1,N - DO 190 I = 1,M - TEMP = ZERO - DO 180 L = 1,K - TEMP = TEMP + A(L,I)*B(J,L) - 180 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = ALPHA*TEMP - ELSE - C(I,J) = ALPHA*TEMP + BETA*C(I,J) - END IF - 190 CONTINUE - 200 CONTINUE - END IF - END IF -* - RETURN -* -* End of DGEMM -* - END diff --git a/lib/linalg/fortran/dgemv.f b/lib/linalg/fortran/dgemv.f deleted file mode 100644 index 6625509b3a..0000000000 --- a/lib/linalg/fortran/dgemv.f +++ /dev/null @@ -1,327 +0,0 @@ -*> \brief \b DGEMV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION ALPHA,BETA -* INTEGER INCX,INCY,LDA,M,N -* CHARACTER TRANS -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A(LDA,*),X(*),Y(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGEMV performs one of the matrix-vector operations -*> -*> y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y, -*> -*> where alpha and beta are scalars, x and y are vectors and A is an -*> m by n matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> On entry, TRANS specifies the operation to be performed as -*> follows: -*> -*> TRANS = 'N' or 'n' y := alpha*A*x + beta*y. -*> -*> TRANS = 'T' or 't' y := alpha*A**T*x + beta*y. -*> -*> TRANS = 'C' or 'c' y := alpha*A**T*x + beta*y. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> On entry, M specifies the number of rows of the matrix A. -*> M must be at least zero. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the number of columns of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION. -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension ( LDA, N ) -*> Before entry, the leading m by n part of the array A must -*> contain the matrix of coefficients. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. LDA must be at least -*> max( 1, m ). -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' -*> and at least -*> ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. -*> Before entry, the incremented array X must contain the -*> vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is DOUBLE PRECISION. -*> On entry, BETA specifies the scalar beta. When BETA is -*> supplied as zero then Y need not be set on input. -*> \endverbatim -*> -*> \param[in,out] Y -*> \verbatim -*> Y is DOUBLE PRECISION array, dimension at least -*> ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' -*> and at least -*> ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. -*> Before entry with BETA non-zero, the incremented array Y -*> must contain the vector y. On exit, Y is overwritten by the -*> updated vector y. -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> On entry, INCY specifies the increment for the elements of -*> Y. INCY must not be zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> The vector and matrix arguments are not referenced when N = 0, or M = 0 -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION ALPHA,BETA - INTEGER INCX,INCY,LDA,M,N - CHARACTER TRANS -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),X(*),Y(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE,ZERO - PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP - INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. - + .NOT.LSAME(TRANS,'C')) THEN - INFO = 1 - ELSE IF (M.LT.0) THEN - INFO = 2 - ELSE IF (N.LT.0) THEN - INFO = 3 - ELSE IF (LDA.LT.MAX(1,M)) THEN - INFO = 6 - ELSE IF (INCX.EQ.0) THEN - INFO = 8 - ELSE IF (INCY.EQ.0) THEN - INFO = 11 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DGEMV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((M.EQ.0) .OR. (N.EQ.0) .OR. - + ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN -* -* Set LENX and LENY, the lengths of the vectors x and y, and set -* up the start points in X and Y. -* - IF (LSAME(TRANS,'N')) THEN - LENX = N - LENY = M - ELSE - LENX = M - LENY = N - END IF - IF (INCX.GT.0) THEN - KX = 1 - ELSE - KX = 1 - (LENX-1)*INCX - END IF - IF (INCY.GT.0) THEN - KY = 1 - ELSE - KY = 1 - (LENY-1)*INCY - END IF -* -* Start the operations. In this version the elements of A are -* accessed sequentially with one pass through A. -* -* First form y := beta*y. -* - IF (BETA.NE.ONE) THEN - IF (INCY.EQ.1) THEN - IF (BETA.EQ.ZERO) THEN - DO 10 I = 1,LENY - Y(I) = ZERO - 10 CONTINUE - ELSE - DO 20 I = 1,LENY - Y(I) = BETA*Y(I) - 20 CONTINUE - END IF - ELSE - IY = KY - IF (BETA.EQ.ZERO) THEN - DO 30 I = 1,LENY - Y(IY) = ZERO - IY = IY + INCY - 30 CONTINUE - ELSE - DO 40 I = 1,LENY - Y(IY) = BETA*Y(IY) - IY = IY + INCY - 40 CONTINUE - END IF - END IF - END IF - IF (ALPHA.EQ.ZERO) RETURN - IF (LSAME(TRANS,'N')) THEN -* -* Form y := alpha*A*x + y. -* - JX = KX - IF (INCY.EQ.1) THEN - DO 60 J = 1,N - TEMP = ALPHA*X(JX) - DO 50 I = 1,M - Y(I) = Y(I) + TEMP*A(I,J) - 50 CONTINUE - JX = JX + INCX - 60 CONTINUE - ELSE - DO 80 J = 1,N - TEMP = ALPHA*X(JX) - IY = KY - DO 70 I = 1,M - Y(IY) = Y(IY) + TEMP*A(I,J) - IY = IY + INCY - 70 CONTINUE - JX = JX + INCX - 80 CONTINUE - END IF - ELSE -* -* Form y := alpha*A**T*x + y. -* - JY = KY - IF (INCX.EQ.1) THEN - DO 100 J = 1,N - TEMP = ZERO - DO 90 I = 1,M - TEMP = TEMP + A(I,J)*X(I) - 90 CONTINUE - Y(JY) = Y(JY) + ALPHA*TEMP - JY = JY + INCY - 100 CONTINUE - ELSE - DO 120 J = 1,N - TEMP = ZERO - IX = KX - DO 110 I = 1,M - TEMP = TEMP + A(I,J)*X(IX) - IX = IX + INCX - 110 CONTINUE - Y(JY) = Y(JY) + ALPHA*TEMP - JY = JY + INCY - 120 CONTINUE - END IF - END IF -* - RETURN -* -* End of DGEMV -* - END diff --git a/lib/linalg/fortran/dgeqr2.f b/lib/linalg/fortran/dgeqr2.f deleted file mode 100644 index 5791b3a915..0000000000 --- a/lib/linalg/fortran/dgeqr2.f +++ /dev/null @@ -1,198 +0,0 @@ -*> \brief \b DGEQR2 computes the QR factorization of a general rectangular matrix using an unblocked algorithm. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGEQR2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGEQR2( M, N, A, LDA, TAU, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGEQR2 computes a QR factorization of a real m-by-n matrix A: -*> -*> A = Q * ( R ), -*> ( 0 ) -*> -*> where: -*> -*> Q is a m-by-m orthogonal matrix; -*> R is an upper-triangular n-by-n matrix; -*> 0 is a (m-n)-by-n zero matrix, if m > n. -*> -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the m by n matrix A. -*> On exit, the elements on and above the diagonal of the array -*> contain the min(m,n) by n upper trapezoidal matrix R (R is -*> upper triangular if m >= n); the elements below the diagonal, -*> with the array TAU, represent the orthogonal matrix Q as a -*> product of elementary reflectors (see Further Details). -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (min(M,N)) -*> The scalar factors of the elementary reflectors (see Further -*> Details). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The matrix Q is represented as a product of elementary reflectors -*> -*> Q = H(1) H(2) . . . H(k), where k = min(m,n). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**T -*> -*> where tau is a real scalar, and v is a real vector with -*> v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), -*> and tau in TAU(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DGEQR2( M, N, A, LDA, TAU, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, K - DOUBLE PRECISION AII -* .. -* .. External Subroutines .. - EXTERNAL DLARF, DLARFG, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -4 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGEQR2', -INFO ) - RETURN - END IF -* - K = MIN( M, N ) -* - DO 10 I = 1, K -* -* Generate elementary reflector H(i) to annihilate A(i+1:m,i) -* - CALL DLARFG( M-I+1, A( I, I ), A( MIN( I+1, M ), I ), 1, - $ TAU( I ) ) - IF( I.LT.N ) THEN -* -* Apply H(i) to A(i:m,i+1:n) from the left -* - AII = A( I, I ) - A( I, I ) = ONE - CALL DLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAU( I ), - $ A( I, I+1 ), LDA, WORK ) - A( I, I ) = AII - END IF - 10 CONTINUE - RETURN -* -* End of DGEQR2 -* - END diff --git a/lib/linalg/fortran/dgeqrf.f b/lib/linalg/fortran/dgeqrf.f deleted file mode 100644 index 705e939286..0000000000 --- a/lib/linalg/fortran/dgeqrf.f +++ /dev/null @@ -1,282 +0,0 @@ -*> \brief \b DGEQRF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGEQRF + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGEQRF computes a QR factorization of a real M-by-N matrix A: -*> -*> A = Q * ( R ), -*> ( 0 ) -*> -*> where: -*> -*> Q is a M-by-M orthogonal matrix; -*> R is an upper-triangular N-by-N matrix; -*> 0 is a (M-N)-by-N zero matrix, if M > N. -*> -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the M-by-N matrix A. -*> On exit, the elements on and above the diagonal of the array -*> contain the min(M,N)-by-N upper trapezoidal matrix R (R is -*> upper triangular if m >= n); the elements below the diagonal, -*> with the array TAU, represent the orthogonal matrix Q as a -*> product of min(m,n) elementary reflectors (see Further -*> Details). -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (min(M,N)) -*> The scalar factors of the elementary reflectors (see Further -*> Details). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise. -*> For optimum performance LWORK >= N*NB, where NB is -*> the optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The matrix Q is represented as a product of elementary reflectors -*> -*> Q = H(1) H(2) . . . H(k), where k = min(m,n). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**T -*> -*> where tau is a real scalar, and v is a real vector with -*> v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i), -*> and tau in TAU(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB, - $ NBMIN, NX -* .. -* .. External Subroutines .. - EXTERNAL DGEQR2, DLARFB, DLARFT, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - K = MIN( M, N ) - INFO = 0 - NB = ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 ) - LQUERY = ( LWORK.EQ.-1 ) - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -4 - ELSE IF( .NOT.LQUERY ) THEN - IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) ) - $ INFO = -7 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGEQRF', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - IF( K.EQ.0 ) THEN - LWKOPT = 1 - ELSE - LWKOPT = N*NB - END IF - WORK( 1 ) = LWKOPT - RETURN - END IF -* -* Quick return if possible -* - IF( K.EQ.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - NBMIN = 2 - NX = 0 - IWS = N - IF( NB.GT.1 .AND. NB.LT.K ) THEN -* -* Determine when to cross over from blocked to unblocked code. -* - NX = MAX( 0, ILAENV( 3, 'DGEQRF', ' ', M, N, -1, -1 ) ) - IF( NX.LT.K ) THEN -* -* Determine if workspace is large enough for blocked code. -* - LDWORK = N - IWS = LDWORK*NB - IF( LWORK.LT.IWS ) THEN -* -* Not enough workspace to use optimal NB: reduce NB and -* determine the minimum value of NB. -* - NB = LWORK / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'DGEQRF', ' ', M, N, -1, - $ -1 ) ) - END IF - END IF - END IF -* - IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN -* -* Use blocked code initially -* - DO 10 I = 1, K - NX, NB - IB = MIN( K-I+1, NB ) -* -* Compute the QR factorization of the current block -* A(i:m,i:i+ib-1) -* - CALL DGEQR2( M-I+1, IB, A( I, I ), LDA, TAU( I ), WORK, - $ IINFO ) - IF( I+IB.LE.N ) THEN -* -* Form the triangular factor of the block reflector -* H = H(i) H(i+1) . . . H(i+ib-1) -* - CALL DLARFT( 'Forward', 'Columnwise', M-I+1, IB, - $ A( I, I ), LDA, TAU( I ), WORK, LDWORK ) -* -* Apply H**T to A(i:m,i+ib:n) from the left -* - CALL DLARFB( 'Left', 'Transpose', 'Forward', - $ 'Columnwise', M-I+1, N-I-IB+1, IB, - $ A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ), - $ LDA, WORK( IB+1 ), LDWORK ) - END IF - 10 CONTINUE - ELSE - I = 1 - END IF -* -* Use unblocked code to factor the last or only block. -* - IF( I.LE.K ) - $ CALL DGEQR2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ), WORK, - $ IINFO ) -* - WORK( 1 ) = IWS - RETURN -* -* End of DGEQRF -* - END diff --git a/lib/linalg/fortran/dger.f b/lib/linalg/fortran/dger.f deleted file mode 100644 index 8c19cb4e41..0000000000 --- a/lib/linalg/fortran/dger.f +++ /dev/null @@ -1,224 +0,0 @@ -*> \brief \b DGER -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DGER(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION ALPHA -* INTEGER INCX,INCY,LDA,M,N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A(LDA,*),X(*),Y(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGER performs the rank 1 operation -*> -*> A := alpha*x*y**T + A, -*> -*> where alpha is a scalar, x is an m element vector, y is an n element -*> vector and A is an m by n matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> On entry, M specifies the number of rows of the matrix A. -*> M must be at least zero. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the number of columns of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION. -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension at least -*> ( 1 + ( m - 1 )*abs( INCX ) ). -*> Before entry, the incremented array X must contain the m -*> element vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is DOUBLE PRECISION array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCY ) ). -*> Before entry, the incremented array Y must contain the n -*> element vector y. -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> On entry, INCY specifies the increment for the elements of -*> Y. INCY must not be zero. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension ( LDA, N ) -*> Before entry, the leading m by n part of the array A must -*> contain the matrix of coefficients. On exit, A is -*> overwritten by the updated matrix. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. LDA must be at least -*> max( 1, m ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DGER(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION ALPHA - INTEGER INCX,INCY,LDA,M,N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),X(*),Y(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER (ZERO=0.0D+0) -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP - INTEGER I,INFO,IX,J,JY,KX -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (M.LT.0) THEN - INFO = 1 - ELSE IF (N.LT.0) THEN - INFO = 2 - ELSE IF (INCX.EQ.0) THEN - INFO = 5 - ELSE IF (INCY.EQ.0) THEN - INFO = 7 - ELSE IF (LDA.LT.MAX(1,M)) THEN - INFO = 9 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DGER ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((M.EQ.0) .OR. (N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN -* -* Start the operations. In this version the elements of A are -* accessed sequentially with one pass through A. -* - IF (INCY.GT.0) THEN - JY = 1 - ELSE - JY = 1 - (N-1)*INCY - END IF - IF (INCX.EQ.1) THEN - DO 20 J = 1,N - IF (Y(JY).NE.ZERO) THEN - TEMP = ALPHA*Y(JY) - DO 10 I = 1,M - A(I,J) = A(I,J) + X(I)*TEMP - 10 CONTINUE - END IF - JY = JY + INCY - 20 CONTINUE - ELSE - IF (INCX.GT.0) THEN - KX = 1 - ELSE - KX = 1 - (M-1)*INCX - END IF - DO 40 J = 1,N - IF (Y(JY).NE.ZERO) THEN - TEMP = ALPHA*Y(JY) - IX = KX - DO 30 I = 1,M - A(I,J) = A(I,J) + X(IX)*TEMP - IX = IX + INCX - 30 CONTINUE - END IF - JY = JY + INCY - 40 CONTINUE - END IF -* - RETURN -* -* End of DGER -* - END diff --git a/lib/linalg/fortran/dgesv.f b/lib/linalg/fortran/dgesv.f deleted file mode 100644 index 3609c52f47..0000000000 --- a/lib/linalg/fortran/dgesv.f +++ /dev/null @@ -1,176 +0,0 @@ -*> \brief DGESV computes the solution to system of linear equations A * X = B for GE matrices -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGESV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, LDB, N, NRHS -* .. -* .. Array Arguments .. -* INTEGER IPIV( * ) -* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGESV computes the solution to a real system of linear equations -*> A * X = B, -*> where A is an N-by-N matrix and X and B are N-by-NRHS matrices. -*> -*> The LU decomposition with partial pivoting and row interchanges is -*> used to factor A as -*> A = P * L * U, -*> where P is a permutation matrix, L is unit lower triangular, and U is -*> upper triangular. The factored form of A is then used to solve the -*> system of equations A * X = B. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of linear equations, i.e., the order of the -*> matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in] NRHS -*> \verbatim -*> NRHS is INTEGER -*> The number of right hand sides, i.e., the number of columns -*> of the matrix B. NRHS >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the N-by-N coefficient matrix A. -*> On exit, the factors L and U from the factorization -*> A = P*L*U; the unit diagonal elements of L are not stored. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] IPIV -*> \verbatim -*> IPIV is INTEGER array, dimension (N) -*> The pivot indices that define the permutation matrix P; -*> row i of the matrix was interchanged with row IPIV(i). -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB,NRHS) -*> On entry, the N-by-NRHS matrix of right hand side matrix B. -*> On exit, if INFO = 0, the N-by-NRHS solution matrix X. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, U(i,i) is exactly zero. The factorization -*> has been completed, but the factor U is exactly -*> singular, so the solution could not be computed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEsolve -* -* ===================================================================== - SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO ) -* -* -- LAPACK driver routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, LDB, N, NRHS -* .. -* .. Array Arguments .. - INTEGER IPIV( * ) - DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* ===================================================================== -* -* .. External Subroutines .. - EXTERNAL DGETRF, DGETRS, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - IF( N.LT.0 ) THEN - INFO = -1 - ELSE IF( NRHS.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -4 - ELSE IF( LDB.LT.MAX( 1, N ) ) THEN - INFO = -7 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGESV ', -INFO ) - RETURN - END IF -* -* Compute the LU factorization of A. -* - CALL DGETRF( N, N, A, LDA, IPIV, INFO ) - IF( INFO.EQ.0 ) THEN -* -* Solve the system A*X = B, overwriting B with X. -* - CALL DGETRS( 'No transpose', N, NRHS, A, LDA, IPIV, B, LDB, - $ INFO ) - END IF - RETURN -* -* End of DGESV -* - END diff --git a/lib/linalg/fortran/dgesvd.f b/lib/linalg/fortran/dgesvd.f deleted file mode 100644 index 7cc8b35129..0000000000 --- a/lib/linalg/fortran/dgesvd.f +++ /dev/null @@ -1,3501 +0,0 @@ -*> \brief DGESVD computes the singular value decomposition (SVD) for GE matrices -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGESVD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT, -* WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER JOBU, JOBVT -* INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), S( * ), U( LDU, * ), -* $ VT( LDVT, * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGESVD computes the singular value decomposition (SVD) of a real -*> M-by-N matrix A, optionally computing the left and/or right singular -*> vectors. The SVD is written -*> -*> A = U * SIGMA * transpose(V) -*> -*> where SIGMA is an M-by-N matrix which is zero except for its -*> min(m,n) diagonal elements, U is an M-by-M orthogonal matrix, and -*> V is an N-by-N orthogonal matrix. The diagonal elements of SIGMA -*> are the singular values of A; they are real and non-negative, and -*> are returned in descending order. The first min(m,n) columns of -*> U and V are the left and right singular vectors of A. -*> -*> Note that the routine returns V**T, not V. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] JOBU -*> \verbatim -*> JOBU is CHARACTER*1 -*> Specifies options for computing all or part of the matrix U: -*> = 'A': all M columns of U are returned in array U: -*> = 'S': the first min(m,n) columns of U (the left singular -*> vectors) are returned in the array U; -*> = 'O': the first min(m,n) columns of U (the left singular -*> vectors) are overwritten on the array A; -*> = 'N': no columns of U (no left singular vectors) are -*> computed. -*> \endverbatim -*> -*> \param[in] JOBVT -*> \verbatim -*> JOBVT is CHARACTER*1 -*> Specifies options for computing all or part of the matrix -*> V**T: -*> = 'A': all N rows of V**T are returned in the array VT; -*> = 'S': the first min(m,n) rows of V**T (the right singular -*> vectors) are returned in the array VT; -*> = 'O': the first min(m,n) rows of V**T (the right singular -*> vectors) are overwritten on the array A; -*> = 'N': no rows of V**T (no right singular vectors) are -*> computed. -*> -*> JOBVT and JOBU cannot both be 'O'. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the input matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the input matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the M-by-N matrix A. -*> On exit, -*> if JOBU = 'O', A is overwritten with the first min(m,n) -*> columns of U (the left singular vectors, -*> stored columnwise); -*> if JOBVT = 'O', A is overwritten with the first min(m,n) -*> rows of V**T (the right singular vectors, -*> stored rowwise); -*> if JOBU .ne. 'O' and JOBVT .ne. 'O', the contents of A -*> are destroyed. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] S -*> \verbatim -*> S is DOUBLE PRECISION array, dimension (min(M,N)) -*> The singular values of A, sorted so that S(i) >= S(i+1). -*> \endverbatim -*> -*> \param[out] U -*> \verbatim -*> U is DOUBLE PRECISION array, dimension (LDU,UCOL) -*> (LDU,M) if JOBU = 'A' or (LDU,min(M,N)) if JOBU = 'S'. -*> If JOBU = 'A', U contains the M-by-M orthogonal matrix U; -*> if JOBU = 'S', U contains the first min(m,n) columns of U -*> (the left singular vectors, stored columnwise); -*> if JOBU = 'N' or 'O', U is not referenced. -*> \endverbatim -*> -*> \param[in] LDU -*> \verbatim -*> LDU is INTEGER -*> The leading dimension of the array U. LDU >= 1; if -*> JOBU = 'S' or 'A', LDU >= M. -*> \endverbatim -*> -*> \param[out] VT -*> \verbatim -*> VT is DOUBLE PRECISION array, dimension (LDVT,N) -*> If JOBVT = 'A', VT contains the N-by-N orthogonal matrix -*> V**T; -*> if JOBVT = 'S', VT contains the first min(m,n) rows of -*> V**T (the right singular vectors, stored rowwise); -*> if JOBVT = 'N' or 'O', VT is not referenced. -*> \endverbatim -*> -*> \param[in] LDVT -*> \verbatim -*> LDVT is INTEGER -*> The leading dimension of the array VT. LDVT >= 1; if -*> JOBVT = 'A', LDVT >= N; if JOBVT = 'S', LDVT >= min(M,N). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK; -*> if INFO > 0, WORK(2:MIN(M,N)) contains the unconverged -*> superdiagonal elements of an upper bidiagonal matrix B -*> whose diagonal is in S (not necessarily sorted). B -*> satisfies A = U * B * VT, so it has the same singular values -*> as A, and singular vectors related by U and VT. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> LWORK >= MAX(1,5*MIN(M,N)) for the paths (see comments inside code): -*> - PATH 1 (M much larger than N, JOBU='N') -*> - PATH 1t (N much larger than M, JOBVT='N') -*> LWORK >= MAX(1,3*MIN(M,N) + MAX(M,N),5*MIN(M,N)) for the other paths -*> For good performance, LWORK should generally be larger. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: if DBDSQR did not converge, INFO specifies how many -*> superdiagonals of an intermediate bidiagonal form B -*> did not converge to zero. See the description of WORK -*> above for details. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEsing -* -* ===================================================================== - SUBROUTINE DGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, - $ VT, LDVT, WORK, LWORK, INFO ) -* -* -- LAPACK driver routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER JOBU, JOBVT - INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), S( * ), U( LDU, * ), - $ VT( LDVT, * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY, WNTUA, WNTUAS, WNTUN, WNTUO, WNTUS, - $ WNTVA, WNTVAS, WNTVN, WNTVO, WNTVS - INTEGER BDSPAC, BLK, CHUNK, I, IE, IERR, IR, ISCL, - $ ITAU, ITAUP, ITAUQ, IU, IWORK, LDWRKR, LDWRKU, - $ MAXWRK, MINMN, MINWRK, MNTHR, NCU, NCVT, NRU, - $ NRVT, WRKBL - INTEGER LWORK_DGEQRF, LWORK_DORGQR_N, LWORK_DORGQR_M, - $ LWORK_DGEBRD, LWORK_DORGBR_P, LWORK_DORGBR_Q, - $ LWORK_DGELQF, LWORK_DORGLQ_N, LWORK_DORGLQ_M - DOUBLE PRECISION ANRM, BIGNUM, EPS, SMLNUM -* .. -* .. Local Arrays .. - DOUBLE PRECISION DUM( 1 ) -* .. -* .. External Subroutines .. - EXTERNAL DBDSQR, DGEBRD, DGELQF, DGEMM, DGEQRF, DLACPY, - $ DLASCL, DLASET, DORGBR, DORGLQ, DORGQR, DORMBR, - $ XERBLA -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - DOUBLE PRECISION DLAMCH, DLANGE - EXTERNAL LSAME, ILAENV, DLAMCH, DLANGE -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - MINMN = MIN( M, N ) - WNTUA = LSAME( JOBU, 'A' ) - WNTUS = LSAME( JOBU, 'S' ) - WNTUAS = WNTUA .OR. WNTUS - WNTUO = LSAME( JOBU, 'O' ) - WNTUN = LSAME( JOBU, 'N' ) - WNTVA = LSAME( JOBVT, 'A' ) - WNTVS = LSAME( JOBVT, 'S' ) - WNTVAS = WNTVA .OR. WNTVS - WNTVO = LSAME( JOBVT, 'O' ) - WNTVN = LSAME( JOBVT, 'N' ) - LQUERY = ( LWORK.EQ.-1 ) -* - IF( .NOT.( WNTUA .OR. WNTUS .OR. WNTUO .OR. WNTUN ) ) THEN - INFO = -1 - ELSE IF( .NOT.( WNTVA .OR. WNTVS .OR. WNTVO .OR. WNTVN ) .OR. - $ ( WNTVO .AND. WNTUO ) ) THEN - INFO = -2 - ELSE IF( M.LT.0 ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -6 - ELSE IF( LDU.LT.1 .OR. ( WNTUAS .AND. LDU.LT.M ) ) THEN - INFO = -9 - ELSE IF( LDVT.LT.1 .OR. ( WNTVA .AND. LDVT.LT.N ) .OR. - $ ( WNTVS .AND. LDVT.LT.MINMN ) ) THEN - INFO = -11 - END IF -* -* Compute workspace -* (Note: Comments in the code beginning "Workspace:" describe the -* minimal amount of workspace needed at that point in the code, -* as well as the preferred amount for good performance. -* NB refers to the optimal block size for the immediately -* following subroutine, as returned by ILAENV.) -* - IF( INFO.EQ.0 ) THEN - MINWRK = 1 - MAXWRK = 1 - IF( M.GE.N .AND. MINMN.GT.0 ) THEN -* -* Compute space needed for DBDSQR -* - MNTHR = ILAENV( 6, 'DGESVD', JOBU // JOBVT, M, N, 0, 0 ) - BDSPAC = 5*N -* Compute space needed for DGEQRF - CALL DGEQRF( M, N, A, LDA, DUM(1), DUM(1), -1, IERR ) - LWORK_DGEQRF = INT( DUM(1) ) -* Compute space needed for DORGQR - CALL DORGQR( M, N, N, A, LDA, DUM(1), DUM(1), -1, IERR ) - LWORK_DORGQR_N = INT( DUM(1) ) - CALL DORGQR( M, M, N, A, LDA, DUM(1), DUM(1), -1, IERR ) - LWORK_DORGQR_M = INT( DUM(1) ) -* Compute space needed for DGEBRD - CALL DGEBRD( N, N, A, LDA, S, DUM(1), DUM(1), - $ DUM(1), DUM(1), -1, IERR ) - LWORK_DGEBRD = INT( DUM(1) ) -* Compute space needed for DORGBR P - CALL DORGBR( 'P', N, N, N, A, LDA, DUM(1), - $ DUM(1), -1, IERR ) - LWORK_DORGBR_P = INT( DUM(1) ) -* Compute space needed for DORGBR Q - CALL DORGBR( 'Q', N, N, N, A, LDA, DUM(1), - $ DUM(1), -1, IERR ) - LWORK_DORGBR_Q = INT( DUM(1) ) -* - IF( M.GE.MNTHR ) THEN - IF( WNTUN ) THEN -* -* Path 1 (M much larger than N, JOBU='N') -* - MAXWRK = N + LWORK_DGEQRF - MAXWRK = MAX( MAXWRK, 3*N + LWORK_DGEBRD ) - IF( WNTVO .OR. WNTVAS ) - $ MAXWRK = MAX( MAXWRK, 3*N + LWORK_DORGBR_P ) - MAXWRK = MAX( MAXWRK, BDSPAC ) - MINWRK = MAX( 4*N, BDSPAC ) - ELSE IF( WNTUO .AND. WNTVN ) THEN -* -* Path 2 (M much larger than N, JOBU='O', JOBVT='N') -* - WRKBL = N + LWORK_DGEQRF - WRKBL = MAX( WRKBL, N + LWORK_DORGQR_N ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = MAX( N*N + WRKBL, N*N + M*N + N ) - MINWRK = MAX( 3*N + M, BDSPAC ) - ELSE IF( WNTUO .AND. WNTVAS ) THEN -* -* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or -* 'A') -* - WRKBL = N + LWORK_DGEQRF - WRKBL = MAX( WRKBL, N + LWORK_DORGQR_N ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = MAX( N*N + WRKBL, N*N + M*N + N ) - MINWRK = MAX( 3*N + M, BDSPAC ) - ELSE IF( WNTUS .AND. WNTVN ) THEN -* -* Path 4 (M much larger than N, JOBU='S', JOBVT='N') -* - WRKBL = N + LWORK_DGEQRF - WRKBL = MAX( WRKBL, N + LWORK_DORGQR_N ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = N*N + WRKBL - MINWRK = MAX( 3*N + M, BDSPAC ) - ELSE IF( WNTUS .AND. WNTVO ) THEN -* -* Path 5 (M much larger than N, JOBU='S', JOBVT='O') -* - WRKBL = N + LWORK_DGEQRF - WRKBL = MAX( WRKBL, N + LWORK_DORGQR_N ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = 2*N*N + WRKBL - MINWRK = MAX( 3*N + M, BDSPAC ) - ELSE IF( WNTUS .AND. WNTVAS ) THEN -* -* Path 6 (M much larger than N, JOBU='S', JOBVT='S' or -* 'A') -* - WRKBL = N + LWORK_DGEQRF - WRKBL = MAX( WRKBL, N + LWORK_DORGQR_N ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = N*N + WRKBL - MINWRK = MAX( 3*N + M, BDSPAC ) - ELSE IF( WNTUA .AND. WNTVN ) THEN -* -* Path 7 (M much larger than N, JOBU='A', JOBVT='N') -* - WRKBL = N + LWORK_DGEQRF - WRKBL = MAX( WRKBL, N + LWORK_DORGQR_M ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = N*N + WRKBL - MINWRK = MAX( 3*N + M, BDSPAC ) - ELSE IF( WNTUA .AND. WNTVO ) THEN -* -* Path 8 (M much larger than N, JOBU='A', JOBVT='O') -* - WRKBL = N + LWORK_DGEQRF - WRKBL = MAX( WRKBL, N + LWORK_DORGQR_M ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = 2*N*N + WRKBL - MINWRK = MAX( 3*N + M, BDSPAC ) - ELSE IF( WNTUA .AND. WNTVAS ) THEN -* -* Path 9 (M much larger than N, JOBU='A', JOBVT='S' or -* 'A') -* - WRKBL = N + LWORK_DGEQRF - WRKBL = MAX( WRKBL, N + LWORK_DORGQR_M ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = N*N + WRKBL - MINWRK = MAX( 3*N + M, BDSPAC ) - END IF - ELSE -* -* Path 10 (M at least N, but not much larger) -* - CALL DGEBRD( M, N, A, LDA, S, DUM(1), DUM(1), - $ DUM(1), DUM(1), -1, IERR ) - LWORK_DGEBRD = INT( DUM(1) ) - MAXWRK = 3*N + LWORK_DGEBRD - IF( WNTUS .OR. WNTUO ) THEN - CALL DORGBR( 'Q', M, N, N, A, LDA, DUM(1), - $ DUM(1), -1, IERR ) - LWORK_DORGBR_Q = INT( DUM(1) ) - MAXWRK = MAX( MAXWRK, 3*N + LWORK_DORGBR_Q ) - END IF - IF( WNTUA ) THEN - CALL DORGBR( 'Q', M, M, N, A, LDA, DUM(1), - $ DUM(1), -1, IERR ) - LWORK_DORGBR_Q = INT( DUM(1) ) - MAXWRK = MAX( MAXWRK, 3*N + LWORK_DORGBR_Q ) - END IF - IF( .NOT.WNTVN ) THEN - MAXWRK = MAX( MAXWRK, 3*N + LWORK_DORGBR_P ) - END IF - MAXWRK = MAX( MAXWRK, BDSPAC ) - MINWRK = MAX( 3*N + M, BDSPAC ) - END IF - ELSE IF( MINMN.GT.0 ) THEN -* -* Compute space needed for DBDSQR -* - MNTHR = ILAENV( 6, 'DGESVD', JOBU // JOBVT, M, N, 0, 0 ) - BDSPAC = 5*M -* Compute space needed for DGELQF - CALL DGELQF( M, N, A, LDA, DUM(1), DUM(1), -1, IERR ) - LWORK_DGELQF = INT( DUM(1) ) -* Compute space needed for DORGLQ - CALL DORGLQ( N, N, M, DUM(1), N, DUM(1), DUM(1), -1, IERR ) - LWORK_DORGLQ_N = INT( DUM(1) ) - CALL DORGLQ( M, N, M, A, LDA, DUM(1), DUM(1), -1, IERR ) - LWORK_DORGLQ_M = INT( DUM(1) ) -* Compute space needed for DGEBRD - CALL DGEBRD( M, M, A, LDA, S, DUM(1), DUM(1), - $ DUM(1), DUM(1), -1, IERR ) - LWORK_DGEBRD = INT( DUM(1) ) -* Compute space needed for DORGBR P - CALL DORGBR( 'P', M, M, M, A, N, DUM(1), - $ DUM(1), -1, IERR ) - LWORK_DORGBR_P = INT( DUM(1) ) -* Compute space needed for DORGBR Q - CALL DORGBR( 'Q', M, M, M, A, N, DUM(1), - $ DUM(1), -1, IERR ) - LWORK_DORGBR_Q = INT( DUM(1) ) - IF( N.GE.MNTHR ) THEN - IF( WNTVN ) THEN -* -* Path 1t(N much larger than M, JOBVT='N') -* - MAXWRK = M + LWORK_DGELQF - MAXWRK = MAX( MAXWRK, 3*M + LWORK_DGEBRD ) - IF( WNTUO .OR. WNTUAS ) - $ MAXWRK = MAX( MAXWRK, 3*M + LWORK_DORGBR_Q ) - MAXWRK = MAX( MAXWRK, BDSPAC ) - MINWRK = MAX( 4*M, BDSPAC ) - ELSE IF( WNTVO .AND. WNTUN ) THEN -* -* Path 2t(N much larger than M, JOBU='N', JOBVT='O') -* - WRKBL = M + LWORK_DGELQF - WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_M ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = MAX( M*M + WRKBL, M*M + M*N + M ) - MINWRK = MAX( 3*M + N, BDSPAC ) - ELSE IF( WNTVO .AND. WNTUAS ) THEN -* -* Path 3t(N much larger than M, JOBU='S' or 'A', -* JOBVT='O') -* - WRKBL = M + LWORK_DGELQF - WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_M ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = MAX( M*M + WRKBL, M*M + M*N + M ) - MINWRK = MAX( 3*M + N, BDSPAC ) - ELSE IF( WNTVS .AND. WNTUN ) THEN -* -* Path 4t(N much larger than M, JOBU='N', JOBVT='S') -* - WRKBL = M + LWORK_DGELQF - WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_M ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = M*M + WRKBL - MINWRK = MAX( 3*M + N, BDSPAC ) - ELSE IF( WNTVS .AND. WNTUO ) THEN -* -* Path 5t(N much larger than M, JOBU='O', JOBVT='S') -* - WRKBL = M + LWORK_DGELQF - WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_M ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = 2*M*M + WRKBL - MINWRK = MAX( 3*M + N, BDSPAC ) - ELSE IF( WNTVS .AND. WNTUAS ) THEN -* -* Path 6t(N much larger than M, JOBU='S' or 'A', -* JOBVT='S') -* - WRKBL = M + LWORK_DGELQF - WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_M ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = M*M + WRKBL - MINWRK = MAX( 3*M + N, BDSPAC ) - ELSE IF( WNTVA .AND. WNTUN ) THEN -* -* Path 7t(N much larger than M, JOBU='N', JOBVT='A') -* - WRKBL = M + LWORK_DGELQF - WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_N ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = M*M + WRKBL - MINWRK = MAX( 3*M + N, BDSPAC ) - ELSE IF( WNTVA .AND. WNTUO ) THEN -* -* Path 8t(N much larger than M, JOBU='O', JOBVT='A') -* - WRKBL = M + LWORK_DGELQF - WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_N ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = 2*M*M + WRKBL - MINWRK = MAX( 3*M + N, BDSPAC ) - ELSE IF( WNTVA .AND. WNTUAS ) THEN -* -* Path 9t(N much larger than M, JOBU='S' or 'A', -* JOBVT='A') -* - WRKBL = M + LWORK_DGELQF - WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_N ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P ) - WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_Q ) - WRKBL = MAX( WRKBL, BDSPAC ) - MAXWRK = M*M + WRKBL - MINWRK = MAX( 3*M + N, BDSPAC ) - END IF - ELSE -* -* Path 10t(N greater than M, but not much larger) -* - CALL DGEBRD( M, N, A, LDA, S, DUM(1), DUM(1), - $ DUM(1), DUM(1), -1, IERR ) - LWORK_DGEBRD = INT( DUM(1) ) - MAXWRK = 3*M + LWORK_DGEBRD - IF( WNTVS .OR. WNTVO ) THEN -* Compute space needed for DORGBR P - CALL DORGBR( 'P', M, N, M, A, N, DUM(1), - $ DUM(1), -1, IERR ) - LWORK_DORGBR_P = INT( DUM(1) ) - MAXWRK = MAX( MAXWRK, 3*M + LWORK_DORGBR_P ) - END IF - IF( WNTVA ) THEN - CALL DORGBR( 'P', N, N, M, A, N, DUM(1), - $ DUM(1), -1, IERR ) - LWORK_DORGBR_P = INT( DUM(1) ) - MAXWRK = MAX( MAXWRK, 3*M + LWORK_DORGBR_P ) - END IF - IF( .NOT.WNTUN ) THEN - MAXWRK = MAX( MAXWRK, 3*M + LWORK_DORGBR_Q ) - END IF - MAXWRK = MAX( MAXWRK, BDSPAC ) - MINWRK = MAX( 3*M + N, BDSPAC ) - END IF - END IF - MAXWRK = MAX( MAXWRK, MINWRK ) - WORK( 1 ) = MAXWRK -* - IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN - INFO = -13 - END IF - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGESVD', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 ) THEN - RETURN - END IF -* -* Get machine constants -* - EPS = DLAMCH( 'P' ) - SMLNUM = SQRT( DLAMCH( 'S' ) ) / EPS - BIGNUM = ONE / SMLNUM -* -* Scale A if max element outside range [SMLNUM,BIGNUM] -* - ANRM = DLANGE( 'M', M, N, A, LDA, DUM ) - ISCL = 0 - IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN - ISCL = 1 - CALL DLASCL( 'G', 0, 0, ANRM, SMLNUM, M, N, A, LDA, IERR ) - ELSE IF( ANRM.GT.BIGNUM ) THEN - ISCL = 1 - CALL DLASCL( 'G', 0, 0, ANRM, BIGNUM, M, N, A, LDA, IERR ) - END IF -* - IF( M.GE.N ) THEN -* -* A has at least as many rows as columns. If A has sufficiently -* more rows than columns, first reduce using the QR -* decomposition (if sufficient workspace available) -* - IF( M.GE.MNTHR ) THEN -* - IF( WNTUN ) THEN -* -* Path 1 (M much larger than N, JOBU='N') -* No left singular vectors to be computed -* - ITAU = 1 - IWORK = ITAU + N -* -* Compute A=Q*R -* (Workspace: need 2*N, prefer N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Zero out below R -* - IF( N .GT. 1 ) THEN - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, A( 2, 1 ), - $ LDA ) - END IF - IE = 1 - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in A -* (Workspace: need 4*N, prefer 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1, - $ IERR ) - NCVT = 0 - IF( WNTVO .OR. WNTVAS ) THEN -* -* If right singular vectors desired, generate P'. -* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - NCVT = N - END IF - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing right -* singular vectors of A in A if desired -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, NCVT, 0, 0, S, WORK( IE ), A, LDA, - $ DUM, 1, DUM, 1, WORK( IWORK ), INFO ) -* -* If right singular vectors desired in VT, copy them there -* - IF( WNTVAS ) - $ CALL DLACPY( 'F', N, N, A, LDA, VT, LDVT ) -* - ELSE IF( WNTUO .AND. WNTVN ) THEN -* -* Path 2 (M much larger than N, JOBU='O', JOBVT='N') -* N left singular vectors to be overwritten on A and -* no right singular vectors to be computed -* - IF( LWORK.GE.N*N+MAX( 4*N, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IR = 1 - IF( LWORK.GE.MAX( WRKBL, LDA*N + N ) + LDA*N ) THEN -* -* WORK(IU) is LDA by N, WORK(IR) is LDA by N -* - LDWRKU = LDA - LDWRKR = LDA - ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N + N ) + N*N ) THEN -* -* WORK(IU) is LDA by N, WORK(IR) is N by N -* - LDWRKU = LDA - LDWRKR = N - ELSE -* -* WORK(IU) is LDWRKU by N, WORK(IR) is N by N -* - LDWRKU = ( LWORK-N*N-N ) / N - LDWRKR = N - END IF - ITAU = IR + LDWRKR*N - IWORK = ITAU + N -* -* Compute A=Q*R -* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy R to WORK(IR) and zero out below it -* - CALL DLACPY( 'U', N, N, A, LDA, WORK( IR ), LDWRKR ) - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, WORK( IR+1 ), - $ LDWRKR ) -* -* Generate Q in A -* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) -* - CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in WORK(IR) -* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, WORK( IR ), LDWRKR, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Generate left vectors bidiagonalizing R -* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) -* - CALL DORGBR( 'Q', N, N, N, WORK( IR ), LDWRKR, - $ WORK( ITAUQ ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of R in WORK(IR) -* (Workspace: need N*N + BDSPAC) -* - CALL DBDSQR( 'U', N, 0, N, 0, S, WORK( IE ), DUM, 1, - $ WORK( IR ), LDWRKR, DUM, 1, - $ WORK( IWORK ), INFO ) - IU = IE + N -* -* Multiply Q in A by left singular vectors of R in -* WORK(IR), storing result in WORK(IU) and copying to A -* (Workspace: need N*N + 2*N, prefer N*N + M*N + N) -* - DO 10 I = 1, M, LDWRKU - CHUNK = MIN( M-I+1, LDWRKU ) - CALL DGEMM( 'N', 'N', CHUNK, N, N, ONE, A( I, 1 ), - $ LDA, WORK( IR ), LDWRKR, ZERO, - $ WORK( IU ), LDWRKU ) - CALL DLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU, - $ A( I, 1 ), LDA ) - 10 CONTINUE -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - IE = 1 - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize A -* (Workspace: need 3*N + M, prefer 3*N + (M + N)*NB) -* - CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Generate left vectors bidiagonalizing A -* (Workspace: need 4*N, prefer 3*N + N*NB) -* - CALL DORGBR( 'Q', M, N, N, A, LDA, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of A in A -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, 0, M, 0, S, WORK( IE ), DUM, 1, - $ A, LDA, DUM, 1, WORK( IWORK ), INFO ) -* - END IF -* - ELSE IF( WNTUO .AND. WNTVAS ) THEN -* -* Path 3 (M much larger than N, JOBU='O', JOBVT='S' or 'A') -* N left singular vectors to be overwritten on A and -* N right singular vectors to be computed in VT -* - IF( LWORK.GE.N*N+MAX( 4*N, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IR = 1 - IF( LWORK.GE.MAX( WRKBL, LDA*N + N ) + LDA*N ) THEN -* -* WORK(IU) is LDA by N and WORK(IR) is LDA by N -* - LDWRKU = LDA - LDWRKR = LDA - ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N + N ) + N*N ) THEN -* -* WORK(IU) is LDA by N and WORK(IR) is N by N -* - LDWRKU = LDA - LDWRKR = N - ELSE -* -* WORK(IU) is LDWRKU by N and WORK(IR) is N by N -* - LDWRKU = ( LWORK-N*N-N ) / N - LDWRKR = N - END IF - ITAU = IR + LDWRKR*N - IWORK = ITAU + N -* -* Compute A=Q*R -* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy R to VT, zeroing out below it -* - CALL DLACPY( 'U', N, N, A, LDA, VT, LDVT ) - IF( N.GT.1 ) - $ CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ VT( 2, 1 ), LDVT ) -* -* Generate Q in A -* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) -* - CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in VT, copying result to WORK(IR) -* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, VT, LDVT, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', N, N, VT, LDVT, WORK( IR ), LDWRKR ) -* -* Generate left vectors bidiagonalizing R in WORK(IR) -* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) -* - CALL DORGBR( 'Q', N, N, N, WORK( IR ), LDWRKR, - $ WORK( ITAUQ ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate right vectors bidiagonalizing R in VT -* (Workspace: need N*N + 4*N-1, prefer N*N + 3*N + (N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of R in WORK(IR) and computing right -* singular vectors of R in VT -* (Workspace: need N*N + BDSPAC) -* - CALL DBDSQR( 'U', N, N, N, 0, S, WORK( IE ), VT, LDVT, - $ WORK( IR ), LDWRKR, DUM, 1, - $ WORK( IWORK ), INFO ) - IU = IE + N -* -* Multiply Q in A by left singular vectors of R in -* WORK(IR), storing result in WORK(IU) and copying to A -* (Workspace: need N*N + 2*N, prefer N*N + M*N + N) -* - DO 20 I = 1, M, LDWRKU - CHUNK = MIN( M-I+1, LDWRKU ) - CALL DGEMM( 'N', 'N', CHUNK, N, N, ONE, A( I, 1 ), - $ LDA, WORK( IR ), LDWRKR, ZERO, - $ WORK( IU ), LDWRKU ) - CALL DLACPY( 'F', CHUNK, N, WORK( IU ), LDWRKU, - $ A( I, 1 ), LDA ) - 20 CONTINUE -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + N -* -* Compute A=Q*R -* (Workspace: need 2*N, prefer N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy R to VT, zeroing out below it -* - CALL DLACPY( 'U', N, N, A, LDA, VT, LDVT ) - IF( N.GT.1 ) - $ CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ VT( 2, 1 ), LDVT ) -* -* Generate Q in A -* (Workspace: need 2*N, prefer N + N*NB) -* - CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in VT -* (Workspace: need 4*N, prefer 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, VT, LDVT, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply Q in A by left vectors bidiagonalizing R -* (Workspace: need 3*N + M, prefer 3*N + M*NB) -* - CALL DORMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT, - $ WORK( ITAUQ ), A, LDA, WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate right vectors bidiagonalizing R in VT -* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of A in A and computing right -* singular vectors of A in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, N, M, 0, S, WORK( IE ), VT, LDVT, - $ A, LDA, DUM, 1, WORK( IWORK ), INFO ) -* - END IF -* - ELSE IF( WNTUS ) THEN -* - IF( WNTVN ) THEN -* -* Path 4 (M much larger than N, JOBU='S', JOBVT='N') -* N left singular vectors to be computed in U and -* no right singular vectors to be computed -* - IF( LWORK.GE.N*N+MAX( 4*N, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IR = 1 - IF( LWORK.GE.WRKBL+LDA*N ) THEN -* -* WORK(IR) is LDA by N -* - LDWRKR = LDA - ELSE -* -* WORK(IR) is N by N -* - LDWRKR = N - END IF - ITAU = IR + LDWRKR*N - IWORK = ITAU + N -* -* Compute A=Q*R -* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy R to WORK(IR), zeroing out below it -* - CALL DLACPY( 'U', N, N, A, LDA, WORK( IR ), - $ LDWRKR ) - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ WORK( IR+1 ), LDWRKR ) -* -* Generate Q in A -* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) -* - CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in WORK(IR) -* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, WORK( IR ), LDWRKR, S, - $ WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate left vectors bidiagonalizing R in WORK(IR) -* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) -* - CALL DORGBR( 'Q', N, N, N, WORK( IR ), LDWRKR, - $ WORK( ITAUQ ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of R in WORK(IR) -* (Workspace: need N*N + BDSPAC) -* - CALL DBDSQR( 'U', N, 0, N, 0, S, WORK( IE ), DUM, - $ 1, WORK( IR ), LDWRKR, DUM, 1, - $ WORK( IWORK ), INFO ) -* -* Multiply Q in A by left singular vectors of R in -* WORK(IR), storing result in U -* (Workspace: need N*N) -* - CALL DGEMM( 'N', 'N', M, N, N, ONE, A, LDA, - $ WORK( IR ), LDWRKR, ZERO, U, LDU ) -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + N -* -* Compute A=Q*R, copying result to U -* (Workspace: need 2*N, prefer N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, N, A, LDA, U, LDU ) -* -* Generate Q in U -* (Workspace: need 2*N, prefer N + N*NB) -* - CALL DORGQR( M, N, N, U, LDU, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Zero out below R in A -* - IF( N .GT. 1 ) THEN - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ A( 2, 1 ), LDA ) - END IF -* -* Bidiagonalize R in A -* (Workspace: need 4*N, prefer 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, A, LDA, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply Q in U by left vectors bidiagonalizing R -* (Workspace: need 3*N + M, prefer 3*N + M*NB) -* - CALL DORMBR( 'Q', 'R', 'N', M, N, N, A, LDA, - $ WORK( ITAUQ ), U, LDU, WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of A in U -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, 0, M, 0, S, WORK( IE ), DUM, - $ 1, U, LDU, DUM, 1, WORK( IWORK ), - $ INFO ) -* - END IF -* - ELSE IF( WNTVO ) THEN -* -* Path 5 (M much larger than N, JOBU='S', JOBVT='O') -* N left singular vectors to be computed in U and -* N right singular vectors to be overwritten on A -* - IF( LWORK.GE.2*N*N+MAX( 4*N, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IU = 1 - IF( LWORK.GE.WRKBL+2*LDA*N ) THEN -* -* WORK(IU) is LDA by N and WORK(IR) is LDA by N -* - LDWRKU = LDA - IR = IU + LDWRKU*N - LDWRKR = LDA - ELSE IF( LWORK.GE.WRKBL+( LDA + N )*N ) THEN -* -* WORK(IU) is LDA by N and WORK(IR) is N by N -* - LDWRKU = LDA - IR = IU + LDWRKU*N - LDWRKR = N - ELSE -* -* WORK(IU) is N by N and WORK(IR) is N by N -* - LDWRKU = N - IR = IU + LDWRKU*N - LDWRKR = N - END IF - ITAU = IR + LDWRKR*N - IWORK = ITAU + N -* -* Compute A=Q*R -* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy R to WORK(IU), zeroing out below it -* - CALL DLACPY( 'U', N, N, A, LDA, WORK( IU ), - $ LDWRKU ) - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ WORK( IU+1 ), LDWRKU ) -* -* Generate Q in A -* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) -* - CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in WORK(IU), copying result to -* WORK(IR) -* (Workspace: need 2*N*N + 4*N, -* prefer 2*N*N+3*N+2*N*NB) -* - CALL DGEBRD( N, N, WORK( IU ), LDWRKU, S, - $ WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', N, N, WORK( IU ), LDWRKU, - $ WORK( IR ), LDWRKR ) -* -* Generate left bidiagonalizing vectors in WORK(IU) -* (Workspace: need 2*N*N + 4*N, prefer 2*N*N + 3*N + N*NB) -* - CALL DORGBR( 'Q', N, N, N, WORK( IU ), LDWRKU, - $ WORK( ITAUQ ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate right bidiagonalizing vectors in WORK(IR) -* (Workspace: need 2*N*N + 4*N-1, -* prefer 2*N*N+3*N+(N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, WORK( IR ), LDWRKR, - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of R in WORK(IU) and computing -* right singular vectors of R in WORK(IR) -* (Workspace: need 2*N*N + BDSPAC) -* - CALL DBDSQR( 'U', N, N, N, 0, S, WORK( IE ), - $ WORK( IR ), LDWRKR, WORK( IU ), - $ LDWRKU, DUM, 1, WORK( IWORK ), INFO ) -* -* Multiply Q in A by left singular vectors of R in -* WORK(IU), storing result in U -* (Workspace: need N*N) -* - CALL DGEMM( 'N', 'N', M, N, N, ONE, A, LDA, - $ WORK( IU ), LDWRKU, ZERO, U, LDU ) -* -* Copy right singular vectors of R to A -* (Workspace: need N*N) -* - CALL DLACPY( 'F', N, N, WORK( IR ), LDWRKR, A, - $ LDA ) -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + N -* -* Compute A=Q*R, copying result to U -* (Workspace: need 2*N, prefer N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, N, A, LDA, U, LDU ) -* -* Generate Q in U -* (Workspace: need 2*N, prefer N + N*NB) -* - CALL DORGQR( M, N, N, U, LDU, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Zero out below R in A -* - IF( N .GT. 1 ) THEN - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ A( 2, 1 ), LDA ) - END IF -* -* Bidiagonalize R in A -* (Workspace: need 4*N, prefer 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, A, LDA, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply Q in U by left vectors bidiagonalizing R -* (Workspace: need 3*N + M, prefer 3*N + M*NB) -* - CALL DORMBR( 'Q', 'R', 'N', M, N, N, A, LDA, - $ WORK( ITAUQ ), U, LDU, WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate right vectors bidiagonalizing R in A -* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of A in U and computing right -* singular vectors of A in A -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, N, M, 0, S, WORK( IE ), A, - $ LDA, U, LDU, DUM, 1, WORK( IWORK ), - $ INFO ) -* - END IF -* - ELSE IF( WNTVAS ) THEN -* -* Path 6 (M much larger than N, JOBU='S', JOBVT='S' -* or 'A') -* N left singular vectors to be computed in U and -* N right singular vectors to be computed in VT -* - IF( LWORK.GE.N*N+MAX( 4*N, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IU = 1 - IF( LWORK.GE.WRKBL+LDA*N ) THEN -* -* WORK(IU) is LDA by N -* - LDWRKU = LDA - ELSE -* -* WORK(IU) is N by N -* - LDWRKU = N - END IF - ITAU = IU + LDWRKU*N - IWORK = ITAU + N -* -* Compute A=Q*R -* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy R to WORK(IU), zeroing out below it -* - CALL DLACPY( 'U', N, N, A, LDA, WORK( IU ), - $ LDWRKU ) - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ WORK( IU+1 ), LDWRKU ) -* -* Generate Q in A -* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) -* - CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in WORK(IU), copying result to VT -* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, WORK( IU ), LDWRKU, S, - $ WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', N, N, WORK( IU ), LDWRKU, VT, - $ LDVT ) -* -* Generate left bidiagonalizing vectors in WORK(IU) -* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) -* - CALL DORGBR( 'Q', N, N, N, WORK( IU ), LDWRKU, - $ WORK( ITAUQ ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate right bidiagonalizing vectors in VT -* (Workspace: need N*N + 4*N-1, -* prefer N*N+3*N+(N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of R in WORK(IU) and computing -* right singular vectors of R in VT -* (Workspace: need N*N + BDSPAC) -* - CALL DBDSQR( 'U', N, N, N, 0, S, WORK( IE ), VT, - $ LDVT, WORK( IU ), LDWRKU, DUM, 1, - $ WORK( IWORK ), INFO ) -* -* Multiply Q in A by left singular vectors of R in -* WORK(IU), storing result in U -* (Workspace: need N*N) -* - CALL DGEMM( 'N', 'N', M, N, N, ONE, A, LDA, - $ WORK( IU ), LDWRKU, ZERO, U, LDU ) -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + N -* -* Compute A=Q*R, copying result to U -* (Workspace: need 2*N, prefer N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, N, A, LDA, U, LDU ) -* -* Generate Q in U -* (Workspace: need 2*N, prefer N + N*NB) -* - CALL DORGQR( M, N, N, U, LDU, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy R to VT, zeroing out below it -* - CALL DLACPY( 'U', N, N, A, LDA, VT, LDVT ) - IF( N.GT.1 ) - $ CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ VT( 2, 1 ), LDVT ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in VT -* (Workspace: need 4*N, prefer 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, VT, LDVT, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply Q in U by left bidiagonalizing vectors -* in VT -* (Workspace: need 3*N + M, prefer 3*N + M*NB) -* - CALL DORMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT, - $ WORK( ITAUQ ), U, LDU, WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate right bidiagonalizing vectors in VT -* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of A in U and computing right -* singular vectors of A in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, N, M, 0, S, WORK( IE ), VT, - $ LDVT, U, LDU, DUM, 1, WORK( IWORK ), - $ INFO ) -* - END IF -* - END IF -* - ELSE IF( WNTUA ) THEN -* - IF( WNTVN ) THEN -* -* Path 7 (M much larger than N, JOBU='A', JOBVT='N') -* M left singular vectors to be computed in U and -* no right singular vectors to be computed -* - IF( LWORK.GE.N*N+MAX( N+M, 4*N, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IR = 1 - IF( LWORK.GE.WRKBL+LDA*N ) THEN -* -* WORK(IR) is LDA by N -* - LDWRKR = LDA - ELSE -* -* WORK(IR) is N by N -* - LDWRKR = N - END IF - ITAU = IR + LDWRKR*N - IWORK = ITAU + N -* -* Compute A=Q*R, copying result to U -* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, N, A, LDA, U, LDU ) -* -* Copy R to WORK(IR), zeroing out below it -* - CALL DLACPY( 'U', N, N, A, LDA, WORK( IR ), - $ LDWRKR ) - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ WORK( IR+1 ), LDWRKR ) -* -* Generate Q in U -* (Workspace: need N*N + N + M, prefer N*N + N + M*NB) -* - CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in WORK(IR) -* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, WORK( IR ), LDWRKR, S, - $ WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate left bidiagonalizing vectors in WORK(IR) -* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) -* - CALL DORGBR( 'Q', N, N, N, WORK( IR ), LDWRKR, - $ WORK( ITAUQ ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of R in WORK(IR) -* (Workspace: need N*N + BDSPAC) -* - CALL DBDSQR( 'U', N, 0, N, 0, S, WORK( IE ), DUM, - $ 1, WORK( IR ), LDWRKR, DUM, 1, - $ WORK( IWORK ), INFO ) -* -* Multiply Q in U by left singular vectors of R in -* WORK(IR), storing result in A -* (Workspace: need N*N) -* - CALL DGEMM( 'N', 'N', M, N, N, ONE, U, LDU, - $ WORK( IR ), LDWRKR, ZERO, A, LDA ) -* -* Copy left singular vectors of A from A to U -* - CALL DLACPY( 'F', M, N, A, LDA, U, LDU ) -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + N -* -* Compute A=Q*R, copying result to U -* (Workspace: need 2*N, prefer N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, N, A, LDA, U, LDU ) -* -* Generate Q in U -* (Workspace: need N + M, prefer N + M*NB) -* - CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Zero out below R in A -* - IF( N .GT. 1 ) THEN - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ A( 2, 1 ), LDA ) - END IF -* -* Bidiagonalize R in A -* (Workspace: need 4*N, prefer 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, A, LDA, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply Q in U by left bidiagonalizing vectors -* in A -* (Workspace: need 3*N + M, prefer 3*N + M*NB) -* - CALL DORMBR( 'Q', 'R', 'N', M, N, N, A, LDA, - $ WORK( ITAUQ ), U, LDU, WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of A in U -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, 0, M, 0, S, WORK( IE ), DUM, - $ 1, U, LDU, DUM, 1, WORK( IWORK ), - $ INFO ) -* - END IF -* - ELSE IF( WNTVO ) THEN -* -* Path 8 (M much larger than N, JOBU='A', JOBVT='O') -* M left singular vectors to be computed in U and -* N right singular vectors to be overwritten on A -* - IF( LWORK.GE.2*N*N+MAX( N+M, 4*N, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IU = 1 - IF( LWORK.GE.WRKBL+2*LDA*N ) THEN -* -* WORK(IU) is LDA by N and WORK(IR) is LDA by N -* - LDWRKU = LDA - IR = IU + LDWRKU*N - LDWRKR = LDA - ELSE IF( LWORK.GE.WRKBL+( LDA + N )*N ) THEN -* -* WORK(IU) is LDA by N and WORK(IR) is N by N -* - LDWRKU = LDA - IR = IU + LDWRKU*N - LDWRKR = N - ELSE -* -* WORK(IU) is N by N and WORK(IR) is N by N -* - LDWRKU = N - IR = IU + LDWRKU*N - LDWRKR = N - END IF - ITAU = IR + LDWRKR*N - IWORK = ITAU + N -* -* Compute A=Q*R, copying result to U -* (Workspace: need 2*N*N + 2*N, prefer 2*N*N + N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, N, A, LDA, U, LDU ) -* -* Generate Q in U -* (Workspace: need 2*N*N + N + M, prefer 2*N*N + N + M*NB) -* - CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy R to WORK(IU), zeroing out below it -* - CALL DLACPY( 'U', N, N, A, LDA, WORK( IU ), - $ LDWRKU ) - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ WORK( IU+1 ), LDWRKU ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in WORK(IU), copying result to -* WORK(IR) -* (Workspace: need 2*N*N + 4*N, -* prefer 2*N*N+3*N+2*N*NB) -* - CALL DGEBRD( N, N, WORK( IU ), LDWRKU, S, - $ WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', N, N, WORK( IU ), LDWRKU, - $ WORK( IR ), LDWRKR ) -* -* Generate left bidiagonalizing vectors in WORK(IU) -* (Workspace: need 2*N*N + 4*N, prefer 2*N*N + 3*N + N*NB) -* - CALL DORGBR( 'Q', N, N, N, WORK( IU ), LDWRKU, - $ WORK( ITAUQ ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate right bidiagonalizing vectors in WORK(IR) -* (Workspace: need 2*N*N + 4*N-1, -* prefer 2*N*N+3*N+(N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, WORK( IR ), LDWRKR, - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of R in WORK(IU) and computing -* right singular vectors of R in WORK(IR) -* (Workspace: need 2*N*N + BDSPAC) -* - CALL DBDSQR( 'U', N, N, N, 0, S, WORK( IE ), - $ WORK( IR ), LDWRKR, WORK( IU ), - $ LDWRKU, DUM, 1, WORK( IWORK ), INFO ) -* -* Multiply Q in U by left singular vectors of R in -* WORK(IU), storing result in A -* (Workspace: need N*N) -* - CALL DGEMM( 'N', 'N', M, N, N, ONE, U, LDU, - $ WORK( IU ), LDWRKU, ZERO, A, LDA ) -* -* Copy left singular vectors of A from A to U -* - CALL DLACPY( 'F', M, N, A, LDA, U, LDU ) -* -* Copy right singular vectors of R from WORK(IR) to A -* - CALL DLACPY( 'F', N, N, WORK( IR ), LDWRKR, A, - $ LDA ) -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + N -* -* Compute A=Q*R, copying result to U -* (Workspace: need 2*N, prefer N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, N, A, LDA, U, LDU ) -* -* Generate Q in U -* (Workspace: need N + M, prefer N + M*NB) -* - CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Zero out below R in A -* - IF( N .GT. 1 ) THEN - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ A( 2, 1 ), LDA ) - END IF -* -* Bidiagonalize R in A -* (Workspace: need 4*N, prefer 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, A, LDA, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply Q in U by left bidiagonalizing vectors -* in A -* (Workspace: need 3*N + M, prefer 3*N + M*NB) -* - CALL DORMBR( 'Q', 'R', 'N', M, N, N, A, LDA, - $ WORK( ITAUQ ), U, LDU, WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate right bidiagonalizing vectors in A -* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of A in U and computing right -* singular vectors of A in A -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, N, M, 0, S, WORK( IE ), A, - $ LDA, U, LDU, DUM, 1, WORK( IWORK ), - $ INFO ) -* - END IF -* - ELSE IF( WNTVAS ) THEN -* -* Path 9 (M much larger than N, JOBU='A', JOBVT='S' -* or 'A') -* M left singular vectors to be computed in U and -* N right singular vectors to be computed in VT -* - IF( LWORK.GE.N*N+MAX( N+M, 4*N, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IU = 1 - IF( LWORK.GE.WRKBL+LDA*N ) THEN -* -* WORK(IU) is LDA by N -* - LDWRKU = LDA - ELSE -* -* WORK(IU) is N by N -* - LDWRKU = N - END IF - ITAU = IU + LDWRKU*N - IWORK = ITAU + N -* -* Compute A=Q*R, copying result to U -* (Workspace: need N*N + 2*N, prefer N*N + N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, N, A, LDA, U, LDU ) -* -* Generate Q in U -* (Workspace: need N*N + N + M, prefer N*N + N + M*NB) -* - CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy R to WORK(IU), zeroing out below it -* - CALL DLACPY( 'U', N, N, A, LDA, WORK( IU ), - $ LDWRKU ) - CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ WORK( IU+1 ), LDWRKU ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in WORK(IU), copying result to VT -* (Workspace: need N*N + 4*N, prefer N*N + 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, WORK( IU ), LDWRKU, S, - $ WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', N, N, WORK( IU ), LDWRKU, VT, - $ LDVT ) -* -* Generate left bidiagonalizing vectors in WORK(IU) -* (Workspace: need N*N + 4*N, prefer N*N + 3*N + N*NB) -* - CALL DORGBR( 'Q', N, N, N, WORK( IU ), LDWRKU, - $ WORK( ITAUQ ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate right bidiagonalizing vectors in VT -* (Workspace: need N*N + 4*N-1, -* prefer N*N+3*N+(N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of R in WORK(IU) and computing -* right singular vectors of R in VT -* (Workspace: need N*N + BDSPAC) -* - CALL DBDSQR( 'U', N, N, N, 0, S, WORK( IE ), VT, - $ LDVT, WORK( IU ), LDWRKU, DUM, 1, - $ WORK( IWORK ), INFO ) -* -* Multiply Q in U by left singular vectors of R in -* WORK(IU), storing result in A -* (Workspace: need N*N) -* - CALL DGEMM( 'N', 'N', M, N, N, ONE, U, LDU, - $ WORK( IU ), LDWRKU, ZERO, A, LDA ) -* -* Copy left singular vectors of A from A to U -* - CALL DLACPY( 'F', M, N, A, LDA, U, LDU ) -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + N -* -* Compute A=Q*R, copying result to U -* (Workspace: need 2*N, prefer N + N*NB) -* - CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, N, A, LDA, U, LDU ) -* -* Generate Q in U -* (Workspace: need N + M, prefer N + M*NB) -* - CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy R from A to VT, zeroing out below it -* - CALL DLACPY( 'U', N, N, A, LDA, VT, LDVT ) - IF( N.GT.1 ) - $ CALL DLASET( 'L', N-1, N-1, ZERO, ZERO, - $ VT( 2, 1 ), LDVT ) - IE = ITAU - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize R in VT -* (Workspace: need 4*N, prefer 3*N + 2*N*NB) -* - CALL DGEBRD( N, N, VT, LDVT, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply Q in U by left bidiagonalizing vectors -* in VT -* (Workspace: need 3*N + M, prefer 3*N + M*NB) -* - CALL DORMBR( 'Q', 'R', 'N', M, N, N, VT, LDVT, - $ WORK( ITAUQ ), U, LDU, WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate right bidiagonalizing vectors in VT -* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + N -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of A in U and computing right -* singular vectors of A in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, N, M, 0, S, WORK( IE ), VT, - $ LDVT, U, LDU, DUM, 1, WORK( IWORK ), - $ INFO ) -* - END IF -* - END IF -* - END IF -* - ELSE -* -* M .LT. MNTHR -* -* Path 10 (M at least N, but not much larger) -* Reduce to bidiagonal form without QR decomposition -* - IE = 1 - ITAUQ = IE + N - ITAUP = ITAUQ + N - IWORK = ITAUP + N -* -* Bidiagonalize A -* (Workspace: need 3*N + M, prefer 3*N + (M + N)*NB) -* - CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1, - $ IERR ) - IF( WNTUAS ) THEN -* -* If left singular vectors desired in U, copy result to U -* and generate left bidiagonalizing vectors in U -* (Workspace: need 3*N + NCU, prefer 3*N + NCU*NB) -* - CALL DLACPY( 'L', M, N, A, LDA, U, LDU ) - IF( WNTUS ) - $ NCU = N - IF( WNTUA ) - $ NCU = M - CALL DORGBR( 'Q', M, NCU, N, U, LDU, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - END IF - IF( WNTVAS ) THEN -* -* If right singular vectors desired in VT, copy result to -* VT and generate right bidiagonalizing vectors in VT -* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) -* - CALL DLACPY( 'U', N, N, A, LDA, VT, LDVT ) - CALL DORGBR( 'P', N, N, N, VT, LDVT, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - END IF - IF( WNTUO ) THEN -* -* If left singular vectors desired in A, generate left -* bidiagonalizing vectors in A -* (Workspace: need 4*N, prefer 3*N + N*NB) -* - CALL DORGBR( 'Q', M, N, N, A, LDA, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - END IF - IF( WNTVO ) THEN -* -* If right singular vectors desired in A, generate right -* bidiagonalizing vectors in A -* (Workspace: need 4*N-1, prefer 3*N + (N-1)*NB) -* - CALL DORGBR( 'P', N, N, N, A, LDA, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - END IF - IWORK = IE + N - IF( WNTUAS .OR. WNTUO ) - $ NRU = M - IF( WNTUN ) - $ NRU = 0 - IF( WNTVAS .OR. WNTVO ) - $ NCVT = N - IF( WNTVN ) - $ NCVT = 0 - IF( ( .NOT.WNTUO ) .AND. ( .NOT.WNTVO ) ) THEN -* -* Perform bidiagonal QR iteration, if desired, computing -* left singular vectors in U and computing right singular -* vectors in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, NCVT, NRU, 0, S, WORK( IE ), VT, - $ LDVT, U, LDU, DUM, 1, WORK( IWORK ), INFO ) - ELSE IF( ( .NOT.WNTUO ) .AND. WNTVO ) THEN -* -* Perform bidiagonal QR iteration, if desired, computing -* left singular vectors in U and computing right singular -* vectors in A -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, NCVT, NRU, 0, S, WORK( IE ), A, LDA, - $ U, LDU, DUM, 1, WORK( IWORK ), INFO ) - ELSE -* -* Perform bidiagonal QR iteration, if desired, computing -* left singular vectors in A and computing right singular -* vectors in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', N, NCVT, NRU, 0, S, WORK( IE ), VT, - $ LDVT, A, LDA, DUM, 1, WORK( IWORK ), INFO ) - END IF -* - END IF -* - ELSE -* -* A has more columns than rows. If A has sufficiently more -* columns than rows, first reduce using the LQ decomposition (if -* sufficient workspace available) -* - IF( N.GE.MNTHR ) THEN -* - IF( WNTVN ) THEN -* -* Path 1t(N much larger than M, JOBVT='N') -* No right singular vectors to be computed -* - ITAU = 1 - IWORK = ITAU + M -* -* Compute A=L*Q -* (Workspace: need 2*M, prefer M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Zero out above L -* - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ), LDA ) - IE = 1 - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in A -* (Workspace: need 4*M, prefer 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, A, LDA, S, WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1, - $ IERR ) - IF( WNTUO .OR. WNTUAS ) THEN -* -* If left singular vectors desired, generate Q -* (Workspace: need 4*M, prefer 3*M + M*NB) -* - CALL DORGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - END IF - IWORK = IE + M - NRU = 0 - IF( WNTUO .OR. WNTUAS ) - $ NRU = M -* -* Perform bidiagonal QR iteration, computing left singular -* vectors of A in A if desired -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', M, 0, NRU, 0, S, WORK( IE ), DUM, 1, A, - $ LDA, DUM, 1, WORK( IWORK ), INFO ) -* -* If left singular vectors desired in U, copy them there -* - IF( WNTUAS ) - $ CALL DLACPY( 'F', M, M, A, LDA, U, LDU ) -* - ELSE IF( WNTVO .AND. WNTUN ) THEN -* -* Path 2t(N much larger than M, JOBU='N', JOBVT='O') -* M right singular vectors to be overwritten on A and -* no left singular vectors to be computed -* - IF( LWORK.GE.M*M+MAX( 4*M, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IR = 1 - IF( LWORK.GE.MAX( WRKBL, LDA*N + M ) + LDA*M ) THEN -* -* WORK(IU) is LDA by N and WORK(IR) is LDA by M -* - LDWRKU = LDA - CHUNK = N - LDWRKR = LDA - ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N + M ) + M*M ) THEN -* -* WORK(IU) is LDA by N and WORK(IR) is M by M -* - LDWRKU = LDA - CHUNK = N - LDWRKR = M - ELSE -* -* WORK(IU) is M by CHUNK and WORK(IR) is M by M -* - LDWRKU = M - CHUNK = ( LWORK-M*M-M ) / M - LDWRKR = M - END IF - ITAU = IR + LDWRKR*M - IWORK = ITAU + M -* -* Compute A=L*Q -* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy L to WORK(IR) and zero out above it -* - CALL DLACPY( 'L', M, M, A, LDA, WORK( IR ), LDWRKR ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, - $ WORK( IR+LDWRKR ), LDWRKR ) -* -* Generate Q in A -* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) -* - CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in WORK(IR) -* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, WORK( IR ), LDWRKR, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Generate right vectors bidiagonalizing L -* (Workspace: need M*M + 4*M-1, prefer M*M + 3*M + (M-1)*NB) -* - CALL DORGBR( 'P', M, M, M, WORK( IR ), LDWRKR, - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing right -* singular vectors of L in WORK(IR) -* (Workspace: need M*M + BDSPAC) -* - CALL DBDSQR( 'U', M, M, 0, 0, S, WORK( IE ), - $ WORK( IR ), LDWRKR, DUM, 1, DUM, 1, - $ WORK( IWORK ), INFO ) - IU = IE + M -* -* Multiply right singular vectors of L in WORK(IR) by Q -* in A, storing result in WORK(IU) and copying to A -* (Workspace: need M*M + 2*M, prefer M*M + M*N + M) -* - DO 30 I = 1, N, CHUNK - BLK = MIN( N-I+1, CHUNK ) - CALL DGEMM( 'N', 'N', M, BLK, M, ONE, WORK( IR ), - $ LDWRKR, A( 1, I ), LDA, ZERO, - $ WORK( IU ), LDWRKU ) - CALL DLACPY( 'F', M, BLK, WORK( IU ), LDWRKU, - $ A( 1, I ), LDA ) - 30 CONTINUE -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - IE = 1 - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize A -* (Workspace: need 3*M + N, prefer 3*M + (M + N)*NB) -* - CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Generate right vectors bidiagonalizing A -* (Workspace: need 4*M, prefer 3*M + M*NB) -* - CALL DORGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing right -* singular vectors of A in A -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'L', M, N, 0, 0, S, WORK( IE ), A, LDA, - $ DUM, 1, DUM, 1, WORK( IWORK ), INFO ) -* - END IF -* - ELSE IF( WNTVO .AND. WNTUAS ) THEN -* -* Path 3t(N much larger than M, JOBU='S' or 'A', JOBVT='O') -* M right singular vectors to be overwritten on A and -* M left singular vectors to be computed in U -* - IF( LWORK.GE.M*M+MAX( 4*M, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IR = 1 - IF( LWORK.GE.MAX( WRKBL, LDA*N + M ) + LDA*M ) THEN -* -* WORK(IU) is LDA by N and WORK(IR) is LDA by M -* - LDWRKU = LDA - CHUNK = N - LDWRKR = LDA - ELSE IF( LWORK.GE.MAX( WRKBL, LDA*N + M ) + M*M ) THEN -* -* WORK(IU) is LDA by N and WORK(IR) is M by M -* - LDWRKU = LDA - CHUNK = N - LDWRKR = M - ELSE -* -* WORK(IU) is M by CHUNK and WORK(IR) is M by M -* - LDWRKU = M - CHUNK = ( LWORK-M*M-M ) / M - LDWRKR = M - END IF - ITAU = IR + LDWRKR*M - IWORK = ITAU + M -* -* Compute A=L*Q -* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy L to U, zeroing about above it -* - CALL DLACPY( 'L', M, M, A, LDA, U, LDU ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, U( 1, 2 ), - $ LDU ) -* -* Generate Q in A -* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) -* - CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in U, copying result to WORK(IR) -* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, U, LDU, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', M, M, U, LDU, WORK( IR ), LDWRKR ) -* -* Generate right vectors bidiagonalizing L in WORK(IR) -* (Workspace: need M*M + 4*M-1, prefer M*M + 3*M + (M-1)*NB) -* - CALL DORGBR( 'P', M, M, M, WORK( IR ), LDWRKR, - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate left vectors bidiagonalizing L in U -* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) -* - CALL DORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of L in U, and computing right -* singular vectors of L in WORK(IR) -* (Workspace: need M*M + BDSPAC) -* - CALL DBDSQR( 'U', M, M, M, 0, S, WORK( IE ), - $ WORK( IR ), LDWRKR, U, LDU, DUM, 1, - $ WORK( IWORK ), INFO ) - IU = IE + M -* -* Multiply right singular vectors of L in WORK(IR) by Q -* in A, storing result in WORK(IU) and copying to A -* (Workspace: need M*M + 2*M, prefer M*M + M*N + M)) -* - DO 40 I = 1, N, CHUNK - BLK = MIN( N-I+1, CHUNK ) - CALL DGEMM( 'N', 'N', M, BLK, M, ONE, WORK( IR ), - $ LDWRKR, A( 1, I ), LDA, ZERO, - $ WORK( IU ), LDWRKU ) - CALL DLACPY( 'F', M, BLK, WORK( IU ), LDWRKU, - $ A( 1, I ), LDA ) - 40 CONTINUE -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + M -* -* Compute A=L*Q -* (Workspace: need 2*M, prefer M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy L to U, zeroing out above it -* - CALL DLACPY( 'L', M, M, A, LDA, U, LDU ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, U( 1, 2 ), - $ LDU ) -* -* Generate Q in A -* (Workspace: need 2*M, prefer M + M*NB) -* - CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in U -* (Workspace: need 4*M, prefer 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, U, LDU, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply right vectors bidiagonalizing L by Q in A -* (Workspace: need 3*M + N, prefer 3*M + N*NB) -* - CALL DORMBR( 'P', 'L', 'T', M, N, M, U, LDU, - $ WORK( ITAUP ), A, LDA, WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate left vectors bidiagonalizing L in U -* (Workspace: need 4*M, prefer 3*M + M*NB) -* - CALL DORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of A in U and computing right -* singular vectors of A in A -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', M, N, M, 0, S, WORK( IE ), A, LDA, - $ U, LDU, DUM, 1, WORK( IWORK ), INFO ) -* - END IF -* - ELSE IF( WNTVS ) THEN -* - IF( WNTUN ) THEN -* -* Path 4t(N much larger than M, JOBU='N', JOBVT='S') -* M right singular vectors to be computed in VT and -* no left singular vectors to be computed -* - IF( LWORK.GE.M*M+MAX( 4*M, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IR = 1 - IF( LWORK.GE.WRKBL+LDA*M ) THEN -* -* WORK(IR) is LDA by M -* - LDWRKR = LDA - ELSE -* -* WORK(IR) is M by M -* - LDWRKR = M - END IF - ITAU = IR + LDWRKR*M - IWORK = ITAU + M -* -* Compute A=L*Q -* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy L to WORK(IR), zeroing out above it -* - CALL DLACPY( 'L', M, M, A, LDA, WORK( IR ), - $ LDWRKR ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, - $ WORK( IR+LDWRKR ), LDWRKR ) -* -* Generate Q in A -* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) -* - CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in WORK(IR) -* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, WORK( IR ), LDWRKR, S, - $ WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate right vectors bidiagonalizing L in -* WORK(IR) -* (Workspace: need M*M + 4*M, prefer M*M + 3*M + (M-1)*NB) -* - CALL DORGBR( 'P', M, M, M, WORK( IR ), LDWRKR, - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing right -* singular vectors of L in WORK(IR) -* (Workspace: need M*M + BDSPAC) -* - CALL DBDSQR( 'U', M, M, 0, 0, S, WORK( IE ), - $ WORK( IR ), LDWRKR, DUM, 1, DUM, 1, - $ WORK( IWORK ), INFO ) -* -* Multiply right singular vectors of L in WORK(IR) by -* Q in A, storing result in VT -* (Workspace: need M*M) -* - CALL DGEMM( 'N', 'N', M, N, M, ONE, WORK( IR ), - $ LDWRKR, A, LDA, ZERO, VT, LDVT ) -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + M -* -* Compute A=L*Q -* (Workspace: need 2*M, prefer M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy result to VT -* - CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT ) -* -* Generate Q in VT -* (Workspace: need 2*M, prefer M + M*NB) -* - CALL DORGLQ( M, N, M, VT, LDVT, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Zero out above L in A -* - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ), - $ LDA ) -* -* Bidiagonalize L in A -* (Workspace: need 4*M, prefer 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, A, LDA, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply right vectors bidiagonalizing L by Q in VT -* (Workspace: need 3*M + N, prefer 3*M + N*NB) -* - CALL DORMBR( 'P', 'L', 'T', M, N, M, A, LDA, - $ WORK( ITAUP ), VT, LDVT, - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing right -* singular vectors of A in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', M, N, 0, 0, S, WORK( IE ), VT, - $ LDVT, DUM, 1, DUM, 1, WORK( IWORK ), - $ INFO ) -* - END IF -* - ELSE IF( WNTUO ) THEN -* -* Path 5t(N much larger than M, JOBU='O', JOBVT='S') -* M right singular vectors to be computed in VT and -* M left singular vectors to be overwritten on A -* - IF( LWORK.GE.2*M*M+MAX( 4*M, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IU = 1 - IF( LWORK.GE.WRKBL+2*LDA*M ) THEN -* -* WORK(IU) is LDA by M and WORK(IR) is LDA by M -* - LDWRKU = LDA - IR = IU + LDWRKU*M - LDWRKR = LDA - ELSE IF( LWORK.GE.WRKBL+( LDA + M )*M ) THEN -* -* WORK(IU) is LDA by M and WORK(IR) is M by M -* - LDWRKU = LDA - IR = IU + LDWRKU*M - LDWRKR = M - ELSE -* -* WORK(IU) is M by M and WORK(IR) is M by M -* - LDWRKU = M - IR = IU + LDWRKU*M - LDWRKR = M - END IF - ITAU = IR + LDWRKR*M - IWORK = ITAU + M -* -* Compute A=L*Q -* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy L to WORK(IU), zeroing out below it -* - CALL DLACPY( 'L', M, M, A, LDA, WORK( IU ), - $ LDWRKU ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, - $ WORK( IU+LDWRKU ), LDWRKU ) -* -* Generate Q in A -* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) -* - CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in WORK(IU), copying result to -* WORK(IR) -* (Workspace: need 2*M*M + 4*M, -* prefer 2*M*M+3*M+2*M*NB) -* - CALL DGEBRD( M, M, WORK( IU ), LDWRKU, S, - $ WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, M, WORK( IU ), LDWRKU, - $ WORK( IR ), LDWRKR ) -* -* Generate right bidiagonalizing vectors in WORK(IU) -* (Workspace: need 2*M*M + 4*M-1, -* prefer 2*M*M+3*M+(M-1)*NB) -* - CALL DORGBR( 'P', M, M, M, WORK( IU ), LDWRKU, - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate left bidiagonalizing vectors in WORK(IR) -* (Workspace: need 2*M*M + 4*M, prefer 2*M*M + 3*M + M*NB) -* - CALL DORGBR( 'Q', M, M, M, WORK( IR ), LDWRKR, - $ WORK( ITAUQ ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of L in WORK(IR) and computing -* right singular vectors of L in WORK(IU) -* (Workspace: need 2*M*M + BDSPAC) -* - CALL DBDSQR( 'U', M, M, M, 0, S, WORK( IE ), - $ WORK( IU ), LDWRKU, WORK( IR ), - $ LDWRKR, DUM, 1, WORK( IWORK ), INFO ) -* -* Multiply right singular vectors of L in WORK(IU) by -* Q in A, storing result in VT -* (Workspace: need M*M) -* - CALL DGEMM( 'N', 'N', M, N, M, ONE, WORK( IU ), - $ LDWRKU, A, LDA, ZERO, VT, LDVT ) -* -* Copy left singular vectors of L to A -* (Workspace: need M*M) -* - CALL DLACPY( 'F', M, M, WORK( IR ), LDWRKR, A, - $ LDA ) -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + M -* -* Compute A=L*Q, copying result to VT -* (Workspace: need 2*M, prefer M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT ) -* -* Generate Q in VT -* (Workspace: need 2*M, prefer M + M*NB) -* - CALL DORGLQ( M, N, M, VT, LDVT, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Zero out above L in A -* - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ), - $ LDA ) -* -* Bidiagonalize L in A -* (Workspace: need 4*M, prefer 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, A, LDA, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply right vectors bidiagonalizing L by Q in VT -* (Workspace: need 3*M + N, prefer 3*M + N*NB) -* - CALL DORMBR( 'P', 'L', 'T', M, N, M, A, LDA, - $ WORK( ITAUP ), VT, LDVT, - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Generate left bidiagonalizing vectors of L in A -* (Workspace: need 4*M, prefer 3*M + M*NB) -* - CALL DORGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, compute left -* singular vectors of A in A and compute right -* singular vectors of A in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', M, N, M, 0, S, WORK( IE ), VT, - $ LDVT, A, LDA, DUM, 1, WORK( IWORK ), - $ INFO ) -* - END IF -* - ELSE IF( WNTUAS ) THEN -* -* Path 6t(N much larger than M, JOBU='S' or 'A', -* JOBVT='S') -* M right singular vectors to be computed in VT and -* M left singular vectors to be computed in U -* - IF( LWORK.GE.M*M+MAX( 4*M, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IU = 1 - IF( LWORK.GE.WRKBL+LDA*M ) THEN -* -* WORK(IU) is LDA by N -* - LDWRKU = LDA - ELSE -* -* WORK(IU) is LDA by M -* - LDWRKU = M - END IF - ITAU = IU + LDWRKU*M - IWORK = ITAU + M -* -* Compute A=L*Q -* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy L to WORK(IU), zeroing out above it -* - CALL DLACPY( 'L', M, M, A, LDA, WORK( IU ), - $ LDWRKU ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, - $ WORK( IU+LDWRKU ), LDWRKU ) -* -* Generate Q in A -* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) -* - CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in WORK(IU), copying result to U -* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, WORK( IU ), LDWRKU, S, - $ WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, M, WORK( IU ), LDWRKU, U, - $ LDU ) -* -* Generate right bidiagonalizing vectors in WORK(IU) -* (Workspace: need M*M + 4*M-1, -* prefer M*M+3*M+(M-1)*NB) -* - CALL DORGBR( 'P', M, M, M, WORK( IU ), LDWRKU, - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate left bidiagonalizing vectors in U -* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) -* - CALL DORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of L in U and computing right -* singular vectors of L in WORK(IU) -* (Workspace: need M*M + BDSPAC) -* - CALL DBDSQR( 'U', M, M, M, 0, S, WORK( IE ), - $ WORK( IU ), LDWRKU, U, LDU, DUM, 1, - $ WORK( IWORK ), INFO ) -* -* Multiply right singular vectors of L in WORK(IU) by -* Q in A, storing result in VT -* (Workspace: need M*M) -* - CALL DGEMM( 'N', 'N', M, N, M, ONE, WORK( IU ), - $ LDWRKU, A, LDA, ZERO, VT, LDVT ) -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + M -* -* Compute A=L*Q, copying result to VT -* (Workspace: need 2*M, prefer M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT ) -* -* Generate Q in VT -* (Workspace: need 2*M, prefer M + M*NB) -* - CALL DORGLQ( M, N, M, VT, LDVT, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy L to U, zeroing out above it -* - CALL DLACPY( 'L', M, M, A, LDA, U, LDU ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, U( 1, 2 ), - $ LDU ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in U -* (Workspace: need 4*M, prefer 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, U, LDU, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply right bidiagonalizing vectors in U by Q -* in VT -* (Workspace: need 3*M + N, prefer 3*M + N*NB) -* - CALL DORMBR( 'P', 'L', 'T', M, N, M, U, LDU, - $ WORK( ITAUP ), VT, LDVT, - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Generate left bidiagonalizing vectors in U -* (Workspace: need 4*M, prefer 3*M + M*NB) -* - CALL DORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of A in U and computing right -* singular vectors of A in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', M, N, M, 0, S, WORK( IE ), VT, - $ LDVT, U, LDU, DUM, 1, WORK( IWORK ), - $ INFO ) -* - END IF -* - END IF -* - ELSE IF( WNTVA ) THEN -* - IF( WNTUN ) THEN -* -* Path 7t(N much larger than M, JOBU='N', JOBVT='A') -* N right singular vectors to be computed in VT and -* no left singular vectors to be computed -* - IF( LWORK.GE.M*M+MAX( N + M, 4*M, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IR = 1 - IF( LWORK.GE.WRKBL+LDA*M ) THEN -* -* WORK(IR) is LDA by M -* - LDWRKR = LDA - ELSE -* -* WORK(IR) is M by M -* - LDWRKR = M - END IF - ITAU = IR + LDWRKR*M - IWORK = ITAU + M -* -* Compute A=L*Q, copying result to VT -* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT ) -* -* Copy L to WORK(IR), zeroing out above it -* - CALL DLACPY( 'L', M, M, A, LDA, WORK( IR ), - $ LDWRKR ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, - $ WORK( IR+LDWRKR ), LDWRKR ) -* -* Generate Q in VT -* (Workspace: need M*M + M + N, prefer M*M + M + N*NB) -* - CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in WORK(IR) -* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, WORK( IR ), LDWRKR, S, - $ WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate right bidiagonalizing vectors in WORK(IR) -* (Workspace: need M*M + 4*M-1, -* prefer M*M+3*M+(M-1)*NB) -* - CALL DORGBR( 'P', M, M, M, WORK( IR ), LDWRKR, - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing right -* singular vectors of L in WORK(IR) -* (Workspace: need M*M + BDSPAC) -* - CALL DBDSQR( 'U', M, M, 0, 0, S, WORK( IE ), - $ WORK( IR ), LDWRKR, DUM, 1, DUM, 1, - $ WORK( IWORK ), INFO ) -* -* Multiply right singular vectors of L in WORK(IR) by -* Q in VT, storing result in A -* (Workspace: need M*M) -* - CALL DGEMM( 'N', 'N', M, N, M, ONE, WORK( IR ), - $ LDWRKR, VT, LDVT, ZERO, A, LDA ) -* -* Copy right singular vectors of A from A to VT -* - CALL DLACPY( 'F', M, N, A, LDA, VT, LDVT ) -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + M -* -* Compute A=L*Q, copying result to VT -* (Workspace: need 2*M, prefer M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT ) -* -* Generate Q in VT -* (Workspace: need M + N, prefer M + N*NB) -* - CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Zero out above L in A -* - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ), - $ LDA ) -* -* Bidiagonalize L in A -* (Workspace: need 4*M, prefer 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, A, LDA, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply right bidiagonalizing vectors in A by Q -* in VT -* (Workspace: need 3*M + N, prefer 3*M + N*NB) -* - CALL DORMBR( 'P', 'L', 'T', M, N, M, A, LDA, - $ WORK( ITAUP ), VT, LDVT, - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing right -* singular vectors of A in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', M, N, 0, 0, S, WORK( IE ), VT, - $ LDVT, DUM, 1, DUM, 1, WORK( IWORK ), - $ INFO ) -* - END IF -* - ELSE IF( WNTUO ) THEN -* -* Path 8t(N much larger than M, JOBU='O', JOBVT='A') -* N right singular vectors to be computed in VT and -* M left singular vectors to be overwritten on A -* - IF( LWORK.GE.2*M*M+MAX( N + M, 4*M, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IU = 1 - IF( LWORK.GE.WRKBL+2*LDA*M ) THEN -* -* WORK(IU) is LDA by M and WORK(IR) is LDA by M -* - LDWRKU = LDA - IR = IU + LDWRKU*M - LDWRKR = LDA - ELSE IF( LWORK.GE.WRKBL+( LDA + M )*M ) THEN -* -* WORK(IU) is LDA by M and WORK(IR) is M by M -* - LDWRKU = LDA - IR = IU + LDWRKU*M - LDWRKR = M - ELSE -* -* WORK(IU) is M by M and WORK(IR) is M by M -* - LDWRKU = M - IR = IU + LDWRKU*M - LDWRKR = M - END IF - ITAU = IR + LDWRKR*M - IWORK = ITAU + M -* -* Compute A=L*Q, copying result to VT -* (Workspace: need 2*M*M + 2*M, prefer 2*M*M + M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT ) -* -* Generate Q in VT -* (Workspace: need 2*M*M + M + N, prefer 2*M*M + M + N*NB) -* - CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy L to WORK(IU), zeroing out above it -* - CALL DLACPY( 'L', M, M, A, LDA, WORK( IU ), - $ LDWRKU ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, - $ WORK( IU+LDWRKU ), LDWRKU ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in WORK(IU), copying result to -* WORK(IR) -* (Workspace: need 2*M*M + 4*M, -* prefer 2*M*M+3*M+2*M*NB) -* - CALL DGEBRD( M, M, WORK( IU ), LDWRKU, S, - $ WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, M, WORK( IU ), LDWRKU, - $ WORK( IR ), LDWRKR ) -* -* Generate right bidiagonalizing vectors in WORK(IU) -* (Workspace: need 2*M*M + 4*M-1, -* prefer 2*M*M+3*M+(M-1)*NB) -* - CALL DORGBR( 'P', M, M, M, WORK( IU ), LDWRKU, - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate left bidiagonalizing vectors in WORK(IR) -* (Workspace: need 2*M*M + 4*M, prefer 2*M*M + 3*M + M*NB) -* - CALL DORGBR( 'Q', M, M, M, WORK( IR ), LDWRKR, - $ WORK( ITAUQ ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of L in WORK(IR) and computing -* right singular vectors of L in WORK(IU) -* (Workspace: need 2*M*M + BDSPAC) -* - CALL DBDSQR( 'U', M, M, M, 0, S, WORK( IE ), - $ WORK( IU ), LDWRKU, WORK( IR ), - $ LDWRKR, DUM, 1, WORK( IWORK ), INFO ) -* -* Multiply right singular vectors of L in WORK(IU) by -* Q in VT, storing result in A -* (Workspace: need M*M) -* - CALL DGEMM( 'N', 'N', M, N, M, ONE, WORK( IU ), - $ LDWRKU, VT, LDVT, ZERO, A, LDA ) -* -* Copy right singular vectors of A from A to VT -* - CALL DLACPY( 'F', M, N, A, LDA, VT, LDVT ) -* -* Copy left singular vectors of A from WORK(IR) to A -* - CALL DLACPY( 'F', M, M, WORK( IR ), LDWRKR, A, - $ LDA ) -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + M -* -* Compute A=L*Q, copying result to VT -* (Workspace: need 2*M, prefer M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT ) -* -* Generate Q in VT -* (Workspace: need M + N, prefer M + N*NB) -* - CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Zero out above L in A -* - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, A( 1, 2 ), - $ LDA ) -* -* Bidiagonalize L in A -* (Workspace: need 4*M, prefer 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, A, LDA, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply right bidiagonalizing vectors in A by Q -* in VT -* (Workspace: need 3*M + N, prefer 3*M + N*NB) -* - CALL DORMBR( 'P', 'L', 'T', M, N, M, A, LDA, - $ WORK( ITAUP ), VT, LDVT, - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Generate left bidiagonalizing vectors in A -* (Workspace: need 4*M, prefer 3*M + M*NB) -* - CALL DORGBR( 'Q', M, M, M, A, LDA, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of A in A and computing right -* singular vectors of A in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', M, N, M, 0, S, WORK( IE ), VT, - $ LDVT, A, LDA, DUM, 1, WORK( IWORK ), - $ INFO ) -* - END IF -* - ELSE IF( WNTUAS ) THEN -* -* Path 9t(N much larger than M, JOBU='S' or 'A', -* JOBVT='A') -* N right singular vectors to be computed in VT and -* M left singular vectors to be computed in U -* - IF( LWORK.GE.M*M+MAX( N + M, 4*M, BDSPAC ) ) THEN -* -* Sufficient workspace for a fast algorithm -* - IU = 1 - IF( LWORK.GE.WRKBL+LDA*M ) THEN -* -* WORK(IU) is LDA by M -* - LDWRKU = LDA - ELSE -* -* WORK(IU) is M by M -* - LDWRKU = M - END IF - ITAU = IU + LDWRKU*M - IWORK = ITAU + M -* -* Compute A=L*Q, copying result to VT -* (Workspace: need M*M + 2*M, prefer M*M + M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT ) -* -* Generate Q in VT -* (Workspace: need M*M + M + N, prefer M*M + M + N*NB) -* - CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy L to WORK(IU), zeroing out above it -* - CALL DLACPY( 'L', M, M, A, LDA, WORK( IU ), - $ LDWRKU ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, - $ WORK( IU+LDWRKU ), LDWRKU ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in WORK(IU), copying result to U -* (Workspace: need M*M + 4*M, prefer M*M + 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, WORK( IU ), LDWRKU, S, - $ WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) - CALL DLACPY( 'L', M, M, WORK( IU ), LDWRKU, U, - $ LDU ) -* -* Generate right bidiagonalizing vectors in WORK(IU) -* (Workspace: need M*M + 4*M, prefer M*M + 3*M + (M-1)*NB) -* - CALL DORGBR( 'P', M, M, M, WORK( IU ), LDWRKU, - $ WORK( ITAUP ), WORK( IWORK ), - $ LWORK-IWORK+1, IERR ) -* -* Generate left bidiagonalizing vectors in U -* (Workspace: need M*M + 4*M, prefer M*M + 3*M + M*NB) -* - CALL DORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of L in U and computing right -* singular vectors of L in WORK(IU) -* (Workspace: need M*M + BDSPAC) -* - CALL DBDSQR( 'U', M, M, M, 0, S, WORK( IE ), - $ WORK( IU ), LDWRKU, U, LDU, DUM, 1, - $ WORK( IWORK ), INFO ) -* -* Multiply right singular vectors of L in WORK(IU) by -* Q in VT, storing result in A -* (Workspace: need M*M) -* - CALL DGEMM( 'N', 'N', M, N, M, ONE, WORK( IU ), - $ LDWRKU, VT, LDVT, ZERO, A, LDA ) -* -* Copy right singular vectors of A from A to VT -* - CALL DLACPY( 'F', M, N, A, LDA, VT, LDVT ) -* - ELSE -* -* Insufficient workspace for a fast algorithm -* - ITAU = 1 - IWORK = ITAU + M -* -* Compute A=L*Q, copying result to VT -* (Workspace: need 2*M, prefer M + M*NB) -* - CALL DGELQF( M, N, A, LDA, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT ) -* -* Generate Q in VT -* (Workspace: need M + N, prefer M + N*NB) -* - CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Copy L to U, zeroing out above it -* - CALL DLACPY( 'L', M, M, A, LDA, U, LDU ) - CALL DLASET( 'U', M-1, M-1, ZERO, ZERO, U( 1, 2 ), - $ LDU ) - IE = ITAU - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize L in U -* (Workspace: need 4*M, prefer 3*M + 2*M*NB) -* - CALL DGEBRD( M, M, U, LDU, S, WORK( IE ), - $ WORK( ITAUQ ), WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Multiply right bidiagonalizing vectors in U by Q -* in VT -* (Workspace: need 3*M + N, prefer 3*M + N*NB) -* - CALL DORMBR( 'P', 'L', 'T', M, N, M, U, LDU, - $ WORK( ITAUP ), VT, LDVT, - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) -* -* Generate left bidiagonalizing vectors in U -* (Workspace: need 4*M, prefer 3*M + M*NB) -* - CALL DORGBR( 'Q', M, M, M, U, LDU, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - IWORK = IE + M -* -* Perform bidiagonal QR iteration, computing left -* singular vectors of A in U and computing right -* singular vectors of A in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'U', M, N, M, 0, S, WORK( IE ), VT, - $ LDVT, U, LDU, DUM, 1, WORK( IWORK ), - $ INFO ) -* - END IF -* - END IF -* - END IF -* - ELSE -* -* N .LT. MNTHR -* -* Path 10t(N greater than M, but not much larger) -* Reduce to bidiagonal form without LQ decomposition -* - IE = 1 - ITAUQ = IE + M - ITAUP = ITAUQ + M - IWORK = ITAUP + M -* -* Bidiagonalize A -* (Workspace: need 3*M + N, prefer 3*M + (M + N)*NB) -* - CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ), - $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1, - $ IERR ) - IF( WNTUAS ) THEN -* -* If left singular vectors desired in U, copy result to U -* and generate left bidiagonalizing vectors in U -* (Workspace: need 4*M-1, prefer 3*M + (M-1)*NB) -* - CALL DLACPY( 'L', M, M, A, LDA, U, LDU ) - CALL DORGBR( 'Q', M, M, N, U, LDU, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - END IF - IF( WNTVAS ) THEN -* -* If right singular vectors desired in VT, copy result to -* VT and generate right bidiagonalizing vectors in VT -* (Workspace: need 3*M + NRVT, prefer 3*M + NRVT*NB) -* - CALL DLACPY( 'U', M, N, A, LDA, VT, LDVT ) - IF( WNTVA ) - $ NRVT = N - IF( WNTVS ) - $ NRVT = M - CALL DORGBR( 'P', NRVT, N, M, VT, LDVT, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - END IF - IF( WNTUO ) THEN -* -* If left singular vectors desired in A, generate left -* bidiagonalizing vectors in A -* (Workspace: need 4*M-1, prefer 3*M + (M-1)*NB) -* - CALL DORGBR( 'Q', M, M, N, A, LDA, WORK( ITAUQ ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - END IF - IF( WNTVO ) THEN -* -* If right singular vectors desired in A, generate right -* bidiagonalizing vectors in A -* (Workspace: need 4*M, prefer 3*M + M*NB) -* - CALL DORGBR( 'P', M, N, M, A, LDA, WORK( ITAUP ), - $ WORK( IWORK ), LWORK-IWORK+1, IERR ) - END IF - IWORK = IE + M - IF( WNTUAS .OR. WNTUO ) - $ NRU = M - IF( WNTUN ) - $ NRU = 0 - IF( WNTVAS .OR. WNTVO ) - $ NCVT = N - IF( WNTVN ) - $ NCVT = 0 - IF( ( .NOT.WNTUO ) .AND. ( .NOT.WNTVO ) ) THEN -* -* Perform bidiagonal QR iteration, if desired, computing -* left singular vectors in U and computing right singular -* vectors in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'L', M, NCVT, NRU, 0, S, WORK( IE ), VT, - $ LDVT, U, LDU, DUM, 1, WORK( IWORK ), INFO ) - ELSE IF( ( .NOT.WNTUO ) .AND. WNTVO ) THEN -* -* Perform bidiagonal QR iteration, if desired, computing -* left singular vectors in U and computing right singular -* vectors in A -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'L', M, NCVT, NRU, 0, S, WORK( IE ), A, LDA, - $ U, LDU, DUM, 1, WORK( IWORK ), INFO ) - ELSE -* -* Perform bidiagonal QR iteration, if desired, computing -* left singular vectors in A and computing right singular -* vectors in VT -* (Workspace: need BDSPAC) -* - CALL DBDSQR( 'L', M, NCVT, NRU, 0, S, WORK( IE ), VT, - $ LDVT, A, LDA, DUM, 1, WORK( IWORK ), INFO ) - END IF -* - END IF -* - END IF -* -* If DBDSQR failed to converge, copy unconverged superdiagonals -* to WORK( 2:MINMN ) -* - IF( INFO.NE.0 ) THEN - IF( IE.GT.2 ) THEN - DO 50 I = 1, MINMN - 1 - WORK( I+1 ) = WORK( I+IE-1 ) - 50 CONTINUE - END IF - IF( IE.LT.2 ) THEN - DO 60 I = MINMN - 1, 1, -1 - WORK( I+1 ) = WORK( I+IE-1 ) - 60 CONTINUE - END IF - END IF -* -* Undo scaling if necessary -* - IF( ISCL.EQ.1 ) THEN - IF( ANRM.GT.BIGNUM ) - $ CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN, - $ IERR ) - IF( INFO.NE.0 .AND. ANRM.GT.BIGNUM ) - $ CALL DLASCL( 'G', 0, 0, BIGNUM, ANRM, MINMN-1, 1, WORK( 2 ), - $ MINMN, IERR ) - IF( ANRM.LT.SMLNUM ) - $ CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN, - $ IERR ) - IF( INFO.NE.0 .AND. ANRM.LT.SMLNUM ) - $ CALL DLASCL( 'G', 0, 0, SMLNUM, ANRM, MINMN-1, 1, WORK( 2 ), - $ MINMN, IERR ) - END IF -* -* Return optimal workspace in WORK(1) -* - WORK( 1 ) = MAXWRK -* - RETURN -* -* End of DGESVD -* - END diff --git a/lib/linalg/fortran/dgetf2.f b/lib/linalg/fortran/dgetf2.f deleted file mode 100644 index fc1587842e..0000000000 --- a/lib/linalg/fortran/dgetf2.f +++ /dev/null @@ -1,210 +0,0 @@ -*> \brief \b DGETF2 computes the LU factorization of a general m-by-n matrix using partial pivoting with row interchanges (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGETF2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGETF2( M, N, A, LDA, IPIV, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. -* INTEGER IPIV( * ) -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGETF2 computes an LU factorization of a general m-by-n matrix A -*> using partial pivoting with row interchanges. -*> -*> The factorization has the form -*> A = P * L * U -*> where P is a permutation matrix, L is lower triangular with unit -*> diagonal elements (lower trapezoidal if m > n), and U is upper -*> triangular (upper trapezoidal if m < n). -*> -*> This is the right-looking Level 2 BLAS version of the algorithm. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the m by n matrix to be factored. -*> On exit, the factors L and U from the factorization -*> A = P*L*U; the unit diagonal elements of L are not stored. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] IPIV -*> \verbatim -*> IPIV is INTEGER array, dimension (min(M,N)) -*> The pivot indices; for 1 <= i <= min(M,N), row i of the -*> matrix was interchanged with row IPIV(i). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -k, the k-th argument had an illegal value -*> > 0: if INFO = k, U(k,k) is exactly zero. The factorization -*> has been completed, but the factor U is exactly -*> singular, and division by zero will occur if it is used -*> to solve a system of equations. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -* ===================================================================== - SUBROUTINE DGETF2( M, N, A, LDA, IPIV, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. - INTEGER IPIV( * ) - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION SFMIN - INTEGER I, J, JP -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH - INTEGER IDAMAX - EXTERNAL DLAMCH, IDAMAX -* .. -* .. External Subroutines .. - EXTERNAL DGER, DSCAL, DSWAP, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -4 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGETF2', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 ) - $ RETURN -* -* Compute machine safe minimum -* - SFMIN = DLAMCH('S') -* - DO 10 J = 1, MIN( M, N ) -* -* Find pivot and test for singularity. -* - JP = J - 1 + IDAMAX( M-J+1, A( J, J ), 1 ) - IPIV( J ) = JP - IF( A( JP, J ).NE.ZERO ) THEN -* -* Apply the interchange to columns 1:N. -* - IF( JP.NE.J ) - $ CALL DSWAP( N, A( J, 1 ), LDA, A( JP, 1 ), LDA ) -* -* Compute elements J+1:M of J-th column. -* - IF( J.LT.M ) THEN - IF( ABS(A( J, J )) .GE. SFMIN ) THEN - CALL DSCAL( M-J, ONE / A( J, J ), A( J+1, J ), 1 ) - ELSE - DO 20 I = 1, M-J - A( J+I, J ) = A( J+I, J ) / A( J, J ) - 20 CONTINUE - END IF - END IF -* - ELSE IF( INFO.EQ.0 ) THEN -* - INFO = J - END IF -* - IF( J.LT.MIN( M, N ) ) THEN -* -* Update trailing submatrix. -* - CALL DGER( M-J, N-J, -ONE, A( J+1, J ), 1, A( J, J+1 ), LDA, - $ A( J+1, J+1 ), LDA ) - END IF - 10 CONTINUE - RETURN -* -* End of DGETF2 -* - END diff --git a/lib/linalg/fortran/dgetrf.f b/lib/linalg/fortran/dgetrf.f deleted file mode 100644 index 73d0f3601a..0000000000 --- a/lib/linalg/fortran/dgetrf.f +++ /dev/null @@ -1,222 +0,0 @@ -*> \brief \b DGETRF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGETRF + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGETRF( M, N, A, LDA, IPIV, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. -* INTEGER IPIV( * ) -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGETRF computes an LU factorization of a general M-by-N matrix A -*> using partial pivoting with row interchanges. -*> -*> The factorization has the form -*> A = P * L * U -*> where P is a permutation matrix, L is lower triangular with unit -*> diagonal elements (lower trapezoidal if m > n), and U is upper -*> triangular (upper trapezoidal if m < n). -*> -*> This is the right-looking Level 3 BLAS version of the algorithm. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the M-by-N matrix to be factored. -*> On exit, the factors L and U from the factorization -*> A = P*L*U; the unit diagonal elements of L are not stored. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] IPIV -*> \verbatim -*> IPIV is INTEGER array, dimension (min(M,N)) -*> The pivot indices; for 1 <= i <= min(M,N), row i of the -*> matrix was interchanged with row IPIV(i). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, U(i,i) is exactly zero. The factorization -*> has been completed, but the factor U is exactly -*> singular, and division by zero will occur if it is used -*> to solve a system of equations. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -* ===================================================================== - SUBROUTINE DGETRF( M, N, A, LDA, IPIV, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. - INTEGER IPIV( * ) - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, IINFO, J, JB, NB -* .. -* .. External Subroutines .. - EXTERNAL DGEMM, DGETRF2, DLASWP, DTRSM, XERBLA -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -4 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGETRF', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 ) - $ RETURN -* -* Determine the block size for this environment. -* - NB = ILAENV( 1, 'DGETRF', ' ', M, N, -1, -1 ) - IF( NB.LE.1 .OR. NB.GE.MIN( M, N ) ) THEN -* -* Use unblocked code. -* - CALL DGETRF2( M, N, A, LDA, IPIV, INFO ) - ELSE -* -* Use blocked code. -* - DO 20 J = 1, MIN( M, N ), NB - JB = MIN( MIN( M, N )-J+1, NB ) -* -* Factor diagonal and subdiagonal blocks and test for exact -* singularity. -* - CALL DGETRF2( M-J+1, JB, A( J, J ), LDA, IPIV( J ), IINFO ) -* -* Adjust INFO and the pivot indices. -* - IF( INFO.EQ.0 .AND. IINFO.GT.0 ) - $ INFO = IINFO + J - 1 - DO 10 I = J, MIN( M, J+JB-1 ) - IPIV( I ) = J - 1 + IPIV( I ) - 10 CONTINUE -* -* Apply interchanges to columns 1:J-1. -* - CALL DLASWP( J-1, A, LDA, J, J+JB-1, IPIV, 1 ) -* - IF( J+JB.LE.N ) THEN -* -* Apply interchanges to columns J+JB:N. -* - CALL DLASWP( N-J-JB+1, A( 1, J+JB ), LDA, J, J+JB-1, - $ IPIV, 1 ) -* -* Compute block row of U. -* - CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Unit', JB, - $ N-J-JB+1, ONE, A( J, J ), LDA, A( J, J+JB ), - $ LDA ) - IF( J+JB.LE.M ) THEN -* -* Update trailing submatrix. -* - CALL DGEMM( 'No transpose', 'No transpose', M-J-JB+1, - $ N-J-JB+1, JB, -ONE, A( J+JB, J ), LDA, - $ A( J, J+JB ), LDA, ONE, A( J+JB, J+JB ), - $ LDA ) - END IF - END IF - 20 CONTINUE - END IF - RETURN -* -* End of DGETRF -* - END diff --git a/lib/linalg/fortran/dgetrf2.f b/lib/linalg/fortran/dgetrf2.f deleted file mode 100644 index 40af0793dd..0000000000 --- a/lib/linalg/fortran/dgetrf2.f +++ /dev/null @@ -1,269 +0,0 @@ -*> \brief \b DGETRF2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* RECURSIVE SUBROUTINE DGETRF2( M, N, A, LDA, IPIV, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. -* INTEGER IPIV( * ) -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGETRF2 computes an LU factorization of a general M-by-N matrix A -*> using partial pivoting with row interchanges. -*> -*> The factorization has the form -*> A = P * L * U -*> where P is a permutation matrix, L is lower triangular with unit -*> diagonal elements (lower trapezoidal if m > n), and U is upper -*> triangular (upper trapezoidal if m < n). -*> -*> This is the recursive version of the algorithm. It divides -*> the matrix into four submatrices: -*> -*> [ A11 | A12 ] where A11 is n1 by n1 and A22 is n2 by n2 -*> A = [ -----|----- ] with n1 = min(m,n)/2 -*> [ A21 | A22 ] n2 = n-n1 -*> -*> [ A11 ] -*> The subroutine calls itself to factor [ --- ], -*> [ A12 ] -*> [ A12 ] -*> do the swaps on [ --- ], solve A12, update A22, -*> [ A22 ] -*> -*> then calls itself to factor A22 and do the swaps on A21. -*> -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the M-by-N matrix to be factored. -*> On exit, the factors L and U from the factorization -*> A = P*L*U; the unit diagonal elements of L are not stored. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] IPIV -*> \verbatim -*> IPIV is INTEGER array, dimension (min(M,N)) -*> The pivot indices; for 1 <= i <= min(M,N), row i of the -*> matrix was interchanged with row IPIV(i). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, U(i,i) is exactly zero. The factorization -*> has been completed, but the factor U is exactly -*> singular, and division by zero will occur if it is used -*> to solve a system of equations. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -* ===================================================================== - RECURSIVE SUBROUTINE DGETRF2( M, N, A, LDA, IPIV, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. - INTEGER IPIV( * ) - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION SFMIN, TEMP - INTEGER I, IINFO, N1, N2 -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH - INTEGER IDAMAX - EXTERNAL DLAMCH, IDAMAX -* .. -* .. External Subroutines .. - EXTERNAL DGEMM, DSCAL, DLASWP, DTRSM, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -4 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGETRF2', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 ) - $ RETURN - - IF ( M.EQ.1 ) THEN -* -* Use unblocked code for one row case -* Just need to handle IPIV and INFO -* - IPIV( 1 ) = 1 - IF ( A(1,1).EQ.ZERO ) - $ INFO = 1 -* - ELSE IF( N.EQ.1 ) THEN -* -* Use unblocked code for one column case -* -* -* Compute machine safe minimum -* - SFMIN = DLAMCH('S') -* -* Find pivot and test for singularity -* - I = IDAMAX( M, A( 1, 1 ), 1 ) - IPIV( 1 ) = I - IF( A( I, 1 ).NE.ZERO ) THEN -* -* Apply the interchange -* - IF( I.NE.1 ) THEN - TEMP = A( 1, 1 ) - A( 1, 1 ) = A( I, 1 ) - A( I, 1 ) = TEMP - END IF -* -* Compute elements 2:M of the column -* - IF( ABS(A( 1, 1 )) .GE. SFMIN ) THEN - CALL DSCAL( M-1, ONE / A( 1, 1 ), A( 2, 1 ), 1 ) - ELSE - DO 10 I = 1, M-1 - A( 1+I, 1 ) = A( 1+I, 1 ) / A( 1, 1 ) - 10 CONTINUE - END IF -* - ELSE - INFO = 1 - END IF -* - ELSE -* -* Use recursive code -* - N1 = MIN( M, N ) / 2 - N2 = N-N1 -* -* [ A11 ] -* Factor [ --- ] -* [ A21 ] -* - CALL DGETRF2( M, N1, A, LDA, IPIV, IINFO ) - - IF ( INFO.EQ.0 .AND. IINFO.GT.0 ) - $ INFO = IINFO -* -* [ A12 ] -* Apply interchanges to [ --- ] -* [ A22 ] -* - CALL DLASWP( N2, A( 1, N1+1 ), LDA, 1, N1, IPIV, 1 ) -* -* Solve A12 -* - CALL DTRSM( 'L', 'L', 'N', 'U', N1, N2, ONE, A, LDA, - $ A( 1, N1+1 ), LDA ) -* -* Update A22 -* - CALL DGEMM( 'N', 'N', M-N1, N2, N1, -ONE, A( N1+1, 1 ), LDA, - $ A( 1, N1+1 ), LDA, ONE, A( N1+1, N1+1 ), LDA ) -* -* Factor A22 -* - CALL DGETRF2( M-N1, N2, A( N1+1, N1+1 ), LDA, IPIV( N1+1 ), - $ IINFO ) -* -* Adjust INFO and the pivot indices -* - IF ( INFO.EQ.0 .AND. IINFO.GT.0 ) - $ INFO = IINFO + N1 - DO 20 I = N1+1, MIN( M, N ) - IPIV( I ) = IPIV( I ) + N1 - 20 CONTINUE -* -* Apply interchanges to A21 -* - CALL DLASWP( N1, A( 1, 1 ), LDA, N1+1, MIN( M, N), IPIV, 1 ) -* - END IF - RETURN -* -* End of DGETRF2 -* - END diff --git a/lib/linalg/fortran/dgetri.f b/lib/linalg/fortran/dgetri.f deleted file mode 100644 index 92ef90c186..0000000000 --- a/lib/linalg/fortran/dgetri.f +++ /dev/null @@ -1,258 +0,0 @@ -*> \brief \b DGETRI -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGETRI + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. -* INTEGER IPIV( * ) -* DOUBLE PRECISION A( LDA, * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGETRI computes the inverse of a matrix using the LU factorization -*> computed by DGETRF. -*> -*> This method inverts U and then computes inv(A) by solving the system -*> inv(A)*L = inv(U) for inv(A). -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the factors L and U from the factorization -*> A = P*L*U as computed by DGETRF. -*> On exit, if INFO = 0, the inverse of the original matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] IPIV -*> \verbatim -*> IPIV is INTEGER array, dimension (N) -*> The pivot indices from DGETRF; for 1<=i<=N, row i of the -*> matrix was interchanged with row IPIV(i). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO=0, then WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= max(1,N). -*> For optimal performance LWORK >= N*NB, where NB is -*> the optimal blocksize returned by ILAENV. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, U(i,i) is exactly zero; the matrix is -*> singular and its inverse could not be computed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -* ===================================================================== - SUBROUTINE DGETRI( N, A, LDA, IPIV, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. - INTEGER IPIV( * ) - DOUBLE PRECISION A( LDA, * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER I, IWS, J, JB, JJ, JP, LDWORK, LWKOPT, NB, - $ NBMIN, NN -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. External Subroutines .. - EXTERNAL DGEMM, DGEMV, DSWAP, DTRSM, DTRTRI, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - NB = ILAENV( 1, 'DGETRI', ' ', N, -1, -1, -1 ) - LWKOPT = N*NB - WORK( 1 ) = LWKOPT - LQUERY = ( LWORK.EQ.-1 ) - IF( N.LT.0 ) THEN - INFO = -1 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -3 - ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN - INFO = -6 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGETRI', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* Form inv(U). If INFO > 0 from DTRTRI, then U is singular, -* and the inverse is not computed. -* - CALL DTRTRI( 'Upper', 'Non-unit', N, A, LDA, INFO ) - IF( INFO.GT.0 ) - $ RETURN -* - NBMIN = 2 - LDWORK = N - IF( NB.GT.1 .AND. NB.LT.N ) THEN - IWS = MAX( LDWORK*NB, 1 ) - IF( LWORK.LT.IWS ) THEN - NB = LWORK / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'DGETRI', ' ', N, -1, -1, -1 ) ) - END IF - ELSE - IWS = N - END IF -* -* Solve the equation inv(A)*L = inv(U) for inv(A). -* - IF( NB.LT.NBMIN .OR. NB.GE.N ) THEN -* -* Use unblocked code. -* - DO 20 J = N, 1, -1 -* -* Copy current column of L to WORK and replace with zeros. -* - DO 10 I = J + 1, N - WORK( I ) = A( I, J ) - A( I, J ) = ZERO - 10 CONTINUE -* -* Compute current column of inv(A). -* - IF( J.LT.N ) - $ CALL DGEMV( 'No transpose', N, N-J, -ONE, A( 1, J+1 ), - $ LDA, WORK( J+1 ), 1, ONE, A( 1, J ), 1 ) - 20 CONTINUE - ELSE -* -* Use blocked code. -* - NN = ( ( N-1 ) / NB )*NB + 1 - DO 50 J = NN, 1, -NB - JB = MIN( NB, N-J+1 ) -* -* Copy current block column of L to WORK and replace with -* zeros. -* - DO 40 JJ = J, J + JB - 1 - DO 30 I = JJ + 1, N - WORK( I+( JJ-J )*LDWORK ) = A( I, JJ ) - A( I, JJ ) = ZERO - 30 CONTINUE - 40 CONTINUE -* -* Compute current block column of inv(A). -* - IF( J+JB.LE.N ) - $ CALL DGEMM( 'No transpose', 'No transpose', N, JB, - $ N-J-JB+1, -ONE, A( 1, J+JB ), LDA, - $ WORK( J+JB ), LDWORK, ONE, A( 1, J ), LDA ) - CALL DTRSM( 'Right', 'Lower', 'No transpose', 'Unit', N, JB, - $ ONE, WORK( J ), LDWORK, A( 1, J ), LDA ) - 50 CONTINUE - END IF -* -* Apply column interchanges. -* - DO 60 J = N - 1, 1, -1 - JP = IPIV( J ) - IF( JP.NE.J ) - $ CALL DSWAP( N, A( 1, J ), 1, A( 1, JP ), 1 ) - 60 CONTINUE -* - WORK( 1 ) = IWS - RETURN -* -* End of DGETRI -* - END diff --git a/lib/linalg/fortran/dgetrs.f b/lib/linalg/fortran/dgetrs.f deleted file mode 100644 index d3464f685a..0000000000 --- a/lib/linalg/fortran/dgetrs.f +++ /dev/null @@ -1,222 +0,0 @@ -*> \brief \b DGETRS -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DGETRS + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DGETRS( TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER TRANS -* INTEGER INFO, LDA, LDB, N, NRHS -* .. -* .. Array Arguments .. -* INTEGER IPIV( * ) -* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGETRS solves a system of linear equations -*> A * X = B or A**T * X = B -*> with a general N-by-N matrix A using the LU factorization computed -*> by DGETRF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> Specifies the form of the system of equations: -*> = 'N': A * X = B (No transpose) -*> = 'T': A**T* X = B (Transpose) -*> = 'C': A**T* X = B (Conjugate transpose = Transpose) -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in] NRHS -*> \verbatim -*> NRHS is INTEGER -*> The number of right hand sides, i.e., the number of columns -*> of the matrix B. NRHS >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The factors L and U from the factorization A = P*L*U -*> as computed by DGETRF. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] IPIV -*> \verbatim -*> IPIV is INTEGER array, dimension (N) -*> The pivot indices from DGETRF; for 1<=i<=N, row i of the -*> matrix was interchanged with row IPIV(i). -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB,NRHS) -*> On entry, the right hand side matrix B. -*> On exit, the solution matrix X. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -* ===================================================================== - SUBROUTINE DGETRS( TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER TRANS - INTEGER INFO, LDA, LDB, N, NRHS -* .. -* .. Array Arguments .. - INTEGER IPIV( * ) - DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL NOTRAN -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL DLASWP, DTRSM, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - NOTRAN = LSAME( TRANS, 'N' ) - IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT. - $ LSAME( TRANS, 'C' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( NRHS.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -5 - ELSE IF( LDB.LT.MAX( 1, N ) ) THEN - INFO = -8 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGETRS', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 .OR. NRHS.EQ.0 ) - $ RETURN -* - IF( NOTRAN ) THEN -* -* Solve A * X = B. -* -* Apply row interchanges to the right hand sides. -* - CALL DLASWP( NRHS, B, LDB, 1, N, IPIV, 1 ) -* -* Solve L*X = B, overwriting B with X. -* - CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Unit', N, NRHS, - $ ONE, A, LDA, B, LDB ) -* -* Solve U*X = B, overwriting B with X. -* - CALL DTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N, - $ NRHS, ONE, A, LDA, B, LDB ) - ELSE -* -* Solve A**T * X = B. -* -* Solve U**T *X = B, overwriting B with X. -* - CALL DTRSM( 'Left', 'Upper', 'Transpose', 'Non-unit', N, NRHS, - $ ONE, A, LDA, B, LDB ) -* -* Solve L**T *X = B, overwriting B with X. -* - CALL DTRSM( 'Left', 'Lower', 'Transpose', 'Unit', N, NRHS, ONE, - $ A, LDA, B, LDB ) -* -* Apply row interchanges to the solution vectors. -* - CALL DLASWP( NRHS, B, LDB, 1, N, IPIV, -1 ) - END IF -* - RETURN -* -* End of DGETRS -* - END diff --git a/lib/linalg/fortran/disnan.f b/lib/linalg/fortran/disnan.f deleted file mode 100644 index e621b2589c..0000000000 --- a/lib/linalg/fortran/disnan.f +++ /dev/null @@ -1,77 +0,0 @@ -*> \brief \b DISNAN tests input for NaN. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DISNAN + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* LOGICAL FUNCTION DISNAN( DIN ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION, INTENT(IN) :: DIN -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DISNAN returns .TRUE. if its argument is NaN, and .FALSE. -*> otherwise. To be replaced by the Fortran 2003 intrinsic in the -*> future. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIN -*> \verbatim -*> DIN is DOUBLE PRECISION -*> Input to test for NaN. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - LOGICAL FUNCTION DISNAN( DIN ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION, INTENT(IN) :: DIN -* .. -* -* ===================================================================== -* -* .. External Functions .. - LOGICAL DLAISNAN - EXTERNAL DLAISNAN -* .. -* .. Executable Statements .. - DISNAN = DLAISNAN(DIN,DIN) - RETURN - END diff --git a/lib/linalg/fortran/dlabad.f b/lib/linalg/fortran/dlabad.f deleted file mode 100644 index 95b35e53b8..0000000000 --- a/lib/linalg/fortran/dlabad.f +++ /dev/null @@ -1,102 +0,0 @@ -*> \brief \b DLABAD -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLABAD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLABAD( SMALL, LARGE ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION LARGE, SMALL -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLABAD takes as input the values computed by DLAMCH for underflow and -*> overflow, and returns the square root of each of these values if the -*> log of LARGE is sufficiently large. This subroutine is intended to -*> identify machines with a large exponent range, such as the Crays, and -*> redefine the underflow and overflow limits to be the square roots of -*> the values computed by DLAMCH. This subroutine is needed because -*> DLAMCH does not compensate for poor arithmetic in the upper half of -*> the exponent range, as is found on a Cray. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in,out] SMALL -*> \verbatim -*> SMALL is DOUBLE PRECISION -*> On entry, the underflow threshold as computed by DLAMCH. -*> On exit, if LOG10(LARGE) is sufficiently large, the square -*> root of SMALL, otherwise unchanged. -*> \endverbatim -*> -*> \param[in,out] LARGE -*> \verbatim -*> LARGE is DOUBLE PRECISION -*> On entry, the overflow threshold as computed by DLAMCH. -*> On exit, if LOG10(LARGE) is sufficiently large, the square -*> root of LARGE, otherwise unchanged. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLABAD( SMALL, LARGE ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION LARGE, SMALL -* .. -* -* ===================================================================== -* -* .. Intrinsic Functions .. - INTRINSIC LOG10, SQRT -* .. -* .. Executable Statements .. -* -* If it looks like we're on a Cray, take the square root of -* SMALL and LARGE to avoid overflow and underflow problems. -* - IF( LOG10( LARGE ).GT.2000.D0 ) THEN - SMALL = SQRT( SMALL ) - LARGE = SQRT( LARGE ) - END IF -* - RETURN -* -* End of DLABAD -* - END diff --git a/lib/linalg/fortran/dlabrd.f b/lib/linalg/fortran/dlabrd.f deleted file mode 100644 index 86dfc10c7c..0000000000 --- a/lib/linalg/fortran/dlabrd.f +++ /dev/null @@ -1,378 +0,0 @@ -*> \brief \b DLABRD reduces the first nb rows and columns of a general matrix to a bidiagonal form. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLABRD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLABRD( M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX, Y, -* LDY ) -* -* .. Scalar Arguments .. -* INTEGER LDA, LDX, LDY, M, N, NB -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAUP( * ), -* $ TAUQ( * ), X( LDX, * ), Y( LDY, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLABRD reduces the first NB rows and columns of a real general -*> m by n matrix A to upper or lower bidiagonal form by an orthogonal -*> transformation Q**T * A * P, and returns the matrices X and Y which -*> are needed to apply the transformation to the unreduced part of A. -*> -*> If m >= n, A is reduced to upper bidiagonal form; if m < n, to lower -*> bidiagonal form. -*> -*> This is an auxiliary routine called by DGEBRD -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows in the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns in the matrix A. -*> \endverbatim -*> -*> \param[in] NB -*> \verbatim -*> NB is INTEGER -*> The number of leading rows and columns of A to be reduced. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the m by n general matrix to be reduced. -*> On exit, the first NB rows and columns of the matrix are -*> overwritten; the rest of the array is unchanged. -*> If m >= n, elements on and below the diagonal in the first NB -*> columns, with the array TAUQ, represent the orthogonal -*> matrix Q as a product of elementary reflectors; and -*> elements above the diagonal in the first NB rows, with the -*> array TAUP, represent the orthogonal matrix P as a product -*> of elementary reflectors. -*> If m < n, elements below the diagonal in the first NB -*> columns, with the array TAUQ, represent the orthogonal -*> matrix Q as a product of elementary reflectors, and -*> elements on and above the diagonal in the first NB rows, -*> with the array TAUP, represent the orthogonal matrix P as -*> a product of elementary reflectors. -*> See Further Details. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (NB) -*> The diagonal elements of the first NB rows and columns of -*> the reduced matrix. D(i) = A(i,i). -*> \endverbatim -*> -*> \param[out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (NB) -*> The off-diagonal elements of the first NB rows and columns of -*> the reduced matrix. -*> \endverbatim -*> -*> \param[out] TAUQ -*> \verbatim -*> TAUQ is DOUBLE PRECISION array, dimension (NB) -*> The scalar factors of the elementary reflectors which -*> represent the orthogonal matrix Q. See Further Details. -*> \endverbatim -*> -*> \param[out] TAUP -*> \verbatim -*> TAUP is DOUBLE PRECISION array, dimension (NB) -*> The scalar factors of the elementary reflectors which -*> represent the orthogonal matrix P. See Further Details. -*> \endverbatim -*> -*> \param[out] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension (LDX,NB) -*> The m-by-nb matrix X required to update the unreduced part -*> of A. -*> \endverbatim -*> -*> \param[in] LDX -*> \verbatim -*> LDX is INTEGER -*> The leading dimension of the array X. LDX >= max(1,M). -*> \endverbatim -*> -*> \param[out] Y -*> \verbatim -*> Y is DOUBLE PRECISION array, dimension (LDY,NB) -*> The n-by-nb matrix Y required to update the unreduced part -*> of A. -*> \endverbatim -*> -*> \param[in] LDY -*> \verbatim -*> LDY is INTEGER -*> The leading dimension of the array Y. LDY >= max(1,N). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The matrices Q and P are represented as products of elementary -*> reflectors: -*> -*> Q = H(1) H(2) . . . H(nb) and P = G(1) G(2) . . . G(nb) -*> -*> Each H(i) and G(i) has the form: -*> -*> H(i) = I - tauq * v * v**T and G(i) = I - taup * u * u**T -*> -*> where tauq and taup are real scalars, and v and u are real vectors. -*> -*> If m >= n, v(1:i-1) = 0, v(i) = 1, and v(i:m) is stored on exit in -*> A(i:m,i); u(1:i) = 0, u(i+1) = 1, and u(i+1:n) is stored on exit in -*> A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i). -*> -*> If m < n, v(1:i) = 0, v(i+1) = 1, and v(i+1:m) is stored on exit in -*> A(i+2:m,i); u(1:i-1) = 0, u(i) = 1, and u(i:n) is stored on exit in -*> A(i,i+1:n); tauq is stored in TAUQ(i) and taup in TAUP(i). -*> -*> The elements of the vectors v and u together form the m-by-nb matrix -*> V and the nb-by-n matrix U**T which are needed, with X and Y, to apply -*> the transformation to the unreduced part of the matrix, using a block -*> update of the form: A := A - V*Y**T - X*U**T. -*> -*> The contents of A on exit are illustrated by the following examples -*> with nb = 2: -*> -*> m = 6 and n = 5 (m > n): m = 5 and n = 6 (m < n): -*> -*> ( 1 1 u1 u1 u1 ) ( 1 u1 u1 u1 u1 u1 ) -*> ( v1 1 1 u2 u2 ) ( 1 1 u2 u2 u2 u2 ) -*> ( v1 v2 a a a ) ( v1 1 a a a a ) -*> ( v1 v2 a a a ) ( v1 v2 a a a a ) -*> ( v1 v2 a a a ) ( v1 v2 a a a a ) -*> ( v1 v2 a a a ) -*> -*> where a denotes an element of the original matrix which is unchanged, -*> vi denotes an element of the vector defining H(i), and ui an element -*> of the vector defining G(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLABRD( M, N, NB, A, LDA, D, E, TAUQ, TAUP, X, LDX, Y, - $ LDY ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER LDA, LDX, LDY, M, N, NB -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAUP( * ), - $ TAUQ( * ), X( LDX, * ), Y( LDY, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) -* .. -* .. Local Scalars .. - INTEGER I -* .. -* .. External Subroutines .. - EXTERNAL DGEMV, DLARFG, DSCAL -* .. -* .. Intrinsic Functions .. - INTRINSIC MIN -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( M.LE.0 .OR. N.LE.0 ) - $ RETURN -* - IF( M.GE.N ) THEN -* -* Reduce to upper bidiagonal form -* - DO 10 I = 1, NB -* -* Update A(i:m,i) -* - CALL DGEMV( 'No transpose', M-I+1, I-1, -ONE, A( I, 1 ), - $ LDA, Y( I, 1 ), LDY, ONE, A( I, I ), 1 ) - CALL DGEMV( 'No transpose', M-I+1, I-1, -ONE, X( I, 1 ), - $ LDX, A( 1, I ), 1, ONE, A( I, I ), 1 ) -* -* Generate reflection Q(i) to annihilate A(i+1:m,i) -* - CALL DLARFG( M-I+1, A( I, I ), A( MIN( I+1, M ), I ), 1, - $ TAUQ( I ) ) - D( I ) = A( I, I ) - IF( I.LT.N ) THEN - A( I, I ) = ONE -* -* Compute Y(i+1:n,i) -* - CALL DGEMV( 'Transpose', M-I+1, N-I, ONE, A( I, I+1 ), - $ LDA, A( I, I ), 1, ZERO, Y( I+1, I ), 1 ) - CALL DGEMV( 'Transpose', M-I+1, I-1, ONE, A( I, 1 ), LDA, - $ A( I, I ), 1, ZERO, Y( 1, I ), 1 ) - CALL DGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ), - $ LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 ) - CALL DGEMV( 'Transpose', M-I+1, I-1, ONE, X( I, 1 ), LDX, - $ A( I, I ), 1, ZERO, Y( 1, I ), 1 ) - CALL DGEMV( 'Transpose', I-1, N-I, -ONE, A( 1, I+1 ), - $ LDA, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 ) - CALL DSCAL( N-I, TAUQ( I ), Y( I+1, I ), 1 ) -* -* Update A(i,i+1:n) -* - CALL DGEMV( 'No transpose', N-I, I, -ONE, Y( I+1, 1 ), - $ LDY, A( I, 1 ), LDA, ONE, A( I, I+1 ), LDA ) - CALL DGEMV( 'Transpose', I-1, N-I, -ONE, A( 1, I+1 ), - $ LDA, X( I, 1 ), LDX, ONE, A( I, I+1 ), LDA ) -* -* Generate reflection P(i) to annihilate A(i,i+2:n) -* - CALL DLARFG( N-I, A( I, I+1 ), A( I, MIN( I+2, N ) ), - $ LDA, TAUP( I ) ) - E( I ) = A( I, I+1 ) - A( I, I+1 ) = ONE -* -* Compute X(i+1:m,i) -* - CALL DGEMV( 'No transpose', M-I, N-I, ONE, A( I+1, I+1 ), - $ LDA, A( I, I+1 ), LDA, ZERO, X( I+1, I ), 1 ) - CALL DGEMV( 'Transpose', N-I, I, ONE, Y( I+1, 1 ), LDY, - $ A( I, I+1 ), LDA, ZERO, X( 1, I ), 1 ) - CALL DGEMV( 'No transpose', M-I, I, -ONE, A( I+1, 1 ), - $ LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 ) - CALL DGEMV( 'No transpose', I-1, N-I, ONE, A( 1, I+1 ), - $ LDA, A( I, I+1 ), LDA, ZERO, X( 1, I ), 1 ) - CALL DGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ), - $ LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 ) - CALL DSCAL( M-I, TAUP( I ), X( I+1, I ), 1 ) - END IF - 10 CONTINUE - ELSE -* -* Reduce to lower bidiagonal form -* - DO 20 I = 1, NB -* -* Update A(i,i:n) -* - CALL DGEMV( 'No transpose', N-I+1, I-1, -ONE, Y( I, 1 ), - $ LDY, A( I, 1 ), LDA, ONE, A( I, I ), LDA ) - CALL DGEMV( 'Transpose', I-1, N-I+1, -ONE, A( 1, I ), LDA, - $ X( I, 1 ), LDX, ONE, A( I, I ), LDA ) -* -* Generate reflection P(i) to annihilate A(i,i+1:n) -* - CALL DLARFG( N-I+1, A( I, I ), A( I, MIN( I+1, N ) ), LDA, - $ TAUP( I ) ) - D( I ) = A( I, I ) - IF( I.LT.M ) THEN - A( I, I ) = ONE -* -* Compute X(i+1:m,i) -* - CALL DGEMV( 'No transpose', M-I, N-I+1, ONE, A( I+1, I ), - $ LDA, A( I, I ), LDA, ZERO, X( I+1, I ), 1 ) - CALL DGEMV( 'Transpose', N-I+1, I-1, ONE, Y( I, 1 ), LDY, - $ A( I, I ), LDA, ZERO, X( 1, I ), 1 ) - CALL DGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ), - $ LDA, X( 1, I ), 1, ONE, X( I+1, I ), 1 ) - CALL DGEMV( 'No transpose', I-1, N-I+1, ONE, A( 1, I ), - $ LDA, A( I, I ), LDA, ZERO, X( 1, I ), 1 ) - CALL DGEMV( 'No transpose', M-I, I-1, -ONE, X( I+1, 1 ), - $ LDX, X( 1, I ), 1, ONE, X( I+1, I ), 1 ) - CALL DSCAL( M-I, TAUP( I ), X( I+1, I ), 1 ) -* -* Update A(i+1:m,i) -* - CALL DGEMV( 'No transpose', M-I, I-1, -ONE, A( I+1, 1 ), - $ LDA, Y( I, 1 ), LDY, ONE, A( I+1, I ), 1 ) - CALL DGEMV( 'No transpose', M-I, I, -ONE, X( I+1, 1 ), - $ LDX, A( 1, I ), 1, ONE, A( I+1, I ), 1 ) -* -* Generate reflection Q(i) to annihilate A(i+2:m,i) -* - CALL DLARFG( M-I, A( I+1, I ), A( MIN( I+2, M ), I ), 1, - $ TAUQ( I ) ) - E( I ) = A( I+1, I ) - A( I+1, I ) = ONE -* -* Compute Y(i+1:n,i) -* - CALL DGEMV( 'Transpose', M-I, N-I, ONE, A( I+1, I+1 ), - $ LDA, A( I+1, I ), 1, ZERO, Y( I+1, I ), 1 ) - CALL DGEMV( 'Transpose', M-I, I-1, ONE, A( I+1, 1 ), LDA, - $ A( I+1, I ), 1, ZERO, Y( 1, I ), 1 ) - CALL DGEMV( 'No transpose', N-I, I-1, -ONE, Y( I+1, 1 ), - $ LDY, Y( 1, I ), 1, ONE, Y( I+1, I ), 1 ) - CALL DGEMV( 'Transpose', M-I, I, ONE, X( I+1, 1 ), LDX, - $ A( I+1, I ), 1, ZERO, Y( 1, I ), 1 ) - CALL DGEMV( 'Transpose', I, N-I, -ONE, A( 1, I+1 ), LDA, - $ Y( 1, I ), 1, ONE, Y( I+1, I ), 1 ) - CALL DSCAL( N-I, TAUQ( I ), Y( I+1, I ), 1 ) - END IF - 20 CONTINUE - END IF - RETURN -* -* End of DLABRD -* - END diff --git a/lib/linalg/fortran/dlacn2.f b/lib/linalg/fortran/dlacn2.f deleted file mode 100644 index ee2e7ca266..0000000000 --- a/lib/linalg/fortran/dlacn2.f +++ /dev/null @@ -1,304 +0,0 @@ -*> \brief \b DLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matrix-vector products. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLACN2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLACN2( N, V, X, ISGN, EST, KASE, ISAVE ) -* -* .. Scalar Arguments .. -* INTEGER KASE, N -* DOUBLE PRECISION EST -* .. -* .. Array Arguments .. -* INTEGER ISGN( * ), ISAVE( 3 ) -* DOUBLE PRECISION V( * ), X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLACN2 estimates the 1-norm of a square, real matrix A. -*> Reverse communication is used for evaluating matrix-vector products. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix. N >= 1. -*> \endverbatim -*> -*> \param[out] V -*> \verbatim -*> V is DOUBLE PRECISION array, dimension (N) -*> On the final return, V = A*W, where EST = norm(V)/norm(W) -*> (W is not returned). -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension (N) -*> On an intermediate return, X should be overwritten by -*> A * X, if KASE=1, -*> A**T * X, if KASE=2, -*> and DLACN2 must be re-called with all the other parameters -*> unchanged. -*> \endverbatim -*> -*> \param[out] ISGN -*> \verbatim -*> ISGN is INTEGER array, dimension (N) -*> \endverbatim -*> -*> \param[in,out] EST -*> \verbatim -*> EST is DOUBLE PRECISION -*> On entry with KASE = 1 or 2 and ISAVE(1) = 3, EST should be -*> unchanged from the previous call to DLACN2. -*> On exit, EST is an estimate (a lower bound) for norm(A). -*> \endverbatim -*> -*> \param[in,out] KASE -*> \verbatim -*> KASE is INTEGER -*> On the initial call to DLACN2, KASE should be 0. -*> On an intermediate return, KASE will be 1 or 2, indicating -*> whether X should be overwritten by A * X or A**T * X. -*> On the final return from DLACN2, KASE will again be 0. -*> \endverbatim -*> -*> \param[in,out] ISAVE -*> \verbatim -*> ISAVE is INTEGER array, dimension (3) -*> ISAVE is used to save variables between calls to DLACN2 -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Originally named SONEST, dated March 16, 1988. -*> -*> This is a thread safe version of DLACON, which uses the array ISAVE -*> in place of a SAVE statement, as follows: -*> -*> DLACON DLACN2 -*> JUMP ISAVE(1) -*> J ISAVE(2) -*> ITER ISAVE(3) -*> \endverbatim -* -*> \par Contributors: -* ================== -*> -*> Nick Higham, University of Manchester -* -*> \par References: -* ================ -*> -*> N.J. Higham, "FORTRAN codes for estimating the one-norm of -*> a real or complex matrix, with applications to condition estimation", -*> ACM Trans. Math. Soft., vol. 14, no. 4, pp. 381-396, December 1988. -*> -* ===================================================================== - SUBROUTINE DLACN2( N, V, X, ISGN, EST, KASE, ISAVE ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER KASE, N - DOUBLE PRECISION EST -* .. -* .. Array Arguments .. - INTEGER ISGN( * ), ISAVE( 3 ) - DOUBLE PRECISION V( * ), X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - INTEGER ITMAX - PARAMETER ( ITMAX = 5 ) - DOUBLE PRECISION ZERO, ONE, TWO - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, JLAST - DOUBLE PRECISION ALTSGN, ESTOLD, TEMP, XS -* .. -* .. External Functions .. - INTEGER IDAMAX - DOUBLE PRECISION DASUM - EXTERNAL IDAMAX, DASUM -* .. -* .. External Subroutines .. - EXTERNAL DCOPY -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, NINT -* .. -* .. Executable Statements .. -* - IF( KASE.EQ.0 ) THEN - DO 10 I = 1, N - X( I ) = ONE / DBLE( N ) - 10 CONTINUE - KASE = 1 - ISAVE( 1 ) = 1 - RETURN - END IF -* - GO TO ( 20, 40, 70, 110, 140 )ISAVE( 1 ) -* -* ................ ENTRY (ISAVE( 1 ) = 1) -* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY A*X. -* - 20 CONTINUE - IF( N.EQ.1 ) THEN - V( 1 ) = X( 1 ) - EST = ABS( V( 1 ) ) -* ... QUIT - GO TO 150 - END IF - EST = DASUM( N, X, 1 ) -* - DO 30 I = 1, N - IF( X(I).GE.ZERO ) THEN - X(I) = ONE - ELSE - X(I) = -ONE - END IF - ISGN( I ) = NINT( X( I ) ) - 30 CONTINUE - KASE = 2 - ISAVE( 1 ) = 2 - RETURN -* -* ................ ENTRY (ISAVE( 1 ) = 2) -* FIRST ITERATION. X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X. -* - 40 CONTINUE - ISAVE( 2 ) = IDAMAX( N, X, 1 ) - ISAVE( 3 ) = 2 -* -* MAIN LOOP - ITERATIONS 2,3,...,ITMAX. -* - 50 CONTINUE - DO 60 I = 1, N - X( I ) = ZERO - 60 CONTINUE - X( ISAVE( 2 ) ) = ONE - KASE = 1 - ISAVE( 1 ) = 3 - RETURN -* -* ................ ENTRY (ISAVE( 1 ) = 3) -* X HAS BEEN OVERWRITTEN BY A*X. -* - 70 CONTINUE - CALL DCOPY( N, X, 1, V, 1 ) - ESTOLD = EST - EST = DASUM( N, V, 1 ) - DO 80 I = 1, N - IF( X(I).GE.ZERO ) THEN - XS = ONE - ELSE - XS = -ONE - END IF - IF( NINT( XS ).NE.ISGN( I ) ) - $ GO TO 90 - 80 CONTINUE -* REPEATED SIGN VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED. - GO TO 120 -* - 90 CONTINUE -* TEST FOR CYCLING. - IF( EST.LE.ESTOLD ) - $ GO TO 120 -* - DO 100 I = 1, N - IF( X(I).GE.ZERO ) THEN - X(I) = ONE - ELSE - X(I) = -ONE - END IF - ISGN( I ) = NINT( X( I ) ) - 100 CONTINUE - KASE = 2 - ISAVE( 1 ) = 4 - RETURN -* -* ................ ENTRY (ISAVE( 1 ) = 4) -* X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X. -* - 110 CONTINUE - JLAST = ISAVE( 2 ) - ISAVE( 2 ) = IDAMAX( N, X, 1 ) - IF( ( X( JLAST ).NE.ABS( X( ISAVE( 2 ) ) ) ) .AND. - $ ( ISAVE( 3 ).LT.ITMAX ) ) THEN - ISAVE( 3 ) = ISAVE( 3 ) + 1 - GO TO 50 - END IF -* -* ITERATION COMPLETE. FINAL STAGE. -* - 120 CONTINUE - ALTSGN = ONE - DO 130 I = 1, N - X( I ) = ALTSGN*( ONE+DBLE( I-1 ) / DBLE( N-1 ) ) - ALTSGN = -ALTSGN - 130 CONTINUE - KASE = 1 - ISAVE( 1 ) = 5 - RETURN -* -* ................ ENTRY (ISAVE( 1 ) = 5) -* X HAS BEEN OVERWRITTEN BY A*X. -* - 140 CONTINUE - TEMP = TWO*( DASUM( N, X, 1 ) / DBLE( 3*N ) ) - IF( TEMP.GT.EST ) THEN - CALL DCOPY( N, X, 1, V, 1 ) - EST = TEMP - END IF -* - 150 CONTINUE - KASE = 0 - RETURN -* -* End of DLACN2 -* - END diff --git a/lib/linalg/fortran/dlacpy.f b/lib/linalg/fortran/dlacpy.f deleted file mode 100644 index 917aa1e2a2..0000000000 --- a/lib/linalg/fortran/dlacpy.f +++ /dev/null @@ -1,153 +0,0 @@ -*> \brief \b DLACPY copies all or part of one two-dimensional array to another. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLACPY + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLACPY( UPLO, M, N, A, LDA, B, LDB ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER LDA, LDB, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLACPY copies all or part of a two-dimensional matrix A to another -*> matrix B. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies the part of the matrix A to be copied to B. -*> = 'U': Upper triangular part -*> = 'L': Lower triangular part -*> Otherwise: All of the matrix A -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The m by n matrix A. If UPLO = 'U', only the upper triangle -*> or trapezoid is accessed; if UPLO = 'L', only the lower -*> triangle or trapezoid is accessed. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB,N) -*> On exit, B = A in the locations specified by UPLO. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLACPY( UPLO, M, N, A, LDA, B, LDB ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER LDA, LDB, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, J -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Intrinsic Functions .. - INTRINSIC MIN -* .. -* .. Executable Statements .. -* - IF( LSAME( UPLO, 'U' ) ) THEN - DO 20 J = 1, N - DO 10 I = 1, MIN( J, M ) - B( I, J ) = A( I, J ) - 10 CONTINUE - 20 CONTINUE - ELSE IF( LSAME( UPLO, 'L' ) ) THEN - DO 40 J = 1, N - DO 30 I = J, M - B( I, J ) = A( I, J ) - 30 CONTINUE - 40 CONTINUE - ELSE - DO 60 J = 1, N - DO 50 I = 1, M - B( I, J ) = A( I, J ) - 50 CONTINUE - 60 CONTINUE - END IF - RETURN -* -* End of DLACPY -* - END diff --git a/lib/linalg/fortran/dladiv.f b/lib/linalg/fortran/dladiv.f deleted file mode 100644 index 4265618fed..0000000000 --- a/lib/linalg/fortran/dladiv.f +++ /dev/null @@ -1,251 +0,0 @@ -*> \brief \b DLADIV performs complex division in real arithmetic, avoiding unnecessary overflow. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLADIV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLADIV( A, B, C, D, P, Q ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION A, B, C, D, P, Q -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLADIV performs complex division in real arithmetic -*> -*> a + i*b -*> p + i*q = --------- -*> c + i*d -*> -*> The algorithm is due to Michael Baudin and Robert L. Smith -*> and can be found in the paper -*> "A Robust Complex Division in Scilab" -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] D -*> \verbatim -*> D is DOUBLE PRECISION -*> The scalars a, b, c, and d in the above expression. -*> \endverbatim -*> -*> \param[out] P -*> \verbatim -*> P is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[out] Q -*> \verbatim -*> Q is DOUBLE PRECISION -*> The scalars p and q in the above expression. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLADIV( A, B, C, D, P, Q ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION A, B, C, D, P, Q -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION BS - PARAMETER ( BS = 2.0D0 ) - DOUBLE PRECISION HALF - PARAMETER ( HALF = 0.5D0 ) - DOUBLE PRECISION TWO - PARAMETER ( TWO = 2.0D0 ) -* -* .. Local Scalars .. - DOUBLE PRECISION AA, BB, CC, DD, AB, CD, S, OV, UN, BE, EPS -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH - EXTERNAL DLAMCH -* .. -* .. External Subroutines .. - EXTERNAL DLADIV1 -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX -* .. -* .. Executable Statements .. -* - AA = A - BB = B - CC = C - DD = D - AB = MAX( ABS(A), ABS(B) ) - CD = MAX( ABS(C), ABS(D) ) - S = 1.0D0 - - OV = DLAMCH( 'Overflow threshold' ) - UN = DLAMCH( 'Safe minimum' ) - EPS = DLAMCH( 'Epsilon' ) - BE = BS / (EPS*EPS) - - IF( AB >= HALF*OV ) THEN - AA = HALF * AA - BB = HALF * BB - S = TWO * S - END IF - IF( CD >= HALF*OV ) THEN - CC = HALF * CC - DD = HALF * DD - S = HALF * S - END IF - IF( AB <= UN*BS/EPS ) THEN - AA = AA * BE - BB = BB * BE - S = S / BE - END IF - IF( CD <= UN*BS/EPS ) THEN - CC = CC * BE - DD = DD * BE - S = S * BE - END IF - IF( ABS( D ).LE.ABS( C ) ) THEN - CALL DLADIV1(AA, BB, CC, DD, P, Q) - ELSE - CALL DLADIV1(BB, AA, DD, CC, P, Q) - Q = -Q - END IF - P = P * S - Q = Q * S -* - RETURN -* -* End of DLADIV -* - END - -*> \ingroup doubleOTHERauxiliary - - - SUBROUTINE DLADIV1( A, B, C, D, P, Q ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION A, B, C, D, P, Q -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D0 ) -* -* .. Local Scalars .. - DOUBLE PRECISION R, T -* .. -* .. External Functions .. - DOUBLE PRECISION DLADIV2 - EXTERNAL DLADIV2 -* .. -* .. Executable Statements .. -* - R = D / C - T = ONE / (C + D * R) - P = DLADIV2(A, B, C, D, R, T) - A = -A - Q = DLADIV2(B, A, C, D, R, T) -* - RETURN -* -* End of DLADIV1 -* - END - -*> \ingroup doubleOTHERauxiliary - - DOUBLE PRECISION FUNCTION DLADIV2( A, B, C, D, R, T ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION A, B, C, D, R, T -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) -* -* .. Local Scalars .. - DOUBLE PRECISION BR -* .. -* .. Executable Statements .. -* - IF( R.NE.ZERO ) THEN - BR = B * R - IF( BR.NE.ZERO ) THEN - DLADIV2 = (A + BR) * T - ELSE - DLADIV2 = A * T + (B * T) * R - END IF - ELSE - DLADIV2 = (A + D * (B / C)) * T - END IF -* - RETURN -* -* End of DLADIV2 -* - END diff --git a/lib/linalg/fortran/dlae2.f b/lib/linalg/fortran/dlae2.f deleted file mode 100644 index a0e3971b41..0000000000 --- a/lib/linalg/fortran/dlae2.f +++ /dev/null @@ -1,182 +0,0 @@ -*> \brief \b DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAE2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAE2( A, B, C, RT1, RT2 ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION A, B, C, RT1, RT2 -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix -*> [ A B ] -*> [ B C ]. -*> On return, RT1 is the eigenvalue of larger absolute value, and RT2 -*> is the eigenvalue of smaller absolute value. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION -*> The (1,1) element of the 2-by-2 matrix. -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is DOUBLE PRECISION -*> The (1,2) and (2,1) elements of the 2-by-2 matrix. -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is DOUBLE PRECISION -*> The (2,2) element of the 2-by-2 matrix. -*> \endverbatim -*> -*> \param[out] RT1 -*> \verbatim -*> RT1 is DOUBLE PRECISION -*> The eigenvalue of larger absolute value. -*> \endverbatim -*> -*> \param[out] RT2 -*> \verbatim -*> RT2 is DOUBLE PRECISION -*> The eigenvalue of smaller absolute value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> RT1 is accurate to a few ulps barring over/underflow. -*> -*> RT2 may be inaccurate if there is massive cancellation in the -*> determinant A*C-B*B; higher precision or correctly rounded or -*> correctly truncated arithmetic would be needed to compute RT2 -*> accurately in all cases. -*> -*> Overflow is possible only if RT1 is within a factor of 5 of overflow. -*> Underflow is harmless if the input data is 0 or exceeds -*> underflow_threshold / macheps. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLAE2( A, B, C, RT1, RT2 ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION A, B, C, RT1, RT2 -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D0 ) - DOUBLE PRECISION TWO - PARAMETER ( TWO = 2.0D0 ) - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) - DOUBLE PRECISION HALF - PARAMETER ( HALF = 0.5D0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION AB, ACMN, ACMX, ADF, DF, RT, SM, TB -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SQRT -* .. -* .. Executable Statements .. -* -* Compute the eigenvalues -* - SM = A + C - DF = A - C - ADF = ABS( DF ) - TB = B + B - AB = ABS( TB ) - IF( ABS( A ).GT.ABS( C ) ) THEN - ACMX = A - ACMN = C - ELSE - ACMX = C - ACMN = A - END IF - IF( ADF.GT.AB ) THEN - RT = ADF*SQRT( ONE+( AB / ADF )**2 ) - ELSE IF( ADF.LT.AB ) THEN - RT = AB*SQRT( ONE+( ADF / AB )**2 ) - ELSE -* -* Includes case AB=ADF=0 -* - RT = AB*SQRT( TWO ) - END IF - IF( SM.LT.ZERO ) THEN - RT1 = HALF*( SM-RT ) -* -* Order of execution important. -* To get fully accurate smaller eigenvalue, -* next line needs to be executed in higher precision. -* - RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B - ELSE IF( SM.GT.ZERO ) THEN - RT1 = HALF*( SM+RT ) -* -* Order of execution important. -* To get fully accurate smaller eigenvalue, -* next line needs to be executed in higher precision. -* - RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B - ELSE -* -* Includes case RT1 = RT2 = 0 -* - RT1 = HALF*RT - RT2 = -HALF*RT - END IF - RETURN -* -* End of DLAE2 -* - END diff --git a/lib/linalg/fortran/dlaed0.f b/lib/linalg/fortran/dlaed0.f deleted file mode 100644 index fe3b6249e9..0000000000 --- a/lib/linalg/fortran/dlaed0.f +++ /dev/null @@ -1,431 +0,0 @@ -*> \brief \b DLAED0 used by DSTEDC. Computes all eigenvalues and corresponding eigenvectors of an unreduced symmetric tridiagonal matrix using the divide and conquer method. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAED0 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAED0( ICOMPQ, QSIZ, N, D, E, Q, LDQ, QSTORE, LDQS, -* WORK, IWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER ICOMPQ, INFO, LDQ, LDQS, N, QSIZ -* .. -* .. Array Arguments .. -* INTEGER IWORK( * ) -* DOUBLE PRECISION D( * ), E( * ), Q( LDQ, * ), QSTORE( LDQS, * ), -* $ WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAED0 computes all eigenvalues and corresponding eigenvectors of a -*> symmetric tridiagonal matrix using the divide and conquer method. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ICOMPQ -*> \verbatim -*> ICOMPQ is INTEGER -*> = 0: Compute eigenvalues only. -*> = 1: Compute eigenvectors of original dense symmetric matrix -*> also. On entry, Q contains the orthogonal matrix used -*> to reduce the original matrix to tridiagonal form. -*> = 2: Compute eigenvalues and eigenvectors of tridiagonal -*> matrix. -*> \endverbatim -*> -*> \param[in] QSIZ -*> \verbatim -*> QSIZ is INTEGER -*> The dimension of the orthogonal matrix used to reduce -*> the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The dimension of the symmetric tridiagonal matrix. N >= 0. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the main diagonal of the tridiagonal matrix. -*> On exit, its eigenvalues. -*> \endverbatim -*> -*> \param[in] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> The off-diagonal elements of the tridiagonal matrix. -*> On exit, E has been destroyed. -*> \endverbatim -*> -*> \param[in,out] Q -*> \verbatim -*> Q is DOUBLE PRECISION array, dimension (LDQ, N) -*> On entry, Q must contain an N-by-N orthogonal matrix. -*> If ICOMPQ = 0 Q is not referenced. -*> If ICOMPQ = 1 On entry, Q is a subset of the columns of the -*> orthogonal matrix used to reduce the full -*> matrix to tridiagonal form corresponding to -*> the subset of the full matrix which is being -*> decomposed at this time. -*> If ICOMPQ = 2 On entry, Q will be the identity matrix. -*> On exit, Q contains the eigenvectors of the -*> tridiagonal matrix. -*> \endverbatim -*> -*> \param[in] LDQ -*> \verbatim -*> LDQ is INTEGER -*> The leading dimension of the array Q. If eigenvectors are -*> desired, then LDQ >= max(1,N). In any case, LDQ >= 1. -*> \endverbatim -*> -*> \param[out] QSTORE -*> \verbatim -*> QSTORE is DOUBLE PRECISION array, dimension (LDQS, N) -*> Referenced only when ICOMPQ = 1. Used to store parts of -*> the eigenvector matrix when the updating matrix multiplies -*> take place. -*> \endverbatim -*> -*> \param[in] LDQS -*> \verbatim -*> LDQS is INTEGER -*> The leading dimension of the array QSTORE. If ICOMPQ = 1, -*> then LDQS >= max(1,N). In any case, LDQS >= 1. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, -*> If ICOMPQ = 0 or 1, the dimension of WORK must be at least -*> 1 + 3*N + 2*N*lg N + 3*N**2 -*> ( lg( N ) = smallest integer k -*> such that 2^k >= N ) -*> If ICOMPQ = 2, the dimension of WORK must be at least -*> 4*N + N**2. -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, -*> If ICOMPQ = 0 or 1, the dimension of IWORK must be at least -*> 6 + 6*N + 5*N*lg N. -*> ( lg( N ) = smallest integer k -*> such that 2^k >= N ) -*> If ICOMPQ = 2, the dimension of IWORK must be at least -*> 3 + 5*N. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: The algorithm failed to compute an eigenvalue while -*> working on the submatrix lying in rows and columns -*> INFO/(N+1) through mod(INFO,N+1). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Jeff Rutter, Computer Science Division, University of California -*> at Berkeley, USA -* -* ===================================================================== - SUBROUTINE DLAED0( ICOMPQ, QSIZ, N, D, E, Q, LDQ, QSTORE, LDQS, - $ WORK, IWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER ICOMPQ, INFO, LDQ, LDQS, N, QSIZ -* .. -* .. Array Arguments .. - INTEGER IWORK( * ) - DOUBLE PRECISION D( * ), E( * ), Q( LDQ, * ), QSTORE( LDQS, * ), - $ WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE, TWO - PARAMETER ( ZERO = 0.D0, ONE = 1.D0, TWO = 2.D0 ) -* .. -* .. Local Scalars .. - INTEGER CURLVL, CURPRB, CURR, I, IGIVCL, IGIVNM, - $ IGIVPT, INDXQ, IPERM, IPRMPT, IQ, IQPTR, IWREM, - $ J, K, LGN, MATSIZ, MSD2, SMLSIZ, SMM1, SPM1, - $ SPM2, SUBMAT, SUBPBS, TLVLS - DOUBLE PRECISION TEMP -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DGEMM, DLACPY, DLAED1, DLAED7, DSTEQR, - $ XERBLA -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, INT, LOG, MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( ICOMPQ.LT.0 .OR. ICOMPQ.GT.2 ) THEN - INFO = -1 - ELSE IF( ( ICOMPQ.EQ.1 ) .AND. ( QSIZ.LT.MAX( 0, N ) ) ) THEN - INFO = -2 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( LDQ.LT.MAX( 1, N ) ) THEN - INFO = -7 - ELSE IF( LDQS.LT.MAX( 1, N ) ) THEN - INFO = -9 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLAED0', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - SMLSIZ = ILAENV( 9, 'DLAED0', ' ', 0, 0, 0, 0 ) -* -* Determine the size and placement of the submatrices, and save in -* the leading elements of IWORK. -* - IWORK( 1 ) = N - SUBPBS = 1 - TLVLS = 0 - 10 CONTINUE - IF( IWORK( SUBPBS ).GT.SMLSIZ ) THEN - DO 20 J = SUBPBS, 1, -1 - IWORK( 2*J ) = ( IWORK( J )+1 ) / 2 - IWORK( 2*J-1 ) = IWORK( J ) / 2 - 20 CONTINUE - TLVLS = TLVLS + 1 - SUBPBS = 2*SUBPBS - GO TO 10 - END IF - DO 30 J = 2, SUBPBS - IWORK( J ) = IWORK( J ) + IWORK( J-1 ) - 30 CONTINUE -* -* Divide the matrix into SUBPBS submatrices of size at most SMLSIZ+1 -* using rank-1 modifications (cuts). -* - SPM1 = SUBPBS - 1 - DO 40 I = 1, SPM1 - SUBMAT = IWORK( I ) + 1 - SMM1 = SUBMAT - 1 - D( SMM1 ) = D( SMM1 ) - ABS( E( SMM1 ) ) - D( SUBMAT ) = D( SUBMAT ) - ABS( E( SMM1 ) ) - 40 CONTINUE -* - INDXQ = 4*N + 3 - IF( ICOMPQ.NE.2 ) THEN -* -* Set up workspaces for eigenvalues only/accumulate new vectors -* routine -* - TEMP = LOG( DBLE( N ) ) / LOG( TWO ) - LGN = INT( TEMP ) - IF( 2**LGN.LT.N ) - $ LGN = LGN + 1 - IF( 2**LGN.LT.N ) - $ LGN = LGN + 1 - IPRMPT = INDXQ + N + 1 - IPERM = IPRMPT + N*LGN - IQPTR = IPERM + N*LGN - IGIVPT = IQPTR + N + 2 - IGIVCL = IGIVPT + N*LGN -* - IGIVNM = 1 - IQ = IGIVNM + 2*N*LGN - IWREM = IQ + N**2 + 1 -* -* Initialize pointers -* - DO 50 I = 0, SUBPBS - IWORK( IPRMPT+I ) = 1 - IWORK( IGIVPT+I ) = 1 - 50 CONTINUE - IWORK( IQPTR ) = 1 - END IF -* -* Solve each submatrix eigenproblem at the bottom of the divide and -* conquer tree. -* - CURR = 0 - DO 70 I = 0, SPM1 - IF( I.EQ.0 ) THEN - SUBMAT = 1 - MATSIZ = IWORK( 1 ) - ELSE - SUBMAT = IWORK( I ) + 1 - MATSIZ = IWORK( I+1 ) - IWORK( I ) - END IF - IF( ICOMPQ.EQ.2 ) THEN - CALL DSTEQR( 'I', MATSIZ, D( SUBMAT ), E( SUBMAT ), - $ Q( SUBMAT, SUBMAT ), LDQ, WORK, INFO ) - IF( INFO.NE.0 ) - $ GO TO 130 - ELSE - CALL DSTEQR( 'I', MATSIZ, D( SUBMAT ), E( SUBMAT ), - $ WORK( IQ-1+IWORK( IQPTR+CURR ) ), MATSIZ, WORK, - $ INFO ) - IF( INFO.NE.0 ) - $ GO TO 130 - IF( ICOMPQ.EQ.1 ) THEN - CALL DGEMM( 'N', 'N', QSIZ, MATSIZ, MATSIZ, ONE, - $ Q( 1, SUBMAT ), LDQ, WORK( IQ-1+IWORK( IQPTR+ - $ CURR ) ), MATSIZ, ZERO, QSTORE( 1, SUBMAT ), - $ LDQS ) - END IF - IWORK( IQPTR+CURR+1 ) = IWORK( IQPTR+CURR ) + MATSIZ**2 - CURR = CURR + 1 - END IF - K = 1 - DO 60 J = SUBMAT, IWORK( I+1 ) - IWORK( INDXQ+J ) = K - K = K + 1 - 60 CONTINUE - 70 CONTINUE -* -* Successively merge eigensystems of adjacent submatrices -* into eigensystem for the corresponding larger matrix. -* -* while ( SUBPBS > 1 ) -* - CURLVL = 1 - 80 CONTINUE - IF( SUBPBS.GT.1 ) THEN - SPM2 = SUBPBS - 2 - DO 90 I = 0, SPM2, 2 - IF( I.EQ.0 ) THEN - SUBMAT = 1 - MATSIZ = IWORK( 2 ) - MSD2 = IWORK( 1 ) - CURPRB = 0 - ELSE - SUBMAT = IWORK( I ) + 1 - MATSIZ = IWORK( I+2 ) - IWORK( I ) - MSD2 = MATSIZ / 2 - CURPRB = CURPRB + 1 - END IF -* -* Merge lower order eigensystems (of size MSD2 and MATSIZ - MSD2) -* into an eigensystem of size MATSIZ. -* DLAED1 is used only for the full eigensystem of a tridiagonal -* matrix. -* DLAED7 handles the cases in which eigenvalues only or eigenvalues -* and eigenvectors of a full symmetric matrix (which was reduced to -* tridiagonal form) are desired. -* - IF( ICOMPQ.EQ.2 ) THEN - CALL DLAED1( MATSIZ, D( SUBMAT ), Q( SUBMAT, SUBMAT ), - $ LDQ, IWORK( INDXQ+SUBMAT ), - $ E( SUBMAT+MSD2-1 ), MSD2, WORK, - $ IWORK( SUBPBS+1 ), INFO ) - ELSE - CALL DLAED7( ICOMPQ, MATSIZ, QSIZ, TLVLS, CURLVL, CURPRB, - $ D( SUBMAT ), QSTORE( 1, SUBMAT ), LDQS, - $ IWORK( INDXQ+SUBMAT ), E( SUBMAT+MSD2-1 ), - $ MSD2, WORK( IQ ), IWORK( IQPTR ), - $ IWORK( IPRMPT ), IWORK( IPERM ), - $ IWORK( IGIVPT ), IWORK( IGIVCL ), - $ WORK( IGIVNM ), WORK( IWREM ), - $ IWORK( SUBPBS+1 ), INFO ) - END IF - IF( INFO.NE.0 ) - $ GO TO 130 - IWORK( I / 2+1 ) = IWORK( I+2 ) - 90 CONTINUE - SUBPBS = SUBPBS / 2 - CURLVL = CURLVL + 1 - GO TO 80 - END IF -* -* end while -* -* Re-merge the eigenvalues/vectors which were deflated at the final -* merge step. -* - IF( ICOMPQ.EQ.1 ) THEN - DO 100 I = 1, N - J = IWORK( INDXQ+I ) - WORK( I ) = D( J ) - CALL DCOPY( QSIZ, QSTORE( 1, J ), 1, Q( 1, I ), 1 ) - 100 CONTINUE - CALL DCOPY( N, WORK, 1, D, 1 ) - ELSE IF( ICOMPQ.EQ.2 ) THEN - DO 110 I = 1, N - J = IWORK( INDXQ+I ) - WORK( I ) = D( J ) - CALL DCOPY( N, Q( 1, J ), 1, WORK( N*I+1 ), 1 ) - 110 CONTINUE - CALL DCOPY( N, WORK, 1, D, 1 ) - CALL DLACPY( 'A', N, N, WORK( N+1 ), N, Q, LDQ ) - ELSE - DO 120 I = 1, N - J = IWORK( INDXQ+I ) - WORK( I ) = D( J ) - 120 CONTINUE - CALL DCOPY( N, WORK, 1, D, 1 ) - END IF - GO TO 140 -* - 130 CONTINUE - INFO = SUBMAT*( N+1 ) + SUBMAT + MATSIZ - 1 -* - 140 CONTINUE - RETURN -* -* End of DLAED0 -* - END diff --git a/lib/linalg/fortran/dlaed1.f b/lib/linalg/fortran/dlaed1.f deleted file mode 100644 index 3718139c14..0000000000 --- a/lib/linalg/fortran/dlaed1.f +++ /dev/null @@ -1,271 +0,0 @@ -*> \brief \b DLAED1 used by DSTEDC. Computes the updated eigensystem of a diagonal matrix after modification by a rank-one symmetric matrix. Used when the original matrix is tridiagonal. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAED1 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAED1( N, D, Q, LDQ, INDXQ, RHO, CUTPNT, WORK, IWORK, -* INFO ) -* -* .. Scalar Arguments .. -* INTEGER CUTPNT, INFO, LDQ, N -* DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. -* INTEGER INDXQ( * ), IWORK( * ) -* DOUBLE PRECISION D( * ), Q( LDQ, * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAED1 computes the updated eigensystem of a diagonal -*> matrix after modification by a rank-one symmetric matrix. This -*> routine is used only for the eigenproblem which requires all -*> eigenvalues and eigenvectors of a tridiagonal matrix. DLAED7 handles -*> the case in which eigenvalues only or eigenvalues and eigenvectors -*> of a full symmetric matrix (which was reduced to tridiagonal form) -*> are desired. -*> -*> T = Q(in) ( D(in) + RHO * Z*Z**T ) Q**T(in) = Q(out) * D(out) * Q**T(out) -*> -*> where Z = Q**T*u, u is a vector of length N with ones in the -*> CUTPNT and CUTPNT + 1 th elements and zeros elsewhere. -*> -*> The eigenvectors of the original matrix are stored in Q, and the -*> eigenvalues are in D. The algorithm consists of three stages: -*> -*> The first stage consists of deflating the size of the problem -*> when there are multiple eigenvalues or if there is a zero in -*> the Z vector. For each such occurrence the dimension of the -*> secular equation problem is reduced by one. This stage is -*> performed by the routine DLAED2. -*> -*> The second stage consists of calculating the updated -*> eigenvalues. This is done by finding the roots of the secular -*> equation via the routine DLAED4 (as called by DLAED3). -*> This routine also calculates the eigenvectors of the current -*> problem. -*> -*> The final stage consists of computing the updated eigenvectors -*> directly using the updated eigenvalues. The eigenvectors for -*> the current problem are multiplied with the eigenvectors from -*> the overall problem. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The dimension of the symmetric tridiagonal matrix. N >= 0. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the eigenvalues of the rank-1-perturbed matrix. -*> On exit, the eigenvalues of the repaired matrix. -*> \endverbatim -*> -*> \param[in,out] Q -*> \verbatim -*> Q is DOUBLE PRECISION array, dimension (LDQ,N) -*> On entry, the eigenvectors of the rank-1-perturbed matrix. -*> On exit, the eigenvectors of the repaired tridiagonal matrix. -*> \endverbatim -*> -*> \param[in] LDQ -*> \verbatim -*> LDQ is INTEGER -*> The leading dimension of the array Q. LDQ >= max(1,N). -*> \endverbatim -*> -*> \param[in,out] INDXQ -*> \verbatim -*> INDXQ is INTEGER array, dimension (N) -*> On entry, the permutation which separately sorts the two -*> subproblems in D into ascending order. -*> On exit, the permutation which will reintegrate the -*> subproblems back into sorted order, -*> i.e. D( INDXQ( I = 1, N ) ) will be in ascending order. -*> \endverbatim -*> -*> \param[in] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> The subdiagonal entry used to create the rank-1 modification. -*> \endverbatim -*> -*> \param[in] CUTPNT -*> \verbatim -*> CUTPNT is INTEGER -*> The location of the last eigenvalue in the leading sub-matrix. -*> min(1,N) <= CUTPNT <= N/2. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (4*N + N**2) -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension (4*N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: if INFO = 1, an eigenvalue did not converge -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Jeff Rutter, Computer Science Division, University of California -*> at Berkeley, USA \n -*> Modified by Francoise Tisseur, University of Tennessee -*> -* ===================================================================== - SUBROUTINE DLAED1( N, D, Q, LDQ, INDXQ, RHO, CUTPNT, WORK, IWORK, - $ INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER CUTPNT, INFO, LDQ, N - DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. - INTEGER INDXQ( * ), IWORK( * ) - DOUBLE PRECISION D( * ), Q( LDQ, * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER COLTYP, I, IDLMDA, INDX, INDXC, INDXP, IQ2, IS, - $ IW, IZ, K, N1, N2, ZPP1 -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DLAED2, DLAED3, DLAMRG, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( N.LT.0 ) THEN - INFO = -1 - ELSE IF( LDQ.LT.MAX( 1, N ) ) THEN - INFO = -4 - ELSE IF( MIN( 1, N / 2 ).GT.CUTPNT .OR. ( N / 2 ).LT.CUTPNT ) THEN - INFO = -7 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLAED1', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* The following values are integer pointers which indicate -* the portion of the workspace -* used by a particular array in DLAED2 and DLAED3. -* - IZ = 1 - IDLMDA = IZ + N - IW = IDLMDA + N - IQ2 = IW + N -* - INDX = 1 - INDXC = INDX + N - COLTYP = INDXC + N - INDXP = COLTYP + N -* -* -* Form the z-vector which consists of the last row of Q_1 and the -* first row of Q_2. -* - CALL DCOPY( CUTPNT, Q( CUTPNT, 1 ), LDQ, WORK( IZ ), 1 ) - ZPP1 = CUTPNT + 1 - CALL DCOPY( N-CUTPNT, Q( ZPP1, ZPP1 ), LDQ, WORK( IZ+CUTPNT ), 1 ) -* -* Deflate eigenvalues. -* - CALL DLAED2( K, N, CUTPNT, D, Q, LDQ, INDXQ, RHO, WORK( IZ ), - $ WORK( IDLMDA ), WORK( IW ), WORK( IQ2 ), - $ IWORK( INDX ), IWORK( INDXC ), IWORK( INDXP ), - $ IWORK( COLTYP ), INFO ) -* - IF( INFO.NE.0 ) - $ GO TO 20 -* -* Solve Secular Equation. -* - IF( K.NE.0 ) THEN - IS = ( IWORK( COLTYP )+IWORK( COLTYP+1 ) )*CUTPNT + - $ ( IWORK( COLTYP+1 )+IWORK( COLTYP+2 ) )*( N-CUTPNT ) + IQ2 - CALL DLAED3( K, N, CUTPNT, D, Q, LDQ, RHO, WORK( IDLMDA ), - $ WORK( IQ2 ), IWORK( INDXC ), IWORK( COLTYP ), - $ WORK( IW ), WORK( IS ), INFO ) - IF( INFO.NE.0 ) - $ GO TO 20 -* -* Prepare the INDXQ sorting permutation. -* - N1 = K - N2 = N - K - CALL DLAMRG( N1, N2, D, 1, -1, INDXQ ) - ELSE - DO 10 I = 1, N - INDXQ( I ) = I - 10 CONTINUE - END IF -* - 20 CONTINUE - RETURN -* -* End of DLAED1 -* - END diff --git a/lib/linalg/fortran/dlaed2.f b/lib/linalg/fortran/dlaed2.f deleted file mode 100644 index 9b1f1e0930..0000000000 --- a/lib/linalg/fortran/dlaed2.f +++ /dev/null @@ -1,536 +0,0 @@ -*> \brief \b DLAED2 used by DSTEDC. Merges eigenvalues and deflates secular equation. Used when the original matrix is tridiagonal. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAED2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAED2( K, N, N1, D, Q, LDQ, INDXQ, RHO, Z, DLAMDA, W, -* Q2, INDX, INDXC, INDXP, COLTYP, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDQ, N, N1 -* DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. -* INTEGER COLTYP( * ), INDX( * ), INDXC( * ), INDXP( * ), -* $ INDXQ( * ) -* DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), Q2( * ), -* $ W( * ), Z( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAED2 merges the two sets of eigenvalues together into a single -*> sorted set. Then it tries to deflate the size of the problem. -*> There are two ways in which deflation can occur: when two or more -*> eigenvalues are close together or if there is a tiny entry in the -*> Z vector. For each such occurrence the order of the related secular -*> equation problem is reduced by one. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[out] K -*> \verbatim -*> K is INTEGER -*> The number of non-deflated eigenvalues, and the order of the -*> related secular equation. 0 <= K <=N. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The dimension of the symmetric tridiagonal matrix. N >= 0. -*> \endverbatim -*> -*> \param[in] N1 -*> \verbatim -*> N1 is INTEGER -*> The location of the last eigenvalue in the leading sub-matrix. -*> min(1,N) <= N1 <= N/2. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, D contains the eigenvalues of the two submatrices to -*> be combined. -*> On exit, D contains the trailing (N-K) updated eigenvalues -*> (those which were deflated) sorted into increasing order. -*> \endverbatim -*> -*> \param[in,out] Q -*> \verbatim -*> Q is DOUBLE PRECISION array, dimension (LDQ, N) -*> On entry, Q contains the eigenvectors of two submatrices in -*> the two square blocks with corners at (1,1), (N1,N1) -*> and (N1+1, N1+1), (N,N). -*> On exit, Q contains the trailing (N-K) updated eigenvectors -*> (those which were deflated) in its last N-K columns. -*> \endverbatim -*> -*> \param[in] LDQ -*> \verbatim -*> LDQ is INTEGER -*> The leading dimension of the array Q. LDQ >= max(1,N). -*> \endverbatim -*> -*> \param[in,out] INDXQ -*> \verbatim -*> INDXQ is INTEGER array, dimension (N) -*> The permutation which separately sorts the two sub-problems -*> in D into ascending order. Note that elements in the second -*> half of this permutation must first have N1 added to their -*> values. Destroyed on exit. -*> \endverbatim -*> -*> \param[in,out] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> On entry, the off-diagonal element associated with the rank-1 -*> cut which originally split the two submatrices which are now -*> being recombined. -*> On exit, RHO has been modified to the value required by -*> DLAED3. -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension (N) -*> On entry, Z contains the updating vector (the last -*> row of the first sub-eigenvector matrix and the first row of -*> the second sub-eigenvector matrix). -*> On exit, the contents of Z have been destroyed by the updating -*> process. -*> \endverbatim -*> -*> \param[out] DLAMDA -*> \verbatim -*> DLAMDA is DOUBLE PRECISION array, dimension (N) -*> A copy of the first K eigenvalues which will be used by -*> DLAED3 to form the secular equation. -*> \endverbatim -*> -*> \param[out] W -*> \verbatim -*> W is DOUBLE PRECISION array, dimension (N) -*> The first k values of the final deflation-altered z-vector -*> which will be passed to DLAED3. -*> \endverbatim -*> -*> \param[out] Q2 -*> \verbatim -*> Q2 is DOUBLE PRECISION array, dimension (N1**2+(N-N1)**2) -*> A copy of the first K eigenvectors which will be used by -*> DLAED3 in a matrix multiply (DGEMM) to solve for the new -*> eigenvectors. -*> \endverbatim -*> -*> \param[out] INDX -*> \verbatim -*> INDX is INTEGER array, dimension (N) -*> The permutation used to sort the contents of DLAMDA into -*> ascending order. -*> \endverbatim -*> -*> \param[out] INDXC -*> \verbatim -*> INDXC is INTEGER array, dimension (N) -*> The permutation used to arrange the columns of the deflated -*> Q matrix into three groups: the first group contains non-zero -*> elements only at and above N1, the second contains -*> non-zero elements only below N1, and the third is dense. -*> \endverbatim -*> -*> \param[out] INDXP -*> \verbatim -*> INDXP is INTEGER array, dimension (N) -*> The permutation used to place deflated values of D at the end -*> of the array. INDXP(1:K) points to the nondeflated D-values -*> and INDXP(K+1:N) points to the deflated eigenvalues. -*> \endverbatim -*> -*> \param[out] COLTYP -*> \verbatim -*> COLTYP is INTEGER array, dimension (N) -*> During execution, a label which will indicate which of the -*> following types a column in the Q2 matrix is: -*> 1 : non-zero in the upper half only; -*> 2 : dense; -*> 3 : non-zero in the lower half only; -*> 4 : deflated. -*> On exit, COLTYP(i) is the number of columns of type i, -*> for i=1 to 4 only. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Jeff Rutter, Computer Science Division, University of California -*> at Berkeley, USA \n -*> Modified by Francoise Tisseur, University of Tennessee -*> -* ===================================================================== - SUBROUTINE DLAED2( K, N, N1, D, Q, LDQ, INDXQ, RHO, Z, DLAMDA, W, - $ Q2, INDX, INDXC, INDXP, COLTYP, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDQ, N, N1 - DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. - INTEGER COLTYP( * ), INDX( * ), INDXC( * ), INDXP( * ), - $ INDXQ( * ) - DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), Q2( * ), - $ W( * ), Z( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION MONE, ZERO, ONE, TWO, EIGHT - PARAMETER ( MONE = -1.0D0, ZERO = 0.0D0, ONE = 1.0D0, - $ TWO = 2.0D0, EIGHT = 8.0D0 ) -* .. -* .. Local Arrays .. - INTEGER CTOT( 4 ), PSM( 4 ) -* .. -* .. Local Scalars .. - INTEGER CT, I, IMAX, IQ1, IQ2, J, JMAX, JS, K2, N1P1, - $ N2, NJ, PJ - DOUBLE PRECISION C, EPS, S, T, TAU, TOL -* .. -* .. External Functions .. - INTEGER IDAMAX - DOUBLE PRECISION DLAMCH, DLAPY2 - EXTERNAL IDAMAX, DLAMCH, DLAPY2 -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DLACPY, DLAMRG, DROT, DSCAL, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDQ.LT.MAX( 1, N ) ) THEN - INFO = -6 - ELSE IF( MIN( 1, ( N / 2 ) ).GT.N1 .OR. ( N / 2 ).LT.N1 ) THEN - INFO = -3 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLAED2', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - N2 = N - N1 - N1P1 = N1 + 1 -* - IF( RHO.LT.ZERO ) THEN - CALL DSCAL( N2, MONE, Z( N1P1 ), 1 ) - END IF -* -* Normalize z so that norm(z) = 1. Since z is the concatenation of -* two normalized vectors, norm2(z) = sqrt(2). -* - T = ONE / SQRT( TWO ) - CALL DSCAL( N, T, Z, 1 ) -* -* RHO = ABS( norm(z)**2 * RHO ) -* - RHO = ABS( TWO*RHO ) -* -* Sort the eigenvalues into increasing order -* - DO 10 I = N1P1, N - INDXQ( I ) = INDXQ( I ) + N1 - 10 CONTINUE -* -* re-integrate the deflated parts from the last pass -* - DO 20 I = 1, N - DLAMDA( I ) = D( INDXQ( I ) ) - 20 CONTINUE - CALL DLAMRG( N1, N2, DLAMDA, 1, 1, INDXC ) - DO 30 I = 1, N - INDX( I ) = INDXQ( INDXC( I ) ) - 30 CONTINUE -* -* Calculate the allowable deflation tolerance -* - IMAX = IDAMAX( N, Z, 1 ) - JMAX = IDAMAX( N, D, 1 ) - EPS = DLAMCH( 'Epsilon' ) - TOL = EIGHT*EPS*MAX( ABS( D( JMAX ) ), ABS( Z( IMAX ) ) ) -* -* If the rank-1 modifier is small enough, no more needs to be done -* except to reorganize Q so that its columns correspond with the -* elements in D. -* - IF( RHO*ABS( Z( IMAX ) ).LE.TOL ) THEN - K = 0 - IQ2 = 1 - DO 40 J = 1, N - I = INDX( J ) - CALL DCOPY( N, Q( 1, I ), 1, Q2( IQ2 ), 1 ) - DLAMDA( J ) = D( I ) - IQ2 = IQ2 + N - 40 CONTINUE - CALL DLACPY( 'A', N, N, Q2, N, Q, LDQ ) - CALL DCOPY( N, DLAMDA, 1, D, 1 ) - GO TO 190 - END IF -* -* If there are multiple eigenvalues then the problem deflates. Here -* the number of equal eigenvalues are found. As each equal -* eigenvalue is found, an elementary reflector is computed to rotate -* the corresponding eigensubspace so that the corresponding -* components of Z are zero in this new basis. -* - DO 50 I = 1, N1 - COLTYP( I ) = 1 - 50 CONTINUE - DO 60 I = N1P1, N - COLTYP( I ) = 3 - 60 CONTINUE -* -* - K = 0 - K2 = N + 1 - DO 70 J = 1, N - NJ = INDX( J ) - IF( RHO*ABS( Z( NJ ) ).LE.TOL ) THEN -* -* Deflate due to small z component. -* - K2 = K2 - 1 - COLTYP( NJ ) = 4 - INDXP( K2 ) = NJ - IF( J.EQ.N ) - $ GO TO 100 - ELSE - PJ = NJ - GO TO 80 - END IF - 70 CONTINUE - 80 CONTINUE - J = J + 1 - NJ = INDX( J ) - IF( J.GT.N ) - $ GO TO 100 - IF( RHO*ABS( Z( NJ ) ).LE.TOL ) THEN -* -* Deflate due to small z component. -* - K2 = K2 - 1 - COLTYP( NJ ) = 4 - INDXP( K2 ) = NJ - ELSE -* -* Check if eigenvalues are close enough to allow deflation. -* - S = Z( PJ ) - C = Z( NJ ) -* -* Find sqrt(a**2+b**2) without overflow or -* destructive underflow. -* - TAU = DLAPY2( C, S ) - T = D( NJ ) - D( PJ ) - C = C / TAU - S = -S / TAU - IF( ABS( T*C*S ).LE.TOL ) THEN -* -* Deflation is possible. -* - Z( NJ ) = TAU - Z( PJ ) = ZERO - IF( COLTYP( NJ ).NE.COLTYP( PJ ) ) - $ COLTYP( NJ ) = 2 - COLTYP( PJ ) = 4 - CALL DROT( N, Q( 1, PJ ), 1, Q( 1, NJ ), 1, C, S ) - T = D( PJ )*C**2 + D( NJ )*S**2 - D( NJ ) = D( PJ )*S**2 + D( NJ )*C**2 - D( PJ ) = T - K2 = K2 - 1 - I = 1 - 90 CONTINUE - IF( K2+I.LE.N ) THEN - IF( D( PJ ).LT.D( INDXP( K2+I ) ) ) THEN - INDXP( K2+I-1 ) = INDXP( K2+I ) - INDXP( K2+I ) = PJ - I = I + 1 - GO TO 90 - ELSE - INDXP( K2+I-1 ) = PJ - END IF - ELSE - INDXP( K2+I-1 ) = PJ - END IF - PJ = NJ - ELSE - K = K + 1 - DLAMDA( K ) = D( PJ ) - W( K ) = Z( PJ ) - INDXP( K ) = PJ - PJ = NJ - END IF - END IF - GO TO 80 - 100 CONTINUE -* -* Record the last eigenvalue. -* - K = K + 1 - DLAMDA( K ) = D( PJ ) - W( K ) = Z( PJ ) - INDXP( K ) = PJ -* -* Count up the total number of the various types of columns, then -* form a permutation which positions the four column types into -* four uniform groups (although one or more of these groups may be -* empty). -* - DO 110 J = 1, 4 - CTOT( J ) = 0 - 110 CONTINUE - DO 120 J = 1, N - CT = COLTYP( J ) - CTOT( CT ) = CTOT( CT ) + 1 - 120 CONTINUE -* -* PSM(*) = Position in SubMatrix (of types 1 through 4) -* - PSM( 1 ) = 1 - PSM( 2 ) = 1 + CTOT( 1 ) - PSM( 3 ) = PSM( 2 ) + CTOT( 2 ) - PSM( 4 ) = PSM( 3 ) + CTOT( 3 ) - K = N - CTOT( 4 ) -* -* Fill out the INDXC array so that the permutation which it induces -* will place all type-1 columns first, all type-2 columns next, -* then all type-3's, and finally all type-4's. -* - DO 130 J = 1, N - JS = INDXP( J ) - CT = COLTYP( JS ) - INDX( PSM( CT ) ) = JS - INDXC( PSM( CT ) ) = J - PSM( CT ) = PSM( CT ) + 1 - 130 CONTINUE -* -* Sort the eigenvalues and corresponding eigenvectors into DLAMDA -* and Q2 respectively. The eigenvalues/vectors which were not -* deflated go into the first K slots of DLAMDA and Q2 respectively, -* while those which were deflated go into the last N - K slots. -* - I = 1 - IQ1 = 1 - IQ2 = 1 + ( CTOT( 1 )+CTOT( 2 ) )*N1 - DO 140 J = 1, CTOT( 1 ) - JS = INDX( I ) - CALL DCOPY( N1, Q( 1, JS ), 1, Q2( IQ1 ), 1 ) - Z( I ) = D( JS ) - I = I + 1 - IQ1 = IQ1 + N1 - 140 CONTINUE -* - DO 150 J = 1, CTOT( 2 ) - JS = INDX( I ) - CALL DCOPY( N1, Q( 1, JS ), 1, Q2( IQ1 ), 1 ) - CALL DCOPY( N2, Q( N1+1, JS ), 1, Q2( IQ2 ), 1 ) - Z( I ) = D( JS ) - I = I + 1 - IQ1 = IQ1 + N1 - IQ2 = IQ2 + N2 - 150 CONTINUE -* - DO 160 J = 1, CTOT( 3 ) - JS = INDX( I ) - CALL DCOPY( N2, Q( N1+1, JS ), 1, Q2( IQ2 ), 1 ) - Z( I ) = D( JS ) - I = I + 1 - IQ2 = IQ2 + N2 - 160 CONTINUE -* - IQ1 = IQ2 - DO 170 J = 1, CTOT( 4 ) - JS = INDX( I ) - CALL DCOPY( N, Q( 1, JS ), 1, Q2( IQ2 ), 1 ) - IQ2 = IQ2 + N - Z( I ) = D( JS ) - I = I + 1 - 170 CONTINUE -* -* The deflated eigenvalues and their corresponding vectors go back -* into the last N - K slots of D and Q respectively. -* - IF( K.LT.N ) THEN - CALL DLACPY( 'A', N, CTOT( 4 ), Q2( IQ1 ), N, - $ Q( 1, K+1 ), LDQ ) - CALL DCOPY( N-K, Z( K+1 ), 1, D( K+1 ), 1 ) - END IF -* -* Copy CTOT into COLTYP for referencing in DLAED3. -* - DO 180 J = 1, 4 - COLTYP( J ) = CTOT( J ) - 180 CONTINUE -* - 190 CONTINUE - RETURN -* -* End of DLAED2 -* - END diff --git a/lib/linalg/fortran/dlaed3.f b/lib/linalg/fortran/dlaed3.f deleted file mode 100644 index c58944e604..0000000000 --- a/lib/linalg/fortran/dlaed3.f +++ /dev/null @@ -1,350 +0,0 @@ -*> \brief \b DLAED3 used by DSTEDC. Finds the roots of the secular equation and updates the eigenvectors. Used when the original matrix is tridiagonal. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAED3 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAED3( K, N, N1, D, Q, LDQ, RHO, DLAMDA, Q2, INDX, -* CTOT, W, S, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDQ, N, N1 -* DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. -* INTEGER CTOT( * ), INDX( * ) -* DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), Q2( * ), -* $ S( * ), W( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAED3 finds the roots of the secular equation, as defined by the -*> values in D, W, and RHO, between 1 and K. It makes the -*> appropriate calls to DLAED4 and then updates the eigenvectors by -*> multiplying the matrix of eigenvectors of the pair of eigensystems -*> being combined by the matrix of eigenvectors of the K-by-K system -*> which is solved here. -*> -*> This code makes very mild assumptions about floating point -*> arithmetic. It will work on machines with a guard digit in -*> add/subtract, or on those binary machines without guard digits -*> which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. -*> It could conceivably fail on hexadecimal or decimal machines -*> without guard digits, but we know of none. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of terms in the rational function to be solved by -*> DLAED4. K >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of rows and columns in the Q matrix. -*> N >= K (deflation may result in N>K). -*> \endverbatim -*> -*> \param[in] N1 -*> \verbatim -*> N1 is INTEGER -*> The location of the last eigenvalue in the leading submatrix. -*> min(1,N) <= N1 <= N/2. -*> \endverbatim -*> -*> \param[out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> D(I) contains the updated eigenvalues for -*> 1 <= I <= K. -*> \endverbatim -*> -*> \param[out] Q -*> \verbatim -*> Q is DOUBLE PRECISION array, dimension (LDQ,N) -*> Initially the first K columns are used as workspace. -*> On output the columns 1 to K contain -*> the updated eigenvectors. -*> \endverbatim -*> -*> \param[in] LDQ -*> \verbatim -*> LDQ is INTEGER -*> The leading dimension of the array Q. LDQ >= max(1,N). -*> \endverbatim -*> -*> \param[in] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> The value of the parameter in the rank one update equation. -*> RHO >= 0 required. -*> \endverbatim -*> -*> \param[in,out] DLAMDA -*> \verbatim -*> DLAMDA is DOUBLE PRECISION array, dimension (K) -*> The first K elements of this array contain the old roots -*> of the deflated updating problem. These are the poles -*> of the secular equation. May be changed on output by -*> having lowest order bit set to zero on Cray X-MP, Cray Y-MP, -*> Cray-2, or Cray C-90, as described above. -*> \endverbatim -*> -*> \param[in] Q2 -*> \verbatim -*> Q2 is DOUBLE PRECISION array, dimension (LDQ2*N) -*> The first K columns of this matrix contain the non-deflated -*> eigenvectors for the split problem. -*> \endverbatim -*> -*> \param[in] INDX -*> \verbatim -*> INDX is INTEGER array, dimension (N) -*> The permutation used to arrange the columns of the deflated -*> Q matrix into three groups (see DLAED2). -*> The rows of the eigenvectors found by DLAED4 must be likewise -*> permuted before the matrix multiply can take place. -*> \endverbatim -*> -*> \param[in] CTOT -*> \verbatim -*> CTOT is INTEGER array, dimension (4) -*> A count of the total number of the various types of columns -*> in Q, as described in INDX. The fourth column type is any -*> column which has been deflated. -*> \endverbatim -*> -*> \param[in,out] W -*> \verbatim -*> W is DOUBLE PRECISION array, dimension (K) -*> The first K elements of this array contain the components -*> of the deflation-adjusted updating vector. Destroyed on -*> output. -*> \endverbatim -*> -*> \param[out] S -*> \verbatim -*> S is DOUBLE PRECISION array, dimension (N1 + 1)*K -*> Will contain the eigenvectors of the repaired matrix which -*> will be multiplied by the previously accumulated eigenvectors -*> to update the system. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: if INFO = 1, an eigenvalue did not converge -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Jeff Rutter, Computer Science Division, University of California -*> at Berkeley, USA \n -*> Modified by Francoise Tisseur, University of Tennessee -*> -* ===================================================================== - SUBROUTINE DLAED3( K, N, N1, D, Q, LDQ, RHO, DLAMDA, Q2, INDX, - $ CTOT, W, S, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDQ, N, N1 - DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. - INTEGER CTOT( * ), INDX( * ) - DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), Q2( * ), - $ S( * ), W( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D0, ZERO = 0.0D0 ) -* .. -* .. Local Scalars .. - INTEGER I, II, IQ2, J, N12, N2, N23 - DOUBLE PRECISION TEMP -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMC3, DNRM2 - EXTERNAL DLAMC3, DNRM2 -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DGEMM, DLACPY, DLAED4, DLASET, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, SIGN, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( K.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.K ) THEN - INFO = -2 - ELSE IF( LDQ.LT.MAX( 1, N ) ) THEN - INFO = -6 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLAED3', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( K.EQ.0 ) - $ RETURN -* -* Modify values DLAMDA(i) to make sure all DLAMDA(i)-DLAMDA(j) can -* be computed with high relative accuracy (barring over/underflow). -* This is a problem on machines without a guard digit in -* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). -* The following code replaces DLAMDA(I) by 2*DLAMDA(I)-DLAMDA(I), -* which on any of these machines zeros out the bottommost -* bit of DLAMDA(I) if it is 1; this makes the subsequent -* subtractions DLAMDA(I)-DLAMDA(J) unproblematic when cancellation -* occurs. On binary machines with a guard digit (almost all -* machines) it does not change DLAMDA(I) at all. On hexadecimal -* and decimal machines with a guard digit, it slightly -* changes the bottommost bits of DLAMDA(I). It does not account -* for hexadecimal or decimal machines without guard digits -* (we know of none). We use a subroutine call to compute -* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating -* this code. -* - DO 10 I = 1, K - DLAMDA( I ) = DLAMC3( DLAMDA( I ), DLAMDA( I ) ) - DLAMDA( I ) - 10 CONTINUE -* - DO 20 J = 1, K - CALL DLAED4( K, J, DLAMDA, W, Q( 1, J ), RHO, D( J ), INFO ) -* -* If the zero finder fails, the computation is terminated. -* - IF( INFO.NE.0 ) - $ GO TO 120 - 20 CONTINUE -* - IF( K.EQ.1 ) - $ GO TO 110 - IF( K.EQ.2 ) THEN - DO 30 J = 1, K - W( 1 ) = Q( 1, J ) - W( 2 ) = Q( 2, J ) - II = INDX( 1 ) - Q( 1, J ) = W( II ) - II = INDX( 2 ) - Q( 2, J ) = W( II ) - 30 CONTINUE - GO TO 110 - END IF -* -* Compute updated W. -* - CALL DCOPY( K, W, 1, S, 1 ) -* -* Initialize W(I) = Q(I,I) -* - CALL DCOPY( K, Q, LDQ+1, W, 1 ) - DO 60 J = 1, K - DO 40 I = 1, J - 1 - W( I ) = W( I )*( Q( I, J ) / ( DLAMDA( I )-DLAMDA( J ) ) ) - 40 CONTINUE - DO 50 I = J + 1, K - W( I ) = W( I )*( Q( I, J ) / ( DLAMDA( I )-DLAMDA( J ) ) ) - 50 CONTINUE - 60 CONTINUE - DO 70 I = 1, K - W( I ) = SIGN( SQRT( -W( I ) ), S( I ) ) - 70 CONTINUE -* -* Compute eigenvectors of the modified rank-1 modification. -* - DO 100 J = 1, K - DO 80 I = 1, K - S( I ) = W( I ) / Q( I, J ) - 80 CONTINUE - TEMP = DNRM2( K, S, 1 ) - DO 90 I = 1, K - II = INDX( I ) - Q( I, J ) = S( II ) / TEMP - 90 CONTINUE - 100 CONTINUE -* -* Compute the updated eigenvectors. -* - 110 CONTINUE -* - N2 = N - N1 - N12 = CTOT( 1 ) + CTOT( 2 ) - N23 = CTOT( 2 ) + CTOT( 3 ) -* - CALL DLACPY( 'A', N23, K, Q( CTOT( 1 )+1, 1 ), LDQ, S, N23 ) - IQ2 = N1*N12 + 1 - IF( N23.NE.0 ) THEN - CALL DGEMM( 'N', 'N', N2, K, N23, ONE, Q2( IQ2 ), N2, S, N23, - $ ZERO, Q( N1+1, 1 ), LDQ ) - ELSE - CALL DLASET( 'A', N2, K, ZERO, ZERO, Q( N1+1, 1 ), LDQ ) - END IF -* - CALL DLACPY( 'A', N12, K, Q, LDQ, S, N12 ) - IF( N12.NE.0 ) THEN - CALL DGEMM( 'N', 'N', N1, K, N12, ONE, Q2, N1, S, N12, ZERO, Q, - $ LDQ ) - ELSE - CALL DLASET( 'A', N1, K, ZERO, ZERO, Q( 1, 1 ), LDQ ) - END IF -* -* - 120 CONTINUE - RETURN -* -* End of DLAED3 -* - END diff --git a/lib/linalg/fortran/dlaed4.f b/lib/linalg/fortran/dlaed4.f deleted file mode 100644 index b51e23d850..0000000000 --- a/lib/linalg/fortran/dlaed4.f +++ /dev/null @@ -1,917 +0,0 @@ -*> \brief \b DLAED4 used by DSTEDC. Finds a single root of the secular equation. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAED4 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAED4( N, I, D, Z, DELTA, RHO, DLAM, INFO ) -* -* .. Scalar Arguments .. -* INTEGER I, INFO, N -* DOUBLE PRECISION DLAM, RHO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( * ), DELTA( * ), Z( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> This subroutine computes the I-th updated eigenvalue of a symmetric -*> rank-one modification to a diagonal matrix whose elements are -*> given in the array d, and that -*> -*> D(i) < D(j) for i < j -*> -*> and that RHO > 0. This is arranged by the calling routine, and is -*> no loss in generality. The rank-one modified system is thus -*> -*> diag( D ) + RHO * Z * Z_transpose. -*> -*> where we assume the Euclidean norm of Z is 1. -*> -*> The method consists of approximating the rational functions in the -*> secular equation by simpler interpolating rational functions. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The length of all arrays. -*> \endverbatim -*> -*> \param[in] I -*> \verbatim -*> I is INTEGER -*> The index of the eigenvalue to be computed. 1 <= I <= N. -*> \endverbatim -*> -*> \param[in] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> The original eigenvalues. It is assumed that they are in -*> order, D(I) < D(J) for I < J. -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension (N) -*> The components of the updating vector. -*> \endverbatim -*> -*> \param[out] DELTA -*> \verbatim -*> DELTA is DOUBLE PRECISION array, dimension (N) -*> If N > 2, DELTA contains (D(j) - lambda_I) in its j-th -*> component. If N = 1, then DELTA(1) = 1. If N = 2, see DLAED5 -*> for detail. The vector DELTA contains the information necessary -*> to construct the eigenvectors by DLAED3 and DLAED9. -*> \endverbatim -*> -*> \param[in] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> The scalar in the symmetric updating formula. -*> \endverbatim -*> -*> \param[out] DLAM -*> \verbatim -*> DLAM is DOUBLE PRECISION -*> The computed lambda_I, the I-th updated eigenvalue. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> > 0: if INFO = 1, the updating process failed. -*> \endverbatim -* -*> \par Internal Parameters: -* ========================= -*> -*> \verbatim -*> Logical variable ORGATI (origin-at-i?) is used for distinguishing -*> whether D(i) or D(i+1) is treated as the origin. -*> -*> ORGATI = .true. origin at i -*> ORGATI = .false. origin at i+1 -*> -*> Logical variable SWTCH3 (switch-for-3-poles?) is for noting -*> if we are working with THREE poles! -*> -*> MAXIT is the maximum number of iterations allowed for each -*> eigenvalue. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Ren-Cang Li, Computer Science Division, University of California -*> at Berkeley, USA -*> -* ===================================================================== - SUBROUTINE DLAED4( N, I, D, Z, DELTA, RHO, DLAM, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER I, INFO, N - DOUBLE PRECISION DLAM, RHO -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( * ), DELTA( * ), Z( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - INTEGER MAXIT - PARAMETER ( MAXIT = 30 ) - DOUBLE PRECISION ZERO, ONE, TWO, THREE, FOUR, EIGHT, TEN - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0, - $ THREE = 3.0D0, FOUR = 4.0D0, EIGHT = 8.0D0, - $ TEN = 10.0D0 ) -* .. -* .. Local Scalars .. - LOGICAL ORGATI, SWTCH, SWTCH3 - INTEGER II, IIM1, IIP1, IP1, ITER, J, NITER - DOUBLE PRECISION A, B, C, DEL, DLTLB, DLTUB, DPHI, DPSI, DW, - $ EPS, ERRETM, ETA, MIDPT, PHI, PREW, PSI, - $ RHOINV, TAU, TEMP, TEMP1, W -* .. -* .. Local Arrays .. - DOUBLE PRECISION ZZ( 3 ) -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH - EXTERNAL DLAMCH -* .. -* .. External Subroutines .. - EXTERNAL DLAED5, DLAED6 -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* -* Since this routine is called in an inner loop, we do no argument -* checking. -* -* Quick return for N=1 and 2. -* - INFO = 0 - IF( N.EQ.1 ) THEN -* -* Presumably, I=1 upon entry -* - DLAM = D( 1 ) + RHO*Z( 1 )*Z( 1 ) - DELTA( 1 ) = ONE - RETURN - END IF - IF( N.EQ.2 ) THEN - CALL DLAED5( I, D, Z, DELTA, RHO, DLAM ) - RETURN - END IF -* -* Compute machine epsilon -* - EPS = DLAMCH( 'Epsilon' ) - RHOINV = ONE / RHO -* -* The case I = N -* - IF( I.EQ.N ) THEN -* -* Initialize some basic variables -* - II = N - 1 - NITER = 1 -* -* Calculate initial guess -* - MIDPT = RHO / TWO -* -* If ||Z||_2 is not one, then TEMP should be set to -* RHO * ||Z||_2^2 / TWO -* - DO 10 J = 1, N - DELTA( J ) = ( D( J )-D( I ) ) - MIDPT - 10 CONTINUE -* - PSI = ZERO - DO 20 J = 1, N - 2 - PSI = PSI + Z( J )*Z( J ) / DELTA( J ) - 20 CONTINUE -* - C = RHOINV + PSI - W = C + Z( II )*Z( II ) / DELTA( II ) + - $ Z( N )*Z( N ) / DELTA( N ) -* - IF( W.LE.ZERO ) THEN - TEMP = Z( N-1 )*Z( N-1 ) / ( D( N )-D( N-1 )+RHO ) + - $ Z( N )*Z( N ) / RHO - IF( C.LE.TEMP ) THEN - TAU = RHO - ELSE - DEL = D( N ) - D( N-1 ) - A = -C*DEL + Z( N-1 )*Z( N-1 ) + Z( N )*Z( N ) - B = Z( N )*Z( N )*DEL - IF( A.LT.ZERO ) THEN - TAU = TWO*B / ( SQRT( A*A+FOUR*B*C )-A ) - ELSE - TAU = ( A+SQRT( A*A+FOUR*B*C ) ) / ( TWO*C ) - END IF - END IF -* -* It can be proved that -* D(N)+RHO/2 <= LAMBDA(N) < D(N)+TAU <= D(N)+RHO -* - DLTLB = MIDPT - DLTUB = RHO - ELSE - DEL = D( N ) - D( N-1 ) - A = -C*DEL + Z( N-1 )*Z( N-1 ) + Z( N )*Z( N ) - B = Z( N )*Z( N )*DEL - IF( A.LT.ZERO ) THEN - TAU = TWO*B / ( SQRT( A*A+FOUR*B*C )-A ) - ELSE - TAU = ( A+SQRT( A*A+FOUR*B*C ) ) / ( TWO*C ) - END IF -* -* It can be proved that -* D(N) < D(N)+TAU < LAMBDA(N) < D(N)+RHO/2 -* - DLTLB = ZERO - DLTUB = MIDPT - END IF -* - DO 30 J = 1, N - DELTA( J ) = ( D( J )-D( I ) ) - TAU - 30 CONTINUE -* -* Evaluate PSI and the derivative DPSI -* - DPSI = ZERO - PSI = ZERO - ERRETM = ZERO - DO 40 J = 1, II - TEMP = Z( J ) / DELTA( J ) - PSI = PSI + Z( J )*TEMP - DPSI = DPSI + TEMP*TEMP - ERRETM = ERRETM + PSI - 40 CONTINUE - ERRETM = ABS( ERRETM ) -* -* Evaluate PHI and the derivative DPHI -* - TEMP = Z( N ) / DELTA( N ) - PHI = Z( N )*TEMP - DPHI = TEMP*TEMP - ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV + - $ ABS( TAU )*( DPSI+DPHI ) -* - W = RHOINV + PHI + PSI -* -* Test for convergence -* - IF( ABS( W ).LE.EPS*ERRETM ) THEN - DLAM = D( I ) + TAU - GO TO 250 - END IF -* - IF( W.LE.ZERO ) THEN - DLTLB = MAX( DLTLB, TAU ) - ELSE - DLTUB = MIN( DLTUB, TAU ) - END IF -* -* Calculate the new step -* - NITER = NITER + 1 - C = W - DELTA( N-1 )*DPSI - DELTA( N )*DPHI - A = ( DELTA( N-1 )+DELTA( N ) )*W - - $ DELTA( N-1 )*DELTA( N )*( DPSI+DPHI ) - B = DELTA( N-1 )*DELTA( N )*W - IF( C.LT.ZERO ) - $ C = ABS( C ) - IF( C.EQ.ZERO ) THEN -* ETA = B/A -* ETA = RHO - TAU -* ETA = DLTUB - TAU -* -* Update proposed by Li, Ren-Cang: - ETA = -W / ( DPSI+DPHI ) - ELSE IF( A.GE.ZERO ) THEN - ETA = ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - ELSE - ETA = TWO*B / ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) - END IF -* -* Note, eta should be positive if w is negative, and -* eta should be negative otherwise. However, -* if for some reason caused by roundoff, eta*w > 0, -* we simply use one Newton step instead. This way -* will guarantee eta*w < 0. -* - IF( W*ETA.GT.ZERO ) - $ ETA = -W / ( DPSI+DPHI ) - TEMP = TAU + ETA - IF( TEMP.GT.DLTUB .OR. TEMP.LT.DLTLB ) THEN - IF( W.LT.ZERO ) THEN - ETA = ( DLTUB-TAU ) / TWO - ELSE - ETA = ( DLTLB-TAU ) / TWO - END IF - END IF - DO 50 J = 1, N - DELTA( J ) = DELTA( J ) - ETA - 50 CONTINUE -* - TAU = TAU + ETA -* -* Evaluate PSI and the derivative DPSI -* - DPSI = ZERO - PSI = ZERO - ERRETM = ZERO - DO 60 J = 1, II - TEMP = Z( J ) / DELTA( J ) - PSI = PSI + Z( J )*TEMP - DPSI = DPSI + TEMP*TEMP - ERRETM = ERRETM + PSI - 60 CONTINUE - ERRETM = ABS( ERRETM ) -* -* Evaluate PHI and the derivative DPHI -* - TEMP = Z( N ) / DELTA( N ) - PHI = Z( N )*TEMP - DPHI = TEMP*TEMP - ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV + - $ ABS( TAU )*( DPSI+DPHI ) -* - W = RHOINV + PHI + PSI -* -* Main loop to update the values of the array DELTA -* - ITER = NITER + 1 -* - DO 90 NITER = ITER, MAXIT -* -* Test for convergence -* - IF( ABS( W ).LE.EPS*ERRETM ) THEN - DLAM = D( I ) + TAU - GO TO 250 - END IF -* - IF( W.LE.ZERO ) THEN - DLTLB = MAX( DLTLB, TAU ) - ELSE - DLTUB = MIN( DLTUB, TAU ) - END IF -* -* Calculate the new step -* - C = W - DELTA( N-1 )*DPSI - DELTA( N )*DPHI - A = ( DELTA( N-1 )+DELTA( N ) )*W - - $ DELTA( N-1 )*DELTA( N )*( DPSI+DPHI ) - B = DELTA( N-1 )*DELTA( N )*W - IF( A.GE.ZERO ) THEN - ETA = ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - ELSE - ETA = TWO*B / ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) - END IF -* -* Note, eta should be positive if w is negative, and -* eta should be negative otherwise. However, -* if for some reason caused by roundoff, eta*w > 0, -* we simply use one Newton step instead. This way -* will guarantee eta*w < 0. -* - IF( W*ETA.GT.ZERO ) - $ ETA = -W / ( DPSI+DPHI ) - TEMP = TAU + ETA - IF( TEMP.GT.DLTUB .OR. TEMP.LT.DLTLB ) THEN - IF( W.LT.ZERO ) THEN - ETA = ( DLTUB-TAU ) / TWO - ELSE - ETA = ( DLTLB-TAU ) / TWO - END IF - END IF - DO 70 J = 1, N - DELTA( J ) = DELTA( J ) - ETA - 70 CONTINUE -* - TAU = TAU + ETA -* -* Evaluate PSI and the derivative DPSI -* - DPSI = ZERO - PSI = ZERO - ERRETM = ZERO - DO 80 J = 1, II - TEMP = Z( J ) / DELTA( J ) - PSI = PSI + Z( J )*TEMP - DPSI = DPSI + TEMP*TEMP - ERRETM = ERRETM + PSI - 80 CONTINUE - ERRETM = ABS( ERRETM ) -* -* Evaluate PHI and the derivative DPHI -* - TEMP = Z( N ) / DELTA( N ) - PHI = Z( N )*TEMP - DPHI = TEMP*TEMP - ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV + - $ ABS( TAU )*( DPSI+DPHI ) -* - W = RHOINV + PHI + PSI - 90 CONTINUE -* -* Return with INFO = 1, NITER = MAXIT and not converged -* - INFO = 1 - DLAM = D( I ) + TAU - GO TO 250 -* -* End for the case I = N -* - ELSE -* -* The case for I < N -* - NITER = 1 - IP1 = I + 1 -* -* Calculate initial guess -* - DEL = D( IP1 ) - D( I ) - MIDPT = DEL / TWO - DO 100 J = 1, N - DELTA( J ) = ( D( J )-D( I ) ) - MIDPT - 100 CONTINUE -* - PSI = ZERO - DO 110 J = 1, I - 1 - PSI = PSI + Z( J )*Z( J ) / DELTA( J ) - 110 CONTINUE -* - PHI = ZERO - DO 120 J = N, I + 2, -1 - PHI = PHI + Z( J )*Z( J ) / DELTA( J ) - 120 CONTINUE - C = RHOINV + PSI + PHI - W = C + Z( I )*Z( I ) / DELTA( I ) + - $ Z( IP1 )*Z( IP1 ) / DELTA( IP1 ) -* - IF( W.GT.ZERO ) THEN -* -* d(i)< the ith eigenvalue < (d(i)+d(i+1))/2 -* -* We choose d(i) as origin. -* - ORGATI = .TRUE. - A = C*DEL + Z( I )*Z( I ) + Z( IP1 )*Z( IP1 ) - B = Z( I )*Z( I )*DEL - IF( A.GT.ZERO ) THEN - TAU = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) - ELSE - TAU = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - END IF - DLTLB = ZERO - DLTUB = MIDPT - ELSE -* -* (d(i)+d(i+1))/2 <= the ith eigenvalue < d(i+1) -* -* We choose d(i+1) as origin. -* - ORGATI = .FALSE. - A = C*DEL - Z( I )*Z( I ) - Z( IP1 )*Z( IP1 ) - B = Z( IP1 )*Z( IP1 )*DEL - IF( A.LT.ZERO ) THEN - TAU = TWO*B / ( A-SQRT( ABS( A*A+FOUR*B*C ) ) ) - ELSE - TAU = -( A+SQRT( ABS( A*A+FOUR*B*C ) ) ) / ( TWO*C ) - END IF - DLTLB = -MIDPT - DLTUB = ZERO - END IF -* - IF( ORGATI ) THEN - DO 130 J = 1, N - DELTA( J ) = ( D( J )-D( I ) ) - TAU - 130 CONTINUE - ELSE - DO 140 J = 1, N - DELTA( J ) = ( D( J )-D( IP1 ) ) - TAU - 140 CONTINUE - END IF - IF( ORGATI ) THEN - II = I - ELSE - II = I + 1 - END IF - IIM1 = II - 1 - IIP1 = II + 1 -* -* Evaluate PSI and the derivative DPSI -* - DPSI = ZERO - PSI = ZERO - ERRETM = ZERO - DO 150 J = 1, IIM1 - TEMP = Z( J ) / DELTA( J ) - PSI = PSI + Z( J )*TEMP - DPSI = DPSI + TEMP*TEMP - ERRETM = ERRETM + PSI - 150 CONTINUE - ERRETM = ABS( ERRETM ) -* -* Evaluate PHI and the derivative DPHI -* - DPHI = ZERO - PHI = ZERO - DO 160 J = N, IIP1, -1 - TEMP = Z( J ) / DELTA( J ) - PHI = PHI + Z( J )*TEMP - DPHI = DPHI + TEMP*TEMP - ERRETM = ERRETM + PHI - 160 CONTINUE -* - W = RHOINV + PHI + PSI -* -* W is the value of the secular function with -* its ii-th element removed. -* - SWTCH3 = .FALSE. - IF( ORGATI ) THEN - IF( W.LT.ZERO ) - $ SWTCH3 = .TRUE. - ELSE - IF( W.GT.ZERO ) - $ SWTCH3 = .TRUE. - END IF - IF( II.EQ.1 .OR. II.EQ.N ) - $ SWTCH3 = .FALSE. -* - TEMP = Z( II ) / DELTA( II ) - DW = DPSI + DPHI + TEMP*TEMP - TEMP = Z( II )*TEMP - W = W + TEMP - ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV + - $ THREE*ABS( TEMP ) + ABS( TAU )*DW -* -* Test for convergence -* - IF( ABS( W ).LE.EPS*ERRETM ) THEN - IF( ORGATI ) THEN - DLAM = D( I ) + TAU - ELSE - DLAM = D( IP1 ) + TAU - END IF - GO TO 250 - END IF -* - IF( W.LE.ZERO ) THEN - DLTLB = MAX( DLTLB, TAU ) - ELSE - DLTUB = MIN( DLTUB, TAU ) - END IF -* -* Calculate the new step -* - NITER = NITER + 1 - IF( .NOT.SWTCH3 ) THEN - IF( ORGATI ) THEN - C = W - DELTA( IP1 )*DW - ( D( I )-D( IP1 ) )* - $ ( Z( I ) / DELTA( I ) )**2 - ELSE - C = W - DELTA( I )*DW - ( D( IP1 )-D( I ) )* - $ ( Z( IP1 ) / DELTA( IP1 ) )**2 - END IF - A = ( DELTA( I )+DELTA( IP1 ) )*W - - $ DELTA( I )*DELTA( IP1 )*DW - B = DELTA( I )*DELTA( IP1 )*W - IF( C.EQ.ZERO ) THEN - IF( A.EQ.ZERO ) THEN - IF( ORGATI ) THEN - A = Z( I )*Z( I ) + DELTA( IP1 )*DELTA( IP1 )* - $ ( DPSI+DPHI ) - ELSE - A = Z( IP1 )*Z( IP1 ) + DELTA( I )*DELTA( I )* - $ ( DPSI+DPHI ) - END IF - END IF - ETA = B / A - ELSE IF( A.LE.ZERO ) THEN - ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - ELSE - ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) - END IF - ELSE -* -* Interpolation using THREE most relevant poles -* - TEMP = RHOINV + PSI + PHI - IF( ORGATI ) THEN - TEMP1 = Z( IIM1 ) / DELTA( IIM1 ) - TEMP1 = TEMP1*TEMP1 - C = TEMP - DELTA( IIP1 )*( DPSI+DPHI ) - - $ ( D( IIM1 )-D( IIP1 ) )*TEMP1 - ZZ( 1 ) = Z( IIM1 )*Z( IIM1 ) - ZZ( 3 ) = DELTA( IIP1 )*DELTA( IIP1 )* - $ ( ( DPSI-TEMP1 )+DPHI ) - ELSE - TEMP1 = Z( IIP1 ) / DELTA( IIP1 ) - TEMP1 = TEMP1*TEMP1 - C = TEMP - DELTA( IIM1 )*( DPSI+DPHI ) - - $ ( D( IIP1 )-D( IIM1 ) )*TEMP1 - ZZ( 1 ) = DELTA( IIM1 )*DELTA( IIM1 )* - $ ( DPSI+( DPHI-TEMP1 ) ) - ZZ( 3 ) = Z( IIP1 )*Z( IIP1 ) - END IF - ZZ( 2 ) = Z( II )*Z( II ) - CALL DLAED6( NITER, ORGATI, C, DELTA( IIM1 ), ZZ, W, ETA, - $ INFO ) - IF( INFO.NE.0 ) - $ GO TO 250 - END IF -* -* Note, eta should be positive if w is negative, and -* eta should be negative otherwise. However, -* if for some reason caused by roundoff, eta*w > 0, -* we simply use one Newton step instead. This way -* will guarantee eta*w < 0. -* - IF( W*ETA.GE.ZERO ) - $ ETA = -W / DW - TEMP = TAU + ETA - IF( TEMP.GT.DLTUB .OR. TEMP.LT.DLTLB ) THEN - IF( W.LT.ZERO ) THEN - ETA = ( DLTUB-TAU ) / TWO - ELSE - ETA = ( DLTLB-TAU ) / TWO - END IF - END IF -* - PREW = W -* - DO 180 J = 1, N - DELTA( J ) = DELTA( J ) - ETA - 180 CONTINUE -* -* Evaluate PSI and the derivative DPSI -* - DPSI = ZERO - PSI = ZERO - ERRETM = ZERO - DO 190 J = 1, IIM1 - TEMP = Z( J ) / DELTA( J ) - PSI = PSI + Z( J )*TEMP - DPSI = DPSI + TEMP*TEMP - ERRETM = ERRETM + PSI - 190 CONTINUE - ERRETM = ABS( ERRETM ) -* -* Evaluate PHI and the derivative DPHI -* - DPHI = ZERO - PHI = ZERO - DO 200 J = N, IIP1, -1 - TEMP = Z( J ) / DELTA( J ) - PHI = PHI + Z( J )*TEMP - DPHI = DPHI + TEMP*TEMP - ERRETM = ERRETM + PHI - 200 CONTINUE -* - TEMP = Z( II ) / DELTA( II ) - DW = DPSI + DPHI + TEMP*TEMP - TEMP = Z( II )*TEMP - W = RHOINV + PHI + PSI + TEMP - ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV + - $ THREE*ABS( TEMP ) + ABS( TAU+ETA )*DW -* - SWTCH = .FALSE. - IF( ORGATI ) THEN - IF( -W.GT.ABS( PREW ) / TEN ) - $ SWTCH = .TRUE. - ELSE - IF( W.GT.ABS( PREW ) / TEN ) - $ SWTCH = .TRUE. - END IF -* - TAU = TAU + ETA -* -* Main loop to update the values of the array DELTA -* - ITER = NITER + 1 -* - DO 240 NITER = ITER, MAXIT -* -* Test for convergence -* - IF( ABS( W ).LE.EPS*ERRETM ) THEN - IF( ORGATI ) THEN - DLAM = D( I ) + TAU - ELSE - DLAM = D( IP1 ) + TAU - END IF - GO TO 250 - END IF -* - IF( W.LE.ZERO ) THEN - DLTLB = MAX( DLTLB, TAU ) - ELSE - DLTUB = MIN( DLTUB, TAU ) - END IF -* -* Calculate the new step -* - IF( .NOT.SWTCH3 ) THEN - IF( .NOT.SWTCH ) THEN - IF( ORGATI ) THEN - C = W - DELTA( IP1 )*DW - - $ ( D( I )-D( IP1 ) )*( Z( I ) / DELTA( I ) )**2 - ELSE - C = W - DELTA( I )*DW - ( D( IP1 )-D( I ) )* - $ ( Z( IP1 ) / DELTA( IP1 ) )**2 - END IF - ELSE - TEMP = Z( II ) / DELTA( II ) - IF( ORGATI ) THEN - DPSI = DPSI + TEMP*TEMP - ELSE - DPHI = DPHI + TEMP*TEMP - END IF - C = W - DELTA( I )*DPSI - DELTA( IP1 )*DPHI - END IF - A = ( DELTA( I )+DELTA( IP1 ) )*W - - $ DELTA( I )*DELTA( IP1 )*DW - B = DELTA( I )*DELTA( IP1 )*W - IF( C.EQ.ZERO ) THEN - IF( A.EQ.ZERO ) THEN - IF( .NOT.SWTCH ) THEN - IF( ORGATI ) THEN - A = Z( I )*Z( I ) + DELTA( IP1 )* - $ DELTA( IP1 )*( DPSI+DPHI ) - ELSE - A = Z( IP1 )*Z( IP1 ) + - $ DELTA( I )*DELTA( I )*( DPSI+DPHI ) - END IF - ELSE - A = DELTA( I )*DELTA( I )*DPSI + - $ DELTA( IP1 )*DELTA( IP1 )*DPHI - END IF - END IF - ETA = B / A - ELSE IF( A.LE.ZERO ) THEN - ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - ELSE - ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) - END IF - ELSE -* -* Interpolation using THREE most relevant poles -* - TEMP = RHOINV + PSI + PHI - IF( SWTCH ) THEN - C = TEMP - DELTA( IIM1 )*DPSI - DELTA( IIP1 )*DPHI - ZZ( 1 ) = DELTA( IIM1 )*DELTA( IIM1 )*DPSI - ZZ( 3 ) = DELTA( IIP1 )*DELTA( IIP1 )*DPHI - ELSE - IF( ORGATI ) THEN - TEMP1 = Z( IIM1 ) / DELTA( IIM1 ) - TEMP1 = TEMP1*TEMP1 - C = TEMP - DELTA( IIP1 )*( DPSI+DPHI ) - - $ ( D( IIM1 )-D( IIP1 ) )*TEMP1 - ZZ( 1 ) = Z( IIM1 )*Z( IIM1 ) - ZZ( 3 ) = DELTA( IIP1 )*DELTA( IIP1 )* - $ ( ( DPSI-TEMP1 )+DPHI ) - ELSE - TEMP1 = Z( IIP1 ) / DELTA( IIP1 ) - TEMP1 = TEMP1*TEMP1 - C = TEMP - DELTA( IIM1 )*( DPSI+DPHI ) - - $ ( D( IIP1 )-D( IIM1 ) )*TEMP1 - ZZ( 1 ) = DELTA( IIM1 )*DELTA( IIM1 )* - $ ( DPSI+( DPHI-TEMP1 ) ) - ZZ( 3 ) = Z( IIP1 )*Z( IIP1 ) - END IF - END IF - CALL DLAED6( NITER, ORGATI, C, DELTA( IIM1 ), ZZ, W, ETA, - $ INFO ) - IF( INFO.NE.0 ) - $ GO TO 250 - END IF -* -* Note, eta should be positive if w is negative, and -* eta should be negative otherwise. However, -* if for some reason caused by roundoff, eta*w > 0, -* we simply use one Newton step instead. This way -* will guarantee eta*w < 0. -* - IF( W*ETA.GE.ZERO ) - $ ETA = -W / DW - TEMP = TAU + ETA - IF( TEMP.GT.DLTUB .OR. TEMP.LT.DLTLB ) THEN - IF( W.LT.ZERO ) THEN - ETA = ( DLTUB-TAU ) / TWO - ELSE - ETA = ( DLTLB-TAU ) / TWO - END IF - END IF -* - DO 210 J = 1, N - DELTA( J ) = DELTA( J ) - ETA - 210 CONTINUE -* - TAU = TAU + ETA - PREW = W -* -* Evaluate PSI and the derivative DPSI -* - DPSI = ZERO - PSI = ZERO - ERRETM = ZERO - DO 220 J = 1, IIM1 - TEMP = Z( J ) / DELTA( J ) - PSI = PSI + Z( J )*TEMP - DPSI = DPSI + TEMP*TEMP - ERRETM = ERRETM + PSI - 220 CONTINUE - ERRETM = ABS( ERRETM ) -* -* Evaluate PHI and the derivative DPHI -* - DPHI = ZERO - PHI = ZERO - DO 230 J = N, IIP1, -1 - TEMP = Z( J ) / DELTA( J ) - PHI = PHI + Z( J )*TEMP - DPHI = DPHI + TEMP*TEMP - ERRETM = ERRETM + PHI - 230 CONTINUE -* - TEMP = Z( II ) / DELTA( II ) - DW = DPSI + DPHI + TEMP*TEMP - TEMP = Z( II )*TEMP - W = RHOINV + PHI + PSI + TEMP - ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV + - $ THREE*ABS( TEMP ) + ABS( TAU )*DW - IF( W*PREW.GT.ZERO .AND. ABS( W ).GT.ABS( PREW ) / TEN ) - $ SWTCH = .NOT.SWTCH -* - 240 CONTINUE -* -* Return with INFO = 1, NITER = MAXIT and not converged -* - INFO = 1 - IF( ORGATI ) THEN - DLAM = D( I ) + TAU - ELSE - DLAM = D( IP1 ) + TAU - END IF -* - END IF -* - 250 CONTINUE -* - RETURN -* -* End of DLAED4 -* - END diff --git a/lib/linalg/fortran/dlaed5.f b/lib/linalg/fortran/dlaed5.f deleted file mode 100644 index d9e977e6b7..0000000000 --- a/lib/linalg/fortran/dlaed5.f +++ /dev/null @@ -1,186 +0,0 @@ -*> \brief \b DLAED5 used by DSTEDC. Solves the 2-by-2 secular equation. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAED5 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAED5( I, D, Z, DELTA, RHO, DLAM ) -* -* .. Scalar Arguments .. -* INTEGER I -* DOUBLE PRECISION DLAM, RHO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( 2 ), DELTA( 2 ), Z( 2 ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> This subroutine computes the I-th eigenvalue of a symmetric rank-one -*> modification of a 2-by-2 diagonal matrix -*> -*> diag( D ) + RHO * Z * transpose(Z) . -*> -*> The diagonal elements in the array D are assumed to satisfy -*> -*> D(i) < D(j) for i < j . -*> -*> We also assume RHO > 0 and that the Euclidean norm of the vector -*> Z is one. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] I -*> \verbatim -*> I is INTEGER -*> The index of the eigenvalue to be computed. I = 1 or I = 2. -*> \endverbatim -*> -*> \param[in] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (2) -*> The original eigenvalues. We assume D(1) < D(2). -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension (2) -*> The components of the updating vector. -*> \endverbatim -*> -*> \param[out] DELTA -*> \verbatim -*> DELTA is DOUBLE PRECISION array, dimension (2) -*> The vector DELTA contains the information necessary -*> to construct the eigenvectors. -*> \endverbatim -*> -*> \param[in] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> The scalar in the symmetric updating formula. -*> \endverbatim -*> -*> \param[out] DLAM -*> \verbatim -*> DLAM is DOUBLE PRECISION -*> The computed lambda_I, the I-th updated eigenvalue. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Ren-Cang Li, Computer Science Division, University of California -*> at Berkeley, USA -*> -* ===================================================================== - SUBROUTINE DLAED5( I, D, Z, DELTA, RHO, DLAM ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER I - DOUBLE PRECISION DLAM, RHO -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( 2 ), DELTA( 2 ), Z( 2 ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE, TWO, FOUR - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0, - $ FOUR = 4.0D0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION B, C, DEL, TAU, TEMP, W -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SQRT -* .. -* .. Executable Statements .. -* - DEL = D( 2 ) - D( 1 ) - IF( I.EQ.1 ) THEN - W = ONE + TWO*RHO*( Z( 2 )*Z( 2 )-Z( 1 )*Z( 1 ) ) / DEL - IF( W.GT.ZERO ) THEN - B = DEL + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) - C = RHO*Z( 1 )*Z( 1 )*DEL -* -* B > ZERO, always -* - TAU = TWO*C / ( B+SQRT( ABS( B*B-FOUR*C ) ) ) - DLAM = D( 1 ) + TAU - DELTA( 1 ) = -Z( 1 ) / TAU - DELTA( 2 ) = Z( 2 ) / ( DEL-TAU ) - ELSE - B = -DEL + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) - C = RHO*Z( 2 )*Z( 2 )*DEL - IF( B.GT.ZERO ) THEN - TAU = -TWO*C / ( B+SQRT( B*B+FOUR*C ) ) - ELSE - TAU = ( B-SQRT( B*B+FOUR*C ) ) / TWO - END IF - DLAM = D( 2 ) + TAU - DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) - DELTA( 2 ) = -Z( 2 ) / TAU - END IF - TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) - DELTA( 1 ) = DELTA( 1 ) / TEMP - DELTA( 2 ) = DELTA( 2 ) / TEMP - ELSE -* -* Now I=2 -* - B = -DEL + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) - C = RHO*Z( 2 )*Z( 2 )*DEL - IF( B.GT.ZERO ) THEN - TAU = ( B+SQRT( B*B+FOUR*C ) ) / TWO - ELSE - TAU = TWO*C / ( -B+SQRT( B*B+FOUR*C ) ) - END IF - DLAM = D( 2 ) + TAU - DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) - DELTA( 2 ) = -Z( 2 ) / TAU - TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) - DELTA( 1 ) = DELTA( 1 ) / TEMP - DELTA( 2 ) = DELTA( 2 ) / TEMP - END IF - RETURN -* -* End of DLAED5 -* - END diff --git a/lib/linalg/fortran/dlaed6.f b/lib/linalg/fortran/dlaed6.f deleted file mode 100644 index a0c0364e56..0000000000 --- a/lib/linalg/fortran/dlaed6.f +++ /dev/null @@ -1,407 +0,0 @@ -*> \brief \b DLAED6 used by DSTEDC. Computes one Newton step in solution of the secular equation. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAED6 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAED6( KNITER, ORGATI, RHO, D, Z, FINIT, TAU, INFO ) -* -* .. Scalar Arguments .. -* LOGICAL ORGATI -* INTEGER INFO, KNITER -* DOUBLE PRECISION FINIT, RHO, TAU -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( 3 ), Z( 3 ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAED6 computes the positive or negative root (closest to the origin) -*> of -*> z(1) z(2) z(3) -*> f(x) = rho + --------- + ---------- + --------- -*> d(1)-x d(2)-x d(3)-x -*> -*> It is assumed that -*> -*> if ORGATI = .true. the root is between d(2) and d(3); -*> otherwise it is between d(1) and d(2) -*> -*> This routine will be called by DLAED4 when necessary. In most cases, -*> the root sought is the smallest in magnitude, though it might not be -*> in some extremely rare situations. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] KNITER -*> \verbatim -*> KNITER is INTEGER -*> Refer to DLAED4 for its significance. -*> \endverbatim -*> -*> \param[in] ORGATI -*> \verbatim -*> ORGATI is LOGICAL -*> If ORGATI is true, the needed root is between d(2) and -*> d(3); otherwise it is between d(1) and d(2). See -*> DLAED4 for further details. -*> \endverbatim -*> -*> \param[in] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> Refer to the equation f(x) above. -*> \endverbatim -*> -*> \param[in] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (3) -*> D satisfies d(1) < d(2) < d(3). -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension (3) -*> Each of the elements in z must be positive. -*> \endverbatim -*> -*> \param[in] FINIT -*> \verbatim -*> FINIT is DOUBLE PRECISION -*> The value of f at 0. It is more accurate than the one -*> evaluated inside this routine (if someone wants to do -*> so). -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION -*> The root of the equation f(x). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> > 0: if INFO = 1, failure to converge -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> 10/02/03: This version has a few statements commented out for thread -*> safety (machine parameters are computed on each entry). SJH. -*> -*> 05/10/06: Modified from a new version of Ren-Cang Li, use -*> Gragg-Thornton-Warner cubic convergent scheme for better stability. -*> \endverbatim -* -*> \par Contributors: -* ================== -*> -*> Ren-Cang Li, Computer Science Division, University of California -*> at Berkeley, USA -*> -* ===================================================================== - SUBROUTINE DLAED6( KNITER, ORGATI, RHO, D, Z, FINIT, TAU, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - LOGICAL ORGATI - INTEGER INFO, KNITER - DOUBLE PRECISION FINIT, RHO, TAU -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( 3 ), Z( 3 ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - INTEGER MAXIT - PARAMETER ( MAXIT = 40 ) - DOUBLE PRECISION ZERO, ONE, TWO, THREE, FOUR, EIGHT - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0, - $ THREE = 3.0D0, FOUR = 4.0D0, EIGHT = 8.0D0 ) -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH - EXTERNAL DLAMCH -* .. -* .. Local Arrays .. - DOUBLE PRECISION DSCALE( 3 ), ZSCALE( 3 ) -* .. -* .. Local Scalars .. - LOGICAL SCALE - INTEGER I, ITER, NITER - DOUBLE PRECISION A, B, BASE, C, DDF, DF, EPS, ERRETM, ETA, F, - $ FC, SCLFAC, SCLINV, SMALL1, SMALL2, SMINV1, - $ SMINV2, TEMP, TEMP1, TEMP2, TEMP3, TEMP4, - $ LBD, UBD -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, INT, LOG, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* - INFO = 0 -* - IF( ORGATI ) THEN - LBD = D(2) - UBD = D(3) - ELSE - LBD = D(1) - UBD = D(2) - END IF - IF( FINIT .LT. ZERO )THEN - LBD = ZERO - ELSE - UBD = ZERO - END IF -* - NITER = 1 - TAU = ZERO - IF( KNITER.EQ.2 ) THEN - IF( ORGATI ) THEN - TEMP = ( D( 3 )-D( 2 ) ) / TWO - C = RHO + Z( 1 ) / ( ( D( 1 )-D( 2 ) )-TEMP ) - A = C*( D( 2 )+D( 3 ) ) + Z( 2 ) + Z( 3 ) - B = C*D( 2 )*D( 3 ) + Z( 2 )*D( 3 ) + Z( 3 )*D( 2 ) - ELSE - TEMP = ( D( 1 )-D( 2 ) ) / TWO - C = RHO + Z( 3 ) / ( ( D( 3 )-D( 2 ) )-TEMP ) - A = C*( D( 1 )+D( 2 ) ) + Z( 1 ) + Z( 2 ) - B = C*D( 1 )*D( 2 ) + Z( 1 )*D( 2 ) + Z( 2 )*D( 1 ) - END IF - TEMP = MAX( ABS( A ), ABS( B ), ABS( C ) ) - A = A / TEMP - B = B / TEMP - C = C / TEMP - IF( C.EQ.ZERO ) THEN - TAU = B / A - ELSE IF( A.LE.ZERO ) THEN - TAU = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - ELSE - TAU = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) - END IF - IF( TAU .LT. LBD .OR. TAU .GT. UBD ) - $ TAU = ( LBD+UBD )/TWO - IF( D(1).EQ.TAU .OR. D(2).EQ.TAU .OR. D(3).EQ.TAU ) THEN - TAU = ZERO - ELSE - TEMP = FINIT + TAU*Z(1)/( D(1)*( D( 1 )-TAU ) ) + - $ TAU*Z(2)/( D(2)*( D( 2 )-TAU ) ) + - $ TAU*Z(3)/( D(3)*( D( 3 )-TAU ) ) - IF( TEMP .LE. ZERO )THEN - LBD = TAU - ELSE - UBD = TAU - END IF - IF( ABS( FINIT ).LE.ABS( TEMP ) ) - $ TAU = ZERO - END IF - END IF -* -* get machine parameters for possible scaling to avoid overflow -* -* modified by Sven: parameters SMALL1, SMINV1, SMALL2, -* SMINV2, EPS are not SAVEd anymore between one call to the -* others but recomputed at each call -* - EPS = DLAMCH( 'Epsilon' ) - BASE = DLAMCH( 'Base' ) - SMALL1 = BASE**( INT( LOG( DLAMCH( 'SafMin' ) ) / LOG( BASE ) / - $ THREE ) ) - SMINV1 = ONE / SMALL1 - SMALL2 = SMALL1*SMALL1 - SMINV2 = SMINV1*SMINV1 -* -* Determine if scaling of inputs necessary to avoid overflow -* when computing 1/TEMP**3 -* - IF( ORGATI ) THEN - TEMP = MIN( ABS( D( 2 )-TAU ), ABS( D( 3 )-TAU ) ) - ELSE - TEMP = MIN( ABS( D( 1 )-TAU ), ABS( D( 2 )-TAU ) ) - END IF - SCALE = .FALSE. - IF( TEMP.LE.SMALL1 ) THEN - SCALE = .TRUE. - IF( TEMP.LE.SMALL2 ) THEN -* -* Scale up by power of radix nearest 1/SAFMIN**(2/3) -* - SCLFAC = SMINV2 - SCLINV = SMALL2 - ELSE -* -* Scale up by power of radix nearest 1/SAFMIN**(1/3) -* - SCLFAC = SMINV1 - SCLINV = SMALL1 - END IF -* -* Scaling up safe because D, Z, TAU scaled elsewhere to be O(1) -* - DO 10 I = 1, 3 - DSCALE( I ) = D( I )*SCLFAC - ZSCALE( I ) = Z( I )*SCLFAC - 10 CONTINUE - TAU = TAU*SCLFAC - LBD = LBD*SCLFAC - UBD = UBD*SCLFAC - ELSE -* -* Copy D and Z to DSCALE and ZSCALE -* - DO 20 I = 1, 3 - DSCALE( I ) = D( I ) - ZSCALE( I ) = Z( I ) - 20 CONTINUE - END IF -* - FC = ZERO - DF = ZERO - DDF = ZERO - DO 30 I = 1, 3 - TEMP = ONE / ( DSCALE( I )-TAU ) - TEMP1 = ZSCALE( I )*TEMP - TEMP2 = TEMP1*TEMP - TEMP3 = TEMP2*TEMP - FC = FC + TEMP1 / DSCALE( I ) - DF = DF + TEMP2 - DDF = DDF + TEMP3 - 30 CONTINUE - F = FINIT + TAU*FC -* - IF( ABS( F ).LE.ZERO ) - $ GO TO 60 - IF( F .LE. ZERO )THEN - LBD = TAU - ELSE - UBD = TAU - END IF -* -* Iteration begins -- Use Gragg-Thornton-Warner cubic convergent -* scheme -* -* It is not hard to see that -* -* 1) Iterations will go up monotonically -* if FINIT < 0; -* -* 2) Iterations will go down monotonically -* if FINIT > 0. -* - ITER = NITER + 1 -* - DO 50 NITER = ITER, MAXIT -* - IF( ORGATI ) THEN - TEMP1 = DSCALE( 2 ) - TAU - TEMP2 = DSCALE( 3 ) - TAU - ELSE - TEMP1 = DSCALE( 1 ) - TAU - TEMP2 = DSCALE( 2 ) - TAU - END IF - A = ( TEMP1+TEMP2 )*F - TEMP1*TEMP2*DF - B = TEMP1*TEMP2*F - C = F - ( TEMP1+TEMP2 )*DF + TEMP1*TEMP2*DDF - TEMP = MAX( ABS( A ), ABS( B ), ABS( C ) ) - A = A / TEMP - B = B / TEMP - C = C / TEMP - IF( C.EQ.ZERO ) THEN - ETA = B / A - ELSE IF( A.LE.ZERO ) THEN - ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - ELSE - ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) - END IF - IF( F*ETA.GE.ZERO ) THEN - ETA = -F / DF - END IF -* - TAU = TAU + ETA - IF( TAU .LT. LBD .OR. TAU .GT. UBD ) - $ TAU = ( LBD + UBD )/TWO -* - FC = ZERO - ERRETM = ZERO - DF = ZERO - DDF = ZERO - DO 40 I = 1, 3 - IF ( ( DSCALE( I )-TAU ).NE.ZERO ) THEN - TEMP = ONE / ( DSCALE( I )-TAU ) - TEMP1 = ZSCALE( I )*TEMP - TEMP2 = TEMP1*TEMP - TEMP3 = TEMP2*TEMP - TEMP4 = TEMP1 / DSCALE( I ) - FC = FC + TEMP4 - ERRETM = ERRETM + ABS( TEMP4 ) - DF = DF + TEMP2 - DDF = DDF + TEMP3 - ELSE - GO TO 60 - END IF - 40 CONTINUE - F = FINIT + TAU*FC - ERRETM = EIGHT*( ABS( FINIT )+ABS( TAU )*ERRETM ) + - $ ABS( TAU )*DF - IF( ( ABS( F ).LE.FOUR*EPS*ERRETM ) .OR. - $ ( (UBD-LBD).LE.FOUR*EPS*ABS(TAU) ) ) - $ GO TO 60 - IF( F .LE. ZERO )THEN - LBD = TAU - ELSE - UBD = TAU - END IF - 50 CONTINUE - INFO = 1 - 60 CONTINUE -* -* Undo scaling -* - IF( SCALE ) - $ TAU = TAU*SCLINV - RETURN -* -* End of DLAED6 -* - END diff --git a/lib/linalg/fortran/dlaed7.f b/lib/linalg/fortran/dlaed7.f deleted file mode 100644 index d968c56752..0000000000 --- a/lib/linalg/fortran/dlaed7.f +++ /dev/null @@ -1,404 +0,0 @@ -*> \brief \b DLAED7 used by DSTEDC. Computes the updated eigensystem of a diagonal matrix after modification by a rank-one symmetric matrix. Used when the original matrix is dense. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAED7 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAED7( ICOMPQ, N, QSIZ, TLVLS, CURLVL, CURPBM, D, Q, -* LDQ, INDXQ, RHO, CUTPNT, QSTORE, QPTR, PRMPTR, -* PERM, GIVPTR, GIVCOL, GIVNUM, WORK, IWORK, -* INFO ) -* -* .. Scalar Arguments .. -* INTEGER CURLVL, CURPBM, CUTPNT, ICOMPQ, INFO, LDQ, N, -* $ QSIZ, TLVLS -* DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. -* INTEGER GIVCOL( 2, * ), GIVPTR( * ), INDXQ( * ), -* $ IWORK( * ), PERM( * ), PRMPTR( * ), QPTR( * ) -* DOUBLE PRECISION D( * ), GIVNUM( 2, * ), Q( LDQ, * ), -* $ QSTORE( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAED7 computes the updated eigensystem of a diagonal -*> matrix after modification by a rank-one symmetric matrix. This -*> routine is used only for the eigenproblem which requires all -*> eigenvalues and optionally eigenvectors of a dense symmetric matrix -*> that has been reduced to tridiagonal form. DLAED1 handles -*> the case in which all eigenvalues and eigenvectors of a symmetric -*> tridiagonal matrix are desired. -*> -*> T = Q(in) ( D(in) + RHO * Z*Z**T ) Q**T(in) = Q(out) * D(out) * Q**T(out) -*> -*> where Z = Q**Tu, u is a vector of length N with ones in the -*> CUTPNT and CUTPNT + 1 th elements and zeros elsewhere. -*> -*> The eigenvectors of the original matrix are stored in Q, and the -*> eigenvalues are in D. The algorithm consists of three stages: -*> -*> The first stage consists of deflating the size of the problem -*> when there are multiple eigenvalues or if there is a zero in -*> the Z vector. For each such occurrence the dimension of the -*> secular equation problem is reduced by one. This stage is -*> performed by the routine DLAED8. -*> -*> The second stage consists of calculating the updated -*> eigenvalues. This is done by finding the roots of the secular -*> equation via the routine DLAED4 (as called by DLAED9). -*> This routine also calculates the eigenvectors of the current -*> problem. -*> -*> The final stage consists of computing the updated eigenvectors -*> directly using the updated eigenvalues. The eigenvectors for -*> the current problem are multiplied with the eigenvectors from -*> the overall problem. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ICOMPQ -*> \verbatim -*> ICOMPQ is INTEGER -*> = 0: Compute eigenvalues only. -*> = 1: Compute eigenvectors of original dense symmetric matrix -*> also. On entry, Q contains the orthogonal matrix used -*> to reduce the original matrix to tridiagonal form. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The dimension of the symmetric tridiagonal matrix. N >= 0. -*> \endverbatim -*> -*> \param[in] QSIZ -*> \verbatim -*> QSIZ is INTEGER -*> The dimension of the orthogonal matrix used to reduce -*> the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. -*> \endverbatim -*> -*> \param[in] TLVLS -*> \verbatim -*> TLVLS is INTEGER -*> The total number of merging levels in the overall divide and -*> conquer tree. -*> \endverbatim -*> -*> \param[in] CURLVL -*> \verbatim -*> CURLVL is INTEGER -*> The current level in the overall merge routine, -*> 0 <= CURLVL <= TLVLS. -*> \endverbatim -*> -*> \param[in] CURPBM -*> \verbatim -*> CURPBM is INTEGER -*> The current problem in the current level in the overall -*> merge routine (counting from upper left to lower right). -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the eigenvalues of the rank-1-perturbed matrix. -*> On exit, the eigenvalues of the repaired matrix. -*> \endverbatim -*> -*> \param[in,out] Q -*> \verbatim -*> Q is DOUBLE PRECISION array, dimension (LDQ, N) -*> On entry, the eigenvectors of the rank-1-perturbed matrix. -*> On exit, the eigenvectors of the repaired tridiagonal matrix. -*> \endverbatim -*> -*> \param[in] LDQ -*> \verbatim -*> LDQ is INTEGER -*> The leading dimension of the array Q. LDQ >= max(1,N). -*> \endverbatim -*> -*> \param[out] INDXQ -*> \verbatim -*> INDXQ is INTEGER array, dimension (N) -*> The permutation which will reintegrate the subproblem just -*> solved back into sorted order, i.e., D( INDXQ( I = 1, N ) ) -*> will be in ascending order. -*> \endverbatim -*> -*> \param[in] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> The subdiagonal element used to create the rank-1 -*> modification. -*> \endverbatim -*> -*> \param[in] CUTPNT -*> \verbatim -*> CUTPNT is INTEGER -*> Contains the location of the last eigenvalue in the leading -*> sub-matrix. min(1,N) <= CUTPNT <= N. -*> \endverbatim -*> -*> \param[in,out] QSTORE -*> \verbatim -*> QSTORE is DOUBLE PRECISION array, dimension (N**2+1) -*> Stores eigenvectors of submatrices encountered during -*> divide and conquer, packed together. QPTR points to -*> beginning of the submatrices. -*> \endverbatim -*> -*> \param[in,out] QPTR -*> \verbatim -*> QPTR is INTEGER array, dimension (N+2) -*> List of indices pointing to beginning of submatrices stored -*> in QSTORE. The submatrices are numbered starting at the -*> bottom left of the divide and conquer tree, from left to -*> right and bottom to top. -*> \endverbatim -*> -*> \param[in] PRMPTR -*> \verbatim -*> PRMPTR is INTEGER array, dimension (N lg N) -*> Contains a list of pointers which indicate where in PERM a -*> level's permutation is stored. PRMPTR(i+1) - PRMPTR(i) -*> indicates the size of the permutation and also the size of -*> the full, non-deflated problem. -*> \endverbatim -*> -*> \param[in] PERM -*> \verbatim -*> PERM is INTEGER array, dimension (N lg N) -*> Contains the permutations (from deflation and sorting) to be -*> applied to each eigenblock. -*> \endverbatim -*> -*> \param[in] GIVPTR -*> \verbatim -*> GIVPTR is INTEGER array, dimension (N lg N) -*> Contains a list of pointers which indicate where in GIVCOL a -*> level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i) -*> indicates the number of Givens rotations. -*> \endverbatim -*> -*> \param[in] GIVCOL -*> \verbatim -*> GIVCOL is INTEGER array, dimension (2, N lg N) -*> Each pair of numbers indicates a pair of columns to take place -*> in a Givens rotation. -*> \endverbatim -*> -*> \param[in] GIVNUM -*> \verbatim -*> GIVNUM is DOUBLE PRECISION array, dimension (2, N lg N) -*> Each number indicates the S value to be used in the -*> corresponding Givens rotation. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (3*N+2*QSIZ*N) -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension (4*N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: if INFO = 1, an eigenvalue did not converge -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Jeff Rutter, Computer Science Division, University of California -*> at Berkeley, USA -* -* ===================================================================== - SUBROUTINE DLAED7( ICOMPQ, N, QSIZ, TLVLS, CURLVL, CURPBM, D, Q, - $ LDQ, INDXQ, RHO, CUTPNT, QSTORE, QPTR, PRMPTR, - $ PERM, GIVPTR, GIVCOL, GIVNUM, WORK, IWORK, - $ INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER CURLVL, CURPBM, CUTPNT, ICOMPQ, INFO, LDQ, N, - $ QSIZ, TLVLS - DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. - INTEGER GIVCOL( 2, * ), GIVPTR( * ), INDXQ( * ), - $ IWORK( * ), PERM( * ), PRMPTR( * ), QPTR( * ) - DOUBLE PRECISION D( * ), GIVNUM( 2, * ), Q( LDQ, * ), - $ QSTORE( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D0, ZERO = 0.0D0 ) -* .. -* .. Local Scalars .. - INTEGER COLTYP, CURR, I, IDLMDA, INDX, INDXC, INDXP, - $ IQ2, IS, IW, IZ, K, LDQ2, N1, N2, PTR -* .. -* .. External Subroutines .. - EXTERNAL DGEMM, DLAED8, DLAED9, DLAEDA, DLAMRG, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( ICOMPQ.LT.0 .OR. ICOMPQ.GT.1 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( ICOMPQ.EQ.1 .AND. QSIZ.LT.N ) THEN - INFO = -3 - ELSE IF( LDQ.LT.MAX( 1, N ) ) THEN - INFO = -9 - ELSE IF( MIN( 1, N ).GT.CUTPNT .OR. N.LT.CUTPNT ) THEN - INFO = -12 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLAED7', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* The following values are for bookkeeping purposes only. They are -* integer pointers which indicate the portion of the workspace -* used by a particular array in DLAED8 and DLAED9. -* - IF( ICOMPQ.EQ.1 ) THEN - LDQ2 = QSIZ - ELSE - LDQ2 = N - END IF -* - IZ = 1 - IDLMDA = IZ + N - IW = IDLMDA + N - IQ2 = IW + N - IS = IQ2 + N*LDQ2 -* - INDX = 1 - INDXC = INDX + N - COLTYP = INDXC + N - INDXP = COLTYP + N -* -* Form the z-vector which consists of the last row of Q_1 and the -* first row of Q_2. -* - PTR = 1 + 2**TLVLS - DO 10 I = 1, CURLVL - 1 - PTR = PTR + 2**( TLVLS-I ) - 10 CONTINUE - CURR = PTR + CURPBM - CALL DLAEDA( N, TLVLS, CURLVL, CURPBM, PRMPTR, PERM, GIVPTR, - $ GIVCOL, GIVNUM, QSTORE, QPTR, WORK( IZ ), - $ WORK( IZ+N ), INFO ) -* -* When solving the final problem, we no longer need the stored data, -* so we will overwrite the data from this level onto the previously -* used storage space. -* - IF( CURLVL.EQ.TLVLS ) THEN - QPTR( CURR ) = 1 - PRMPTR( CURR ) = 1 - GIVPTR( CURR ) = 1 - END IF -* -* Sort and Deflate eigenvalues. -* - CALL DLAED8( ICOMPQ, K, N, QSIZ, D, Q, LDQ, INDXQ, RHO, CUTPNT, - $ WORK( IZ ), WORK( IDLMDA ), WORK( IQ2 ), LDQ2, - $ WORK( IW ), PERM( PRMPTR( CURR ) ), GIVPTR( CURR+1 ), - $ GIVCOL( 1, GIVPTR( CURR ) ), - $ GIVNUM( 1, GIVPTR( CURR ) ), IWORK( INDXP ), - $ IWORK( INDX ), INFO ) - PRMPTR( CURR+1 ) = PRMPTR( CURR ) + N - GIVPTR( CURR+1 ) = GIVPTR( CURR+1 ) + GIVPTR( CURR ) -* -* Solve Secular Equation. -* - IF( K.NE.0 ) THEN - CALL DLAED9( K, 1, K, N, D, WORK( IS ), K, RHO, WORK( IDLMDA ), - $ WORK( IW ), QSTORE( QPTR( CURR ) ), K, INFO ) - IF( INFO.NE.0 ) - $ GO TO 30 - IF( ICOMPQ.EQ.1 ) THEN - CALL DGEMM( 'N', 'N', QSIZ, K, K, ONE, WORK( IQ2 ), LDQ2, - $ QSTORE( QPTR( CURR ) ), K, ZERO, Q, LDQ ) - END IF - QPTR( CURR+1 ) = QPTR( CURR ) + K**2 -* -* Prepare the INDXQ sorting permutation. -* - N1 = K - N2 = N - K - CALL DLAMRG( N1, N2, D, 1, -1, INDXQ ) - ELSE - QPTR( CURR+1 ) = QPTR( CURR ) - DO 20 I = 1, N - INDXQ( I ) = I - 20 CONTINUE - END IF -* - 30 CONTINUE - RETURN -* -* End of DLAED7 -* - END diff --git a/lib/linalg/fortran/dlaed8.f b/lib/linalg/fortran/dlaed8.f deleted file mode 100644 index 3631fb4566..0000000000 --- a/lib/linalg/fortran/dlaed8.f +++ /dev/null @@ -1,521 +0,0 @@ -*> \brief \b DLAED8 used by DSTEDC. Merges eigenvalues and deflates secular equation. Used when the original matrix is dense. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAED8 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAED8( ICOMPQ, K, N, QSIZ, D, Q, LDQ, INDXQ, RHO, -* CUTPNT, Z, DLAMDA, Q2, LDQ2, W, PERM, GIVPTR, -* GIVCOL, GIVNUM, INDXP, INDX, INFO ) -* -* .. Scalar Arguments .. -* INTEGER CUTPNT, GIVPTR, ICOMPQ, INFO, K, LDQ, LDQ2, N, -* $ QSIZ -* DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. -* INTEGER GIVCOL( 2, * ), INDX( * ), INDXP( * ), -* $ INDXQ( * ), PERM( * ) -* DOUBLE PRECISION D( * ), DLAMDA( * ), GIVNUM( 2, * ), -* $ Q( LDQ, * ), Q2( LDQ2, * ), W( * ), Z( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAED8 merges the two sets of eigenvalues together into a single -*> sorted set. Then it tries to deflate the size of the problem. -*> There are two ways in which deflation can occur: when two or more -*> eigenvalues are close together or if there is a tiny element in the -*> Z vector. For each such occurrence the order of the related secular -*> equation problem is reduced by one. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ICOMPQ -*> \verbatim -*> ICOMPQ is INTEGER -*> = 0: Compute eigenvalues only. -*> = 1: Compute eigenvectors of original dense symmetric matrix -*> also. On entry, Q contains the orthogonal matrix used -*> to reduce the original matrix to tridiagonal form. -*> \endverbatim -*> -*> \param[out] K -*> \verbatim -*> K is INTEGER -*> The number of non-deflated eigenvalues, and the order of the -*> related secular equation. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The dimension of the symmetric tridiagonal matrix. N >= 0. -*> \endverbatim -*> -*> \param[in] QSIZ -*> \verbatim -*> QSIZ is INTEGER -*> The dimension of the orthogonal matrix used to reduce -*> the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the eigenvalues of the two submatrices to be -*> combined. On exit, the trailing (N-K) updated eigenvalues -*> (those which were deflated) sorted into increasing order. -*> \endverbatim -*> -*> \param[in,out] Q -*> \verbatim -*> Q is DOUBLE PRECISION array, dimension (LDQ,N) -*> If ICOMPQ = 0, Q is not referenced. Otherwise, -*> on entry, Q contains the eigenvectors of the partially solved -*> system which has been previously updated in matrix -*> multiplies with other partially solved eigensystems. -*> On exit, Q contains the trailing (N-K) updated eigenvectors -*> (those which were deflated) in its last N-K columns. -*> \endverbatim -*> -*> \param[in] LDQ -*> \verbatim -*> LDQ is INTEGER -*> The leading dimension of the array Q. LDQ >= max(1,N). -*> \endverbatim -*> -*> \param[in] INDXQ -*> \verbatim -*> INDXQ is INTEGER array, dimension (N) -*> The permutation which separately sorts the two sub-problems -*> in D into ascending order. Note that elements in the second -*> half of this permutation must first have CUTPNT added to -*> their values in order to be accurate. -*> \endverbatim -*> -*> \param[in,out] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> On entry, the off-diagonal element associated with the rank-1 -*> cut which originally split the two submatrices which are now -*> being recombined. -*> On exit, RHO has been modified to the value required by -*> DLAED3. -*> \endverbatim -*> -*> \param[in] CUTPNT -*> \verbatim -*> CUTPNT is INTEGER -*> The location of the last eigenvalue in the leading -*> sub-matrix. min(1,N) <= CUTPNT <= N. -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension (N) -*> On entry, Z contains the updating vector (the last row of -*> the first sub-eigenvector matrix and the first row of the -*> second sub-eigenvector matrix). -*> On exit, the contents of Z are destroyed by the updating -*> process. -*> \endverbatim -*> -*> \param[out] DLAMDA -*> \verbatim -*> DLAMDA is DOUBLE PRECISION array, dimension (N) -*> A copy of the first K eigenvalues which will be used by -*> DLAED3 to form the secular equation. -*> \endverbatim -*> -*> \param[out] Q2 -*> \verbatim -*> Q2 is DOUBLE PRECISION array, dimension (LDQ2,N) -*> If ICOMPQ = 0, Q2 is not referenced. Otherwise, -*> a copy of the first K eigenvectors which will be used by -*> DLAED7 in a matrix multiply (DGEMM) to update the new -*> eigenvectors. -*> \endverbatim -*> -*> \param[in] LDQ2 -*> \verbatim -*> LDQ2 is INTEGER -*> The leading dimension of the array Q2. LDQ2 >= max(1,N). -*> \endverbatim -*> -*> \param[out] W -*> \verbatim -*> W is DOUBLE PRECISION array, dimension (N) -*> The first k values of the final deflation-altered z-vector and -*> will be passed to DLAED3. -*> \endverbatim -*> -*> \param[out] PERM -*> \verbatim -*> PERM is INTEGER array, dimension (N) -*> The permutations (from deflation and sorting) to be applied -*> to each eigenblock. -*> \endverbatim -*> -*> \param[out] GIVPTR -*> \verbatim -*> GIVPTR is INTEGER -*> The number of Givens rotations which took place in this -*> subproblem. -*> \endverbatim -*> -*> \param[out] GIVCOL -*> \verbatim -*> GIVCOL is INTEGER array, dimension (2, N) -*> Each pair of numbers indicates a pair of columns to take place -*> in a Givens rotation. -*> \endverbatim -*> -*> \param[out] GIVNUM -*> \verbatim -*> GIVNUM is DOUBLE PRECISION array, dimension (2, N) -*> Each number indicates the S value to be used in the -*> corresponding Givens rotation. -*> \endverbatim -*> -*> \param[out] INDXP -*> \verbatim -*> INDXP is INTEGER array, dimension (N) -*> The permutation used to place deflated values of D at the end -*> of the array. INDXP(1:K) points to the nondeflated D-values -*> and INDXP(K+1:N) points to the deflated eigenvalues. -*> \endverbatim -*> -*> \param[out] INDX -*> \verbatim -*> INDX is INTEGER array, dimension (N) -*> The permutation used to sort the contents of D into ascending -*> order. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Jeff Rutter, Computer Science Division, University of California -*> at Berkeley, USA -* -* ===================================================================== - SUBROUTINE DLAED8( ICOMPQ, K, N, QSIZ, D, Q, LDQ, INDXQ, RHO, - $ CUTPNT, Z, DLAMDA, Q2, LDQ2, W, PERM, GIVPTR, - $ GIVCOL, GIVNUM, INDXP, INDX, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER CUTPNT, GIVPTR, ICOMPQ, INFO, K, LDQ, LDQ2, N, - $ QSIZ - DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. - INTEGER GIVCOL( 2, * ), INDX( * ), INDXP( * ), - $ INDXQ( * ), PERM( * ) - DOUBLE PRECISION D( * ), DLAMDA( * ), GIVNUM( 2, * ), - $ Q( LDQ, * ), Q2( LDQ2, * ), W( * ), Z( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION MONE, ZERO, ONE, TWO, EIGHT - PARAMETER ( MONE = -1.0D0, ZERO = 0.0D0, ONE = 1.0D0, - $ TWO = 2.0D0, EIGHT = 8.0D0 ) -* .. -* .. Local Scalars .. -* - INTEGER I, IMAX, J, JLAM, JMAX, JP, K2, N1, N1P1, N2 - DOUBLE PRECISION C, EPS, S, T, TAU, TOL -* .. -* .. External Functions .. - INTEGER IDAMAX - DOUBLE PRECISION DLAMCH, DLAPY2 - EXTERNAL IDAMAX, DLAMCH, DLAPY2 -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DLACPY, DLAMRG, DROT, DSCAL, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( ICOMPQ.LT.0 .OR. ICOMPQ.GT.1 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( ICOMPQ.EQ.1 .AND. QSIZ.LT.N ) THEN - INFO = -4 - ELSE IF( LDQ.LT.MAX( 1, N ) ) THEN - INFO = -7 - ELSE IF( CUTPNT.LT.MIN( 1, N ) .OR. CUTPNT.GT.N ) THEN - INFO = -10 - ELSE IF( LDQ2.LT.MAX( 1, N ) ) THEN - INFO = -14 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLAED8', -INFO ) - RETURN - END IF -* -* Need to initialize GIVPTR to O here in case of quick exit -* to prevent an unspecified code behavior (usually sigfault) -* when IWORK array on entry to *stedc is not zeroed -* (or at least some IWORK entries which used in *laed7 for GIVPTR). -* - GIVPTR = 0 -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - N1 = CUTPNT - N2 = N - N1 - N1P1 = N1 + 1 -* - IF( RHO.LT.ZERO ) THEN - CALL DSCAL( N2, MONE, Z( N1P1 ), 1 ) - END IF -* -* Normalize z so that norm(z) = 1 -* - T = ONE / SQRT( TWO ) - DO 10 J = 1, N - INDX( J ) = J - 10 CONTINUE - CALL DSCAL( N, T, Z, 1 ) - RHO = ABS( TWO*RHO ) -* -* Sort the eigenvalues into increasing order -* - DO 20 I = CUTPNT + 1, N - INDXQ( I ) = INDXQ( I ) + CUTPNT - 20 CONTINUE - DO 30 I = 1, N - DLAMDA( I ) = D( INDXQ( I ) ) - W( I ) = Z( INDXQ( I ) ) - 30 CONTINUE - I = 1 - J = CUTPNT + 1 - CALL DLAMRG( N1, N2, DLAMDA, 1, 1, INDX ) - DO 40 I = 1, N - D( I ) = DLAMDA( INDX( I ) ) - Z( I ) = W( INDX( I ) ) - 40 CONTINUE -* -* Calculate the allowable deflation tolerance -* - IMAX = IDAMAX( N, Z, 1 ) - JMAX = IDAMAX( N, D, 1 ) - EPS = DLAMCH( 'Epsilon' ) - TOL = EIGHT*EPS*ABS( D( JMAX ) ) -* -* If the rank-1 modifier is small enough, no more needs to be done -* except to reorganize Q so that its columns correspond with the -* elements in D. -* - IF( RHO*ABS( Z( IMAX ) ).LE.TOL ) THEN - K = 0 - IF( ICOMPQ.EQ.0 ) THEN - DO 50 J = 1, N - PERM( J ) = INDXQ( INDX( J ) ) - 50 CONTINUE - ELSE - DO 60 J = 1, N - PERM( J ) = INDXQ( INDX( J ) ) - CALL DCOPY( QSIZ, Q( 1, PERM( J ) ), 1, Q2( 1, J ), 1 ) - 60 CONTINUE - CALL DLACPY( 'A', QSIZ, N, Q2( 1, 1 ), LDQ2, Q( 1, 1 ), - $ LDQ ) - END IF - RETURN - END IF -* -* If there are multiple eigenvalues then the problem deflates. Here -* the number of equal eigenvalues are found. As each equal -* eigenvalue is found, an elementary reflector is computed to rotate -* the corresponding eigensubspace so that the corresponding -* components of Z are zero in this new basis. -* - K = 0 - K2 = N + 1 - DO 70 J = 1, N - IF( RHO*ABS( Z( J ) ).LE.TOL ) THEN -* -* Deflate due to small z component. -* - K2 = K2 - 1 - INDXP( K2 ) = J - IF( J.EQ.N ) - $ GO TO 110 - ELSE - JLAM = J - GO TO 80 - END IF - 70 CONTINUE - 80 CONTINUE - J = J + 1 - IF( J.GT.N ) - $ GO TO 100 - IF( RHO*ABS( Z( J ) ).LE.TOL ) THEN -* -* Deflate due to small z component. -* - K2 = K2 - 1 - INDXP( K2 ) = J - ELSE -* -* Check if eigenvalues are close enough to allow deflation. -* - S = Z( JLAM ) - C = Z( J ) -* -* Find sqrt(a**2+b**2) without overflow or -* destructive underflow. -* - TAU = DLAPY2( C, S ) - T = D( J ) - D( JLAM ) - C = C / TAU - S = -S / TAU - IF( ABS( T*C*S ).LE.TOL ) THEN -* -* Deflation is possible. -* - Z( J ) = TAU - Z( JLAM ) = ZERO -* -* Record the appropriate Givens rotation -* - GIVPTR = GIVPTR + 1 - GIVCOL( 1, GIVPTR ) = INDXQ( INDX( JLAM ) ) - GIVCOL( 2, GIVPTR ) = INDXQ( INDX( J ) ) - GIVNUM( 1, GIVPTR ) = C - GIVNUM( 2, GIVPTR ) = S - IF( ICOMPQ.EQ.1 ) THEN - CALL DROT( QSIZ, Q( 1, INDXQ( INDX( JLAM ) ) ), 1, - $ Q( 1, INDXQ( INDX( J ) ) ), 1, C, S ) - END IF - T = D( JLAM )*C*C + D( J )*S*S - D( J ) = D( JLAM )*S*S + D( J )*C*C - D( JLAM ) = T - K2 = K2 - 1 - I = 1 - 90 CONTINUE - IF( K2+I.LE.N ) THEN - IF( D( JLAM ).LT.D( INDXP( K2+I ) ) ) THEN - INDXP( K2+I-1 ) = INDXP( K2+I ) - INDXP( K2+I ) = JLAM - I = I + 1 - GO TO 90 - ELSE - INDXP( K2+I-1 ) = JLAM - END IF - ELSE - INDXP( K2+I-1 ) = JLAM - END IF - JLAM = J - ELSE - K = K + 1 - W( K ) = Z( JLAM ) - DLAMDA( K ) = D( JLAM ) - INDXP( K ) = JLAM - JLAM = J - END IF - END IF - GO TO 80 - 100 CONTINUE -* -* Record the last eigenvalue. -* - K = K + 1 - W( K ) = Z( JLAM ) - DLAMDA( K ) = D( JLAM ) - INDXP( K ) = JLAM -* - 110 CONTINUE -* -* Sort the eigenvalues and corresponding eigenvectors into DLAMDA -* and Q2 respectively. The eigenvalues/vectors which were not -* deflated go into the first K slots of DLAMDA and Q2 respectively, -* while those which were deflated go into the last N - K slots. -* - IF( ICOMPQ.EQ.0 ) THEN - DO 120 J = 1, N - JP = INDXP( J ) - DLAMDA( J ) = D( JP ) - PERM( J ) = INDXQ( INDX( JP ) ) - 120 CONTINUE - ELSE - DO 130 J = 1, N - JP = INDXP( J ) - DLAMDA( J ) = D( JP ) - PERM( J ) = INDXQ( INDX( JP ) ) - CALL DCOPY( QSIZ, Q( 1, PERM( J ) ), 1, Q2( 1, J ), 1 ) - 130 CONTINUE - END IF -* -* The deflated eigenvalues and their corresponding vectors go back -* into the last N - K slots of D and Q respectively. -* - IF( K.LT.N ) THEN - IF( ICOMPQ.EQ.0 ) THEN - CALL DCOPY( N-K, DLAMDA( K+1 ), 1, D( K+1 ), 1 ) - ELSE - CALL DCOPY( N-K, DLAMDA( K+1 ), 1, D( K+1 ), 1 ) - CALL DLACPY( 'A', QSIZ, N-K, Q2( 1, K+1 ), LDQ2, - $ Q( 1, K+1 ), LDQ ) - END IF - END IF -* - RETURN -* -* End of DLAED8 -* - END diff --git a/lib/linalg/fortran/dlaed9.f b/lib/linalg/fortran/dlaed9.f deleted file mode 100644 index b88cdd9077..0000000000 --- a/lib/linalg/fortran/dlaed9.f +++ /dev/null @@ -1,291 +0,0 @@ -*> \brief \b DLAED9 used by DSTEDC. Finds the roots of the secular equation and updates the eigenvectors. Used when the original matrix is dense. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAED9 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAED9( K, KSTART, KSTOP, N, D, Q, LDQ, RHO, DLAMDA, W, -* S, LDS, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, KSTART, KSTOP, LDQ, LDS, N -* DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), S( LDS, * ), -* $ W( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAED9 finds the roots of the secular equation, as defined by the -*> values in D, Z, and RHO, between KSTART and KSTOP. It makes the -*> appropriate calls to DLAED4 and then stores the new matrix of -*> eigenvectors for use in calculating the next level of Z vectors. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of terms in the rational function to be solved by -*> DLAED4. K >= 0. -*> \endverbatim -*> -*> \param[in] KSTART -*> \verbatim -*> KSTART is INTEGER -*> \endverbatim -*> -*> \param[in] KSTOP -*> \verbatim -*> KSTOP is INTEGER -*> The updated eigenvalues Lambda(I), KSTART <= I <= KSTOP -*> are to be computed. 1 <= KSTART <= KSTOP <= K. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of rows and columns in the Q matrix. -*> N >= K (delation may result in N > K). -*> \endverbatim -*> -*> \param[out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> D(I) contains the updated eigenvalues -*> for KSTART <= I <= KSTOP. -*> \endverbatim -*> -*> \param[out] Q -*> \verbatim -*> Q is DOUBLE PRECISION array, dimension (LDQ,N) -*> \endverbatim -*> -*> \param[in] LDQ -*> \verbatim -*> LDQ is INTEGER -*> The leading dimension of the array Q. LDQ >= max( 1, N ). -*> \endverbatim -*> -*> \param[in] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> The value of the parameter in the rank one update equation. -*> RHO >= 0 required. -*> \endverbatim -*> -*> \param[in] DLAMDA -*> \verbatim -*> DLAMDA is DOUBLE PRECISION array, dimension (K) -*> The first K elements of this array contain the old roots -*> of the deflated updating problem. These are the poles -*> of the secular equation. -*> \endverbatim -*> -*> \param[in] W -*> \verbatim -*> W is DOUBLE PRECISION array, dimension (K) -*> The first K elements of this array contain the components -*> of the deflation-adjusted updating vector. -*> \endverbatim -*> -*> \param[out] S -*> \verbatim -*> S is DOUBLE PRECISION array, dimension (LDS, K) -*> Will contain the eigenvectors of the repaired matrix which -*> will be stored for subsequent Z vector calculation and -*> multiplied by the previously accumulated eigenvectors -*> to update the system. -*> \endverbatim -*> -*> \param[in] LDS -*> \verbatim -*> LDS is INTEGER -*> The leading dimension of S. LDS >= max( 1, K ). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: if INFO = 1, an eigenvalue did not converge -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Jeff Rutter, Computer Science Division, University of California -*> at Berkeley, USA -* -* ===================================================================== - SUBROUTINE DLAED9( K, KSTART, KSTOP, N, D, Q, LDQ, RHO, DLAMDA, W, - $ S, LDS, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, KSTART, KSTOP, LDQ, LDS, N - DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( * ), DLAMDA( * ), Q( LDQ, * ), S( LDS, * ), - $ W( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, J - DOUBLE PRECISION TEMP -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMC3, DNRM2 - EXTERNAL DLAMC3, DNRM2 -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DLAED4, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, SIGN, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( K.LT.0 ) THEN - INFO = -1 - ELSE IF( KSTART.LT.1 .OR. KSTART.GT.MAX( 1, K ) ) THEN - INFO = -2 - ELSE IF( MAX( 1, KSTOP ).LT.KSTART .OR. KSTOP.GT.MAX( 1, K ) ) - $ THEN - INFO = -3 - ELSE IF( N.LT.K ) THEN - INFO = -4 - ELSE IF( LDQ.LT.MAX( 1, K ) ) THEN - INFO = -7 - ELSE IF( LDS.LT.MAX( 1, K ) ) THEN - INFO = -12 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLAED9', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( K.EQ.0 ) - $ RETURN -* -* Modify values DLAMDA(i) to make sure all DLAMDA(i)-DLAMDA(j) can -* be computed with high relative accuracy (barring over/underflow). -* This is a problem on machines without a guard digit in -* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). -* The following code replaces DLAMDA(I) by 2*DLAMDA(I)-DLAMDA(I), -* which on any of these machines zeros out the bottommost -* bit of DLAMDA(I) if it is 1; this makes the subsequent -* subtractions DLAMDA(I)-DLAMDA(J) unproblematic when cancellation -* occurs. On binary machines with a guard digit (almost all -* machines) it does not change DLAMDA(I) at all. On hexadecimal -* and decimal machines with a guard digit, it slightly -* changes the bottommost bits of DLAMDA(I). It does not account -* for hexadecimal or decimal machines without guard digits -* (we know of none). We use a subroutine call to compute -* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating -* this code. -* - DO 10 I = 1, N - DLAMDA( I ) = DLAMC3( DLAMDA( I ), DLAMDA( I ) ) - DLAMDA( I ) - 10 CONTINUE -* - DO 20 J = KSTART, KSTOP - CALL DLAED4( K, J, DLAMDA, W, Q( 1, J ), RHO, D( J ), INFO ) -* -* If the zero finder fails, the computation is terminated. -* - IF( INFO.NE.0 ) - $ GO TO 120 - 20 CONTINUE -* - IF( K.EQ.1 .OR. K.EQ.2 ) THEN - DO 40 I = 1, K - DO 30 J = 1, K - S( J, I ) = Q( J, I ) - 30 CONTINUE - 40 CONTINUE - GO TO 120 - END IF -* -* Compute updated W. -* - CALL DCOPY( K, W, 1, S, 1 ) -* -* Initialize W(I) = Q(I,I) -* - CALL DCOPY( K, Q, LDQ+1, W, 1 ) - DO 70 J = 1, K - DO 50 I = 1, J - 1 - W( I ) = W( I )*( Q( I, J ) / ( DLAMDA( I )-DLAMDA( J ) ) ) - 50 CONTINUE - DO 60 I = J + 1, K - W( I ) = W( I )*( Q( I, J ) / ( DLAMDA( I )-DLAMDA( J ) ) ) - 60 CONTINUE - 70 CONTINUE - DO 80 I = 1, K - W( I ) = SIGN( SQRT( -W( I ) ), S( I, 1 ) ) - 80 CONTINUE -* -* Compute eigenvectors of the modified rank-1 modification. -* - DO 110 J = 1, K - DO 90 I = 1, K - Q( I, J ) = W( I ) / Q( I, J ) - 90 CONTINUE - TEMP = DNRM2( K, Q( 1, J ), 1 ) - DO 100 I = 1, K - S( I, J ) = Q( I, J ) / TEMP - 100 CONTINUE - 110 CONTINUE -* - 120 CONTINUE - RETURN -* -* End of DLAED9 -* - END diff --git a/lib/linalg/fortran/dlaeda.f b/lib/linalg/fortran/dlaeda.f deleted file mode 100644 index 8864fd7f2a..0000000000 --- a/lib/linalg/fortran/dlaeda.f +++ /dev/null @@ -1,305 +0,0 @@ -*> \brief \b DLAEDA used by DSTEDC. Computes the Z vector determining the rank-one modification of the diagonal matrix. Used when the original matrix is dense. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAEDA + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAEDA( N, TLVLS, CURLVL, CURPBM, PRMPTR, PERM, GIVPTR, -* GIVCOL, GIVNUM, Q, QPTR, Z, ZTEMP, INFO ) -* -* .. Scalar Arguments .. -* INTEGER CURLVL, CURPBM, INFO, N, TLVLS -* .. -* .. Array Arguments .. -* INTEGER GIVCOL( 2, * ), GIVPTR( * ), PERM( * ), -* $ PRMPTR( * ), QPTR( * ) -* DOUBLE PRECISION GIVNUM( 2, * ), Q( * ), Z( * ), ZTEMP( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAEDA computes the Z vector corresponding to the merge step in the -*> CURLVLth step of the merge process with TLVLS steps for the CURPBMth -*> problem. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The dimension of the symmetric tridiagonal matrix. N >= 0. -*> \endverbatim -*> -*> \param[in] TLVLS -*> \verbatim -*> TLVLS is INTEGER -*> The total number of merging levels in the overall divide and -*> conquer tree. -*> \endverbatim -*> -*> \param[in] CURLVL -*> \verbatim -*> CURLVL is INTEGER -*> The current level in the overall merge routine, -*> 0 <= curlvl <= tlvls. -*> \endverbatim -*> -*> \param[in] CURPBM -*> \verbatim -*> CURPBM is INTEGER -*> The current problem in the current level in the overall -*> merge routine (counting from upper left to lower right). -*> \endverbatim -*> -*> \param[in] PRMPTR -*> \verbatim -*> PRMPTR is INTEGER array, dimension (N lg N) -*> Contains a list of pointers which indicate where in PERM a -*> level's permutation is stored. PRMPTR(i+1) - PRMPTR(i) -*> indicates the size of the permutation and incidentally the -*> size of the full, non-deflated problem. -*> \endverbatim -*> -*> \param[in] PERM -*> \verbatim -*> PERM is INTEGER array, dimension (N lg N) -*> Contains the permutations (from deflation and sorting) to be -*> applied to each eigenblock. -*> \endverbatim -*> -*> \param[in] GIVPTR -*> \verbatim -*> GIVPTR is INTEGER array, dimension (N lg N) -*> Contains a list of pointers which indicate where in GIVCOL a -*> level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i) -*> indicates the number of Givens rotations. -*> \endverbatim -*> -*> \param[in] GIVCOL -*> \verbatim -*> GIVCOL is INTEGER array, dimension (2, N lg N) -*> Each pair of numbers indicates a pair of columns to take place -*> in a Givens rotation. -*> \endverbatim -*> -*> \param[in] GIVNUM -*> \verbatim -*> GIVNUM is DOUBLE PRECISION array, dimension (2, N lg N) -*> Each number indicates the S value to be used in the -*> corresponding Givens rotation. -*> \endverbatim -*> -*> \param[in] Q -*> \verbatim -*> Q is DOUBLE PRECISION array, dimension (N**2) -*> Contains the square eigenblocks from previous levels, the -*> starting positions for blocks are given by QPTR. -*> \endverbatim -*> -*> \param[in] QPTR -*> \verbatim -*> QPTR is INTEGER array, dimension (N+2) -*> Contains a list of pointers which indicate where in Q an -*> eigenblock is stored. SQRT( QPTR(i+1) - QPTR(i) ) indicates -*> the size of the block. -*> \endverbatim -*> -*> \param[out] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension (N) -*> On output this vector contains the updating vector (the last -*> row of the first sub-eigenvector matrix and the first row of -*> the second sub-eigenvector matrix). -*> \endverbatim -*> -*> \param[out] ZTEMP -*> \verbatim -*> ZTEMP is DOUBLE PRECISION array, dimension (N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Jeff Rutter, Computer Science Division, University of California -*> at Berkeley, USA -* -* ===================================================================== - SUBROUTINE DLAEDA( N, TLVLS, CURLVL, CURPBM, PRMPTR, PERM, GIVPTR, - $ GIVCOL, GIVNUM, Q, QPTR, Z, ZTEMP, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER CURLVL, CURPBM, INFO, N, TLVLS -* .. -* .. Array Arguments .. - INTEGER GIVCOL( 2, * ), GIVPTR( * ), PERM( * ), - $ PRMPTR( * ), QPTR( * ) - DOUBLE PRECISION GIVNUM( 2, * ), Q( * ), Z( * ), ZTEMP( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, HALF, ONE - PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 ) -* .. -* .. Local Scalars .. - INTEGER BSIZ1, BSIZ2, CURR, I, K, MID, PSIZ1, PSIZ2, - $ PTR, ZPTR1 -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DGEMV, DROT, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, INT, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( N.LT.0 ) THEN - INFO = -1 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLAEDA', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* Determine location of first number in second half. -* - MID = N / 2 + 1 -* -* Gather last/first rows of appropriate eigenblocks into center of Z -* - PTR = 1 -* -* Determine location of lowest level subproblem in the full storage -* scheme -* - CURR = PTR + CURPBM*2**CURLVL + 2**( CURLVL-1 ) - 1 -* -* Determine size of these matrices. We add HALF to the value of -* the SQRT in case the machine underestimates one of these square -* roots. -* - BSIZ1 = INT( HALF+SQRT( DBLE( QPTR( CURR+1 )-QPTR( CURR ) ) ) ) - BSIZ2 = INT( HALF+SQRT( DBLE( QPTR( CURR+2 )-QPTR( CURR+1 ) ) ) ) - DO 10 K = 1, MID - BSIZ1 - 1 - Z( K ) = ZERO - 10 CONTINUE - CALL DCOPY( BSIZ1, Q( QPTR( CURR )+BSIZ1-1 ), BSIZ1, - $ Z( MID-BSIZ1 ), 1 ) - CALL DCOPY( BSIZ2, Q( QPTR( CURR+1 ) ), BSIZ2, Z( MID ), 1 ) - DO 20 K = MID + BSIZ2, N - Z( K ) = ZERO - 20 CONTINUE -* -* Loop through remaining levels 1 -> CURLVL applying the Givens -* rotations and permutation and then multiplying the center matrices -* against the current Z. -* - PTR = 2**TLVLS + 1 - DO 70 K = 1, CURLVL - 1 - CURR = PTR + CURPBM*2**( CURLVL-K ) + 2**( CURLVL-K-1 ) - 1 - PSIZ1 = PRMPTR( CURR+1 ) - PRMPTR( CURR ) - PSIZ2 = PRMPTR( CURR+2 ) - PRMPTR( CURR+1 ) - ZPTR1 = MID - PSIZ1 -* -* Apply Givens at CURR and CURR+1 -* - DO 30 I = GIVPTR( CURR ), GIVPTR( CURR+1 ) - 1 - CALL DROT( 1, Z( ZPTR1+GIVCOL( 1, I )-1 ), 1, - $ Z( ZPTR1+GIVCOL( 2, I )-1 ), 1, GIVNUM( 1, I ), - $ GIVNUM( 2, I ) ) - 30 CONTINUE - DO 40 I = GIVPTR( CURR+1 ), GIVPTR( CURR+2 ) - 1 - CALL DROT( 1, Z( MID-1+GIVCOL( 1, I ) ), 1, - $ Z( MID-1+GIVCOL( 2, I ) ), 1, GIVNUM( 1, I ), - $ GIVNUM( 2, I ) ) - 40 CONTINUE - PSIZ1 = PRMPTR( CURR+1 ) - PRMPTR( CURR ) - PSIZ2 = PRMPTR( CURR+2 ) - PRMPTR( CURR+1 ) - DO 50 I = 0, PSIZ1 - 1 - ZTEMP( I+1 ) = Z( ZPTR1+PERM( PRMPTR( CURR )+I )-1 ) - 50 CONTINUE - DO 60 I = 0, PSIZ2 - 1 - ZTEMP( PSIZ1+I+1 ) = Z( MID+PERM( PRMPTR( CURR+1 )+I )-1 ) - 60 CONTINUE -* -* Multiply Blocks at CURR and CURR+1 -* -* Determine size of these matrices. We add HALF to the value of -* the SQRT in case the machine underestimates one of these -* square roots. -* - BSIZ1 = INT( HALF+SQRT( DBLE( QPTR( CURR+1 )-QPTR( CURR ) ) ) ) - BSIZ2 = INT( HALF+SQRT( DBLE( QPTR( CURR+2 )-QPTR( CURR+ - $ 1 ) ) ) ) - IF( BSIZ1.GT.0 ) THEN - CALL DGEMV( 'T', BSIZ1, BSIZ1, ONE, Q( QPTR( CURR ) ), - $ BSIZ1, ZTEMP( 1 ), 1, ZERO, Z( ZPTR1 ), 1 ) - END IF - CALL DCOPY( PSIZ1-BSIZ1, ZTEMP( BSIZ1+1 ), 1, Z( ZPTR1+BSIZ1 ), - $ 1 ) - IF( BSIZ2.GT.0 ) THEN - CALL DGEMV( 'T', BSIZ2, BSIZ2, ONE, Q( QPTR( CURR+1 ) ), - $ BSIZ2, ZTEMP( PSIZ1+1 ), 1, ZERO, Z( MID ), 1 ) - END IF - CALL DCOPY( PSIZ2-BSIZ2, ZTEMP( PSIZ1+BSIZ2+1 ), 1, - $ Z( MID+BSIZ2 ), 1 ) -* - PTR = PTR + 2**( TLVLS-K ) - 70 CONTINUE -* - RETURN -* -* End of DLAEDA -* - END diff --git a/lib/linalg/fortran/dlaev2.f b/lib/linalg/fortran/dlaev2.f deleted file mode 100644 index 9e29991a6d..0000000000 --- a/lib/linalg/fortran/dlaev2.f +++ /dev/null @@ -1,235 +0,0 @@ -*> \brief \b DLAEV2 computes the eigenvalues and eigenvectors of a 2-by-2 symmetric/Hermitian matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAEV2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAEV2( A, B, C, RT1, RT2, CS1, SN1 ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION A, B, C, CS1, RT1, RT2, SN1 -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAEV2 computes the eigendecomposition of a 2-by-2 symmetric matrix -*> [ A B ] -*> [ B C ]. -*> On return, RT1 is the eigenvalue of larger absolute value, RT2 is the -*> eigenvalue of smaller absolute value, and (CS1,SN1) is the unit right -*> eigenvector for RT1, giving the decomposition -*> -*> [ CS1 SN1 ] [ A B ] [ CS1 -SN1 ] = [ RT1 0 ] -*> [-SN1 CS1 ] [ B C ] [ SN1 CS1 ] [ 0 RT2 ]. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION -*> The (1,1) element of the 2-by-2 matrix. -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is DOUBLE PRECISION -*> The (1,2) element and the conjugate of the (2,1) element of -*> the 2-by-2 matrix. -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is DOUBLE PRECISION -*> The (2,2) element of the 2-by-2 matrix. -*> \endverbatim -*> -*> \param[out] RT1 -*> \verbatim -*> RT1 is DOUBLE PRECISION -*> The eigenvalue of larger absolute value. -*> \endverbatim -*> -*> \param[out] RT2 -*> \verbatim -*> RT2 is DOUBLE PRECISION -*> The eigenvalue of smaller absolute value. -*> \endverbatim -*> -*> \param[out] CS1 -*> \verbatim -*> CS1 is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[out] SN1 -*> \verbatim -*> SN1 is DOUBLE PRECISION -*> The vector (CS1, SN1) is a unit right eigenvector for RT1. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> RT1 is accurate to a few ulps barring over/underflow. -*> -*> RT2 may be inaccurate if there is massive cancellation in the -*> determinant A*C-B*B; higher precision or correctly rounded or -*> correctly truncated arithmetic would be needed to compute RT2 -*> accurately in all cases. -*> -*> CS1 and SN1 are accurate to a few ulps barring over/underflow. -*> -*> Overflow is possible only if RT1 is within a factor of 5 of overflow. -*> Underflow is harmless if the input data is 0 or exceeds -*> underflow_threshold / macheps. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLAEV2( A, B, C, RT1, RT2, CS1, SN1 ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION A, B, C, CS1, RT1, RT2, SN1 -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D0 ) - DOUBLE PRECISION TWO - PARAMETER ( TWO = 2.0D0 ) - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) - DOUBLE PRECISION HALF - PARAMETER ( HALF = 0.5D0 ) -* .. -* .. Local Scalars .. - INTEGER SGN1, SGN2 - DOUBLE PRECISION AB, ACMN, ACMX, ACS, ADF, CS, CT, DF, RT, SM, - $ TB, TN -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SQRT -* .. -* .. Executable Statements .. -* -* Compute the eigenvalues -* - SM = A + C - DF = A - C - ADF = ABS( DF ) - TB = B + B - AB = ABS( TB ) - IF( ABS( A ).GT.ABS( C ) ) THEN - ACMX = A - ACMN = C - ELSE - ACMX = C - ACMN = A - END IF - IF( ADF.GT.AB ) THEN - RT = ADF*SQRT( ONE+( AB / ADF )**2 ) - ELSE IF( ADF.LT.AB ) THEN - RT = AB*SQRT( ONE+( ADF / AB )**2 ) - ELSE -* -* Includes case AB=ADF=0 -* - RT = AB*SQRT( TWO ) - END IF - IF( SM.LT.ZERO ) THEN - RT1 = HALF*( SM-RT ) - SGN1 = -1 -* -* Order of execution important. -* To get fully accurate smaller eigenvalue, -* next line needs to be executed in higher precision. -* - RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B - ELSE IF( SM.GT.ZERO ) THEN - RT1 = HALF*( SM+RT ) - SGN1 = 1 -* -* Order of execution important. -* To get fully accurate smaller eigenvalue, -* next line needs to be executed in higher precision. -* - RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B - ELSE -* -* Includes case RT1 = RT2 = 0 -* - RT1 = HALF*RT - RT2 = -HALF*RT - SGN1 = 1 - END IF -* -* Compute the eigenvector -* - IF( DF.GE.ZERO ) THEN - CS = DF + RT - SGN2 = 1 - ELSE - CS = DF - RT - SGN2 = -1 - END IF - ACS = ABS( CS ) - IF( ACS.GT.AB ) THEN - CT = -TB / CS - SN1 = ONE / SQRT( ONE+CT*CT ) - CS1 = CT*SN1 - ELSE - IF( AB.EQ.ZERO ) THEN - CS1 = ONE - SN1 = ZERO - ELSE - TN = -CS / TB - CS1 = ONE / SQRT( ONE+TN*TN ) - SN1 = TN*CS1 - END IF - END IF - IF( SGN1.EQ.SGN2 ) THEN - TN = CS1 - CS1 = -SN1 - SN1 = TN - END IF - RETURN -* -* End of DLAEV2 -* - END diff --git a/lib/linalg/fortran/dlaisnan.f b/lib/linalg/fortran/dlaisnan.f deleted file mode 100644 index 2caf5fb1d0..0000000000 --- a/lib/linalg/fortran/dlaisnan.f +++ /dev/null @@ -1,88 +0,0 @@ -*> \brief \b DLAISNAN tests input for NaN by comparing two arguments for inequality. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAISNAN + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* LOGICAL FUNCTION DLAISNAN( DIN1, DIN2 ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION, INTENT(IN) :: DIN1, DIN2 -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> This routine is not for general use. It exists solely to avoid -*> over-optimization in DISNAN. -*> -*> DLAISNAN checks for NaNs by comparing its two arguments for -*> inequality. NaN is the only floating-point value where NaN != NaN -*> returns .TRUE. To check for NaNs, pass the same variable as both -*> arguments. -*> -*> A compiler must assume that the two arguments are -*> not the same variable, and the test will not be optimized away. -*> Interprocedural or whole-program optimization may delete this -*> test. The ISNAN functions will be replaced by the correct -*> Fortran 03 intrinsic once the intrinsic is widely available. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIN1 -*> \verbatim -*> DIN1 is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] DIN2 -*> \verbatim -*> DIN2 is DOUBLE PRECISION -*> Two numbers to compare for inequality. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - LOGICAL FUNCTION DLAISNAN( DIN1, DIN2 ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION, INTENT(IN) :: DIN1, DIN2 -* .. -* -* ===================================================================== -* -* .. Executable Statements .. - DLAISNAN = (DIN1.NE.DIN2) - RETURN - END diff --git a/lib/linalg/fortran/dlals0.f b/lib/linalg/fortran/dlals0.f deleted file mode 100644 index cfca222806..0000000000 --- a/lib/linalg/fortran/dlals0.f +++ /dev/null @@ -1,496 +0,0 @@ -*> \brief \b DLALS0 applies back multiplying factors in solving the least squares problem using divide and conquer SVD approach. Used by sgelsd. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLALS0 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX, -* PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, -* POLES, DIFL, DIFR, Z, K, C, S, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER GIVPTR, ICOMPQ, INFO, K, LDB, LDBX, LDGCOL, -* $ LDGNUM, NL, NR, NRHS, SQRE -* DOUBLE PRECISION C, S -* .. -* .. Array Arguments .. -* INTEGER GIVCOL( LDGCOL, * ), PERM( * ) -* DOUBLE PRECISION B( LDB, * ), BX( LDBX, * ), DIFL( * ), -* $ DIFR( LDGNUM, * ), GIVNUM( LDGNUM, * ), -* $ POLES( LDGNUM, * ), WORK( * ), Z( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLALS0 applies back the multiplying factors of either the left or the -*> right singular vector matrix of a diagonal matrix appended by a row -*> to the right hand side matrix B in solving the least squares problem -*> using the divide-and-conquer SVD approach. -*> -*> For the left singular vector matrix, three types of orthogonal -*> matrices are involved: -*> -*> (1L) Givens rotations: the number of such rotations is GIVPTR; the -*> pairs of columns/rows they were applied to are stored in GIVCOL; -*> and the C- and S-values of these rotations are stored in GIVNUM. -*> -*> (2L) Permutation. The (NL+1)-st row of B is to be moved to the first -*> row, and for J=2:N, PERM(J)-th row of B is to be moved to the -*> J-th row. -*> -*> (3L) The left singular vector matrix of the remaining matrix. -*> -*> For the right singular vector matrix, four types of orthogonal -*> matrices are involved: -*> -*> (1R) The right singular vector matrix of the remaining matrix. -*> -*> (2R) If SQRE = 1, one extra Givens rotation to generate the right -*> null space. -*> -*> (3R) The inverse transformation of (2L). -*> -*> (4R) The inverse transformation of (1L). -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ICOMPQ -*> \verbatim -*> ICOMPQ is INTEGER -*> Specifies whether singular vectors are to be computed in -*> factored form: -*> = 0: Left singular vector matrix. -*> = 1: Right singular vector matrix. -*> \endverbatim -*> -*> \param[in] NL -*> \verbatim -*> NL is INTEGER -*> The row dimension of the upper block. NL >= 1. -*> \endverbatim -*> -*> \param[in] NR -*> \verbatim -*> NR is INTEGER -*> The row dimension of the lower block. NR >= 1. -*> \endverbatim -*> -*> \param[in] SQRE -*> \verbatim -*> SQRE is INTEGER -*> = 0: the lower block is an NR-by-NR square matrix. -*> = 1: the lower block is an NR-by-(NR+1) rectangular matrix. -*> -*> The bidiagonal matrix has row dimension N = NL + NR + 1, -*> and column dimension M = N + SQRE. -*> \endverbatim -*> -*> \param[in] NRHS -*> \verbatim -*> NRHS is INTEGER -*> The number of columns of B and BX. NRHS must be at least 1. -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension ( LDB, NRHS ) -*> On input, B contains the right hand sides of the least -*> squares problem in rows 1 through M. On output, B contains -*> the solution X in rows 1 through N. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of B. LDB must be at least -*> max(1,MAX( M, N ) ). -*> \endverbatim -*> -*> \param[out] BX -*> \verbatim -*> BX is DOUBLE PRECISION array, dimension ( LDBX, NRHS ) -*> \endverbatim -*> -*> \param[in] LDBX -*> \verbatim -*> LDBX is INTEGER -*> The leading dimension of BX. -*> \endverbatim -*> -*> \param[in] PERM -*> \verbatim -*> PERM is INTEGER array, dimension ( N ) -*> The permutations (from deflation and sorting) applied -*> to the two blocks. -*> \endverbatim -*> -*> \param[in] GIVPTR -*> \verbatim -*> GIVPTR is INTEGER -*> The number of Givens rotations which took place in this -*> subproblem. -*> \endverbatim -*> -*> \param[in] GIVCOL -*> \verbatim -*> GIVCOL is INTEGER array, dimension ( LDGCOL, 2 ) -*> Each pair of numbers indicates a pair of rows/columns -*> involved in a Givens rotation. -*> \endverbatim -*> -*> \param[in] LDGCOL -*> \verbatim -*> LDGCOL is INTEGER -*> The leading dimension of GIVCOL, must be at least N. -*> \endverbatim -*> -*> \param[in] GIVNUM -*> \verbatim -*> GIVNUM is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) -*> Each number indicates the C or S value used in the -*> corresponding Givens rotation. -*> \endverbatim -*> -*> \param[in] LDGNUM -*> \verbatim -*> LDGNUM is INTEGER -*> The leading dimension of arrays DIFR, POLES and -*> GIVNUM, must be at least K. -*> \endverbatim -*> -*> \param[in] POLES -*> \verbatim -*> POLES is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) -*> On entry, POLES(1:K, 1) contains the new singular -*> values obtained from solving the secular equation, and -*> POLES(1:K, 2) is an array containing the poles in the secular -*> equation. -*> \endverbatim -*> -*> \param[in] DIFL -*> \verbatim -*> DIFL is DOUBLE PRECISION array, dimension ( K ). -*> On entry, DIFL(I) is the distance between I-th updated -*> (undeflated) singular value and the I-th (undeflated) old -*> singular value. -*> \endverbatim -*> -*> \param[in] DIFR -*> \verbatim -*> DIFR is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ). -*> On entry, DIFR(I, 1) contains the distances between I-th -*> updated (undeflated) singular value and the I+1-th -*> (undeflated) old singular value. And DIFR(I, 2) is the -*> normalizing factor for the I-th right singular vector. -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension ( K ) -*> Contain the components of the deflation-adjusted updating row -*> vector. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> Contains the dimension of the non-deflated matrix, -*> This is the order of the related secular equation. 1 <= K <=N. -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is DOUBLE PRECISION -*> C contains garbage if SQRE =0 and the C-value of a Givens -*> rotation related to the right null space if SQRE = 1. -*> \endverbatim -*> -*> \param[in] S -*> \verbatim -*> S is DOUBLE PRECISION -*> S contains garbage if SQRE =0 and the S-value of a Givens -*> rotation related to the right null space if SQRE = 1. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension ( K ) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Ming Gu and Ren-Cang Li, Computer Science Division, University of -*> California at Berkeley, USA \n -*> Osni Marques, LBNL/NERSC, USA \n -* -* ===================================================================== - SUBROUTINE DLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX, - $ PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, - $ POLES, DIFL, DIFR, Z, K, C, S, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER GIVPTR, ICOMPQ, INFO, K, LDB, LDBX, LDGCOL, - $ LDGNUM, NL, NR, NRHS, SQRE - DOUBLE PRECISION C, S -* .. -* .. Array Arguments .. - INTEGER GIVCOL( LDGCOL, * ), PERM( * ) - DOUBLE PRECISION B( LDB, * ), BX( LDBX, * ), DIFL( * ), - $ DIFR( LDGNUM, * ), GIVNUM( LDGNUM, * ), - $ POLES( LDGNUM, * ), WORK( * ), Z( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO, NEGONE - PARAMETER ( ONE = 1.0D0, ZERO = 0.0D0, NEGONE = -1.0D0 ) -* .. -* .. Local Scalars .. - INTEGER I, J, M, N, NLP1 - DOUBLE PRECISION DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, TEMP -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DGEMV, DLACPY, DLASCL, DROT, DSCAL, - $ XERBLA -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMC3, DNRM2 - EXTERNAL DLAMC3, DNRM2 -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - N = NL + NR + 1 -* - IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN - INFO = -1 - ELSE IF( NL.LT.1 ) THEN - INFO = -2 - ELSE IF( NR.LT.1 ) THEN - INFO = -3 - ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN - INFO = -4 - ELSE IF( NRHS.LT.1 ) THEN - INFO = -5 - ELSE IF( LDB.LT.N ) THEN - INFO = -7 - ELSE IF( LDBX.LT.N ) THEN - INFO = -9 - ELSE IF( GIVPTR.LT.0 ) THEN - INFO = -11 - ELSE IF( LDGCOL.LT.N ) THEN - INFO = -13 - ELSE IF( LDGNUM.LT.N ) THEN - INFO = -15 - ELSE IF( K.LT.1 ) THEN - INFO = -20 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLALS0', -INFO ) - RETURN - END IF -* - M = N + SQRE - NLP1 = NL + 1 -* - IF( ICOMPQ.EQ.0 ) THEN -* -* Apply back orthogonal transformations from the left. -* -* Step (1L): apply back the Givens rotations performed. -* - DO 10 I = 1, GIVPTR - CALL DROT( NRHS, B( GIVCOL( I, 2 ), 1 ), LDB, - $ B( GIVCOL( I, 1 ), 1 ), LDB, GIVNUM( I, 2 ), - $ GIVNUM( I, 1 ) ) - 10 CONTINUE -* -* Step (2L): permute rows of B. -* - CALL DCOPY( NRHS, B( NLP1, 1 ), LDB, BX( 1, 1 ), LDBX ) - DO 20 I = 2, N - CALL DCOPY( NRHS, B( PERM( I ), 1 ), LDB, BX( I, 1 ), LDBX ) - 20 CONTINUE -* -* Step (3L): apply the inverse of the left singular vector -* matrix to BX. -* - IF( K.EQ.1 ) THEN - CALL DCOPY( NRHS, BX, LDBX, B, LDB ) - IF( Z( 1 ).LT.ZERO ) THEN - CALL DSCAL( NRHS, NEGONE, B, LDB ) - END IF - ELSE - DO 50 J = 1, K - DIFLJ = DIFL( J ) - DJ = POLES( J, 1 ) - DSIGJ = -POLES( J, 2 ) - IF( J.LT.K ) THEN - DIFRJ = -DIFR( J, 1 ) - DSIGJP = -POLES( J+1, 2 ) - END IF - IF( ( Z( J ).EQ.ZERO ) .OR. ( POLES( J, 2 ).EQ.ZERO ) ) - $ THEN - WORK( J ) = ZERO - ELSE - WORK( J ) = -POLES( J, 2 )*Z( J ) / DIFLJ / - $ ( POLES( J, 2 )+DJ ) - END IF - DO 30 I = 1, J - 1 - IF( ( Z( I ).EQ.ZERO ) .OR. - $ ( POLES( I, 2 ).EQ.ZERO ) ) THEN - WORK( I ) = ZERO - ELSE - WORK( I ) = POLES( I, 2 )*Z( I ) / - $ ( DLAMC3( POLES( I, 2 ), DSIGJ )- - $ DIFLJ ) / ( POLES( I, 2 )+DJ ) - END IF - 30 CONTINUE - DO 40 I = J + 1, K - IF( ( Z( I ).EQ.ZERO ) .OR. - $ ( POLES( I, 2 ).EQ.ZERO ) ) THEN - WORK( I ) = ZERO - ELSE - WORK( I ) = POLES( I, 2 )*Z( I ) / - $ ( DLAMC3( POLES( I, 2 ), DSIGJP )+ - $ DIFRJ ) / ( POLES( I, 2 )+DJ ) - END IF - 40 CONTINUE - WORK( 1 ) = NEGONE - TEMP = DNRM2( K, WORK, 1 ) - CALL DGEMV( 'T', K, NRHS, ONE, BX, LDBX, WORK, 1, ZERO, - $ B( J, 1 ), LDB ) - CALL DLASCL( 'G', 0, 0, TEMP, ONE, 1, NRHS, B( J, 1 ), - $ LDB, INFO ) - 50 CONTINUE - END IF -* -* Move the deflated rows of BX to B also. -* - IF( K.LT.MAX( M, N ) ) - $ CALL DLACPY( 'A', N-K, NRHS, BX( K+1, 1 ), LDBX, - $ B( K+1, 1 ), LDB ) - ELSE -* -* Apply back the right orthogonal transformations. -* -* Step (1R): apply back the new right singular vector matrix -* to B. -* - IF( K.EQ.1 ) THEN - CALL DCOPY( NRHS, B, LDB, BX, LDBX ) - ELSE - DO 80 J = 1, K - DSIGJ = POLES( J, 2 ) - IF( Z( J ).EQ.ZERO ) THEN - WORK( J ) = ZERO - ELSE - WORK( J ) = -Z( J ) / DIFL( J ) / - $ ( DSIGJ+POLES( J, 1 ) ) / DIFR( J, 2 ) - END IF - DO 60 I = 1, J - 1 - IF( Z( J ).EQ.ZERO ) THEN - WORK( I ) = ZERO - ELSE - WORK( I ) = Z( J ) / ( DLAMC3( DSIGJ, -POLES( I+1, - $ 2 ) )-DIFR( I, 1 ) ) / - $ ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 ) - END IF - 60 CONTINUE - DO 70 I = J + 1, K - IF( Z( J ).EQ.ZERO ) THEN - WORK( I ) = ZERO - ELSE - WORK( I ) = Z( J ) / ( DLAMC3( DSIGJ, -POLES( I, - $ 2 ) )-DIFL( I ) ) / - $ ( DSIGJ+POLES( I, 1 ) ) / DIFR( I, 2 ) - END IF - 70 CONTINUE - CALL DGEMV( 'T', K, NRHS, ONE, B, LDB, WORK, 1, ZERO, - $ BX( J, 1 ), LDBX ) - 80 CONTINUE - END IF -* -* Step (2R): if SQRE = 1, apply back the rotation that is -* related to the right null space of the subproblem. -* - IF( SQRE.EQ.1 ) THEN - CALL DCOPY( NRHS, B( M, 1 ), LDB, BX( M, 1 ), LDBX ) - CALL DROT( NRHS, BX( 1, 1 ), LDBX, BX( M, 1 ), LDBX, C, S ) - END IF - IF( K.LT.MAX( M, N ) ) - $ CALL DLACPY( 'A', N-K, NRHS, B( K+1, 1 ), LDB, BX( K+1, 1 ), - $ LDBX ) -* -* Step (3R): permute rows of B. -* - CALL DCOPY( NRHS, BX( 1, 1 ), LDBX, B( NLP1, 1 ), LDB ) - IF( SQRE.EQ.1 ) THEN - CALL DCOPY( NRHS, BX( M, 1 ), LDBX, B( M, 1 ), LDB ) - END IF - DO 90 I = 2, N - CALL DCOPY( NRHS, BX( I, 1 ), LDBX, B( PERM( I ), 1 ), LDB ) - 90 CONTINUE -* -* Step (4R): apply back the Givens rotations performed. -* - DO 100 I = GIVPTR, 1, -1 - CALL DROT( NRHS, B( GIVCOL( I, 2 ), 1 ), LDB, - $ B( GIVCOL( I, 1 ), 1 ), LDB, GIVNUM( I, 2 ), - $ -GIVNUM( I, 1 ) ) - 100 CONTINUE - END IF -* - RETURN -* -* End of DLALS0 -* - END diff --git a/lib/linalg/fortran/dlalsa.f b/lib/linalg/fortran/dlalsa.f deleted file mode 100644 index da8e0fa175..0000000000 --- a/lib/linalg/fortran/dlalsa.f +++ /dev/null @@ -1,490 +0,0 @@ -*> \brief \b DLALSA computes the SVD of the coefficient matrix in compact form. Used by sgelsd. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLALSA + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLALSA( ICOMPQ, SMLSIZ, N, NRHS, B, LDB, BX, LDBX, U, -* LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR, -* GIVCOL, LDGCOL, PERM, GIVNUM, C, S, WORK, -* IWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER ICOMPQ, INFO, LDB, LDBX, LDGCOL, LDU, N, NRHS, -* $ SMLSIZ -* .. -* .. Array Arguments .. -* INTEGER GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ), -* $ K( * ), PERM( LDGCOL, * ) -* DOUBLE PRECISION B( LDB, * ), BX( LDBX, * ), C( * ), -* $ DIFL( LDU, * ), DIFR( LDU, * ), -* $ GIVNUM( LDU, * ), POLES( LDU, * ), S( * ), -* $ U( LDU, * ), VT( LDU, * ), WORK( * ), -* $ Z( LDU, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLALSA is an itermediate step in solving the least squares problem -*> by computing the SVD of the coefficient matrix in compact form (The -*> singular vectors are computed as products of simple orthorgonal -*> matrices.). -*> -*> If ICOMPQ = 0, DLALSA applies the inverse of the left singular vector -*> matrix of an upper bidiagonal matrix to the right hand side; and if -*> ICOMPQ = 1, DLALSA applies the right singular vector matrix to the -*> right hand side. The singular vector matrices were generated in -*> compact form by DLALSA. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ICOMPQ -*> \verbatim -*> ICOMPQ is INTEGER -*> Specifies whether the left or the right singular vector -*> matrix is involved. -*> = 0: Left singular vector matrix -*> = 1: Right singular vector matrix -*> \endverbatim -*> -*> \param[in] SMLSIZ -*> \verbatim -*> SMLSIZ is INTEGER -*> The maximum size of the subproblems at the bottom of the -*> computation tree. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The row and column dimensions of the upper bidiagonal matrix. -*> \endverbatim -*> -*> \param[in] NRHS -*> \verbatim -*> NRHS is INTEGER -*> The number of columns of B and BX. NRHS must be at least 1. -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension ( LDB, NRHS ) -*> On input, B contains the right hand sides of the least -*> squares problem in rows 1 through M. -*> On output, B contains the solution X in rows 1 through N. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of B in the calling subprogram. -*> LDB must be at least max(1,MAX( M, N ) ). -*> \endverbatim -*> -*> \param[out] BX -*> \verbatim -*> BX is DOUBLE PRECISION array, dimension ( LDBX, NRHS ) -*> On exit, the result of applying the left or right singular -*> vector matrix to B. -*> \endverbatim -*> -*> \param[in] LDBX -*> \verbatim -*> LDBX is INTEGER -*> The leading dimension of BX. -*> \endverbatim -*> -*> \param[in] U -*> \verbatim -*> U is DOUBLE PRECISION array, dimension ( LDU, SMLSIZ ). -*> On entry, U contains the left singular vector matrices of all -*> subproblems at the bottom level. -*> \endverbatim -*> -*> \param[in] LDU -*> \verbatim -*> LDU is INTEGER, LDU = > N. -*> The leading dimension of arrays U, VT, DIFL, DIFR, -*> POLES, GIVNUM, and Z. -*> \endverbatim -*> -*> \param[in] VT -*> \verbatim -*> VT is DOUBLE PRECISION array, dimension ( LDU, SMLSIZ+1 ). -*> On entry, VT**T contains the right singular vector matrices of -*> all subproblems at the bottom level. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER array, dimension ( N ). -*> \endverbatim -*> -*> \param[in] DIFL -*> \verbatim -*> DIFL is DOUBLE PRECISION array, dimension ( LDU, NLVL ). -*> where NLVL = INT(log_2 (N/(SMLSIZ+1))) + 1. -*> \endverbatim -*> -*> \param[in] DIFR -*> \verbatim -*> DIFR is DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ). -*> On entry, DIFL(*, I) and DIFR(*, 2 * I -1) record -*> distances between singular values on the I-th level and -*> singular values on the (I -1)-th level, and DIFR(*, 2 * I) -*> record the normalizing factors of the right singular vectors -*> matrices of subproblems on I-th level. -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension ( LDU, NLVL ). -*> On entry, Z(1, I) contains the components of the deflation- -*> adjusted updating row vector for subproblems on the I-th -*> level. -*> \endverbatim -*> -*> \param[in] POLES -*> \verbatim -*> POLES is DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ). -*> On entry, POLES(*, 2 * I -1: 2 * I) contains the new and old -*> singular values involved in the secular equations on the I-th -*> level. -*> \endverbatim -*> -*> \param[in] GIVPTR -*> \verbatim -*> GIVPTR is INTEGER array, dimension ( N ). -*> On entry, GIVPTR( I ) records the number of Givens -*> rotations performed on the I-th problem on the computation -*> tree. -*> \endverbatim -*> -*> \param[in] GIVCOL -*> \verbatim -*> GIVCOL is INTEGER array, dimension ( LDGCOL, 2 * NLVL ). -*> On entry, for each I, GIVCOL(*, 2 * I - 1: 2 * I) records the -*> locations of Givens rotations performed on the I-th level on -*> the computation tree. -*> \endverbatim -*> -*> \param[in] LDGCOL -*> \verbatim -*> LDGCOL is INTEGER, LDGCOL = > N. -*> The leading dimension of arrays GIVCOL and PERM. -*> \endverbatim -*> -*> \param[in] PERM -*> \verbatim -*> PERM is INTEGER array, dimension ( LDGCOL, NLVL ). -*> On entry, PERM(*, I) records permutations done on the I-th -*> level of the computation tree. -*> \endverbatim -*> -*> \param[in] GIVNUM -*> \verbatim -*> GIVNUM is DOUBLE PRECISION array, dimension ( LDU, 2 * NLVL ). -*> On entry, GIVNUM(*, 2 *I -1 : 2 * I) records the C- and S- -*> values of Givens rotations performed on the I-th level on the -*> computation tree. -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension ( N ). -*> On entry, if the I-th subproblem is not square, -*> C( I ) contains the C-value of a Givens rotation related to -*> the right null space of the I-th subproblem. -*> \endverbatim -*> -*> \param[in] S -*> \verbatim -*> S is DOUBLE PRECISION array, dimension ( N ). -*> On entry, if the I-th subproblem is not square, -*> S( I ) contains the S-value of a Givens rotation related to -*> the right null space of the I-th subproblem. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (N) -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension (3*N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Ming Gu and Ren-Cang Li, Computer Science Division, University of -*> California at Berkeley, USA \n -*> Osni Marques, LBNL/NERSC, USA \n -* -* ===================================================================== - SUBROUTINE DLALSA( ICOMPQ, SMLSIZ, N, NRHS, B, LDB, BX, LDBX, U, - $ LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR, - $ GIVCOL, LDGCOL, PERM, GIVNUM, C, S, WORK, - $ IWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER ICOMPQ, INFO, LDB, LDBX, LDGCOL, LDU, N, NRHS, - $ SMLSIZ -* .. -* .. Array Arguments .. - INTEGER GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ), - $ K( * ), PERM( LDGCOL, * ) - DOUBLE PRECISION B( LDB, * ), BX( LDBX, * ), C( * ), - $ DIFL( LDU, * ), DIFR( LDU, * ), - $ GIVNUM( LDU, * ), POLES( LDU, * ), S( * ), - $ U( LDU, * ), VT( LDU, * ), WORK( * ), - $ Z( LDU, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) -* .. -* .. Local Scalars .. - INTEGER I, I1, IC, IM1, INODE, J, LF, LL, LVL, LVL2, - $ ND, NDB1, NDIML, NDIMR, NL, NLF, NLP1, NLVL, - $ NR, NRF, NRP1, SQRE -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DGEMM, DLALS0, DLASDT, XERBLA -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN - INFO = -1 - ELSE IF( SMLSIZ.LT.3 ) THEN - INFO = -2 - ELSE IF( N.LT.SMLSIZ ) THEN - INFO = -3 - ELSE IF( NRHS.LT.1 ) THEN - INFO = -4 - ELSE IF( LDB.LT.N ) THEN - INFO = -6 - ELSE IF( LDBX.LT.N ) THEN - INFO = -8 - ELSE IF( LDU.LT.N ) THEN - INFO = -10 - ELSE IF( LDGCOL.LT.N ) THEN - INFO = -19 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLALSA', -INFO ) - RETURN - END IF -* -* Book-keeping and setting up the computation tree. -* - INODE = 1 - NDIML = INODE + N - NDIMR = NDIML + N -* - CALL DLASDT( N, NLVL, ND, IWORK( INODE ), IWORK( NDIML ), - $ IWORK( NDIMR ), SMLSIZ ) -* -* The following code applies back the left singular vector factors. -* For applying back the right singular vector factors, go to 50. -* - IF( ICOMPQ.EQ.1 ) THEN - GO TO 50 - END IF -* -* The nodes on the bottom level of the tree were solved -* by DLASDQ. The corresponding left and right singular vector -* matrices are in explicit form. First apply back the left -* singular vector matrices. -* - NDB1 = ( ND+1 ) / 2 - DO 10 I = NDB1, ND -* -* IC : center row of each node -* NL : number of rows of left subproblem -* NR : number of rows of right subproblem -* NLF: starting row of the left subproblem -* NRF: starting row of the right subproblem -* - I1 = I - 1 - IC = IWORK( INODE+I1 ) - NL = IWORK( NDIML+I1 ) - NR = IWORK( NDIMR+I1 ) - NLF = IC - NL - NRF = IC + 1 - CALL DGEMM( 'T', 'N', NL, NRHS, NL, ONE, U( NLF, 1 ), LDU, - $ B( NLF, 1 ), LDB, ZERO, BX( NLF, 1 ), LDBX ) - CALL DGEMM( 'T', 'N', NR, NRHS, NR, ONE, U( NRF, 1 ), LDU, - $ B( NRF, 1 ), LDB, ZERO, BX( NRF, 1 ), LDBX ) - 10 CONTINUE -* -* Next copy the rows of B that correspond to unchanged rows -* in the bidiagonal matrix to BX. -* - DO 20 I = 1, ND - IC = IWORK( INODE+I-1 ) - CALL DCOPY( NRHS, B( IC, 1 ), LDB, BX( IC, 1 ), LDBX ) - 20 CONTINUE -* -* Finally go through the left singular vector matrices of all -* the other subproblems bottom-up on the tree. -* - J = 2**NLVL - SQRE = 0 -* - DO 40 LVL = NLVL, 1, -1 - LVL2 = 2*LVL - 1 -* -* find the first node LF and last node LL on -* the current level LVL -* - IF( LVL.EQ.1 ) THEN - LF = 1 - LL = 1 - ELSE - LF = 2**( LVL-1 ) - LL = 2*LF - 1 - END IF - DO 30 I = LF, LL - IM1 = I - 1 - IC = IWORK( INODE+IM1 ) - NL = IWORK( NDIML+IM1 ) - NR = IWORK( NDIMR+IM1 ) - NLF = IC - NL - NRF = IC + 1 - J = J - 1 - CALL DLALS0( ICOMPQ, NL, NR, SQRE, NRHS, BX( NLF, 1 ), LDBX, - $ B( NLF, 1 ), LDB, PERM( NLF, LVL ), - $ GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL, - $ GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ), - $ DIFL( NLF, LVL ), DIFR( NLF, LVL2 ), - $ Z( NLF, LVL ), K( J ), C( J ), S( J ), WORK, - $ INFO ) - 30 CONTINUE - 40 CONTINUE - GO TO 90 -* -* ICOMPQ = 1: applying back the right singular vector factors. -* - 50 CONTINUE -* -* First now go through the right singular vector matrices of all -* the tree nodes top-down. -* - J = 0 - DO 70 LVL = 1, NLVL - LVL2 = 2*LVL - 1 -* -* Find the first node LF and last node LL on -* the current level LVL. -* - IF( LVL.EQ.1 ) THEN - LF = 1 - LL = 1 - ELSE - LF = 2**( LVL-1 ) - LL = 2*LF - 1 - END IF - DO 60 I = LL, LF, -1 - IM1 = I - 1 - IC = IWORK( INODE+IM1 ) - NL = IWORK( NDIML+IM1 ) - NR = IWORK( NDIMR+IM1 ) - NLF = IC - NL - NRF = IC + 1 - IF( I.EQ.LL ) THEN - SQRE = 0 - ELSE - SQRE = 1 - END IF - J = J + 1 - CALL DLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B( NLF, 1 ), LDB, - $ BX( NLF, 1 ), LDBX, PERM( NLF, LVL ), - $ GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL, - $ GIVNUM( NLF, LVL2 ), LDU, POLES( NLF, LVL2 ), - $ DIFL( NLF, LVL ), DIFR( NLF, LVL2 ), - $ Z( NLF, LVL ), K( J ), C( J ), S( J ), WORK, - $ INFO ) - 60 CONTINUE - 70 CONTINUE -* -* The nodes on the bottom level of the tree were solved -* by DLASDQ. The corresponding right singular vector -* matrices are in explicit form. Apply them back. -* - NDB1 = ( ND+1 ) / 2 - DO 80 I = NDB1, ND - I1 = I - 1 - IC = IWORK( INODE+I1 ) - NL = IWORK( NDIML+I1 ) - NR = IWORK( NDIMR+I1 ) - NLP1 = NL + 1 - IF( I.EQ.ND ) THEN - NRP1 = NR - ELSE - NRP1 = NR + 1 - END IF - NLF = IC - NL - NRF = IC + 1 - CALL DGEMM( 'T', 'N', NLP1, NRHS, NLP1, ONE, VT( NLF, 1 ), LDU, - $ B( NLF, 1 ), LDB, ZERO, BX( NLF, 1 ), LDBX ) - CALL DGEMM( 'T', 'N', NRP1, NRHS, NRP1, ONE, VT( NRF, 1 ), LDU, - $ B( NRF, 1 ), LDB, ZERO, BX( NRF, 1 ), LDBX ) - 80 CONTINUE -* - 90 CONTINUE -* - RETURN -* -* End of DLALSA -* - END diff --git a/lib/linalg/fortran/dlalsd.f b/lib/linalg/fortran/dlalsd.f deleted file mode 100644 index d22c45dc6e..0000000000 --- a/lib/linalg/fortran/dlalsd.f +++ /dev/null @@ -1,520 +0,0 @@ -*> \brief \b DLALSD uses the singular value decomposition of A to solve the least squares problem. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLALSD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, -* RANK, WORK, IWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDB, N, NRHS, RANK, SMLSIZ -* DOUBLE PRECISION RCOND -* .. -* .. Array Arguments .. -* INTEGER IWORK( * ) -* DOUBLE PRECISION B( LDB, * ), D( * ), E( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLALSD uses the singular value decomposition of A to solve the least -*> squares problem of finding X to minimize the Euclidean norm of each -*> column of A*X-B, where A is N-by-N upper bidiagonal, and X and B -*> are N-by-NRHS. The solution X overwrites B. -*> -*> The singular values of A smaller than RCOND times the largest -*> singular value are treated as zero in solving the least squares -*> problem; in this case a minimum norm solution is returned. -*> The actual singular values are returned in D in ascending order. -*> -*> This code makes very mild assumptions about floating point -*> arithmetic. It will work on machines with a guard digit in -*> add/subtract, or on those binary machines without guard digits -*> which subtract like the Cray XMP, Cray YMP, Cray C 90, or Cray 2. -*> It could conceivably fail on hexadecimal or decimal machines -*> without guard digits, but we know of none. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': D and E define an upper bidiagonal matrix. -*> = 'L': D and E define a lower bidiagonal matrix. -*> \endverbatim -*> -*> \param[in] SMLSIZ -*> \verbatim -*> SMLSIZ is INTEGER -*> The maximum size of the subproblems at the bottom of the -*> computation tree. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The dimension of the bidiagonal matrix. N >= 0. -*> \endverbatim -*> -*> \param[in] NRHS -*> \verbatim -*> NRHS is INTEGER -*> The number of columns of B. NRHS must be at least 1. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry D contains the main diagonal of the bidiagonal -*> matrix. On exit, if INFO = 0, D contains its singular values. -*> \endverbatim -*> -*> \param[in,out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> Contains the super-diagonal entries of the bidiagonal matrix. -*> On exit, E has been destroyed. -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB,NRHS) -*> On input, B contains the right hand sides of the least -*> squares problem. On output, B contains the solution X. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of B in the calling subprogram. -*> LDB must be at least max(1,N). -*> \endverbatim -*> -*> \param[in] RCOND -*> \verbatim -*> RCOND is DOUBLE PRECISION -*> The singular values of A less than or equal to RCOND times -*> the largest singular value are treated as zero in solving -*> the least squares problem. If RCOND is negative, -*> machine precision is used instead. -*> For example, if diag(S)*X=B were the least squares problem, -*> where diag(S) is a diagonal matrix of singular values, the -*> solution would be X(i) = B(i) / S(i) if S(i) is greater than -*> RCOND*max(S), and X(i) = 0 if S(i) is less than or equal to -*> RCOND*max(S). -*> \endverbatim -*> -*> \param[out] RANK -*> \verbatim -*> RANK is INTEGER -*> The number of singular values of A greater than RCOND times -*> the largest singular value. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension at least -*> (9*N + 2*N*SMLSIZ + 8*N*NLVL + N*NRHS + (SMLSIZ+1)**2), -*> where NLVL = max(0, INT(log_2 (N/(SMLSIZ+1))) + 1). -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension at least -*> (3*N*NLVL + 11*N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: The algorithm failed to compute a singular value while -*> working on the submatrix lying in rows and columns -*> INFO/(N+1) through MOD(INFO,N+1). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Ming Gu and Ren-Cang Li, Computer Science Division, University of -*> California at Berkeley, USA \n -*> Osni Marques, LBNL/NERSC, USA \n -* -* ===================================================================== - SUBROUTINE DLALSD( UPLO, SMLSIZ, N, NRHS, D, E, B, LDB, RCOND, - $ RANK, WORK, IWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDB, N, NRHS, RANK, SMLSIZ - DOUBLE PRECISION RCOND -* .. -* .. Array Arguments .. - INTEGER IWORK( * ) - DOUBLE PRECISION B( LDB, * ), D( * ), E( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE, TWO - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0 ) -* .. -* .. Local Scalars .. - INTEGER BX, BXST, C, DIFL, DIFR, GIVCOL, GIVNUM, - $ GIVPTR, I, ICMPQ1, ICMPQ2, IWK, J, K, NLVL, - $ NM1, NSIZE, NSUB, NWORK, PERM, POLES, S, SIZEI, - $ SMLSZP, SQRE, ST, ST1, U, VT, Z - DOUBLE PRECISION CS, EPS, ORGNRM, R, RCND, SN, TOL -* .. -* .. External Functions .. - INTEGER IDAMAX - DOUBLE PRECISION DLAMCH, DLANST - EXTERNAL IDAMAX, DLAMCH, DLANST -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DGEMM, DLACPY, DLALSA, DLARTG, DLASCL, - $ DLASDA, DLASDQ, DLASET, DLASRT, DROT, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, INT, LOG, SIGN -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( NRHS.LT.1 ) THEN - INFO = -4 - ELSE IF( ( LDB.LT.1 ) .OR. ( LDB.LT.N ) ) THEN - INFO = -8 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLALSD', -INFO ) - RETURN - END IF -* - EPS = DLAMCH( 'Epsilon' ) -* -* Set up the tolerance. -* - IF( ( RCOND.LE.ZERO ) .OR. ( RCOND.GE.ONE ) ) THEN - RCND = EPS - ELSE - RCND = RCOND - END IF -* - RANK = 0 -* -* Quick return if possible. -* - IF( N.EQ.0 ) THEN - RETURN - ELSE IF( N.EQ.1 ) THEN - IF( D( 1 ).EQ.ZERO ) THEN - CALL DLASET( 'A', 1, NRHS, ZERO, ZERO, B, LDB ) - ELSE - RANK = 1 - CALL DLASCL( 'G', 0, 0, D( 1 ), ONE, 1, NRHS, B, LDB, INFO ) - D( 1 ) = ABS( D( 1 ) ) - END IF - RETURN - END IF -* -* Rotate the matrix if it is lower bidiagonal. -* - IF( UPLO.EQ.'L' ) THEN - DO 10 I = 1, N - 1 - CALL DLARTG( D( I ), E( I ), CS, SN, R ) - D( I ) = R - E( I ) = SN*D( I+1 ) - D( I+1 ) = CS*D( I+1 ) - IF( NRHS.EQ.1 ) THEN - CALL DROT( 1, B( I, 1 ), 1, B( I+1, 1 ), 1, CS, SN ) - ELSE - WORK( I*2-1 ) = CS - WORK( I*2 ) = SN - END IF - 10 CONTINUE - IF( NRHS.GT.1 ) THEN - DO 30 I = 1, NRHS - DO 20 J = 1, N - 1 - CS = WORK( J*2-1 ) - SN = WORK( J*2 ) - CALL DROT( 1, B( J, I ), 1, B( J+1, I ), 1, CS, SN ) - 20 CONTINUE - 30 CONTINUE - END IF - END IF -* -* Scale. -* - NM1 = N - 1 - ORGNRM = DLANST( 'M', N, D, E ) - IF( ORGNRM.EQ.ZERO ) THEN - CALL DLASET( 'A', N, NRHS, ZERO, ZERO, B, LDB ) - RETURN - END IF -* - CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO ) - CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, NM1, 1, E, NM1, INFO ) -* -* If N is smaller than the minimum divide size SMLSIZ, then solve -* the problem with another solver. -* - IF( N.LE.SMLSIZ ) THEN - NWORK = 1 + N*N - CALL DLASET( 'A', N, N, ZERO, ONE, WORK, N ) - CALL DLASDQ( 'U', 0, N, N, 0, NRHS, D, E, WORK, N, WORK, N, B, - $ LDB, WORK( NWORK ), INFO ) - IF( INFO.NE.0 ) THEN - RETURN - END IF - TOL = RCND*ABS( D( IDAMAX( N, D, 1 ) ) ) - DO 40 I = 1, N - IF( D( I ).LE.TOL ) THEN - CALL DLASET( 'A', 1, NRHS, ZERO, ZERO, B( I, 1 ), LDB ) - ELSE - CALL DLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS, B( I, 1 ), - $ LDB, INFO ) - RANK = RANK + 1 - END IF - 40 CONTINUE - CALL DGEMM( 'T', 'N', N, NRHS, N, ONE, WORK, N, B, LDB, ZERO, - $ WORK( NWORK ), N ) - CALL DLACPY( 'A', N, NRHS, WORK( NWORK ), N, B, LDB ) -* -* Unscale. -* - CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO ) - CALL DLASRT( 'D', N, D, INFO ) - CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, NRHS, B, LDB, INFO ) -* - RETURN - END IF -* -* Book-keeping and setting up some constants. -* - NLVL = INT( LOG( DBLE( N ) / DBLE( SMLSIZ+1 ) ) / LOG( TWO ) ) + 1 -* - SMLSZP = SMLSIZ + 1 -* - U = 1 - VT = 1 + SMLSIZ*N - DIFL = VT + SMLSZP*N - DIFR = DIFL + NLVL*N - Z = DIFR + NLVL*N*2 - C = Z + NLVL*N - S = C + N - POLES = S + N - GIVNUM = POLES + 2*NLVL*N - BX = GIVNUM + 2*NLVL*N - NWORK = BX + N*NRHS -* - SIZEI = 1 + N - K = SIZEI + N - GIVPTR = K + N - PERM = GIVPTR + N - GIVCOL = PERM + NLVL*N - IWK = GIVCOL + NLVL*N*2 -* - ST = 1 - SQRE = 0 - ICMPQ1 = 1 - ICMPQ2 = 0 - NSUB = 0 -* - DO 50 I = 1, N - IF( ABS( D( I ) ).LT.EPS ) THEN - D( I ) = SIGN( EPS, D( I ) ) - END IF - 50 CONTINUE -* - DO 60 I = 1, NM1 - IF( ( ABS( E( I ) ).LT.EPS ) .OR. ( I.EQ.NM1 ) ) THEN - NSUB = NSUB + 1 - IWORK( NSUB ) = ST -* -* Subproblem found. First determine its size and then -* apply divide and conquer on it. -* - IF( I.LT.NM1 ) THEN -* -* A subproblem with E(I) small for I < NM1. -* - NSIZE = I - ST + 1 - IWORK( SIZEI+NSUB-1 ) = NSIZE - ELSE IF( ABS( E( I ) ).GE.EPS ) THEN -* -* A subproblem with E(NM1) not too small but I = NM1. -* - NSIZE = N - ST + 1 - IWORK( SIZEI+NSUB-1 ) = NSIZE - ELSE -* -* A subproblem with E(NM1) small. This implies an -* 1-by-1 subproblem at D(N), which is not solved -* explicitly. -* - NSIZE = I - ST + 1 - IWORK( SIZEI+NSUB-1 ) = NSIZE - NSUB = NSUB + 1 - IWORK( NSUB ) = N - IWORK( SIZEI+NSUB-1 ) = 1 - CALL DCOPY( NRHS, B( N, 1 ), LDB, WORK( BX+NM1 ), N ) - END IF - ST1 = ST - 1 - IF( NSIZE.EQ.1 ) THEN -* -* This is a 1-by-1 subproblem and is not solved -* explicitly. -* - CALL DCOPY( NRHS, B( ST, 1 ), LDB, WORK( BX+ST1 ), N ) - ELSE IF( NSIZE.LE.SMLSIZ ) THEN -* -* This is a small subproblem and is solved by DLASDQ. -* - CALL DLASET( 'A', NSIZE, NSIZE, ZERO, ONE, - $ WORK( VT+ST1 ), N ) - CALL DLASDQ( 'U', 0, NSIZE, NSIZE, 0, NRHS, D( ST ), - $ E( ST ), WORK( VT+ST1 ), N, WORK( NWORK ), - $ N, B( ST, 1 ), LDB, WORK( NWORK ), INFO ) - IF( INFO.NE.0 ) THEN - RETURN - END IF - CALL DLACPY( 'A', NSIZE, NRHS, B( ST, 1 ), LDB, - $ WORK( BX+ST1 ), N ) - ELSE -* -* A large problem. Solve it using divide and conquer. -* - CALL DLASDA( ICMPQ1, SMLSIZ, NSIZE, SQRE, D( ST ), - $ E( ST ), WORK( U+ST1 ), N, WORK( VT+ST1 ), - $ IWORK( K+ST1 ), WORK( DIFL+ST1 ), - $ WORK( DIFR+ST1 ), WORK( Z+ST1 ), - $ WORK( POLES+ST1 ), IWORK( GIVPTR+ST1 ), - $ IWORK( GIVCOL+ST1 ), N, IWORK( PERM+ST1 ), - $ WORK( GIVNUM+ST1 ), WORK( C+ST1 ), - $ WORK( S+ST1 ), WORK( NWORK ), IWORK( IWK ), - $ INFO ) - IF( INFO.NE.0 ) THEN - RETURN - END IF - BXST = BX + ST1 - CALL DLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, B( ST, 1 ), - $ LDB, WORK( BXST ), N, WORK( U+ST1 ), N, - $ WORK( VT+ST1 ), IWORK( K+ST1 ), - $ WORK( DIFL+ST1 ), WORK( DIFR+ST1 ), - $ WORK( Z+ST1 ), WORK( POLES+ST1 ), - $ IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N, - $ IWORK( PERM+ST1 ), WORK( GIVNUM+ST1 ), - $ WORK( C+ST1 ), WORK( S+ST1 ), WORK( NWORK ), - $ IWORK( IWK ), INFO ) - IF( INFO.NE.0 ) THEN - RETURN - END IF - END IF - ST = I + 1 - END IF - 60 CONTINUE -* -* Apply the singular values and treat the tiny ones as zero. -* - TOL = RCND*ABS( D( IDAMAX( N, D, 1 ) ) ) -* - DO 70 I = 1, N -* -* Some of the elements in D can be negative because 1-by-1 -* subproblems were not solved explicitly. -* - IF( ABS( D( I ) ).LE.TOL ) THEN - CALL DLASET( 'A', 1, NRHS, ZERO, ZERO, WORK( BX+I-1 ), N ) - ELSE - RANK = RANK + 1 - CALL DLASCL( 'G', 0, 0, D( I ), ONE, 1, NRHS, - $ WORK( BX+I-1 ), N, INFO ) - END IF - D( I ) = ABS( D( I ) ) - 70 CONTINUE -* -* Now apply back the right singular vectors. -* - ICMPQ2 = 1 - DO 80 I = 1, NSUB - ST = IWORK( I ) - ST1 = ST - 1 - NSIZE = IWORK( SIZEI+I-1 ) - BXST = BX + ST1 - IF( NSIZE.EQ.1 ) THEN - CALL DCOPY( NRHS, WORK( BXST ), N, B( ST, 1 ), LDB ) - ELSE IF( NSIZE.LE.SMLSIZ ) THEN - CALL DGEMM( 'T', 'N', NSIZE, NRHS, NSIZE, ONE, - $ WORK( VT+ST1 ), N, WORK( BXST ), N, ZERO, - $ B( ST, 1 ), LDB ) - ELSE - CALL DLALSA( ICMPQ2, SMLSIZ, NSIZE, NRHS, WORK( BXST ), N, - $ B( ST, 1 ), LDB, WORK( U+ST1 ), N, - $ WORK( VT+ST1 ), IWORK( K+ST1 ), - $ WORK( DIFL+ST1 ), WORK( DIFR+ST1 ), - $ WORK( Z+ST1 ), WORK( POLES+ST1 ), - $ IWORK( GIVPTR+ST1 ), IWORK( GIVCOL+ST1 ), N, - $ IWORK( PERM+ST1 ), WORK( GIVNUM+ST1 ), - $ WORK( C+ST1 ), WORK( S+ST1 ), WORK( NWORK ), - $ IWORK( IWK ), INFO ) - IF( INFO.NE.0 ) THEN - RETURN - END IF - END IF - 80 CONTINUE -* -* Unscale and sort the singular values. -* - CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO ) - CALL DLASRT( 'D', N, D, INFO ) - CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, NRHS, B, LDB, INFO ) -* - RETURN -* -* End of DLALSD -* - END diff --git a/lib/linalg/fortran/dlamch.f b/lib/linalg/fortran/dlamch.f deleted file mode 100644 index 76f875cef6..0000000000 --- a/lib/linalg/fortran/dlamch.f +++ /dev/null @@ -1,189 +0,0 @@ -*> \brief \b DLAMCH -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DLAMCH( CMACH ) -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAMCH determines double precision machine parameters. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] CMACH -*> \verbatim -*> Specifies the value to be returned by DLAMCH: -*> = 'E' or 'e', DLAMCH := eps -*> = 'S' or 's , DLAMCH := sfmin -*> = 'B' or 'b', DLAMCH := base -*> = 'P' or 'p', DLAMCH := eps*base -*> = 'N' or 'n', DLAMCH := t -*> = 'R' or 'r', DLAMCH := rnd -*> = 'M' or 'm', DLAMCH := emin -*> = 'U' or 'u', DLAMCH := rmin -*> = 'L' or 'l', DLAMCH := emax -*> = 'O' or 'o', DLAMCH := rmax -*> where -*> eps = relative machine precision -*> sfmin = safe minimum, such that 1/sfmin does not overflow -*> base = base of the machine -*> prec = eps*base -*> t = number of (base) digits in the mantissa -*> rnd = 1.0 when rounding occurs in addition, 0.0 otherwise -*> emin = minimum exponent before (gradual) underflow -*> rmin = underflow threshold - base**(emin-1) -*> emax = largest exponent before overflow -*> rmax = overflow threshold - (base**emax)*(1-eps) -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date December 2016 -* -*> \ingroup auxOTHERauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DLAMCH( CMACH ) -* -* -- LAPACK auxiliary routine (version 3.7.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* December 2016 -* -* .. Scalar Arguments .. - CHARACTER CMACH -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION RND, EPS, SFMIN, SMALL, RMACH -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Intrinsic Functions .. - INTRINSIC DIGITS, EPSILON, HUGE, MAXEXPONENT, - $ MINEXPONENT, RADIX, TINY -* .. -* .. Executable Statements .. -* -* -* Assume rounding, not chopping. Always. -* - RND = ONE -* - IF( ONE.EQ.RND ) THEN - EPS = EPSILON(ZERO) * 0.5 - ELSE - EPS = EPSILON(ZERO) - END IF -* - IF( LSAME( CMACH, 'E' ) ) THEN - RMACH = EPS - ELSE IF( LSAME( CMACH, 'S' ) ) THEN - SFMIN = TINY(ZERO) - SMALL = ONE / HUGE(ZERO) - IF( SMALL.GE.SFMIN ) THEN -* -* Use SMALL plus a bit, to avoid the possibility of rounding -* causing overflow when computing 1/sfmin. -* - SFMIN = SMALL*( ONE+EPS ) - END IF - RMACH = SFMIN - ELSE IF( LSAME( CMACH, 'B' ) ) THEN - RMACH = RADIX(ZERO) - ELSE IF( LSAME( CMACH, 'P' ) ) THEN - RMACH = EPS * RADIX(ZERO) - ELSE IF( LSAME( CMACH, 'N' ) ) THEN - RMACH = DIGITS(ZERO) - ELSE IF( LSAME( CMACH, 'R' ) ) THEN - RMACH = RND - ELSE IF( LSAME( CMACH, 'M' ) ) THEN - RMACH = MINEXPONENT(ZERO) - ELSE IF( LSAME( CMACH, 'U' ) ) THEN - RMACH = tiny(zero) - ELSE IF( LSAME( CMACH, 'L' ) ) THEN - RMACH = MAXEXPONENT(ZERO) - ELSE IF( LSAME( CMACH, 'O' ) ) THEN - RMACH = HUGE(ZERO) - ELSE - RMACH = ZERO - END IF -* - DLAMCH = RMACH - RETURN -* -* End of DLAMCH -* - END -************************************************************************ -*> \brief \b DLAMC3 -*> \details -*> \b Purpose: -*> \verbatim -*> DLAMC3 is intended to force A and B to be stored prior to doing -*> the addition of A and B , for use in situations where optimizers -*> might hold one of these in a register. -*> \endverbatim -*> \author LAPACK is a software package provided by Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. -*> \date December 2016 -*> \ingroup auxOTHERauxiliary -*> -*> \param[in] A -*> \verbatim -*> A is a DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is a DOUBLE PRECISION -*> The values A and B. -*> \endverbatim -*> - DOUBLE PRECISION FUNCTION DLAMC3( A, B ) -* -* -- LAPACK auxiliary routine (version 3.7.0) -- -* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. -* November 2010 -* -* .. Scalar Arguments .. - DOUBLE PRECISION A, B -* .. -* ===================================================================== -* -* .. Executable Statements .. -* - DLAMC3 = A + B -* - RETURN -* -* End of DLAMC3 -* - END -* -************************************************************************ diff --git a/lib/linalg/fortran/dlamrg.f b/lib/linalg/fortran/dlamrg.f deleted file mode 100644 index 80bd354b97..0000000000 --- a/lib/linalg/fortran/dlamrg.f +++ /dev/null @@ -1,168 +0,0 @@ -*> \brief \b DLAMRG creates a permutation list to merge the entries of two independently sorted sets into a single set sorted in ascending order. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAMRG + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAMRG( N1, N2, A, DTRD1, DTRD2, INDEX ) -* -* .. Scalar Arguments .. -* INTEGER DTRD1, DTRD2, N1, N2 -* .. -* .. Array Arguments .. -* INTEGER INDEX( * ) -* DOUBLE PRECISION A( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAMRG will create a permutation list which will merge the elements -*> of A (which is composed of two independently sorted sets) into a -*> single set which is sorted in ascending order. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N1 -*> \verbatim -*> N1 is INTEGER -*> \endverbatim -*> -*> \param[in] N2 -*> \verbatim -*> N2 is INTEGER -*> These arguments contain the respective lengths of the two -*> sorted lists to be merged. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (N1+N2) -*> The first N1 elements of A contain a list of numbers which -*> are sorted in either ascending or descending order. Likewise -*> for the final N2 elements. -*> \endverbatim -*> -*> \param[in] DTRD1 -*> \verbatim -*> DTRD1 is INTEGER -*> \endverbatim -*> -*> \param[in] DTRD2 -*> \verbatim -*> DTRD2 is INTEGER -*> These are the strides to be taken through the array A. -*> Allowable strides are 1 and -1. They indicate whether a -*> subset of A is sorted in ascending (DTRDx = 1) or descending -*> (DTRDx = -1) order. -*> \endverbatim -*> -*> \param[out] INDEX -*> \verbatim -*> INDEX is INTEGER array, dimension (N1+N2) -*> On exit this array will contain a permutation such that -*> if B( I ) = A( INDEX( I ) ) for I=1,N1+N2, then B will be -*> sorted in ascending order. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -* ===================================================================== - SUBROUTINE DLAMRG( N1, N2, A, DTRD1, DTRD2, INDEX ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER DTRD1, DTRD2, N1, N2 -* .. -* .. Array Arguments .. - INTEGER INDEX( * ) - DOUBLE PRECISION A( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, IND1, IND2, N1SV, N2SV -* .. -* .. Executable Statements .. -* - N1SV = N1 - N2SV = N2 - IF( DTRD1.GT.0 ) THEN - IND1 = 1 - ELSE - IND1 = N1 - END IF - IF( DTRD2.GT.0 ) THEN - IND2 = 1 + N1 - ELSE - IND2 = N1 + N2 - END IF - I = 1 -* while ( (N1SV > 0) & (N2SV > 0) ) - 10 CONTINUE - IF( N1SV.GT.0 .AND. N2SV.GT.0 ) THEN - IF( A( IND1 ).LE.A( IND2 ) ) THEN - INDEX( I ) = IND1 - I = I + 1 - IND1 = IND1 + DTRD1 - N1SV = N1SV - 1 - ELSE - INDEX( I ) = IND2 - I = I + 1 - IND2 = IND2 + DTRD2 - N2SV = N2SV - 1 - END IF - GO TO 10 - END IF -* end while - IF( N1SV.EQ.0 ) THEN - DO 20 N1SV = 1, N2SV - INDEX( I ) = IND2 - I = I + 1 - IND2 = IND2 + DTRD2 - 20 CONTINUE - ELSE -* N2SV .EQ. 0 - DO 30 N2SV = 1, N1SV - INDEX( I ) = IND1 - I = I + 1 - IND1 = IND1 + DTRD1 - 30 CONTINUE - END IF -* - RETURN -* -* End of DLAMRG -* - END diff --git a/lib/linalg/fortran/dlange.f b/lib/linalg/fortran/dlange.f deleted file mode 100644 index 9d214cb542..0000000000 --- a/lib/linalg/fortran/dlange.f +++ /dev/null @@ -1,208 +0,0 @@ -*> \brief \b DLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value of any element of a general rectangular matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLANGE + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DLANGE( NORM, M, N, A, LDA, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER NORM -* INTEGER LDA, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLANGE returns the value of the one norm, or the Frobenius norm, or -*> the infinity norm, or the element of largest absolute value of a -*> real matrix A. -*> \endverbatim -*> -*> \return DLANGE -*> \verbatim -*> -*> DLANGE = ( max(abs(A(i,j))), NORM = 'M' or 'm' -*> ( -*> ( norm1(A), NORM = '1', 'O' or 'o' -*> ( -*> ( normI(A), NORM = 'I' or 'i' -*> ( -*> ( normF(A), NORM = 'F', 'f', 'E' or 'e' -*> -*> where norm1 denotes the one norm of a matrix (maximum column sum), -*> normI denotes the infinity norm of a matrix (maximum row sum) and -*> normF denotes the Frobenius norm of a matrix (square root of sum of -*> squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] NORM -*> \verbatim -*> NORM is CHARACTER*1 -*> Specifies the value to be returned in DLANGE as described -*> above. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. When M = 0, -*> DLANGE is set to zero. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. When N = 0, -*> DLANGE is set to zero. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(M,1). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)), -*> where LWORK >= M when NORM = 'I'; otherwise, WORK is not -*> referenced. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DLANGE( NORM, M, N, A, LDA, WORK ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER NORM - INTEGER LDA, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J - DOUBLE PRECISION SCALE, SUM, VALUE, TEMP -* .. -* .. External Subroutines .. - EXTERNAL DLASSQ -* .. -* .. External Functions .. - LOGICAL LSAME, DISNAN - EXTERNAL LSAME, DISNAN -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MIN, SQRT -* .. -* .. Executable Statements .. -* - IF( MIN( M, N ).EQ.0 ) THEN - VALUE = ZERO - ELSE IF( LSAME( NORM, 'M' ) ) THEN -* -* Find max(abs(A(i,j))). -* - VALUE = ZERO - DO 20 J = 1, N - DO 10 I = 1, M - TEMP = ABS( A( I, J ) ) - IF( VALUE.LT.TEMP .OR. DISNAN( TEMP ) ) VALUE = TEMP - 10 CONTINUE - 20 CONTINUE - ELSE IF( ( LSAME( NORM, 'O' ) ) .OR. ( NORM.EQ.'1' ) ) THEN -* -* Find norm1(A). -* - VALUE = ZERO - DO 40 J = 1, N - SUM = ZERO - DO 30 I = 1, M - SUM = SUM + ABS( A( I, J ) ) - 30 CONTINUE - IF( VALUE.LT.SUM .OR. DISNAN( SUM ) ) VALUE = SUM - 40 CONTINUE - ELSE IF( LSAME( NORM, 'I' ) ) THEN -* -* Find normI(A). -* - DO 50 I = 1, M - WORK( I ) = ZERO - 50 CONTINUE - DO 70 J = 1, N - DO 60 I = 1, M - WORK( I ) = WORK( I ) + ABS( A( I, J ) ) - 60 CONTINUE - 70 CONTINUE - VALUE = ZERO - DO 80 I = 1, M - TEMP = WORK( I ) - IF( VALUE.LT.TEMP .OR. DISNAN( TEMP ) ) VALUE = TEMP - 80 CONTINUE - ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN -* -* Find normF(A). -* - SCALE = ZERO - SUM = ONE - DO 90 J = 1, N - CALL DLASSQ( M, A( 1, J ), 1, SCALE, SUM ) - 90 CONTINUE - VALUE = SCALE*SQRT( SUM ) - END IF -* - DLANGE = VALUE - RETURN -* -* End of DLANGE -* - END diff --git a/lib/linalg/fortran/dlanst.f b/lib/linalg/fortran/dlanst.f deleted file mode 100644 index c5bc7ea038..0000000000 --- a/lib/linalg/fortran/dlanst.f +++ /dev/null @@ -1,183 +0,0 @@ -*> \brief \b DLANST returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a real symmetric tridiagonal matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLANST + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DLANST( NORM, N, D, E ) -* -* .. Scalar Arguments .. -* CHARACTER NORM -* INTEGER N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( * ), E( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLANST returns the value of the one norm, or the Frobenius norm, or -*> the infinity norm, or the element of largest absolute value of a -*> real symmetric tridiagonal matrix A. -*> \endverbatim -*> -*> \return DLANST -*> \verbatim -*> -*> DLANST = ( max(abs(A(i,j))), NORM = 'M' or 'm' -*> ( -*> ( norm1(A), NORM = '1', 'O' or 'o' -*> ( -*> ( normI(A), NORM = 'I' or 'i' -*> ( -*> ( normF(A), NORM = 'F', 'f', 'E' or 'e' -*> -*> where norm1 denotes the one norm of a matrix (maximum column sum), -*> normI denotes the infinity norm of a matrix (maximum row sum) and -*> normF denotes the Frobenius norm of a matrix (square root of sum of -*> squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] NORM -*> \verbatim -*> NORM is CHARACTER*1 -*> Specifies the value to be returned in DLANST as described -*> above. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. When N = 0, DLANST is -*> set to zero. -*> \endverbatim -*> -*> \param[in] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> The diagonal elements of A. -*> \endverbatim -*> -*> \param[in] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> The (n-1) sub-diagonal or super-diagonal elements of A. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DLANST( NORM, N, D, E ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER NORM - INTEGER N -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( * ), E( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I - DOUBLE PRECISION ANORM, SCALE, SUM -* .. -* .. External Functions .. - LOGICAL LSAME, DISNAN - EXTERNAL LSAME, DISNAN -* .. -* .. External Subroutines .. - EXTERNAL DLASSQ -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SQRT -* .. -* .. Executable Statements .. -* - IF( N.LE.0 ) THEN - ANORM = ZERO - ELSE IF( LSAME( NORM, 'M' ) ) THEN -* -* Find max(abs(A(i,j))). -* - ANORM = ABS( D( N ) ) - DO 10 I = 1, N - 1 - SUM = ABS( D( I ) ) - IF( ANORM .LT. SUM .OR. DISNAN( SUM ) ) ANORM = SUM - SUM = ABS( E( I ) ) - IF( ANORM .LT. SUM .OR. DISNAN( SUM ) ) ANORM = SUM - 10 CONTINUE - ELSE IF( LSAME( NORM, 'O' ) .OR. NORM.EQ.'1' .OR. - $ LSAME( NORM, 'I' ) ) THEN -* -* Find norm1(A). -* - IF( N.EQ.1 ) THEN - ANORM = ABS( D( 1 ) ) - ELSE - ANORM = ABS( D( 1 ) )+ABS( E( 1 ) ) - SUM = ABS( E( N-1 ) )+ABS( D( N ) ) - IF( ANORM .LT. SUM .OR. DISNAN( SUM ) ) ANORM = SUM - DO 20 I = 2, N - 1 - SUM = ABS( D( I ) )+ABS( E( I ) )+ABS( E( I-1 ) ) - IF( ANORM .LT. SUM .OR. DISNAN( SUM ) ) ANORM = SUM - 20 CONTINUE - END IF - ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN -* -* Find normF(A). -* - SCALE = ZERO - SUM = ONE - IF( N.GT.1 ) THEN - CALL DLASSQ( N-1, E, 1, SCALE, SUM ) - SUM = 2*SUM - END IF - CALL DLASSQ( N, D, 1, SCALE, SUM ) - ANORM = SCALE*SQRT( SUM ) - END IF -* - DLANST = ANORM - RETURN -* -* End of DLANST -* - END diff --git a/lib/linalg/fortran/dlansy.f b/lib/linalg/fortran/dlansy.f deleted file mode 100644 index 949c5535a2..0000000000 --- a/lib/linalg/fortran/dlansy.f +++ /dev/null @@ -1,238 +0,0 @@ -*> \brief \b DLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a real symmetric matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLANSY + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DLANSY( NORM, UPLO, N, A, LDA, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER NORM, UPLO -* INTEGER LDA, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLANSY returns the value of the one norm, or the Frobenius norm, or -*> the infinity norm, or the element of largest absolute value of a -*> real symmetric matrix A. -*> \endverbatim -*> -*> \return DLANSY -*> \verbatim -*> -*> DLANSY = ( max(abs(A(i,j))), NORM = 'M' or 'm' -*> ( -*> ( norm1(A), NORM = '1', 'O' or 'o' -*> ( -*> ( normI(A), NORM = 'I' or 'i' -*> ( -*> ( normF(A), NORM = 'F', 'f', 'E' or 'e' -*> -*> where norm1 denotes the one norm of a matrix (maximum column sum), -*> normI denotes the infinity norm of a matrix (maximum row sum) and -*> normF denotes the Frobenius norm of a matrix (square root of sum of -*> squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] NORM -*> \verbatim -*> NORM is CHARACTER*1 -*> Specifies the value to be returned in DLANSY as described -*> above. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies whether the upper or lower triangular part of the -*> symmetric matrix A is to be referenced. -*> = 'U': Upper triangular part of A is referenced -*> = 'L': Lower triangular part of A is referenced -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. When N = 0, DLANSY is -*> set to zero. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The symmetric matrix A. If UPLO = 'U', the leading n by n -*> upper triangular part of A contains the upper triangular part -*> of the matrix A, and the strictly lower triangular part of A -*> is not referenced. If UPLO = 'L', the leading n by n lower -*> triangular part of A contains the lower triangular part of -*> the matrix A, and the strictly upper triangular part of A is -*> not referenced. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(N,1). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)), -*> where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, -*> WORK is not referenced. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleSYauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DLANSY( NORM, UPLO, N, A, LDA, WORK ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER NORM, UPLO - INTEGER LDA, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J - DOUBLE PRECISION ABSA, SCALE, SUM, VALUE -* .. -* .. External Subroutines .. - EXTERNAL DLASSQ -* .. -* .. External Functions .. - LOGICAL LSAME, DISNAN - EXTERNAL LSAME, DISNAN -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SQRT -* .. -* .. Executable Statements .. -* - IF( N.EQ.0 ) THEN - VALUE = ZERO - ELSE IF( LSAME( NORM, 'M' ) ) THEN -* -* Find max(abs(A(i,j))). -* - VALUE = ZERO - IF( LSAME( UPLO, 'U' ) ) THEN - DO 20 J = 1, N - DO 10 I = 1, J - SUM = ABS( A( I, J ) ) - IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM - 10 CONTINUE - 20 CONTINUE - ELSE - DO 40 J = 1, N - DO 30 I = J, N - SUM = ABS( A( I, J ) ) - IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM - 30 CONTINUE - 40 CONTINUE - END IF - ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR. - $ ( NORM.EQ.'1' ) ) THEN -* -* Find normI(A) ( = norm1(A), since A is symmetric). -* - VALUE = ZERO - IF( LSAME( UPLO, 'U' ) ) THEN - DO 60 J = 1, N - SUM = ZERO - DO 50 I = 1, J - 1 - ABSA = ABS( A( I, J ) ) - SUM = SUM + ABSA - WORK( I ) = WORK( I ) + ABSA - 50 CONTINUE - WORK( J ) = SUM + ABS( A( J, J ) ) - 60 CONTINUE - DO 70 I = 1, N - SUM = WORK( I ) - IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM - 70 CONTINUE - ELSE - DO 80 I = 1, N - WORK( I ) = ZERO - 80 CONTINUE - DO 100 J = 1, N - SUM = WORK( J ) + ABS( A( J, J ) ) - DO 90 I = J + 1, N - ABSA = ABS( A( I, J ) ) - SUM = SUM + ABSA - WORK( I ) = WORK( I ) + ABSA - 90 CONTINUE - IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM - 100 CONTINUE - END IF - ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN -* -* Find normF(A). -* - SCALE = ZERO - SUM = ONE - IF( LSAME( UPLO, 'U' ) ) THEN - DO 110 J = 2, N - CALL DLASSQ( J-1, A( 1, J ), 1, SCALE, SUM ) - 110 CONTINUE - ELSE - DO 120 J = 1, N - 1 - CALL DLASSQ( N-J, A( J+1, J ), 1, SCALE, SUM ) - 120 CONTINUE - END IF - SUM = 2*SUM - CALL DLASSQ( N, A, LDA+1, SCALE, SUM ) - VALUE = SCALE*SQRT( SUM ) - END IF -* - DLANSY = VALUE - RETURN -* -* End of DLANSY -* - END diff --git a/lib/linalg/fortran/dlapy2.f b/lib/linalg/fortran/dlapy2.f deleted file mode 100644 index 1f63193bb7..0000000000 --- a/lib/linalg/fortran/dlapy2.f +++ /dev/null @@ -1,117 +0,0 @@ -*> \brief \b DLAPY2 returns sqrt(x2+y2). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAPY2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DLAPY2( X, Y ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION X, Y -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAPY2 returns sqrt(x**2+y**2), taking care not to cause unnecessary -*> overflow and unnecessary underflow. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is DOUBLE PRECISION -*> X and Y specify the values x and y. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DLAPY2( X, Y ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION X, Y -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION W, XABS, YABS, Z, HUGEVAL - LOGICAL X_IS_NAN, Y_IS_NAN -* .. -* .. External Functions .. - LOGICAL DISNAN - EXTERNAL DISNAN -* .. -* .. External Subroutines .. - DOUBLE PRECISION DLAMCH -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* - X_IS_NAN = DISNAN( X ) - Y_IS_NAN = DISNAN( Y ) - IF ( X_IS_NAN ) DLAPY2 = X - IF ( Y_IS_NAN ) DLAPY2 = Y - HUGEVAL = DLAMCH( 'Overflow' ) -* - IF ( .NOT.( X_IS_NAN.OR.Y_IS_NAN ) ) THEN - XABS = ABS( X ) - YABS = ABS( Y ) - W = MAX( XABS, YABS ) - Z = MIN( XABS, YABS ) - IF( Z.EQ.ZERO .OR. W.GT.HUGEVAL ) THEN - DLAPY2 = W - ELSE - DLAPY2 = W*SQRT( ONE+( Z / W )**2 ) - END IF - END IF - RETURN -* -* End of DLAPY2 -* - END diff --git a/lib/linalg/fortran/dlapy3.f b/lib/linalg/fortran/dlapy3.f deleted file mode 100644 index 230a65cdb2..0000000000 --- a/lib/linalg/fortran/dlapy3.f +++ /dev/null @@ -1,112 +0,0 @@ -*> \brief \b DLAPY3 returns sqrt(x2+y2+z2). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAPY3 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION X, Y, Z -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAPY3 returns sqrt(x**2+y**2+z**2), taking care not to cause -*> unnecessary overflow and unnecessary underflow. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION -*> X, Y and Z specify the values x, y and z. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION DLAPY3( X, Y, Z ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION X, Y, Z -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION W, XABS, YABS, ZABS, HUGEVAL -* .. -* .. External Subroutines .. - DOUBLE PRECISION DLAMCH -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, SQRT -* .. -* .. Executable Statements .. -* - HUGEVAL = DLAMCH( 'Overflow' ) - XABS = ABS( X ) - YABS = ABS( Y ) - ZABS = ABS( Z ) - W = MAX( XABS, YABS, ZABS ) - IF( W.EQ.ZERO .OR. W.GT.HUGEVAL ) THEN -* W can be zero for max(0,nan,0) -* adding all three entries together will make sure -* NaN will not disappear. - DLAPY3 = XABS + YABS + ZABS - ELSE - DLAPY3 = W*SQRT( ( XABS / W )**2+( YABS / W )**2+ - $ ( ZABS / W )**2 ) - END IF - RETURN -* -* End of DLAPY3 -* - END diff --git a/lib/linalg/fortran/dlarf.f b/lib/linalg/fortran/dlarf.f deleted file mode 100644 index ed21638645..0000000000 --- a/lib/linalg/fortran/dlarf.f +++ /dev/null @@ -1,224 +0,0 @@ -*> \brief \b DLARF applies an elementary reflector to a general rectangular matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARF + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE -* INTEGER INCV, LDC, M, N -* DOUBLE PRECISION TAU -* .. -* .. Array Arguments .. -* DOUBLE PRECISION C( LDC, * ), V( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARF applies a real elementary reflector H to a real m by n matrix -*> C, from either the left or the right. H is represented in the form -*> -*> H = I - tau * v * v**T -*> -*> where tau is a real scalar and v is a real vector. -*> -*> If tau = 0, then H is taken to be the unit matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': form H * C -*> = 'R': form C * H -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is DOUBLE PRECISION array, dimension -*> (1 + (M-1)*abs(INCV)) if SIDE = 'L' -*> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' -*> The vector v in the representation of H. V is not used if -*> TAU = 0. -*> \endverbatim -*> -*> \param[in] INCV -*> \verbatim -*> INCV is INTEGER -*> The increment between elements of v. INCV <> 0. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION -*> The value tau in the representation of H. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by the matrix H * C if SIDE = 'L', -*> or C * H if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension -*> (N) if SIDE = 'L' -*> or (M) if SIDE = 'R' -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE - INTEGER INCV, LDC, M, N - DOUBLE PRECISION TAU -* .. -* .. Array Arguments .. - DOUBLE PRECISION C( LDC, * ), V( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL APPLYLEFT - INTEGER I, LASTV, LASTC -* .. -* .. External Subroutines .. - EXTERNAL DGEMV, DGER -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILADLR, ILADLC - EXTERNAL LSAME, ILADLR, ILADLC -* .. -* .. Executable Statements .. -* - APPLYLEFT = LSAME( SIDE, 'L' ) - LASTV = 0 - LASTC = 0 - IF( TAU.NE.ZERO ) THEN -! Set up variables for scanning V. LASTV begins pointing to the end -! of V. - IF( APPLYLEFT ) THEN - LASTV = M - ELSE - LASTV = N - END IF - IF( INCV.GT.0 ) THEN - I = 1 + (LASTV-1) * INCV - ELSE - I = 1 - END IF -! Look for the last non-zero row in V. - DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) - LASTV = LASTV - 1 - I = I - INCV - END DO - IF( APPLYLEFT ) THEN -! Scan for the last non-zero column in C(1:lastv,:). - LASTC = ILADLC(LASTV, N, C, LDC) - ELSE -! Scan for the last non-zero row in C(:,1:lastv). - LASTC = ILADLR(M, LASTV, C, LDC) - END IF - END IF -! Note that lastc.eq.0 renders the BLAS operations null; no special -! case is needed at this level. - IF( APPLYLEFT ) THEN -* -* Form H * C -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastv,1:lastc)**T * v(1:lastv,1) -* - CALL DGEMV( 'Transpose', LASTV, LASTC, ONE, C, LDC, V, INCV, - $ ZERO, WORK, 1 ) -* -* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**T -* - CALL DGER( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) - END IF - ELSE -* -* Form C * H -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) -* - CALL DGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, - $ V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**T -* - CALL DGER( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) - END IF - END IF - RETURN -* -* End of DLARF -* - END diff --git a/lib/linalg/fortran/dlarfb.f b/lib/linalg/fortran/dlarfb.f deleted file mode 100644 index a3fa083b43..0000000000 --- a/lib/linalg/fortran/dlarfb.f +++ /dev/null @@ -1,709 +0,0 @@ -*> \brief \b DLARFB applies a block reflector or its transpose to a general rectangular matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARFB + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, -* T, LDT, C, LDC, WORK, LDWORK ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, SIDE, STOREV, TRANS -* INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION C( LDC, * ), T( LDT, * ), V( LDV, * ), -* $ WORK( LDWORK, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARFB applies a real block reflector H or its transpose H**T to a -*> real m by n matrix C, from either the left or the right. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply H or H**T from the Left -*> = 'R': apply H or H**T from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply H (No transpose) -*> = 'T': apply H**T (Transpose) -*> \endverbatim -*> -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Indicates how H is formed from a product of elementary -*> reflectors -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Indicates how the vectors which define the elementary -*> reflectors are stored: -*> = 'C': Columnwise -*> = 'R': Rowwise -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the matrix T (= the number of elementary -*> reflectors whose product defines the block reflector). -*> If SIDE = 'L', M >= K >= 0; -*> if SIDE = 'R', N >= K >= 0. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is DOUBLE PRECISION array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,M) if STOREV = 'R' and SIDE = 'L' -*> (LDV,N) if STOREV = 'R' and SIDE = 'R' -*> The matrix V. See Further Details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); -*> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); -*> if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] T -*> \verbatim -*> T is DOUBLE PRECISION array, dimension (LDT,K) -*> The triangular k by k matrix T in the representation of the -*> block reflector. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by H*C or H**T*C or C*H or C*H**T. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (LDWORK,K) -*> \endverbatim -*> -*> \param[in] LDWORK -*> \verbatim -*> LDWORK is INTEGER -*> The leading dimension of the array WORK. -*> If SIDE = 'L', LDWORK >= max(1,N); -*> if SIDE = 'R', LDWORK >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored; the corresponding -*> array elements are modified but restored on exit. The rest of the -*> array is not used. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, - $ T, LDT, C, LDC, WORK, LDWORK ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER DIRECT, SIDE, STOREV, TRANS - INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION C( LDC, * ), T( LDT, * ), V( LDV, * ), - $ WORK( LDWORK, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - CHARACTER TRANST - INTEGER I, J -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DGEMM, DTRMM -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( M.LE.0 .OR. N.LE.0 ) - $ RETURN -* - IF( LSAME( TRANS, 'N' ) ) THEN - TRANST = 'T' - ELSE - TRANST = 'N' - END IF -* - IF( LSAME( STOREV, 'C' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 ) (first K rows) -* ( V2 ) -* where V1 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* -* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) -* -* W := C1**T -* - DO 10 J = 1, K - CALL DCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - 10 CONTINUE -* -* W := W * V1 -* - CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N, - $ K, ONE, V, LDV, WORK, LDWORK ) - IF( M.GT.K ) THEN -* -* W := W + C2**T * V2 -* - CALL DGEMM( 'Transpose', 'No transpose', N, K, M-K, - $ ONE, C( K+1, 1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**T -* - IF( M.GT.K ) THEN -* -* C2 := C2 - V2 * W**T -* - CALL DGEMM( 'No transpose', 'Transpose', M-K, N, K, - $ -ONE, V( K+1, 1 ), LDV, WORK, LDWORK, ONE, - $ C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1**T -* - CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', N, K, - $ ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**T -* - DO 30 J = 1, K - DO 20 I = 1, N - C( J, I ) = C( J, I ) - WORK( I, J ) - 20 CONTINUE - 30 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C1 -* - DO 40 J = 1, K - CALL DCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 ) - 40 CONTINUE -* -* W := W * V1 -* - CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M, - $ K, ONE, V, LDV, WORK, LDWORK ) - IF( N.GT.K ) THEN -* -* W := W + C2 * V2 -* - CALL DGEMM( 'No transpose', 'No transpose', M, K, N-K, - $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**T -* - IF( N.GT.K ) THEN -* -* C2 := C2 - W * V2**T -* - CALL DGEMM( 'No transpose', 'Transpose', M, N-K, K, - $ -ONE, WORK, LDWORK, V( K+1, 1 ), LDV, ONE, - $ C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1**T -* - CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', M, K, - $ ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 60 J = 1, K - DO 50 I = 1, M - C( I, J ) = C( I, J ) - WORK( I, J ) - 50 CONTINUE - 60 CONTINUE - END IF -* - ELSE -* -* Let V = ( V1 ) -* ( V2 ) (last K rows) -* where V2 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* -* W := C**T * V = (C1**T * V1 + C2**T * V2) (stored in WORK) -* -* W := C2**T -* - DO 70 J = 1, K - CALL DCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 ) - 70 CONTINUE -* -* W := W * V2 -* - CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N, - $ K, ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK ) - IF( M.GT.K ) THEN -* -* W := W + C1**T * V1 -* - CALL DGEMM( 'Transpose', 'No transpose', N, K, M-K, - $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**T -* - IF( M.GT.K ) THEN -* -* C1 := C1 - V1 * W**T -* - CALL DGEMM( 'No transpose', 'Transpose', M-K, N, K, - $ -ONE, V, LDV, WORK, LDWORK, ONE, C, LDC ) - END IF -* -* W := W * V2**T -* - CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', N, K, - $ ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK ) -* -* C2 := C2 - W**T -* - DO 90 J = 1, K - DO 80 I = 1, N - C( M-K+J, I ) = C( M-K+J, I ) - WORK( I, J ) - 80 CONTINUE - 90 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C2 -* - DO 100 J = 1, K - CALL DCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 ) - 100 CONTINUE -* -* W := W * V2 -* - CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M, - $ K, ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK ) - IF( N.GT.K ) THEN -* -* W := W + C1 * V1 -* - CALL DGEMM( 'No transpose', 'No transpose', M, K, N-K, - $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**T -* - IF( N.GT.K ) THEN -* -* C1 := C1 - W * V1**T -* - CALL DGEMM( 'No transpose', 'Transpose', M, N-K, K, - $ -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC ) - END IF -* -* W := W * V2**T -* - CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', M, K, - $ ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK ) -* -* C2 := C2 - W -* - DO 120 J = 1, K - DO 110 I = 1, M - C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J ) - 110 CONTINUE - 120 CONTINUE - END IF - END IF -* - ELSE IF( LSAME( STOREV, 'R' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 V2 ) (V1: first K columns) -* where V1 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* -* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) -* -* W := C1**T -* - DO 130 J = 1, K - CALL DCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - 130 CONTINUE -* -* W := W * V1**T -* - CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', N, K, - $ ONE, V, LDV, WORK, LDWORK ) - IF( M.GT.K ) THEN -* -* W := W + C2**T * V2**T -* - CALL DGEMM( 'Transpose', 'Transpose', N, K, M-K, ONE, - $ C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, ONE, - $ WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL DTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**T * W**T -* - IF( M.GT.K ) THEN -* -* C2 := C2 - V2**T * W**T -* - CALL DGEMM( 'Transpose', 'Transpose', M-K, N, K, -ONE, - $ V( 1, K+1 ), LDV, WORK, LDWORK, ONE, - $ C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N, - $ K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**T -* - DO 150 J = 1, K - DO 140 I = 1, N - C( J, I ) = C( J, I ) - WORK( I, J ) - 140 CONTINUE - 150 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**T where C = ( C1 C2 ) -* -* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) -* -* W := C1 -* - DO 160 J = 1, K - CALL DCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 ) - 160 CONTINUE -* -* W := W * V1**T -* - CALL DTRMM( 'Right', 'Upper', 'Transpose', 'Unit', M, K, - $ ONE, V, LDV, WORK, LDWORK ) - IF( N.GT.K ) THEN -* -* W := W + C2 * V2**T -* - CALL DGEMM( 'No transpose', 'Transpose', M, K, N-K, - $ ONE, C( 1, K+1 ), LDC, V( 1, K+1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL DTRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( N.GT.K ) THEN -* -* C2 := C2 - W * V2 -* - CALL DGEMM( 'No transpose', 'No transpose', M, N-K, K, - $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, ONE, - $ C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL DTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M, - $ K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 180 J = 1, K - DO 170 I = 1, M - C( I, J ) = C( I, J ) - WORK( I, J ) - 170 CONTINUE - 180 CONTINUE -* - END IF -* - ELSE -* -* Let V = ( V1 V2 ) (V2: last K columns) -* where V2 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**T * C where C = ( C1 ) -* ( C2 ) -* -* W := C**T * V**T = (C1**T * V1**T + C2**T * V2**T) (stored in WORK) -* -* W := C2**T -* - DO 190 J = 1, K - CALL DCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 ) - 190 CONTINUE -* -* W := W * V2**T -* - CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', N, K, - $ ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK ) - IF( M.GT.K ) THEN -* -* W := W + C1**T * V1**T -* - CALL DGEMM( 'Transpose', 'Transpose', N, K, M-K, ONE, - $ C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T**T or W * T -* - CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**T * W**T -* - IF( M.GT.K ) THEN -* -* C1 := C1 - V1**T * W**T -* - CALL DGEMM( 'Transpose', 'Transpose', M-K, N, K, -ONE, - $ V, LDV, WORK, LDWORK, ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N, - $ K, ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK ) -* -* C2 := C2 - W**T -* - DO 210 J = 1, K - DO 200 I = 1, N - C( M-K+J, I ) = C( M-K+J, I ) - WORK( I, J ) - 200 CONTINUE - 210 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H' where C = ( C1 C2 ) -* -* W := C * V**T = (C1*V1**T + C2*V2**T) (stored in WORK) -* -* W := C2 -* - DO 220 J = 1, K - CALL DCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 ) - 220 CONTINUE -* -* W := W * V2**T -* - CALL DTRMM( 'Right', 'Lower', 'Transpose', 'Unit', M, K, - $ ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK ) - IF( N.GT.K ) THEN -* -* W := W + C1 * V1**T -* - CALL DGEMM( 'No transpose', 'Transpose', M, K, N-K, - $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**T -* - CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( N.GT.K ) THEN -* -* C1 := C1 - W * V1 -* - CALL DGEMM( 'No transpose', 'No transpose', M, N-K, K, - $ -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL DTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M, - $ K, ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 240 J = 1, K - DO 230 I = 1, M - C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J ) - 230 CONTINUE - 240 CONTINUE -* - END IF -* - END IF - END IF -* - RETURN -* -* End of DLARFB -* - END diff --git a/lib/linalg/fortran/dlarfg.f b/lib/linalg/fortran/dlarfg.f deleted file mode 100644 index 9bfb45a6b0..0000000000 --- a/lib/linalg/fortran/dlarfg.f +++ /dev/null @@ -1,193 +0,0 @@ -*> \brief \b DLARFG generates an elementary reflector (Householder matrix). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARFG + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* DOUBLE PRECISION ALPHA, TAU -* .. -* .. Array Arguments .. -* DOUBLE PRECISION X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARFG generates a real elementary reflector H of order n, such -*> that -*> -*> H * ( alpha ) = ( beta ), H**T * H = I. -*> ( x ) ( 0 ) -*> -*> where alpha and beta are scalars, and x is an (n-1)-element real -*> vector. H is represented in the form -*> -*> H = I - tau * ( 1 ) * ( 1 v**T ) , -*> ( v ) -*> -*> where tau is a real scalar and v is a real (n-1)-element -*> vector. -*> -*> If the elements of x are all zero, then tau = 0 and H is taken to be -*> the unit matrix. -*> -*> Otherwise 1 <= tau <= 2. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the elementary reflector. -*> \endverbatim -*> -*> \param[in,out] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION -*> On entry, the value alpha. -*> On exit, it is overwritten with the value beta. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension -*> (1+(N-2)*abs(INCX)) -*> On entry, the vector x. -*> On exit, it is overwritten with the vector v. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between elements of X. INCX > 0. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION -*> The value tau. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX, N - DOUBLE PRECISION ALPHA, TAU -* .. -* .. Array Arguments .. - DOUBLE PRECISION X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER J, KNT - DOUBLE PRECISION BETA, RSAFMN, SAFMIN, XNORM -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH, DLAPY2, DNRM2 - EXTERNAL DLAMCH, DLAPY2, DNRM2 -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SIGN -* .. -* .. External Subroutines .. - EXTERNAL DSCAL -* .. -* .. Executable Statements .. -* - IF( N.LE.1 ) THEN - TAU = ZERO - RETURN - END IF -* - XNORM = DNRM2( N-1, X, INCX ) -* - IF( XNORM.EQ.ZERO ) THEN -* -* H = I -* - TAU = ZERO - ELSE -* -* general case -* - BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA ) - SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' ) - KNT = 0 - IF( ABS( BETA ).LT.SAFMIN ) THEN -* -* XNORM, BETA may be inaccurate; scale X and recompute them -* - RSAFMN = ONE / SAFMIN - 10 CONTINUE - KNT = KNT + 1 - CALL DSCAL( N-1, RSAFMN, X, INCX ) - BETA = BETA*RSAFMN - ALPHA = ALPHA*RSAFMN - IF( (ABS( BETA ).LT.SAFMIN) .AND. (KNT .LT. 20) ) - $ GO TO 10 -* -* New BETA is at most 1, at least SAFMIN -* - XNORM = DNRM2( N-1, X, INCX ) - BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA ) - END IF - TAU = ( BETA-ALPHA ) / BETA - CALL DSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX ) -* -* If ALPHA is subnormal, it may lose relative accuracy -* - DO 20 J = 1, KNT - BETA = BETA*SAFMIN - 20 CONTINUE - ALPHA = BETA - END IF -* - RETURN -* -* End of DLARFG -* - END diff --git a/lib/linalg/fortran/dlarft.f b/lib/linalg/fortran/dlarft.f deleted file mode 100644 index a8d9de61f1..0000000000 --- a/lib/linalg/fortran/dlarft.f +++ /dev/null @@ -1,323 +0,0 @@ -*> \brief \b DLARFT forms the triangular factor T of a block reflector H = I - vtvH -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARFT + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, STOREV -* INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARFT forms the triangular factor T of a real block reflector H -*> of order n, which is defined as a product of k elementary reflectors. -*> -*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; -*> -*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. -*> -*> If STOREV = 'C', the vector which defines the elementary reflector -*> H(i) is stored in the i-th column of the array V, and -*> -*> H = I - V * T * V**T -*> -*> If STOREV = 'R', the vector which defines the elementary reflector -*> H(i) is stored in the i-th row of the array V, and -*> -*> H = I - V**T * T * V -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies the order in which the elementary reflectors are -*> multiplied to form the block reflector: -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Specifies how the vectors which define the elementary -*> reflectors are stored (see also Further Details): -*> = 'C': columnwise -*> = 'R': rowwise -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the block reflector H. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the triangular factor T (= the number of -*> elementary reflectors). K >= 1. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is DOUBLE PRECISION array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,N) if STOREV = 'R' -*> The matrix V. See further details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i). -*> \endverbatim -*> -*> \param[out] T -*> \verbatim -*> T is DOUBLE PRECISION array, dimension (LDT,K) -*> The k by k triangular factor T of the block reflector. -*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is -*> lower triangular. The rest of the array is not used. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER DIRECT, STOREV - INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J, PREVLASTV, LASTV -* .. -* .. External Subroutines .. - EXTERNAL DGEMV, DTRMV -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( LSAME( DIRECT, 'F' ) ) THEN - PREVLASTV = N - DO I = 1, K - PREVLASTV = MAX( I, PREVLASTV ) - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = 1, I - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( I , J ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i) -* - CALL DGEMV( 'Transpose', J-I, I-1, -TAU( I ), - $ V( I+1, 1 ), LDV, V( I+1, I ), 1, ONE, - $ T( 1, I ), 1 ) - ELSE -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( J , I ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T -* - CALL DGEMV( 'No transpose', I-1, J-I, -TAU( I ), - $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, ONE, - $ T( 1, I ), 1 ) - END IF -* -* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) -* - CALL DTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, - $ LDT, T( 1, I ), 1 ) - T( I, I ) = TAU( I ) - IF( I.GT.1 ) THEN - PREVLASTV = MAX( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - END DO - ELSE - PREVLASTV = 1 - DO I = K, 1, -1 - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = I, K - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( I.LT.K ) THEN - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( N-K+I , J ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i) -* - CALL DGEMV( 'Transpose', N-K+I-J, K-I, -TAU( I ), - $ V( J, I+1 ), LDV, V( J, I ), 1, ONE, - $ T( I+1, I ), 1 ) - ELSE -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( J, N-K+I ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T -* - CALL DGEMV( 'No transpose', K-I, N-K+I-J, - $ -TAU( I ), V( I+1, J ), LDV, V( I, J ), LDV, - $ ONE, T( I+1, I ), 1 ) - END IF -* -* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) -* - CALL DTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, - $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) - IF( I.GT.1 ) THEN - PREVLASTV = MIN( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - T( I, I ) = TAU( I ) - END IF - END DO - END IF - RETURN -* -* End of DLARFT -* - END diff --git a/lib/linalg/fortran/dlartg.f b/lib/linalg/fortran/dlartg.f deleted file mode 100644 index 1c7c46f638..0000000000 --- a/lib/linalg/fortran/dlartg.f +++ /dev/null @@ -1,204 +0,0 @@ -*> \brief \b DLARTG generates a plane rotation with real cosine and real sine. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARTG + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARTG( F, G, CS, SN, R ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION CS, F, G, R, SN -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARTG generate a plane rotation so that -*> -*> [ CS SN ] . [ F ] = [ R ] where CS**2 + SN**2 = 1. -*> [ -SN CS ] [ G ] [ 0 ] -*> -*> This is a slower, more accurate version of the BLAS1 routine DROTG, -*> with the following other differences: -*> F and G are unchanged on return. -*> If G=0, then CS=1 and SN=0. -*> If F=0 and (G .ne. 0), then CS=0 and SN=1 without doing any -*> floating point operations (saves work in DBDSQR when -*> there are zeros on the diagonal). -*> -*> If F exceeds G in magnitude, CS will be positive. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] F -*> \verbatim -*> F is DOUBLE PRECISION -*> The first component of vector to be rotated. -*> \endverbatim -*> -*> \param[in] G -*> \verbatim -*> G is DOUBLE PRECISION -*> The second component of vector to be rotated. -*> \endverbatim -*> -*> \param[out] CS -*> \verbatim -*> CS is DOUBLE PRECISION -*> The cosine of the rotation. -*> \endverbatim -*> -*> \param[out] SN -*> \verbatim -*> SN is DOUBLE PRECISION -*> The sine of the rotation. -*> \endverbatim -*> -*> \param[out] R -*> \verbatim -*> R is DOUBLE PRECISION -*> The nonzero component of the rotated vector. -*> -*> This version has a few statements commented out for thread safety -*> (machine parameters are computed on each entry). 10 feb 03, SJH. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date December 2016 -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLARTG( F, G, CS, SN, R ) -* -* -- LAPACK auxiliary routine (version 3.7.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* December 2016 -* -* .. Scalar Arguments .. - DOUBLE PRECISION CS, F, G, R, SN -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D0 ) - DOUBLE PRECISION TWO - PARAMETER ( TWO = 2.0D0 ) -* .. -* .. Local Scalars .. -* LOGICAL FIRST - INTEGER COUNT, I - DOUBLE PRECISION EPS, F1, G1, SAFMIN, SAFMN2, SAFMX2, SCALE -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH - EXTERNAL DLAMCH -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, INT, LOG, MAX, SQRT -* .. -* .. Save statement .. -* SAVE FIRST, SAFMX2, SAFMIN, SAFMN2 -* .. -* .. Data statements .. -* DATA FIRST / .TRUE. / -* .. -* .. Executable Statements .. -* -* IF( FIRST ) THEN - SAFMIN = DLAMCH( 'S' ) - EPS = DLAMCH( 'E' ) - SAFMN2 = DLAMCH( 'B' )**INT( LOG( SAFMIN / EPS ) / - $ LOG( DLAMCH( 'B' ) ) / TWO ) - SAFMX2 = ONE / SAFMN2 -* FIRST = .FALSE. -* END IF - IF( G.EQ.ZERO ) THEN - CS = ONE - SN = ZERO - R = F - ELSE IF( F.EQ.ZERO ) THEN - CS = ZERO - SN = ONE - R = G - ELSE - F1 = F - G1 = G - SCALE = MAX( ABS( F1 ), ABS( G1 ) ) - IF( SCALE.GE.SAFMX2 ) THEN - COUNT = 0 - 10 CONTINUE - COUNT = COUNT + 1 - F1 = F1*SAFMN2 - G1 = G1*SAFMN2 - SCALE = MAX( ABS( F1 ), ABS( G1 ) ) - IF( SCALE.GE.SAFMX2 ) - $ GO TO 10 - R = SQRT( F1**2+G1**2 ) - CS = F1 / R - SN = G1 / R - DO 20 I = 1, COUNT - R = R*SAFMX2 - 20 CONTINUE - ELSE IF( SCALE.LE.SAFMN2 ) THEN - COUNT = 0 - 30 CONTINUE - COUNT = COUNT + 1 - F1 = F1*SAFMX2 - G1 = G1*SAFMX2 - SCALE = MAX( ABS( F1 ), ABS( G1 ) ) - IF( SCALE.LE.SAFMN2 ) - $ GO TO 30 - R = SQRT( F1**2+G1**2 ) - CS = F1 / R - SN = G1 / R - DO 40 I = 1, COUNT - R = R*SAFMN2 - 40 CONTINUE - ELSE - R = SQRT( F1**2+G1**2 ) - CS = F1 / R - SN = G1 / R - END IF - IF( ABS( F ).GT.ABS( G ) .AND. CS.LT.ZERO ) THEN - CS = -CS - SN = -SN - R = -R - END IF - END IF - RETURN -* -* End of DLARTG -* - END diff --git a/lib/linalg/fortran/dlas2.f b/lib/linalg/fortran/dlas2.f deleted file mode 100644 index ea929e86f7..0000000000 --- a/lib/linalg/fortran/dlas2.f +++ /dev/null @@ -1,180 +0,0 @@ -*> \brief \b DLAS2 computes singular values of a 2-by-2 triangular matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLAS2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLAS2( F, G, H, SSMIN, SSMAX ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION F, G, H, SSMAX, SSMIN -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLAS2 computes the singular values of the 2-by-2 matrix -*> [ F G ] -*> [ 0 H ]. -*> On return, SSMIN is the smaller singular value and SSMAX is the -*> larger singular value. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] F -*> \verbatim -*> F is DOUBLE PRECISION -*> The (1,1) element of the 2-by-2 matrix. -*> \endverbatim -*> -*> \param[in] G -*> \verbatim -*> G is DOUBLE PRECISION -*> The (1,2) element of the 2-by-2 matrix. -*> \endverbatim -*> -*> \param[in] H -*> \verbatim -*> H is DOUBLE PRECISION -*> The (2,2) element of the 2-by-2 matrix. -*> \endverbatim -*> -*> \param[out] SSMIN -*> \verbatim -*> SSMIN is DOUBLE PRECISION -*> The smaller singular value. -*> \endverbatim -*> -*> \param[out] SSMAX -*> \verbatim -*> SSMAX is DOUBLE PRECISION -*> The larger singular value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Barring over/underflow, all output quantities are correct to within -*> a few units in the last place (ulps), even in the absence of a guard -*> digit in addition/subtraction. -*> -*> In IEEE arithmetic, the code works correctly if one matrix element is -*> infinite. -*> -*> Overflow will not occur unless the largest singular value itself -*> overflows, or is within a few ulps of overflow. (On machines with -*> partial overflow, like the Cray, overflow may occur if the largest -*> singular value is within a factor of 2 of overflow.) -*> -*> Underflow is harmless if underflow is gradual. Otherwise, results -*> may correspond to a matrix modified by perturbations of size near -*> the underflow threshold. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLAS2( F, G, H, SSMIN, SSMAX ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION F, G, H, SSMAX, SSMIN -* .. -* -* ==================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D0 ) - DOUBLE PRECISION TWO - PARAMETER ( TWO = 2.0D0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION AS, AT, AU, C, FA, FHMN, FHMX, GA, HA -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* - FA = ABS( F ) - GA = ABS( G ) - HA = ABS( H ) - FHMN = MIN( FA, HA ) - FHMX = MAX( FA, HA ) - IF( FHMN.EQ.ZERO ) THEN - SSMIN = ZERO - IF( FHMX.EQ.ZERO ) THEN - SSMAX = GA - ELSE - SSMAX = MAX( FHMX, GA )*SQRT( ONE+ - $ ( MIN( FHMX, GA ) / MAX( FHMX, GA ) )**2 ) - END IF - ELSE - IF( GA.LT.FHMX ) THEN - AS = ONE + FHMN / FHMX - AT = ( FHMX-FHMN ) / FHMX - AU = ( GA / FHMX )**2 - C = TWO / ( SQRT( AS*AS+AU )+SQRT( AT*AT+AU ) ) - SSMIN = FHMN*C - SSMAX = FHMX / C - ELSE - AU = FHMX / GA - IF( AU.EQ.ZERO ) THEN -* -* Avoid possible harmful underflow if exponent range -* asymmetric (true SSMIN may not underflow even if -* AU underflows) -* - SSMIN = ( FHMN*FHMX ) / GA - SSMAX = GA - ELSE - AS = ONE + FHMN / FHMX - AT = ( FHMX-FHMN ) / FHMX - C = ONE / ( SQRT( ONE+( AS*AU )**2 )+ - $ SQRT( ONE+( AT*AU )**2 ) ) - SSMIN = ( FHMN*C )*AU - SSMIN = SSMIN + SSMIN - SSMAX = GA / ( C+C ) - END IF - END IF - END IF - RETURN -* -* End of DLAS2 -* - END diff --git a/lib/linalg/fortran/dlascl.f b/lib/linalg/fortran/dlascl.f deleted file mode 100644 index 0a4bf21ce1..0000000000 --- a/lib/linalg/fortran/dlascl.f +++ /dev/null @@ -1,367 +0,0 @@ -*> \brief \b DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASCL + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER TYPE -* INTEGER INFO, KL, KU, LDA, M, N -* DOUBLE PRECISION CFROM, CTO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASCL multiplies the M by N real matrix A by the real scalar -*> CTO/CFROM. This is done without over/underflow as long as the final -*> result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that -*> A may be full, upper triangular, lower triangular, upper Hessenberg, -*> or banded. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] TYPE -*> \verbatim -*> TYPE is CHARACTER*1 -*> TYPE indices the storage type of the input matrix. -*> = 'G': A is a full matrix. -*> = 'L': A is a lower triangular matrix. -*> = 'U': A is an upper triangular matrix. -*> = 'H': A is an upper Hessenberg matrix. -*> = 'B': A is a symmetric band matrix with lower bandwidth KL -*> and upper bandwidth KU and with the only the lower -*> half stored. -*> = 'Q': A is a symmetric band matrix with lower bandwidth KL -*> and upper bandwidth KU and with the only the upper -*> half stored. -*> = 'Z': A is a band matrix with lower bandwidth KL and upper -*> bandwidth KU. See DGBTRF for storage details. -*> \endverbatim -*> -*> \param[in] KL -*> \verbatim -*> KL is INTEGER -*> The lower bandwidth of A. Referenced only if TYPE = 'B', -*> 'Q' or 'Z'. -*> \endverbatim -*> -*> \param[in] KU -*> \verbatim -*> KU is INTEGER -*> The upper bandwidth of A. Referenced only if TYPE = 'B', -*> 'Q' or 'Z'. -*> \endverbatim -*> -*> \param[in] CFROM -*> \verbatim -*> CFROM is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] CTO -*> \verbatim -*> CTO is DOUBLE PRECISION -*> -*> The matrix A is multiplied by CTO/CFROM. A(I,J) is computed -*> without over/underflow if the final result CTO*A(I,J)/CFROM -*> can be represented without over/underflow. CFROM must be -*> nonzero. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The matrix to be multiplied by CTO/CFROM. See TYPE for the -*> storage type. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> If TYPE = 'G', 'L', 'U', 'H', LDA >= max(1,M); -*> TYPE = 'B', LDA >= KL+1; -*> TYPE = 'Q', LDA >= KU+1; -*> TYPE = 'Z', LDA >= 2*KL+KU+1. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> 0 - successful exit -*> <0 - if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER TYPE - INTEGER INFO, KL, KU, LDA, M, N - DOUBLE PRECISION CFROM, CTO -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) -* .. -* .. Local Scalars .. - LOGICAL DONE - INTEGER I, ITYPE, J, K1, K2, K3, K4 - DOUBLE PRECISION BIGNUM, CFROM1, CFROMC, CTO1, CTOC, MUL, SMLNUM -* .. -* .. External Functions .. - LOGICAL LSAME, DISNAN - DOUBLE PRECISION DLAMCH - EXTERNAL LSAME, DLAMCH, DISNAN -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 -* - IF( LSAME( TYPE, 'G' ) ) THEN - ITYPE = 0 - ELSE IF( LSAME( TYPE, 'L' ) ) THEN - ITYPE = 1 - ELSE IF( LSAME( TYPE, 'U' ) ) THEN - ITYPE = 2 - ELSE IF( LSAME( TYPE, 'H' ) ) THEN - ITYPE = 3 - ELSE IF( LSAME( TYPE, 'B' ) ) THEN - ITYPE = 4 - ELSE IF( LSAME( TYPE, 'Q' ) ) THEN - ITYPE = 5 - ELSE IF( LSAME( TYPE, 'Z' ) ) THEN - ITYPE = 6 - ELSE - ITYPE = -1 - END IF -* - IF( ITYPE.EQ.-1 ) THEN - INFO = -1 - ELSE IF( CFROM.EQ.ZERO .OR. DISNAN(CFROM) ) THEN - INFO = -4 - ELSE IF( DISNAN(CTO) ) THEN - INFO = -5 - ELSE IF( M.LT.0 ) THEN - INFO = -6 - ELSE IF( N.LT.0 .OR. ( ITYPE.EQ.4 .AND. N.NE.M ) .OR. - $ ( ITYPE.EQ.5 .AND. N.NE.M ) ) THEN - INFO = -7 - ELSE IF( ITYPE.LE.3 .AND. LDA.LT.MAX( 1, M ) ) THEN - INFO = -9 - ELSE IF( ITYPE.GE.4 ) THEN - IF( KL.LT.0 .OR. KL.GT.MAX( M-1, 0 ) ) THEN - INFO = -2 - ELSE IF( KU.LT.0 .OR. KU.GT.MAX( N-1, 0 ) .OR. - $ ( ( ITYPE.EQ.4 .OR. ITYPE.EQ.5 ) .AND. KL.NE.KU ) ) - $ THEN - INFO = -3 - ELSE IF( ( ITYPE.EQ.4 .AND. LDA.LT.KL+1 ) .OR. - $ ( ITYPE.EQ.5 .AND. LDA.LT.KU+1 ) .OR. - $ ( ITYPE.EQ.6 .AND. LDA.LT.2*KL+KU+1 ) ) THEN - INFO = -9 - END IF - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLASCL', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 .OR. M.EQ.0 ) - $ RETURN -* -* Get machine parameters -* - SMLNUM = DLAMCH( 'S' ) - BIGNUM = ONE / SMLNUM -* - CFROMC = CFROM - CTOC = CTO -* - 10 CONTINUE - CFROM1 = CFROMC*SMLNUM - IF( CFROM1.EQ.CFROMC ) THEN -! CFROMC is an inf. Multiply by a correctly signed zero for -! finite CTOC, or a NaN if CTOC is infinite. - MUL = CTOC / CFROMC - DONE = .TRUE. - CTO1 = CTOC - ELSE - CTO1 = CTOC / BIGNUM - IF( CTO1.EQ.CTOC ) THEN -! CTOC is either 0 or an inf. In both cases, CTOC itself -! serves as the correct multiplication factor. - MUL = CTOC - DONE = .TRUE. - CFROMC = ONE - ELSE IF( ABS( CFROM1 ).GT.ABS( CTOC ) .AND. CTOC.NE.ZERO ) THEN - MUL = SMLNUM - DONE = .FALSE. - CFROMC = CFROM1 - ELSE IF( ABS( CTO1 ).GT.ABS( CFROMC ) ) THEN - MUL = BIGNUM - DONE = .FALSE. - CTOC = CTO1 - ELSE - MUL = CTOC / CFROMC - DONE = .TRUE. - IF (MUL .EQ. ONE) - $ RETURN - END IF - END IF -* - IF( ITYPE.EQ.0 ) THEN -* -* Full matrix -* - DO 30 J = 1, N - DO 20 I = 1, M - A( I, J ) = A( I, J )*MUL - 20 CONTINUE - 30 CONTINUE -* - ELSE IF( ITYPE.EQ.1 ) THEN -* -* Lower triangular matrix -* - DO 50 J = 1, N - DO 40 I = J, M - A( I, J ) = A( I, J )*MUL - 40 CONTINUE - 50 CONTINUE -* - ELSE IF( ITYPE.EQ.2 ) THEN -* -* Upper triangular matrix -* - DO 70 J = 1, N - DO 60 I = 1, MIN( J, M ) - A( I, J ) = A( I, J )*MUL - 60 CONTINUE - 70 CONTINUE -* - ELSE IF( ITYPE.EQ.3 ) THEN -* -* Upper Hessenberg matrix -* - DO 90 J = 1, N - DO 80 I = 1, MIN( J+1, M ) - A( I, J ) = A( I, J )*MUL - 80 CONTINUE - 90 CONTINUE -* - ELSE IF( ITYPE.EQ.4 ) THEN -* -* Lower half of a symmetric band matrix -* - K3 = KL + 1 - K4 = N + 1 - DO 110 J = 1, N - DO 100 I = 1, MIN( K3, K4-J ) - A( I, J ) = A( I, J )*MUL - 100 CONTINUE - 110 CONTINUE -* - ELSE IF( ITYPE.EQ.5 ) THEN -* -* Upper half of a symmetric band matrix -* - K1 = KU + 2 - K3 = KU + 1 - DO 130 J = 1, N - DO 120 I = MAX( K1-J, 1 ), K3 - A( I, J ) = A( I, J )*MUL - 120 CONTINUE - 130 CONTINUE -* - ELSE IF( ITYPE.EQ.6 ) THEN -* -* Band matrix -* - K1 = KL + KU + 2 - K2 = KL + 1 - K3 = 2*KL + KU + 1 - K4 = KL + KU + 1 + M - DO 150 J = 1, N - DO 140 I = MAX( K1-J, K2 ), MIN( K3, K4-J ) - A( I, J ) = A( I, J )*MUL - 140 CONTINUE - 150 CONTINUE -* - END IF -* - IF( .NOT.DONE ) - $ GO TO 10 -* - RETURN -* -* End of DLASCL -* - END diff --git a/lib/linalg/fortran/dlasd4.f b/lib/linalg/fortran/dlasd4.f deleted file mode 100644 index acfd896b3b..0000000000 --- a/lib/linalg/fortran/dlasd4.f +++ /dev/null @@ -1,1058 +0,0 @@ -*> \brief \b DLASD4 computes the square root of the i-th updated eigenvalue of a positive symmetric rank-one modification to a positive diagonal matrix. Used by dbdsdc. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASD4 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASD4( N, I, D, Z, DELTA, RHO, SIGMA, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER I, INFO, N -* DOUBLE PRECISION RHO, SIGMA -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( * ), DELTA( * ), WORK( * ), Z( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> This subroutine computes the square root of the I-th updated -*> eigenvalue of a positive symmetric rank-one modification to -*> a positive diagonal matrix whose entries are given as the squares -*> of the corresponding entries in the array d, and that -*> -*> 0 <= D(i) < D(j) for i < j -*> -*> and that RHO > 0. This is arranged by the calling routine, and is -*> no loss in generality. The rank-one modified system is thus -*> -*> diag( D ) * diag( D ) + RHO * Z * Z_transpose. -*> -*> where we assume the Euclidean norm of Z is 1. -*> -*> The method consists of approximating the rational functions in the -*> secular equation by simpler interpolating rational functions. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The length of all arrays. -*> \endverbatim -*> -*> \param[in] I -*> \verbatim -*> I is INTEGER -*> The index of the eigenvalue to be computed. 1 <= I <= N. -*> \endverbatim -*> -*> \param[in] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension ( N ) -*> The original eigenvalues. It is assumed that they are in -*> order, 0 <= D(I) < D(J) for I < J. -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension ( N ) -*> The components of the updating vector. -*> \endverbatim -*> -*> \param[out] DELTA -*> \verbatim -*> DELTA is DOUBLE PRECISION array, dimension ( N ) -*> If N .ne. 1, DELTA contains (D(j) - sigma_I) in its j-th -*> component. If N = 1, then DELTA(1) = 1. The vector DELTA -*> contains the information necessary to construct the -*> (singular) eigenvectors. -*> \endverbatim -*> -*> \param[in] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> The scalar in the symmetric updating formula. -*> \endverbatim -*> -*> \param[out] SIGMA -*> \verbatim -*> SIGMA is DOUBLE PRECISION -*> The computed sigma_I, the I-th updated eigenvalue. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension ( N ) -*> If N .ne. 1, WORK contains (D(j) + sigma_I) in its j-th -*> component. If N = 1, then WORK( 1 ) = 1. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> > 0: if INFO = 1, the updating process failed. -*> \endverbatim -* -*> \par Internal Parameters: -* ========================= -*> -*> \verbatim -*> Logical variable ORGATI (origin-at-i?) is used for distinguishing -*> whether D(i) or D(i+1) is treated as the origin. -*> -*> ORGATI = .true. origin at i -*> ORGATI = .false. origin at i+1 -*> -*> Logical variable SWTCH3 (switch-for-3-poles?) is for noting -*> if we are working with THREE poles! -*> -*> MAXIT is the maximum number of iterations allowed for each -*> eigenvalue. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Contributors: -* ================== -*> -*> Ren-Cang Li, Computer Science Division, University of California -*> at Berkeley, USA -*> -* ===================================================================== - SUBROUTINE DLASD4( N, I, D, Z, DELTA, RHO, SIGMA, WORK, INFO ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER I, INFO, N - DOUBLE PRECISION RHO, SIGMA -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( * ), DELTA( * ), WORK( * ), Z( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - INTEGER MAXIT - PARAMETER ( MAXIT = 400 ) - DOUBLE PRECISION ZERO, ONE, TWO, THREE, FOUR, EIGHT, TEN - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0, - $ THREE = 3.0D+0, FOUR = 4.0D+0, EIGHT = 8.0D+0, - $ TEN = 10.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL ORGATI, SWTCH, SWTCH3, GEOMAVG - INTEGER II, IIM1, IIP1, IP1, ITER, J, NITER - DOUBLE PRECISION A, B, C, DELSQ, DELSQ2, SQ2, DPHI, DPSI, DTIIM, - $ DTIIP, DTIPSQ, DTISQ, DTNSQ, DTNSQ1, DW, EPS, - $ ERRETM, ETA, PHI, PREW, PSI, RHOINV, SGLB, - $ SGUB, TAU, TAU2, TEMP, TEMP1, TEMP2, W -* .. -* .. Local Arrays .. - DOUBLE PRECISION DD( 3 ), ZZ( 3 ) -* .. -* .. External Subroutines .. - EXTERNAL DLAED6, DLASD5 -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH - EXTERNAL DLAMCH -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* -* Since this routine is called in an inner loop, we do no argument -* checking. -* -* Quick return for N=1 and 2. -* - INFO = 0 - IF( N.EQ.1 ) THEN -* -* Presumably, I=1 upon entry -* - SIGMA = SQRT( D( 1 )*D( 1 )+RHO*Z( 1 )*Z( 1 ) ) - DELTA( 1 ) = ONE - WORK( 1 ) = ONE - RETURN - END IF - IF( N.EQ.2 ) THEN - CALL DLASD5( I, D, Z, DELTA, RHO, SIGMA, WORK ) - RETURN - END IF -* -* Compute machine epsilon -* - EPS = DLAMCH( 'Epsilon' ) - RHOINV = ONE / RHO - TAU2= ZERO -* -* The case I = N -* - IF( I.EQ.N ) THEN -* -* Initialize some basic variables -* - II = N - 1 - NITER = 1 -* -* Calculate initial guess -* - TEMP = RHO / TWO -* -* If ||Z||_2 is not one, then TEMP should be set to -* RHO * ||Z||_2^2 / TWO -* - TEMP1 = TEMP / ( D( N )+SQRT( D( N )*D( N )+TEMP ) ) - DO 10 J = 1, N - WORK( J ) = D( J ) + D( N ) + TEMP1 - DELTA( J ) = ( D( J )-D( N ) ) - TEMP1 - 10 CONTINUE -* - PSI = ZERO - DO 20 J = 1, N - 2 - PSI = PSI + Z( J )*Z( J ) / ( DELTA( J )*WORK( J ) ) - 20 CONTINUE -* - C = RHOINV + PSI - W = C + Z( II )*Z( II ) / ( DELTA( II )*WORK( II ) ) + - $ Z( N )*Z( N ) / ( DELTA( N )*WORK( N ) ) -* - IF( W.LE.ZERO ) THEN - TEMP1 = SQRT( D( N )*D( N )+RHO ) - TEMP = Z( N-1 )*Z( N-1 ) / ( ( D( N-1 )+TEMP1 )* - $ ( D( N )-D( N-1 )+RHO / ( D( N )+TEMP1 ) ) ) + - $ Z( N )*Z( N ) / RHO -* -* The following TAU2 is to approximate -* SIGMA_n^2 - D( N )*D( N ) -* - IF( C.LE.TEMP ) THEN - TAU = RHO - ELSE - DELSQ = ( D( N )-D( N-1 ) )*( D( N )+D( N-1 ) ) - A = -C*DELSQ + Z( N-1 )*Z( N-1 ) + Z( N )*Z( N ) - B = Z( N )*Z( N )*DELSQ - IF( A.LT.ZERO ) THEN - TAU2 = TWO*B / ( SQRT( A*A+FOUR*B*C )-A ) - ELSE - TAU2 = ( A+SQRT( A*A+FOUR*B*C ) ) / ( TWO*C ) - END IF - TAU = TAU2 / ( D( N )+SQRT( D( N )*D( N )+TAU2 ) ) - END IF -* -* It can be proved that -* D(N)^2+RHO/2 <= SIGMA_n^2 < D(N)^2+TAU2 <= D(N)^2+RHO -* - ELSE - DELSQ = ( D( N )-D( N-1 ) )*( D( N )+D( N-1 ) ) - A = -C*DELSQ + Z( N-1 )*Z( N-1 ) + Z( N )*Z( N ) - B = Z( N )*Z( N )*DELSQ -* -* The following TAU2 is to approximate -* SIGMA_n^2 - D( N )*D( N ) -* - IF( A.LT.ZERO ) THEN - TAU2 = TWO*B / ( SQRT( A*A+FOUR*B*C )-A ) - ELSE - TAU2 = ( A+SQRT( A*A+FOUR*B*C ) ) / ( TWO*C ) - END IF - TAU = TAU2 / ( D( N )+SQRT( D( N )*D( N )+TAU2 ) ) - -* -* It can be proved that -* D(N)^2 < D(N)^2+TAU2 < SIGMA(N)^2 < D(N)^2+RHO/2 -* - END IF -* -* The following TAU is to approximate SIGMA_n - D( N ) -* -* TAU = TAU2 / ( D( N )+SQRT( D( N )*D( N )+TAU2 ) ) -* - SIGMA = D( N ) + TAU - DO 30 J = 1, N - DELTA( J ) = ( D( J )-D( N ) ) - TAU - WORK( J ) = D( J ) + D( N ) + TAU - 30 CONTINUE -* -* Evaluate PSI and the derivative DPSI -* - DPSI = ZERO - PSI = ZERO - ERRETM = ZERO - DO 40 J = 1, II - TEMP = Z( J ) / ( DELTA( J )*WORK( J ) ) - PSI = PSI + Z( J )*TEMP - DPSI = DPSI + TEMP*TEMP - ERRETM = ERRETM + PSI - 40 CONTINUE - ERRETM = ABS( ERRETM ) -* -* Evaluate PHI and the derivative DPHI -* - TEMP = Z( N ) / ( DELTA( N )*WORK( N ) ) - PHI = Z( N )*TEMP - DPHI = TEMP*TEMP - ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV -* $ + ABS( TAU2 )*( DPSI+DPHI ) -* - W = RHOINV + PHI + PSI -* -* Test for convergence -* - IF( ABS( W ).LE.EPS*ERRETM ) THEN - GO TO 240 - END IF -* -* Calculate the new step -* - NITER = NITER + 1 - DTNSQ1 = WORK( N-1 )*DELTA( N-1 ) - DTNSQ = WORK( N )*DELTA( N ) - C = W - DTNSQ1*DPSI - DTNSQ*DPHI - A = ( DTNSQ+DTNSQ1 )*W - DTNSQ*DTNSQ1*( DPSI+DPHI ) - B = DTNSQ*DTNSQ1*W - IF( C.LT.ZERO ) - $ C = ABS( C ) - IF( C.EQ.ZERO ) THEN - ETA = RHO - SIGMA*SIGMA - ELSE IF( A.GE.ZERO ) THEN - ETA = ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - ELSE - ETA = TWO*B / ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) - END IF -* -* Note, eta should be positive if w is negative, and -* eta should be negative otherwise. However, -* if for some reason caused by roundoff, eta*w > 0, -* we simply use one Newton step instead. This way -* will guarantee eta*w < 0. -* - IF( W*ETA.GT.ZERO ) - $ ETA = -W / ( DPSI+DPHI ) - TEMP = ETA - DTNSQ - IF( TEMP.GT.RHO ) - $ ETA = RHO + DTNSQ -* - ETA = ETA / ( SIGMA+SQRT( ETA+SIGMA*SIGMA ) ) - TAU = TAU + ETA - SIGMA = SIGMA + ETA -* - DO 50 J = 1, N - DELTA( J ) = DELTA( J ) - ETA - WORK( J ) = WORK( J ) + ETA - 50 CONTINUE -* -* Evaluate PSI and the derivative DPSI -* - DPSI = ZERO - PSI = ZERO - ERRETM = ZERO - DO 60 J = 1, II - TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) - PSI = PSI + Z( J )*TEMP - DPSI = DPSI + TEMP*TEMP - ERRETM = ERRETM + PSI - 60 CONTINUE - ERRETM = ABS( ERRETM ) -* -* Evaluate PHI and the derivative DPHI -* - TAU2 = WORK( N )*DELTA( N ) - TEMP = Z( N ) / TAU2 - PHI = Z( N )*TEMP - DPHI = TEMP*TEMP - ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV -* $ + ABS( TAU2 )*( DPSI+DPHI ) -* - W = RHOINV + PHI + PSI -* -* Main loop to update the values of the array DELTA -* - ITER = NITER + 1 -* - DO 90 NITER = ITER, MAXIT -* -* Test for convergence -* - IF( ABS( W ).LE.EPS*ERRETM ) THEN - GO TO 240 - END IF -* -* Calculate the new step -* - DTNSQ1 = WORK( N-1 )*DELTA( N-1 ) - DTNSQ = WORK( N )*DELTA( N ) - C = W - DTNSQ1*DPSI - DTNSQ*DPHI - A = ( DTNSQ+DTNSQ1 )*W - DTNSQ1*DTNSQ*( DPSI+DPHI ) - B = DTNSQ1*DTNSQ*W - IF( A.GE.ZERO ) THEN - ETA = ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - ELSE - ETA = TWO*B / ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) - END IF -* -* Note, eta should be positive if w is negative, and -* eta should be negative otherwise. However, -* if for some reason caused by roundoff, eta*w > 0, -* we simply use one Newton step instead. This way -* will guarantee eta*w < 0. -* - IF( W*ETA.GT.ZERO ) - $ ETA = -W / ( DPSI+DPHI ) - TEMP = ETA - DTNSQ - IF( TEMP.LE.ZERO ) - $ ETA = ETA / TWO -* - ETA = ETA / ( SIGMA+SQRT( ETA+SIGMA*SIGMA ) ) - TAU = TAU + ETA - SIGMA = SIGMA + ETA -* - DO 70 J = 1, N - DELTA( J ) = DELTA( J ) - ETA - WORK( J ) = WORK( J ) + ETA - 70 CONTINUE -* -* Evaluate PSI and the derivative DPSI -* - DPSI = ZERO - PSI = ZERO - ERRETM = ZERO - DO 80 J = 1, II - TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) - PSI = PSI + Z( J )*TEMP - DPSI = DPSI + TEMP*TEMP - ERRETM = ERRETM + PSI - 80 CONTINUE - ERRETM = ABS( ERRETM ) -* -* Evaluate PHI and the derivative DPHI -* - TAU2 = WORK( N )*DELTA( N ) - TEMP = Z( N ) / TAU2 - PHI = Z( N )*TEMP - DPHI = TEMP*TEMP - ERRETM = EIGHT*( -PHI-PSI ) + ERRETM - PHI + RHOINV -* $ + ABS( TAU2 )*( DPSI+DPHI ) -* - W = RHOINV + PHI + PSI - 90 CONTINUE -* -* Return with INFO = 1, NITER = MAXIT and not converged -* - INFO = 1 - GO TO 240 -* -* End for the case I = N -* - ELSE -* -* The case for I < N -* - NITER = 1 - IP1 = I + 1 -* -* Calculate initial guess -* - DELSQ = ( D( IP1 )-D( I ) )*( D( IP1 )+D( I ) ) - DELSQ2 = DELSQ / TWO - SQ2=SQRT( ( D( I )*D( I )+D( IP1 )*D( IP1 ) ) / TWO ) - TEMP = DELSQ2 / ( D( I )+SQ2 ) - DO 100 J = 1, N - WORK( J ) = D( J ) + D( I ) + TEMP - DELTA( J ) = ( D( J )-D( I ) ) - TEMP - 100 CONTINUE -* - PSI = ZERO - DO 110 J = 1, I - 1 - PSI = PSI + Z( J )*Z( J ) / ( WORK( J )*DELTA( J ) ) - 110 CONTINUE -* - PHI = ZERO - DO 120 J = N, I + 2, -1 - PHI = PHI + Z( J )*Z( J ) / ( WORK( J )*DELTA( J ) ) - 120 CONTINUE - C = RHOINV + PSI + PHI - W = C + Z( I )*Z( I ) / ( WORK( I )*DELTA( I ) ) + - $ Z( IP1 )*Z( IP1 ) / ( WORK( IP1 )*DELTA( IP1 ) ) -* - GEOMAVG = .FALSE. - IF( W.GT.ZERO ) THEN -* -* d(i)^2 < the ith sigma^2 < (d(i)^2+d(i+1)^2)/2 -* -* We choose d(i) as origin. -* - ORGATI = .TRUE. - II = I - SGLB = ZERO - SGUB = DELSQ2 / ( D( I )+SQ2 ) - A = C*DELSQ + Z( I )*Z( I ) + Z( IP1 )*Z( IP1 ) - B = Z( I )*Z( I )*DELSQ - IF( A.GT.ZERO ) THEN - TAU2 = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) - ELSE - TAU2 = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - END IF -* -* TAU2 now is an estimation of SIGMA^2 - D( I )^2. The -* following, however, is the corresponding estimation of -* SIGMA - D( I ). -* - TAU = TAU2 / ( D( I )+SQRT( D( I )*D( I )+TAU2 ) ) - TEMP = SQRT(EPS) - IF( (D(I).LE.TEMP*D(IP1)).AND.(ABS(Z(I)).LE.TEMP) - $ .AND.(D(I).GT.ZERO) ) THEN - TAU = MIN( TEN*D(I), SGUB ) - GEOMAVG = .TRUE. - END IF - ELSE -* -* (d(i)^2+d(i+1)^2)/2 <= the ith sigma^2 < d(i+1)^2/2 -* -* We choose d(i+1) as origin. -* - ORGATI = .FALSE. - II = IP1 - SGLB = -DELSQ2 / ( D( II )+SQ2 ) - SGUB = ZERO - A = C*DELSQ - Z( I )*Z( I ) - Z( IP1 )*Z( IP1 ) - B = Z( IP1 )*Z( IP1 )*DELSQ - IF( A.LT.ZERO ) THEN - TAU2 = TWO*B / ( A-SQRT( ABS( A*A+FOUR*B*C ) ) ) - ELSE - TAU2 = -( A+SQRT( ABS( A*A+FOUR*B*C ) ) ) / ( TWO*C ) - END IF -* -* TAU2 now is an estimation of SIGMA^2 - D( IP1 )^2. The -* following, however, is the corresponding estimation of -* SIGMA - D( IP1 ). -* - TAU = TAU2 / ( D( IP1 )+SQRT( ABS( D( IP1 )*D( IP1 )+ - $ TAU2 ) ) ) - END IF -* - SIGMA = D( II ) + TAU - DO 130 J = 1, N - WORK( J ) = D( J ) + D( II ) + TAU - DELTA( J ) = ( D( J )-D( II ) ) - TAU - 130 CONTINUE - IIM1 = II - 1 - IIP1 = II + 1 -* -* Evaluate PSI and the derivative DPSI -* - DPSI = ZERO - PSI = ZERO - ERRETM = ZERO - DO 150 J = 1, IIM1 - TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) - PSI = PSI + Z( J )*TEMP - DPSI = DPSI + TEMP*TEMP - ERRETM = ERRETM + PSI - 150 CONTINUE - ERRETM = ABS( ERRETM ) -* -* Evaluate PHI and the derivative DPHI -* - DPHI = ZERO - PHI = ZERO - DO 160 J = N, IIP1, -1 - TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) - PHI = PHI + Z( J )*TEMP - DPHI = DPHI + TEMP*TEMP - ERRETM = ERRETM + PHI - 160 CONTINUE -* - W = RHOINV + PHI + PSI -* -* W is the value of the secular function with -* its ii-th element removed. -* - SWTCH3 = .FALSE. - IF( ORGATI ) THEN - IF( W.LT.ZERO ) - $ SWTCH3 = .TRUE. - ELSE - IF( W.GT.ZERO ) - $ SWTCH3 = .TRUE. - END IF - IF( II.EQ.1 .OR. II.EQ.N ) - $ SWTCH3 = .FALSE. -* - TEMP = Z( II ) / ( WORK( II )*DELTA( II ) ) - DW = DPSI + DPHI + TEMP*TEMP - TEMP = Z( II )*TEMP - W = W + TEMP - ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV - $ + THREE*ABS( TEMP ) -* $ + ABS( TAU2 )*DW -* -* Test for convergence -* - IF( ABS( W ).LE.EPS*ERRETM ) THEN - GO TO 240 - END IF -* - IF( W.LE.ZERO ) THEN - SGLB = MAX( SGLB, TAU ) - ELSE - SGUB = MIN( SGUB, TAU ) - END IF -* -* Calculate the new step -* - NITER = NITER + 1 - IF( .NOT.SWTCH3 ) THEN - DTIPSQ = WORK( IP1 )*DELTA( IP1 ) - DTISQ = WORK( I )*DELTA( I ) - IF( ORGATI ) THEN - C = W - DTIPSQ*DW + DELSQ*( Z( I ) / DTISQ )**2 - ELSE - C = W - DTISQ*DW - DELSQ*( Z( IP1 ) / DTIPSQ )**2 - END IF - A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW - B = DTIPSQ*DTISQ*W - IF( C.EQ.ZERO ) THEN - IF( A.EQ.ZERO ) THEN - IF( ORGATI ) THEN - A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ*( DPSI+DPHI ) - ELSE - A = Z( IP1 )*Z( IP1 ) + DTISQ*DTISQ*( DPSI+DPHI ) - END IF - END IF - ETA = B / A - ELSE IF( A.LE.ZERO ) THEN - ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - ELSE - ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) - END IF - ELSE -* -* Interpolation using THREE most relevant poles -* - DTIIM = WORK( IIM1 )*DELTA( IIM1 ) - DTIIP = WORK( IIP1 )*DELTA( IIP1 ) - TEMP = RHOINV + PSI + PHI - IF( ORGATI ) THEN - TEMP1 = Z( IIM1 ) / DTIIM - TEMP1 = TEMP1*TEMP1 - C = ( TEMP - DTIIP*( DPSI+DPHI ) ) - - $ ( D( IIM1 )-D( IIP1 ) )*( D( IIM1 )+D( IIP1 ) )*TEMP1 - ZZ( 1 ) = Z( IIM1 )*Z( IIM1 ) - IF( DPSI.LT.TEMP1 ) THEN - ZZ( 3 ) = DTIIP*DTIIP*DPHI - ELSE - ZZ( 3 ) = DTIIP*DTIIP*( ( DPSI-TEMP1 )+DPHI ) - END IF - ELSE - TEMP1 = Z( IIP1 ) / DTIIP - TEMP1 = TEMP1*TEMP1 - C = ( TEMP - DTIIM*( DPSI+DPHI ) ) - - $ ( D( IIP1 )-D( IIM1 ) )*( D( IIM1 )+D( IIP1 ) )*TEMP1 - IF( DPHI.LT.TEMP1 ) THEN - ZZ( 1 ) = DTIIM*DTIIM*DPSI - ELSE - ZZ( 1 ) = DTIIM*DTIIM*( DPSI+( DPHI-TEMP1 ) ) - END IF - ZZ( 3 ) = Z( IIP1 )*Z( IIP1 ) - END IF - ZZ( 2 ) = Z( II )*Z( II ) - DD( 1 ) = DTIIM - DD( 2 ) = DELTA( II )*WORK( II ) - DD( 3 ) = DTIIP - CALL DLAED6( NITER, ORGATI, C, DD, ZZ, W, ETA, INFO ) -* - IF( INFO.NE.0 ) THEN -* -* If INFO is not 0, i.e., DLAED6 failed, switch back -* to 2 pole interpolation. -* - SWTCH3 = .FALSE. - INFO = 0 - DTIPSQ = WORK( IP1 )*DELTA( IP1 ) - DTISQ = WORK( I )*DELTA( I ) - IF( ORGATI ) THEN - C = W - DTIPSQ*DW + DELSQ*( Z( I ) / DTISQ )**2 - ELSE - C = W - DTISQ*DW - DELSQ*( Z( IP1 ) / DTIPSQ )**2 - END IF - A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW - B = DTIPSQ*DTISQ*W - IF( C.EQ.ZERO ) THEN - IF( A.EQ.ZERO ) THEN - IF( ORGATI ) THEN - A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ*( DPSI+DPHI ) - ELSE - A = Z( IP1 )*Z( IP1 ) + DTISQ*DTISQ*( DPSI+DPHI) - END IF - END IF - ETA = B / A - ELSE IF( A.LE.ZERO ) THEN - ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - ELSE - ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) - END IF - END IF - END IF -* -* Note, eta should be positive if w is negative, and -* eta should be negative otherwise. However, -* if for some reason caused by roundoff, eta*w > 0, -* we simply use one Newton step instead. This way -* will guarantee eta*w < 0. -* - IF( W*ETA.GE.ZERO ) - $ ETA = -W / DW -* - ETA = ETA / ( SIGMA+SQRT( SIGMA*SIGMA+ETA ) ) - TEMP = TAU + ETA - IF( TEMP.GT.SGUB .OR. TEMP.LT.SGLB ) THEN - IF( W.LT.ZERO ) THEN - ETA = ( SGUB-TAU ) / TWO - ELSE - ETA = ( SGLB-TAU ) / TWO - END IF - IF( GEOMAVG ) THEN - IF( W .LT. ZERO ) THEN - IF( TAU .GT. ZERO ) THEN - ETA = SQRT(SGUB*TAU)-TAU - END IF - ELSE - IF( SGLB .GT. ZERO ) THEN - ETA = SQRT(SGLB*TAU)-TAU - END IF - END IF - END IF - END IF -* - PREW = W -* - TAU = TAU + ETA - SIGMA = SIGMA + ETA -* - DO 170 J = 1, N - WORK( J ) = WORK( J ) + ETA - DELTA( J ) = DELTA( J ) - ETA - 170 CONTINUE -* -* Evaluate PSI and the derivative DPSI -* - DPSI = ZERO - PSI = ZERO - ERRETM = ZERO - DO 180 J = 1, IIM1 - TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) - PSI = PSI + Z( J )*TEMP - DPSI = DPSI + TEMP*TEMP - ERRETM = ERRETM + PSI - 180 CONTINUE - ERRETM = ABS( ERRETM ) -* -* Evaluate PHI and the derivative DPHI -* - DPHI = ZERO - PHI = ZERO - DO 190 J = N, IIP1, -1 - TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) - PHI = PHI + Z( J )*TEMP - DPHI = DPHI + TEMP*TEMP - ERRETM = ERRETM + PHI - 190 CONTINUE -* - TAU2 = WORK( II )*DELTA( II ) - TEMP = Z( II ) / TAU2 - DW = DPSI + DPHI + TEMP*TEMP - TEMP = Z( II )*TEMP - W = RHOINV + PHI + PSI + TEMP - ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV - $ + THREE*ABS( TEMP ) -* $ + ABS( TAU2 )*DW -* - SWTCH = .FALSE. - IF( ORGATI ) THEN - IF( -W.GT.ABS( PREW ) / TEN ) - $ SWTCH = .TRUE. - ELSE - IF( W.GT.ABS( PREW ) / TEN ) - $ SWTCH = .TRUE. - END IF -* -* Main loop to update the values of the array DELTA and WORK -* - ITER = NITER + 1 -* - DO 230 NITER = ITER, MAXIT -* -* Test for convergence -* - IF( ABS( W ).LE.EPS*ERRETM ) THEN -* $ .OR. (SGUB-SGLB).LE.EIGHT*ABS(SGUB+SGLB) ) THEN - GO TO 240 - END IF -* - IF( W.LE.ZERO ) THEN - SGLB = MAX( SGLB, TAU ) - ELSE - SGUB = MIN( SGUB, TAU ) - END IF -* -* Calculate the new step -* - IF( .NOT.SWTCH3 ) THEN - DTIPSQ = WORK( IP1 )*DELTA( IP1 ) - DTISQ = WORK( I )*DELTA( I ) - IF( .NOT.SWTCH ) THEN - IF( ORGATI ) THEN - C = W - DTIPSQ*DW + DELSQ*( Z( I ) / DTISQ )**2 - ELSE - C = W - DTISQ*DW - DELSQ*( Z( IP1 ) / DTIPSQ )**2 - END IF - ELSE - TEMP = Z( II ) / ( WORK( II )*DELTA( II ) ) - IF( ORGATI ) THEN - DPSI = DPSI + TEMP*TEMP - ELSE - DPHI = DPHI + TEMP*TEMP - END IF - C = W - DTISQ*DPSI - DTIPSQ*DPHI - END IF - A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW - B = DTIPSQ*DTISQ*W - IF( C.EQ.ZERO ) THEN - IF( A.EQ.ZERO ) THEN - IF( .NOT.SWTCH ) THEN - IF( ORGATI ) THEN - A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ* - $ ( DPSI+DPHI ) - ELSE - A = Z( IP1 )*Z( IP1 ) + - $ DTISQ*DTISQ*( DPSI+DPHI ) - END IF - ELSE - A = DTISQ*DTISQ*DPSI + DTIPSQ*DTIPSQ*DPHI - END IF - END IF - ETA = B / A - ELSE IF( A.LE.ZERO ) THEN - ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - ELSE - ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) - END IF - ELSE -* -* Interpolation using THREE most relevant poles -* - DTIIM = WORK( IIM1 )*DELTA( IIM1 ) - DTIIP = WORK( IIP1 )*DELTA( IIP1 ) - TEMP = RHOINV + PSI + PHI - IF( SWTCH ) THEN - C = TEMP - DTIIM*DPSI - DTIIP*DPHI - ZZ( 1 ) = DTIIM*DTIIM*DPSI - ZZ( 3 ) = DTIIP*DTIIP*DPHI - ELSE - IF( ORGATI ) THEN - TEMP1 = Z( IIM1 ) / DTIIM - TEMP1 = TEMP1*TEMP1 - TEMP2 = ( D( IIM1 )-D( IIP1 ) )* - $ ( D( IIM1 )+D( IIP1 ) )*TEMP1 - C = TEMP - DTIIP*( DPSI+DPHI ) - TEMP2 - ZZ( 1 ) = Z( IIM1 )*Z( IIM1 ) - IF( DPSI.LT.TEMP1 ) THEN - ZZ( 3 ) = DTIIP*DTIIP*DPHI - ELSE - ZZ( 3 ) = DTIIP*DTIIP*( ( DPSI-TEMP1 )+DPHI ) - END IF - ELSE - TEMP1 = Z( IIP1 ) / DTIIP - TEMP1 = TEMP1*TEMP1 - TEMP2 = ( D( IIP1 )-D( IIM1 ) )* - $ ( D( IIM1 )+D( IIP1 ) )*TEMP1 - C = TEMP - DTIIM*( DPSI+DPHI ) - TEMP2 - IF( DPHI.LT.TEMP1 ) THEN - ZZ( 1 ) = DTIIM*DTIIM*DPSI - ELSE - ZZ( 1 ) = DTIIM*DTIIM*( DPSI+( DPHI-TEMP1 ) ) - END IF - ZZ( 3 ) = Z( IIP1 )*Z( IIP1 ) - END IF - END IF - DD( 1 ) = DTIIM - DD( 2 ) = DELTA( II )*WORK( II ) - DD( 3 ) = DTIIP - CALL DLAED6( NITER, ORGATI, C, DD, ZZ, W, ETA, INFO ) -* - IF( INFO.NE.0 ) THEN -* -* If INFO is not 0, i.e., DLAED6 failed, switch -* back to two pole interpolation -* - SWTCH3 = .FALSE. - INFO = 0 - DTIPSQ = WORK( IP1 )*DELTA( IP1 ) - DTISQ = WORK( I )*DELTA( I ) - IF( .NOT.SWTCH ) THEN - IF( ORGATI ) THEN - C = W - DTIPSQ*DW + DELSQ*( Z( I )/DTISQ )**2 - ELSE - C = W - DTISQ*DW - DELSQ*( Z( IP1 )/DTIPSQ )**2 - END IF - ELSE - TEMP = Z( II ) / ( WORK( II )*DELTA( II ) ) - IF( ORGATI ) THEN - DPSI = DPSI + TEMP*TEMP - ELSE - DPHI = DPHI + TEMP*TEMP - END IF - C = W - DTISQ*DPSI - DTIPSQ*DPHI - END IF - A = ( DTIPSQ+DTISQ )*W - DTIPSQ*DTISQ*DW - B = DTIPSQ*DTISQ*W - IF( C.EQ.ZERO ) THEN - IF( A.EQ.ZERO ) THEN - IF( .NOT.SWTCH ) THEN - IF( ORGATI ) THEN - A = Z( I )*Z( I ) + DTIPSQ*DTIPSQ* - $ ( DPSI+DPHI ) - ELSE - A = Z( IP1 )*Z( IP1 ) + - $ DTISQ*DTISQ*( DPSI+DPHI ) - END IF - ELSE - A = DTISQ*DTISQ*DPSI + DTIPSQ*DTIPSQ*DPHI - END IF - END IF - ETA = B / A - ELSE IF( A.LE.ZERO ) THEN - ETA = ( A-SQRT( ABS( A*A-FOUR*B*C ) ) ) / ( TWO*C ) - ELSE - ETA = TWO*B / ( A+SQRT( ABS( A*A-FOUR*B*C ) ) ) - END IF - END IF - END IF -* -* Note, eta should be positive if w is negative, and -* eta should be negative otherwise. However, -* if for some reason caused by roundoff, eta*w > 0, -* we simply use one Newton step instead. This way -* will guarantee eta*w < 0. -* - IF( W*ETA.GE.ZERO ) - $ ETA = -W / DW -* - ETA = ETA / ( SIGMA+SQRT( SIGMA*SIGMA+ETA ) ) - TEMP=TAU+ETA - IF( TEMP.GT.SGUB .OR. TEMP.LT.SGLB ) THEN - IF( W.LT.ZERO ) THEN - ETA = ( SGUB-TAU ) / TWO - ELSE - ETA = ( SGLB-TAU ) / TWO - END IF - IF( GEOMAVG ) THEN - IF( W .LT. ZERO ) THEN - IF( TAU .GT. ZERO ) THEN - ETA = SQRT(SGUB*TAU)-TAU - END IF - ELSE - IF( SGLB .GT. ZERO ) THEN - ETA = SQRT(SGLB*TAU)-TAU - END IF - END IF - END IF - END IF -* - PREW = W -* - TAU = TAU + ETA - SIGMA = SIGMA + ETA -* - DO 200 J = 1, N - WORK( J ) = WORK( J ) + ETA - DELTA( J ) = DELTA( J ) - ETA - 200 CONTINUE -* -* Evaluate PSI and the derivative DPSI -* - DPSI = ZERO - PSI = ZERO - ERRETM = ZERO - DO 210 J = 1, IIM1 - TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) - PSI = PSI + Z( J )*TEMP - DPSI = DPSI + TEMP*TEMP - ERRETM = ERRETM + PSI - 210 CONTINUE - ERRETM = ABS( ERRETM ) -* -* Evaluate PHI and the derivative DPHI -* - DPHI = ZERO - PHI = ZERO - DO 220 J = N, IIP1, -1 - TEMP = Z( J ) / ( WORK( J )*DELTA( J ) ) - PHI = PHI + Z( J )*TEMP - DPHI = DPHI + TEMP*TEMP - ERRETM = ERRETM + PHI - 220 CONTINUE -* - TAU2 = WORK( II )*DELTA( II ) - TEMP = Z( II ) / TAU2 - DW = DPSI + DPHI + TEMP*TEMP - TEMP = Z( II )*TEMP - W = RHOINV + PHI + PSI + TEMP - ERRETM = EIGHT*( PHI-PSI ) + ERRETM + TWO*RHOINV - $ + THREE*ABS( TEMP ) -* $ + ABS( TAU2 )*DW -* - IF( W*PREW.GT.ZERO .AND. ABS( W ).GT.ABS( PREW ) / TEN ) - $ SWTCH = .NOT.SWTCH -* - 230 CONTINUE -* -* Return with INFO = 1, NITER = MAXIT and not converged -* - INFO = 1 -* - END IF -* - 240 CONTINUE - RETURN -* -* End of DLASD4 -* - END diff --git a/lib/linalg/fortran/dlasd5.f b/lib/linalg/fortran/dlasd5.f deleted file mode 100644 index 645c2fdc3e..0000000000 --- a/lib/linalg/fortran/dlasd5.f +++ /dev/null @@ -1,228 +0,0 @@ -*> \brief \b DLASD5 computes the square root of the i-th eigenvalue of a positive symmetric rank-one modification of a 2-by-2 diagonal matrix. Used by sbdsdc. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASD5 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASD5( I, D, Z, DELTA, RHO, DSIGMA, WORK ) -* -* .. Scalar Arguments .. -* INTEGER I -* DOUBLE PRECISION DSIGMA, RHO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( 2 ), DELTA( 2 ), WORK( 2 ), Z( 2 ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> This subroutine computes the square root of the I-th eigenvalue -*> of a positive symmetric rank-one modification of a 2-by-2 diagonal -*> matrix -*> -*> diag( D ) * diag( D ) + RHO * Z * transpose(Z) . -*> -*> The diagonal entries in the array D are assumed to satisfy -*> -*> 0 <= D(i) < D(j) for i < j . -*> -*> We also assume RHO > 0 and that the Euclidean norm of the vector -*> Z is one. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] I -*> \verbatim -*> I is INTEGER -*> The index of the eigenvalue to be computed. I = 1 or I = 2. -*> \endverbatim -*> -*> \param[in] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension ( 2 ) -*> The original eigenvalues. We assume 0 <= D(1) < D(2). -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension ( 2 ) -*> The components of the updating vector. -*> \endverbatim -*> -*> \param[out] DELTA -*> \verbatim -*> DELTA is DOUBLE PRECISION array, dimension ( 2 ) -*> Contains (D(j) - sigma_I) in its j-th component. -*> The vector DELTA contains the information necessary -*> to construct the eigenvectors. -*> \endverbatim -*> -*> \param[in] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> The scalar in the symmetric updating formula. -*> \endverbatim -*> -*> \param[out] DSIGMA -*> \verbatim -*> DSIGMA is DOUBLE PRECISION -*> The computed sigma_I, the I-th updated eigenvalue. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension ( 2 ) -*> WORK contains (D(j) + sigma_I) in its j-th component. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Contributors: -* ================== -*> -*> Ren-Cang Li, Computer Science Division, University of California -*> at Berkeley, USA -*> -* ===================================================================== - SUBROUTINE DLASD5( I, D, Z, DELTA, RHO, DSIGMA, WORK ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER I - DOUBLE PRECISION DSIGMA, RHO -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( 2 ), DELTA( 2 ), WORK( 2 ), Z( 2 ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE, TWO, THREE, FOUR - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0, - $ THREE = 3.0D+0, FOUR = 4.0D+0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION B, C, DEL, DELSQ, TAU, W -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SQRT -* .. -* .. Executable Statements .. -* - DEL = D( 2 ) - D( 1 ) - DELSQ = DEL*( D( 2 )+D( 1 ) ) - IF( I.EQ.1 ) THEN - W = ONE + FOUR*RHO*( Z( 2 )*Z( 2 ) / ( D( 1 )+THREE*D( 2 ) )- - $ Z( 1 )*Z( 1 ) / ( THREE*D( 1 )+D( 2 ) ) ) / DEL - IF( W.GT.ZERO ) THEN - B = DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) - C = RHO*Z( 1 )*Z( 1 )*DELSQ -* -* B > ZERO, always -* -* The following TAU is DSIGMA * DSIGMA - D( 1 ) * D( 1 ) -* - TAU = TWO*C / ( B+SQRT( ABS( B*B-FOUR*C ) ) ) -* -* The following TAU is DSIGMA - D( 1 ) -* - TAU = TAU / ( D( 1 )+SQRT( D( 1 )*D( 1 )+TAU ) ) - DSIGMA = D( 1 ) + TAU - DELTA( 1 ) = -TAU - DELTA( 2 ) = DEL - TAU - WORK( 1 ) = TWO*D( 1 ) + TAU - WORK( 2 ) = ( D( 1 )+TAU ) + D( 2 ) -* DELTA( 1 ) = -Z( 1 ) / TAU -* DELTA( 2 ) = Z( 2 ) / ( DEL-TAU ) - ELSE - B = -DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) - C = RHO*Z( 2 )*Z( 2 )*DELSQ -* -* The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 ) -* - IF( B.GT.ZERO ) THEN - TAU = -TWO*C / ( B+SQRT( B*B+FOUR*C ) ) - ELSE - TAU = ( B-SQRT( B*B+FOUR*C ) ) / TWO - END IF -* -* The following TAU is DSIGMA - D( 2 ) -* - TAU = TAU / ( D( 2 )+SQRT( ABS( D( 2 )*D( 2 )+TAU ) ) ) - DSIGMA = D( 2 ) + TAU - DELTA( 1 ) = -( DEL+TAU ) - DELTA( 2 ) = -TAU - WORK( 1 ) = D( 1 ) + TAU + D( 2 ) - WORK( 2 ) = TWO*D( 2 ) + TAU -* DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) -* DELTA( 2 ) = -Z( 2 ) / TAU - END IF -* TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) -* DELTA( 1 ) = DELTA( 1 ) / TEMP -* DELTA( 2 ) = DELTA( 2 ) / TEMP - ELSE -* -* Now I=2 -* - B = -DELSQ + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) - C = RHO*Z( 2 )*Z( 2 )*DELSQ -* -* The following TAU is DSIGMA * DSIGMA - D( 2 ) * D( 2 ) -* - IF( B.GT.ZERO ) THEN - TAU = ( B+SQRT( B*B+FOUR*C ) ) / TWO - ELSE - TAU = TWO*C / ( -B+SQRT( B*B+FOUR*C ) ) - END IF -* -* The following TAU is DSIGMA - D( 2 ) -* - TAU = TAU / ( D( 2 )+SQRT( D( 2 )*D( 2 )+TAU ) ) - DSIGMA = D( 2 ) + TAU - DELTA( 1 ) = -( DEL+TAU ) - DELTA( 2 ) = -TAU - WORK( 1 ) = D( 1 ) + TAU + D( 2 ) - WORK( 2 ) = TWO*D( 2 ) + TAU -* DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) -* DELTA( 2 ) = -Z( 2 ) / TAU -* TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) -* DELTA( 1 ) = DELTA( 1 ) / TEMP -* DELTA( 2 ) = DELTA( 2 ) / TEMP - END IF - RETURN -* -* End of DLASD5 -* - END diff --git a/lib/linalg/fortran/dlasd6.f b/lib/linalg/fortran/dlasd6.f deleted file mode 100644 index 51e67588dd..0000000000 --- a/lib/linalg/fortran/dlasd6.f +++ /dev/null @@ -1,440 +0,0 @@ -*> \brief \b DLASD6 computes the SVD of an updated upper bidiagonal matrix obtained by merging two smaller ones by appending a row. Used by sbdsdc. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASD6 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASD6( ICOMPQ, NL, NR, SQRE, D, VF, VL, ALPHA, BETA, -* IDXQ, PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, -* LDGNUM, POLES, DIFL, DIFR, Z, K, C, S, WORK, -* IWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL, -* $ NR, SQRE -* DOUBLE PRECISION ALPHA, BETA, C, S -* .. -* .. Array Arguments .. -* INTEGER GIVCOL( LDGCOL, * ), IDXQ( * ), IWORK( * ), -* $ PERM( * ) -* DOUBLE PRECISION D( * ), DIFL( * ), DIFR( * ), -* $ GIVNUM( LDGNUM, * ), POLES( LDGNUM, * ), -* $ VF( * ), VL( * ), WORK( * ), Z( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASD6 computes the SVD of an updated upper bidiagonal matrix B -*> obtained by merging two smaller ones by appending a row. This -*> routine is used only for the problem which requires all singular -*> values and optionally singular vector matrices in factored form. -*> B is an N-by-M matrix with N = NL + NR + 1 and M = N + SQRE. -*> A related subroutine, DLASD1, handles the case in which all singular -*> values and singular vectors of the bidiagonal matrix are desired. -*> -*> DLASD6 computes the SVD as follows: -*> -*> ( D1(in) 0 0 0 ) -*> B = U(in) * ( Z1**T a Z2**T b ) * VT(in) -*> ( 0 0 D2(in) 0 ) -*> -*> = U(out) * ( D(out) 0) * VT(out) -*> -*> where Z**T = (Z1**T a Z2**T b) = u**T VT**T, and u is a vector of dimension M -*> with ALPHA and BETA in the NL+1 and NL+2 th entries and zeros -*> elsewhere; and the entry b is empty if SQRE = 0. -*> -*> The singular values of B can be computed using D1, D2, the first -*> components of all the right singular vectors of the lower block, and -*> the last components of all the right singular vectors of the upper -*> block. These components are stored and updated in VF and VL, -*> respectively, in DLASD6. Hence U and VT are not explicitly -*> referenced. -*> -*> The singular values are stored in D. The algorithm consists of two -*> stages: -*> -*> The first stage consists of deflating the size of the problem -*> when there are multiple singular values or if there is a zero -*> in the Z vector. For each such occurrence the dimension of the -*> secular equation problem is reduced by one. This stage is -*> performed by the routine DLASD7. -*> -*> The second stage consists of calculating the updated -*> singular values. This is done by finding the roots of the -*> secular equation via the routine DLASD4 (as called by DLASD8). -*> This routine also updates VF and VL and computes the distances -*> between the updated singular values and the old singular -*> values. -*> -*> DLASD6 is called from DLASDA. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ICOMPQ -*> \verbatim -*> ICOMPQ is INTEGER -*> Specifies whether singular vectors are to be computed in -*> factored form: -*> = 0: Compute singular values only. -*> = 1: Compute singular vectors in factored form as well. -*> \endverbatim -*> -*> \param[in] NL -*> \verbatim -*> NL is INTEGER -*> The row dimension of the upper block. NL >= 1. -*> \endverbatim -*> -*> \param[in] NR -*> \verbatim -*> NR is INTEGER -*> The row dimension of the lower block. NR >= 1. -*> \endverbatim -*> -*> \param[in] SQRE -*> \verbatim -*> SQRE is INTEGER -*> = 0: the lower block is an NR-by-NR square matrix. -*> = 1: the lower block is an NR-by-(NR+1) rectangular matrix. -*> -*> The bidiagonal matrix has row dimension N = NL + NR + 1, -*> and column dimension M = N + SQRE. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension ( NL+NR+1 ). -*> On entry D(1:NL,1:NL) contains the singular values of the -*> upper block, and D(NL+2:N) contains the singular values -*> of the lower block. On exit D(1:N) contains the singular -*> values of the modified matrix. -*> \endverbatim -*> -*> \param[in,out] VF -*> \verbatim -*> VF is DOUBLE PRECISION array, dimension ( M ) -*> On entry, VF(1:NL+1) contains the first components of all -*> right singular vectors of the upper block; and VF(NL+2:M) -*> contains the first components of all right singular vectors -*> of the lower block. On exit, VF contains the first components -*> of all right singular vectors of the bidiagonal matrix. -*> \endverbatim -*> -*> \param[in,out] VL -*> \verbatim -*> VL is DOUBLE PRECISION array, dimension ( M ) -*> On entry, VL(1:NL+1) contains the last components of all -*> right singular vectors of the upper block; and VL(NL+2:M) -*> contains the last components of all right singular vectors of -*> the lower block. On exit, VL contains the last components of -*> all right singular vectors of the bidiagonal matrix. -*> \endverbatim -*> -*> \param[in,out] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION -*> Contains the diagonal element associated with the added row. -*> \endverbatim -*> -*> \param[in,out] BETA -*> \verbatim -*> BETA is DOUBLE PRECISION -*> Contains the off-diagonal element associated with the added -*> row. -*> \endverbatim -*> -*> \param[in,out] IDXQ -*> \verbatim -*> IDXQ is INTEGER array, dimension ( N ) -*> This contains the permutation which will reintegrate the -*> subproblem just solved back into sorted order, i.e. -*> D( IDXQ( I = 1, N ) ) will be in ascending order. -*> \endverbatim -*> -*> \param[out] PERM -*> \verbatim -*> PERM is INTEGER array, dimension ( N ) -*> The permutations (from deflation and sorting) to be applied -*> to each block. Not referenced if ICOMPQ = 0. -*> \endverbatim -*> -*> \param[out] GIVPTR -*> \verbatim -*> GIVPTR is INTEGER -*> The number of Givens rotations which took place in this -*> subproblem. Not referenced if ICOMPQ = 0. -*> \endverbatim -*> -*> \param[out] GIVCOL -*> \verbatim -*> GIVCOL is INTEGER array, dimension ( LDGCOL, 2 ) -*> Each pair of numbers indicates a pair of columns to take place -*> in a Givens rotation. Not referenced if ICOMPQ = 0. -*> \endverbatim -*> -*> \param[in] LDGCOL -*> \verbatim -*> LDGCOL is INTEGER -*> leading dimension of GIVCOL, must be at least N. -*> \endverbatim -*> -*> \param[out] GIVNUM -*> \verbatim -*> GIVNUM is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) -*> Each number indicates the C or S value to be used in the -*> corresponding Givens rotation. Not referenced if ICOMPQ = 0. -*> \endverbatim -*> -*> \param[in] LDGNUM -*> \verbatim -*> LDGNUM is INTEGER -*> The leading dimension of GIVNUM and POLES, must be at least N. -*> \endverbatim -*> -*> \param[out] POLES -*> \verbatim -*> POLES is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) -*> On exit, POLES(1,*) is an array containing the new singular -*> values obtained from solving the secular equation, and -*> POLES(2,*) is an array containing the poles in the secular -*> equation. Not referenced if ICOMPQ = 0. -*> \endverbatim -*> -*> \param[out] DIFL -*> \verbatim -*> DIFL is DOUBLE PRECISION array, dimension ( N ) -*> On exit, DIFL(I) is the distance between I-th updated -*> (undeflated) singular value and the I-th (undeflated) old -*> singular value. -*> \endverbatim -*> -*> \param[out] DIFR -*> \verbatim -*> DIFR is DOUBLE PRECISION array, -*> dimension ( LDDIFR, 2 ) if ICOMPQ = 1 and -*> dimension ( K ) if ICOMPQ = 0. -*> On exit, DIFR(I,1) = D(I) - DSIGMA(I+1), DIFR(K,1) is not -*> defined and will not be referenced. -*> -*> If ICOMPQ = 1, DIFR(1:K,2) is an array containing the -*> normalizing factors for the right singular vector matrix. -*> -*> See DLASD8 for details on DIFL and DIFR. -*> \endverbatim -*> -*> \param[out] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension ( M ) -*> The first elements of this array contain the components -*> of the deflation-adjusted updating row vector. -*> \endverbatim -*> -*> \param[out] K -*> \verbatim -*> K is INTEGER -*> Contains the dimension of the non-deflated matrix, -*> This is the order of the related secular equation. 1 <= K <=N. -*> \endverbatim -*> -*> \param[out] C -*> \verbatim -*> C is DOUBLE PRECISION -*> C contains garbage if SQRE =0 and the C-value of a Givens -*> rotation related to the right null space if SQRE = 1. -*> \endverbatim -*> -*> \param[out] S -*> \verbatim -*> S is DOUBLE PRECISION -*> S contains garbage if SQRE =0 and the S-value of a Givens -*> rotation related to the right null space if SQRE = 1. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension ( 4 * M ) -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension ( 3 * N ) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: if INFO = 1, a singular value did not converge -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Contributors: -* ================== -*> -*> Ming Gu and Huan Ren, Computer Science Division, University of -*> California at Berkeley, USA -*> -* ===================================================================== - SUBROUTINE DLASD6( ICOMPQ, NL, NR, SQRE, D, VF, VL, ALPHA, BETA, - $ IDXQ, PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, - $ LDGNUM, POLES, DIFL, DIFR, Z, K, C, S, WORK, - $ IWORK, INFO ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL, - $ NR, SQRE - DOUBLE PRECISION ALPHA, BETA, C, S -* .. -* .. Array Arguments .. - INTEGER GIVCOL( LDGCOL, * ), IDXQ( * ), IWORK( * ), - $ PERM( * ) - DOUBLE PRECISION D( * ), DIFL( * ), DIFR( * ), - $ GIVNUM( LDGNUM, * ), POLES( LDGNUM, * ), - $ VF( * ), VL( * ), WORK( * ), Z( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, IDX, IDXC, IDXP, ISIGMA, IVFW, IVLW, IW, M, - $ N, N1, N2 - DOUBLE PRECISION ORGNRM -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DLAMRG, DLASCL, DLASD7, DLASD8, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - N = NL + NR + 1 - M = N + SQRE -* - IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN - INFO = -1 - ELSE IF( NL.LT.1 ) THEN - INFO = -2 - ELSE IF( NR.LT.1 ) THEN - INFO = -3 - ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN - INFO = -4 - ELSE IF( LDGCOL.LT.N ) THEN - INFO = -14 - ELSE IF( LDGNUM.LT.N ) THEN - INFO = -16 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLASD6', -INFO ) - RETURN - END IF -* -* The following values are for bookkeeping purposes only. They are -* integer pointers which indicate the portion of the workspace -* used by a particular array in DLASD7 and DLASD8. -* - ISIGMA = 1 - IW = ISIGMA + N - IVFW = IW + M - IVLW = IVFW + M -* - IDX = 1 - IDXC = IDX + N - IDXP = IDXC + N -* -* Scale. -* - ORGNRM = MAX( ABS( ALPHA ), ABS( BETA ) ) - D( NL+1 ) = ZERO - DO 10 I = 1, N - IF( ABS( D( I ) ).GT.ORGNRM ) THEN - ORGNRM = ABS( D( I ) ) - END IF - 10 CONTINUE - CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, N, 1, D, N, INFO ) - ALPHA = ALPHA / ORGNRM - BETA = BETA / ORGNRM -* -* Sort and Deflate singular values. -* - CALL DLASD7( ICOMPQ, NL, NR, SQRE, K, D, Z, WORK( IW ), VF, - $ WORK( IVFW ), VL, WORK( IVLW ), ALPHA, BETA, - $ WORK( ISIGMA ), IWORK( IDX ), IWORK( IDXP ), IDXQ, - $ PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, C, S, - $ INFO ) -* -* Solve Secular Equation, compute DIFL, DIFR, and update VF, VL. -* - CALL DLASD8( ICOMPQ, K, D, Z, VF, VL, DIFL, DIFR, LDGNUM, - $ WORK( ISIGMA ), WORK( IW ), INFO ) -* -* Report the possible convergence failure. -* - IF( INFO.NE.0 ) THEN - RETURN - END IF -* -* Save the poles if ICOMPQ = 1. -* - IF( ICOMPQ.EQ.1 ) THEN - CALL DCOPY( K, D, 1, POLES( 1, 1 ), 1 ) - CALL DCOPY( K, WORK( ISIGMA ), 1, POLES( 1, 2 ), 1 ) - END IF -* -* Unscale. -* - CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, N, 1, D, N, INFO ) -* -* Prepare the IDXQ sorting permutation. -* - N1 = K - N2 = N - K - CALL DLAMRG( N1, N2, D, 1, -1, IDXQ ) -* - RETURN -* -* End of DLASD6 -* - END diff --git a/lib/linalg/fortran/dlasd7.f b/lib/linalg/fortran/dlasd7.f deleted file mode 100644 index ff9ba4c36a..0000000000 --- a/lib/linalg/fortran/dlasd7.f +++ /dev/null @@ -1,577 +0,0 @@ -*> \brief \b DLASD7 merges the two sets of singular values together into a single sorted set. Then it tries to deflate the size of the problem. Used by sbdsdc. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASD7 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASD7( ICOMPQ, NL, NR, SQRE, K, D, Z, ZW, VF, VFW, VL, -* VLW, ALPHA, BETA, DSIGMA, IDX, IDXP, IDXQ, -* PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, -* C, S, INFO ) -* -* .. Scalar Arguments .. -* INTEGER GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL, -* $ NR, SQRE -* DOUBLE PRECISION ALPHA, BETA, C, S -* .. -* .. Array Arguments .. -* INTEGER GIVCOL( LDGCOL, * ), IDX( * ), IDXP( * ), -* $ IDXQ( * ), PERM( * ) -* DOUBLE PRECISION D( * ), DSIGMA( * ), GIVNUM( LDGNUM, * ), -* $ VF( * ), VFW( * ), VL( * ), VLW( * ), Z( * ), -* $ ZW( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASD7 merges the two sets of singular values together into a single -*> sorted set. Then it tries to deflate the size of the problem. There -*> are two ways in which deflation can occur: when two or more singular -*> values are close together or if there is a tiny entry in the Z -*> vector. For each such occurrence the order of the related -*> secular equation problem is reduced by one. -*> -*> DLASD7 is called from DLASD6. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ICOMPQ -*> \verbatim -*> ICOMPQ is INTEGER -*> Specifies whether singular vectors are to be computed -*> in compact form, as follows: -*> = 0: Compute singular values only. -*> = 1: Compute singular vectors of upper -*> bidiagonal matrix in compact form. -*> \endverbatim -*> -*> \param[in] NL -*> \verbatim -*> NL is INTEGER -*> The row dimension of the upper block. NL >= 1. -*> \endverbatim -*> -*> \param[in] NR -*> \verbatim -*> NR is INTEGER -*> The row dimension of the lower block. NR >= 1. -*> \endverbatim -*> -*> \param[in] SQRE -*> \verbatim -*> SQRE is INTEGER -*> = 0: the lower block is an NR-by-NR square matrix. -*> = 1: the lower block is an NR-by-(NR+1) rectangular matrix. -*> -*> The bidiagonal matrix has -*> N = NL + NR + 1 rows and -*> M = N + SQRE >= N columns. -*> \endverbatim -*> -*> \param[out] K -*> \verbatim -*> K is INTEGER -*> Contains the dimension of the non-deflated matrix, this is -*> the order of the related secular equation. 1 <= K <=N. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension ( N ) -*> On entry D contains the singular values of the two submatrices -*> to be combined. On exit D contains the trailing (N-K) updated -*> singular values (those which were deflated) sorted into -*> increasing order. -*> \endverbatim -*> -*> \param[out] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension ( M ) -*> On exit Z contains the updating row vector in the secular -*> equation. -*> \endverbatim -*> -*> \param[out] ZW -*> \verbatim -*> ZW is DOUBLE PRECISION array, dimension ( M ) -*> Workspace for Z. -*> \endverbatim -*> -*> \param[in,out] VF -*> \verbatim -*> VF is DOUBLE PRECISION array, dimension ( M ) -*> On entry, VF(1:NL+1) contains the first components of all -*> right singular vectors of the upper block; and VF(NL+2:M) -*> contains the first components of all right singular vectors -*> of the lower block. On exit, VF contains the first components -*> of all right singular vectors of the bidiagonal matrix. -*> \endverbatim -*> -*> \param[out] VFW -*> \verbatim -*> VFW is DOUBLE PRECISION array, dimension ( M ) -*> Workspace for VF. -*> \endverbatim -*> -*> \param[in,out] VL -*> \verbatim -*> VL is DOUBLE PRECISION array, dimension ( M ) -*> On entry, VL(1:NL+1) contains the last components of all -*> right singular vectors of the upper block; and VL(NL+2:M) -*> contains the last components of all right singular vectors -*> of the lower block. On exit, VL contains the last components -*> of all right singular vectors of the bidiagonal matrix. -*> \endverbatim -*> -*> \param[out] VLW -*> \verbatim -*> VLW is DOUBLE PRECISION array, dimension ( M ) -*> Workspace for VL. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION -*> Contains the diagonal element associated with the added row. -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is DOUBLE PRECISION -*> Contains the off-diagonal element associated with the added -*> row. -*> \endverbatim -*> -*> \param[out] DSIGMA -*> \verbatim -*> DSIGMA is DOUBLE PRECISION array, dimension ( N ) -*> Contains a copy of the diagonal elements (K-1 singular values -*> and one zero) in the secular equation. -*> \endverbatim -*> -*> \param[out] IDX -*> \verbatim -*> IDX is INTEGER array, dimension ( N ) -*> This will contain the permutation used to sort the contents of -*> D into ascending order. -*> \endverbatim -*> -*> \param[out] IDXP -*> \verbatim -*> IDXP is INTEGER array, dimension ( N ) -*> This will contain the permutation used to place deflated -*> values of D at the end of the array. On output IDXP(2:K) -*> points to the nondeflated D-values and IDXP(K+1:N) -*> points to the deflated singular values. -*> \endverbatim -*> -*> \param[in] IDXQ -*> \verbatim -*> IDXQ is INTEGER array, dimension ( N ) -*> This contains the permutation which separately sorts the two -*> sub-problems in D into ascending order. Note that entries in -*> the first half of this permutation must first be moved one -*> position backward; and entries in the second half -*> must first have NL+1 added to their values. -*> \endverbatim -*> -*> \param[out] PERM -*> \verbatim -*> PERM is INTEGER array, dimension ( N ) -*> The permutations (from deflation and sorting) to be applied -*> to each singular block. Not referenced if ICOMPQ = 0. -*> \endverbatim -*> -*> \param[out] GIVPTR -*> \verbatim -*> GIVPTR is INTEGER -*> The number of Givens rotations which took place in this -*> subproblem. Not referenced if ICOMPQ = 0. -*> \endverbatim -*> -*> \param[out] GIVCOL -*> \verbatim -*> GIVCOL is INTEGER array, dimension ( LDGCOL, 2 ) -*> Each pair of numbers indicates a pair of columns to take place -*> in a Givens rotation. Not referenced if ICOMPQ = 0. -*> \endverbatim -*> -*> \param[in] LDGCOL -*> \verbatim -*> LDGCOL is INTEGER -*> The leading dimension of GIVCOL, must be at least N. -*> \endverbatim -*> -*> \param[out] GIVNUM -*> \verbatim -*> GIVNUM is DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) -*> Each number indicates the C or S value to be used in the -*> corresponding Givens rotation. Not referenced if ICOMPQ = 0. -*> \endverbatim -*> -*> \param[in] LDGNUM -*> \verbatim -*> LDGNUM is INTEGER -*> The leading dimension of GIVNUM, must be at least N. -*> \endverbatim -*> -*> \param[out] C -*> \verbatim -*> C is DOUBLE PRECISION -*> C contains garbage if SQRE =0 and the C-value of a Givens -*> rotation related to the right null space if SQRE = 1. -*> \endverbatim -*> -*> \param[out] S -*> \verbatim -*> S is DOUBLE PRECISION -*> S contains garbage if SQRE =0 and the S-value of a Givens -*> rotation related to the right null space if SQRE = 1. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Contributors: -* ================== -*> -*> Ming Gu and Huan Ren, Computer Science Division, University of -*> California at Berkeley, USA -*> -* ===================================================================== - SUBROUTINE DLASD7( ICOMPQ, NL, NR, SQRE, K, D, Z, ZW, VF, VFW, VL, - $ VLW, ALPHA, BETA, DSIGMA, IDX, IDXP, IDXQ, - $ PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, - $ C, S, INFO ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL, - $ NR, SQRE - DOUBLE PRECISION ALPHA, BETA, C, S -* .. -* .. Array Arguments .. - INTEGER GIVCOL( LDGCOL, * ), IDX( * ), IDXP( * ), - $ IDXQ( * ), PERM( * ) - DOUBLE PRECISION D( * ), DSIGMA( * ), GIVNUM( LDGNUM, * ), - $ VF( * ), VFW( * ), VL( * ), VLW( * ), Z( * ), - $ ZW( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE, TWO, EIGHT - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0, - $ EIGHT = 8.0D+0 ) -* .. -* .. Local Scalars .. -* - INTEGER I, IDXI, IDXJ, IDXJP, J, JP, JPREV, K2, M, N, - $ NLP1, NLP2 - DOUBLE PRECISION EPS, HLFTOL, TAU, TOL, Z1 -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DLAMRG, DROT, XERBLA -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH, DLAPY2 - EXTERNAL DLAMCH, DLAPY2 -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - N = NL + NR + 1 - M = N + SQRE -* - IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN - INFO = -1 - ELSE IF( NL.LT.1 ) THEN - INFO = -2 - ELSE IF( NR.LT.1 ) THEN - INFO = -3 - ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN - INFO = -4 - ELSE IF( LDGCOL.LT.N ) THEN - INFO = -22 - ELSE IF( LDGNUM.LT.N ) THEN - INFO = -24 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLASD7', -INFO ) - RETURN - END IF -* - NLP1 = NL + 1 - NLP2 = NL + 2 - IF( ICOMPQ.EQ.1 ) THEN - GIVPTR = 0 - END IF -* -* Generate the first part of the vector Z and move the singular -* values in the first part of D one position backward. -* - Z1 = ALPHA*VL( NLP1 ) - VL( NLP1 ) = ZERO - TAU = VF( NLP1 ) - DO 10 I = NL, 1, -1 - Z( I+1 ) = ALPHA*VL( I ) - VL( I ) = ZERO - VF( I+1 ) = VF( I ) - D( I+1 ) = D( I ) - IDXQ( I+1 ) = IDXQ( I ) + 1 - 10 CONTINUE - VF( 1 ) = TAU -* -* Generate the second part of the vector Z. -* - DO 20 I = NLP2, M - Z( I ) = BETA*VF( I ) - VF( I ) = ZERO - 20 CONTINUE -* -* Sort the singular values into increasing order -* - DO 30 I = NLP2, N - IDXQ( I ) = IDXQ( I ) + NLP1 - 30 CONTINUE -* -* DSIGMA, IDXC, IDXC, and ZW are used as storage space. -* - DO 40 I = 2, N - DSIGMA( I ) = D( IDXQ( I ) ) - ZW( I ) = Z( IDXQ( I ) ) - VFW( I ) = VF( IDXQ( I ) ) - VLW( I ) = VL( IDXQ( I ) ) - 40 CONTINUE -* - CALL DLAMRG( NL, NR, DSIGMA( 2 ), 1, 1, IDX( 2 ) ) -* - DO 50 I = 2, N - IDXI = 1 + IDX( I ) - D( I ) = DSIGMA( IDXI ) - Z( I ) = ZW( IDXI ) - VF( I ) = VFW( IDXI ) - VL( I ) = VLW( IDXI ) - 50 CONTINUE -* -* Calculate the allowable deflation tolerance -* - EPS = DLAMCH( 'Epsilon' ) - TOL = MAX( ABS( ALPHA ), ABS( BETA ) ) - TOL = EIGHT*EIGHT*EPS*MAX( ABS( D( N ) ), TOL ) -* -* There are 2 kinds of deflation -- first a value in the z-vector -* is small, second two (or more) singular values are very close -* together (their difference is small). -* -* If the value in the z-vector is small, we simply permute the -* array so that the corresponding singular value is moved to the -* end. -* -* If two values in the D-vector are close, we perform a two-sided -* rotation designed to make one of the corresponding z-vector -* entries zero, and then permute the array so that the deflated -* singular value is moved to the end. -* -* If there are multiple singular values then the problem deflates. -* Here the number of equal singular values are found. As each equal -* singular value is found, an elementary reflector is computed to -* rotate the corresponding singular subspace so that the -* corresponding components of Z are zero in this new basis. -* - K = 1 - K2 = N + 1 - DO 60 J = 2, N - IF( ABS( Z( J ) ).LE.TOL ) THEN -* -* Deflate due to small z component. -* - K2 = K2 - 1 - IDXP( K2 ) = J - IF( J.EQ.N ) - $ GO TO 100 - ELSE - JPREV = J - GO TO 70 - END IF - 60 CONTINUE - 70 CONTINUE - J = JPREV - 80 CONTINUE - J = J + 1 - IF( J.GT.N ) - $ GO TO 90 - IF( ABS( Z( J ) ).LE.TOL ) THEN -* -* Deflate due to small z component. -* - K2 = K2 - 1 - IDXP( K2 ) = J - ELSE -* -* Check if singular values are close enough to allow deflation. -* - IF( ABS( D( J )-D( JPREV ) ).LE.TOL ) THEN -* -* Deflation is possible. -* - S = Z( JPREV ) - C = Z( J ) -* -* Find sqrt(a**2+b**2) without overflow or -* destructive underflow. -* - TAU = DLAPY2( C, S ) - Z( J ) = TAU - Z( JPREV ) = ZERO - C = C / TAU - S = -S / TAU -* -* Record the appropriate Givens rotation -* - IF( ICOMPQ.EQ.1 ) THEN - GIVPTR = GIVPTR + 1 - IDXJP = IDXQ( IDX( JPREV )+1 ) - IDXJ = IDXQ( IDX( J )+1 ) - IF( IDXJP.LE.NLP1 ) THEN - IDXJP = IDXJP - 1 - END IF - IF( IDXJ.LE.NLP1 ) THEN - IDXJ = IDXJ - 1 - END IF - GIVCOL( GIVPTR, 2 ) = IDXJP - GIVCOL( GIVPTR, 1 ) = IDXJ - GIVNUM( GIVPTR, 2 ) = C - GIVNUM( GIVPTR, 1 ) = S - END IF - CALL DROT( 1, VF( JPREV ), 1, VF( J ), 1, C, S ) - CALL DROT( 1, VL( JPREV ), 1, VL( J ), 1, C, S ) - K2 = K2 - 1 - IDXP( K2 ) = JPREV - JPREV = J - ELSE - K = K + 1 - ZW( K ) = Z( JPREV ) - DSIGMA( K ) = D( JPREV ) - IDXP( K ) = JPREV - JPREV = J - END IF - END IF - GO TO 80 - 90 CONTINUE -* -* Record the last singular value. -* - K = K + 1 - ZW( K ) = Z( JPREV ) - DSIGMA( K ) = D( JPREV ) - IDXP( K ) = JPREV -* - 100 CONTINUE -* -* Sort the singular values into DSIGMA. The singular values which -* were not deflated go into the first K slots of DSIGMA, except -* that DSIGMA(1) is treated separately. -* - DO 110 J = 2, N - JP = IDXP( J ) - DSIGMA( J ) = D( JP ) - VFW( J ) = VF( JP ) - VLW( J ) = VL( JP ) - 110 CONTINUE - IF( ICOMPQ.EQ.1 ) THEN - DO 120 J = 2, N - JP = IDXP( J ) - PERM( J ) = IDXQ( IDX( JP )+1 ) - IF( PERM( J ).LE.NLP1 ) THEN - PERM( J ) = PERM( J ) - 1 - END IF - 120 CONTINUE - END IF -* -* The deflated singular values go back into the last N - K slots of -* D. -* - CALL DCOPY( N-K, DSIGMA( K+1 ), 1, D( K+1 ), 1 ) -* -* Determine DSIGMA(1), DSIGMA(2), Z(1), VF(1), VL(1), VF(M), and -* VL(M). -* - DSIGMA( 1 ) = ZERO - HLFTOL = TOL / TWO - IF( ABS( DSIGMA( 2 ) ).LE.HLFTOL ) - $ DSIGMA( 2 ) = HLFTOL - IF( M.GT.N ) THEN - Z( 1 ) = DLAPY2( Z1, Z( M ) ) - IF( Z( 1 ).LE.TOL ) THEN - C = ONE - S = ZERO - Z( 1 ) = TOL - ELSE - C = Z1 / Z( 1 ) - S = -Z( M ) / Z( 1 ) - END IF - CALL DROT( 1, VF( M ), 1, VF( 1 ), 1, C, S ) - CALL DROT( 1, VL( M ), 1, VL( 1 ), 1, C, S ) - ELSE - IF( ABS( Z1 ).LE.TOL ) THEN - Z( 1 ) = TOL - ELSE - Z( 1 ) = Z1 - END IF - END IF -* -* Restore Z, VF, and VL. -* - CALL DCOPY( K-1, ZW( 2 ), 1, Z( 2 ), 1 ) - CALL DCOPY( N-1, VFW( 2 ), 1, VF( 2 ), 1 ) - CALL DCOPY( N-1, VLW( 2 ), 1, VL( 2 ), 1 ) -* - RETURN -* -* End of DLASD7 -* - END diff --git a/lib/linalg/fortran/dlasd8.f b/lib/linalg/fortran/dlasd8.f deleted file mode 100644 index a769bdb22e..0000000000 --- a/lib/linalg/fortran/dlasd8.f +++ /dev/null @@ -1,339 +0,0 @@ -*> \brief \b DLASD8 finds the square roots of the roots of the secular equation, and stores, for each element in D, the distance to its two nearest poles. Used by sbdsdc. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASD8 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASD8( ICOMPQ, K, D, Z, VF, VL, DIFL, DIFR, LDDIFR, -* DSIGMA, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER ICOMPQ, INFO, K, LDDIFR -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( * ), DIFL( * ), DIFR( LDDIFR, * ), -* $ DSIGMA( * ), VF( * ), VL( * ), WORK( * ), -* $ Z( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASD8 finds the square roots of the roots of the secular equation, -*> as defined by the values in DSIGMA and Z. It makes the appropriate -*> calls to DLASD4, and stores, for each element in D, the distance -*> to its two nearest poles (elements in DSIGMA). It also updates -*> the arrays VF and VL, the first and last components of all the -*> right singular vectors of the original bidiagonal matrix. -*> -*> DLASD8 is called from DLASD6. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ICOMPQ -*> \verbatim -*> ICOMPQ is INTEGER -*> Specifies whether singular vectors are to be computed in -*> factored form in the calling routine: -*> = 0: Compute singular values only. -*> = 1: Compute singular vectors in factored form as well. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of terms in the rational function to be solved -*> by DLASD4. K >= 1. -*> \endverbatim -*> -*> \param[out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension ( K ) -*> On output, D contains the updated singular values. -*> \endverbatim -*> -*> \param[in,out] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension ( K ) -*> On entry, the first K elements of this array contain the -*> components of the deflation-adjusted updating row vector. -*> On exit, Z is updated. -*> \endverbatim -*> -*> \param[in,out] VF -*> \verbatim -*> VF is DOUBLE PRECISION array, dimension ( K ) -*> On entry, VF contains information passed through DBEDE8. -*> On exit, VF contains the first K components of the first -*> components of all right singular vectors of the bidiagonal -*> matrix. -*> \endverbatim -*> -*> \param[in,out] VL -*> \verbatim -*> VL is DOUBLE PRECISION array, dimension ( K ) -*> On entry, VL contains information passed through DBEDE8. -*> On exit, VL contains the first K components of the last -*> components of all right singular vectors of the bidiagonal -*> matrix. -*> \endverbatim -*> -*> \param[out] DIFL -*> \verbatim -*> DIFL is DOUBLE PRECISION array, dimension ( K ) -*> On exit, DIFL(I) = D(I) - DSIGMA(I). -*> \endverbatim -*> -*> \param[out] DIFR -*> \verbatim -*> DIFR is DOUBLE PRECISION array, -*> dimension ( LDDIFR, 2 ) if ICOMPQ = 1 and -*> dimension ( K ) if ICOMPQ = 0. -*> On exit, DIFR(I,1) = D(I) - DSIGMA(I+1), DIFR(K,1) is not -*> defined and will not be referenced. -*> -*> If ICOMPQ = 1, DIFR(1:K,2) is an array containing the -*> normalizing factors for the right singular vector matrix. -*> \endverbatim -*> -*> \param[in] LDDIFR -*> \verbatim -*> LDDIFR is INTEGER -*> The leading dimension of DIFR, must be at least K. -*> \endverbatim -*> -*> \param[in,out] DSIGMA -*> \verbatim -*> DSIGMA is DOUBLE PRECISION array, dimension ( K ) -*> On entry, the first K elements of this array contain the old -*> roots of the deflated updating problem. These are the poles -*> of the secular equation. -*> On exit, the elements of DSIGMA may be very slightly altered -*> in value. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (3*K) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: if INFO = 1, a singular value did not converge -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Contributors: -* ================== -*> -*> Ming Gu and Huan Ren, Computer Science Division, University of -*> California at Berkeley, USA -*> -* ===================================================================== - SUBROUTINE DLASD8( ICOMPQ, K, D, Z, VF, VL, DIFL, DIFR, LDDIFR, - $ DSIGMA, WORK, INFO ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER ICOMPQ, INFO, K, LDDIFR -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( * ), DIFL( * ), DIFR( LDDIFR, * ), - $ DSIGMA( * ), VF( * ), VL( * ), WORK( * ), - $ Z( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, IWK1, IWK2, IWK2I, IWK3, IWK3I, J - DOUBLE PRECISION DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, RHO, TEMP -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DLASCL, DLASD4, DLASET, XERBLA -* .. -* .. External Functions .. - DOUBLE PRECISION DDOT, DLAMC3, DNRM2 - EXTERNAL DDOT, DLAMC3, DNRM2 -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SIGN, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN - INFO = -1 - ELSE IF( K.LT.1 ) THEN - INFO = -2 - ELSE IF( LDDIFR.LT.K ) THEN - INFO = -9 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLASD8', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( K.EQ.1 ) THEN - D( 1 ) = ABS( Z( 1 ) ) - DIFL( 1 ) = D( 1 ) - IF( ICOMPQ.EQ.1 ) THEN - DIFL( 2 ) = ONE - DIFR( 1, 2 ) = ONE - END IF - RETURN - END IF -* -* Modify values DSIGMA(i) to make sure all DSIGMA(i)-DSIGMA(j) can -* be computed with high relative accuracy (barring over/underflow). -* This is a problem on machines without a guard digit in -* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). -* The following code replaces DSIGMA(I) by 2*DSIGMA(I)-DSIGMA(I), -* which on any of these machines zeros out the bottommost -* bit of DSIGMA(I) if it is 1; this makes the subsequent -* subtractions DSIGMA(I)-DSIGMA(J) unproblematic when cancellation -* occurs. On binary machines with a guard digit (almost all -* machines) it does not change DSIGMA(I) at all. On hexadecimal -* and decimal machines with a guard digit, it slightly -* changes the bottommost bits of DSIGMA(I). It does not account -* for hexadecimal or decimal machines without guard digits -* (we know of none). We use a subroutine call to compute -* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating -* this code. -* - DO 10 I = 1, K - DSIGMA( I ) = DLAMC3( DSIGMA( I ), DSIGMA( I ) ) - DSIGMA( I ) - 10 CONTINUE -* -* Book keeping. -* - IWK1 = 1 - IWK2 = IWK1 + K - IWK3 = IWK2 + K - IWK2I = IWK2 - 1 - IWK3I = IWK3 - 1 -* -* Normalize Z. -* - RHO = DNRM2( K, Z, 1 ) - CALL DLASCL( 'G', 0, 0, RHO, ONE, K, 1, Z, K, INFO ) - RHO = RHO*RHO -* -* Initialize WORK(IWK3). -* - CALL DLASET( 'A', K, 1, ONE, ONE, WORK( IWK3 ), K ) -* -* Compute the updated singular values, the arrays DIFL, DIFR, -* and the updated Z. -* - DO 40 J = 1, K - CALL DLASD4( K, J, DSIGMA, Z, WORK( IWK1 ), RHO, D( J ), - $ WORK( IWK2 ), INFO ) -* -* If the root finder fails, report the convergence failure. -* - IF( INFO.NE.0 ) THEN - RETURN - END IF - WORK( IWK3I+J ) = WORK( IWK3I+J )*WORK( J )*WORK( IWK2I+J ) - DIFL( J ) = -WORK( J ) - DIFR( J, 1 ) = -WORK( J+1 ) - DO 20 I = 1, J - 1 - WORK( IWK3I+I ) = WORK( IWK3I+I )*WORK( I )* - $ WORK( IWK2I+I ) / ( DSIGMA( I )- - $ DSIGMA( J ) ) / ( DSIGMA( I )+ - $ DSIGMA( J ) ) - 20 CONTINUE - DO 30 I = J + 1, K - WORK( IWK3I+I ) = WORK( IWK3I+I )*WORK( I )* - $ WORK( IWK2I+I ) / ( DSIGMA( I )- - $ DSIGMA( J ) ) / ( DSIGMA( I )+ - $ DSIGMA( J ) ) - 30 CONTINUE - 40 CONTINUE -* -* Compute updated Z. -* - DO 50 I = 1, K - Z( I ) = SIGN( SQRT( ABS( WORK( IWK3I+I ) ) ), Z( I ) ) - 50 CONTINUE -* -* Update VF and VL. -* - DO 80 J = 1, K - DIFLJ = DIFL( J ) - DJ = D( J ) - DSIGJ = -DSIGMA( J ) - IF( J.LT.K ) THEN - DIFRJ = -DIFR( J, 1 ) - DSIGJP = -DSIGMA( J+1 ) - END IF - WORK( J ) = -Z( J ) / DIFLJ / ( DSIGMA( J )+DJ ) - DO 60 I = 1, J - 1 - WORK( I ) = Z( I ) / ( DLAMC3( DSIGMA( I ), DSIGJ )-DIFLJ ) - $ / ( DSIGMA( I )+DJ ) - 60 CONTINUE - DO 70 I = J + 1, K - WORK( I ) = Z( I ) / ( DLAMC3( DSIGMA( I ), DSIGJP )+DIFRJ ) - $ / ( DSIGMA( I )+DJ ) - 70 CONTINUE - TEMP = DNRM2( K, WORK, 1 ) - WORK( IWK2I+J ) = DDOT( K, WORK, 1, VF, 1 ) / TEMP - WORK( IWK3I+J ) = DDOT( K, WORK, 1, VL, 1 ) / TEMP - IF( ICOMPQ.EQ.1 ) THEN - DIFR( J, 2 ) = TEMP - END IF - 80 CONTINUE -* - CALL DCOPY( K, WORK( IWK2 ), 1, VF, 1 ) - CALL DCOPY( K, WORK( IWK3 ), 1, VL, 1 ) -* - RETURN -* -* End of DLASD8 -* - END - diff --git a/lib/linalg/fortran/dlasda.f b/lib/linalg/fortran/dlasda.f deleted file mode 100644 index 3e169a4edb..0000000000 --- a/lib/linalg/fortran/dlasda.f +++ /dev/null @@ -1,511 +0,0 @@ -*> \brief \b DLASDA computes the singular value decomposition (SVD) of a real upper bidiagonal matrix with diagonal d and off-diagonal e. Used by sbdsdc. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASDA + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASDA( ICOMPQ, SMLSIZ, N, SQRE, D, E, U, LDU, VT, K, -* DIFL, DIFR, Z, POLES, GIVPTR, GIVCOL, LDGCOL, -* PERM, GIVNUM, C, S, WORK, IWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER ICOMPQ, INFO, LDGCOL, LDU, N, SMLSIZ, SQRE -* .. -* .. Array Arguments .. -* INTEGER GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ), -* $ K( * ), PERM( LDGCOL, * ) -* DOUBLE PRECISION C( * ), D( * ), DIFL( LDU, * ), DIFR( LDU, * ), -* $ E( * ), GIVNUM( LDU, * ), POLES( LDU, * ), -* $ S( * ), U( LDU, * ), VT( LDU, * ), WORK( * ), -* $ Z( LDU, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> Using a divide and conquer approach, DLASDA computes the singular -*> value decomposition (SVD) of a real upper bidiagonal N-by-M matrix -*> B with diagonal D and offdiagonal E, where M = N + SQRE. The -*> algorithm computes the singular values in the SVD B = U * S * VT. -*> The orthogonal matrices U and VT are optionally computed in -*> compact form. -*> -*> A related subroutine, DLASD0, computes the singular values and -*> the singular vectors in explicit form. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ICOMPQ -*> \verbatim -*> ICOMPQ is INTEGER -*> Specifies whether singular vectors are to be computed -*> in compact form, as follows -*> = 0: Compute singular values only. -*> = 1: Compute singular vectors of upper bidiagonal -*> matrix in compact form. -*> \endverbatim -*> -*> \param[in] SMLSIZ -*> \verbatim -*> SMLSIZ is INTEGER -*> The maximum size of the subproblems at the bottom of the -*> computation tree. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The row dimension of the upper bidiagonal matrix. This is -*> also the dimension of the main diagonal array D. -*> \endverbatim -*> -*> \param[in] SQRE -*> \verbatim -*> SQRE is INTEGER -*> Specifies the column dimension of the bidiagonal matrix. -*> = 0: The bidiagonal matrix has column dimension M = N; -*> = 1: The bidiagonal matrix has column dimension M = N + 1. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension ( N ) -*> On entry D contains the main diagonal of the bidiagonal -*> matrix. On exit D, if INFO = 0, contains its singular values. -*> \endverbatim -*> -*> \param[in] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension ( M-1 ) -*> Contains the subdiagonal entries of the bidiagonal matrix. -*> On exit, E has been destroyed. -*> \endverbatim -*> -*> \param[out] U -*> \verbatim -*> U is DOUBLE PRECISION array, -*> dimension ( LDU, SMLSIZ ) if ICOMPQ = 1, and not referenced -*> if ICOMPQ = 0. If ICOMPQ = 1, on exit, U contains the left -*> singular vector matrices of all subproblems at the bottom -*> level. -*> \endverbatim -*> -*> \param[in] LDU -*> \verbatim -*> LDU is INTEGER, LDU = > N. -*> The leading dimension of arrays U, VT, DIFL, DIFR, POLES, -*> GIVNUM, and Z. -*> \endverbatim -*> -*> \param[out] VT -*> \verbatim -*> VT is DOUBLE PRECISION array, -*> dimension ( LDU, SMLSIZ+1 ) if ICOMPQ = 1, and not referenced -*> if ICOMPQ = 0. If ICOMPQ = 1, on exit, VT**T contains the right -*> singular vector matrices of all subproblems at the bottom -*> level. -*> \endverbatim -*> -*> \param[out] K -*> \verbatim -*> K is INTEGER array, -*> dimension ( N ) if ICOMPQ = 1 and dimension 1 if ICOMPQ = 0. -*> If ICOMPQ = 1, on exit, K(I) is the dimension of the I-th -*> secular equation on the computation tree. -*> \endverbatim -*> -*> \param[out] DIFL -*> \verbatim -*> DIFL is DOUBLE PRECISION array, dimension ( LDU, NLVL ), -*> where NLVL = floor(log_2 (N/SMLSIZ))). -*> \endverbatim -*> -*> \param[out] DIFR -*> \verbatim -*> DIFR is DOUBLE PRECISION array, -*> dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1 and -*> dimension ( N ) if ICOMPQ = 0. -*> If ICOMPQ = 1, on exit, DIFL(1:N, I) and DIFR(1:N, 2 * I - 1) -*> record distances between singular values on the I-th -*> level and singular values on the (I -1)-th level, and -*> DIFR(1:N, 2 * I ) contains the normalizing factors for -*> the right singular vector matrix. See DLASD8 for details. -*> \endverbatim -*> -*> \param[out] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, -*> dimension ( LDU, NLVL ) if ICOMPQ = 1 and -*> dimension ( N ) if ICOMPQ = 0. -*> The first K elements of Z(1, I) contain the components of -*> the deflation-adjusted updating row vector for subproblems -*> on the I-th level. -*> \endverbatim -*> -*> \param[out] POLES -*> \verbatim -*> POLES is DOUBLE PRECISION array, -*> dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1, and not referenced -*> if ICOMPQ = 0. If ICOMPQ = 1, on exit, POLES(1, 2*I - 1) and -*> POLES(1, 2*I) contain the new and old singular values -*> involved in the secular equations on the I-th level. -*> \endverbatim -*> -*> \param[out] GIVPTR -*> \verbatim -*> GIVPTR is INTEGER array, -*> dimension ( N ) if ICOMPQ = 1, and not referenced if -*> ICOMPQ = 0. If ICOMPQ = 1, on exit, GIVPTR( I ) records -*> the number of Givens rotations performed on the I-th -*> problem on the computation tree. -*> \endverbatim -*> -*> \param[out] GIVCOL -*> \verbatim -*> GIVCOL is INTEGER array, -*> dimension ( LDGCOL, 2 * NLVL ) if ICOMPQ = 1, and not -*> referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I, -*> GIVCOL(1, 2 *I - 1) and GIVCOL(1, 2 *I) record the locations -*> of Givens rotations performed on the I-th level on the -*> computation tree. -*> \endverbatim -*> -*> \param[in] LDGCOL -*> \verbatim -*> LDGCOL is INTEGER, LDGCOL = > N. -*> The leading dimension of arrays GIVCOL and PERM. -*> \endverbatim -*> -*> \param[out] PERM -*> \verbatim -*> PERM is INTEGER array, -*> dimension ( LDGCOL, NLVL ) if ICOMPQ = 1, and not referenced -*> if ICOMPQ = 0. If ICOMPQ = 1, on exit, PERM(1, I) records -*> permutations done on the I-th level of the computation tree. -*> \endverbatim -*> -*> \param[out] GIVNUM -*> \verbatim -*> GIVNUM is DOUBLE PRECISION array, -*> dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1, and not -*> referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I, -*> GIVNUM(1, 2 *I - 1) and GIVNUM(1, 2 *I) record the C- and S- -*> values of Givens rotations performed on the I-th level on -*> the computation tree. -*> \endverbatim -*> -*> \param[out] C -*> \verbatim -*> C is DOUBLE PRECISION array, -*> dimension ( N ) if ICOMPQ = 1, and dimension 1 if ICOMPQ = 0. -*> If ICOMPQ = 1 and the I-th subproblem is not square, on exit, -*> C( I ) contains the C-value of a Givens rotation related to -*> the right null space of the I-th subproblem. -*> \endverbatim -*> -*> \param[out] S -*> \verbatim -*> S is DOUBLE PRECISION array, dimension ( N ) if -*> ICOMPQ = 1, and dimension 1 if ICOMPQ = 0. If ICOMPQ = 1 -*> and the I-th subproblem is not square, on exit, S( I ) -*> contains the S-value of a Givens rotation related to -*> the right null space of the I-th subproblem. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension -*> (6 * N + (SMLSIZ + 1)*(SMLSIZ + 1)). -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension (7*N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: if INFO = 1, a singular value did not converge -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Contributors: -* ================== -*> -*> Ming Gu and Huan Ren, Computer Science Division, University of -*> California at Berkeley, USA -*> -* ===================================================================== - SUBROUTINE DLASDA( ICOMPQ, SMLSIZ, N, SQRE, D, E, U, LDU, VT, K, - $ DIFL, DIFR, Z, POLES, GIVPTR, GIVCOL, LDGCOL, - $ PERM, GIVNUM, C, S, WORK, IWORK, INFO ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER ICOMPQ, INFO, LDGCOL, LDU, N, SMLSIZ, SQRE -* .. -* .. Array Arguments .. - INTEGER GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ), - $ K( * ), PERM( LDGCOL, * ) - DOUBLE PRECISION C( * ), D( * ), DIFL( LDU, * ), DIFR( LDU, * ), - $ E( * ), GIVNUM( LDU, * ), POLES( LDU, * ), - $ S( * ), U( LDU, * ), VT( LDU, * ), WORK( * ), - $ Z( LDU, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, I1, IC, IDXQ, IDXQI, IM1, INODE, ITEMP, IWK, - $ J, LF, LL, LVL, LVL2, M, NCC, ND, NDB1, NDIML, - $ NDIMR, NL, NLF, NLP1, NLVL, NR, NRF, NRP1, NRU, - $ NWORK1, NWORK2, SMLSZP, SQREI, VF, VFI, VL, VLI - DOUBLE PRECISION ALPHA, BETA -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DLASD6, DLASDQ, DLASDT, DLASET, XERBLA -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN - INFO = -1 - ELSE IF( SMLSIZ.LT.3 ) THEN - INFO = -2 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN - INFO = -4 - ELSE IF( LDU.LT.( N+SQRE ) ) THEN - INFO = -8 - ELSE IF( LDGCOL.LT.N ) THEN - INFO = -17 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLASDA', -INFO ) - RETURN - END IF -* - M = N + SQRE -* -* If the input matrix is too small, call DLASDQ to find the SVD. -* - IF( N.LE.SMLSIZ ) THEN - IF( ICOMPQ.EQ.0 ) THEN - CALL DLASDQ( 'U', SQRE, N, 0, 0, 0, D, E, VT, LDU, U, LDU, - $ U, LDU, WORK, INFO ) - ELSE - CALL DLASDQ( 'U', SQRE, N, M, N, 0, D, E, VT, LDU, U, LDU, - $ U, LDU, WORK, INFO ) - END IF - RETURN - END IF -* -* Book-keeping and set up the computation tree. -* - INODE = 1 - NDIML = INODE + N - NDIMR = NDIML + N - IDXQ = NDIMR + N - IWK = IDXQ + N -* - NCC = 0 - NRU = 0 -* - SMLSZP = SMLSIZ + 1 - VF = 1 - VL = VF + M - NWORK1 = VL + M - NWORK2 = NWORK1 + SMLSZP*SMLSZP -* - CALL DLASDT( N, NLVL, ND, IWORK( INODE ), IWORK( NDIML ), - $ IWORK( NDIMR ), SMLSIZ ) -* -* for the nodes on bottom level of the tree, solve -* their subproblems by DLASDQ. -* - NDB1 = ( ND+1 ) / 2 - DO 30 I = NDB1, ND -* -* IC : center row of each node -* NL : number of rows of left subproblem -* NR : number of rows of right subproblem -* NLF: starting row of the left subproblem -* NRF: starting row of the right subproblem -* - I1 = I - 1 - IC = IWORK( INODE+I1 ) - NL = IWORK( NDIML+I1 ) - NLP1 = NL + 1 - NR = IWORK( NDIMR+I1 ) - NLF = IC - NL - NRF = IC + 1 - IDXQI = IDXQ + NLF - 2 - VFI = VF + NLF - 1 - VLI = VL + NLF - 1 - SQREI = 1 - IF( ICOMPQ.EQ.0 ) THEN - CALL DLASET( 'A', NLP1, NLP1, ZERO, ONE, WORK( NWORK1 ), - $ SMLSZP ) - CALL DLASDQ( 'U', SQREI, NL, NLP1, NRU, NCC, D( NLF ), - $ E( NLF ), WORK( NWORK1 ), SMLSZP, - $ WORK( NWORK2 ), NL, WORK( NWORK2 ), NL, - $ WORK( NWORK2 ), INFO ) - ITEMP = NWORK1 + NL*SMLSZP - CALL DCOPY( NLP1, WORK( NWORK1 ), 1, WORK( VFI ), 1 ) - CALL DCOPY( NLP1, WORK( ITEMP ), 1, WORK( VLI ), 1 ) - ELSE - CALL DLASET( 'A', NL, NL, ZERO, ONE, U( NLF, 1 ), LDU ) - CALL DLASET( 'A', NLP1, NLP1, ZERO, ONE, VT( NLF, 1 ), LDU ) - CALL DLASDQ( 'U', SQREI, NL, NLP1, NL, NCC, D( NLF ), - $ E( NLF ), VT( NLF, 1 ), LDU, U( NLF, 1 ), LDU, - $ U( NLF, 1 ), LDU, WORK( NWORK1 ), INFO ) - CALL DCOPY( NLP1, VT( NLF, 1 ), 1, WORK( VFI ), 1 ) - CALL DCOPY( NLP1, VT( NLF, NLP1 ), 1, WORK( VLI ), 1 ) - END IF - IF( INFO.NE.0 ) THEN - RETURN - END IF - DO 10 J = 1, NL - IWORK( IDXQI+J ) = J - 10 CONTINUE - IF( ( I.EQ.ND ) .AND. ( SQRE.EQ.0 ) ) THEN - SQREI = 0 - ELSE - SQREI = 1 - END IF - IDXQI = IDXQI + NLP1 - VFI = VFI + NLP1 - VLI = VLI + NLP1 - NRP1 = NR + SQREI - IF( ICOMPQ.EQ.0 ) THEN - CALL DLASET( 'A', NRP1, NRP1, ZERO, ONE, WORK( NWORK1 ), - $ SMLSZP ) - CALL DLASDQ( 'U', SQREI, NR, NRP1, NRU, NCC, D( NRF ), - $ E( NRF ), WORK( NWORK1 ), SMLSZP, - $ WORK( NWORK2 ), NR, WORK( NWORK2 ), NR, - $ WORK( NWORK2 ), INFO ) - ITEMP = NWORK1 + ( NRP1-1 )*SMLSZP - CALL DCOPY( NRP1, WORK( NWORK1 ), 1, WORK( VFI ), 1 ) - CALL DCOPY( NRP1, WORK( ITEMP ), 1, WORK( VLI ), 1 ) - ELSE - CALL DLASET( 'A', NR, NR, ZERO, ONE, U( NRF, 1 ), LDU ) - CALL DLASET( 'A', NRP1, NRP1, ZERO, ONE, VT( NRF, 1 ), LDU ) - CALL DLASDQ( 'U', SQREI, NR, NRP1, NR, NCC, D( NRF ), - $ E( NRF ), VT( NRF, 1 ), LDU, U( NRF, 1 ), LDU, - $ U( NRF, 1 ), LDU, WORK( NWORK1 ), INFO ) - CALL DCOPY( NRP1, VT( NRF, 1 ), 1, WORK( VFI ), 1 ) - CALL DCOPY( NRP1, VT( NRF, NRP1 ), 1, WORK( VLI ), 1 ) - END IF - IF( INFO.NE.0 ) THEN - RETURN - END IF - DO 20 J = 1, NR - IWORK( IDXQI+J ) = J - 20 CONTINUE - 30 CONTINUE -* -* Now conquer each subproblem bottom-up. -* - J = 2**NLVL - DO 50 LVL = NLVL, 1, -1 - LVL2 = LVL*2 - 1 -* -* Find the first node LF and last node LL on -* the current level LVL. -* - IF( LVL.EQ.1 ) THEN - LF = 1 - LL = 1 - ELSE - LF = 2**( LVL-1 ) - LL = 2*LF - 1 - END IF - DO 40 I = LF, LL - IM1 = I - 1 - IC = IWORK( INODE+IM1 ) - NL = IWORK( NDIML+IM1 ) - NR = IWORK( NDIMR+IM1 ) - NLF = IC - NL - NRF = IC + 1 - IF( I.EQ.LL ) THEN - SQREI = SQRE - ELSE - SQREI = 1 - END IF - VFI = VF + NLF - 1 - VLI = VL + NLF - 1 - IDXQI = IDXQ + NLF - 1 - ALPHA = D( IC ) - BETA = E( IC ) - IF( ICOMPQ.EQ.0 ) THEN - CALL DLASD6( ICOMPQ, NL, NR, SQREI, D( NLF ), - $ WORK( VFI ), WORK( VLI ), ALPHA, BETA, - $ IWORK( IDXQI ), PERM, GIVPTR( 1 ), GIVCOL, - $ LDGCOL, GIVNUM, LDU, POLES, DIFL, DIFR, Z, - $ K( 1 ), C( 1 ), S( 1 ), WORK( NWORK1 ), - $ IWORK( IWK ), INFO ) - ELSE - J = J - 1 - CALL DLASD6( ICOMPQ, NL, NR, SQREI, D( NLF ), - $ WORK( VFI ), WORK( VLI ), ALPHA, BETA, - $ IWORK( IDXQI ), PERM( NLF, LVL ), - $ GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL, - $ GIVNUM( NLF, LVL2 ), LDU, - $ POLES( NLF, LVL2 ), DIFL( NLF, LVL ), - $ DIFR( NLF, LVL2 ), Z( NLF, LVL ), K( J ), - $ C( J ), S( J ), WORK( NWORK1 ), - $ IWORK( IWK ), INFO ) - END IF - IF( INFO.NE.0 ) THEN - RETURN - END IF - 40 CONTINUE - 50 CONTINUE -* - RETURN -* -* End of DLASDA -* - END diff --git a/lib/linalg/fortran/dlasdq.f b/lib/linalg/fortran/dlasdq.f deleted file mode 100644 index 0c39b24f0d..0000000000 --- a/lib/linalg/fortran/dlasdq.f +++ /dev/null @@ -1,410 +0,0 @@ -*> \brief \b DLASDQ computes the SVD of a real bidiagonal matrix with diagonal d and off-diagonal e. Used by sbdsdc. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASDQ + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASDQ( UPLO, SQRE, N, NCVT, NRU, NCC, D, E, VT, LDVT, -* U, LDU, C, LDC, WORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU, SQRE -* .. -* .. Array Arguments .. -* DOUBLE PRECISION C( LDC, * ), D( * ), E( * ), U( LDU, * ), -* $ VT( LDVT, * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASDQ computes the singular value decomposition (SVD) of a real -*> (upper or lower) bidiagonal matrix with diagonal D and offdiagonal -*> E, accumulating the transformations if desired. Letting B denote -*> the input bidiagonal matrix, the algorithm computes orthogonal -*> matrices Q and P such that B = Q * S * P**T (P**T denotes the transpose -*> of P). The singular values S are overwritten on D. -*> -*> The input matrix U is changed to U * Q if desired. -*> The input matrix VT is changed to P**T * VT if desired. -*> The input matrix C is changed to Q**T * C if desired. -*> -*> See "Computing Small Singular Values of Bidiagonal Matrices With -*> Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan, -*> LAPACK Working Note #3, for a detailed description of the algorithm. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the input bidiagonal matrix -*> is upper or lower bidiagonal, and whether it is square are -*> not. -*> UPLO = 'U' or 'u' B is upper bidiagonal. -*> UPLO = 'L' or 'l' B is lower bidiagonal. -*> \endverbatim -*> -*> \param[in] SQRE -*> \verbatim -*> SQRE is INTEGER -*> = 0: then the input matrix is N-by-N. -*> = 1: then the input matrix is N-by-(N+1) if UPLU = 'U' and -*> (N+1)-by-N if UPLU = 'L'. -*> -*> The bidiagonal matrix has -*> N = NL + NR + 1 rows and -*> M = N + SQRE >= N columns. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the number of rows and columns -*> in the matrix. N must be at least 0. -*> \endverbatim -*> -*> \param[in] NCVT -*> \verbatim -*> NCVT is INTEGER -*> On entry, NCVT specifies the number of columns of -*> the matrix VT. NCVT must be at least 0. -*> \endverbatim -*> -*> \param[in] NRU -*> \verbatim -*> NRU is INTEGER -*> On entry, NRU specifies the number of rows of -*> the matrix U. NRU must be at least 0. -*> \endverbatim -*> -*> \param[in] NCC -*> \verbatim -*> NCC is INTEGER -*> On entry, NCC specifies the number of columns of -*> the matrix C. NCC must be at least 0. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, D contains the diagonal entries of the -*> bidiagonal matrix whose SVD is desired. On normal exit, -*> D contains the singular values in ascending order. -*> \endverbatim -*> -*> \param[in,out] E -*> \verbatim -*> E is DOUBLE PRECISION array. -*> dimension is (N-1) if SQRE = 0 and N if SQRE = 1. -*> On entry, the entries of E contain the offdiagonal entries -*> of the bidiagonal matrix whose SVD is desired. On normal -*> exit, E will contain 0. If the algorithm does not converge, -*> D and E will contain the diagonal and superdiagonal entries -*> of a bidiagonal matrix orthogonally equivalent to the one -*> given as input. -*> \endverbatim -*> -*> \param[in,out] VT -*> \verbatim -*> VT is DOUBLE PRECISION array, dimension (LDVT, NCVT) -*> On entry, contains a matrix which on exit has been -*> premultiplied by P**T, dimension N-by-NCVT if SQRE = 0 -*> and (N+1)-by-NCVT if SQRE = 1 (not referenced if NCVT=0). -*> \endverbatim -*> -*> \param[in] LDVT -*> \verbatim -*> LDVT is INTEGER -*> On entry, LDVT specifies the leading dimension of VT as -*> declared in the calling (sub) program. LDVT must be at -*> least 1. If NCVT is nonzero LDVT must also be at least N. -*> \endverbatim -*> -*> \param[in,out] U -*> \verbatim -*> U is DOUBLE PRECISION array, dimension (LDU, N) -*> On entry, contains a matrix which on exit has been -*> postmultiplied by Q, dimension NRU-by-N if SQRE = 0 -*> and NRU-by-(N+1) if SQRE = 1 (not referenced if NRU=0). -*> \endverbatim -*> -*> \param[in] LDU -*> \verbatim -*> LDU is INTEGER -*> On entry, LDU specifies the leading dimension of U as -*> declared in the calling (sub) program. LDU must be at -*> least max( 1, NRU ) . -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC, NCC) -*> On entry, contains an N-by-NCC matrix which on exit -*> has been premultiplied by Q**T dimension N-by-NCC if SQRE = 0 -*> and (N+1)-by-NCC if SQRE = 1 (not referenced if NCC=0). -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> On entry, LDC specifies the leading dimension of C as -*> declared in the calling (sub) program. LDC must be at -*> least 1. If NCC is nonzero, LDC must also be at least N. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (4*N) -*> Workspace. Only referenced if one of NCVT, NRU, or NCC is -*> nonzero, and if N is at least 2. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> On exit, a value of 0 indicates a successful exit. -*> If INFO < 0, argument number -INFO is illegal. -*> If INFO > 0, the algorithm did not converge, and INFO -*> specifies how many superdiagonals did not converge. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Contributors: -* ================== -*> -*> Ming Gu and Huan Ren, Computer Science Division, University of -*> California at Berkeley, USA -*> -* ===================================================================== - SUBROUTINE DLASDQ( UPLO, SQRE, N, NCVT, NRU, NCC, D, E, VT, LDVT, - $ U, LDU, C, LDC, WORK, INFO ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU, SQRE -* .. -* .. Array Arguments .. - DOUBLE PRECISION C( LDC, * ), D( * ), E( * ), U( LDU, * ), - $ VT( LDVT, * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL ROTATE - INTEGER I, ISUB, IUPLO, J, NP1, SQRE1 - DOUBLE PRECISION CS, R, SMIN, SN -* .. -* .. External Subroutines .. - EXTERNAL DBDSQR, DLARTG, DLASR, DSWAP, XERBLA -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - IUPLO = 0 - IF( LSAME( UPLO, 'U' ) ) - $ IUPLO = 1 - IF( LSAME( UPLO, 'L' ) ) - $ IUPLO = 2 - IF( IUPLO.EQ.0 ) THEN - INFO = -1 - ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN - INFO = -2 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( NCVT.LT.0 ) THEN - INFO = -4 - ELSE IF( NRU.LT.0 ) THEN - INFO = -5 - ELSE IF( NCC.LT.0 ) THEN - INFO = -6 - ELSE IF( ( NCVT.EQ.0 .AND. LDVT.LT.1 ) .OR. - $ ( NCVT.GT.0 .AND. LDVT.LT.MAX( 1, N ) ) ) THEN - INFO = -10 - ELSE IF( LDU.LT.MAX( 1, NRU ) ) THEN - INFO = -12 - ELSE IF( ( NCC.EQ.0 .AND. LDC.LT.1 ) .OR. - $ ( NCC.GT.0 .AND. LDC.LT.MAX( 1, N ) ) ) THEN - INFO = -14 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLASDQ', -INFO ) - RETURN - END IF - IF( N.EQ.0 ) - $ RETURN -* -* ROTATE is true if any singular vectors desired, false otherwise -* - ROTATE = ( NCVT.GT.0 ) .OR. ( NRU.GT.0 ) .OR. ( NCC.GT.0 ) - NP1 = N + 1 - SQRE1 = SQRE -* -* If matrix non-square upper bidiagonal, rotate to be lower -* bidiagonal. The rotations are on the right. -* - IF( ( IUPLO.EQ.1 ) .AND. ( SQRE1.EQ.1 ) ) THEN - DO 10 I = 1, N - 1 - CALL DLARTG( D( I ), E( I ), CS, SN, R ) - D( I ) = R - E( I ) = SN*D( I+1 ) - D( I+1 ) = CS*D( I+1 ) - IF( ROTATE ) THEN - WORK( I ) = CS - WORK( N+I ) = SN - END IF - 10 CONTINUE - CALL DLARTG( D( N ), E( N ), CS, SN, R ) - D( N ) = R - E( N ) = ZERO - IF( ROTATE ) THEN - WORK( N ) = CS - WORK( N+N ) = SN - END IF - IUPLO = 2 - SQRE1 = 0 -* -* Update singular vectors if desired. -* - IF( NCVT.GT.0 ) - $ CALL DLASR( 'L', 'V', 'F', NP1, NCVT, WORK( 1 ), - $ WORK( NP1 ), VT, LDVT ) - END IF -* -* If matrix lower bidiagonal, rotate to be upper bidiagonal -* by applying Givens rotations on the left. -* - IF( IUPLO.EQ.2 ) THEN - DO 20 I = 1, N - 1 - CALL DLARTG( D( I ), E( I ), CS, SN, R ) - D( I ) = R - E( I ) = SN*D( I+1 ) - D( I+1 ) = CS*D( I+1 ) - IF( ROTATE ) THEN - WORK( I ) = CS - WORK( N+I ) = SN - END IF - 20 CONTINUE -* -* If matrix (N+1)-by-N lower bidiagonal, one additional -* rotation is needed. -* - IF( SQRE1.EQ.1 ) THEN - CALL DLARTG( D( N ), E( N ), CS, SN, R ) - D( N ) = R - IF( ROTATE ) THEN - WORK( N ) = CS - WORK( N+N ) = SN - END IF - END IF -* -* Update singular vectors if desired. -* - IF( NRU.GT.0 ) THEN - IF( SQRE1.EQ.0 ) THEN - CALL DLASR( 'R', 'V', 'F', NRU, N, WORK( 1 ), - $ WORK( NP1 ), U, LDU ) - ELSE - CALL DLASR( 'R', 'V', 'F', NRU, NP1, WORK( 1 ), - $ WORK( NP1 ), U, LDU ) - END IF - END IF - IF( NCC.GT.0 ) THEN - IF( SQRE1.EQ.0 ) THEN - CALL DLASR( 'L', 'V', 'F', N, NCC, WORK( 1 ), - $ WORK( NP1 ), C, LDC ) - ELSE - CALL DLASR( 'L', 'V', 'F', NP1, NCC, WORK( 1 ), - $ WORK( NP1 ), C, LDC ) - END IF - END IF - END IF -* -* Call DBDSQR to compute the SVD of the reduced real -* N-by-N upper bidiagonal matrix. -* - CALL DBDSQR( 'U', N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, - $ LDC, WORK, INFO ) -* -* Sort the singular values into ascending order (insertion sort on -* singular values, but only one transposition per singular vector) -* - DO 40 I = 1, N -* -* Scan for smallest D(I). -* - ISUB = I - SMIN = D( I ) - DO 30 J = I + 1, N - IF( D( J ).LT.SMIN ) THEN - ISUB = J - SMIN = D( J ) - END IF - 30 CONTINUE - IF( ISUB.NE.I ) THEN -* -* Swap singular values and vectors. -* - D( ISUB ) = D( I ) - D( I ) = SMIN - IF( NCVT.GT.0 ) - $ CALL DSWAP( NCVT, VT( ISUB, 1 ), LDVT, VT( I, 1 ), LDVT ) - IF( NRU.GT.0 ) - $ CALL DSWAP( NRU, U( 1, ISUB ), 1, U( 1, I ), 1 ) - IF( NCC.GT.0 ) - $ CALL DSWAP( NCC, C( ISUB, 1 ), LDC, C( I, 1 ), LDC ) - END IF - 40 CONTINUE -* - RETURN -* -* End of DLASDQ -* - END diff --git a/lib/linalg/fortran/dlasdt.f b/lib/linalg/fortran/dlasdt.f deleted file mode 100644 index 0d9999ea62..0000000000 --- a/lib/linalg/fortran/dlasdt.f +++ /dev/null @@ -1,169 +0,0 @@ -*> \brief \b DLASDT creates a tree of subproblems for bidiagonal divide and conquer. Used by sbdsdc. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASDT + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASDT( N, LVL, ND, INODE, NDIML, NDIMR, MSUB ) -* -* .. Scalar Arguments .. -* INTEGER LVL, MSUB, N, ND -* .. -* .. Array Arguments .. -* INTEGER INODE( * ), NDIML( * ), NDIMR( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASDT creates a tree of subproblems for bidiagonal divide and -*> conquer. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, the number of diagonal elements of the -*> bidiagonal matrix. -*> \endverbatim -*> -*> \param[out] LVL -*> \verbatim -*> LVL is INTEGER -*> On exit, the number of levels on the computation tree. -*> \endverbatim -*> -*> \param[out] ND -*> \verbatim -*> ND is INTEGER -*> On exit, the number of nodes on the tree. -*> \endverbatim -*> -*> \param[out] INODE -*> \verbatim -*> INODE is INTEGER array, dimension ( N ) -*> On exit, centers of subproblems. -*> \endverbatim -*> -*> \param[out] NDIML -*> \verbatim -*> NDIML is INTEGER array, dimension ( N ) -*> On exit, row dimensions of left children. -*> \endverbatim -*> -*> \param[out] NDIMR -*> \verbatim -*> NDIMR is INTEGER array, dimension ( N ) -*> On exit, row dimensions of right children. -*> \endverbatim -*> -*> \param[in] MSUB -*> \verbatim -*> MSUB is INTEGER -*> On entry, the maximum row dimension each subproblem at the -*> bottom of the tree can be of. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Contributors: -* ================== -*> -*> Ming Gu and Huan Ren, Computer Science Division, University of -*> California at Berkeley, USA -*> -* ===================================================================== - SUBROUTINE DLASDT( N, LVL, ND, INODE, NDIML, NDIMR, MSUB ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER LVL, MSUB, N, ND -* .. -* .. Array Arguments .. - INTEGER INODE( * ), NDIML( * ), NDIMR( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION TWO - PARAMETER ( TWO = 2.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, IL, IR, LLST, MAXN, NCRNT, NLVL - DOUBLE PRECISION TEMP -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, INT, LOG, MAX -* .. -* .. Executable Statements .. -* -* Find the number of levels on the tree. -* - MAXN = MAX( 1, N ) - TEMP = LOG( DBLE( MAXN ) / DBLE( MSUB+1 ) ) / LOG( TWO ) - LVL = INT( TEMP ) + 1 -* - I = N / 2 - INODE( 1 ) = I + 1 - NDIML( 1 ) = I - NDIMR( 1 ) = N - I - 1 - IL = 0 - IR = 1 - LLST = 1 - DO 20 NLVL = 1, LVL - 1 -* -* Constructing the tree at (NLVL+1)-st level. The number of -* nodes created on this level is LLST * 2. -* - DO 10 I = 0, LLST - 1 - IL = IL + 2 - IR = IR + 2 - NCRNT = LLST + I - NDIML( IL ) = NDIML( NCRNT ) / 2 - NDIMR( IL ) = NDIML( NCRNT ) - NDIML( IL ) - 1 - INODE( IL ) = INODE( NCRNT ) - NDIMR( IL ) - 1 - NDIML( IR ) = NDIMR( NCRNT ) / 2 - NDIMR( IR ) = NDIMR( NCRNT ) - NDIML( IR ) - 1 - INODE( IR ) = INODE( NCRNT ) + NDIML( IR ) + 1 - 10 CONTINUE - LLST = LLST*2 - 20 CONTINUE - ND = LLST*2 - 1 -* - RETURN -* -* End of DLASDT -* - END diff --git a/lib/linalg/fortran/dlaset.f b/lib/linalg/fortran/dlaset.f deleted file mode 100644 index 625c757b6b..0000000000 --- a/lib/linalg/fortran/dlaset.f +++ /dev/null @@ -1,181 +0,0 @@ -*> \brief \b DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASET + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASET( UPLO, M, N, ALPHA, BETA, A, LDA ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER LDA, M, N -* DOUBLE PRECISION ALPHA, BETA -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASET initializes an m-by-n matrix A to BETA on the diagonal and -*> ALPHA on the offdiagonals. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies the part of the matrix A to be set. -*> = 'U': Upper triangular part is set; the strictly lower -*> triangular part of A is not changed. -*> = 'L': Lower triangular part is set; the strictly upper -*> triangular part of A is not changed. -*> Otherwise: All of the matrix A is set. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION -*> The constant to which the offdiagonal elements are to be set. -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is DOUBLE PRECISION -*> The constant to which the diagonal elements are to be set. -*> \endverbatim -*> -*> \param[out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On exit, the leading m-by-n submatrix of A is set as follows: -*> -*> if UPLO = 'U', A(i,j) = ALPHA, 1<=i<=j-1, 1<=j<=n, -*> if UPLO = 'L', A(i,j) = ALPHA, j+1<=i<=m, 1<=j<=n, -*> otherwise, A(i,j) = ALPHA, 1<=i<=m, 1<=j<=n, i.ne.j, -*> -*> and, for all UPLO, A(i,i) = BETA, 1<=i<=min(m,n). -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLASET( UPLO, M, N, ALPHA, BETA, A, LDA ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER LDA, M, N - DOUBLE PRECISION ALPHA, BETA -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, J -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Intrinsic Functions .. - INTRINSIC MIN -* .. -* .. Executable Statements .. -* - IF( LSAME( UPLO, 'U' ) ) THEN -* -* Set the strictly upper triangular or trapezoidal part of the -* array to ALPHA. -* - DO 20 J = 2, N - DO 10 I = 1, MIN( J-1, M ) - A( I, J ) = ALPHA - 10 CONTINUE - 20 CONTINUE -* - ELSE IF( LSAME( UPLO, 'L' ) ) THEN -* -* Set the strictly lower triangular or trapezoidal part of the -* array to ALPHA. -* - DO 40 J = 1, MIN( M, N ) - DO 30 I = J + 1, M - A( I, J ) = ALPHA - 30 CONTINUE - 40 CONTINUE -* - ELSE -* -* Set the leading m-by-n submatrix to ALPHA. -* - DO 60 J = 1, N - DO 50 I = 1, M - A( I, J ) = ALPHA - 50 CONTINUE - 60 CONTINUE - END IF -* -* Set the first min(M,N) diagonal elements to BETA. -* - DO 70 I = 1, MIN( M, N ) - A( I, I ) = BETA - 70 CONTINUE -* - RETURN -* -* End of DLASET -* - END diff --git a/lib/linalg/fortran/dlasq1.f b/lib/linalg/fortran/dlasq1.f deleted file mode 100644 index 27fa30736e..0000000000 --- a/lib/linalg/fortran/dlasq1.f +++ /dev/null @@ -1,221 +0,0 @@ -*> \brief \b DLASQ1 computes the singular values of a real square bidiagonal matrix. Used by sbdsqr. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASQ1 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASQ1( N, D, E, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( * ), E( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASQ1 computes the singular values of a real N-by-N bidiagonal -*> matrix with diagonal D and off-diagonal E. The singular values -*> are computed to high relative accuracy, in the absence of -*> denormalization, underflow and overflow. The algorithm was first -*> presented in -*> -*> "Accurate singular values and differential qd algorithms" by K. V. -*> Fernando and B. N. Parlett, Numer. Math., Vol-67, No. 2, pp. 191-230, -*> 1994, -*> -*> and the present implementation is described in "An implementation of -*> the dqds Algorithm (Positive Case)", LAPACK Working Note. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of rows and columns in the matrix. N >= 0. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, D contains the diagonal elements of the -*> bidiagonal matrix whose SVD is desired. On normal exit, -*> D contains the singular values in decreasing order. -*> \endverbatim -*> -*> \param[in,out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N) -*> On entry, elements E(1:N-1) contain the off-diagonal elements -*> of the bidiagonal matrix whose SVD is desired. -*> On exit, E is overwritten. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (4*N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: the algorithm failed -*> = 1, a split was marked by a positive value in E -*> = 2, current block of Z not diagonalized after 100*N -*> iterations (in inner while loop) On exit D and E -*> represent a matrix with the same singular values -*> which the calling subroutine could use to finish the -*> computation, or even feed back into DLASQ1 -*> = 3, termination criterion of outer while loop not met -*> (program created more than N unreduced blocks) -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -* ===================================================================== - SUBROUTINE DLASQ1( N, D, E, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( * ), E( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) -* .. -* .. Local Scalars .. - INTEGER I, IINFO - DOUBLE PRECISION EPS, SCALE, SAFMIN, SIGMN, SIGMX -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DLAS2, DLASCL, DLASQ2, DLASRT, XERBLA -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH - EXTERNAL DLAMCH -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, SQRT -* .. -* .. Executable Statements .. -* - INFO = 0 - IF( N.LT.0 ) THEN - INFO = -1 - CALL XERBLA( 'DLASQ1', -INFO ) - RETURN - ELSE IF( N.EQ.0 ) THEN - RETURN - ELSE IF( N.EQ.1 ) THEN - D( 1 ) = ABS( D( 1 ) ) - RETURN - ELSE IF( N.EQ.2 ) THEN - CALL DLAS2( D( 1 ), E( 1 ), D( 2 ), SIGMN, SIGMX ) - D( 1 ) = SIGMX - D( 2 ) = SIGMN - RETURN - END IF -* -* Estimate the largest singular value. -* - SIGMX = ZERO - DO 10 I = 1, N - 1 - D( I ) = ABS( D( I ) ) - SIGMX = MAX( SIGMX, ABS( E( I ) ) ) - 10 CONTINUE - D( N ) = ABS( D( N ) ) -* -* Early return if SIGMX is zero (matrix is already diagonal). -* - IF( SIGMX.EQ.ZERO ) THEN - CALL DLASRT( 'D', N, D, IINFO ) - RETURN - END IF -* - DO 20 I = 1, N - SIGMX = MAX( SIGMX, D( I ) ) - 20 CONTINUE -* -* Copy D and E into WORK (in the Z format) and scale (squaring the -* input data makes scaling by a power of the radix pointless). -* - EPS = DLAMCH( 'Precision' ) - SAFMIN = DLAMCH( 'Safe minimum' ) - SCALE = SQRT( EPS / SAFMIN ) - CALL DCOPY( N, D, 1, WORK( 1 ), 2 ) - CALL DCOPY( N-1, E, 1, WORK( 2 ), 2 ) - CALL DLASCL( 'G', 0, 0, SIGMX, SCALE, 2*N-1, 1, WORK, 2*N-1, - $ IINFO ) -* -* Compute the q's and e's. -* - DO 30 I = 1, 2*N - 1 - WORK( I ) = WORK( I )**2 - 30 CONTINUE - WORK( 2*N ) = ZERO -* - CALL DLASQ2( N, WORK, INFO ) -* - IF( INFO.EQ.0 ) THEN - DO 40 I = 1, N - D( I ) = SQRT( WORK( I ) ) - 40 CONTINUE - CALL DLASCL( 'G', 0, 0, SCALE, SIGMX, N, 1, D, N, IINFO ) - ELSE IF( INFO.EQ.2 ) THEN -* -* Maximum number of iterations exceeded. Move data from WORK -* into D and E so the calling subroutine can try to finish -* - DO I = 1, N - D( I ) = SQRT( WORK( 2*I-1 ) ) - E( I ) = SQRT( WORK( 2*I ) ) - END DO - CALL DLASCL( 'G', 0, 0, SCALE, SIGMX, N, 1, D, N, IINFO ) - CALL DLASCL( 'G', 0, 0, SCALE, SIGMX, N, 1, E, N, IINFO ) - END IF -* - RETURN -* -* End of DLASQ1 -* - END diff --git a/lib/linalg/fortran/dlasq2.f b/lib/linalg/fortran/dlasq2.f deleted file mode 100644 index 608ca7a619..0000000000 --- a/lib/linalg/fortran/dlasq2.f +++ /dev/null @@ -1,586 +0,0 @@ -*> \brief \b DLASQ2 computes all the eigenvalues of the symmetric positive definite tridiagonal matrix associated with the qd Array Z to high relative accuracy. Used by sbdsqr and sstegr. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASQ2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASQ2( N, Z, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION Z( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASQ2 computes all the eigenvalues of the symmetric positive -*> definite tridiagonal matrix associated with the qd array Z to high -*> relative accuracy are computed to high relative accuracy, in the -*> absence of denormalization, underflow and overflow. -*> -*> To see the relation of Z to the tridiagonal matrix, let L be a -*> unit lower bidiagonal matrix with subdiagonals Z(2,4,6,,..) and -*> let U be an upper bidiagonal matrix with 1's above and diagonal -*> Z(1,3,5,,..). The tridiagonal is L*U or, if you prefer, the -*> symmetric tridiagonal to which it is similar. -*> -*> Note : DLASQ2 defines a logical variable, IEEE, which is true -*> on machines which follow ieee-754 floating-point standard in their -*> handling of infinities and NaNs, and false otherwise. This variable -*> is passed to DLASQ3. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of rows and columns in the matrix. N >= 0. -*> \endverbatim -*> -*> \param[in,out] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension ( 4*N ) -*> On entry Z holds the qd array. On exit, entries 1 to N hold -*> the eigenvalues in decreasing order, Z( 2*N+1 ) holds the -*> trace, and Z( 2*N+2 ) holds the sum of the eigenvalues. If -*> N > 2, then Z( 2*N+3 ) holds the iteration count, Z( 2*N+4 ) -*> holds NDIVS/NIN^2, and Z( 2*N+5 ) holds the percentage of -*> shifts that failed. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if the i-th argument is a scalar and had an illegal -*> value, then INFO = -i, if the i-th argument is an -*> array and the j-entry had an illegal value, then -*> INFO = -(i*100+j) -*> > 0: the algorithm failed -*> = 1, a split was marked by a positive value in E -*> = 2, current block of Z not diagonalized after 100*N -*> iterations (in inner while loop). On exit Z holds -*> a qd array with the same eigenvalues as the given Z. -*> = 3, termination criterion of outer while loop not met -*> (program created more than N unreduced blocks) -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Local Variables: I0:N0 defines a current unreduced segment of Z. -*> The shifts are accumulated in SIGMA. Iteration count is in ITER. -*> Ping-pong is controlled by PP (alternates between 0 and 1). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLASQ2( N, Z, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION Z( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION CBIAS - PARAMETER ( CBIAS = 1.50D0 ) - DOUBLE PRECISION ZERO, HALF, ONE, TWO, FOUR, HUNDRD - PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0, - $ TWO = 2.0D0, FOUR = 4.0D0, HUNDRD = 100.0D0 ) -* .. -* .. Local Scalars .. - LOGICAL IEEE - INTEGER I0, I1, I4, IINFO, IPN4, ITER, IWHILA, IWHILB, - $ K, KMIN, N0, N1, NBIG, NDIV, NFAIL, PP, SPLT, - $ TTYPE - DOUBLE PRECISION D, DEE, DEEMIN, DESIG, DMIN, DMIN1, DMIN2, DN, - $ DN1, DN2, E, EMAX, EMIN, EPS, G, OLDEMN, QMAX, - $ QMIN, S, SAFMIN, SIGMA, T, TAU, TEMP, TOL, - $ TOL2, TRACE, ZMAX, TEMPE, TEMPQ -* .. -* .. External Subroutines .. - EXTERNAL DLASQ3, DLASRT, XERBLA -* .. -* .. External Functions .. - INTEGER ILAENV - DOUBLE PRECISION DLAMCH - EXTERNAL DLAMCH, ILAENV -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* -* Test the input arguments. -* (in case DLASQ2 is not called by DLASQ1) -* - INFO = 0 - EPS = DLAMCH( 'Precision' ) - SAFMIN = DLAMCH( 'Safe minimum' ) - TOL = EPS*HUNDRD - TOL2 = TOL**2 -* - IF( N.LT.0 ) THEN - INFO = -1 - CALL XERBLA( 'DLASQ2', 1 ) - RETURN - ELSE IF( N.EQ.0 ) THEN - RETURN - ELSE IF( N.EQ.1 ) THEN -* -* 1-by-1 case. -* - IF( Z( 1 ).LT.ZERO ) THEN - INFO = -201 - CALL XERBLA( 'DLASQ2', 2 ) - END IF - RETURN - ELSE IF( N.EQ.2 ) THEN -* -* 2-by-2 case. -* - IF( Z( 1 ).LT.ZERO ) THEN - INFO = -201 - CALL XERBLA( 'DLASQ2', 2 ) - RETURN - ELSE IF( Z( 2 ).LT.ZERO ) THEN - INFO = -202 - CALL XERBLA( 'DLASQ2', 2 ) - RETURN - ELSE IF( Z( 3 ).LT.ZERO ) THEN - INFO = -203 - CALL XERBLA( 'DLASQ2', 2 ) - RETURN - ELSE IF( Z( 3 ).GT.Z( 1 ) ) THEN - D = Z( 3 ) - Z( 3 ) = Z( 1 ) - Z( 1 ) = D - END IF - Z( 5 ) = Z( 1 ) + Z( 2 ) + Z( 3 ) - IF( Z( 2 ).GT.Z( 3 )*TOL2 ) THEN - T = HALF*( ( Z( 1 )-Z( 3 ) )+Z( 2 ) ) - S = Z( 3 )*( Z( 2 ) / T ) - IF( S.LE.T ) THEN - S = Z( 3 )*( Z( 2 ) / ( T*( ONE+SQRT( ONE+S / T ) ) ) ) - ELSE - S = Z( 3 )*( Z( 2 ) / ( T+SQRT( T )*SQRT( T+S ) ) ) - END IF - T = Z( 1 ) + ( S+Z( 2 ) ) - Z( 3 ) = Z( 3 )*( Z( 1 ) / T ) - Z( 1 ) = T - END IF - Z( 2 ) = Z( 3 ) - Z( 6 ) = Z( 2 ) + Z( 1 ) - RETURN - END IF -* -* Check for negative data and compute sums of q's and e's. -* - Z( 2*N ) = ZERO - EMIN = Z( 2 ) - QMAX = ZERO - ZMAX = ZERO - D = ZERO - E = ZERO -* - DO 10 K = 1, 2*( N-1 ), 2 - IF( Z( K ).LT.ZERO ) THEN - INFO = -( 200+K ) - CALL XERBLA( 'DLASQ2', 2 ) - RETURN - ELSE IF( Z( K+1 ).LT.ZERO ) THEN - INFO = -( 200+K+1 ) - CALL XERBLA( 'DLASQ2', 2 ) - RETURN - END IF - D = D + Z( K ) - E = E + Z( K+1 ) - QMAX = MAX( QMAX, Z( K ) ) - EMIN = MIN( EMIN, Z( K+1 ) ) - ZMAX = MAX( QMAX, ZMAX, Z( K+1 ) ) - 10 CONTINUE - IF( Z( 2*N-1 ).LT.ZERO ) THEN - INFO = -( 200+2*N-1 ) - CALL XERBLA( 'DLASQ2', 2 ) - RETURN - END IF - D = D + Z( 2*N-1 ) - QMAX = MAX( QMAX, Z( 2*N-1 ) ) - ZMAX = MAX( QMAX, ZMAX ) -* -* Check for diagonality. -* - IF( E.EQ.ZERO ) THEN - DO 20 K = 2, N - Z( K ) = Z( 2*K-1 ) - 20 CONTINUE - CALL DLASRT( 'D', N, Z, IINFO ) - Z( 2*N-1 ) = D - RETURN - END IF -* - TRACE = D + E -* -* Check for zero data. -* - IF( TRACE.EQ.ZERO ) THEN - Z( 2*N-1 ) = ZERO - RETURN - END IF -* -* Check whether the machine is IEEE conformable. -* - IEEE = ( ILAENV( 10, 'DLASQ2', 'N', 1, 2, 3, 4 ).EQ.1 ) -* -* Rearrange data for locality: Z=(q1,qq1,e1,ee1,q2,qq2,e2,ee2,...). -* - DO 30 K = 2*N, 2, -2 - Z( 2*K ) = ZERO - Z( 2*K-1 ) = Z( K ) - Z( 2*K-2 ) = ZERO - Z( 2*K-3 ) = Z( K-1 ) - 30 CONTINUE -* - I0 = 1 - N0 = N -* -* Reverse the qd-array, if warranted. -* - IF( CBIAS*Z( 4*I0-3 ).LT.Z( 4*N0-3 ) ) THEN - IPN4 = 4*( I0+N0 ) - DO 40 I4 = 4*I0, 2*( I0+N0-1 ), 4 - TEMP = Z( I4-3 ) - Z( I4-3 ) = Z( IPN4-I4-3 ) - Z( IPN4-I4-3 ) = TEMP - TEMP = Z( I4-1 ) - Z( I4-1 ) = Z( IPN4-I4-5 ) - Z( IPN4-I4-5 ) = TEMP - 40 CONTINUE - END IF -* -* Initial split checking via dqd and Li's test. -* - PP = 0 -* - DO 80 K = 1, 2 -* - D = Z( 4*N0+PP-3 ) - DO 50 I4 = 4*( N0-1 ) + PP, 4*I0 + PP, -4 - IF( Z( I4-1 ).LE.TOL2*D ) THEN - Z( I4-1 ) = -ZERO - D = Z( I4-3 ) - ELSE - D = Z( I4-3 )*( D / ( D+Z( I4-1 ) ) ) - END IF - 50 CONTINUE -* -* dqd maps Z to ZZ plus Li's test. -* - EMIN = Z( 4*I0+PP+1 ) - D = Z( 4*I0+PP-3 ) - DO 60 I4 = 4*I0 + PP, 4*( N0-1 ) + PP, 4 - Z( I4-2*PP-2 ) = D + Z( I4-1 ) - IF( Z( I4-1 ).LE.TOL2*D ) THEN - Z( I4-1 ) = -ZERO - Z( I4-2*PP-2 ) = D - Z( I4-2*PP ) = ZERO - D = Z( I4+1 ) - ELSE IF( SAFMIN*Z( I4+1 ).LT.Z( I4-2*PP-2 ) .AND. - $ SAFMIN*Z( I4-2*PP-2 ).LT.Z( I4+1 ) ) THEN - TEMP = Z( I4+1 ) / Z( I4-2*PP-2 ) - Z( I4-2*PP ) = Z( I4-1 )*TEMP - D = D*TEMP - ELSE - Z( I4-2*PP ) = Z( I4+1 )*( Z( I4-1 ) / Z( I4-2*PP-2 ) ) - D = Z( I4+1 )*( D / Z( I4-2*PP-2 ) ) - END IF - EMIN = MIN( EMIN, Z( I4-2*PP ) ) - 60 CONTINUE - Z( 4*N0-PP-2 ) = D -* -* Now find qmax. -* - QMAX = Z( 4*I0-PP-2 ) - DO 70 I4 = 4*I0 - PP + 2, 4*N0 - PP - 2, 4 - QMAX = MAX( QMAX, Z( I4 ) ) - 70 CONTINUE -* -* Prepare for the next iteration on K. -* - PP = 1 - PP - 80 CONTINUE -* -* Initialise variables to pass to DLASQ3. -* - TTYPE = 0 - DMIN1 = ZERO - DMIN2 = ZERO - DN = ZERO - DN1 = ZERO - DN2 = ZERO - G = ZERO - TAU = ZERO -* - ITER = 2 - NFAIL = 0 - NDIV = 2*( N0-I0 ) -* - DO 160 IWHILA = 1, N + 1 - IF( N0.LT.1 ) - $ GO TO 170 -* -* While array unfinished do -* -* E(N0) holds the value of SIGMA when submatrix in I0:N0 -* splits from the rest of the array, but is negated. -* - DESIG = ZERO - IF( N0.EQ.N ) THEN - SIGMA = ZERO - ELSE - SIGMA = -Z( 4*N0-1 ) - END IF - IF( SIGMA.LT.ZERO ) THEN - INFO = 1 - RETURN - END IF -* -* Find last unreduced submatrix's top index I0, find QMAX and -* EMIN. Find Gershgorin-type bound if Q's much greater than E's. -* - EMAX = ZERO - IF( N0.GT.I0 ) THEN - EMIN = ABS( Z( 4*N0-5 ) ) - ELSE - EMIN = ZERO - END IF - QMIN = Z( 4*N0-3 ) - QMAX = QMIN - DO 90 I4 = 4*N0, 8, -4 - IF( Z( I4-5 ).LE.ZERO ) - $ GO TO 100 - IF( QMIN.GE.FOUR*EMAX ) THEN - QMIN = MIN( QMIN, Z( I4-3 ) ) - EMAX = MAX( EMAX, Z( I4-5 ) ) - END IF - QMAX = MAX( QMAX, Z( I4-7 )+Z( I4-5 ) ) - EMIN = MIN( EMIN, Z( I4-5 ) ) - 90 CONTINUE - I4 = 4 -* - 100 CONTINUE - I0 = I4 / 4 - PP = 0 -* - IF( N0-I0.GT.1 ) THEN - DEE = Z( 4*I0-3 ) - DEEMIN = DEE - KMIN = I0 - DO 110 I4 = 4*I0+1, 4*N0-3, 4 - DEE = Z( I4 )*( DEE /( DEE+Z( I4-2 ) ) ) - IF( DEE.LE.DEEMIN ) THEN - DEEMIN = DEE - KMIN = ( I4+3 )/4 - END IF - 110 CONTINUE - IF( (KMIN-I0)*2.LT.N0-KMIN .AND. - $ DEEMIN.LE.HALF*Z(4*N0-3) ) THEN - IPN4 = 4*( I0+N0 ) - PP = 2 - DO 120 I4 = 4*I0, 2*( I0+N0-1 ), 4 - TEMP = Z( I4-3 ) - Z( I4-3 ) = Z( IPN4-I4-3 ) - Z( IPN4-I4-3 ) = TEMP - TEMP = Z( I4-2 ) - Z( I4-2 ) = Z( IPN4-I4-2 ) - Z( IPN4-I4-2 ) = TEMP - TEMP = Z( I4-1 ) - Z( I4-1 ) = Z( IPN4-I4-5 ) - Z( IPN4-I4-5 ) = TEMP - TEMP = Z( I4 ) - Z( I4 ) = Z( IPN4-I4-4 ) - Z( IPN4-I4-4 ) = TEMP - 120 CONTINUE - END IF - END IF -* -* Put -(initial shift) into DMIN. -* - DMIN = -MAX( ZERO, QMIN-TWO*SQRT( QMIN )*SQRT( EMAX ) ) -* -* Now I0:N0 is unreduced. -* PP = 0 for ping, PP = 1 for pong. -* PP = 2 indicates that flipping was applied to the Z array and -* and that the tests for deflation upon entry in DLASQ3 -* should not be performed. -* - NBIG = 100*( N0-I0+1 ) - DO 140 IWHILB = 1, NBIG - IF( I0.GT.N0 ) - $ GO TO 150 -* -* While submatrix unfinished take a good dqds step. -* - CALL DLASQ3( I0, N0, Z, PP, DMIN, SIGMA, DESIG, QMAX, NFAIL, - $ ITER, NDIV, IEEE, TTYPE, DMIN1, DMIN2, DN, DN1, - $ DN2, G, TAU ) -* - PP = 1 - PP -* -* When EMIN is very small check for splits. -* - IF( PP.EQ.0 .AND. N0-I0.GE.3 ) THEN - IF( Z( 4*N0 ).LE.TOL2*QMAX .OR. - $ Z( 4*N0-1 ).LE.TOL2*SIGMA ) THEN - SPLT = I0 - 1 - QMAX = Z( 4*I0-3 ) - EMIN = Z( 4*I0-1 ) - OLDEMN = Z( 4*I0 ) - DO 130 I4 = 4*I0, 4*( N0-3 ), 4 - IF( Z( I4 ).LE.TOL2*Z( I4-3 ) .OR. - $ Z( I4-1 ).LE.TOL2*SIGMA ) THEN - Z( I4-1 ) = -SIGMA - SPLT = I4 / 4 - QMAX = ZERO - EMIN = Z( I4+3 ) - OLDEMN = Z( I4+4 ) - ELSE - QMAX = MAX( QMAX, Z( I4+1 ) ) - EMIN = MIN( EMIN, Z( I4-1 ) ) - OLDEMN = MIN( OLDEMN, Z( I4 ) ) - END IF - 130 CONTINUE - Z( 4*N0-1 ) = EMIN - Z( 4*N0 ) = OLDEMN - I0 = SPLT + 1 - END IF - END IF -* - 140 CONTINUE -* - INFO = 2 -* -* Maximum number of iterations exceeded, restore the shift -* SIGMA and place the new d's and e's in a qd array. -* This might need to be done for several blocks -* - I1 = I0 - N1 = N0 - 145 CONTINUE - TEMPQ = Z( 4*I0-3 ) - Z( 4*I0-3 ) = Z( 4*I0-3 ) + SIGMA - DO K = I0+1, N0 - TEMPE = Z( 4*K-5 ) - Z( 4*K-5 ) = Z( 4*K-5 ) * (TEMPQ / Z( 4*K-7 )) - TEMPQ = Z( 4*K-3 ) - Z( 4*K-3 ) = Z( 4*K-3 ) + SIGMA + TEMPE - Z( 4*K-5 ) - END DO -* -* Prepare to do this on the previous block if there is one -* - IF( I1.GT.1 ) THEN - N1 = I1-1 - DO WHILE( ( I1.GE.2 ) .AND. ( Z(4*I1-5).GE.ZERO ) ) - I1 = I1 - 1 - END DO - SIGMA = -Z(4*N1-1) - GO TO 145 - END IF - - DO K = 1, N - Z( 2*K-1 ) = Z( 4*K-3 ) -* -* Only the block 1..N0 is unfinished. The rest of the e's -* must be essentially zero, although sometimes other data -* has been stored in them. -* - IF( K.LT.N0 ) THEN - Z( 2*K ) = Z( 4*K-1 ) - ELSE - Z( 2*K ) = 0 - END IF - END DO - RETURN -* -* end IWHILB -* - 150 CONTINUE -* - 160 CONTINUE -* - INFO = 3 - RETURN -* -* end IWHILA -* - 170 CONTINUE -* -* Move q's to the front. -* - DO 180 K = 2, N - Z( K ) = Z( 4*K-3 ) - 180 CONTINUE -* -* Sort and compute sum of eigenvalues. -* - CALL DLASRT( 'D', N, Z, IINFO ) -* - E = ZERO - DO 190 K = N, 1, -1 - E = E + Z( K ) - 190 CONTINUE -* -* Store trace, sum(eigenvalues) and information on performance. -* - Z( 2*N+1 ) = TRACE - Z( 2*N+2 ) = E - Z( 2*N+3 ) = DBLE( ITER ) - Z( 2*N+4 ) = DBLE( NDIV ) / DBLE( N**2 ) - Z( 2*N+5 ) = HUNDRD*NFAIL / DBLE( ITER ) - RETURN -* -* End of DLASQ2 -* - END diff --git a/lib/linalg/fortran/dlasq3.f b/lib/linalg/fortran/dlasq3.f deleted file mode 100644 index e4bdafe06e..0000000000 --- a/lib/linalg/fortran/dlasq3.f +++ /dev/null @@ -1,418 +0,0 @@ -*> \brief \b DLASQ3 checks for deflation, computes a shift and calls dqds. Used by sbdsqr. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASQ3 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASQ3( I0, N0, Z, PP, DMIN, SIGMA, DESIG, QMAX, NFAIL, -* ITER, NDIV, IEEE, TTYPE, DMIN1, DMIN2, DN, DN1, -* DN2, G, TAU ) -* -* .. Scalar Arguments .. -* LOGICAL IEEE -* INTEGER I0, ITER, N0, NDIV, NFAIL, PP -* DOUBLE PRECISION DESIG, DMIN, DMIN1, DMIN2, DN, DN1, DN2, G, -* $ QMAX, SIGMA, TAU -* .. -* .. Array Arguments .. -* DOUBLE PRECISION Z( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASQ3 checks for deflation, computes a shift (TAU) and calls dqds. -*> In case of failure it changes shifts, and tries again until output -*> is positive. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] I0 -*> \verbatim -*> I0 is INTEGER -*> First index. -*> \endverbatim -*> -*> \param[in,out] N0 -*> \verbatim -*> N0 is INTEGER -*> Last index. -*> \endverbatim -*> -*> \param[in,out] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension ( 4*N0 ) -*> Z holds the qd array. -*> \endverbatim -*> -*> \param[in,out] PP -*> \verbatim -*> PP is INTEGER -*> PP=0 for ping, PP=1 for pong. -*> PP=2 indicates that flipping was applied to the Z array -*> and that the initial tests for deflation should not be -*> performed. -*> \endverbatim -*> -*> \param[out] DMIN -*> \verbatim -*> DMIN is DOUBLE PRECISION -*> Minimum value of d. -*> \endverbatim -*> -*> \param[out] SIGMA -*> \verbatim -*> SIGMA is DOUBLE PRECISION -*> Sum of shifts used in current segment. -*> \endverbatim -*> -*> \param[in,out] DESIG -*> \verbatim -*> DESIG is DOUBLE PRECISION -*> Lower order part of SIGMA -*> \endverbatim -*> -*> \param[in] QMAX -*> \verbatim -*> QMAX is DOUBLE PRECISION -*> Maximum value of q. -*> \endverbatim -*> -*> \param[in,out] NFAIL -*> \verbatim -*> NFAIL is INTEGER -*> Increment NFAIL by 1 each time the shift was too big. -*> \endverbatim -*> -*> \param[in,out] ITER -*> \verbatim -*> ITER is INTEGER -*> Increment ITER by 1 for each iteration. -*> \endverbatim -*> -*> \param[in,out] NDIV -*> \verbatim -*> NDIV is INTEGER -*> Increment NDIV by 1 for each division. -*> \endverbatim -*> -*> \param[in] IEEE -*> \verbatim -*> IEEE is LOGICAL -*> Flag for IEEE or non IEEE arithmetic (passed to DLASQ5). -*> \endverbatim -*> -*> \param[in,out] TTYPE -*> \verbatim -*> TTYPE is INTEGER -*> Shift type. -*> \endverbatim -*> -*> \param[in,out] DMIN1 -*> \verbatim -*> DMIN1 is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in,out] DMIN2 -*> \verbatim -*> DMIN2 is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in,out] DN -*> \verbatim -*> DN is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in,out] DN1 -*> \verbatim -*> DN1 is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in,out] DN2 -*> \verbatim -*> DN2 is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in,out] G -*> \verbatim -*> G is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in,out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION -*> -*> These are passed as arguments in order to save their values -*> between calls to DLASQ3. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -* ===================================================================== - SUBROUTINE DLASQ3( I0, N0, Z, PP, DMIN, SIGMA, DESIG, QMAX, NFAIL, - $ ITER, NDIV, IEEE, TTYPE, DMIN1, DMIN2, DN, DN1, - $ DN2, G, TAU ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - LOGICAL IEEE - INTEGER I0, ITER, N0, NDIV, NFAIL, PP - DOUBLE PRECISION DESIG, DMIN, DMIN1, DMIN2, DN, DN1, DN2, G, - $ QMAX, SIGMA, TAU -* .. -* .. Array Arguments .. - DOUBLE PRECISION Z( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION CBIAS - PARAMETER ( CBIAS = 1.50D0 ) - DOUBLE PRECISION ZERO, QURTR, HALF, ONE, TWO, HUNDRD - PARAMETER ( ZERO = 0.0D0, QURTR = 0.250D0, HALF = 0.5D0, - $ ONE = 1.0D0, TWO = 2.0D0, HUNDRD = 100.0D0 ) -* .. -* .. Local Scalars .. - INTEGER IPN4, J4, N0IN, NN, TTYPE - DOUBLE PRECISION EPS, S, T, TEMP, TOL, TOL2 -* .. -* .. External Subroutines .. - EXTERNAL DLASQ4, DLASQ5, DLASQ6 -* .. -* .. External Function .. - DOUBLE PRECISION DLAMCH - LOGICAL DISNAN - EXTERNAL DISNAN, DLAMCH -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* - N0IN = N0 - EPS = DLAMCH( 'Precision' ) - TOL = EPS*HUNDRD - TOL2 = TOL**2 -* -* Check for deflation. -* - 10 CONTINUE -* - IF( N0.LT.I0 ) - $ RETURN - IF( N0.EQ.I0 ) - $ GO TO 20 - NN = 4*N0 + PP - IF( N0.EQ.( I0+1 ) ) - $ GO TO 40 -* -* Check whether E(N0-1) is negligible, 1 eigenvalue. -* - IF( Z( NN-5 ).GT.TOL2*( SIGMA+Z( NN-3 ) ) .AND. - $ Z( NN-2*PP-4 ).GT.TOL2*Z( NN-7 ) ) - $ GO TO 30 -* - 20 CONTINUE -* - Z( 4*N0-3 ) = Z( 4*N0+PP-3 ) + SIGMA - N0 = N0 - 1 - GO TO 10 -* -* Check whether E(N0-2) is negligible, 2 eigenvalues. -* - 30 CONTINUE -* - IF( Z( NN-9 ).GT.TOL2*SIGMA .AND. - $ Z( NN-2*PP-8 ).GT.TOL2*Z( NN-11 ) ) - $ GO TO 50 -* - 40 CONTINUE -* - IF( Z( NN-3 ).GT.Z( NN-7 ) ) THEN - S = Z( NN-3 ) - Z( NN-3 ) = Z( NN-7 ) - Z( NN-7 ) = S - END IF - T = HALF*( ( Z( NN-7 )-Z( NN-3 ) )+Z( NN-5 ) ) - IF( Z( NN-5 ).GT.Z( NN-3 )*TOL2.AND.T.NE.ZERO ) THEN - S = Z( NN-3 )*( Z( NN-5 ) / T ) - IF( S.LE.T ) THEN - S = Z( NN-3 )*( Z( NN-5 ) / - $ ( T*( ONE+SQRT( ONE+S / T ) ) ) ) - ELSE - S = Z( NN-3 )*( Z( NN-5 ) / ( T+SQRT( T )*SQRT( T+S ) ) ) - END IF - T = Z( NN-7 ) + ( S+Z( NN-5 ) ) - Z( NN-3 ) = Z( NN-3 )*( Z( NN-7 ) / T ) - Z( NN-7 ) = T - END IF - Z( 4*N0-7 ) = Z( NN-7 ) + SIGMA - Z( 4*N0-3 ) = Z( NN-3 ) + SIGMA - N0 = N0 - 2 - GO TO 10 -* - 50 CONTINUE - IF( PP.EQ.2 ) - $ PP = 0 -* -* Reverse the qd-array, if warranted. -* - IF( DMIN.LE.ZERO .OR. N0.LT.N0IN ) THEN - IF( CBIAS*Z( 4*I0+PP-3 ).LT.Z( 4*N0+PP-3 ) ) THEN - IPN4 = 4*( I0+N0 ) - DO 60 J4 = 4*I0, 2*( I0+N0-1 ), 4 - TEMP = Z( J4-3 ) - Z( J4-3 ) = Z( IPN4-J4-3 ) - Z( IPN4-J4-3 ) = TEMP - TEMP = Z( J4-2 ) - Z( J4-2 ) = Z( IPN4-J4-2 ) - Z( IPN4-J4-2 ) = TEMP - TEMP = Z( J4-1 ) - Z( J4-1 ) = Z( IPN4-J4-5 ) - Z( IPN4-J4-5 ) = TEMP - TEMP = Z( J4 ) - Z( J4 ) = Z( IPN4-J4-4 ) - Z( IPN4-J4-4 ) = TEMP - 60 CONTINUE - IF( N0-I0.LE.4 ) THEN - Z( 4*N0+PP-1 ) = Z( 4*I0+PP-1 ) - Z( 4*N0-PP ) = Z( 4*I0-PP ) - END IF - DMIN2 = MIN( DMIN2, Z( 4*N0+PP-1 ) ) - Z( 4*N0+PP-1 ) = MIN( Z( 4*N0+PP-1 ), Z( 4*I0+PP-1 ), - $ Z( 4*I0+PP+3 ) ) - Z( 4*N0-PP ) = MIN( Z( 4*N0-PP ), Z( 4*I0-PP ), - $ Z( 4*I0-PP+4 ) ) - QMAX = MAX( QMAX, Z( 4*I0+PP-3 ), Z( 4*I0+PP+1 ) ) - DMIN = -ZERO - END IF - END IF -* -* Choose a shift. -* - CALL DLASQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN, DN1, - $ DN2, TAU, TTYPE, G ) -* -* Call dqds until DMIN > 0. -* - 70 CONTINUE -* - CALL DLASQ5( I0, N0, Z, PP, TAU, SIGMA, DMIN, DMIN1, DMIN2, DN, - $ DN1, DN2, IEEE, EPS ) -* - NDIV = NDIV + ( N0-I0+2 ) - ITER = ITER + 1 -* -* Check status. -* - IF( DMIN.GE.ZERO .AND. DMIN1.GE.ZERO ) THEN -* -* Success. -* - GO TO 90 -* - ELSE IF( DMIN.LT.ZERO .AND. DMIN1.GT.ZERO .AND. - $ Z( 4*( N0-1 )-PP ).LT.TOL*( SIGMA+DN1 ) .AND. - $ ABS( DN ).LT.TOL*SIGMA ) THEN -* -* Convergence hidden by negative DN. -* - Z( 4*( N0-1 )-PP+2 ) = ZERO - DMIN = ZERO - GO TO 90 - ELSE IF( DMIN.LT.ZERO ) THEN -* -* TAU too big. Select new TAU and try again. -* - NFAIL = NFAIL + 1 - IF( TTYPE.LT.-22 ) THEN -* -* Failed twice. Play it safe. -* - TAU = ZERO - ELSE IF( DMIN1.GT.ZERO ) THEN -* -* Late failure. Gives excellent shift. -* - TAU = ( TAU+DMIN )*( ONE-TWO*EPS ) - TTYPE = TTYPE - 11 - ELSE -* -* Early failure. Divide by 4. -* - TAU = QURTR*TAU - TTYPE = TTYPE - 12 - END IF - GO TO 70 - ELSE IF( DISNAN( DMIN ) ) THEN -* -* NaN. -* - IF( TAU.EQ.ZERO ) THEN - GO TO 80 - ELSE - TAU = ZERO - GO TO 70 - END IF - ELSE -* -* Possible underflow. Play it safe. -* - GO TO 80 - END IF -* -* Risk of underflow. -* - 80 CONTINUE - CALL DLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN, DN1, DN2 ) - NDIV = NDIV + ( N0-I0+2 ) - ITER = ITER + 1 - TAU = ZERO -* - 90 CONTINUE - IF( TAU.LT.SIGMA ) THEN - DESIG = DESIG + TAU - T = SIGMA + DESIG - DESIG = DESIG - ( T-SIGMA ) - ELSE - T = SIGMA + TAU - DESIG = SIGMA - ( T-TAU ) + DESIG - END IF - SIGMA = T -* - RETURN -* -* End of DLASQ3 -* - END diff --git a/lib/linalg/fortran/dlasq4.f b/lib/linalg/fortran/dlasq4.f deleted file mode 100644 index 2652ddb2ba..0000000000 --- a/lib/linalg/fortran/dlasq4.f +++ /dev/null @@ -1,421 +0,0 @@ -*> \brief \b DLASQ4 computes an approximation to the smallest eigenvalue using values of d from the previous transform. Used by sbdsqr. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASQ4 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN, -* DN1, DN2, TAU, TTYPE, G ) -* -* .. Scalar Arguments .. -* INTEGER I0, N0, N0IN, PP, TTYPE -* DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DN1, DN2, G, TAU -* .. -* .. Array Arguments .. -* DOUBLE PRECISION Z( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASQ4 computes an approximation TAU to the smallest eigenvalue -*> using values of d from the previous transform. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] I0 -*> \verbatim -*> I0 is INTEGER -*> First index. -*> \endverbatim -*> -*> \param[in] N0 -*> \verbatim -*> N0 is INTEGER -*> Last index. -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension ( 4*N0 ) -*> Z holds the qd array. -*> \endverbatim -*> -*> \param[in] PP -*> \verbatim -*> PP is INTEGER -*> PP=0 for ping, PP=1 for pong. -*> \endverbatim -*> -*> \param[in] N0IN -*> \verbatim -*> N0IN is INTEGER -*> The value of N0 at start of EIGTEST. -*> \endverbatim -*> -*> \param[in] DMIN -*> \verbatim -*> DMIN is DOUBLE PRECISION -*> Minimum value of d. -*> \endverbatim -*> -*> \param[in] DMIN1 -*> \verbatim -*> DMIN1 is DOUBLE PRECISION -*> Minimum value of d, excluding D( N0 ). -*> \endverbatim -*> -*> \param[in] DMIN2 -*> \verbatim -*> DMIN2 is DOUBLE PRECISION -*> Minimum value of d, excluding D( N0 ) and D( N0-1 ). -*> \endverbatim -*> -*> \param[in] DN -*> \verbatim -*> DN is DOUBLE PRECISION -*> d(N) -*> \endverbatim -*> -*> \param[in] DN1 -*> \verbatim -*> DN1 is DOUBLE PRECISION -*> d(N-1) -*> \endverbatim -*> -*> \param[in] DN2 -*> \verbatim -*> DN2 is DOUBLE PRECISION -*> d(N-2) -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION -*> This is the shift. -*> \endverbatim -*> -*> \param[out] TTYPE -*> \verbatim -*> TTYPE is INTEGER -*> Shift type. -*> \endverbatim -*> -*> \param[in,out] G -*> \verbatim -*> G is DOUBLE PRECISION -*> G is passed as an argument in order to save its value between -*> calls to DLASQ4. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> CNST1 = 9/16 -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLASQ4( I0, N0, Z, PP, N0IN, DMIN, DMIN1, DMIN2, DN, - $ DN1, DN2, TAU, TTYPE, G ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER I0, N0, N0IN, PP, TTYPE - DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DN1, DN2, G, TAU -* .. -* .. Array Arguments .. - DOUBLE PRECISION Z( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION CNST1, CNST2, CNST3 - PARAMETER ( CNST1 = 0.5630D0, CNST2 = 1.010D0, - $ CNST3 = 1.050D0 ) - DOUBLE PRECISION QURTR, THIRD, HALF, ZERO, ONE, TWO, HUNDRD - PARAMETER ( QURTR = 0.250D0, THIRD = 0.3330D0, - $ HALF = 0.50D0, ZERO = 0.0D0, ONE = 1.0D0, - $ TWO = 2.0D0, HUNDRD = 100.0D0 ) -* .. -* .. Local Scalars .. - INTEGER I4, NN, NP - DOUBLE PRECISION A2, B1, B2, GAM, GAP1, GAP2, S -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* -* A negative DMIN forces the shift to take that absolute value -* TTYPE records the type of shift. -* - IF( DMIN.LE.ZERO ) THEN - TAU = -DMIN - TTYPE = -1 - RETURN - END IF -* - NN = 4*N0 + PP - IF( N0IN.EQ.N0 ) THEN -* -* No eigenvalues deflated. -* - IF( DMIN.EQ.DN .OR. DMIN.EQ.DN1 ) THEN -* - B1 = SQRT( Z( NN-3 ) )*SQRT( Z( NN-5 ) ) - B2 = SQRT( Z( NN-7 ) )*SQRT( Z( NN-9 ) ) - A2 = Z( NN-7 ) + Z( NN-5 ) -* -* Cases 2 and 3. -* - IF( DMIN.EQ.DN .AND. DMIN1.EQ.DN1 ) THEN - GAP2 = DMIN2 - A2 - DMIN2*QURTR - IF( GAP2.GT.ZERO .AND. GAP2.GT.B2 ) THEN - GAP1 = A2 - DN - ( B2 / GAP2 )*B2 - ELSE - GAP1 = A2 - DN - ( B1+B2 ) - END IF - IF( GAP1.GT.ZERO .AND. GAP1.GT.B1 ) THEN - S = MAX( DN-( B1 / GAP1 )*B1, HALF*DMIN ) - TTYPE = -2 - ELSE - S = ZERO - IF( DN.GT.B1 ) - $ S = DN - B1 - IF( A2.GT.( B1+B2 ) ) - $ S = MIN( S, A2-( B1+B2 ) ) - S = MAX( S, THIRD*DMIN ) - TTYPE = -3 - END IF - ELSE -* -* Case 4. -* - TTYPE = -4 - S = QURTR*DMIN - IF( DMIN.EQ.DN ) THEN - GAM = DN - A2 = ZERO - IF( Z( NN-5 ) .GT. Z( NN-7 ) ) - $ RETURN - B2 = Z( NN-5 ) / Z( NN-7 ) - NP = NN - 9 - ELSE - NP = NN - 2*PP - GAM = DN1 - IF( Z( NP-4 ) .GT. Z( NP-2 ) ) - $ RETURN - A2 = Z( NP-4 ) / Z( NP-2 ) - IF( Z( NN-9 ) .GT. Z( NN-11 ) ) - $ RETURN - B2 = Z( NN-9 ) / Z( NN-11 ) - NP = NN - 13 - END IF -* -* Approximate contribution to norm squared from I < NN-1. -* - A2 = A2 + B2 - DO 10 I4 = NP, 4*I0 - 1 + PP, -4 - IF( B2.EQ.ZERO ) - $ GO TO 20 - B1 = B2 - IF( Z( I4 ) .GT. Z( I4-2 ) ) - $ RETURN - B2 = B2*( Z( I4 ) / Z( I4-2 ) ) - A2 = A2 + B2 - IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) - $ GO TO 20 - 10 CONTINUE - 20 CONTINUE - A2 = CNST3*A2 -* -* Rayleigh quotient residual bound. -* - IF( A2.LT.CNST1 ) - $ S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 ) - END IF - ELSE IF( DMIN.EQ.DN2 ) THEN -* -* Case 5. -* - TTYPE = -5 - S = QURTR*DMIN -* -* Compute contribution to norm squared from I > NN-2. -* - NP = NN - 2*PP - B1 = Z( NP-2 ) - B2 = Z( NP-6 ) - GAM = DN2 - IF( Z( NP-8 ).GT.B2 .OR. Z( NP-4 ).GT.B1 ) - $ RETURN - A2 = ( Z( NP-8 ) / B2 )*( ONE+Z( NP-4 ) / B1 ) -* -* Approximate contribution to norm squared from I < NN-2. -* - IF( N0-I0.GT.2 ) THEN - B2 = Z( NN-13 ) / Z( NN-15 ) - A2 = A2 + B2 - DO 30 I4 = NN - 17, 4*I0 - 1 + PP, -4 - IF( B2.EQ.ZERO ) - $ GO TO 40 - B1 = B2 - IF( Z( I4 ) .GT. Z( I4-2 ) ) - $ RETURN - B2 = B2*( Z( I4 ) / Z( I4-2 ) ) - A2 = A2 + B2 - IF( HUNDRD*MAX( B2, B1 ).LT.A2 .OR. CNST1.LT.A2 ) - $ GO TO 40 - 30 CONTINUE - 40 CONTINUE - A2 = CNST3*A2 - END IF -* - IF( A2.LT.CNST1 ) - $ S = GAM*( ONE-SQRT( A2 ) ) / ( ONE+A2 ) - ELSE -* -* Case 6, no information to guide us. -* - IF( TTYPE.EQ.-6 ) THEN - G = G + THIRD*( ONE-G ) - ELSE IF( TTYPE.EQ.-18 ) THEN - G = QURTR*THIRD - ELSE - G = QURTR - END IF - S = G*DMIN - TTYPE = -6 - END IF -* - ELSE IF( N0IN.EQ.( N0+1 ) ) THEN -* -* One eigenvalue just deflated. Use DMIN1, DN1 for DMIN and DN. -* - IF( DMIN1.EQ.DN1 .AND. DMIN2.EQ.DN2 ) THEN -* -* Cases 7 and 8. -* - TTYPE = -7 - S = THIRD*DMIN1 - IF( Z( NN-5 ).GT.Z( NN-7 ) ) - $ RETURN - B1 = Z( NN-5 ) / Z( NN-7 ) - B2 = B1 - IF( B2.EQ.ZERO ) - $ GO TO 60 - DO 50 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4 - A2 = B1 - IF( Z( I4 ).GT.Z( I4-2 ) ) - $ RETURN - B1 = B1*( Z( I4 ) / Z( I4-2 ) ) - B2 = B2 + B1 - IF( HUNDRD*MAX( B1, A2 ).LT.B2 ) - $ GO TO 60 - 50 CONTINUE - 60 CONTINUE - B2 = SQRT( CNST3*B2 ) - A2 = DMIN1 / ( ONE+B2**2 ) - GAP2 = HALF*DMIN2 - A2 - IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN - S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) ) - ELSE - S = MAX( S, A2*( ONE-CNST2*B2 ) ) - TTYPE = -8 - END IF - ELSE -* -* Case 9. -* - S = QURTR*DMIN1 - IF( DMIN1.EQ.DN1 ) - $ S = HALF*DMIN1 - TTYPE = -9 - END IF -* - ELSE IF( N0IN.EQ.( N0+2 ) ) THEN -* -* Two eigenvalues deflated. Use DMIN2, DN2 for DMIN and DN. -* -* Cases 10 and 11. -* - IF( DMIN2.EQ.DN2 .AND. TWO*Z( NN-5 ).LT.Z( NN-7 ) ) THEN - TTYPE = -10 - S = THIRD*DMIN2 - IF( Z( NN-5 ).GT.Z( NN-7 ) ) - $ RETURN - B1 = Z( NN-5 ) / Z( NN-7 ) - B2 = B1 - IF( B2.EQ.ZERO ) - $ GO TO 80 - DO 70 I4 = 4*N0 - 9 + PP, 4*I0 - 1 + PP, -4 - IF( Z( I4 ).GT.Z( I4-2 ) ) - $ RETURN - B1 = B1*( Z( I4 ) / Z( I4-2 ) ) - B2 = B2 + B1 - IF( HUNDRD*B1.LT.B2 ) - $ GO TO 80 - 70 CONTINUE - 80 CONTINUE - B2 = SQRT( CNST3*B2 ) - A2 = DMIN2 / ( ONE+B2**2 ) - GAP2 = Z( NN-7 ) + Z( NN-9 ) - - $ SQRT( Z( NN-11 ) )*SQRT( Z( NN-9 ) ) - A2 - IF( GAP2.GT.ZERO .AND. GAP2.GT.B2*A2 ) THEN - S = MAX( S, A2*( ONE-CNST2*A2*( B2 / GAP2 )*B2 ) ) - ELSE - S = MAX( S, A2*( ONE-CNST2*B2 ) ) - END IF - ELSE - S = QURTR*DMIN2 - TTYPE = -11 - END IF - ELSE IF( N0IN.GT.( N0+2 ) ) THEN -* -* Case 12, more than two eigenvalues deflated. No information. -* - S = ZERO - TTYPE = -12 - END IF -* - TAU = S - RETURN -* -* End of DLASQ4 -* - END diff --git a/lib/linalg/fortran/dlasq5.f b/lib/linalg/fortran/dlasq5.f deleted file mode 100644 index 5679ab60a5..0000000000 --- a/lib/linalg/fortran/dlasq5.f +++ /dev/null @@ -1,407 +0,0 @@ -*> \brief \b DLASQ5 computes one dqds transform in ping-pong form. Used by sbdsqr and sstegr. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASQ5 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, SIGMA, DMIN, DMIN1, DMIN2, DN, -* DNM1, DNM2, IEEE, EPS ) -* -* .. Scalar Arguments .. -* LOGICAL IEEE -* INTEGER I0, N0, PP -* DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU, SIGMA, EPS -* .. -* .. Array Arguments .. -* DOUBLE PRECISION Z( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASQ5 computes one dqds transform in ping-pong form, one -*> version for IEEE machines another for non IEEE machines. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] I0 -*> \verbatim -*> I0 is INTEGER -*> First index. -*> \endverbatim -*> -*> \param[in] N0 -*> \verbatim -*> N0 is INTEGER -*> Last index. -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension ( 4*N ) -*> Z holds the qd array. EMIN is stored in Z(4*N0) to avoid -*> an extra argument. -*> \endverbatim -*> -*> \param[in] PP -*> \verbatim -*> PP is INTEGER -*> PP=0 for ping, PP=1 for pong. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION -*> This is the shift. -*> \endverbatim -*> -*> \param[in] SIGMA -*> \verbatim -*> SIGMA is DOUBLE PRECISION -*> This is the accumulated shift up to this step. -*> \endverbatim -*> -*> \param[out] DMIN -*> \verbatim -*> DMIN is DOUBLE PRECISION -*> Minimum value of d. -*> \endverbatim -*> -*> \param[out] DMIN1 -*> \verbatim -*> DMIN1 is DOUBLE PRECISION -*> Minimum value of d, excluding D( N0 ). -*> \endverbatim -*> -*> \param[out] DMIN2 -*> \verbatim -*> DMIN2 is DOUBLE PRECISION -*> Minimum value of d, excluding D( N0 ) and D( N0-1 ). -*> \endverbatim -*> -*> \param[out] DN -*> \verbatim -*> DN is DOUBLE PRECISION -*> d(N0), the last value of d. -*> \endverbatim -*> -*> \param[out] DNM1 -*> \verbatim -*> DNM1 is DOUBLE PRECISION -*> d(N0-1). -*> \endverbatim -*> -*> \param[out] DNM2 -*> \verbatim -*> DNM2 is DOUBLE PRECISION -*> d(N0-2). -*> \endverbatim -*> -*> \param[in] IEEE -*> \verbatim -*> IEEE is LOGICAL -*> Flag for IEEE or non IEEE arithmetic. -*> \endverbatim -*> -*> \param[in] EPS -*> \verbatim -*> EPS is DOUBLE PRECISION -*> This is the value of epsilon used. -*> \endverbatim -*> -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -* ===================================================================== - SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, SIGMA, DMIN, DMIN1, DMIN2, - $ DN, DNM1, DNM2, IEEE, EPS ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - LOGICAL IEEE - INTEGER I0, N0, PP - DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU, - $ SIGMA, EPS -* .. -* .. Array Arguments .. - DOUBLE PRECISION Z( * ) -* .. -* -* ===================================================================== -* -* .. Parameter .. - DOUBLE PRECISION ZERO, HALF - PARAMETER ( ZERO = 0.0D0, HALF = 0.5 ) -* .. -* .. Local Scalars .. - INTEGER J4, J4P2 - DOUBLE PRECISION D, EMIN, TEMP, DTHRESH -* .. -* .. Intrinsic Functions .. - INTRINSIC MIN -* .. -* .. Executable Statements .. -* - IF( ( N0-I0-1 ).LE.0 ) - $ RETURN -* - DTHRESH = EPS*(SIGMA+TAU) - IF( TAU.LT.DTHRESH*HALF ) TAU = ZERO - IF( TAU.NE.ZERO ) THEN - J4 = 4*I0 + PP - 3 - EMIN = Z( J4+4 ) - D = Z( J4 ) - TAU - DMIN = D - DMIN1 = -Z( J4 ) -* - IF( IEEE ) THEN -* -* Code for IEEE arithmetic. -* - IF( PP.EQ.0 ) THEN - DO 10 J4 = 4*I0, 4*( N0-3 ), 4 - Z( J4-2 ) = D + Z( J4-1 ) - TEMP = Z( J4+1 ) / Z( J4-2 ) - D = D*TEMP - TAU - DMIN = MIN( DMIN, D ) - Z( J4 ) = Z( J4-1 )*TEMP - EMIN = MIN( Z( J4 ), EMIN ) - 10 CONTINUE - ELSE - DO 20 J4 = 4*I0, 4*( N0-3 ), 4 - Z( J4-3 ) = D + Z( J4 ) - TEMP = Z( J4+2 ) / Z( J4-3 ) - D = D*TEMP - TAU - DMIN = MIN( DMIN, D ) - Z( J4-1 ) = Z( J4 )*TEMP - EMIN = MIN( Z( J4-1 ), EMIN ) - 20 CONTINUE - END IF -* -* Unroll last two steps. -* - DNM2 = D - DMIN2 = DMIN - J4 = 4*( N0-2 ) - PP - J4P2 = J4 + 2*PP - 1 - Z( J4-2 ) = DNM2 + Z( J4P2 ) - Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) ) - DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU - DMIN = MIN( DMIN, DNM1 ) -* - DMIN1 = DMIN - J4 = J4 + 4 - J4P2 = J4 + 2*PP - 1 - Z( J4-2 ) = DNM1 + Z( J4P2 ) - Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) ) - DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU - DMIN = MIN( DMIN, DN ) -* - ELSE -* -* Code for non IEEE arithmetic. -* - IF( PP.EQ.0 ) THEN - DO 30 J4 = 4*I0, 4*( N0-3 ), 4 - Z( J4-2 ) = D + Z( J4-1 ) - IF( D.LT.ZERO ) THEN - RETURN - ELSE - Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) ) - D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU - END IF - DMIN = MIN( DMIN, D ) - EMIN = MIN( EMIN, Z( J4 ) ) - 30 CONTINUE - ELSE - DO 40 J4 = 4*I0, 4*( N0-3 ), 4 - Z( J4-3 ) = D + Z( J4 ) - IF( D.LT.ZERO ) THEN - RETURN - ELSE - Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) ) - D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU - END IF - DMIN = MIN( DMIN, D ) - EMIN = MIN( EMIN, Z( J4-1 ) ) - 40 CONTINUE - END IF -* -* Unroll last two steps. -* - DNM2 = D - DMIN2 = DMIN - J4 = 4*( N0-2 ) - PP - J4P2 = J4 + 2*PP - 1 - Z( J4-2 ) = DNM2 + Z( J4P2 ) - IF( DNM2.LT.ZERO ) THEN - RETURN - ELSE - Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) ) - DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU - END IF - DMIN = MIN( DMIN, DNM1 ) -* - DMIN1 = DMIN - J4 = J4 + 4 - J4P2 = J4 + 2*PP - 1 - Z( J4-2 ) = DNM1 + Z( J4P2 ) - IF( DNM1.LT.ZERO ) THEN - RETURN - ELSE - Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) ) - DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU - END IF - DMIN = MIN( DMIN, DN ) -* - END IF - ELSE -* This is the version that sets d's to zero if they are small enough - J4 = 4*I0 + PP - 3 - EMIN = Z( J4+4 ) - D = Z( J4 ) - TAU - DMIN = D - DMIN1 = -Z( J4 ) - IF( IEEE ) THEN -* -* Code for IEEE arithmetic. -* - IF( PP.EQ.0 ) THEN - DO 50 J4 = 4*I0, 4*( N0-3 ), 4 - Z( J4-2 ) = D + Z( J4-1 ) - TEMP = Z( J4+1 ) / Z( J4-2 ) - D = D*TEMP - TAU - IF( D.LT.DTHRESH ) D = ZERO - DMIN = MIN( DMIN, D ) - Z( J4 ) = Z( J4-1 )*TEMP - EMIN = MIN( Z( J4 ), EMIN ) - 50 CONTINUE - ELSE - DO 60 J4 = 4*I0, 4*( N0-3 ), 4 - Z( J4-3 ) = D + Z( J4 ) - TEMP = Z( J4+2 ) / Z( J4-3 ) - D = D*TEMP - TAU - IF( D.LT.DTHRESH ) D = ZERO - DMIN = MIN( DMIN, D ) - Z( J4-1 ) = Z( J4 )*TEMP - EMIN = MIN( Z( J4-1 ), EMIN ) - 60 CONTINUE - END IF -* -* Unroll last two steps. -* - DNM2 = D - DMIN2 = DMIN - J4 = 4*( N0-2 ) - PP - J4P2 = J4 + 2*PP - 1 - Z( J4-2 ) = DNM2 + Z( J4P2 ) - Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) ) - DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU - DMIN = MIN( DMIN, DNM1 ) -* - DMIN1 = DMIN - J4 = J4 + 4 - J4P2 = J4 + 2*PP - 1 - Z( J4-2 ) = DNM1 + Z( J4P2 ) - Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) ) - DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU - DMIN = MIN( DMIN, DN ) -* - ELSE -* -* Code for non IEEE arithmetic. -* - IF( PP.EQ.0 ) THEN - DO 70 J4 = 4*I0, 4*( N0-3 ), 4 - Z( J4-2 ) = D + Z( J4-1 ) - IF( D.LT.ZERO ) THEN - RETURN - ELSE - Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) ) - D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU - END IF - IF( D.LT.DTHRESH) D = ZERO - DMIN = MIN( DMIN, D ) - EMIN = MIN( EMIN, Z( J4 ) ) - 70 CONTINUE - ELSE - DO 80 J4 = 4*I0, 4*( N0-3 ), 4 - Z( J4-3 ) = D + Z( J4 ) - IF( D.LT.ZERO ) THEN - RETURN - ELSE - Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) ) - D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU - END IF - IF( D.LT.DTHRESH) D = ZERO - DMIN = MIN( DMIN, D ) - EMIN = MIN( EMIN, Z( J4-1 ) ) - 80 CONTINUE - END IF -* -* Unroll last two steps. -* - DNM2 = D - DMIN2 = DMIN - J4 = 4*( N0-2 ) - PP - J4P2 = J4 + 2*PP - 1 - Z( J4-2 ) = DNM2 + Z( J4P2 ) - IF( DNM2.LT.ZERO ) THEN - RETURN - ELSE - Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) ) - DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU - END IF - DMIN = MIN( DMIN, DNM1 ) -* - DMIN1 = DMIN - J4 = J4 + 4 - J4P2 = J4 + 2*PP - 1 - Z( J4-2 ) = DNM1 + Z( J4P2 ) - IF( DNM1.LT.ZERO ) THEN - RETURN - ELSE - Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) ) - DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU - END IF - DMIN = MIN( DMIN, DN ) -* - END IF - END IF -* - Z( J4+2 ) = DN - Z( 4*N0-PP ) = EMIN - RETURN -* -* End of DLASQ5 -* - END diff --git a/lib/linalg/fortran/dlasq6.f b/lib/linalg/fortran/dlasq6.f deleted file mode 100644 index 9218b5060e..0000000000 --- a/lib/linalg/fortran/dlasq6.f +++ /dev/null @@ -1,251 +0,0 @@ -*> \brief \b DLASQ6 computes one dqd transform in ping-pong form. Used by sbdsqr and sstegr. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASQ6 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN, -* DNM1, DNM2 ) -* -* .. Scalar Arguments .. -* INTEGER I0, N0, PP -* DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2 -* .. -* .. Array Arguments .. -* DOUBLE PRECISION Z( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASQ6 computes one dqd (shift equal to zero) transform in -*> ping-pong form, with protection against underflow and overflow. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] I0 -*> \verbatim -*> I0 is INTEGER -*> First index. -*> \endverbatim -*> -*> \param[in] N0 -*> \verbatim -*> N0 is INTEGER -*> Last index. -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension ( 4*N ) -*> Z holds the qd array. EMIN is stored in Z(4*N0) to avoid -*> an extra argument. -*> \endverbatim -*> -*> \param[in] PP -*> \verbatim -*> PP is INTEGER -*> PP=0 for ping, PP=1 for pong. -*> \endverbatim -*> -*> \param[out] DMIN -*> \verbatim -*> DMIN is DOUBLE PRECISION -*> Minimum value of d. -*> \endverbatim -*> -*> \param[out] DMIN1 -*> \verbatim -*> DMIN1 is DOUBLE PRECISION -*> Minimum value of d, excluding D( N0 ). -*> \endverbatim -*> -*> \param[out] DMIN2 -*> \verbatim -*> DMIN2 is DOUBLE PRECISION -*> Minimum value of d, excluding D( N0 ) and D( N0-1 ). -*> \endverbatim -*> -*> \param[out] DN -*> \verbatim -*> DN is DOUBLE PRECISION -*> d(N0), the last value of d. -*> \endverbatim -*> -*> \param[out] DNM1 -*> \verbatim -*> DNM1 is DOUBLE PRECISION -*> d(N0-1). -*> \endverbatim -*> -*> \param[out] DNM2 -*> \verbatim -*> DNM2 is DOUBLE PRECISION -*> d(N0-2). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -* ===================================================================== - SUBROUTINE DLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN, - $ DNM1, DNM2 ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER I0, N0, PP - DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2 -* .. -* .. Array Arguments .. - DOUBLE PRECISION Z( * ) -* .. -* -* ===================================================================== -* -* .. Parameter .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) -* .. -* .. Local Scalars .. - INTEGER J4, J4P2 - DOUBLE PRECISION D, EMIN, SAFMIN, TEMP -* .. -* .. External Function .. - DOUBLE PRECISION DLAMCH - EXTERNAL DLAMCH -* .. -* .. Intrinsic Functions .. - INTRINSIC MIN -* .. -* .. Executable Statements .. -* - IF( ( N0-I0-1 ).LE.0 ) - $ RETURN -* - SAFMIN = DLAMCH( 'Safe minimum' ) - J4 = 4*I0 + PP - 3 - EMIN = Z( J4+4 ) - D = Z( J4 ) - DMIN = D -* - IF( PP.EQ.0 ) THEN - DO 10 J4 = 4*I0, 4*( N0-3 ), 4 - Z( J4-2 ) = D + Z( J4-1 ) - IF( Z( J4-2 ).EQ.ZERO ) THEN - Z( J4 ) = ZERO - D = Z( J4+1 ) - DMIN = D - EMIN = ZERO - ELSE IF( SAFMIN*Z( J4+1 ).LT.Z( J4-2 ) .AND. - $ SAFMIN*Z( J4-2 ).LT.Z( J4+1 ) ) THEN - TEMP = Z( J4+1 ) / Z( J4-2 ) - Z( J4 ) = Z( J4-1 )*TEMP - D = D*TEMP - ELSE - Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) ) - D = Z( J4+1 )*( D / Z( J4-2 ) ) - END IF - DMIN = MIN( DMIN, D ) - EMIN = MIN( EMIN, Z( J4 ) ) - 10 CONTINUE - ELSE - DO 20 J4 = 4*I0, 4*( N0-3 ), 4 - Z( J4-3 ) = D + Z( J4 ) - IF( Z( J4-3 ).EQ.ZERO ) THEN - Z( J4-1 ) = ZERO - D = Z( J4+2 ) - DMIN = D - EMIN = ZERO - ELSE IF( SAFMIN*Z( J4+2 ).LT.Z( J4-3 ) .AND. - $ SAFMIN*Z( J4-3 ).LT.Z( J4+2 ) ) THEN - TEMP = Z( J4+2 ) / Z( J4-3 ) - Z( J4-1 ) = Z( J4 )*TEMP - D = D*TEMP - ELSE - Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) ) - D = Z( J4+2 )*( D / Z( J4-3 ) ) - END IF - DMIN = MIN( DMIN, D ) - EMIN = MIN( EMIN, Z( J4-1 ) ) - 20 CONTINUE - END IF -* -* Unroll last two steps. -* - DNM2 = D - DMIN2 = DMIN - J4 = 4*( N0-2 ) - PP - J4P2 = J4 + 2*PP - 1 - Z( J4-2 ) = DNM2 + Z( J4P2 ) - IF( Z( J4-2 ).EQ.ZERO ) THEN - Z( J4 ) = ZERO - DNM1 = Z( J4P2+2 ) - DMIN = DNM1 - EMIN = ZERO - ELSE IF( SAFMIN*Z( J4P2+2 ).LT.Z( J4-2 ) .AND. - $ SAFMIN*Z( J4-2 ).LT.Z( J4P2+2 ) ) THEN - TEMP = Z( J4P2+2 ) / Z( J4-2 ) - Z( J4 ) = Z( J4P2 )*TEMP - DNM1 = DNM2*TEMP - ELSE - Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) ) - DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - END IF - DMIN = MIN( DMIN, DNM1 ) -* - DMIN1 = DMIN - J4 = J4 + 4 - J4P2 = J4 + 2*PP - 1 - Z( J4-2 ) = DNM1 + Z( J4P2 ) - IF( Z( J4-2 ).EQ.ZERO ) THEN - Z( J4 ) = ZERO - DN = Z( J4P2+2 ) - DMIN = DN - EMIN = ZERO - ELSE IF( SAFMIN*Z( J4P2+2 ).LT.Z( J4-2 ) .AND. - $ SAFMIN*Z( J4-2 ).LT.Z( J4P2+2 ) ) THEN - TEMP = Z( J4P2+2 ) / Z( J4-2 ) - Z( J4 ) = Z( J4P2 )*TEMP - DN = DNM1*TEMP - ELSE - Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) ) - DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - END IF - DMIN = MIN( DMIN, DN ) -* - Z( J4+2 ) = DN - Z( 4*N0-PP ) = EMIN - RETURN -* -* End of DLASQ6 -* - END diff --git a/lib/linalg/fortran/dlasr.f b/lib/linalg/fortran/dlasr.f deleted file mode 100644 index dd0cedd85e..0000000000 --- a/lib/linalg/fortran/dlasr.f +++ /dev/null @@ -1,433 +0,0 @@ -*> \brief \b DLASR applies a sequence of plane rotations to a general rectangular matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, PIVOT, SIDE -* INTEGER LDA, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), C( * ), S( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASR applies a sequence of plane rotations to a real matrix A, -*> from either the left or the right. -*> -*> When SIDE = 'L', the transformation takes the form -*> -*> A := P*A -*> -*> and when SIDE = 'R', the transformation takes the form -*> -*> A := A*P**T -*> -*> where P is an orthogonal matrix consisting of a sequence of z plane -*> rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R', -*> and P**T is the transpose of P. -*> -*> When DIRECT = 'F' (Forward sequence), then -*> -*> P = P(z-1) * ... * P(2) * P(1) -*> -*> and when DIRECT = 'B' (Backward sequence), then -*> -*> P = P(1) * P(2) * ... * P(z-1) -*> -*> where P(k) is a plane rotation matrix defined by the 2-by-2 rotation -*> -*> R(k) = ( c(k) s(k) ) -*> = ( -s(k) c(k) ). -*> -*> When PIVOT = 'V' (Variable pivot), the rotation is performed -*> for the plane (k,k+1), i.e., P(k) has the form -*> -*> P(k) = ( 1 ) -*> ( ... ) -*> ( 1 ) -*> ( c(k) s(k) ) -*> ( -s(k) c(k) ) -*> ( 1 ) -*> ( ... ) -*> ( 1 ) -*> -*> where R(k) appears as a rank-2 modification to the identity matrix in -*> rows and columns k and k+1. -*> -*> When PIVOT = 'T' (Top pivot), the rotation is performed for the -*> plane (1,k+1), so P(k) has the form -*> -*> P(k) = ( c(k) s(k) ) -*> ( 1 ) -*> ( ... ) -*> ( 1 ) -*> ( -s(k) c(k) ) -*> ( 1 ) -*> ( ... ) -*> ( 1 ) -*> -*> where R(k) appears in rows and columns 1 and k+1. -*> -*> Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is -*> performed for the plane (k,z), giving P(k) the form -*> -*> P(k) = ( 1 ) -*> ( ... ) -*> ( 1 ) -*> ( c(k) s(k) ) -*> ( 1 ) -*> ( ... ) -*> ( 1 ) -*> ( -s(k) c(k) ) -*> -*> where R(k) appears in rows and columns k and z. The rotations are -*> performed without ever forming P(k) explicitly. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> Specifies whether the plane rotation matrix P is applied to -*> A on the left or the right. -*> = 'L': Left, compute A := P*A -*> = 'R': Right, compute A:= A*P**T -*> \endverbatim -*> -*> \param[in] PIVOT -*> \verbatim -*> PIVOT is CHARACTER*1 -*> Specifies the plane for which P(k) is a plane rotation -*> matrix. -*> = 'V': Variable pivot, the plane (k,k+1) -*> = 'T': Top pivot, the plane (1,k+1) -*> = 'B': Bottom pivot, the plane (k,z) -*> \endverbatim -*> -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies whether P is a forward or backward sequence of -*> plane rotations. -*> = 'F': Forward, P = P(z-1)*...*P(2)*P(1) -*> = 'B': Backward, P = P(1)*P(2)*...*P(z-1) -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. If m <= 1, an immediate -*> return is effected. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. If n <= 1, an -*> immediate return is effected. -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension -*> (M-1) if SIDE = 'L' -*> (N-1) if SIDE = 'R' -*> The cosines c(k) of the plane rotations. -*> \endverbatim -*> -*> \param[in] S -*> \verbatim -*> S is DOUBLE PRECISION array, dimension -*> (M-1) if SIDE = 'L' -*> (N-1) if SIDE = 'R' -*> The sines s(k) of the plane rotations. The 2-by-2 plane -*> rotation part of the matrix P(k), R(k), has the form -*> R(k) = ( c(k) s(k) ) -*> ( -s(k) c(k) ). -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The M-by-N matrix A. On exit, A is overwritten by P*A if -*> SIDE = 'L' or by A*P**T if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER DIRECT, PIVOT, SIDE - INTEGER LDA, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), C( * ), S( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, INFO, J - DOUBLE PRECISION CTEMP, STEMP, TEMP -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters -* - INFO = 0 - IF( .NOT.( LSAME( SIDE, 'L' ) .OR. LSAME( SIDE, 'R' ) ) ) THEN - INFO = 1 - ELSE IF( .NOT.( LSAME( PIVOT, 'V' ) .OR. LSAME( PIVOT, - $ 'T' ) .OR. LSAME( PIVOT, 'B' ) ) ) THEN - INFO = 2 - ELSE IF( .NOT.( LSAME( DIRECT, 'F' ) .OR. LSAME( DIRECT, 'B' ) ) ) - $ THEN - INFO = 3 - ELSE IF( M.LT.0 ) THEN - INFO = 4 - ELSE IF( N.LT.0 ) THEN - INFO = 5 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = 9 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLASR ', INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) ) - $ RETURN - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form P * A -* - IF( LSAME( PIVOT, 'V' ) ) THEN - IF( LSAME( DIRECT, 'F' ) ) THEN - DO 20 J = 1, M - 1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 10 I = 1, N - TEMP = A( J+1, I ) - A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I ) - A( J, I ) = STEMP*TEMP + CTEMP*A( J, I ) - 10 CONTINUE - END IF - 20 CONTINUE - ELSE IF( LSAME( DIRECT, 'B' ) ) THEN - DO 40 J = M - 1, 1, -1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 30 I = 1, N - TEMP = A( J+1, I ) - A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I ) - A( J, I ) = STEMP*TEMP + CTEMP*A( J, I ) - 30 CONTINUE - END IF - 40 CONTINUE - END IF - ELSE IF( LSAME( PIVOT, 'T' ) ) THEN - IF( LSAME( DIRECT, 'F' ) ) THEN - DO 60 J = 2, M - CTEMP = C( J-1 ) - STEMP = S( J-1 ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 50 I = 1, N - TEMP = A( J, I ) - A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I ) - A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I ) - 50 CONTINUE - END IF - 60 CONTINUE - ELSE IF( LSAME( DIRECT, 'B' ) ) THEN - DO 80 J = M, 2, -1 - CTEMP = C( J-1 ) - STEMP = S( J-1 ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 70 I = 1, N - TEMP = A( J, I ) - A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I ) - A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I ) - 70 CONTINUE - END IF - 80 CONTINUE - END IF - ELSE IF( LSAME( PIVOT, 'B' ) ) THEN - IF( LSAME( DIRECT, 'F' ) ) THEN - DO 100 J = 1, M - 1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 90 I = 1, N - TEMP = A( J, I ) - A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP - A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP - 90 CONTINUE - END IF - 100 CONTINUE - ELSE IF( LSAME( DIRECT, 'B' ) ) THEN - DO 120 J = M - 1, 1, -1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 110 I = 1, N - TEMP = A( J, I ) - A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP - A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP - 110 CONTINUE - END IF - 120 CONTINUE - END IF - END IF - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form A * P**T -* - IF( LSAME( PIVOT, 'V' ) ) THEN - IF( LSAME( DIRECT, 'F' ) ) THEN - DO 140 J = 1, N - 1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 130 I = 1, M - TEMP = A( I, J+1 ) - A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J ) - A( I, J ) = STEMP*TEMP + CTEMP*A( I, J ) - 130 CONTINUE - END IF - 140 CONTINUE - ELSE IF( LSAME( DIRECT, 'B' ) ) THEN - DO 160 J = N - 1, 1, -1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 150 I = 1, M - TEMP = A( I, J+1 ) - A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J ) - A( I, J ) = STEMP*TEMP + CTEMP*A( I, J ) - 150 CONTINUE - END IF - 160 CONTINUE - END IF - ELSE IF( LSAME( PIVOT, 'T' ) ) THEN - IF( LSAME( DIRECT, 'F' ) ) THEN - DO 180 J = 2, N - CTEMP = C( J-1 ) - STEMP = S( J-1 ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 170 I = 1, M - TEMP = A( I, J ) - A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 ) - A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 ) - 170 CONTINUE - END IF - 180 CONTINUE - ELSE IF( LSAME( DIRECT, 'B' ) ) THEN - DO 200 J = N, 2, -1 - CTEMP = C( J-1 ) - STEMP = S( J-1 ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 190 I = 1, M - TEMP = A( I, J ) - A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 ) - A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 ) - 190 CONTINUE - END IF - 200 CONTINUE - END IF - ELSE IF( LSAME( PIVOT, 'B' ) ) THEN - IF( LSAME( DIRECT, 'F' ) ) THEN - DO 220 J = 1, N - 1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 210 I = 1, M - TEMP = A( I, J ) - A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP - A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP - 210 CONTINUE - END IF - 220 CONTINUE - ELSE IF( LSAME( DIRECT, 'B' ) ) THEN - DO 240 J = N - 1, 1, -1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 230 I = 1, M - TEMP = A( I, J ) - A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP - A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP - 230 CONTINUE - END IF - 240 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of DLASR -* - END diff --git a/lib/linalg/fortran/dlasrt.f b/lib/linalg/fortran/dlasrt.f deleted file mode 100644 index d789239e3d..0000000000 --- a/lib/linalg/fortran/dlasrt.f +++ /dev/null @@ -1,300 +0,0 @@ -*> \brief \b DLASRT sorts numbers in increasing or decreasing order. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASRT + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASRT( ID, N, D, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER ID -* INTEGER INFO, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> Sort the numbers in D in increasing order (if ID = 'I') or -*> in decreasing order (if ID = 'D' ). -*> -*> Use Quick Sort, reverting to Insertion sort on arrays of -*> size <= 20. Dimension of STACK limits N to about 2**32. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ID -*> \verbatim -*> ID is CHARACTER*1 -*> = 'I': sort D in increasing order; -*> = 'D': sort D in decreasing order. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The length of the array D. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the array to be sorted. -*> On exit, D has been sorted into increasing order -*> (D(1) <= ... <= D(N) ) or into decreasing order -*> (D(1) >= ... >= D(N) ), depending on ID. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -* ===================================================================== - SUBROUTINE DLASRT( ID, N, D, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER ID - INTEGER INFO, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - INTEGER SELECT - PARAMETER ( SELECT = 20 ) -* .. -* .. Local Scalars .. - INTEGER DIR, ENDD, I, J, START, STKPNT - DOUBLE PRECISION D1, D2, D3, DMNMX, TMP -* .. -* .. Local Arrays .. - INTEGER STACK( 2, 32 ) -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - DIR = -1 - IF( LSAME( ID, 'D' ) ) THEN - DIR = 0 - ELSE IF( LSAME( ID, 'I' ) ) THEN - DIR = 1 - END IF - IF( DIR.EQ.-1 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLASRT', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.LE.1 ) - $ RETURN -* - STKPNT = 1 - STACK( 1, 1 ) = 1 - STACK( 2, 1 ) = N - 10 CONTINUE - START = STACK( 1, STKPNT ) - ENDD = STACK( 2, STKPNT ) - STKPNT = STKPNT - 1 - IF( ENDD-START.LE.SELECT .AND. ENDD-START.GT.0 ) THEN -* -* Do Insertion sort on D( START:ENDD ) -* - IF( DIR.EQ.0 ) THEN -* -* Sort into decreasing order -* - DO 30 I = START + 1, ENDD - DO 20 J = I, START + 1, -1 - IF( D( J ).GT.D( J-1 ) ) THEN - DMNMX = D( J ) - D( J ) = D( J-1 ) - D( J-1 ) = DMNMX - ELSE - GO TO 30 - END IF - 20 CONTINUE - 30 CONTINUE -* - ELSE -* -* Sort into increasing order -* - DO 50 I = START + 1, ENDD - DO 40 J = I, START + 1, -1 - IF( D( J ).LT.D( J-1 ) ) THEN - DMNMX = D( J ) - D( J ) = D( J-1 ) - D( J-1 ) = DMNMX - ELSE - GO TO 50 - END IF - 40 CONTINUE - 50 CONTINUE -* - END IF -* - ELSE IF( ENDD-START.GT.SELECT ) THEN -* -* Partition D( START:ENDD ) and stack parts, largest one first -* -* Choose partition entry as median of 3 -* - D1 = D( START ) - D2 = D( ENDD ) - I = ( START+ENDD ) / 2 - D3 = D( I ) - IF( D1.LT.D2 ) THEN - IF( D3.LT.D1 ) THEN - DMNMX = D1 - ELSE IF( D3.LT.D2 ) THEN - DMNMX = D3 - ELSE - DMNMX = D2 - END IF - ELSE - IF( D3.LT.D2 ) THEN - DMNMX = D2 - ELSE IF( D3.LT.D1 ) THEN - DMNMX = D3 - ELSE - DMNMX = D1 - END IF - END IF -* - IF( DIR.EQ.0 ) THEN -* -* Sort into decreasing order -* - I = START - 1 - J = ENDD + 1 - 60 CONTINUE - 70 CONTINUE - J = J - 1 - IF( D( J ).LT.DMNMX ) - $ GO TO 70 - 80 CONTINUE - I = I + 1 - IF( D( I ).GT.DMNMX ) - $ GO TO 80 - IF( I.LT.J ) THEN - TMP = D( I ) - D( I ) = D( J ) - D( J ) = TMP - GO TO 60 - END IF - IF( J-START.GT.ENDD-J-1 ) THEN - STKPNT = STKPNT + 1 - STACK( 1, STKPNT ) = START - STACK( 2, STKPNT ) = J - STKPNT = STKPNT + 1 - STACK( 1, STKPNT ) = J + 1 - STACK( 2, STKPNT ) = ENDD - ELSE - STKPNT = STKPNT + 1 - STACK( 1, STKPNT ) = J + 1 - STACK( 2, STKPNT ) = ENDD - STKPNT = STKPNT + 1 - STACK( 1, STKPNT ) = START - STACK( 2, STKPNT ) = J - END IF - ELSE -* -* Sort into increasing order -* - I = START - 1 - J = ENDD + 1 - 90 CONTINUE - 100 CONTINUE - J = J - 1 - IF( D( J ).GT.DMNMX ) - $ GO TO 100 - 110 CONTINUE - I = I + 1 - IF( D( I ).LT.DMNMX ) - $ GO TO 110 - IF( I.LT.J ) THEN - TMP = D( I ) - D( I ) = D( J ) - D( J ) = TMP - GO TO 90 - END IF - IF( J-START.GT.ENDD-J-1 ) THEN - STKPNT = STKPNT + 1 - STACK( 1, STKPNT ) = START - STACK( 2, STKPNT ) = J - STKPNT = STKPNT + 1 - STACK( 1, STKPNT ) = J + 1 - STACK( 2, STKPNT ) = ENDD - ELSE - STKPNT = STKPNT + 1 - STACK( 1, STKPNT ) = J + 1 - STACK( 2, STKPNT ) = ENDD - STKPNT = STKPNT + 1 - STACK( 1, STKPNT ) = START - STACK( 2, STKPNT ) = J - END IF - END IF - END IF - IF( STKPNT.GT.0 ) - $ GO TO 10 - RETURN -* -* End of DLASRT -* - END diff --git a/lib/linalg/fortran/dlassq.f b/lib/linalg/fortran/dlassq.f deleted file mode 100644 index 885395e3c9..0000000000 --- a/lib/linalg/fortran/dlassq.f +++ /dev/null @@ -1,155 +0,0 @@ -*> \brief \b DLASSQ updates a sum of squares represented in scaled form. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASSQ + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASSQ( N, X, INCX, SCALE, SUMSQ ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* DOUBLE PRECISION SCALE, SUMSQ -* .. -* .. Array Arguments .. -* DOUBLE PRECISION X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASSQ returns the values scl and smsq such that -*> -*> ( scl**2 )*smsq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq, -*> -*> where x( i ) = X( 1 + ( i - 1 )*INCX ). The value of sumsq is -*> assumed to be non-negative and scl returns the value -*> -*> scl = max( scale, abs( x( i ) ) ). -*> -*> scale and sumsq must be supplied in SCALE and SUMSQ and -*> scl and smsq are overwritten on SCALE and SUMSQ respectively. -*> -*> The routine makes only one pass through the vector x. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of elements to be used from the vector X. -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension (N) -*> The vector for which a scaled sum of squares is computed. -*> x( i ) = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between successive values of the vector X. -*> INCX > 0. -*> \endverbatim -*> -*> \param[in,out] SCALE -*> \verbatim -*> SCALE is DOUBLE PRECISION -*> On entry, the value scale in the equation above. -*> On exit, SCALE is overwritten with scl , the scaling factor -*> for the sum of squares. -*> \endverbatim -*> -*> \param[in,out] SUMSQ -*> \verbatim -*> SUMSQ is DOUBLE PRECISION -*> On entry, the value sumsq in the equation above. -*> On exit, SUMSQ is overwritten with smsq , the basic sum of -*> squares from which scl has been factored out. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date December 2016 -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - SUBROUTINE DLASSQ( N, X, INCX, SCALE, SUMSQ ) -* -* -- LAPACK auxiliary routine (version 3.7.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* December 2016 -* -* .. Scalar Arguments .. - INTEGER INCX, N - DOUBLE PRECISION SCALE, SUMSQ -* .. -* .. Array Arguments .. - DOUBLE PRECISION X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER IX - DOUBLE PRECISION ABSXI -* .. -* .. External Functions .. - LOGICAL DISNAN - EXTERNAL DISNAN -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS -* .. -* .. Executable Statements .. -* - IF( N.GT.0 ) THEN - DO 10 IX = 1, 1 + ( N-1 )*INCX, INCX - ABSXI = ABS( X( IX ) ) - IF( ABSXI.GT.ZERO.OR.DISNAN( ABSXI ) ) THEN - IF( SCALE.LT.ABSXI ) THEN - SUMSQ = 1 + SUMSQ*( SCALE / ABSXI )**2 - SCALE = ABSXI - ELSE - SUMSQ = SUMSQ + ( ABSXI / SCALE )**2 - END IF - END IF - 10 CONTINUE - END IF - RETURN -* -* End of DLASSQ -* - END diff --git a/lib/linalg/fortran/dlasv2.f b/lib/linalg/fortran/dlasv2.f deleted file mode 100644 index 64a06dee1a..0000000000 --- a/lib/linalg/fortran/dlasv2.f +++ /dev/null @@ -1,322 +0,0 @@ -*> \brief \b DLASV2 computes the singular value decomposition of a 2-by-2 triangular matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASV2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL ) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASV2 computes the singular value decomposition of a 2-by-2 -*> triangular matrix -*> [ F G ] -*> [ 0 H ]. -*> On return, abs(SSMAX) is the larger singular value, abs(SSMIN) is the -*> smaller singular value, and (CSL,SNL) and (CSR,SNR) are the left and -*> right singular vectors for abs(SSMAX), giving the decomposition -*> -*> [ CSL SNL ] [ F G ] [ CSR -SNR ] = [ SSMAX 0 ] -*> [-SNL CSL ] [ 0 H ] [ SNR CSR ] [ 0 SSMIN ]. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] F -*> \verbatim -*> F is DOUBLE PRECISION -*> The (1,1) element of the 2-by-2 matrix. -*> \endverbatim -*> -*> \param[in] G -*> \verbatim -*> G is DOUBLE PRECISION -*> The (1,2) element of the 2-by-2 matrix. -*> \endverbatim -*> -*> \param[in] H -*> \verbatim -*> H is DOUBLE PRECISION -*> The (2,2) element of the 2-by-2 matrix. -*> \endverbatim -*> -*> \param[out] SSMIN -*> \verbatim -*> SSMIN is DOUBLE PRECISION -*> abs(SSMIN) is the smaller singular value. -*> \endverbatim -*> -*> \param[out] SSMAX -*> \verbatim -*> SSMAX is DOUBLE PRECISION -*> abs(SSMAX) is the larger singular value. -*> \endverbatim -*> -*> \param[out] SNL -*> \verbatim -*> SNL is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[out] CSL -*> \verbatim -*> CSL is DOUBLE PRECISION -*> The vector (CSL, SNL) is a unit left singular vector for the -*> singular value abs(SSMAX). -*> \endverbatim -*> -*> \param[out] SNR -*> \verbatim -*> SNR is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[out] CSR -*> \verbatim -*> CSR is DOUBLE PRECISION -*> The vector (CSR, SNR) is a unit right singular vector for the -*> singular value abs(SSMAX). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Any input parameter may be aliased with any output parameter. -*> -*> Barring over/underflow and assuming a guard digit in subtraction, all -*> output quantities are correct to within a few units in the last -*> place (ulps). -*> -*> In IEEE arithmetic, the code works correctly if one matrix element is -*> infinite. -*> -*> Overflow will not occur unless the largest singular value itself -*> overflows or is within a few ulps of overflow. (On machines with -*> partial overflow, like the Cray, overflow may occur if the largest -*> singular value is within a factor of 2 of overflow.) -*> -*> Underflow is harmless if underflow is gradual. Otherwise, results -*> may correspond to a matrix modified by perturbations of size near -*> the underflow threshold. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D0 ) - DOUBLE PRECISION HALF - PARAMETER ( HALF = 0.5D0 ) - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D0 ) - DOUBLE PRECISION TWO - PARAMETER ( TWO = 2.0D0 ) - DOUBLE PRECISION FOUR - PARAMETER ( FOUR = 4.0D0 ) -* .. -* .. Local Scalars .. - LOGICAL GASMAL, SWAP - INTEGER PMAX - DOUBLE PRECISION A, CLT, CRT, D, FA, FT, GA, GT, HA, HT, L, M, - $ MM, R, S, SLT, SRT, T, TEMP, TSIGN, TT -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SIGN, SQRT -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH - EXTERNAL DLAMCH -* .. -* .. Executable Statements .. -* - FT = F - FA = ABS( FT ) - HT = H - HA = ABS( H ) -* -* PMAX points to the maximum absolute element of matrix -* PMAX = 1 if F largest in absolute values -* PMAX = 2 if G largest in absolute values -* PMAX = 3 if H largest in absolute values -* - PMAX = 1 - SWAP = ( HA.GT.FA ) - IF( SWAP ) THEN - PMAX = 3 - TEMP = FT - FT = HT - HT = TEMP - TEMP = FA - FA = HA - HA = TEMP -* -* Now FA .ge. HA -* - END IF - GT = G - GA = ABS( GT ) - IF( GA.EQ.ZERO ) THEN -* -* Diagonal matrix -* - SSMIN = HA - SSMAX = FA - CLT = ONE - CRT = ONE - SLT = ZERO - SRT = ZERO - ELSE - GASMAL = .TRUE. - IF( GA.GT.FA ) THEN - PMAX = 2 - IF( ( FA / GA ).LT.DLAMCH( 'EPS' ) ) THEN -* -* Case of very large GA -* - GASMAL = .FALSE. - SSMAX = GA - IF( HA.GT.ONE ) THEN - SSMIN = FA / ( GA / HA ) - ELSE - SSMIN = ( FA / GA )*HA - END IF - CLT = ONE - SLT = HT / GT - SRT = ONE - CRT = FT / GT - END IF - END IF - IF( GASMAL ) THEN -* -* Normal case -* - D = FA - HA - IF( D.EQ.FA ) THEN -* -* Copes with infinite F or H -* - L = ONE - ELSE - L = D / FA - END IF -* -* Note that 0 .le. L .le. 1 -* - M = GT / FT -* -* Note that abs(M) .le. 1/macheps -* - T = TWO - L -* -* Note that T .ge. 1 -* - MM = M*M - TT = T*T - S = SQRT( TT+MM ) -* -* Note that 1 .le. S .le. 1 + 1/macheps -* - IF( L.EQ.ZERO ) THEN - R = ABS( M ) - ELSE - R = SQRT( L*L+MM ) - END IF -* -* Note that 0 .le. R .le. 1 + 1/macheps -* - A = HALF*( S+R ) -* -* Note that 1 .le. A .le. 1 + abs(M) -* - SSMIN = HA / A - SSMAX = FA*A - IF( MM.EQ.ZERO ) THEN -* -* Note that M is very tiny -* - IF( L.EQ.ZERO ) THEN - T = SIGN( TWO, FT )*SIGN( ONE, GT ) - ELSE - T = GT / SIGN( D, FT ) + M / T - END IF - ELSE - T = ( M / ( S+T )+M / ( R+L ) )*( ONE+A ) - END IF - L = SQRT( T*T+FOUR ) - CRT = TWO / L - SRT = T / L - CLT = ( CRT+SRT*M ) / A - SLT = ( HT / FT )*SRT / A - END IF - END IF - IF( SWAP ) THEN - CSL = SRT - SNL = CRT - CSR = SLT - SNR = CLT - ELSE - CSL = CLT - SNL = SLT - CSR = CRT - SNR = SRT - END IF -* -* Correct signs of SSMAX and SSMIN -* - IF( PMAX.EQ.1 ) - $ TSIGN = SIGN( ONE, CSR )*SIGN( ONE, CSL )*SIGN( ONE, F ) - IF( PMAX.EQ.2 ) - $ TSIGN = SIGN( ONE, SNR )*SIGN( ONE, CSL )*SIGN( ONE, G ) - IF( PMAX.EQ.3 ) - $ TSIGN = SIGN( ONE, SNR )*SIGN( ONE, SNL )*SIGN( ONE, H ) - SSMAX = SIGN( SSMAX, TSIGN ) - SSMIN = SIGN( SSMIN, TSIGN*SIGN( ONE, F )*SIGN( ONE, H ) ) - RETURN -* -* End of DLASV2 -* - END diff --git a/lib/linalg/fortran/dlaswp.f b/lib/linalg/fortran/dlaswp.f deleted file mode 100644 index b35729a205..0000000000 --- a/lib/linalg/fortran/dlaswp.f +++ /dev/null @@ -1,190 +0,0 @@ -*> \brief \b DLASWP performs a series of row interchanges on a general rectangular matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLASWP + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLASWP( N, A, LDA, K1, K2, IPIV, INCX ) -* -* .. Scalar Arguments .. -* INTEGER INCX, K1, K2, LDA, N -* .. -* .. Array Arguments .. -* INTEGER IPIV( * ) -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLASWP performs a series of row interchanges on the matrix A. -*> One row interchange is initiated for each of rows K1 through K2 of A. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the matrix of column dimension N to which the row -*> interchanges will be applied. -*> On exit, the permuted matrix. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> \endverbatim -*> -*> \param[in] K1 -*> \verbatim -*> K1 is INTEGER -*> The first element of IPIV for which a row interchange will -*> be done. -*> \endverbatim -*> -*> \param[in] K2 -*> \verbatim -*> K2 is INTEGER -*> (K2-K1+1) is the number of elements of IPIV for which a row -*> interchange will be done. -*> \endverbatim -*> -*> \param[in] IPIV -*> \verbatim -*> IPIV is INTEGER array, dimension (K1+(K2-K1)*abs(INCX)) -*> The vector of pivot indices. Only the elements in positions -*> K1 through K1+(K2-K1)*abs(INCX) of IPIV are accessed. -*> IPIV(K1+(K-K1)*abs(INCX)) = L implies rows K and L are to be -*> interchanged. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between successive values of IPIV. If INCX -*> is negative, the pivots are applied in reverse order. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Modified by -*> R. C. Whaley, Computer Science Dept., Univ. of Tenn., Knoxville, USA -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLASWP( N, A, LDA, K1, K2, IPIV, INCX ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX, K1, K2, LDA, N -* .. -* .. Array Arguments .. - INTEGER IPIV( * ) - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, I1, I2, INC, IP, IX, IX0, J, K, N32 - DOUBLE PRECISION TEMP -* .. -* .. Executable Statements .. -* -* Interchange row I with row IPIV(K1+(I-K1)*abs(INCX)) for each of rows -* K1 through K2. -* - IF( INCX.GT.0 ) THEN - IX0 = K1 - I1 = K1 - I2 = K2 - INC = 1 - ELSE IF( INCX.LT.0 ) THEN - IX0 = K1 + ( K1-K2 )*INCX - I1 = K2 - I2 = K1 - INC = -1 - ELSE - RETURN - END IF -* - N32 = ( N / 32 )*32 - IF( N32.NE.0 ) THEN - DO 30 J = 1, N32, 32 - IX = IX0 - DO 20 I = I1, I2, INC - IP = IPIV( IX ) - IF( IP.NE.I ) THEN - DO 10 K = J, J + 31 - TEMP = A( I, K ) - A( I, K ) = A( IP, K ) - A( IP, K ) = TEMP - 10 CONTINUE - END IF - IX = IX + INCX - 20 CONTINUE - 30 CONTINUE - END IF - IF( N32.NE.N ) THEN - N32 = N32 + 1 - IX = IX0 - DO 50 I = I1, I2, INC - IP = IPIV( IX ) - IF( IP.NE.I ) THEN - DO 40 K = N32, N - TEMP = A( I, K ) - A( I, K ) = A( IP, K ) - A( IP, K ) = TEMP - 40 CONTINUE - END IF - IX = IX + INCX - 50 CONTINUE - END IF -* - RETURN -* -* End of DLASWP -* - END diff --git a/lib/linalg/fortran/dlatrd.f b/lib/linalg/fortran/dlatrd.f deleted file mode 100644 index 010a85a212..0000000000 --- a/lib/linalg/fortran/dlatrd.f +++ /dev/null @@ -1,333 +0,0 @@ -*> \brief \b DLATRD reduces the first nb rows and columns of a symmetric/Hermitian matrix A to real tridiagonal form by an orthogonal similarity transformation. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLATRD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER LDA, LDW, N, NB -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), E( * ), TAU( * ), W( LDW, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLATRD reduces NB rows and columns of a real symmetric matrix A to -*> symmetric tridiagonal form by an orthogonal similarity -*> transformation Q**T * A * Q, and returns the matrices V and W which are -*> needed to apply the transformation to the unreduced part of A. -*> -*> If UPLO = 'U', DLATRD reduces the last NB rows and columns of a -*> matrix, of which the upper triangle is supplied; -*> if UPLO = 'L', DLATRD reduces the first NB rows and columns of a -*> matrix, of which the lower triangle is supplied. -*> -*> This is an auxiliary routine called by DSYTRD. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies whether the upper or lower triangular part of the -*> symmetric matrix A is stored: -*> = 'U': Upper triangular -*> = 'L': Lower triangular -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. -*> \endverbatim -*> -*> \param[in] NB -*> \verbatim -*> NB is INTEGER -*> The number of rows and columns to be reduced. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the leading -*> n-by-n upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading n-by-n lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> On exit: -*> if UPLO = 'U', the last NB columns have been reduced to -*> tridiagonal form, with the diagonal elements overwriting -*> the diagonal elements of A; the elements above the diagonal -*> with the array TAU, represent the orthogonal matrix Q as a -*> product of elementary reflectors; -*> if UPLO = 'L', the first NB columns have been reduced to -*> tridiagonal form, with the diagonal elements overwriting -*> the diagonal elements of A; the elements below the diagonal -*> with the array TAU, represent the orthogonal matrix Q as a -*> product of elementary reflectors. -*> See Further Details. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= (1,N). -*> \endverbatim -*> -*> \param[out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal -*> elements of the last NB columns of the reduced matrix; -*> if UPLO = 'L', E(1:nb) contains the subdiagonal elements of -*> the first NB columns of the reduced matrix. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (N-1) -*> The scalar factors of the elementary reflectors, stored in -*> TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'. -*> See Further Details. -*> \endverbatim -*> -*> \param[out] W -*> \verbatim -*> W is DOUBLE PRECISION array, dimension (LDW,NB) -*> The n-by-nb matrix W required to update the unreduced part -*> of A. -*> \endverbatim -*> -*> \param[in] LDW -*> \verbatim -*> LDW is INTEGER -*> The leading dimension of the array W. LDW >= max(1,N). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> If UPLO = 'U', the matrix Q is represented as a product of elementary -*> reflectors -*> -*> Q = H(n) H(n-1) . . . H(n-nb+1). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**T -*> -*> where tau is a real scalar, and v is a real vector with -*> v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), -*> and tau in TAU(i-1). -*> -*> If UPLO = 'L', the matrix Q is represented as a product of elementary -*> reflectors -*> -*> Q = H(1) H(2) . . . H(nb). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**T -*> -*> where tau is a real scalar, and v is a real vector with -*> v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), -*> and tau in TAU(i). -*> -*> The elements of the vectors v together form the n-by-nb matrix V -*> which is needed, with W, to apply the transformation to the unreduced -*> part of the matrix, using a symmetric rank-2k update of the form: -*> A := A - V*W**T - W*V**T. -*> -*> The contents of A on exit are illustrated by the following examples -*> with n = 5 and nb = 2: -*> -*> if UPLO = 'U': if UPLO = 'L': -*> -*> ( a a a v4 v5 ) ( d ) -*> ( a a v4 v5 ) ( 1 d ) -*> ( a 1 v5 ) ( v1 1 a ) -*> ( d 1 ) ( v1 v2 a a ) -*> ( d ) ( v1 v2 a a a ) -*> -*> where d denotes a diagonal element of the reduced matrix, a denotes -*> an element of the original matrix that is unchanged, and vi denotes -*> an element of the vector defining H(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER LDA, LDW, N, NB -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), E( * ), TAU( * ), W( LDW, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE, HALF - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, HALF = 0.5D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, IW - DOUBLE PRECISION ALPHA -* .. -* .. External Subroutines .. - EXTERNAL DAXPY, DGEMV, DLARFG, DSCAL, DSYMV -* .. -* .. External Functions .. - LOGICAL LSAME - DOUBLE PRECISION DDOT - EXTERNAL LSAME, DDOT -* .. -* .. Intrinsic Functions .. - INTRINSIC MIN -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.LE.0 ) - $ RETURN -* - IF( LSAME( UPLO, 'U' ) ) THEN -* -* Reduce last NB columns of upper triangle -* - DO 10 I = N, N - NB + 1, -1 - IW = I - N + NB - IF( I.LT.N ) THEN -* -* Update A(1:i,i) -* - CALL DGEMV( 'No transpose', I, N-I, -ONE, A( 1, I+1 ), - $ LDA, W( I, IW+1 ), LDW, ONE, A( 1, I ), 1 ) - CALL DGEMV( 'No transpose', I, N-I, -ONE, W( 1, IW+1 ), - $ LDW, A( I, I+1 ), LDA, ONE, A( 1, I ), 1 ) - END IF - IF( I.GT.1 ) THEN -* -* Generate elementary reflector H(i) to annihilate -* A(1:i-2,i) -* - CALL DLARFG( I-1, A( I-1, I ), A( 1, I ), 1, TAU( I-1 ) ) - E( I-1 ) = A( I-1, I ) - A( I-1, I ) = ONE -* -* Compute W(1:i-1,i) -* - CALL DSYMV( 'Upper', I-1, ONE, A, LDA, A( 1, I ), 1, - $ ZERO, W( 1, IW ), 1 ) - IF( I.LT.N ) THEN - CALL DGEMV( 'Transpose', I-1, N-I, ONE, W( 1, IW+1 ), - $ LDW, A( 1, I ), 1, ZERO, W( I+1, IW ), 1 ) - CALL DGEMV( 'No transpose', I-1, N-I, -ONE, - $ A( 1, I+1 ), LDA, W( I+1, IW ), 1, ONE, - $ W( 1, IW ), 1 ) - CALL DGEMV( 'Transpose', I-1, N-I, ONE, A( 1, I+1 ), - $ LDA, A( 1, I ), 1, ZERO, W( I+1, IW ), 1 ) - CALL DGEMV( 'No transpose', I-1, N-I, -ONE, - $ W( 1, IW+1 ), LDW, W( I+1, IW ), 1, ONE, - $ W( 1, IW ), 1 ) - END IF - CALL DSCAL( I-1, TAU( I-1 ), W( 1, IW ), 1 ) - ALPHA = -HALF*TAU( I-1 )*DDOT( I-1, W( 1, IW ), 1, - $ A( 1, I ), 1 ) - CALL DAXPY( I-1, ALPHA, A( 1, I ), 1, W( 1, IW ), 1 ) - END IF -* - 10 CONTINUE - ELSE -* -* Reduce first NB columns of lower triangle -* - DO 20 I = 1, NB -* -* Update A(i:n,i) -* - CALL DGEMV( 'No transpose', N-I+1, I-1, -ONE, A( I, 1 ), - $ LDA, W( I, 1 ), LDW, ONE, A( I, I ), 1 ) - CALL DGEMV( 'No transpose', N-I+1, I-1, -ONE, W( I, 1 ), - $ LDW, A( I, 1 ), LDA, ONE, A( I, I ), 1 ) - IF( I.LT.N ) THEN -* -* Generate elementary reflector H(i) to annihilate -* A(i+2:n,i) -* - CALL DLARFG( N-I, A( I+1, I ), A( MIN( I+2, N ), I ), 1, - $ TAU( I ) ) - E( I ) = A( I+1, I ) - A( I+1, I ) = ONE -* -* Compute W(i+1:n,i) -* - CALL DSYMV( 'Lower', N-I, ONE, A( I+1, I+1 ), LDA, - $ A( I+1, I ), 1, ZERO, W( I+1, I ), 1 ) - CALL DGEMV( 'Transpose', N-I, I-1, ONE, W( I+1, 1 ), LDW, - $ A( I+1, I ), 1, ZERO, W( 1, I ), 1 ) - CALL DGEMV( 'No transpose', N-I, I-1, -ONE, A( I+1, 1 ), - $ LDA, W( 1, I ), 1, ONE, W( I+1, I ), 1 ) - CALL DGEMV( 'Transpose', N-I, I-1, ONE, A( I+1, 1 ), LDA, - $ A( I+1, I ), 1, ZERO, W( 1, I ), 1 ) - CALL DGEMV( 'No transpose', N-I, I-1, -ONE, W( I+1, 1 ), - $ LDW, W( 1, I ), 1, ONE, W( I+1, I ), 1 ) - CALL DSCAL( N-I, TAU( I ), W( I+1, I ), 1 ) - ALPHA = -HALF*TAU( I )*DDOT( N-I, W( I+1, I ), 1, - $ A( I+1, I ), 1 ) - CALL DAXPY( N-I, ALPHA, A( I+1, I ), 1, W( I+1, I ), 1 ) - END IF -* - 20 CONTINUE - END IF -* - RETURN -* -* End of DLATRD -* - END diff --git a/lib/linalg/fortran/dlatrs.f b/lib/linalg/fortran/dlatrs.f deleted file mode 100644 index be156bee20..0000000000 --- a/lib/linalg/fortran/dlatrs.f +++ /dev/null @@ -1,843 +0,0 @@ -*> \brief \b DLATRS solves a triangular system of equations with the scale factor set to prevent overflow. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLATRS + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE, -* CNORM, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER DIAG, NORMIN, TRANS, UPLO -* INTEGER INFO, LDA, N -* DOUBLE PRECISION SCALE -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), CNORM( * ), X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLATRS solves one of the triangular systems -*> -*> A *x = s*b or A**T *x = s*b -*> -*> with scaling to prevent overflow. Here A is an upper or lower -*> triangular matrix, A**T denotes the transpose of A, x and b are -*> n-element vectors, and s is a scaling factor, usually less than -*> or equal to 1, chosen so that the components of x will be less than -*> the overflow threshold. If the unscaled problem will not cause -*> overflow, the Level 2 BLAS routine DTRSV is called. If the matrix A -*> is singular (A(j,j) = 0 for some j), then s is set to 0 and a -*> non-trivial solution to A*x = 0 is returned. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies whether the matrix A is upper or lower triangular. -*> = 'U': Upper triangular -*> = 'L': Lower triangular -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> Specifies the operation applied to A. -*> = 'N': Solve A * x = s*b (No transpose) -*> = 'T': Solve A**T* x = s*b (Transpose) -*> = 'C': Solve A**T* x = s*b (Conjugate transpose = Transpose) -*> \endverbatim -*> -*> \param[in] DIAG -*> \verbatim -*> DIAG is CHARACTER*1 -*> Specifies whether or not the matrix A is unit triangular. -*> = 'N': Non-unit triangular -*> = 'U': Unit triangular -*> \endverbatim -*> -*> \param[in] NORMIN -*> \verbatim -*> NORMIN is CHARACTER*1 -*> Specifies whether CNORM has been set or not. -*> = 'Y': CNORM contains the column norms on entry -*> = 'N': CNORM is not set on entry. On exit, the norms will -*> be computed and stored in CNORM. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The triangular matrix A. If UPLO = 'U', the leading n by n -*> upper triangular part of the array A contains the upper -*> triangular matrix, and the strictly lower triangular part of -*> A is not referenced. If UPLO = 'L', the leading n by n lower -*> triangular part of the array A contains the lower triangular -*> matrix, and the strictly upper triangular part of A is not -*> referenced. If DIAG = 'U', the diagonal elements of A are -*> also not referenced and are assumed to be 1. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max (1,N). -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension (N) -*> On entry, the right hand side b of the triangular system. -*> On exit, X is overwritten by the solution vector x. -*> \endverbatim -*> -*> \param[out] SCALE -*> \verbatim -*> SCALE is DOUBLE PRECISION -*> The scaling factor s for the triangular system -*> A * x = s*b or A**T* x = s*b. -*> If SCALE = 0, the matrix A is singular or badly scaled, and -*> the vector x is an exact or approximate solution to A*x = 0. -*> \endverbatim -*> -*> \param[in,out] CNORM -*> \verbatim -*> CNORM is DOUBLE PRECISION array, dimension (N) -*> -*> If NORMIN = 'Y', CNORM is an input argument and CNORM(j) -*> contains the norm of the off-diagonal part of the j-th column -*> of A. If TRANS = 'N', CNORM(j) must be greater than or equal -*> to the infinity-norm, and if TRANS = 'T' or 'C', CNORM(j) -*> must be greater than or equal to the 1-norm. -*> -*> If NORMIN = 'N', CNORM is an output argument and CNORM(j) -*> returns the 1-norm of the offdiagonal part of the j-th column -*> of A. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -k, the k-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> A rough bound on x is computed; if that is less than overflow, DTRSV -*> is called, otherwise, specific code is used which checks for possible -*> overflow or divide-by-zero at every operation. -*> -*> A columnwise scheme is used for solving A*x = b. The basic algorithm -*> if A is lower triangular is -*> -*> x[1:n] := b[1:n] -*> for j = 1, ..., n -*> x(j) := x(j) / A(j,j) -*> x[j+1:n] := x[j+1:n] - x(j) * A[j+1:n,j] -*> end -*> -*> Define bounds on the components of x after j iterations of the loop: -*> M(j) = bound on x[1:j] -*> G(j) = bound on x[j+1:n] -*> Initially, let M(0) = 0 and G(0) = max{x(i), i=1,...,n}. -*> -*> Then for iteration j+1 we have -*> M(j+1) <= G(j) / | A(j+1,j+1) | -*> G(j+1) <= G(j) + M(j+1) * | A[j+2:n,j+1] | -*> <= G(j) ( 1 + CNORM(j+1) / | A(j+1,j+1) | ) -*> -*> where CNORM(j+1) is greater than or equal to the infinity-norm of -*> column j+1 of A, not counting the diagonal. Hence -*> -*> G(j) <= G(0) product ( 1 + CNORM(i) / | A(i,i) | ) -*> 1<=i<=j -*> and -*> -*> |x(j)| <= ( G(0) / |A(j,j)| ) product ( 1 + CNORM(i) / |A(i,i)| ) -*> 1<=i< j -*> -*> Since |x(j)| <= M(j), we use the Level 2 BLAS routine DTRSV if the -*> reciprocal of the largest M(j), j=1,..,n, is larger than -*> max(underflow, 1/overflow). -*> -*> The bound on x(j) is also used to determine when a step in the -*> columnwise method can be performed without fear of overflow. If -*> the computed bound is greater than a large constant, x is scaled to -*> prevent overflow, but if the bound overflows, x is set to 0, x(j) to -*> 1, and scale to 0, and a non-trivial solution to A*x = 0 is found. -*> -*> Similarly, a row-wise scheme is used to solve A**T*x = b. The basic -*> algorithm for A upper triangular is -*> -*> for j = 1, ..., n -*> x(j) := ( b(j) - A[1:j-1,j]**T * x[1:j-1] ) / A(j,j) -*> end -*> -*> We simultaneously compute two bounds -*> G(j) = bound on ( b(i) - A[1:i-1,i]**T * x[1:i-1] ), 1<=i<=j -*> M(j) = bound on x(i), 1<=i<=j -*> -*> The initial values are G(0) = 0, M(0) = max{b(i), i=1,..,n}, and we -*> add the constraint G(j) >= G(j-1) and M(j) >= M(j-1) for j >= 1. -*> Then the bound on x(j) is -*> -*> M(j) <= M(j-1) * ( 1 + CNORM(j) ) / | A(j,j) | -*> -*> <= M(0) * product ( ( 1 + CNORM(i) ) / |A(i,i)| ) -*> 1<=i<=j -*> -*> and we can safely call DTRSV if 1/M(n) and 1/G(n) are both greater -*> than max(underflow, 1/overflow). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE, - $ CNORM, INFO ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER DIAG, NORMIN, TRANS, UPLO - INTEGER INFO, LDA, N - DOUBLE PRECISION SCALE -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), CNORM( * ), X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, HALF, ONE - PARAMETER ( ZERO = 0.0D+0, HALF = 0.5D+0, ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL NOTRAN, NOUNIT, UPPER - INTEGER I, IMAX, J, JFIRST, JINC, JLAST - DOUBLE PRECISION BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS, - $ TMAX, TSCAL, USCAL, XBND, XJ, XMAX -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER IDAMAX - DOUBLE PRECISION DASUM, DDOT, DLAMCH, DLANGE - EXTERNAL LSAME, IDAMAX, DASUM, DDOT, DLAMCH, DLANGE -* .. -* .. External Subroutines .. - EXTERNAL DAXPY, DSCAL, DTRSV, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN -* .. -* .. Executable Statements .. -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - NOTRAN = LSAME( TRANS, 'N' ) - NOUNIT = LSAME( DIAG, 'N' ) -* -* Test the input parameters. -* - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) .AND. .NOT. - $ LSAME( TRANS, 'C' ) ) THEN - INFO = -2 - ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN - INFO = -3 - ELSE IF( .NOT.LSAME( NORMIN, 'Y' ) .AND. .NOT. - $ LSAME( NORMIN, 'N' ) ) THEN - INFO = -4 - ELSE IF( N.LT.0 ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -7 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DLATRS', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - SCALE = ONE - IF( N.EQ.0 ) - $ RETURN -* -* Determine machine dependent parameters to control overflow. -* - SMLNUM = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' ) - BIGNUM = ONE / SMLNUM -* - IF( LSAME( NORMIN, 'N' ) ) THEN -* -* Compute the 1-norm of each column, not including the diagonal. -* - IF( UPPER ) THEN -* -* A is upper triangular. -* - DO 10 J = 1, N - CNORM( J ) = DASUM( J-1, A( 1, J ), 1 ) - 10 CONTINUE - ELSE -* -* A is lower triangular. -* - DO 20 J = 1, N - 1 - CNORM( J ) = DASUM( N-J, A( J+1, J ), 1 ) - 20 CONTINUE - CNORM( N ) = ZERO - END IF - END IF -* -* Scale the column norms by TSCAL if the maximum element in CNORM is -* greater than BIGNUM. -* - IMAX = IDAMAX( N, CNORM, 1 ) - TMAX = CNORM( IMAX ) - IF( TMAX.LE.BIGNUM ) THEN - TSCAL = ONE - ELSE -* -* Avoid NaN generation if entries in CNORM exceed the -* overflow threshold -* - IF( TMAX.LE.DLAMCH('Overflow') ) THEN -* Case 1: All entries in CNORM are valid floating-point numbers - TSCAL = ONE / ( SMLNUM*TMAX ) - CALL DSCAL( N, TSCAL, CNORM, 1 ) - ELSE -* Case 2: At least one column norm of A cannot be represented -* as floating-point number. Find the offdiagonal entry A( I, J ) -* with the largest absolute value. If this entry is not +/- Infinity, -* use this value as TSCAL. - TMAX = ZERO - IF( UPPER ) THEN -* -* A is upper triangular. -* - DO J = 2, N - TMAX = MAX( DLANGE( 'M', J-1, 1, A( 1, J ), 1, SUMJ ), - $ TMAX ) - END DO - ELSE -* -* A is lower triangular. -* - DO J = 1, N - 1 - TMAX = MAX( DLANGE( 'M', N-J, 1, A( J+1, J ), 1, - $ SUMJ ), TMAX ) - END DO - END IF -* - IF( TMAX.LE.DLAMCH('Overflow') ) THEN - TSCAL = ONE / ( SMLNUM*TMAX ) - DO J = 1, N - IF( CNORM( J ).LE.DLAMCH('Overflow') ) THEN - CNORM( J ) = CNORM( J )*TSCAL - ELSE -* Recompute the 1-norm without introducing Infinity -* in the summation - CNORM( J ) = ZERO - IF( UPPER ) THEN - DO I = 1, J - 1 - CNORM( J ) = CNORM( J ) + - $ TSCAL * ABS( A( I, J ) ) - END DO - ELSE - DO I = J + 1, N - CNORM( J ) = CNORM( J ) + - $ TSCAL * ABS( A( I, J ) ) - END DO - END IF - END IF - END DO - ELSE -* At least one entry of A is not a valid floating-point entry. -* Rely on TRSV to propagate Inf and NaN. - CALL DTRSV( UPLO, TRANS, DIAG, N, A, LDA, X, 1 ) - RETURN - END IF - END IF - END IF -* -* Compute a bound on the computed solution vector to see if the -* Level 2 BLAS routine DTRSV can be used. -* - J = IDAMAX( N, X, 1 ) - XMAX = ABS( X( J ) ) - XBND = XMAX - IF( NOTRAN ) THEN -* -* Compute the growth in A * x = b. -* - IF( UPPER ) THEN - JFIRST = N - JLAST = 1 - JINC = -1 - ELSE - JFIRST = 1 - JLAST = N - JINC = 1 - END IF -* - IF( TSCAL.NE.ONE ) THEN - GROW = ZERO - GO TO 50 - END IF -* - IF( NOUNIT ) THEN -* -* A is non-unit triangular. -* -* Compute GROW = 1/G(j) and XBND = 1/M(j). -* Initially, G(0) = max{x(i), i=1,...,n}. -* - GROW = ONE / MAX( XBND, SMLNUM ) - XBND = GROW - DO 30 J = JFIRST, JLAST, JINC -* -* Exit the loop if the growth factor is too small. -* - IF( GROW.LE.SMLNUM ) - $ GO TO 50 -* -* M(j) = G(j-1) / abs(A(j,j)) -* - TJJ = ABS( A( J, J ) ) - XBND = MIN( XBND, MIN( ONE, TJJ )*GROW ) - IF( TJJ+CNORM( J ).GE.SMLNUM ) THEN -* -* G(j) = G(j-1)*( 1 + CNORM(j) / abs(A(j,j)) ) -* - GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) ) - ELSE -* -* G(j) could overflow, set GROW to 0. -* - GROW = ZERO - END IF - 30 CONTINUE - GROW = XBND - ELSE -* -* A is unit triangular. -* -* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. -* - GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) ) - DO 40 J = JFIRST, JLAST, JINC -* -* Exit the loop if the growth factor is too small. -* - IF( GROW.LE.SMLNUM ) - $ GO TO 50 -* -* G(j) = G(j-1)*( 1 + CNORM(j) ) -* - GROW = GROW*( ONE / ( ONE+CNORM( J ) ) ) - 40 CONTINUE - END IF - 50 CONTINUE -* - ELSE -* -* Compute the growth in A**T * x = b. -* - IF( UPPER ) THEN - JFIRST = 1 - JLAST = N - JINC = 1 - ELSE - JFIRST = N - JLAST = 1 - JINC = -1 - END IF -* - IF( TSCAL.NE.ONE ) THEN - GROW = ZERO - GO TO 80 - END IF -* - IF( NOUNIT ) THEN -* -* A is non-unit triangular. -* -* Compute GROW = 1/G(j) and XBND = 1/M(j). -* Initially, M(0) = max{x(i), i=1,...,n}. -* - GROW = ONE / MAX( XBND, SMLNUM ) - XBND = GROW - DO 60 J = JFIRST, JLAST, JINC -* -* Exit the loop if the growth factor is too small. -* - IF( GROW.LE.SMLNUM ) - $ GO TO 80 -* -* G(j) = max( G(j-1), M(j-1)*( 1 + CNORM(j) ) ) -* - XJ = ONE + CNORM( J ) - GROW = MIN( GROW, XBND / XJ ) -* -* M(j) = M(j-1)*( 1 + CNORM(j) ) / abs(A(j,j)) -* - TJJ = ABS( A( J, J ) ) - IF( XJ.GT.TJJ ) - $ XBND = XBND*( TJJ / XJ ) - 60 CONTINUE - GROW = MIN( GROW, XBND ) - ELSE -* -* A is unit triangular. -* -* Compute GROW = 1/G(j), where G(0) = max{x(i), i=1,...,n}. -* - GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) ) - DO 70 J = JFIRST, JLAST, JINC -* -* Exit the loop if the growth factor is too small. -* - IF( GROW.LE.SMLNUM ) - $ GO TO 80 -* -* G(j) = ( 1 + CNORM(j) )*G(j-1) -* - XJ = ONE + CNORM( J ) - GROW = GROW / XJ - 70 CONTINUE - END IF - 80 CONTINUE - END IF -* - IF( ( GROW*TSCAL ).GT.SMLNUM ) THEN -* -* Use the Level 2 BLAS solve if the reciprocal of the bound on -* elements of X is not too small. -* - CALL DTRSV( UPLO, TRANS, DIAG, N, A, LDA, X, 1 ) - ELSE -* -* Use a Level 1 BLAS solve, scaling intermediate results. -* - IF( XMAX.GT.BIGNUM ) THEN -* -* Scale X so that its components are less than or equal to -* BIGNUM in absolute value. -* - SCALE = BIGNUM / XMAX - CALL DSCAL( N, SCALE, X, 1 ) - XMAX = BIGNUM - END IF -* - IF( NOTRAN ) THEN -* -* Solve A * x = b -* - DO 110 J = JFIRST, JLAST, JINC -* -* Compute x(j) = b(j) / A(j,j), scaling x if necessary. -* - XJ = ABS( X( J ) ) - IF( NOUNIT ) THEN - TJJS = A( J, J )*TSCAL - ELSE - TJJS = TSCAL - IF( TSCAL.EQ.ONE ) - $ GO TO 100 - END IF - TJJ = ABS( TJJS ) - IF( TJJ.GT.SMLNUM ) THEN -* -* abs(A(j,j)) > SMLNUM: -* - IF( TJJ.LT.ONE ) THEN - IF( XJ.GT.TJJ*BIGNUM ) THEN -* -* Scale x by 1/b(j). -* - REC = ONE / XJ - CALL DSCAL( N, REC, X, 1 ) - SCALE = SCALE*REC - XMAX = XMAX*REC - END IF - END IF - X( J ) = X( J ) / TJJS - XJ = ABS( X( J ) ) - ELSE IF( TJJ.GT.ZERO ) THEN -* -* 0 < abs(A(j,j)) <= SMLNUM: -* - IF( XJ.GT.TJJ*BIGNUM ) THEN -* -* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM -* to avoid overflow when dividing by A(j,j). -* - REC = ( TJJ*BIGNUM ) / XJ - IF( CNORM( J ).GT.ONE ) THEN -* -* Scale by 1/CNORM(j) to avoid overflow when -* multiplying x(j) times column j. -* - REC = REC / CNORM( J ) - END IF - CALL DSCAL( N, REC, X, 1 ) - SCALE = SCALE*REC - XMAX = XMAX*REC - END IF - X( J ) = X( J ) / TJJS - XJ = ABS( X( J ) ) - ELSE -* -* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and -* scale = 0, and compute a solution to A*x = 0. -* - DO 90 I = 1, N - X( I ) = ZERO - 90 CONTINUE - X( J ) = ONE - XJ = ONE - SCALE = ZERO - XMAX = ZERO - END IF - 100 CONTINUE -* -* Scale x if necessary to avoid overflow when adding a -* multiple of column j of A. -* - IF( XJ.GT.ONE ) THEN - REC = ONE / XJ - IF( CNORM( J ).GT.( BIGNUM-XMAX )*REC ) THEN -* -* Scale x by 1/(2*abs(x(j))). -* - REC = REC*HALF - CALL DSCAL( N, REC, X, 1 ) - SCALE = SCALE*REC - END IF - ELSE IF( XJ*CNORM( J ).GT.( BIGNUM-XMAX ) ) THEN -* -* Scale x by 1/2. -* - CALL DSCAL( N, HALF, X, 1 ) - SCALE = SCALE*HALF - END IF -* - IF( UPPER ) THEN - IF( J.GT.1 ) THEN -* -* Compute the update -* x(1:j-1) := x(1:j-1) - x(j) * A(1:j-1,j) -* - CALL DAXPY( J-1, -X( J )*TSCAL, A( 1, J ), 1, X, - $ 1 ) - I = IDAMAX( J-1, X, 1 ) - XMAX = ABS( X( I ) ) - END IF - ELSE - IF( J.LT.N ) THEN -* -* Compute the update -* x(j+1:n) := x(j+1:n) - x(j) * A(j+1:n,j) -* - CALL DAXPY( N-J, -X( J )*TSCAL, A( J+1, J ), 1, - $ X( J+1 ), 1 ) - I = J + IDAMAX( N-J, X( J+1 ), 1 ) - XMAX = ABS( X( I ) ) - END IF - END IF - 110 CONTINUE -* - ELSE -* -* Solve A**T * x = b -* - DO 160 J = JFIRST, JLAST, JINC -* -* Compute x(j) = b(j) - sum A(k,j)*x(k). -* k<>j -* - XJ = ABS( X( J ) ) - USCAL = TSCAL - REC = ONE / MAX( XMAX, ONE ) - IF( CNORM( J ).GT.( BIGNUM-XJ )*REC ) THEN -* -* If x(j) could overflow, scale x by 1/(2*XMAX). -* - REC = REC*HALF - IF( NOUNIT ) THEN - TJJS = A( J, J )*TSCAL - ELSE - TJJS = TSCAL - END IF - TJJ = ABS( TJJS ) - IF( TJJ.GT.ONE ) THEN -* -* Divide by A(j,j) when scaling x if A(j,j) > 1. -* - REC = MIN( ONE, REC*TJJ ) - USCAL = USCAL / TJJS - END IF - IF( REC.LT.ONE ) THEN - CALL DSCAL( N, REC, X, 1 ) - SCALE = SCALE*REC - XMAX = XMAX*REC - END IF - END IF -* - SUMJ = ZERO - IF( USCAL.EQ.ONE ) THEN -* -* If the scaling needed for A in the dot product is 1, -* call DDOT to perform the dot product. -* - IF( UPPER ) THEN - SUMJ = DDOT( J-1, A( 1, J ), 1, X, 1 ) - ELSE IF( J.LT.N ) THEN - SUMJ = DDOT( N-J, A( J+1, J ), 1, X( J+1 ), 1 ) - END IF - ELSE -* -* Otherwise, use in-line code for the dot product. -* - IF( UPPER ) THEN - DO 120 I = 1, J - 1 - SUMJ = SUMJ + ( A( I, J )*USCAL )*X( I ) - 120 CONTINUE - ELSE IF( J.LT.N ) THEN - DO 130 I = J + 1, N - SUMJ = SUMJ + ( A( I, J )*USCAL )*X( I ) - 130 CONTINUE - END IF - END IF -* - IF( USCAL.EQ.TSCAL ) THEN -* -* Compute x(j) := ( x(j) - sumj ) / A(j,j) if 1/A(j,j) -* was not used to scale the dotproduct. -* - X( J ) = X( J ) - SUMJ - XJ = ABS( X( J ) ) - IF( NOUNIT ) THEN - TJJS = A( J, J )*TSCAL - ELSE - TJJS = TSCAL - IF( TSCAL.EQ.ONE ) - $ GO TO 150 - END IF -* -* Compute x(j) = x(j) / A(j,j), scaling if necessary. -* - TJJ = ABS( TJJS ) - IF( TJJ.GT.SMLNUM ) THEN -* -* abs(A(j,j)) > SMLNUM: -* - IF( TJJ.LT.ONE ) THEN - IF( XJ.GT.TJJ*BIGNUM ) THEN -* -* Scale X by 1/abs(x(j)). -* - REC = ONE / XJ - CALL DSCAL( N, REC, X, 1 ) - SCALE = SCALE*REC - XMAX = XMAX*REC - END IF - END IF - X( J ) = X( J ) / TJJS - ELSE IF( TJJ.GT.ZERO ) THEN -* -* 0 < abs(A(j,j)) <= SMLNUM: -* - IF( XJ.GT.TJJ*BIGNUM ) THEN -* -* Scale x by (1/abs(x(j)))*abs(A(j,j))*BIGNUM. -* - REC = ( TJJ*BIGNUM ) / XJ - CALL DSCAL( N, REC, X, 1 ) - SCALE = SCALE*REC - XMAX = XMAX*REC - END IF - X( J ) = X( J ) / TJJS - ELSE -* -* A(j,j) = 0: Set x(1:n) = 0, x(j) = 1, and -* scale = 0, and compute a solution to A**T*x = 0. -* - DO 140 I = 1, N - X( I ) = ZERO - 140 CONTINUE - X( J ) = ONE - SCALE = ZERO - XMAX = ZERO - END IF - 150 CONTINUE - ELSE -* -* Compute x(j) := x(j) / A(j,j) - sumj if the dot -* product has already been divided by 1/A(j,j). -* - X( J ) = X( J ) / TJJS - SUMJ - END IF - XMAX = MAX( XMAX, ABS( X( J ) ) ) - 160 CONTINUE - END IF - SCALE = SCALE / TSCAL - END IF -* -* Scale the column norms by 1/TSCAL for return. -* - IF( TSCAL.NE.ONE ) THEN - CALL DSCAL( N, ONE / TSCAL, CNORM, 1 ) - END IF -* - RETURN -* -* End of DLATRS -* - END diff --git a/lib/linalg/fortran/dnrm2.f b/lib/linalg/fortran/dnrm2.f deleted file mode 100644 index 30552e1d1d..0000000000 --- a/lib/linalg/fortran/dnrm2.f +++ /dev/null @@ -1,132 +0,0 @@ -*> \brief \b DNRM2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DNRM2(N,X,INCX) -* -* .. Scalar Arguments .. -* INTEGER INCX,N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION X(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DNRM2 returns the euclidean norm of a vector via the function -*> name, so that -*> -*> DNRM2 := sqrt( x'*x ) -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of DX -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date December 2016 -* -*> \ingroup double_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> -- This version written on 25-October-1982. -*> Modified on 14-October-1993 to inline the call to DLASSQ. -*> Sven Hammarling, Nag Ltd. -*> \endverbatim -*> -* ===================================================================== - DOUBLE PRECISION FUNCTION DNRM2(N,X,INCX) -* -* -- Reference BLAS level1 routine (version 3.7.0) -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* December 2016 -* -* .. Scalar Arguments .. - INTEGER INCX,N -* .. -* .. Array Arguments .. - DOUBLE PRECISION X(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE,ZERO - PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) -* .. -* .. Local Scalars .. - DOUBLE PRECISION ABSXI,NORM,SCALE,SSQ - INTEGER IX -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS,SQRT -* .. - IF (N.LT.1 .OR. INCX.LT.1) THEN - NORM = ZERO - ELSE IF (N.EQ.1) THEN - NORM = ABS(X(1)) - ELSE - SCALE = ZERO - SSQ = ONE -* The following loop is equivalent to this call to the LAPACK -* auxiliary routine: -* CALL DLASSQ( N, X, INCX, SCALE, SSQ ) -* - DO 10 IX = 1,1 + (N-1)*INCX,INCX - IF (X(IX).NE.ZERO) THEN - ABSXI = ABS(X(IX)) - IF (SCALE.LT.ABSXI) THEN - SSQ = ONE + SSQ* (SCALE/ABSXI)**2 - SCALE = ABSXI - ELSE - SSQ = SSQ + (ABSXI/SCALE)**2 - END IF - END IF - 10 CONTINUE - NORM = SCALE*SQRT(SSQ) - END IF -* - DNRM2 = NORM - RETURN -* -* End of DNRM2. -* - END diff --git a/lib/linalg/fortran/dorg2l.f b/lib/linalg/fortran/dorg2l.f deleted file mode 100644 index 0a42d4cf5a..0000000000 --- a/lib/linalg/fortran/dorg2l.f +++ /dev/null @@ -1,195 +0,0 @@ -*> \brief \b DORG2L generates all or part of the orthogonal matrix Q from a QL factorization determined by sgeqlf (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORG2L + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORG2L( M, N, K, A, LDA, TAU, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDA, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORG2L generates an m by n real matrix Q with orthonormal columns, -*> which is defined as the last n columns of a product of k elementary -*> reflectors of order m -*> -*> Q = H(k) . . . H(2) H(1) -*> -*> as returned by DGEQLF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix Q. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix Q. M >= N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines the -*> matrix Q. N >= K >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the (n-k+i)-th column must contain the vector which -*> defines the elementary reflector H(i), for i = 1,2,...,k, as -*> returned by DGEQLF in the last k columns of its array -*> argument A. -*> On exit, the m by n matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The first dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DGEQLF. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument has an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORG2L( M, N, K, A, LDA, TAU, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDA, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, II, J, L -* .. -* .. External Subroutines .. - EXTERNAL DLARF, DSCAL, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 .OR. N.GT.M ) THEN - INFO = -2 - ELSE IF( K.LT.0 .OR. K.GT.N ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORG2L', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.LE.0 ) - $ RETURN -* -* Initialise columns 1:n-k to columns of the unit matrix -* - DO 20 J = 1, N - K - DO 10 L = 1, M - A( L, J ) = ZERO - 10 CONTINUE - A( M-N+J, J ) = ONE - 20 CONTINUE -* - DO 40 I = 1, K - II = N - K + I -* -* Apply H(i) to A(1:m-k+i,1:n-k+i) from the left -* - A( M-N+II, II ) = ONE - CALL DLARF( 'Left', M-N+II, II-1, A( 1, II ), 1, TAU( I ), A, - $ LDA, WORK ) - CALL DSCAL( M-N+II-1, -TAU( I ), A( 1, II ), 1 ) - A( M-N+II, II ) = ONE - TAU( I ) -* -* Set A(m-k+i+1:m,n-k+i) to zero -* - DO 30 L = M - N + II + 1, M - A( L, II ) = ZERO - 30 CONTINUE - 40 CONTINUE - RETURN -* -* End of DORG2L -* - END diff --git a/lib/linalg/fortran/dorg2r.f b/lib/linalg/fortran/dorg2r.f deleted file mode 100644 index c64ad4b0ac..0000000000 --- a/lib/linalg/fortran/dorg2r.f +++ /dev/null @@ -1,197 +0,0 @@ -*> \brief \b DORG2R generates all or part of the orthogonal matrix Q from a QR factorization determined by sgeqrf (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORG2R + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORG2R( M, N, K, A, LDA, TAU, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDA, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORG2R generates an m by n real matrix Q with orthonormal columns, -*> which is defined as the first n columns of a product of k elementary -*> reflectors of order m -*> -*> Q = H(1) H(2) . . . H(k) -*> -*> as returned by DGEQRF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix Q. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix Q. M >= N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines the -*> matrix Q. N >= K >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the i-th column must contain the vector which -*> defines the elementary reflector H(i), for i = 1,2,...,k, as -*> returned by DGEQRF in the first k columns of its array -*> argument A. -*> On exit, the m-by-n matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The first dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DGEQRF. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument has an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORG2R( M, N, K, A, LDA, TAU, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDA, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J, L -* .. -* .. External Subroutines .. - EXTERNAL DLARF, DSCAL, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 .OR. N.GT.M ) THEN - INFO = -2 - ELSE IF( K.LT.0 .OR. K.GT.N ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORG2R', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.LE.0 ) - $ RETURN -* -* Initialise columns k+1:n to columns of the unit matrix -* - DO 20 J = K + 1, N - DO 10 L = 1, M - A( L, J ) = ZERO - 10 CONTINUE - A( J, J ) = ONE - 20 CONTINUE -* - DO 40 I = K, 1, -1 -* -* Apply H(i) to A(i:m,i:n) from the left -* - IF( I.LT.N ) THEN - A( I, I ) = ONE - CALL DLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAU( I ), - $ A( I, I+1 ), LDA, WORK ) - END IF - IF( I.LT.M ) - $ CALL DSCAL( M-I, -TAU( I ), A( I+1, I ), 1 ) - A( I, I ) = ONE - TAU( I ) -* -* Set A(1:i-1,i) to zero -* - DO 30 L = 1, I - 1 - A( L, I ) = ZERO - 30 CONTINUE - 40 CONTINUE - RETURN -* -* End of DORG2R -* - END diff --git a/lib/linalg/fortran/dorgbr.f b/lib/linalg/fortran/dorgbr.f deleted file mode 100644 index 7dfd03961e..0000000000 --- a/lib/linalg/fortran/dorgbr.f +++ /dev/null @@ -1,334 +0,0 @@ -*> \brief \b DORGBR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORGBR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORGBR( VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER VECT -* INTEGER INFO, K, LDA, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORGBR generates one of the real orthogonal matrices Q or P**T -*> determined by DGEBRD when reducing a real matrix A to bidiagonal -*> form: A = Q * B * P**T. Q and P**T are defined as products of -*> elementary reflectors H(i) or G(i) respectively. -*> -*> If VECT = 'Q', A is assumed to have been an M-by-K matrix, and Q -*> is of order M: -*> if m >= k, Q = H(1) H(2) . . . H(k) and DORGBR returns the first n -*> columns of Q, where m >= n >= k; -*> if m < k, Q = H(1) H(2) . . . H(m-1) and DORGBR returns Q as an -*> M-by-M matrix. -*> -*> If VECT = 'P', A is assumed to have been a K-by-N matrix, and P**T -*> is of order N: -*> if k < n, P**T = G(k) . . . G(2) G(1) and DORGBR returns the first m -*> rows of P**T, where n >= m >= k; -*> if k >= n, P**T = G(n-1) . . . G(2) G(1) and DORGBR returns P**T as -*> an N-by-N matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] VECT -*> \verbatim -*> VECT is CHARACTER*1 -*> Specifies whether the matrix Q or the matrix P**T is -*> required, as defined in the transformation applied by DGEBRD: -*> = 'Q': generate Q; -*> = 'P': generate P**T. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix Q or P**T to be returned. -*> M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix Q or P**T to be returned. -*> N >= 0. -*> If VECT = 'Q', M >= N >= min(M,K); -*> if VECT = 'P', N >= M >= min(N,K). -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> If VECT = 'Q', the number of columns in the original M-by-K -*> matrix reduced by DGEBRD. -*> If VECT = 'P', the number of rows in the original K-by-N -*> matrix reduced by DGEBRD. -*> K >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the vectors which define the elementary reflectors, -*> as returned by DGEBRD. -*> On exit, the M-by-N matrix Q or P**T. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension -*> (min(M,K)) if VECT = 'Q' -*> (min(N,K)) if VECT = 'P' -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i) or G(i), which determines Q or P**T, as -*> returned by DGEBRD in its array argument TAUQ or TAUP. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= max(1,min(M,N)). -*> For optimum performance LWORK >= min(M,N)*NB, where NB -*> is the optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGBcomputational -* -* ===================================================================== - SUBROUTINE DORGBR( VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER VECT - INTEGER INFO, K, LDA, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY, WANTQ - INTEGER I, IINFO, J, LWKOPT, MN -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL DORGLQ, DORGQR, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - WANTQ = LSAME( VECT, 'Q' ) - MN = MIN( M, N ) - LQUERY = ( LWORK.EQ.-1 ) - IF( .NOT.WANTQ .AND. .NOT.LSAME( VECT, 'P' ) ) THEN - INFO = -1 - ELSE IF( M.LT.0 ) THEN - INFO = -2 - ELSE IF( N.LT.0 .OR. ( WANTQ .AND. ( N.GT.M .OR. N.LT.MIN( M, - $ K ) ) ) .OR. ( .NOT.WANTQ .AND. ( M.GT.N .OR. M.LT. - $ MIN( N, K ) ) ) ) THEN - INFO = -3 - ELSE IF( K.LT.0 ) THEN - INFO = -4 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -6 - ELSE IF( LWORK.LT.MAX( 1, MN ) .AND. .NOT.LQUERY ) THEN - INFO = -9 - END IF -* - IF( INFO.EQ.0 ) THEN - WORK( 1 ) = 1 - IF( WANTQ ) THEN - IF( M.GE.K ) THEN - CALL DORGQR( M, N, K, A, LDA, TAU, WORK, -1, IINFO ) - ELSE - IF( M.GT.1 ) THEN - CALL DORGQR( M-1, M-1, M-1, A, LDA, TAU, WORK, -1, - $ IINFO ) - END IF - END IF - ELSE - IF( K.LT.N ) THEN - CALL DORGLQ( M, N, K, A, LDA, TAU, WORK, -1, IINFO ) - ELSE - IF( N.GT.1 ) THEN - CALL DORGLQ( N-1, N-1, N-1, A, LDA, TAU, WORK, -1, - $ IINFO ) - END IF - END IF - END IF - LWKOPT = INT( WORK( 1 ) ) - LWKOPT = MAX (LWKOPT, MN) - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORGBR', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - WORK( 1 ) = LWKOPT - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - IF( WANTQ ) THEN -* -* Form Q, determined by a call to DGEBRD to reduce an m-by-k -* matrix -* - IF( M.GE.K ) THEN -* -* If m >= k, assume m >= n >= k -* - CALL DORGQR( M, N, K, A, LDA, TAU, WORK, LWORK, IINFO ) -* - ELSE -* -* If m < k, assume m = n -* -* Shift the vectors which define the elementary reflectors one -* column to the right, and set the first row and column of Q -* to those of the unit matrix -* - DO 20 J = M, 2, -1 - A( 1, J ) = ZERO - DO 10 I = J + 1, M - A( I, J ) = A( I, J-1 ) - 10 CONTINUE - 20 CONTINUE - A( 1, 1 ) = ONE - DO 30 I = 2, M - A( I, 1 ) = ZERO - 30 CONTINUE - IF( M.GT.1 ) THEN -* -* Form Q(2:m,2:m) -* - CALL DORGQR( M-1, M-1, M-1, A( 2, 2 ), LDA, TAU, WORK, - $ LWORK, IINFO ) - END IF - END IF - ELSE -* -* Form P**T, determined by a call to DGEBRD to reduce a k-by-n -* matrix -* - IF( K.LT.N ) THEN -* -* If k < n, assume k <= m <= n -* - CALL DORGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, IINFO ) -* - ELSE -* -* If k >= n, assume m = n -* -* Shift the vectors which define the elementary reflectors one -* row downward, and set the first row and column of P**T to -* those of the unit matrix -* - A( 1, 1 ) = ONE - DO 40 I = 2, N - A( I, 1 ) = ZERO - 40 CONTINUE - DO 60 J = 2, N - DO 50 I = J - 1, 2, -1 - A( I, J ) = A( I-1, J ) - 50 CONTINUE - A( 1, J ) = ZERO - 60 CONTINUE - IF( N.GT.1 ) THEN -* -* Form P**T(2:n,2:n) -* - CALL DORGLQ( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK, - $ LWORK, IINFO ) - END IF - END IF - END IF - WORK( 1 ) = LWKOPT - RETURN -* -* End of DORGBR -* - END diff --git a/lib/linalg/fortran/dorgl2.f b/lib/linalg/fortran/dorgl2.f deleted file mode 100644 index ce1d2c6750..0000000000 --- a/lib/linalg/fortran/dorgl2.f +++ /dev/null @@ -1,201 +0,0 @@ -*> \brief \b DORGL2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORGL2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORGL2( M, N, K, A, LDA, TAU, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDA, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORGL2 generates an m by n real matrix Q with orthonormal rows, -*> which is defined as the first m rows of a product of k elementary -*> reflectors of order n -*> -*> Q = H(k) . . . H(2) H(1) -*> -*> as returned by DGELQF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix Q. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix Q. N >= M. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines the -*> matrix Q. M >= K >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the i-th row must contain the vector which defines -*> the elementary reflector H(i), for i = 1,2,...,k, as returned -*> by DGELQF in the first k rows of its array argument A. -*> On exit, the m-by-n matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The first dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DGELQF. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (M) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument has an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORGL2( M, N, K, A, LDA, TAU, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDA, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J, L -* .. -* .. External Subroutines .. - EXTERNAL DLARF, DSCAL, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.M ) THEN - INFO = -2 - ELSE IF( K.LT.0 .OR. K.GT.M ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORGL2', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( M.LE.0 ) - $ RETURN -* - IF( K.LT.M ) THEN -* -* Initialise rows k+1:m to rows of the unit matrix -* - DO 20 J = 1, N - DO 10 L = K + 1, M - A( L, J ) = ZERO - 10 CONTINUE - IF( J.GT.K .AND. J.LE.M ) - $ A( J, J ) = ONE - 20 CONTINUE - END IF -* - DO 40 I = K, 1, -1 -* -* Apply H(i) to A(i:m,i:n) from the right -* - IF( I.LT.N ) THEN - IF( I.LT.M ) THEN - A( I, I ) = ONE - CALL DLARF( 'Right', M-I, N-I+1, A( I, I ), LDA, - $ TAU( I ), A( I+1, I ), LDA, WORK ) - END IF - CALL DSCAL( N-I, -TAU( I ), A( I, I+1 ), LDA ) - END IF - A( I, I ) = ONE - TAU( I ) -* -* Set A(i,1:i-1) to zero -* - DO 30 L = 1, I - 1 - A( I, L ) = ZERO - 30 CONTINUE - 40 CONTINUE - RETURN -* -* End of DORGL2 -* - END diff --git a/lib/linalg/fortran/dorglq.f b/lib/linalg/fortran/dorglq.f deleted file mode 100644 index 8c37c18b75..0000000000 --- a/lib/linalg/fortran/dorglq.f +++ /dev/null @@ -1,286 +0,0 @@ -*> \brief \b DORGLQ -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORGLQ + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDA, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORGLQ generates an M-by-N real matrix Q with orthonormal rows, -*> which is defined as the first M rows of a product of K elementary -*> reflectors of order N -*> -*> Q = H(k) . . . H(2) H(1) -*> -*> as returned by DGELQF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix Q. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix Q. N >= M. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines the -*> matrix Q. M >= K >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the i-th row must contain the vector which defines -*> the elementary reflector H(i), for i = 1,2,...,k, as returned -*> by DGELQF in the first k rows of its array argument A. -*> On exit, the M-by-N matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The first dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DGELQF. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= max(1,M). -*> For optimum performance LWORK >= M*NB, where NB is -*> the optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument has an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORGLQ( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDA, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER I, IB, IINFO, IWS, J, KI, KK, L, LDWORK, - $ LWKOPT, NB, NBMIN, NX -* .. -* .. External Subroutines .. - EXTERNAL DLARFB, DLARFT, DORGL2, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - NB = ILAENV( 1, 'DORGLQ', ' ', M, N, K, -1 ) - LWKOPT = MAX( 1, M )*NB - WORK( 1 ) = LWKOPT - LQUERY = ( LWORK.EQ.-1 ) - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.M ) THEN - INFO = -2 - ELSE IF( K.LT.0 .OR. K.GT.M ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN - INFO = -8 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORGLQ', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( M.LE.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - NBMIN = 2 - NX = 0 - IWS = M - IF( NB.GT.1 .AND. NB.LT.K ) THEN -* -* Determine when to cross over from blocked to unblocked code. -* - NX = MAX( 0, ILAENV( 3, 'DORGLQ', ' ', M, N, K, -1 ) ) - IF( NX.LT.K ) THEN -* -* Determine if workspace is large enough for blocked code. -* - LDWORK = M - IWS = LDWORK*NB - IF( LWORK.LT.IWS ) THEN -* -* Not enough workspace to use optimal NB: reduce NB and -* determine the minimum value of NB. -* - NB = LWORK / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'DORGLQ', ' ', M, N, K, -1 ) ) - END IF - END IF - END IF -* - IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN -* -* Use blocked code after the last block. -* The first kk rows are handled by the block method. -* - KI = ( ( K-NX-1 ) / NB )*NB - KK = MIN( K, KI+NB ) -* -* Set A(kk+1:m,1:kk) to zero. -* - DO 20 J = 1, KK - DO 10 I = KK + 1, M - A( I, J ) = ZERO - 10 CONTINUE - 20 CONTINUE - ELSE - KK = 0 - END IF -* -* Use unblocked code for the last or only block. -* - IF( KK.LT.M ) - $ CALL DORGL2( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA, - $ TAU( KK+1 ), WORK, IINFO ) -* - IF( KK.GT.0 ) THEN -* -* Use blocked code -* - DO 50 I = KI + 1, 1, -NB - IB = MIN( NB, K-I+1 ) - IF( I+IB.LE.M ) THEN -* -* Form the triangular factor of the block reflector -* H = H(i) H(i+1) . . . H(i+ib-1) -* - CALL DLARFT( 'Forward', 'Rowwise', N-I+1, IB, A( I, I ), - $ LDA, TAU( I ), WORK, LDWORK ) -* -* Apply H**T to A(i+ib:m,i:n) from the right -* - CALL DLARFB( 'Right', 'Transpose', 'Forward', 'Rowwise', - $ M-I-IB+1, N-I+1, IB, A( I, I ), LDA, WORK, - $ LDWORK, A( I+IB, I ), LDA, WORK( IB+1 ), - $ LDWORK ) - END IF -* -* Apply H**T to columns i:n of current block -* - CALL DORGL2( IB, N-I+1, IB, A( I, I ), LDA, TAU( I ), WORK, - $ IINFO ) -* -* Set columns 1:i-1 of current block to zero -* - DO 40 J = 1, I - 1 - DO 30 L = I, I + IB - 1 - A( L, J ) = ZERO - 30 CONTINUE - 40 CONTINUE - 50 CONTINUE - END IF -* - WORK( 1 ) = IWS - RETURN -* -* End of DORGLQ -* - END diff --git a/lib/linalg/fortran/dorgql.f b/lib/linalg/fortran/dorgql.f deleted file mode 100644 index 45e5bf19f1..0000000000 --- a/lib/linalg/fortran/dorgql.f +++ /dev/null @@ -1,293 +0,0 @@ -*> \brief \b DORGQL -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORGQL + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDA, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORGQL generates an M-by-N real matrix Q with orthonormal columns, -*> which is defined as the last N columns of a product of K elementary -*> reflectors of order M -*> -*> Q = H(k) . . . H(2) H(1) -*> -*> as returned by DGEQLF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix Q. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix Q. M >= N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines the -*> matrix Q. N >= K >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the (n-k+i)-th column must contain the vector which -*> defines the elementary reflector H(i), for i = 1,2,...,k, as -*> returned by DGEQLF in the last k columns of its array -*> argument A. -*> On exit, the M-by-N matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The first dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DGEQLF. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= max(1,N). -*> For optimum performance LWORK >= N*NB, where NB is the -*> optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument has an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDA, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER I, IB, IINFO, IWS, J, KK, L, LDWORK, LWKOPT, - $ NB, NBMIN, NX -* .. -* .. External Subroutines .. - EXTERNAL DLARFB, DLARFT, DORG2L, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LQUERY = ( LWORK.EQ.-1 ) - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 .OR. N.GT.M ) THEN - INFO = -2 - ELSE IF( K.LT.0 .OR. K.GT.N ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - END IF -* - IF( INFO.EQ.0 ) THEN - IF( N.EQ.0 ) THEN - LWKOPT = 1 - ELSE - NB = ILAENV( 1, 'DORGQL', ' ', M, N, K, -1 ) - LWKOPT = N*NB - END IF - WORK( 1 ) = LWKOPT -* - IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN - INFO = -8 - END IF - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORGQL', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.LE.0 ) THEN - RETURN - END IF -* - NBMIN = 2 - NX = 0 - IWS = N - IF( NB.GT.1 .AND. NB.LT.K ) THEN -* -* Determine when to cross over from blocked to unblocked code. -* - NX = MAX( 0, ILAENV( 3, 'DORGQL', ' ', M, N, K, -1 ) ) - IF( NX.LT.K ) THEN -* -* Determine if workspace is large enough for blocked code. -* - LDWORK = N - IWS = LDWORK*NB - IF( LWORK.LT.IWS ) THEN -* -* Not enough workspace to use optimal NB: reduce NB and -* determine the minimum value of NB. -* - NB = LWORK / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'DORGQL', ' ', M, N, K, -1 ) ) - END IF - END IF - END IF -* - IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN -* -* Use blocked code after the first block. -* The last kk columns are handled by the block method. -* - KK = MIN( K, ( ( K-NX+NB-1 ) / NB )*NB ) -* -* Set A(m-kk+1:m,1:n-kk) to zero. -* - DO 20 J = 1, N - KK - DO 10 I = M - KK + 1, M - A( I, J ) = ZERO - 10 CONTINUE - 20 CONTINUE - ELSE - KK = 0 - END IF -* -* Use unblocked code for the first or only block. -* - CALL DORG2L( M-KK, N-KK, K-KK, A, LDA, TAU, WORK, IINFO ) -* - IF( KK.GT.0 ) THEN -* -* Use blocked code -* - DO 50 I = K - KK + 1, K, NB - IB = MIN( NB, K-I+1 ) - IF( N-K+I.GT.1 ) THEN -* -* Form the triangular factor of the block reflector -* H = H(i+ib-1) . . . H(i+1) H(i) -* - CALL DLARFT( 'Backward', 'Columnwise', M-K+I+IB-1, IB, - $ A( 1, N-K+I ), LDA, TAU( I ), WORK, LDWORK ) -* -* Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left -* - CALL DLARFB( 'Left', 'No transpose', 'Backward', - $ 'Columnwise', M-K+I+IB-1, N-K+I-1, IB, - $ A( 1, N-K+I ), LDA, WORK, LDWORK, A, LDA, - $ WORK( IB+1 ), LDWORK ) - END IF -* -* Apply H to rows 1:m-k+i+ib-1 of current block -* - CALL DORG2L( M-K+I+IB-1, IB, IB, A( 1, N-K+I ), LDA, - $ TAU( I ), WORK, IINFO ) -* -* Set rows m-k+i+ib:m of current block to zero -* - DO 40 J = N - K + I, N - K + I + IB - 1 - DO 30 L = M - K + I + IB, M - A( L, J ) = ZERO - 30 CONTINUE - 40 CONTINUE - 50 CONTINUE - END IF -* - WORK( 1 ) = IWS - RETURN -* -* End of DORGQL -* - END diff --git a/lib/linalg/fortran/dorgqr.f b/lib/linalg/fortran/dorgqr.f deleted file mode 100644 index a41ce7ed56..0000000000 --- a/lib/linalg/fortran/dorgqr.f +++ /dev/null @@ -1,287 +0,0 @@ -*> \brief \b DORGQR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORGQR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDA, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORGQR generates an M-by-N real matrix Q with orthonormal columns, -*> which is defined as the first N columns of a product of K elementary -*> reflectors of order M -*> -*> Q = H(1) H(2) . . . H(k) -*> -*> as returned by DGEQRF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix Q. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix Q. M >= N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines the -*> matrix Q. N >= K >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the i-th column must contain the vector which -*> defines the elementary reflector H(i), for i = 1,2,...,k, as -*> returned by DGEQRF in the first k columns of its array -*> argument A. -*> On exit, the M-by-N matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The first dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DGEQRF. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= max(1,N). -*> For optimum performance LWORK >= N*NB, where NB is the -*> optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument has an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDA, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER I, IB, IINFO, IWS, J, KI, KK, L, LDWORK, - $ LWKOPT, NB, NBMIN, NX -* .. -* .. External Subroutines .. - EXTERNAL DLARFB, DLARFT, DORG2R, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - NB = ILAENV( 1, 'DORGQR', ' ', M, N, K, -1 ) - LWKOPT = MAX( 1, N )*NB - WORK( 1 ) = LWKOPT - LQUERY = ( LWORK.EQ.-1 ) - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 .OR. N.GT.M ) THEN - INFO = -2 - ELSE IF( K.LT.0 .OR. K.GT.N ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN - INFO = -8 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORGQR', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.LE.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - NBMIN = 2 - NX = 0 - IWS = N - IF( NB.GT.1 .AND. NB.LT.K ) THEN -* -* Determine when to cross over from blocked to unblocked code. -* - NX = MAX( 0, ILAENV( 3, 'DORGQR', ' ', M, N, K, -1 ) ) - IF( NX.LT.K ) THEN -* -* Determine if workspace is large enough for blocked code. -* - LDWORK = N - IWS = LDWORK*NB - IF( LWORK.LT.IWS ) THEN -* -* Not enough workspace to use optimal NB: reduce NB and -* determine the minimum value of NB. -* - NB = LWORK / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'DORGQR', ' ', M, N, K, -1 ) ) - END IF - END IF - END IF -* - IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN -* -* Use blocked code after the last block. -* The first kk columns are handled by the block method. -* - KI = ( ( K-NX-1 ) / NB )*NB - KK = MIN( K, KI+NB ) -* -* Set A(1:kk,kk+1:n) to zero. -* - DO 20 J = KK + 1, N - DO 10 I = 1, KK - A( I, J ) = ZERO - 10 CONTINUE - 20 CONTINUE - ELSE - KK = 0 - END IF -* -* Use unblocked code for the last or only block. -* - IF( KK.LT.N ) - $ CALL DORG2R( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA, - $ TAU( KK+1 ), WORK, IINFO ) -* - IF( KK.GT.0 ) THEN -* -* Use blocked code -* - DO 50 I = KI + 1, 1, -NB - IB = MIN( NB, K-I+1 ) - IF( I+IB.LE.N ) THEN -* -* Form the triangular factor of the block reflector -* H = H(i) H(i+1) . . . H(i+ib-1) -* - CALL DLARFT( 'Forward', 'Columnwise', M-I+1, IB, - $ A( I, I ), LDA, TAU( I ), WORK, LDWORK ) -* -* Apply H to A(i:m,i+ib:n) from the left -* - CALL DLARFB( 'Left', 'No transpose', 'Forward', - $ 'Columnwise', M-I+1, N-I-IB+1, IB, - $ A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ), - $ LDA, WORK( IB+1 ), LDWORK ) - END IF -* -* Apply H to rows i:m of current block -* - CALL DORG2R( M-I+1, IB, IB, A( I, I ), LDA, TAU( I ), WORK, - $ IINFO ) -* -* Set rows 1:i-1 of current block to zero -* - DO 40 J = I, I + IB - 1 - DO 30 L = 1, I - 1 - A( L, J ) = ZERO - 30 CONTINUE - 40 CONTINUE - 50 CONTINUE - END IF -* - WORK( 1 ) = IWS - RETURN -* -* End of DORGQR -* - END diff --git a/lib/linalg/fortran/dorgtr.f b/lib/linalg/fortran/dorgtr.f deleted file mode 100644 index 0a0ab15a78..0000000000 --- a/lib/linalg/fortran/dorgtr.f +++ /dev/null @@ -1,252 +0,0 @@ -*> \brief \b DORGTR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORGTR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORGTR generates a real orthogonal matrix Q which is defined as the -*> product of n-1 elementary reflectors of order N, as returned by -*> DSYTRD: -*> -*> if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), -*> -*> if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A contains elementary reflectors -*> from DSYTRD; -*> = 'L': Lower triangle of A contains elementary reflectors -*> from DSYTRD. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix Q. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the vectors which define the elementary reflectors, -*> as returned by DSYTRD. -*> On exit, the N-by-N orthogonal matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (N-1) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DSYTRD. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= max(1,N-1). -*> For optimum performance LWORK >= (N-1)*NB, where NB is -*> the optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY, UPPER - INTEGER I, IINFO, J, LWKOPT, NB -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL DORGQL, DORGQR, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LQUERY = ( LWORK.EQ.-1 ) - UPPER = LSAME( UPLO, 'U' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -4 - ELSE IF( LWORK.LT.MAX( 1, N-1 ) .AND. .NOT.LQUERY ) THEN - INFO = -7 - END IF -* - IF( INFO.EQ.0 ) THEN - IF( UPPER ) THEN - NB = ILAENV( 1, 'DORGQL', ' ', N-1, N-1, N-1, -1 ) - ELSE - NB = ILAENV( 1, 'DORGQR', ' ', N-1, N-1, N-1, -1 ) - END IF - LWKOPT = MAX( 1, N-1 )*NB - WORK( 1 ) = LWKOPT - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORGTR', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - IF( UPPER ) THEN -* -* Q was determined by a call to DSYTRD with UPLO = 'U' -* -* Shift the vectors which define the elementary reflectors one -* column to the left, and set the last row and column of Q to -* those of the unit matrix -* - DO 20 J = 1, N - 1 - DO 10 I = 1, J - 1 - A( I, J ) = A( I, J+1 ) - 10 CONTINUE - A( N, J ) = ZERO - 20 CONTINUE - DO 30 I = 1, N - 1 - A( I, N ) = ZERO - 30 CONTINUE - A( N, N ) = ONE -* -* Generate Q(1:n-1,1:n-1) -* - CALL DORGQL( N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO ) -* - ELSE -* -* Q was determined by a call to DSYTRD with UPLO = 'L'. -* -* Shift the vectors which define the elementary reflectors one -* column to the right, and set the first row and column of Q to -* those of the unit matrix -* - DO 50 J = N, 2, -1 - A( 1, J ) = ZERO - DO 40 I = J + 1, N - A( I, J ) = A( I, J-1 ) - 40 CONTINUE - 50 CONTINUE - A( 1, 1 ) = ONE - DO 60 I = 2, N - A( I, 1 ) = ZERO - 60 CONTINUE - IF( N.GT.1 ) THEN -* -* Generate Q(2:n,2:n) -* - CALL DORGQR( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK, - $ LWORK, IINFO ) - END IF - END IF - WORK( 1 ) = LWKOPT - RETURN -* -* End of DORGTR -* - END diff --git a/lib/linalg/fortran/dorm2l.f b/lib/linalg/fortran/dorm2l.f deleted file mode 100644 index c99039c541..0000000000 --- a/lib/linalg/fortran/dorm2l.f +++ /dev/null @@ -1,275 +0,0 @@ -*> \brief \b DORM2L multiplies a general matrix by the orthogonal matrix from a QL factorization determined by sgeqlf (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORM2L + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORM2L( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, -* WORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS -* INTEGER INFO, K, LDA, LDC, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORM2L overwrites the general real m by n matrix C with -*> -*> Q * C if SIDE = 'L' and TRANS = 'N', or -*> -*> Q**T * C if SIDE = 'L' and TRANS = 'T', or -*> -*> C * Q if SIDE = 'R' and TRANS = 'N', or -*> -*> C * Q**T if SIDE = 'R' and TRANS = 'T', -*> -*> where Q is a real orthogonal matrix defined as the product of k -*> elementary reflectors -*> -*> Q = H(k) . . . H(2) H(1) -*> -*> as returned by DGEQLF. Q is of order m if SIDE = 'L' and of order n -*> if SIDE = 'R'. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q or Q**T from the Left -*> = 'R': apply Q or Q**T from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply Q (No transpose) -*> = 'T': apply Q**T (Transpose) -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines -*> the matrix Q. -*> If SIDE = 'L', M >= K >= 0; -*> if SIDE = 'R', N >= K >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,K) -*> The i-th column must contain the vector which defines the -*> elementary reflector H(i), for i = 1,2,...,k, as returned by -*> DGEQLF in the last k columns of its array argument A. -*> A is modified by the routine but restored on exit. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> If SIDE = 'L', LDA >= max(1,M); -*> if SIDE = 'R', LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DGEQLF. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension -*> (N) if SIDE = 'L', -*> (M) if SIDE = 'R' -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORM2L( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, - $ WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS - INTEGER INFO, K, LDA, LDC, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LEFT, NOTRAN - INTEGER I, I1, I2, I3, MI, NI, NQ - DOUBLE PRECISION AII -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL DLARF, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LEFT = LSAME( SIDE, 'L' ) - NOTRAN = LSAME( TRANS, 'N' ) -* -* NQ is the order of Q -* - IF( LEFT ) THEN - NQ = M - ELSE - NQ = N - END IF - IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN - INFO = -2 - ELSE IF( M.LT.0 ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN - INFO = -7 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -10 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORM2L', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) - $ RETURN -* - IF( ( LEFT .AND. NOTRAN ) .OR. ( .NOT.LEFT .AND. .NOT.NOTRAN ) ) - $ THEN - I1 = 1 - I2 = K - I3 = 1 - ELSE - I1 = K - I2 = 1 - I3 = -1 - END IF -* - IF( LEFT ) THEN - NI = N - ELSE - MI = M - END IF -* - DO 10 I = I1, I2, I3 - IF( LEFT ) THEN -* -* H(i) is applied to C(1:m-k+i,1:n) -* - MI = M - K + I - ELSE -* -* H(i) is applied to C(1:m,1:n-k+i) -* - NI = N - K + I - END IF -* -* Apply H(i) -* - AII = A( NQ-K+I, I ) - A( NQ-K+I, I ) = ONE - CALL DLARF( SIDE, MI, NI, A( 1, I ), 1, TAU( I ), C, LDC, - $ WORK ) - A( NQ-K+I, I ) = AII - 10 CONTINUE - RETURN -* -* End of DORM2L -* - END diff --git a/lib/linalg/fortran/dorm2r.f b/lib/linalg/fortran/dorm2r.f deleted file mode 100644 index ac88eec8dc..0000000000 --- a/lib/linalg/fortran/dorm2r.f +++ /dev/null @@ -1,279 +0,0 @@ -*> \brief \b DORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sgeqrf (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORM2R + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, -* WORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS -* INTEGER INFO, K, LDA, LDC, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORM2R overwrites the general real m by n matrix C with -*> -*> Q * C if SIDE = 'L' and TRANS = 'N', or -*> -*> Q**T* C if SIDE = 'L' and TRANS = 'T', or -*> -*> C * Q if SIDE = 'R' and TRANS = 'N', or -*> -*> C * Q**T if SIDE = 'R' and TRANS = 'T', -*> -*> where Q is a real orthogonal matrix defined as the product of k -*> elementary reflectors -*> -*> Q = H(1) H(2) . . . H(k) -*> -*> as returned by DGEQRF. Q is of order m if SIDE = 'L' and of order n -*> if SIDE = 'R'. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q or Q**T from the Left -*> = 'R': apply Q or Q**T from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply Q (No transpose) -*> = 'T': apply Q**T (Transpose) -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines -*> the matrix Q. -*> If SIDE = 'L', M >= K >= 0; -*> if SIDE = 'R', N >= K >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,K) -*> The i-th column must contain the vector which defines the -*> elementary reflector H(i), for i = 1,2,...,k, as returned by -*> DGEQRF in the first k columns of its array argument A. -*> A is modified by the routine but restored on exit. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> If SIDE = 'L', LDA >= max(1,M); -*> if SIDE = 'R', LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DGEQRF. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension -*> (N) if SIDE = 'L', -*> (M) if SIDE = 'R' -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, - $ WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS - INTEGER INFO, K, LDA, LDC, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LEFT, NOTRAN - INTEGER I, I1, I2, I3, IC, JC, MI, NI, NQ - DOUBLE PRECISION AII -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL DLARF, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LEFT = LSAME( SIDE, 'L' ) - NOTRAN = LSAME( TRANS, 'N' ) -* -* NQ is the order of Q -* - IF( LEFT ) THEN - NQ = M - ELSE - NQ = N - END IF - IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN - INFO = -2 - ELSE IF( M.LT.0 ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN - INFO = -7 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -10 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORM2R', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) - $ RETURN -* - IF( ( LEFT .AND. .NOT.NOTRAN ) .OR. ( .NOT.LEFT .AND. NOTRAN ) ) - $ THEN - I1 = 1 - I2 = K - I3 = 1 - ELSE - I1 = K - I2 = 1 - I3 = -1 - END IF -* - IF( LEFT ) THEN - NI = N - JC = 1 - ELSE - MI = M - IC = 1 - END IF -* - DO 10 I = I1, I2, I3 - IF( LEFT ) THEN -* -* H(i) is applied to C(i:m,1:n) -* - MI = M - I + 1 - IC = I - ELSE -* -* H(i) is applied to C(1:m,i:n) -* - NI = N - I + 1 - JC = I - END IF -* -* Apply H(i) -* - AII = A( I, I ) - A( I, I ) = ONE - CALL DLARF( SIDE, MI, NI, A( I, I ), 1, TAU( I ), C( IC, JC ), - $ LDC, WORK ) - A( I, I ) = AII - 10 CONTINUE - RETURN -* -* End of DORM2R -* - END diff --git a/lib/linalg/fortran/dormbr.f b/lib/linalg/fortran/dormbr.f deleted file mode 100644 index 86abb10072..0000000000 --- a/lib/linalg/fortran/dormbr.f +++ /dev/null @@ -1,369 +0,0 @@ -*> \brief \b DORMBR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORMBR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORMBR( VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C, -* LDC, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS, VECT -* INTEGER INFO, K, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> If VECT = 'Q', DORMBR overwrites the general real M-by-N matrix C -*> with -*> SIDE = 'L' SIDE = 'R' -*> TRANS = 'N': Q * C C * Q -*> TRANS = 'T': Q**T * C C * Q**T -*> -*> If VECT = 'P', DORMBR overwrites the general real M-by-N matrix C -*> with -*> SIDE = 'L' SIDE = 'R' -*> TRANS = 'N': P * C C * P -*> TRANS = 'T': P**T * C C * P**T -*> -*> Here Q and P**T are the orthogonal matrices determined by DGEBRD when -*> reducing a real matrix A to bidiagonal form: A = Q * B * P**T. Q and -*> P**T are defined as products of elementary reflectors H(i) and G(i) -*> respectively. -*> -*> Let nq = m if SIDE = 'L' and nq = n if SIDE = 'R'. Thus nq is the -*> order of the orthogonal matrix Q or P**T that is applied. -*> -*> If VECT = 'Q', A is assumed to have been an NQ-by-K matrix: -*> if nq >= k, Q = H(1) H(2) . . . H(k); -*> if nq < k, Q = H(1) H(2) . . . H(nq-1). -*> -*> If VECT = 'P', A is assumed to have been a K-by-NQ matrix: -*> if k < nq, P = G(1) G(2) . . . G(k); -*> if k >= nq, P = G(1) G(2) . . . G(nq-1). -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] VECT -*> \verbatim -*> VECT is CHARACTER*1 -*> = 'Q': apply Q or Q**T; -*> = 'P': apply P or P**T. -*> \endverbatim -*> -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q, Q**T, P or P**T from the Left; -*> = 'R': apply Q, Q**T, P or P**T from the Right. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': No transpose, apply Q or P; -*> = 'T': Transpose, apply Q**T or P**T. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> If VECT = 'Q', the number of columns in the original -*> matrix reduced by DGEBRD. -*> If VECT = 'P', the number of rows in the original -*> matrix reduced by DGEBRD. -*> K >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension -*> (LDA,min(nq,K)) if VECT = 'Q' -*> (LDA,nq) if VECT = 'P' -*> The vectors which define the elementary reflectors H(i) and -*> G(i), whose products determine the matrices Q and P, as -*> returned by DGEBRD. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> If VECT = 'Q', LDA >= max(1,nq); -*> if VECT = 'P', LDA >= max(1,min(nq,K)). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (min(nq,K)) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i) or G(i) which determines Q or P, as returned -*> by DGEBRD in the array argument TAUQ or TAUP. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q -*> or P*C or P**T*C or C*P or C*P**T. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> If SIDE = 'L', LWORK >= max(1,N); -*> if SIDE = 'R', LWORK >= max(1,M). -*> For optimum performance LWORK >= N*NB if SIDE = 'L', and -*> LWORK >= M*NB if SIDE = 'R', where NB is the optimal -*> blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORMBR( VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C, - $ LDC, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS, VECT - INTEGER INFO, K, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - LOGICAL APPLYQ, LEFT, LQUERY, NOTRAN - CHARACTER TRANST - INTEGER I1, I2, IINFO, LWKOPT, MI, NB, NI, NQ, NW -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL DORMLQ, DORMQR, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - APPLYQ = LSAME( VECT, 'Q' ) - LEFT = LSAME( SIDE, 'L' ) - NOTRAN = LSAME( TRANS, 'N' ) - LQUERY = ( LWORK.EQ.-1 ) -* -* NQ is the order of Q or P and NW is the minimum dimension of WORK -* - IF( LEFT ) THEN - NQ = M - NW = MAX( 1, N ) - ELSE - NQ = N - NW = MAX( 1, M ) - END IF - IF( .NOT.APPLYQ .AND. .NOT.LSAME( VECT, 'P' ) ) THEN - INFO = -1 - ELSE IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -2 - ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN - INFO = -3 - ELSE IF( M.LT.0 ) THEN - INFO = -4 - ELSE IF( N.LT.0 ) THEN - INFO = -5 - ELSE IF( K.LT.0 ) THEN - INFO = -6 - ELSE IF( ( APPLYQ .AND. LDA.LT.MAX( 1, NQ ) ) .OR. - $ ( .NOT.APPLYQ .AND. LDA.LT.MAX( 1, MIN( NQ, K ) ) ) ) - $ THEN - INFO = -8 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -11 - ELSE IF( LWORK.LT.NW .AND. .NOT.LQUERY ) THEN - INFO = -13 - END IF -* - IF( INFO.EQ.0 ) THEN - IF( APPLYQ ) THEN - IF( LEFT ) THEN - NB = ILAENV( 1, 'DORMQR', SIDE // TRANS, M-1, N, M-1, - $ -1 ) - ELSE - NB = ILAENV( 1, 'DORMQR', SIDE // TRANS, M, N-1, N-1, - $ -1 ) - END IF - ELSE - IF( LEFT ) THEN - NB = ILAENV( 1, 'DORMLQ', SIDE // TRANS, M-1, N, M-1, - $ -1 ) - ELSE - NB = ILAENV( 1, 'DORMLQ', SIDE // TRANS, M, N-1, N-1, - $ -1 ) - END IF - END IF - LWKOPT = NW*NB - WORK( 1 ) = LWKOPT - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORMBR', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - WORK( 1 ) = 1 - IF( M.EQ.0 .OR. N.EQ.0 ) - $ RETURN -* - IF( APPLYQ ) THEN -* -* Apply Q -* - IF( NQ.GE.K ) THEN -* -* Q was determined by a call to DGEBRD with nq >= k -* - CALL DORMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, - $ WORK, LWORK, IINFO ) - ELSE IF( NQ.GT.1 ) THEN -* -* Q was determined by a call to DGEBRD with nq < k -* - IF( LEFT ) THEN - MI = M - 1 - NI = N - I1 = 2 - I2 = 1 - ELSE - MI = M - NI = N - 1 - I1 = 1 - I2 = 2 - END IF - CALL DORMQR( SIDE, TRANS, MI, NI, NQ-1, A( 2, 1 ), LDA, TAU, - $ C( I1, I2 ), LDC, WORK, LWORK, IINFO ) - END IF - ELSE -* -* Apply P -* - IF( NOTRAN ) THEN - TRANST = 'T' - ELSE - TRANST = 'N' - END IF - IF( NQ.GT.K ) THEN -* -* P was determined by a call to DGEBRD with nq > k -* - CALL DORMLQ( SIDE, TRANST, M, N, K, A, LDA, TAU, C, LDC, - $ WORK, LWORK, IINFO ) - ELSE IF( NQ.GT.1 ) THEN -* -* P was determined by a call to DGEBRD with nq <= k -* - IF( LEFT ) THEN - MI = M - 1 - NI = N - I1 = 2 - I2 = 1 - ELSE - MI = M - NI = N - 1 - I1 = 1 - I2 = 2 - END IF - CALL DORMLQ( SIDE, TRANST, MI, NI, NQ-1, A( 1, 2 ), LDA, - $ TAU, C( I1, I2 ), LDC, WORK, LWORK, IINFO ) - END IF - END IF - WORK( 1 ) = LWKOPT - RETURN -* -* End of DORMBR -* - END diff --git a/lib/linalg/fortran/dorml2.f b/lib/linalg/fortran/dorml2.f deleted file mode 100644 index a9ddd460d8..0000000000 --- a/lib/linalg/fortran/dorml2.f +++ /dev/null @@ -1,279 +0,0 @@ -*> \brief \b DORML2 multiplies a general matrix by the orthogonal matrix from a LQ factorization determined by sgelqf (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORML2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, -* WORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS -* INTEGER INFO, K, LDA, LDC, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORML2 overwrites the general real m by n matrix C with -*> -*> Q * C if SIDE = 'L' and TRANS = 'N', or -*> -*> Q**T* C if SIDE = 'L' and TRANS = 'T', or -*> -*> C * Q if SIDE = 'R' and TRANS = 'N', or -*> -*> C * Q**T if SIDE = 'R' and TRANS = 'T', -*> -*> where Q is a real orthogonal matrix defined as the product of k -*> elementary reflectors -*> -*> Q = H(k) . . . H(2) H(1) -*> -*> as returned by DGELQF. Q is of order m if SIDE = 'L' and of order n -*> if SIDE = 'R'. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q or Q**T from the Left -*> = 'R': apply Q or Q**T from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply Q (No transpose) -*> = 'T': apply Q**T (Transpose) -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines -*> the matrix Q. -*> If SIDE = 'L', M >= K >= 0; -*> if SIDE = 'R', N >= K >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension -*> (LDA,M) if SIDE = 'L', -*> (LDA,N) if SIDE = 'R' -*> The i-th row must contain the vector which defines the -*> elementary reflector H(i), for i = 1,2,...,k, as returned by -*> DGELQF in the first k rows of its array argument A. -*> A is modified by the routine but restored on exit. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,K). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DGELQF. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the m by n matrix C. -*> On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension -*> (N) if SIDE = 'L', -*> (M) if SIDE = 'R' -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, - $ WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS - INTEGER INFO, K, LDA, LDC, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LEFT, NOTRAN - INTEGER I, I1, I2, I3, IC, JC, MI, NI, NQ - DOUBLE PRECISION AII -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL DLARF, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LEFT = LSAME( SIDE, 'L' ) - NOTRAN = LSAME( TRANS, 'N' ) -* -* NQ is the order of Q -* - IF( LEFT ) THEN - NQ = M - ELSE - NQ = N - END IF - IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN - INFO = -2 - ELSE IF( M.LT.0 ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, K ) ) THEN - INFO = -7 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -10 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORML2', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) - $ RETURN -* - IF( ( LEFT .AND. NOTRAN ) .OR. ( .NOT.LEFT .AND. .NOT.NOTRAN ) ) - $ THEN - I1 = 1 - I2 = K - I3 = 1 - ELSE - I1 = K - I2 = 1 - I3 = -1 - END IF -* - IF( LEFT ) THEN - NI = N - JC = 1 - ELSE - MI = M - IC = 1 - END IF -* - DO 10 I = I1, I2, I3 - IF( LEFT ) THEN -* -* H(i) is applied to C(i:m,1:n) -* - MI = M - I + 1 - IC = I - ELSE -* -* H(i) is applied to C(1:m,i:n) -* - NI = N - I + 1 - JC = I - END IF -* -* Apply H(i) -* - AII = A( I, I ) - A( I, I ) = ONE - CALL DLARF( SIDE, MI, NI, A( I, I ), LDA, TAU( I ), - $ C( IC, JC ), LDC, WORK ) - A( I, I ) = AII - 10 CONTINUE - RETURN -* -* End of DORML2 -* - END diff --git a/lib/linalg/fortran/dormlq.f b/lib/linalg/fortran/dormlq.f deleted file mode 100644 index ef039285ab..0000000000 --- a/lib/linalg/fortran/dormlq.f +++ /dev/null @@ -1,344 +0,0 @@ -*> \brief \b DORMLQ -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORMLQ + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORMLQ( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, -* WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS -* INTEGER INFO, K, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORMLQ overwrites the general real M-by-N matrix C with -*> -*> SIDE = 'L' SIDE = 'R' -*> TRANS = 'N': Q * C C * Q -*> TRANS = 'T': Q**T * C C * Q**T -*> -*> where Q is a real orthogonal matrix defined as the product of k -*> elementary reflectors -*> -*> Q = H(k) . . . H(2) H(1) -*> -*> as returned by DGELQF. Q is of order M if SIDE = 'L' and of order N -*> if SIDE = 'R'. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q or Q**T from the Left; -*> = 'R': apply Q or Q**T from the Right. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': No transpose, apply Q; -*> = 'T': Transpose, apply Q**T. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines -*> the matrix Q. -*> If SIDE = 'L', M >= K >= 0; -*> if SIDE = 'R', N >= K >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension -*> (LDA,M) if SIDE = 'L', -*> (LDA,N) if SIDE = 'R' -*> The i-th row must contain the vector which defines the -*> elementary reflector H(i), for i = 1,2,...,k, as returned by -*> DGELQF in the first k rows of its array argument A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,K). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DGELQF. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> If SIDE = 'L', LWORK >= max(1,N); -*> if SIDE = 'R', LWORK >= max(1,M). -*> For good performance, LWORK should generally be larger. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORMLQ( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, - $ WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS - INTEGER INFO, K, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - INTEGER NBMAX, LDT, TSIZE - PARAMETER ( NBMAX = 64, LDT = NBMAX+1, - $ TSIZE = LDT*NBMAX ) -* .. -* .. Local Scalars .. - LOGICAL LEFT, LQUERY, NOTRAN - CHARACTER TRANST - INTEGER I, I1, I2, I3, IB, IC, IINFO, IWT, JC, LDWORK, - $ LWKOPT, MI, NB, NBMIN, NI, NQ, NW -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL DLARFB, DLARFT, DORML2, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LEFT = LSAME( SIDE, 'L' ) - NOTRAN = LSAME( TRANS, 'N' ) - LQUERY = ( LWORK.EQ.-1 ) -* -* NQ is the order of Q and NW is the minimum dimension of WORK -* - IF( LEFT ) THEN - NQ = M - NW = MAX( 1, N ) - ELSE - NQ = N - NW = MAX( 1, M ) - END IF - IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN - INFO = -2 - ELSE IF( M.LT.0 ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, K ) ) THEN - INFO = -7 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -10 - ELSE IF( LWORK.LT.NW .AND. .NOT.LQUERY ) THEN - INFO = -12 - END IF -* - IF( INFO.EQ.0 ) THEN -* -* Compute the workspace requirements -* - NB = MIN( NBMAX, ILAENV( 1, 'DORMLQ', SIDE // TRANS, M, N, K, - $ -1 ) ) - LWKOPT = NW*NB + TSIZE - WORK( 1 ) = LWKOPT - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORMLQ', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - NBMIN = 2 - LDWORK = NW - IF( NB.GT.1 .AND. NB.LT.K ) THEN - IF( LWORK.LT.LWKOPT ) THEN - NB = (LWORK-TSIZE) / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'DORMLQ', SIDE // TRANS, M, N, K, - $ -1 ) ) - END IF - END IF -* - IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN -* -* Use unblocked code -* - CALL DORML2( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, - $ IINFO ) - ELSE -* -* Use blocked code -* - IWT = 1 + NW*NB - IF( ( LEFT .AND. NOTRAN ) .OR. - $ ( .NOT.LEFT .AND. .NOT.NOTRAN ) ) THEN - I1 = 1 - I2 = K - I3 = NB - ELSE - I1 = ( ( K-1 ) / NB )*NB + 1 - I2 = 1 - I3 = -NB - END IF -* - IF( LEFT ) THEN - NI = N - JC = 1 - ELSE - MI = M - IC = 1 - END IF -* - IF( NOTRAN ) THEN - TRANST = 'T' - ELSE - TRANST = 'N' - END IF -* - DO 10 I = I1, I2, I3 - IB = MIN( NB, K-I+1 ) -* -* Form the triangular factor of the block reflector -* H = H(i) H(i+1) . . . H(i+ib-1) -* - CALL DLARFT( 'Forward', 'Rowwise', NQ-I+1, IB, A( I, I ), - $ LDA, TAU( I ), WORK( IWT ), LDT ) - IF( LEFT ) THEN -* -* H or H**T is applied to C(i:m,1:n) -* - MI = M - I + 1 - IC = I - ELSE -* -* H or H**T is applied to C(1:m,i:n) -* - NI = N - I + 1 - JC = I - END IF -* -* Apply H or H**T -* - CALL DLARFB( SIDE, TRANST, 'Forward', 'Rowwise', MI, NI, IB, - $ A( I, I ), LDA, WORK( IWT ), LDT, - $ C( IC, JC ), LDC, WORK, LDWORK ) - 10 CONTINUE - END IF - WORK( 1 ) = LWKOPT - RETURN -* -* End of DORMLQ -* - END diff --git a/lib/linalg/fortran/dormql.f b/lib/linalg/fortran/dormql.f deleted file mode 100644 index 7c9f189e0d..0000000000 --- a/lib/linalg/fortran/dormql.f +++ /dev/null @@ -1,336 +0,0 @@ -*> \brief \b DORMQL -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORMQL + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORMQL( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, -* WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS -* INTEGER INFO, K, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORMQL overwrites the general real M-by-N matrix C with -*> -*> SIDE = 'L' SIDE = 'R' -*> TRANS = 'N': Q * C C * Q -*> TRANS = 'T': Q**T * C C * Q**T -*> -*> where Q is a real orthogonal matrix defined as the product of k -*> elementary reflectors -*> -*> Q = H(k) . . . H(2) H(1) -*> -*> as returned by DGEQLF. Q is of order M if SIDE = 'L' and of order N -*> if SIDE = 'R'. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q or Q**T from the Left; -*> = 'R': apply Q or Q**T from the Right. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': No transpose, apply Q; -*> = 'T': Transpose, apply Q**T. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines -*> the matrix Q. -*> If SIDE = 'L', M >= K >= 0; -*> if SIDE = 'R', N >= K >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,K) -*> The i-th column must contain the vector which defines the -*> elementary reflector H(i), for i = 1,2,...,k, as returned by -*> DGEQLF in the last k columns of its array argument A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> If SIDE = 'L', LDA >= max(1,M); -*> if SIDE = 'R', LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DGEQLF. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> If SIDE = 'L', LWORK >= max(1,N); -*> if SIDE = 'R', LWORK >= max(1,M). -*> For good performance, LWORK should generally be larger. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORMQL( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, - $ WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS - INTEGER INFO, K, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - INTEGER NBMAX, LDT, TSIZE - PARAMETER ( NBMAX = 64, LDT = NBMAX+1, - $ TSIZE = LDT*NBMAX ) -* .. -* .. Local Scalars .. - LOGICAL LEFT, LQUERY, NOTRAN - INTEGER I, I1, I2, I3, IB, IINFO, IWT, LDWORK, LWKOPT, - $ MI, NB, NBMIN, NI, NQ, NW -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL DLARFB, DLARFT, DORM2L, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LEFT = LSAME( SIDE, 'L' ) - NOTRAN = LSAME( TRANS, 'N' ) - LQUERY = ( LWORK.EQ.-1 ) -* -* NQ is the order of Q and NW is the minimum dimension of WORK -* - IF( LEFT ) THEN - NQ = M - NW = MAX( 1, N ) - ELSE - NQ = N - NW = MAX( 1, M ) - END IF - IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN - INFO = -2 - ELSE IF( M.LT.0 ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN - INFO = -7 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -10 - ELSE IF( LWORK.LT.NW .AND. .NOT.LQUERY ) THEN - INFO = -12 - END IF -* - IF( INFO.EQ.0 ) THEN -* -* Compute the workspace requirements -* - IF( M.EQ.0 .OR. N.EQ.0 ) THEN - LWKOPT = 1 - ELSE - NB = MIN( NBMAX, ILAENV( 1, 'DORMQL', SIDE // TRANS, M, N, - $ K, -1 ) ) - LWKOPT = NW*NB + TSIZE - END IF - WORK( 1 ) = LWKOPT - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORMQL', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 ) THEN - RETURN - END IF -* - NBMIN = 2 - LDWORK = NW - IF( NB.GT.1 .AND. NB.LT.K ) THEN - IF( LWORK.LT.LWKOPT ) THEN - NB = (LWORK-TSIZE) / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'DORMQL', SIDE // TRANS, M, N, K, - $ -1 ) ) - END IF - END IF -* - IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN -* -* Use unblocked code -* - CALL DORM2L( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, - $ IINFO ) - ELSE -* -* Use blocked code -* - IWT = 1 + NW*NB - IF( ( LEFT .AND. NOTRAN ) .OR. - $ ( .NOT.LEFT .AND. .NOT.NOTRAN ) ) THEN - I1 = 1 - I2 = K - I3 = NB - ELSE - I1 = ( ( K-1 ) / NB )*NB + 1 - I2 = 1 - I3 = -NB - END IF -* - IF( LEFT ) THEN - NI = N - ELSE - MI = M - END IF -* - DO 10 I = I1, I2, I3 - IB = MIN( NB, K-I+1 ) -* -* Form the triangular factor of the block reflector -* H = H(i+ib-1) . . . H(i+1) H(i) -* - CALL DLARFT( 'Backward', 'Columnwise', NQ-K+I+IB-1, IB, - $ A( 1, I ), LDA, TAU( I ), WORK( IWT ), LDT ) - IF( LEFT ) THEN -* -* H or H**T is applied to C(1:m-k+i+ib-1,1:n) -* - MI = M - K + I + IB - 1 - ELSE -* -* H or H**T is applied to C(1:m,1:n-k+i+ib-1) -* - NI = N - K + I + IB - 1 - END IF -* -* Apply H or H**T -* - CALL DLARFB( SIDE, TRANS, 'Backward', 'Columnwise', MI, NI, - $ IB, A( 1, I ), LDA, WORK( IWT ), LDT, C, LDC, - $ WORK, LDWORK ) - 10 CONTINUE - END IF - WORK( 1 ) = LWKOPT - RETURN -* -* End of DORMQL -* - END diff --git a/lib/linalg/fortran/dormqr.f b/lib/linalg/fortran/dormqr.f deleted file mode 100644 index 4d0bae3a5f..0000000000 --- a/lib/linalg/fortran/dormqr.f +++ /dev/null @@ -1,337 +0,0 @@ -*> \brief \b DORMQR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORMQR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, -* WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS -* INTEGER INFO, K, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORMQR overwrites the general real M-by-N matrix C with -*> -*> SIDE = 'L' SIDE = 'R' -*> TRANS = 'N': Q * C C * Q -*> TRANS = 'T': Q**T * C C * Q**T -*> -*> where Q is a real orthogonal matrix defined as the product of k -*> elementary reflectors -*> -*> Q = H(1) H(2) . . . H(k) -*> -*> as returned by DGEQRF. Q is of order M if SIDE = 'L' and of order N -*> if SIDE = 'R'. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q or Q**T from the Left; -*> = 'R': apply Q or Q**T from the Right. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': No transpose, apply Q; -*> = 'T': Transpose, apply Q**T. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines -*> the matrix Q. -*> If SIDE = 'L', M >= K >= 0; -*> if SIDE = 'R', N >= K >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,K) -*> The i-th column must contain the vector which defines the -*> elementary reflector H(i), for i = 1,2,...,k, as returned by -*> DGEQRF in the first k columns of its array argument A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> If SIDE = 'L', LDA >= max(1,M); -*> if SIDE = 'R', LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DGEQRF. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> If SIDE = 'L', LWORK >= max(1,N); -*> if SIDE = 'R', LWORK >= max(1,M). -*> For good performance, LWORK should generally be larger. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, - $ WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS - INTEGER INFO, K, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - INTEGER NBMAX, LDT, TSIZE - PARAMETER ( NBMAX = 64, LDT = NBMAX+1, - $ TSIZE = LDT*NBMAX ) -* .. -* .. Local Scalars .. - LOGICAL LEFT, LQUERY, NOTRAN - INTEGER I, I1, I2, I3, IB, IC, IINFO, IWT, JC, LDWORK, - $ LWKOPT, MI, NB, NBMIN, NI, NQ, NW -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL DLARFB, DLARFT, DORM2R, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LEFT = LSAME( SIDE, 'L' ) - NOTRAN = LSAME( TRANS, 'N' ) - LQUERY = ( LWORK.EQ.-1 ) -* -* NQ is the order of Q and NW is the minimum dimension of WORK -* - IF( LEFT ) THEN - NQ = M - NW = MAX( 1, N ) - ELSE - NQ = N - NW = MAX( 1, M ) - END IF - IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'T' ) ) THEN - INFO = -2 - ELSE IF( M.LT.0 ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN - INFO = -7 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -10 - ELSE IF( LWORK.LT.NW .AND. .NOT.LQUERY ) THEN - INFO = -12 - END IF -* - IF( INFO.EQ.0 ) THEN -* -* Compute the workspace requirements -* - NB = MIN( NBMAX, ILAENV( 1, 'DORMQR', SIDE // TRANS, M, N, K, - $ -1 ) ) - LWKOPT = NW*NB + TSIZE - WORK( 1 ) = LWKOPT - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORMQR', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - NBMIN = 2 - LDWORK = NW - IF( NB.GT.1 .AND. NB.LT.K ) THEN - IF( LWORK.LT.LWKOPT ) THEN - NB = (LWORK-TSIZE) / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'DORMQR', SIDE // TRANS, M, N, K, - $ -1 ) ) - END IF - END IF -* - IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN -* -* Use unblocked code -* - CALL DORM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, - $ IINFO ) - ELSE -* -* Use blocked code -* - IWT = 1 + NW*NB - IF( ( LEFT .AND. .NOT.NOTRAN ) .OR. - $ ( .NOT.LEFT .AND. NOTRAN ) ) THEN - I1 = 1 - I2 = K - I3 = NB - ELSE - I1 = ( ( K-1 ) / NB )*NB + 1 - I2 = 1 - I3 = -NB - END IF -* - IF( LEFT ) THEN - NI = N - JC = 1 - ELSE - MI = M - IC = 1 - END IF -* - DO 10 I = I1, I2, I3 - IB = MIN( NB, K-I+1 ) -* -* Form the triangular factor of the block reflector -* H = H(i) H(i+1) . . . H(i+ib-1) -* - CALL DLARFT( 'Forward', 'Columnwise', NQ-I+1, IB, A( I, I ), - $ LDA, TAU( I ), WORK( IWT ), LDT ) - IF( LEFT ) THEN -* -* H or H**T is applied to C(i:m,1:n) -* - MI = M - I + 1 - IC = I - ELSE -* -* H or H**T is applied to C(1:m,i:n) -* - NI = N - I + 1 - JC = I - END IF -* -* Apply H or H**T -* - CALL DLARFB( SIDE, TRANS, 'Forward', 'Columnwise', MI, NI, - $ IB, A( I, I ), LDA, WORK( IWT ), LDT, - $ C( IC, JC ), LDC, WORK, LDWORK ) - 10 CONTINUE - END IF - WORK( 1 ) = LWKOPT - RETURN -* -* End of DORMQR -* - END diff --git a/lib/linalg/fortran/dormtr.f b/lib/linalg/fortran/dormtr.f deleted file mode 100644 index 1f664d63cc..0000000000 --- a/lib/linalg/fortran/dormtr.f +++ /dev/null @@ -1,307 +0,0 @@ -*> \brief \b DORMTR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DORMTR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DORMTR( SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, -* WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS, UPLO -* INTEGER INFO, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DORMTR overwrites the general real M-by-N matrix C with -*> -*> SIDE = 'L' SIDE = 'R' -*> TRANS = 'N': Q * C C * Q -*> TRANS = 'T': Q**T * C C * Q**T -*> -*> where Q is a real orthogonal matrix of order nq, with nq = m if -*> SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of -*> nq-1 elementary reflectors, as returned by DSYTRD: -*> -*> if UPLO = 'U', Q = H(nq-1) . . . H(2) H(1); -*> -*> if UPLO = 'L', Q = H(1) H(2) . . . H(nq-1). -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q or Q**T from the Left; -*> = 'R': apply Q or Q**T from the Right. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A contains elementary reflectors -*> from DSYTRD; -*> = 'L': Lower triangle of A contains elementary reflectors -*> from DSYTRD. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': No transpose, apply Q; -*> = 'T': Transpose, apply Q**T. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension -*> (LDA,M) if SIDE = 'L' -*> (LDA,N) if SIDE = 'R' -*> The vectors which define the elementary reflectors, as -*> returned by DSYTRD. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> LDA >= max(1,M) if SIDE = 'L'; LDA >= max(1,N) if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension -*> (M-1) if SIDE = 'L' -*> (N-1) if SIDE = 'R' -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by DSYTRD. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> If SIDE = 'L', LWORK >= max(1,N); -*> if SIDE = 'R', LWORK >= max(1,M). -*> For optimum performance LWORK >= N*NB if SIDE = 'L', and -*> LWORK >= M*NB if SIDE = 'R', where NB is the optimal -*> blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DORMTR( SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, - $ WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS, UPLO - INTEGER INFO, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - LOGICAL LEFT, LQUERY, UPPER - INTEGER I1, I2, IINFO, LWKOPT, MI, NB, NI, NQ, NW -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL DORMQL, DORMQR, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LEFT = LSAME( SIDE, 'L' ) - UPPER = LSAME( UPLO, 'U' ) - LQUERY = ( LWORK.EQ.-1 ) -* -* NQ is the order of Q and NW is the minimum dimension of WORK -* - IF( LEFT ) THEN - NQ = M - NW = MAX( 1, N ) - ELSE - NQ = N - NW = MAX( 1, M ) - END IF - IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -1 - ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -2 - ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.LSAME( TRANS, 'T' ) ) - $ THEN - INFO = -3 - ELSE IF( M.LT.0 ) THEN - INFO = -4 - ELSE IF( N.LT.0 ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN - INFO = -7 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -10 - ELSE IF( LWORK.LT.NW .AND. .NOT.LQUERY ) THEN - INFO = -12 - END IF -* - IF( INFO.EQ.0 ) THEN - IF( UPPER ) THEN - IF( LEFT ) THEN - NB = ILAENV( 1, 'DORMQL', SIDE // TRANS, M-1, N, M-1, - $ -1 ) - ELSE - NB = ILAENV( 1, 'DORMQL', SIDE // TRANS, M, N-1, N-1, - $ -1 ) - END IF - ELSE - IF( LEFT ) THEN - NB = ILAENV( 1, 'DORMQR', SIDE // TRANS, M-1, N, M-1, - $ -1 ) - ELSE - NB = ILAENV( 1, 'DORMQR', SIDE // TRANS, M, N-1, N-1, - $ -1 ) - END IF - END IF - LWKOPT = NW*NB - WORK( 1 ) = LWKOPT - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DORMTR', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 .OR. NQ.EQ.1 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - IF( LEFT ) THEN - MI = M - 1 - NI = N - ELSE - MI = M - NI = N - 1 - END IF -* - IF( UPPER ) THEN -* -* Q was determined by a call to DSYTRD with UPLO = 'U' -* - CALL DORMQL( SIDE, TRANS, MI, NI, NQ-1, A( 1, 2 ), LDA, TAU, C, - $ LDC, WORK, LWORK, IINFO ) - ELSE -* -* Q was determined by a call to DSYTRD with UPLO = 'L' -* - IF( LEFT ) THEN - I1 = 2 - I2 = 1 - ELSE - I1 = 1 - I2 = 2 - END IF - CALL DORMQR( SIDE, TRANS, MI, NI, NQ-1, A( 2, 1 ), LDA, TAU, - $ C( I1, I2 ), LDC, WORK, LWORK, IINFO ) - END IF - WORK( 1 ) = LWKOPT - RETURN -* -* End of DORMTR -* - END diff --git a/lib/linalg/fortran/dposv.f b/lib/linalg/fortran/dposv.f deleted file mode 100644 index ee2988e6fd..0000000000 --- a/lib/linalg/fortran/dposv.f +++ /dev/null @@ -1,190 +0,0 @@ -*> \brief DPOSV computes the solution to system of linear equations A * X = B for PO matrices -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DPOSV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DPOSV( UPLO, N, NRHS, A, LDA, B, LDB, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDA, LDB, N, NRHS -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DPOSV computes the solution to a real system of linear equations -*> A * X = B, -*> where A is an N-by-N symmetric positive definite matrix and X and B -*> are N-by-NRHS matrices. -*> -*> The Cholesky decomposition is used to factor A as -*> A = U**T* U, if UPLO = 'U', or -*> A = L * L**T, if UPLO = 'L', -*> where U is an upper triangular matrix and L is a lower triangular -*> matrix. The factored form of A is then used to solve the system of -*> equations A * X = B. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored; -*> = 'L': Lower triangle of A is stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of linear equations, i.e., the order of the -*> matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in] NRHS -*> \verbatim -*> NRHS is INTEGER -*> The number of right hand sides, i.e., the number of columns -*> of the matrix B. NRHS >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the leading -*> N-by-N upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading N-by-N lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> -*> On exit, if INFO = 0, the factor U or L from the Cholesky -*> factorization A = U**T*U or A = L*L**T. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB,NRHS) -*> On entry, the N-by-NRHS right hand side matrix B. -*> On exit, if INFO = 0, the N-by-NRHS solution matrix X. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, the leading minor of order i of A is not -*> positive definite, so the factorization could not be -*> completed, and the solution has not been computed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doublePOsolve -* -* ===================================================================== - SUBROUTINE DPOSV( UPLO, N, NRHS, A, LDA, B, LDB, INFO ) -* -* -- LAPACK driver routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDA, LDB, N, NRHS -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* ===================================================================== -* -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL DPOTRF, DPOTRS, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( NRHS.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -5 - ELSE IF( LDB.LT.MAX( 1, N ) ) THEN - INFO = -7 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DPOSV ', -INFO ) - RETURN - END IF -* -* Compute the Cholesky factorization A = U**T*U or A = L*L**T. -* - CALL DPOTRF( UPLO, N, A, LDA, INFO ) - IF( INFO.EQ.0 ) THEN -* -* Solve the system A*X = B, overwriting B with X. -* - CALL DPOTRS( UPLO, N, NRHS, A, LDA, B, LDB, INFO ) -* - END IF - RETURN -* -* End of DPOSV -* - END diff --git a/lib/linalg/fortran/dpotf2.f b/lib/linalg/fortran/dpotf2.f deleted file mode 100644 index 08fa4957fd..0000000000 --- a/lib/linalg/fortran/dpotf2.f +++ /dev/null @@ -1,227 +0,0 @@ -*> \brief \b DPOTF2 computes the Cholesky factorization of a symmetric/Hermitian positive definite matrix (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DPOTF2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DPOTF2( UPLO, N, A, LDA, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DPOTF2 computes the Cholesky factorization of a real symmetric -*> positive definite matrix A. -*> -*> The factorization has the form -*> A = U**T * U , if UPLO = 'U', or -*> A = L * L**T, if UPLO = 'L', -*> where U is an upper triangular matrix and L is lower triangular. -*> -*> This is the unblocked version of the algorithm, calling Level 2 BLAS. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies whether the upper or lower triangular part of the -*> symmetric matrix A is stored. -*> = 'U': Upper triangular -*> = 'L': Lower triangular -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the leading -*> n by n upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading n by n lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> -*> On exit, if INFO = 0, the factor U or L from the Cholesky -*> factorization A = U**T *U or A = L*L**T. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -k, the k-th argument had an illegal value -*> > 0: if INFO = k, the leading minor of order k is not -*> positive definite, and the factorization could not be -*> completed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doublePOcomputational -* -* ===================================================================== - SUBROUTINE DPOTF2( UPLO, N, A, LDA, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL UPPER - INTEGER J - DOUBLE PRECISION AJJ -* .. -* .. External Functions .. - LOGICAL LSAME, DISNAN - DOUBLE PRECISION DDOT - EXTERNAL LSAME, DDOT, DISNAN -* .. -* .. External Subroutines .. - EXTERNAL DGEMV, DSCAL, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -4 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DPOTF2', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( UPPER ) THEN -* -* Compute the Cholesky factorization A = U**T *U. -* - DO 10 J = 1, N -* -* Compute U(J,J) and test for non-positive-definiteness. -* - AJJ = A( J, J ) - DDOT( J-1, A( 1, J ), 1, A( 1, J ), 1 ) - IF( AJJ.LE.ZERO.OR.DISNAN( AJJ ) ) THEN - A( J, J ) = AJJ - GO TO 30 - END IF - AJJ = SQRT( AJJ ) - A( J, J ) = AJJ -* -* Compute elements J+1:N of row J. -* - IF( J.LT.N ) THEN - CALL DGEMV( 'Transpose', J-1, N-J, -ONE, A( 1, J+1 ), - $ LDA, A( 1, J ), 1, ONE, A( J, J+1 ), LDA ) - CALL DSCAL( N-J, ONE / AJJ, A( J, J+1 ), LDA ) - END IF - 10 CONTINUE - ELSE -* -* Compute the Cholesky factorization A = L*L**T. -* - DO 20 J = 1, N -* -* Compute L(J,J) and test for non-positive-definiteness. -* - AJJ = A( J, J ) - DDOT( J-1, A( J, 1 ), LDA, A( J, 1 ), - $ LDA ) - IF( AJJ.LE.ZERO.OR.DISNAN( AJJ ) ) THEN - A( J, J ) = AJJ - GO TO 30 - END IF - AJJ = SQRT( AJJ ) - A( J, J ) = AJJ -* -* Compute elements J+1:N of column J. -* - IF( J.LT.N ) THEN - CALL DGEMV( 'No transpose', N-J, J-1, -ONE, A( J+1, 1 ), - $ LDA, A( J, 1 ), LDA, ONE, A( J+1, J ), 1 ) - CALL DSCAL( N-J, ONE / AJJ, A( J+1, J ), 1 ) - END IF - 20 CONTINUE - END IF - GO TO 40 -* - 30 CONTINUE - INFO = J -* - 40 CONTINUE - RETURN -* -* End of DPOTF2 -* - END diff --git a/lib/linalg/fortran/dpotrf.f b/lib/linalg/fortran/dpotrf.f deleted file mode 100644 index 1679fc3cd8..0000000000 --- a/lib/linalg/fortran/dpotrf.f +++ /dev/null @@ -1,243 +0,0 @@ -*> \brief \b DPOTRF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DPOTRF + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DPOTRF( UPLO, N, A, LDA, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DPOTRF computes the Cholesky factorization of a real symmetric -*> positive definite matrix A. -*> -*> The factorization has the form -*> A = U**T * U, if UPLO = 'U', or -*> A = L * L**T, if UPLO = 'L', -*> where U is an upper triangular matrix and L is lower triangular. -*> -*> This is the block version of the algorithm, calling Level 3 BLAS. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored; -*> = 'L': Lower triangle of A is stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the leading -*> N-by-N upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading N-by-N lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> -*> On exit, if INFO = 0, the factor U or L from the Cholesky -*> factorization A = U**T*U or A = L*L**T. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, the leading minor of order i is not -*> positive definite, and the factorization could not be -*> completed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doublePOcomputational -* -* ===================================================================== - SUBROUTINE DPOTRF( UPLO, N, A, LDA, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL UPPER - INTEGER J, JB, NB -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL DGEMM, DPOTRF2, DSYRK, DTRSM, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -4 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DPOTRF', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* Determine the block size for this environment. -* - NB = ILAENV( 1, 'DPOTRF', UPLO, N, -1, -1, -1 ) - IF( NB.LE.1 .OR. NB.GE.N ) THEN -* -* Use unblocked code. -* - CALL DPOTRF2( UPLO, N, A, LDA, INFO ) - ELSE -* -* Use blocked code. -* - IF( UPPER ) THEN -* -* Compute the Cholesky factorization A = U**T*U. -* - DO 10 J = 1, N, NB -* -* Update and factorize the current diagonal block and test -* for non-positive-definiteness. -* - JB = MIN( NB, N-J+1 ) - CALL DSYRK( 'Upper', 'Transpose', JB, J-1, -ONE, - $ A( 1, J ), LDA, ONE, A( J, J ), LDA ) - CALL DPOTRF2( 'Upper', JB, A( J, J ), LDA, INFO ) - IF( INFO.NE.0 ) - $ GO TO 30 - IF( J+JB.LE.N ) THEN -* -* Compute the current block row. -* - CALL DGEMM( 'Transpose', 'No transpose', JB, N-J-JB+1, - $ J-1, -ONE, A( 1, J ), LDA, A( 1, J+JB ), - $ LDA, ONE, A( J, J+JB ), LDA ) - CALL DTRSM( 'Left', 'Upper', 'Transpose', 'Non-unit', - $ JB, N-J-JB+1, ONE, A( J, J ), LDA, - $ A( J, J+JB ), LDA ) - END IF - 10 CONTINUE -* - ELSE -* -* Compute the Cholesky factorization A = L*L**T. -* - DO 20 J = 1, N, NB -* -* Update and factorize the current diagonal block and test -* for non-positive-definiteness. -* - JB = MIN( NB, N-J+1 ) - CALL DSYRK( 'Lower', 'No transpose', JB, J-1, -ONE, - $ A( J, 1 ), LDA, ONE, A( J, J ), LDA ) - CALL DPOTRF2( 'Lower', JB, A( J, J ), LDA, INFO ) - IF( INFO.NE.0 ) - $ GO TO 30 - IF( J+JB.LE.N ) THEN -* -* Compute the current block column. -* - CALL DGEMM( 'No transpose', 'Transpose', N-J-JB+1, JB, - $ J-1, -ONE, A( J+JB, 1 ), LDA, A( J, 1 ), - $ LDA, ONE, A( J+JB, J ), LDA ) - CALL DTRSM( 'Right', 'Lower', 'Transpose', 'Non-unit', - $ N-J-JB+1, JB, ONE, A( J, J ), LDA, - $ A( J+JB, J ), LDA ) - END IF - 20 CONTINUE - END IF - END IF - GO TO 40 -* - 30 CONTINUE - INFO = INFO + J - 1 -* - 40 CONTINUE - RETURN -* -* End of DPOTRF -* - END diff --git a/lib/linalg/fortran/dpotrf2.f b/lib/linalg/fortran/dpotrf2.f deleted file mode 100644 index 6c28ce6d67..0000000000 --- a/lib/linalg/fortran/dpotrf2.f +++ /dev/null @@ -1,234 +0,0 @@ -*> \brief \b DPOTRF2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* RECURSIVE SUBROUTINE DPOTRF2( UPLO, N, A, LDA, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. -* REAL A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DPOTRF2 computes the Cholesky factorization of a real symmetric -*> positive definite matrix A using the recursive algorithm. -*> -*> The factorization has the form -*> A = U**T * U, if UPLO = 'U', or -*> A = L * L**T, if UPLO = 'L', -*> where U is an upper triangular matrix and L is lower triangular. -*> -*> This is the recursive version of the algorithm. It divides -*> the matrix into four submatrices: -*> -*> [ A11 | A12 ] where A11 is n1 by n1 and A22 is n2 by n2 -*> A = [ -----|----- ] with n1 = n/2 -*> [ A21 | A22 ] n2 = n-n1 -*> -*> The subroutine calls itself to factor A11. Update and scale A21 -*> or A12, update A22 then calls itself to factor A22. -*> -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored; -*> = 'L': Lower triangle of A is stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the leading -*> N-by-N upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading N-by-N lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> -*> On exit, if INFO = 0, the factor U or L from the Cholesky -*> factorization A = U**T*U or A = L*L**T. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, the leading minor of order i is not -*> positive definite, and the factorization could not be -*> completed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doublePOcomputational -* -* ===================================================================== - RECURSIVE SUBROUTINE DPOTRF2( UPLO, N, A, LDA, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL UPPER - INTEGER N1, N2, IINFO -* .. -* .. External Functions .. - LOGICAL LSAME, DISNAN - EXTERNAL LSAME, DISNAN -* .. -* .. External Subroutines .. - EXTERNAL DSYRK, DTRSM, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -4 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DPOTRF2', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* N=1 case -* - IF( N.EQ.1 ) THEN -* -* Test for non-positive-definiteness -* - IF( A( 1, 1 ).LE.ZERO.OR.DISNAN( A( 1, 1 ) ) ) THEN - INFO = 1 - RETURN - END IF -* -* Factor -* - A( 1, 1 ) = SQRT( A( 1, 1 ) ) -* -* Use recursive code -* - ELSE - N1 = N/2 - N2 = N-N1 -* -* Factor A11 -* - CALL DPOTRF2( UPLO, N1, A( 1, 1 ), LDA, IINFO ) - IF ( IINFO.NE.0 ) THEN - INFO = IINFO - RETURN - END IF -* -* Compute the Cholesky factorization A = U**T*U -* - IF( UPPER ) THEN -* -* Update and scale A12 -* - CALL DTRSM( 'L', 'U', 'T', 'N', N1, N2, ONE, - $ A( 1, 1 ), LDA, A( 1, N1+1 ), LDA ) -* -* Update and factor A22 -* - CALL DSYRK( UPLO, 'T', N2, N1, -ONE, A( 1, N1+1 ), LDA, - $ ONE, A( N1+1, N1+1 ), LDA ) - CALL DPOTRF2( UPLO, N2, A( N1+1, N1+1 ), LDA, IINFO ) - IF ( IINFO.NE.0 ) THEN - INFO = IINFO + N1 - RETURN - END IF -* -* Compute the Cholesky factorization A = L*L**T -* - ELSE -* -* Update and scale A21 -* - CALL DTRSM( 'R', 'L', 'T', 'N', N2, N1, ONE, - $ A( 1, 1 ), LDA, A( N1+1, 1 ), LDA ) -* -* Update and factor A22 -* - CALL DSYRK( UPLO, 'N', N2, N1, -ONE, A( N1+1, 1 ), LDA, - $ ONE, A( N1+1, N1+1 ), LDA ) - CALL DPOTRF2( UPLO, N2, A( N1+1, N1+1 ), LDA, IINFO ) - IF ( IINFO.NE.0 ) THEN - INFO = IINFO + N1 - RETURN - END IF - END IF - END IF - RETURN -* -* End of DPOTRF2 -* - END diff --git a/lib/linalg/fortran/dpotrs.f b/lib/linalg/fortran/dpotrs.f deleted file mode 100644 index 862ee078fd..0000000000 --- a/lib/linalg/fortran/dpotrs.f +++ /dev/null @@ -1,201 +0,0 @@ -*> \brief \b DPOTRS -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DPOTRS + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DPOTRS( UPLO, N, NRHS, A, LDA, B, LDB, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDA, LDB, N, NRHS -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DPOTRS solves a system of linear equations A*X = B with a symmetric -*> positive definite matrix A using the Cholesky factorization -*> A = U**T*U or A = L*L**T computed by DPOTRF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored; -*> = 'L': Lower triangle of A is stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in] NRHS -*> \verbatim -*> NRHS is INTEGER -*> The number of right hand sides, i.e., the number of columns -*> of the matrix B. NRHS >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The triangular factor U or L from the Cholesky factorization -*> A = U**T*U or A = L*L**T, as computed by DPOTRF. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB,NRHS) -*> On entry, the right hand side matrix B. -*> On exit, the solution matrix X. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doublePOcomputational -* -* ===================================================================== - SUBROUTINE DPOTRS( UPLO, N, NRHS, A, LDA, B, LDB, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDA, LDB, N, NRHS -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL UPPER -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL DTRSM, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( NRHS.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -5 - ELSE IF( LDB.LT.MAX( 1, N ) ) THEN - INFO = -7 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DPOTRS', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 .OR. NRHS.EQ.0 ) - $ RETURN -* - IF( UPPER ) THEN -* -* Solve A*X = B where A = U**T *U. -* -* Solve U**T *X = B, overwriting B with X. -* - CALL DTRSM( 'Left', 'Upper', 'Transpose', 'Non-unit', N, NRHS, - $ ONE, A, LDA, B, LDB ) -* -* Solve U*X = B, overwriting B with X. -* - CALL DTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N, - $ NRHS, ONE, A, LDA, B, LDB ) - ELSE -* -* Solve A*X = B where A = L*L**T. -* -* Solve L*X = B, overwriting B with X. -* - CALL DTRSM( 'Left', 'Lower', 'No transpose', 'Non-unit', N, - $ NRHS, ONE, A, LDA, B, LDB ) -* -* Solve L**T *X = B, overwriting B with X. -* - CALL DTRSM( 'Left', 'Lower', 'Transpose', 'Non-unit', N, NRHS, - $ ONE, A, LDA, B, LDB ) - END IF -* - RETURN -* -* End of DPOTRS -* - END diff --git a/lib/linalg/fortran/drot.f b/lib/linalg/fortran/drot.f deleted file mode 100644 index 0386626c8f..0000000000 --- a/lib/linalg/fortran/drot.f +++ /dev/null @@ -1,142 +0,0 @@ -*> \brief \b DROT -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DROT(N,DX,INCX,DY,INCY,C,S) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION C,S -* INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION DX(*),DY(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DROT applies a plane rotation. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in,out] DX -*> \verbatim -*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of DX -*> \endverbatim -*> -*> \param[in,out] DY -*> \verbatim -*> DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> storage spacing between elements of DY -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] S -*> \verbatim -*> S is DOUBLE PRECISION -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, linpack, 3/11/78. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DROT(N,DX,INCX,DY,INCY,C,S) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION C,S - INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. - DOUBLE PRECISION DX(*),DY(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - DOUBLE PRECISION DTEMP - INTEGER I,IX,IY -* .. - IF (N.LE.0) RETURN - IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN -* -* code for both increments equal to 1 -* - DO I = 1,N - DTEMP = C*DX(I) + S*DY(I) - DY(I) = C*DY(I) - S*DX(I) - DX(I) = DTEMP - END DO - ELSE -* -* code for unequal increments or equal increments not equal -* to 1 -* - IX = 1 - IY = 1 - IF (INCX.LT.0) IX = (-N+1)*INCX + 1 - IF (INCY.LT.0) IY = (-N+1)*INCY + 1 - DO I = 1,N - DTEMP = C*DX(IX) + S*DY(IY) - DY(IY) = C*DY(IY) - S*DX(IX) - DX(IX) = DTEMP - IX = IX + INCX - IY = IY + INCY - END DO - END IF - RETURN -* -* End of DROT -* - END diff --git a/lib/linalg/fortran/drscl.f b/lib/linalg/fortran/drscl.f deleted file mode 100644 index fcd8569650..0000000000 --- a/lib/linalg/fortran/drscl.f +++ /dev/null @@ -1,171 +0,0 @@ -*> \brief \b DRSCL multiplies a vector by the reciprocal of a real scalar. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DRSCL + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DRSCL( N, SA, SX, INCX ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* DOUBLE PRECISION SA -* .. -* .. Array Arguments .. -* DOUBLE PRECISION SX( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DRSCL multiplies an n-element real vector x by the real scalar 1/a. -*> This is done without overflow or underflow as long as -*> the final result x/a does not overflow or underflow. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of components of the vector x. -*> \endverbatim -*> -*> \param[in] SA -*> \verbatim -*> SA is DOUBLE PRECISION -*> The scalar a which is used to divide each component of x. -*> SA must be >= 0, or the subroutine will divide by zero. -*> \endverbatim -*> -*> \param[in,out] SX -*> \verbatim -*> SX is DOUBLE PRECISION array, dimension -*> (1+(N-1)*abs(INCX)) -*> The n-element vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between successive values of the vector SX. -*> > 0: SX(1) = X(1) and SX(1+(i-1)*INCX) = x(i), 1< i<= n -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERauxiliary -* -* ===================================================================== - SUBROUTINE DRSCL( N, SA, SX, INCX ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX, N - DOUBLE PRECISION SA -* .. -* .. Array Arguments .. - DOUBLE PRECISION SX( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL DONE - DOUBLE PRECISION BIGNUM, CDEN, CDEN1, CNUM, CNUM1, MUL, SMLNUM -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH - EXTERNAL DLAMCH -* .. -* .. External Subroutines .. - EXTERNAL DSCAL, DLABAD -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.LE.0 ) - $ RETURN -* -* Get machine parameters -* - SMLNUM = DLAMCH( 'S' ) - BIGNUM = ONE / SMLNUM - CALL DLABAD( SMLNUM, BIGNUM ) -* -* Initialize the denominator to SA and the numerator to 1. -* - CDEN = SA - CNUM = ONE -* - 10 CONTINUE - CDEN1 = CDEN*SMLNUM - CNUM1 = CNUM / BIGNUM - IF( ABS( CDEN1 ).GT.ABS( CNUM ) .AND. CNUM.NE.ZERO ) THEN -* -* Pre-multiply X by SMLNUM if CDEN is large compared to CNUM. -* - MUL = SMLNUM - DONE = .FALSE. - CDEN = CDEN1 - ELSE IF( ABS( CNUM1 ).GT.ABS( CDEN ) ) THEN -* -* Pre-multiply X by BIGNUM if CDEN is small compared to CNUM. -* - MUL = BIGNUM - DONE = .FALSE. - CNUM = CNUM1 - ELSE -* -* Multiply X by CNUM / CDEN and return. -* - MUL = CNUM / CDEN - DONE = .TRUE. - END IF -* -* Scale the vector X by MUL -* - CALL DSCAL( N, MUL, SX, INCX ) -* - IF( .NOT.DONE ) - $ GO TO 10 -* - RETURN -* -* End of DRSCL -* - END diff --git a/lib/linalg/fortran/dscal.f b/lib/linalg/fortran/dscal.f deleted file mode 100644 index e055d198af..0000000000 --- a/lib/linalg/fortran/dscal.f +++ /dev/null @@ -1,139 +0,0 @@ -*> \brief \b DSCAL -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DSCAL(N,DA,DX,INCX) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION DA -* INTEGER INCX,N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION DX(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSCAL scales a vector by a constant. -*> uses unrolled loops for increment equal to 1. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] DA -*> \verbatim -*> DA is DOUBLE PRECISION -*> On entry, DA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in,out] DX -*> \verbatim -*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of DX -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, linpack, 3/11/78. -*> modified 3/93 to return if incx .le. 0. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DSCAL(N,DA,DX,INCX) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION DA - INTEGER INCX,N -* .. -* .. Array Arguments .. - DOUBLE PRECISION DX(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I,M,MP1,NINCX -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER (ONE=1.0D+0) -* .. -* .. Intrinsic Functions .. - INTRINSIC MOD -* .. - IF (N.LE.0 .OR. INCX.LE.0 .OR. DA.EQ.ONE) RETURN - IF (INCX.EQ.1) THEN -* -* code for increment equal to 1 -* -* -* clean-up loop -* - M = MOD(N,5) - IF (M.NE.0) THEN - DO I = 1,M - DX(I) = DA*DX(I) - END DO - IF (N.LT.5) RETURN - END IF - MP1 = M + 1 - DO I = MP1,N,5 - DX(I) = DA*DX(I) - DX(I+1) = DA*DX(I+1) - DX(I+2) = DA*DX(I+2) - DX(I+3) = DA*DX(I+3) - DX(I+4) = DA*DX(I+4) - END DO - ELSE -* -* code for increment not equal to 1 -* - NINCX = N*INCX - DO I = 1,NINCX,INCX - DX(I) = DA*DX(I) - END DO - END IF - RETURN -* -* End of DSCAL -* - END diff --git a/lib/linalg/fortran/dstedc.f b/lib/linalg/fortran/dstedc.f deleted file mode 100644 index 2ed84afaac..0000000000 --- a/lib/linalg/fortran/dstedc.f +++ /dev/null @@ -1,479 +0,0 @@ -*> \brief \b DSTEDC -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DSTEDC + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, -* LIWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER COMPZ -* INTEGER INFO, LDZ, LIWORK, LWORK, N -* .. -* .. Array Arguments .. -* INTEGER IWORK( * ) -* DOUBLE PRECISION D( * ), E( * ), WORK( * ), Z( LDZ, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSTEDC computes all eigenvalues and, optionally, eigenvectors of a -*> symmetric tridiagonal matrix using the divide and conquer method. -*> The eigenvectors of a full or band real symmetric matrix can also be -*> found if DSYTRD or DSPTRD or DSBTRD has been used to reduce this -*> matrix to tridiagonal form. -*> -*> This code makes very mild assumptions about floating point -*> arithmetic. It will work on machines with a guard digit in -*> add/subtract, or on those binary machines without guard digits -*> which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. -*> It could conceivably fail on hexadecimal or decimal machines -*> without guard digits, but we know of none. See DLAED3 for details. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] COMPZ -*> \verbatim -*> COMPZ is CHARACTER*1 -*> = 'N': Compute eigenvalues only. -*> = 'I': Compute eigenvectors of tridiagonal matrix also. -*> = 'V': Compute eigenvectors of original dense symmetric -*> matrix also. On entry, Z contains the orthogonal -*> matrix used to reduce the original matrix to -*> tridiagonal form. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The dimension of the symmetric tridiagonal matrix. N >= 0. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the diagonal elements of the tridiagonal matrix. -*> On exit, if INFO = 0, the eigenvalues in ascending order. -*> \endverbatim -*> -*> \param[in,out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> On entry, the subdiagonal elements of the tridiagonal matrix. -*> On exit, E has been destroyed. -*> \endverbatim -*> -*> \param[in,out] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension (LDZ,N) -*> On entry, if COMPZ = 'V', then Z contains the orthogonal -*> matrix used in the reduction to tridiagonal form. -*> On exit, if INFO = 0, then if COMPZ = 'V', Z contains the -*> orthonormal eigenvectors of the original symmetric matrix, -*> and if COMPZ = 'I', Z contains the orthonormal eigenvectors -*> of the symmetric tridiagonal matrix. -*> If COMPZ = 'N', then Z is not referenced. -*> \endverbatim -*> -*> \param[in] LDZ -*> \verbatim -*> LDZ is INTEGER -*> The leading dimension of the array Z. LDZ >= 1. -*> If eigenvectors are desired, then LDZ >= max(1,N). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> If COMPZ = 'N' or N <= 1 then LWORK must be at least 1. -*> If COMPZ = 'V' and N > 1 then LWORK must be at least -*> ( 1 + 3*N + 2*N*lg N + 4*N**2 ), -*> where lg( N ) = smallest integer k such -*> that 2**k >= N. -*> If COMPZ = 'I' and N > 1 then LWORK must be at least -*> ( 1 + 4*N + N**2 ). -*> Note that for COMPZ = 'I' or 'V', then if N is less than or -*> equal to the minimum divide size, usually 25, then LWORK need -*> only be max(1,2*(N-1)). -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension (MAX(1,LIWORK)) -*> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. -*> \endverbatim -*> -*> \param[in] LIWORK -*> \verbatim -*> LIWORK is INTEGER -*> The dimension of the array IWORK. -*> If COMPZ = 'N' or N <= 1 then LIWORK must be at least 1. -*> If COMPZ = 'V' and N > 1 then LIWORK must be at least -*> ( 6 + 6*N + 5*N*lg N ). -*> If COMPZ = 'I' and N > 1 then LIWORK must be at least -*> ( 3 + 5*N ). -*> Note that for COMPZ = 'I' or 'V', then if N is less than or -*> equal to the minimum divide size, usually 25, then LIWORK -*> need only be 1. -*> -*> If LIWORK = -1, then a workspace query is assumed; the -*> routine only calculates the optimal size of the IWORK array, -*> returns this value as the first entry of the IWORK array, and -*> no error message related to LIWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: The algorithm failed to compute an eigenvalue while -*> working on the submatrix lying in rows and columns -*> INFO/(N+1) through mod(INFO,N+1). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Jeff Rutter, Computer Science Division, University of California -*> at Berkeley, USA \n -*> Modified by Francoise Tisseur, University of Tennessee -*> -* ===================================================================== - SUBROUTINE DSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, - $ LIWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER COMPZ - INTEGER INFO, LDZ, LIWORK, LWORK, N -* .. -* .. Array Arguments .. - INTEGER IWORK( * ) - DOUBLE PRECISION D( * ), E( * ), WORK( * ), Z( LDZ, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE, TWO - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER FINISH, I, ICOMPZ, II, J, K, LGN, LIWMIN, - $ LWMIN, M, SMLSIZ, START, STOREZ, STRTRW - DOUBLE PRECISION EPS, ORGNRM, P, TINY -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - DOUBLE PRECISION DLAMCH, DLANST - EXTERNAL LSAME, ILAENV, DLAMCH, DLANST -* .. -* .. External Subroutines .. - EXTERNAL DGEMM, DLACPY, DLAED0, DLASCL, DLASET, DLASRT, - $ DSTEQR, DSTERF, DSWAP, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, INT, LOG, MAX, MOD, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - LQUERY = ( LWORK.EQ.-1 .OR. LIWORK.EQ.-1 ) -* - IF( LSAME( COMPZ, 'N' ) ) THEN - ICOMPZ = 0 - ELSE IF( LSAME( COMPZ, 'V' ) ) THEN - ICOMPZ = 1 - ELSE IF( LSAME( COMPZ, 'I' ) ) THEN - ICOMPZ = 2 - ELSE - ICOMPZ = -1 - END IF - IF( ICOMPZ.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( ( LDZ.LT.1 ) .OR. - $ ( ICOMPZ.GT.0 .AND. LDZ.LT.MAX( 1, N ) ) ) THEN - INFO = -6 - END IF -* - IF( INFO.EQ.0 ) THEN -* -* Compute the workspace requirements -* - SMLSIZ = ILAENV( 9, 'DSTEDC', ' ', 0, 0, 0, 0 ) - IF( N.LE.1 .OR. ICOMPZ.EQ.0 ) THEN - LIWMIN = 1 - LWMIN = 1 - ELSE IF( N.LE.SMLSIZ ) THEN - LIWMIN = 1 - LWMIN = 2*( N - 1 ) - ELSE - LGN = INT( LOG( DBLE( N ) )/LOG( TWO ) ) - IF( 2**LGN.LT.N ) - $ LGN = LGN + 1 - IF( 2**LGN.LT.N ) - $ LGN = LGN + 1 - IF( ICOMPZ.EQ.1 ) THEN - LWMIN = 1 + 3*N + 2*N*LGN + 4*N**2 - LIWMIN = 6 + 6*N + 5*N*LGN - ELSE IF( ICOMPZ.EQ.2 ) THEN - LWMIN = 1 + 4*N + N**2 - LIWMIN = 3 + 5*N - END IF - END IF - WORK( 1 ) = LWMIN - IWORK( 1 ) = LIWMIN -* - IF( LWORK.LT.LWMIN .AND. .NOT. LQUERY ) THEN - INFO = -8 - ELSE IF( LIWORK.LT.LIWMIN .AND. .NOT. LQUERY ) THEN - INFO = -10 - END IF - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DSTEDC', -INFO ) - RETURN - ELSE IF (LQUERY) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN - IF( N.EQ.1 ) THEN - IF( ICOMPZ.NE.0 ) - $ Z( 1, 1 ) = ONE - RETURN - END IF -* -* If the following conditional clause is removed, then the routine -* will use the Divide and Conquer routine to compute only the -* eigenvalues, which requires (3N + 3N**2) real workspace and -* (2 + 5N + 2N lg(N)) integer workspace. -* Since on many architectures DSTERF is much faster than any other -* algorithm for finding eigenvalues only, it is used here -* as the default. If the conditional clause is removed, then -* information on the size of workspace needs to be changed. -* -* If COMPZ = 'N', use DSTERF to compute the eigenvalues. -* - IF( ICOMPZ.EQ.0 ) THEN - CALL DSTERF( N, D, E, INFO ) - GO TO 50 - END IF -* -* If N is smaller than the minimum divide size (SMLSIZ+1), then -* solve the problem with another solver. -* - IF( N.LE.SMLSIZ ) THEN -* - CALL DSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO ) -* - ELSE -* -* If COMPZ = 'V', the Z matrix must be stored elsewhere for later -* use. -* - IF( ICOMPZ.EQ.1 ) THEN - STOREZ = 1 + N*N - ELSE - STOREZ = 1 - END IF -* - IF( ICOMPZ.EQ.2 ) THEN - CALL DLASET( 'Full', N, N, ZERO, ONE, Z, LDZ ) - END IF -* -* Scale. -* - ORGNRM = DLANST( 'M', N, D, E ) - IF( ORGNRM.EQ.ZERO ) - $ GO TO 50 -* - EPS = DLAMCH( 'Epsilon' ) -* - START = 1 -* -* while ( START <= N ) -* - 10 CONTINUE - IF( START.LE.N ) THEN -* -* Let FINISH be the position of the next subdiagonal entry -* such that E( FINISH ) <= TINY or FINISH = N if no such -* subdiagonal exists. The matrix identified by the elements -* between START and FINISH constitutes an independent -* sub-problem. -* - FINISH = START - 20 CONTINUE - IF( FINISH.LT.N ) THEN - TINY = EPS*SQRT( ABS( D( FINISH ) ) )* - $ SQRT( ABS( D( FINISH+1 ) ) ) - IF( ABS( E( FINISH ) ).GT.TINY ) THEN - FINISH = FINISH + 1 - GO TO 20 - END IF - END IF -* -* (Sub) Problem determined. Compute its size and solve it. -* - M = FINISH - START + 1 - IF( M.EQ.1 ) THEN - START = FINISH + 1 - GO TO 10 - END IF - IF( M.GT.SMLSIZ ) THEN -* -* Scale. -* - ORGNRM = DLANST( 'M', M, D( START ), E( START ) ) - CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, M, 1, D( START ), M, - $ INFO ) - CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, M-1, 1, E( START ), - $ M-1, INFO ) -* - IF( ICOMPZ.EQ.1 ) THEN - STRTRW = 1 - ELSE - STRTRW = START - END IF - CALL DLAED0( ICOMPZ, N, M, D( START ), E( START ), - $ Z( STRTRW, START ), LDZ, WORK( 1 ), N, - $ WORK( STOREZ ), IWORK, INFO ) - IF( INFO.NE.0 ) THEN - INFO = ( INFO / ( M+1 )+START-1 )*( N+1 ) + - $ MOD( INFO, ( M+1 ) ) + START - 1 - GO TO 50 - END IF -* -* Scale back. -* - CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, M, 1, D( START ), M, - $ INFO ) -* - ELSE - IF( ICOMPZ.EQ.1 ) THEN -* -* Since QR won't update a Z matrix which is larger than -* the length of D, we must solve the sub-problem in a -* workspace and then multiply back into Z. -* - CALL DSTEQR( 'I', M, D( START ), E( START ), WORK, M, - $ WORK( M*M+1 ), INFO ) - CALL DLACPY( 'A', N, M, Z( 1, START ), LDZ, - $ WORK( STOREZ ), N ) - CALL DGEMM( 'N', 'N', N, M, M, ONE, - $ WORK( STOREZ ), N, WORK, M, ZERO, - $ Z( 1, START ), LDZ ) - ELSE IF( ICOMPZ.EQ.2 ) THEN - CALL DSTEQR( 'I', M, D( START ), E( START ), - $ Z( START, START ), LDZ, WORK, INFO ) - ELSE - CALL DSTERF( M, D( START ), E( START ), INFO ) - END IF - IF( INFO.NE.0 ) THEN - INFO = START*( N+1 ) + FINISH - GO TO 50 - END IF - END IF -* - START = FINISH + 1 - GO TO 10 - END IF -* -* endwhile -* - IF( ICOMPZ.EQ.0 ) THEN -* -* Use Quick Sort -* - CALL DLASRT( 'I', N, D, INFO ) -* - ELSE -* -* Use Selection Sort to minimize swaps of eigenvectors -* - DO 40 II = 2, N - I = II - 1 - K = I - P = D( I ) - DO 30 J = II, N - IF( D( J ).LT.P ) THEN - K = J - P = D( J ) - END IF - 30 CONTINUE - IF( K.NE.I ) THEN - D( K ) = D( I ) - D( I ) = P - CALL DSWAP( N, Z( 1, I ), 1, Z( 1, K ), 1 ) - END IF - 40 CONTINUE - END IF - END IF -* - 50 CONTINUE - WORK( 1 ) = LWMIN - IWORK( 1 ) = LIWMIN -* - RETURN -* -* End of DSTEDC -* - END diff --git a/lib/linalg/fortran/dsteqr.f b/lib/linalg/fortran/dsteqr.f deleted file mode 100644 index 50a9188c7c..0000000000 --- a/lib/linalg/fortran/dsteqr.f +++ /dev/null @@ -1,569 +0,0 @@ -*> \brief \b DSTEQR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DSTEQR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER COMPZ -* INTEGER INFO, LDZ, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( * ), E( * ), WORK( * ), Z( LDZ, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSTEQR computes all eigenvalues and, optionally, eigenvectors of a -*> symmetric tridiagonal matrix using the implicit QL or QR method. -*> The eigenvectors of a full or band symmetric matrix can also be found -*> if DSYTRD or DSPTRD or DSBTRD has been used to reduce this matrix to -*> tridiagonal form. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] COMPZ -*> \verbatim -*> COMPZ is CHARACTER*1 -*> = 'N': Compute eigenvalues only. -*> = 'V': Compute eigenvalues and eigenvectors of the original -*> symmetric matrix. On entry, Z must contain the -*> orthogonal matrix used to reduce the original matrix -*> to tridiagonal form. -*> = 'I': Compute eigenvalues and eigenvectors of the -*> tridiagonal matrix. Z is initialized to the identity -*> matrix. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix. N >= 0. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the diagonal elements of the tridiagonal matrix. -*> On exit, if INFO = 0, the eigenvalues in ascending order. -*> \endverbatim -*> -*> \param[in,out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> On entry, the (n-1) subdiagonal elements of the tridiagonal -*> matrix. -*> On exit, E has been destroyed. -*> \endverbatim -*> -*> \param[in,out] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension (LDZ, N) -*> On entry, if COMPZ = 'V', then Z contains the orthogonal -*> matrix used in the reduction to tridiagonal form. -*> On exit, if INFO = 0, then if COMPZ = 'V', Z contains the -*> orthonormal eigenvectors of the original symmetric matrix, -*> and if COMPZ = 'I', Z contains the orthonormal eigenvectors -*> of the symmetric tridiagonal matrix. -*> If COMPZ = 'N', then Z is not referenced. -*> \endverbatim -*> -*> \param[in] LDZ -*> \verbatim -*> LDZ is INTEGER -*> The leading dimension of the array Z. LDZ >= 1, and if -*> eigenvectors are desired, then LDZ >= max(1,N). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (max(1,2*N-2)) -*> If COMPZ = 'N', then WORK is not referenced. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: the algorithm has failed to find all the eigenvalues in -*> a total of 30*N iterations; if INFO = i, then i -*> elements of E have not converged to zero; on exit, D -*> and E contain the elements of a symmetric tridiagonal -*> matrix which is orthogonally similar to the original -*> matrix. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -* ===================================================================== - SUBROUTINE DSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER COMPZ - INTEGER INFO, LDZ, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( * ), E( * ), WORK( * ), Z( LDZ, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE, TWO, THREE - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0, - $ THREE = 3.0D0 ) - INTEGER MAXIT - PARAMETER ( MAXIT = 30 ) -* .. -* .. Local Scalars .. - INTEGER I, ICOMPZ, II, ISCALE, J, JTOT, K, L, L1, LEND, - $ LENDM1, LENDP1, LENDSV, LM1, LSV, M, MM, MM1, - $ NM1, NMAXIT - DOUBLE PRECISION ANORM, B, C, EPS, EPS2, F, G, P, R, RT1, RT2, - $ S, SAFMAX, SAFMIN, SSFMAX, SSFMIN, TST -* .. -* .. External Functions .. - LOGICAL LSAME - DOUBLE PRECISION DLAMCH, DLANST, DLAPY2 - EXTERNAL LSAME, DLAMCH, DLANST, DLAPY2 -* .. -* .. External Subroutines .. - EXTERNAL DLAE2, DLAEV2, DLARTG, DLASCL, DLASET, DLASR, - $ DLASRT, DSWAP, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, SIGN, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( LSAME( COMPZ, 'N' ) ) THEN - ICOMPZ = 0 - ELSE IF( LSAME( COMPZ, 'V' ) ) THEN - ICOMPZ = 1 - ELSE IF( LSAME( COMPZ, 'I' ) ) THEN - ICOMPZ = 2 - ELSE - ICOMPZ = -1 - END IF - IF( ICOMPZ.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( ( LDZ.LT.1 ) .OR. ( ICOMPZ.GT.0 .AND. LDZ.LT.MAX( 1, - $ N ) ) ) THEN - INFO = -6 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DSTEQR', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( N.EQ.1 ) THEN - IF( ICOMPZ.EQ.2 ) - $ Z( 1, 1 ) = ONE - RETURN - END IF -* -* Determine the unit roundoff and over/underflow thresholds. -* - EPS = DLAMCH( 'E' ) - EPS2 = EPS**2 - SAFMIN = DLAMCH( 'S' ) - SAFMAX = ONE / SAFMIN - SSFMAX = SQRT( SAFMAX ) / THREE - SSFMIN = SQRT( SAFMIN ) / EPS2 -* -* Compute the eigenvalues and eigenvectors of the tridiagonal -* matrix. -* - IF( ICOMPZ.EQ.2 ) - $ CALL DLASET( 'Full', N, N, ZERO, ONE, Z, LDZ ) -* - NMAXIT = N*MAXIT - JTOT = 0 -* -* Determine where the matrix splits and choose QL or QR iteration -* for each block, according to whether top or bottom diagonal -* element is smaller. -* - L1 = 1 - NM1 = N - 1 -* - 10 CONTINUE - IF( L1.GT.N ) - $ GO TO 160 - IF( L1.GT.1 ) - $ E( L1-1 ) = ZERO - IF( L1.LE.NM1 ) THEN - DO 20 M = L1, NM1 - TST = ABS( E( M ) ) - IF( TST.EQ.ZERO ) - $ GO TO 30 - IF( TST.LE.( SQRT( ABS( D( M ) ) )*SQRT( ABS( D( M+ - $ 1 ) ) ) )*EPS ) THEN - E( M ) = ZERO - GO TO 30 - END IF - 20 CONTINUE - END IF - M = N -* - 30 CONTINUE - L = L1 - LSV = L - LEND = M - LENDSV = LEND - L1 = M + 1 - IF( LEND.EQ.L ) - $ GO TO 10 -* -* Scale submatrix in rows and columns L to LEND -* - ANORM = DLANST( 'M', LEND-L+1, D( L ), E( L ) ) - ISCALE = 0 - IF( ANORM.EQ.ZERO ) - $ GO TO 10 - IF( ANORM.GT.SSFMAX ) THEN - ISCALE = 1 - CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ), N, - $ INFO ) - CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N, - $ INFO ) - ELSE IF( ANORM.LT.SSFMIN ) THEN - ISCALE = 2 - CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N, - $ INFO ) - CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N, - $ INFO ) - END IF -* -* Choose between QL and QR iteration -* - IF( ABS( D( LEND ) ).LT.ABS( D( L ) ) ) THEN - LEND = LSV - L = LENDSV - END IF -* - IF( LEND.GT.L ) THEN -* -* QL Iteration -* -* Look for small subdiagonal element. -* - 40 CONTINUE - IF( L.NE.LEND ) THEN - LENDM1 = LEND - 1 - DO 50 M = L, LENDM1 - TST = ABS( E( M ) )**2 - IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M+1 ) )+ - $ SAFMIN )GO TO 60 - 50 CONTINUE - END IF -* - M = LEND -* - 60 CONTINUE - IF( M.LT.LEND ) - $ E( M ) = ZERO - P = D( L ) - IF( M.EQ.L ) - $ GO TO 80 -* -* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 -* to compute its eigensystem. -* - IF( M.EQ.L+1 ) THEN - IF( ICOMPZ.GT.0 ) THEN - CALL DLAEV2( D( L ), E( L ), D( L+1 ), RT1, RT2, C, S ) - WORK( L ) = C - WORK( N-1+L ) = S - CALL DLASR( 'R', 'V', 'B', N, 2, WORK( L ), - $ WORK( N-1+L ), Z( 1, L ), LDZ ) - ELSE - CALL DLAE2( D( L ), E( L ), D( L+1 ), RT1, RT2 ) - END IF - D( L ) = RT1 - D( L+1 ) = RT2 - E( L ) = ZERO - L = L + 2 - IF( L.LE.LEND ) - $ GO TO 40 - GO TO 140 - END IF -* - IF( JTOT.EQ.NMAXIT ) - $ GO TO 140 - JTOT = JTOT + 1 -* -* Form shift. -* - G = ( D( L+1 )-P ) / ( TWO*E( L ) ) - R = DLAPY2( G, ONE ) - G = D( M ) - P + ( E( L ) / ( G+SIGN( R, G ) ) ) -* - S = ONE - C = ONE - P = ZERO -* -* Inner loop -* - MM1 = M - 1 - DO 70 I = MM1, L, -1 - F = S*E( I ) - B = C*E( I ) - CALL DLARTG( G, F, C, S, R ) - IF( I.NE.M-1 ) - $ E( I+1 ) = R - G = D( I+1 ) - P - R = ( D( I )-G )*S + TWO*C*B - P = S*R - D( I+1 ) = G + P - G = C*R - B -* -* If eigenvectors are desired, then save rotations. -* - IF( ICOMPZ.GT.0 ) THEN - WORK( I ) = C - WORK( N-1+I ) = -S - END IF -* - 70 CONTINUE -* -* If eigenvectors are desired, then apply saved rotations. -* - IF( ICOMPZ.GT.0 ) THEN - MM = M - L + 1 - CALL DLASR( 'R', 'V', 'B', N, MM, WORK( L ), WORK( N-1+L ), - $ Z( 1, L ), LDZ ) - END IF -* - D( L ) = D( L ) - P - E( L ) = G - GO TO 40 -* -* Eigenvalue found. -* - 80 CONTINUE - D( L ) = P -* - L = L + 1 - IF( L.LE.LEND ) - $ GO TO 40 - GO TO 140 -* - ELSE -* -* QR Iteration -* -* Look for small superdiagonal element. -* - 90 CONTINUE - IF( L.NE.LEND ) THEN - LENDP1 = LEND + 1 - DO 100 M = L, LENDP1, -1 - TST = ABS( E( M-1 ) )**2 - IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M-1 ) )+ - $ SAFMIN )GO TO 110 - 100 CONTINUE - END IF -* - M = LEND -* - 110 CONTINUE - IF( M.GT.LEND ) - $ E( M-1 ) = ZERO - P = D( L ) - IF( M.EQ.L ) - $ GO TO 130 -* -* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 -* to compute its eigensystem. -* - IF( M.EQ.L-1 ) THEN - IF( ICOMPZ.GT.0 ) THEN - CALL DLAEV2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2, C, S ) - WORK( M ) = C - WORK( N-1+M ) = S - CALL DLASR( 'R', 'V', 'F', N, 2, WORK( M ), - $ WORK( N-1+M ), Z( 1, L-1 ), LDZ ) - ELSE - CALL DLAE2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2 ) - END IF - D( L-1 ) = RT1 - D( L ) = RT2 - E( L-1 ) = ZERO - L = L - 2 - IF( L.GE.LEND ) - $ GO TO 90 - GO TO 140 - END IF -* - IF( JTOT.EQ.NMAXIT ) - $ GO TO 140 - JTOT = JTOT + 1 -* -* Form shift. -* - G = ( D( L-1 )-P ) / ( TWO*E( L-1 ) ) - R = DLAPY2( G, ONE ) - G = D( M ) - P + ( E( L-1 ) / ( G+SIGN( R, G ) ) ) -* - S = ONE - C = ONE - P = ZERO -* -* Inner loop -* - LM1 = L - 1 - DO 120 I = M, LM1 - F = S*E( I ) - B = C*E( I ) - CALL DLARTG( G, F, C, S, R ) - IF( I.NE.M ) - $ E( I-1 ) = R - G = D( I ) - P - R = ( D( I+1 )-G )*S + TWO*C*B - P = S*R - D( I ) = G + P - G = C*R - B -* -* If eigenvectors are desired, then save rotations. -* - IF( ICOMPZ.GT.0 ) THEN - WORK( I ) = C - WORK( N-1+I ) = S - END IF -* - 120 CONTINUE -* -* If eigenvectors are desired, then apply saved rotations. -* - IF( ICOMPZ.GT.0 ) THEN - MM = L - M + 1 - CALL DLASR( 'R', 'V', 'F', N, MM, WORK( M ), WORK( N-1+M ), - $ Z( 1, M ), LDZ ) - END IF -* - D( L ) = D( L ) - P - E( LM1 ) = G - GO TO 90 -* -* Eigenvalue found. -* - 130 CONTINUE - D( L ) = P -* - L = L - 1 - IF( L.GE.LEND ) - $ GO TO 90 - GO TO 140 -* - END IF -* -* Undo scaling if necessary -* - 140 CONTINUE - IF( ISCALE.EQ.1 ) THEN - CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1, - $ D( LSV ), N, INFO ) - CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV, 1, E( LSV ), - $ N, INFO ) - ELSE IF( ISCALE.EQ.2 ) THEN - CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1, - $ D( LSV ), N, INFO ) - CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV, 1, E( LSV ), - $ N, INFO ) - END IF -* -* Check for no convergence to an eigenvalue after a total -* of N*MAXIT iterations. -* - IF( JTOT.LT.NMAXIT ) - $ GO TO 10 - DO 150 I = 1, N - 1 - IF( E( I ).NE.ZERO ) - $ INFO = INFO + 1 - 150 CONTINUE - GO TO 190 -* -* Order eigenvalues and eigenvectors. -* - 160 CONTINUE - IF( ICOMPZ.EQ.0 ) THEN -* -* Use Quick Sort -* - CALL DLASRT( 'I', N, D, INFO ) -* - ELSE -* -* Use Selection Sort to minimize swaps of eigenvectors -* - DO 180 II = 2, N - I = II - 1 - K = I - P = D( I ) - DO 170 J = II, N - IF( D( J ).LT.P ) THEN - K = J - P = D( J ) - END IF - 170 CONTINUE - IF( K.NE.I ) THEN - D( K ) = D( I ) - D( I ) = P - CALL DSWAP( N, Z( 1, I ), 1, Z( 1, K ), 1 ) - END IF - 180 CONTINUE - END IF -* - 190 CONTINUE - RETURN -* -* End of DSTEQR -* - END diff --git a/lib/linalg/fortran/dsterf.f b/lib/linalg/fortran/dsterf.f deleted file mode 100644 index b0f8d36084..0000000000 --- a/lib/linalg/fortran/dsterf.f +++ /dev/null @@ -1,423 +0,0 @@ -*> \brief \b DSTERF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DSTERF + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DSTERF( N, D, E, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( * ), E( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSTERF computes all eigenvalues of a symmetric tridiagonal matrix -*> using the Pal-Walker-Kahan variant of the QL or QR algorithm. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix. N >= 0. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the n diagonal elements of the tridiagonal matrix. -*> On exit, if INFO = 0, the eigenvalues in ascending order. -*> \endverbatim -*> -*> \param[in,out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> On entry, the (n-1) subdiagonal elements of the tridiagonal -*> matrix. -*> On exit, E has been destroyed. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: the algorithm failed to find all of the eigenvalues in -*> a total of 30*N iterations; if INFO = i, then i -*> elements of E have not converged to zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup auxOTHERcomputational -* -* ===================================================================== - SUBROUTINE DSTERF( N, D, E, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( * ), E( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE, TWO, THREE - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0, - $ THREE = 3.0D0 ) - INTEGER MAXIT - PARAMETER ( MAXIT = 30 ) -* .. -* .. Local Scalars .. - INTEGER I, ISCALE, JTOT, L, L1, LEND, LENDSV, LSV, M, - $ NMAXIT - DOUBLE PRECISION ALPHA, ANORM, BB, C, EPS, EPS2, GAMMA, OLDC, - $ OLDGAM, P, R, RT1, RT2, RTE, S, SAFMAX, SAFMIN, - $ SIGMA, SSFMAX, SSFMIN, RMAX -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH, DLANST, DLAPY2 - EXTERNAL DLAMCH, DLANST, DLAPY2 -* .. -* .. External Subroutines .. - EXTERNAL DLAE2, DLASCL, DLASRT, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, SIGN, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* -* Quick return if possible -* - IF( N.LT.0 ) THEN - INFO = -1 - CALL XERBLA( 'DSTERF', -INFO ) - RETURN - END IF - IF( N.LE.1 ) - $ RETURN -* -* Determine the unit roundoff for this environment. -* - EPS = DLAMCH( 'E' ) - EPS2 = EPS**2 - SAFMIN = DLAMCH( 'S' ) - SAFMAX = ONE / SAFMIN - SSFMAX = SQRT( SAFMAX ) / THREE - SSFMIN = SQRT( SAFMIN ) / EPS2 - RMAX = DLAMCH( 'O' ) -* -* Compute the eigenvalues of the tridiagonal matrix. -* - NMAXIT = N*MAXIT - SIGMA = ZERO - JTOT = 0 -* -* Determine where the matrix splits and choose QL or QR iteration -* for each block, according to whether top or bottom diagonal -* element is smaller. -* - L1 = 1 -* - 10 CONTINUE - IF( L1.GT.N ) - $ GO TO 170 - IF( L1.GT.1 ) - $ E( L1-1 ) = ZERO - DO 20 M = L1, N - 1 - IF( ABS( E( M ) ).LE.( SQRT( ABS( D( M ) ) )*SQRT( ABS( D( M+ - $ 1 ) ) ) )*EPS ) THEN - E( M ) = ZERO - GO TO 30 - END IF - 20 CONTINUE - M = N -* - 30 CONTINUE - L = L1 - LSV = L - LEND = M - LENDSV = LEND - L1 = M + 1 - IF( LEND.EQ.L ) - $ GO TO 10 -* -* Scale submatrix in rows and columns L to LEND -* - ANORM = DLANST( 'M', LEND-L+1, D( L ), E( L ) ) - ISCALE = 0 - IF( ANORM.EQ.ZERO ) - $ GO TO 10 - IF( (ANORM.GT.SSFMAX) ) THEN - ISCALE = 1 - CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ), N, - $ INFO ) - CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N, - $ INFO ) - ELSE IF( ANORM.LT.SSFMIN ) THEN - ISCALE = 2 - CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N, - $ INFO ) - CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N, - $ INFO ) - END IF -* - DO 40 I = L, LEND - 1 - E( I ) = E( I )**2 - 40 CONTINUE -* -* Choose between QL and QR iteration -* - IF( ABS( D( LEND ) ).LT.ABS( D( L ) ) ) THEN - LEND = LSV - L = LENDSV - END IF -* - IF( LEND.GE.L ) THEN -* -* QL Iteration -* -* Look for small subdiagonal element. -* - 50 CONTINUE - IF( L.NE.LEND ) THEN - DO 60 M = L, LEND - 1 - IF( ABS( E( M ) ).LE.EPS2*ABS( D( M )*D( M+1 ) ) ) - $ GO TO 70 - 60 CONTINUE - END IF - M = LEND -* - 70 CONTINUE - IF( M.LT.LEND ) - $ E( M ) = ZERO - P = D( L ) - IF( M.EQ.L ) - $ GO TO 90 -* -* If remaining matrix is 2 by 2, use DLAE2 to compute its -* eigenvalues. -* - IF( M.EQ.L+1 ) THEN - RTE = SQRT( E( L ) ) - CALL DLAE2( D( L ), RTE, D( L+1 ), RT1, RT2 ) - D( L ) = RT1 - D( L+1 ) = RT2 - E( L ) = ZERO - L = L + 2 - IF( L.LE.LEND ) - $ GO TO 50 - GO TO 150 - END IF -* - IF( JTOT.EQ.NMAXIT ) - $ GO TO 150 - JTOT = JTOT + 1 -* -* Form shift. -* - RTE = SQRT( E( L ) ) - SIGMA = ( D( L+1 )-P ) / ( TWO*RTE ) - R = DLAPY2( SIGMA, ONE ) - SIGMA = P - ( RTE / ( SIGMA+SIGN( R, SIGMA ) ) ) -* - C = ONE - S = ZERO - GAMMA = D( M ) - SIGMA - P = GAMMA*GAMMA -* -* Inner loop -* - DO 80 I = M - 1, L, -1 - BB = E( I ) - R = P + BB - IF( I.NE.M-1 ) - $ E( I+1 ) = S*R - OLDC = C - C = P / R - S = BB / R - OLDGAM = GAMMA - ALPHA = D( I ) - GAMMA = C*( ALPHA-SIGMA ) - S*OLDGAM - D( I+1 ) = OLDGAM + ( ALPHA-GAMMA ) - IF( C.NE.ZERO ) THEN - P = ( GAMMA*GAMMA ) / C - ELSE - P = OLDC*BB - END IF - 80 CONTINUE -* - E( L ) = S*P - D( L ) = SIGMA + GAMMA - GO TO 50 -* -* Eigenvalue found. -* - 90 CONTINUE - D( L ) = P -* - L = L + 1 - IF( L.LE.LEND ) - $ GO TO 50 - GO TO 150 -* - ELSE -* -* QR Iteration -* -* Look for small superdiagonal element. -* - 100 CONTINUE - DO 110 M = L, LEND + 1, -1 - IF( ABS( E( M-1 ) ).LE.EPS2*ABS( D( M )*D( M-1 ) ) ) - $ GO TO 120 - 110 CONTINUE - M = LEND -* - 120 CONTINUE - IF( M.GT.LEND ) - $ E( M-1 ) = ZERO - P = D( L ) - IF( M.EQ.L ) - $ GO TO 140 -* -* If remaining matrix is 2 by 2, use DLAE2 to compute its -* eigenvalues. -* - IF( M.EQ.L-1 ) THEN - RTE = SQRT( E( L-1 ) ) - CALL DLAE2( D( L ), RTE, D( L-1 ), RT1, RT2 ) - D( L ) = RT1 - D( L-1 ) = RT2 - E( L-1 ) = ZERO - L = L - 2 - IF( L.GE.LEND ) - $ GO TO 100 - GO TO 150 - END IF -* - IF( JTOT.EQ.NMAXIT ) - $ GO TO 150 - JTOT = JTOT + 1 -* -* Form shift. -* - RTE = SQRT( E( L-1 ) ) - SIGMA = ( D( L-1 )-P ) / ( TWO*RTE ) - R = DLAPY2( SIGMA, ONE ) - SIGMA = P - ( RTE / ( SIGMA+SIGN( R, SIGMA ) ) ) -* - C = ONE - S = ZERO - GAMMA = D( M ) - SIGMA - P = GAMMA*GAMMA -* -* Inner loop -* - DO 130 I = M, L - 1 - BB = E( I ) - R = P + BB - IF( I.NE.M ) - $ E( I-1 ) = S*R - OLDC = C - C = P / R - S = BB / R - OLDGAM = GAMMA - ALPHA = D( I+1 ) - GAMMA = C*( ALPHA-SIGMA ) - S*OLDGAM - D( I ) = OLDGAM + ( ALPHA-GAMMA ) - IF( C.NE.ZERO ) THEN - P = ( GAMMA*GAMMA ) / C - ELSE - P = OLDC*BB - END IF - 130 CONTINUE -* - E( L-1 ) = S*P - D( L ) = SIGMA + GAMMA - GO TO 100 -* -* Eigenvalue found. -* - 140 CONTINUE - D( L ) = P -* - L = L - 1 - IF( L.GE.LEND ) - $ GO TO 100 - GO TO 150 -* - END IF -* -* Undo scaling if necessary -* - 150 CONTINUE - IF( ISCALE.EQ.1 ) - $ CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1, - $ D( LSV ), N, INFO ) - IF( ISCALE.EQ.2 ) - $ CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1, - $ D( LSV ), N, INFO ) -* -* Check for no convergence to an eigenvalue after a total -* of N*MAXIT iterations. -* - IF( JTOT.LT.NMAXIT ) - $ GO TO 10 - DO 160 I = 1, N - 1 - IF( E( I ).NE.ZERO ) - $ INFO = INFO + 1 - 160 CONTINUE - GO TO 180 -* -* Sort eigenvalues in increasing order. -* - 170 CONTINUE - CALL DLASRT( 'I', N, D, INFO ) -* - 180 CONTINUE - RETURN -* -* End of DSTERF -* - END diff --git a/lib/linalg/fortran/dswap.f b/lib/linalg/fortran/dswap.f deleted file mode 100644 index b7600aa2d4..0000000000 --- a/lib/linalg/fortran/dswap.f +++ /dev/null @@ -1,153 +0,0 @@ -*> \brief \b DSWAP -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DSWAP(N,DX,INCX,DY,INCY) -* -* .. Scalar Arguments .. -* INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION DX(*),DY(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSWAP interchanges two vectors. -*> uses unrolled loops for increments equal to 1. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in,out] DX -*> \verbatim -*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of DX -*> \endverbatim -*> -*> \param[in,out] DY -*> \verbatim -*> DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> storage spacing between elements of DY -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, linpack, 3/11/78. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DSWAP(N,DX,INCX,DY,INCY) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. - DOUBLE PRECISION DX(*),DY(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - DOUBLE PRECISION DTEMP - INTEGER I,IX,IY,M,MP1 -* .. -* .. Intrinsic Functions .. - INTRINSIC MOD -* .. - IF (N.LE.0) RETURN - IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN -* -* code for both increments equal to 1 -* -* -* clean-up loop -* - M = MOD(N,3) - IF (M.NE.0) THEN - DO I = 1,M - DTEMP = DX(I) - DX(I) = DY(I) - DY(I) = DTEMP - END DO - IF (N.LT.3) RETURN - END IF - MP1 = M + 1 - DO I = MP1,N,3 - DTEMP = DX(I) - DX(I) = DY(I) - DY(I) = DTEMP - DTEMP = DX(I+1) - DX(I+1) = DY(I+1) - DY(I+1) = DTEMP - DTEMP = DX(I+2) - DX(I+2) = DY(I+2) - DY(I+2) = DTEMP - END DO - ELSE -* -* code for unequal increments or equal increments not equal -* to 1 -* - IX = 1 - IY = 1 - IF (INCX.LT.0) IX = (-N+1)*INCX + 1 - IF (INCY.LT.0) IY = (-N+1)*INCY + 1 - DO I = 1,N - DTEMP = DX(IX) - DX(IX) = DY(IY) - DY(IY) = DTEMP - IX = IX + INCX - IY = IY + INCY - END DO - END IF - RETURN -* -* End of DSWAP -* - END diff --git a/lib/linalg/fortran/dsyev.f b/lib/linalg/fortran/dsyev.f deleted file mode 100644 index da7557ee02..0000000000 --- a/lib/linalg/fortran/dsyev.f +++ /dev/null @@ -1,283 +0,0 @@ -*> \brief DSYEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DSYEV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER JOBZ, UPLO -* INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYEV computes all eigenvalues and, optionally, eigenvectors of a -*> real symmetric matrix A. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] JOBZ -*> \verbatim -*> JOBZ is CHARACTER*1 -*> = 'N': Compute eigenvalues only; -*> = 'V': Compute eigenvalues and eigenvectors. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored; -*> = 'L': Lower triangle of A is stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA, N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the -*> leading N-by-N upper triangular part of A contains the -*> upper triangular part of the matrix A. If UPLO = 'L', -*> the leading N-by-N lower triangular part of A contains -*> the lower triangular part of the matrix A. -*> On exit, if JOBZ = 'V', then if INFO = 0, A contains the -*> orthonormal eigenvectors of the matrix A. -*> If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') -*> or the upper triangle (if UPLO='U') of A, including the -*> diagonal, is destroyed. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] W -*> \verbatim -*> W is DOUBLE PRECISION array, dimension (N) -*> If INFO = 0, the eigenvalues in ascending order. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The length of the array WORK. LWORK >= max(1,3*N-1). -*> For optimal efficiency, LWORK >= (NB+2)*N, -*> where NB is the blocksize for DSYTRD returned by ILAENV. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, the algorithm failed to converge; i -*> off-diagonal elements of an intermediate tridiagonal -*> form did not converge to zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleSYeigen -* -* ===================================================================== - SUBROUTINE DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO ) -* -* -- LAPACK driver routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER JOBZ, UPLO - INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) -* .. -* .. Local Scalars .. - LOGICAL LOWER, LQUERY, WANTZ - INTEGER IINFO, IMAX, INDE, INDTAU, INDWRK, ISCALE, - $ LLWORK, LWKOPT, NB - DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA, - $ SMLNUM -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - DOUBLE PRECISION DLAMCH, DLANSY - EXTERNAL LSAME, ILAENV, DLAMCH, DLANSY -* .. -* .. External Subroutines .. - EXTERNAL DLASCL, DORGTR, DSCAL, DSTEQR, DSTERF, DSYTRD, - $ XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - WANTZ = LSAME( JOBZ, 'V' ) - LOWER = LSAME( UPLO, 'L' ) - LQUERY = ( LWORK.EQ.-1 ) -* - INFO = 0 - IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN - INFO = -1 - ELSE IF( .NOT.( LOWER .OR. LSAME( UPLO, 'U' ) ) ) THEN - INFO = -2 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -5 - END IF -* - IF( INFO.EQ.0 ) THEN - NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 ) - LWKOPT = MAX( 1, ( NB+2 )*N ) - WORK( 1 ) = LWKOPT -* - IF( LWORK.LT.MAX( 1, 3*N-1 ) .AND. .NOT.LQUERY ) - $ INFO = -8 - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DSYEV ', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) THEN - RETURN - END IF -* - IF( N.EQ.1 ) THEN - W( 1 ) = A( 1, 1 ) - WORK( 1 ) = 2 - IF( WANTZ ) - $ A( 1, 1 ) = ONE - RETURN - END IF -* -* Get machine constants. -* - SAFMIN = DLAMCH( 'Safe minimum' ) - EPS = DLAMCH( 'Precision' ) - SMLNUM = SAFMIN / EPS - BIGNUM = ONE / SMLNUM - RMIN = SQRT( SMLNUM ) - RMAX = SQRT( BIGNUM ) -* -* Scale matrix to allowable range, if necessary. -* - ANRM = DLANSY( 'M', UPLO, N, A, LDA, WORK ) - ISCALE = 0 - IF( ANRM.GT.ZERO .AND. ANRM.LT.RMIN ) THEN - ISCALE = 1 - SIGMA = RMIN / ANRM - ELSE IF( ANRM.GT.RMAX ) THEN - ISCALE = 1 - SIGMA = RMAX / ANRM - END IF - IF( ISCALE.EQ.1 ) - $ CALL DLASCL( UPLO, 0, 0, ONE, SIGMA, N, N, A, LDA, INFO ) -* -* Call DSYTRD to reduce symmetric matrix to tridiagonal form. -* - INDE = 1 - INDTAU = INDE + N - INDWRK = INDTAU + N - LLWORK = LWORK - INDWRK + 1 - CALL DSYTRD( UPLO, N, A, LDA, W, WORK( INDE ), WORK( INDTAU ), - $ WORK( INDWRK ), LLWORK, IINFO ) -* -* For eigenvalues only, call DSTERF. For eigenvectors, first call -* DORGTR to generate the orthogonal matrix, then call DSTEQR. -* - IF( .NOT.WANTZ ) THEN - CALL DSTERF( N, W, WORK( INDE ), INFO ) - ELSE - CALL DORGTR( UPLO, N, A, LDA, WORK( INDTAU ), WORK( INDWRK ), - $ LLWORK, IINFO ) - CALL DSTEQR( JOBZ, N, W, WORK( INDE ), A, LDA, WORK( INDTAU ), - $ INFO ) - END IF -* -* If matrix was scaled, then rescale eigenvalues appropriately. -* - IF( ISCALE.EQ.1 ) THEN - IF( INFO.EQ.0 ) THEN - IMAX = N - ELSE - IMAX = INFO - 1 - END IF - CALL DSCAL( IMAX, ONE / SIGMA, W, 1 ) - END IF -* -* Set WORK(1) to optimal workspace size. -* - WORK( 1 ) = LWKOPT -* - RETURN -* -* End of DSYEV -* - END diff --git a/lib/linalg/fortran/dsyevd.f b/lib/linalg/fortran/dsyevd.f deleted file mode 100644 index eaaecd8d98..0000000000 --- a/lib/linalg/fortran/dsyevd.f +++ /dev/null @@ -1,354 +0,0 @@ -*> \brief DSYEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DSYEVD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DSYEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK, -* LIWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER JOBZ, UPLO -* INTEGER INFO, LDA, LIWORK, LWORK, N -* .. -* .. Array Arguments .. -* INTEGER IWORK( * ) -* DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYEVD computes all eigenvalues and, optionally, eigenvectors of a -*> real symmetric matrix A. If eigenvectors are desired, it uses a -*> divide and conquer algorithm. -*> -*> The divide and conquer algorithm makes very mild assumptions about -*> floating point arithmetic. It will work on machines with a guard -*> digit in add/subtract, or on those binary machines without guard -*> digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or -*> Cray-2. It could conceivably fail on hexadecimal or decimal machines -*> without guard digits, but we know of none. -*> -*> Because of large use of BLAS of level 3, DSYEVD needs N**2 more -*> workspace than DSYEVX. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] JOBZ -*> \verbatim -*> JOBZ is CHARACTER*1 -*> = 'N': Compute eigenvalues only; -*> = 'V': Compute eigenvalues and eigenvectors. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored; -*> = 'L': Lower triangle of A is stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA, N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the -*> leading N-by-N upper triangular part of A contains the -*> upper triangular part of the matrix A. If UPLO = 'L', -*> the leading N-by-N lower triangular part of A contains -*> the lower triangular part of the matrix A. -*> On exit, if JOBZ = 'V', then if INFO = 0, A contains the -*> orthonormal eigenvectors of the matrix A. -*> If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') -*> or the upper triangle (if UPLO='U') of A, including the -*> diagonal, is destroyed. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] W -*> \verbatim -*> W is DOUBLE PRECISION array, dimension (N) -*> If INFO = 0, the eigenvalues in ascending order. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, -*> dimension (LWORK) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> If N <= 1, LWORK must be at least 1. -*> If JOBZ = 'N' and N > 1, LWORK must be at least 2*N+1. -*> If JOBZ = 'V' and N > 1, LWORK must be at least -*> 1 + 6*N + 2*N**2. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal sizes of the WORK and IWORK -*> arrays, returns these values as the first entries of the WORK -*> and IWORK arrays, and no error message related to LWORK or -*> LIWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension (MAX(1,LIWORK)) -*> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. -*> \endverbatim -*> -*> \param[in] LIWORK -*> \verbatim -*> LIWORK is INTEGER -*> The dimension of the array IWORK. -*> If N <= 1, LIWORK must be at least 1. -*> If JOBZ = 'N' and N > 1, LIWORK must be at least 1. -*> If JOBZ = 'V' and N > 1, LIWORK must be at least 3 + 5*N. -*> -*> If LIWORK = -1, then a workspace query is assumed; the -*> routine only calculates the optimal sizes of the WORK and -*> IWORK arrays, returns these values as the first entries of -*> the WORK and IWORK arrays, and no error message related to -*> LWORK or LIWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i and JOBZ = 'N', then the algorithm failed -*> to converge; i off-diagonal elements of an intermediate -*> tridiagonal form did not converge to zero; -*> if INFO = i and JOBZ = 'V', then the algorithm failed -*> to compute an eigenvalue while working on the submatrix -*> lying in rows and columns INFO/(N+1) through -*> mod(INFO,N+1). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleSYeigen -* -*> \par Contributors: -* ================== -*> -*> Jeff Rutter, Computer Science Division, University of California -*> at Berkeley, USA \n -*> Modified by Francoise Tisseur, University of Tennessee \n -*> Modified description of INFO. Sven, 16 Feb 05. \n - - -*> -* ===================================================================== - SUBROUTINE DSYEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK, - $ LIWORK, INFO ) -* -* -- LAPACK driver routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER JOBZ, UPLO - INTEGER INFO, LDA, LIWORK, LWORK, N -* .. -* .. Array Arguments .. - INTEGER IWORK( * ) - DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. -* - LOGICAL LOWER, LQUERY, WANTZ - INTEGER IINFO, INDE, INDTAU, INDWK2, INDWRK, ISCALE, - $ LIOPT, LIWMIN, LLWORK, LLWRK2, LOPT, LWMIN - DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA, - $ SMLNUM -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - DOUBLE PRECISION DLAMCH, DLANSY - EXTERNAL LSAME, DLAMCH, DLANSY, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL DLACPY, DLASCL, DORMTR, DSCAL, DSTEDC, DSTERF, - $ DSYTRD, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - WANTZ = LSAME( JOBZ, 'V' ) - LOWER = LSAME( UPLO, 'L' ) - LQUERY = ( LWORK.EQ.-1 .OR. LIWORK.EQ.-1 ) -* - INFO = 0 - IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN - INFO = -1 - ELSE IF( .NOT.( LOWER .OR. LSAME( UPLO, 'U' ) ) ) THEN - INFO = -2 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -5 - END IF -* - IF( INFO.EQ.0 ) THEN - IF( N.LE.1 ) THEN - LIWMIN = 1 - LWMIN = 1 - LOPT = LWMIN - LIOPT = LIWMIN - ELSE - IF( WANTZ ) THEN - LIWMIN = 3 + 5*N - LWMIN = 1 + 6*N + 2*N**2 - ELSE - LIWMIN = 1 - LWMIN = 2*N + 1 - END IF - LOPT = MAX( LWMIN, 2*N + - $ N*ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 ) ) - LIOPT = LIWMIN - END IF - WORK( 1 ) = LOPT - IWORK( 1 ) = LIOPT -* - IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN - INFO = -8 - ELSE IF( LIWORK.LT.LIWMIN .AND. .NOT.LQUERY ) THEN - INFO = -10 - END IF - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DSYEVD', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( N.EQ.1 ) THEN - W( 1 ) = A( 1, 1 ) - IF( WANTZ ) - $ A( 1, 1 ) = ONE - RETURN - END IF -* -* Get machine constants. -* - SAFMIN = DLAMCH( 'Safe minimum' ) - EPS = DLAMCH( 'Precision' ) - SMLNUM = SAFMIN / EPS - BIGNUM = ONE / SMLNUM - RMIN = SQRT( SMLNUM ) - RMAX = SQRT( BIGNUM ) -* -* Scale matrix to allowable range, if necessary. -* - ANRM = DLANSY( 'M', UPLO, N, A, LDA, WORK ) - ISCALE = 0 - IF( ANRM.GT.ZERO .AND. ANRM.LT.RMIN ) THEN - ISCALE = 1 - SIGMA = RMIN / ANRM - ELSE IF( ANRM.GT.RMAX ) THEN - ISCALE = 1 - SIGMA = RMAX / ANRM - END IF - IF( ISCALE.EQ.1 ) - $ CALL DLASCL( UPLO, 0, 0, ONE, SIGMA, N, N, A, LDA, INFO ) -* -* Call DSYTRD to reduce symmetric matrix to tridiagonal form. -* - INDE = 1 - INDTAU = INDE + N - INDWRK = INDTAU + N - LLWORK = LWORK - INDWRK + 1 - INDWK2 = INDWRK + N*N - LLWRK2 = LWORK - INDWK2 + 1 -* - CALL DSYTRD( UPLO, N, A, LDA, W, WORK( INDE ), WORK( INDTAU ), - $ WORK( INDWRK ), LLWORK, IINFO ) -* -* For eigenvalues only, call DSTERF. For eigenvectors, first call -* DSTEDC to generate the eigenvector matrix, WORK(INDWRK), of the -* tridiagonal matrix, then call DORMTR to multiply it by the -* Householder transformations stored in A. -* - IF( .NOT.WANTZ ) THEN - CALL DSTERF( N, W, WORK( INDE ), INFO ) - ELSE - CALL DSTEDC( 'I', N, W, WORK( INDE ), WORK( INDWRK ), N, - $ WORK( INDWK2 ), LLWRK2, IWORK, LIWORK, INFO ) - CALL DORMTR( 'L', UPLO, 'N', N, N, A, LDA, WORK( INDTAU ), - $ WORK( INDWRK ), N, WORK( INDWK2 ), LLWRK2, IINFO ) - CALL DLACPY( 'A', N, N, WORK( INDWRK ), N, A, LDA ) - END IF -* -* If matrix was scaled, then rescale eigenvalues appropriately. -* - IF( ISCALE.EQ.1 ) - $ CALL DSCAL( N, ONE / SIGMA, W, 1 ) -* - WORK( 1 ) = LOPT - IWORK( 1 ) = LIOPT -* - RETURN -* -* End of DSYEVD -* - END diff --git a/lib/linalg/fortran/dsygs2.f b/lib/linalg/fortran/dsygs2.f deleted file mode 100644 index 8a39bea77e..0000000000 --- a/lib/linalg/fortran/dsygs2.f +++ /dev/null @@ -1,280 +0,0 @@ -*> \brief \b DSYGS2 reduces a symmetric definite generalized eigenproblem to standard form, using the factorization results obtained from spotrf (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DSYGS2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DSYGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, ITYPE, LDA, LDB, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYGS2 reduces a real symmetric-definite generalized eigenproblem -*> to standard form. -*> -*> If ITYPE = 1, the problem is A*x = lambda*B*x, -*> and A is overwritten by inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T) -*> -*> If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or -*> B*A*x = lambda*x, and A is overwritten by U*A*U**T or L**T *A*L. -*> -*> B must have been previously factorized as U**T *U or L*L**T by DPOTRF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ITYPE -*> \verbatim -*> ITYPE is INTEGER -*> = 1: compute inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T); -*> = 2 or 3: compute U*A*U**T or L**T *A*L. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies whether the upper or lower triangular part of the -*> symmetric matrix A is stored, and how B has been factorized. -*> = 'U': Upper triangular -*> = 'L': Lower triangular -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrices A and B. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the leading -*> n by n upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading n by n lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> -*> On exit, if INFO = 0, the transformed matrix, stored in the -*> same format as A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB,N) -*> The triangular factor from the Cholesky factorization of B, -*> as returned by DPOTRF. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleSYcomputational -* -* ===================================================================== - SUBROUTINE DSYGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, ITYPE, LDA, LDB, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, HALF - PARAMETER ( ONE = 1.0D0, HALF = 0.5D0 ) -* .. -* .. Local Scalars .. - LOGICAL UPPER - INTEGER K - DOUBLE PRECISION AKK, BKK, CT -* .. -* .. External Subroutines .. - EXTERNAL DAXPY, DSCAL, DSYR2, DTRMV, DTRSV, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN - INFO = -1 - ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -2 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -5 - ELSE IF( LDB.LT.MAX( 1, N ) ) THEN - INFO = -7 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DSYGS2', -INFO ) - RETURN - END IF -* - IF( ITYPE.EQ.1 ) THEN - IF( UPPER ) THEN -* -* Compute inv(U**T)*A*inv(U) -* - DO 10 K = 1, N -* -* Update the upper triangle of A(k:n,k:n) -* - AKK = A( K, K ) - BKK = B( K, K ) - AKK = AKK / BKK**2 - A( K, K ) = AKK - IF( K.LT.N ) THEN - CALL DSCAL( N-K, ONE / BKK, A( K, K+1 ), LDA ) - CT = -HALF*AKK - CALL DAXPY( N-K, CT, B( K, K+1 ), LDB, A( K, K+1 ), - $ LDA ) - CALL DSYR2( UPLO, N-K, -ONE, A( K, K+1 ), LDA, - $ B( K, K+1 ), LDB, A( K+1, K+1 ), LDA ) - CALL DAXPY( N-K, CT, B( K, K+1 ), LDB, A( K, K+1 ), - $ LDA ) - CALL DTRSV( UPLO, 'Transpose', 'Non-unit', N-K, - $ B( K+1, K+1 ), LDB, A( K, K+1 ), LDA ) - END IF - 10 CONTINUE - ELSE -* -* Compute inv(L)*A*inv(L**T) -* - DO 20 K = 1, N -* -* Update the lower triangle of A(k:n,k:n) -* - AKK = A( K, K ) - BKK = B( K, K ) - AKK = AKK / BKK**2 - A( K, K ) = AKK - IF( K.LT.N ) THEN - CALL DSCAL( N-K, ONE / BKK, A( K+1, K ), 1 ) - CT = -HALF*AKK - CALL DAXPY( N-K, CT, B( K+1, K ), 1, A( K+1, K ), 1 ) - CALL DSYR2( UPLO, N-K, -ONE, A( K+1, K ), 1, - $ B( K+1, K ), 1, A( K+1, K+1 ), LDA ) - CALL DAXPY( N-K, CT, B( K+1, K ), 1, A( K+1, K ), 1 ) - CALL DTRSV( UPLO, 'No transpose', 'Non-unit', N-K, - $ B( K+1, K+1 ), LDB, A( K+1, K ), 1 ) - END IF - 20 CONTINUE - END IF - ELSE - IF( UPPER ) THEN -* -* Compute U*A*U**T -* - DO 30 K = 1, N -* -* Update the upper triangle of A(1:k,1:k) -* - AKK = A( K, K ) - BKK = B( K, K ) - CALL DTRMV( UPLO, 'No transpose', 'Non-unit', K-1, B, - $ LDB, A( 1, K ), 1 ) - CT = HALF*AKK - CALL DAXPY( K-1, CT, B( 1, K ), 1, A( 1, K ), 1 ) - CALL DSYR2( UPLO, K-1, ONE, A( 1, K ), 1, B( 1, K ), 1, - $ A, LDA ) - CALL DAXPY( K-1, CT, B( 1, K ), 1, A( 1, K ), 1 ) - CALL DSCAL( K-1, BKK, A( 1, K ), 1 ) - A( K, K ) = AKK*BKK**2 - 30 CONTINUE - ELSE -* -* Compute L**T *A*L -* - DO 40 K = 1, N -* -* Update the lower triangle of A(1:k,1:k) -* - AKK = A( K, K ) - BKK = B( K, K ) - CALL DTRMV( UPLO, 'Transpose', 'Non-unit', K-1, B, LDB, - $ A( K, 1 ), LDA ) - CT = HALF*AKK - CALL DAXPY( K-1, CT, B( K, 1 ), LDB, A( K, 1 ), LDA ) - CALL DSYR2( UPLO, K-1, ONE, A( K, 1 ), LDA, B( K, 1 ), - $ LDB, A, LDA ) - CALL DAXPY( K-1, CT, B( K, 1 ), LDB, A( K, 1 ), LDA ) - CALL DSCAL( K-1, BKK, A( K, 1 ), LDA ) - A( K, K ) = AKK*BKK**2 - 40 CONTINUE - END IF - END IF - RETURN -* -* End of DSYGS2 -* - END diff --git a/lib/linalg/fortran/dsygst.f b/lib/linalg/fortran/dsygst.f deleted file mode 100644 index 05b90372ab..0000000000 --- a/lib/linalg/fortran/dsygst.f +++ /dev/null @@ -1,318 +0,0 @@ -*> \brief \b DSYGST -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DSYGST + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DSYGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, ITYPE, LDA, LDB, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYGST reduces a real symmetric-definite generalized eigenproblem -*> to standard form. -*> -*> If ITYPE = 1, the problem is A*x = lambda*B*x, -*> and A is overwritten by inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T) -*> -*> If ITYPE = 2 or 3, the problem is A*B*x = lambda*x or -*> B*A*x = lambda*x, and A is overwritten by U*A*U**T or L**T*A*L. -*> -*> B must have been previously factorized as U**T*U or L*L**T by DPOTRF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ITYPE -*> \verbatim -*> ITYPE is INTEGER -*> = 1: compute inv(U**T)*A*inv(U) or inv(L)*A*inv(L**T); -*> = 2 or 3: compute U*A*U**T or L**T*A*L. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored and B is factored as -*> U**T*U; -*> = 'L': Lower triangle of A is stored and B is factored as -*> L*L**T. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrices A and B. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the leading -*> N-by-N upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading N-by-N lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> -*> On exit, if INFO = 0, the transformed matrix, stored in the -*> same format as A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB,N) -*> The triangular factor from the Cholesky factorization of B, -*> as returned by DPOTRF. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleSYcomputational -* -* ===================================================================== - SUBROUTINE DSYGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, ITYPE, LDA, LDB, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), B( LDB, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, HALF - PARAMETER ( ONE = 1.0D0, HALF = 0.5D0 ) -* .. -* .. Local Scalars .. - LOGICAL UPPER - INTEGER K, KB, NB -* .. -* .. External Subroutines .. - EXTERNAL DSYGS2, DSYMM, DSYR2K, DTRMM, DTRSM, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN - INFO = -1 - ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -2 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -5 - ELSE IF( LDB.LT.MAX( 1, N ) ) THEN - INFO = -7 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DSYGST', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* Determine the block size for this environment. -* - NB = ILAENV( 1, 'DSYGST', UPLO, N, -1, -1, -1 ) -* - IF( NB.LE.1 .OR. NB.GE.N ) THEN -* -* Use unblocked code -* - CALL DSYGS2( ITYPE, UPLO, N, A, LDA, B, LDB, INFO ) - ELSE -* -* Use blocked code -* - IF( ITYPE.EQ.1 ) THEN - IF( UPPER ) THEN -* -* Compute inv(U**T)*A*inv(U) -* - DO 10 K = 1, N, NB - KB = MIN( N-K+1, NB ) -* -* Update the upper triangle of A(k:n,k:n) -* - CALL DSYGS2( ITYPE, UPLO, KB, A( K, K ), LDA, - $ B( K, K ), LDB, INFO ) - IF( K+KB.LE.N ) THEN - CALL DTRSM( 'Left', UPLO, 'Transpose', 'Non-unit', - $ KB, N-K-KB+1, ONE, B( K, K ), LDB, - $ A( K, K+KB ), LDA ) - CALL DSYMM( 'Left', UPLO, KB, N-K-KB+1, -HALF, - $ A( K, K ), LDA, B( K, K+KB ), LDB, ONE, - $ A( K, K+KB ), LDA ) - CALL DSYR2K( UPLO, 'Transpose', N-K-KB+1, KB, -ONE, - $ A( K, K+KB ), LDA, B( K, K+KB ), LDB, - $ ONE, A( K+KB, K+KB ), LDA ) - CALL DSYMM( 'Left', UPLO, KB, N-K-KB+1, -HALF, - $ A( K, K ), LDA, B( K, K+KB ), LDB, ONE, - $ A( K, K+KB ), LDA ) - CALL DTRSM( 'Right', UPLO, 'No transpose', - $ 'Non-unit', KB, N-K-KB+1, ONE, - $ B( K+KB, K+KB ), LDB, A( K, K+KB ), - $ LDA ) - END IF - 10 CONTINUE - ELSE -* -* Compute inv(L)*A*inv(L**T) -* - DO 20 K = 1, N, NB - KB = MIN( N-K+1, NB ) -* -* Update the lower triangle of A(k:n,k:n) -* - CALL DSYGS2( ITYPE, UPLO, KB, A( K, K ), LDA, - $ B( K, K ), LDB, INFO ) - IF( K+KB.LE.N ) THEN - CALL DTRSM( 'Right', UPLO, 'Transpose', 'Non-unit', - $ N-K-KB+1, KB, ONE, B( K, K ), LDB, - $ A( K+KB, K ), LDA ) - CALL DSYMM( 'Right', UPLO, N-K-KB+1, KB, -HALF, - $ A( K, K ), LDA, B( K+KB, K ), LDB, ONE, - $ A( K+KB, K ), LDA ) - CALL DSYR2K( UPLO, 'No transpose', N-K-KB+1, KB, - $ -ONE, A( K+KB, K ), LDA, B( K+KB, K ), - $ LDB, ONE, A( K+KB, K+KB ), LDA ) - CALL DSYMM( 'Right', UPLO, N-K-KB+1, KB, -HALF, - $ A( K, K ), LDA, B( K+KB, K ), LDB, ONE, - $ A( K+KB, K ), LDA ) - CALL DTRSM( 'Left', UPLO, 'No transpose', - $ 'Non-unit', N-K-KB+1, KB, ONE, - $ B( K+KB, K+KB ), LDB, A( K+KB, K ), - $ LDA ) - END IF - 20 CONTINUE - END IF - ELSE - IF( UPPER ) THEN -* -* Compute U*A*U**T -* - DO 30 K = 1, N, NB - KB = MIN( N-K+1, NB ) -* -* Update the upper triangle of A(1:k+kb-1,1:k+kb-1) -* - CALL DTRMM( 'Left', UPLO, 'No transpose', 'Non-unit', - $ K-1, KB, ONE, B, LDB, A( 1, K ), LDA ) - CALL DSYMM( 'Right', UPLO, K-1, KB, HALF, A( K, K ), - $ LDA, B( 1, K ), LDB, ONE, A( 1, K ), LDA ) - CALL DSYR2K( UPLO, 'No transpose', K-1, KB, ONE, - $ A( 1, K ), LDA, B( 1, K ), LDB, ONE, A, - $ LDA ) - CALL DSYMM( 'Right', UPLO, K-1, KB, HALF, A( K, K ), - $ LDA, B( 1, K ), LDB, ONE, A( 1, K ), LDA ) - CALL DTRMM( 'Right', UPLO, 'Transpose', 'Non-unit', - $ K-1, KB, ONE, B( K, K ), LDB, A( 1, K ), - $ LDA ) - CALL DSYGS2( ITYPE, UPLO, KB, A( K, K ), LDA, - $ B( K, K ), LDB, INFO ) - 30 CONTINUE - ELSE -* -* Compute L**T*A*L -* - DO 40 K = 1, N, NB - KB = MIN( N-K+1, NB ) -* -* Update the lower triangle of A(1:k+kb-1,1:k+kb-1) -* - CALL DTRMM( 'Right', UPLO, 'No transpose', 'Non-unit', - $ KB, K-1, ONE, B, LDB, A( K, 1 ), LDA ) - CALL DSYMM( 'Left', UPLO, KB, K-1, HALF, A( K, K ), - $ LDA, B( K, 1 ), LDB, ONE, A( K, 1 ), LDA ) - CALL DSYR2K( UPLO, 'Transpose', K-1, KB, ONE, - $ A( K, 1 ), LDA, B( K, 1 ), LDB, ONE, A, - $ LDA ) - CALL DSYMM( 'Left', UPLO, KB, K-1, HALF, A( K, K ), - $ LDA, B( K, 1 ), LDB, ONE, A( K, 1 ), LDA ) - CALL DTRMM( 'Left', UPLO, 'Transpose', 'Non-unit', KB, - $ K-1, ONE, B( K, K ), LDB, A( K, 1 ), LDA ) - CALL DSYGS2( ITYPE, UPLO, KB, A( K, K ), LDA, - $ B( K, K ), LDB, INFO ) - 40 CONTINUE - END IF - END IF - END IF - RETURN -* -* End of DSYGST -* - END diff --git a/lib/linalg/fortran/dsygv.f b/lib/linalg/fortran/dsygv.f deleted file mode 100644 index 5208dbb1f1..0000000000 --- a/lib/linalg/fortran/dsygv.f +++ /dev/null @@ -1,311 +0,0 @@ -*> \brief \b DSYGV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DSYGV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DSYGV( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, -* LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER JOBZ, UPLO -* INTEGER INFO, ITYPE, LDA, LDB, LWORK, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), W( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYGV computes all the eigenvalues, and optionally, the eigenvectors -*> of a real generalized symmetric-definite eigenproblem, of the form -*> A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. -*> Here A and B are assumed to be symmetric and B is also -*> positive definite. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ITYPE -*> \verbatim -*> ITYPE is INTEGER -*> Specifies the problem type to be solved: -*> = 1: A*x = (lambda)*B*x -*> = 2: A*B*x = (lambda)*x -*> = 3: B*A*x = (lambda)*x -*> \endverbatim -*> -*> \param[in] JOBZ -*> \verbatim -*> JOBZ is CHARACTER*1 -*> = 'N': Compute eigenvalues only; -*> = 'V': Compute eigenvalues and eigenvectors. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangles of A and B are stored; -*> = 'L': Lower triangles of A and B are stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrices A and B. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA, N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the -*> leading N-by-N upper triangular part of A contains the -*> upper triangular part of the matrix A. If UPLO = 'L', -*> the leading N-by-N lower triangular part of A contains -*> the lower triangular part of the matrix A. -*> -*> On exit, if JOBZ = 'V', then if INFO = 0, A contains the -*> matrix Z of eigenvectors. The eigenvectors are normalized -*> as follows: -*> if ITYPE = 1 or 2, Z**T*B*Z = I; -*> if ITYPE = 3, Z**T*inv(B)*Z = I. -*> If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') -*> or the lower triangle (if UPLO='L') of A, including the -*> diagonal, is destroyed. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB, N) -*> On entry, the symmetric positive definite matrix B. -*> If UPLO = 'U', the leading N-by-N upper triangular part of B -*> contains the upper triangular part of the matrix B. -*> If UPLO = 'L', the leading N-by-N lower triangular part of B -*> contains the lower triangular part of the matrix B. -*> -*> On exit, if INFO <= N, the part of B containing the matrix is -*> overwritten by the triangular factor U or L from the Cholesky -*> factorization B = U**T*U or B = L*L**T. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >= max(1,N). -*> \endverbatim -*> -*> \param[out] W -*> \verbatim -*> W is DOUBLE PRECISION array, dimension (N) -*> If INFO = 0, the eigenvalues in ascending order. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The length of the array WORK. LWORK >= max(1,3*N-1). -*> For optimal efficiency, LWORK >= (NB+2)*N, -*> where NB is the blocksize for DSYTRD returned by ILAENV. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: DPOTRF or DSYEV returned an error code: -*> <= N: if INFO = i, DSYEV failed to converge; -*> i off-diagonal elements of an intermediate -*> tridiagonal form did not converge to zero; -*> > N: if INFO = N + i, for 1 <= i <= N, then the leading -*> minor of order i of B is not positive definite. -*> The factorization of B could not be completed and -*> no eigenvalues or eigenvectors were computed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleSYeigen -* -* ===================================================================== - SUBROUTINE DSYGV( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, - $ LWORK, INFO ) -* -* -- LAPACK driver routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER JOBZ, UPLO - INTEGER INFO, ITYPE, LDA, LDB, LWORK, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), B( LDB, * ), W( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY, UPPER, WANTZ - CHARACTER TRANS - INTEGER LWKMIN, LWKOPT, NB, NEIG -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL DPOTRF, DSYEV, DSYGST, DTRMM, DTRSM, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - WANTZ = LSAME( JOBZ, 'V' ) - UPPER = LSAME( UPLO, 'U' ) - LQUERY = ( LWORK.EQ.-1 ) -* - INFO = 0 - IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN - INFO = -1 - ELSE IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN - INFO = -2 - ELSE IF( .NOT.( UPPER .OR. LSAME( UPLO, 'L' ) ) ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -6 - ELSE IF( LDB.LT.MAX( 1, N ) ) THEN - INFO = -8 - END IF -* - IF( INFO.EQ.0 ) THEN - LWKMIN = MAX( 1, 3*N - 1 ) - NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 ) - LWKOPT = MAX( LWKMIN, ( NB + 2 )*N ) - WORK( 1 ) = LWKOPT -* - IF( LWORK.LT.LWKMIN .AND. .NOT.LQUERY ) THEN - INFO = -11 - END IF - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DSYGV ', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* Form a Cholesky factorization of B. -* - CALL DPOTRF( UPLO, N, B, LDB, INFO ) - IF( INFO.NE.0 ) THEN - INFO = N + INFO - RETURN - END IF -* -* Transform problem to standard eigenvalue problem and solve. -* - CALL DSYGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO ) - CALL DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO ) -* - IF( WANTZ ) THEN -* -* Backtransform eigenvectors to the original problem. -* - NEIG = N - IF( INFO.GT.0 ) - $ NEIG = INFO - 1 - IF( ITYPE.EQ.1 .OR. ITYPE.EQ.2 ) THEN -* -* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; -* backtransform eigenvectors: x = inv(L)**T*y or inv(U)*y -* - IF( UPPER ) THEN - TRANS = 'N' - ELSE - TRANS = 'T' - END IF -* - CALL DTRSM( 'Left', UPLO, TRANS, 'Non-unit', N, NEIG, ONE, - $ B, LDB, A, LDA ) -* - ELSE IF( ITYPE.EQ.3 ) THEN -* -* For B*A*x=(lambda)*x; -* backtransform eigenvectors: x = L*y or U**T*y -* - IF( UPPER ) THEN - TRANS = 'T' - ELSE - TRANS = 'N' - END IF -* - CALL DTRMM( 'Left', UPLO, TRANS, 'Non-unit', N, NEIG, ONE, - $ B, LDB, A, LDA ) - END IF - END IF -* - WORK( 1 ) = LWKOPT - RETURN -* -* End of DSYGV -* - END diff --git a/lib/linalg/fortran/dsygvd.f b/lib/linalg/fortran/dsygvd.f deleted file mode 100644 index 3b38665a75..0000000000 --- a/lib/linalg/fortran/dsygvd.f +++ /dev/null @@ -1,377 +0,0 @@ -*> \brief \b DSYGVD -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DSYGVD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DSYGVD( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, -* LWORK, IWORK, LIWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER JOBZ, UPLO -* INTEGER INFO, ITYPE, LDA, LDB, LIWORK, LWORK, N -* .. -* .. Array Arguments .. -* INTEGER IWORK( * ) -* DOUBLE PRECISION A( LDA, * ), B( LDB, * ), W( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYGVD computes all the eigenvalues, and optionally, the eigenvectors -*> of a real generalized symmetric-definite eigenproblem, of the form -*> A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. Here A and -*> B are assumed to be symmetric and B is also positive definite. -*> If eigenvectors are desired, it uses a divide and conquer algorithm. -*> -*> The divide and conquer algorithm makes very mild assumptions about -*> floating point arithmetic. It will work on machines with a guard -*> digit in add/subtract, or on those binary machines without guard -*> digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or -*> Cray-2. It could conceivably fail on hexadecimal or decimal machines -*> without guard digits, but we know of none. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ITYPE -*> \verbatim -*> ITYPE is INTEGER -*> Specifies the problem type to be solved: -*> = 1: A*x = (lambda)*B*x -*> = 2: A*B*x = (lambda)*x -*> = 3: B*A*x = (lambda)*x -*> \endverbatim -*> -*> \param[in] JOBZ -*> \verbatim -*> JOBZ is CHARACTER*1 -*> = 'N': Compute eigenvalues only; -*> = 'V': Compute eigenvalues and eigenvectors. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangles of A and B are stored; -*> = 'L': Lower triangles of A and B are stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrices A and B. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA, N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the -*> leading N-by-N upper triangular part of A contains the -*> upper triangular part of the matrix A. If UPLO = 'L', -*> the leading N-by-N lower triangular part of A contains -*> the lower triangular part of the matrix A. -*> -*> On exit, if JOBZ = 'V', then if INFO = 0, A contains the -*> matrix Z of eigenvectors. The eigenvectors are normalized -*> as follows: -*> if ITYPE = 1 or 2, Z**T*B*Z = I; -*> if ITYPE = 3, Z**T*inv(B)*Z = I. -*> If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') -*> or the lower triangle (if UPLO='L') of A, including the -*> diagonal, is destroyed. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB, N) -*> On entry, the symmetric matrix B. If UPLO = 'U', the -*> leading N-by-N upper triangular part of B contains the -*> upper triangular part of the matrix B. If UPLO = 'L', -*> the leading N-by-N lower triangular part of B contains -*> the lower triangular part of the matrix B. -*> -*> On exit, if INFO <= N, the part of B containing the matrix is -*> overwritten by the triangular factor U or L from the Cholesky -*> factorization B = U**T*U or B = L*L**T. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >= max(1,N). -*> \endverbatim -*> -*> \param[out] W -*> \verbatim -*> W is DOUBLE PRECISION array, dimension (N) -*> If INFO = 0, the eigenvalues in ascending order. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> If N <= 1, LWORK >= 1. -*> If JOBZ = 'N' and N > 1, LWORK >= 2*N+1. -*> If JOBZ = 'V' and N > 1, LWORK >= 1 + 6*N + 2*N**2. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal sizes of the WORK and IWORK -*> arrays, returns these values as the first entries of the WORK -*> and IWORK arrays, and no error message related to LWORK or -*> LIWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension (MAX(1,LIWORK)) -*> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. -*> \endverbatim -*> -*> \param[in] LIWORK -*> \verbatim -*> LIWORK is INTEGER -*> The dimension of the array IWORK. -*> If N <= 1, LIWORK >= 1. -*> If JOBZ = 'N' and N > 1, LIWORK >= 1. -*> If JOBZ = 'V' and N > 1, LIWORK >= 3 + 5*N. -*> -*> If LIWORK = -1, then a workspace query is assumed; the -*> routine only calculates the optimal sizes of the WORK and -*> IWORK arrays, returns these values as the first entries of -*> the WORK and IWORK arrays, and no error message related to -*> LWORK or LIWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: DPOTRF or DSYEVD returned an error code: -*> <= N: if INFO = i and JOBZ = 'N', then the algorithm -*> failed to converge; i off-diagonal elements of an -*> intermediate tridiagonal form did not converge to -*> zero; -*> if INFO = i and JOBZ = 'V', then the algorithm -*> failed to compute an eigenvalue while working on -*> the submatrix lying in rows and columns INFO/(N+1) -*> through mod(INFO,N+1); -*> > N: if INFO = N + i, for 1 <= i <= N, then the leading -*> minor of order i of B is not positive definite. -*> The factorization of B could not be completed and -*> no eigenvalues or eigenvectors were computed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleSYeigen -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Modified so that no backsubstitution is performed if DSYEVD fails to -*> converge (NEIG in old code could be greater than N causing out of -*> bounds reference to A - reported by Ralf Meyer). Also corrected the -*> description of INFO and the test on ITYPE. Sven, 16 Feb 05. -*> \endverbatim -* -*> \par Contributors: -* ================== -*> -*> Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA -*> -* ===================================================================== - SUBROUTINE DSYGVD( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, - $ LWORK, IWORK, LIWORK, INFO ) -* -* -- LAPACK driver routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER JOBZ, UPLO - INTEGER INFO, ITYPE, LDA, LDB, LIWORK, LWORK, N -* .. -* .. Array Arguments .. - INTEGER IWORK( * ) - DOUBLE PRECISION A( LDA, * ), B( LDB, * ), W( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY, UPPER, WANTZ - CHARACTER TRANS - INTEGER LIOPT, LIWMIN, LOPT, LWMIN -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL DPOTRF, DSYEVD, DSYGST, DTRMM, DTRSM, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - WANTZ = LSAME( JOBZ, 'V' ) - UPPER = LSAME( UPLO, 'U' ) - LQUERY = ( LWORK.EQ.-1 .OR. LIWORK.EQ.-1 ) -* - INFO = 0 - IF( N.LE.1 ) THEN - LIWMIN = 1 - LWMIN = 1 - ELSE IF( WANTZ ) THEN - LIWMIN = 3 + 5*N - LWMIN = 1 + 6*N + 2*N**2 - ELSE - LIWMIN = 1 - LWMIN = 2*N + 1 - END IF - LOPT = LWMIN - LIOPT = LIWMIN - IF( ITYPE.LT.1 .OR. ITYPE.GT.3 ) THEN - INFO = -1 - ELSE IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN - INFO = -2 - ELSE IF( .NOT.( UPPER .OR. LSAME( UPLO, 'L' ) ) ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -6 - ELSE IF( LDB.LT.MAX( 1, N ) ) THEN - INFO = -8 - END IF -* - IF( INFO.EQ.0 ) THEN - WORK( 1 ) = LOPT - IWORK( 1 ) = LIOPT -* - IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN - INFO = -11 - ELSE IF( LIWORK.LT.LIWMIN .AND. .NOT.LQUERY ) THEN - INFO = -13 - END IF - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DSYGVD', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* Form a Cholesky factorization of B. -* - CALL DPOTRF( UPLO, N, B, LDB, INFO ) - IF( INFO.NE.0 ) THEN - INFO = N + INFO - RETURN - END IF -* -* Transform problem to standard eigenvalue problem and solve. -* - CALL DSYGST( ITYPE, UPLO, N, A, LDA, B, LDB, INFO ) - CALL DSYEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK, LIWORK, - $ INFO ) - LOPT = INT( MAX( DBLE( LOPT ), DBLE( WORK( 1 ) ) ) ) - LIOPT = INT( MAX( DBLE( LIOPT ), DBLE( IWORK( 1 ) ) ) ) -* - IF( WANTZ .AND. INFO.EQ.0 ) THEN -* -* Backtransform eigenvectors to the original problem. -* - IF( ITYPE.EQ.1 .OR. ITYPE.EQ.2 ) THEN -* -* For A*x=(lambda)*B*x and A*B*x=(lambda)*x; -* backtransform eigenvectors: x = inv(L)**T*y or inv(U)*y -* - IF( UPPER ) THEN - TRANS = 'N' - ELSE - TRANS = 'T' - END IF -* - CALL DTRSM( 'Left', UPLO, TRANS, 'Non-unit', N, N, ONE, - $ B, LDB, A, LDA ) -* - ELSE IF( ITYPE.EQ.3 ) THEN -* -* For B*A*x=(lambda)*x; -* backtransform eigenvectors: x = L*y or U**T*y -* - IF( UPPER ) THEN - TRANS = 'T' - ELSE - TRANS = 'N' - END IF -* - CALL DTRMM( 'Left', UPLO, TRANS, 'Non-unit', N, N, ONE, - $ B, LDB, A, LDA ) - END IF - END IF -* - WORK( 1 ) = LOPT - IWORK( 1 ) = LIOPT -* - RETURN -* -* End of DSYGVD -* - END diff --git a/lib/linalg/fortran/dsymm.f b/lib/linalg/fortran/dsymm.f deleted file mode 100644 index 683e79f6ad..0000000000 --- a/lib/linalg/fortran/dsymm.f +++ /dev/null @@ -1,364 +0,0 @@ -*> \brief \b DSYMM -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION ALPHA,BETA -* INTEGER LDA,LDB,LDC,M,N -* CHARACTER SIDE,UPLO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYMM performs one of the matrix-matrix operations -*> -*> C := alpha*A*B + beta*C, -*> -*> or -*> -*> C := alpha*B*A + beta*C, -*> -*> where alpha and beta are scalars, A is a symmetric matrix and B and -*> C are m by n matrices. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> On entry, SIDE specifies whether the symmetric matrix A -*> appears on the left or right in the operation as follows: -*> -*> SIDE = 'L' or 'l' C := alpha*A*B + beta*C, -*> -*> SIDE = 'R' or 'r' C := alpha*B*A + beta*C, -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the upper or lower -*> triangular part of the symmetric matrix A is to be -*> referenced as follows: -*> -*> UPLO = 'U' or 'u' Only the upper triangular part of the -*> symmetric matrix is to be referenced. -*> -*> UPLO = 'L' or 'l' Only the lower triangular part of the -*> symmetric matrix is to be referenced. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> On entry, M specifies the number of rows of the matrix C. -*> M must be at least zero. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the number of columns of the matrix C. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION. -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is -*> m when SIDE = 'L' or 'l' and is n otherwise. -*> Before entry with SIDE = 'L' or 'l', the m by m part of -*> the array A must contain the symmetric matrix, such that -*> when UPLO = 'U' or 'u', the leading m by m upper triangular -*> part of the array A must contain the upper triangular part -*> of the symmetric matrix and the strictly lower triangular -*> part of A is not referenced, and when UPLO = 'L' or 'l', -*> the leading m by m lower triangular part of the array A -*> must contain the lower triangular part of the symmetric -*> matrix and the strictly upper triangular part of A is not -*> referenced. -*> Before entry with SIDE = 'R' or 'r', the n by n part of -*> the array A must contain the symmetric matrix, such that -*> when UPLO = 'U' or 'u', the leading n by n upper triangular -*> part of the array A must contain the upper triangular part -*> of the symmetric matrix and the strictly lower triangular -*> part of A is not referenced, and when UPLO = 'L' or 'l', -*> the leading n by n lower triangular part of the array A -*> must contain the lower triangular part of the symmetric -*> matrix and the strictly upper triangular part of A is not -*> referenced. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. When SIDE = 'L' or 'l' then -*> LDA must be at least max( 1, m ), otherwise LDA must be at -*> least max( 1, n ). -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension ( LDB, N ) -*> Before entry, the leading m by n part of the array B must -*> contain the matrix B. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> On entry, LDB specifies the first dimension of B as declared -*> in the calling (sub) program. LDB must be at least -*> max( 1, m ). -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is DOUBLE PRECISION. -*> On entry, BETA specifies the scalar beta. When BETA is -*> supplied as zero then C need not be set on input. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension ( LDC, N ) -*> Before entry, the leading m by n part of the array C must -*> contain the matrix C, except when beta is zero, in which -*> case C need not be set on entry. -*> On exit, the array C is overwritten by the m by n updated -*> matrix. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> On entry, LDC specifies the first dimension of C as declared -*> in the calling (sub) program. LDC must be at least -*> max( 1, m ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level3 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 3 Blas routine. -*> -*> -- Written on 8-February-1989. -*> Jack Dongarra, Argonne National Laboratory. -*> Iain Duff, AERE Harwell. -*> Jeremy Du Croz, Numerical Algorithms Group Ltd. -*> Sven Hammarling, Numerical Algorithms Group Ltd. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC) -* -* -- Reference BLAS level3 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION ALPHA,BETA - INTEGER LDA,LDB,LDC,M,N - CHARACTER SIDE,UPLO -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) -* .. -* -* ===================================================================== -* -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP1,TEMP2 - INTEGER I,INFO,J,K,NROWA - LOGICAL UPPER -* .. -* .. Parameters .. - DOUBLE PRECISION ONE,ZERO - PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) -* .. -* -* Set NROWA as the number of rows of A. -* - IF (LSAME(SIDE,'L')) THEN - NROWA = M - ELSE - NROWA = N - END IF - UPPER = LSAME(UPLO,'U') -* -* Test the input parameters. -* - INFO = 0 - IF ((.NOT.LSAME(SIDE,'L')) .AND. (.NOT.LSAME(SIDE,'R'))) THEN - INFO = 1 - ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN - INFO = 2 - ELSE IF (M.LT.0) THEN - INFO = 3 - ELSE IF (N.LT.0) THEN - INFO = 4 - ELSE IF (LDA.LT.MAX(1,NROWA)) THEN - INFO = 7 - ELSE IF (LDB.LT.MAX(1,M)) THEN - INFO = 9 - ELSE IF (LDC.LT.MAX(1,M)) THEN - INFO = 12 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DSYMM ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((M.EQ.0) .OR. (N.EQ.0) .OR. - + ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN -* -* And when alpha.eq.zero. -* - IF (ALPHA.EQ.ZERO) THEN - IF (BETA.EQ.ZERO) THEN - DO 20 J = 1,N - DO 10 I = 1,M - C(I,J) = ZERO - 10 CONTINUE - 20 CONTINUE - ELSE - DO 40 J = 1,N - DO 30 I = 1,M - C(I,J) = BETA*C(I,J) - 30 CONTINUE - 40 CONTINUE - END IF - RETURN - END IF -* -* Start the operations. -* - IF (LSAME(SIDE,'L')) THEN -* -* Form C := alpha*A*B + beta*C. -* - IF (UPPER) THEN - DO 70 J = 1,N - DO 60 I = 1,M - TEMP1 = ALPHA*B(I,J) - TEMP2 = ZERO - DO 50 K = 1,I - 1 - C(K,J) = C(K,J) + TEMP1*A(K,I) - TEMP2 = TEMP2 + B(K,J)*A(K,I) - 50 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = TEMP1*A(I,I) + ALPHA*TEMP2 - ELSE - C(I,J) = BETA*C(I,J) + TEMP1*A(I,I) + - + ALPHA*TEMP2 - END IF - 60 CONTINUE - 70 CONTINUE - ELSE - DO 100 J = 1,N - DO 90 I = M,1,-1 - TEMP1 = ALPHA*B(I,J) - TEMP2 = ZERO - DO 80 K = I + 1,M - C(K,J) = C(K,J) + TEMP1*A(K,I) - TEMP2 = TEMP2 + B(K,J)*A(K,I) - 80 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = TEMP1*A(I,I) + ALPHA*TEMP2 - ELSE - C(I,J) = BETA*C(I,J) + TEMP1*A(I,I) + - + ALPHA*TEMP2 - END IF - 90 CONTINUE - 100 CONTINUE - END IF - ELSE -* -* Form C := alpha*B*A + beta*C. -* - DO 170 J = 1,N - TEMP1 = ALPHA*A(J,J) - IF (BETA.EQ.ZERO) THEN - DO 110 I = 1,M - C(I,J) = TEMP1*B(I,J) - 110 CONTINUE - ELSE - DO 120 I = 1,M - C(I,J) = BETA*C(I,J) + TEMP1*B(I,J) - 120 CONTINUE - END IF - DO 140 K = 1,J - 1 - IF (UPPER) THEN - TEMP1 = ALPHA*A(K,J) - ELSE - TEMP1 = ALPHA*A(J,K) - END IF - DO 130 I = 1,M - C(I,J) = C(I,J) + TEMP1*B(I,K) - 130 CONTINUE - 140 CONTINUE - DO 160 K = J + 1,N - IF (UPPER) THEN - TEMP1 = ALPHA*A(J,K) - ELSE - TEMP1 = ALPHA*A(K,J) - END IF - DO 150 I = 1,M - C(I,J) = C(I,J) + TEMP1*B(I,K) - 150 CONTINUE - 160 CONTINUE - 170 CONTINUE - END IF -* - RETURN -* -* End of DSYMM -* - END diff --git a/lib/linalg/fortran/dsymv.f b/lib/linalg/fortran/dsymv.f deleted file mode 100644 index 17310d7c62..0000000000 --- a/lib/linalg/fortran/dsymv.f +++ /dev/null @@ -1,330 +0,0 @@ -*> \brief \b DSYMV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DSYMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION ALPHA,BETA -* INTEGER INCX,INCY,LDA,N -* CHARACTER UPLO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A(LDA,*),X(*),Y(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYMV performs the matrix-vector operation -*> -*> y := alpha*A*x + beta*y, -*> -*> where alpha and beta are scalars, x and y are n element vectors and -*> A is an n by n symmetric matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the upper or lower -*> triangular part of the array A is to be referenced as -*> follows: -*> -*> UPLO = 'U' or 'u' Only the upper triangular part of A -*> is to be referenced. -*> -*> UPLO = 'L' or 'l' Only the lower triangular part of A -*> is to be referenced. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION. -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension ( LDA, N ) -*> Before entry with UPLO = 'U' or 'u', the leading n by n -*> upper triangular part of the array A must contain the upper -*> triangular part of the symmetric matrix and the strictly -*> lower triangular part of A is not referenced. -*> Before entry with UPLO = 'L' or 'l', the leading n by n -*> lower triangular part of the array A must contain the lower -*> triangular part of the symmetric matrix and the strictly -*> upper triangular part of A is not referenced. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. LDA must be at least -*> max( 1, n ). -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCX ) ). -*> Before entry, the incremented array X must contain the n -*> element vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is DOUBLE PRECISION. -*> On entry, BETA specifies the scalar beta. When BETA is -*> supplied as zero then Y need not be set on input. -*> \endverbatim -*> -*> \param[in,out] Y -*> \verbatim -*> Y is DOUBLE PRECISION array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCY ) ). -*> Before entry, the incremented array Y must contain the n -*> element vector y. On exit, Y is overwritten by the updated -*> vector y. -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> On entry, INCY specifies the increment for the elements of -*> Y. INCY must not be zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> The vector and matrix arguments are not referenced when N = 0, or M = 0 -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DSYMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION ALPHA,BETA - INTEGER INCX,INCY,LDA,N - CHARACTER UPLO -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),X(*),Y(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE,ZERO - PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP1,TEMP2 - INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (N.LT.0) THEN - INFO = 2 - ELSE IF (LDA.LT.MAX(1,N)) THEN - INFO = 5 - ELSE IF (INCX.EQ.0) THEN - INFO = 7 - ELSE IF (INCY.EQ.0) THEN - INFO = 10 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DSYMV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN -* -* Set up the start points in X and Y. -* - IF (INCX.GT.0) THEN - KX = 1 - ELSE - KX = 1 - (N-1)*INCX - END IF - IF (INCY.GT.0) THEN - KY = 1 - ELSE - KY = 1 - (N-1)*INCY - END IF -* -* Start the operations. In this version the elements of A are -* accessed sequentially with one pass through the triangular part -* of A. -* -* First form y := beta*y. -* - IF (BETA.NE.ONE) THEN - IF (INCY.EQ.1) THEN - IF (BETA.EQ.ZERO) THEN - DO 10 I = 1,N - Y(I) = ZERO - 10 CONTINUE - ELSE - DO 20 I = 1,N - Y(I) = BETA*Y(I) - 20 CONTINUE - END IF - ELSE - IY = KY - IF (BETA.EQ.ZERO) THEN - DO 30 I = 1,N - Y(IY) = ZERO - IY = IY + INCY - 30 CONTINUE - ELSE - DO 40 I = 1,N - Y(IY) = BETA*Y(IY) - IY = IY + INCY - 40 CONTINUE - END IF - END IF - END IF - IF (ALPHA.EQ.ZERO) RETURN - IF (LSAME(UPLO,'U')) THEN -* -* Form y when A is stored in upper triangle. -* - IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN - DO 60 J = 1,N - TEMP1 = ALPHA*X(J) - TEMP2 = ZERO - DO 50 I = 1,J - 1 - Y(I) = Y(I) + TEMP1*A(I,J) - TEMP2 = TEMP2 + A(I,J)*X(I) - 50 CONTINUE - Y(J) = Y(J) + TEMP1*A(J,J) + ALPHA*TEMP2 - 60 CONTINUE - ELSE - JX = KX - JY = KY - DO 80 J = 1,N - TEMP1 = ALPHA*X(JX) - TEMP2 = ZERO - IX = KX - IY = KY - DO 70 I = 1,J - 1 - Y(IY) = Y(IY) + TEMP1*A(I,J) - TEMP2 = TEMP2 + A(I,J)*X(IX) - IX = IX + INCX - IY = IY + INCY - 70 CONTINUE - Y(JY) = Y(JY) + TEMP1*A(J,J) + ALPHA*TEMP2 - JX = JX + INCX - JY = JY + INCY - 80 CONTINUE - END IF - ELSE -* -* Form y when A is stored in lower triangle. -* - IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN - DO 100 J = 1,N - TEMP1 = ALPHA*X(J) - TEMP2 = ZERO - Y(J) = Y(J) + TEMP1*A(J,J) - DO 90 I = J + 1,N - Y(I) = Y(I) + TEMP1*A(I,J) - TEMP2 = TEMP2 + A(I,J)*X(I) - 90 CONTINUE - Y(J) = Y(J) + ALPHA*TEMP2 - 100 CONTINUE - ELSE - JX = KX - JY = KY - DO 120 J = 1,N - TEMP1 = ALPHA*X(JX) - TEMP2 = ZERO - Y(JY) = Y(JY) + TEMP1*A(J,J) - IX = JX - IY = JY - DO 110 I = J + 1,N - IX = IX + INCX - IY = IY + INCY - Y(IY) = Y(IY) + TEMP1*A(I,J) - TEMP2 = TEMP2 + A(I,J)*X(IX) - 110 CONTINUE - Y(JY) = Y(JY) + ALPHA*TEMP2 - JX = JX + INCX - JY = JY + INCY - 120 CONTINUE - END IF - END IF -* - RETURN -* -* End of DSYMV -* - END diff --git a/lib/linalg/fortran/dsyr2.f b/lib/linalg/fortran/dsyr2.f deleted file mode 100644 index 4bad19b96b..0000000000 --- a/lib/linalg/fortran/dsyr2.f +++ /dev/null @@ -1,295 +0,0 @@ -*> \brief \b DSYR2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DSYR2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION ALPHA -* INTEGER INCX,INCY,LDA,N -* CHARACTER UPLO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A(LDA,*),X(*),Y(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYR2 performs the symmetric rank 2 operation -*> -*> A := alpha*x*y**T + alpha*y*x**T + A, -*> -*> where alpha is a scalar, x and y are n element vectors and A is an n -*> by n symmetric matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the upper or lower -*> triangular part of the array A is to be referenced as -*> follows: -*> -*> UPLO = 'U' or 'u' Only the upper triangular part of A -*> is to be referenced. -*> -*> UPLO = 'L' or 'l' Only the lower triangular part of A -*> is to be referenced. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION. -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCX ) ). -*> Before entry, the incremented array X must contain the n -*> element vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is DOUBLE PRECISION array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCY ) ). -*> Before entry, the incremented array Y must contain the n -*> element vector y. -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> On entry, INCY specifies the increment for the elements of -*> Y. INCY must not be zero. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension ( LDA, N ) -*> Before entry with UPLO = 'U' or 'u', the leading n by n -*> upper triangular part of the array A must contain the upper -*> triangular part of the symmetric matrix and the strictly -*> lower triangular part of A is not referenced. On exit, the -*> upper triangular part of the array A is overwritten by the -*> upper triangular part of the updated matrix. -*> Before entry with UPLO = 'L' or 'l', the leading n by n -*> lower triangular part of the array A must contain the lower -*> triangular part of the symmetric matrix and the strictly -*> upper triangular part of A is not referenced. On exit, the -*> lower triangular part of the array A is overwritten by the -*> lower triangular part of the updated matrix. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. LDA must be at least -*> max( 1, n ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DSYR2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION ALPHA - INTEGER INCX,INCY,LDA,N - CHARACTER UPLO -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),X(*),Y(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER (ZERO=0.0D+0) -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP1,TEMP2 - INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (N.LT.0) THEN - INFO = 2 - ELSE IF (INCX.EQ.0) THEN - INFO = 5 - ELSE IF (INCY.EQ.0) THEN - INFO = 7 - ELSE IF (LDA.LT.MAX(1,N)) THEN - INFO = 9 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DSYR2 ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN -* -* Set up the start points in X and Y if the increments are not both -* unity. -* - IF ((INCX.NE.1) .OR. (INCY.NE.1)) THEN - IF (INCX.GT.0) THEN - KX = 1 - ELSE - KX = 1 - (N-1)*INCX - END IF - IF (INCY.GT.0) THEN - KY = 1 - ELSE - KY = 1 - (N-1)*INCY - END IF - JX = KX - JY = KY - END IF -* -* Start the operations. In this version the elements of A are -* accessed sequentially with one pass through the triangular part -* of A. -* - IF (LSAME(UPLO,'U')) THEN -* -* Form A when A is stored in the upper triangle. -* - IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN - DO 20 J = 1,N - IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THEN - TEMP1 = ALPHA*Y(J) - TEMP2 = ALPHA*X(J) - DO 10 I = 1,J - A(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP2 - 10 CONTINUE - END IF - 20 CONTINUE - ELSE - DO 40 J = 1,N - IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THEN - TEMP1 = ALPHA*Y(JY) - TEMP2 = ALPHA*X(JX) - IX = KX - IY = KY - DO 30 I = 1,J - A(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2 - IX = IX + INCX - IY = IY + INCY - 30 CONTINUE - END IF - JX = JX + INCX - JY = JY + INCY - 40 CONTINUE - END IF - ELSE -* -* Form A when A is stored in the lower triangle. -* - IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN - DO 60 J = 1,N - IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THEN - TEMP1 = ALPHA*Y(J) - TEMP2 = ALPHA*X(J) - DO 50 I = J,N - A(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP2 - 50 CONTINUE - END IF - 60 CONTINUE - ELSE - DO 80 J = 1,N - IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THEN - TEMP1 = ALPHA*Y(JY) - TEMP2 = ALPHA*X(JX) - IX = JX - IY = JY - DO 70 I = J,N - A(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2 - IX = IX + INCX - IY = IY + INCY - 70 CONTINUE - END IF - JX = JX + INCX - JY = JY + INCY - 80 CONTINUE - END IF - END IF -* - RETURN -* -* End of DSYR2 -* - END diff --git a/lib/linalg/fortran/dsyr2k.f b/lib/linalg/fortran/dsyr2k.f deleted file mode 100644 index f5d16e0854..0000000000 --- a/lib/linalg/fortran/dsyr2k.f +++ /dev/null @@ -1,396 +0,0 @@ -*> \brief \b DSYR2K -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION ALPHA,BETA -* INTEGER K,LDA,LDB,LDC,N -* CHARACTER TRANS,UPLO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYR2K performs one of the symmetric rank 2k operations -*> -*> C := alpha*A*B**T + alpha*B*A**T + beta*C, -*> -*> or -*> -*> C := alpha*A**T*B + alpha*B**T*A + beta*C, -*> -*> where alpha and beta are scalars, C is an n by n symmetric matrix -*> and A and B are n by k matrices in the first case and k by n -*> matrices in the second case. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the upper or lower -*> triangular part of the array C is to be referenced as -*> follows: -*> -*> UPLO = 'U' or 'u' Only the upper triangular part of C -*> is to be referenced. -*> -*> UPLO = 'L' or 'l' Only the lower triangular part of C -*> is to be referenced. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> On entry, TRANS specifies the operation to be performed as -*> follows: -*> -*> TRANS = 'N' or 'n' C := alpha*A*B**T + alpha*B*A**T + -*> beta*C. -*> -*> TRANS = 'T' or 't' C := alpha*A**T*B + alpha*B**T*A + -*> beta*C. -*> -*> TRANS = 'C' or 'c' C := alpha*A**T*B + alpha*B**T*A + -*> beta*C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix C. N must be -*> at least zero. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> On entry with TRANS = 'N' or 'n', K specifies the number -*> of columns of the matrices A and B, and on entry with -*> TRANS = 'T' or 't' or 'C' or 'c', K specifies the number -*> of rows of the matrices A and B. K must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION. -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is -*> k when TRANS = 'N' or 'n', and is n otherwise. -*> Before entry with TRANS = 'N' or 'n', the leading n by k -*> part of the array A must contain the matrix A, otherwise -*> the leading k by n part of the array A must contain the -*> matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. When TRANS = 'N' or 'n' -*> then LDA must be at least max( 1, n ), otherwise LDA must -*> be at least max( 1, k ). -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension ( LDB, kb ), where kb is -*> k when TRANS = 'N' or 'n', and is n otherwise. -*> Before entry with TRANS = 'N' or 'n', the leading n by k -*> part of the array B must contain the matrix B, otherwise -*> the leading k by n part of the array B must contain the -*> matrix B. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> On entry, LDB specifies the first dimension of B as declared -*> in the calling (sub) program. When TRANS = 'N' or 'n' -*> then LDB must be at least max( 1, n ), otherwise LDB must -*> be at least max( 1, k ). -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is DOUBLE PRECISION. -*> On entry, BETA specifies the scalar beta. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension ( LDC, N ) -*> Before entry with UPLO = 'U' or 'u', the leading n by n -*> upper triangular part of the array C must contain the upper -*> triangular part of the symmetric matrix and the strictly -*> lower triangular part of C is not referenced. On exit, the -*> upper triangular part of the array C is overwritten by the -*> upper triangular part of the updated matrix. -*> Before entry with UPLO = 'L' or 'l', the leading n by n -*> lower triangular part of the array C must contain the lower -*> triangular part of the symmetric matrix and the strictly -*> upper triangular part of C is not referenced. On exit, the -*> lower triangular part of the array C is overwritten by the -*> lower triangular part of the updated matrix. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> On entry, LDC specifies the first dimension of C as declared -*> in the calling (sub) program. LDC must be at least -*> max( 1, n ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level3 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 3 Blas routine. -*> -*> -*> -- Written on 8-February-1989. -*> Jack Dongarra, Argonne National Laboratory. -*> Iain Duff, AERE Harwell. -*> Jeremy Du Croz, Numerical Algorithms Group Ltd. -*> Sven Hammarling, Numerical Algorithms Group Ltd. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) -* -* -- Reference BLAS level3 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION ALPHA,BETA - INTEGER K,LDA,LDB,LDC,N - CHARACTER TRANS,UPLO -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*) -* .. -* -* ===================================================================== -* -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP1,TEMP2 - INTEGER I,INFO,J,L,NROWA - LOGICAL UPPER -* .. -* .. Parameters .. - DOUBLE PRECISION ONE,ZERO - PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) -* .. -* -* Test the input parameters. -* - IF (LSAME(TRANS,'N')) THEN - NROWA = N - ELSE - NROWA = K - END IF - UPPER = LSAME(UPLO,'U') -* - INFO = 0 - IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN - INFO = 1 - ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND. - + (.NOT.LSAME(TRANS,'T')) .AND. - + (.NOT.LSAME(TRANS,'C'))) THEN - INFO = 2 - ELSE IF (N.LT.0) THEN - INFO = 3 - ELSE IF (K.LT.0) THEN - INFO = 4 - ELSE IF (LDA.LT.MAX(1,NROWA)) THEN - INFO = 7 - ELSE IF (LDB.LT.MAX(1,NROWA)) THEN - INFO = 9 - ELSE IF (LDC.LT.MAX(1,N)) THEN - INFO = 12 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DSYR2K',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR. - + (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN -* -* And when alpha.eq.zero. -* - IF (ALPHA.EQ.ZERO) THEN - IF (UPPER) THEN - IF (BETA.EQ.ZERO) THEN - DO 20 J = 1,N - DO 10 I = 1,J - C(I,J) = ZERO - 10 CONTINUE - 20 CONTINUE - ELSE - DO 40 J = 1,N - DO 30 I = 1,J - C(I,J) = BETA*C(I,J) - 30 CONTINUE - 40 CONTINUE - END IF - ELSE - IF (BETA.EQ.ZERO) THEN - DO 60 J = 1,N - DO 50 I = J,N - C(I,J) = ZERO - 50 CONTINUE - 60 CONTINUE - ELSE - DO 80 J = 1,N - DO 70 I = J,N - C(I,J) = BETA*C(I,J) - 70 CONTINUE - 80 CONTINUE - END IF - END IF - RETURN - END IF -* -* Start the operations. -* - IF (LSAME(TRANS,'N')) THEN -* -* Form C := alpha*A*B**T + alpha*B*A**T + C. -* - IF (UPPER) THEN - DO 130 J = 1,N - IF (BETA.EQ.ZERO) THEN - DO 90 I = 1,J - C(I,J) = ZERO - 90 CONTINUE - ELSE IF (BETA.NE.ONE) THEN - DO 100 I = 1,J - C(I,J) = BETA*C(I,J) - 100 CONTINUE - END IF - DO 120 L = 1,K - IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN - TEMP1 = ALPHA*B(J,L) - TEMP2 = ALPHA*A(J,L) - DO 110 I = 1,J - C(I,J) = C(I,J) + A(I,L)*TEMP1 + - + B(I,L)*TEMP2 - 110 CONTINUE - END IF - 120 CONTINUE - 130 CONTINUE - ELSE - DO 180 J = 1,N - IF (BETA.EQ.ZERO) THEN - DO 140 I = J,N - C(I,J) = ZERO - 140 CONTINUE - ELSE IF (BETA.NE.ONE) THEN - DO 150 I = J,N - C(I,J) = BETA*C(I,J) - 150 CONTINUE - END IF - DO 170 L = 1,K - IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN - TEMP1 = ALPHA*B(J,L) - TEMP2 = ALPHA*A(J,L) - DO 160 I = J,N - C(I,J) = C(I,J) + A(I,L)*TEMP1 + - + B(I,L)*TEMP2 - 160 CONTINUE - END IF - 170 CONTINUE - 180 CONTINUE - END IF - ELSE -* -* Form C := alpha*A**T*B + alpha*B**T*A + C. -* - IF (UPPER) THEN - DO 210 J = 1,N - DO 200 I = 1,J - TEMP1 = ZERO - TEMP2 = ZERO - DO 190 L = 1,K - TEMP1 = TEMP1 + A(L,I)*B(L,J) - TEMP2 = TEMP2 + B(L,I)*A(L,J) - 190 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = ALPHA*TEMP1 + ALPHA*TEMP2 - ELSE - C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 + - + ALPHA*TEMP2 - END IF - 200 CONTINUE - 210 CONTINUE - ELSE - DO 240 J = 1,N - DO 230 I = J,N - TEMP1 = ZERO - TEMP2 = ZERO - DO 220 L = 1,K - TEMP1 = TEMP1 + A(L,I)*B(L,J) - TEMP2 = TEMP2 + B(L,I)*A(L,J) - 220 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = ALPHA*TEMP1 + ALPHA*TEMP2 - ELSE - C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 + - + ALPHA*TEMP2 - END IF - 230 CONTINUE - 240 CONTINUE - END IF - END IF -* - RETURN -* -* End of DSYR2K -* - END diff --git a/lib/linalg/fortran/dsyrk.f b/lib/linalg/fortran/dsyrk.f deleted file mode 100644 index 0548c0ce2f..0000000000 --- a/lib/linalg/fortran/dsyrk.f +++ /dev/null @@ -1,361 +0,0 @@ -*> \brief \b DSYRK -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION ALPHA,BETA -* INTEGER K,LDA,LDC,N -* CHARACTER TRANS,UPLO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A(LDA,*),C(LDC,*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYRK performs one of the symmetric rank k operations -*> -*> C := alpha*A*A**T + beta*C, -*> -*> or -*> -*> C := alpha*A**T*A + beta*C, -*> -*> where alpha and beta are scalars, C is an n by n symmetric matrix -*> and A is an n by k matrix in the first case and a k by n matrix -*> in the second case. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the upper or lower -*> triangular part of the array C is to be referenced as -*> follows: -*> -*> UPLO = 'U' or 'u' Only the upper triangular part of C -*> is to be referenced. -*> -*> UPLO = 'L' or 'l' Only the lower triangular part of C -*> is to be referenced. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> On entry, TRANS specifies the operation to be performed as -*> follows: -*> -*> TRANS = 'N' or 'n' C := alpha*A*A**T + beta*C. -*> -*> TRANS = 'T' or 't' C := alpha*A**T*A + beta*C. -*> -*> TRANS = 'C' or 'c' C := alpha*A**T*A + beta*C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix C. N must be -*> at least zero. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> On entry with TRANS = 'N' or 'n', K specifies the number -*> of columns of the matrix A, and on entry with -*> TRANS = 'T' or 't' or 'C' or 'c', K specifies the number -*> of rows of the matrix A. K must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION. -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is -*> k when TRANS = 'N' or 'n', and is n otherwise. -*> Before entry with TRANS = 'N' or 'n', the leading n by k -*> part of the array A must contain the matrix A, otherwise -*> the leading k by n part of the array A must contain the -*> matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. When TRANS = 'N' or 'n' -*> then LDA must be at least max( 1, n ), otherwise LDA must -*> be at least max( 1, k ). -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is DOUBLE PRECISION. -*> On entry, BETA specifies the scalar beta. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension ( LDC, N ) -*> Before entry with UPLO = 'U' or 'u', the leading n by n -*> upper triangular part of the array C must contain the upper -*> triangular part of the symmetric matrix and the strictly -*> lower triangular part of C is not referenced. On exit, the -*> upper triangular part of the array C is overwritten by the -*> upper triangular part of the updated matrix. -*> Before entry with UPLO = 'L' or 'l', the leading n by n -*> lower triangular part of the array C must contain the lower -*> triangular part of the symmetric matrix and the strictly -*> upper triangular part of C is not referenced. On exit, the -*> lower triangular part of the array C is overwritten by the -*> lower triangular part of the updated matrix. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> On entry, LDC specifies the first dimension of C as declared -*> in the calling (sub) program. LDC must be at least -*> max( 1, n ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level3 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 3 Blas routine. -*> -*> -- Written on 8-February-1989. -*> Jack Dongarra, Argonne National Laboratory. -*> Iain Duff, AERE Harwell. -*> Jeremy Du Croz, Numerical Algorithms Group Ltd. -*> Sven Hammarling, Numerical Algorithms Group Ltd. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC) -* -* -- Reference BLAS level3 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION ALPHA,BETA - INTEGER K,LDA,LDC,N - CHARACTER TRANS,UPLO -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),C(LDC,*) -* .. -* -* ===================================================================== -* -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP - INTEGER I,INFO,J,L,NROWA - LOGICAL UPPER -* .. -* .. Parameters .. - DOUBLE PRECISION ONE,ZERO - PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) -* .. -* -* Test the input parameters. -* - IF (LSAME(TRANS,'N')) THEN - NROWA = N - ELSE - NROWA = K - END IF - UPPER = LSAME(UPLO,'U') -* - INFO = 0 - IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN - INFO = 1 - ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND. - + (.NOT.LSAME(TRANS,'T')) .AND. - + (.NOT.LSAME(TRANS,'C'))) THEN - INFO = 2 - ELSE IF (N.LT.0) THEN - INFO = 3 - ELSE IF (K.LT.0) THEN - INFO = 4 - ELSE IF (LDA.LT.MAX(1,NROWA)) THEN - INFO = 7 - ELSE IF (LDC.LT.MAX(1,N)) THEN - INFO = 10 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DSYRK ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR. - + (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN -* -* And when alpha.eq.zero. -* - IF (ALPHA.EQ.ZERO) THEN - IF (UPPER) THEN - IF (BETA.EQ.ZERO) THEN - DO 20 J = 1,N - DO 10 I = 1,J - C(I,J) = ZERO - 10 CONTINUE - 20 CONTINUE - ELSE - DO 40 J = 1,N - DO 30 I = 1,J - C(I,J) = BETA*C(I,J) - 30 CONTINUE - 40 CONTINUE - END IF - ELSE - IF (BETA.EQ.ZERO) THEN - DO 60 J = 1,N - DO 50 I = J,N - C(I,J) = ZERO - 50 CONTINUE - 60 CONTINUE - ELSE - DO 80 J = 1,N - DO 70 I = J,N - C(I,J) = BETA*C(I,J) - 70 CONTINUE - 80 CONTINUE - END IF - END IF - RETURN - END IF -* -* Start the operations. -* - IF (LSAME(TRANS,'N')) THEN -* -* Form C := alpha*A*A**T + beta*C. -* - IF (UPPER) THEN - DO 130 J = 1,N - IF (BETA.EQ.ZERO) THEN - DO 90 I = 1,J - C(I,J) = ZERO - 90 CONTINUE - ELSE IF (BETA.NE.ONE) THEN - DO 100 I = 1,J - C(I,J) = BETA*C(I,J) - 100 CONTINUE - END IF - DO 120 L = 1,K - IF (A(J,L).NE.ZERO) THEN - TEMP = ALPHA*A(J,L) - DO 110 I = 1,J - C(I,J) = C(I,J) + TEMP*A(I,L) - 110 CONTINUE - END IF - 120 CONTINUE - 130 CONTINUE - ELSE - DO 180 J = 1,N - IF (BETA.EQ.ZERO) THEN - DO 140 I = J,N - C(I,J) = ZERO - 140 CONTINUE - ELSE IF (BETA.NE.ONE) THEN - DO 150 I = J,N - C(I,J) = BETA*C(I,J) - 150 CONTINUE - END IF - DO 170 L = 1,K - IF (A(J,L).NE.ZERO) THEN - TEMP = ALPHA*A(J,L) - DO 160 I = J,N - C(I,J) = C(I,J) + TEMP*A(I,L) - 160 CONTINUE - END IF - 170 CONTINUE - 180 CONTINUE - END IF - ELSE -* -* Form C := alpha*A**T*A + beta*C. -* - IF (UPPER) THEN - DO 210 J = 1,N - DO 200 I = 1,J - TEMP = ZERO - DO 190 L = 1,K - TEMP = TEMP + A(L,I)*A(L,J) - 190 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = ALPHA*TEMP - ELSE - C(I,J) = ALPHA*TEMP + BETA*C(I,J) - END IF - 200 CONTINUE - 210 CONTINUE - ELSE - DO 240 J = 1,N - DO 230 I = J,N - TEMP = ZERO - DO 220 L = 1,K - TEMP = TEMP + A(L,I)*A(L,J) - 220 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = ALPHA*TEMP - ELSE - C(I,J) = ALPHA*TEMP + BETA*C(I,J) - END IF - 230 CONTINUE - 240 CONTINUE - END IF - END IF -* - RETURN -* -* End of DSYRK -* - END diff --git a/lib/linalg/fortran/dsytd2.f b/lib/linalg/fortran/dsytd2.f deleted file mode 100644 index 977b6daa41..0000000000 --- a/lib/linalg/fortran/dsytd2.f +++ /dev/null @@ -1,320 +0,0 @@ -*> \brief \b DSYTD2 reduces a symmetric matrix to real symmetric tridiagonal form by an orthogonal similarity transformation (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DSYTD2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DSYTD2( UPLO, N, A, LDA, D, E, TAU, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAU( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYTD2 reduces a real symmetric matrix A to symmetric tridiagonal -*> form T by an orthogonal similarity transformation: Q**T * A * Q = T. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies whether the upper or lower triangular part of the -*> symmetric matrix A is stored: -*> = 'U': Upper triangular -*> = 'L': Lower triangular -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the leading -*> n-by-n upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading n-by-n lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> On exit, if UPLO = 'U', the diagonal and first superdiagonal -*> of A are overwritten by the corresponding elements of the -*> tridiagonal matrix T, and the elements above the first -*> superdiagonal, with the array TAU, represent the orthogonal -*> matrix Q as a product of elementary reflectors; if UPLO -*> = 'L', the diagonal and first subdiagonal of A are over- -*> written by the corresponding elements of the tridiagonal -*> matrix T, and the elements below the first subdiagonal, with -*> the array TAU, represent the orthogonal matrix Q as a product -*> of elementary reflectors. See Further Details. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> The diagonal elements of the tridiagonal matrix T: -*> D(i) = A(i,i). -*> \endverbatim -*> -*> \param[out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> The off-diagonal elements of the tridiagonal matrix T: -*> E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (N-1) -*> The scalar factors of the elementary reflectors (see Further -*> Details). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleSYcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> If UPLO = 'U', the matrix Q is represented as a product of elementary -*> reflectors -*> -*> Q = H(n-1) . . . H(2) H(1). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**T -*> -*> where tau is a real scalar, and v is a real vector with -*> v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in -*> A(1:i-1,i+1), and tau in TAU(i). -*> -*> If UPLO = 'L', the matrix Q is represented as a product of elementary -*> reflectors -*> -*> Q = H(1) H(2) . . . H(n-1). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**T -*> -*> where tau is a real scalar, and v is a real vector with -*> v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), -*> and tau in TAU(i). -*> -*> The contents of A on exit are illustrated by the following examples -*> with n = 5: -*> -*> if UPLO = 'U': if UPLO = 'L': -*> -*> ( d e v2 v3 v4 ) ( d ) -*> ( d e v3 v4 ) ( e d ) -*> ( d e v4 ) ( v1 e d ) -*> ( d e ) ( v1 v2 e d ) -*> ( d ) ( v1 v2 v3 e d ) -*> -*> where d and e denote diagonal and off-diagonal elements of T, and vi -*> denotes an element of the vector defining H(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DSYTD2( UPLO, N, A, LDA, D, E, TAU, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAU( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO, HALF - PARAMETER ( ONE = 1.0D0, ZERO = 0.0D0, - $ HALF = 1.0D0 / 2.0D0 ) -* .. -* .. Local Scalars .. - LOGICAL UPPER - INTEGER I - DOUBLE PRECISION ALPHA, TAUI -* .. -* .. External Subroutines .. - EXTERNAL DAXPY, DLARFG, DSYMV, DSYR2, XERBLA -* .. -* .. External Functions .. - LOGICAL LSAME - DOUBLE PRECISION DDOT - EXTERNAL LSAME, DDOT -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -4 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DSYTD2', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.LE.0 ) - $ RETURN -* - IF( UPPER ) THEN -* -* Reduce the upper triangle of A -* - DO 10 I = N - 1, 1, -1 -* -* Generate elementary reflector H(i) = I - tau * v * v**T -* to annihilate A(1:i-1,i+1) -* - CALL DLARFG( I, A( I, I+1 ), A( 1, I+1 ), 1, TAUI ) - E( I ) = A( I, I+1 ) -* - IF( TAUI.NE.ZERO ) THEN -* -* Apply H(i) from both sides to A(1:i,1:i) -* - A( I, I+1 ) = ONE -* -* Compute x := tau * A * v storing x in TAU(1:i) -* - CALL DSYMV( UPLO, I, TAUI, A, LDA, A( 1, I+1 ), 1, ZERO, - $ TAU, 1 ) -* -* Compute w := x - 1/2 * tau * (x**T * v) * v -* - ALPHA = -HALF*TAUI*DDOT( I, TAU, 1, A( 1, I+1 ), 1 ) - CALL DAXPY( I, ALPHA, A( 1, I+1 ), 1, TAU, 1 ) -* -* Apply the transformation as a rank-2 update: -* A := A - v * w**T - w * v**T -* - CALL DSYR2( UPLO, I, -ONE, A( 1, I+1 ), 1, TAU, 1, A, - $ LDA ) -* - A( I, I+1 ) = E( I ) - END IF - D( I+1 ) = A( I+1, I+1 ) - TAU( I ) = TAUI - 10 CONTINUE - D( 1 ) = A( 1, 1 ) - ELSE -* -* Reduce the lower triangle of A -* - DO 20 I = 1, N - 1 -* -* Generate elementary reflector H(i) = I - tau * v * v**T -* to annihilate A(i+2:n,i) -* - CALL DLARFG( N-I, A( I+1, I ), A( MIN( I+2, N ), I ), 1, - $ TAUI ) - E( I ) = A( I+1, I ) -* - IF( TAUI.NE.ZERO ) THEN -* -* Apply H(i) from both sides to A(i+1:n,i+1:n) -* - A( I+1, I ) = ONE -* -* Compute x := tau * A * v storing y in TAU(i:n-1) -* - CALL DSYMV( UPLO, N-I, TAUI, A( I+1, I+1 ), LDA, - $ A( I+1, I ), 1, ZERO, TAU( I ), 1 ) -* -* Compute w := x - 1/2 * tau * (x**T * v) * v -* - ALPHA = -HALF*TAUI*DDOT( N-I, TAU( I ), 1, A( I+1, I ), - $ 1 ) - CALL DAXPY( N-I, ALPHA, A( I+1, I ), 1, TAU( I ), 1 ) -* -* Apply the transformation as a rank-2 update: -* A := A - v * w**T - w * v**T -* - CALL DSYR2( UPLO, N-I, -ONE, A( I+1, I ), 1, TAU( I ), 1, - $ A( I+1, I+1 ), LDA ) -* - A( I+1, I ) = E( I ) - END IF - D( I ) = A( I, I ) - TAU( I ) = TAUI - 20 CONTINUE - D( N ) = A( N, N ) - END IF -* - RETURN -* -* End of DSYTD2 -* - END diff --git a/lib/linalg/fortran/dsytrd.f b/lib/linalg/fortran/dsytrd.f deleted file mode 100644 index 3dcfc3db2b..0000000000 --- a/lib/linalg/fortran/dsytrd.f +++ /dev/null @@ -1,373 +0,0 @@ -*> \brief \b DSYTRD -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DSYTRD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DSYTRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAU( * ), -* $ WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DSYTRD reduces a real symmetric matrix A to real symmetric -*> tridiagonal form T by an orthogonal similarity transformation: -*> Q**T * A * Q = T. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored; -*> = 'L': Lower triangle of A is stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the leading -*> N-by-N upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading N-by-N lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> On exit, if UPLO = 'U', the diagonal and first superdiagonal -*> of A are overwritten by the corresponding elements of the -*> tridiagonal matrix T, and the elements above the first -*> superdiagonal, with the array TAU, represent the orthogonal -*> matrix Q as a product of elementary reflectors; if UPLO -*> = 'L', the diagonal and first subdiagonal of A are over- -*> written by the corresponding elements of the tridiagonal -*> matrix T, and the elements below the first subdiagonal, with -*> the array TAU, represent the orthogonal matrix Q as a product -*> of elementary reflectors. See Further Details. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> The diagonal elements of the tridiagonal matrix T: -*> D(i) = A(i,i). -*> \endverbatim -*> -*> \param[out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> The off-diagonal elements of the tridiagonal matrix T: -*> E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (N-1) -*> The scalar factors of the elementary reflectors (see Further -*> Details). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= 1. -*> For optimum performance LWORK >= N*NB, where NB is the -*> optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleSYcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> If UPLO = 'U', the matrix Q is represented as a product of elementary -*> reflectors -*> -*> Q = H(n-1) . . . H(2) H(1). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**T -*> -*> where tau is a real scalar, and v is a real vector with -*> v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in -*> A(1:i-1,i+1), and tau in TAU(i). -*> -*> If UPLO = 'L', the matrix Q is represented as a product of elementary -*> reflectors -*> -*> Q = H(1) H(2) . . . H(n-1). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**T -*> -*> where tau is a real scalar, and v is a real vector with -*> v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), -*> and tau in TAU(i). -*> -*> The contents of A on exit are illustrated by the following examples -*> with n = 5: -*> -*> if UPLO = 'U': if UPLO = 'L': -*> -*> ( d e v2 v3 v4 ) ( d ) -*> ( d e v3 v4 ) ( e d ) -*> ( d e v4 ) ( v1 e d ) -*> ( d e ) ( v1 v2 e d ) -*> ( d ) ( v1 v2 v3 e d ) -*> -*> where d and e denote diagonal and off-diagonal elements of T, and vi -*> denotes an element of the vector defining H(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DSYTRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), TAU( * ), - $ WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY, UPPER - INTEGER I, IINFO, IWS, J, KK, LDWORK, LWKOPT, NB, - $ NBMIN, NX -* .. -* .. External Subroutines .. - EXTERNAL DLATRD, DSYR2K, DSYTD2, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. Executable Statements .. -* -* Test the input parameters -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - LQUERY = ( LWORK.EQ.-1 ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -4 - ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN - INFO = -9 - END IF -* - IF( INFO.EQ.0 ) THEN -* -* Determine the block size. -* - NB = ILAENV( 1, 'DSYTRD', UPLO, N, -1, -1, -1 ) - LWKOPT = N*NB - WORK( 1 ) = LWKOPT - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DSYTRD', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - NX = N - IWS = 1 - IF( NB.GT.1 .AND. NB.LT.N ) THEN -* -* Determine when to cross over from blocked to unblocked code -* (last block is always handled by unblocked code). -* - NX = MAX( NB, ILAENV( 3, 'DSYTRD', UPLO, N, -1, -1, -1 ) ) - IF( NX.LT.N ) THEN -* -* Determine if workspace is large enough for blocked code. -* - LDWORK = N - IWS = LDWORK*NB - IF( LWORK.LT.IWS ) THEN -* -* Not enough workspace to use optimal NB: determine the -* minimum value of NB, and reduce NB or force use of -* unblocked code by setting NX = N. -* - NB = MAX( LWORK / LDWORK, 1 ) - NBMIN = ILAENV( 2, 'DSYTRD', UPLO, N, -1, -1, -1 ) - IF( NB.LT.NBMIN ) - $ NX = N - END IF - ELSE - NX = N - END IF - ELSE - NB = 1 - END IF -* - IF( UPPER ) THEN -* -* Reduce the upper triangle of A. -* Columns 1:kk are handled by the unblocked method. -* - KK = N - ( ( N-NX+NB-1 ) / NB )*NB - DO 20 I = N - NB + 1, KK + 1, -NB -* -* Reduce columns i:i+nb-1 to tridiagonal form and form the -* matrix W which is needed to update the unreduced part of -* the matrix -* - CALL DLATRD( UPLO, I+NB-1, NB, A, LDA, E, TAU, WORK, - $ LDWORK ) -* -* Update the unreduced submatrix A(1:i-1,1:i-1), using an -* update of the form: A := A - V*W**T - W*V**T -* - CALL DSYR2K( UPLO, 'No transpose', I-1, NB, -ONE, A( 1, I ), - $ LDA, WORK, LDWORK, ONE, A, LDA ) -* -* Copy superdiagonal elements back into A, and diagonal -* elements into D -* - DO 10 J = I, I + NB - 1 - A( J-1, J ) = E( J-1 ) - D( J ) = A( J, J ) - 10 CONTINUE - 20 CONTINUE -* -* Use unblocked code to reduce the last or only block -* - CALL DSYTD2( UPLO, KK, A, LDA, D, E, TAU, IINFO ) - ELSE -* -* Reduce the lower triangle of A -* - DO 40 I = 1, N - NX, NB -* -* Reduce columns i:i+nb-1 to tridiagonal form and form the -* matrix W which is needed to update the unreduced part of -* the matrix -* - CALL DLATRD( UPLO, N-I+1, NB, A( I, I ), LDA, E( I ), - $ TAU( I ), WORK, LDWORK ) -* -* Update the unreduced submatrix A(i+ib:n,i+ib:n), using -* an update of the form: A := A - V*W**T - W*V**T -* - CALL DSYR2K( UPLO, 'No transpose', N-I-NB+1, NB, -ONE, - $ A( I+NB, I ), LDA, WORK( NB+1 ), LDWORK, ONE, - $ A( I+NB, I+NB ), LDA ) -* -* Copy subdiagonal elements back into A, and diagonal -* elements into D -* - DO 30 J = I, I + NB - 1 - A( J+1, J ) = E( J ) - D( J ) = A( J, J ) - 30 CONTINUE - 40 CONTINUE -* -* Use unblocked code to reduce the last or only block -* - CALL DSYTD2( UPLO, N-I+1, A( I, I ), LDA, D( I ), E( I ), - $ TAU( I ), IINFO ) - END IF -* - WORK( 1 ) = LWKOPT - RETURN -* -* End of DSYTRD -* - END diff --git a/lib/linalg/fortran/dtrmm.f b/lib/linalg/fortran/dtrmm.f deleted file mode 100644 index b2cc0a1fa8..0000000000 --- a/lib/linalg/fortran/dtrmm.f +++ /dev/null @@ -1,412 +0,0 @@ -*> \brief \b DTRMM -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION ALPHA -* INTEGER LDA,LDB,M,N -* CHARACTER DIAG,SIDE,TRANSA,UPLO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A(LDA,*),B(LDB,*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DTRMM performs one of the matrix-matrix operations -*> -*> B := alpha*op( A )*B, or B := alpha*B*op( A ), -*> -*> where alpha is a scalar, B is an m by n matrix, A is a unit, or -*> non-unit, upper or lower triangular matrix and op( A ) is one of -*> -*> op( A ) = A or op( A ) = A**T. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> On entry, SIDE specifies whether op( A ) multiplies B from -*> the left or right as follows: -*> -*> SIDE = 'L' or 'l' B := alpha*op( A )*B. -*> -*> SIDE = 'R' or 'r' B := alpha*B*op( A ). -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the matrix A is an upper or -*> lower triangular matrix as follows: -*> -*> UPLO = 'U' or 'u' A is an upper triangular matrix. -*> -*> UPLO = 'L' or 'l' A is a lower triangular matrix. -*> \endverbatim -*> -*> \param[in] TRANSA -*> \verbatim -*> TRANSA is CHARACTER*1 -*> On entry, TRANSA specifies the form of op( A ) to be used in -*> the matrix multiplication as follows: -*> -*> TRANSA = 'N' or 'n' op( A ) = A. -*> -*> TRANSA = 'T' or 't' op( A ) = A**T. -*> -*> TRANSA = 'C' or 'c' op( A ) = A**T. -*> \endverbatim -*> -*> \param[in] DIAG -*> \verbatim -*> DIAG is CHARACTER*1 -*> On entry, DIAG specifies whether or not A is unit triangular -*> as follows: -*> -*> DIAG = 'U' or 'u' A is assumed to be unit triangular. -*> -*> DIAG = 'N' or 'n' A is not assumed to be unit -*> triangular. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> On entry, M specifies the number of rows of B. M must be at -*> least zero. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the number of columns of B. N must be -*> at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION. -*> On entry, ALPHA specifies the scalar alpha. When alpha is -*> zero then A is not referenced and B need not be set before -*> entry. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension ( LDA, k ), where k is m -*> when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. -*> Before entry with UPLO = 'U' or 'u', the leading k by k -*> upper triangular part of the array A must contain the upper -*> triangular matrix and the strictly lower triangular part of -*> A is not referenced. -*> Before entry with UPLO = 'L' or 'l', the leading k by k -*> lower triangular part of the array A must contain the lower -*> triangular matrix and the strictly upper triangular part of -*> A is not referenced. -*> Note that when DIAG = 'U' or 'u', the diagonal elements of -*> A are not referenced either, but are assumed to be unity. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. When SIDE = 'L' or 'l' then -*> LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' -*> then LDA must be at least max( 1, n ). -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension ( LDB, N ) -*> Before entry, the leading m by n part of the array B must -*> contain the matrix B, and on exit is overwritten by the -*> transformed matrix. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> On entry, LDB specifies the first dimension of B as declared -*> in the calling (sub) program. LDB must be at least -*> max( 1, m ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level3 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 3 Blas routine. -*> -*> -- Written on 8-February-1989. -*> Jack Dongarra, Argonne National Laboratory. -*> Iain Duff, AERE Harwell. -*> Jeremy Du Croz, Numerical Algorithms Group Ltd. -*> Sven Hammarling, Numerical Algorithms Group Ltd. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) -* -* -- Reference BLAS level3 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION ALPHA - INTEGER LDA,LDB,M,N - CHARACTER DIAG,SIDE,TRANSA,UPLO -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),B(LDB,*) -* .. -* -* ===================================================================== -* -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP - INTEGER I,INFO,J,K,NROWA - LOGICAL LSIDE,NOUNIT,UPPER -* .. -* .. Parameters .. - DOUBLE PRECISION ONE,ZERO - PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) -* .. -* -* Test the input parameters. -* - LSIDE = LSAME(SIDE,'L') - IF (LSIDE) THEN - NROWA = M - ELSE - NROWA = N - END IF - NOUNIT = LSAME(DIAG,'N') - UPPER = LSAME(UPLO,'U') -* - INFO = 0 - IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THEN - INFO = 1 - ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN - INFO = 2 - ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND. - + (.NOT.LSAME(TRANSA,'T')) .AND. - + (.NOT.LSAME(TRANSA,'C'))) THEN - INFO = 3 - ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN - INFO = 4 - ELSE IF (M.LT.0) THEN - INFO = 5 - ELSE IF (N.LT.0) THEN - INFO = 6 - ELSE IF (LDA.LT.MAX(1,NROWA)) THEN - INFO = 9 - ELSE IF (LDB.LT.MAX(1,M)) THEN - INFO = 11 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DTRMM ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF (M.EQ.0 .OR. N.EQ.0) RETURN -* -* And when alpha.eq.zero. -* - IF (ALPHA.EQ.ZERO) THEN - DO 20 J = 1,N - DO 10 I = 1,M - B(I,J) = ZERO - 10 CONTINUE - 20 CONTINUE - RETURN - END IF -* -* Start the operations. -* - IF (LSIDE) THEN - IF (LSAME(TRANSA,'N')) THEN -* -* Form B := alpha*A*B. -* - IF (UPPER) THEN - DO 50 J = 1,N - DO 40 K = 1,M - IF (B(K,J).NE.ZERO) THEN - TEMP = ALPHA*B(K,J) - DO 30 I = 1,K - 1 - B(I,J) = B(I,J) + TEMP*A(I,K) - 30 CONTINUE - IF (NOUNIT) TEMP = TEMP*A(K,K) - B(K,J) = TEMP - END IF - 40 CONTINUE - 50 CONTINUE - ELSE - DO 80 J = 1,N - DO 70 K = M,1,-1 - IF (B(K,J).NE.ZERO) THEN - TEMP = ALPHA*B(K,J) - B(K,J) = TEMP - IF (NOUNIT) B(K,J) = B(K,J)*A(K,K) - DO 60 I = K + 1,M - B(I,J) = B(I,J) + TEMP*A(I,K) - 60 CONTINUE - END IF - 70 CONTINUE - 80 CONTINUE - END IF - ELSE -* -* Form B := alpha*A**T*B. -* - IF (UPPER) THEN - DO 110 J = 1,N - DO 100 I = M,1,-1 - TEMP = B(I,J) - IF (NOUNIT) TEMP = TEMP*A(I,I) - DO 90 K = 1,I - 1 - TEMP = TEMP + A(K,I)*B(K,J) - 90 CONTINUE - B(I,J) = ALPHA*TEMP - 100 CONTINUE - 110 CONTINUE - ELSE - DO 140 J = 1,N - DO 130 I = 1,M - TEMP = B(I,J) - IF (NOUNIT) TEMP = TEMP*A(I,I) - DO 120 K = I + 1,M - TEMP = TEMP + A(K,I)*B(K,J) - 120 CONTINUE - B(I,J) = ALPHA*TEMP - 130 CONTINUE - 140 CONTINUE - END IF - END IF - ELSE - IF (LSAME(TRANSA,'N')) THEN -* -* Form B := alpha*B*A. -* - IF (UPPER) THEN - DO 180 J = N,1,-1 - TEMP = ALPHA - IF (NOUNIT) TEMP = TEMP*A(J,J) - DO 150 I = 1,M - B(I,J) = TEMP*B(I,J) - 150 CONTINUE - DO 170 K = 1,J - 1 - IF (A(K,J).NE.ZERO) THEN - TEMP = ALPHA*A(K,J) - DO 160 I = 1,M - B(I,J) = B(I,J) + TEMP*B(I,K) - 160 CONTINUE - END IF - 170 CONTINUE - 180 CONTINUE - ELSE - DO 220 J = 1,N - TEMP = ALPHA - IF (NOUNIT) TEMP = TEMP*A(J,J) - DO 190 I = 1,M - B(I,J) = TEMP*B(I,J) - 190 CONTINUE - DO 210 K = J + 1,N - IF (A(K,J).NE.ZERO) THEN - TEMP = ALPHA*A(K,J) - DO 200 I = 1,M - B(I,J) = B(I,J) + TEMP*B(I,K) - 200 CONTINUE - END IF - 210 CONTINUE - 220 CONTINUE - END IF - ELSE -* -* Form B := alpha*B*A**T. -* - IF (UPPER) THEN - DO 260 K = 1,N - DO 240 J = 1,K - 1 - IF (A(J,K).NE.ZERO) THEN - TEMP = ALPHA*A(J,K) - DO 230 I = 1,M - B(I,J) = B(I,J) + TEMP*B(I,K) - 230 CONTINUE - END IF - 240 CONTINUE - TEMP = ALPHA - IF (NOUNIT) TEMP = TEMP*A(K,K) - IF (TEMP.NE.ONE) THEN - DO 250 I = 1,M - B(I,K) = TEMP*B(I,K) - 250 CONTINUE - END IF - 260 CONTINUE - ELSE - DO 300 K = N,1,-1 - DO 280 J = K + 1,N - IF (A(J,K).NE.ZERO) THEN - TEMP = ALPHA*A(J,K) - DO 270 I = 1,M - B(I,J) = B(I,J) + TEMP*B(I,K) - 270 CONTINUE - END IF - 280 CONTINUE - TEMP = ALPHA - IF (NOUNIT) TEMP = TEMP*A(K,K) - IF (TEMP.NE.ONE) THEN - DO 290 I = 1,M - B(I,K) = TEMP*B(I,K) - 290 CONTINUE - END IF - 300 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of DTRMM -* - END diff --git a/lib/linalg/fortran/dtrmv.f b/lib/linalg/fortran/dtrmv.f deleted file mode 100644 index e8af8e6136..0000000000 --- a/lib/linalg/fortran/dtrmv.f +++ /dev/null @@ -1,339 +0,0 @@ -*> \brief \b DTRMV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) -* -* .. Scalar Arguments .. -* INTEGER INCX,LDA,N -* CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A(LDA,*),X(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DTRMV performs one of the matrix-vector operations -*> -*> x := A*x, or x := A**T*x, -*> -*> where x is an n element vector and A is an n by n unit, or non-unit, -*> upper or lower triangular matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the matrix is an upper or -*> lower triangular matrix as follows: -*> -*> UPLO = 'U' or 'u' A is an upper triangular matrix. -*> -*> UPLO = 'L' or 'l' A is a lower triangular matrix. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> On entry, TRANS specifies the operation to be performed as -*> follows: -*> -*> TRANS = 'N' or 'n' x := A*x. -*> -*> TRANS = 'T' or 't' x := A**T*x. -*> -*> TRANS = 'C' or 'c' x := A**T*x. -*> \endverbatim -*> -*> \param[in] DIAG -*> \verbatim -*> DIAG is CHARACTER*1 -*> On entry, DIAG specifies whether or not A is unit -*> triangular as follows: -*> -*> DIAG = 'U' or 'u' A is assumed to be unit triangular. -*> -*> DIAG = 'N' or 'n' A is not assumed to be unit -*> triangular. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension ( LDA, N ) -*> Before entry with UPLO = 'U' or 'u', the leading n by n -*> upper triangular part of the array A must contain the upper -*> triangular matrix and the strictly lower triangular part of -*> A is not referenced. -*> Before entry with UPLO = 'L' or 'l', the leading n by n -*> lower triangular part of the array A must contain the lower -*> triangular matrix and the strictly upper triangular part of -*> A is not referenced. -*> Note that when DIAG = 'U' or 'u', the diagonal elements of -*> A are not referenced either, but are assumed to be unity. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. LDA must be at least -*> max( 1, n ). -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCX ) ). -*> Before entry, the incremented array X must contain the n -*> element vector x. On exit, X is overwritten with the -*> transformed vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> The vector and matrix arguments are not referenced when N = 0, or M = 0 -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,LDA,N - CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),X(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER (ZERO=0.0D+0) -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP - INTEGER I,INFO,IX,J,JX,KX - LOGICAL NOUNIT -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. - + .NOT.LSAME(TRANS,'C')) THEN - INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN - INFO = 3 - ELSE IF (N.LT.0) THEN - INFO = 4 - ELSE IF (LDA.LT.MAX(1,N)) THEN - INFO = 6 - ELSE IF (INCX.EQ.0) THEN - INFO = 8 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DTRMV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF (N.EQ.0) RETURN -* - NOUNIT = LSAME(DIAG,'N') -* -* Set up the start point in X if the increment is not unity. This -* will be ( N - 1 )*INCX too small for descending loops. -* - IF (INCX.LE.0) THEN - KX = 1 - (N-1)*INCX - ELSE IF (INCX.NE.1) THEN - KX = 1 - END IF -* -* Start the operations. In this version the elements of A are -* accessed sequentially with one pass through A. -* - IF (LSAME(TRANS,'N')) THEN -* -* Form x := A*x. -* - IF (LSAME(UPLO,'U')) THEN - IF (INCX.EQ.1) THEN - DO 20 J = 1,N - IF (X(J).NE.ZERO) THEN - TEMP = X(J) - DO 10 I = 1,J - 1 - X(I) = X(I) + TEMP*A(I,J) - 10 CONTINUE - IF (NOUNIT) X(J) = X(J)*A(J,J) - END IF - 20 CONTINUE - ELSE - JX = KX - DO 40 J = 1,N - IF (X(JX).NE.ZERO) THEN - TEMP = X(JX) - IX = KX - DO 30 I = 1,J - 1 - X(IX) = X(IX) + TEMP*A(I,J) - IX = IX + INCX - 30 CONTINUE - IF (NOUNIT) X(JX) = X(JX)*A(J,J) - END IF - JX = JX + INCX - 40 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 60 J = N,1,-1 - IF (X(J).NE.ZERO) THEN - TEMP = X(J) - DO 50 I = N,J + 1,-1 - X(I) = X(I) + TEMP*A(I,J) - 50 CONTINUE - IF (NOUNIT) X(J) = X(J)*A(J,J) - END IF - 60 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 80 J = N,1,-1 - IF (X(JX).NE.ZERO) THEN - TEMP = X(JX) - IX = KX - DO 70 I = N,J + 1,-1 - X(IX) = X(IX) + TEMP*A(I,J) - IX = IX - INCX - 70 CONTINUE - IF (NOUNIT) X(JX) = X(JX)*A(J,J) - END IF - JX = JX - INCX - 80 CONTINUE - END IF - END IF - ELSE -* -* Form x := A**T*x. -* - IF (LSAME(UPLO,'U')) THEN - IF (INCX.EQ.1) THEN - DO 100 J = N,1,-1 - TEMP = X(J) - IF (NOUNIT) TEMP = TEMP*A(J,J) - DO 90 I = J - 1,1,-1 - TEMP = TEMP + A(I,J)*X(I) - 90 CONTINUE - X(J) = TEMP - 100 CONTINUE - ELSE - JX = KX + (N-1)*INCX - DO 120 J = N,1,-1 - TEMP = X(JX) - IX = JX - IF (NOUNIT) TEMP = TEMP*A(J,J) - DO 110 I = J - 1,1,-1 - IX = IX - INCX - TEMP = TEMP + A(I,J)*X(IX) - 110 CONTINUE - X(JX) = TEMP - JX = JX - INCX - 120 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 140 J = 1,N - TEMP = X(J) - IF (NOUNIT) TEMP = TEMP*A(J,J) - DO 130 I = J + 1,N - TEMP = TEMP + A(I,J)*X(I) - 130 CONTINUE - X(J) = TEMP - 140 CONTINUE - ELSE - JX = KX - DO 160 J = 1,N - TEMP = X(JX) - IX = JX - IF (NOUNIT) TEMP = TEMP*A(J,J) - DO 150 I = J + 1,N - IX = IX + INCX - TEMP = TEMP + A(I,J)*X(IX) - 150 CONTINUE - X(JX) = TEMP - JX = JX + INCX - 160 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of DTRMV -* - END diff --git a/lib/linalg/fortran/dtrsm.f b/lib/linalg/fortran/dtrsm.f deleted file mode 100644 index fa8080bc92..0000000000 --- a/lib/linalg/fortran/dtrsm.f +++ /dev/null @@ -1,440 +0,0 @@ -*> \brief \b DTRSM -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION ALPHA -* INTEGER LDA,LDB,M,N -* CHARACTER DIAG,SIDE,TRANSA,UPLO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A(LDA,*),B(LDB,*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DTRSM solves one of the matrix equations -*> -*> op( A )*X = alpha*B, or X*op( A ) = alpha*B, -*> -*> where alpha is a scalar, X and B are m by n matrices, A is a unit, or -*> non-unit, upper or lower triangular matrix and op( A ) is one of -*> -*> op( A ) = A or op( A ) = A**T. -*> -*> The matrix X is overwritten on B. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> On entry, SIDE specifies whether op( A ) appears on the left -*> or right of X as follows: -*> -*> SIDE = 'L' or 'l' op( A )*X = alpha*B. -*> -*> SIDE = 'R' or 'r' X*op( A ) = alpha*B. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the matrix A is an upper or -*> lower triangular matrix as follows: -*> -*> UPLO = 'U' or 'u' A is an upper triangular matrix. -*> -*> UPLO = 'L' or 'l' A is a lower triangular matrix. -*> \endverbatim -*> -*> \param[in] TRANSA -*> \verbatim -*> TRANSA is CHARACTER*1 -*> On entry, TRANSA specifies the form of op( A ) to be used in -*> the matrix multiplication as follows: -*> -*> TRANSA = 'N' or 'n' op( A ) = A. -*> -*> TRANSA = 'T' or 't' op( A ) = A**T. -*> -*> TRANSA = 'C' or 'c' op( A ) = A**T. -*> \endverbatim -*> -*> \param[in] DIAG -*> \verbatim -*> DIAG is CHARACTER*1 -*> On entry, DIAG specifies whether or not A is unit triangular -*> as follows: -*> -*> DIAG = 'U' or 'u' A is assumed to be unit triangular. -*> -*> DIAG = 'N' or 'n' A is not assumed to be unit -*> triangular. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> On entry, M specifies the number of rows of B. M must be at -*> least zero. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the number of columns of B. N must be -*> at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION. -*> On entry, ALPHA specifies the scalar alpha. When alpha is -*> zero then A is not referenced and B need not be set before -*> entry. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension ( LDA, k ), -*> where k is m when SIDE = 'L' or 'l' -*> and k is n when SIDE = 'R' or 'r'. -*> Before entry with UPLO = 'U' or 'u', the leading k by k -*> upper triangular part of the array A must contain the upper -*> triangular matrix and the strictly lower triangular part of -*> A is not referenced. -*> Before entry with UPLO = 'L' or 'l', the leading k by k -*> lower triangular part of the array A must contain the lower -*> triangular matrix and the strictly upper triangular part of -*> A is not referenced. -*> Note that when DIAG = 'U' or 'u', the diagonal elements of -*> A are not referenced either, but are assumed to be unity. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. When SIDE = 'L' or 'l' then -*> LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' -*> then LDA must be at least max( 1, n ). -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension ( LDB, N ) -*> Before entry, the leading m by n part of the array B must -*> contain the right-hand side matrix B, and on exit is -*> overwritten by the solution matrix X. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> On entry, LDB specifies the first dimension of B as declared -*> in the calling (sub) program. LDB must be at least -*> max( 1, m ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level3 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 3 Blas routine. -*> -*> -*> -- Written on 8-February-1989. -*> Jack Dongarra, Argonne National Laboratory. -*> Iain Duff, AERE Harwell. -*> Jeremy Du Croz, Numerical Algorithms Group Ltd. -*> Sven Hammarling, Numerical Algorithms Group Ltd. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) -* -* -- Reference BLAS level3 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION ALPHA - INTEGER LDA,LDB,M,N - CHARACTER DIAG,SIDE,TRANSA,UPLO -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),B(LDB,*) -* .. -* -* ===================================================================== -* -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP - INTEGER I,INFO,J,K,NROWA - LOGICAL LSIDE,NOUNIT,UPPER -* .. -* .. Parameters .. - DOUBLE PRECISION ONE,ZERO - PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) -* .. -* -* Test the input parameters. -* - LSIDE = LSAME(SIDE,'L') - IF (LSIDE) THEN - NROWA = M - ELSE - NROWA = N - END IF - NOUNIT = LSAME(DIAG,'N') - UPPER = LSAME(UPLO,'U') -* - INFO = 0 - IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THEN - INFO = 1 - ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN - INFO = 2 - ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND. - + (.NOT.LSAME(TRANSA,'T')) .AND. - + (.NOT.LSAME(TRANSA,'C'))) THEN - INFO = 3 - ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN - INFO = 4 - ELSE IF (M.LT.0) THEN - INFO = 5 - ELSE IF (N.LT.0) THEN - INFO = 6 - ELSE IF (LDA.LT.MAX(1,NROWA)) THEN - INFO = 9 - ELSE IF (LDB.LT.MAX(1,M)) THEN - INFO = 11 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DTRSM ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF (M.EQ.0 .OR. N.EQ.0) RETURN -* -* And when alpha.eq.zero. -* - IF (ALPHA.EQ.ZERO) THEN - DO 20 J = 1,N - DO 10 I = 1,M - B(I,J) = ZERO - 10 CONTINUE - 20 CONTINUE - RETURN - END IF -* -* Start the operations. -* - IF (LSIDE) THEN - IF (LSAME(TRANSA,'N')) THEN -* -* Form B := alpha*inv( A )*B. -* - IF (UPPER) THEN - DO 60 J = 1,N - IF (ALPHA.NE.ONE) THEN - DO 30 I = 1,M - B(I,J) = ALPHA*B(I,J) - 30 CONTINUE - END IF - DO 50 K = M,1,-1 - IF (B(K,J).NE.ZERO) THEN - IF (NOUNIT) B(K,J) = B(K,J)/A(K,K) - DO 40 I = 1,K - 1 - B(I,J) = B(I,J) - B(K,J)*A(I,K) - 40 CONTINUE - END IF - 50 CONTINUE - 60 CONTINUE - ELSE - DO 100 J = 1,N - IF (ALPHA.NE.ONE) THEN - DO 70 I = 1,M - B(I,J) = ALPHA*B(I,J) - 70 CONTINUE - END IF - DO 90 K = 1,M - IF (B(K,J).NE.ZERO) THEN - IF (NOUNIT) B(K,J) = B(K,J)/A(K,K) - DO 80 I = K + 1,M - B(I,J) = B(I,J) - B(K,J)*A(I,K) - 80 CONTINUE - END IF - 90 CONTINUE - 100 CONTINUE - END IF - ELSE -* -* Form B := alpha*inv( A**T )*B. -* - IF (UPPER) THEN - DO 130 J = 1,N - DO 120 I = 1,M - TEMP = ALPHA*B(I,J) - DO 110 K = 1,I - 1 - TEMP = TEMP - A(K,I)*B(K,J) - 110 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(I,I) - B(I,J) = TEMP - 120 CONTINUE - 130 CONTINUE - ELSE - DO 160 J = 1,N - DO 150 I = M,1,-1 - TEMP = ALPHA*B(I,J) - DO 140 K = I + 1,M - TEMP = TEMP - A(K,I)*B(K,J) - 140 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(I,I) - B(I,J) = TEMP - 150 CONTINUE - 160 CONTINUE - END IF - END IF - ELSE - IF (LSAME(TRANSA,'N')) THEN -* -* Form B := alpha*B*inv( A ). -* - IF (UPPER) THEN - DO 210 J = 1,N - IF (ALPHA.NE.ONE) THEN - DO 170 I = 1,M - B(I,J) = ALPHA*B(I,J) - 170 CONTINUE - END IF - DO 190 K = 1,J - 1 - IF (A(K,J).NE.ZERO) THEN - DO 180 I = 1,M - B(I,J) = B(I,J) - A(K,J)*B(I,K) - 180 CONTINUE - END IF - 190 CONTINUE - IF (NOUNIT) THEN - TEMP = ONE/A(J,J) - DO 200 I = 1,M - B(I,J) = TEMP*B(I,J) - 200 CONTINUE - END IF - 210 CONTINUE - ELSE - DO 260 J = N,1,-1 - IF (ALPHA.NE.ONE) THEN - DO 220 I = 1,M - B(I,J) = ALPHA*B(I,J) - 220 CONTINUE - END IF - DO 240 K = J + 1,N - IF (A(K,J).NE.ZERO) THEN - DO 230 I = 1,M - B(I,J) = B(I,J) - A(K,J)*B(I,K) - 230 CONTINUE - END IF - 240 CONTINUE - IF (NOUNIT) THEN - TEMP = ONE/A(J,J) - DO 250 I = 1,M - B(I,J) = TEMP*B(I,J) - 250 CONTINUE - END IF - 260 CONTINUE - END IF - ELSE -* -* Form B := alpha*B*inv( A**T ). -* - IF (UPPER) THEN - DO 310 K = N,1,-1 - IF (NOUNIT) THEN - TEMP = ONE/A(K,K) - DO 270 I = 1,M - B(I,K) = TEMP*B(I,K) - 270 CONTINUE - END IF - DO 290 J = 1,K - 1 - IF (A(J,K).NE.ZERO) THEN - TEMP = A(J,K) - DO 280 I = 1,M - B(I,J) = B(I,J) - TEMP*B(I,K) - 280 CONTINUE - END IF - 290 CONTINUE - IF (ALPHA.NE.ONE) THEN - DO 300 I = 1,M - B(I,K) = ALPHA*B(I,K) - 300 CONTINUE - END IF - 310 CONTINUE - ELSE - DO 360 K = 1,N - IF (NOUNIT) THEN - TEMP = ONE/A(K,K) - DO 320 I = 1,M - B(I,K) = TEMP*B(I,K) - 320 CONTINUE - END IF - DO 340 J = K + 1,N - IF (A(J,K).NE.ZERO) THEN - TEMP = A(J,K) - DO 330 I = 1,M - B(I,J) = B(I,J) - TEMP*B(I,K) - 330 CONTINUE - END IF - 340 CONTINUE - IF (ALPHA.NE.ONE) THEN - DO 350 I = 1,M - B(I,K) = ALPHA*B(I,K) - 350 CONTINUE - END IF - 360 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of DTRSM -* - END diff --git a/lib/linalg/fortran/dtrsv.f b/lib/linalg/fortran/dtrsv.f deleted file mode 100644 index d8ea9fa898..0000000000 --- a/lib/linalg/fortran/dtrsv.f +++ /dev/null @@ -1,335 +0,0 @@ -*> \brief \b DTRSV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE DTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) -* -* .. Scalar Arguments .. -* INTEGER INCX,LDA,N -* CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A(LDA,*),X(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DTRSV solves one of the systems of equations -*> -*> A*x = b, or A**T*x = b, -*> -*> where b and x are n element vectors and A is an n by n unit, or -*> non-unit, upper or lower triangular matrix. -*> -*> No test for singularity or near-singularity is included in this -*> routine. Such tests must be performed before calling this routine. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the matrix is an upper or -*> lower triangular matrix as follows: -*> -*> UPLO = 'U' or 'u' A is an upper triangular matrix. -*> -*> UPLO = 'L' or 'l' A is a lower triangular matrix. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> On entry, TRANS specifies the equations to be solved as -*> follows: -*> -*> TRANS = 'N' or 'n' A*x = b. -*> -*> TRANS = 'T' or 't' A**T*x = b. -*> -*> TRANS = 'C' or 'c' A**T*x = b. -*> \endverbatim -*> -*> \param[in] DIAG -*> \verbatim -*> DIAG is CHARACTER*1 -*> On entry, DIAG specifies whether or not A is unit -*> triangular as follows: -*> -*> DIAG = 'U' or 'u' A is assumed to be unit triangular. -*> -*> DIAG = 'N' or 'n' A is not assumed to be unit -*> triangular. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension ( LDA, N ) -*> Before entry with UPLO = 'U' or 'u', the leading n by n -*> upper triangular part of the array A must contain the upper -*> triangular matrix and the strictly lower triangular part of -*> A is not referenced. -*> Before entry with UPLO = 'L' or 'l', the leading n by n -*> lower triangular part of the array A must contain the lower -*> triangular matrix and the strictly upper triangular part of -*> A is not referenced. -*> Note that when DIAG = 'U' or 'u', the diagonal elements of -*> A are not referenced either, but are assumed to be unity. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. LDA must be at least -*> max( 1, n ). -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is DOUBLE PRECISION array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCX ) ). -*> Before entry, the incremented array X must contain the n -*> element right-hand side vector b. On exit, X is overwritten -*> with the solution vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> -*> Level 2 Blas routine. -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup double_blas_level1 -* -* ===================================================================== - SUBROUTINE DTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,LDA,N - CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. - DOUBLE PRECISION A(LDA,*),X(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER (ZERO=0.0D+0) -* .. -* .. Local Scalars .. - DOUBLE PRECISION TEMP - INTEGER I,INFO,IX,J,JX,KX - LOGICAL NOUNIT -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. - + .NOT.LSAME(TRANS,'C')) THEN - INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN - INFO = 3 - ELSE IF (N.LT.0) THEN - INFO = 4 - ELSE IF (LDA.LT.MAX(1,N)) THEN - INFO = 6 - ELSE IF (INCX.EQ.0) THEN - INFO = 8 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('DTRSV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF (N.EQ.0) RETURN -* - NOUNIT = LSAME(DIAG,'N') -* -* Set up the start point in X if the increment is not unity. This -* will be ( N - 1 )*INCX too small for descending loops. -* - IF (INCX.LE.0) THEN - KX = 1 - (N-1)*INCX - ELSE IF (INCX.NE.1) THEN - KX = 1 - END IF -* -* Start the operations. In this version the elements of A are -* accessed sequentially with one pass through A. -* - IF (LSAME(TRANS,'N')) THEN -* -* Form x := inv( A )*x. -* - IF (LSAME(UPLO,'U')) THEN - IF (INCX.EQ.1) THEN - DO 20 J = N,1,-1 - IF (X(J).NE.ZERO) THEN - IF (NOUNIT) X(J) = X(J)/A(J,J) - TEMP = X(J) - DO 10 I = J - 1,1,-1 - X(I) = X(I) - TEMP*A(I,J) - 10 CONTINUE - END IF - 20 CONTINUE - ELSE - JX = KX + (N-1)*INCX - DO 40 J = N,1,-1 - IF (X(JX).NE.ZERO) THEN - IF (NOUNIT) X(JX) = X(JX)/A(J,J) - TEMP = X(JX) - IX = JX - DO 30 I = J - 1,1,-1 - IX = IX - INCX - X(IX) = X(IX) - TEMP*A(I,J) - 30 CONTINUE - END IF - JX = JX - INCX - 40 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 60 J = 1,N - IF (X(J).NE.ZERO) THEN - IF (NOUNIT) X(J) = X(J)/A(J,J) - TEMP = X(J) - DO 50 I = J + 1,N - X(I) = X(I) - TEMP*A(I,J) - 50 CONTINUE - END IF - 60 CONTINUE - ELSE - JX = KX - DO 80 J = 1,N - IF (X(JX).NE.ZERO) THEN - IF (NOUNIT) X(JX) = X(JX)/A(J,J) - TEMP = X(JX) - IX = JX - DO 70 I = J + 1,N - IX = IX + INCX - X(IX) = X(IX) - TEMP*A(I,J) - 70 CONTINUE - END IF - JX = JX + INCX - 80 CONTINUE - END IF - END IF - ELSE -* -* Form x := inv( A**T )*x. -* - IF (LSAME(UPLO,'U')) THEN - IF (INCX.EQ.1) THEN - DO 100 J = 1,N - TEMP = X(J) - DO 90 I = 1,J - 1 - TEMP = TEMP - A(I,J)*X(I) - 90 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(J,J) - X(J) = TEMP - 100 CONTINUE - ELSE - JX = KX - DO 120 J = 1,N - TEMP = X(JX) - IX = KX - DO 110 I = 1,J - 1 - TEMP = TEMP - A(I,J)*X(IX) - IX = IX + INCX - 110 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(J,J) - X(JX) = TEMP - JX = JX + INCX - 120 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 140 J = N,1,-1 - TEMP = X(J) - DO 130 I = N,J + 1,-1 - TEMP = TEMP - A(I,J)*X(I) - 130 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(J,J) - X(J) = TEMP - 140 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 160 J = N,1,-1 - TEMP = X(JX) - IX = KX - DO 150 I = N,J + 1,-1 - TEMP = TEMP - A(I,J)*X(IX) - IX = IX - INCX - 150 CONTINUE - IF (NOUNIT) TEMP = TEMP/A(J,J) - X(JX) = TEMP - JX = JX - INCX - 160 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of DTRSV -* - END diff --git a/lib/linalg/fortran/dtrti2.f b/lib/linalg/fortran/dtrti2.f deleted file mode 100644 index 0d9115554c..0000000000 --- a/lib/linalg/fortran/dtrti2.f +++ /dev/null @@ -1,209 +0,0 @@ -*> \brief \b DTRTI2 computes the inverse of a triangular matrix (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DTRTI2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DTRTI2( UPLO, DIAG, N, A, LDA, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER DIAG, UPLO -* INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DTRTI2 computes the inverse of a real upper or lower triangular -*> matrix. -*> -*> This is the Level 2 BLAS version of the algorithm. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies whether the matrix A is upper or lower triangular. -*> = 'U': Upper triangular -*> = 'L': Lower triangular -*> \endverbatim -*> -*> \param[in] DIAG -*> \verbatim -*> DIAG is CHARACTER*1 -*> Specifies whether or not the matrix A is unit triangular. -*> = 'N': Non-unit triangular -*> = 'U': Unit triangular -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the triangular matrix A. If UPLO = 'U', the -*> leading n by n upper triangular part of the array A contains -*> the upper triangular matrix, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading n by n lower triangular part of the array A contains -*> the lower triangular matrix, and the strictly upper -*> triangular part of A is not referenced. If DIAG = 'U', the -*> diagonal elements of A are also not referenced and are -*> assumed to be 1. -*> -*> On exit, the (triangular) inverse of the original matrix, in -*> the same storage format. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -k, the k-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DTRTI2( UPLO, DIAG, N, A, LDA, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER DIAG, UPLO - INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL NOUNIT, UPPER - INTEGER J - DOUBLE PRECISION AJJ -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL DSCAL, DTRMV, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - NOUNIT = LSAME( DIAG, 'N' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN - INFO = -2 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -5 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DTRTI2', -INFO ) - RETURN - END IF -* - IF( UPPER ) THEN -* -* Compute inverse of upper triangular matrix. -* - DO 10 J = 1, N - IF( NOUNIT ) THEN - A( J, J ) = ONE / A( J, J ) - AJJ = -A( J, J ) - ELSE - AJJ = -ONE - END IF -* -* Compute elements 1:j-1 of j-th column. -* - CALL DTRMV( 'Upper', 'No transpose', DIAG, J-1, A, LDA, - $ A( 1, J ), 1 ) - CALL DSCAL( J-1, AJJ, A( 1, J ), 1 ) - 10 CONTINUE - ELSE -* -* Compute inverse of lower triangular matrix. -* - DO 20 J = N, 1, -1 - IF( NOUNIT ) THEN - A( J, J ) = ONE / A( J, J ) - AJJ = -A( J, J ) - ELSE - AJJ = -ONE - END IF - IF( J.LT.N ) THEN -* -* Compute elements j+1:n of j-th column. -* - CALL DTRMV( 'Lower', 'No transpose', DIAG, N-J, - $ A( J+1, J+1 ), LDA, A( J+1, J ), 1 ) - CALL DSCAL( N-J, AJJ, A( J+1, J ), 1 ) - END IF - 20 CONTINUE - END IF -* - RETURN -* -* End of DTRTI2 -* - END diff --git a/lib/linalg/fortran/dtrtri.f b/lib/linalg/fortran/dtrtri.f deleted file mode 100644 index 1cf9a9aafb..0000000000 --- a/lib/linalg/fortran/dtrtri.f +++ /dev/null @@ -1,239 +0,0 @@ -*> \brief \b DTRTRI -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DTRTRI + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DTRTRI( UPLO, DIAG, N, A, LDA, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER DIAG, UPLO -* INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DTRTRI computes the inverse of a real upper or lower triangular -*> matrix A. -*> -*> This is the Level 3 BLAS version of the algorithm. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': A is upper triangular; -*> = 'L': A is lower triangular. -*> \endverbatim -*> -*> \param[in] DIAG -*> \verbatim -*> DIAG is CHARACTER*1 -*> = 'N': A is non-unit triangular; -*> = 'U': A is unit triangular. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the triangular matrix A. If UPLO = 'U', the -*> leading N-by-N upper triangular part of the array A contains -*> the upper triangular matrix, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading N-by-N lower triangular part of the array A contains -*> the lower triangular matrix, and the strictly upper -*> triangular part of A is not referenced. If DIAG = 'U', the -*> diagonal elements of A are also not referenced and are -*> assumed to be 1. -*> On exit, the (triangular) inverse of the original matrix, in -*> the same storage format. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, A(i,i) is exactly zero. The triangular -*> matrix is singular and its inverse can not be computed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERcomputational -* -* ===================================================================== - SUBROUTINE DTRTRI( UPLO, DIAG, N, A, LDA, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER DIAG, UPLO - INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL NOUNIT, UPPER - INTEGER J, JB, NB, NN -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL DTRMM, DTRSM, DTRTI2, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - NOUNIT = LSAME( DIAG, 'N' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN - INFO = -2 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -5 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DTRTRI', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* Check for singularity if non-unit. -* - IF( NOUNIT ) THEN - DO 10 INFO = 1, N - IF( A( INFO, INFO ).EQ.ZERO ) - $ RETURN - 10 CONTINUE - INFO = 0 - END IF -* -* Determine the block size for this environment. -* - NB = ILAENV( 1, 'DTRTRI', UPLO // DIAG, N, -1, -1, -1 ) - IF( NB.LE.1 .OR. NB.GE.N ) THEN -* -* Use unblocked code -* - CALL DTRTI2( UPLO, DIAG, N, A, LDA, INFO ) - ELSE -* -* Use blocked code -* - IF( UPPER ) THEN -* -* Compute inverse of upper triangular matrix -* - DO 20 J = 1, N, NB - JB = MIN( NB, N-J+1 ) -* -* Compute rows 1:j-1 of current block column -* - CALL DTRMM( 'Left', 'Upper', 'No transpose', DIAG, J-1, - $ JB, ONE, A, LDA, A( 1, J ), LDA ) - CALL DTRSM( 'Right', 'Upper', 'No transpose', DIAG, J-1, - $ JB, -ONE, A( J, J ), LDA, A( 1, J ), LDA ) -* -* Compute inverse of current diagonal block -* - CALL DTRTI2( 'Upper', DIAG, JB, A( J, J ), LDA, INFO ) - 20 CONTINUE - ELSE -* -* Compute inverse of lower triangular matrix -* - NN = ( ( N-1 ) / NB )*NB + 1 - DO 30 J = NN, 1, -NB - JB = MIN( NB, N-J+1 ) - IF( J+JB.LE.N ) THEN -* -* Compute rows j+jb:n of current block column -* - CALL DTRMM( 'Left', 'Lower', 'No transpose', DIAG, - $ N-J-JB+1, JB, ONE, A( J+JB, J+JB ), LDA, - $ A( J+JB, J ), LDA ) - CALL DTRSM( 'Right', 'Lower', 'No transpose', DIAG, - $ N-J-JB+1, JB, -ONE, A( J, J ), LDA, - $ A( J+JB, J ), LDA ) - END IF -* -* Compute inverse of current diagonal block -* - CALL DTRTI2( 'Lower', DIAG, JB, A( J, J ), LDA, INFO ) - 30 CONTINUE - END IF - END IF -* - RETURN -* -* End of DTRTRI -* - END diff --git a/lib/linalg/fortran/dznrm2.f b/lib/linalg/fortran/dznrm2.f deleted file mode 100644 index e5a71d98f6..0000000000 --- a/lib/linalg/fortran/dznrm2.f +++ /dev/null @@ -1,140 +0,0 @@ -*> \brief \b DZNRM2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION DZNRM2(N,X,INCX) -* -* .. Scalar Arguments .. -* INTEGER INCX,N -* .. -* .. Array Arguments .. -* COMPLEX*16 X(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DZNRM2 returns the euclidean norm of a vector via the function -*> name, so that -*> -*> DZNRM2 := sqrt( x**H*x ) -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is COMPLEX*16 array, dimension (N) -*> complex vector with N elements -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of X -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date December 2016 -* -*> \ingroup double_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> -- This version written on 25-October-1982. -*> Modified on 14-October-1993 to inline the call to ZLASSQ. -*> Sven Hammarling, Nag Ltd. -*> \endverbatim -*> -* ===================================================================== - DOUBLE PRECISION FUNCTION DZNRM2(N,X,INCX) -* -* -- Reference BLAS level1 routine (version 3.7.0) -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* December 2016 -* -* .. Scalar Arguments .. - INTEGER INCX,N -* .. -* .. Array Arguments .. - COMPLEX*16 X(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE,ZERO - PARAMETER (ONE=1.0D+0,ZERO=0.0D+0) -* .. -* .. Local Scalars .. - DOUBLE PRECISION NORM,SCALE,SSQ,TEMP - INTEGER IX -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS,DBLE,DIMAG,SQRT -* .. - IF (N.LT.1 .OR. INCX.LT.1) THEN - NORM = ZERO - ELSE - SCALE = ZERO - SSQ = ONE -* The following loop is equivalent to this call to the LAPACK -* auxiliary routine: -* CALL ZLASSQ( N, X, INCX, SCALE, SSQ ) -* - DO 10 IX = 1,1 + (N-1)*INCX,INCX - IF (DBLE(X(IX)).NE.ZERO) THEN - TEMP = ABS(DBLE(X(IX))) - IF (SCALE.LT.TEMP) THEN - SSQ = ONE + SSQ* (SCALE/TEMP)**2 - SCALE = TEMP - ELSE - SSQ = SSQ + (TEMP/SCALE)**2 - END IF - END IF - IF (DIMAG(X(IX)).NE.ZERO) THEN - TEMP = ABS(DIMAG(X(IX))) - IF (SCALE.LT.TEMP) THEN - SSQ = ONE + SSQ* (SCALE/TEMP)**2 - SCALE = TEMP - ELSE - SSQ = SSQ + (TEMP/SCALE)**2 - END IF - END IF - 10 CONTINUE - NORM = SCALE*SQRT(SSQ) - END IF -* - DZNRM2 = NORM - RETURN -* -* End of DZNRM2. -* - END diff --git a/lib/linalg/fortran/idamax.f b/lib/linalg/fortran/idamax.f deleted file mode 100644 index 1be301ea3e..0000000000 --- a/lib/linalg/fortran/idamax.f +++ /dev/null @@ -1,126 +0,0 @@ -*> \brief \b IDAMAX -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* INTEGER FUNCTION IDAMAX(N,DX,INCX) -* -* .. Scalar Arguments .. -* INTEGER INCX,N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION DX(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> IDAMAX finds the index of the first element having maximum absolute value. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] DX -*> \verbatim -*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of DX -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup aux_blas -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, linpack, 3/11/78. -*> modified 3/93 to return if incx .le. 0. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - INTEGER FUNCTION IDAMAX(N,DX,INCX) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,N -* .. -* .. Array Arguments .. - DOUBLE PRECISION DX(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - DOUBLE PRECISION DMAX - INTEGER I,IX -* .. -* .. Intrinsic Functions .. - INTRINSIC DABS -* .. - IDAMAX = 0 - IF (N.LT.1 .OR. INCX.LE.0) RETURN - IDAMAX = 1 - IF (N.EQ.1) RETURN - IF (INCX.EQ.1) THEN -* -* code for increment equal to 1 -* - DMAX = DABS(DX(1)) - DO I = 2,N - IF (DABS(DX(I)).GT.DMAX) THEN - IDAMAX = I - DMAX = DABS(DX(I)) - END IF - END DO - ELSE -* -* code for increment not equal to 1 -* - IX = 1 - DMAX = DABS(DX(1)) - IX = IX + INCX - DO I = 2,N - IF (DABS(DX(IX)).GT.DMAX) THEN - IDAMAX = I - DMAX = DABS(DX(IX)) - END IF - IX = IX + INCX - END DO - END IF - RETURN -* -* End of IDAMAX -* - END diff --git a/lib/linalg/fortran/ieeeck.f b/lib/linalg/fortran/ieeeck.f deleted file mode 100644 index f9f6332ecf..0000000000 --- a/lib/linalg/fortran/ieeeck.f +++ /dev/null @@ -1,200 +0,0 @@ -*> \brief \b IEEECK -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download IEEECK + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE ) -* -* .. Scalar Arguments .. -* INTEGER ISPEC -* REAL ONE, ZERO -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> IEEECK is called from the ILAENV to verify that Infinity and -*> possibly NaN arithmetic is safe (i.e. will not trap). -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ISPEC -*> \verbatim -*> ISPEC is INTEGER -*> Specifies whether to test just for infinity arithmetic -*> or whether to test for infinity and NaN arithmetic. -*> = 0: Verify infinity arithmetic only. -*> = 1: Verify infinity and NaN arithmetic. -*> \endverbatim -*> -*> \param[in] ZERO -*> \verbatim -*> ZERO is REAL -*> Must contain the value 0.0 -*> This is passed to prevent the compiler from optimizing -*> away this code. -*> \endverbatim -*> -*> \param[in] ONE -*> \verbatim -*> ONE is REAL -*> Must contain the value 1.0 -*> This is passed to prevent the compiler from optimizing -*> away this code. -*> -*> RETURN VALUE: INTEGER -*> = 0: Arithmetic failed to produce the correct answers -*> = 1: Arithmetic produced the correct answers -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION IEEECK( ISPEC, ZERO, ONE ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER ISPEC - REAL ONE, ZERO -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - REAL NAN1, NAN2, NAN3, NAN4, NAN5, NAN6, NEGINF, - $ NEGZRO, NEWZRO, POSINF -* .. -* .. Executable Statements .. - IEEECK = 1 -* - POSINF = ONE / ZERO - IF( POSINF.LE.ONE ) THEN - IEEECK = 0 - RETURN - END IF -* - NEGINF = -ONE / ZERO - IF( NEGINF.GE.ZERO ) THEN - IEEECK = 0 - RETURN - END IF -* - NEGZRO = ONE / ( NEGINF+ONE ) - IF( NEGZRO.NE.ZERO ) THEN - IEEECK = 0 - RETURN - END IF -* - NEGINF = ONE / NEGZRO - IF( NEGINF.GE.ZERO ) THEN - IEEECK = 0 - RETURN - END IF -* - NEWZRO = NEGZRO + ZERO - IF( NEWZRO.NE.ZERO ) THEN - IEEECK = 0 - RETURN - END IF -* - POSINF = ONE / NEWZRO - IF( POSINF.LE.ONE ) THEN - IEEECK = 0 - RETURN - END IF -* - NEGINF = NEGINF*POSINF - IF( NEGINF.GE.ZERO ) THEN - IEEECK = 0 - RETURN - END IF -* - POSINF = POSINF*POSINF - IF( POSINF.LE.ONE ) THEN - IEEECK = 0 - RETURN - END IF -* -* -* -* -* Return if we were only asked to check infinity arithmetic -* - IF( ISPEC.EQ.0 ) - $ RETURN -* - NAN1 = POSINF + NEGINF -* - NAN2 = POSINF / NEGINF -* - NAN3 = POSINF / POSINF -* - NAN4 = POSINF*ZERO -* - NAN5 = NEGINF*NEGZRO -* - NAN6 = NAN5*ZERO -* - IF( NAN1.EQ.NAN1 ) THEN - IEEECK = 0 - RETURN - END IF -* - IF( NAN2.EQ.NAN2 ) THEN - IEEECK = 0 - RETURN - END IF -* - IF( NAN3.EQ.NAN3 ) THEN - IEEECK = 0 - RETURN - END IF -* - IF( NAN4.EQ.NAN4 ) THEN - IEEECK = 0 - RETURN - END IF -* - IF( NAN5.EQ.NAN5 ) THEN - IEEECK = 0 - RETURN - END IF -* - IF( NAN6.EQ.NAN6 ) THEN - IEEECK = 0 - RETURN - END IF -* - RETURN - END diff --git a/lib/linalg/fortran/iladlc.f b/lib/linalg/fortran/iladlc.f deleted file mode 100644 index a98e7218bf..0000000000 --- a/lib/linalg/fortran/iladlc.f +++ /dev/null @@ -1,115 +0,0 @@ -*> \brief \b ILADLC scans a matrix for its last non-zero column. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILADLC + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILADLC( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILADLC scans A for its last non-zero column. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILADLC( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( N.EQ.0 ) THEN - ILADLC = N - ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILADLC = N - ELSE -* Now scan each column from the end, returning with the first non-zero. - DO ILADLC = N, 1, -1 - DO I = 1, M - IF( A(I, ILADLC).NE.ZERO ) RETURN - END DO - END DO - END IF - RETURN - END diff --git a/lib/linalg/fortran/iladlr.f b/lib/linalg/fortran/iladlr.f deleted file mode 100644 index b1abded84b..0000000000 --- a/lib/linalg/fortran/iladlr.f +++ /dev/null @@ -1,118 +0,0 @@ -*> \brief \b ILADLR scans a matrix for its last non-zero row. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILADLR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILADLR( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILADLR scans A for its last non-zero row. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILADLR( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( M.EQ.0 ) THEN - ILADLR = M - ELSE IF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILADLR = M - ELSE -* Scan up each column tracking the last zero row seen. - ILADLR = 0 - DO J = 1, N - I=M - DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1)) - I=I-1 - ENDDO - ILADLR = MAX( ILADLR, I ) - END DO - END IF - RETURN - END diff --git a/lib/linalg/fortran/ilaenv.f b/lib/linalg/fortran/ilaenv.f deleted file mode 100644 index 3f0800b95e..0000000000 --- a/lib/linalg/fortran/ilaenv.f +++ /dev/null @@ -1,730 +0,0 @@ -*> \brief \b ILAENV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILAENV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 ) -* -* .. Scalar Arguments .. -* CHARACTER*( * ) NAME, OPTS -* INTEGER ISPEC, N1, N2, N3, N4 -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILAENV is called from the LAPACK routines to choose problem-dependent -*> parameters for the local environment. See ISPEC for a description of -*> the parameters. -*> -*> ILAENV returns an INTEGER -*> if ILAENV >= 0: ILAENV returns the value of the parameter specified by ISPEC -*> if ILAENV < 0: if ILAENV = -k, the k-th argument had an illegal value. -*> -*> This version provides a set of parameters which should give good, -*> but not optimal, performance on many of the currently available -*> computers. Users are encouraged to modify this subroutine to set -*> the tuning parameters for their particular machine using the option -*> and problem size information in the arguments. -*> -*> This routine will not function correctly if it is converted to all -*> lower case. Converting it to all upper case is allowed. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ISPEC -*> \verbatim -*> ISPEC is INTEGER -*> Specifies the parameter to be returned as the value of -*> ILAENV. -*> = 1: the optimal blocksize; if this value is 1, an unblocked -*> algorithm will give the best performance. -*> = 2: the minimum block size for which the block routine -*> should be used; if the usable block size is less than -*> this value, an unblocked routine should be used. -*> = 3: the crossover point (in a block routine, for N less -*> than this value, an unblocked routine should be used) -*> = 4: the number of shifts, used in the nonsymmetric -*> eigenvalue routines (DEPRECATED) -*> = 5: the minimum column dimension for blocking to be used; -*> rectangular blocks must have dimension at least k by m, -*> where k is given by ILAENV(2,...) and m by ILAENV(5,...) -*> = 6: the crossover point for the SVD (when reducing an m by n -*> matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds -*> this value, a QR factorization is used first to reduce -*> the matrix to a triangular form.) -*> = 7: the number of processors -*> = 8: the crossover point for the multishift QR method -*> for nonsymmetric eigenvalue problems (DEPRECATED) -*> = 9: maximum size of the subproblems at the bottom of the -*> computation tree in the divide-and-conquer algorithm -*> (used by xGELSD and xGESDD) -*> =10: ieee infinity and NaN arithmetic can be trusted not to trap -*> =11: infinity arithmetic can be trusted not to trap -*> 12 <= ISPEC <= 17: -*> xHSEQR or related subroutines, -*> see IPARMQ for detailed explanation -*> \endverbatim -*> -*> \param[in] NAME -*> \verbatim -*> NAME is CHARACTER*(*) -*> The name of the calling subroutine, in either upper case or -*> lower case. -*> \endverbatim -*> -*> \param[in] OPTS -*> \verbatim -*> OPTS is CHARACTER*(*) -*> The character options to the subroutine NAME, concatenated -*> into a single character string. For example, UPLO = 'U', -*> TRANS = 'T', and DIAG = 'N' for a triangular routine would -*> be specified as OPTS = 'UTN'. -*> \endverbatim -*> -*> \param[in] N1 -*> \verbatim -*> N1 is INTEGER -*> \endverbatim -*> -*> \param[in] N2 -*> \verbatim -*> N2 is INTEGER -*> \endverbatim -*> -*> \param[in] N3 -*> \verbatim -*> N3 is INTEGER -*> \endverbatim -*> -*> \param[in] N4 -*> \verbatim -*> N4 is INTEGER -*> Problem dimensions for the subroutine NAME; these may not all -*> be required. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The following conventions have been used when calling ILAENV from the -*> LAPACK routines: -*> 1) OPTS is a concatenation of all of the character options to -*> subroutine NAME, in the same order that they appear in the -*> argument list for NAME, even if they are not used in determining -*> the value of the parameter specified by ISPEC. -*> 2) The problem dimensions N1, N2, N3, N4 are specified in the order -*> that they appear in the argument list for NAME. N1 is used -*> first, N2 second, and so on, and unused problem dimensions are -*> passed a value of -1. -*> 3) The parameter value returned by ILAENV is checked for validity in -*> the calling subroutine. For example, ILAENV is used to retrieve -*> the optimal blocksize for STRTRI as follows: -*> -*> NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 ) -*> IF( NB.LE.1 ) NB = MAX( 1, N ) -*> \endverbatim -*> -* ===================================================================== - INTEGER FUNCTION ILAENV( ISPEC, NAME, OPTS, N1, N2, N3, N4 ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER*( * ) NAME, OPTS - INTEGER ISPEC, N1, N2, N3, N4 -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, IC, IZ, NB, NBMIN, NX - LOGICAL CNAME, SNAME, TWOSTAGE - CHARACTER C1*1, C2*2, C4*2, C3*3, SUBNAM*16 -* .. -* .. Intrinsic Functions .. - INTRINSIC CHAR, ICHAR, INT, MIN, REAL -* .. -* .. External Functions .. - INTEGER IEEECK, IPARMQ - EXTERNAL IEEECK, IPARMQ -* .. -* .. Executable Statements .. -* - GO TO ( 10, 10, 10, 80, 90, 100, 110, 120, - $ 130, 140, 150, 160, 160, 160, 160, 160, 160)ISPEC -* -* Invalid value for ISPEC -* - ILAENV = -1 - RETURN -* - 10 CONTINUE -* -* Convert NAME to upper case if the first character is lower case. -* - ILAENV = 1 - SUBNAM = NAME - IC = ICHAR( SUBNAM( 1: 1 ) ) - IZ = ICHAR( 'Z' ) - IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN -* -* ASCII character set -* - IF( IC.GE.97 .AND. IC.LE.122 ) THEN - SUBNAM( 1: 1 ) = CHAR( IC-32 ) - DO 20 I = 2, 6 - IC = ICHAR( SUBNAM( I: I ) ) - IF( IC.GE.97 .AND. IC.LE.122 ) - $ SUBNAM( I: I ) = CHAR( IC-32 ) - 20 CONTINUE - END IF -* - ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN -* -* EBCDIC character set -* - IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR. - $ ( IC.GE.145 .AND. IC.LE.153 ) .OR. - $ ( IC.GE.162 .AND. IC.LE.169 ) ) THEN - SUBNAM( 1: 1 ) = CHAR( IC+64 ) - DO 30 I = 2, 6 - IC = ICHAR( SUBNAM( I: I ) ) - IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR. - $ ( IC.GE.145 .AND. IC.LE.153 ) .OR. - $ ( IC.GE.162 .AND. IC.LE.169 ) )SUBNAM( I: - $ I ) = CHAR( IC+64 ) - 30 CONTINUE - END IF -* - ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN -* -* Prime machines: ASCII+128 -* - IF( IC.GE.225 .AND. IC.LE.250 ) THEN - SUBNAM( 1: 1 ) = CHAR( IC-32 ) - DO 40 I = 2, 6 - IC = ICHAR( SUBNAM( I: I ) ) - IF( IC.GE.225 .AND. IC.LE.250 ) - $ SUBNAM( I: I ) = CHAR( IC-32 ) - 40 CONTINUE - END IF - END IF -* - C1 = SUBNAM( 1: 1 ) - SNAME = C1.EQ.'S' .OR. C1.EQ.'D' - CNAME = C1.EQ.'C' .OR. C1.EQ.'Z' - IF( .NOT.( CNAME .OR. SNAME ) ) - $ RETURN - C2 = SUBNAM( 2: 3 ) - C3 = SUBNAM( 4: 6 ) - C4 = C3( 2: 3 ) - TWOSTAGE = LEN( SUBNAM ).GE.11 - $ .AND. SUBNAM( 11: 11 ).EQ.'2' -* - GO TO ( 50, 60, 70 )ISPEC -* - 50 CONTINUE -* -* ISPEC = 1: block size -* -* In these examples, separate code is provided for setting NB for -* real and complex. We assume that NB will take the same value in -* single or double precision. -* - NB = 1 -* - IF( SUBNAM(2:6).EQ.'LAORH' ) THEN -* -* This is for *LAORHR_GETRFNP routine -* - IF( SNAME ) THEN - NB = 32 - ELSE - NB = 32 - END IF - ELSE IF( C2.EQ.'GE' ) THEN - IF( C3.EQ.'TRF' ) THEN - IF( SNAME ) THEN - NB = 64 - ELSE - NB = 64 - END IF - ELSE IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. - $ C3.EQ.'QLF' ) THEN - IF( SNAME ) THEN - NB = 32 - ELSE - NB = 32 - END IF - ELSE IF( C3.EQ.'QR ') THEN - IF( N3 .EQ. 1) THEN - IF( SNAME ) THEN -* M*N - IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN - NB = N1 - ELSE - NB = 32768/N2 - END IF - ELSE - IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN - NB = N1 - ELSE - NB = 32768/N2 - END IF - END IF - ELSE - IF( SNAME ) THEN - NB = 1 - ELSE - NB = 1 - END IF - END IF - ELSE IF( C3.EQ.'LQ ') THEN - IF( N3 .EQ. 2) THEN - IF( SNAME ) THEN -* M*N - IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN - NB = N1 - ELSE - NB = 32768/N2 - END IF - ELSE - IF ((N1*N2.LE.131072).OR.(N1.LE.8192)) THEN - NB = N1 - ELSE - NB = 32768/N2 - END IF - END IF - ELSE - IF( SNAME ) THEN - NB = 1 - ELSE - NB = 1 - END IF - END IF - ELSE IF( C3.EQ.'HRD' ) THEN - IF( SNAME ) THEN - NB = 32 - ELSE - NB = 32 - END IF - ELSE IF( C3.EQ.'BRD' ) THEN - IF( SNAME ) THEN - NB = 32 - ELSE - NB = 32 - END IF - ELSE IF( C3.EQ.'TRI' ) THEN - IF( SNAME ) THEN - NB = 64 - ELSE - NB = 64 - END IF - END IF - ELSE IF( C2.EQ.'PO' ) THEN - IF( C3.EQ.'TRF' ) THEN - IF( SNAME ) THEN - NB = 64 - ELSE - NB = 64 - END IF - END IF - ELSE IF( C2.EQ.'SY' ) THEN - IF( C3.EQ.'TRF' ) THEN - IF( SNAME ) THEN - IF( TWOSTAGE ) THEN - NB = 192 - ELSE - NB = 64 - END IF - ELSE - IF( TWOSTAGE ) THEN - NB = 192 - ELSE - NB = 64 - END IF - END IF - ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN - NB = 32 - ELSE IF( SNAME .AND. C3.EQ.'GST' ) THEN - NB = 64 - END IF - ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN - IF( C3.EQ.'TRF' ) THEN - IF( TWOSTAGE ) THEN - NB = 192 - ELSE - NB = 64 - END IF - ELSE IF( C3.EQ.'TRD' ) THEN - NB = 32 - ELSE IF( C3.EQ.'GST' ) THEN - NB = 64 - END IF - ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN - IF( C3( 1: 1 ).EQ.'G' ) THEN - IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ. - $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' ) - $ THEN - NB = 32 - END IF - ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN - IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ. - $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' ) - $ THEN - NB = 32 - END IF - END IF - ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN - IF( C3( 1: 1 ).EQ.'G' ) THEN - IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ. - $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' ) - $ THEN - NB = 32 - END IF - ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN - IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ. - $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' ) - $ THEN - NB = 32 - END IF - END IF - ELSE IF( C2.EQ.'GB' ) THEN - IF( C3.EQ.'TRF' ) THEN - IF( SNAME ) THEN - IF( N4.LE.64 ) THEN - NB = 1 - ELSE - NB = 32 - END IF - ELSE - IF( N4.LE.64 ) THEN - NB = 1 - ELSE - NB = 32 - END IF - END IF - END IF - ELSE IF( C2.EQ.'PB' ) THEN - IF( C3.EQ.'TRF' ) THEN - IF( SNAME ) THEN - IF( N2.LE.64 ) THEN - NB = 1 - ELSE - NB = 32 - END IF - ELSE - IF( N2.LE.64 ) THEN - NB = 1 - ELSE - NB = 32 - END IF - END IF - END IF - ELSE IF( C2.EQ.'TR' ) THEN - IF( C3.EQ.'TRI' ) THEN - IF( SNAME ) THEN - NB = 64 - ELSE - NB = 64 - END IF - ELSE IF ( C3.EQ.'EVC' ) THEN - IF( SNAME ) THEN - NB = 64 - ELSE - NB = 64 - END IF - ELSE IF( C3.EQ.'SYL' ) THEN -* The upper bound is to prevent overly aggressive scaling. - IF( SNAME ) THEN - NB = MIN( MAX( 48, INT( ( MIN( N1, N2 ) * 16 ) / 100) ), - $ 240 ) - ELSE - NB = MIN( MAX( 24, INT( ( MIN( N1, N2 ) * 8 ) / 100) ), - $ 80 ) - END IF - END IF - ELSE IF( C2.EQ.'LA' ) THEN - IF( C3.EQ.'UUM' ) THEN - IF( SNAME ) THEN - NB = 64 - ELSE - NB = 64 - END IF - ELSE IF( C3.EQ.'TRS' ) THEN - IF( SNAME ) THEN - NB = 32 - ELSE - NB = 32 - END IF - END IF - ELSE IF( SNAME .AND. C2.EQ.'ST' ) THEN - IF( C3.EQ.'EBZ' ) THEN - NB = 1 - END IF - ELSE IF( C2.EQ.'GG' ) THEN - NB = 32 - IF( C3.EQ.'HD3' ) THEN - IF( SNAME ) THEN - NB = 32 - ELSE - NB = 32 - END IF - END IF - END IF - ILAENV = NB - RETURN -* - 60 CONTINUE -* -* ISPEC = 2: minimum block size -* - NBMIN = 2 - IF( C2.EQ.'GE' ) THEN - IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ. - $ 'QLF' ) THEN - IF( SNAME ) THEN - NBMIN = 2 - ELSE - NBMIN = 2 - END IF - ELSE IF( C3.EQ.'HRD' ) THEN - IF( SNAME ) THEN - NBMIN = 2 - ELSE - NBMIN = 2 - END IF - ELSE IF( C3.EQ.'BRD' ) THEN - IF( SNAME ) THEN - NBMIN = 2 - ELSE - NBMIN = 2 - END IF - ELSE IF( C3.EQ.'TRI' ) THEN - IF( SNAME ) THEN - NBMIN = 2 - ELSE - NBMIN = 2 - END IF - END IF - ELSE IF( C2.EQ.'SY' ) THEN - IF( C3.EQ.'TRF' ) THEN - IF( SNAME ) THEN - NBMIN = 8 - ELSE - NBMIN = 8 - END IF - ELSE IF( SNAME .AND. C3.EQ.'TRD' ) THEN - NBMIN = 2 - END IF - ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN - IF( C3.EQ.'TRD' ) THEN - NBMIN = 2 - END IF - ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN - IF( C3( 1: 1 ).EQ.'G' ) THEN - IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ. - $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' ) - $ THEN - NBMIN = 2 - END IF - ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN - IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ. - $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' ) - $ THEN - NBMIN = 2 - END IF - END IF - ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN - IF( C3( 1: 1 ).EQ.'G' ) THEN - IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ. - $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' ) - $ THEN - NBMIN = 2 - END IF - ELSE IF( C3( 1: 1 ).EQ.'M' ) THEN - IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ. - $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' ) - $ THEN - NBMIN = 2 - END IF - END IF - ELSE IF( C2.EQ.'GG' ) THEN - NBMIN = 2 - IF( C3.EQ.'HD3' ) THEN - NBMIN = 2 - END IF - END IF - ILAENV = NBMIN - RETURN -* - 70 CONTINUE -* -* ISPEC = 3: crossover point -* - NX = 0 - IF( C2.EQ.'GE' ) THEN - IF( C3.EQ.'QRF' .OR. C3.EQ.'RQF' .OR. C3.EQ.'LQF' .OR. C3.EQ. - $ 'QLF' ) THEN - IF( SNAME ) THEN - NX = 128 - ELSE - NX = 128 - END IF - ELSE IF( C3.EQ.'HRD' ) THEN - IF( SNAME ) THEN - NX = 128 - ELSE - NX = 128 - END IF - ELSE IF( C3.EQ.'BRD' ) THEN - IF( SNAME ) THEN - NX = 128 - ELSE - NX = 128 - END IF - END IF - ELSE IF( C2.EQ.'SY' ) THEN - IF( SNAME .AND. C3.EQ.'TRD' ) THEN - NX = 32 - END IF - ELSE IF( CNAME .AND. C2.EQ.'HE' ) THEN - IF( C3.EQ.'TRD' ) THEN - NX = 32 - END IF - ELSE IF( SNAME .AND. C2.EQ.'OR' ) THEN - IF( C3( 1: 1 ).EQ.'G' ) THEN - IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ. - $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' ) - $ THEN - NX = 128 - END IF - END IF - ELSE IF( CNAME .AND. C2.EQ.'UN' ) THEN - IF( C3( 1: 1 ).EQ.'G' ) THEN - IF( C4.EQ.'QR' .OR. C4.EQ.'RQ' .OR. C4.EQ.'LQ' .OR. C4.EQ. - $ 'QL' .OR. C4.EQ.'HR' .OR. C4.EQ.'TR' .OR. C4.EQ.'BR' ) - $ THEN - NX = 128 - END IF - END IF - ELSE IF( C2.EQ.'GG' ) THEN - NX = 128 - IF( C3.EQ.'HD3' ) THEN - NX = 128 - END IF - END IF - ILAENV = NX - RETURN -* - 80 CONTINUE -* -* ISPEC = 4: number of shifts (used by xHSEQR) -* - ILAENV = 6 - RETURN -* - 90 CONTINUE -* -* ISPEC = 5: minimum column dimension (not used) -* - ILAENV = 2 - RETURN -* - 100 CONTINUE -* -* ISPEC = 6: crossover point for SVD (used by xGELSS and xGESVD) -* - ILAENV = INT( REAL( MIN( N1, N2 ) )*1.6E0 ) - RETURN -* - 110 CONTINUE -* -* ISPEC = 7: number of processors (not used) -* - ILAENV = 1 - RETURN -* - 120 CONTINUE -* -* ISPEC = 8: crossover point for multishift (used by xHSEQR) -* - ILAENV = 50 - RETURN -* - 130 CONTINUE -* -* ISPEC = 9: maximum size of the subproblems at the bottom of the -* computation tree in the divide-and-conquer algorithm -* (used by xGELSD and xGESDD) -* - ILAENV = 25 - RETURN -* - 140 CONTINUE -* -* ISPEC = 10: ieee and infinity NaN arithmetic can be trusted not to trap -* -* ILAENV = 0 - ILAENV = 1 - IF( ILAENV.EQ.1 ) THEN - ILAENV = IEEECK( 1, 0.0, 1.0 ) - END IF - RETURN -* - 150 CONTINUE -* -* ISPEC = 11: ieee infinity arithmetic can be trusted not to trap -* -* ILAENV = 0 - ILAENV = 1 - IF( ILAENV.EQ.1 ) THEN - ILAENV = IEEECK( 0, 0.0, 1.0 ) - END IF - RETURN -* - 160 CONTINUE -* -* 12 <= ISPEC <= 17: xHSEQR or related subroutines. -* - ILAENV = IPARMQ( ISPEC, NAME, OPTS, N1, N2, N3, N4 ) - RETURN -* -* End of ILAENV -* - END diff --git a/lib/linalg/fortran/ilazlc.f b/lib/linalg/fortran/ilazlc.f deleted file mode 100644 index 8af3430e61..0000000000 --- a/lib/linalg/fortran/ilazlc.f +++ /dev/null @@ -1,115 +0,0 @@ -*> \brief \b ILAZLC scans a matrix for its last non-zero column. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILAZLC + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILAZLC( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILAZLC scans A for its last non-zero column. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILAZLC( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER ( ZERO = (0.0D+0, 0.0D+0) ) -* .. -* .. Local Scalars .. - INTEGER I -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( N.EQ.0 ) THEN - ILAZLC = N - ELSE IF( A(1, N).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILAZLC = N - ELSE -* Now scan each column from the end, returning with the first non-zero. - DO ILAZLC = N, 1, -1 - DO I = 1, M - IF( A(I, ILAZLC).NE.ZERO ) RETURN - END DO - END DO - END IF - RETURN - END diff --git a/lib/linalg/fortran/ilazlr.f b/lib/linalg/fortran/ilazlr.f deleted file mode 100644 index e0134a6a35..0000000000 --- a/lib/linalg/fortran/ilazlr.f +++ /dev/null @@ -1,118 +0,0 @@ -*> \brief \b ILAZLR scans a matrix for its last non-zero row. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ILAZLR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION ILAZLR( M, N, A, LDA ) -* -* .. Scalar Arguments .. -* INTEGER M, N, LDA -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ILAZLR scans A for its last non-zero row. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> The m by n matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - INTEGER FUNCTION ILAZLR( M, N, A, LDA ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER M, N, LDA -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER ( ZERO = (0.0D+0, 0.0D+0) ) -* .. -* .. Local Scalars .. - INTEGER I, J -* .. -* .. Executable Statements .. -* -* Quick test for the common case where one corner is non-zero. - IF( M.EQ.0 ) THEN - ILAZLR = M - ELSE IF( A(M, 1).NE.ZERO .OR. A(M, N).NE.ZERO ) THEN - ILAZLR = M - ELSE -* Scan up each column tracking the last zero row seen. - ILAZLR = 0 - DO J = 1, N - I=M - DO WHILE((A(MAX(I,1),J).EQ.ZERO).AND.(I.GE.1)) - I=I-1 - ENDDO - ILAZLR = MAX( ILAZLR, I ) - END DO - END IF - RETURN - END diff --git a/lib/linalg/fortran/iparmq.f b/lib/linalg/fortran/iparmq.f deleted file mode 100644 index 54c05471ca..0000000000 --- a/lib/linalg/fortran/iparmq.f +++ /dev/null @@ -1,406 +0,0 @@ -*> \brief \b IPARMQ -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download IPARMQ + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK ) -* -* .. Scalar Arguments .. -* INTEGER IHI, ILO, ISPEC, LWORK, N -* CHARACTER NAME*( * ), OPTS*( * ) -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> This program sets problem and machine dependent parameters -*> useful for xHSEQR and related subroutines for eigenvalue -*> problems. It is called whenever -*> IPARMQ is called with 12 <= ISPEC <= 16 -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] ISPEC -*> \verbatim -*> ISPEC is INTEGER -*> ISPEC specifies which tunable parameter IPARMQ should -*> return. -*> -*> ISPEC=12: (INMIN) Matrices of order nmin or less -*> are sent directly to xLAHQR, the implicit -*> double shift QR algorithm. NMIN must be -*> at least 11. -*> -*> ISPEC=13: (INWIN) Size of the deflation window. -*> This is best set greater than or equal to -*> the number of simultaneous shifts NS. -*> Larger matrices benefit from larger deflation -*> windows. -*> -*> ISPEC=14: (INIBL) Determines when to stop nibbling and -*> invest in an (expensive) multi-shift QR sweep. -*> If the aggressive early deflation subroutine -*> finds LD converged eigenvalues from an order -*> NW deflation window and LD > (NW*NIBBLE)/100, -*> then the next QR sweep is skipped and early -*> deflation is applied immediately to the -*> remaining active diagonal block. Setting -*> IPARMQ(ISPEC=14) = 0 causes TTQRE to skip a -*> multi-shift QR sweep whenever early deflation -*> finds a converged eigenvalue. Setting -*> IPARMQ(ISPEC=14) greater than or equal to 100 -*> prevents TTQRE from skipping a multi-shift -*> QR sweep. -*> -*> ISPEC=15: (NSHFTS) The number of simultaneous shifts in -*> a multi-shift QR iteration. -*> -*> ISPEC=16: (IACC22) IPARMQ is set to 0, 1 or 2 with the -*> following meanings. -*> 0: During the multi-shift QR/QZ sweep, -*> blocked eigenvalue reordering, blocked -*> Hessenberg-triangular reduction, -*> reflections and/or rotations are not -*> accumulated when updating the -*> far-from-diagonal matrix entries. -*> 1: During the multi-shift QR/QZ sweep, -*> blocked eigenvalue reordering, blocked -*> Hessenberg-triangular reduction, -*> reflections and/or rotations are -*> accumulated, and matrix-matrix -*> multiplication is used to update the -*> far-from-diagonal matrix entries. -*> 2: During the multi-shift QR/QZ sweep, -*> blocked eigenvalue reordering, blocked -*> Hessenberg-triangular reduction, -*> reflections and/or rotations are -*> accumulated, and 2-by-2 block structure -*> is exploited during matrix-matrix -*> multiplies. -*> (If xTRMM is slower than xGEMM, then -*> IPARMQ(ISPEC=16)=1 may be more efficient than -*> IPARMQ(ISPEC=16)=2 despite the greater level of -*> arithmetic work implied by the latter choice.) -*> -*> ISPEC=17: (ICOST) An estimate of the relative cost of flops -*> within the near-the-diagonal shift chase compared -*> to flops within the BLAS calls of a QZ sweep. -*> \endverbatim -*> -*> \param[in] NAME -*> \verbatim -*> NAME is CHARACTER string -*> Name of the calling subroutine -*> \endverbatim -*> -*> \param[in] OPTS -*> \verbatim -*> OPTS is CHARACTER string -*> This is a concatenation of the string arguments to -*> TTQRE. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> N is the order of the Hessenberg matrix H. -*> \endverbatim -*> -*> \param[in] ILO -*> \verbatim -*> ILO is INTEGER -*> \endverbatim -*> -*> \param[in] IHI -*> \verbatim -*> IHI is INTEGER -*> It is assumed that H is already upper triangular -*> in rows and columns 1:ILO-1 and IHI+1:N. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The amount of workspace available. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Little is known about how best to choose these parameters. -*> It is possible to use different values of the parameters -*> for each of CHSEQR, DHSEQR, SHSEQR and ZHSEQR. -*> -*> It is probably best to choose different parameters for -*> different matrices and different parameters at different -*> times during the iteration, but this has not been -*> implemented --- yet. -*> -*> -*> The best choices of most of the parameters depend -*> in an ill-understood way on the relative execution -*> rate of xLAQR3 and xLAQR5 and on the nature of each -*> particular eigenvalue problem. Experiment may be the -*> only practical way to determine which choices are most -*> effective. -*> -*> Following is a list of default values supplied by IPARMQ. -*> These defaults may be adjusted in order to attain better -*> performance in any particular computational environment. -*> -*> IPARMQ(ISPEC=12) The xLAHQR vs xLAQR0 crossover point. -*> Default: 75. (Must be at least 11.) -*> -*> IPARMQ(ISPEC=13) Recommended deflation window size. -*> This depends on ILO, IHI and NS, the -*> number of simultaneous shifts returned -*> by IPARMQ(ISPEC=15). The default for -*> (IHI-ILO+1) <= 500 is NS. The default -*> for (IHI-ILO+1) > 500 is 3*NS/2. -*> -*> IPARMQ(ISPEC=14) Nibble crossover point. Default: 14. -*> -*> IPARMQ(ISPEC=15) Number of simultaneous shifts, NS. -*> a multi-shift QR iteration. -*> -*> If IHI-ILO+1 is ... -*> -*> greater than ...but less ... the -*> or equal to ... than default is -*> -*> 0 30 NS = 2+ -*> 30 60 NS = 4+ -*> 60 150 NS = 10 -*> 150 590 NS = ** -*> 590 3000 NS = 64 -*> 3000 6000 NS = 128 -*> 6000 infinity NS = 256 -*> -*> (+) By default matrices of this order are -*> passed to the implicit double shift routine -*> xLAHQR. See IPARMQ(ISPEC=12) above. These -*> values of NS are used only in case of a rare -*> xLAHQR failure. -*> -*> (**) The asterisks (**) indicate an ad-hoc -*> function increasing from 10 to 64. -*> -*> IPARMQ(ISPEC=16) Select structured matrix multiply. -*> (See ISPEC=16 above for details.) -*> Default: 3. -*> -*> IPARMQ(ISPEC=17) Relative cost heuristic for blocksize selection. -*> Expressed as a percentage. -*> Default: 10. -*> \endverbatim -*> -* ===================================================================== - INTEGER FUNCTION IPARMQ( ISPEC, NAME, OPTS, N, ILO, IHI, LWORK ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER IHI, ILO, ISPEC, LWORK, N - CHARACTER NAME*( * ), OPTS*( * ) -* -* ================================================================ -* .. Parameters .. - INTEGER INMIN, INWIN, INIBL, ISHFTS, IACC22, ICOST - PARAMETER ( INMIN = 12, INWIN = 13, INIBL = 14, - $ ISHFTS = 15, IACC22 = 16, ICOST = 17 ) - INTEGER NMIN, K22MIN, KACMIN, NIBBLE, KNWSWP, RCOST - PARAMETER ( NMIN = 75, K22MIN = 14, KACMIN = 14, - $ NIBBLE = 14, KNWSWP = 500, RCOST = 10 ) - REAL TWO - PARAMETER ( TWO = 2.0 ) -* .. -* .. Local Scalars .. - INTEGER NH, NS - INTEGER I, IC, IZ - CHARACTER SUBNAM*6 -* .. -* .. Intrinsic Functions .. - INTRINSIC LOG, MAX, MOD, NINT, REAL -* .. -* .. Executable Statements .. - IF( ( ISPEC.EQ.ISHFTS ) .OR. ( ISPEC.EQ.INWIN ) .OR. - $ ( ISPEC.EQ.IACC22 ) ) THEN -* -* ==== Set the number simultaneous shifts ==== -* - NH = IHI - ILO + 1 - NS = 2 - IF( NH.GE.30 ) - $ NS = 4 - IF( NH.GE.60 ) - $ NS = 10 - IF( NH.GE.150 ) - $ NS = MAX( 10, NH / NINT( LOG( REAL( NH ) ) / LOG( TWO ) ) ) - IF( NH.GE.590 ) - $ NS = 64 - IF( NH.GE.3000 ) - $ NS = 128 - IF( NH.GE.6000 ) - $ NS = 256 - NS = MAX( 2, NS-MOD( NS, 2 ) ) - END IF -* - IF( ISPEC.EQ.INMIN ) THEN -* -* -* ===== Matrices of order smaller than NMIN get sent -* . to xLAHQR, the classic double shift algorithm. -* . This must be at least 11. ==== -* - IPARMQ = NMIN -* - ELSE IF( ISPEC.EQ.INIBL ) THEN -* -* ==== INIBL: skip a multi-shift qr iteration and -* . whenever aggressive early deflation finds -* . at least (NIBBLE*(window size)/100) deflations. ==== -* - IPARMQ = NIBBLE -* - ELSE IF( ISPEC.EQ.ISHFTS ) THEN -* -* ==== NSHFTS: The number of simultaneous shifts ===== -* - IPARMQ = NS -* - ELSE IF( ISPEC.EQ.INWIN ) THEN -* -* ==== NW: deflation window size. ==== -* - IF( NH.LE.KNWSWP ) THEN - IPARMQ = NS - ELSE - IPARMQ = 3*NS / 2 - END IF -* - ELSE IF( ISPEC.EQ.IACC22 ) THEN -* -* ==== IACC22: Whether to accumulate reflections -* . before updating the far-from-diagonal elements -* . and whether to use 2-by-2 block structure while -* . doing it. A small amount of work could be saved -* . by making this choice dependent also upon the -* . NH=IHI-ILO+1. -* -* -* Convert NAME to upper case if the first character is lower case. -* - IPARMQ = 0 - SUBNAM = NAME - IC = ICHAR( SUBNAM( 1: 1 ) ) - IZ = ICHAR( 'Z' ) - IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN -* -* ASCII character set -* - IF( IC.GE.97 .AND. IC.LE.122 ) THEN - SUBNAM( 1: 1 ) = CHAR( IC-32 ) - DO I = 2, 6 - IC = ICHAR( SUBNAM( I: I ) ) - IF( IC.GE.97 .AND. IC.LE.122 ) - $ SUBNAM( I: I ) = CHAR( IC-32 ) - END DO - END IF -* - ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN -* -* EBCDIC character set -* - IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR. - $ ( IC.GE.145 .AND. IC.LE.153 ) .OR. - $ ( IC.GE.162 .AND. IC.LE.169 ) ) THEN - SUBNAM( 1: 1 ) = CHAR( IC+64 ) - DO I = 2, 6 - IC = ICHAR( SUBNAM( I: I ) ) - IF( ( IC.GE.129 .AND. IC.LE.137 ) .OR. - $ ( IC.GE.145 .AND. IC.LE.153 ) .OR. - $ ( IC.GE.162 .AND. IC.LE.169 ) )SUBNAM( I: - $ I ) = CHAR( IC+64 ) - END DO - END IF -* - ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN -* -* Prime machines: ASCII+128 -* - IF( IC.GE.225 .AND. IC.LE.250 ) THEN - SUBNAM( 1: 1 ) = CHAR( IC-32 ) - DO I = 2, 6 - IC = ICHAR( SUBNAM( I: I ) ) - IF( IC.GE.225 .AND. IC.LE.250 ) - $ SUBNAM( I: I ) = CHAR( IC-32 ) - END DO - END IF - END IF -* - IF( SUBNAM( 2:6 ).EQ.'GGHRD' .OR. - $ SUBNAM( 2:6 ).EQ.'GGHD3' ) THEN - IPARMQ = 1 - IF( NH.GE.K22MIN ) - $ IPARMQ = 2 - ELSE IF ( SUBNAM( 4:6 ).EQ.'EXC' ) THEN - IF( NH.GE.KACMIN ) - $ IPARMQ = 1 - IF( NH.GE.K22MIN ) - $ IPARMQ = 2 - ELSE IF ( SUBNAM( 2:6 ).EQ.'HSEQR' .OR. - $ SUBNAM( 2:5 ).EQ.'LAQR' ) THEN - IF( NS.GE.KACMIN ) - $ IPARMQ = 1 - IF( NS.GE.K22MIN ) - $ IPARMQ = 2 - END IF -* - ELSE IF( ISPEC.EQ.ICOST ) THEN -* -* === Relative cost of near-the-diagonal chase vs -* BLAS updates === -* - IPARMQ = RCOST - ELSE -* ===== invalid value of ispec ===== - IPARMQ = -1 -* - END IF -* -* ==== End of IPARMQ ==== -* - END diff --git a/lib/linalg/fortran/lsame.f b/lib/linalg/fortran/lsame.f deleted file mode 100644 index 6aa4007065..0000000000 --- a/lib/linalg/fortran/lsame.f +++ /dev/null @@ -1,122 +0,0 @@ -*> \brief \b LSAME -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* LOGICAL FUNCTION LSAME(CA,CB) -* -* .. Scalar Arguments .. -* CHARACTER CA,CB -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> LSAME returns .TRUE. if CA is the same letter as CB regardless of -*> case. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] CA -*> \verbatim -*> CA is CHARACTER*1 -*> \endverbatim -*> -*> \param[in] CB -*> \verbatim -*> CB is CHARACTER*1 -*> CA and CB specify the single characters to be compared. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup aux_blas -* -* ===================================================================== - LOGICAL FUNCTION LSAME(CA,CB) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER CA,CB -* .. -* -* ===================================================================== -* -* .. Intrinsic Functions .. - INTRINSIC ICHAR -* .. -* .. Local Scalars .. - INTEGER INTA,INTB,ZCODE -* .. -* -* Test if the characters are equal -* - LSAME = CA .EQ. CB - IF (LSAME) RETURN -* -* Now test for equivalence if both characters are alphabetic. -* - ZCODE = ICHAR('Z') -* -* Use 'Z' rather than 'A' so that ASCII can be detected on Prime -* machines, on which ICHAR returns a value with bit 8 set. -* ICHAR('A') on Prime machines returns 193 which is the same as -* ICHAR('A') on an EBCDIC machine. -* - INTA = ICHAR(CA) - INTB = ICHAR(CB) -* - IF (ZCODE.EQ.90 .OR. ZCODE.EQ.122) THEN -* -* ASCII is assumed - ZCODE is the ASCII code of either lower or -* upper case 'Z'. -* - IF (INTA.GE.97 .AND. INTA.LE.122) INTA = INTA - 32 - IF (INTB.GE.97 .AND. INTB.LE.122) INTB = INTB - 32 -* - ELSE IF (ZCODE.EQ.233 .OR. ZCODE.EQ.169) THEN -* -* EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or -* upper case 'Z'. -* - IF (INTA.GE.129 .AND. INTA.LE.137 .OR. - + INTA.GE.145 .AND. INTA.LE.153 .OR. - + INTA.GE.162 .AND. INTA.LE.169) INTA = INTA + 64 - IF (INTB.GE.129 .AND. INTB.LE.137 .OR. - + INTB.GE.145 .AND. INTB.LE.153 .OR. - + INTB.GE.162 .AND. INTB.LE.169) INTB = INTB + 64 -* - ELSE IF (ZCODE.EQ.218 .OR. ZCODE.EQ.250) THEN -* -* ASCII is assumed, on Prime machines - ZCODE is the ASCII code -* plus 128 of either lower or upper case 'Z'. -* - IF (INTA.GE.225 .AND. INTA.LE.250) INTA = INTA - 32 - IF (INTB.GE.225 .AND. INTB.LE.250) INTB = INTB - 32 - END IF - LSAME = INTA .EQ. INTB -* -* RETURN -* -* End of LSAME -* - END diff --git a/lib/linalg/fortran/xerbla.f b/lib/linalg/fortran/xerbla.f deleted file mode 100644 index 6b141499ee..0000000000 --- a/lib/linalg/fortran/xerbla.f +++ /dev/null @@ -1,96 +0,0 @@ -*> \brief \b XERBLA -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download XERBLA + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE XERBLA( SRNAME, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER*(*) SRNAME -* INTEGER INFO -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> XERBLA is an error handler for the LAPACK routines. -*> It is called by an LAPACK routine if an input parameter has an -*> invalid value. A message is printed and execution stops. -*> -*> Installers may consider modifying the STOP statement in order to -*> call system-specific exception-handling facilities. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SRNAME -*> \verbatim -*> SRNAME is CHARACTER*(*) -*> The name of the routine which called XERBLA. -*> \endverbatim -*> -*> \param[in] INFO -*> \verbatim -*> INFO is INTEGER -*> The position of the invalid parameter in the parameter list -*> of the calling routine. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup OTHERauxiliary -* -* ===================================================================== - SUBROUTINE XERBLA( SRNAME, INFO ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER*(*) SRNAME - INTEGER INFO -* .. -* -* ===================================================================== -* -* .. Intrinsic Functions .. - INTRINSIC LEN_TRIM -* .. -* .. Executable Statements .. -* - WRITE( *, FMT = 9999 )SRNAME( 1:LEN_TRIM( SRNAME ) ), INFO -* - STOP -* - 9999 FORMAT( ' ** On entry to ', A, ' parameter number ', I2, ' had ', - $ 'an illegal value' ) -* -* End of XERBLA -* - END diff --git a/lib/linalg/fortran/zaxpy.f b/lib/linalg/fortran/zaxpy.f deleted file mode 100644 index 35c0e4b892..0000000000 --- a/lib/linalg/fortran/zaxpy.f +++ /dev/null @@ -1,139 +0,0 @@ -*> \brief \b ZAXPY -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZAXPY(N,ZA,ZX,INCX,ZY,INCY) -* -* .. Scalar Arguments .. -* COMPLEX*16 ZA -* INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. -* COMPLEX*16 ZX(*),ZY(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZAXPY constant times a vector plus a vector. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] ZA -*> \verbatim -*> ZA is COMPLEX*16 -*> On entry, ZA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] ZX -*> \verbatim -*> ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of ZX -*> \endverbatim -*> -*> \param[in,out] ZY -*> \verbatim -*> ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> storage spacing between elements of ZY -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, 3/11/78. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZAXPY(N,ZA,ZX,INCX,ZY,INCY) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - COMPLEX*16 ZA - INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. - COMPLEX*16 ZX(*),ZY(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I,IX,IY -* .. -* .. External Functions .. - DOUBLE PRECISION DCABS1 - EXTERNAL DCABS1 -* .. - IF (N.LE.0) RETURN - IF (DCABS1(ZA).EQ.0.0d0) RETURN - IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN -* -* code for both increments equal to 1 -* - DO I = 1,N - ZY(I) = ZY(I) + ZA*ZX(I) - END DO - ELSE -* -* code for unequal increments or equal increments -* not equal to 1 -* - IX = 1 - IY = 1 - IF (INCX.LT.0) IX = (-N+1)*INCX + 1 - IF (INCY.LT.0) IY = (-N+1)*INCY + 1 - DO I = 1,N - ZY(IY) = ZY(IY) + ZA*ZX(IX) - IX = IX + INCX - IY = IY + INCY - END DO - END IF -* - RETURN -* -* End of ZAXPY -* - END diff --git a/lib/linalg/fortran/zcopy.f b/lib/linalg/fortran/zcopy.f deleted file mode 100644 index 1efcdb6b0f..0000000000 --- a/lib/linalg/fortran/zcopy.f +++ /dev/null @@ -1,125 +0,0 @@ -*> \brief \b ZCOPY -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZCOPY(N,ZX,INCX,ZY,INCY) -* -* .. Scalar Arguments .. -* INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. -* COMPLEX*16 ZX(*),ZY(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZCOPY copies a vector, x, to a vector, y. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] ZX -*> \verbatim -*> ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of ZX -*> \endverbatim -*> -*> \param[out] ZY -*> \verbatim -*> ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> storage spacing between elements of ZY -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, linpack, 4/11/78. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZCOPY(N,ZX,INCX,ZY,INCY) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. - COMPLEX*16 ZX(*),ZY(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I,IX,IY -* .. - IF (N.LE.0) RETURN - IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN -* -* code for both increments equal to 1 -* - DO I = 1,N - ZY(I) = ZX(I) - END DO - ELSE -* -* code for unequal increments or equal increments -* not equal to 1 -* - IX = 1 - IY = 1 - IF (INCX.LT.0) IX = (-N+1)*INCX + 1 - IF (INCY.LT.0) IY = (-N+1)*INCY + 1 - DO I = 1,N - ZY(IY) = ZX(IX) - IX = IX + INCX - IY = IY + INCY - END DO - END IF - RETURN -* -* End of ZCOPY -* - END diff --git a/lib/linalg/fortran/zdotc.f b/lib/linalg/fortran/zdotc.f deleted file mode 100644 index bcc29e2dad..0000000000 --- a/lib/linalg/fortran/zdotc.f +++ /dev/null @@ -1,134 +0,0 @@ -*> \brief \b ZDOTC -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* COMPLEX*16 FUNCTION ZDOTC(N,ZX,INCX,ZY,INCY) -* -* .. Scalar Arguments .. -* INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. -* COMPLEX*16 ZX(*),ZY(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZDOTC forms the dot product of two complex vectors -*> ZDOTC = X^H * Y -*> -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] ZX -*> \verbatim -*> ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of ZX -*> \endverbatim -*> -*> \param[in] ZY -*> \verbatim -*> ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> storage spacing between elements of ZY -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, 3/11/78. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - COMPLEX*16 FUNCTION ZDOTC(N,ZX,INCX,ZY,INCY) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. - COMPLEX*16 ZX(*),ZY(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - COMPLEX*16 ZTEMP - INTEGER I,IX,IY -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG -* .. - ZTEMP = (0.0d0,0.0d0) - ZDOTC = (0.0d0,0.0d0) - IF (N.LE.0) RETURN - IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN -* -* code for both increments equal to 1 -* - DO I = 1,N - ZTEMP = ZTEMP + DCONJG(ZX(I))*ZY(I) - END DO - ELSE -* -* code for unequal increments or equal increments -* not equal to 1 -* - IX = 1 - IY = 1 - IF (INCX.LT.0) IX = (-N+1)*INCX + 1 - IF (INCY.LT.0) IY = (-N+1)*INCY + 1 - DO I = 1,N - ZTEMP = ZTEMP + DCONJG(ZX(IX))*ZY(IY) - IX = IX + INCX - IY = IY + INCY - END DO - END IF - ZDOTC = ZTEMP - RETURN -* -* End of ZDOTC -* - END diff --git a/lib/linalg/fortran/zdrot.f b/lib/linalg/fortran/zdrot.f deleted file mode 100644 index 3145561d67..0000000000 --- a/lib/linalg/fortran/zdrot.f +++ /dev/null @@ -1,153 +0,0 @@ -*> \brief \b ZDROT -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZDROT( N, ZX, INCX, ZY, INCY, C, S ) -* -* .. Scalar Arguments .. -* INTEGER INCX, INCY, N -* DOUBLE PRECISION C, S -* .. -* .. Array Arguments .. -* COMPLEX*16 ZX( * ), ZY( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> Applies a plane rotation, where the cos and sin (c and s) are real -*> and the vectors cx and cy are complex. -*> jack dongarra, linpack, 3/11/78. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the vectors cx and cy. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in,out] ZX -*> \verbatim -*> ZX is COMPLEX*16 array, dimension at least -*> ( 1 + ( N - 1 )*abs( INCX ) ). -*> Before entry, the incremented array ZX must contain the n -*> element vector cx. On exit, ZX is overwritten by the updated -*> vector cx. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> ZX. INCX must not be zero. -*> \endverbatim -*> -*> \param[in,out] ZY -*> \verbatim -*> ZY is COMPLEX*16 array, dimension at least -*> ( 1 + ( N - 1 )*abs( INCY ) ). -*> Before entry, the incremented array ZY must contain the n -*> element vector cy. On exit, ZY is overwritten by the updated -*> vector cy. -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> On entry, INCY specifies the increment for the elements of -*> ZY. INCY must not be zero. -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is DOUBLE PRECISION -*> On entry, C specifies the cosine, cos. -*> \endverbatim -*> -*> \param[in] S -*> \verbatim -*> S is DOUBLE PRECISION -*> On entry, S specifies the sine, sin. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level1 -* -* ===================================================================== - SUBROUTINE ZDROT( N, ZX, INCX, ZY, INCY, C, S ) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX, INCY, N - DOUBLE PRECISION C, S -* .. -* .. Array Arguments .. - COMPLEX*16 ZX( * ), ZY( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, IX, IY - COMPLEX*16 CTEMP -* .. -* .. Executable Statements .. -* - IF( N.LE.0 ) - $ RETURN - IF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN -* -* code for both increments equal to 1 -* - DO I = 1, N - CTEMP = C*ZX( I ) + S*ZY( I ) - ZY( I ) = C*ZY( I ) - S*ZX( I ) - ZX( I ) = CTEMP - END DO - ELSE -* -* code for unequal increments or equal increments not equal -* to 1 -* - IX = 1 - IY = 1 - IF( INCX.LT.0 ) - $ IX = ( -N+1 )*INCX + 1 - IF( INCY.LT.0 ) - $ IY = ( -N+1 )*INCY + 1 - DO I = 1, N - CTEMP = C*ZX( IX ) + S*ZY( IY ) - ZY( IY ) = C*ZY( IY ) - S*ZX( IX ) - ZX( IX ) = CTEMP - IX = IX + INCX - IY = IY + INCY - END DO - END IF - RETURN -* -* End of ZDROT -* - END diff --git a/lib/linalg/fortran/zdscal.f b/lib/linalg/fortran/zdscal.f deleted file mode 100644 index 5a16048771..0000000000 --- a/lib/linalg/fortran/zdscal.f +++ /dev/null @@ -1,123 +0,0 @@ -*> \brief \b ZDSCAL -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZDSCAL(N,DA,ZX,INCX) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION DA -* INTEGER INCX,N -* .. -* .. Array Arguments .. -* COMPLEX*16 ZX(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZDSCAL scales a vector by a constant. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] DA -*> \verbatim -*> DA is DOUBLE PRECISION -*> On entry, DA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in,out] ZX -*> \verbatim -*> ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of ZX -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, 3/11/78. -*> modified 3/93 to return if incx .le. 0. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZDSCAL(N,DA,ZX,INCX) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION DA - INTEGER INCX,N -* .. -* .. Array Arguments .. - COMPLEX*16 ZX(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I,NINCX -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER (ONE=1.0D+0) -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, DCMPLX, DIMAG -* .. - IF (N.LE.0 .OR. INCX.LE.0 .OR. DA.EQ.ONE) RETURN - IF (INCX.EQ.1) THEN -* -* code for increment equal to 1 -* - DO I = 1,N - ZX(I) = DCMPLX(DA*DBLE(ZX(I)),DA*DIMAG(ZX(I))) - END DO - ELSE -* -* code for increment not equal to 1 -* - NINCX = N*INCX - DO I = 1,NINCX,INCX - ZX(I) = DCMPLX(DA*DBLE(ZX(I)),DA*DIMAG(ZX(I))) - END DO - END IF - RETURN -* -* End of ZDSCAL -* - END diff --git a/lib/linalg/fortran/zgemm.f b/lib/linalg/fortran/zgemm.f deleted file mode 100644 index 0b712f1b73..0000000000 --- a/lib/linalg/fortran/zgemm.f +++ /dev/null @@ -1,477 +0,0 @@ -*> \brief \b ZGEMM -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) -* -* .. Scalar Arguments .. -* COMPLEX*16 ALPHA,BETA -* INTEGER K,LDA,LDB,LDC,M,N -* CHARACTER TRANSA,TRANSB -* .. -* .. Array Arguments .. -* COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZGEMM performs one of the matrix-matrix operations -*> -*> C := alpha*op( A )*op( B ) + beta*C, -*> -*> where op( X ) is one of -*> -*> op( X ) = X or op( X ) = X**T or op( X ) = X**H, -*> -*> alpha and beta are scalars, and A, B and C are matrices, with op( A ) -*> an m by k matrix, op( B ) a k by n matrix and C an m by n matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] TRANSA -*> \verbatim -*> TRANSA is CHARACTER*1 -*> On entry, TRANSA specifies the form of op( A ) to be used in -*> the matrix multiplication as follows: -*> -*> TRANSA = 'N' or 'n', op( A ) = A. -*> -*> TRANSA = 'T' or 't', op( A ) = A**T. -*> -*> TRANSA = 'C' or 'c', op( A ) = A**H. -*> \endverbatim -*> -*> \param[in] TRANSB -*> \verbatim -*> TRANSB is CHARACTER*1 -*> On entry, TRANSB specifies the form of op( B ) to be used in -*> the matrix multiplication as follows: -*> -*> TRANSB = 'N' or 'n', op( B ) = B. -*> -*> TRANSB = 'T' or 't', op( B ) = B**T. -*> -*> TRANSB = 'C' or 'c', op( B ) = B**H. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> On entry, M specifies the number of rows of the matrix -*> op( A ) and of the matrix C. M must be at least zero. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the number of columns of the matrix -*> op( B ) and the number of columns of the matrix C. N must be -*> at least zero. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> On entry, K specifies the number of columns of the matrix -*> op( A ) and the number of rows of the matrix op( B ). K must -*> be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is COMPLEX*16 -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension ( LDA, ka ), where ka is -*> k when TRANSA = 'N' or 'n', and is m otherwise. -*> Before entry with TRANSA = 'N' or 'n', the leading m by k -*> part of the array A must contain the matrix A, otherwise -*> the leading k by m part of the array A must contain the -*> matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. When TRANSA = 'N' or 'n' then -*> LDA must be at least max( 1, m ), otherwise LDA must be at -*> least max( 1, k ). -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is COMPLEX*16 array, dimension ( LDB, kb ), where kb is -*> n when TRANSB = 'N' or 'n', and is k otherwise. -*> Before entry with TRANSB = 'N' or 'n', the leading k by n -*> part of the array B must contain the matrix B, otherwise -*> the leading n by k part of the array B must contain the -*> matrix B. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> On entry, LDB specifies the first dimension of B as declared -*> in the calling (sub) program. When TRANSB = 'N' or 'n' then -*> LDB must be at least max( 1, k ), otherwise LDB must be at -*> least max( 1, n ). -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is COMPLEX*16 -*> On entry, BETA specifies the scalar beta. When BETA is -*> supplied as zero then C need not be set on input. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension ( LDC, N ) -*> Before entry, the leading m by n part of the array C must -*> contain the matrix C, except when beta is zero, in which -*> case C need not be set on entry. -*> On exit, the array C is overwritten by the m by n matrix -*> ( alpha*op( A )*op( B ) + beta*C ). -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> On entry, LDC specifies the first dimension of C as declared -*> in the calling (sub) program. LDC must be at least -*> max( 1, m ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level3 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 3 Blas routine. -*> -*> -- Written on 8-February-1989. -*> Jack Dongarra, Argonne National Laboratory. -*> Iain Duff, AERE Harwell. -*> Jeremy Du Croz, Numerical Algorithms Group Ltd. -*> Sven Hammarling, Numerical Algorithms Group Ltd. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) -* -* -- Reference BLAS level3 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - COMPLEX*16 ALPHA,BETA - INTEGER K,LDA,LDB,LDC,M,N - CHARACTER TRANSA,TRANSB -* .. -* .. Array Arguments .. - COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) -* .. -* -* ===================================================================== -* -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG,MAX -* .. -* .. Local Scalars .. - COMPLEX*16 TEMP - INTEGER I,INFO,J,L,NROWA,NROWB - LOGICAL CONJA,CONJB,NOTA,NOTB -* .. -* .. Parameters .. - COMPLEX*16 ONE - PARAMETER (ONE= (1.0D+0,0.0D+0)) - COMPLEX*16 ZERO - PARAMETER (ZERO= (0.0D+0,0.0D+0)) -* .. -* -* Set NOTA and NOTB as true if A and B respectively are not -* conjugated or transposed, set CONJA and CONJB as true if A and -* B respectively are to be transposed but not conjugated and set -* NROWA and NROWB as the number of rows of A and B respectively. -* - NOTA = LSAME(TRANSA,'N') - NOTB = LSAME(TRANSB,'N') - CONJA = LSAME(TRANSA,'C') - CONJB = LSAME(TRANSB,'C') - IF (NOTA) THEN - NROWA = M - ELSE - NROWA = K - END IF - IF (NOTB) THEN - NROWB = K - ELSE - NROWB = N - END IF -* -* Test the input parameters. -* - INFO = 0 - IF ((.NOT.NOTA) .AND. (.NOT.CONJA) .AND. - + (.NOT.LSAME(TRANSA,'T'))) THEN - INFO = 1 - ELSE IF ((.NOT.NOTB) .AND. (.NOT.CONJB) .AND. - + (.NOT.LSAME(TRANSB,'T'))) THEN - INFO = 2 - ELSE IF (M.LT.0) THEN - INFO = 3 - ELSE IF (N.LT.0) THEN - INFO = 4 - ELSE IF (K.LT.0) THEN - INFO = 5 - ELSE IF (LDA.LT.MAX(1,NROWA)) THEN - INFO = 8 - ELSE IF (LDB.LT.MAX(1,NROWB)) THEN - INFO = 10 - ELSE IF (LDC.LT.MAX(1,M)) THEN - INFO = 13 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('ZGEMM ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((M.EQ.0) .OR. (N.EQ.0) .OR. - + (((ALPHA.EQ.ZERO).OR. (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN -* -* And when alpha.eq.zero. -* - IF (ALPHA.EQ.ZERO) THEN - IF (BETA.EQ.ZERO) THEN - DO 20 J = 1,N - DO 10 I = 1,M - C(I,J) = ZERO - 10 CONTINUE - 20 CONTINUE - ELSE - DO 40 J = 1,N - DO 30 I = 1,M - C(I,J) = BETA*C(I,J) - 30 CONTINUE - 40 CONTINUE - END IF - RETURN - END IF -* -* Start the operations. -* - IF (NOTB) THEN - IF (NOTA) THEN -* -* Form C := alpha*A*B + beta*C. -* - DO 90 J = 1,N - IF (BETA.EQ.ZERO) THEN - DO 50 I = 1,M - C(I,J) = ZERO - 50 CONTINUE - ELSE IF (BETA.NE.ONE) THEN - DO 60 I = 1,M - C(I,J) = BETA*C(I,J) - 60 CONTINUE - END IF - DO 80 L = 1,K - TEMP = ALPHA*B(L,J) - DO 70 I = 1,M - C(I,J) = C(I,J) + TEMP*A(I,L) - 70 CONTINUE - 80 CONTINUE - 90 CONTINUE - ELSE IF (CONJA) THEN -* -* Form C := alpha*A**H*B + beta*C. -* - DO 120 J = 1,N - DO 110 I = 1,M - TEMP = ZERO - DO 100 L = 1,K - TEMP = TEMP + DCONJG(A(L,I))*B(L,J) - 100 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = ALPHA*TEMP - ELSE - C(I,J) = ALPHA*TEMP + BETA*C(I,J) - END IF - 110 CONTINUE - 120 CONTINUE - ELSE -* -* Form C := alpha*A**T*B + beta*C -* - DO 150 J = 1,N - DO 140 I = 1,M - TEMP = ZERO - DO 130 L = 1,K - TEMP = TEMP + A(L,I)*B(L,J) - 130 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = ALPHA*TEMP - ELSE - C(I,J) = ALPHA*TEMP + BETA*C(I,J) - END IF - 140 CONTINUE - 150 CONTINUE - END IF - ELSE IF (NOTA) THEN - IF (CONJB) THEN -* -* Form C := alpha*A*B**H + beta*C. -* - DO 200 J = 1,N - IF (BETA.EQ.ZERO) THEN - DO 160 I = 1,M - C(I,J) = ZERO - 160 CONTINUE - ELSE IF (BETA.NE.ONE) THEN - DO 170 I = 1,M - C(I,J) = BETA*C(I,J) - 170 CONTINUE - END IF - DO 190 L = 1,K - TEMP = ALPHA*DCONJG(B(J,L)) - DO 180 I = 1,M - C(I,J) = C(I,J) + TEMP*A(I,L) - 180 CONTINUE - 190 CONTINUE - 200 CONTINUE - ELSE -* -* Form C := alpha*A*B**T + beta*C -* - DO 250 J = 1,N - IF (BETA.EQ.ZERO) THEN - DO 210 I = 1,M - C(I,J) = ZERO - 210 CONTINUE - ELSE IF (BETA.NE.ONE) THEN - DO 220 I = 1,M - C(I,J) = BETA*C(I,J) - 220 CONTINUE - END IF - DO 240 L = 1,K - TEMP = ALPHA*B(J,L) - DO 230 I = 1,M - C(I,J) = C(I,J) + TEMP*A(I,L) - 230 CONTINUE - 240 CONTINUE - 250 CONTINUE - END IF - ELSE IF (CONJA) THEN - IF (CONJB) THEN -* -* Form C := alpha*A**H*B**H + beta*C. -* - DO 280 J = 1,N - DO 270 I = 1,M - TEMP = ZERO - DO 260 L = 1,K - TEMP = TEMP + DCONJG(A(L,I))*DCONJG(B(J,L)) - 260 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = ALPHA*TEMP - ELSE - C(I,J) = ALPHA*TEMP + BETA*C(I,J) - END IF - 270 CONTINUE - 280 CONTINUE - ELSE -* -* Form C := alpha*A**H*B**T + beta*C -* - DO 310 J = 1,N - DO 300 I = 1,M - TEMP = ZERO - DO 290 L = 1,K - TEMP = TEMP + DCONJG(A(L,I))*B(J,L) - 290 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = ALPHA*TEMP - ELSE - C(I,J) = ALPHA*TEMP + BETA*C(I,J) - END IF - 300 CONTINUE - 310 CONTINUE - END IF - ELSE - IF (CONJB) THEN -* -* Form C := alpha*A**T*B**H + beta*C -* - DO 340 J = 1,N - DO 330 I = 1,M - TEMP = ZERO - DO 320 L = 1,K - TEMP = TEMP + A(L,I)*DCONJG(B(J,L)) - 320 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = ALPHA*TEMP - ELSE - C(I,J) = ALPHA*TEMP + BETA*C(I,J) - END IF - 330 CONTINUE - 340 CONTINUE - ELSE -* -* Form C := alpha*A**T*B**T + beta*C -* - DO 370 J = 1,N - DO 360 I = 1,M - TEMP = ZERO - DO 350 L = 1,K - TEMP = TEMP + A(L,I)*B(J,L) - 350 CONTINUE - IF (BETA.EQ.ZERO) THEN - C(I,J) = ALPHA*TEMP - ELSE - C(I,J) = ALPHA*TEMP + BETA*C(I,J) - END IF - 360 CONTINUE - 370 CONTINUE - END IF - END IF -* - RETURN -* -* End of ZGEMM -* - END diff --git a/lib/linalg/fortran/zgemv.f b/lib/linalg/fortran/zgemv.f deleted file mode 100644 index 2664454b94..0000000000 --- a/lib/linalg/fortran/zgemv.f +++ /dev/null @@ -1,347 +0,0 @@ -*> \brief \b ZGEMV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) -* -* .. Scalar Arguments .. -* COMPLEX*16 ALPHA,BETA -* INTEGER INCX,INCY,LDA,M,N -* CHARACTER TRANS -* .. -* .. Array Arguments .. -* COMPLEX*16 A(LDA,*),X(*),Y(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZGEMV performs one of the matrix-vector operations -*> -*> y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y, or -*> -*> y := alpha*A**H*x + beta*y, -*> -*> where alpha and beta are scalars, x and y are vectors and A is an -*> m by n matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> On entry, TRANS specifies the operation to be performed as -*> follows: -*> -*> TRANS = 'N' or 'n' y := alpha*A*x + beta*y. -*> -*> TRANS = 'T' or 't' y := alpha*A**T*x + beta*y. -*> -*> TRANS = 'C' or 'c' y := alpha*A**H*x + beta*y. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> On entry, M specifies the number of rows of the matrix A. -*> M must be at least zero. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the number of columns of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is COMPLEX*16 -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension ( LDA, N ) -*> Before entry, the leading m by n part of the array A must -*> contain the matrix of coefficients. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. LDA must be at least -*> max( 1, m ). -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is COMPLEX*16 array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' -*> and at least -*> ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. -*> Before entry, the incremented array X must contain the -*> vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is COMPLEX*16 -*> On entry, BETA specifies the scalar beta. When BETA is -*> supplied as zero then Y need not be set on input. -*> \endverbatim -*> -*> \param[in,out] Y -*> \verbatim -*> Y is COMPLEX*16 array, dimension at least -*> ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' -*> and at least -*> ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. -*> Before entry with BETA non-zero, the incremented array Y -*> must contain the vector y. On exit, Y is overwritten by the -*> updated vector y. -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> On entry, INCY specifies the increment for the elements of -*> Y. INCY must not be zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> The vector and matrix arguments are not referenced when N = 0, or M = 0 -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - COMPLEX*16 ALPHA,BETA - INTEGER INCX,INCY,LDA,M,N - CHARACTER TRANS -* .. -* .. Array Arguments .. - COMPLEX*16 A(LDA,*),X(*),Y(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE - PARAMETER (ONE= (1.0D+0,0.0D+0)) - COMPLEX*16 ZERO - PARAMETER (ZERO= (0.0D+0,0.0D+0)) -* .. -* .. Local Scalars .. - COMPLEX*16 TEMP - INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY - LOGICAL NOCONJ -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG,MAX -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. - + .NOT.LSAME(TRANS,'C')) THEN - INFO = 1 - ELSE IF (M.LT.0) THEN - INFO = 2 - ELSE IF (N.LT.0) THEN - INFO = 3 - ELSE IF (LDA.LT.MAX(1,M)) THEN - INFO = 6 - ELSE IF (INCX.EQ.0) THEN - INFO = 8 - ELSE IF (INCY.EQ.0) THEN - INFO = 11 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('ZGEMV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((M.EQ.0) .OR. (N.EQ.0) .OR. - + ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN -* - NOCONJ = LSAME(TRANS,'T') -* -* Set LENX and LENY, the lengths of the vectors x and y, and set -* up the start points in X and Y. -* - IF (LSAME(TRANS,'N')) THEN - LENX = N - LENY = M - ELSE - LENX = M - LENY = N - END IF - IF (INCX.GT.0) THEN - KX = 1 - ELSE - KX = 1 - (LENX-1)*INCX - END IF - IF (INCY.GT.0) THEN - KY = 1 - ELSE - KY = 1 - (LENY-1)*INCY - END IF -* -* Start the operations. In this version the elements of A are -* accessed sequentially with one pass through A. -* -* First form y := beta*y. -* - IF (BETA.NE.ONE) THEN - IF (INCY.EQ.1) THEN - IF (BETA.EQ.ZERO) THEN - DO 10 I = 1,LENY - Y(I) = ZERO - 10 CONTINUE - ELSE - DO 20 I = 1,LENY - Y(I) = BETA*Y(I) - 20 CONTINUE - END IF - ELSE - IY = KY - IF (BETA.EQ.ZERO) THEN - DO 30 I = 1,LENY - Y(IY) = ZERO - IY = IY + INCY - 30 CONTINUE - ELSE - DO 40 I = 1,LENY - Y(IY) = BETA*Y(IY) - IY = IY + INCY - 40 CONTINUE - END IF - END IF - END IF - IF (ALPHA.EQ.ZERO) RETURN - IF (LSAME(TRANS,'N')) THEN -* -* Form y := alpha*A*x + y. -* - JX = KX - IF (INCY.EQ.1) THEN - DO 60 J = 1,N - TEMP = ALPHA*X(JX) - DO 50 I = 1,M - Y(I) = Y(I) + TEMP*A(I,J) - 50 CONTINUE - JX = JX + INCX - 60 CONTINUE - ELSE - DO 80 J = 1,N - TEMP = ALPHA*X(JX) - IY = KY - DO 70 I = 1,M - Y(IY) = Y(IY) + TEMP*A(I,J) - IY = IY + INCY - 70 CONTINUE - JX = JX + INCX - 80 CONTINUE - END IF - ELSE -* -* Form y := alpha*A**T*x + y or y := alpha*A**H*x + y. -* - JY = KY - IF (INCX.EQ.1) THEN - DO 110 J = 1,N - TEMP = ZERO - IF (NOCONJ) THEN - DO 90 I = 1,M - TEMP = TEMP + A(I,J)*X(I) - 90 CONTINUE - ELSE - DO 100 I = 1,M - TEMP = TEMP + DCONJG(A(I,J))*X(I) - 100 CONTINUE - END IF - Y(JY) = Y(JY) + ALPHA*TEMP - JY = JY + INCY - 110 CONTINUE - ELSE - DO 140 J = 1,N - TEMP = ZERO - IX = KX - IF (NOCONJ) THEN - DO 120 I = 1,M - TEMP = TEMP + A(I,J)*X(IX) - IX = IX + INCX - 120 CONTINUE - ELSE - DO 130 I = 1,M - TEMP = TEMP + DCONJG(A(I,J))*X(IX) - IX = IX + INCX - 130 CONTINUE - END IF - Y(JY) = Y(JY) + ALPHA*TEMP - JY = JY + INCY - 140 CONTINUE - END IF - END IF -* - RETURN -* -* End of ZGEMV -* - END diff --git a/lib/linalg/fortran/zgerc.f b/lib/linalg/fortran/zgerc.f deleted file mode 100644 index 2eb4349367..0000000000 --- a/lib/linalg/fortran/zgerc.f +++ /dev/null @@ -1,224 +0,0 @@ -*> \brief \b ZGERC -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZGERC(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) -* -* .. Scalar Arguments .. -* COMPLEX*16 ALPHA -* INTEGER INCX,INCY,LDA,M,N -* .. -* .. Array Arguments .. -* COMPLEX*16 A(LDA,*),X(*),Y(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZGERC performs the rank 1 operation -*> -*> A := alpha*x*y**H + A, -*> -*> where alpha is a scalar, x is an m element vector, y is an n element -*> vector and A is an m by n matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> On entry, M specifies the number of rows of the matrix A. -*> M must be at least zero. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the number of columns of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is COMPLEX*16 -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is COMPLEX*16 array, dimension at least -*> ( 1 + ( m - 1 )*abs( INCX ) ). -*> Before entry, the incremented array X must contain the m -*> element vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is COMPLEX*16 array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCY ) ). -*> Before entry, the incremented array Y must contain the n -*> element vector y. -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> On entry, INCY specifies the increment for the elements of -*> Y. INCY must not be zero. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension ( LDA, N ) -*> Before entry, the leading m by n part of the array A must -*> contain the matrix of coefficients. On exit, A is -*> overwritten by the updated matrix. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. LDA must be at least -*> max( 1, m ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZGERC(M,N,ALPHA,X,INCX,Y,INCY,A,LDA) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - COMPLEX*16 ALPHA - INTEGER INCX,INCY,LDA,M,N -* .. -* .. Array Arguments .. - COMPLEX*16 A(LDA,*),X(*),Y(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER (ZERO= (0.0D+0,0.0D+0)) -* .. -* .. Local Scalars .. - COMPLEX*16 TEMP - INTEGER I,INFO,IX,J,JY,KX -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG,MAX -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (M.LT.0) THEN - INFO = 1 - ELSE IF (N.LT.0) THEN - INFO = 2 - ELSE IF (INCX.EQ.0) THEN - INFO = 5 - ELSE IF (INCY.EQ.0) THEN - INFO = 7 - ELSE IF (LDA.LT.MAX(1,M)) THEN - INFO = 9 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('ZGERC ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((M.EQ.0) .OR. (N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN -* -* Start the operations. In this version the elements of A are -* accessed sequentially with one pass through A. -* - IF (INCY.GT.0) THEN - JY = 1 - ELSE - JY = 1 - (N-1)*INCY - END IF - IF (INCX.EQ.1) THEN - DO 20 J = 1,N - IF (Y(JY).NE.ZERO) THEN - TEMP = ALPHA*DCONJG(Y(JY)) - DO 10 I = 1,M - A(I,J) = A(I,J) + X(I)*TEMP - 10 CONTINUE - END IF - JY = JY + INCY - 20 CONTINUE - ELSE - IF (INCX.GT.0) THEN - KX = 1 - ELSE - KX = 1 - (M-1)*INCX - END IF - DO 40 J = 1,N - IF (Y(JY).NE.ZERO) THEN - TEMP = ALPHA*DCONJG(Y(JY)) - IX = KX - DO 30 I = 1,M - A(I,J) = A(I,J) + X(IX)*TEMP - IX = IX + INCX - 30 CONTINUE - END IF - JY = JY + INCY - 40 CONTINUE - END IF -* - RETURN -* -* End of ZGERC -* - END diff --git a/lib/linalg/fortran/zheev.f b/lib/linalg/fortran/zheev.f deleted file mode 100644 index 59af34a742..0000000000 --- a/lib/linalg/fortran/zheev.f +++ /dev/null @@ -1,295 +0,0 @@ -*> \brief ZHEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZHEEV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZHEEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, -* INFO ) -* -* .. Scalar Arguments .. -* CHARACTER JOBZ, UPLO -* INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION RWORK( * ), W( * ) -* COMPLEX*16 A( LDA, * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZHEEV computes all eigenvalues and, optionally, eigenvectors of a -*> complex Hermitian matrix A. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] JOBZ -*> \verbatim -*> JOBZ is CHARACTER*1 -*> = 'N': Compute eigenvalues only; -*> = 'V': Compute eigenvalues and eigenvectors. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored; -*> = 'L': Lower triangle of A is stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA, N) -*> On entry, the Hermitian matrix A. If UPLO = 'U', the -*> leading N-by-N upper triangular part of A contains the -*> upper triangular part of the matrix A. If UPLO = 'L', -*> the leading N-by-N lower triangular part of A contains -*> the lower triangular part of the matrix A. -*> On exit, if JOBZ = 'V', then if INFO = 0, A contains the -*> orthonormal eigenvectors of the matrix A. -*> If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') -*> or the upper triangle (if UPLO='U') of A, including the -*> diagonal, is destroyed. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] W -*> \verbatim -*> W is DOUBLE PRECISION array, dimension (N) -*> If INFO = 0, the eigenvalues in ascending order. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The length of the array WORK. LWORK >= max(1,2*N-1). -*> For optimal efficiency, LWORK >= (NB+1)*N, -*> where NB is the blocksize for ZHETRD returned by ILAENV. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] RWORK -*> \verbatim -*> RWORK is DOUBLE PRECISION array, dimension (max(1, 3*N-2)) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, the algorithm failed to converge; i -*> off-diagonal elements of an intermediate tridiagonal -*> form did not converge to zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16HEeigen -* -* ===================================================================== - SUBROUTINE ZHEEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, - $ INFO ) -* -* -- LAPACK driver routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER JOBZ, UPLO - INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION RWORK( * ), W( * ) - COMPLEX*16 A( LDA, * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) - COMPLEX*16 CONE - PARAMETER ( CONE = ( 1.0D0, 0.0D0 ) ) -* .. -* .. Local Scalars .. - LOGICAL LOWER, LQUERY, WANTZ - INTEGER IINFO, IMAX, INDE, INDTAU, INDWRK, ISCALE, - $ LLWORK, LWKOPT, NB - DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA, - $ SMLNUM -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - DOUBLE PRECISION DLAMCH, ZLANHE - EXTERNAL LSAME, ILAENV, DLAMCH, ZLANHE -* .. -* .. External Subroutines .. - EXTERNAL DSCAL, DSTERF, XERBLA, ZHETRD, ZLASCL, ZSTEQR, - $ ZUNGTR -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - WANTZ = LSAME( JOBZ, 'V' ) - LOWER = LSAME( UPLO, 'L' ) - LQUERY = ( LWORK.EQ.-1 ) -* - INFO = 0 - IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN - INFO = -1 - ELSE IF( .NOT.( LOWER .OR. LSAME( UPLO, 'U' ) ) ) THEN - INFO = -2 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -5 - END IF -* - IF( INFO.EQ.0 ) THEN - NB = ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1, -1 ) - LWKOPT = MAX( 1, ( NB+1 )*N ) - WORK( 1 ) = LWKOPT -* - IF( LWORK.LT.MAX( 1, 2*N-1 ) .AND. .NOT.LQUERY ) - $ INFO = -8 - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZHEEV ', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) THEN - RETURN - END IF -* - IF( N.EQ.1 ) THEN - W( 1 ) = DBLE( A( 1, 1 ) ) - WORK( 1 ) = 1 - IF( WANTZ ) - $ A( 1, 1 ) = CONE - RETURN - END IF -* -* Get machine constants. -* - SAFMIN = DLAMCH( 'Safe minimum' ) - EPS = DLAMCH( 'Precision' ) - SMLNUM = SAFMIN / EPS - BIGNUM = ONE / SMLNUM - RMIN = SQRT( SMLNUM ) - RMAX = SQRT( BIGNUM ) -* -* Scale matrix to allowable range, if necessary. -* - ANRM = ZLANHE( 'M', UPLO, N, A, LDA, RWORK ) - ISCALE = 0 - IF( ANRM.GT.ZERO .AND. ANRM.LT.RMIN ) THEN - ISCALE = 1 - SIGMA = RMIN / ANRM - ELSE IF( ANRM.GT.RMAX ) THEN - ISCALE = 1 - SIGMA = RMAX / ANRM - END IF - IF( ISCALE.EQ.1 ) - $ CALL ZLASCL( UPLO, 0, 0, ONE, SIGMA, N, N, A, LDA, INFO ) -* -* Call ZHETRD to reduce Hermitian matrix to tridiagonal form. -* - INDE = 1 - INDTAU = 1 - INDWRK = INDTAU + N - LLWORK = LWORK - INDWRK + 1 - CALL ZHETRD( UPLO, N, A, LDA, W, RWORK( INDE ), WORK( INDTAU ), - $ WORK( INDWRK ), LLWORK, IINFO ) -* -* For eigenvalues only, call DSTERF. For eigenvectors, first call -* ZUNGTR to generate the unitary matrix, then call ZSTEQR. -* - IF( .NOT.WANTZ ) THEN - CALL DSTERF( N, W, RWORK( INDE ), INFO ) - ELSE - CALL ZUNGTR( UPLO, N, A, LDA, WORK( INDTAU ), WORK( INDWRK ), - $ LLWORK, IINFO ) - INDWRK = INDE + N - CALL ZSTEQR( JOBZ, N, W, RWORK( INDE ), A, LDA, - $ RWORK( INDWRK ), INFO ) - END IF -* -* If matrix was scaled, then rescale eigenvalues appropriately. -* - IF( ISCALE.EQ.1 ) THEN - IF( INFO.EQ.0 ) THEN - IMAX = N - ELSE - IMAX = INFO - 1 - END IF - CALL DSCAL( IMAX, ONE / SIGMA, W, 1 ) - END IF -* -* Set WORK(1) to optimal complex workspace size. -* - WORK( 1 ) = LWKOPT -* - RETURN -* -* End of ZHEEV -* - END diff --git a/lib/linalg/fortran/zheevd.f b/lib/linalg/fortran/zheevd.f deleted file mode 100644 index 7f58c7f726..0000000000 --- a/lib/linalg/fortran/zheevd.f +++ /dev/null @@ -1,395 +0,0 @@ -*> \brief ZHEEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZHEEVD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZHEEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, -* LRWORK, IWORK, LIWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER JOBZ, UPLO -* INTEGER INFO, LDA, LIWORK, LRWORK, LWORK, N -* .. -* .. Array Arguments .. -* INTEGER IWORK( * ) -* DOUBLE PRECISION RWORK( * ), W( * ) -* COMPLEX*16 A( LDA, * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZHEEVD computes all eigenvalues and, optionally, eigenvectors of a -*> complex Hermitian matrix A. If eigenvectors are desired, it uses a -*> divide and conquer algorithm. -*> -*> The divide and conquer algorithm makes very mild assumptions about -*> floating point arithmetic. It will work on machines with a guard -*> digit in add/subtract, or on those binary machines without guard -*> digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or -*> Cray-2. It could conceivably fail on hexadecimal or decimal machines -*> without guard digits, but we know of none. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] JOBZ -*> \verbatim -*> JOBZ is CHARACTER*1 -*> = 'N': Compute eigenvalues only; -*> = 'V': Compute eigenvalues and eigenvectors. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored; -*> = 'L': Lower triangle of A is stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA, N) -*> On entry, the Hermitian matrix A. If UPLO = 'U', the -*> leading N-by-N upper triangular part of A contains the -*> upper triangular part of the matrix A. If UPLO = 'L', -*> the leading N-by-N lower triangular part of A contains -*> the lower triangular part of the matrix A. -*> On exit, if JOBZ = 'V', then if INFO = 0, A contains the -*> orthonormal eigenvectors of the matrix A. -*> If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') -*> or the upper triangle (if UPLO='U') of A, including the -*> diagonal, is destroyed. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] W -*> \verbatim -*> W is DOUBLE PRECISION array, dimension (N) -*> If INFO = 0, the eigenvalues in ascending order. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The length of the array WORK. -*> If N <= 1, LWORK must be at least 1. -*> If JOBZ = 'N' and N > 1, LWORK must be at least N + 1. -*> If JOBZ = 'V' and N > 1, LWORK must be at least 2*N + N**2. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal sizes of the WORK, RWORK and -*> IWORK arrays, returns these values as the first entries of -*> the WORK, RWORK and IWORK arrays, and no error message -*> related to LWORK or LRWORK or LIWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] RWORK -*> \verbatim -*> RWORK is DOUBLE PRECISION array, -*> dimension (LRWORK) -*> On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK. -*> \endverbatim -*> -*> \param[in] LRWORK -*> \verbatim -*> LRWORK is INTEGER -*> The dimension of the array RWORK. -*> If N <= 1, LRWORK must be at least 1. -*> If JOBZ = 'N' and N > 1, LRWORK must be at least N. -*> If JOBZ = 'V' and N > 1, LRWORK must be at least -*> 1 + 5*N + 2*N**2. -*> -*> If LRWORK = -1, then a workspace query is assumed; the -*> routine only calculates the optimal sizes of the WORK, RWORK -*> and IWORK arrays, returns these values as the first entries -*> of the WORK, RWORK and IWORK arrays, and no error message -*> related to LWORK or LRWORK or LIWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension (MAX(1,LIWORK)) -*> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. -*> \endverbatim -*> -*> \param[in] LIWORK -*> \verbatim -*> LIWORK is INTEGER -*> The dimension of the array IWORK. -*> If N <= 1, LIWORK must be at least 1. -*> If JOBZ = 'N' and N > 1, LIWORK must be at least 1. -*> If JOBZ = 'V' and N > 1, LIWORK must be at least 3 + 5*N. -*> -*> If LIWORK = -1, then a workspace query is assumed; the -*> routine only calculates the optimal sizes of the WORK, RWORK -*> and IWORK arrays, returns these values as the first entries -*> of the WORK, RWORK and IWORK arrays, and no error message -*> related to LWORK or LRWORK or LIWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i and JOBZ = 'N', then the algorithm failed -*> to converge; i off-diagonal elements of an intermediate -*> tridiagonal form did not converge to zero; -*> if INFO = i and JOBZ = 'V', then the algorithm failed -*> to compute an eigenvalue while working on the submatrix -*> lying in rows and columns INFO/(N+1) through -*> mod(INFO,N+1). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16HEeigen -* -*> \par Further Details: -* ===================== -*> -*> Modified description of INFO. Sven, 16 Feb 05. -* -*> \par Contributors: -* ================== -*> -*> Jeff Rutter, Computer Science Division, University of California -*> at Berkeley, USA -*> -* ===================================================================== - SUBROUTINE ZHEEVD( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, RWORK, - $ LRWORK, IWORK, LIWORK, INFO ) -* -* -- LAPACK driver routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER JOBZ, UPLO - INTEGER INFO, LDA, LIWORK, LRWORK, LWORK, N -* .. -* .. Array Arguments .. - INTEGER IWORK( * ) - DOUBLE PRECISION RWORK( * ), W( * ) - COMPLEX*16 A( LDA, * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) - COMPLEX*16 CONE - PARAMETER ( CONE = ( 1.0D0, 0.0D0 ) ) -* .. -* .. Local Scalars .. - LOGICAL LOWER, LQUERY, WANTZ - INTEGER IINFO, IMAX, INDE, INDRWK, INDTAU, INDWK2, - $ INDWRK, ISCALE, LIOPT, LIWMIN, LLRWK, LLWORK, - $ LLWRK2, LOPT, LROPT, LRWMIN, LWMIN - DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA, - $ SMLNUM -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - DOUBLE PRECISION DLAMCH, ZLANHE - EXTERNAL LSAME, ILAENV, DLAMCH, ZLANHE -* .. -* .. External Subroutines .. - EXTERNAL DSCAL, DSTERF, XERBLA, ZHETRD, ZLACPY, ZLASCL, - $ ZSTEDC, ZUNMTR -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - WANTZ = LSAME( JOBZ, 'V' ) - LOWER = LSAME( UPLO, 'L' ) - LQUERY = ( LWORK.EQ.-1 .OR. LRWORK.EQ.-1 .OR. LIWORK.EQ.-1 ) -* - INFO = 0 - IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN - INFO = -1 - ELSE IF( .NOT.( LOWER .OR. LSAME( UPLO, 'U' ) ) ) THEN - INFO = -2 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -5 - END IF -* - IF( INFO.EQ.0 ) THEN - IF( N.LE.1 ) THEN - LWMIN = 1 - LRWMIN = 1 - LIWMIN = 1 - LOPT = LWMIN - LROPT = LRWMIN - LIOPT = LIWMIN - ELSE - IF( WANTZ ) THEN - LWMIN = 2*N + N*N - LRWMIN = 1 + 5*N + 2*N**2 - LIWMIN = 3 + 5*N - ELSE - LWMIN = N + 1 - LRWMIN = N - LIWMIN = 1 - END IF - LOPT = MAX( LWMIN, N + - $ N*ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1, -1 ) ) - LROPT = LRWMIN - LIOPT = LIWMIN - END IF - WORK( 1 ) = LOPT - RWORK( 1 ) = LROPT - IWORK( 1 ) = LIOPT -* - IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN - INFO = -8 - ELSE IF( LRWORK.LT.LRWMIN .AND. .NOT.LQUERY ) THEN - INFO = -10 - ELSE IF( LIWORK.LT.LIWMIN .AND. .NOT.LQUERY ) THEN - INFO = -12 - END IF - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZHEEVD', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( N.EQ.1 ) THEN - W( 1 ) = DBLE( A( 1, 1 ) ) - IF( WANTZ ) - $ A( 1, 1 ) = CONE - RETURN - END IF -* -* Get machine constants. -* - SAFMIN = DLAMCH( 'Safe minimum' ) - EPS = DLAMCH( 'Precision' ) - SMLNUM = SAFMIN / EPS - BIGNUM = ONE / SMLNUM - RMIN = SQRT( SMLNUM ) - RMAX = SQRT( BIGNUM ) -* -* Scale matrix to allowable range, if necessary. -* - ANRM = ZLANHE( 'M', UPLO, N, A, LDA, RWORK ) - ISCALE = 0 - IF( ANRM.GT.ZERO .AND. ANRM.LT.RMIN ) THEN - ISCALE = 1 - SIGMA = RMIN / ANRM - ELSE IF( ANRM.GT.RMAX ) THEN - ISCALE = 1 - SIGMA = RMAX / ANRM - END IF - IF( ISCALE.EQ.1 ) - $ CALL ZLASCL( UPLO, 0, 0, ONE, SIGMA, N, N, A, LDA, INFO ) -* -* Call ZHETRD to reduce Hermitian matrix to tridiagonal form. -* - INDE = 1 - INDTAU = 1 - INDWRK = INDTAU + N - INDRWK = INDE + N - INDWK2 = INDWRK + N*N - LLWORK = LWORK - INDWRK + 1 - LLWRK2 = LWORK - INDWK2 + 1 - LLRWK = LRWORK - INDRWK + 1 - CALL ZHETRD( UPLO, N, A, LDA, W, RWORK( INDE ), WORK( INDTAU ), - $ WORK( INDWRK ), LLWORK, IINFO ) -* -* For eigenvalues only, call DSTERF. For eigenvectors, first call -* ZSTEDC to generate the eigenvector matrix, WORK(INDWRK), of the -* tridiagonal matrix, then call ZUNMTR to multiply it to the -* Householder transformations represented as Householder vectors in -* A. -* - IF( .NOT.WANTZ ) THEN - CALL DSTERF( N, W, RWORK( INDE ), INFO ) - ELSE - CALL ZSTEDC( 'I', N, W, RWORK( INDE ), WORK( INDWRK ), N, - $ WORK( INDWK2 ), LLWRK2, RWORK( INDRWK ), LLRWK, - $ IWORK, LIWORK, INFO ) - CALL ZUNMTR( 'L', UPLO, 'N', N, N, A, LDA, WORK( INDTAU ), - $ WORK( INDWRK ), N, WORK( INDWK2 ), LLWRK2, IINFO ) - CALL ZLACPY( 'A', N, N, WORK( INDWRK ), N, A, LDA ) - END IF -* -* If matrix was scaled, then rescale eigenvalues appropriately. -* - IF( ISCALE.EQ.1 ) THEN - IF( INFO.EQ.0 ) THEN - IMAX = N - ELSE - IMAX = INFO - 1 - END IF - CALL DSCAL( IMAX, ONE / SIGMA, W, 1 ) - END IF -* - WORK( 1 ) = LOPT - RWORK( 1 ) = LROPT - IWORK( 1 ) = LIOPT -* - RETURN -* -* End of ZHEEVD -* - END diff --git a/lib/linalg/fortran/zhemv.f b/lib/linalg/fortran/zhemv.f deleted file mode 100644 index dad68bf25b..0000000000 --- a/lib/linalg/fortran/zhemv.f +++ /dev/null @@ -1,334 +0,0 @@ -*> \brief \b ZHEMV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZHEMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) -* -* .. Scalar Arguments .. -* COMPLEX*16 ALPHA,BETA -* INTEGER INCX,INCY,LDA,N -* CHARACTER UPLO -* .. -* .. Array Arguments .. -* COMPLEX*16 A(LDA,*),X(*),Y(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZHEMV performs the matrix-vector operation -*> -*> y := alpha*A*x + beta*y, -*> -*> where alpha and beta are scalars, x and y are n element vectors and -*> A is an n by n hermitian matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the upper or lower -*> triangular part of the array A is to be referenced as -*> follows: -*> -*> UPLO = 'U' or 'u' Only the upper triangular part of A -*> is to be referenced. -*> -*> UPLO = 'L' or 'l' Only the lower triangular part of A -*> is to be referenced. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is COMPLEX*16 -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension ( LDA, N ) -*> Before entry with UPLO = 'U' or 'u', the leading n by n -*> upper triangular part of the array A must contain the upper -*> triangular part of the hermitian matrix and the strictly -*> lower triangular part of A is not referenced. -*> Before entry with UPLO = 'L' or 'l', the leading n by n -*> lower triangular part of the array A must contain the lower -*> triangular part of the hermitian matrix and the strictly -*> upper triangular part of A is not referenced. -*> Note that the imaginary parts of the diagonal elements need -*> not be set and are assumed to be zero. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. LDA must be at least -*> max( 1, n ). -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is COMPLEX*16 array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCX ) ). -*> Before entry, the incremented array X must contain the n -*> element vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is COMPLEX*16 -*> On entry, BETA specifies the scalar beta. When BETA is -*> supplied as zero then Y need not be set on input. -*> \endverbatim -*> -*> \param[in,out] Y -*> \verbatim -*> Y is COMPLEX*16 array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCY ) ). -*> Before entry, the incremented array Y must contain the n -*> element vector y. On exit, Y is overwritten by the updated -*> vector y. -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> On entry, INCY specifies the increment for the elements of -*> Y. INCY must not be zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> The vector and matrix arguments are not referenced when N = 0, or M = 0 -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZHEMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - COMPLEX*16 ALPHA,BETA - INTEGER INCX,INCY,LDA,N - CHARACTER UPLO -* .. -* .. Array Arguments .. - COMPLEX*16 A(LDA,*),X(*),Y(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE - PARAMETER (ONE= (1.0D+0,0.0D+0)) - COMPLEX*16 ZERO - PARAMETER (ZERO= (0.0D+0,0.0D+0)) -* .. -* .. Local Scalars .. - COMPLEX*16 TEMP1,TEMP2 - INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE,DCONJG,MAX -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (N.LT.0) THEN - INFO = 2 - ELSE IF (LDA.LT.MAX(1,N)) THEN - INFO = 5 - ELSE IF (INCX.EQ.0) THEN - INFO = 7 - ELSE IF (INCY.EQ.0) THEN - INFO = 10 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('ZHEMV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN -* -* Set up the start points in X and Y. -* - IF (INCX.GT.0) THEN - KX = 1 - ELSE - KX = 1 - (N-1)*INCX - END IF - IF (INCY.GT.0) THEN - KY = 1 - ELSE - KY = 1 - (N-1)*INCY - END IF -* -* Start the operations. In this version the elements of A are -* accessed sequentially with one pass through the triangular part -* of A. -* -* First form y := beta*y. -* - IF (BETA.NE.ONE) THEN - IF (INCY.EQ.1) THEN - IF (BETA.EQ.ZERO) THEN - DO 10 I = 1,N - Y(I) = ZERO - 10 CONTINUE - ELSE - DO 20 I = 1,N - Y(I) = BETA*Y(I) - 20 CONTINUE - END IF - ELSE - IY = KY - IF (BETA.EQ.ZERO) THEN - DO 30 I = 1,N - Y(IY) = ZERO - IY = IY + INCY - 30 CONTINUE - ELSE - DO 40 I = 1,N - Y(IY) = BETA*Y(IY) - IY = IY + INCY - 40 CONTINUE - END IF - END IF - END IF - IF (ALPHA.EQ.ZERO) RETURN - IF (LSAME(UPLO,'U')) THEN -* -* Form y when A is stored in upper triangle. -* - IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN - DO 60 J = 1,N - TEMP1 = ALPHA*X(J) - TEMP2 = ZERO - DO 50 I = 1,J - 1 - Y(I) = Y(I) + TEMP1*A(I,J) - TEMP2 = TEMP2 + DCONJG(A(I,J))*X(I) - 50 CONTINUE - Y(J) = Y(J) + TEMP1*DBLE(A(J,J)) + ALPHA*TEMP2 - 60 CONTINUE - ELSE - JX = KX - JY = KY - DO 80 J = 1,N - TEMP1 = ALPHA*X(JX) - TEMP2 = ZERO - IX = KX - IY = KY - DO 70 I = 1,J - 1 - Y(IY) = Y(IY) + TEMP1*A(I,J) - TEMP2 = TEMP2 + DCONJG(A(I,J))*X(IX) - IX = IX + INCX - IY = IY + INCY - 70 CONTINUE - Y(JY) = Y(JY) + TEMP1*DBLE(A(J,J)) + ALPHA*TEMP2 - JX = JX + INCX - JY = JY + INCY - 80 CONTINUE - END IF - ELSE -* -* Form y when A is stored in lower triangle. -* - IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN - DO 100 J = 1,N - TEMP1 = ALPHA*X(J) - TEMP2 = ZERO - Y(J) = Y(J) + TEMP1*DBLE(A(J,J)) - DO 90 I = J + 1,N - Y(I) = Y(I) + TEMP1*A(I,J) - TEMP2 = TEMP2 + DCONJG(A(I,J))*X(I) - 90 CONTINUE - Y(J) = Y(J) + ALPHA*TEMP2 - 100 CONTINUE - ELSE - JX = KX - JY = KY - DO 120 J = 1,N - TEMP1 = ALPHA*X(JX) - TEMP2 = ZERO - Y(JY) = Y(JY) + TEMP1*DBLE(A(J,J)) - IX = JX - IY = JY - DO 110 I = J + 1,N - IX = IX + INCX - IY = IY + INCY - Y(IY) = Y(IY) + TEMP1*A(I,J) - TEMP2 = TEMP2 + DCONJG(A(I,J))*X(IX) - 110 CONTINUE - Y(JY) = Y(JY) + ALPHA*TEMP2 - JX = JX + INCX - JY = JY + INCY - 120 CONTINUE - END IF - END IF -* - RETURN -* -* End of ZHEMV -* - END diff --git a/lib/linalg/fortran/zher2.f b/lib/linalg/fortran/zher2.f deleted file mode 100644 index d1f2b57ec4..0000000000 --- a/lib/linalg/fortran/zher2.f +++ /dev/null @@ -1,314 +0,0 @@ -*> \brief \b ZHER2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZHER2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) -* -* .. Scalar Arguments .. -* COMPLEX*16 ALPHA -* INTEGER INCX,INCY,LDA,N -* CHARACTER UPLO -* .. -* .. Array Arguments .. -* COMPLEX*16 A(LDA,*),X(*),Y(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZHER2 performs the hermitian rank 2 operation -*> -*> A := alpha*x*y**H + conjg( alpha )*y*x**H + A, -*> -*> where alpha is a scalar, x and y are n element vectors and A is an n -*> by n hermitian matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the upper or lower -*> triangular part of the array A is to be referenced as -*> follows: -*> -*> UPLO = 'U' or 'u' Only the upper triangular part of A -*> is to be referenced. -*> -*> UPLO = 'L' or 'l' Only the lower triangular part of A -*> is to be referenced. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is COMPLEX*16 -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is COMPLEX*16 array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCX ) ). -*> Before entry, the incremented array X must contain the n -*> element vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is COMPLEX*16 array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCY ) ). -*> Before entry, the incremented array Y must contain the n -*> element vector y. -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> On entry, INCY specifies the increment for the elements of -*> Y. INCY must not be zero. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension ( LDA, N ) -*> Before entry with UPLO = 'U' or 'u', the leading n by n -*> upper triangular part of the array A must contain the upper -*> triangular part of the hermitian matrix and the strictly -*> lower triangular part of A is not referenced. On exit, the -*> upper triangular part of the array A is overwritten by the -*> upper triangular part of the updated matrix. -*> Before entry with UPLO = 'L' or 'l', the leading n by n -*> lower triangular part of the array A must contain the lower -*> triangular part of the hermitian matrix and the strictly -*> upper triangular part of A is not referenced. On exit, the -*> lower triangular part of the array A is overwritten by the -*> lower triangular part of the updated matrix. -*> Note that the imaginary parts of the diagonal elements need -*> not be set, they are assumed to be zero, and on exit they -*> are set to zero. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. LDA must be at least -*> max( 1, n ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZHER2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - COMPLEX*16 ALPHA - INTEGER INCX,INCY,LDA,N - CHARACTER UPLO -* .. -* .. Array Arguments .. - COMPLEX*16 A(LDA,*),X(*),Y(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER (ZERO= (0.0D+0,0.0D+0)) -* .. -* .. Local Scalars .. - COMPLEX*16 TEMP1,TEMP2 - INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE,DCONJG,MAX -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (N.LT.0) THEN - INFO = 2 - ELSE IF (INCX.EQ.0) THEN - INFO = 5 - ELSE IF (INCY.EQ.0) THEN - INFO = 7 - ELSE IF (LDA.LT.MAX(1,N)) THEN - INFO = 9 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('ZHER2 ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN -* -* Set up the start points in X and Y if the increments are not both -* unity. -* - IF ((INCX.NE.1) .OR. (INCY.NE.1)) THEN - IF (INCX.GT.0) THEN - KX = 1 - ELSE - KX = 1 - (N-1)*INCX - END IF - IF (INCY.GT.0) THEN - KY = 1 - ELSE - KY = 1 - (N-1)*INCY - END IF - JX = KX - JY = KY - END IF -* -* Start the operations. In this version the elements of A are -* accessed sequentially with one pass through the triangular part -* of A. -* - IF (LSAME(UPLO,'U')) THEN -* -* Form A when A is stored in the upper triangle. -* - IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN - DO 20 J = 1,N - IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THEN - TEMP1 = ALPHA*DCONJG(Y(J)) - TEMP2 = DCONJG(ALPHA*X(J)) - DO 10 I = 1,J - 1 - A(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP2 - 10 CONTINUE - A(J,J) = DBLE(A(J,J)) + - + DBLE(X(J)*TEMP1+Y(J)*TEMP2) - ELSE - A(J,J) = DBLE(A(J,J)) - END IF - 20 CONTINUE - ELSE - DO 40 J = 1,N - IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THEN - TEMP1 = ALPHA*DCONJG(Y(JY)) - TEMP2 = DCONJG(ALPHA*X(JX)) - IX = KX - IY = KY - DO 30 I = 1,J - 1 - A(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2 - IX = IX + INCX - IY = IY + INCY - 30 CONTINUE - A(J,J) = DBLE(A(J,J)) + - + DBLE(X(JX)*TEMP1+Y(JY)*TEMP2) - ELSE - A(J,J) = DBLE(A(J,J)) - END IF - JX = JX + INCX - JY = JY + INCY - 40 CONTINUE - END IF - ELSE -* -* Form A when A is stored in the lower triangle. -* - IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THEN - DO 60 J = 1,N - IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THEN - TEMP1 = ALPHA*DCONJG(Y(J)) - TEMP2 = DCONJG(ALPHA*X(J)) - A(J,J) = DBLE(A(J,J)) + - + DBLE(X(J)*TEMP1+Y(J)*TEMP2) - DO 50 I = J + 1,N - A(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP2 - 50 CONTINUE - ELSE - A(J,J) = DBLE(A(J,J)) - END IF - 60 CONTINUE - ELSE - DO 80 J = 1,N - IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THEN - TEMP1 = ALPHA*DCONJG(Y(JY)) - TEMP2 = DCONJG(ALPHA*X(JX)) - A(J,J) = DBLE(A(J,J)) + - + DBLE(X(JX)*TEMP1+Y(JY)*TEMP2) - IX = JX - IY = JY - DO 70 I = J + 1,N - IX = IX + INCX - IY = IY + INCY - A(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2 - 70 CONTINUE - ELSE - A(J,J) = DBLE(A(J,J)) - END IF - JX = JX + INCX - JY = JY + INCY - 80 CONTINUE - END IF - END IF -* - RETURN -* -* End of ZHER2 -* - END diff --git a/lib/linalg/fortran/zher2k.f b/lib/linalg/fortran/zher2k.f deleted file mode 100644 index 5c75083cd5..0000000000 --- a/lib/linalg/fortran/zher2k.f +++ /dev/null @@ -1,440 +0,0 @@ -*> \brief \b ZHER2K -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZHER2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) -* -* .. Scalar Arguments .. -* COMPLEX*16 ALPHA -* DOUBLE PRECISION BETA -* INTEGER K,LDA,LDB,LDC,N -* CHARACTER TRANS,UPLO -* .. -* .. Array Arguments .. -* COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZHER2K performs one of the hermitian rank 2k operations -*> -*> C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C, -*> -*> or -*> -*> C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C, -*> -*> where alpha and beta are scalars with beta real, C is an n by n -*> hermitian matrix and A and B are n by k matrices in the first case -*> and k by n matrices in the second case. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the upper or lower -*> triangular part of the array C is to be referenced as -*> follows: -*> -*> UPLO = 'U' or 'u' Only the upper triangular part of C -*> is to be referenced. -*> -*> UPLO = 'L' or 'l' Only the lower triangular part of C -*> is to be referenced. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> On entry, TRANS specifies the operation to be performed as -*> follows: -*> -*> TRANS = 'N' or 'n' C := alpha*A*B**H + -*> conjg( alpha )*B*A**H + -*> beta*C. -*> -*> TRANS = 'C' or 'c' C := alpha*A**H*B + -*> conjg( alpha )*B**H*A + -*> beta*C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix C. N must be -*> at least zero. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> On entry with TRANS = 'N' or 'n', K specifies the number -*> of columns of the matrices A and B, and on entry with -*> TRANS = 'C' or 'c', K specifies the number of rows of the -*> matrices A and B. K must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is COMPLEX*16 . -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension ( LDA, ka ), where ka is -*> k when TRANS = 'N' or 'n', and is n otherwise. -*> Before entry with TRANS = 'N' or 'n', the leading n by k -*> part of the array A must contain the matrix A, otherwise -*> the leading k by n part of the array A must contain the -*> matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. When TRANS = 'N' or 'n' -*> then LDA must be at least max( 1, n ), otherwise LDA must -*> be at least max( 1, k ). -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is COMPLEX*16 array, dimension ( LDB, kb ), where kb is -*> k when TRANS = 'N' or 'n', and is n otherwise. -*> Before entry with TRANS = 'N' or 'n', the leading n by k -*> part of the array B must contain the matrix B, otherwise -*> the leading k by n part of the array B must contain the -*> matrix B. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> On entry, LDB specifies the first dimension of B as declared -*> in the calling (sub) program. When TRANS = 'N' or 'n' -*> then LDB must be at least max( 1, n ), otherwise LDB must -*> be at least max( 1, k ). -*> Unchanged on exit. -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is DOUBLE PRECISION . -*> On entry, BETA specifies the scalar beta. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension ( LDC, N ) -*> Before entry with UPLO = 'U' or 'u', the leading n by n -*> upper triangular part of the array C must contain the upper -*> triangular part of the hermitian matrix and the strictly -*> lower triangular part of C is not referenced. On exit, the -*> upper triangular part of the array C is overwritten by the -*> upper triangular part of the updated matrix. -*> Before entry with UPLO = 'L' or 'l', the leading n by n -*> lower triangular part of the array C must contain the lower -*> triangular part of the hermitian matrix and the strictly -*> upper triangular part of C is not referenced. On exit, the -*> lower triangular part of the array C is overwritten by the -*> lower triangular part of the updated matrix. -*> Note that the imaginary parts of the diagonal elements need -*> not be set, they are assumed to be zero, and on exit they -*> are set to zero. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> On entry, LDC specifies the first dimension of C as declared -*> in the calling (sub) program. LDC must be at least -*> max( 1, n ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level3 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 3 Blas routine. -*> -*> -- Written on 8-February-1989. -*> Jack Dongarra, Argonne National Laboratory. -*> Iain Duff, AERE Harwell. -*> Jeremy Du Croz, Numerical Algorithms Group Ltd. -*> Sven Hammarling, Numerical Algorithms Group Ltd. -*> -*> -- Modified 8-Nov-93 to set C(J,J) to DBLE( C(J,J) ) when BETA = 1. -*> Ed Anderson, Cray Research Inc. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZHER2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC) -* -* -- Reference BLAS level3 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - COMPLEX*16 ALPHA - DOUBLE PRECISION BETA - INTEGER K,LDA,LDB,LDC,N - CHARACTER TRANS,UPLO -* .. -* .. Array Arguments .. - COMPLEX*16 A(LDA,*),B(LDB,*),C(LDC,*) -* .. -* -* ===================================================================== -* -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE,DCONJG,MAX -* .. -* .. Local Scalars .. - COMPLEX*16 TEMP1,TEMP2 - INTEGER I,INFO,J,L,NROWA - LOGICAL UPPER -* .. -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER (ONE=1.0D+0) - COMPLEX*16 ZERO - PARAMETER (ZERO= (0.0D+0,0.0D+0)) -* .. -* -* Test the input parameters. -* - IF (LSAME(TRANS,'N')) THEN - NROWA = N - ELSE - NROWA = K - END IF - UPPER = LSAME(UPLO,'U') -* - INFO = 0 - IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN - INFO = 1 - ELSE IF ((.NOT.LSAME(TRANS,'N')) .AND. - + (.NOT.LSAME(TRANS,'C'))) THEN - INFO = 2 - ELSE IF (N.LT.0) THEN - INFO = 3 - ELSE IF (K.LT.0) THEN - INFO = 4 - ELSE IF (LDA.LT.MAX(1,NROWA)) THEN - INFO = 7 - ELSE IF (LDB.LT.MAX(1,NROWA)) THEN - INFO = 9 - ELSE IF (LDC.LT.MAX(1,N)) THEN - INFO = 12 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('ZHER2K',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR. - + (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN -* -* And when alpha.eq.zero. -* - IF (ALPHA.EQ.ZERO) THEN - IF (UPPER) THEN - IF (BETA.EQ.DBLE(ZERO)) THEN - DO 20 J = 1,N - DO 10 I = 1,J - C(I,J) = ZERO - 10 CONTINUE - 20 CONTINUE - ELSE - DO 40 J = 1,N - DO 30 I = 1,J - 1 - C(I,J) = BETA*C(I,J) - 30 CONTINUE - C(J,J) = BETA*DBLE(C(J,J)) - 40 CONTINUE - END IF - ELSE - IF (BETA.EQ.DBLE(ZERO)) THEN - DO 60 J = 1,N - DO 50 I = J,N - C(I,J) = ZERO - 50 CONTINUE - 60 CONTINUE - ELSE - DO 80 J = 1,N - C(J,J) = BETA*DBLE(C(J,J)) - DO 70 I = J + 1,N - C(I,J) = BETA*C(I,J) - 70 CONTINUE - 80 CONTINUE - END IF - END IF - RETURN - END IF -* -* Start the operations. -* - IF (LSAME(TRANS,'N')) THEN -* -* Form C := alpha*A*B**H + conjg( alpha )*B*A**H + -* C. -* - IF (UPPER) THEN - DO 130 J = 1,N - IF (BETA.EQ.DBLE(ZERO)) THEN - DO 90 I = 1,J - C(I,J) = ZERO - 90 CONTINUE - ELSE IF (BETA.NE.ONE) THEN - DO 100 I = 1,J - 1 - C(I,J) = BETA*C(I,J) - 100 CONTINUE - C(J,J) = BETA*DBLE(C(J,J)) - ELSE - C(J,J) = DBLE(C(J,J)) - END IF - DO 120 L = 1,K - IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN - TEMP1 = ALPHA*DCONJG(B(J,L)) - TEMP2 = DCONJG(ALPHA*A(J,L)) - DO 110 I = 1,J - 1 - C(I,J) = C(I,J) + A(I,L)*TEMP1 + - + B(I,L)*TEMP2 - 110 CONTINUE - C(J,J) = DBLE(C(J,J)) + - + DBLE(A(J,L)*TEMP1+B(J,L)*TEMP2) - END IF - 120 CONTINUE - 130 CONTINUE - ELSE - DO 180 J = 1,N - IF (BETA.EQ.DBLE(ZERO)) THEN - DO 140 I = J,N - C(I,J) = ZERO - 140 CONTINUE - ELSE IF (BETA.NE.ONE) THEN - DO 150 I = J + 1,N - C(I,J) = BETA*C(I,J) - 150 CONTINUE - C(J,J) = BETA*DBLE(C(J,J)) - ELSE - C(J,J) = DBLE(C(J,J)) - END IF - DO 170 L = 1,K - IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THEN - TEMP1 = ALPHA*DCONJG(B(J,L)) - TEMP2 = DCONJG(ALPHA*A(J,L)) - DO 160 I = J + 1,N - C(I,J) = C(I,J) + A(I,L)*TEMP1 + - + B(I,L)*TEMP2 - 160 CONTINUE - C(J,J) = DBLE(C(J,J)) + - + DBLE(A(J,L)*TEMP1+B(J,L)*TEMP2) - END IF - 170 CONTINUE - 180 CONTINUE - END IF - ELSE -* -* Form C := alpha*A**H*B + conjg( alpha )*B**H*A + -* C. -* - IF (UPPER) THEN - DO 210 J = 1,N - DO 200 I = 1,J - TEMP1 = ZERO - TEMP2 = ZERO - DO 190 L = 1,K - TEMP1 = TEMP1 + DCONJG(A(L,I))*B(L,J) - TEMP2 = TEMP2 + DCONJG(B(L,I))*A(L,J) - 190 CONTINUE - IF (I.EQ.J) THEN - IF (BETA.EQ.DBLE(ZERO)) THEN - C(J,J) = DBLE(ALPHA*TEMP1+ - + DCONJG(ALPHA)*TEMP2) - ELSE - C(J,J) = BETA*DBLE(C(J,J)) + - + DBLE(ALPHA*TEMP1+ - + DCONJG(ALPHA)*TEMP2) - END IF - ELSE - IF (BETA.EQ.DBLE(ZERO)) THEN - C(I,J) = ALPHA*TEMP1 + DCONJG(ALPHA)*TEMP2 - ELSE - C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 + - + DCONJG(ALPHA)*TEMP2 - END IF - END IF - 200 CONTINUE - 210 CONTINUE - ELSE - DO 240 J = 1,N - DO 230 I = J,N - TEMP1 = ZERO - TEMP2 = ZERO - DO 220 L = 1,K - TEMP1 = TEMP1 + DCONJG(A(L,I))*B(L,J) - TEMP2 = TEMP2 + DCONJG(B(L,I))*A(L,J) - 220 CONTINUE - IF (I.EQ.J) THEN - IF (BETA.EQ.DBLE(ZERO)) THEN - C(J,J) = DBLE(ALPHA*TEMP1+ - + DCONJG(ALPHA)*TEMP2) - ELSE - C(J,J) = BETA*DBLE(C(J,J)) + - + DBLE(ALPHA*TEMP1+ - + DCONJG(ALPHA)*TEMP2) - END IF - ELSE - IF (BETA.EQ.DBLE(ZERO)) THEN - C(I,J) = ALPHA*TEMP1 + DCONJG(ALPHA)*TEMP2 - ELSE - C(I,J) = BETA*C(I,J) + ALPHA*TEMP1 + - + DCONJG(ALPHA)*TEMP2 - END IF - END IF - 230 CONTINUE - 240 CONTINUE - END IF - END IF -* - RETURN -* -* End of ZHER2K -* - END diff --git a/lib/linalg/fortran/zhetd2.f b/lib/linalg/fortran/zhetd2.f deleted file mode 100644 index a6d900b7c7..0000000000 --- a/lib/linalg/fortran/zhetd2.f +++ /dev/null @@ -1,331 +0,0 @@ -*> \brief \b ZHETD2 reduces a Hermitian matrix to real symmetric tridiagonal form by an unitary similarity transformation (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZHETD2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZHETD2( UPLO, N, A, LDA, D, E, TAU, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( * ), E( * ) -* COMPLEX*16 A( LDA, * ), TAU( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZHETD2 reduces a complex Hermitian matrix A to real symmetric -*> tridiagonal form T by a unitary similarity transformation: -*> Q**H * A * Q = T. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies whether the upper or lower triangular part of the -*> Hermitian matrix A is stored: -*> = 'U': Upper triangular -*> = 'L': Lower triangular -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> On entry, the Hermitian matrix A. If UPLO = 'U', the leading -*> n-by-n upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading n-by-n lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> On exit, if UPLO = 'U', the diagonal and first superdiagonal -*> of A are overwritten by the corresponding elements of the -*> tridiagonal matrix T, and the elements above the first -*> superdiagonal, with the array TAU, represent the unitary -*> matrix Q as a product of elementary reflectors; if UPLO -*> = 'L', the diagonal and first subdiagonal of A are over- -*> written by the corresponding elements of the tridiagonal -*> matrix T, and the elements below the first subdiagonal, with -*> the array TAU, represent the unitary matrix Q as a product -*> of elementary reflectors. See Further Details. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> The diagonal elements of the tridiagonal matrix T: -*> D(i) = A(i,i). -*> \endverbatim -*> -*> \param[out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> The off-diagonal elements of the tridiagonal matrix T: -*> E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (N-1) -*> The scalar factors of the elementary reflectors (see Further -*> Details). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16HEcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> If UPLO = 'U', the matrix Q is represented as a product of elementary -*> reflectors -*> -*> Q = H(n-1) . . . H(2) H(1). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**H -*> -*> where tau is a complex scalar, and v is a complex vector with -*> v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in -*> A(1:i-1,i+1), and tau in TAU(i). -*> -*> If UPLO = 'L', the matrix Q is represented as a product of elementary -*> reflectors -*> -*> Q = H(1) H(2) . . . H(n-1). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**H -*> -*> where tau is a complex scalar, and v is a complex vector with -*> v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), -*> and tau in TAU(i). -*> -*> The contents of A on exit are illustrated by the following examples -*> with n = 5: -*> -*> if UPLO = 'U': if UPLO = 'L': -*> -*> ( d e v2 v3 v4 ) ( d ) -*> ( d e v3 v4 ) ( e d ) -*> ( d e v4 ) ( v1 e d ) -*> ( d e ) ( v1 v2 e d ) -*> ( d ) ( v1 v2 v3 e d ) -*> -*> where d and e denote diagonal and off-diagonal elements of T, and vi -*> denotes an element of the vector defining H(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZHETD2( UPLO, N, A, LDA, D, E, TAU, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( * ), E( * ) - COMPLEX*16 A( LDA, * ), TAU( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE, ZERO, HALF - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), - $ ZERO = ( 0.0D+0, 0.0D+0 ), - $ HALF = ( 0.5D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL UPPER - INTEGER I - COMPLEX*16 ALPHA, TAUI -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZAXPY, ZHEMV, ZHER2, ZLARFG -* .. -* .. External Functions .. - LOGICAL LSAME - COMPLEX*16 ZDOTC - EXTERNAL LSAME, ZDOTC -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters -* - INFO = 0 - UPPER = LSAME( UPLO, 'U') - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -4 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZHETD2', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.LE.0 ) - $ RETURN -* - IF( UPPER ) THEN -* -* Reduce the upper triangle of A -* - A( N, N ) = DBLE( A( N, N ) ) - DO 10 I = N - 1, 1, -1 -* -* Generate elementary reflector H(i) = I - tau * v * v**H -* to annihilate A(1:i-1,i+1) -* - ALPHA = A( I, I+1 ) - CALL ZLARFG( I, ALPHA, A( 1, I+1 ), 1, TAUI ) - E( I ) = DBLE( ALPHA ) -* - IF( TAUI.NE.ZERO ) THEN -* -* Apply H(i) from both sides to A(1:i,1:i) -* - A( I, I+1 ) = ONE -* -* Compute x := tau * A * v storing x in TAU(1:i) -* - CALL ZHEMV( UPLO, I, TAUI, A, LDA, A( 1, I+1 ), 1, ZERO, - $ TAU, 1 ) -* -* Compute w := x - 1/2 * tau * (x**H * v) * v -* - ALPHA = -HALF*TAUI*ZDOTC( I, TAU, 1, A( 1, I+1 ), 1 ) - CALL ZAXPY( I, ALPHA, A( 1, I+1 ), 1, TAU, 1 ) -* -* Apply the transformation as a rank-2 update: -* A := A - v * w**H - w * v**H -* - CALL ZHER2( UPLO, I, -ONE, A( 1, I+1 ), 1, TAU, 1, A, - $ LDA ) -* - ELSE - A( I, I ) = DBLE( A( I, I ) ) - END IF - A( I, I+1 ) = E( I ) - D( I+1 ) = DBLE( A( I+1, I+1 ) ) - TAU( I ) = TAUI - 10 CONTINUE - D( 1 ) = DBLE( A( 1, 1 ) ) - ELSE -* -* Reduce the lower triangle of A -* - A( 1, 1 ) = DBLE( A( 1, 1 ) ) - DO 20 I = 1, N - 1 -* -* Generate elementary reflector H(i) = I - tau * v * v**H -* to annihilate A(i+2:n,i) -* - ALPHA = A( I+1, I ) - CALL ZLARFG( N-I, ALPHA, A( MIN( I+2, N ), I ), 1, TAUI ) - E( I ) = DBLE( ALPHA ) -* - IF( TAUI.NE.ZERO ) THEN -* -* Apply H(i) from both sides to A(i+1:n,i+1:n) -* - A( I+1, I ) = ONE -* -* Compute x := tau * A * v storing y in TAU(i:n-1) -* - CALL ZHEMV( UPLO, N-I, TAUI, A( I+1, I+1 ), LDA, - $ A( I+1, I ), 1, ZERO, TAU( I ), 1 ) -* -* Compute w := x - 1/2 * tau * (x**H * v) * v -* - ALPHA = -HALF*TAUI*ZDOTC( N-I, TAU( I ), 1, A( I+1, I ), - $ 1 ) - CALL ZAXPY( N-I, ALPHA, A( I+1, I ), 1, TAU( I ), 1 ) -* -* Apply the transformation as a rank-2 update: -* A := A - v * w**H - w * v**H -* - CALL ZHER2( UPLO, N-I, -ONE, A( I+1, I ), 1, TAU( I ), 1, - $ A( I+1, I+1 ), LDA ) -* - ELSE - A( I+1, I+1 ) = DBLE( A( I+1, I+1 ) ) - END IF - A( I+1, I ) = E( I ) - D( I ) = DBLE( A( I, I ) ) - TAU( I ) = TAUI - 20 CONTINUE - D( N ) = DBLE( A( N, N ) ) - END IF -* - RETURN -* -* End of ZHETD2 -* - END diff --git a/lib/linalg/fortran/zhetrd.f b/lib/linalg/fortran/zhetrd.f deleted file mode 100644 index 5b7d6546cc..0000000000 --- a/lib/linalg/fortran/zhetrd.f +++ /dev/null @@ -1,375 +0,0 @@ -*> \brief \b ZHETRD -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZHETRD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZHETRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( * ), E( * ) -* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZHETRD reduces a complex Hermitian matrix A to real symmetric -*> tridiagonal form T by a unitary similarity transformation: -*> Q**H * A * Q = T. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored; -*> = 'L': Lower triangle of A is stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> On entry, the Hermitian matrix A. If UPLO = 'U', the leading -*> N-by-N upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading N-by-N lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> On exit, if UPLO = 'U', the diagonal and first superdiagonal -*> of A are overwritten by the corresponding elements of the -*> tridiagonal matrix T, and the elements above the first -*> superdiagonal, with the array TAU, represent the unitary -*> matrix Q as a product of elementary reflectors; if UPLO -*> = 'L', the diagonal and first subdiagonal of A are over- -*> written by the corresponding elements of the tridiagonal -*> matrix T, and the elements below the first subdiagonal, with -*> the array TAU, represent the unitary matrix Q as a product -*> of elementary reflectors. See Further Details. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> The diagonal elements of the tridiagonal matrix T: -*> D(i) = A(i,i). -*> \endverbatim -*> -*> \param[out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> The off-diagonal elements of the tridiagonal matrix T: -*> E(i) = A(i,i+1) if UPLO = 'U', E(i) = A(i+1,i) if UPLO = 'L'. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (N-1) -*> The scalar factors of the elementary reflectors (see Further -*> Details). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= 1. -*> For optimum performance LWORK >= N*NB, where NB is the -*> optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16HEcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> If UPLO = 'U', the matrix Q is represented as a product of elementary -*> reflectors -*> -*> Q = H(n-1) . . . H(2) H(1). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**H -*> -*> where tau is a complex scalar, and v is a complex vector with -*> v(i+1:n) = 0 and v(i) = 1; v(1:i-1) is stored on exit in -*> A(1:i-1,i+1), and tau in TAU(i). -*> -*> If UPLO = 'L', the matrix Q is represented as a product of elementary -*> reflectors -*> -*> Q = H(1) H(2) . . . H(n-1). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**H -*> -*> where tau is a complex scalar, and v is a complex vector with -*> v(1:i) = 0 and v(i+1) = 1; v(i+2:n) is stored on exit in A(i+2:n,i), -*> and tau in TAU(i). -*> -*> The contents of A on exit are illustrated by the following examples -*> with n = 5: -*> -*> if UPLO = 'U': if UPLO = 'L': -*> -*> ( d e v2 v3 v4 ) ( d ) -*> ( d e v3 v4 ) ( e d ) -*> ( d e v4 ) ( v1 e d ) -*> ( d e ) ( v1 v2 e d ) -*> ( d ) ( v1 v2 v3 e d ) -*> -*> where d and e denote diagonal and off-diagonal elements of T, and vi -*> denotes an element of the vector defining H(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZHETRD( UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( * ), E( * ) - COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) - COMPLEX*16 CONE - PARAMETER ( CONE = ( 1.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY, UPPER - INTEGER I, IINFO, IWS, J, KK, LDWORK, LWKOPT, NB, - $ NBMIN, NX -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZHER2K, ZHETD2, ZLATRD -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. Executable Statements .. -* -* Test the input parameters -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - LQUERY = ( LWORK.EQ.-1 ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -4 - ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN - INFO = -9 - END IF -* - IF( INFO.EQ.0 ) THEN -* -* Determine the block size. -* - NB = ILAENV( 1, 'ZHETRD', UPLO, N, -1, -1, -1 ) - LWKOPT = N*NB - WORK( 1 ) = LWKOPT - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZHETRD', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - NX = N - IWS = 1 - IF( NB.GT.1 .AND. NB.LT.N ) THEN -* -* Determine when to cross over from blocked to unblocked code -* (last block is always handled by unblocked code). -* - NX = MAX( NB, ILAENV( 3, 'ZHETRD', UPLO, N, -1, -1, -1 ) ) - IF( NX.LT.N ) THEN -* -* Determine if workspace is large enough for blocked code. -* - LDWORK = N - IWS = LDWORK*NB - IF( LWORK.LT.IWS ) THEN -* -* Not enough workspace to use optimal NB: determine the -* minimum value of NB, and reduce NB or force use of -* unblocked code by setting NX = N. -* - NB = MAX( LWORK / LDWORK, 1 ) - NBMIN = ILAENV( 2, 'ZHETRD', UPLO, N, -1, -1, -1 ) - IF( NB.LT.NBMIN ) - $ NX = N - END IF - ELSE - NX = N - END IF - ELSE - NB = 1 - END IF -* - IF( UPPER ) THEN -* -* Reduce the upper triangle of A. -* Columns 1:kk are handled by the unblocked method. -* - KK = N - ( ( N-NX+NB-1 ) / NB )*NB - DO 20 I = N - NB + 1, KK + 1, -NB -* -* Reduce columns i:i+nb-1 to tridiagonal form and form the -* matrix W which is needed to update the unreduced part of -* the matrix -* - CALL ZLATRD( UPLO, I+NB-1, NB, A, LDA, E, TAU, WORK, - $ LDWORK ) -* -* Update the unreduced submatrix A(1:i-1,1:i-1), using an -* update of the form: A := A - V*W**H - W*V**H -* - CALL ZHER2K( UPLO, 'No transpose', I-1, NB, -CONE, - $ A( 1, I ), LDA, WORK, LDWORK, ONE, A, LDA ) -* -* Copy superdiagonal elements back into A, and diagonal -* elements into D -* - DO 10 J = I, I + NB - 1 - A( J-1, J ) = E( J-1 ) - D( J ) = DBLE( A( J, J ) ) - 10 CONTINUE - 20 CONTINUE -* -* Use unblocked code to reduce the last or only block -* - CALL ZHETD2( UPLO, KK, A, LDA, D, E, TAU, IINFO ) - ELSE -* -* Reduce the lower triangle of A -* - DO 40 I = 1, N - NX, NB -* -* Reduce columns i:i+nb-1 to tridiagonal form and form the -* matrix W which is needed to update the unreduced part of -* the matrix -* - CALL ZLATRD( UPLO, N-I+1, NB, A( I, I ), LDA, E( I ), - $ TAU( I ), WORK, LDWORK ) -* -* Update the unreduced submatrix A(i+nb:n,i+nb:n), using -* an update of the form: A := A - V*W**H - W*V**H -* - CALL ZHER2K( UPLO, 'No transpose', N-I-NB+1, NB, -CONE, - $ A( I+NB, I ), LDA, WORK( NB+1 ), LDWORK, ONE, - $ A( I+NB, I+NB ), LDA ) -* -* Copy subdiagonal elements back into A, and diagonal -* elements into D -* - DO 30 J = I, I + NB - 1 - A( J+1, J ) = E( J ) - D( J ) = DBLE( A( J, J ) ) - 30 CONTINUE - 40 CONTINUE -* -* Use unblocked code to reduce the last or only block -* - CALL ZHETD2( UPLO, N-I+1, A( I, I ), LDA, D( I ), E( I ), - $ TAU( I ), IINFO ) - END IF -* - WORK( 1 ) = LWKOPT - RETURN -* -* End of ZHETRD -* - END diff --git a/lib/linalg/fortran/zhpr.f b/lib/linalg/fortran/zhpr.f deleted file mode 100644 index 2ba5774a21..0000000000 --- a/lib/linalg/fortran/zhpr.f +++ /dev/null @@ -1,276 +0,0 @@ -*> \brief \b ZHPR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZHPR(UPLO,N,ALPHA,X,INCX,AP) -* -* .. Scalar Arguments .. -* DOUBLE PRECISION ALPHA -* INTEGER INCX,N -* CHARACTER UPLO -* .. -* .. Array Arguments .. -* COMPLEX*16 AP(*),X(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZHPR performs the hermitian rank 1 operation -*> -*> A := alpha*x*x**H + A, -*> -*> where alpha is a real scalar, x is an n element vector and A is an -*> n by n hermitian matrix, supplied in packed form. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the upper or lower -*> triangular part of the matrix A is supplied in the packed -*> array AP as follows: -*> -*> UPLO = 'U' or 'u' The upper triangular part of A is -*> supplied in AP. -*> -*> UPLO = 'L' or 'l' The lower triangular part of A is -*> supplied in AP. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is DOUBLE PRECISION. -*> On entry, ALPHA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is COMPLEX*16 array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCX ) ). -*> Before entry, the incremented array X must contain the n -*> element vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -*> -*> \param[in,out] AP -*> \verbatim -*> AP is COMPLEX*16 array, dimension at least -*> ( ( n*( n + 1 ) )/2 ). -*> Before entry with UPLO = 'U' or 'u', the array AP must -*> contain the upper triangular part of the hermitian matrix -*> packed sequentially, column by column, so that AP( 1 ) -*> contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 1, 2 ) -*> and a( 2, 2 ) respectively, and so on. On exit, the array -*> AP is overwritten by the upper triangular part of the -*> updated matrix. -*> Before entry with UPLO = 'L' or 'l', the array AP must -*> contain the lower triangular part of the hermitian matrix -*> packed sequentially, column by column, so that AP( 1 ) -*> contains a( 1, 1 ), AP( 2 ) and AP( 3 ) contain a( 2, 1 ) -*> and a( 3, 1 ) respectively, and so on. On exit, the array -*> AP is overwritten by the lower triangular part of the -*> updated matrix. -*> Note that the imaginary parts of the diagonal elements need -*> not be set, they are assumed to be zero, and on exit they -*> are set to zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZHPR(UPLO,N,ALPHA,X,INCX,AP) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - DOUBLE PRECISION ALPHA - INTEGER INCX,N - CHARACTER UPLO -* .. -* .. Array Arguments .. - COMPLEX*16 AP(*),X(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER (ZERO= (0.0D+0,0.0D+0)) -* .. -* .. Local Scalars .. - COMPLEX*16 TEMP - INTEGER I,INFO,IX,J,JX,K,KK,KX -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE,DCONJG -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (N.LT.0) THEN - INFO = 2 - ELSE IF (INCX.EQ.0) THEN - INFO = 5 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('ZHPR ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF ((N.EQ.0) .OR. (ALPHA.EQ.DBLE(ZERO))) RETURN -* -* Set the start point in X if the increment is not unity. -* - IF (INCX.LE.0) THEN - KX = 1 - (N-1)*INCX - ELSE IF (INCX.NE.1) THEN - KX = 1 - END IF -* -* Start the operations. In this version the elements of the array AP -* are accessed sequentially with one pass through AP. -* - KK = 1 - IF (LSAME(UPLO,'U')) THEN -* -* Form A when upper triangle is stored in AP. -* - IF (INCX.EQ.1) THEN - DO 20 J = 1,N - IF (X(J).NE.ZERO) THEN - TEMP = ALPHA*DCONJG(X(J)) - K = KK - DO 10 I = 1,J - 1 - AP(K) = AP(K) + X(I)*TEMP - K = K + 1 - 10 CONTINUE - AP(KK+J-1) = DBLE(AP(KK+J-1)) + DBLE(X(J)*TEMP) - ELSE - AP(KK+J-1) = DBLE(AP(KK+J-1)) - END IF - KK = KK + J - 20 CONTINUE - ELSE - JX = KX - DO 40 J = 1,N - IF (X(JX).NE.ZERO) THEN - TEMP = ALPHA*DCONJG(X(JX)) - IX = KX - DO 30 K = KK,KK + J - 2 - AP(K) = AP(K) + X(IX)*TEMP - IX = IX + INCX - 30 CONTINUE - AP(KK+J-1) = DBLE(AP(KK+J-1)) + DBLE(X(JX)*TEMP) - ELSE - AP(KK+J-1) = DBLE(AP(KK+J-1)) - END IF - JX = JX + INCX - KK = KK + J - 40 CONTINUE - END IF - ELSE -* -* Form A when lower triangle is stored in AP. -* - IF (INCX.EQ.1) THEN - DO 60 J = 1,N - IF (X(J).NE.ZERO) THEN - TEMP = ALPHA*DCONJG(X(J)) - AP(KK) = DBLE(AP(KK)) + DBLE(TEMP*X(J)) - K = KK + 1 - DO 50 I = J + 1,N - AP(K) = AP(K) + X(I)*TEMP - K = K + 1 - 50 CONTINUE - ELSE - AP(KK) = DBLE(AP(KK)) - END IF - KK = KK + N - J + 1 - 60 CONTINUE - ELSE - JX = KX - DO 80 J = 1,N - IF (X(JX).NE.ZERO) THEN - TEMP = ALPHA*DCONJG(X(JX)) - AP(KK) = DBLE(AP(KK)) + DBLE(TEMP*X(JX)) - IX = JX - DO 70 K = KK + 1,KK + N - J - IX = IX + INCX - AP(K) = AP(K) + X(IX)*TEMP - 70 CONTINUE - ELSE - AP(KK) = DBLE(AP(KK)) - END IF - JX = JX + INCX - KK = KK + N - J + 1 - 80 CONTINUE - END IF - END IF -* - RETURN -* -* End of ZHPR -* - END diff --git a/lib/linalg/fortran/zlacgv.f b/lib/linalg/fortran/zlacgv.f deleted file mode 100644 index dc935e08f4..0000000000 --- a/lib/linalg/fortran/zlacgv.f +++ /dev/null @@ -1,113 +0,0 @@ -*> \brief \b ZLACGV conjugates a complex vector. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLACGV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLACGV( N, X, INCX ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* .. -* .. Array Arguments .. -* COMPLEX*16 X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLACGV conjugates a complex vector of length N. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The length of the vector X. N >= 0. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX*16 array, dimension -*> (1+(N-1)*abs(INCX)) -*> On entry, the vector of length N to be conjugated. -*> On exit, X is overwritten with conjg(X). -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The spacing between successive elements of X. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLACGV( N, X, INCX ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX, N -* .. -* .. Array Arguments .. - COMPLEX*16 X( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, IOFF -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG -* .. -* .. Executable Statements .. -* - IF( INCX.EQ.1 ) THEN - DO 10 I = 1, N - X( I ) = DCONJG( X( I ) ) - 10 CONTINUE - ELSE - IOFF = 1 - IF( INCX.LT.0 ) - $ IOFF = 1 - ( N-1 )*INCX - DO 20 I = 1, N - X( IOFF ) = DCONJG( X( IOFF ) ) - IOFF = IOFF + INCX - 20 CONTINUE - END IF - RETURN -* -* End of ZLACGV -* - END diff --git a/lib/linalg/fortran/zlacpy.f b/lib/linalg/fortran/zlacpy.f deleted file mode 100644 index 06017509e0..0000000000 --- a/lib/linalg/fortran/zlacpy.f +++ /dev/null @@ -1,156 +0,0 @@ -*> \brief \b ZLACPY copies all or part of one two-dimensional array to another. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLACPY + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLACPY( UPLO, M, N, A, LDA, B, LDB ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER LDA, LDB, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ), B( LDB, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLACPY copies all or part of a two-dimensional matrix A to another -*> matrix B. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies the part of the matrix A to be copied to B. -*> = 'U': Upper triangular part -*> = 'L': Lower triangular part -*> Otherwise: All of the matrix A -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> The m by n matrix A. If UPLO = 'U', only the upper trapezium -*> is accessed; if UPLO = 'L', only the lower trapezium is -*> accessed. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] B -*> \verbatim -*> B is COMPLEX*16 array, dimension (LDB,N) -*> On exit, B = A in the locations specified by UPLO. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLACPY( UPLO, M, N, A, LDA, B, LDB ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER LDA, LDB, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ), B( LDB, * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, J -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Intrinsic Functions .. - INTRINSIC MIN -* .. -* .. Executable Statements .. -* - IF( LSAME( UPLO, 'U' ) ) THEN - DO 20 J = 1, N - DO 10 I = 1, MIN( J, M ) - B( I, J ) = A( I, J ) - 10 CONTINUE - 20 CONTINUE -* - ELSE IF( LSAME( UPLO, 'L' ) ) THEN - DO 40 J = 1, N - DO 30 I = J, M - B( I, J ) = A( I, J ) - 30 CONTINUE - 40 CONTINUE -* - ELSE - DO 60 J = 1, N - DO 50 I = 1, M - B( I, J ) = A( I, J ) - 50 CONTINUE - 60 CONTINUE - END IF -* - RETURN -* -* End of ZLACPY -* - END diff --git a/lib/linalg/fortran/zlacrm.f b/lib/linalg/fortran/zlacrm.f deleted file mode 100644 index ce8b9b02c5..0000000000 --- a/lib/linalg/fortran/zlacrm.f +++ /dev/null @@ -1,182 +0,0 @@ -*> \brief \b ZLACRM multiplies a complex matrix by a square real matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLACRM + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLACRM( M, N, A, LDA, B, LDB, C, LDC, RWORK ) -* -* .. Scalar Arguments .. -* INTEGER LDA, LDB, LDC, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION B( LDB, * ), RWORK( * ) -* COMPLEX*16 A( LDA, * ), C( LDC, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLACRM performs a very simple matrix-matrix multiplication: -*> C := A * B, -*> where A is M by N and complex; B is N by N and real; -*> C is M by N and complex. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A and of the matrix C. -*> M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns and rows of the matrix B and -*> the number of columns of the matrix C. -*> N >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA, N) -*> On entry, A contains the M by N matrix A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >=max(1,M). -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is DOUBLE PRECISION array, dimension (LDB, N) -*> On entry, B contains the N by N matrix B. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> The leading dimension of the array B. LDB >=max(1,N). -*> \endverbatim -*> -*> \param[out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension (LDC, N) -*> On exit, C contains the M by N matrix C. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >=max(1,N). -*> \endverbatim -*> -*> \param[out] RWORK -*> \verbatim -*> RWORK is DOUBLE PRECISION array, dimension (2*M*N) -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLACRM( M, N, A, LDA, B, LDB, C, LDC, RWORK ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER LDA, LDB, LDC, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION B( LDB, * ), RWORK( * ) - COMPLEX*16 A( LDA, * ), C( LDC, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D0, ZERO = 0.0D0 ) -* .. -* .. Local Scalars .. - INTEGER I, J, L -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, DCMPLX, DIMAG -* .. -* .. External Subroutines .. - EXTERNAL DGEMM -* .. -* .. Executable Statements .. -* -* Quick return if possible. -* - IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) ) - $ RETURN -* - DO 20 J = 1, N - DO 10 I = 1, M - RWORK( ( J-1 )*M+I ) = DBLE( A( I, J ) ) - 10 CONTINUE - 20 CONTINUE -* - L = M*N + 1 - CALL DGEMM( 'N', 'N', M, N, N, ONE, RWORK, M, B, LDB, ZERO, - $ RWORK( L ), M ) - DO 40 J = 1, N - DO 30 I = 1, M - C( I, J ) = RWORK( L+( J-1 )*M+I-1 ) - 30 CONTINUE - 40 CONTINUE -* - DO 60 J = 1, N - DO 50 I = 1, M - RWORK( ( J-1 )*M+I ) = DIMAG( A( I, J ) ) - 50 CONTINUE - 60 CONTINUE - CALL DGEMM( 'N', 'N', M, N, N, ONE, RWORK, M, B, LDB, ZERO, - $ RWORK( L ), M ) - DO 80 J = 1, N - DO 70 I = 1, M - C( I, J ) = DCMPLX( DBLE( C( I, J ) ), - $ RWORK( L+( J-1 )*M+I-1 ) ) - 70 CONTINUE - 80 CONTINUE -* - RETURN -* -* End of ZLACRM -* - END diff --git a/lib/linalg/fortran/zladiv.f b/lib/linalg/fortran/zladiv.f deleted file mode 100644 index ae111d73d6..0000000000 --- a/lib/linalg/fortran/zladiv.f +++ /dev/null @@ -1,94 +0,0 @@ -*> \brief \b ZLADIV performs complex division in real arithmetic, avoiding unnecessary overflow. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLADIV + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* COMPLEX*16 FUNCTION ZLADIV( X, Y ) -* -* .. Scalar Arguments .. -* COMPLEX*16 X, Y -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLADIV := X / Y, where X and Y are complex. The computation of X / Y -*> will not overflow on an intermediary step unless the results -*> overflows. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] X -*> \verbatim -*> X is COMPLEX*16 -*> \endverbatim -*> -*> \param[in] Y -*> \verbatim -*> Y is COMPLEX*16 -*> The complex scalars X and Y. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - COMPLEX*16 FUNCTION ZLADIV( X, Y ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - COMPLEX*16 X, Y -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - DOUBLE PRECISION ZI, ZR -* .. -* .. External Subroutines .. - EXTERNAL DLADIV -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, DCMPLX, DIMAG -* .. -* .. Executable Statements .. -* - CALL DLADIV( DBLE( X ), DIMAG( X ), DBLE( Y ), DIMAG( Y ), ZR, - $ ZI ) - ZLADIV = DCMPLX( ZR, ZI ) -* - RETURN -* -* End of ZLADIV -* - END diff --git a/lib/linalg/fortran/zlaed0.f b/lib/linalg/fortran/zlaed0.f deleted file mode 100644 index c4deac037a..0000000000 --- a/lib/linalg/fortran/zlaed0.f +++ /dev/null @@ -1,368 +0,0 @@ -*> \brief \b ZLAED0 used by ZSTEDC. Computes all eigenvalues and corresponding eigenvectors of an unreduced symmetric tridiagonal matrix using the divide and conquer method. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLAED0 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLAED0( QSIZ, N, D, E, Q, LDQ, QSTORE, LDQS, RWORK, -* IWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDQ, LDQS, N, QSIZ -* .. -* .. Array Arguments .. -* INTEGER IWORK( * ) -* DOUBLE PRECISION D( * ), E( * ), RWORK( * ) -* COMPLEX*16 Q( LDQ, * ), QSTORE( LDQS, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> Using the divide and conquer method, ZLAED0 computes all eigenvalues -*> of a symmetric tridiagonal matrix which is one diagonal block of -*> those from reducing a dense or band Hermitian matrix and -*> corresponding eigenvectors of the dense or band matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] QSIZ -*> \verbatim -*> QSIZ is INTEGER -*> The dimension of the unitary matrix used to reduce -*> the full matrix to tridiagonal form. QSIZ >= N if ICOMPQ = 1. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The dimension of the symmetric tridiagonal matrix. N >= 0. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the diagonal elements of the tridiagonal matrix. -*> On exit, the eigenvalues in ascending order. -*> \endverbatim -*> -*> \param[in,out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> On entry, the off-diagonal elements of the tridiagonal matrix. -*> On exit, E has been destroyed. -*> \endverbatim -*> -*> \param[in,out] Q -*> \verbatim -*> Q is COMPLEX*16 array, dimension (LDQ,N) -*> On entry, Q must contain an QSIZ x N matrix whose columns -*> unitarily orthonormal. It is a part of the unitary matrix -*> that reduces the full dense Hermitian matrix to a -*> (reducible) symmetric tridiagonal matrix. -*> \endverbatim -*> -*> \param[in] LDQ -*> \verbatim -*> LDQ is INTEGER -*> The leading dimension of the array Q. LDQ >= max(1,N). -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, -*> the dimension of IWORK must be at least -*> 6 + 6*N + 5*N*lg N -*> ( lg( N ) = smallest integer k -*> such that 2^k >= N ) -*> \endverbatim -*> -*> \param[out] RWORK -*> \verbatim -*> RWORK is DOUBLE PRECISION array, -*> dimension (1 + 3*N + 2*N*lg N + 3*N**2) -*> ( lg( N ) = smallest integer k -*> such that 2^k >= N ) -*> \endverbatim -*> -*> \param[out] QSTORE -*> \verbatim -*> QSTORE is COMPLEX*16 array, dimension (LDQS, N) -*> Used to store parts of -*> the eigenvector matrix when the updating matrix multiplies -*> take place. -*> \endverbatim -*> -*> \param[in] LDQS -*> \verbatim -*> LDQS is INTEGER -*> The leading dimension of the array QSTORE. -*> LDQS >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: The algorithm failed to compute an eigenvalue while -*> working on the submatrix lying in rows and columns -*> INFO/(N+1) through mod(INFO,N+1). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZLAED0( QSIZ, N, D, E, Q, LDQ, QSTORE, LDQS, RWORK, - $ IWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDQ, LDQS, N, QSIZ -* .. -* .. Array Arguments .. - INTEGER IWORK( * ) - DOUBLE PRECISION D( * ), E( * ), RWORK( * ) - COMPLEX*16 Q( LDQ, * ), QSTORE( LDQS, * ) -* .. -* -* ===================================================================== -* -* Warning: N could be as big as QSIZ! -* -* .. Parameters .. - DOUBLE PRECISION TWO - PARAMETER ( TWO = 2.D+0 ) -* .. -* .. Local Scalars .. - INTEGER CURLVL, CURPRB, CURR, I, IGIVCL, IGIVNM, - $ IGIVPT, INDXQ, IPERM, IPRMPT, IQ, IQPTR, IWREM, - $ J, K, LGN, LL, MATSIZ, MSD2, SMLSIZ, SMM1, - $ SPM1, SPM2, SUBMAT, SUBPBS, TLVLS - DOUBLE PRECISION TEMP -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DSTEQR, XERBLA, ZCOPY, ZLACRM, ZLAED7 -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, INT, LOG, MAX -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* -* IF( ICOMPQ .LT. 0 .OR. ICOMPQ .GT. 2 ) THEN -* INFO = -1 -* ELSE IF( ( ICOMPQ .EQ. 1 ) .AND. ( QSIZ .LT. MAX( 0, N ) ) ) -* $ THEN - IF( QSIZ.LT.MAX( 0, N ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDQ.LT.MAX( 1, N ) ) THEN - INFO = -6 - ELSE IF( LDQS.LT.MAX( 1, N ) ) THEN - INFO = -8 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZLAED0', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - SMLSIZ = ILAENV( 9, 'ZLAED0', ' ', 0, 0, 0, 0 ) -* -* Determine the size and placement of the submatrices, and save in -* the leading elements of IWORK. -* - IWORK( 1 ) = N - SUBPBS = 1 - TLVLS = 0 - 10 CONTINUE - IF( IWORK( SUBPBS ).GT.SMLSIZ ) THEN - DO 20 J = SUBPBS, 1, -1 - IWORK( 2*J ) = ( IWORK( J )+1 ) / 2 - IWORK( 2*J-1 ) = IWORK( J ) / 2 - 20 CONTINUE - TLVLS = TLVLS + 1 - SUBPBS = 2*SUBPBS - GO TO 10 - END IF - DO 30 J = 2, SUBPBS - IWORK( J ) = IWORK( J ) + IWORK( J-1 ) - 30 CONTINUE -* -* Divide the matrix into SUBPBS submatrices of size at most SMLSIZ+1 -* using rank-1 modifications (cuts). -* - SPM1 = SUBPBS - 1 - DO 40 I = 1, SPM1 - SUBMAT = IWORK( I ) + 1 - SMM1 = SUBMAT - 1 - D( SMM1 ) = D( SMM1 ) - ABS( E( SMM1 ) ) - D( SUBMAT ) = D( SUBMAT ) - ABS( E( SMM1 ) ) - 40 CONTINUE -* - INDXQ = 4*N + 3 -* -* Set up workspaces for eigenvalues only/accumulate new vectors -* routine -* - TEMP = LOG( DBLE( N ) ) / LOG( TWO ) - LGN = INT( TEMP ) - IF( 2**LGN.LT.N ) - $ LGN = LGN + 1 - IF( 2**LGN.LT.N ) - $ LGN = LGN + 1 - IPRMPT = INDXQ + N + 1 - IPERM = IPRMPT + N*LGN - IQPTR = IPERM + N*LGN - IGIVPT = IQPTR + N + 2 - IGIVCL = IGIVPT + N*LGN -* - IGIVNM = 1 - IQ = IGIVNM + 2*N*LGN - IWREM = IQ + N**2 + 1 -* Initialize pointers - DO 50 I = 0, SUBPBS - IWORK( IPRMPT+I ) = 1 - IWORK( IGIVPT+I ) = 1 - 50 CONTINUE - IWORK( IQPTR ) = 1 -* -* Solve each submatrix eigenproblem at the bottom of the divide and -* conquer tree. -* - CURR = 0 - DO 70 I = 0, SPM1 - IF( I.EQ.0 ) THEN - SUBMAT = 1 - MATSIZ = IWORK( 1 ) - ELSE - SUBMAT = IWORK( I ) + 1 - MATSIZ = IWORK( I+1 ) - IWORK( I ) - END IF - LL = IQ - 1 + IWORK( IQPTR+CURR ) - CALL DSTEQR( 'I', MATSIZ, D( SUBMAT ), E( SUBMAT ), - $ RWORK( LL ), MATSIZ, RWORK, INFO ) - CALL ZLACRM( QSIZ, MATSIZ, Q( 1, SUBMAT ), LDQ, RWORK( LL ), - $ MATSIZ, QSTORE( 1, SUBMAT ), LDQS, - $ RWORK( IWREM ) ) - IWORK( IQPTR+CURR+1 ) = IWORK( IQPTR+CURR ) + MATSIZ**2 - CURR = CURR + 1 - IF( INFO.GT.0 ) THEN - INFO = SUBMAT*( N+1 ) + SUBMAT + MATSIZ - 1 - RETURN - END IF - K = 1 - DO 60 J = SUBMAT, IWORK( I+1 ) - IWORK( INDXQ+J ) = K - K = K + 1 - 60 CONTINUE - 70 CONTINUE -* -* Successively merge eigensystems of adjacent submatrices -* into eigensystem for the corresponding larger matrix. -* -* while ( SUBPBS > 1 ) -* - CURLVL = 1 - 80 CONTINUE - IF( SUBPBS.GT.1 ) THEN - SPM2 = SUBPBS - 2 - DO 90 I = 0, SPM2, 2 - IF( I.EQ.0 ) THEN - SUBMAT = 1 - MATSIZ = IWORK( 2 ) - MSD2 = IWORK( 1 ) - CURPRB = 0 - ELSE - SUBMAT = IWORK( I ) + 1 - MATSIZ = IWORK( I+2 ) - IWORK( I ) - MSD2 = MATSIZ / 2 - CURPRB = CURPRB + 1 - END IF -* -* Merge lower order eigensystems (of size MSD2 and MATSIZ - MSD2) -* into an eigensystem of size MATSIZ. ZLAED7 handles the case -* when the eigenvectors of a full or band Hermitian matrix (which -* was reduced to tridiagonal form) are desired. -* -* I am free to use Q as a valuable working space until Loop 150. -* - CALL ZLAED7( MATSIZ, MSD2, QSIZ, TLVLS, CURLVL, CURPRB, - $ D( SUBMAT ), QSTORE( 1, SUBMAT ), LDQS, - $ E( SUBMAT+MSD2-1 ), IWORK( INDXQ+SUBMAT ), - $ RWORK( IQ ), IWORK( IQPTR ), IWORK( IPRMPT ), - $ IWORK( IPERM ), IWORK( IGIVPT ), - $ IWORK( IGIVCL ), RWORK( IGIVNM ), - $ Q( 1, SUBMAT ), RWORK( IWREM ), - $ IWORK( SUBPBS+1 ), INFO ) - IF( INFO.GT.0 ) THEN - INFO = SUBMAT*( N+1 ) + SUBMAT + MATSIZ - 1 - RETURN - END IF - IWORK( I / 2+1 ) = IWORK( I+2 ) - 90 CONTINUE - SUBPBS = SUBPBS / 2 - CURLVL = CURLVL + 1 - GO TO 80 - END IF -* -* end while -* -* Re-merge the eigenvalues/vectors which were deflated at the final -* merge step. -* - DO 100 I = 1, N - J = IWORK( INDXQ+I ) - RWORK( I ) = D( J ) - CALL ZCOPY( QSIZ, QSTORE( 1, J ), 1, Q( 1, I ), 1 ) - 100 CONTINUE - CALL DCOPY( N, RWORK, 1, D, 1 ) -* - RETURN -* -* End of ZLAED0 -* - END diff --git a/lib/linalg/fortran/zlaed7.f b/lib/linalg/fortran/zlaed7.f deleted file mode 100644 index 83f32d8b81..0000000000 --- a/lib/linalg/fortran/zlaed7.f +++ /dev/null @@ -1,382 +0,0 @@ -*> \brief \b ZLAED7 used by ZSTEDC. Computes the updated eigensystem of a diagonal matrix after modification by a rank-one symmetric matrix. Used when the original matrix is dense. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLAED7 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLAED7( N, CUTPNT, QSIZ, TLVLS, CURLVL, CURPBM, D, Q, -* LDQ, RHO, INDXQ, QSTORE, QPTR, PRMPTR, PERM, -* GIVPTR, GIVCOL, GIVNUM, WORK, RWORK, IWORK, -* INFO ) -* -* .. Scalar Arguments .. -* INTEGER CURLVL, CURPBM, CUTPNT, INFO, LDQ, N, QSIZ, -* $ TLVLS -* DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. -* INTEGER GIVCOL( 2, * ), GIVPTR( * ), INDXQ( * ), -* $ IWORK( * ), PERM( * ), PRMPTR( * ), QPTR( * ) -* DOUBLE PRECISION D( * ), GIVNUM( 2, * ), QSTORE( * ), RWORK( * ) -* COMPLEX*16 Q( LDQ, * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLAED7 computes the updated eigensystem of a diagonal -*> matrix after modification by a rank-one symmetric matrix. This -*> routine is used only for the eigenproblem which requires all -*> eigenvalues and optionally eigenvectors of a dense or banded -*> Hermitian matrix that has been reduced to tridiagonal form. -*> -*> T = Q(in) ( D(in) + RHO * Z*Z**H ) Q**H(in) = Q(out) * D(out) * Q**H(out) -*> -*> where Z = Q**Hu, u is a vector of length N with ones in the -*> CUTPNT and CUTPNT + 1 th elements and zeros elsewhere. -*> -*> The eigenvectors of the original matrix are stored in Q, and the -*> eigenvalues are in D. The algorithm consists of three stages: -*> -*> The first stage consists of deflating the size of the problem -*> when there are multiple eigenvalues or if there is a zero in -*> the Z vector. For each such occurrence the dimension of the -*> secular equation problem is reduced by one. This stage is -*> performed by the routine DLAED2. -*> -*> The second stage consists of calculating the updated -*> eigenvalues. This is done by finding the roots of the secular -*> equation via the routine DLAED4 (as called by SLAED3). -*> This routine also calculates the eigenvectors of the current -*> problem. -*> -*> The final stage consists of computing the updated eigenvectors -*> directly using the updated eigenvalues. The eigenvectors for -*> the current problem are multiplied with the eigenvectors from -*> the overall problem. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The dimension of the symmetric tridiagonal matrix. N >= 0. -*> \endverbatim -*> -*> \param[in] CUTPNT -*> \verbatim -*> CUTPNT is INTEGER -*> Contains the location of the last eigenvalue in the leading -*> sub-matrix. min(1,N) <= CUTPNT <= N. -*> \endverbatim -*> -*> \param[in] QSIZ -*> \verbatim -*> QSIZ is INTEGER -*> The dimension of the unitary matrix used to reduce -*> the full matrix to tridiagonal form. QSIZ >= N. -*> \endverbatim -*> -*> \param[in] TLVLS -*> \verbatim -*> TLVLS is INTEGER -*> The total number of merging levels in the overall divide and -*> conquer tree. -*> \endverbatim -*> -*> \param[in] CURLVL -*> \verbatim -*> CURLVL is INTEGER -*> The current level in the overall merge routine, -*> 0 <= curlvl <= tlvls. -*> \endverbatim -*> -*> \param[in] CURPBM -*> \verbatim -*> CURPBM is INTEGER -*> The current problem in the current level in the overall -*> merge routine (counting from upper left to lower right). -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the eigenvalues of the rank-1-perturbed matrix. -*> On exit, the eigenvalues of the repaired matrix. -*> \endverbatim -*> -*> \param[in,out] Q -*> \verbatim -*> Q is COMPLEX*16 array, dimension (LDQ,N) -*> On entry, the eigenvectors of the rank-1-perturbed matrix. -*> On exit, the eigenvectors of the repaired tridiagonal matrix. -*> \endverbatim -*> -*> \param[in] LDQ -*> \verbatim -*> LDQ is INTEGER -*> The leading dimension of the array Q. LDQ >= max(1,N). -*> \endverbatim -*> -*> \param[in] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> Contains the subdiagonal element used to create the rank-1 -*> modification. -*> \endverbatim -*> -*> \param[out] INDXQ -*> \verbatim -*> INDXQ is INTEGER array, dimension (N) -*> This contains the permutation which will reintegrate the -*> subproblem just solved back into sorted order, -*> ie. D( INDXQ( I = 1, N ) ) will be in ascending order. -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension (4*N) -*> \endverbatim -*> -*> \param[out] RWORK -*> \verbatim -*> RWORK is DOUBLE PRECISION array, -*> dimension (3*N+2*QSIZ*N) -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (QSIZ*N) -*> \endverbatim -*> -*> \param[in,out] QSTORE -*> \verbatim -*> QSTORE is DOUBLE PRECISION array, dimension (N**2+1) -*> Stores eigenvectors of submatrices encountered during -*> divide and conquer, packed together. QPTR points to -*> beginning of the submatrices. -*> \endverbatim -*> -*> \param[in,out] QPTR -*> \verbatim -*> QPTR is INTEGER array, dimension (N+2) -*> List of indices pointing to beginning of submatrices stored -*> in QSTORE. The submatrices are numbered starting at the -*> bottom left of the divide and conquer tree, from left to -*> right and bottom to top. -*> \endverbatim -*> -*> \param[in] PRMPTR -*> \verbatim -*> PRMPTR is INTEGER array, dimension (N lg N) -*> Contains a list of pointers which indicate where in PERM a -*> level's permutation is stored. PRMPTR(i+1) - PRMPTR(i) -*> indicates the size of the permutation and also the size of -*> the full, non-deflated problem. -*> \endverbatim -*> -*> \param[in] PERM -*> \verbatim -*> PERM is INTEGER array, dimension (N lg N) -*> Contains the permutations (from deflation and sorting) to be -*> applied to each eigenblock. -*> \endverbatim -*> -*> \param[in] GIVPTR -*> \verbatim -*> GIVPTR is INTEGER array, dimension (N lg N) -*> Contains a list of pointers which indicate where in GIVCOL a -*> level's Givens rotations are stored. GIVPTR(i+1) - GIVPTR(i) -*> indicates the number of Givens rotations. -*> \endverbatim -*> -*> \param[in] GIVCOL -*> \verbatim -*> GIVCOL is INTEGER array, dimension (2, N lg N) -*> Each pair of numbers indicates a pair of columns to take place -*> in a Givens rotation. -*> \endverbatim -*> -*> \param[in] GIVNUM -*> \verbatim -*> GIVNUM is DOUBLE PRECISION array, dimension (2, N lg N) -*> Each number indicates the S value to be used in the -*> corresponding Givens rotation. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: if INFO = 1, an eigenvalue did not converge -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZLAED7( N, CUTPNT, QSIZ, TLVLS, CURLVL, CURPBM, D, Q, - $ LDQ, RHO, INDXQ, QSTORE, QPTR, PRMPTR, PERM, - $ GIVPTR, GIVCOL, GIVNUM, WORK, RWORK, IWORK, - $ INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER CURLVL, CURPBM, CUTPNT, INFO, LDQ, N, QSIZ, - $ TLVLS - DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. - INTEGER GIVCOL( 2, * ), GIVPTR( * ), INDXQ( * ), - $ IWORK( * ), PERM( * ), PRMPTR( * ), QPTR( * ) - DOUBLE PRECISION D( * ), GIVNUM( 2, * ), QSTORE( * ), RWORK( * ) - COMPLEX*16 Q( LDQ, * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER COLTYP, CURR, I, IDLMDA, INDX, - $ INDXC, INDXP, IQ, IW, IZ, K, N1, N2, PTR -* .. -* .. External Subroutines .. - EXTERNAL DLAED9, DLAEDA, DLAMRG, XERBLA, ZLACRM, ZLAED8 -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* -* IF( ICOMPQ.LT.0 .OR. ICOMPQ.GT.1 ) THEN -* INFO = -1 -* ELSE IF( N.LT.0 ) THEN - IF( N.LT.0 ) THEN - INFO = -1 - ELSE IF( MIN( 1, N ).GT.CUTPNT .OR. N.LT.CUTPNT ) THEN - INFO = -2 - ELSE IF( QSIZ.LT.N ) THEN - INFO = -3 - ELSE IF( LDQ.LT.MAX( 1, N ) ) THEN - INFO = -9 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZLAED7', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* The following values are for bookkeeping purposes only. They are -* integer pointers which indicate the portion of the workspace -* used by a particular array in DLAED2 and SLAED3. -* - IZ = 1 - IDLMDA = IZ + N - IW = IDLMDA + N - IQ = IW + N -* - INDX = 1 - INDXC = INDX + N - COLTYP = INDXC + N - INDXP = COLTYP + N -* -* Form the z-vector which consists of the last row of Q_1 and the -* first row of Q_2. -* - PTR = 1 + 2**TLVLS - DO 10 I = 1, CURLVL - 1 - PTR = PTR + 2**( TLVLS-I ) - 10 CONTINUE - CURR = PTR + CURPBM - CALL DLAEDA( N, TLVLS, CURLVL, CURPBM, PRMPTR, PERM, GIVPTR, - $ GIVCOL, GIVNUM, QSTORE, QPTR, RWORK( IZ ), - $ RWORK( IZ+N ), INFO ) -* -* When solving the final problem, we no longer need the stored data, -* so we will overwrite the data from this level onto the previously -* used storage space. -* - IF( CURLVL.EQ.TLVLS ) THEN - QPTR( CURR ) = 1 - PRMPTR( CURR ) = 1 - GIVPTR( CURR ) = 1 - END IF -* -* Sort and Deflate eigenvalues. -* - CALL ZLAED8( K, N, QSIZ, Q, LDQ, D, RHO, CUTPNT, RWORK( IZ ), - $ RWORK( IDLMDA ), WORK, QSIZ, RWORK( IW ), - $ IWORK( INDXP ), IWORK( INDX ), INDXQ, - $ PERM( PRMPTR( CURR ) ), GIVPTR( CURR+1 ), - $ GIVCOL( 1, GIVPTR( CURR ) ), - $ GIVNUM( 1, GIVPTR( CURR ) ), INFO ) - PRMPTR( CURR+1 ) = PRMPTR( CURR ) + N - GIVPTR( CURR+1 ) = GIVPTR( CURR+1 ) + GIVPTR( CURR ) -* -* Solve Secular Equation. -* - IF( K.NE.0 ) THEN - CALL DLAED9( K, 1, K, N, D, RWORK( IQ ), K, RHO, - $ RWORK( IDLMDA ), RWORK( IW ), - $ QSTORE( QPTR( CURR ) ), K, INFO ) - CALL ZLACRM( QSIZ, K, WORK, QSIZ, QSTORE( QPTR( CURR ) ), K, Q, - $ LDQ, RWORK( IQ ) ) - QPTR( CURR+1 ) = QPTR( CURR ) + K**2 - IF( INFO.NE.0 ) THEN - RETURN - END IF -* -* Prepare the INDXQ sorting premutation. -* - N1 = K - N2 = N - K - CALL DLAMRG( N1, N2, D, 1, -1, INDXQ ) - ELSE - QPTR( CURR+1 ) = QPTR( CURR ) - DO 20 I = 1, N - INDXQ( I ) = I - 20 CONTINUE - END IF -* - RETURN -* -* End of ZLAED7 -* - END diff --git a/lib/linalg/fortran/zlaed8.f b/lib/linalg/fortran/zlaed8.f deleted file mode 100644 index 995a673de9..0000000000 --- a/lib/linalg/fortran/zlaed8.f +++ /dev/null @@ -1,483 +0,0 @@ -*> \brief \b ZLAED8 used by ZSTEDC. Merges eigenvalues and deflates secular equation. Used when the original matrix is dense. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLAED8 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLAED8( K, N, QSIZ, Q, LDQ, D, RHO, CUTPNT, Z, DLAMDA, -* Q2, LDQ2, W, INDXP, INDX, INDXQ, PERM, GIVPTR, -* GIVCOL, GIVNUM, INFO ) -* -* .. Scalar Arguments .. -* INTEGER CUTPNT, GIVPTR, INFO, K, LDQ, LDQ2, N, QSIZ -* DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. -* INTEGER GIVCOL( 2, * ), INDX( * ), INDXP( * ), -* $ INDXQ( * ), PERM( * ) -* DOUBLE PRECISION D( * ), DLAMDA( * ), GIVNUM( 2, * ), W( * ), -* $ Z( * ) -* COMPLEX*16 Q( LDQ, * ), Q2( LDQ2, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLAED8 merges the two sets of eigenvalues together into a single -*> sorted set. Then it tries to deflate the size of the problem. -*> There are two ways in which deflation can occur: when two or more -*> eigenvalues are close together or if there is a tiny element in the -*> Z vector. For each such occurrence the order of the related secular -*> equation problem is reduced by one. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[out] K -*> \verbatim -*> K is INTEGER -*> Contains the number of non-deflated eigenvalues. -*> This is the order of the related secular equation. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The dimension of the symmetric tridiagonal matrix. N >= 0. -*> \endverbatim -*> -*> \param[in] QSIZ -*> \verbatim -*> QSIZ is INTEGER -*> The dimension of the unitary matrix used to reduce -*> the dense or band matrix to tridiagonal form. -*> QSIZ >= N if ICOMPQ = 1. -*> \endverbatim -*> -*> \param[in,out] Q -*> \verbatim -*> Q is COMPLEX*16 array, dimension (LDQ,N) -*> On entry, Q contains the eigenvectors of the partially solved -*> system which has been previously updated in matrix -*> multiplies with other partially solved eigensystems. -*> On exit, Q contains the trailing (N-K) updated eigenvectors -*> (those which were deflated) in its last N-K columns. -*> \endverbatim -*> -*> \param[in] LDQ -*> \verbatim -*> LDQ is INTEGER -*> The leading dimension of the array Q. LDQ >= max( 1, N ). -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, D contains the eigenvalues of the two submatrices to -*> be combined. On exit, D contains the trailing (N-K) updated -*> eigenvalues (those which were deflated) sorted into increasing -*> order. -*> \endverbatim -*> -*> \param[in,out] RHO -*> \verbatim -*> RHO is DOUBLE PRECISION -*> Contains the off diagonal element associated with the rank-1 -*> cut which originally split the two submatrices which are now -*> being recombined. RHO is modified during the computation to -*> the value required by DLAED3. -*> \endverbatim -*> -*> \param[in] CUTPNT -*> \verbatim -*> CUTPNT is INTEGER -*> Contains the location of the last eigenvalue in the leading -*> sub-matrix. MIN(1,N) <= CUTPNT <= N. -*> \endverbatim -*> -*> \param[in] Z -*> \verbatim -*> Z is DOUBLE PRECISION array, dimension (N) -*> On input this vector contains the updating vector (the last -*> row of the first sub-eigenvector matrix and the first row of -*> the second sub-eigenvector matrix). The contents of Z are -*> destroyed during the updating process. -*> \endverbatim -*> -*> \param[out] DLAMDA -*> \verbatim -*> DLAMDA is DOUBLE PRECISION array, dimension (N) -*> Contains a copy of the first K eigenvalues which will be used -*> by DLAED3 to form the secular equation. -*> \endverbatim -*> -*> \param[out] Q2 -*> \verbatim -*> Q2 is COMPLEX*16 array, dimension (LDQ2,N) -*> If ICOMPQ = 0, Q2 is not referenced. Otherwise, -*> Contains a copy of the first K eigenvectors which will be used -*> by DLAED7 in a matrix multiply (DGEMM) to update the new -*> eigenvectors. -*> \endverbatim -*> -*> \param[in] LDQ2 -*> \verbatim -*> LDQ2 is INTEGER -*> The leading dimension of the array Q2. LDQ2 >= max( 1, N ). -*> \endverbatim -*> -*> \param[out] W -*> \verbatim -*> W is DOUBLE PRECISION array, dimension (N) -*> This will hold the first k values of the final -*> deflation-altered z-vector and will be passed to DLAED3. -*> \endverbatim -*> -*> \param[out] INDXP -*> \verbatim -*> INDXP is INTEGER array, dimension (N) -*> This will contain the permutation used to place deflated -*> values of D at the end of the array. On output INDXP(1:K) -*> points to the nondeflated D-values and INDXP(K+1:N) -*> points to the deflated eigenvalues. -*> \endverbatim -*> -*> \param[out] INDX -*> \verbatim -*> INDX is INTEGER array, dimension (N) -*> This will contain the permutation used to sort the contents of -*> D into ascending order. -*> \endverbatim -*> -*> \param[in] INDXQ -*> \verbatim -*> INDXQ is INTEGER array, dimension (N) -*> This contains the permutation which separately sorts the two -*> sub-problems in D into ascending order. Note that elements in -*> the second half of this permutation must first have CUTPNT -*> added to their values in order to be accurate. -*> \endverbatim -*> -*> \param[out] PERM -*> \verbatim -*> PERM is INTEGER array, dimension (N) -*> Contains the permutations (from deflation and sorting) to be -*> applied to each eigenblock. -*> \endverbatim -*> -*> \param[out] GIVPTR -*> \verbatim -*> GIVPTR is INTEGER -*> Contains the number of Givens rotations which took place in -*> this subproblem. -*> \endverbatim -*> -*> \param[out] GIVCOL -*> \verbatim -*> GIVCOL is INTEGER array, dimension (2, N) -*> Each pair of numbers indicates a pair of columns to take place -*> in a Givens rotation. -*> \endverbatim -*> -*> \param[out] GIVNUM -*> \verbatim -*> GIVNUM is DOUBLE PRECISION array, dimension (2, N) -*> Each number indicates the S value to be used in the -*> corresponding Givens rotation. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZLAED8( K, N, QSIZ, Q, LDQ, D, RHO, CUTPNT, Z, DLAMDA, - $ Q2, LDQ2, W, INDXP, INDX, INDXQ, PERM, GIVPTR, - $ GIVCOL, GIVNUM, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER CUTPNT, GIVPTR, INFO, K, LDQ, LDQ2, N, QSIZ - DOUBLE PRECISION RHO -* .. -* .. Array Arguments .. - INTEGER GIVCOL( 2, * ), INDX( * ), INDXP( * ), - $ INDXQ( * ), PERM( * ) - DOUBLE PRECISION D( * ), DLAMDA( * ), GIVNUM( 2, * ), W( * ), - $ Z( * ) - COMPLEX*16 Q( LDQ, * ), Q2( LDQ2, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION MONE, ZERO, ONE, TWO, EIGHT - PARAMETER ( MONE = -1.0D0, ZERO = 0.0D0, ONE = 1.0D0, - $ TWO = 2.0D0, EIGHT = 8.0D0 ) -* .. -* .. Local Scalars .. - INTEGER I, IMAX, J, JLAM, JMAX, JP, K2, N1, N1P1, N2 - DOUBLE PRECISION C, EPS, S, T, TAU, TOL -* .. -* .. External Functions .. - INTEGER IDAMAX - DOUBLE PRECISION DLAMCH, DLAPY2 - EXTERNAL IDAMAX, DLAMCH, DLAPY2 -* .. -* .. External Subroutines .. - EXTERNAL DCOPY, DLAMRG, DSCAL, XERBLA, ZCOPY, ZDROT, - $ ZLACPY -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( QSIZ.LT.N ) THEN - INFO = -3 - ELSE IF( LDQ.LT.MAX( 1, N ) ) THEN - INFO = -5 - ELSE IF( CUTPNT.LT.MIN( 1, N ) .OR. CUTPNT.GT.N ) THEN - INFO = -8 - ELSE IF( LDQ2.LT.MAX( 1, N ) ) THEN - INFO = -12 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZLAED8', -INFO ) - RETURN - END IF -* -* Need to initialize GIVPTR to O here in case of quick exit -* to prevent an unspecified code behavior (usually sigfault) -* when IWORK array on entry to *stedc is not zeroed -* (or at least some IWORK entries which used in *laed7 for GIVPTR). -* - GIVPTR = 0 -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - N1 = CUTPNT - N2 = N - N1 - N1P1 = N1 + 1 -* - IF( RHO.LT.ZERO ) THEN - CALL DSCAL( N2, MONE, Z( N1P1 ), 1 ) - END IF -* -* Normalize z so that norm(z) = 1 -* - T = ONE / SQRT( TWO ) - DO 10 J = 1, N - INDX( J ) = J - 10 CONTINUE - CALL DSCAL( N, T, Z, 1 ) - RHO = ABS( TWO*RHO ) -* -* Sort the eigenvalues into increasing order -* - DO 20 I = CUTPNT + 1, N - INDXQ( I ) = INDXQ( I ) + CUTPNT - 20 CONTINUE - DO 30 I = 1, N - DLAMDA( I ) = D( INDXQ( I ) ) - W( I ) = Z( INDXQ( I ) ) - 30 CONTINUE - I = 1 - J = CUTPNT + 1 - CALL DLAMRG( N1, N2, DLAMDA, 1, 1, INDX ) - DO 40 I = 1, N - D( I ) = DLAMDA( INDX( I ) ) - Z( I ) = W( INDX( I ) ) - 40 CONTINUE -* -* Calculate the allowable deflation tolerance -* - IMAX = IDAMAX( N, Z, 1 ) - JMAX = IDAMAX( N, D, 1 ) - EPS = DLAMCH( 'Epsilon' ) - TOL = EIGHT*EPS*ABS( D( JMAX ) ) -* -* If the rank-1 modifier is small enough, no more needs to be done -* -- except to reorganize Q so that its columns correspond with the -* elements in D. -* - IF( RHO*ABS( Z( IMAX ) ).LE.TOL ) THEN - K = 0 - DO 50 J = 1, N - PERM( J ) = INDXQ( INDX( J ) ) - CALL ZCOPY( QSIZ, Q( 1, PERM( J ) ), 1, Q2( 1, J ), 1 ) - 50 CONTINUE - CALL ZLACPY( 'A', QSIZ, N, Q2( 1, 1 ), LDQ2, Q( 1, 1 ), LDQ ) - RETURN - END IF -* -* If there are multiple eigenvalues then the problem deflates. Here -* the number of equal eigenvalues are found. As each equal -* eigenvalue is found, an elementary reflector is computed to rotate -* the corresponding eigensubspace so that the corresponding -* components of Z are zero in this new basis. -* - K = 0 - K2 = N + 1 - DO 60 J = 1, N - IF( RHO*ABS( Z( J ) ).LE.TOL ) THEN -* -* Deflate due to small z component. -* - K2 = K2 - 1 - INDXP( K2 ) = J - IF( J.EQ.N ) - $ GO TO 100 - ELSE - JLAM = J - GO TO 70 - END IF - 60 CONTINUE - 70 CONTINUE - J = J + 1 - IF( J.GT.N ) - $ GO TO 90 - IF( RHO*ABS( Z( J ) ).LE.TOL ) THEN -* -* Deflate due to small z component. -* - K2 = K2 - 1 - INDXP( K2 ) = J - ELSE -* -* Check if eigenvalues are close enough to allow deflation. -* - S = Z( JLAM ) - C = Z( J ) -* -* Find sqrt(a**2+b**2) without overflow or -* destructive underflow. -* - TAU = DLAPY2( C, S ) - T = D( J ) - D( JLAM ) - C = C / TAU - S = -S / TAU - IF( ABS( T*C*S ).LE.TOL ) THEN -* -* Deflation is possible. -* - Z( J ) = TAU - Z( JLAM ) = ZERO -* -* Record the appropriate Givens rotation -* - GIVPTR = GIVPTR + 1 - GIVCOL( 1, GIVPTR ) = INDXQ( INDX( JLAM ) ) - GIVCOL( 2, GIVPTR ) = INDXQ( INDX( J ) ) - GIVNUM( 1, GIVPTR ) = C - GIVNUM( 2, GIVPTR ) = S - CALL ZDROT( QSIZ, Q( 1, INDXQ( INDX( JLAM ) ) ), 1, - $ Q( 1, INDXQ( INDX( J ) ) ), 1, C, S ) - T = D( JLAM )*C*C + D( J )*S*S - D( J ) = D( JLAM )*S*S + D( J )*C*C - D( JLAM ) = T - K2 = K2 - 1 - I = 1 - 80 CONTINUE - IF( K2+I.LE.N ) THEN - IF( D( JLAM ).LT.D( INDXP( K2+I ) ) ) THEN - INDXP( K2+I-1 ) = INDXP( K2+I ) - INDXP( K2+I ) = JLAM - I = I + 1 - GO TO 80 - ELSE - INDXP( K2+I-1 ) = JLAM - END IF - ELSE - INDXP( K2+I-1 ) = JLAM - END IF - JLAM = J - ELSE - K = K + 1 - W( K ) = Z( JLAM ) - DLAMDA( K ) = D( JLAM ) - INDXP( K ) = JLAM - JLAM = J - END IF - END IF - GO TO 70 - 90 CONTINUE -* -* Record the last eigenvalue. -* - K = K + 1 - W( K ) = Z( JLAM ) - DLAMDA( K ) = D( JLAM ) - INDXP( K ) = JLAM -* - 100 CONTINUE -* -* Sort the eigenvalues and corresponding eigenvectors into DLAMDA -* and Q2 respectively. The eigenvalues/vectors which were not -* deflated go into the first K slots of DLAMDA and Q2 respectively, -* while those which were deflated go into the last N - K slots. -* - DO 110 J = 1, N - JP = INDXP( J ) - DLAMDA( J ) = D( JP ) - PERM( J ) = INDXQ( INDX( JP ) ) - CALL ZCOPY( QSIZ, Q( 1, PERM( J ) ), 1, Q2( 1, J ), 1 ) - 110 CONTINUE -* -* The deflated eigenvalues and their corresponding vectors go back -* into the last N - K slots of D and Q respectively. -* - IF( K.LT.N ) THEN - CALL DCOPY( N-K, DLAMDA( K+1 ), 1, D( K+1 ), 1 ) - CALL ZLACPY( 'A', QSIZ, N-K, Q2( 1, K+1 ), LDQ2, Q( 1, K+1 ), - $ LDQ ) - END IF -* - RETURN -* -* End of ZLAED8 -* - END diff --git a/lib/linalg/fortran/zlanhe.f b/lib/linalg/fortran/zlanhe.f deleted file mode 100644 index bbb4843ffd..0000000000 --- a/lib/linalg/fortran/zlanhe.f +++ /dev/null @@ -1,255 +0,0 @@ -*> \brief \b ZLANHE returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a complex Hermitian matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLANHE + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* DOUBLE PRECISION FUNCTION ZLANHE( NORM, UPLO, N, A, LDA, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER NORM, UPLO -* INTEGER LDA, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION WORK( * ) -* COMPLEX*16 A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLANHE returns the value of the one norm, or the Frobenius norm, or -*> the infinity norm, or the element of largest absolute value of a -*> complex hermitian matrix A. -*> \endverbatim -*> -*> \return ZLANHE -*> \verbatim -*> -*> ZLANHE = ( max(abs(A(i,j))), NORM = 'M' or 'm' -*> ( -*> ( norm1(A), NORM = '1', 'O' or 'o' -*> ( -*> ( normI(A), NORM = 'I' or 'i' -*> ( -*> ( normF(A), NORM = 'F', 'f', 'E' or 'e' -*> -*> where norm1 denotes the one norm of a matrix (maximum column sum), -*> normI denotes the infinity norm of a matrix (maximum row sum) and -*> normF denotes the Frobenius norm of a matrix (square root of sum of -*> squares). Note that max(abs(A(i,j))) is not a consistent matrix norm. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] NORM -*> \verbatim -*> NORM is CHARACTER*1 -*> Specifies the value to be returned in ZLANHE as described -*> above. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies whether the upper or lower triangular part of the -*> hermitian matrix A is to be referenced. -*> = 'U': Upper triangular part of A is referenced -*> = 'L': Lower triangular part of A is referenced -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. When N = 0, ZLANHE is -*> set to zero. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> The hermitian matrix A. If UPLO = 'U', the leading n by n -*> upper triangular part of A contains the upper triangular part -*> of the matrix A, and the strictly lower triangular part of A -*> is not referenced. If UPLO = 'L', the leading n by n lower -*> triangular part of A contains the lower triangular part of -*> the matrix A, and the strictly upper triangular part of A is -*> not referenced. Note that the imaginary parts of the diagonal -*> elements need not be set and are assumed to be zero. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(N,1). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)), -*> where LWORK >= N when NORM = 'I' or '1' or 'O'; otherwise, -*> WORK is not referenced. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16HEauxiliary -* -* ===================================================================== - DOUBLE PRECISION FUNCTION ZLANHE( NORM, UPLO, N, A, LDA, WORK ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER NORM, UPLO - INTEGER LDA, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION WORK( * ) - COMPLEX*16 A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J - DOUBLE PRECISION ABSA, SCALE, SUM, VALUE -* .. -* .. External Functions .. - LOGICAL LSAME, DISNAN - EXTERNAL LSAME, DISNAN -* .. -* .. External Subroutines .. - EXTERNAL ZLASSQ -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, SQRT -* .. -* .. Executable Statements .. -* - IF( N.EQ.0 ) THEN - VALUE = ZERO - ELSE IF( LSAME( NORM, 'M' ) ) THEN -* -* Find max(abs(A(i,j))). -* - VALUE = ZERO - IF( LSAME( UPLO, 'U' ) ) THEN - DO 20 J = 1, N - DO 10 I = 1, J - 1 - SUM = ABS( A( I, J ) ) - IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM - 10 CONTINUE - SUM = ABS( DBLE( A( J, J ) ) ) - IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM - 20 CONTINUE - ELSE - DO 40 J = 1, N - SUM = ABS( DBLE( A( J, J ) ) ) - IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM - DO 30 I = J + 1, N - SUM = ABS( A( I, J ) ) - IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM - 30 CONTINUE - 40 CONTINUE - END IF - ELSE IF( ( LSAME( NORM, 'I' ) ) .OR. ( LSAME( NORM, 'O' ) ) .OR. - $ ( NORM.EQ.'1' ) ) THEN -* -* Find normI(A) ( = norm1(A), since A is hermitian). -* - VALUE = ZERO - IF( LSAME( UPLO, 'U' ) ) THEN - DO 60 J = 1, N - SUM = ZERO - DO 50 I = 1, J - 1 - ABSA = ABS( A( I, J ) ) - SUM = SUM + ABSA - WORK( I ) = WORK( I ) + ABSA - 50 CONTINUE - WORK( J ) = SUM + ABS( DBLE( A( J, J ) ) ) - 60 CONTINUE - DO 70 I = 1, N - SUM = WORK( I ) - IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM - 70 CONTINUE - ELSE - DO 80 I = 1, N - WORK( I ) = ZERO - 80 CONTINUE - DO 100 J = 1, N - SUM = WORK( J ) + ABS( DBLE( A( J, J ) ) ) - DO 90 I = J + 1, N - ABSA = ABS( A( I, J ) ) - SUM = SUM + ABSA - WORK( I ) = WORK( I ) + ABSA - 90 CONTINUE - IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM - 100 CONTINUE - END IF - ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN -* -* Find normF(A). -* - SCALE = ZERO - SUM = ONE - IF( LSAME( UPLO, 'U' ) ) THEN - DO 110 J = 2, N - CALL ZLASSQ( J-1, A( 1, J ), 1, SCALE, SUM ) - 110 CONTINUE - ELSE - DO 120 J = 1, N - 1 - CALL ZLASSQ( N-J, A( J+1, J ), 1, SCALE, SUM ) - 120 CONTINUE - END IF - SUM = 2*SUM - DO 130 I = 1, N - IF( DBLE( A( I, I ) ).NE.ZERO ) THEN - ABSA = ABS( DBLE( A( I, I ) ) ) - IF( SCALE.LT.ABSA ) THEN - SUM = ONE + SUM*( SCALE / ABSA )**2 - SCALE = ABSA - ELSE - SUM = SUM + ( ABSA / SCALE )**2 - END IF - END IF - 130 CONTINUE - VALUE = SCALE*SQRT( SUM ) - END IF -* - ZLANHE = VALUE - RETURN -* -* End of ZLANHE -* - END diff --git a/lib/linalg/fortran/zlarf.f b/lib/linalg/fortran/zlarf.f deleted file mode 100644 index e555d18ecd..0000000000 --- a/lib/linalg/fortran/zlarf.f +++ /dev/null @@ -1,229 +0,0 @@ -*> \brief \b ZLARF applies an elementary reflector to a general rectangular matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARF + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE -* INTEGER INCV, LDC, M, N -* COMPLEX*16 TAU -* .. -* .. Array Arguments .. -* COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARF applies a complex elementary reflector H to a complex M-by-N -*> matrix C, from either the left or the right. H is represented in the -*> form -*> -*> H = I - tau * v * v**H -*> -*> where tau is a complex scalar and v is a complex vector. -*> -*> If tau = 0, then H is taken to be the unit matrix. -*> -*> To apply H**H, supply conjg(tau) instead -*> tau. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': form H * C -*> = 'R': form C * H -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX*16 array, dimension -*> (1 + (M-1)*abs(INCV)) if SIDE = 'L' -*> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' -*> The vector v in the representation of H. V is not used if -*> TAU = 0. -*> \endverbatim -*> -*> \param[in] INCV -*> \verbatim -*> INCV is INTEGER -*> The increment between elements of v. INCV <> 0. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 -*> The value tau in the representation of H. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by the matrix H * C if SIDE = 'L', -*> or C * H if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension -*> (N) if SIDE = 'L' -*> or (M) if SIDE = 'R' -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE - INTEGER INCV, LDC, M, N - COMPLEX*16 TAU -* .. -* .. Array Arguments .. - COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE, ZERO - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), - $ ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL APPLYLEFT - INTEGER I, LASTV, LASTC -* .. -* .. External Subroutines .. - EXTERNAL ZGEMV, ZGERC -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAZLR, ILAZLC - EXTERNAL LSAME, ILAZLR, ILAZLC -* .. -* .. Executable Statements .. -* - APPLYLEFT = LSAME( SIDE, 'L' ) - LASTV = 0 - LASTC = 0 - IF( TAU.NE.ZERO ) THEN -* Set up variables for scanning V. LASTV begins pointing to the end -* of V. - IF( APPLYLEFT ) THEN - LASTV = M - ELSE - LASTV = N - END IF - IF( INCV.GT.0 ) THEN - I = 1 + (LASTV-1) * INCV - ELSE - I = 1 - END IF -* Look for the last non-zero row in V. - DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) - LASTV = LASTV - 1 - I = I - INCV - END DO - IF( APPLYLEFT ) THEN -* Scan for the last non-zero column in C(1:lastv,:). - LASTC = ILAZLC(LASTV, N, C, LDC) - ELSE -* Scan for the last non-zero row in C(:,1:lastv). - LASTC = ILAZLR(M, LASTV, C, LDC) - END IF - END IF -* Note that lastc.eq.0 renders the BLAS operations null; no special -* case is needed at this level. - IF( APPLYLEFT ) THEN -* -* Form H * C -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1) -* - CALL ZGEMV( 'Conjugate transpose', LASTV, LASTC, ONE, - $ C, LDC, V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H -* - CALL ZGERC( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) - END IF - ELSE -* -* Form C * H -* - IF( LASTV.GT.0 ) THEN -* -* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) -* - CALL ZGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, - $ V, INCV, ZERO, WORK, 1 ) -* -* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H -* - CALL ZGERC( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) - END IF - END IF - RETURN -* -* End of ZLARF -* - END diff --git a/lib/linalg/fortran/zlarfb.f b/lib/linalg/fortran/zlarfb.f deleted file mode 100644 index c5f424db31..0000000000 --- a/lib/linalg/fortran/zlarfb.f +++ /dev/null @@ -1,730 +0,0 @@ -*> \brief \b ZLARFB applies a block reflector or its conjugate-transpose to a general rectangular matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARFB + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, -* T, LDT, C, LDC, WORK, LDWORK ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, SIDE, STOREV, TRANS -* INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 C( LDC, * ), T( LDT, * ), V( LDV, * ), -* $ WORK( LDWORK, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARFB applies a complex block reflector H or its transpose H**H to a -*> complex M-by-N matrix C, from either the left or the right. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply H or H**H from the Left -*> = 'R': apply H or H**H from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply H (No transpose) -*> = 'C': apply H**H (Conjugate transpose) -*> \endverbatim -*> -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Indicates how H is formed from a product of elementary -*> reflectors -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Indicates how the vectors which define the elementary -*> reflectors are stored: -*> = 'C': Columnwise -*> = 'R': Rowwise -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the matrix T (= the number of elementary -*> reflectors whose product defines the block reflector). -*> If SIDE = 'L', M >= K >= 0; -*> if SIDE = 'R', N >= K >= 0. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX*16 array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,M) if STOREV = 'R' and SIDE = 'L' -*> (LDV,N) if STOREV = 'R' and SIDE = 'R' -*> See Further Details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C' and SIDE = 'L', LDV >= max(1,M); -*> if STOREV = 'C' and SIDE = 'R', LDV >= max(1,N); -*> if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] T -*> \verbatim -*> T is COMPLEX*16 array, dimension (LDT,K) -*> The triangular K-by-K matrix T in the representation of the -*> block reflector. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by H*C or H**H*C or C*H or C*H**H. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (LDWORK,K) -*> \endverbatim -*> -*> \param[in] LDWORK -*> \verbatim -*> LDWORK is INTEGER -*> The leading dimension of the array WORK. -*> If SIDE = 'L', LDWORK >= max(1,N); -*> if SIDE = 'R', LDWORK >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored; the corresponding -*> array elements are modified but restored on exit. The rest of the -*> array is not used. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZLARFB( SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, - $ T, LDT, C, LDC, WORK, LDWORK ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER DIRECT, SIDE, STOREV, TRANS - INTEGER K, LDC, LDT, LDV, LDWORK, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 C( LDC, * ), T( LDT, * ), V( LDV, * ), - $ WORK( LDWORK, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - CHARACTER TRANST - INTEGER I, J -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL ZCOPY, ZGEMM, ZLACGV, ZTRMM -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( M.LE.0 .OR. N.LE.0 ) - $ RETURN -* - IF( LSAME( TRANS, 'N' ) ) THEN - TRANST = 'C' - ELSE - TRANST = 'N' - END IF -* - IF( LSAME( STOREV, 'C' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 ) (first K rows) -* ( V2 ) -* where V1 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* -* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) -* -* W := C1**H -* - DO 10 J = 1, K - CALL ZCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - CALL ZLACGV( N, WORK( 1, J ), 1 ) - 10 CONTINUE -* -* W := W * V1 -* - CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N, - $ K, ONE, V, LDV, WORK, LDWORK ) - IF( M.GT.K ) THEN -* -* W := W + C2**H * V2 -* - CALL ZGEMM( 'Conjugate transpose', 'No transpose', N, - $ K, M-K, ONE, C( K+1, 1 ), LDC, - $ V( K+1, 1 ), LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**H -* - IF( M.GT.K ) THEN -* -* C2 := C2 - V2 * W**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ M-K, N, K, -ONE, V( K+1, 1 ), LDV, WORK, - $ LDWORK, ONE, C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1**H -* - CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', N, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**H -* - DO 30 J = 1, K - DO 20 I = 1, N - C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) ) - 20 CONTINUE - 30 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C1 -* - DO 40 J = 1, K - CALL ZCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 ) - 40 CONTINUE -* -* W := W * V1 -* - CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M, - $ K, ONE, V, LDV, WORK, LDWORK ) - IF( N.GT.K ) THEN -* -* W := W + C2 * V2 -* - CALL ZGEMM( 'No transpose', 'No transpose', M, K, N-K, - $ ONE, C( 1, K+1 ), LDC, V( K+1, 1 ), LDV, - $ ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**H -* - IF( N.GT.K ) THEN -* -* C2 := C2 - W * V2**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', M, - $ N-K, K, -ONE, WORK, LDWORK, V( K+1, 1 ), - $ LDV, ONE, C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1**H -* - CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', M, K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 60 J = 1, K - DO 50 I = 1, M - C( I, J ) = C( I, J ) - WORK( I, J ) - 50 CONTINUE - 60 CONTINUE - END IF -* - ELSE -* -* Let V = ( V1 ) -* ( V2 ) (last K rows) -* where V2 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* -* W := C**H * V = (C1**H * V1 + C2**H * V2) (stored in WORK) -* -* W := C2**H -* - DO 70 J = 1, K - CALL ZCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 ) - CALL ZLACGV( N, WORK( 1, J ), 1 ) - 70 CONTINUE -* -* W := W * V2 -* - CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N, - $ K, ONE, V( M-K+1, 1 ), LDV, WORK, LDWORK ) - IF( M.GT.K ) THEN -* -* W := W + C1**H * V1 -* - CALL ZGEMM( 'Conjugate transpose', 'No transpose', N, - $ K, M-K, ONE, C, LDC, V, LDV, ONE, WORK, - $ LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V * W**H -* - IF( M.GT.K ) THEN -* -* C1 := C1 - V1 * W**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', - $ M-K, N, K, -ONE, V, LDV, WORK, LDWORK, - $ ONE, C, LDC ) - END IF -* -* W := W * V2**H -* - CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', N, K, ONE, V( M-K+1, 1 ), LDV, WORK, - $ LDWORK ) -* -* C2 := C2 - W**H -* - DO 90 J = 1, K - DO 80 I = 1, N - C( M-K+J, I ) = C( M-K+J, I ) - - $ DCONJG( WORK( I, J ) ) - 80 CONTINUE - 90 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* -* W := C * V = (C1*V1 + C2*V2) (stored in WORK) -* -* W := C2 -* - DO 100 J = 1, K - CALL ZCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 ) - 100 CONTINUE -* -* W := W * V2 -* - CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M, - $ K, ONE, V( N-K+1, 1 ), LDV, WORK, LDWORK ) - IF( N.GT.K ) THEN -* -* W := W + C1 * V1 -* - CALL ZGEMM( 'No transpose', 'No transpose', M, K, N-K, - $ ONE, C, LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V**H -* - IF( N.GT.K ) THEN -* -* C1 := C1 - W * V1**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', M, - $ N-K, K, -ONE, WORK, LDWORK, V, LDV, ONE, - $ C, LDC ) - END IF -* -* W := W * V2**H -* - CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', M, K, ONE, V( N-K+1, 1 ), LDV, WORK, - $ LDWORK ) -* -* C2 := C2 - W -* - DO 120 J = 1, K - DO 110 I = 1, M - C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J ) - 110 CONTINUE - 120 CONTINUE - END IF - END IF -* - ELSE IF( LSAME( STOREV, 'R' ) ) THEN -* - IF( LSAME( DIRECT, 'F' ) ) THEN -* -* Let V = ( V1 V2 ) (V1: first K columns) -* where V1 is unit upper triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* -* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) -* -* W := C1**H -* - DO 130 J = 1, K - CALL ZCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 ) - CALL ZLACGV( N, WORK( 1, J ), 1 ) - 130 CONTINUE -* -* W := W * V1**H -* - CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', N, K, ONE, V, LDV, WORK, LDWORK ) - IF( M.GT.K ) THEN -* -* W := W + C2**H * V2**H -* - CALL ZGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', N, K, M-K, ONE, - $ C( K+1, 1 ), LDC, V( 1, K+1 ), LDV, ONE, - $ WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL ZTRMM( 'Right', 'Upper', TRANST, 'Non-unit', N, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**H * W**H -* - IF( M.GT.K ) THEN -* -* C2 := C2 - V2**H * W**H -* - CALL ZGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', M-K, N, K, -ONE, - $ V( 1, K+1 ), LDV, WORK, LDWORK, ONE, - $ C( K+1, 1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', N, - $ K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W**H -* - DO 150 J = 1, K - DO 140 I = 1, N - C( J, I ) = C( J, I ) - DCONJG( WORK( I, J ) ) - 140 CONTINUE - 150 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* -* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) -* -* W := C1 -* - DO 160 J = 1, K - CALL ZCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 ) - 160 CONTINUE -* -* W := W * V1**H -* - CALL ZTRMM( 'Right', 'Upper', 'Conjugate transpose', - $ 'Unit', M, K, ONE, V, LDV, WORK, LDWORK ) - IF( N.GT.K ) THEN -* -* W := W + C2 * V2**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', M, - $ K, N-K, ONE, C( 1, K+1 ), LDC, - $ V( 1, K+1 ), LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL ZTRMM( 'Right', 'Upper', TRANS, 'Non-unit', M, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( N.GT.K ) THEN -* -* C2 := C2 - W * V2 -* - CALL ZGEMM( 'No transpose', 'No transpose', M, N-K, K, - $ -ONE, WORK, LDWORK, V( 1, K+1 ), LDV, ONE, - $ C( 1, K+1 ), LDC ) - END IF -* -* W := W * V1 -* - CALL ZTRMM( 'Right', 'Upper', 'No transpose', 'Unit', M, - $ K, ONE, V, LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 180 J = 1, K - DO 170 I = 1, M - C( I, J ) = C( I, J ) - WORK( I, J ) - 170 CONTINUE - 180 CONTINUE -* - END IF -* - ELSE -* -* Let V = ( V1 V2 ) (V2: last K columns) -* where V2 is unit lower triangular. -* - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form H * C or H**H * C where C = ( C1 ) -* ( C2 ) -* -* W := C**H * V**H = (C1**H * V1**H + C2**H * V2**H) (stored in WORK) -* -* W := C2**H -* - DO 190 J = 1, K - CALL ZCOPY( N, C( M-K+J, 1 ), LDC, WORK( 1, J ), 1 ) - CALL ZLACGV( N, WORK( 1, J ), 1 ) - 190 CONTINUE -* -* W := W * V2**H -* - CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', N, K, ONE, V( 1, M-K+1 ), LDV, WORK, - $ LDWORK ) - IF( M.GT.K ) THEN -* -* W := W + C1**H * V1**H -* - CALL ZGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', N, K, M-K, ONE, C, - $ LDC, V, LDV, ONE, WORK, LDWORK ) - END IF -* -* W := W * T**H or W * T -* - CALL ZTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - V**H * W**H -* - IF( M.GT.K ) THEN -* -* C1 := C1 - V1**H * W**H -* - CALL ZGEMM( 'Conjugate transpose', - $ 'Conjugate transpose', M-K, N, K, -ONE, V, - $ LDV, WORK, LDWORK, ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', N, - $ K, ONE, V( 1, M-K+1 ), LDV, WORK, LDWORK ) -* -* C2 := C2 - W**H -* - DO 210 J = 1, K - DO 200 I = 1, N - C( M-K+J, I ) = C( M-K+J, I ) - - $ DCONJG( WORK( I, J ) ) - 200 CONTINUE - 210 CONTINUE -* - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form C * H or C * H**H where C = ( C1 C2 ) -* -* W := C * V**H = (C1*V1**H + C2*V2**H) (stored in WORK) -* -* W := C2 -* - DO 220 J = 1, K - CALL ZCOPY( M, C( 1, N-K+J ), 1, WORK( 1, J ), 1 ) - 220 CONTINUE -* -* W := W * V2**H -* - CALL ZTRMM( 'Right', 'Lower', 'Conjugate transpose', - $ 'Unit', M, K, ONE, V( 1, N-K+1 ), LDV, WORK, - $ LDWORK ) - IF( N.GT.K ) THEN -* -* W := W + C1 * V1**H -* - CALL ZGEMM( 'No transpose', 'Conjugate transpose', M, - $ K, N-K, ONE, C, LDC, V, LDV, ONE, WORK, - $ LDWORK ) - END IF -* -* W := W * T or W * T**H -* - CALL ZTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K, - $ ONE, T, LDT, WORK, LDWORK ) -* -* C := C - W * V -* - IF( N.GT.K ) THEN -* -* C1 := C1 - W * V1 -* - CALL ZGEMM( 'No transpose', 'No transpose', M, N-K, K, - $ -ONE, WORK, LDWORK, V, LDV, ONE, C, LDC ) - END IF -* -* W := W * V2 -* - CALL ZTRMM( 'Right', 'Lower', 'No transpose', 'Unit', M, - $ K, ONE, V( 1, N-K+1 ), LDV, WORK, LDWORK ) -* -* C1 := C1 - W -* - DO 240 J = 1, K - DO 230 I = 1, M - C( I, N-K+J ) = C( I, N-K+J ) - WORK( I, J ) - 230 CONTINUE - 240 CONTINUE -* - END IF -* - END IF - END IF -* - RETURN -* -* End of ZLARFB -* - END diff --git a/lib/linalg/fortran/zlarfg.f b/lib/linalg/fortran/zlarfg.f deleted file mode 100644 index d69796cadc..0000000000 --- a/lib/linalg/fortran/zlarfg.f +++ /dev/null @@ -1,200 +0,0 @@ -*> \brief \b ZLARFG generates an elementary reflector (Householder matrix). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARFG + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* COMPLEX*16 ALPHA, TAU -* .. -* .. Array Arguments .. -* COMPLEX*16 X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARFG generates a complex elementary reflector H of order n, such -*> that -*> -*> H**H * ( alpha ) = ( beta ), H**H * H = I. -*> ( x ) ( 0 ) -*> -*> where alpha and beta are scalars, with beta real, and x is an -*> (n-1)-element complex vector. H is represented in the form -*> -*> H = I - tau * ( 1 ) * ( 1 v**H ) , -*> ( v ) -*> -*> where tau is a complex scalar and v is a complex (n-1)-element -*> vector. Note that H is not hermitian. -*> -*> If the elements of x are all zero and alpha is real, then tau = 0 -*> and H is taken to be the unit matrix. -*> -*> Otherwise 1 <= real(tau) <= 2 and abs(tau-1) <= 1 . -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the elementary reflector. -*> \endverbatim -*> -*> \param[in,out] ALPHA -*> \verbatim -*> ALPHA is COMPLEX*16 -*> On entry, the value alpha. -*> On exit, it is overwritten with the value beta. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX*16 array, dimension -*> (1+(N-2)*abs(INCX)) -*> On entry, the vector x. -*> On exit, it is overwritten with the vector v. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between elements of X. INCX > 0. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is COMPLEX*16 -*> The value tau. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLARFG( N, ALPHA, X, INCX, TAU ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX, N - COMPLEX*16 ALPHA, TAU -* .. -* .. Array Arguments .. - COMPLEX*16 X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER J, KNT - DOUBLE PRECISION ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH, DLAPY3, DZNRM2 - COMPLEX*16 ZLADIV - EXTERNAL DLAMCH, DLAPY3, DZNRM2, ZLADIV -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, DCMPLX, DIMAG, SIGN -* .. -* .. External Subroutines .. - EXTERNAL ZDSCAL, ZSCAL -* .. -* .. Executable Statements .. -* - IF( N.LE.0 ) THEN - TAU = ZERO - RETURN - END IF -* - XNORM = DZNRM2( N-1, X, INCX ) - ALPHR = DBLE( ALPHA ) - ALPHI = DIMAG( ALPHA ) -* - IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN -* -* H = I -* - TAU = ZERO - ELSE -* -* general case -* - BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) - SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' ) - RSAFMN = ONE / SAFMIN -* - KNT = 0 - IF( ABS( BETA ).LT.SAFMIN ) THEN -* -* XNORM, BETA may be inaccurate; scale X and recompute them -* - 10 CONTINUE - KNT = KNT + 1 - CALL ZDSCAL( N-1, RSAFMN, X, INCX ) - BETA = BETA*RSAFMN - ALPHI = ALPHI*RSAFMN - ALPHR = ALPHR*RSAFMN - IF( (ABS( BETA ).LT.SAFMIN) .AND. (KNT .LT. 20) ) - $ GO TO 10 -* -* New BETA is at most 1, at least SAFMIN -* - XNORM = DZNRM2( N-1, X, INCX ) - ALPHA = DCMPLX( ALPHR, ALPHI ) - BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) - END IF - TAU = DCMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA ) - ALPHA = ZLADIV( DCMPLX( ONE ), ALPHA-BETA ) - CALL ZSCAL( N-1, ALPHA, X, INCX ) -* -* If ALPHA is subnormal, it may lose relative accuracy -* - DO 20 J = 1, KNT - BETA = BETA*SAFMIN - 20 CONTINUE - ALPHA = BETA - END IF -* - RETURN -* -* End of ZLARFG -* - END diff --git a/lib/linalg/fortran/zlarft.f b/lib/linalg/fortran/zlarft.f deleted file mode 100644 index 5ad0996fab..0000000000 --- a/lib/linalg/fortran/zlarft.f +++ /dev/null @@ -1,324 +0,0 @@ -*> \brief \b ZLARFT forms the triangular factor T of a block reflector H = I - vtvH -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARFT + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, STOREV -* INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. -* COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARFT forms the triangular factor T of a complex block reflector H -*> of order n, which is defined as a product of k elementary reflectors. -*> -*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; -*> -*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. -*> -*> If STOREV = 'C', the vector which defines the elementary reflector -*> H(i) is stored in the i-th column of the array V, and -*> -*> H = I - V * T * V**H -*> -*> If STOREV = 'R', the vector which defines the elementary reflector -*> H(i) is stored in the i-th row of the array V, and -*> -*> H = I - V**H * T * V -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies the order in which the elementary reflectors are -*> multiplied to form the block reflector: -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Specifies how the vectors which define the elementary -*> reflectors are stored (see also Further Details): -*> = 'C': columnwise -*> = 'R': rowwise -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the block reflector H. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the triangular factor T (= the number of -*> elementary reflectors). K >= 1. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX*16 array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,N) if STOREV = 'R' -*> The matrix V. See further details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i). -*> \endverbatim -*> -*> \param[out] T -*> \verbatim -*> T is COMPLEX*16 array, dimension (LDT,K) -*> The k by k triangular factor T of the block reflector. -*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is -*> lower triangular. The rest of the array is not used. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER DIRECT, STOREV - INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. - COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE, ZERO - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), - $ ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - INTEGER I, J, PREVLASTV, LASTV -* .. -* .. External Subroutines .. - EXTERNAL ZGEMV, ZTRMV, ZGEMM -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( LSAME( DIRECT, 'F' ) ) THEN - PREVLASTV = N - DO I = 1, K - PREVLASTV = MAX( PREVLASTV, I ) - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = 1, I - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * CONJG( V( I , J ) ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) -* - CALL ZGEMV( 'Conjugate transpose', J-I, I-1, - $ -TAU( I ), V( I+1, 1 ), LDV, - $ V( I+1, I ), 1, ONE, T( 1, I ), 1 ) - ELSE -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( J , I ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H -* - CALL ZGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ), - $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, - $ ONE, T( 1, I ), LDT ) - END IF -* -* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) -* - CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, - $ LDT, T( 1, I ), 1 ) - T( I, I ) = TAU( I ) - IF( I.GT.1 ) THEN - PREVLASTV = MAX( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - END DO - ELSE - PREVLASTV = 1 - DO I = K, 1, -1 - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = I, K - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( I.LT.K ) THEN - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( LASTV, I ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) -* - CALL ZGEMV( 'Conjugate transpose', N-K+I-J, K-I, - $ -TAU( I ), V( J, I+1 ), LDV, V( J, I ), - $ 1, ONE, T( I+1, I ), 1 ) - ELSE -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( I, LASTV ).NE.ZERO ) EXIT - END DO - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( J, N-K+I ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H -* - CALL ZGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ), - $ V( I+1, J ), LDV, V( I, J ), LDV, - $ ONE, T( I+1, I ), LDT ) - END IF -* -* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) -* - CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, - $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) - IF( I.GT.1 ) THEN - PREVLASTV = MIN( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - T( I, I ) = TAU( I ) - END IF - END DO - END IF - RETURN -* -* End of ZLARFT -* - END diff --git a/lib/linalg/fortran/zlascl.f b/lib/linalg/fortran/zlascl.f deleted file mode 100644 index 4cce5ff5e0..0000000000 --- a/lib/linalg/fortran/zlascl.f +++ /dev/null @@ -1,367 +0,0 @@ -*> \brief \b ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLASCL + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER TYPE -* INTEGER INFO, KL, KU, LDA, M, N -* DOUBLE PRECISION CFROM, CTO -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLASCL multiplies the M by N complex matrix A by the real scalar -*> CTO/CFROM. This is done without over/underflow as long as the final -*> result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that -*> A may be full, upper triangular, lower triangular, upper Hessenberg, -*> or banded. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] TYPE -*> \verbatim -*> TYPE is CHARACTER*1 -*> TYPE indices the storage type of the input matrix. -*> = 'G': A is a full matrix. -*> = 'L': A is a lower triangular matrix. -*> = 'U': A is an upper triangular matrix. -*> = 'H': A is an upper Hessenberg matrix. -*> = 'B': A is a symmetric band matrix with lower bandwidth KL -*> and upper bandwidth KU and with the only the lower -*> half stored. -*> = 'Q': A is a symmetric band matrix with lower bandwidth KL -*> and upper bandwidth KU and with the only the upper -*> half stored. -*> = 'Z': A is a band matrix with lower bandwidth KL and upper -*> bandwidth KU. See ZGBTRF for storage details. -*> \endverbatim -*> -*> \param[in] KL -*> \verbatim -*> KL is INTEGER -*> The lower bandwidth of A. Referenced only if TYPE = 'B', -*> 'Q' or 'Z'. -*> \endverbatim -*> -*> \param[in] KU -*> \verbatim -*> KU is INTEGER -*> The upper bandwidth of A. Referenced only if TYPE = 'B', -*> 'Q' or 'Z'. -*> \endverbatim -*> -*> \param[in] CFROM -*> \verbatim -*> CFROM is DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] CTO -*> \verbatim -*> CTO is DOUBLE PRECISION -*> -*> The matrix A is multiplied by CTO/CFROM. A(I,J) is computed -*> without over/underflow if the final result CTO*A(I,J)/CFROM -*> can be represented without over/underflow. CFROM must be -*> nonzero. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> The matrix to be multiplied by CTO/CFROM. See TYPE for the -*> storage type. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> If TYPE = 'G', 'L', 'U', 'H', LDA >= max(1,M); -*> TYPE = 'B', LDA >= KL+1; -*> TYPE = 'Q', LDA >= KU+1; -*> TYPE = 'Z', LDA >= 2*KL+KU+1. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> 0 - successful exit -*> <0 - if INFO = -i, the i-th argument had an illegal value. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER TYPE - INTEGER INFO, KL, KU, LDA, M, N - DOUBLE PRECISION CFROM, CTO -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 ) -* .. -* .. Local Scalars .. - LOGICAL DONE - INTEGER I, ITYPE, J, K1, K2, K3, K4 - DOUBLE PRECISION BIGNUM, CFROM1, CFROMC, CTO1, CTOC, MUL, SMLNUM -* .. -* .. External Functions .. - LOGICAL LSAME, DISNAN - DOUBLE PRECISION DLAMCH - EXTERNAL LSAME, DLAMCH, DISNAN -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, MIN -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 -* - IF( LSAME( TYPE, 'G' ) ) THEN - ITYPE = 0 - ELSE IF( LSAME( TYPE, 'L' ) ) THEN - ITYPE = 1 - ELSE IF( LSAME( TYPE, 'U' ) ) THEN - ITYPE = 2 - ELSE IF( LSAME( TYPE, 'H' ) ) THEN - ITYPE = 3 - ELSE IF( LSAME( TYPE, 'B' ) ) THEN - ITYPE = 4 - ELSE IF( LSAME( TYPE, 'Q' ) ) THEN - ITYPE = 5 - ELSE IF( LSAME( TYPE, 'Z' ) ) THEN - ITYPE = 6 - ELSE - ITYPE = -1 - END IF -* - IF( ITYPE.EQ.-1 ) THEN - INFO = -1 - ELSE IF( CFROM.EQ.ZERO .OR. DISNAN(CFROM) ) THEN - INFO = -4 - ELSE IF( DISNAN(CTO) ) THEN - INFO = -5 - ELSE IF( M.LT.0 ) THEN - INFO = -6 - ELSE IF( N.LT.0 .OR. ( ITYPE.EQ.4 .AND. N.NE.M ) .OR. - $ ( ITYPE.EQ.5 .AND. N.NE.M ) ) THEN - INFO = -7 - ELSE IF( ITYPE.LE.3 .AND. LDA.LT.MAX( 1, M ) ) THEN - INFO = -9 - ELSE IF( ITYPE.GE.4 ) THEN - IF( KL.LT.0 .OR. KL.GT.MAX( M-1, 0 ) ) THEN - INFO = -2 - ELSE IF( KU.LT.0 .OR. KU.GT.MAX( N-1, 0 ) .OR. - $ ( ( ITYPE.EQ.4 .OR. ITYPE.EQ.5 ) .AND. KL.NE.KU ) ) - $ THEN - INFO = -3 - ELSE IF( ( ITYPE.EQ.4 .AND. LDA.LT.KL+1 ) .OR. - $ ( ITYPE.EQ.5 .AND. LDA.LT.KU+1 ) .OR. - $ ( ITYPE.EQ.6 .AND. LDA.LT.2*KL+KU+1 ) ) THEN - INFO = -9 - END IF - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZLASCL', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 .OR. M.EQ.0 ) - $ RETURN -* -* Get machine parameters -* - SMLNUM = DLAMCH( 'S' ) - BIGNUM = ONE / SMLNUM -* - CFROMC = CFROM - CTOC = CTO -* - 10 CONTINUE - CFROM1 = CFROMC*SMLNUM - IF( CFROM1.EQ.CFROMC ) THEN -! CFROMC is an inf. Multiply by a correctly signed zero for -! finite CTOC, or a NaN if CTOC is infinite. - MUL = CTOC / CFROMC - DONE = .TRUE. - CTO1 = CTOC - ELSE - CTO1 = CTOC / BIGNUM - IF( CTO1.EQ.CTOC ) THEN -! CTOC is either 0 or an inf. In both cases, CTOC itself -! serves as the correct multiplication factor. - MUL = CTOC - DONE = .TRUE. - CFROMC = ONE - ELSE IF( ABS( CFROM1 ).GT.ABS( CTOC ) .AND. CTOC.NE.ZERO ) THEN - MUL = SMLNUM - DONE = .FALSE. - CFROMC = CFROM1 - ELSE IF( ABS( CTO1 ).GT.ABS( CFROMC ) ) THEN - MUL = BIGNUM - DONE = .FALSE. - CTOC = CTO1 - ELSE - MUL = CTOC / CFROMC - DONE = .TRUE. - IF (MUL .EQ. ONE) - $ RETURN - END IF - END IF -* - IF( ITYPE.EQ.0 ) THEN -* -* Full matrix -* - DO 30 J = 1, N - DO 20 I = 1, M - A( I, J ) = A( I, J )*MUL - 20 CONTINUE - 30 CONTINUE -* - ELSE IF( ITYPE.EQ.1 ) THEN -* -* Lower triangular matrix -* - DO 50 J = 1, N - DO 40 I = J, M - A( I, J ) = A( I, J )*MUL - 40 CONTINUE - 50 CONTINUE -* - ELSE IF( ITYPE.EQ.2 ) THEN -* -* Upper triangular matrix -* - DO 70 J = 1, N - DO 60 I = 1, MIN( J, M ) - A( I, J ) = A( I, J )*MUL - 60 CONTINUE - 70 CONTINUE -* - ELSE IF( ITYPE.EQ.3 ) THEN -* -* Upper Hessenberg matrix -* - DO 90 J = 1, N - DO 80 I = 1, MIN( J+1, M ) - A( I, J ) = A( I, J )*MUL - 80 CONTINUE - 90 CONTINUE -* - ELSE IF( ITYPE.EQ.4 ) THEN -* -* Lower half of a symmetric band matrix -* - K3 = KL + 1 - K4 = N + 1 - DO 110 J = 1, N - DO 100 I = 1, MIN( K3, K4-J ) - A( I, J ) = A( I, J )*MUL - 100 CONTINUE - 110 CONTINUE -* - ELSE IF( ITYPE.EQ.5 ) THEN -* -* Upper half of a symmetric band matrix -* - K1 = KU + 2 - K3 = KU + 1 - DO 130 J = 1, N - DO 120 I = MAX( K1-J, 1 ), K3 - A( I, J ) = A( I, J )*MUL - 120 CONTINUE - 130 CONTINUE -* - ELSE IF( ITYPE.EQ.6 ) THEN -* -* Band matrix -* - K1 = KL + KU + 2 - K2 = KL + 1 - K3 = 2*KL + KU + 1 - K4 = KL + KU + 1 + M - DO 150 J = 1, N - DO 140 I = MAX( K1-J, K2 ), MIN( K3, K4-J ) - A( I, J ) = A( I, J )*MUL - 140 CONTINUE - 150 CONTINUE -* - END IF -* - IF( .NOT.DONE ) - $ GO TO 10 -* - RETURN -* -* End of ZLASCL -* - END diff --git a/lib/linalg/fortran/zlaset.f b/lib/linalg/fortran/zlaset.f deleted file mode 100644 index 00f5f595fc..0000000000 --- a/lib/linalg/fortran/zlaset.f +++ /dev/null @@ -1,181 +0,0 @@ -*> \brief \b ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLASET + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLASET( UPLO, M, N, ALPHA, BETA, A, LDA ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER LDA, M, N -* COMPLEX*16 ALPHA, BETA -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLASET initializes a 2-D array A to BETA on the diagonal and -*> ALPHA on the offdiagonals. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies the part of the matrix A to be set. -*> = 'U': Upper triangular part is set. The lower triangle -*> is unchanged. -*> = 'L': Lower triangular part is set. The upper triangle -*> is unchanged. -*> Otherwise: All of the matrix A is set. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> On entry, M specifies the number of rows of A. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the number of columns of A. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is COMPLEX*16 -*> All the offdiagonal array elements are set to ALPHA. -*> \endverbatim -*> -*> \param[in] BETA -*> \verbatim -*> BETA is COMPLEX*16 -*> All the diagonal array elements are set to BETA. -*> \endverbatim -*> -*> \param[out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> On entry, the m by n matrix A. -*> On exit, A(i,j) = ALPHA, 1 <= i <= m, 1 <= j <= n, i.ne.j; -*> A(i,i) = BETA , 1 <= i <= min(m,n) -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLASET( UPLO, M, N, ALPHA, BETA, A, LDA ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER LDA, M, N - COMPLEX*16 ALPHA, BETA -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I, J -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Intrinsic Functions .. - INTRINSIC MIN -* .. -* .. Executable Statements .. -* - IF( LSAME( UPLO, 'U' ) ) THEN -* -* Set the diagonal to BETA and the strictly upper triangular -* part of the array to ALPHA. -* - DO 20 J = 2, N - DO 10 I = 1, MIN( J-1, M ) - A( I, J ) = ALPHA - 10 CONTINUE - 20 CONTINUE - DO 30 I = 1, MIN( N, M ) - A( I, I ) = BETA - 30 CONTINUE -* - ELSE IF( LSAME( UPLO, 'L' ) ) THEN -* -* Set the diagonal to BETA and the strictly lower triangular -* part of the array to ALPHA. -* - DO 50 J = 1, MIN( M, N ) - DO 40 I = J + 1, M - A( I, J ) = ALPHA - 40 CONTINUE - 50 CONTINUE - DO 60 I = 1, MIN( N, M ) - A( I, I ) = BETA - 60 CONTINUE -* - ELSE -* -* Set the array to BETA on the diagonal and ALPHA on the -* offdiagonal. -* - DO 80 J = 1, N - DO 70 I = 1, M - A( I, J ) = ALPHA - 70 CONTINUE - 80 CONTINUE - DO 90 I = 1, MIN( M, N ) - A( I, I ) = BETA - 90 CONTINUE - END IF -* - RETURN -* -* End of ZLASET -* - END diff --git a/lib/linalg/fortran/zlasr.f b/lib/linalg/fortran/zlasr.f deleted file mode 100644 index 07c91329c4..0000000000 --- a/lib/linalg/fortran/zlasr.f +++ /dev/null @@ -1,436 +0,0 @@ -*> \brief \b ZLASR applies a sequence of plane rotations to a general rectangular matrix. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLASR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, PIVOT, SIDE -* INTEGER LDA, M, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION C( * ), S( * ) -* COMPLEX*16 A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLASR applies a sequence of real plane rotations to a complex matrix -*> A, from either the left or the right. -*> -*> When SIDE = 'L', the transformation takes the form -*> -*> A := P*A -*> -*> and when SIDE = 'R', the transformation takes the form -*> -*> A := A*P**T -*> -*> where P is an orthogonal matrix consisting of a sequence of z plane -*> rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R', -*> and P**T is the transpose of P. -*> -*> When DIRECT = 'F' (Forward sequence), then -*> -*> P = P(z-1) * ... * P(2) * P(1) -*> -*> and when DIRECT = 'B' (Backward sequence), then -*> -*> P = P(1) * P(2) * ... * P(z-1) -*> -*> where P(k) is a plane rotation matrix defined by the 2-by-2 rotation -*> -*> R(k) = ( c(k) s(k) ) -*> = ( -s(k) c(k) ). -*> -*> When PIVOT = 'V' (Variable pivot), the rotation is performed -*> for the plane (k,k+1), i.e., P(k) has the form -*> -*> P(k) = ( 1 ) -*> ( ... ) -*> ( 1 ) -*> ( c(k) s(k) ) -*> ( -s(k) c(k) ) -*> ( 1 ) -*> ( ... ) -*> ( 1 ) -*> -*> where R(k) appears as a rank-2 modification to the identity matrix in -*> rows and columns k and k+1. -*> -*> When PIVOT = 'T' (Top pivot), the rotation is performed for the -*> plane (1,k+1), so P(k) has the form -*> -*> P(k) = ( c(k) s(k) ) -*> ( 1 ) -*> ( ... ) -*> ( 1 ) -*> ( -s(k) c(k) ) -*> ( 1 ) -*> ( ... ) -*> ( 1 ) -*> -*> where R(k) appears in rows and columns 1 and k+1. -*> -*> Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is -*> performed for the plane (k,z), giving P(k) the form -*> -*> P(k) = ( 1 ) -*> ( ... ) -*> ( 1 ) -*> ( c(k) s(k) ) -*> ( 1 ) -*> ( ... ) -*> ( 1 ) -*> ( -s(k) c(k) ) -*> -*> where R(k) appears in rows and columns k and z. The rotations are -*> performed without ever forming P(k) explicitly. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> Specifies whether the plane rotation matrix P is applied to -*> A on the left or the right. -*> = 'L': Left, compute A := P*A -*> = 'R': Right, compute A:= A*P**T -*> \endverbatim -*> -*> \param[in] PIVOT -*> \verbatim -*> PIVOT is CHARACTER*1 -*> Specifies the plane for which P(k) is a plane rotation -*> matrix. -*> = 'V': Variable pivot, the plane (k,k+1) -*> = 'T': Top pivot, the plane (1,k+1) -*> = 'B': Bottom pivot, the plane (k,z) -*> \endverbatim -*> -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies whether P is a forward or backward sequence of -*> plane rotations. -*> = 'F': Forward, P = P(z-1)*...*P(2)*P(1) -*> = 'B': Backward, P = P(1)*P(2)*...*P(z-1) -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. If m <= 1, an immediate -*> return is effected. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. If n <= 1, an -*> immediate return is effected. -*> \endverbatim -*> -*> \param[in] C -*> \verbatim -*> C is DOUBLE PRECISION array, dimension -*> (M-1) if SIDE = 'L' -*> (N-1) if SIDE = 'R' -*> The cosines c(k) of the plane rotations. -*> \endverbatim -*> -*> \param[in] S -*> \verbatim -*> S is DOUBLE PRECISION array, dimension -*> (M-1) if SIDE = 'L' -*> (N-1) if SIDE = 'R' -*> The sines s(k) of the plane rotations. The 2-by-2 plane -*> rotation part of the matrix P(k), R(k), has the form -*> R(k) = ( c(k) s(k) ) -*> ( -s(k) c(k) ). -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> The M-by-N matrix A. On exit, A is overwritten by P*A if -*> SIDE = 'R' or by A*P**T if SIDE = 'L'. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER DIRECT, PIVOT, SIDE - INTEGER LDA, M, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION C( * ), S( * ) - COMPLEX*16 A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, INFO, J - DOUBLE PRECISION CTEMP, STEMP - COMPLEX*16 TEMP -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Executable Statements .. -* -* Test the input parameters -* - INFO = 0 - IF( .NOT.( LSAME( SIDE, 'L' ) .OR. LSAME( SIDE, 'R' ) ) ) THEN - INFO = 1 - ELSE IF( .NOT.( LSAME( PIVOT, 'V' ) .OR. LSAME( PIVOT, - $ 'T' ) .OR. LSAME( PIVOT, 'B' ) ) ) THEN - INFO = 2 - ELSE IF( .NOT.( LSAME( DIRECT, 'F' ) .OR. LSAME( DIRECT, 'B' ) ) ) - $ THEN - INFO = 3 - ELSE IF( M.LT.0 ) THEN - INFO = 4 - ELSE IF( N.LT.0 ) THEN - INFO = 5 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = 9 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZLASR ', INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( ( M.EQ.0 ) .OR. ( N.EQ.0 ) ) - $ RETURN - IF( LSAME( SIDE, 'L' ) ) THEN -* -* Form P * A -* - IF( LSAME( PIVOT, 'V' ) ) THEN - IF( LSAME( DIRECT, 'F' ) ) THEN - DO 20 J = 1, M - 1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 10 I = 1, N - TEMP = A( J+1, I ) - A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I ) - A( J, I ) = STEMP*TEMP + CTEMP*A( J, I ) - 10 CONTINUE - END IF - 20 CONTINUE - ELSE IF( LSAME( DIRECT, 'B' ) ) THEN - DO 40 J = M - 1, 1, -1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 30 I = 1, N - TEMP = A( J+1, I ) - A( J+1, I ) = CTEMP*TEMP - STEMP*A( J, I ) - A( J, I ) = STEMP*TEMP + CTEMP*A( J, I ) - 30 CONTINUE - END IF - 40 CONTINUE - END IF - ELSE IF( LSAME( PIVOT, 'T' ) ) THEN - IF( LSAME( DIRECT, 'F' ) ) THEN - DO 60 J = 2, M - CTEMP = C( J-1 ) - STEMP = S( J-1 ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 50 I = 1, N - TEMP = A( J, I ) - A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I ) - A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I ) - 50 CONTINUE - END IF - 60 CONTINUE - ELSE IF( LSAME( DIRECT, 'B' ) ) THEN - DO 80 J = M, 2, -1 - CTEMP = C( J-1 ) - STEMP = S( J-1 ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 70 I = 1, N - TEMP = A( J, I ) - A( J, I ) = CTEMP*TEMP - STEMP*A( 1, I ) - A( 1, I ) = STEMP*TEMP + CTEMP*A( 1, I ) - 70 CONTINUE - END IF - 80 CONTINUE - END IF - ELSE IF( LSAME( PIVOT, 'B' ) ) THEN - IF( LSAME( DIRECT, 'F' ) ) THEN - DO 100 J = 1, M - 1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 90 I = 1, N - TEMP = A( J, I ) - A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP - A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP - 90 CONTINUE - END IF - 100 CONTINUE - ELSE IF( LSAME( DIRECT, 'B' ) ) THEN - DO 120 J = M - 1, 1, -1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 110 I = 1, N - TEMP = A( J, I ) - A( J, I ) = STEMP*A( M, I ) + CTEMP*TEMP - A( M, I ) = CTEMP*A( M, I ) - STEMP*TEMP - 110 CONTINUE - END IF - 120 CONTINUE - END IF - END IF - ELSE IF( LSAME( SIDE, 'R' ) ) THEN -* -* Form A * P**T -* - IF( LSAME( PIVOT, 'V' ) ) THEN - IF( LSAME( DIRECT, 'F' ) ) THEN - DO 140 J = 1, N - 1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 130 I = 1, M - TEMP = A( I, J+1 ) - A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J ) - A( I, J ) = STEMP*TEMP + CTEMP*A( I, J ) - 130 CONTINUE - END IF - 140 CONTINUE - ELSE IF( LSAME( DIRECT, 'B' ) ) THEN - DO 160 J = N - 1, 1, -1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 150 I = 1, M - TEMP = A( I, J+1 ) - A( I, J+1 ) = CTEMP*TEMP - STEMP*A( I, J ) - A( I, J ) = STEMP*TEMP + CTEMP*A( I, J ) - 150 CONTINUE - END IF - 160 CONTINUE - END IF - ELSE IF( LSAME( PIVOT, 'T' ) ) THEN - IF( LSAME( DIRECT, 'F' ) ) THEN - DO 180 J = 2, N - CTEMP = C( J-1 ) - STEMP = S( J-1 ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 170 I = 1, M - TEMP = A( I, J ) - A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 ) - A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 ) - 170 CONTINUE - END IF - 180 CONTINUE - ELSE IF( LSAME( DIRECT, 'B' ) ) THEN - DO 200 J = N, 2, -1 - CTEMP = C( J-1 ) - STEMP = S( J-1 ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 190 I = 1, M - TEMP = A( I, J ) - A( I, J ) = CTEMP*TEMP - STEMP*A( I, 1 ) - A( I, 1 ) = STEMP*TEMP + CTEMP*A( I, 1 ) - 190 CONTINUE - END IF - 200 CONTINUE - END IF - ELSE IF( LSAME( PIVOT, 'B' ) ) THEN - IF( LSAME( DIRECT, 'F' ) ) THEN - DO 220 J = 1, N - 1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 210 I = 1, M - TEMP = A( I, J ) - A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP - A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP - 210 CONTINUE - END IF - 220 CONTINUE - ELSE IF( LSAME( DIRECT, 'B' ) ) THEN - DO 240 J = N - 1, 1, -1 - CTEMP = C( J ) - STEMP = S( J ) - IF( ( CTEMP.NE.ONE ) .OR. ( STEMP.NE.ZERO ) ) THEN - DO 230 I = 1, M - TEMP = A( I, J ) - A( I, J ) = STEMP*A( I, N ) + CTEMP*TEMP - A( I, N ) = CTEMP*A( I, N ) - STEMP*TEMP - 230 CONTINUE - END IF - 240 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of ZLASR -* - END diff --git a/lib/linalg/fortran/zlassq.f b/lib/linalg/fortran/zlassq.f deleted file mode 100644 index fd13811bd9..0000000000 --- a/lib/linalg/fortran/zlassq.f +++ /dev/null @@ -1,168 +0,0 @@ -*> \brief \b ZLASSQ updates a sum of squares represented in scaled form. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLASSQ + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLASSQ( N, X, INCX, SCALE, SUMSQ ) -* -* .. Scalar Arguments .. -* INTEGER INCX, N -* DOUBLE PRECISION SCALE, SUMSQ -* .. -* .. Array Arguments .. -* COMPLEX*16 X( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLASSQ returns the values scl and ssq such that -*> -*> ( scl**2 )*ssq = x( 1 )**2 +...+ x( n )**2 + ( scale**2 )*sumsq, -*> -*> where x( i ) = abs( X( 1 + ( i - 1 )*INCX ) ). The value of sumsq is -*> assumed to be at least unity and the value of ssq will then satisfy -*> -*> 1.0 .le. ssq .le. ( sumsq + 2*n ). -*> -*> scale is assumed to be non-negative and scl returns the value -*> -*> scl = max( scale, abs( real( x( i ) ) ), abs( aimag( x( i ) ) ) ), -*> i -*> -*> scale and sumsq must be supplied in SCALE and SUMSQ respectively. -*> SCALE and SUMSQ are overwritten by scl and ssq respectively. -*> -*> The routine makes only one pass through the vector X. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of elements to be used from the vector X. -*> \endverbatim -*> -*> \param[in] X -*> \verbatim -*> X is COMPLEX*16 array, dimension (N) -*> The vector x as described above. -*> x( i ) = X( 1 + ( i - 1 )*INCX ), 1 <= i <= n. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> The increment between successive values of the vector X. -*> INCX > 0. -*> \endverbatim -*> -*> \param[in,out] SCALE -*> \verbatim -*> SCALE is DOUBLE PRECISION -*> On entry, the value scale in the equation above. -*> On exit, SCALE is overwritten with the value scl . -*> \endverbatim -*> -*> \param[in,out] SUMSQ -*> \verbatim -*> SUMSQ is DOUBLE PRECISION -*> On entry, the value sumsq in the equation above. -*> On exit, SUMSQ is overwritten with the value ssq . -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \date December 2016 -* -*> \ingroup complex16OTHERauxiliary -* -* ===================================================================== - SUBROUTINE ZLASSQ( N, X, INCX, SCALE, SUMSQ ) -* -* -- LAPACK auxiliary routine (version 3.7.0) -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* December 2016 -* -* .. Scalar Arguments .. - INTEGER INCX, N - DOUBLE PRECISION SCALE, SUMSQ -* .. -* .. Array Arguments .. - COMPLEX*16 X( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO - PARAMETER ( ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER IX - DOUBLE PRECISION TEMP1 -* .. -* .. External Functions .. - LOGICAL DISNAN - EXTERNAL DISNAN -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, DIMAG -* .. -* .. Executable Statements .. -* - IF( N.GT.0 ) THEN - DO 10 IX = 1, 1 + ( N-1 )*INCX, INCX - TEMP1 = ABS( DBLE( X( IX ) ) ) - IF( TEMP1.GT.ZERO.OR.DISNAN( TEMP1 ) ) THEN - IF( SCALE.LT.TEMP1 ) THEN - SUMSQ = 1 + SUMSQ*( SCALE / TEMP1 )**2 - SCALE = TEMP1 - ELSE - SUMSQ = SUMSQ + ( TEMP1 / SCALE )**2 - END IF - END IF - TEMP1 = ABS( DIMAG( X( IX ) ) ) - IF( TEMP1.GT.ZERO.OR.DISNAN( TEMP1 ) ) THEN - IF( SCALE.LT.TEMP1 ) THEN - SUMSQ = 1 + SUMSQ*( SCALE / TEMP1 )**2 - SCALE = TEMP1 - ELSE - SUMSQ = SUMSQ + ( TEMP1 / SCALE )**2 - END IF - END IF - 10 CONTINUE - END IF -* - RETURN -* -* End of ZLASSQ -* - END diff --git a/lib/linalg/fortran/zlatrd.f b/lib/linalg/fortran/zlatrd.f deleted file mode 100644 index ee2a484723..0000000000 --- a/lib/linalg/fortran/zlatrd.f +++ /dev/null @@ -1,355 +0,0 @@ -*> \brief \b ZLATRD reduces the first nb rows and columns of a symmetric/Hermitian matrix A to real tridiagonal form by an unitary similarity transformation. -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLATRD + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER LDA, LDW, N, NB -* .. -* .. Array Arguments .. -* DOUBLE PRECISION E( * ) -* COMPLEX*16 A( LDA, * ), TAU( * ), W( LDW, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLATRD reduces NB rows and columns of a complex Hermitian matrix A to -*> Hermitian tridiagonal form by a unitary similarity -*> transformation Q**H * A * Q, and returns the matrices V and W which are -*> needed to apply the transformation to the unreduced part of A. -*> -*> If UPLO = 'U', ZLATRD reduces the last NB rows and columns of a -*> matrix, of which the upper triangle is supplied; -*> if UPLO = 'L', ZLATRD reduces the first NB rows and columns of a -*> matrix, of which the lower triangle is supplied. -*> -*> This is an auxiliary routine called by ZHETRD. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> Specifies whether the upper or lower triangular part of the -*> Hermitian matrix A is stored: -*> = 'U': Upper triangular -*> = 'L': Lower triangular -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. -*> \endverbatim -*> -*> \param[in] NB -*> \verbatim -*> NB is INTEGER -*> The number of rows and columns to be reduced. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> On entry, the Hermitian matrix A. If UPLO = 'U', the leading -*> n-by-n upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading n-by-n lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> On exit: -*> if UPLO = 'U', the last NB columns have been reduced to -*> tridiagonal form, with the diagonal elements overwriting -*> the diagonal elements of A; the elements above the diagonal -*> with the array TAU, represent the unitary matrix Q as a -*> product of elementary reflectors; -*> if UPLO = 'L', the first NB columns have been reduced to -*> tridiagonal form, with the diagonal elements overwriting -*> the diagonal elements of A; the elements below the diagonal -*> with the array TAU, represent the unitary matrix Q as a -*> product of elementary reflectors. -*> See Further Details. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> If UPLO = 'U', E(n-nb:n-1) contains the superdiagonal -*> elements of the last NB columns of the reduced matrix; -*> if UPLO = 'L', E(1:nb) contains the subdiagonal elements of -*> the first NB columns of the reduced matrix. -*> \endverbatim -*> -*> \param[out] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (N-1) -*> The scalar factors of the elementary reflectors, stored in -*> TAU(n-nb:n-1) if UPLO = 'U', and in TAU(1:nb) if UPLO = 'L'. -*> See Further Details. -*> \endverbatim -*> -*> \param[out] W -*> \verbatim -*> W is COMPLEX*16 array, dimension (LDW,NB) -*> The n-by-nb matrix W required to update the unreduced part -*> of A. -*> \endverbatim -*> -*> \param[in] LDW -*> \verbatim -*> LDW is INTEGER -*> The leading dimension of the array W. LDW >= max(1,N). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> If UPLO = 'U', the matrix Q is represented as a product of elementary -*> reflectors -*> -*> Q = H(n) H(n-1) . . . H(n-nb+1). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**H -*> -*> where tau is a complex scalar, and v is a complex vector with -*> v(i:n) = 0 and v(i-1) = 1; v(1:i-1) is stored on exit in A(1:i-1,i), -*> and tau in TAU(i-1). -*> -*> If UPLO = 'L', the matrix Q is represented as a product of elementary -*> reflectors -*> -*> Q = H(1) H(2) . . . H(nb). -*> -*> Each H(i) has the form -*> -*> H(i) = I - tau * v * v**H -*> -*> where tau is a complex scalar, and v is a complex vector with -*> v(1:i) = 0 and v(i+1) = 1; v(i+1:n) is stored on exit in A(i+1:n,i), -*> and tau in TAU(i). -*> -*> The elements of the vectors v together form the n-by-nb matrix V -*> which is needed, with W, to apply the transformation to the unreduced -*> part of the matrix, using a Hermitian rank-2k update of the form: -*> A := A - V*W**H - W*V**H. -*> -*> The contents of A on exit are illustrated by the following examples -*> with n = 5 and nb = 2: -*> -*> if UPLO = 'U': if UPLO = 'L': -*> -*> ( a a a v4 v5 ) ( d ) -*> ( a a v4 v5 ) ( 1 d ) -*> ( a 1 v5 ) ( v1 1 a ) -*> ( d 1 ) ( v1 v2 a a ) -*> ( d ) ( v1 v2 a a a ) -*> -*> where d denotes a diagonal element of the reduced matrix, a denotes -*> an element of the original matrix that is unchanged, and vi denotes -*> an element of the vector defining H(i). -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZLATRD( UPLO, N, NB, A, LDA, E, TAU, W, LDW ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER LDA, LDW, N, NB -* .. -* .. Array Arguments .. - DOUBLE PRECISION E( * ) - COMPLEX*16 A( LDA, * ), TAU( * ), W( LDW, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO, ONE, HALF - PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ), - $ ONE = ( 1.0D+0, 0.0D+0 ), - $ HALF = ( 0.5D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - INTEGER I, IW - COMPLEX*16 ALPHA -* .. -* .. External Subroutines .. - EXTERNAL ZAXPY, ZGEMV, ZHEMV, ZLACGV, ZLARFG, ZSCAL -* .. -* .. External Functions .. - LOGICAL LSAME - COMPLEX*16 ZDOTC - EXTERNAL LSAME, ZDOTC -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, MIN -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.LE.0 ) - $ RETURN -* - IF( LSAME( UPLO, 'U' ) ) THEN -* -* Reduce last NB columns of upper triangle -* - DO 10 I = N, N - NB + 1, -1 - IW = I - N + NB - IF( I.LT.N ) THEN -* -* Update A(1:i,i) -* - A( I, I ) = DBLE( A( I, I ) ) - CALL ZLACGV( N-I, W( I, IW+1 ), LDW ) - CALL ZGEMV( 'No transpose', I, N-I, -ONE, A( 1, I+1 ), - $ LDA, W( I, IW+1 ), LDW, ONE, A( 1, I ), 1 ) - CALL ZLACGV( N-I, W( I, IW+1 ), LDW ) - CALL ZLACGV( N-I, A( I, I+1 ), LDA ) - CALL ZGEMV( 'No transpose', I, N-I, -ONE, W( 1, IW+1 ), - $ LDW, A( I, I+1 ), LDA, ONE, A( 1, I ), 1 ) - CALL ZLACGV( N-I, A( I, I+1 ), LDA ) - A( I, I ) = DBLE( A( I, I ) ) - END IF - IF( I.GT.1 ) THEN -* -* Generate elementary reflector H(i) to annihilate -* A(1:i-2,i) -* - ALPHA = A( I-1, I ) - CALL ZLARFG( I-1, ALPHA, A( 1, I ), 1, TAU( I-1 ) ) - E( I-1 ) = DBLE( ALPHA ) - A( I-1, I ) = ONE -* -* Compute W(1:i-1,i) -* - CALL ZHEMV( 'Upper', I-1, ONE, A, LDA, A( 1, I ), 1, - $ ZERO, W( 1, IW ), 1 ) - IF( I.LT.N ) THEN - CALL ZGEMV( 'Conjugate transpose', I-1, N-I, ONE, - $ W( 1, IW+1 ), LDW, A( 1, I ), 1, ZERO, - $ W( I+1, IW ), 1 ) - CALL ZGEMV( 'No transpose', I-1, N-I, -ONE, - $ A( 1, I+1 ), LDA, W( I+1, IW ), 1, ONE, - $ W( 1, IW ), 1 ) - CALL ZGEMV( 'Conjugate transpose', I-1, N-I, ONE, - $ A( 1, I+1 ), LDA, A( 1, I ), 1, ZERO, - $ W( I+1, IW ), 1 ) - CALL ZGEMV( 'No transpose', I-1, N-I, -ONE, - $ W( 1, IW+1 ), LDW, W( I+1, IW ), 1, ONE, - $ W( 1, IW ), 1 ) - END IF - CALL ZSCAL( I-1, TAU( I-1 ), W( 1, IW ), 1 ) - ALPHA = -HALF*TAU( I-1 )*ZDOTC( I-1, W( 1, IW ), 1, - $ A( 1, I ), 1 ) - CALL ZAXPY( I-1, ALPHA, A( 1, I ), 1, W( 1, IW ), 1 ) - END IF -* - 10 CONTINUE - ELSE -* -* Reduce first NB columns of lower triangle -* - DO 20 I = 1, NB -* -* Update A(i:n,i) -* - A( I, I ) = DBLE( A( I, I ) ) - CALL ZLACGV( I-1, W( I, 1 ), LDW ) - CALL ZGEMV( 'No transpose', N-I+1, I-1, -ONE, A( I, 1 ), - $ LDA, W( I, 1 ), LDW, ONE, A( I, I ), 1 ) - CALL ZLACGV( I-1, W( I, 1 ), LDW ) - CALL ZLACGV( I-1, A( I, 1 ), LDA ) - CALL ZGEMV( 'No transpose', N-I+1, I-1, -ONE, W( I, 1 ), - $ LDW, A( I, 1 ), LDA, ONE, A( I, I ), 1 ) - CALL ZLACGV( I-1, A( I, 1 ), LDA ) - A( I, I ) = DBLE( A( I, I ) ) - IF( I.LT.N ) THEN -* -* Generate elementary reflector H(i) to annihilate -* A(i+2:n,i) -* - ALPHA = A( I+1, I ) - CALL ZLARFG( N-I, ALPHA, A( MIN( I+2, N ), I ), 1, - $ TAU( I ) ) - E( I ) = DBLE( ALPHA ) - A( I+1, I ) = ONE -* -* Compute W(i+1:n,i) -* - CALL ZHEMV( 'Lower', N-I, ONE, A( I+1, I+1 ), LDA, - $ A( I+1, I ), 1, ZERO, W( I+1, I ), 1 ) - CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE, - $ W( I+1, 1 ), LDW, A( I+1, I ), 1, ZERO, - $ W( 1, I ), 1 ) - CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, A( I+1, 1 ), - $ LDA, W( 1, I ), 1, ONE, W( I+1, I ), 1 ) - CALL ZGEMV( 'Conjugate transpose', N-I, I-1, ONE, - $ A( I+1, 1 ), LDA, A( I+1, I ), 1, ZERO, - $ W( 1, I ), 1 ) - CALL ZGEMV( 'No transpose', N-I, I-1, -ONE, W( I+1, 1 ), - $ LDW, W( 1, I ), 1, ONE, W( I+1, I ), 1 ) - CALL ZSCAL( N-I, TAU( I ), W( I+1, I ), 1 ) - ALPHA = -HALF*TAU( I )*ZDOTC( N-I, W( I+1, I ), 1, - $ A( I+1, I ), 1 ) - CALL ZAXPY( N-I, ALPHA, A( I+1, I ), 1, W( I+1, I ), 1 ) - END IF -* - 20 CONTINUE - END IF -* - RETURN -* -* End of ZLATRD -* - END diff --git a/lib/linalg/fortran/zpptrf.f b/lib/linalg/fortran/zpptrf.f deleted file mode 100644 index a34d639131..0000000000 --- a/lib/linalg/fortran/zpptrf.f +++ /dev/null @@ -1,238 +0,0 @@ -*> \brief \b ZPPTRF -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZPPTRF + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZPPTRF( UPLO, N, AP, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, N -* .. -* .. Array Arguments .. -* COMPLEX*16 AP( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZPPTRF computes the Cholesky factorization of a complex Hermitian -*> positive definite matrix A stored in packed format. -*> -*> The factorization has the form -*> A = U**H * U, if UPLO = 'U', or -*> A = L * L**H, if UPLO = 'L', -*> where U is an upper triangular matrix and L is lower triangular. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored; -*> = 'L': Lower triangle of A is stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] AP -*> \verbatim -*> AP is COMPLEX*16 array, dimension (N*(N+1)/2) -*> On entry, the upper or lower triangle of the Hermitian matrix -*> A, packed columnwise in a linear array. The j-th column of A -*> is stored in the array AP as follows: -*> if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; -*> if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n. -*> See below for further details. -*> -*> On exit, if INFO = 0, the triangular factor U or L from the -*> Cholesky factorization A = U**H*U or A = L*L**H, in the same -*> storage format as A. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, the leading minor of order i is not -*> positive definite, and the factorization could not be -*> completed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The packed storage scheme is illustrated by the following example -*> when N = 4, UPLO = 'U': -*> -*> Two-dimensional storage of the Hermitian matrix A: -*> -*> a11 a12 a13 a14 -*> a22 a23 a24 -*> a33 a34 (aij = conjg(aji)) -*> a44 -*> -*> Packed storage of the upper triangle of A: -*> -*> AP = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ] -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZPPTRF( UPLO, N, AP, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, N -* .. -* .. Array Arguments .. - COMPLEX*16 AP( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE - PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL UPPER - INTEGER J, JC, JJ - DOUBLE PRECISION AJJ -* .. -* .. External Functions .. - LOGICAL LSAME - COMPLEX*16 ZDOTC - EXTERNAL LSAME, ZDOTC -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZDSCAL, ZHPR, ZTPSV -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZPPTRF', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( UPPER ) THEN -* -* Compute the Cholesky factorization A = U**H * U. -* - JJ = 0 - DO 10 J = 1, N - JC = JJ + 1 - JJ = JJ + J -* -* Compute elements 1:J-1 of column J. -* - IF( J.GT.1 ) - $ CALL ZTPSV( 'Upper', 'Conjugate transpose', 'Non-unit', - $ J-1, AP, AP( JC ), 1 ) -* -* Compute U(J,J) and test for non-positive-definiteness. -* - AJJ = DBLE( AP( JJ ) ) - DBLE( ZDOTC( J-1, - $ AP( JC ), 1, AP( JC ), 1 ) ) - IF( AJJ.LE.ZERO ) THEN - AP( JJ ) = AJJ - GO TO 30 - END IF - AP( JJ ) = SQRT( AJJ ) - 10 CONTINUE - ELSE -* -* Compute the Cholesky factorization A = L * L**H. -* - JJ = 1 - DO 20 J = 1, N -* -* Compute L(J,J) and test for non-positive-definiteness. -* - AJJ = DBLE( AP( JJ ) ) - IF( AJJ.LE.ZERO ) THEN - AP( JJ ) = AJJ - GO TO 30 - END IF - AJJ = SQRT( AJJ ) - AP( JJ ) = AJJ -* -* Compute elements J+1:N of column J and update the trailing -* submatrix. -* - IF( J.LT.N ) THEN - CALL ZDSCAL( N-J, ONE / AJJ, AP( JJ+1 ), 1 ) - CALL ZHPR( 'Lower', N-J, -ONE, AP( JJ+1 ), 1, - $ AP( JJ+N-J+1 ) ) - JJ = JJ + N - J + 1 - END IF - 20 CONTINUE - END IF - GO TO 40 -* - 30 CONTINUE - INFO = J -* - 40 CONTINUE - RETURN -* -* End of ZPPTRF -* - END diff --git a/lib/linalg/fortran/zpptri.f b/lib/linalg/fortran/zpptri.f deleted file mode 100644 index a74466eb80..0000000000 --- a/lib/linalg/fortran/zpptri.f +++ /dev/null @@ -1,187 +0,0 @@ -*> \brief \b ZPPTRI -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZPPTRI + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZPPTRI( UPLO, N, AP, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, N -* .. -* .. Array Arguments .. -* COMPLEX*16 AP( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZPPTRI computes the inverse of a complex Hermitian positive definite -*> matrix A using the Cholesky factorization A = U**H*U or A = L*L**H -*> computed by ZPPTRF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangular factor is stored in AP; -*> = 'L': Lower triangular factor is stored in AP. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] AP -*> \verbatim -*> AP is COMPLEX*16 array, dimension (N*(N+1)/2) -*> On entry, the triangular factor U or L from the Cholesky -*> factorization A = U**H*U or A = L*L**H, packed columnwise as -*> a linear array. The j-th column of U or L is stored in the -*> array AP as follows: -*> if UPLO = 'U', AP(i + (j-1)*j/2) = U(i,j) for 1<=i<=j; -*> if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = L(i,j) for j<=i<=n. -*> -*> On exit, the upper or lower triangle of the (Hermitian) -*> inverse of A, overwriting the input factor U or L. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, the (i,i) element of the factor U or L is -*> zero, and the inverse could not be computed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZPPTRI( UPLO, N, AP, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, N -* .. -* .. Array Arguments .. - COMPLEX*16 AP( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE - PARAMETER ( ONE = 1.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL UPPER - INTEGER J, JC, JJ, JJN - DOUBLE PRECISION AJJ -* .. -* .. External Functions .. - LOGICAL LSAME - COMPLEX*16 ZDOTC - EXTERNAL LSAME, ZDOTC -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZDSCAL, ZHPR, ZTPMV, ZTPTRI -* .. -* .. Intrinsic Functions .. - INTRINSIC DBLE -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZPPTRI', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* Invert the triangular Cholesky factor U or L. -* - CALL ZTPTRI( UPLO, 'Non-unit', N, AP, INFO ) - IF( INFO.GT.0 ) - $ RETURN - IF( UPPER ) THEN -* -* Compute the product inv(U) * inv(U)**H. -* - JJ = 0 - DO 10 J = 1, N - JC = JJ + 1 - JJ = JJ + J - IF( J.GT.1 ) - $ CALL ZHPR( 'Upper', J-1, ONE, AP( JC ), 1, AP ) - AJJ = DBLE( AP( JJ ) ) - CALL ZDSCAL( J, AJJ, AP( JC ), 1 ) - 10 CONTINUE -* - ELSE -* -* Compute the product inv(L)**H * inv(L). -* - JJ = 1 - DO 20 J = 1, N - JJN = JJ + N - J + 1 - AP( JJ ) = DBLE( ZDOTC( N-J+1, AP( JJ ), 1, AP( JJ ), 1 ) ) - IF( J.LT.N ) - $ CALL ZTPMV( 'Lower', 'Conjugate transpose', 'Non-unit', - $ N-J, AP( JJN ), AP( JJ+1 ), 1 ) - JJ = JJN - 20 CONTINUE - END IF -* - RETURN -* -* End of ZPPTRI -* - END diff --git a/lib/linalg/fortran/zscal.f b/lib/linalg/fortran/zscal.f deleted file mode 100644 index 8b8c2c8ab5..0000000000 --- a/lib/linalg/fortran/zscal.f +++ /dev/null @@ -1,121 +0,0 @@ -*> \brief \b ZSCAL -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZSCAL(N,ZA,ZX,INCX) -* -* .. Scalar Arguments .. -* COMPLEX*16 ZA -* INTEGER INCX,N -* .. -* .. Array Arguments .. -* COMPLEX*16 ZX(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZSCAL scales a vector by a constant. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in] ZA -*> \verbatim -*> ZA is COMPLEX*16 -*> On entry, ZA specifies the scalar alpha. -*> \endverbatim -*> -*> \param[in,out] ZX -*> \verbatim -*> ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of ZX -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, 3/11/78. -*> modified 3/93 to return if incx .le. 0. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZSCAL(N,ZA,ZX,INCX) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - COMPLEX*16 ZA - INTEGER INCX,N -* .. -* .. Array Arguments .. - COMPLEX*16 ZX(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - INTEGER I,NINCX -* .. -* .. Parameters .. - COMPLEX*16 ONE - PARAMETER (ONE= (1.0D+0,0.0D+0)) -* .. - IF (N.LE.0 .OR. INCX.LE.0 .OR. ZA.EQ.ONE) RETURN - IF (INCX.EQ.1) THEN -* -* code for increment equal to 1 -* - DO I = 1,N - ZX(I) = ZA*ZX(I) - END DO - ELSE -* -* code for increment not equal to 1 -* - NINCX = N*INCX - DO I = 1,NINCX,INCX - ZX(I) = ZA*ZX(I) - END DO - END IF - RETURN -* -* End of ZSCAL -* - END diff --git a/lib/linalg/fortran/zstedc.f b/lib/linalg/fortran/zstedc.f deleted file mode 100644 index 74d390af7e..0000000000 --- a/lib/linalg/fortran/zstedc.f +++ /dev/null @@ -1,483 +0,0 @@ -*> \brief \b ZSTEDC -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZSTEDC + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, -* LRWORK, IWORK, LIWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER COMPZ -* INTEGER INFO, LDZ, LIWORK, LRWORK, LWORK, N -* .. -* .. Array Arguments .. -* INTEGER IWORK( * ) -* DOUBLE PRECISION D( * ), E( * ), RWORK( * ) -* COMPLEX*16 WORK( * ), Z( LDZ, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZSTEDC computes all eigenvalues and, optionally, eigenvectors of a -*> symmetric tridiagonal matrix using the divide and conquer method. -*> The eigenvectors of a full or band complex Hermitian matrix can also -*> be found if ZHETRD or ZHPTRD or ZHBTRD has been used to reduce this -*> matrix to tridiagonal form. -*> -*> This code makes very mild assumptions about floating point -*> arithmetic. It will work on machines with a guard digit in -*> add/subtract, or on those binary machines without guard digits -*> which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. -*> It could conceivably fail on hexadecimal or decimal machines -*> without guard digits, but we know of none. See DLAED3 for details. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] COMPZ -*> \verbatim -*> COMPZ is CHARACTER*1 -*> = 'N': Compute eigenvalues only. -*> = 'I': Compute eigenvectors of tridiagonal matrix also. -*> = 'V': Compute eigenvectors of original Hermitian matrix -*> also. On entry, Z contains the unitary matrix used -*> to reduce the original matrix to tridiagonal form. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The dimension of the symmetric tridiagonal matrix. N >= 0. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the diagonal elements of the tridiagonal matrix. -*> On exit, if INFO = 0, the eigenvalues in ascending order. -*> \endverbatim -*> -*> \param[in,out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> On entry, the subdiagonal elements of the tridiagonal matrix. -*> On exit, E has been destroyed. -*> \endverbatim -*> -*> \param[in,out] Z -*> \verbatim -*> Z is COMPLEX*16 array, dimension (LDZ,N) -*> On entry, if COMPZ = 'V', then Z contains the unitary -*> matrix used in the reduction to tridiagonal form. -*> On exit, if INFO = 0, then if COMPZ = 'V', Z contains the -*> orthonormal eigenvectors of the original Hermitian matrix, -*> and if COMPZ = 'I', Z contains the orthonormal eigenvectors -*> of the symmetric tridiagonal matrix. -*> If COMPZ = 'N', then Z is not referenced. -*> \endverbatim -*> -*> \param[in] LDZ -*> \verbatim -*> LDZ is INTEGER -*> The leading dimension of the array Z. LDZ >= 1. -*> If eigenvectors are desired, then LDZ >= max(1,N). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> If COMPZ = 'N' or 'I', or N <= 1, LWORK must be at least 1. -*> If COMPZ = 'V' and N > 1, LWORK must be at least N*N. -*> Note that for COMPZ = 'V', then if N is less than or -*> equal to the minimum divide size, usually 25, then LWORK need -*> only be 1. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal sizes of the WORK, RWORK and -*> IWORK arrays, returns these values as the first entries of -*> the WORK, RWORK and IWORK arrays, and no error message -*> related to LWORK or LRWORK or LIWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] RWORK -*> \verbatim -*> RWORK is DOUBLE PRECISION array, dimension (MAX(1,LRWORK)) -*> On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK. -*> \endverbatim -*> -*> \param[in] LRWORK -*> \verbatim -*> LRWORK is INTEGER -*> The dimension of the array RWORK. -*> If COMPZ = 'N' or N <= 1, LRWORK must be at least 1. -*> If COMPZ = 'V' and N > 1, LRWORK must be at least -*> 1 + 3*N + 2*N*lg N + 4*N**2 , -*> where lg( N ) = smallest integer k such -*> that 2**k >= N. -*> If COMPZ = 'I' and N > 1, LRWORK must be at least -*> 1 + 4*N + 2*N**2 . -*> Note that for COMPZ = 'I' or 'V', then if N is less than or -*> equal to the minimum divide size, usually 25, then LRWORK -*> need only be max(1,2*(N-1)). -*> -*> If LRWORK = -1, then a workspace query is assumed; the -*> routine only calculates the optimal sizes of the WORK, RWORK -*> and IWORK arrays, returns these values as the first entries -*> of the WORK, RWORK and IWORK arrays, and no error message -*> related to LWORK or LRWORK or LIWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] IWORK -*> \verbatim -*> IWORK is INTEGER array, dimension (MAX(1,LIWORK)) -*> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. -*> \endverbatim -*> -*> \param[in] LIWORK -*> \verbatim -*> LIWORK is INTEGER -*> The dimension of the array IWORK. -*> If COMPZ = 'N' or N <= 1, LIWORK must be at least 1. -*> If COMPZ = 'V' or N > 1, LIWORK must be at least -*> 6 + 6*N + 5*N*lg N. -*> If COMPZ = 'I' or N > 1, LIWORK must be at least -*> 3 + 5*N . -*> Note that for COMPZ = 'I' or 'V', then if N is less than or -*> equal to the minimum divide size, usually 25, then LIWORK -*> need only be 1. -*> -*> If LIWORK = -1, then a workspace query is assumed; the -*> routine only calculates the optimal sizes of the WORK, RWORK -*> and IWORK arrays, returns these values as the first entries -*> of the WORK, RWORK and IWORK arrays, and no error message -*> related to LWORK or LRWORK or LIWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit. -*> < 0: if INFO = -i, the i-th argument had an illegal value. -*> > 0: The algorithm failed to compute an eigenvalue while -*> working on the submatrix lying in rows and columns -*> INFO/(N+1) through mod(INFO,N+1). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -*> \par Contributors: -* ================== -*> -*> Jeff Rutter, Computer Science Division, University of California -*> at Berkeley, USA -* -* ===================================================================== - SUBROUTINE ZSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, - $ LRWORK, IWORK, LIWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER COMPZ - INTEGER INFO, LDZ, LIWORK, LRWORK, LWORK, N -* .. -* .. Array Arguments .. - INTEGER IWORK( * ) - DOUBLE PRECISION D( * ), E( * ), RWORK( * ) - COMPLEX*16 WORK( * ), Z( LDZ, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE, TWO - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0 ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER FINISH, I, ICOMPZ, II, J, K, LGN, LIWMIN, LL, - $ LRWMIN, LWMIN, M, SMLSIZ, START - DOUBLE PRECISION EPS, ORGNRM, P, TINY -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - DOUBLE PRECISION DLAMCH, DLANST - EXTERNAL LSAME, ILAENV, DLAMCH, DLANST -* .. -* .. External Subroutines .. - EXTERNAL DLASCL, DLASET, DSTEDC, DSTEQR, DSTERF, XERBLA, - $ ZLACPY, ZLACRM, ZLAED0, ZSTEQR, ZSWAP -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, DBLE, INT, LOG, MAX, MOD, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - LQUERY = ( LWORK.EQ.-1 .OR. LRWORK.EQ.-1 .OR. LIWORK.EQ.-1 ) -* - IF( LSAME( COMPZ, 'N' ) ) THEN - ICOMPZ = 0 - ELSE IF( LSAME( COMPZ, 'V' ) ) THEN - ICOMPZ = 1 - ELSE IF( LSAME( COMPZ, 'I' ) ) THEN - ICOMPZ = 2 - ELSE - ICOMPZ = -1 - END IF - IF( ICOMPZ.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( ( LDZ.LT.1 ) .OR. - $ ( ICOMPZ.GT.0 .AND. LDZ.LT.MAX( 1, N ) ) ) THEN - INFO = -6 - END IF -* - IF( INFO.EQ.0 ) THEN -* -* Compute the workspace requirements -* - SMLSIZ = ILAENV( 9, 'ZSTEDC', ' ', 0, 0, 0, 0 ) - IF( N.LE.1 .OR. ICOMPZ.EQ.0 ) THEN - LWMIN = 1 - LIWMIN = 1 - LRWMIN = 1 - ELSE IF( N.LE.SMLSIZ ) THEN - LWMIN = 1 - LIWMIN = 1 - LRWMIN = 2*( N - 1 ) - ELSE IF( ICOMPZ.EQ.1 ) THEN - LGN = INT( LOG( DBLE( N ) ) / LOG( TWO ) ) - IF( 2**LGN.LT.N ) - $ LGN = LGN + 1 - IF( 2**LGN.LT.N ) - $ LGN = LGN + 1 - LWMIN = N*N - LRWMIN = 1 + 3*N + 2*N*LGN + 4*N**2 - LIWMIN = 6 + 6*N + 5*N*LGN - ELSE IF( ICOMPZ.EQ.2 ) THEN - LWMIN = 1 - LRWMIN = 1 + 4*N + 2*N**2 - LIWMIN = 3 + 5*N - END IF - WORK( 1 ) = LWMIN - RWORK( 1 ) = LRWMIN - IWORK( 1 ) = LIWMIN -* - IF( LWORK.LT.LWMIN .AND. .NOT.LQUERY ) THEN - INFO = -8 - ELSE IF( LRWORK.LT.LRWMIN .AND. .NOT.LQUERY ) THEN - INFO = -10 - ELSE IF( LIWORK.LT.LIWMIN .AND. .NOT.LQUERY ) THEN - INFO = -12 - END IF - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZSTEDC', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN - IF( N.EQ.1 ) THEN - IF( ICOMPZ.NE.0 ) - $ Z( 1, 1 ) = ONE - RETURN - END IF -* -* If the following conditional clause is removed, then the routine -* will use the Divide and Conquer routine to compute only the -* eigenvalues, which requires (3N + 3N**2) real workspace and -* (2 + 5N + 2N lg(N)) integer workspace. -* Since on many architectures DSTERF is much faster than any other -* algorithm for finding eigenvalues only, it is used here -* as the default. If the conditional clause is removed, then -* information on the size of workspace needs to be changed. -* -* If COMPZ = 'N', use DSTERF to compute the eigenvalues. -* - IF( ICOMPZ.EQ.0 ) THEN - CALL DSTERF( N, D, E, INFO ) - GO TO 70 - END IF -* -* If N is smaller than the minimum divide size (SMLSIZ+1), then -* solve the problem with another solver. -* - IF( N.LE.SMLSIZ ) THEN -* - CALL ZSTEQR( COMPZ, N, D, E, Z, LDZ, RWORK, INFO ) -* - ELSE -* -* If COMPZ = 'I', we simply call DSTEDC instead. -* - IF( ICOMPZ.EQ.2 ) THEN - CALL DLASET( 'Full', N, N, ZERO, ONE, RWORK, N ) - LL = N*N + 1 - CALL DSTEDC( 'I', N, D, E, RWORK, N, - $ RWORK( LL ), LRWORK-LL+1, IWORK, LIWORK, INFO ) - DO 20 J = 1, N - DO 10 I = 1, N - Z( I, J ) = RWORK( ( J-1 )*N+I ) - 10 CONTINUE - 20 CONTINUE - GO TO 70 - END IF -* -* From now on, only option left to be handled is COMPZ = 'V', -* i.e. ICOMPZ = 1. -* -* Scale. -* - ORGNRM = DLANST( 'M', N, D, E ) - IF( ORGNRM.EQ.ZERO ) - $ GO TO 70 -* - EPS = DLAMCH( 'Epsilon' ) -* - START = 1 -* -* while ( START <= N ) -* - 30 CONTINUE - IF( START.LE.N ) THEN -* -* Let FINISH be the position of the next subdiagonal entry -* such that E( FINISH ) <= TINY or FINISH = N if no such -* subdiagonal exists. The matrix identified by the elements -* between START and FINISH constitutes an independent -* sub-problem. -* - FINISH = START - 40 CONTINUE - IF( FINISH.LT.N ) THEN - TINY = EPS*SQRT( ABS( D( FINISH ) ) )* - $ SQRT( ABS( D( FINISH+1 ) ) ) - IF( ABS( E( FINISH ) ).GT.TINY ) THEN - FINISH = FINISH + 1 - GO TO 40 - END IF - END IF -* -* (Sub) Problem determined. Compute its size and solve it. -* - M = FINISH - START + 1 - IF( M.GT.SMLSIZ ) THEN -* -* Scale. -* - ORGNRM = DLANST( 'M', M, D( START ), E( START ) ) - CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, M, 1, D( START ), M, - $ INFO ) - CALL DLASCL( 'G', 0, 0, ORGNRM, ONE, M-1, 1, E( START ), - $ M-1, INFO ) -* - CALL ZLAED0( N, M, D( START ), E( START ), Z( 1, START ), - $ LDZ, WORK, N, RWORK, IWORK, INFO ) - IF( INFO.GT.0 ) THEN - INFO = ( INFO / ( M+1 )+START-1 )*( N+1 ) + - $ MOD( INFO, ( M+1 ) ) + START - 1 - GO TO 70 - END IF -* -* Scale back. -* - CALL DLASCL( 'G', 0, 0, ONE, ORGNRM, M, 1, D( START ), M, - $ INFO ) -* - ELSE - CALL DSTEQR( 'I', M, D( START ), E( START ), RWORK, M, - $ RWORK( M*M+1 ), INFO ) - CALL ZLACRM( N, M, Z( 1, START ), LDZ, RWORK, M, WORK, N, - $ RWORK( M*M+1 ) ) - CALL ZLACPY( 'A', N, M, WORK, N, Z( 1, START ), LDZ ) - IF( INFO.GT.0 ) THEN - INFO = START*( N+1 ) + FINISH - GO TO 70 - END IF - END IF -* - START = FINISH + 1 - GO TO 30 - END IF -* -* endwhile -* -* -* Use Selection Sort to minimize swaps of eigenvectors -* - DO 60 II = 2, N - I = II - 1 - K = I - P = D( I ) - DO 50 J = II, N - IF( D( J ).LT.P ) THEN - K = J - P = D( J ) - END IF - 50 CONTINUE - IF( K.NE.I ) THEN - D( K ) = D( I ) - D( I ) = P - CALL ZSWAP( N, Z( 1, I ), 1, Z( 1, K ), 1 ) - END IF - 60 CONTINUE - END IF -* - 70 CONTINUE - WORK( 1 ) = LWMIN - RWORK( 1 ) = LRWMIN - IWORK( 1 ) = LIWMIN -* - RETURN -* -* End of ZSTEDC -* - END diff --git a/lib/linalg/fortran/zsteqr.f b/lib/linalg/fortran/zsteqr.f deleted file mode 100644 index 47f4004e8d..0000000000 --- a/lib/linalg/fortran/zsteqr.f +++ /dev/null @@ -1,573 +0,0 @@ -*> \brief \b ZSTEQR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZSTEQR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER COMPZ -* INTEGER INFO, LDZ, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION D( * ), E( * ), WORK( * ) -* COMPLEX*16 Z( LDZ, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZSTEQR computes all eigenvalues and, optionally, eigenvectors of a -*> symmetric tridiagonal matrix using the implicit QL or QR method. -*> The eigenvectors of a full or band complex Hermitian matrix can also -*> be found if ZHETRD or ZHPTRD or ZHBTRD has been used to reduce this -*> matrix to tridiagonal form. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] COMPZ -*> \verbatim -*> COMPZ is CHARACTER*1 -*> = 'N': Compute eigenvalues only. -*> = 'V': Compute eigenvalues and eigenvectors of the original -*> Hermitian matrix. On entry, Z must contain the -*> unitary matrix used to reduce the original matrix -*> to tridiagonal form. -*> = 'I': Compute eigenvalues and eigenvectors of the -*> tridiagonal matrix. Z is initialized to the identity -*> matrix. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix. N >= 0. -*> \endverbatim -*> -*> \param[in,out] D -*> \verbatim -*> D is DOUBLE PRECISION array, dimension (N) -*> On entry, the diagonal elements of the tridiagonal matrix. -*> On exit, if INFO = 0, the eigenvalues in ascending order. -*> \endverbatim -*> -*> \param[in,out] E -*> \verbatim -*> E is DOUBLE PRECISION array, dimension (N-1) -*> On entry, the (n-1) subdiagonal elements of the tridiagonal -*> matrix. -*> On exit, E has been destroyed. -*> \endverbatim -*> -*> \param[in,out] Z -*> \verbatim -*> Z is COMPLEX*16 array, dimension (LDZ, N) -*> On entry, if COMPZ = 'V', then Z contains the unitary -*> matrix used in the reduction to tridiagonal form. -*> On exit, if INFO = 0, then if COMPZ = 'V', Z contains the -*> orthonormal eigenvectors of the original Hermitian matrix, -*> and if COMPZ = 'I', Z contains the orthonormal eigenvectors -*> of the symmetric tridiagonal matrix. -*> If COMPZ = 'N', then Z is not referenced. -*> \endverbatim -*> -*> \param[in] LDZ -*> \verbatim -*> LDZ is INTEGER -*> The leading dimension of the array Z. LDZ >= 1, and if -*> eigenvectors are desired, then LDZ >= max(1,N). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is DOUBLE PRECISION array, dimension (max(1,2*N-2)) -*> If COMPZ = 'N', then WORK is not referenced. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: the algorithm has failed to find all the eigenvalues in -*> a total of 30*N iterations; if INFO = i, then i -*> elements of E have not converged to zero; on exit, D -*> and E contain the elements of a symmetric tridiagonal -*> matrix which is unitarily similar to the original -*> matrix. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER COMPZ - INTEGER INFO, LDZ, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION D( * ), E( * ), WORK( * ) - COMPLEX*16 Z( LDZ, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ZERO, ONE, TWO, THREE - PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0, - $ THREE = 3.0D0 ) - COMPLEX*16 CZERO, CONE - PARAMETER ( CZERO = ( 0.0D0, 0.0D0 ), - $ CONE = ( 1.0D0, 0.0D0 ) ) - INTEGER MAXIT - PARAMETER ( MAXIT = 30 ) -* .. -* .. Local Scalars .. - INTEGER I, ICOMPZ, II, ISCALE, J, JTOT, K, L, L1, LEND, - $ LENDM1, LENDP1, LENDSV, LM1, LSV, M, MM, MM1, - $ NM1, NMAXIT - DOUBLE PRECISION ANORM, B, C, EPS, EPS2, F, G, P, R, RT1, RT2, - $ S, SAFMAX, SAFMIN, SSFMAX, SSFMIN, TST -* .. -* .. External Functions .. - LOGICAL LSAME - DOUBLE PRECISION DLAMCH, DLANST, DLAPY2 - EXTERNAL LSAME, DLAMCH, DLANST, DLAPY2 -* .. -* .. External Subroutines .. - EXTERNAL DLAE2, DLAEV2, DLARTG, DLASCL, DLASRT, XERBLA, - $ ZLASET, ZLASR, ZSWAP -* .. -* .. Intrinsic Functions .. - INTRINSIC ABS, MAX, SIGN, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 -* - IF( LSAME( COMPZ, 'N' ) ) THEN - ICOMPZ = 0 - ELSE IF( LSAME( COMPZ, 'V' ) ) THEN - ICOMPZ = 1 - ELSE IF( LSAME( COMPZ, 'I' ) ) THEN - ICOMPZ = 2 - ELSE - ICOMPZ = -1 - END IF - IF( ICOMPZ.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( ( LDZ.LT.1 ) .OR. ( ICOMPZ.GT.0 .AND. LDZ.LT.MAX( 1, - $ N ) ) ) THEN - INFO = -6 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZSTEQR', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( N.EQ.1 ) THEN - IF( ICOMPZ.EQ.2 ) - $ Z( 1, 1 ) = CONE - RETURN - END IF -* -* Determine the unit roundoff and over/underflow thresholds. -* - EPS = DLAMCH( 'E' ) - EPS2 = EPS**2 - SAFMIN = DLAMCH( 'S' ) - SAFMAX = ONE / SAFMIN - SSFMAX = SQRT( SAFMAX ) / THREE - SSFMIN = SQRT( SAFMIN ) / EPS2 -* -* Compute the eigenvalues and eigenvectors of the tridiagonal -* matrix. -* - IF( ICOMPZ.EQ.2 ) - $ CALL ZLASET( 'Full', N, N, CZERO, CONE, Z, LDZ ) -* - NMAXIT = N*MAXIT - JTOT = 0 -* -* Determine where the matrix splits and choose QL or QR iteration -* for each block, according to whether top or bottom diagonal -* element is smaller. -* - L1 = 1 - NM1 = N - 1 -* - 10 CONTINUE - IF( L1.GT.N ) - $ GO TO 160 - IF( L1.GT.1 ) - $ E( L1-1 ) = ZERO - IF( L1.LE.NM1 ) THEN - DO 20 M = L1, NM1 - TST = ABS( E( M ) ) - IF( TST.EQ.ZERO ) - $ GO TO 30 - IF( TST.LE.( SQRT( ABS( D( M ) ) )*SQRT( ABS( D( M+ - $ 1 ) ) ) )*EPS ) THEN - E( M ) = ZERO - GO TO 30 - END IF - 20 CONTINUE - END IF - M = N -* - 30 CONTINUE - L = L1 - LSV = L - LEND = M - LENDSV = LEND - L1 = M + 1 - IF( LEND.EQ.L ) - $ GO TO 10 -* -* Scale submatrix in rows and columns L to LEND -* - ANORM = DLANST( 'I', LEND-L+1, D( L ), E( L ) ) - ISCALE = 0 - IF( ANORM.EQ.ZERO ) - $ GO TO 10 - IF( ANORM.GT.SSFMAX ) THEN - ISCALE = 1 - CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ), N, - $ INFO ) - CALL DLASCL( 'G', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N, - $ INFO ) - ELSE IF( ANORM.LT.SSFMIN ) THEN - ISCALE = 2 - CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N, - $ INFO ) - CALL DLASCL( 'G', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N, - $ INFO ) - END IF -* -* Choose between QL and QR iteration -* - IF( ABS( D( LEND ) ).LT.ABS( D( L ) ) ) THEN - LEND = LSV - L = LENDSV - END IF -* - IF( LEND.GT.L ) THEN -* -* QL Iteration -* -* Look for small subdiagonal element. -* - 40 CONTINUE - IF( L.NE.LEND ) THEN - LENDM1 = LEND - 1 - DO 50 M = L, LENDM1 - TST = ABS( E( M ) )**2 - IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M+1 ) )+ - $ SAFMIN )GO TO 60 - 50 CONTINUE - END IF -* - M = LEND -* - 60 CONTINUE - IF( M.LT.LEND ) - $ E( M ) = ZERO - P = D( L ) - IF( M.EQ.L ) - $ GO TO 80 -* -* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 -* to compute its eigensystem. -* - IF( M.EQ.L+1 ) THEN - IF( ICOMPZ.GT.0 ) THEN - CALL DLAEV2( D( L ), E( L ), D( L+1 ), RT1, RT2, C, S ) - WORK( L ) = C - WORK( N-1+L ) = S - CALL ZLASR( 'R', 'V', 'B', N, 2, WORK( L ), - $ WORK( N-1+L ), Z( 1, L ), LDZ ) - ELSE - CALL DLAE2( D( L ), E( L ), D( L+1 ), RT1, RT2 ) - END IF - D( L ) = RT1 - D( L+1 ) = RT2 - E( L ) = ZERO - L = L + 2 - IF( L.LE.LEND ) - $ GO TO 40 - GO TO 140 - END IF -* - IF( JTOT.EQ.NMAXIT ) - $ GO TO 140 - JTOT = JTOT + 1 -* -* Form shift. -* - G = ( D( L+1 )-P ) / ( TWO*E( L ) ) - R = DLAPY2( G, ONE ) - G = D( M ) - P + ( E( L ) / ( G+SIGN( R, G ) ) ) -* - S = ONE - C = ONE - P = ZERO -* -* Inner loop -* - MM1 = M - 1 - DO 70 I = MM1, L, -1 - F = S*E( I ) - B = C*E( I ) - CALL DLARTG( G, F, C, S, R ) - IF( I.NE.M-1 ) - $ E( I+1 ) = R - G = D( I+1 ) - P - R = ( D( I )-G )*S + TWO*C*B - P = S*R - D( I+1 ) = G + P - G = C*R - B -* -* If eigenvectors are desired, then save rotations. -* - IF( ICOMPZ.GT.0 ) THEN - WORK( I ) = C - WORK( N-1+I ) = -S - END IF -* - 70 CONTINUE -* -* If eigenvectors are desired, then apply saved rotations. -* - IF( ICOMPZ.GT.0 ) THEN - MM = M - L + 1 - CALL ZLASR( 'R', 'V', 'B', N, MM, WORK( L ), WORK( N-1+L ), - $ Z( 1, L ), LDZ ) - END IF -* - D( L ) = D( L ) - P - E( L ) = G - GO TO 40 -* -* Eigenvalue found. -* - 80 CONTINUE - D( L ) = P -* - L = L + 1 - IF( L.LE.LEND ) - $ GO TO 40 - GO TO 140 -* - ELSE -* -* QR Iteration -* -* Look for small superdiagonal element. -* - 90 CONTINUE - IF( L.NE.LEND ) THEN - LENDP1 = LEND + 1 - DO 100 M = L, LENDP1, -1 - TST = ABS( E( M-1 ) )**2 - IF( TST.LE.( EPS2*ABS( D( M ) ) )*ABS( D( M-1 ) )+ - $ SAFMIN )GO TO 110 - 100 CONTINUE - END IF -* - M = LEND -* - 110 CONTINUE - IF( M.GT.LEND ) - $ E( M-1 ) = ZERO - P = D( L ) - IF( M.EQ.L ) - $ GO TO 130 -* -* If remaining matrix is 2-by-2, use DLAE2 or SLAEV2 -* to compute its eigensystem. -* - IF( M.EQ.L-1 ) THEN - IF( ICOMPZ.GT.0 ) THEN - CALL DLAEV2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2, C, S ) - WORK( M ) = C - WORK( N-1+M ) = S - CALL ZLASR( 'R', 'V', 'F', N, 2, WORK( M ), - $ WORK( N-1+M ), Z( 1, L-1 ), LDZ ) - ELSE - CALL DLAE2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2 ) - END IF - D( L-1 ) = RT1 - D( L ) = RT2 - E( L-1 ) = ZERO - L = L - 2 - IF( L.GE.LEND ) - $ GO TO 90 - GO TO 140 - END IF -* - IF( JTOT.EQ.NMAXIT ) - $ GO TO 140 - JTOT = JTOT + 1 -* -* Form shift. -* - G = ( D( L-1 )-P ) / ( TWO*E( L-1 ) ) - R = DLAPY2( G, ONE ) - G = D( M ) - P + ( E( L-1 ) / ( G+SIGN( R, G ) ) ) -* - S = ONE - C = ONE - P = ZERO -* -* Inner loop -* - LM1 = L - 1 - DO 120 I = M, LM1 - F = S*E( I ) - B = C*E( I ) - CALL DLARTG( G, F, C, S, R ) - IF( I.NE.M ) - $ E( I-1 ) = R - G = D( I ) - P - R = ( D( I+1 )-G )*S + TWO*C*B - P = S*R - D( I ) = G + P - G = C*R - B -* -* If eigenvectors are desired, then save rotations. -* - IF( ICOMPZ.GT.0 ) THEN - WORK( I ) = C - WORK( N-1+I ) = S - END IF -* - 120 CONTINUE -* -* If eigenvectors are desired, then apply saved rotations. -* - IF( ICOMPZ.GT.0 ) THEN - MM = L - M + 1 - CALL ZLASR( 'R', 'V', 'F', N, MM, WORK( M ), WORK( N-1+M ), - $ Z( 1, M ), LDZ ) - END IF -* - D( L ) = D( L ) - P - E( LM1 ) = G - GO TO 90 -* -* Eigenvalue found. -* - 130 CONTINUE - D( L ) = P -* - L = L - 1 - IF( L.GE.LEND ) - $ GO TO 90 - GO TO 140 -* - END IF -* -* Undo scaling if necessary -* - 140 CONTINUE - IF( ISCALE.EQ.1 ) THEN - CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1, - $ D( LSV ), N, INFO ) - CALL DLASCL( 'G', 0, 0, SSFMAX, ANORM, LENDSV-LSV, 1, E( LSV ), - $ N, INFO ) - ELSE IF( ISCALE.EQ.2 ) THEN - CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1, - $ D( LSV ), N, INFO ) - CALL DLASCL( 'G', 0, 0, SSFMIN, ANORM, LENDSV-LSV, 1, E( LSV ), - $ N, INFO ) - END IF -* -* Check for no convergence to an eigenvalue after a total -* of N*MAXIT iterations. -* - IF( JTOT.EQ.NMAXIT ) THEN - DO 150 I = 1, N - 1 - IF( E( I ).NE.ZERO ) - $ INFO = INFO + 1 - 150 CONTINUE - RETURN - END IF - GO TO 10 -* -* Order eigenvalues and eigenvectors. -* - 160 CONTINUE - IF( ICOMPZ.EQ.0 ) THEN -* -* Use Quick Sort -* - CALL DLASRT( 'I', N, D, INFO ) -* - ELSE -* -* Use Selection Sort to minimize swaps of eigenvectors -* - DO 180 II = 2, N - I = II - 1 - K = I - P = D( I ) - DO 170 J = II, N - IF( D( J ).LT.P ) THEN - K = J - P = D( J ) - END IF - 170 CONTINUE - IF( K.NE.I ) THEN - D( K ) = D( I ) - D( I ) = P - CALL ZSWAP( N, Z( 1, I ), 1, Z( 1, K ), 1 ) - END IF - 180 CONTINUE - END IF - RETURN -* -* End of ZSTEQR -* - END diff --git a/lib/linalg/fortran/zswap.f b/lib/linalg/fortran/zswap.f deleted file mode 100644 index 93f8fc52d0..0000000000 --- a/lib/linalg/fortran/zswap.f +++ /dev/null @@ -1,129 +0,0 @@ -*> \brief \b ZSWAP -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZSWAP(N,ZX,INCX,ZY,INCY) -* -* .. Scalar Arguments .. -* INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. -* COMPLEX*16 ZX(*),ZY(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZSWAP interchanges two vectors. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> number of elements in input vector(s) -*> \endverbatim -*> -*> \param[in,out] ZX -*> \verbatim -*> ZX is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCX ) ) -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> storage spacing between elements of ZX -*> \endverbatim -*> -*> \param[in,out] ZY -*> \verbatim -*> ZY is COMPLEX*16 array, dimension ( 1 + ( N - 1 )*abs( INCY ) ) -*> \endverbatim -*> -*> \param[in] INCY -*> \verbatim -*> INCY is INTEGER -*> storage spacing between elements of ZY -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level1 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> jack dongarra, 3/11/78. -*> modified 12/3/93, array(1) declarations changed to array(*) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZSWAP(N,ZX,INCX,ZY,INCY) -* -* -- Reference BLAS level1 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,INCY,N -* .. -* .. Array Arguments .. - COMPLEX*16 ZX(*),ZY(*) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - COMPLEX*16 ZTEMP - INTEGER I,IX,IY -* .. - IF (N.LE.0) RETURN - IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN -* -* code for both increments equal to 1 - DO I = 1,N - ZTEMP = ZX(I) - ZX(I) = ZY(I) - ZY(I) = ZTEMP - END DO - ELSE -* -* code for unequal increments or equal increments not equal -* to 1 -* - IX = 1 - IY = 1 - IF (INCX.LT.0) IX = (-N+1)*INCX + 1 - IF (INCY.LT.0) IY = (-N+1)*INCY + 1 - DO I = 1,N - ZTEMP = ZX(IX) - ZX(IX) = ZY(IY) - ZY(IY) = ZTEMP - IX = IX + INCX - IY = IY + INCY - END DO - END IF - RETURN -* -* End of ZSWAP -* - END diff --git a/lib/linalg/fortran/ztpmv.f b/lib/linalg/fortran/ztpmv.f deleted file mode 100644 index 363fd5a2ac..0000000000 --- a/lib/linalg/fortran/ztpmv.f +++ /dev/null @@ -1,385 +0,0 @@ -*> \brief \b ZTPMV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX) -* -* .. Scalar Arguments .. -* INTEGER INCX,N -* CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. -* COMPLEX*16 AP(*),X(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZTPMV performs one of the matrix-vector operations -*> -*> x := A*x, or x := A**T*x, or x := A**H*x, -*> -*> where x is an n element vector and A is an n by n unit, or non-unit, -*> upper or lower triangular matrix, supplied in packed form. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the matrix is an upper or -*> lower triangular matrix as follows: -*> -*> UPLO = 'U' or 'u' A is an upper triangular matrix. -*> -*> UPLO = 'L' or 'l' A is a lower triangular matrix. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> On entry, TRANS specifies the operation to be performed as -*> follows: -*> -*> TRANS = 'N' or 'n' x := A*x. -*> -*> TRANS = 'T' or 't' x := A**T*x. -*> -*> TRANS = 'C' or 'c' x := A**H*x. -*> \endverbatim -*> -*> \param[in] DIAG -*> \verbatim -*> DIAG is CHARACTER*1 -*> On entry, DIAG specifies whether or not A is unit -*> triangular as follows: -*> -*> DIAG = 'U' or 'u' A is assumed to be unit triangular. -*> -*> DIAG = 'N' or 'n' A is not assumed to be unit -*> triangular. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] AP -*> \verbatim -*> AP is COMPLEX*16 array, dimension at least -*> ( ( n*( n + 1 ) )/2 ). -*> Before entry with UPLO = 'U' or 'u', the array AP must -*> contain the upper triangular matrix packed sequentially, -*> column by column, so that AP( 1 ) contains a( 1, 1 ), -*> AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 ) -*> respectively, and so on. -*> Before entry with UPLO = 'L' or 'l', the array AP must -*> contain the lower triangular matrix packed sequentially, -*> column by column, so that AP( 1 ) contains a( 1, 1 ), -*> AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 ) -*> respectively, and so on. -*> Note that when DIAG = 'U' or 'u', the diagonal elements of -*> A are not referenced, but are assumed to be unity. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX*16 array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCX ) ). -*> Before entry, the incremented array X must contain the n -*> element vector x. On exit, X is overwritten with the -*> transformed vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> The vector and matrix arguments are not referenced when N = 0, or M = 0 -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,N - CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. - COMPLEX*16 AP(*),X(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER (ZERO= (0.0D+0,0.0D+0)) -* .. -* .. Local Scalars .. - COMPLEX*16 TEMP - INTEGER I,INFO,IX,J,JX,K,KK,KX - LOGICAL NOCONJ,NOUNIT -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. - + .NOT.LSAME(TRANS,'C')) THEN - INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN - INFO = 3 - ELSE IF (N.LT.0) THEN - INFO = 4 - ELSE IF (INCX.EQ.0) THEN - INFO = 7 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('ZTPMV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF (N.EQ.0) RETURN -* - NOCONJ = LSAME(TRANS,'T') - NOUNIT = LSAME(DIAG,'N') -* -* Set up the start point in X if the increment is not unity. This -* will be ( N - 1 )*INCX too small for descending loops. -* - IF (INCX.LE.0) THEN - KX = 1 - (N-1)*INCX - ELSE IF (INCX.NE.1) THEN - KX = 1 - END IF -* -* Start the operations. In this version the elements of AP are -* accessed sequentially with one pass through AP. -* - IF (LSAME(TRANS,'N')) THEN -* -* Form x:= A*x. -* - IF (LSAME(UPLO,'U')) THEN - KK = 1 - IF (INCX.EQ.1) THEN - DO 20 J = 1,N - IF (X(J).NE.ZERO) THEN - TEMP = X(J) - K = KK - DO 10 I = 1,J - 1 - X(I) = X(I) + TEMP*AP(K) - K = K + 1 - 10 CONTINUE - IF (NOUNIT) X(J) = X(J)*AP(KK+J-1) - END IF - KK = KK + J - 20 CONTINUE - ELSE - JX = KX - DO 40 J = 1,N - IF (X(JX).NE.ZERO) THEN - TEMP = X(JX) - IX = KX - DO 30 K = KK,KK + J - 2 - X(IX) = X(IX) + TEMP*AP(K) - IX = IX + INCX - 30 CONTINUE - IF (NOUNIT) X(JX) = X(JX)*AP(KK+J-1) - END IF - JX = JX + INCX - KK = KK + J - 40 CONTINUE - END IF - ELSE - KK = (N* (N+1))/2 - IF (INCX.EQ.1) THEN - DO 60 J = N,1,-1 - IF (X(J).NE.ZERO) THEN - TEMP = X(J) - K = KK - DO 50 I = N,J + 1,-1 - X(I) = X(I) + TEMP*AP(K) - K = K - 1 - 50 CONTINUE - IF (NOUNIT) X(J) = X(J)*AP(KK-N+J) - END IF - KK = KK - (N-J+1) - 60 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 80 J = N,1,-1 - IF (X(JX).NE.ZERO) THEN - TEMP = X(JX) - IX = KX - DO 70 K = KK,KK - (N- (J+1)),-1 - X(IX) = X(IX) + TEMP*AP(K) - IX = IX - INCX - 70 CONTINUE - IF (NOUNIT) X(JX) = X(JX)*AP(KK-N+J) - END IF - JX = JX - INCX - KK = KK - (N-J+1) - 80 CONTINUE - END IF - END IF - ELSE -* -* Form x := A**T*x or x := A**H*x. -* - IF (LSAME(UPLO,'U')) THEN - KK = (N* (N+1))/2 - IF (INCX.EQ.1) THEN - DO 110 J = N,1,-1 - TEMP = X(J) - K = KK - 1 - IF (NOCONJ) THEN - IF (NOUNIT) TEMP = TEMP*AP(KK) - DO 90 I = J - 1,1,-1 - TEMP = TEMP + AP(K)*X(I) - K = K - 1 - 90 CONTINUE - ELSE - IF (NOUNIT) TEMP = TEMP*DCONJG(AP(KK)) - DO 100 I = J - 1,1,-1 - TEMP = TEMP + DCONJG(AP(K))*X(I) - K = K - 1 - 100 CONTINUE - END IF - X(J) = TEMP - KK = KK - J - 110 CONTINUE - ELSE - JX = KX + (N-1)*INCX - DO 140 J = N,1,-1 - TEMP = X(JX) - IX = JX - IF (NOCONJ) THEN - IF (NOUNIT) TEMP = TEMP*AP(KK) - DO 120 K = KK - 1,KK - J + 1,-1 - IX = IX - INCX - TEMP = TEMP + AP(K)*X(IX) - 120 CONTINUE - ELSE - IF (NOUNIT) TEMP = TEMP*DCONJG(AP(KK)) - DO 130 K = KK - 1,KK - J + 1,-1 - IX = IX - INCX - TEMP = TEMP + DCONJG(AP(K))*X(IX) - 130 CONTINUE - END IF - X(JX) = TEMP - JX = JX - INCX - KK = KK - J - 140 CONTINUE - END IF - ELSE - KK = 1 - IF (INCX.EQ.1) THEN - DO 170 J = 1,N - TEMP = X(J) - K = KK + 1 - IF (NOCONJ) THEN - IF (NOUNIT) TEMP = TEMP*AP(KK) - DO 150 I = J + 1,N - TEMP = TEMP + AP(K)*X(I) - K = K + 1 - 150 CONTINUE - ELSE - IF (NOUNIT) TEMP = TEMP*DCONJG(AP(KK)) - DO 160 I = J + 1,N - TEMP = TEMP + DCONJG(AP(K))*X(I) - K = K + 1 - 160 CONTINUE - END IF - X(J) = TEMP - KK = KK + (N-J+1) - 170 CONTINUE - ELSE - JX = KX - DO 200 J = 1,N - TEMP = X(JX) - IX = JX - IF (NOCONJ) THEN - IF (NOUNIT) TEMP = TEMP*AP(KK) - DO 180 K = KK + 1,KK + N - J - IX = IX + INCX - TEMP = TEMP + AP(K)*X(IX) - 180 CONTINUE - ELSE - IF (NOUNIT) TEMP = TEMP*DCONJG(AP(KK)) - DO 190 K = KK + 1,KK + N - J - IX = IX + INCX - TEMP = TEMP + DCONJG(AP(K))*X(IX) - 190 CONTINUE - END IF - X(JX) = TEMP - JX = JX + INCX - KK = KK + (N-J+1) - 200 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of ZTPMV -* - END diff --git a/lib/linalg/fortran/ztpsv.f b/lib/linalg/fortran/ztpsv.f deleted file mode 100644 index c6f24d0b27..0000000000 --- a/lib/linalg/fortran/ztpsv.f +++ /dev/null @@ -1,387 +0,0 @@ -*> \brief \b ZTPSV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX) -* -* .. Scalar Arguments .. -* INTEGER INCX,N -* CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. -* COMPLEX*16 AP(*),X(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZTPSV solves one of the systems of equations -*> -*> A*x = b, or A**T*x = b, or A**H*x = b, -*> -*> where b and x are n element vectors and A is an n by n unit, or -*> non-unit, upper or lower triangular matrix, supplied in packed form. -*> -*> No test for singularity or near-singularity is included in this -*> routine. Such tests must be performed before calling this routine. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the matrix is an upper or -*> lower triangular matrix as follows: -*> -*> UPLO = 'U' or 'u' A is an upper triangular matrix. -*> -*> UPLO = 'L' or 'l' A is a lower triangular matrix. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> On entry, TRANS specifies the equations to be solved as -*> follows: -*> -*> TRANS = 'N' or 'n' A*x = b. -*> -*> TRANS = 'T' or 't' A**T*x = b. -*> -*> TRANS = 'C' or 'c' A**H*x = b. -*> \endverbatim -*> -*> \param[in] DIAG -*> \verbatim -*> DIAG is CHARACTER*1 -*> On entry, DIAG specifies whether or not A is unit -*> triangular as follows: -*> -*> DIAG = 'U' or 'u' A is assumed to be unit triangular. -*> -*> DIAG = 'N' or 'n' A is not assumed to be unit -*> triangular. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] AP -*> \verbatim -*> AP is COMPLEX*16 array, dimension at least -*> ( ( n*( n + 1 ) )/2 ). -*> Before entry with UPLO = 'U' or 'u', the array AP must -*> contain the upper triangular matrix packed sequentially, -*> column by column, so that AP( 1 ) contains a( 1, 1 ), -*> AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 ) -*> respectively, and so on. -*> Before entry with UPLO = 'L' or 'l', the array AP must -*> contain the lower triangular matrix packed sequentially, -*> column by column, so that AP( 1 ) contains a( 1, 1 ), -*> AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 ) -*> respectively, and so on. -*> Note that when DIAG = 'U' or 'u', the diagonal elements of -*> A are not referenced, but are assumed to be unity. -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX*16 array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCX ) ). -*> Before entry, the incremented array X must contain the n -*> element right-hand side vector b. On exit, X is overwritten -*> with the solution vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,N - CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. - COMPLEX*16 AP(*),X(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER (ZERO= (0.0D+0,0.0D+0)) -* .. -* .. Local Scalars .. - COMPLEX*16 TEMP - INTEGER I,INFO,IX,J,JX,K,KK,KX - LOGICAL NOCONJ,NOUNIT -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. - + .NOT.LSAME(TRANS,'C')) THEN - INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN - INFO = 3 - ELSE IF (N.LT.0) THEN - INFO = 4 - ELSE IF (INCX.EQ.0) THEN - INFO = 7 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('ZTPSV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF (N.EQ.0) RETURN -* - NOCONJ = LSAME(TRANS,'T') - NOUNIT = LSAME(DIAG,'N') -* -* Set up the start point in X if the increment is not unity. This -* will be ( N - 1 )*INCX too small for descending loops. -* - IF (INCX.LE.0) THEN - KX = 1 - (N-1)*INCX - ELSE IF (INCX.NE.1) THEN - KX = 1 - END IF -* -* Start the operations. In this version the elements of AP are -* accessed sequentially with one pass through AP. -* - IF (LSAME(TRANS,'N')) THEN -* -* Form x := inv( A )*x. -* - IF (LSAME(UPLO,'U')) THEN - KK = (N* (N+1))/2 - IF (INCX.EQ.1) THEN - DO 20 J = N,1,-1 - IF (X(J).NE.ZERO) THEN - IF (NOUNIT) X(J) = X(J)/AP(KK) - TEMP = X(J) - K = KK - 1 - DO 10 I = J - 1,1,-1 - X(I) = X(I) - TEMP*AP(K) - K = K - 1 - 10 CONTINUE - END IF - KK = KK - J - 20 CONTINUE - ELSE - JX = KX + (N-1)*INCX - DO 40 J = N,1,-1 - IF (X(JX).NE.ZERO) THEN - IF (NOUNIT) X(JX) = X(JX)/AP(KK) - TEMP = X(JX) - IX = JX - DO 30 K = KK - 1,KK - J + 1,-1 - IX = IX - INCX - X(IX) = X(IX) - TEMP*AP(K) - 30 CONTINUE - END IF - JX = JX - INCX - KK = KK - J - 40 CONTINUE - END IF - ELSE - KK = 1 - IF (INCX.EQ.1) THEN - DO 60 J = 1,N - IF (X(J).NE.ZERO) THEN - IF (NOUNIT) X(J) = X(J)/AP(KK) - TEMP = X(J) - K = KK + 1 - DO 50 I = J + 1,N - X(I) = X(I) - TEMP*AP(K) - K = K + 1 - 50 CONTINUE - END IF - KK = KK + (N-J+1) - 60 CONTINUE - ELSE - JX = KX - DO 80 J = 1,N - IF (X(JX).NE.ZERO) THEN - IF (NOUNIT) X(JX) = X(JX)/AP(KK) - TEMP = X(JX) - IX = JX - DO 70 K = KK + 1,KK + N - J - IX = IX + INCX - X(IX) = X(IX) - TEMP*AP(K) - 70 CONTINUE - END IF - JX = JX + INCX - KK = KK + (N-J+1) - 80 CONTINUE - END IF - END IF - ELSE -* -* Form x := inv( A**T )*x or x := inv( A**H )*x. -* - IF (LSAME(UPLO,'U')) THEN - KK = 1 - IF (INCX.EQ.1) THEN - DO 110 J = 1,N - TEMP = X(J) - K = KK - IF (NOCONJ) THEN - DO 90 I = 1,J - 1 - TEMP = TEMP - AP(K)*X(I) - K = K + 1 - 90 CONTINUE - IF (NOUNIT) TEMP = TEMP/AP(KK+J-1) - ELSE - DO 100 I = 1,J - 1 - TEMP = TEMP - DCONJG(AP(K))*X(I) - K = K + 1 - 100 CONTINUE - IF (NOUNIT) TEMP = TEMP/DCONJG(AP(KK+J-1)) - END IF - X(J) = TEMP - KK = KK + J - 110 CONTINUE - ELSE - JX = KX - DO 140 J = 1,N - TEMP = X(JX) - IX = KX - IF (NOCONJ) THEN - DO 120 K = KK,KK + J - 2 - TEMP = TEMP - AP(K)*X(IX) - IX = IX + INCX - 120 CONTINUE - IF (NOUNIT) TEMP = TEMP/AP(KK+J-1) - ELSE - DO 130 K = KK,KK + J - 2 - TEMP = TEMP - DCONJG(AP(K))*X(IX) - IX = IX + INCX - 130 CONTINUE - IF (NOUNIT) TEMP = TEMP/DCONJG(AP(KK+J-1)) - END IF - X(JX) = TEMP - JX = JX + INCX - KK = KK + J - 140 CONTINUE - END IF - ELSE - KK = (N* (N+1))/2 - IF (INCX.EQ.1) THEN - DO 170 J = N,1,-1 - TEMP = X(J) - K = KK - IF (NOCONJ) THEN - DO 150 I = N,J + 1,-1 - TEMP = TEMP - AP(K)*X(I) - K = K - 1 - 150 CONTINUE - IF (NOUNIT) TEMP = TEMP/AP(KK-N+J) - ELSE - DO 160 I = N,J + 1,-1 - TEMP = TEMP - DCONJG(AP(K))*X(I) - K = K - 1 - 160 CONTINUE - IF (NOUNIT) TEMP = TEMP/DCONJG(AP(KK-N+J)) - END IF - X(J) = TEMP - KK = KK - (N-J+1) - 170 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 200 J = N,1,-1 - TEMP = X(JX) - IX = KX - IF (NOCONJ) THEN - DO 180 K = KK,KK - (N- (J+1)),-1 - TEMP = TEMP - AP(K)*X(IX) - IX = IX - INCX - 180 CONTINUE - IF (NOUNIT) TEMP = TEMP/AP(KK-N+J) - ELSE - DO 190 K = KK,KK - (N- (J+1)),-1 - TEMP = TEMP - DCONJG(AP(K))*X(IX) - IX = IX - INCX - 190 CONTINUE - IF (NOUNIT) TEMP = TEMP/DCONJG(AP(KK-N+J)) - END IF - X(JX) = TEMP - JX = JX - INCX - KK = KK - (N-J+1) - 200 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of ZTPSV -* - END diff --git a/lib/linalg/fortran/ztptri.f b/lib/linalg/fortran/ztptri.f deleted file mode 100644 index 31284ad637..0000000000 --- a/lib/linalg/fortran/ztptri.f +++ /dev/null @@ -1,239 +0,0 @@ -*> \brief \b ZTPTRI -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZTPTRI + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZTPTRI( UPLO, DIAG, N, AP, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER DIAG, UPLO -* INTEGER INFO, N -* .. -* .. Array Arguments .. -* COMPLEX*16 AP( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZTPTRI computes the inverse of a complex upper or lower triangular -*> matrix A stored in packed format. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': A is upper triangular; -*> = 'L': A is lower triangular. -*> \endverbatim -*> -*> \param[in] DIAG -*> \verbatim -*> DIAG is CHARACTER*1 -*> = 'N': A is non-unit triangular; -*> = 'U': A is unit triangular. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] AP -*> \verbatim -*> AP is COMPLEX*16 array, dimension (N*(N+1)/2) -*> On entry, the upper or lower triangular matrix A, stored -*> columnwise in a linear array. The j-th column of A is stored -*> in the array AP as follows: -*> if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; -*> if UPLO = 'L', AP(i + (j-1)*((2*n-j)/2) = A(i,j) for j<=i<=n. -*> See below for further details. -*> On exit, the (triangular) inverse of the original matrix, in -*> the same packed storage format. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, A(i,i) is exactly zero. The triangular -*> matrix is singular and its inverse can not be computed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> A triangular matrix A can be transferred to packed storage using one -*> of the following program segments: -*> -*> UPLO = 'U': UPLO = 'L': -*> -*> JC = 1 JC = 1 -*> DO 2 J = 1, N DO 2 J = 1, N -*> DO 1 I = 1, J DO 1 I = J, N -*> AP(JC+I-1) = A(I,J) AP(JC+I-J) = A(I,J) -*> 1 CONTINUE 1 CONTINUE -*> JC = JC + J JC = JC + N - J + 1 -*> 2 CONTINUE 2 CONTINUE -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZTPTRI( UPLO, DIAG, N, AP, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER DIAG, UPLO - INTEGER INFO, N -* .. -* .. Array Arguments .. - COMPLEX*16 AP( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE, ZERO - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), - $ ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL NOUNIT, UPPER - INTEGER J, JC, JCLAST, JJ - COMPLEX*16 AJJ -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZSCAL, ZTPMV -* .. -* .. Executable Statements .. -* -* Test the input parameters. -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - NOUNIT = LSAME( DIAG, 'N' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN - INFO = -2 - ELSE IF( N.LT.0 ) THEN - INFO = -3 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZTPTRI', -INFO ) - RETURN - END IF -* -* Check for singularity if non-unit. -* - IF( NOUNIT ) THEN - IF( UPPER ) THEN - JJ = 0 - DO 10 INFO = 1, N - JJ = JJ + INFO - IF( AP( JJ ).EQ.ZERO ) - $ RETURN - 10 CONTINUE - ELSE - JJ = 1 - DO 20 INFO = 1, N - IF( AP( JJ ).EQ.ZERO ) - $ RETURN - JJ = JJ + N - INFO + 1 - 20 CONTINUE - END IF - INFO = 0 - END IF -* - IF( UPPER ) THEN -* -* Compute inverse of upper triangular matrix. -* - JC = 1 - DO 30 J = 1, N - IF( NOUNIT ) THEN - AP( JC+J-1 ) = ONE / AP( JC+J-1 ) - AJJ = -AP( JC+J-1 ) - ELSE - AJJ = -ONE - END IF -* -* Compute elements 1:j-1 of j-th column. -* - CALL ZTPMV( 'Upper', 'No transpose', DIAG, J-1, AP, - $ AP( JC ), 1 ) - CALL ZSCAL( J-1, AJJ, AP( JC ), 1 ) - JC = JC + J - 30 CONTINUE -* - ELSE -* -* Compute inverse of lower triangular matrix. -* - JC = N*( N+1 ) / 2 - DO 40 J = N, 1, -1 - IF( NOUNIT ) THEN - AP( JC ) = ONE / AP( JC ) - AJJ = -AP( JC ) - ELSE - AJJ = -ONE - END IF - IF( J.LT.N ) THEN -* -* Compute elements j+1:n of j-th column. -* - CALL ZTPMV( 'Lower', 'No transpose', DIAG, N-J, - $ AP( JCLAST ), AP( JC+1 ), 1 ) - CALL ZSCAL( N-J, AJJ, AP( JC+1 ), 1 ) - END IF - JCLAST = JC - JC = JC - N + J - 2 - 40 CONTINUE - END IF -* - RETURN -* -* End of ZTPTRI -* - END diff --git a/lib/linalg/fortran/ztrmm.f b/lib/linalg/fortran/ztrmm.f deleted file mode 100644 index c59c367cee..0000000000 --- a/lib/linalg/fortran/ztrmm.f +++ /dev/null @@ -1,449 +0,0 @@ -*> \brief \b ZTRMM -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) -* -* .. Scalar Arguments .. -* COMPLEX*16 ALPHA -* INTEGER LDA,LDB,M,N -* CHARACTER DIAG,SIDE,TRANSA,UPLO -* .. -* .. Array Arguments .. -* COMPLEX*16 A(LDA,*),B(LDB,*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZTRMM performs one of the matrix-matrix operations -*> -*> B := alpha*op( A )*B, or B := alpha*B*op( A ) -*> -*> where alpha is a scalar, B is an m by n matrix, A is a unit, or -*> non-unit, upper or lower triangular matrix and op( A ) is one of -*> -*> op( A ) = A or op( A ) = A**T or op( A ) = A**H. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> On entry, SIDE specifies whether op( A ) multiplies B from -*> the left or right as follows: -*> -*> SIDE = 'L' or 'l' B := alpha*op( A )*B. -*> -*> SIDE = 'R' or 'r' B := alpha*B*op( A ). -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the matrix A is an upper or -*> lower triangular matrix as follows: -*> -*> UPLO = 'U' or 'u' A is an upper triangular matrix. -*> -*> UPLO = 'L' or 'l' A is a lower triangular matrix. -*> \endverbatim -*> -*> \param[in] TRANSA -*> \verbatim -*> TRANSA is CHARACTER*1 -*> On entry, TRANSA specifies the form of op( A ) to be used in -*> the matrix multiplication as follows: -*> -*> TRANSA = 'N' or 'n' op( A ) = A. -*> -*> TRANSA = 'T' or 't' op( A ) = A**T. -*> -*> TRANSA = 'C' or 'c' op( A ) = A**H. -*> \endverbatim -*> -*> \param[in] DIAG -*> \verbatim -*> DIAG is CHARACTER*1 -*> On entry, DIAG specifies whether or not A is unit triangular -*> as follows: -*> -*> DIAG = 'U' or 'u' A is assumed to be unit triangular. -*> -*> DIAG = 'N' or 'n' A is not assumed to be unit -*> triangular. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> On entry, M specifies the number of rows of B. M must be at -*> least zero. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the number of columns of B. N must be -*> at least zero. -*> \endverbatim -*> -*> \param[in] ALPHA -*> \verbatim -*> ALPHA is COMPLEX*16 -*> On entry, ALPHA specifies the scalar alpha. When alpha is -*> zero then A is not referenced and B need not be set before -*> entry. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension ( LDA, k ), where k is m -*> when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'. -*> Before entry with UPLO = 'U' or 'u', the leading k by k -*> upper triangular part of the array A must contain the upper -*> triangular matrix and the strictly lower triangular part of -*> A is not referenced. -*> Before entry with UPLO = 'L' or 'l', the leading k by k -*> lower triangular part of the array A must contain the lower -*> triangular matrix and the strictly upper triangular part of -*> A is not referenced. -*> Note that when DIAG = 'U' or 'u', the diagonal elements of -*> A are not referenced either, but are assumed to be unity. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. When SIDE = 'L' or 'l' then -*> LDA must be at least max( 1, m ), when SIDE = 'R' or 'r' -*> then LDA must be at least max( 1, n ). -*> \endverbatim -*> -*> \param[in,out] B -*> \verbatim -*> B is COMPLEX*16 array, dimension ( LDB, N ). -*> Before entry, the leading m by n part of the array B must -*> contain the matrix B, and on exit is overwritten by the -*> transformed matrix. -*> \endverbatim -*> -*> \param[in] LDB -*> \verbatim -*> LDB is INTEGER -*> On entry, LDB specifies the first dimension of B as declared -*> in the calling (sub) program. LDB must be at least -*> max( 1, m ). -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level3 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 3 Blas routine. -*> -*> -- Written on 8-February-1989. -*> Jack Dongarra, Argonne National Laboratory. -*> Iain Duff, AERE Harwell. -*> Jeremy Du Croz, Numerical Algorithms Group Ltd. -*> Sven Hammarling, Numerical Algorithms Group Ltd. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB) -* -* -- Reference BLAS level3 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - COMPLEX*16 ALPHA - INTEGER LDA,LDB,M,N - CHARACTER DIAG,SIDE,TRANSA,UPLO -* .. -* .. Array Arguments .. - COMPLEX*16 A(LDA,*),B(LDB,*) -* .. -* -* ===================================================================== -* -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG,MAX -* .. -* .. Local Scalars .. - COMPLEX*16 TEMP - INTEGER I,INFO,J,K,NROWA - LOGICAL LSIDE,NOCONJ,NOUNIT,UPPER -* .. -* .. Parameters .. - COMPLEX*16 ONE - PARAMETER (ONE= (1.0D+0,0.0D+0)) - COMPLEX*16 ZERO - PARAMETER (ZERO= (0.0D+0,0.0D+0)) -* .. -* -* Test the input parameters. -* - LSIDE = LSAME(SIDE,'L') - IF (LSIDE) THEN - NROWA = M - ELSE - NROWA = N - END IF - NOCONJ = LSAME(TRANSA,'T') - NOUNIT = LSAME(DIAG,'N') - UPPER = LSAME(UPLO,'U') -* - INFO = 0 - IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THEN - INFO = 1 - ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN - INFO = 2 - ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND. - + (.NOT.LSAME(TRANSA,'T')) .AND. - + (.NOT.LSAME(TRANSA,'C'))) THEN - INFO = 3 - ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN - INFO = 4 - ELSE IF (M.LT.0) THEN - INFO = 5 - ELSE IF (N.LT.0) THEN - INFO = 6 - ELSE IF (LDA.LT.MAX(1,NROWA)) THEN - INFO = 9 - ELSE IF (LDB.LT.MAX(1,M)) THEN - INFO = 11 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('ZTRMM ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF (M.EQ.0 .OR. N.EQ.0) RETURN -* -* And when alpha.eq.zero. -* - IF (ALPHA.EQ.ZERO) THEN - DO 20 J = 1,N - DO 10 I = 1,M - B(I,J) = ZERO - 10 CONTINUE - 20 CONTINUE - RETURN - END IF -* -* Start the operations. -* - IF (LSIDE) THEN - IF (LSAME(TRANSA,'N')) THEN -* -* Form B := alpha*A*B. -* - IF (UPPER) THEN - DO 50 J = 1,N - DO 40 K = 1,M - IF (B(K,J).NE.ZERO) THEN - TEMP = ALPHA*B(K,J) - DO 30 I = 1,K - 1 - B(I,J) = B(I,J) + TEMP*A(I,K) - 30 CONTINUE - IF (NOUNIT) TEMP = TEMP*A(K,K) - B(K,J) = TEMP - END IF - 40 CONTINUE - 50 CONTINUE - ELSE - DO 80 J = 1,N - DO 70 K = M,1,-1 - IF (B(K,J).NE.ZERO) THEN - TEMP = ALPHA*B(K,J) - B(K,J) = TEMP - IF (NOUNIT) B(K,J) = B(K,J)*A(K,K) - DO 60 I = K + 1,M - B(I,J) = B(I,J) + TEMP*A(I,K) - 60 CONTINUE - END IF - 70 CONTINUE - 80 CONTINUE - END IF - ELSE -* -* Form B := alpha*A**T*B or B := alpha*A**H*B. -* - IF (UPPER) THEN - DO 120 J = 1,N - DO 110 I = M,1,-1 - TEMP = B(I,J) - IF (NOCONJ) THEN - IF (NOUNIT) TEMP = TEMP*A(I,I) - DO 90 K = 1,I - 1 - TEMP = TEMP + A(K,I)*B(K,J) - 90 CONTINUE - ELSE - IF (NOUNIT) TEMP = TEMP*DCONJG(A(I,I)) - DO 100 K = 1,I - 1 - TEMP = TEMP + DCONJG(A(K,I))*B(K,J) - 100 CONTINUE - END IF - B(I,J) = ALPHA*TEMP - 110 CONTINUE - 120 CONTINUE - ELSE - DO 160 J = 1,N - DO 150 I = 1,M - TEMP = B(I,J) - IF (NOCONJ) THEN - IF (NOUNIT) TEMP = TEMP*A(I,I) - DO 130 K = I + 1,M - TEMP = TEMP + A(K,I)*B(K,J) - 130 CONTINUE - ELSE - IF (NOUNIT) TEMP = TEMP*DCONJG(A(I,I)) - DO 140 K = I + 1,M - TEMP = TEMP + DCONJG(A(K,I))*B(K,J) - 140 CONTINUE - END IF - B(I,J) = ALPHA*TEMP - 150 CONTINUE - 160 CONTINUE - END IF - END IF - ELSE - IF (LSAME(TRANSA,'N')) THEN -* -* Form B := alpha*B*A. -* - IF (UPPER) THEN - DO 200 J = N,1,-1 - TEMP = ALPHA - IF (NOUNIT) TEMP = TEMP*A(J,J) - DO 170 I = 1,M - B(I,J) = TEMP*B(I,J) - 170 CONTINUE - DO 190 K = 1,J - 1 - IF (A(K,J).NE.ZERO) THEN - TEMP = ALPHA*A(K,J) - DO 180 I = 1,M - B(I,J) = B(I,J) + TEMP*B(I,K) - 180 CONTINUE - END IF - 190 CONTINUE - 200 CONTINUE - ELSE - DO 240 J = 1,N - TEMP = ALPHA - IF (NOUNIT) TEMP = TEMP*A(J,J) - DO 210 I = 1,M - B(I,J) = TEMP*B(I,J) - 210 CONTINUE - DO 230 K = J + 1,N - IF (A(K,J).NE.ZERO) THEN - TEMP = ALPHA*A(K,J) - DO 220 I = 1,M - B(I,J) = B(I,J) + TEMP*B(I,K) - 220 CONTINUE - END IF - 230 CONTINUE - 240 CONTINUE - END IF - ELSE -* -* Form B := alpha*B*A**T or B := alpha*B*A**H. -* - IF (UPPER) THEN - DO 280 K = 1,N - DO 260 J = 1,K - 1 - IF (A(J,K).NE.ZERO) THEN - IF (NOCONJ) THEN - TEMP = ALPHA*A(J,K) - ELSE - TEMP = ALPHA*DCONJG(A(J,K)) - END IF - DO 250 I = 1,M - B(I,J) = B(I,J) + TEMP*B(I,K) - 250 CONTINUE - END IF - 260 CONTINUE - TEMP = ALPHA - IF (NOUNIT) THEN - IF (NOCONJ) THEN - TEMP = TEMP*A(K,K) - ELSE - TEMP = TEMP*DCONJG(A(K,K)) - END IF - END IF - IF (TEMP.NE.ONE) THEN - DO 270 I = 1,M - B(I,K) = TEMP*B(I,K) - 270 CONTINUE - END IF - 280 CONTINUE - ELSE - DO 320 K = N,1,-1 - DO 300 J = K + 1,N - IF (A(J,K).NE.ZERO) THEN - IF (NOCONJ) THEN - TEMP = ALPHA*A(J,K) - ELSE - TEMP = ALPHA*DCONJG(A(J,K)) - END IF - DO 290 I = 1,M - B(I,J) = B(I,J) + TEMP*B(I,K) - 290 CONTINUE - END IF - 300 CONTINUE - TEMP = ALPHA - IF (NOUNIT) THEN - IF (NOCONJ) THEN - TEMP = TEMP*A(K,K) - ELSE - TEMP = TEMP*DCONJG(A(K,K)) - END IF - END IF - IF (TEMP.NE.ONE) THEN - DO 310 I = 1,M - B(I,K) = TEMP*B(I,K) - 310 CONTINUE - END IF - 320 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of ZTRMM -* - END diff --git a/lib/linalg/fortran/ztrmv.f b/lib/linalg/fortran/ztrmv.f deleted file mode 100644 index e8314facb7..0000000000 --- a/lib/linalg/fortran/ztrmv.f +++ /dev/null @@ -1,370 +0,0 @@ -*> \brief \b ZTRMV -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* SUBROUTINE ZTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) -* -* .. Scalar Arguments .. -* INTEGER INCX,LDA,N -* CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. -* COMPLEX*16 A(LDA,*),X(*) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZTRMV performs one of the matrix-vector operations -*> -*> x := A*x, or x := A**T*x, or x := A**H*x, -*> -*> where x is an n element vector and A is an n by n unit, or non-unit, -*> upper or lower triangular matrix. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> On entry, UPLO specifies whether the matrix is an upper or -*> lower triangular matrix as follows: -*> -*> UPLO = 'U' or 'u' A is an upper triangular matrix. -*> -*> UPLO = 'L' or 'l' A is a lower triangular matrix. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> On entry, TRANS specifies the operation to be performed as -*> follows: -*> -*> TRANS = 'N' or 'n' x := A*x. -*> -*> TRANS = 'T' or 't' x := A**T*x. -*> -*> TRANS = 'C' or 'c' x := A**H*x. -*> \endverbatim -*> -*> \param[in] DIAG -*> \verbatim -*> DIAG is CHARACTER*1 -*> On entry, DIAG specifies whether or not A is unit -*> triangular as follows: -*> -*> DIAG = 'U' or 'u' A is assumed to be unit triangular. -*> -*> DIAG = 'N' or 'n' A is not assumed to be unit -*> triangular. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> On entry, N specifies the order of the matrix A. -*> N must be at least zero. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension ( LDA, N ). -*> Before entry with UPLO = 'U' or 'u', the leading n by n -*> upper triangular part of the array A must contain the upper -*> triangular matrix and the strictly lower triangular part of -*> A is not referenced. -*> Before entry with UPLO = 'L' or 'l', the leading n by n -*> lower triangular part of the array A must contain the lower -*> triangular matrix and the strictly upper triangular part of -*> A is not referenced. -*> Note that when DIAG = 'U' or 'u', the diagonal elements of -*> A are not referenced either, but are assumed to be unity. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> On entry, LDA specifies the first dimension of A as declared -*> in the calling (sub) program. LDA must be at least -*> max( 1, n ). -*> \endverbatim -*> -*> \param[in,out] X -*> \verbatim -*> X is COMPLEX*16 array, dimension at least -*> ( 1 + ( n - 1 )*abs( INCX ) ). -*> Before entry, the incremented array X must contain the n -*> element vector x. On exit, X is overwritten with the -*> transformed vector x. -*> \endverbatim -*> -*> \param[in] INCX -*> \verbatim -*> INCX is INTEGER -*> On entry, INCX specifies the increment for the elements of -*> X. INCX must not be zero. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16_blas_level2 -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> Level 2 Blas routine. -*> The vector and matrix arguments are not referenced when N = 0, or M = 0 -*> -*> -- Written on 22-October-1986. -*> Jack Dongarra, Argonne National Lab. -*> Jeremy Du Croz, Nag Central Office. -*> Sven Hammarling, Nag Central Office. -*> Richard Hanson, Sandia National Labs. -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX) -* -* -- Reference BLAS level2 routine -- -* -- Reference BLAS is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INCX,LDA,N - CHARACTER DIAG,TRANS,UPLO -* .. -* .. Array Arguments .. - COMPLEX*16 A(LDA,*),X(*) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER (ZERO= (0.0D+0,0.0D+0)) -* .. -* .. Local Scalars .. - COMPLEX*16 TEMP - INTEGER I,INFO,IX,J,JX,KX - LOGICAL NOCONJ,NOUNIT -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG,MAX -* .. -* -* Test the input parameters. -* - INFO = 0 - IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN - INFO = 1 - ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND. - + .NOT.LSAME(TRANS,'C')) THEN - INFO = 2 - ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN - INFO = 3 - ELSE IF (N.LT.0) THEN - INFO = 4 - ELSE IF (LDA.LT.MAX(1,N)) THEN - INFO = 6 - ELSE IF (INCX.EQ.0) THEN - INFO = 8 - END IF - IF (INFO.NE.0) THEN - CALL XERBLA('ZTRMV ',INFO) - RETURN - END IF -* -* Quick return if possible. -* - IF (N.EQ.0) RETURN -* - NOCONJ = LSAME(TRANS,'T') - NOUNIT = LSAME(DIAG,'N') -* -* Set up the start point in X if the increment is not unity. This -* will be ( N - 1 )*INCX too small for descending loops. -* - IF (INCX.LE.0) THEN - KX = 1 - (N-1)*INCX - ELSE IF (INCX.NE.1) THEN - KX = 1 - END IF -* -* Start the operations. In this version the elements of A are -* accessed sequentially with one pass through A. -* - IF (LSAME(TRANS,'N')) THEN -* -* Form x := A*x. -* - IF (LSAME(UPLO,'U')) THEN - IF (INCX.EQ.1) THEN - DO 20 J = 1,N - IF (X(J).NE.ZERO) THEN - TEMP = X(J) - DO 10 I = 1,J - 1 - X(I) = X(I) + TEMP*A(I,J) - 10 CONTINUE - IF (NOUNIT) X(J) = X(J)*A(J,J) - END IF - 20 CONTINUE - ELSE - JX = KX - DO 40 J = 1,N - IF (X(JX).NE.ZERO) THEN - TEMP = X(JX) - IX = KX - DO 30 I = 1,J - 1 - X(IX) = X(IX) + TEMP*A(I,J) - IX = IX + INCX - 30 CONTINUE - IF (NOUNIT) X(JX) = X(JX)*A(J,J) - END IF - JX = JX + INCX - 40 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 60 J = N,1,-1 - IF (X(J).NE.ZERO) THEN - TEMP = X(J) - DO 50 I = N,J + 1,-1 - X(I) = X(I) + TEMP*A(I,J) - 50 CONTINUE - IF (NOUNIT) X(J) = X(J)*A(J,J) - END IF - 60 CONTINUE - ELSE - KX = KX + (N-1)*INCX - JX = KX - DO 80 J = N,1,-1 - IF (X(JX).NE.ZERO) THEN - TEMP = X(JX) - IX = KX - DO 70 I = N,J + 1,-1 - X(IX) = X(IX) + TEMP*A(I,J) - IX = IX - INCX - 70 CONTINUE - IF (NOUNIT) X(JX) = X(JX)*A(J,J) - END IF - JX = JX - INCX - 80 CONTINUE - END IF - END IF - ELSE -* -* Form x := A**T*x or x := A**H*x. -* - IF (LSAME(UPLO,'U')) THEN - IF (INCX.EQ.1) THEN - DO 110 J = N,1,-1 - TEMP = X(J) - IF (NOCONJ) THEN - IF (NOUNIT) TEMP = TEMP*A(J,J) - DO 90 I = J - 1,1,-1 - TEMP = TEMP + A(I,J)*X(I) - 90 CONTINUE - ELSE - IF (NOUNIT) TEMP = TEMP*DCONJG(A(J,J)) - DO 100 I = J - 1,1,-1 - TEMP = TEMP + DCONJG(A(I,J))*X(I) - 100 CONTINUE - END IF - X(J) = TEMP - 110 CONTINUE - ELSE - JX = KX + (N-1)*INCX - DO 140 J = N,1,-1 - TEMP = X(JX) - IX = JX - IF (NOCONJ) THEN - IF (NOUNIT) TEMP = TEMP*A(J,J) - DO 120 I = J - 1,1,-1 - IX = IX - INCX - TEMP = TEMP + A(I,J)*X(IX) - 120 CONTINUE - ELSE - IF (NOUNIT) TEMP = TEMP*DCONJG(A(J,J)) - DO 130 I = J - 1,1,-1 - IX = IX - INCX - TEMP = TEMP + DCONJG(A(I,J))*X(IX) - 130 CONTINUE - END IF - X(JX) = TEMP - JX = JX - INCX - 140 CONTINUE - END IF - ELSE - IF (INCX.EQ.1) THEN - DO 170 J = 1,N - TEMP = X(J) - IF (NOCONJ) THEN - IF (NOUNIT) TEMP = TEMP*A(J,J) - DO 150 I = J + 1,N - TEMP = TEMP + A(I,J)*X(I) - 150 CONTINUE - ELSE - IF (NOUNIT) TEMP = TEMP*DCONJG(A(J,J)) - DO 160 I = J + 1,N - TEMP = TEMP + DCONJG(A(I,J))*X(I) - 160 CONTINUE - END IF - X(J) = TEMP - 170 CONTINUE - ELSE - JX = KX - DO 200 J = 1,N - TEMP = X(JX) - IX = JX - IF (NOCONJ) THEN - IF (NOUNIT) TEMP = TEMP*A(J,J) - DO 180 I = J + 1,N - IX = IX + INCX - TEMP = TEMP + A(I,J)*X(IX) - 180 CONTINUE - ELSE - IF (NOUNIT) TEMP = TEMP*DCONJG(A(J,J)) - DO 190 I = J + 1,N - IX = IX + INCX - TEMP = TEMP + DCONJG(A(I,J))*X(IX) - 190 CONTINUE - END IF - X(JX) = TEMP - JX = JX + INCX - 200 CONTINUE - END IF - END IF - END IF -* - RETURN -* -* End of ZTRMV -* - END diff --git a/lib/linalg/fortran/zung2l.f b/lib/linalg/fortran/zung2l.f deleted file mode 100644 index add5cb946b..0000000000 --- a/lib/linalg/fortran/zung2l.f +++ /dev/null @@ -1,196 +0,0 @@ -*> \brief \b ZUNG2L generates all or part of the unitary matrix Q from a QL factorization determined by cgeqlf (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZUNG2L + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZUNG2L( M, N, K, A, LDA, TAU, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDA, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZUNG2L generates an m by n complex matrix Q with orthonormal columns, -*> which is defined as the last n columns of a product of k elementary -*> reflectors of order m -*> -*> Q = H(k) . . . H(2) H(1) -*> -*> as returned by ZGEQLF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix Q. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix Q. M >= N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines the -*> matrix Q. N >= K >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> On entry, the (n-k+i)-th column must contain the vector which -*> defines the elementary reflector H(i), for i = 1,2,...,k, as -*> returned by ZGEQLF in the last k columns of its array -*> argument A. -*> On exit, the m-by-n matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The first dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by ZGEQLF. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument has an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZUNG2L( M, N, K, A, LDA, TAU, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDA, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE, ZERO - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), - $ ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - INTEGER I, II, J, L -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZLARF, ZSCAL -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 .OR. N.GT.M ) THEN - INFO = -2 - ELSE IF( K.LT.0 .OR. K.GT.N ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZUNG2L', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.LE.0 ) - $ RETURN -* -* Initialise columns 1:n-k to columns of the unit matrix -* - DO 20 J = 1, N - K - DO 10 L = 1, M - A( L, J ) = ZERO - 10 CONTINUE - A( M-N+J, J ) = ONE - 20 CONTINUE -* - DO 40 I = 1, K - II = N - K + I -* -* Apply H(i) to A(1:m-k+i,1:n-k+i) from the left -* - A( M-N+II, II ) = ONE - CALL ZLARF( 'Left', M-N+II, II-1, A( 1, II ), 1, TAU( I ), A, - $ LDA, WORK ) - CALL ZSCAL( M-N+II-1, -TAU( I ), A( 1, II ), 1 ) - A( M-N+II, II ) = ONE - TAU( I ) -* -* Set A(m-k+i+1:m,n-k+i) to zero -* - DO 30 L = M - N + II + 1, M - A( L, II ) = ZERO - 30 CONTINUE - 40 CONTINUE - RETURN -* -* End of ZUNG2L -* - END diff --git a/lib/linalg/fortran/zung2r.f b/lib/linalg/fortran/zung2r.f deleted file mode 100644 index 2823b7ebdd..0000000000 --- a/lib/linalg/fortran/zung2r.f +++ /dev/null @@ -1,198 +0,0 @@ -*> \brief \b ZUNG2R -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZUNG2R + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZUNG2R( M, N, K, A, LDA, TAU, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDA, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZUNG2R generates an m by n complex matrix Q with orthonormal columns, -*> which is defined as the first n columns of a product of k elementary -*> reflectors of order m -*> -*> Q = H(1) H(2) . . . H(k) -*> -*> as returned by ZGEQRF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix Q. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix Q. M >= N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines the -*> matrix Q. N >= K >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> On entry, the i-th column must contain the vector which -*> defines the elementary reflector H(i), for i = 1,2,...,k, as -*> returned by ZGEQRF in the first k columns of its array -*> argument A. -*> On exit, the m by n matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The first dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by ZGEQRF. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (N) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument has an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZUNG2R( M, N, K, A, LDA, TAU, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDA, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE, ZERO - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), - $ ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - INTEGER I, J, L -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZLARF, ZSCAL -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 .OR. N.GT.M ) THEN - INFO = -2 - ELSE IF( K.LT.0 .OR. K.GT.N ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZUNG2R', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.LE.0 ) - $ RETURN -* -* Initialise columns k+1:n to columns of the unit matrix -* - DO 20 J = K + 1, N - DO 10 L = 1, M - A( L, J ) = ZERO - 10 CONTINUE - A( J, J ) = ONE - 20 CONTINUE -* - DO 40 I = K, 1, -1 -* -* Apply H(i) to A(i:m,i:n) from the left -* - IF( I.LT.N ) THEN - A( I, I ) = ONE - CALL ZLARF( 'Left', M-I+1, N-I, A( I, I ), 1, TAU( I ), - $ A( I, I+1 ), LDA, WORK ) - END IF - IF( I.LT.M ) - $ CALL ZSCAL( M-I, -TAU( I ), A( I+1, I ), 1 ) - A( I, I ) = ONE - TAU( I ) -* -* Set A(1:i-1,i) to zero -* - DO 30 L = 1, I - 1 - A( L, I ) = ZERO - 30 CONTINUE - 40 CONTINUE - RETURN -* -* End of ZUNG2R -* - END diff --git a/lib/linalg/fortran/zungl2.f b/lib/linalg/fortran/zungl2.f deleted file mode 100644 index e7a0b59603..0000000000 --- a/lib/linalg/fortran/zungl2.f +++ /dev/null @@ -1,204 +0,0 @@ -*> \brief \b ZUNGL2 generates all or part of the unitary matrix Q from an LQ factorization determined by cgelqf (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZUNGL2 + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZUNGL2( M, N, K, A, LDA, TAU, WORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDA, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZUNGL2 generates an m-by-n complex matrix Q with orthonormal rows, -*> which is defined as the first m rows of a product of k elementary -*> reflectors of order n -*> -*> Q = H(k)**H . . . H(2)**H H(1)**H -*> -*> as returned by ZGELQF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix Q. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix Q. N >= M. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines the -*> matrix Q. M >= K >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> On entry, the i-th row must contain the vector which defines -*> the elementary reflector H(i), for i = 1,2,...,k, as returned -*> by ZGELQF in the first k rows of its array argument A. -*> On exit, the m by n matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The first dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by ZGELQF. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (M) -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument has an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZUNGL2( M, N, K, A, LDA, TAU, WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDA, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE, ZERO - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), - $ ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - INTEGER I, J, L -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZLACGV, ZLARF, ZSCAL -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG, MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.M ) THEN - INFO = -2 - ELSE IF( K.LT.0 .OR. K.GT.M ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZUNGL2', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( M.LE.0 ) - $ RETURN -* - IF( K.LT.M ) THEN -* -* Initialise rows k+1:m to rows of the unit matrix -* - DO 20 J = 1, N - DO 10 L = K + 1, M - A( L, J ) = ZERO - 10 CONTINUE - IF( J.GT.K .AND. J.LE.M ) - $ A( J, J ) = ONE - 20 CONTINUE - END IF -* - DO 40 I = K, 1, -1 -* -* Apply H(i)**H to A(i:m,i:n) from the right -* - IF( I.LT.N ) THEN - CALL ZLACGV( N-I, A( I, I+1 ), LDA ) - IF( I.LT.M ) THEN - A( I, I ) = ONE - CALL ZLARF( 'Right', M-I, N-I+1, A( I, I ), LDA, - $ DCONJG( TAU( I ) ), A( I+1, I ), LDA, WORK ) - END IF - CALL ZSCAL( N-I, -TAU( I ), A( I, I+1 ), LDA ) - CALL ZLACGV( N-I, A( I, I+1 ), LDA ) - END IF - A( I, I ) = ONE - DCONJG( TAU( I ) ) -* -* Set A(i,1:i-1) to zero -* - DO 30 L = 1, I - 1 - A( I, L ) = ZERO - 30 CONTINUE - 40 CONTINUE - RETURN -* -* End of ZUNGL2 -* - END diff --git a/lib/linalg/fortran/zungql.f b/lib/linalg/fortran/zungql.f deleted file mode 100644 index 1804ca65ff..0000000000 --- a/lib/linalg/fortran/zungql.f +++ /dev/null @@ -1,293 +0,0 @@ -*> \brief \b ZUNGQL -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZUNGQL + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZUNGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDA, LWORK, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZUNGQL generates an M-by-N complex matrix Q with orthonormal columns, -*> which is defined as the last N columns of a product of K elementary -*> reflectors of order M -*> -*> Q = H(k) . . . H(2) H(1) -*> -*> as returned by ZGEQLF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix Q. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix Q. M >= N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines the -*> matrix Q. N >= K >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> On entry, the (n-k+i)-th column must contain the vector which -*> defines the elementary reflector H(i), for i = 1,2,...,k, as -*> returned by ZGEQLF in the last k columns of its array -*> argument A. -*> On exit, the M-by-N matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The first dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by ZGEQLF. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= max(1,N). -*> For optimum performance LWORK >= N*NB, where NB is the -*> optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument has an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZUNGQL( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDA, LWORK, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER I, IB, IINFO, IWS, J, KK, L, LDWORK, LWKOPT, - $ NB, NBMIN, NX -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZLARFB, ZLARFT, ZUNG2L -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LQUERY = ( LWORK.EQ.-1 ) - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 .OR. N.GT.M ) THEN - INFO = -2 - ELSE IF( K.LT.0 .OR. K.GT.N ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - END IF -* - IF( INFO.EQ.0 ) THEN - IF( N.EQ.0 ) THEN - LWKOPT = 1 - ELSE - NB = ILAENV( 1, 'ZUNGQL', ' ', M, N, K, -1 ) - LWKOPT = N*NB - END IF - WORK( 1 ) = LWKOPT -* - IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN - INFO = -8 - END IF - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZUNGQL', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.LE.0 ) THEN - RETURN - END IF -* - NBMIN = 2 - NX = 0 - IWS = N - IF( NB.GT.1 .AND. NB.LT.K ) THEN -* -* Determine when to cross over from blocked to unblocked code. -* - NX = MAX( 0, ILAENV( 3, 'ZUNGQL', ' ', M, N, K, -1 ) ) - IF( NX.LT.K ) THEN -* -* Determine if workspace is large enough for blocked code. -* - LDWORK = N - IWS = LDWORK*NB - IF( LWORK.LT.IWS ) THEN -* -* Not enough workspace to use optimal NB: reduce NB and -* determine the minimum value of NB. -* - NB = LWORK / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'ZUNGQL', ' ', M, N, K, -1 ) ) - END IF - END IF - END IF -* - IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN -* -* Use blocked code after the first block. -* The last kk columns are handled by the block method. -* - KK = MIN( K, ( ( K-NX+NB-1 ) / NB )*NB ) -* -* Set A(m-kk+1:m,1:n-kk) to zero. -* - DO 20 J = 1, N - KK - DO 10 I = M - KK + 1, M - A( I, J ) = ZERO - 10 CONTINUE - 20 CONTINUE - ELSE - KK = 0 - END IF -* -* Use unblocked code for the first or only block. -* - CALL ZUNG2L( M-KK, N-KK, K-KK, A, LDA, TAU, WORK, IINFO ) -* - IF( KK.GT.0 ) THEN -* -* Use blocked code -* - DO 50 I = K - KK + 1, K, NB - IB = MIN( NB, K-I+1 ) - IF( N-K+I.GT.1 ) THEN -* -* Form the triangular factor of the block reflector -* H = H(i+ib-1) . . . H(i+1) H(i) -* - CALL ZLARFT( 'Backward', 'Columnwise', M-K+I+IB-1, IB, - $ A( 1, N-K+I ), LDA, TAU( I ), WORK, LDWORK ) -* -* Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left -* - CALL ZLARFB( 'Left', 'No transpose', 'Backward', - $ 'Columnwise', M-K+I+IB-1, N-K+I-1, IB, - $ A( 1, N-K+I ), LDA, WORK, LDWORK, A, LDA, - $ WORK( IB+1 ), LDWORK ) - END IF -* -* Apply H to rows 1:m-k+i+ib-1 of current block -* - CALL ZUNG2L( M-K+I+IB-1, IB, IB, A( 1, N-K+I ), LDA, - $ TAU( I ), WORK, IINFO ) -* -* Set rows m-k+i+ib:m of current block to zero -* - DO 40 J = N - K + I, N - K + I + IB - 1 - DO 30 L = M - K + I + IB, M - A( L, J ) = ZERO - 30 CONTINUE - 40 CONTINUE - 50 CONTINUE - END IF -* - WORK( 1 ) = IWS - RETURN -* -* End of ZUNGQL -* - END diff --git a/lib/linalg/fortran/zungqr.f b/lib/linalg/fortran/zungqr.f deleted file mode 100644 index b3f2c4507f..0000000000 --- a/lib/linalg/fortran/zungqr.f +++ /dev/null @@ -1,287 +0,0 @@ -*> \brief \b ZUNGQR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZUNGQR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZUNGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, K, LDA, LWORK, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZUNGQR generates an M-by-N complex matrix Q with orthonormal columns, -*> which is defined as the first N columns of a product of K elementary -*> reflectors of order M -*> -*> Q = H(1) H(2) . . . H(k) -*> -*> as returned by ZGEQRF. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix Q. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix Q. M >= N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines the -*> matrix Q. N >= K >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> On entry, the i-th column must contain the vector which -*> defines the elementary reflector H(i), for i = 1,2,...,k, as -*> returned by ZGEQRF in the first k columns of its array -*> argument A. -*> On exit, the M-by-N matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The first dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by ZGEQRF. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= max(1,N). -*> For optimum performance LWORK >= N*NB, where NB is the -*> optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument has an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZUNGQR( M, N, K, A, LDA, TAU, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, K, LDA, LWORK, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO - PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY - INTEGER I, IB, IINFO, IWS, J, KI, KK, L, LDWORK, - $ LWKOPT, NB, NBMIN, NX -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZLARFB, ZLARFT, ZUNG2R -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. External Functions .. - INTEGER ILAENV - EXTERNAL ILAENV -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - NB = ILAENV( 1, 'ZUNGQR', ' ', M, N, K, -1 ) - LWKOPT = MAX( 1, N )*NB - WORK( 1 ) = LWKOPT - LQUERY = ( LWORK.EQ.-1 ) - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 .OR. N.GT.M ) THEN - INFO = -2 - ELSE IF( K.LT.0 .OR. K.GT.N ) THEN - INFO = -3 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 - ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN - INFO = -8 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZUNGQR', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.LE.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - NBMIN = 2 - NX = 0 - IWS = N - IF( NB.GT.1 .AND. NB.LT.K ) THEN -* -* Determine when to cross over from blocked to unblocked code. -* - NX = MAX( 0, ILAENV( 3, 'ZUNGQR', ' ', M, N, K, -1 ) ) - IF( NX.LT.K ) THEN -* -* Determine if workspace is large enough for blocked code. -* - LDWORK = N - IWS = LDWORK*NB - IF( LWORK.LT.IWS ) THEN -* -* Not enough workspace to use optimal NB: reduce NB and -* determine the minimum value of NB. -* - NB = LWORK / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'ZUNGQR', ' ', M, N, K, -1 ) ) - END IF - END IF - END IF -* - IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN -* -* Use blocked code after the last block. -* The first kk columns are handled by the block method. -* - KI = ( ( K-NX-1 ) / NB )*NB - KK = MIN( K, KI+NB ) -* -* Set A(1:kk,kk+1:n) to zero. -* - DO 20 J = KK + 1, N - DO 10 I = 1, KK - A( I, J ) = ZERO - 10 CONTINUE - 20 CONTINUE - ELSE - KK = 0 - END IF -* -* Use unblocked code for the last or only block. -* - IF( KK.LT.N ) - $ CALL ZUNG2R( M-KK, N-KK, K-KK, A( KK+1, KK+1 ), LDA, - $ TAU( KK+1 ), WORK, IINFO ) -* - IF( KK.GT.0 ) THEN -* -* Use blocked code -* - DO 50 I = KI + 1, 1, -NB - IB = MIN( NB, K-I+1 ) - IF( I+IB.LE.N ) THEN -* -* Form the triangular factor of the block reflector -* H = H(i) H(i+1) . . . H(i+ib-1) -* - CALL ZLARFT( 'Forward', 'Columnwise', M-I+1, IB, - $ A( I, I ), LDA, TAU( I ), WORK, LDWORK ) -* -* Apply H to A(i:m,i+ib:n) from the left -* - CALL ZLARFB( 'Left', 'No transpose', 'Forward', - $ 'Columnwise', M-I+1, N-I-IB+1, IB, - $ A( I, I ), LDA, WORK, LDWORK, A( I, I+IB ), - $ LDA, WORK( IB+1 ), LDWORK ) - END IF -* -* Apply H to rows i:m of current block -* - CALL ZUNG2R( M-I+1, IB, IB, A( I, I ), LDA, TAU( I ), WORK, - $ IINFO ) -* -* Set rows 1:i-1 of current block to zero -* - DO 40 J = I, I + IB - 1 - DO 30 L = 1, I - 1 - A( L, J ) = ZERO - 30 CONTINUE - 40 CONTINUE - 50 CONTINUE - END IF -* - WORK( 1 ) = IWS - RETURN -* -* End of ZUNGQR -* - END diff --git a/lib/linalg/fortran/zungtr.f b/lib/linalg/fortran/zungtr.f deleted file mode 100644 index 01e100a8cd..0000000000 --- a/lib/linalg/fortran/zungtr.f +++ /dev/null @@ -1,253 +0,0 @@ -*> \brief \b ZUNGTR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZUNGTR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZUNGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZUNGTR generates a complex unitary matrix Q which is defined as the -*> product of n-1 elementary reflectors of order N, as returned by -*> ZHETRD: -*> -*> if UPLO = 'U', Q = H(n-1) . . . H(2) H(1), -*> -*> if UPLO = 'L', Q = H(1) H(2) . . . H(n-1). -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A contains elementary reflectors -*> from ZHETRD; -*> = 'L': Lower triangle of A contains elementary reflectors -*> from ZHETRD. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix Q. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,N) -*> On entry, the vectors which define the elementary reflectors, -*> as returned by ZHETRD. -*> On exit, the N-by-N unitary matrix Q. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= N. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (N-1) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by ZHETRD. -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. LWORK >= N-1. -*> For optimum performance LWORK >= (N-1)*NB, where NB is -*> the optimal blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZUNGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDA, LWORK, N -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ZERO, ONE - PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ), - $ ONE = ( 1.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL LQUERY, UPPER - INTEGER I, IINFO, J, LWKOPT, NB -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZUNGQL, ZUNGQR -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LQUERY = ( LWORK.EQ.-1 ) - UPPER = LSAME( UPLO, 'U' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -4 - ELSE IF( LWORK.LT.MAX( 1, N-1 ) .AND. .NOT.LQUERY ) THEN - INFO = -7 - END IF -* - IF( INFO.EQ.0 ) THEN - IF( UPPER ) THEN - NB = ILAENV( 1, 'ZUNGQL', ' ', N-1, N-1, N-1, -1 ) - ELSE - NB = ILAENV( 1, 'ZUNGQR', ' ', N-1, N-1, N-1, -1 ) - END IF - LWKOPT = MAX( 1, N-1 )*NB - WORK( 1 ) = LWKOPT - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZUNGTR', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - IF( UPPER ) THEN -* -* Q was determined by a call to ZHETRD with UPLO = 'U' -* -* Shift the vectors which define the elementary reflectors one -* column to the left, and set the last row and column of Q to -* those of the unit matrix -* - DO 20 J = 1, N - 1 - DO 10 I = 1, J - 1 - A( I, J ) = A( I, J+1 ) - 10 CONTINUE - A( N, J ) = ZERO - 20 CONTINUE - DO 30 I = 1, N - 1 - A( I, N ) = ZERO - 30 CONTINUE - A( N, N ) = ONE -* -* Generate Q(1:n-1,1:n-1) -* - CALL ZUNGQL( N-1, N-1, N-1, A, LDA, TAU, WORK, LWORK, IINFO ) -* - ELSE -* -* Q was determined by a call to ZHETRD with UPLO = 'L'. -* -* Shift the vectors which define the elementary reflectors one -* column to the right, and set the first row and column of Q to -* those of the unit matrix -* - DO 50 J = N, 2, -1 - A( 1, J ) = ZERO - DO 40 I = J + 1, N - A( I, J ) = A( I, J-1 ) - 40 CONTINUE - 50 CONTINUE - A( 1, 1 ) = ONE - DO 60 I = 2, N - A( I, 1 ) = ZERO - 60 CONTINUE - IF( N.GT.1 ) THEN -* -* Generate Q(2:n,2:n) -* - CALL ZUNGQR( N-1, N-1, N-1, A( 2, 2 ), LDA, TAU, WORK, - $ LWORK, IINFO ) - END IF - END IF - WORK( 1 ) = LWKOPT - RETURN -* -* End of ZUNGTR -* - END diff --git a/lib/linalg/fortran/zunm2l.f b/lib/linalg/fortran/zunm2l.f deleted file mode 100644 index 48c2dbfc0c..0000000000 --- a/lib/linalg/fortran/zunm2l.f +++ /dev/null @@ -1,278 +0,0 @@ -*> \brief \b ZUNM2L multiplies a general matrix by the unitary matrix from a QL factorization determined by cgeqlf (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZUNM2L + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZUNM2L( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, -* WORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS -* INTEGER INFO, K, LDA, LDC, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZUNM2L overwrites the general complex m-by-n matrix C with -*> -*> Q * C if SIDE = 'L' and TRANS = 'N', or -*> -*> Q**H* C if SIDE = 'L' and TRANS = 'C', or -*> -*> C * Q if SIDE = 'R' and TRANS = 'N', or -*> -*> C * Q**H if SIDE = 'R' and TRANS = 'C', -*> -*> where Q is a complex unitary matrix defined as the product of k -*> elementary reflectors -*> -*> Q = H(k) . . . H(2) H(1) -*> -*> as returned by ZGEQLF. Q is of order m if SIDE = 'L' and of order n -*> if SIDE = 'R'. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q or Q**H from the Left -*> = 'R': apply Q or Q**H from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply Q (No transpose) -*> = 'C': apply Q**H (Conjugate transpose) -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines -*> the matrix Q. -*> If SIDE = 'L', M >= K >= 0; -*> if SIDE = 'R', N >= K >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,K) -*> The i-th column must contain the vector which defines the -*> elementary reflector H(i), for i = 1,2,...,k, as returned by -*> ZGEQLF in the last k columns of its array argument A. -*> A is modified by the routine but restored on exit. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> If SIDE = 'L', LDA >= max(1,M); -*> if SIDE = 'R', LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by ZGEQLF. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension (LDC,N) -*> On entry, the m-by-n matrix C. -*> On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension -*> (N) if SIDE = 'L', -*> (M) if SIDE = 'R' -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZUNM2L( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, - $ WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS - INTEGER INFO, K, LDA, LDC, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL LEFT, NOTRAN - INTEGER I, I1, I2, I3, MI, NI, NQ - COMPLEX*16 AII, TAUI -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZLARF -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG, MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LEFT = LSAME( SIDE, 'L' ) - NOTRAN = LSAME( TRANS, 'N' ) -* -* NQ is the order of Q -* - IF( LEFT ) THEN - NQ = M - ELSE - NQ = N - END IF - IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN - INFO = -2 - ELSE IF( M.LT.0 ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN - INFO = -7 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -10 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZUNM2L', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) - $ RETURN -* - IF( ( LEFT .AND. NOTRAN .OR. .NOT.LEFT .AND. .NOT.NOTRAN ) ) THEN - I1 = 1 - I2 = K - I3 = 1 - ELSE - I1 = K - I2 = 1 - I3 = -1 - END IF -* - IF( LEFT ) THEN - NI = N - ELSE - MI = M - END IF -* - DO 10 I = I1, I2, I3 - IF( LEFT ) THEN -* -* H(i) or H(i)**H is applied to C(1:m-k+i,1:n) -* - MI = M - K + I - ELSE -* -* H(i) or H(i)**H is applied to C(1:m,1:n-k+i) -* - NI = N - K + I - END IF -* -* Apply H(i) or H(i)**H -* - IF( NOTRAN ) THEN - TAUI = TAU( I ) - ELSE - TAUI = DCONJG( TAU( I ) ) - END IF - AII = A( NQ-K+I, I ) - A( NQ-K+I, I ) = ONE - CALL ZLARF( SIDE, MI, NI, A( 1, I ), 1, TAUI, C, LDC, WORK ) - A( NQ-K+I, I ) = AII - 10 CONTINUE - RETURN -* -* End of ZUNM2L -* - END diff --git a/lib/linalg/fortran/zunm2r.f b/lib/linalg/fortran/zunm2r.f deleted file mode 100644 index aec5a8bcae..0000000000 --- a/lib/linalg/fortran/zunm2r.f +++ /dev/null @@ -1,283 +0,0 @@ -*> \brief \b ZUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by cgeqrf (unblocked algorithm). -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZUNM2R + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZUNM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, -* WORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS -* INTEGER INFO, K, LDA, LDC, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZUNM2R overwrites the general complex m-by-n matrix C with -*> -*> Q * C if SIDE = 'L' and TRANS = 'N', or -*> -*> Q**H* C if SIDE = 'L' and TRANS = 'C', or -*> -*> C * Q if SIDE = 'R' and TRANS = 'N', or -*> -*> C * Q**H if SIDE = 'R' and TRANS = 'C', -*> -*> where Q is a complex unitary matrix defined as the product of k -*> elementary reflectors -*> -*> Q = H(1) H(2) . . . H(k) -*> -*> as returned by ZGEQRF. Q is of order m if SIDE = 'L' and of order n -*> if SIDE = 'R'. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q or Q**H from the Left -*> = 'R': apply Q or Q**H from the Right -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': apply Q (No transpose) -*> = 'C': apply Q**H (Conjugate transpose) -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines -*> the matrix Q. -*> If SIDE = 'L', M >= K >= 0; -*> if SIDE = 'R', N >= K >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,K) -*> The i-th column must contain the vector which defines the -*> elementary reflector H(i), for i = 1,2,...,k, as returned by -*> ZGEQRF in the first k columns of its array argument A. -*> A is modified by the routine but restored on exit. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> If SIDE = 'L', LDA >= max(1,M); -*> if SIDE = 'R', LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by ZGEQRF. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension (LDC,N) -*> On entry, the m-by-n matrix C. -*> On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension -*> (N) if SIDE = 'L', -*> (M) if SIDE = 'R' -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZUNM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, - $ WORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS - INTEGER INFO, K, LDA, LDC, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - LOGICAL LEFT, NOTRAN - INTEGER I, I1, I2, I3, IC, JC, MI, NI, NQ - COMPLEX*16 AII, TAUI -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZLARF -* .. -* .. Intrinsic Functions .. - INTRINSIC DCONJG, MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LEFT = LSAME( SIDE, 'L' ) - NOTRAN = LSAME( TRANS, 'N' ) -* -* NQ is the order of Q -* - IF( LEFT ) THEN - NQ = M - ELSE - NQ = N - END IF - IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN - INFO = -2 - ELSE IF( M.LT.0 ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN - INFO = -7 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -10 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZUNM2R', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) - $ RETURN -* - IF( ( LEFT .AND. .NOT.NOTRAN .OR. .NOT.LEFT .AND. NOTRAN ) ) THEN - I1 = 1 - I2 = K - I3 = 1 - ELSE - I1 = K - I2 = 1 - I3 = -1 - END IF -* - IF( LEFT ) THEN - NI = N - JC = 1 - ELSE - MI = M - IC = 1 - END IF -* - DO 10 I = I1, I2, I3 - IF( LEFT ) THEN -* -* H(i) or H(i)**H is applied to C(i:m,1:n) -* - MI = M - I + 1 - IC = I - ELSE -* -* H(i) or H(i)**H is applied to C(1:m,i:n) -* - NI = N - I + 1 - JC = I - END IF -* -* Apply H(i) or H(i)**H -* - IF( NOTRAN ) THEN - TAUI = TAU( I ) - ELSE - TAUI = DCONJG( TAU( I ) ) - END IF - AII = A( I, I ) - A( I, I ) = ONE - CALL ZLARF( SIDE, MI, NI, A( I, I ), 1, TAUI, C( IC, JC ), LDC, - $ WORK ) - A( I, I ) = AII - 10 CONTINUE - RETURN -* -* End of ZUNM2R -* - END diff --git a/lib/linalg/fortran/zunmql.f b/lib/linalg/fortran/zunmql.f deleted file mode 100644 index 06353a0c75..0000000000 --- a/lib/linalg/fortran/zunmql.f +++ /dev/null @@ -1,336 +0,0 @@ -*> \brief \b ZUNMQL -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZUNMQL + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZUNMQL( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, -* WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS -* INTEGER INFO, K, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZUNMQL overwrites the general complex M-by-N matrix C with -*> -*> SIDE = 'L' SIDE = 'R' -*> TRANS = 'N': Q * C C * Q -*> TRANS = 'C': Q**H * C C * Q**H -*> -*> where Q is a complex unitary matrix defined as the product of k -*> elementary reflectors -*> -*> Q = H(k) . . . H(2) H(1) -*> -*> as returned by ZGEQLF. Q is of order M if SIDE = 'L' and of order N -*> if SIDE = 'R'. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q or Q**H from the Left; -*> = 'R': apply Q or Q**H from the Right. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': No transpose, apply Q; -*> = 'C': Conjugate transpose, apply Q**H. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines -*> the matrix Q. -*> If SIDE = 'L', M >= K >= 0; -*> if SIDE = 'R', N >= K >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,K) -*> The i-th column must contain the vector which defines the -*> elementary reflector H(i), for i = 1,2,...,k, as returned by -*> ZGEQLF in the last k columns of its array argument A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> If SIDE = 'L', LDA >= max(1,M); -*> if SIDE = 'R', LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by ZGEQLF. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> If SIDE = 'L', LWORK >= max(1,N); -*> if SIDE = 'R', LWORK >= max(1,M). -*> For good performance, LWORK should generally be larger. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZUNMQL( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, - $ WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS - INTEGER INFO, K, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - INTEGER NBMAX, LDT, TSIZE - PARAMETER ( NBMAX = 64, LDT = NBMAX+1, - $ TSIZE = LDT*NBMAX ) -* .. -* .. Local Scalars .. - LOGICAL LEFT, LQUERY, NOTRAN - INTEGER I, I1, I2, I3, IB, IINFO, IWT, LDWORK, LWKOPT, - $ MI, NB, NBMIN, NI, NQ, NW -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZLARFB, ZLARFT, ZUNM2L -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LEFT = LSAME( SIDE, 'L' ) - NOTRAN = LSAME( TRANS, 'N' ) - LQUERY = ( LWORK.EQ.-1 ) -* -* NQ is the order of Q and NW is the minimum dimension of WORK -* - IF( LEFT ) THEN - NQ = M - NW = MAX( 1, N ) - ELSE - NQ = N - NW = MAX( 1, M ) - END IF - IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN - INFO = -2 - ELSE IF( M.LT.0 ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN - INFO = -7 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -10 - ELSE IF( LWORK.LT.NW .AND. .NOT.LQUERY ) THEN - INFO = -12 - END IF -* - IF( INFO.EQ.0 ) THEN -* -* Compute the workspace requirements -* - IF( M.EQ.0 .OR. N.EQ.0 ) THEN - LWKOPT = 1 - ELSE - NB = MIN( NBMAX, ILAENV( 1, 'ZUNMQL', SIDE // TRANS, M, N, - $ K, -1 ) ) - LWKOPT = NW*NB + TSIZE - END IF - WORK( 1 ) = LWKOPT - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZUNMQL', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 ) THEN - RETURN - END IF -* - NBMIN = 2 - LDWORK = NW - IF( NB.GT.1 .AND. NB.LT.K ) THEN - IF( LWORK.LT.LWKOPT ) THEN - NB = (LWORK-TSIZE) / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'ZUNMQL', SIDE // TRANS, M, N, K, - $ -1 ) ) - END IF - END IF -* - IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN -* -* Use unblocked code -* - CALL ZUNM2L( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, - $ IINFO ) - ELSE -* -* Use blocked code -* - IWT = 1 + NW*NB - IF( ( LEFT .AND. NOTRAN ) .OR. - $ ( .NOT.LEFT .AND. .NOT.NOTRAN ) ) THEN - I1 = 1 - I2 = K - I3 = NB - ELSE - I1 = ( ( K-1 ) / NB )*NB + 1 - I2 = 1 - I3 = -NB - END IF -* - IF( LEFT ) THEN - NI = N - ELSE - MI = M - END IF -* - DO 10 I = I1, I2, I3 - IB = MIN( NB, K-I+1 ) -* -* Form the triangular factor of the block reflector -* H = H(i+ib-1) . . . H(i+1) H(i) -* - CALL ZLARFT( 'Backward', 'Columnwise', NQ-K+I+IB-1, IB, - $ A( 1, I ), LDA, TAU( I ), WORK( IWT ), LDT ) - IF( LEFT ) THEN -* -* H or H**H is applied to C(1:m-k+i+ib-1,1:n) -* - MI = M - K + I + IB - 1 - ELSE -* -* H or H**H is applied to C(1:m,1:n-k+i+ib-1) -* - NI = N - K + I + IB - 1 - END IF -* -* Apply H or H**H -* - CALL ZLARFB( SIDE, TRANS, 'Backward', 'Columnwise', MI, NI, - $ IB, A( 1, I ), LDA, WORK( IWT ), LDT, C, LDC, - $ WORK, LDWORK ) - 10 CONTINUE - END IF - WORK( 1 ) = LWKOPT - RETURN -* -* End of ZUNMQL -* - END diff --git a/lib/linalg/fortran/zunmqr.f b/lib/linalg/fortran/zunmqr.f deleted file mode 100644 index 2ae205f4fd..0000000000 --- a/lib/linalg/fortran/zunmqr.f +++ /dev/null @@ -1,337 +0,0 @@ -*> \brief \b ZUNMQR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZUNMQR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZUNMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, -* WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS -* INTEGER INFO, K, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZUNMQR overwrites the general complex M-by-N matrix C with -*> -*> SIDE = 'L' SIDE = 'R' -*> TRANS = 'N': Q * C C * Q -*> TRANS = 'C': Q**H * C C * Q**H -*> -*> where Q is a complex unitary matrix defined as the product of k -*> elementary reflectors -*> -*> Q = H(1) H(2) . . . H(k) -*> -*> as returned by ZGEQRF. Q is of order M if SIDE = 'L' and of order N -*> if SIDE = 'R'. -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q or Q**H from the Left; -*> = 'R': apply Q or Q**H from the Right. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': No transpose, apply Q; -*> = 'C': Conjugate transpose, apply Q**H. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The number of elementary reflectors whose product defines -*> the matrix Q. -*> If SIDE = 'L', M >= K >= 0; -*> if SIDE = 'R', N >= K >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension (LDA,K) -*> The i-th column must contain the vector which defines the -*> elementary reflector H(i), for i = 1,2,...,k, as returned by -*> ZGEQRF in the first k columns of its array argument A. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> If SIDE = 'L', LDA >= max(1,M); -*> if SIDE = 'R', LDA >= max(1,N). -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by ZGEQRF. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> If SIDE = 'L', LWORK >= max(1,N); -*> if SIDE = 'R', LWORK >= max(1,M). -*> For good performance, LWORK should generally be larger. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZUNMQR( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, - $ WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS - INTEGER INFO, K, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - INTEGER NBMAX, LDT, TSIZE - PARAMETER ( NBMAX = 64, LDT = NBMAX+1, - $ TSIZE = LDT*NBMAX ) -* .. -* .. Local Scalars .. - LOGICAL LEFT, LQUERY, NOTRAN - INTEGER I, I1, I2, I3, IB, IC, IINFO, IWT, JC, LDWORK, - $ LWKOPT, MI, NB, NBMIN, NI, NQ, NW -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZLARFB, ZLARFT, ZUNM2R -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LEFT = LSAME( SIDE, 'L' ) - NOTRAN = LSAME( TRANS, 'N' ) - LQUERY = ( LWORK.EQ.-1 ) -* -* NQ is the order of Q and NW is the minimum dimension of WORK -* - IF( LEFT ) THEN - NQ = M - NW = MAX( 1, N ) - ELSE - NQ = N - NW = MAX( 1, M ) - END IF - IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -1 - ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN - INFO = -2 - ELSE IF( M.LT.0 ) THEN - INFO = -3 - ELSE IF( N.LT.0 ) THEN - INFO = -4 - ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN - INFO = -7 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -10 - ELSE IF( LWORK.LT.NW .AND. .NOT.LQUERY ) THEN - INFO = -12 - END IF -* - IF( INFO.EQ.0 ) THEN -* -* Compute the workspace requirements -* - NB = MIN( NBMAX, ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M, N, K, - $ -1 ) ) - LWKOPT = NW*NB + TSIZE - WORK( 1 ) = LWKOPT - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZUNMQR', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - NBMIN = 2 - LDWORK = NW - IF( NB.GT.1 .AND. NB.LT.K ) THEN - IF( LWORK.LT.LWKOPT ) THEN - NB = (LWORK-TSIZE) / LDWORK - NBMIN = MAX( 2, ILAENV( 2, 'ZUNMQR', SIDE // TRANS, M, N, K, - $ -1 ) ) - END IF - END IF -* - IF( NB.LT.NBMIN .OR. NB.GE.K ) THEN -* -* Use unblocked code -* - CALL ZUNM2R( SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, - $ IINFO ) - ELSE -* -* Use blocked code -* - IWT = 1 + NW*NB - IF( ( LEFT .AND. .NOT.NOTRAN ) .OR. - $ ( .NOT.LEFT .AND. NOTRAN ) ) THEN - I1 = 1 - I2 = K - I3 = NB - ELSE - I1 = ( ( K-1 ) / NB )*NB + 1 - I2 = 1 - I3 = -NB - END IF -* - IF( LEFT ) THEN - NI = N - JC = 1 - ELSE - MI = M - IC = 1 - END IF -* - DO 10 I = I1, I2, I3 - IB = MIN( NB, K-I+1 ) -* -* Form the triangular factor of the block reflector -* H = H(i) H(i+1) . . . H(i+ib-1) -* - CALL ZLARFT( 'Forward', 'Columnwise', NQ-I+1, IB, A( I, I ), - $ LDA, TAU( I ), WORK( IWT ), LDT ) - IF( LEFT ) THEN -* -* H or H**H is applied to C(i:m,1:n) -* - MI = M - I + 1 - IC = I - ELSE -* -* H or H**H is applied to C(1:m,i:n) -* - NI = N - I + 1 - JC = I - END IF -* -* Apply H or H**H -* - CALL ZLARFB( SIDE, TRANS, 'Forward', 'Columnwise', MI, NI, - $ IB, A( I, I ), LDA, WORK( IWT ), LDT, - $ C( IC, JC ), LDC, WORK, LDWORK ) - 10 CONTINUE - END IF - WORK( 1 ) = LWKOPT - RETURN -* -* End of ZUNMQR -* - END diff --git a/lib/linalg/fortran/zunmtr.f b/lib/linalg/fortran/zunmtr.f deleted file mode 100644 index 441a7c2bcc..0000000000 --- a/lib/linalg/fortran/zunmtr.f +++ /dev/null @@ -1,307 +0,0 @@ -*> \brief \b ZUNMTR -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZUNMTR + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZUNMTR( SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, -* WORK, LWORK, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER SIDE, TRANS, UPLO -* INTEGER INFO, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. -* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZUNMTR overwrites the general complex M-by-N matrix C with -*> -*> SIDE = 'L' SIDE = 'R' -*> TRANS = 'N': Q * C C * Q -*> TRANS = 'C': Q**H * C C * Q**H -*> -*> where Q is a complex unitary matrix of order nq, with nq = m if -*> SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of -*> nq-1 elementary reflectors, as returned by ZHETRD: -*> -*> if UPLO = 'U', Q = H(nq-1) . . . H(2) H(1); -*> -*> if UPLO = 'L', Q = H(1) H(2) . . . H(nq-1). -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] SIDE -*> \verbatim -*> SIDE is CHARACTER*1 -*> = 'L': apply Q or Q**H from the Left; -*> = 'R': apply Q or Q**H from the Right. -*> \endverbatim -*> -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A contains elementary reflectors -*> from ZHETRD; -*> = 'L': Lower triangle of A contains elementary reflectors -*> from ZHETRD. -*> \endverbatim -*> -*> \param[in] TRANS -*> \verbatim -*> TRANS is CHARACTER*1 -*> = 'N': No transpose, apply Q; -*> = 'C': Conjugate transpose, apply Q**H. -*> \endverbatim -*> -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix C. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix C. N >= 0. -*> \endverbatim -*> -*> \param[in] A -*> \verbatim -*> A is COMPLEX*16 array, dimension -*> (LDA,M) if SIDE = 'L' -*> (LDA,N) if SIDE = 'R' -*> The vectors which define the elementary reflectors, as -*> returned by ZHETRD. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. -*> LDA >= max(1,M) if SIDE = 'L'; LDA >= max(1,N) if SIDE = 'R'. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension -*> (M-1) if SIDE = 'L' -*> (N-1) if SIDE = 'R' -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i), as returned by ZHETRD. -*> \endverbatim -*> -*> \param[in,out] C -*> \verbatim -*> C is COMPLEX*16 array, dimension (LDC,N) -*> On entry, the M-by-N matrix C. -*> On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. -*> \endverbatim -*> -*> \param[in] LDC -*> \verbatim -*> LDC is INTEGER -*> The leading dimension of the array C. LDC >= max(1,M). -*> \endverbatim -*> -*> \param[out] WORK -*> \verbatim -*> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) -*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. -*> \endverbatim -*> -*> \param[in] LWORK -*> \verbatim -*> LWORK is INTEGER -*> The dimension of the array WORK. -*> If SIDE = 'L', LWORK >= max(1,N); -*> if SIDE = 'R', LWORK >= max(1,M). -*> For optimum performance LWORK >= N*NB if SIDE = 'L', and -*> LWORK >=M*NB if SIDE = 'R', where NB is the optimal -*> blocksize. -*> -*> If LWORK = -1, then a workspace query is assumed; the routine -*> only calculates the optimal size of the WORK array, returns -*> this value as the first entry of the WORK array, and no error -*> message related to LWORK is issued by XERBLA. -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERcomputational -* -* ===================================================================== - SUBROUTINE ZUNMTR( SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, - $ WORK, LWORK, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER SIDE, TRANS, UPLO - INTEGER INFO, LDA, LDC, LWORK, M, N -* .. -* .. Array Arguments .. - COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) -* .. -* -* ===================================================================== -* -* .. Local Scalars .. - LOGICAL LEFT, LQUERY, UPPER - INTEGER I1, I2, IINFO, LWKOPT, MI, NB, NI, NQ, NW -* .. -* .. External Functions .. - LOGICAL LSAME - INTEGER ILAENV - EXTERNAL LSAME, ILAENV -* .. -* .. External Subroutines .. - EXTERNAL XERBLA, ZUNMQL, ZUNMQR -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX -* .. -* .. Executable Statements .. -* -* Test the input arguments -* - INFO = 0 - LEFT = LSAME( SIDE, 'L' ) - UPPER = LSAME( UPLO, 'U' ) - LQUERY = ( LWORK.EQ.-1 ) -* -* NQ is the order of Q and NW is the minimum dimension of WORK -* - IF( LEFT ) THEN - NQ = M - NW = MAX( 1, N ) - ELSE - NQ = N - NW = MAX( 1, M ) - END IF - IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN - INFO = -1 - ELSE IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -2 - ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.LSAME( TRANS, 'C' ) ) - $ THEN - INFO = -3 - ELSE IF( M.LT.0 ) THEN - INFO = -4 - ELSE IF( N.LT.0 ) THEN - INFO = -5 - ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN - INFO = -7 - ELSE IF( LDC.LT.MAX( 1, M ) ) THEN - INFO = -10 - ELSE IF( LWORK.LT.NW .AND. .NOT.LQUERY ) THEN - INFO = -12 - END IF -* - IF( INFO.EQ.0 ) THEN - IF( UPPER ) THEN - IF( LEFT ) THEN - NB = ILAENV( 1, 'ZUNMQL', SIDE // TRANS, M-1, N, M-1, - $ -1 ) - ELSE - NB = ILAENV( 1, 'ZUNMQL', SIDE // TRANS, M, N-1, N-1, - $ -1 ) - END IF - ELSE - IF( LEFT ) THEN - NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M-1, N, M-1, - $ -1 ) - ELSE - NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M, N-1, N-1, - $ -1 ) - END IF - END IF - LWKOPT = NW*NB - WORK( 1 ) = LWKOPT - END IF -* - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'ZUNMTR', -INFO ) - RETURN - ELSE IF( LQUERY ) THEN - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 .OR. NQ.EQ.1 ) THEN - WORK( 1 ) = 1 - RETURN - END IF -* - IF( LEFT ) THEN - MI = M - 1 - NI = N - ELSE - MI = M - NI = N - 1 - END IF -* - IF( UPPER ) THEN -* -* Q was determined by a call to ZHETRD with UPLO = 'U' -* - CALL ZUNMQL( SIDE, TRANS, MI, NI, NQ-1, A( 1, 2 ), LDA, TAU, C, - $ LDC, WORK, LWORK, IINFO ) - ELSE -* -* Q was determined by a call to ZHETRD with UPLO = 'L' -* - IF( LEFT ) THEN - I1 = 2 - I2 = 1 - ELSE - I1 = 1 - I2 = 2 - END IF - CALL ZUNMQR( SIDE, TRANS, MI, NI, NQ-1, A( 2, 1 ), LDA, TAU, - $ C( I1, I2 ), LDC, WORK, LWORK, IINFO ) - END IF - WORK( 1 ) = LWKOPT - RETURN -* -* End of ZUNMTR -* - END diff --git a/lib/linalg/s_lmp_cmp.cpp b/lib/linalg/s_lmp_cmp.cpp index 73b011a799..51c47167e4 100644 --- a/lib/linalg/s_lmp_cmp.cpp +++ b/lib/linalg/s_lmp_cmp.cpp @@ -7,7 +7,7 @@ extern "C" { integer s_lmp_cmp(char *a0, char *b0, ftnlen la, ftnlen lb) { - register unsigned char *a, *aend, *b, *bend; + unsigned char *a, *aend, *b, *bend; a = (unsigned char *)a0; b = (unsigned char *)b0; aend = a + la; diff --git a/lib/linalg/s_lmp_copy.cpp b/lib/linalg/s_lmp_copy.cpp index 9b432e08ca..5e09459b1b 100644 --- a/lib/linalg/s_lmp_copy.cpp +++ b/lib/linalg/s_lmp_copy.cpp @@ -5,9 +5,9 @@ extern "C" { /* assign strings: a = b */ -void s_lmp_copy(register char *a, register char *b, ftnlen la, ftnlen lb) +void s_lmp_copy(char *a, char *b, ftnlen la, ftnlen lb) { - register char *aend, *bend; + char *aend, *bend; aend = a + la; diff --git a/lib/linalg/static/.clang-format b/lib/linalg/static/.clang-format deleted file mode 100644 index 8856e00947..0000000000 --- a/lib/linalg/static/.clang-format +++ /dev/null @@ -1,23 +0,0 @@ ---- -Language: Cpp -BasedOnStyle: LLVM -AccessModifierOffset: -4 -AlignConsecutiveAssignments: false -AlignEscapedNewlines: Left -AllowShortFunctionsOnASingleLine: Inline -AllowShortLambdasOnASingleLine: None -AllowShortIfStatementsOnASingleLine: WithoutElse -BraceWrapping: - AfterFunction: true -BreakBeforeBraces: Custom -BreakInheritanceList: AfterColon -BreakConstructorInitializers: AfterColon -ColumnLimit: 100 -IndentCaseLabels: true -IndentWidth: 4 -ObjCBlockIndentWidth: 4 -PenaltyBreakAssignment: 4 -Standard: Cpp11 -TabWidth: 4 -UseTab: Never -... diff --git a/lib/linalg/static/README b/lib/linalg/static/README deleted file mode 100644 index 2d0271db7c..0000000000 --- a/lib/linalg/static/README +++ /dev/null @@ -1,8 +0,0 @@ -The C++ files in this folder are either direct C++ implementations of -their Fortran equivalents using the C++ runtime, or they are adapted -copies of functions from the libf2c runtime. The runtime functions -needed to be renamed to avoid conflics with libgfortran which uses -some of the same function names. - -The Fortran files in this folder are modified from their -original versions, so that f2c can correctly translate them. diff --git a/lib/linalg/static/d_lmp_cnjg.cpp b/lib/linalg/static/d_lmp_cnjg.cpp deleted file mode 100644 index 03ca8f98fd..0000000000 --- a/lib/linalg/static/d_lmp_cnjg.cpp +++ /dev/null @@ -1,13 +0,0 @@ - -#include "lmp_f2c.h" - -extern "C" { - -void d_lmp_cnjg(doublecomplex *r, doublecomplex *z) -{ - doublereal zi = z->i; - - r->r = z->r; - r->i = -zi; -} -} diff --git a/lib/linalg/static/d_lmp_imag.cpp b/lib/linalg/static/d_lmp_imag.cpp deleted file mode 100644 index f0443f7828..0000000000 --- a/lib/linalg/static/d_lmp_imag.cpp +++ /dev/null @@ -1,10 +0,0 @@ - -#include "lmp_f2c.h" - -extern "C" { - -double d_lmp_imag(doublecomplex *z) -{ - return (z->i); -} -} diff --git a/lib/linalg/static/d_lmp_lg10.cpp b/lib/linalg/static/d_lmp_lg10.cpp deleted file mode 100644 index ec48c99839..0000000000 --- a/lib/linalg/static/d_lmp_lg10.cpp +++ /dev/null @@ -1,14 +0,0 @@ - -#include "lmp_f2c.h" -#undef abs - -static constexpr double log10e = 0.43429448190325182765; - -#include - -extern "C" { -double d_lmp_lg10(doublereal *x) -{ - return (log10e * log(*x)); -} -} diff --git a/lib/linalg/static/d_lmp_sign.cpp b/lib/linalg/static/d_lmp_sign.cpp deleted file mode 100644 index fb0a1e79ff..0000000000 --- a/lib/linalg/static/d_lmp_sign.cpp +++ /dev/null @@ -1,12 +0,0 @@ - -#include "lmp_f2c.h" - -extern "C" { - -double d_lmp_sign(doublereal *a, doublereal *b) -{ - double x; - x = (*a >= 0 ? *a : -*a); - return (*b >= 0 ? x : -x); -} -} diff --git a/lib/linalg/static/dgetrf2.f b/lib/linalg/static/dgetrf2.f deleted file mode 100644 index e3d2aac299..0000000000 --- a/lib/linalg/static/dgetrf2.f +++ /dev/null @@ -1,269 +0,0 @@ -*> \brief \b DGETRF2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* RECURSIVE SUBROUTINE DGETRF2( M, N, A, LDA, IPIV, INFO ) -* -* .. Scalar Arguments .. -* INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. -* INTEGER IPIV( * ) -* DOUBLE PRECISION A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DGETRF2 computes an LU factorization of a general M-by-N matrix A -*> using partial pivoting with row interchanges. -*> -*> The factorization has the form -*> A = P * L * U -*> where P is a permutation matrix, L is lower triangular with unit -*> diagonal elements (lower trapezoidal if m > n), and U is upper -*> triangular (upper trapezoidal if m < n). -*> -*> This is the recursive version of the algorithm. It divides -*> the matrix into four submatrices: -*> -*> [ A11 | A12 ] where A11 is n1 by n1 and A22 is n2 by n2 -*> A = [ -----|----- ] with n1 = min(m,n)/2 -*> [ A21 | A22 ] n2 = n-n1 -*> -*> [ A11 ] -*> The subroutine calls itself to factor [ --- ], -*> [ A12 ] -*> [ A12 ] -*> do the swaps on [ --- ], solve A12, update A22, -*> [ A22 ] -*> -*> then calls itself to factor A22 and do the swaps on A21. -*> -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] M -*> \verbatim -*> M is INTEGER -*> The number of rows of the matrix A. M >= 0. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The number of columns of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the M-by-N matrix to be factored. -*> On exit, the factors L and U from the factorization -*> A = P*L*U; the unit diagonal elements of L are not stored. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,M). -*> \endverbatim -*> -*> \param[out] IPIV -*> \verbatim -*> IPIV is INTEGER array, dimension (min(M,N)) -*> The pivot indices; for 1 <= i <= min(M,N), row i of the -*> matrix was interchanged with row IPIV(i). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, U(i,i) is exactly zero. The factorization -*> has been completed, but the factor U is exactly -*> singular, and division by zero will occur if it is used -*> to solve a system of equations. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleGEcomputational -* -* ===================================================================== - SUBROUTINE DGETRF2( M, N, A, LDA, IPIV, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - INTEGER INFO, LDA, M, N -* .. -* .. Array Arguments .. - INTEGER IPIV( * ) - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - DOUBLE PRECISION SFMIN, TEMP - INTEGER I, IINFO, N1, N2 -* .. -* .. External Functions .. - DOUBLE PRECISION DLAMCH - INTEGER IDAMAX - EXTERNAL DLAMCH, IDAMAX -* .. -* .. External Subroutines .. - EXTERNAL DGEMM, DSCAL, DLASWP, DTRSM, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, MIN -* .. -* .. Executable Statements .. -* -* Test the input parameters -* - INFO = 0 - IF( M.LT.0 ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -4 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DGETRF2', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( M.EQ.0 .OR. N.EQ.0 ) - $ RETURN - - IF ( M.EQ.1 ) THEN -* -* Use unblocked code for one row case -* Just need to handle IPIV and INFO -* - IPIV( 1 ) = 1 - IF ( A(1,1).EQ.ZERO ) - $ INFO = 1 -* - ELSE IF( N.EQ.1 ) THEN -* -* Use unblocked code for one column case -* -* -* Compute machine safe minimum -* - SFMIN = DLAMCH('S') -* -* Find pivot and test for singularity -* - I = IDAMAX( M, A( 1, 1 ), 1 ) - IPIV( 1 ) = I - IF( A( I, 1 ).NE.ZERO ) THEN -* -* Apply the interchange -* - IF( I.NE.1 ) THEN - TEMP = A( 1, 1 ) - A( 1, 1 ) = A( I, 1 ) - A( I, 1 ) = TEMP - END IF -* -* Compute elements 2:M of the column -* - IF( ABS(A( 1, 1 )) .GE. SFMIN ) THEN - CALL DSCAL( M-1, ONE / A( 1, 1 ), A( 2, 1 ), 1 ) - ELSE - DO 10 I = 1, M-1 - A( 1+I, 1 ) = A( 1+I, 1 ) / A( 1, 1 ) - 10 CONTINUE - END IF -* - ELSE - INFO = 1 - END IF -* - ELSE -* -* Use recursive code -* - N1 = MIN( M, N ) / 2 - N2 = N-N1 -* -* [ A11 ] -* Factor [ --- ] -* [ A21 ] -* - CALL DGETRF2( M, N1, A, LDA, IPIV, IINFO ) - - IF ( INFO.EQ.0 .AND. IINFO.GT.0 ) - $ INFO = IINFO -* -* [ A12 ] -* Apply interchanges to [ --- ] -* [ A22 ] -* - CALL DLASWP( N2, A( 1, N1+1 ), LDA, 1, N1, IPIV, 1 ) -* -* Solve A12 -* - CALL DTRSM( 'L', 'L', 'N', 'U', N1, N2, ONE, A, LDA, - $ A( 1, N1+1 ), LDA ) -* -* Update A22 -* - CALL DGEMM( 'N', 'N', M-N1, N2, N1, -ONE, A( N1+1, 1 ), LDA, - $ A( 1, N1+1 ), LDA, ONE, A( N1+1, N1+1 ), LDA ) -* -* Factor A22 -* - CALL DGETRF2( M-N1, N2, A( N1+1, N1+1 ), LDA, IPIV( N1+1 ), - $ IINFO ) -* -* Adjust INFO and the pivot indices -* - IF ( INFO.EQ.0 .AND. IINFO.GT.0 ) - $ INFO = IINFO + N1 - DO 20 I = N1+1, MIN( M, N ) - IPIV( I ) = IPIV( I ) + N1 - 20 CONTINUE -* -* Apply interchanges to A21 -* - CALL DLASWP( N1, A( 1, 1 ), LDA, N1+1, MIN( M, N), IPIV, 1 ) -* - END IF - RETURN -* -* End of DGETRF2 -* - END diff --git a/lib/linalg/static/disnan.cpp b/lib/linalg/static/disnan.cpp deleted file mode 100644 index dcdaad77e1..0000000000 --- a/lib/linalg/static/disnan.cpp +++ /dev/null @@ -1,14 +0,0 @@ - -#include - -extern "C" { - -#include "lmp_f2c.h" - -logical disnan_(const doublereal *din) -{ - if (!din) return TRUE_; - - return std::isnan(*din) ? TRUE_ : FALSE_; -} -} diff --git a/lib/linalg/static/dlamc3.f b/lib/linalg/static/dlamc3.f deleted file mode 100644 index 1108297707..0000000000 --- a/lib/linalg/static/dlamc3.f +++ /dev/null @@ -1,45 +0,0 @@ -*> \brief \b DLAMC3 -*> \details -*> \b Purpose: -*> \verbatim -*> DLAMC3 is intended to force A and B to be stored prior to doing -*> the addition of A and B , for use in situations where optimizers -*> might hold one of these in a register. -*> \endverbatim -*> \author LAPACK is a software package provided by Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd.. -*> \date December 2016 -*> \ingroup auxOTHERauxiliary -*> -*> \param[in] A -*> \verbatim -*> A is a DOUBLE PRECISION -*> \endverbatim -*> -*> \param[in] B -*> \verbatim -*> B is a DOUBLE PRECISION -*> The values A and B. -*> \endverbatim -*> - DOUBLE PRECISION FUNCTION DLAMC3( A, B ) -* -* -- LAPACK auxiliary routine (version 3.7.0) -- -* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. -* November 2010 -* -* .. Scalar Arguments .. - DOUBLE PRECISION A, B -* .. -* ===================================================================== -* -* .. Executable Statements .. -* - DLAMC3 = A + B -* - RETURN -* -* End of DLAMC3 -* - END -* -************************************************************************ diff --git a/lib/linalg/static/dlamch.cpp b/lib/linalg/static/dlamch.cpp deleted file mode 100644 index 277096e6f3..0000000000 --- a/lib/linalg/static/dlamch.cpp +++ /dev/null @@ -1,45 +0,0 @@ - -#include -#include - -extern "C" { - -#include "lmp_f2c.h" - -// undefine conflicting f2c macros -#undef min -#undef max - -doublereal dlamch_(const char *cmach) -{ - if (!cmach) return 0.0; - char select = toupper(*cmach); - - // BLAS assumes rounding not truncation => epsilon is half - const double eps = 0.5 * std::numeric_limits::epsilon(); - if (select == 'E') return eps; - - double min = std::numeric_limits::min(); - const double max = std::numeric_limits::max(); - double small = 1.0 / max; - if (small >= min) min = small * (1.0 + eps); - if (select == 'S') return min; - - const double radix = std::numeric_limits::radix; - if (select == 'B') return radix; - - if (select == 'P') return eps * radix; - - if (select == 'N') return std::numeric_limits::digits; - - if (select == 'M') return std::numeric_limits::min_exponent; - - if (select == 'U') return min; - - if (select == 'L') return std::numeric_limits::max_exponent; - - if (select == 'O') return max; - - return 0.0; -} -} diff --git a/lib/linalg/static/dlarft.f b/lib/linalg/static/dlarft.f deleted file mode 100644 index e92c927971..0000000000 --- a/lib/linalg/static/dlarft.f +++ /dev/null @@ -1,327 +0,0 @@ -*> \brief \b DLARFT forms the triangular factor T of a block reflector H = I - vtvH -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download DLARFT + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, STOREV -* INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. -* DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DLARFT forms the triangular factor T of a real block reflector H -*> of order n, which is defined as a product of k elementary reflectors. -*> -*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; -*> -*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. -*> -*> If STOREV = 'C', the vector which defines the elementary reflector -*> H(i) is stored in the i-th column of the array V, and -*> -*> H = I - V * T * V**T -*> -*> If STOREV = 'R', the vector which defines the elementary reflector -*> H(i) is stored in the i-th row of the array V, and -*> -*> H = I - V**T * T * V -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies the order in which the elementary reflectors are -*> multiplied to form the block reflector: -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Specifies how the vectors which define the elementary -*> reflectors are stored (see also Further Details): -*> = 'C': columnwise -*> = 'R': rowwise -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the block reflector H. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the triangular factor T (= the number of -*> elementary reflectors). K >= 1. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is DOUBLE PRECISION array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,N) if STOREV = 'R' -*> The matrix V. See further details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is DOUBLE PRECISION array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i). -*> \endverbatim -*> -*> \param[out] T -*> \verbatim -*> T is DOUBLE PRECISION array, dimension (LDT,K) -*> The k by k triangular factor T of the block reflector. -*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is -*> lower triangular. The rest of the array is not used. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doubleOTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE DLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER DIRECT, STOREV - INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - INTEGER I, J, PREVLASTV, LASTV -* .. -* .. External Subroutines .. - EXTERNAL DGEMV, DTRMV -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( LSAME( DIRECT, 'F' ) ) THEN - PREVLASTV = N - DO I = 1, K - PREVLASTV = MAX( I, PREVLASTV ) - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = 1, I - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( LASTV, I ).NE.ZERO ) GOTO 219 - END DO - 219 CONTINUE - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( I , J ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**T * V(i:j,i) -* - CALL DGEMV( 'Transpose', J-I, I-1, -TAU( I ), - $ V( I+1, 1 ), LDV, V( I+1, I ), 1, ONE, - $ T( 1, I ), 1 ) - ELSE -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( I, LASTV ).NE.ZERO ) GOTO 235 - END DO - 235 CONTINUE - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( J , I ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**T -* - CALL DGEMV( 'No transpose', I-1, J-I, -TAU( I ), - $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, ONE, - $ T( 1, I ), 1 ) - END IF -* -* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) -* - CALL DTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, - $ LDT, T( 1, I ), 1 ) - T( I, I ) = TAU( I ) - IF( I.GT.1 ) THEN - PREVLASTV = MAX( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - END DO - ELSE - PREVLASTV = 1 - DO I = K, 1, -1 - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = I, K - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( I.LT.K ) THEN - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( LASTV, I ).NE.ZERO ) GOTO 280 - END DO - 280 CONTINUE - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( N-K+I , J ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**T * V(j:n-k+i,i) -* - CALL DGEMV( 'Transpose', N-K+I-J, K-I, -TAU( I ), - $ V( J, I+1 ), LDV, V( J, I ), 1, ONE, - $ T( I+1, I ), 1 ) - ELSE -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( I, LASTV ).NE.ZERO ) GOTO 296 - END DO - 296 CONTINUE - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( J, N-K+I ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**T -* - CALL DGEMV( 'No transpose', K-I, N-K+I-J, - $ -TAU( I ), V( I+1, J ), LDV, V( I, J ), LDV, - $ ONE, T( I+1, I ), 1 ) - END IF -* -* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) -* - CALL DTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, - $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) - IF( I.GT.1 ) THEN - PREVLASTV = MIN( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - T( I, I ) = TAU( I ) - END IF - END DO - END IF - RETURN -* -* End of DLARFT -* - END diff --git a/lib/linalg/static/dpotrf2.f b/lib/linalg/static/dpotrf2.f deleted file mode 100644 index ba827635a8..0000000000 --- a/lib/linalg/static/dpotrf2.f +++ /dev/null @@ -1,234 +0,0 @@ -*> \brief \b DPOTRF2 -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -* Definition: -* =========== -* -* RECURSIVE SUBROUTINE DPOTRF2( UPLO, N, A, LDA, INFO ) -* -* .. Scalar Arguments .. -* CHARACTER UPLO -* INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. -* REAL A( LDA, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> DPOTRF2 computes the Cholesky factorization of a real symmetric -*> positive definite matrix A using the recursive algorithm. -*> -*> The factorization has the form -*> A = U**T * U, if UPLO = 'U', or -*> A = L * L**T, if UPLO = 'L', -*> where U is an upper triangular matrix and L is lower triangular. -*> -*> This is the recursive version of the algorithm. It divides -*> the matrix into four submatrices: -*> -*> [ A11 | A12 ] where A11 is n1 by n1 and A22 is n2 by n2 -*> A = [ -----|----- ] with n1 = n/2 -*> [ A21 | A22 ] n2 = n-n1 -*> -*> The subroutine calls itself to factor A11. Update and scale A21 -*> or A12, update A22 then calls itself to factor A22. -*> -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] UPLO -*> \verbatim -*> UPLO is CHARACTER*1 -*> = 'U': Upper triangle of A is stored; -*> = 'L': Lower triangle of A is stored. -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the matrix A. N >= 0. -*> \endverbatim -*> -*> \param[in,out] A -*> \verbatim -*> A is DOUBLE PRECISION array, dimension (LDA,N) -*> On entry, the symmetric matrix A. If UPLO = 'U', the leading -*> N-by-N upper triangular part of A contains the upper -*> triangular part of the matrix A, and the strictly lower -*> triangular part of A is not referenced. If UPLO = 'L', the -*> leading N-by-N lower triangular part of A contains the lower -*> triangular part of the matrix A, and the strictly upper -*> triangular part of A is not referenced. -*> -*> On exit, if INFO = 0, the factor U or L from the Cholesky -*> factorization A = U**T*U or A = L*L**T. -*> \endverbatim -*> -*> \param[in] LDA -*> \verbatim -*> LDA is INTEGER -*> The leading dimension of the array A. LDA >= max(1,N). -*> \endverbatim -*> -*> \param[out] INFO -*> \verbatim -*> INFO is INTEGER -*> = 0: successful exit -*> < 0: if INFO = -i, the i-th argument had an illegal value -*> > 0: if INFO = i, the leading minor of order i is not -*> positive definite, and the factorization could not be -*> completed. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup doublePOcomputational -* -* ===================================================================== - SUBROUTINE DPOTRF2( UPLO, N, A, LDA, INFO ) -* -* -- LAPACK computational routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER UPLO - INTEGER INFO, LDA, N -* .. -* .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - DOUBLE PRECISION ONE, ZERO - PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) -* .. -* .. Local Scalars .. - LOGICAL UPPER - INTEGER N1, N2, IINFO -* .. -* .. External Functions .. - LOGICAL LSAME, DISNAN - EXTERNAL LSAME, DISNAN -* .. -* .. External Subroutines .. - EXTERNAL DSYRK, DTRSM, XERBLA -* .. -* .. Intrinsic Functions .. - INTRINSIC MAX, SQRT -* .. -* .. Executable Statements .. -* -* Test the input parameters -* - INFO = 0 - UPPER = LSAME( UPLO, 'U' ) - IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN - INFO = -1 - ELSE IF( N.LT.0 ) THEN - INFO = -2 - ELSE IF( LDA.LT.MAX( 1, N ) ) THEN - INFO = -4 - END IF - IF( INFO.NE.0 ) THEN - CALL XERBLA( 'DPOTRF2', -INFO ) - RETURN - END IF -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* -* N=1 case -* - IF( N.EQ.1 ) THEN -* -* Test for non-positive-definiteness -* - IF( A( 1, 1 ).LE.ZERO.OR.DISNAN( A( 1, 1 ) ) ) THEN - INFO = 1 - RETURN - END IF -* -* Factor -* - A( 1, 1 ) = SQRT( A( 1, 1 ) ) -* -* Use recursive code -* - ELSE - N1 = N/2 - N2 = N-N1 -* -* Factor A11 -* - CALL DPOTRF2( UPLO, N1, A( 1, 1 ), LDA, IINFO ) - IF ( IINFO.NE.0 ) THEN - INFO = IINFO - RETURN - END IF -* -* Compute the Cholesky factorization A = U**T*U -* - IF( UPPER ) THEN -* -* Update and scale A12 -* - CALL DTRSM( 'L', 'U', 'T', 'N', N1, N2, ONE, - $ A( 1, 1 ), LDA, A( 1, N1+1 ), LDA ) -* -* Update and factor A22 -* - CALL DSYRK( UPLO, 'T', N2, N1, -ONE, A( 1, N1+1 ), LDA, - $ ONE, A( N1+1, N1+1 ), LDA ) - CALL DPOTRF2( UPLO, N2, A( N1+1, N1+1 ), LDA, IINFO ) - IF ( IINFO.NE.0 ) THEN - INFO = IINFO + N1 - RETURN - END IF -* -* Compute the Cholesky factorization A = L*L**T -* - ELSE -* -* Update and scale A21 -* - CALL DTRSM( 'R', 'L', 'T', 'N', N2, N1, ONE, - $ A( 1, 1 ), LDA, A( N1+1, 1 ), LDA ) -* -* Update and factor A22 -* - CALL DSYRK( UPLO, 'N', N2, N1, -ONE, A( N1+1, 1 ), LDA, - $ ONE, A( N1+1, N1+1 ), LDA ) - CALL DPOTRF2( UPLO, N2, A( N1+1, N1+1 ), LDA, IINFO ) - IF ( IINFO.NE.0 ) THEN - INFO = IINFO + N1 - RETURN - END IF - END IF - END IF - RETURN -* -* End of DPOTRF2 -* - END diff --git a/lib/linalg/static/i_lmp_dnnt.cpp b/lib/linalg/static/i_lmp_dnnt.cpp deleted file mode 100644 index 8050697bb9..0000000000 --- a/lib/linalg/static/i_lmp_dnnt.cpp +++ /dev/null @@ -1,12 +0,0 @@ - -#include "lmp_f2c.h" - -#undef abs -#include - -extern "C" { -integer i_lmp_dnnt(doublereal *x) -{ - return (integer)(*x >= 0. ? floor(*x + .5) : -floor(.5 - *x)); -} -} diff --git a/lib/linalg/static/i_lmp_len.cpp b/lib/linalg/static/i_lmp_len.cpp deleted file mode 100644 index b6101b29ad..0000000000 --- a/lib/linalg/static/i_lmp_len.cpp +++ /dev/null @@ -1,10 +0,0 @@ - -#include "lmp_f2c.h" - -extern "C" { - -integer i_lmp_len(char *s, ftnlen n) -{ - return (n); -} -} diff --git a/lib/linalg/static/i_lmp_nint.cpp b/lib/linalg/static/i_lmp_nint.cpp deleted file mode 100644 index f41ca6b3eb..0000000000 --- a/lib/linalg/static/i_lmp_nint.cpp +++ /dev/null @@ -1,13 +0,0 @@ - -#include "lmp_f2c.h" -#undef abs - -#include - -extern "C" { - -integer i_lmp_nint(real *x) -{ - return (integer)(*x >= 0 ? floor(*x + .5) : -floor(.5 - *x)); -} -} diff --git a/lib/linalg/static/lsame.cpp b/lib/linalg/static/lsame.cpp deleted file mode 100644 index 480ae93bc9..0000000000 --- a/lib/linalg/static/lsame.cpp +++ /dev/null @@ -1,17 +0,0 @@ - -#include - -extern "C" { - -#include "lmp_f2c.h" - -logical lsame_(const char *a, const char *b) -{ - char ua, ub; - if (!a || !b) return FALSE_; - - ua = toupper(*a); - ub = toupper(*b); - return (ua == ub) ? TRUE_ : FALSE_; -} -} diff --git a/lib/linalg/static/pow_lmp_dd.cpp b/lib/linalg/static/pow_lmp_dd.cpp deleted file mode 100644 index 4963b04bbc..0000000000 --- a/lib/linalg/static/pow_lmp_dd.cpp +++ /dev/null @@ -1,12 +0,0 @@ - -#include "lmp_f2c.h" -#undef abs - -#include - -extern "C" { -double pow_lmp_dd(doublereal *ap, doublereal *bp) -{ - return (pow(*ap, *bp)); -} -} diff --git a/lib/linalg/static/pow_lmp_di.cpp b/lib/linalg/static/pow_lmp_di.cpp deleted file mode 100644 index 83a0da1a87..0000000000 --- a/lib/linalg/static/pow_lmp_di.cpp +++ /dev/null @@ -1,31 +0,0 @@ - -#include "lmp_f2c.h" - -extern "C" { - -double pow_lmp_di(doublereal *ap, integer *bp) -{ - double pow, x; - integer n; - unsigned long u; - - pow = 1; - x = *ap; - n = *bp; - - if (n != 0) { - if (n < 0) { - n = -n; - x = 1 / x; - } - for (u = n;;) { - if (u & 01) pow *= x; - if (u >>= 1) - x *= x; - else - break; - } - } - return (pow); -} -} diff --git a/lib/linalg/static/pow_lmp_ii.cpp b/lib/linalg/static/pow_lmp_ii.cpp deleted file mode 100644 index ff28c8fd5a..0000000000 --- a/lib/linalg/static/pow_lmp_ii.cpp +++ /dev/null @@ -1,29 +0,0 @@ - -#include "lmp_f2c.h" - -extern "C" { - -integer pow_lmp_ii(integer *ap, integer *bp) -{ - integer pow, x, n; - unsigned long u; - - x = *ap; - n = *bp; - - if (n <= 0) { - if (n == 0 || x == 1) return 1; - if (x != -1) return x == 0 ? 1 / x : 0; - n = -n; - } - u = n; - for (pow = 1;;) { - if (u & 01) pow *= x; - if (u >>= 1) - x *= x; - else - break; - } - return (pow); -} -} diff --git a/lib/linalg/static/s_lmp_cat.cpp b/lib/linalg/static/s_lmp_cat.cpp deleted file mode 100644 index 323b0b671d..0000000000 --- a/lib/linalg/static/s_lmp_cat.cpp +++ /dev/null @@ -1,23 +0,0 @@ - -#include "lmp_f2c.h" - -// concatenate two strings - -extern "C" { -void s_lmp_cat(char *lp, char *rpp[], ftnint rnp[], ftnint *np, ftnlen ll) -{ - ftnlen i, nc; - char *rp; - ftnlen n = *np; - for (i = 0; i < n; ++i) { - nc = ll; - if (rnp[i] < nc) nc = rnp[i]; - ll -= nc; - rp = rpp[i]; - while (--nc >= 0) - *lp++ = *rp++; - } - while (--ll >= 0) - *lp++ = ' '; -} -} diff --git a/lib/linalg/static/s_lmp_cmp.cpp b/lib/linalg/static/s_lmp_cmp.cpp deleted file mode 100644 index 73b011a799..0000000000 --- a/lib/linalg/static/s_lmp_cmp.cpp +++ /dev/null @@ -1,45 +0,0 @@ - -#include "lmp_f2c.h" - -extern "C" { - -// compare two strings - -integer s_lmp_cmp(char *a0, char *b0, ftnlen la, ftnlen lb) -{ - register unsigned char *a, *aend, *b, *bend; - a = (unsigned char *)a0; - b = (unsigned char *)b0; - aend = a + la; - bend = b + lb; - - if (la <= lb) { - while (a < aend) - if (*a != *b) - return (*a - *b); - else { - ++a; - ++b; - } - - while (b < bend) - if (*b != ' ') - return (' ' - *b); - else - ++b; - } else { - while (b < bend) - if (*a == *b) { - ++a; - ++b; - } else - return (*a - *b); - while (a < aend) - if (*a != ' ') - return (*a - ' '); - else - ++a; - } - return (0); -} -} diff --git a/lib/linalg/static/s_lmp_copy.cpp b/lib/linalg/static/s_lmp_copy.cpp deleted file mode 100644 index 9b432e08ca..0000000000 --- a/lib/linalg/static/s_lmp_copy.cpp +++ /dev/null @@ -1,26 +0,0 @@ - -#include "lmp_f2c.h" - -extern "C" { - -/* assign strings: a = b */ - -void s_lmp_copy(register char *a, register char *b, ftnlen la, ftnlen lb) -{ - register char *aend, *bend; - - aend = a + la; - - if (la <= lb) - while (a < aend) - *a++ = *b++; - - else { - bend = b + lb; - while (b < bend) - *a++ = *b++; - while (a < aend) - *a++ = ' '; - } -} -} diff --git a/lib/linalg/static/xerbla.cpp b/lib/linalg/static/xerbla.cpp deleted file mode 100644 index 6346126c67..0000000000 --- a/lib/linalg/static/xerbla.cpp +++ /dev/null @@ -1,31 +0,0 @@ - -#include "lmp_f2c.h" - -#undef abs -#include -#include -#include - -extern "C" { - -static constexpr int BUFSZ = 1024; - -integer xerbla_(const char *srname, integer *info) -{ - char buf[BUFSZ]; - buf[0] = '\0'; - - strcat(buf, " ** On entry to "); - for (int i = 0; i < BUFSZ - 16; ++i) { - if ((srname[i] == '\0') || (srname[i] == ' ')) { - buf[i + 16] = '\0'; - break; - } - buf[i + 16] = srname[i]; - } - int len = strlen(buf); - snprintf(buf + len, BUFSZ - len, " parameter number %d had an illegal value\n", *info); - exit(1); - return 0; -} -} diff --git a/lib/linalg/static/z_lmp_abs.cpp b/lib/linalg/static/z_lmp_abs.cpp deleted file mode 100644 index 2b79d56457..0000000000 --- a/lib/linalg/static/z_lmp_abs.cpp +++ /dev/null @@ -1,31 +0,0 @@ - -#include "lmp_f2c.h" -#undef abs - -#include - -extern "C" { - -static double f__cabs(double real, double imag) -{ - double temp; - - if (real < 0) real = -real; - if (imag < 0) imag = -imag; - if (imag > real) { - temp = real; - real = imag; - imag = temp; - } - if ((real + imag) == real) return (real); - - temp = imag / real; - temp = real * sqrt(1.0 + temp * temp); /*overflow!!*/ - return (temp); -} - -double z_lmp_abs(doublecomplex *z) -{ - return (f__cabs(z->r, z->i)); -} -} diff --git a/lib/linalg/static/z_lmp_div.cpp b/lib/linalg/static/z_lmp_div.cpp deleted file mode 100644 index 66218f8fc8..0000000000 --- a/lib/linalg/static/z_lmp_div.cpp +++ /dev/null @@ -1,31 +0,0 @@ - -#include "lmp_f2c.h" - -extern "C" { - -void z_lmp_div(doublecomplex *c, doublecomplex *a, doublecomplex *b) -{ - double ratio, den; - double abr, abi, cr; - - if ((abr = b->r) < 0.) abr = -abr; - if ((abi = b->i) < 0.) abi = -abi; - if (abr <= abi) { - if (abi == 0) { - if (a->i != 0 || a->r != 0) abi = 1.; - c->i = c->r = abi / abr; - return; - } - ratio = b->r / b->i; - den = b->i * (1 + ratio * ratio); - cr = (a->r * ratio + a->i) / den; - c->i = (a->i * ratio - a->r) / den; - } else { - ratio = b->i / b->r; - den = b->r * (1 + ratio * ratio); - cr = (a->r + a->i * ratio) / den; - c->i = (a->i - a->r * ratio) / den; - } - c->r = cr; -} -} diff --git a/lib/linalg/static/zlarft.f b/lib/linalg/static/zlarft.f deleted file mode 100644 index b59ba93213..0000000000 --- a/lib/linalg/static/zlarft.f +++ /dev/null @@ -1,328 +0,0 @@ -*> \brief \b ZLARFT forms the triangular factor T of a block reflector H = I - vtvH -* -* =========== DOCUMENTATION =========== -* -* Online html documentation available at -* http://www.netlib.org/lapack/explore-html/ -* -*> \htmlonly -*> Download ZLARFT + dependencies -*> -*> [TGZ] -*> -*> [ZIP] -*> -*> [TXT] -*> \endhtmlonly -* -* Definition: -* =========== -* -* SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* .. Scalar Arguments .. -* CHARACTER DIRECT, STOREV -* INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. -* COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* -*> \par Purpose: -* ============= -*> -*> \verbatim -*> -*> ZLARFT forms the triangular factor T of a complex block reflector H -*> of order n, which is defined as a product of k elementary reflectors. -*> -*> If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; -*> -*> If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. -*> -*> If STOREV = 'C', the vector which defines the elementary reflector -*> H(i) is stored in the i-th column of the array V, and -*> -*> H = I - V * T * V**H -*> -*> If STOREV = 'R', the vector which defines the elementary reflector -*> H(i) is stored in the i-th row of the array V, and -*> -*> H = I - V**H * T * V -*> \endverbatim -* -* Arguments: -* ========== -* -*> \param[in] DIRECT -*> \verbatim -*> DIRECT is CHARACTER*1 -*> Specifies the order in which the elementary reflectors are -*> multiplied to form the block reflector: -*> = 'F': H = H(1) H(2) . . . H(k) (Forward) -*> = 'B': H = H(k) . . . H(2) H(1) (Backward) -*> \endverbatim -*> -*> \param[in] STOREV -*> \verbatim -*> STOREV is CHARACTER*1 -*> Specifies how the vectors which define the elementary -*> reflectors are stored (see also Further Details): -*> = 'C': columnwise -*> = 'R': rowwise -*> \endverbatim -*> -*> \param[in] N -*> \verbatim -*> N is INTEGER -*> The order of the block reflector H. N >= 0. -*> \endverbatim -*> -*> \param[in] K -*> \verbatim -*> K is INTEGER -*> The order of the triangular factor T (= the number of -*> elementary reflectors). K >= 1. -*> \endverbatim -*> -*> \param[in] V -*> \verbatim -*> V is COMPLEX*16 array, dimension -*> (LDV,K) if STOREV = 'C' -*> (LDV,N) if STOREV = 'R' -*> The matrix V. See further details. -*> \endverbatim -*> -*> \param[in] LDV -*> \verbatim -*> LDV is INTEGER -*> The leading dimension of the array V. -*> If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. -*> \endverbatim -*> -*> \param[in] TAU -*> \verbatim -*> TAU is COMPLEX*16 array, dimension (K) -*> TAU(i) must contain the scalar factor of the elementary -*> reflector H(i). -*> \endverbatim -*> -*> \param[out] T -*> \verbatim -*> T is COMPLEX*16 array, dimension (LDT,K) -*> The k by k triangular factor T of the block reflector. -*> If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is -*> lower triangular. The rest of the array is not used. -*> \endverbatim -*> -*> \param[in] LDT -*> \verbatim -*> LDT is INTEGER -*> The leading dimension of the array T. LDT >= K. -*> \endverbatim -* -* Authors: -* ======== -* -*> \author Univ. of Tennessee -*> \author Univ. of California Berkeley -*> \author Univ. of Colorado Denver -*> \author NAG Ltd. -* -*> \ingroup complex16OTHERauxiliary -* -*> \par Further Details: -* ===================== -*> -*> \verbatim -*> -*> The shape of the matrix V and the storage of the vectors which define -*> the H(i) is best illustrated by the following example with n = 5 and -*> k = 3. The elements equal to 1 are not stored. -*> -*> DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': -*> -*> V = ( 1 ) V = ( 1 v1 v1 v1 v1 ) -*> ( v1 1 ) ( 1 v2 v2 v2 ) -*> ( v1 v2 1 ) ( 1 v3 v3 ) -*> ( v1 v2 v3 ) -*> ( v1 v2 v3 ) -*> -*> DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': -*> -*> V = ( v1 v2 v3 ) V = ( v1 v1 1 ) -*> ( v1 v2 v3 ) ( v2 v2 v2 1 ) -*> ( 1 v2 v3 ) ( v3 v3 v3 v3 1 ) -*> ( 1 v3 ) -*> ( 1 ) -*> \endverbatim -*> -* ===================================================================== - SUBROUTINE ZLARFT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) -* -* -- LAPACK auxiliary routine -- -* -- LAPACK is a software package provided by Univ. of Tennessee, -- -* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -* .. Scalar Arguments .. - CHARACTER DIRECT, STOREV - INTEGER K, LDT, LDV, N -* .. -* .. Array Arguments .. - COMPLEX*16 T( LDT, * ), TAU( * ), V( LDV, * ) -* .. -* -* ===================================================================== -* -* .. Parameters .. - COMPLEX*16 ONE, ZERO - PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), - $ ZERO = ( 0.0D+0, 0.0D+0 ) ) -* .. -* .. Local Scalars .. - INTEGER I, J, PREVLASTV, LASTV -* .. -* .. External Subroutines .. - EXTERNAL ZGEMV, ZTRMV, ZGEMM -* .. -* .. External Functions .. - LOGICAL LSAME - EXTERNAL LSAME -* .. -* .. Executable Statements .. -* -* Quick return if possible -* - IF( N.EQ.0 ) - $ RETURN -* - IF( LSAME( DIRECT, 'F' ) ) THEN - PREVLASTV = N - DO I = 1, K - PREVLASTV = MAX( PREVLASTV, I ) - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = 1, I - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( LASTV, I ).NE.ZERO ) GOTO 220 - END DO - 220 CONTINUE - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * CONJG( V( I , J ) ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(i:j,1:i-1)**H * V(i:j,i) -* - CALL ZGEMV( 'Conjugate transpose', J-I, I-1, - $ -TAU( I ), V( I+1, 1 ), LDV, - $ V( I+1, I ), 1, ONE, T( 1, I ), 1 ) - ELSE -* Skip any trailing zeros. - DO LASTV = N, I+1, -1 - IF( V( I, LASTV ).NE.ZERO ) GOTO 236 - END DO - 236 CONTINUE - DO J = 1, I-1 - T( J, I ) = -TAU( I ) * V( J , I ) - END DO - J = MIN( LASTV, PREVLASTV ) -* -* T(1:i-1,i) := - tau(i) * V(1:i-1,i:j) * V(i,i:j)**H -* - CALL ZGEMM( 'N', 'C', I-1, 1, J-I, -TAU( I ), - $ V( 1, I+1 ), LDV, V( I, I+1 ), LDV, - $ ONE, T( 1, I ), LDT ) - END IF -* -* T(1:i-1,i) := T(1:i-1,1:i-1) * T(1:i-1,i) -* - CALL ZTRMV( 'Upper', 'No transpose', 'Non-unit', I-1, T, - $ LDT, T( 1, I ), 1 ) - T( I, I ) = TAU( I ) - IF( I.GT.1 ) THEN - PREVLASTV = MAX( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - END DO - ELSE - PREVLASTV = 1 - DO I = K, 1, -1 - IF( TAU( I ).EQ.ZERO ) THEN -* -* H(i) = I -* - DO J = I, K - T( J, I ) = ZERO - END DO - ELSE -* -* general case -* - IF( I.LT.K ) THEN - IF( LSAME( STOREV, 'C' ) ) THEN -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( LASTV, I ).NE.ZERO ) GOTO 281 - END DO - 281 CONTINUE - DO J = I+1, K - T( J, I ) = -TAU( I ) * CONJG( V( N-K+I , J ) ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(j:n-k+i,i+1:k)**H * V(j:n-k+i,i) -* - CALL ZGEMV( 'Conjugate transpose', N-K+I-J, K-I, - $ -TAU( I ), V( J, I+1 ), LDV, V( J, I ), - $ 1, ONE, T( I+1, I ), 1 ) - ELSE -* Skip any leading zeros. - DO LASTV = 1, I-1 - IF( V( I, LASTV ).NE.ZERO ) GOTO 297 - END DO - 297 CONTINUE - DO J = I+1, K - T( J, I ) = -TAU( I ) * V( J, N-K+I ) - END DO - J = MAX( LASTV, PREVLASTV ) -* -* T(i+1:k,i) = -tau(i) * V(i+1:k,j:n-k+i) * V(i,j:n-k+i)**H -* - CALL ZGEMM( 'N', 'C', K-I, 1, N-K+I-J, -TAU( I ), - $ V( I+1, J ), LDV, V( I, J ), LDV, - $ ONE, T( I+1, I ), LDT ) - END IF -* -* T(i+1:k,i) := T(i+1:k,i+1:k) * T(i+1:k,i) -* - CALL ZTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, - $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) - IF( I.GT.1 ) THEN - PREVLASTV = MIN( PREVLASTV, LASTV ) - ELSE - PREVLASTV = LASTV - END IF - END IF - T( I, I ) = TAU( I ) - END IF - END DO - END IF - RETURN -* -* End of ZLARFT -* - END From 656505642405168137d531896e106172151791ce Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Mon, 2 Jan 2023 12:21:00 +0100 Subject: [PATCH 36/47] WIP: add pair_pace_extrapolation_kokkos.cpp/h --- src/KOKKOS/pair_pace_extrapolation_kokkos.cpp | 1724 +++++++++++++++++ src/KOKKOS/pair_pace_extrapolation_kokkos.h | 334 ++++ 2 files changed, 2058 insertions(+) create mode 100644 src/KOKKOS/pair_pace_extrapolation_kokkos.cpp create mode 100644 src/KOKKOS/pair_pace_extrapolation_kokkos.h diff --git a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp new file mode 100644 index 0000000000..b4f4932db4 --- /dev/null +++ b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp @@ -0,0 +1,1724 @@ +// clang-format off +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + aE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Stan Moore (SNL) +------------------------------------------------------------------------- */ + +#include "pair_pace_extrapolation_kokkos.h" + +#include "atom_kokkos.h" +#include "atom_masks.h" +#include "comm.h" +#include "error.h" +#include "force.h" +#include "kokkos.h" +#include "math_const.h" +#include "memory_kokkos.h" +#include "neighbor_kokkos.h" +#include "neigh_request.h" + +#include "ace-evaluator/ace_c_basis.h" +#include "ace-evaluator/ace_evaluator.h" +#include "ace-evaluator/ace_recursive.h" +#include "ace-evaluator/ace_version.h" +#include "ace-evaluator/ace_radial.h" +#include + +namespace LAMMPS_NS { +struct ACEImpl { + ACEImpl() : basis_set(nullptr), ace(nullptr) {} + ~ACEImpl() + { + delete basis_set; + delete ace; + } + ACECTildeBasisSet *basis_set; + ACERecursiveEvaluator *ace; +}; +} // namespace LAMMPS_NS + +using namespace LAMMPS_NS; +using namespace MathConst; + +enum{FS,FS_SHIFTEDSCALED}; + +/* ---------------------------------------------------------------------- */ + +template +PairPACEExtrapolationKokkos::PairPACEExtrapolationKokkos(LAMMPS *lmp) : PairPACE(lmp) +{ + respa_enable = 0; + + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + datamask_read = EMPTY_MASK; + datamask_modify = EMPTY_MASK; + + host_flag = (execution_space == Host); +} + +/* ---------------------------------------------------------------------- + check if allocated, since class can be destructed when incomplete +------------------------------------------------------------------------- */ + +template +PairPACEExtrapolationKokkos::~PairPACEExtrapolationKokkos() +{ + if (copymode) return; + + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->destroy_kokkos(k_vatom,vatom); + + // deallocate views of views in serial to prevent issues in Kokkos tools + + if (k_splines_gk.h_view.data()) { + for (int i = 0; i < nelements; i++) { + for (int j = 0; j < nelements; j++) { + k_splines_gk.h_view(i, j).deallocate(); + k_splines_rnl.h_view(i, j).deallocate(); + k_splines_hc.h_view(i, j).deallocate(); + } + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +void PairPACEExtrapolationKokkos::grow(int natom, int maxneigh) +{ + auto basis_set = aceimpl->basis_set; + + if ((int)A.extent(0) < natom) { + + MemKK::realloc_kokkos(A, "pace:A", natom, nelements, nradmax + 1, (lmax + 1) * (lmax + 1)); + MemKK::realloc_kokkos(A_rank1, "pace:A_rank1", natom, nelements, nradbase); + + MemKK::realloc_kokkos(A_list, "pace:A_list", natom, idx_rho_max, basis_set->rankmax); + //size is +1 of max to avoid out-of-boundary array access in double-triangular scheme + MemKK::realloc_kokkos(A_forward_prod, "pace:A_forward_prod", natom, idx_rho_max, basis_set->rankmax + 1); + + MemKK::realloc_kokkos(e_atom, "pace:e_atom", natom); + MemKK::realloc_kokkos(rhos, "pace:rhos", natom, basis_set->ndensitymax + 1); // +1 density for core repulsion + MemKK::realloc_kokkos(dF_drho, "pace:dF_drho", natom, basis_set->ndensitymax + 1); // +1 density for core repulsion + + MemKK::realloc_kokkos(weights, "pace:weights", natom, nelements, nradmax + 1, (lmax + 1) * (lmax + 1)); + MemKK::realloc_kokkos(weights_rank1, "pace:weights_rank1", natom, nelements, nradbase); + + // hard-core repulsion + MemKK::realloc_kokkos(rho_core, "pace:rho_core", natom); + MemKK::realloc_kokkos(dF_drho_core, "pace:dF_drho_core", natom); + MemKK::realloc_kokkos(dB_flatten, "pace:dB_flatten", natom, idx_rho_max, basis_set->rankmax); + } + + if (((int)ylm.extent(0) < natom) || ((int)ylm.extent(1) < maxneigh)) { + + // radial functions + MemKK::realloc_kokkos(fr, "pace:fr", natom, maxneigh, nradmax, lmax + 1); + MemKK::realloc_kokkos(dfr, "pace:dfr", natom, maxneigh, nradmax, lmax + 1); + MemKK::realloc_kokkos(gr, "pace:gr", natom, maxneigh, nradbase); + MemKK::realloc_kokkos(dgr, "pace:dgr", natom, maxneigh, nradbase); + const int max_num_functions = MAX(nradbase, nradmax*(lmax + 1)); + MemKK::realloc_kokkos(d_values, "pace:d_values", natom, maxneigh, max_num_functions); + MemKK::realloc_kokkos(d_derivatives, "pace:d_derivatives", natom, maxneigh, max_num_functions); + + // hard-core repulsion + MemKK::realloc_kokkos(cr, "pace:cr", natom, maxneigh); + MemKK::realloc_kokkos(dcr, "pace:dcr", natom, maxneigh); + + // spherical harmonics + MemKK::realloc_kokkos(plm, "pace:plm", natom, maxneigh, (lmax + 1) * (lmax + 1)); + MemKK::realloc_kokkos(dplm, "pace:dplm", natom, maxneigh, (lmax + 1) * (lmax + 1)); + MemKK::realloc_kokkos(ylm, "pace:ylm", natom, maxneigh, (lmax + 1) * (lmax + 1)); + MemKK::realloc_kokkos(dylm, "pace:dylm", natom, maxneigh, (lmax + 1) * (lmax + 1)); + + // short neigh list + MemKK::realloc_kokkos(d_ncount, "pace:ncount", natom); + MemKK::realloc_kokkos(d_mu, "pace:mu", natom, maxneigh); + MemKK::realloc_kokkos(d_rhats, "pace:rhats", natom, maxneigh); + MemKK::realloc_kokkos(d_rnorms, "pace:rnorms", natom, maxneigh); + MemKK::realloc_kokkos(d_nearest, "pace:nearest", natom, maxneigh); + + MemKK::realloc_kokkos(f_ij, "pace:f_ij", natom, maxneigh); + } +} + +/* ---------------------------------------------------------------------- */ + +template +void PairPACEExtrapolationKokkos::copy_pertype() +{ + auto basis_set = aceimpl->basis_set; + + MemKK::realloc_kokkos(d_rho_core_cutoff, "pace:rho_core_cutoff", nelements); + MemKK::realloc_kokkos(d_drho_core_cutoff, "pace:drho_core_cutoff", nelements); + MemKK::realloc_kokkos(d_E0vals, "pace:E0vals", nelements); + MemKK::realloc_kokkos(d_ndensity, "pace:ndensity", nelements); + MemKK::realloc_kokkos(d_npoti, "pace:npoti", nelements); + + auto h_rho_core_cutoff = Kokkos::create_mirror_view(d_rho_core_cutoff); + auto h_drho_core_cutoff = Kokkos::create_mirror_view(d_drho_core_cutoff); + auto h_E0vals = Kokkos::create_mirror_view(d_E0vals); + auto h_ndensity = Kokkos::create_mirror_view(d_ndensity); + auto h_npoti = Kokkos::create_mirror_view(d_npoti); + + for (int n = 0; n < nelements; n++) { + h_rho_core_cutoff[n] = basis_set->map_embedding_specifications.at(n).rho_core_cutoff; + h_drho_core_cutoff[n] = basis_set->map_embedding_specifications.at(n).drho_core_cutoff; + + h_E0vals(n)= basis_set->E0vals(n); + + h_ndensity(n) = basis_set->map_embedding_specifications.at(n).ndensity; + + string npoti = basis_set->map_embedding_specifications.at(n).npoti; + if (npoti == "FinnisSinclair") + h_npoti(n) = FS; + else if (npoti == "FinnisSinclairShiftedScaled") + h_npoti(n) = FS_SHIFTEDSCALED; + } + + Kokkos::deep_copy(d_rho_core_cutoff, h_rho_core_cutoff); + Kokkos::deep_copy(d_drho_core_cutoff, h_drho_core_cutoff); + Kokkos::deep_copy(d_E0vals, h_E0vals); + Kokkos::deep_copy(d_ndensity, h_ndensity); + Kokkos::deep_copy(d_npoti, h_npoti); + + MemKK::realloc_kokkos(d_wpre, "pace:wpre", nelements, basis_set->ndensitymax); + MemKK::realloc_kokkos(d_mexp, "pace:mexp", nelements, basis_set->ndensitymax); + + auto h_wpre = Kokkos::create_mirror_view(d_wpre); + auto h_mexp = Kokkos::create_mirror_view(d_mexp); + + for (int n = 0; n < nelements; n++) { + const int ndensity = basis_set->map_embedding_specifications.at(n).ndensity; + for (int p = 0; p < ndensity; p++) { + h_wpre(n, p) = basis_set->map_embedding_specifications.at(n).FS_parameters.at(p * 2 + 0); + h_mexp(n, p) = basis_set->map_embedding_specifications.at(n).FS_parameters.at(p * 2 + 1); + } + } + + Kokkos::deep_copy(d_wpre, h_wpre); + Kokkos::deep_copy(d_mexp, h_mexp); +} + +/* ---------------------------------------------------------------------- */ + +template +void PairPACEExtrapolationKokkos::copy_splines() +{ + auto basis_set = aceimpl->basis_set; + + if (k_splines_gk.d_view.data()) { + for (int i = 0; i < nelements; i++) { + for (int j = 0; j < nelements; j++) { + k_splines_gk.h_view(i, j).deallocate(); + k_splines_rnl.h_view(i, j).deallocate(); + k_splines_hc.h_view(i, j).deallocate(); + } + } + } + + k_splines_gk = Kokkos::DualView("pace:splines_gk", nelements, nelements); + k_splines_rnl = Kokkos::DualView("pace:splines_rnl", nelements, nelements); + k_splines_hc = Kokkos::DualView("pace:splines_hc", nelements, nelements); + + ACERadialFunctions* radial_functions = dynamic_cast(basis_set->radial_functions); + + for (int i = 0; i < nelements; i++) { + for (int j = 0; j < nelements; j++) { + k_splines_gk.h_view(i, j) = radial_functions->splines_gk(i, j); + k_splines_rnl.h_view(i, j) = radial_functions->splines_rnl(i, j); + k_splines_hc.h_view(i, j) = radial_functions->splines_hc(i, j); + } + } + + k_splines_gk.modify_host(); + k_splines_rnl.modify_host(); + k_splines_hc.modify_host(); + + k_splines_gk.sync_device(); + k_splines_rnl.sync_device(); + k_splines_hc.sync_device(); +} + +/* ---------------------------------------------------------------------- */ + +template +void PairPACEExtrapolationKokkos::copy_tilde() +{ + auto basis_set = aceimpl->basis_set; + + // flatten loops, get per-element count and max + + idx_rho_max = 0; + int total_basis_size_max = 0; + + MemKK::realloc_kokkos(d_idx_rho_count, "pace:idx_rho_count", nelements); + auto h_idx_rho_count = Kokkos::create_mirror_view(d_idx_rho_count); + + for (int n = 0; n < nelements; n++) { + int idx_rho = 0; + const int total_basis_size_rank1 = basis_set->total_basis_size_rank1[n]; + const int total_basis_size = basis_set->total_basis_size[n]; + + ACECTildeBasisFunction *basis = basis_set->basis[n]; + + // rank=1 + for (int func_rank1_ind = 0; func_rank1_ind < total_basis_size_rank1; ++func_rank1_ind) + idx_rho++; + + // rank > 1 + for (int func_ind = 0; func_ind < total_basis_size; ++func_ind) { + ACECTildeBasisFunction *func = &basis[func_ind]; + + // loop over {ms} combinations in sum + for (int ms_ind = 0; ms_ind < func->num_ms_combs; ++ms_ind) + idx_rho++; + } + h_idx_rho_count(n) = idx_rho; + idx_rho_max = MAX(idx_rho_max, idx_rho); + total_basis_size_max = MAX(total_basis_size_max, total_basis_size_rank1 + total_basis_size); + } + + Kokkos::deep_copy(d_idx_rho_count, h_idx_rho_count); + + MemKK::realloc_kokkos(d_rank, "pace:rank", nelements, total_basis_size_max); + MemKK::realloc_kokkos(d_num_ms_combs, "pace:num_ms_combs", nelements, total_basis_size_max); + MemKK::realloc_kokkos(d_offsets, "pace:offsets", nelements, idx_rho_max); + MemKK::realloc_kokkos(d_mus, "pace:mus", nelements, total_basis_size_max, basis_set->rankmax); + MemKK::realloc_kokkos(d_ns, "pace:ns", nelements, total_basis_size_max, basis_set->rankmax); + MemKK::realloc_kokkos(d_ls, "pace:ls", nelements, total_basis_size_max, basis_set->rankmax); + MemKK::realloc_kokkos(d_ms_combs, "pace:ms_combs", nelements, idx_rho_max, basis_set->rankmax); + MemKK::realloc_kokkos(d_ctildes, "pace:ctildes", nelements, idx_rho_max, basis_set->ndensitymax); + + auto h_rank = Kokkos::create_mirror_view(d_rank); + auto h_num_ms_combs = Kokkos::create_mirror_view(d_num_ms_combs); + auto h_offsets = Kokkos::create_mirror_view(d_offsets); + auto h_mus = Kokkos::create_mirror_view(d_mus); + auto h_ns = Kokkos::create_mirror_view(d_ns); + auto h_ls = Kokkos::create_mirror_view(d_ls); + auto h_ms_combs = Kokkos::create_mirror_view(d_ms_combs); + auto h_ctildes = Kokkos::create_mirror_view(d_ctildes); + + // copy values on host + + for (int n = 0; n < nelements; n++) { + const int total_basis_size_rank1 = basis_set->total_basis_size_rank1[n]; + const int total_basis_size = basis_set->total_basis_size[n]; + + ACECTildeBasisFunction *basis_rank1 = basis_set->basis_rank1[n]; + ACECTildeBasisFunction *basis = basis_set->basis[n]; + + const int ndensity = basis_set->map_embedding_specifications.at(n).ndensity; + + int idx_rho = 0; + + // rank=1 + for (int offset = 0; offset < total_basis_size_rank1; ++offset) { + ACECTildeBasisFunction *func = &basis_rank1[offset]; + h_rank(n, offset) = 1; + h_mus(n, offset, 0) = func->mus[0]; + h_ns(n, offset, 0) = func->ns[0]; + for (int p = 0; p < ndensity; p++) + h_ctildes(n, idx_rho, p) = func->ctildes[p]; + h_offsets(n, idx_rho) = offset; + idx_rho++; + } + + // rank > 1 + for (int func_ind = 0; func_ind < total_basis_size; ++func_ind) { + ACECTildeBasisFunction *func = &basis[func_ind]; + // TODO: check if func->ctildes are zero, then skip + + const int offset = total_basis_size_rank1 + func_ind; + + const int rank = h_rank(n, offset) = func->rank; + h_num_ms_combs(n, offset) = func->num_ms_combs; + for (int t = 0; t < rank; t++) { + h_mus(n, offset, t) = func->mus[t]; + h_ns(n, offset, t) = func->ns[t]; + h_ls(n, offset, t) = func->ls[t]; + } + + // loop over {ms} combinations in sum + for (int ms_ind = 0; ms_ind < func->num_ms_combs; ++ms_ind) { + auto ms = &func->ms_combs[ms_ind * rank]; // current ms-combination (of length = rank) + for (int t = 0; t < rank; t++) + h_ms_combs(n, idx_rho, t) = ms[t]; + + for (int p = 0; p < ndensity; ++p) { + // real-part only multiplication + h_ctildes(n, idx_rho, p) = func->ctildes[ms_ind * ndensity + p]; + } + h_offsets(n, idx_rho) = offset; + idx_rho++; + } + } + } + + Kokkos::deep_copy(d_rank, h_rank); + Kokkos::deep_copy(d_num_ms_combs, h_num_ms_combs); + Kokkos::deep_copy(d_offsets, h_offsets); + Kokkos::deep_copy(d_mus, h_mus); + Kokkos::deep_copy(d_ns, h_ns); + Kokkos::deep_copy(d_ls, h_ls); + Kokkos::deep_copy(d_ms_combs, h_ms_combs); + Kokkos::deep_copy(d_ctildes, h_ctildes); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +template +void PairPACEExtrapolationKokkos::init_style() +{ + if (host_flag) { + if (lmp->kokkos->nthreads > 1) + error->all(FLERR,"Pair style pace/kk can currently only run on a single " + "CPU thread"); + + PairPACE::init_style(); + return; + } + + if (atom->tag_enable == 0) error->all(FLERR, "Pair style PACE requires atom IDs"); + if (force->newton_pair == 0) error->all(FLERR, "Pair style PACE requires newton pair on"); + + // neighbor list request for KOKKOS + + neighflag = lmp->kokkos->neighflag; + + auto request = neighbor->add_request(this, NeighConst::REQ_FULL); + request->set_kokkos_host(std::is_same::value && + !std::is_same::value); + request->set_kokkos_device(std::is_same::value); + if (neighflag == FULL) + error->all(FLERR,"Must use half neighbor list style with pair pace/kk"); + + auto basis_set = aceimpl->basis_set; + + nelements = basis_set->nelements; + lmax = basis_set->lmax; + nradmax = basis_set->nradmax; + nradbase = basis_set->nradbase; + + // spherical harmonics + + MemKK::realloc_kokkos(alm, "pace:alm", (lmax + 1) * (lmax + 1)); + MemKK::realloc_kokkos(blm, "pace:blm", (lmax + 1) * (lmax + 1)); + MemKK::realloc_kokkos(cl, "pace:cl", lmax + 1); + MemKK::realloc_kokkos(dl, "pace:dl", lmax + 1); + + pre_compute_harmonics(lmax); + copy_pertype(); + copy_splines(); + copy_tilde(); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +template +double PairPACEExtrapolationKokkos::init_one(int i, int j) +{ + double cutone = PairPACE::init_one(i,j); + + k_scale.h_view(i,j) = k_scale.h_view(j,i) = scale[i][j]; + k_scale.template modify(); + + k_cutsq.h_view(i,j) = k_cutsq.h_view(j,i) = cutone*cutone; + k_cutsq.template modify(); + + return cutone; +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +template +void PairPACEExtrapolationKokkos::coeff(int narg, char **arg) +{ + PairPACE::coeff(narg,arg); + + // Set up element lists + + auto h_map = Kokkos::create_mirror_view(d_map); + + for (int i = 1; i <= atom->ntypes; i++) + h_map(i) = map[i]; + + Kokkos::deep_copy(d_map,h_map); +} + +/* ---------------------------------------------------------------------- */ + +template +void PairPACEExtrapolationKokkos::allocate() +{ + PairPACE::allocate(); + + int n = atom->ntypes + 1; + MemKK::realloc_kokkos(d_map, "pace:map", n); + + MemKK::realloc_kokkos(k_cutsq, "pace:cutsq", n, n); + d_cutsq = k_cutsq.template view(); + + MemKK::realloc_kokkos(k_scale, "pace:scale", n, n); + d_scale = k_scale.template view(); +} + +/* ---------------------------------------------------------------------- */ + +template +struct FindMaxNumNeighs { + typedef DeviceType device_type; + NeighListKokkos k_list; + + FindMaxNumNeighs(NeighListKokkos* nl): k_list(*nl) {} + ~FindMaxNumNeighs() {k_list.copymode = 1;} + + KOKKOS_INLINE_FUNCTION + void operator() (const int& ii, int& maxneigh) const { + const int i = k_list.d_ilist[ii]; + const int num_neighs = k_list.d_numneigh[i]; + if (maxneigh < num_neighs) maxneigh = num_neighs; + } +}; + +/* ---------------------------------------------------------------------- */ + +template +void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in) +{ + if (host_flag) { + atomKK->sync(Host,X_MASK|TYPE_MASK); + PairPACE::compute(eflag_in,vflag_in); + atomKK->modified(Host,F_MASK); + return; + } + + eflag = eflag_in; + vflag = vflag_in; + + if (neighflag == FULL) no_virial_fdotr_compute = 1; + + ev_init(eflag,vflag,0); + + // reallocate per-atom arrays if necessary + + if (eflag_atom) { + memoryKK->destroy_kokkos(k_eatom,eatom); + memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.view(); + } + if (vflag_atom) { + memoryKK->destroy_kokkos(k_vatom,vatom); + memoryKK->create_kokkos(k_vatom,vatom,maxvatom,"pair:vatom"); + d_vatom = k_vatom.view(); + } + + copymode = 1; + if (!force->newton_pair) + error->all(FLERR,"PairPACEExtrapolationKokkos requires 'newton on'"); + + if (recursive) + error->all(FLERR,"Must use 'product' algorithm with pair pace/kk on the GPU"); + + atomKK->sync(execution_space,X_MASK|F_MASK|TYPE_MASK); + x = atomKK->k_x.view(); + f = atomKK->k_f.view(); + type = atomKK->k_type.view(); + k_scale.template sync(); + k_cutsq.template sync(); + + NeighListKokkos* k_list = static_cast*>(list); + d_numneigh = k_list->d_numneigh; + d_neighbors = k_list->d_neighbors; + d_ilist = k_list->d_ilist; + inum = list->inum; + + need_dup = lmp->kokkos->need_dup(); + if (need_dup) { + dup_f = Kokkos::Experimental::create_scatter_view(f); + dup_vatom = Kokkos::Experimental::create_scatter_view(d_vatom); + } else { + ndup_f = Kokkos::Experimental::create_scatter_view(f); + ndup_vatom = Kokkos::Experimental::create_scatter_view(d_vatom); + } + + maxneigh = 0; + Kokkos::parallel_reduce("pace::find_maxneigh", inum, FindMaxNumNeighs(k_list), Kokkos::Max(maxneigh)); + + int vector_length_default = 1; + int team_size_default = 1; + if (!host_flag) + team_size_default = 32; + + chunk_size = MIN(chunksize,inum); // "chunksize" variable is set by user + chunk_offset = 0; + + grow(chunk_size, maxneigh); + + EV_FLOAT ev; + + while (chunk_offset < inum) { // chunk up loop to prevent running out of memory + + Kokkos::deep_copy(weights, 0.0); + Kokkos::deep_copy(weights_rank1, 0.0); + Kokkos::deep_copy(A, 0.0); + Kokkos::deep_copy(A_rank1, 0.0); + Kokkos::deep_copy(rhos, 0.0); + + EV_FLOAT ev_tmp; + + if (chunk_size > inum - chunk_offset) + chunk_size = inum - chunk_offset; + + //Neigh + { + int vector_length = vector_length_default; + int team_size = team_size_default; + check_team_size_for(chunk_size,team_size,vector_length); + int scratch_size = scratch_size_helper(team_size * maxneigh); + typename Kokkos::TeamPolicy policy_neigh(chunk_size,team_size,vector_length); + policy_neigh = policy_neigh.set_scratch_size(0, Kokkos::PerTeam(scratch_size)); + Kokkos::parallel_for("ComputeNeigh",policy_neigh,*this); + } + + //ComputeRadial + { + int vector_length = vector_length_default; + int team_size = team_size_default; + check_team_size_for(((chunk_size+team_size-1)/team_size)*maxneigh,team_size,vector_length); + typename Kokkos::TeamPolicy policy_radial(((chunk_size+team_size-1)/team_size)*maxneigh,team_size,vector_length); + Kokkos::parallel_for("ComputeRadial",policy_radial,*this); + } + + //ComputeYlm + { + int vector_length = vector_length_default; + int team_size = 16; + check_team_size_for(((chunk_size+team_size-1)/team_size)*maxneigh,team_size,vector_length); + typename Kokkos::TeamPolicy policy_ylm(((chunk_size+team_size-1)/team_size)*maxneigh,team_size,vector_length); + Kokkos::parallel_for("ComputeYlm",policy_ylm,*this); + } + + //ComputeAi + { + int vector_length = vector_length_default; + int team_size = team_size_default; + check_team_size_for(((chunk_size+team_size-1)/team_size)*maxneigh,team_size,vector_length); + typename Kokkos::TeamPolicy policy_ai(((chunk_size+team_size-1)/team_size)*maxneigh,team_size,vector_length); + Kokkos::parallel_for("ComputeAi",policy_ai,*this); + } + + //ConjugateAi + { + typename Kokkos::RangePolicy policy_conj_ai(0,chunk_size); + Kokkos::parallel_for("ConjugateAi",policy_conj_ai,*this); + } + + //ComputeRho + { + typename Kokkos::RangePolicy policy_rho(0,chunk_size*idx_rho_max); + Kokkos::parallel_for("ComputeRho",policy_rho,*this); + } + + //ComputeFS + { + typename Kokkos::RangePolicy policy_fs(0,chunk_size); + Kokkos::parallel_for("ComputeFS",policy_fs,*this); + } + + //ComputeWeights + { + typename Kokkos::RangePolicy policy_weights(0,chunk_size*idx_rho_max); + Kokkos::parallel_for("ComputeWeights",policy_weights,*this); + } + + //ComputeDerivative + { + int vector_length = vector_length_default; + int team_size = team_size_default; + check_team_size_for(((chunk_size+team_size-1)/team_size)*maxneigh,team_size,vector_length); + typename Kokkos::TeamPolicy policy_derivative(((chunk_size+team_size-1)/team_size)*maxneigh,team_size,vector_length); + Kokkos::parallel_for("ComputeDerivative",policy_derivative,*this); + } + + //ComputeForce + { + if (evflag) { + if (neighflag == HALF) { + typename Kokkos::RangePolicy > policy_force(0,chunk_size); + Kokkos::parallel_reduce(policy_force, *this, ev_tmp); + } else if (neighflag == HALFTHREAD) { + typename Kokkos::RangePolicy > policy_force(0,chunk_size); + Kokkos::parallel_reduce("ComputeForce",policy_force, *this, ev_tmp); + } + } else { + if (neighflag == HALF) { + typename Kokkos::RangePolicy > policy_force(0,chunk_size); + Kokkos::parallel_for(policy_force, *this); + } else if (neighflag == HALFTHREAD) { + typename Kokkos::RangePolicy > policy_force(0,chunk_size); + Kokkos::parallel_for("ComputeForce",policy_force, *this); + } + } + } + ev += ev_tmp; + chunk_offset += chunk_size; + + } // end while + + if (need_dup) + Kokkos::Experimental::contribute(f, dup_f); + + if (eflag_global) eng_vdwl += ev.evdwl; + if (vflag_global) { + virial[0] += ev.v[0]; + virial[1] += ev.v[1]; + virial[2] += ev.v[2]; + virial[3] += ev.v[3]; + virial[4] += ev.v[4]; + virial[5] += ev.v[5]; + } + + if (vflag_fdotr) pair_virial_fdotr_compute(this); + + if (eflag_atom) { + k_eatom.template modify(); + k_eatom.template sync(); + } + + if (vflag_atom) { + if (need_dup) + Kokkos::Experimental::contribute(d_vatom, dup_vatom); + k_vatom.template modify(); + k_vatom.template sync(); + } + + atomKK->modified(execution_space,F_MASK); + + copymode = 0; + + // free duplicated memory + if (need_dup) { + dup_f = decltype(dup_f)(); + dup_vatom = decltype(dup_vatom)(); + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeNeigh,const typename Kokkos::TeamPolicy::member_type& team) const +{ + const int ii = team.league_rank(); + const int i = d_ilist[ii + chunk_offset]; + const int itype = type[i]; + const X_FLOAT xtmp = x(i,0); + const X_FLOAT ytmp = x(i,1); + const X_FLOAT ztmp = x(i,2); + const int jnum = d_numneigh[i]; + + // get a pointer to scratch memory + // This is used to cache whether or not an atom is within the cutoff + // If it is, inside is assigned to 1, otherwise -1 + const int team_rank = team.team_rank(); + const int scratch_shift = team_rank * maxneigh; // offset into pointer for entire team + int* inside = (int*)team.team_shmem().get_shmem(team.team_size() * maxneigh * sizeof(int), 0) + scratch_shift; + + // loop over list of all neighbors within force cutoff + // distsq[] = distance sq to each + // rlist[] = distance vector to each + // nearest[] = atom indices of neighbors + + int ncount = 0; + Kokkos::parallel_reduce(Kokkos::TeamThreadRange(team,jnum), + [&] (const int jj, int& count) { + int j = d_neighbors(i,jj); + j &= NEIGHMASK; + + const int jtype = type(j); + + const F_FLOAT delx = xtmp - x(j,0); + const F_FLOAT dely = ytmp - x(j,1); + const F_FLOAT delz = ztmp - x(j,2); + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; + + inside[jj] = -1; + if (rsq < d_cutsq(itype,jtype)) { + inside[jj] = 1; + count++; + } + },ncount); + + d_ncount(ii) = ncount; + + Kokkos::parallel_scan(Kokkos::TeamThreadRange(team,jnum), + [&] (const int jj, int& offset, bool final) { + + if (inside[jj] < 0) return; + + if (final) { + int j = d_neighbors(i,jj); + j &= NEIGHMASK; + const F_FLOAT delx = xtmp - x(j,0); + const F_FLOAT dely = ytmp - x(j,1); + const F_FLOAT delz = ztmp - x(j,2); + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; + const F_FLOAT r = sqrt(rsq); + const F_FLOAT rinv = 1.0/r; + const int mu_j = d_map(type(j)); + d_mu(ii,offset) = mu_j; + d_rnorms(ii,offset) = r; + d_rhats(ii,offset,0) = -delx*rinv; + d_rhats(ii,offset,1) = -dely*rinv; + d_rhats(ii,offset,2) = -delz*rinv; + d_nearest(ii,offset) = j; + } + offset++; + }); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeRadial, const typename Kokkos::TeamPolicy::member_type& team) const +{ + // Extract the atom number + int ii = team.team_rank() + team.team_size() * (team.league_rank() % + ((chunk_size+team.team_size()-1)/team.team_size())); + if (ii >= chunk_size) return; + const int i = d_ilist[ii + chunk_offset]; + + // Extract the neighbor number + const int jj = team.league_rank() / ((chunk_size+team.team_size()-1)/team.team_size()); + const int ncount = d_ncount(ii); + if (jj >= ncount) return; + + const double r_norm = d_rnorms(ii, jj); + const int mu_i = d_map(type(i)); + const int mu_j = d_mu(ii, jj); + + evaluate_splines(ii, jj, r_norm, nradbase, nradmax, mu_i, mu_j); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeYlm, const typename Kokkos::TeamPolicy::member_type& team) const +{ + // Extract the atom number + int ii = team.team_rank() + team.team_size() * (team.league_rank() % + ((chunk_size+team.team_size()-1)/team.team_size())); + if (ii >= chunk_size) return; + + // Extract the neighbor number + const int jj = team.league_rank() / ((chunk_size+team.team_size()-1)/team.team_size()); + const int ncount = d_ncount(ii); + if (jj >= ncount) return; + + const double xn = d_rhats(ii, jj, 0); + const double yn = d_rhats(ii, jj, 1); + const double zn = d_rhats(ii, jj, 2); + compute_ylm(ii,jj,xn,yn,zn,lmax); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeAi, const typename Kokkos::TeamPolicy::member_type& team) const +{ + // Extract the atom number + int ii = team.team_rank() + team.team_size() * (team.league_rank() % + ((chunk_size+team.team_size()-1)/team.team_size())); + if (ii >= chunk_size) return; + + // Extract the neighbor number + const int jj = team.league_rank() / ((chunk_size+team.team_size()-1)/team.team_size()); + const int ncount = d_ncount(ii); + if (jj >= ncount) return; + + const int mu_j = d_mu(ii, jj); + + // rank = 1 + for (int n = 0; n < nradbase; n++) + Kokkos::atomic_add(&A_rank1(ii, mu_j, n), gr(ii, jj, n) * Y00); + + // rank > 1 + for (int n = 0; n < nradmax; n++) { + for (int l = 0; l <= lmax; l++) { + for (int m = 0; m <= l; m++) { + const int idx = l * (l + 1) + m; // (l, m) + Kokkos::atomic_add(&A(ii, mu_j, n, idx).re, fr(ii, jj, n, l) * ylm(ii, jj, idx).re); + Kokkos::atomic_add(&A(ii, mu_j, n, idx).im, fr(ii, jj, n, l) * ylm(ii, jj, idx).im); + } + } + } + + // hard-core repulsion + Kokkos::atomic_add(&rho_core(ii), cr(ii, jj)); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::operator() (TagPairPACEConjugateAi, const int& ii) const +{ + //complex conjugate A's (for NEGATIVE (-m) terms) + // for rank > 1 + for (int mu_j = 0; mu_j < nelements; mu_j++) { + for (int n = 0; n < nradmax; n++) { + for (int l = 0; l <= lmax; l++) { + //fill in -m part in the outer loop using the same m <-> -m symmetry as for Ylm + for (int m = 1; m <= l; m++) { + const int idx = l * (l + 1) + m; // (l, m) + const int idxm = l * (l + 1) - m; // (l, -m) + const int factor = m % 2 == 0 ? 1 : -1; + A(ii, mu_j, n, idxm) = A(ii, mu_j, n, idx).conj() * (double)factor; + } + } + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeRho, const int& iter) const +{ + const int idx_rho = iter / chunk_size; + const int ii = iter % chunk_size; + + const int i = d_ilist[ii + chunk_offset]; + const int mu_i = d_map(type(i)); + + if (idx_rho >= d_idx_rho_count(mu_i)) return; + + const int ndensity = d_ndensity(mu_i); + + const int offset = d_offsets(mu_i, idx_rho); + const int rank = d_rank(mu_i, offset); + const int r = rank - 1; + + // Basis functions B with iterative product and density rho(p) calculation + if (rank == 1) { + const int mu = d_mus(mu_i, offset, 0); + const int n = d_ns(mu_i, offset, 0); + double A_cur = A_rank1(ii, mu, n - 1); + for (int p = 0; p < ndensity; ++p) { + //for rank=1 (r=0) only 1 ms-combination exists (ms_ind=0), so index of func.ctildes is 0..ndensity-1 + Kokkos::atomic_add(&rhos(ii, p), d_ctildes(mu_i, idx_rho, p) * A_cur); + } + } else { // rank > 1 + // loop over {ms} combinations in sum + + // loop over m, collect B = product of A with given ms + A_forward_prod(ii, idx_rho, 0) = complex::one(); + + // fill forward A-product triangle + for (int t = 0; t < rank; t++) { + //TODO: optimize ns[t]-1 -> ns[t] during functions construction + const int mu = d_mus(mu_i, offset, t); + const int n = d_ns(mu_i, offset, t); + const int l = d_ls(mu_i, offset, t); + const int m = d_ms_combs(mu_i, idx_rho, t); // current ms-combination (of length = rank) + const int idx = l * (l + 1) + m; // (l, m) + A_list(ii, idx_rho, t) = A(ii, mu, n - 1, idx); + A_forward_prod(ii, idx_rho, t + 1) = A_forward_prod(ii, idx_rho, t) * A_list(ii, idx_rho, t); + } + + complex A_backward_prod = complex::one(); + + // fill backward A-product triangle + for (int t = r; t >= 1; t--) { + const complex dB = A_forward_prod(ii, idx_rho, t) * A_backward_prod; // dB - product of all A's except t-th + dB_flatten(ii, idx_rho, t) = dB; + + A_backward_prod = A_backward_prod * A_list(ii, idx_rho, t); + } + dB_flatten(ii, idx_rho, 0) = A_forward_prod(ii, idx_rho, 0) * A_backward_prod; + + const complex B = A_forward_prod(ii, idx_rho, rank); + + for (int p = 0; p < ndensity; ++p) { + // real-part only multiplication + Kokkos::atomic_add(&rhos(ii, p), B.real_part_product(d_ctildes(mu_i, idx_rho, p))); + } + } +} + +/* ---------------------------------------------------------------------- */ + + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeFS, const int& ii) const +{ + const int i = d_ilist[ii + chunk_offset]; + const int mu_i = d_map(type(i)); + + const double rho_cut = d_rho_core_cutoff(mu_i); + const double drho_cut = d_drho_core_cutoff(mu_i); + const int ndensity = d_ndensity(mu_i); + + double evdwl, fcut, dfcut; + evdwl = fcut = dfcut = 0.0; + + inner_cutoff(rho_core(ii), rho_cut, drho_cut, fcut, dfcut); + FS_values_and_derivatives(ii, evdwl, mu_i); + + dF_drho_core(ii) = evdwl * dfcut + 1; + for (int p = 0; p < ndensity; ++p) + dF_drho(ii, p) *= fcut; + + + // tally energy contribution + if (eflag) { + double evdwl_cut = evdwl * fcut + rho_core(ii); + // E0 shift + evdwl_cut += d_E0vals(mu_i); + e_atom(ii) = evdwl_cut; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeWeights, const int& iter) const +{ + const int idx_rho = iter / chunk_size; + const int ii = iter % chunk_size; + + const int i = d_ilist[ii + chunk_offset]; + const int mu_i = d_map(type(i)); + + if (idx_rho >= d_idx_rho_count(mu_i)) return; + + const int ndensity = d_ndensity(mu_i); + + const int offset = d_offsets(mu_i, idx_rho); + const int rank = d_rank(mu_i, offset); + + // Weights and theta calculation + + if (rank == 1) { + const int mu = d_mus(mu_i, offset, 0); + const int n = d_ns(mu_i, offset, 0); + double theta = 0.0; + for (int p = 0; p < ndensity; ++p) { + // for rank=1 (r=0) only 1 ms-combination exists (ms_ind=0), so index of func.ctildes is 0..ndensity-1 + theta += dF_drho(ii, p) * d_ctildes(mu_i, idx_rho, p); + } + Kokkos::atomic_add(&weights_rank1(ii, mu, n - 1), theta); + } else { // rank > 1 + double theta = 0.0; + for (int p = 0; p < ndensity; ++p) + theta += dF_drho(ii, p) * d_ctildes(mu_i, idx_rho, p); + + theta *= 0.5; // 0.5 factor due to possible double counting ??? + for (int t = 0; t < rank; ++t) { + const int m_t = d_ms_combs(mu_i, idx_rho, t); + const int factor = (m_t % 2 == 0 ? 1 : -1); + const complex dB = dB_flatten(ii, idx_rho, t); + const int mu_t = d_mus(mu_i, offset, t); + const int n_t = d_ns(mu_i, offset, t); + const int l_t = d_ls(mu_i, offset, t); + const int idx = l_t * (l_t + 1) + m_t; // (l, m) + const complex value = theta * dB; + Kokkos::atomic_add(&(weights(ii, mu_t, n_t - 1, idx).re), value.re); + Kokkos::atomic_add(&(weights(ii, mu_t, n_t - 1, idx).im), value.im); + // update -m_t (that could also be positive), because the basis is half_basis + const int idxm = l_t * (l_t + 1) - m_t; // (l, -m) + const complex valuem = theta * dB.conj() * (double)factor; + Kokkos::atomic_add(&(weights(ii, mu_t, n_t - 1, idxm).re), valuem.re); + Kokkos::atomic_add(&(weights(ii, mu_t, n_t - 1, idxm).im), valuem.im); + } + } +} + +/* ---------------------------------------------------------------------- */ +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeDerivative, const typename Kokkos::TeamPolicy::member_type& team) const +{ + // Extract the atom number + int ii = team.team_rank() + team.team_size() * (team.league_rank() % + ((chunk_size+team.team_size()-1)/team.team_size())); + if (ii >= chunk_size) return; + const int i = d_ilist[ii + chunk_offset]; + + // Extract the neighbor number + const int jj = team.league_rank() / ((chunk_size+team.team_size()-1)/team.team_size()); + const int ncount = d_ncount(ii); + if (jj >= ncount) return; + + const int itype = type(i); + const double scale = d_scale(itype,itype); + + const int mu_j = d_mu(ii, jj); + double r_hat[3]; + r_hat[0] = d_rhats(ii, jj, 0); + r_hat[1] = d_rhats(ii, jj, 1); + r_hat[2] = d_rhats(ii, jj, 2); + const double r = d_rnorms(ii, jj); + const double rinv = 1.0/r; + + double f_ji[3]; + f_ji[0] = f_ji[1] = f_ji[2] = 0; + + // for rank = 1 + for (int n = 0; n < nradbase; ++n) { + if (weights_rank1(ii, mu_j, n) == 0) continue; + double &DG = dgr(ii, jj, n); + double DGR = DG * Y00; + DGR *= weights_rank1(ii, mu_j, n); + f_ji[0] += DGR * r_hat[0]; + f_ji[1] += DGR * r_hat[1]; + f_ji[2] += DGR * r_hat[2]; + } + + // for rank > 1 + for (int n = 0; n < nradmax; n++) { + for (int l = 0; l <= lmax; l++) { + const double R_over_r = fr(ii, jj, n, l) * rinv; + const double DR = dfr(ii, jj, n, l); + + // for m >= 0 + for (int m = 0; m <= l; m++) { + const int idx = l * (l + 1) + m; // (l, m) + complex w = weights(ii, mu_j, n, idx); + if (w.re == 0.0 && w.im == 0.0) continue; + // counting for -m cases if m > 0 + if (m > 0) { + w.re *= 2.0; + w.im *= 2.0; + } + + complex DY[3]; + DY[0] = dylm(ii, jj, idx, 0); + DY[1] = dylm(ii, jj, idx, 1); + DY[2] = dylm(ii, jj, idx, 2); + const complex Y_DR = ylm(ii, jj, idx) * DR; + + complex grad_phi_nlm[3]; + grad_phi_nlm[0] = Y_DR * r_hat[0] + DY[0] * R_over_r; + grad_phi_nlm[1] = Y_DR * r_hat[1] + DY[1] * R_over_r; + grad_phi_nlm[2] = Y_DR * r_hat[2] + DY[2] * R_over_r; + // real-part multiplication only + f_ji[0] += w.real_part_product(grad_phi_nlm[0]); + f_ji[1] += w.real_part_product(grad_phi_nlm[1]); + f_ji[2] += w.real_part_product(grad_phi_nlm[2]); + } + } + } + + // hard-core repulsion + const double fpair = dF_drho_core(ii) * dcr(ii,jj); + f_ij(ii, jj, 0) = scale * f_ji[0] + fpair * r_hat[0]; + f_ij(ii, jj, 1) = scale * f_ji[1] + fpair * r_hat[1]; + f_ij(ii, jj, 2) = scale * f_ji[2] + fpair * r_hat[2]; +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeForce, const int& ii, EV_FLOAT& ev) const +{ + // The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial + const auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); + const auto a_f = v_f.template access::value>(); + + const int i = d_ilist[ii + chunk_offset]; + const int itype = type(i); + const double scale = d_scale(itype,itype); + + const int ncount = d_ncount(ii); + + F_FLOAT fitmp[3] = {0.0,0.0,0.0}; + for (int jj = 0; jj < ncount; jj++) { + int j = d_nearest(ii,jj); + + double r_hat[3]; + r_hat[0] = d_rhats(ii, jj, 0); + r_hat[1] = d_rhats(ii, jj, 1); + r_hat[2] = d_rhats(ii, jj, 2); + const double r = d_rnorms(ii, jj); + const double delx = -r_hat[0]*r; + const double dely = -r_hat[1]*r; + const double delz = -r_hat[2]*r; + + const double fpairx = f_ij(ii, jj, 0); + const double fpairy = f_ij(ii, jj, 1); + const double fpairz = f_ij(ii, jj, 2); + + fitmp[0] += fpairx; + fitmp[1] += fpairy; + fitmp[2] += fpairz; + a_f(j,0) -= fpairx; + a_f(j,1) -= fpairy; + a_f(j,2) -= fpairz; + + // tally per-atom virial contribution + if (EVFLAG && vflag_either) + v_tally_xyz(ev, i, j, fpairx, fpairy, fpairz, delx, dely, delz); + } + + a_f(i,0) += fitmp[0]; + a_f(i,1) += fitmp[1]; + a_f(i,2) += fitmp[2]; + + // tally energy contribution + if (EVFLAG && eflag_either) { + const double evdwl = scale*e_atom(ii); + //ev_tally_full(i, 2.0 * evdwl, 0.0, 0.0, 0.0, 0.0, 0.0); + if (eflag_global) ev.evdwl += evdwl; + if (eflag_atom) d_eatom[i] += evdwl; + } +} + +template +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeForce,const int& ii) const { + EV_FLOAT ev; + this->template operator()(TagPairPACEComputeForce(), ii, ev); +} + +/* ---------------------------------------------------------------------- */ + +template +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::v_tally_xyz(EV_FLOAT &ev, const int &i, const int &j, + const F_FLOAT &fx, const F_FLOAT &fy, const F_FLOAT &fz, + const F_FLOAT &delx, const F_FLOAT &dely, const F_FLOAT &delz) const +{ + // The vatom array is duplicated for OpenMP, atomic for CUDA, and neither for Serial + + auto v_vatom = ScatterViewHelper,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom); + auto a_vatom = v_vatom.template access>(); + + const E_FLOAT v0 = delx*fx; + const E_FLOAT v1 = dely*fy; + const E_FLOAT v2 = delz*fz; + const E_FLOAT v3 = delx*fy; + const E_FLOAT v4 = delx*fz; + const E_FLOAT v5 = dely*fz; + + if (vflag_global) { + ev.v[0] += v0; + ev.v[1] += v1; + ev.v[2] += v2; + ev.v[3] += v3; + ev.v[4] += v4; + ev.v[5] += v5; + } + + if (vflag_atom) { + a_vatom(i,0) += 0.5*v0; + a_vatom(i,1) += 0.5*v1; + a_vatom(i,2) += 0.5*v2; + a_vatom(i,3) += 0.5*v3; + a_vatom(i,4) += 0.5*v4; + a_vatom(i,5) += 0.5*v5; + a_vatom(j,0) += 0.5*v0; + a_vatom(j,1) += 0.5*v1; + a_vatom(j,2) += 0.5*v2; + a_vatom(j,3) += 0.5*v3; + a_vatom(j,4) += 0.5*v4; + a_vatom(j,5) += 0.5*v5; + } +} + +/* ---------------------------------------------------------------------- */ + +template +void PairPACEExtrapolationKokkos::pre_compute_harmonics(int lmax) +{ + auto h_alm = Kokkos::create_mirror_view(alm); + auto h_blm = Kokkos::create_mirror_view(blm); + auto h_cl = Kokkos::create_mirror_view(cl); + auto h_dl = Kokkos::create_mirror_view(dl); + + for (int l = 1; l <= lmax; l++) { + const double lsq = l * l; + const double ld = 2 * l; + const double l1 = (4 * lsq - 1); + const double l2 = lsq - ld + 1; + for (int m = 0; m < l - 1; m++) { + const double msq = m * m; + const double a = sqrt((double(l1)) / (double(lsq - msq))); + const double b = -sqrt((double(l2 - msq)) / (double(4 * l2 - 1))); + const int idx = l * (l + 1) + m; // (l, m) + h_alm(idx) = a; + h_blm(idx) = b; + } + } + + for (int l = 1; l <= lmax; l++) { + h_cl(l) = -sqrt(1.0 + 0.5 / (double(l))); + h_dl(l) = sqrt(double(2 * (l - 1) + 3)); + } + + Kokkos::deep_copy(alm, h_alm); + Kokkos::deep_copy(blm, h_blm); + Kokkos::deep_copy(cl, h_cl); + Kokkos::deep_copy(dl, h_dl); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::compute_barplm(int ii, int jj, double rz, int lmax) const +{ + // requires -1 <= rz <= 1 , NO CHECKING IS PERFORMED !!!!!!!!! + // prefactors include 1/sqrt(2) factor compared to reference + + // l=0, m=0 + // plm(ii, jj, 0, 0) = Y00/sq1o4pi; //= sq1o4pi; + plm(ii, jj, 0) = Y00; //= 1; + dplm(ii, jj, 0) = 0.0; + + if (lmax > 0) { + + // l=1, m=0 + plm(ii, jj, 2) = Y00 * sq3 * rz; + dplm(ii, jj, 2) = Y00 * sq3; + + // l=1, m=1 + plm(ii, jj, 3) = -sq3o2 * Y00; + dplm(ii, jj, 3) = 0.0; + + // loop l = 2, lmax + for (int l = 2; l <= lmax; l++) { + for (int m = 0; m < l - 1; m++) { + const int idx = l * (l + 1) + m; // (l, m) + const int idx1 = (l - 1) * l + m; // (l - 1, m) + const int idx2 = (l - 2) * (l - 1) + m; // (l - 2, m) + plm(ii, jj, idx) = alm(idx) * (rz * plm(ii, jj, idx1) + blm(idx) * plm(ii, jj, idx2)); + dplm(ii, jj, idx) = alm(idx) * (plm(ii, jj, idx1) + rz * dplm(ii, jj, idx1) + blm(idx) * dplm(ii, jj, idx2)); + } + const int idx = l * (l + 1) + l; // (l, l) + const int idx1 = l * (l + 1) + l - 1; // (l, l - 1) + const int idx2 = (l - 1) * l + l - 1; // (l - 1, l - 1) + const double t = dl(l) * plm(ii, jj, idx2); + plm(ii, jj, idx1) = t * rz; + dplm(ii, jj, idx1) = t; + plm(ii, jj, idx) = cl(l) * plm(ii, jj, idx2); + dplm(ii, jj, idx) = 0.0; + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::compute_ylm(int ii, int jj, double rx, double ry, double rz, int lmax) const +{ + // requires rx^2 + ry^2 + rz^2 = 1 , NO CHECKING IS PERFORMED !!!!!!!!! + + complex phase; + complex phasem, mphasem1; + complex dyx, dyy, dyz; + complex rdy; + + phase.re = rx; + phase.im = ry; + + // compute barplm + compute_barplm(ii, jj, rz, lmax); + + // m = 0 + for (int l = 0; l <= lmax; l++) { + const int idx = l * (l + 1); + + ylm(ii, jj, idx).re = plm(ii, jj, idx); + ylm(ii, jj, idx).im = 0.0; + + dyz.re = dplm(ii, jj, idx); + rdy.re = dyz.re * rz; + + dylm(ii, jj, idx, 0).re = -rdy.re * rx; + dylm(ii, jj, idx, 0).im = 0.0; + dylm(ii, jj, idx, 1).re = -rdy.re * ry; + dylm(ii, jj, idx, 1).im = 0.0; + dylm(ii, jj, idx, 2).re = dyz.re - rdy.re * rz; + dylm(ii, jj, idx, 2).im = 0; + } + // m = 1 + for (int l = 1; l <= lmax; l++) { + const int idx = l * (l + 1) + 1; + + ylm(ii, jj, idx) = phase * plm(ii, jj, idx); + + dyx.re = plm(ii, jj, idx); + dyx.im = 0.0; + dyy.re = 0.0; + dyy.im = plm(ii, jj, idx); + dyz.re = phase.re * dplm(ii, jj, idx); + dyz.im = phase.im * dplm(ii, jj, idx); + + rdy.re = rx * dyx.re + +rz * dyz.re; + rdy.im = ry * dyy.im + rz * dyz.im; + + dylm(ii, jj, idx, 0).re = dyx.re - rdy.re * rx; + dylm(ii, jj, idx, 0).im = -rdy.im * rx; + dylm(ii, jj, idx, 1).re = -rdy.re * ry; + dylm(ii, jj, idx, 1).im = dyy.im - rdy.im * ry; + dylm(ii, jj, idx, 2).re = dyz.re - rdy.re * rz; + dylm(ii, jj, idx, 2).im = dyz.im - rdy.im * rz; + } + + // m > 1 + phasem = phase; + for (int m = 2; m <= lmax; m++) { + + mphasem1.re = phasem.re * double(m); + mphasem1.im = phasem.im * double(m); + phasem = phasem * phase; + + for (int l = m; l <= lmax; l++) { + const int idx = l * (l + 1) + m; + + ylm(ii, jj, idx).re = phasem.re * plm(ii, jj, idx); + ylm(ii, jj, idx).im = phasem.im * plm(ii, jj, idx); + + dyx = mphasem1 * plm(ii, jj, idx); + dyy.re = -dyx.im; + dyy.im = dyx.re; + dyz = phasem * dplm(ii, jj, idx); + + rdy.re = rx * dyx.re + ry * dyy.re + rz * dyz.re; + rdy.im = rx * dyx.im + ry * dyy.im + rz * dyz.im; + + dylm(ii, jj, idx, 0).re = dyx.re - rdy.re * rx; + dylm(ii, jj, idx, 0).im = dyx.im - rdy.im * rx; + dylm(ii, jj, idx, 1).re = dyy.re - rdy.re * ry; + dylm(ii, jj, idx, 1).im = dyy.im - rdy.im * ry; + dylm(ii, jj, idx, 2).re = dyz.re - rdy.re * rz; + dylm(ii, jj, idx, 2).im = dyz.im - rdy.im * rz; + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::cutoff_func_poly(const double r, const double r_in, const double delta_in, double &fc, double &dfc) const +{ + if (r <= r_in-delta_in) { + fc = 1; + dfc = 0; + } else if (r >= r_in ) { + fc = 0; + dfc = 0; + } else { + double x = 1 - 2 * (1 + (r - r_in) / delta_in); + fc = 0.5 + 7.5 / 2. * (x / 4. - pow(x, 3) / 6. + pow(x, 5) / 20.); + dfc = -7.5 / delta_in * (0.25 - x * x / 2.0 + pow(x, 4) / 4.); + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::Fexp(const double x, const double m, double &F, double &DF) const +{ + const double w = 1.e6; + const double eps = 1e-10; + + const double lambda = pow(1.0 / w, m - 1.0); + if (abs(x) > eps) { + double g; + const double a = abs(x); + const double am = pow(a, m); + const double w3x3 = pow(w * a, 3); //// use cube + const double sign_factor = (signbit(x) ? -1 : 1); + if (w3x3 > 30.0) + g = 0.0; + else + g = exp(-w3x3); + + const double omg = 1.0 - g; + F = sign_factor * (omg * am + lambda * g * a); + const double dg = -3.0 * w * w * w * a * a * g; + DF = m * pow(a, m - 1.0) * omg - am * dg + lambda * dg * a + lambda * g; + } else { + F = lambda * x; + DF = lambda; + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::FexpShiftedScaled(const double rho, const double mexp, double &F, double &DF) const +{ + const double eps = 1e-10; + + if (abs(mexp - 1.0) < eps) { + F = rho; + DF = 1; + } else { + const double a = abs(rho); + const double exprho = exp(-a); + const double nx = 1. / mexp; + const double xoff = pow(nx, (nx / (1.0 - nx))) * exprho; + const double yoff = pow(nx, (1 / (1.0 - nx))) * exprho; + const double sign_factor = (signbit(rho) ? -1 : 1); + F = sign_factor * (pow(xoff + a, mexp) - yoff); + DF = yoff + mexp * (-xoff + 1.0) * pow(xoff + a, mexp - 1.); + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::inner_cutoff(const double rho_core, const double rho_cut, const double drho_cut, + double &fcut, double &dfcut) const +{ + double rho_low = rho_cut - drho_cut; + if (rho_core >= rho_cut) { + fcut = 0; + dfcut = 0; + } else if (rho_core <= rho_low) { + fcut = 1; + dfcut = 0; + } else { + cutoff_func_poly(rho_core, rho_cut, drho_cut, fcut, dfcut); + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::FS_values_and_derivatives(const int ii, double &evdwl, const int mu_i) const +{ + double F, DF = 0; + int npoti = d_npoti(mu_i); + int ndensity = d_ndensity(mu_i); + for (int p = 0; p < ndensity; p++) { + const double wpre = d_wpre(mu_i, p); + const double mexp = d_mexp(mu_i, p); + + if (npoti == FS) + Fexp(rhos(ii, p), mexp, F, DF); + else if (npoti == FS_SHIFTEDSCALED) + FexpShiftedScaled(rhos(ii, p), mexp, F, DF); + + evdwl += F * wpre; // * weight (wpre) + dF_drho(ii, p) = DF * wpre; // * weight (wpre) + } +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::evaluate_splines(const int ii, const int jj, double r, + int /*nradbase_c*/, int /*nradial_c*/, + int mu_i, int mu_j) const +{ + auto &spline_gk = k_splines_gk.template view()(mu_i, mu_j); + auto &spline_rnl = k_splines_rnl.template view()(mu_i, mu_j); + auto &spline_hc = k_splines_hc.template view()(mu_i, mu_j); + + spline_gk.calcSplines(ii, jj, r, gr, dgr); + + spline_rnl.calcSplines(ii, jj, r, d_values, d_derivatives); + for (int kk = 0; kk < (int)fr.extent(2); kk++) { + for (int ll = 0; ll < (int)fr.extent(3); ll++) { + const int flatten = kk*fr.extent(3) + ll; + fr(ii, jj, kk, ll) = d_values(ii, jj, flatten); + dfr(ii, jj, kk, ll) = d_derivatives(ii, jj, flatten); + } + } + + spline_hc.calcSplines(ii, jj, r, d_values, d_derivatives); + cr(ii, jj) = d_values(ii, jj, 0); + dcr(ii, jj) = d_derivatives(ii, jj, 0); +} + +/* ---------------------------------------------------------------------- */ + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::SplineInterpolatorKokkos::calcSplines(const int ii, const int jj, const double r, const t_ace_3d &d_values, const t_ace_3d &d_derivatives) const +{ + double wl, wl2, wl3, w2l1, w3l2; + double c[4]; + double x = r * rscalelookup; + int nl = static_cast(floor(x)); + + if (nl <= 0) + Kokkos::abort("Encountered very small distance. Stopping."); + + if (nl < nlut) { + wl = x - double(nl); + wl2 = wl * wl; + wl3 = wl2 * wl; + w2l1 = 2.0 * wl; + w3l2 = 3.0 * wl2; + for (int func_id = 0; func_id < num_of_functions; func_id++) { + for (int idx = 0; idx < 4; idx++) + c[idx] = lookupTable(nl, func_id, idx); + d_values(ii, jj, func_id) = c[0] + c[1] * wl + c[2] * wl2 + c[3] * wl3; + d_derivatives(ii, jj, func_id) = (c[1] + c[2] * w2l1 + c[3] * w3l2) * rscalelookup; + } + } else { // fill with zeroes + for (int func_id = 0; func_id < num_of_functions; func_id++) { + d_values(ii, jj, func_id) = 0.0; + d_derivatives(ii, jj, func_id) = 0.0; + } + } +} + +/* ---------------------------------------------------------------------- */ + +template +template +void PairPACEExtrapolationKokkos::check_team_size_for(int inum, int &team_size, int vector_length) { + int team_size_max; + + team_size_max = Kokkos::TeamPolicy(inum,Kokkos::AUTO).team_size_max(*this,Kokkos::ParallelForTag()); + + if (team_size*vector_length > team_size_max) + team_size = team_size_max/vector_length; +} + +/* ---------------------------------------------------------------------- */ + +template +template +void PairPACEExtrapolationKokkos::check_team_size_reduce(int inum, int &team_size, int vector_length) { + int team_size_max; + + team_size_max = Kokkos::TeamPolicy(inum,Kokkos::AUTO).team_size_max(*this,Kokkos::ParallelReduceTag()); + + if (team_size*vector_length > team_size_max) + team_size = team_size_max/vector_length; +} + +template +template +int PairPACEExtrapolationKokkos::scratch_size_helper(int values_per_team) { + typedef Kokkos::View > ScratchViewType; + + return ScratchViewType::shmem_size(values_per_team); +} + +/* ---------------------------------------------------------------------- + memory usage of arrays +------------------------------------------------------------------------- */ + +template +double PairPACEExtrapolationKokkos::memory_usage() +{ + double bytes = 0; + + bytes += MemKK::memory_usage(A); + bytes += MemKK::memory_usage(A_rank1); + bytes += MemKK::memory_usage(A_list); + bytes += MemKK::memory_usage(A_forward_prod); + bytes += MemKK::memory_usage(e_atom); + bytes += MemKK::memory_usage(rhos); + bytes += MemKK::memory_usage(dF_drho); + bytes += MemKK::memory_usage(weights); + bytes += MemKK::memory_usage(weights_rank1); + bytes += MemKK::memory_usage(rho_core); + bytes += MemKK::memory_usage(dF_drho_core); + bytes += MemKK::memory_usage(dB_flatten); + bytes += MemKK::memory_usage(fr); + bytes += MemKK::memory_usage(dfr); + bytes += MemKK::memory_usage(gr); + bytes += MemKK::memory_usage(dgr); + bytes += MemKK::memory_usage(d_values); + bytes += MemKK::memory_usage(d_derivatives); + bytes += MemKK::memory_usage(cr); + bytes += MemKK::memory_usage(dcr); + bytes += MemKK::memory_usage(plm); + bytes += MemKK::memory_usage(dplm); + bytes += MemKK::memory_usage(ylm); + bytes += MemKK::memory_usage(dylm); + bytes += MemKK::memory_usage(d_ncount); + bytes += MemKK::memory_usage(d_mu); + bytes += MemKK::memory_usage(d_rhats); + bytes += MemKK::memory_usage(d_rnorms); + bytes += MemKK::memory_usage(d_nearest); + bytes += MemKK::memory_usage(f_ij); + bytes += MemKK::memory_usage(d_rho_core_cutoff); + bytes += MemKK::memory_usage(d_drho_core_cutoff); + bytes += MemKK::memory_usage(d_E0vals); + bytes += MemKK::memory_usage(d_ndensity); + bytes += MemKK::memory_usage(d_npoti); + bytes += MemKK::memory_usage(d_wpre); + bytes += MemKK::memory_usage(d_mexp); + bytes += MemKK::memory_usage(d_idx_rho_count); + bytes += MemKK::memory_usage(d_rank); + bytes += MemKK::memory_usage(d_num_ms_combs); + bytes += MemKK::memory_usage(d_offsets); + bytes += MemKK::memory_usage(d_mus); + bytes += MemKK::memory_usage(d_ns); + bytes += MemKK::memory_usage(d_ls); + bytes += MemKK::memory_usage(d_ms_combs); + bytes += MemKK::memory_usage(d_ctildes); + bytes += MemKK::memory_usage(alm); + bytes += MemKK::memory_usage(blm); + bytes += MemKK::memory_usage(cl); + bytes += MemKK::memory_usage(dl); + + if (k_splines_gk.h_view.data()) { + for (int i = 0; i < nelements; i++) { + for (int j = 0; j < nelements; j++) { + bytes += k_splines_gk.h_view(i, j).memory_usage(); + bytes += k_splines_rnl.h_view(i, j).memory_usage(); + bytes += k_splines_hc.h_view(i, j).memory_usage(); + } + } + } + + return bytes; +} + +/* ---------------------------------------------------------------------- */ + +namespace LAMMPS_NS { +template class PairPACEExtrapolationKokkos; +#ifdef LMP_KOKKOS_GPU +template class PairPACEExtrapolationKokkos; +#endif +} diff --git a/src/KOKKOS/pair_pace_extrapolation_kokkos.h b/src/KOKKOS/pair_pace_extrapolation_kokkos.h new file mode 100644 index 0000000000..482d068725 --- /dev/null +++ b/src/KOKKOS/pair_pace_extrapolation_kokkos.h @@ -0,0 +1,334 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS +// clang-format off +PairStyle(pace/extrapolation/kk,PairPACEExtrapolationKokkos); +PairStyle(pace/extrapolation/kk/device,PairPACEExtrapolationKokkos); +PairStyle(pace/extrapolation/kk/host,PairPACEExtrapolationKokkos); +// clang-format on +#else + +// clang-format off +#ifndef LMP_PAIR_PACE_EXTRAPOLATION_KOKKOS_H +#define LMP_PAIR_PACE_EXTRAPOLATION_KOKKOS_H + +#include "pair_pace.h" +#include "ace-evaluator/ace_radial.h" +#include "kokkos_type.h" +#include "pair_kokkos.h" + +namespace LAMMPS_NS { + +template +class PairPACEExtrapolationKokkos : public PairPACE { + public: + struct TagPairPACEComputeNeigh{}; + struct TagPairPACEComputeRadial{}; + struct TagPairPACEComputeYlm{}; + struct TagPairPACEComputeAi{}; + struct TagPairPACEConjugateAi{}; + struct TagPairPACEComputeRho{}; + struct TagPairPACEComputeFS{}; + struct TagPairPACEComputeWeights{}; + struct TagPairPACEComputeDerivative{}; + + template + struct TagPairPACEComputeForce{}; + + typedef DeviceType device_type; + typedef ArrayTypes AT; + typedef EV_FLOAT value_type; + using complex = SNAComplex; + + PairPACEExtrapolationKokkos(class LAMMPS *); + ~PairPACEExtrapolationKokkos() override; + + void compute(int, int) override; + void coeff(int, char **) override; + void init_style() override; + double init_one(int, int) override; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairPACEComputeNeigh,const typename Kokkos::TeamPolicy::member_type& team) const; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairPACEComputeRadial,const typename Kokkos::TeamPolicy::member_type& team) const; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairPACEComputeYlm,const typename Kokkos::TeamPolicy::member_type& team) const; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairPACEComputeAi,const typename Kokkos::TeamPolicy::member_type& team) const; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairPACEConjugateAi,const int& ii) const; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairPACEComputeRho,const int& iter) const; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairPACEComputeFS,const int& ii) const; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairPACEComputeWeights,const int& iter) const; + + KOKKOS_INLINE_FUNCTION + void operator() (TagPairPACEComputeDerivative,const typename Kokkos::TeamPolicy::member_type& team) const; + + template + KOKKOS_INLINE_FUNCTION + void operator() (TagPairPACEComputeForce,const int& ii) const; + + template + KOKKOS_INLINE_FUNCTION + void operator() (TagPairPACEComputeForce,const int& ii, EV_FLOAT&) const; + + protected: + int inum, maxneigh, chunk_size, chunk_offset, idx_rho_max; + int host_flag; + + int eflag, vflag; + + int neighflag, max_ndensity; + int nelements, lmax, nradmax, nradbase; + + typename AT::t_neighbors_2d d_neighbors; + typename AT::t_int_1d_randomread d_ilist; + typename AT::t_int_1d_randomread d_numneigh; + + DAT::tdual_efloat_1d k_eatom; + DAT::tdual_virial_array k_vatom; + typename AT::t_efloat_1d d_eatom; + typename AT::t_virial_array d_vatom; + + typename AT::t_x_array_randomread x; + typename AT::t_f_array f; + typename AT::t_int_1d_randomread type; + + typedef Kokkos::DualView tdual_fparams; + tdual_fparams k_cutsq, k_scale; + typedef Kokkos::View t_fparams; + t_fparams d_cutsq, d_scale; + + typename AT::t_int_1d d_map; + + int need_dup; + + using KKDeviceType = typename KKDevice::value; + + template + using DupScatterView = KKScatterView; + + template + using NonDupScatterView = KKScatterView; + + DupScatterView dup_f; + DupScatterView dup_vatom; + + NonDupScatterView ndup_f; + NonDupScatterView ndup_vatom; + + friend void pair_virial_fdotr_compute(PairPACEExtrapolationKokkos*); + + void grow(int, int); + void copy_pertype(); + void copy_splines(); + void copy_tilde(); + void allocate() override; + void precompute_harmonics(); + double memory_usage() override; + + template + KOKKOS_INLINE_FUNCTION + void v_tally_xyz(EV_FLOAT &ev, const int &i, const int &j, + const F_FLOAT &fx, const F_FLOAT &fy, const F_FLOAT &fz, + const F_FLOAT &delx, const F_FLOAT &dely, const F_FLOAT &delz) const; + + KOKKOS_INLINE_FUNCTION + void compute_barplm(int, int, double, int) const; + + KOKKOS_INLINE_FUNCTION + void compute_ylm(int, int, double, double, double, int) const; + + KOKKOS_INLINE_FUNCTION + void cutoff_func_poly(const double, const double, const double, double &, double &) const; + + KOKKOS_INLINE_FUNCTION + void Fexp(const double, const double, double &, double &) const; + + KOKKOS_INLINE_FUNCTION + void FexpShiftedScaled(const double, const double, double &, double &) const; + + KOKKOS_INLINE_FUNCTION + void inner_cutoff(const double, const double, const double, double &, double &) const; + + KOKKOS_INLINE_FUNCTION + void FS_values_and_derivatives(const int, double&, const int) const; + + KOKKOS_INLINE_FUNCTION + void evaluate_splines(const int, const int, double, int, int, int, int) const; + + template + void check_team_size_for(int, int&, int); + + template + void check_team_size_reduce(int, int&, int); + + // Utility routine which wraps computing per-team scratch size requirements for + // ComputeNeigh, ComputeUi, and ComputeFusedDeidrj + template + int scratch_size_helper(int values_per_team); + + typedef Kokkos::View t_ace_1i; + typedef Kokkos::View t_ace_2i; + typedef Kokkos::View t_ace_3i; + typedef Kokkos::View t_ace_4i; + typedef Kokkos::View t_ace_1d; + typedef Kokkos::View t_ace_2d; + typedef Kokkos::View t_ace_2d3; + typedef Kokkos::View t_ace_3d; + typedef Kokkos::View t_ace_3d3; + typedef Kokkos::View t_ace_3d4; + typedef Kokkos::View t_ace_4d; + typedef Kokkos::View t_ace_1c; + typedef Kokkos::View t_ace_2c; + typedef Kokkos::View t_ace_3c; + typedef Kokkos::View t_ace_3c3; + typedef Kokkos::View t_ace_4c; + typedef Kokkos::View t_ace_4c3; + + t_ace_3d A_rank1; + t_ace_4c A; + + t_ace_3c A_list; + t_ace_3c A_forward_prod; + + t_ace_3d weights_rank1; + t_ace_4c weights; + + t_ace_1d e_atom; + t_ace_2d rhos; + t_ace_2d dF_drho; + + // hard-core repulsion + t_ace_1d rho_core; + t_ace_3c dB_flatten; + t_ace_2d cr; + t_ace_2d dcr; + t_ace_1d dF_drho_core; + + // radial functions + t_ace_4d fr; + t_ace_4d dfr; + t_ace_3d gr; + t_ace_3d dgr; + t_ace_3d d_values; + t_ace_3d d_derivatives; + + // Spherical Harmonics + + void pre_compute_harmonics(int); + + KOKKOS_INLINE_FUNCTION + void compute_barplm(double rz, int lmaxi); + + KOKKOS_INLINE_FUNCTION + void compute_ylm(double rx, double ry, double rz, int lmaxi); + + t_ace_1d alm; + t_ace_1d blm; + t_ace_1d cl; + t_ace_1d dl; + + t_ace_3d plm; + t_ace_3d dplm; + + t_ace_3c ylm; + t_ace_4c3 dylm; + + // short neigh list + t_ace_1i d_ncount; + t_ace_2d d_mu; + t_ace_2d d_rnorms; + t_ace_3d3 d_rhats; + t_ace_2i d_nearest; + + // per-type + t_ace_1i d_ndensity; + t_ace_1i d_npoti; + t_ace_1d d_rho_core_cutoff; + t_ace_1d d_drho_core_cutoff; + t_ace_1d d_E0vals; + t_ace_2d d_wpre; + t_ace_2d d_mexp; + + // tilde + t_ace_1i d_idx_rho_count; + t_ace_2i d_rank; + t_ace_2i d_num_ms_combs; + t_ace_2i d_offsets; + t_ace_3i d_mus; + t_ace_3i d_ns; + t_ace_3i d_ls; + t_ace_3i d_ms_combs; + t_ace_3d d_ctildes; + + t_ace_3d3 f_ij; + + public: + struct SplineInterpolatorKokkos { + int ntot, nlut, num_of_functions; + double cutoff, deltaSplineBins, invrscalelookup, rscalelookup; + + t_ace_3d4 lookupTable; + + void operator=(const SplineInterpolator &spline) { + cutoff = spline.cutoff; + deltaSplineBins = spline.deltaSplineBins; + ntot = spline.ntot; + nlut = spline.nlut; + invrscalelookup = spline.invrscalelookup; + rscalelookup = spline.rscalelookup; + num_of_functions = spline.num_of_functions; + + lookupTable = t_ace_3d4("lookupTable", ntot+1, num_of_functions); + auto h_lookupTable = Kokkos::create_mirror_view(lookupTable); + for (int i = 0; i < ntot+1; i++) + for (int j = 0; j < num_of_functions; j++) + for (int k = 0; k < 4; k++) + h_lookupTable(i, j, k) = spline.lookupTable(i, j, k); + Kokkos::deep_copy(lookupTable, h_lookupTable); + } + + void deallocate() { + lookupTable = t_ace_3d4(); + } + + double memory_usage() { + return lookupTable.span() * sizeof(typename decltype(lookupTable)::value_type); + } + + KOKKOS_INLINE_FUNCTION + void calcSplines(const int ii, const int jj, const double r, const t_ace_3d &d_values, const t_ace_3d &d_derivatives) const; + }; + + Kokkos::DualView k_splines_gk; + Kokkos::DualView k_splines_rnl; + Kokkos::DualView k_splines_hc; + +}; +} // namespace LAMMPS_NS + +#endif +#endif From 1b92569187093deb1f620d33363e9000d00c4a79 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Mon, 2 Jan 2023 18:29:12 +0100 Subject: [PATCH 37/47] WIP: pair_pace_extrapolation_kokkos.h/cpp: - rename idx_rho_max -> idx_ms_combs_max, d_idx_rho_count ->d_idx_ms_combs_count, d_offsets->d_func_inds - remove d_ctildes, add d_gen_cgs and d_coeffs - use ACEBBasisFunction - update TagPairPACEComputeRho and TagPairPACEComputeWeights - pair_pace_extrapolation.h/cpp: add chunksize option --- src/KOKKOS/pair_pace_extrapolation_kokkos.cpp | 249 ++++++++++-------- src/KOKKOS/pair_pace_extrapolation_kokkos.h | 14 +- src/ML-PACE/pair_pace_extrapolation.cpp | 22 +- src/ML-PACE/pair_pace_extrapolation.h | 4 +- 4 files changed, 164 insertions(+), 125 deletions(-) diff --git a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp index b4f4932db4..006cf5e609 100644 --- a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp +++ b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp @@ -34,19 +34,30 @@ #include "ace-evaluator/ace_recursive.h" #include "ace-evaluator/ace_version.h" #include "ace-evaluator/ace_radial.h" + +#include "ace/ace_b_basis.h" +#include "ace/ace_b_evaluator.h" + #include namespace LAMMPS_NS { -struct ACEImpl { - ACEImpl() : basis_set(nullptr), ace(nullptr) {} - ~ACEImpl() - { - delete basis_set; - delete ace; - } - ACECTildeBasisSet *basis_set; - ACERecursiveEvaluator *ace; -}; + struct ACEALImpl { + ACEALImpl() : basis_set(nullptr), ace(nullptr), ctilde_basis_set(nullptr), rec_ace(nullptr) {} + + ~ACEALImpl() + { + delete basis_set; + delete ace; + + delete ctilde_basis_set; + delete rec_ace; + } + + ACEBBasisSet *basis_set; + ACEBEvaluator *ace; + ACECTildeBasisSet *ctilde_basis_set; + ACERecursiveEvaluator *rec_ace; + }; } // namespace LAMMPS_NS using namespace LAMMPS_NS; @@ -57,7 +68,7 @@ enum{FS,FS_SHIFTEDSCALED}; /* ---------------------------------------------------------------------- */ template -PairPACEExtrapolationKokkos::PairPACEExtrapolationKokkos(LAMMPS *lmp) : PairPACE(lmp) +PairPACEExtrapolationKokkos::PairPACEExtrapolationKokkos(LAMMPS *lmp) : PairPACEExtrapolation(lmp) { respa_enable = 0; @@ -107,9 +118,9 @@ void PairPACEExtrapolationKokkos::grow(int natom, int maxneigh) MemKK::realloc_kokkos(A, "pace:A", natom, nelements, nradmax + 1, (lmax + 1) * (lmax + 1)); MemKK::realloc_kokkos(A_rank1, "pace:A_rank1", natom, nelements, nradbase); - MemKK::realloc_kokkos(A_list, "pace:A_list", natom, idx_rho_max, basis_set->rankmax); + MemKK::realloc_kokkos(A_list, "pace:A_list", natom, idx_ms_combs_max, basis_set->rankmax); //size is +1 of max to avoid out-of-boundary array access in double-triangular scheme - MemKK::realloc_kokkos(A_forward_prod, "pace:A_forward_prod", natom, idx_rho_max, basis_set->rankmax + 1); + MemKK::realloc_kokkos(A_forward_prod, "pace:A_forward_prod", natom, idx_ms_combs_max, basis_set->rankmax + 1); MemKK::realloc_kokkos(e_atom, "pace:e_atom", natom); MemKK::realloc_kokkos(rhos, "pace:rhos", natom, basis_set->ndensitymax + 1); // +1 density for core repulsion @@ -121,7 +132,7 @@ void PairPACEExtrapolationKokkos::grow(int natom, int maxneigh) // hard-core repulsion MemKK::realloc_kokkos(rho_core, "pace:rho_core", natom); MemKK::realloc_kokkos(dF_drho_core, "pace:dF_drho_core", natom); - MemKK::realloc_kokkos(dB_flatten, "pace:dB_flatten", natom, idx_rho_max, basis_set->rankmax); + MemKK::realloc_kokkos(dB_flatten, "pace:dB_flatten", natom, idx_ms_combs_max, basis_set->rankmax); } if (((int)ylm.extent(0) < natom) || ((int)ylm.extent(1) < maxneigh)) { @@ -263,120 +274,134 @@ void PairPACEExtrapolationKokkos::copy_tilde() // flatten loops, get per-element count and max - idx_rho_max = 0; + idx_ms_combs_max = 0; int total_basis_size_max = 0; - MemKK::realloc_kokkos(d_idx_rho_count, "pace:idx_rho_count", nelements); - auto h_idx_rho_count = Kokkos::create_mirror_view(d_idx_rho_count); + MemKK::realloc_kokkos(d_idx_ms_combs_count, "pace:idx_ms_combs_count", nelements); + auto h_idx_ms_combs_count = Kokkos::create_mirror_view(d_idx_ms_combs_count); - for (int n = 0; n < nelements; n++) { - int idx_rho = 0; - const int total_basis_size_rank1 = basis_set->total_basis_size_rank1[n]; - const int total_basis_size = basis_set->total_basis_size[n]; + for (int mu = 0; mu < nelements; mu++) { + int idx_ms_combs = 0; + const int total_basis_size_rank1 = basis_set->total_basis_size_rank1[mu]; + const int total_basis_size = basis_set->total_basis_size[mu]; - ACECTildeBasisFunction *basis = basis_set->basis[n]; + ACEBBasisFunction *basis = basis_set->basis[mu]; // rank=1 for (int func_rank1_ind = 0; func_rank1_ind < total_basis_size_rank1; ++func_rank1_ind) - idx_rho++; + idx_ms_combs++; // rank > 1 for (int func_ind = 0; func_ind < total_basis_size; ++func_ind) { - ACECTildeBasisFunction *func = &basis[func_ind]; + ACEBBasisFunction *func = &basis[func_ind]; // loop over {ms} combinations in sum for (int ms_ind = 0; ms_ind < func->num_ms_combs; ++ms_ind) - idx_rho++; + idx_ms_combs++; } - h_idx_rho_count(n) = idx_rho; - idx_rho_max = MAX(idx_rho_max, idx_rho); + h_idx_ms_combs_count(mu) = idx_ms_combs; + idx_ms_combs_max = MAX(idx_ms_combs_max, idx_ms_combs); total_basis_size_max = MAX(total_basis_size_max, total_basis_size_rank1 + total_basis_size); } - Kokkos::deep_copy(d_idx_rho_count, h_idx_rho_count); + Kokkos::deep_copy(d_idx_ms_combs_count, h_idx_ms_combs_count); MemKK::realloc_kokkos(d_rank, "pace:rank", nelements, total_basis_size_max); MemKK::realloc_kokkos(d_num_ms_combs, "pace:num_ms_combs", nelements, total_basis_size_max); - MemKK::realloc_kokkos(d_offsets, "pace:offsets", nelements, idx_rho_max); + MemKK::realloc_kokkos(d_func_inds, "pace:func_inds", nelements, idx_ms_combs_max); MemKK::realloc_kokkos(d_mus, "pace:mus", nelements, total_basis_size_max, basis_set->rankmax); MemKK::realloc_kokkos(d_ns, "pace:ns", nelements, total_basis_size_max, basis_set->rankmax); MemKK::realloc_kokkos(d_ls, "pace:ls", nelements, total_basis_size_max, basis_set->rankmax); - MemKK::realloc_kokkos(d_ms_combs, "pace:ms_combs", nelements, idx_rho_max, basis_set->rankmax); - MemKK::realloc_kokkos(d_ctildes, "pace:ctildes", nelements, idx_rho_max, basis_set->ndensitymax); + MemKK::realloc_kokkos(d_ms_combs, "pace:ms_combs", nelements, idx_ms_combs_max, basis_set->rankmax); + //MemKK::realloc_kokkos(d_ctildes, "pace:ctildes", nelements, idx_ms_combs_max, basis_set->ndensitymax); + MemKK::realloc_kokkos(d_gen_cgs, "pace:gen_cgs", nelements, idx_ms_combs_max); + MemKK::realloc_kokkos(d_coeffs, "pace:coeffs", nelements, total_basis_size_max, basis_set->ndensitymax); auto h_rank = Kokkos::create_mirror_view(d_rank); auto h_num_ms_combs = Kokkos::create_mirror_view(d_num_ms_combs); - auto h_offsets = Kokkos::create_mirror_view(d_offsets); + auto h_func_inds = Kokkos::create_mirror_view(d_func_inds); auto h_mus = Kokkos::create_mirror_view(d_mus); auto h_ns = Kokkos::create_mirror_view(d_ns); auto h_ls = Kokkos::create_mirror_view(d_ls); auto h_ms_combs = Kokkos::create_mirror_view(d_ms_combs); - auto h_ctildes = Kokkos::create_mirror_view(d_ctildes); +// auto h_ctildes = Kokkos::create_mirror_view(d_ctildes); + auto h_gen_cgs = Kokkos::create_mirror_view(d_gen_cgs); + auto h_coeffs = Kokkos::create_mirror_view(d_coeffs); // copy values on host - for (int n = 0; n < nelements; n++) { - const int total_basis_size_rank1 = basis_set->total_basis_size_rank1[n]; - const int total_basis_size = basis_set->total_basis_size[n]; + for (int mu = 0; mu < nelements; mu++) { + const int total_basis_size_rank1 = basis_set->total_basis_size_rank1[mu]; + const int total_basis_size = basis_set->total_basis_size[mu]; - ACECTildeBasisFunction *basis_rank1 = basis_set->basis_rank1[n]; - ACECTildeBasisFunction *basis = basis_set->basis[n]; + ACEBBasisFunction *basis_rank1 = basis_set->basis_rank1[mu]; + ACEBBasisFunction *basis = basis_set->basis[mu]; - const int ndensity = basis_set->map_embedding_specifications.at(n).ndensity; + const int ndensity = basis_set->map_embedding_specifications.at(mu).ndensity; - int idx_rho = 0; + int idx_ms_comb = 0; // rank=1 - for (int offset = 0; offset < total_basis_size_rank1; ++offset) { - ACECTildeBasisFunction *func = &basis_rank1[offset]; - h_rank(n, offset) = 1; - h_mus(n, offset, 0) = func->mus[0]; - h_ns(n, offset, 0) = func->ns[0]; - for (int p = 0; p < ndensity; p++) - h_ctildes(n, idx_rho, p) = func->ctildes[p]; - h_offsets(n, idx_rho) = offset; - idx_rho++; + for (int func_ind = 0; func_ind < total_basis_size_rank1; ++func_ind) { + ACEBBasisFunction *func = &basis_rank1[func_ind]; + h_rank(mu, func_ind) = 1; + h_mus(mu, func_ind, 0) = func->mus[0]; + h_ns(mu, func_ind, 0) = func->ns[0]; + + for (int p = 0; p < ndensity; ++p) + h_coeffs(mu, func_ind, p) = func->coeff[p]; + + h_gen_cgs(mu, idx_ms_comb) = func->gen_cgs[0]; + + h_func_inds(mu, idx_ms_comb) = func_ind; + idx_ms_comb++; } // rank > 1 for (int func_ind = 0; func_ind < total_basis_size; ++func_ind) { - ACECTildeBasisFunction *func = &basis[func_ind]; + ACEBBasisFunction *func = &basis[func_ind]; // TODO: check if func->ctildes are zero, then skip - const int offset = total_basis_size_rank1 + func_ind; + const int func_ind_through = total_basis_size_rank1 + func_ind; - const int rank = h_rank(n, offset) = func->rank; - h_num_ms_combs(n, offset) = func->num_ms_combs; + const int rank = h_rank(mu, func_ind_through) = func->rank; + h_num_ms_combs(mu, func_ind_through) = func->num_ms_combs; for (int t = 0; t < rank; t++) { - h_mus(n, offset, t) = func->mus[t]; - h_ns(n, offset, t) = func->ns[t]; - h_ls(n, offset, t) = func->ls[t]; + h_mus(mu, func_ind_through, t) = func->mus[t]; + h_ns(mu, func_ind_through, t) = func->ns[t]; + h_ls(mu, func_ind_through, t) = func->ls[t]; } + for (int p = 0; p < ndensity; ++p) + h_coeffs(mu, func_ind_through, p) = func->coeff[p]; + + // loop over {ms} combinations in sum for (int ms_ind = 0; ms_ind < func->num_ms_combs; ++ms_ind) { auto ms = &func->ms_combs[ms_ind * rank]; // current ms-combination (of length = rank) for (int t = 0; t < rank; t++) - h_ms_combs(n, idx_rho, t) = ms[t]; + h_ms_combs(mu, idx_ms_comb, t) = ms[t]; - for (int p = 0; p < ndensity; ++p) { - // real-part only multiplication - h_ctildes(n, idx_rho, p) = func->ctildes[ms_ind * ndensity + p]; - } - h_offsets(n, idx_rho) = offset; - idx_rho++; + + h_gen_cgs(mu, idx_ms_comb) = func->gen_cgs[ms_ind]; + + + h_func_inds(mu, idx_ms_comb) = func_ind_through; + idx_ms_comb++; } } } Kokkos::deep_copy(d_rank, h_rank); Kokkos::deep_copy(d_num_ms_combs, h_num_ms_combs); - Kokkos::deep_copy(d_offsets, h_offsets); + Kokkos::deep_copy(d_func_inds, h_func_inds); Kokkos::deep_copy(d_mus, h_mus); Kokkos::deep_copy(d_ns, h_ns); Kokkos::deep_copy(d_ls, h_ls); Kokkos::deep_copy(d_ms_combs, h_ms_combs); - Kokkos::deep_copy(d_ctildes, h_ctildes); +// Kokkos::deep_copy(d_ctildes, h_ctildes); + Kokkos::deep_copy(d_gen_cgs, h_gen_cgs); + Kokkos::deep_copy(d_coeffs, h_coeffs); } /* ---------------------------------------------------------------------- @@ -391,7 +416,7 @@ void PairPACEExtrapolationKokkos::init_style() error->all(FLERR,"Pair style pace/kk can currently only run on a single " "CPU thread"); - PairPACE::init_style(); + PairPACEExtrapolation::init_style(); return; } @@ -436,7 +461,7 @@ void PairPACEExtrapolationKokkos::init_style() template double PairPACEExtrapolationKokkos::init_one(int i, int j) { - double cutone = PairPACE::init_one(i,j); + double cutone = PairPACEExtrapolation::init_one(i,j); k_scale.h_view(i,j) = k_scale.h_view(j,i) = scale[i][j]; k_scale.template modify(); @@ -454,7 +479,7 @@ double PairPACEExtrapolationKokkos::init_one(int i, int j) template void PairPACEExtrapolationKokkos::coeff(int narg, char **arg) { - PairPACE::coeff(narg,arg); + PairPACEExtrapolation::coeff(narg,arg); // Set up element lists @@ -471,7 +496,7 @@ void PairPACEExtrapolationKokkos::coeff(int narg, char **arg) template void PairPACEExtrapolationKokkos::allocate() { - PairPACE::allocate(); + PairPACEExtrapolation::allocate(); int n = atom->ntypes + 1; MemKK::realloc_kokkos(d_map, "pace:map", n); @@ -508,11 +533,10 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in { if (host_flag) { atomKK->sync(Host,X_MASK|TYPE_MASK); - PairPACE::compute(eflag_in,vflag_in); + PairPACEExtrapolation::compute(eflag_in,vflag_in); atomKK->modified(Host,F_MASK); return; } - eflag = eflag_in; vflag = vflag_in; @@ -521,7 +545,6 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary - if (eflag_atom) { memoryKK->destroy_kokkos(k_eatom,eatom); memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); @@ -532,14 +555,10 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in memoryKK->create_kokkos(k_vatom,vatom,maxvatom,"pair:vatom"); d_vatom = k_vatom.view(); } - copymode = 1; if (!force->newton_pair) error->all(FLERR,"PairPACEExtrapolationKokkos requires 'newton on'"); - if (recursive) - error->all(FLERR,"Must use 'product' algorithm with pair pace/kk on the GPU"); - atomKK->sync(execution_space,X_MASK|F_MASK|TYPE_MASK); x = atomKK->k_x.view(); f = atomKK->k_f.view(); @@ -636,7 +655,7 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in //ComputeRho { - typename Kokkos::RangePolicy policy_rho(0,chunk_size*idx_rho_max); + typename Kokkos::RangePolicy policy_rho(0, chunk_size * idx_ms_combs_max); Kokkos::parallel_for("ComputeRho",policy_rho,*this); } @@ -648,7 +667,7 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in //ComputeWeights { - typename Kokkos::RangePolicy policy_weights(0,chunk_size*idx_rho_max); + typename Kokkos::RangePolicy policy_weights(0, chunk_size * idx_ms_combs_max); Kokkos::parallel_for("ComputeWeights",policy_weights,*this); } @@ -910,63 +929,63 @@ template KOKKOS_INLINE_FUNCTION void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeRho, const int& iter) const { - const int idx_rho = iter / chunk_size; + const int idx_ms_comb = iter / chunk_size; const int ii = iter % chunk_size; const int i = d_ilist[ii + chunk_offset]; const int mu_i = d_map(type(i)); - if (idx_rho >= d_idx_rho_count(mu_i)) return; + if (idx_ms_comb >= d_idx_ms_combs_count(mu_i)) return; const int ndensity = d_ndensity(mu_i); - const int offset = d_offsets(mu_i, idx_rho); - const int rank = d_rank(mu_i, offset); + const int func_ind = d_func_inds(mu_i, idx_ms_comb); + const int rank = d_rank(mu_i, func_ind); const int r = rank - 1; // Basis functions B with iterative product and density rho(p) calculation if (rank == 1) { - const int mu = d_mus(mu_i, offset, 0); - const int n = d_ns(mu_i, offset, 0); + const int mu = d_mus(mu_i, func_ind, 0); + const int n = d_ns(mu_i, func_ind, 0); double A_cur = A_rank1(ii, mu, n - 1); for (int p = 0; p < ndensity; ++p) { //for rank=1 (r=0) only 1 ms-combination exists (ms_ind=0), so index of func.ctildes is 0..ndensity-1 - Kokkos::atomic_add(&rhos(ii, p), d_ctildes(mu_i, idx_rho, p) * A_cur); + Kokkos::atomic_add(&rhos(ii, p), d_coeffs(mu_i, func_ind, p) * d_gen_cgs(mu_i, idx_ms_comb) * A_cur); } } else { // rank > 1 // loop over {ms} combinations in sum // loop over m, collect B = product of A with given ms - A_forward_prod(ii, idx_rho, 0) = complex::one(); + A_forward_prod(ii, idx_ms_comb, 0) = complex::one(); // fill forward A-product triangle for (int t = 0; t < rank; t++) { //TODO: optimize ns[t]-1 -> ns[t] during functions construction - const int mu = d_mus(mu_i, offset, t); - const int n = d_ns(mu_i, offset, t); - const int l = d_ls(mu_i, offset, t); - const int m = d_ms_combs(mu_i, idx_rho, t); // current ms-combination (of length = rank) + const int mu = d_mus(mu_i, func_ind, t); + const int n = d_ns(mu_i, func_ind, t); + const int l = d_ls(mu_i, func_ind, t); + const int m = d_ms_combs(mu_i, idx_ms_comb, t); // current ms-combination (of length = rank) const int idx = l * (l + 1) + m; // (l, m) - A_list(ii, idx_rho, t) = A(ii, mu, n - 1, idx); - A_forward_prod(ii, idx_rho, t + 1) = A_forward_prod(ii, idx_rho, t) * A_list(ii, idx_rho, t); + A_list(ii, idx_ms_comb, t) = A(ii, mu, n - 1, idx); + A_forward_prod(ii, idx_ms_comb, t + 1) = A_forward_prod(ii, idx_ms_comb, t) * A_list(ii, idx_ms_comb, t); } complex A_backward_prod = complex::one(); // fill backward A-product triangle for (int t = r; t >= 1; t--) { - const complex dB = A_forward_prod(ii, idx_rho, t) * A_backward_prod; // dB - product of all A's except t-th - dB_flatten(ii, idx_rho, t) = dB; + const complex dB = A_forward_prod(ii, idx_ms_comb, t) * A_backward_prod; // dB - product of all A's except t-th + dB_flatten(ii, idx_ms_comb, t) = dB; - A_backward_prod = A_backward_prod * A_list(ii, idx_rho, t); + A_backward_prod = A_backward_prod * A_list(ii, idx_ms_comb, t); } - dB_flatten(ii, idx_rho, 0) = A_forward_prod(ii, idx_rho, 0) * A_backward_prod; + dB_flatten(ii, idx_ms_comb, 0) = A_forward_prod(ii, idx_ms_comb, 0) * A_backward_prod; - const complex B = A_forward_prod(ii, idx_rho, rank); + const complex B = A_forward_prod(ii, idx_ms_comb, rank); for (int p = 0; p < ndensity; ++p) { // real-part only multiplication - Kokkos::atomic_add(&rhos(ii, p), B.real_part_product(d_ctildes(mu_i, idx_rho, p))); + Kokkos::atomic_add(&rhos(ii, p), B.real_part_product(d_coeffs(mu_i, func_ind, p) * d_gen_cgs(mu_i, idx_ms_comb))); } } } @@ -1011,43 +1030,43 @@ template KOKKOS_INLINE_FUNCTION void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeWeights, const int& iter) const { - const int idx_rho = iter / chunk_size; + const int idx_ms_comb = iter / chunk_size; const int ii = iter % chunk_size; const int i = d_ilist[ii + chunk_offset]; const int mu_i = d_map(type(i)); - if (idx_rho >= d_idx_rho_count(mu_i)) return; + if (idx_ms_comb >= d_idx_ms_combs_count(mu_i)) return; const int ndensity = d_ndensity(mu_i); - const int offset = d_offsets(mu_i, idx_rho); - const int rank = d_rank(mu_i, offset); + const int func_ind = d_func_inds(mu_i, idx_ms_comb); + const int rank = d_rank(mu_i, func_ind); // Weights and theta calculation if (rank == 1) { - const int mu = d_mus(mu_i, offset, 0); - const int n = d_ns(mu_i, offset, 0); + const int mu = d_mus(mu_i, func_ind, 0); + const int n = d_ns(mu_i, func_ind, 0); double theta = 0.0; for (int p = 0; p < ndensity; ++p) { // for rank=1 (r=0) only 1 ms-combination exists (ms_ind=0), so index of func.ctildes is 0..ndensity-1 - theta += dF_drho(ii, p) * d_ctildes(mu_i, idx_rho, p); + theta += dF_drho(ii, p) * d_coeffs(mu_i, func_ind, p) * d_gen_cgs(mu_i, idx_ms_comb); } Kokkos::atomic_add(&weights_rank1(ii, mu, n - 1), theta); } else { // rank > 1 double theta = 0.0; for (int p = 0; p < ndensity; ++p) - theta += dF_drho(ii, p) * d_ctildes(mu_i, idx_rho, p); + theta += dF_drho(ii, p) * d_coeffs(mu_i, func_ind, p) * d_gen_cgs(mu_i, idx_ms_comb); theta *= 0.5; // 0.5 factor due to possible double counting ??? for (int t = 0; t < rank; ++t) { - const int m_t = d_ms_combs(mu_i, idx_rho, t); + const int m_t = d_ms_combs(mu_i, idx_ms_comb, t); const int factor = (m_t % 2 == 0 ? 1 : -1); - const complex dB = dB_flatten(ii, idx_rho, t); - const int mu_t = d_mus(mu_i, offset, t); - const int n_t = d_ns(mu_i, offset, t); - const int l_t = d_ls(mu_i, offset, t); + const complex dB = dB_flatten(ii, idx_ms_comb, t); + const int mu_t = d_mus(mu_i, func_ind, t); + const int n_t = d_ns(mu_i, func_ind, t); + const int l_t = d_ls(mu_i, func_ind, t); const int idx = l_t * (l_t + 1) + m_t; // (l, m) const complex value = theta * dB; Kokkos::atomic_add(&(weights(ii, mu_t, n_t - 1, idx).re), value.re); @@ -1687,15 +1706,17 @@ double PairPACEExtrapolationKokkos::memory_usage() bytes += MemKK::memory_usage(d_npoti); bytes += MemKK::memory_usage(d_wpre); bytes += MemKK::memory_usage(d_mexp); - bytes += MemKK::memory_usage(d_idx_rho_count); + bytes += MemKK::memory_usage(d_idx_ms_combs_count); bytes += MemKK::memory_usage(d_rank); bytes += MemKK::memory_usage(d_num_ms_combs); - bytes += MemKK::memory_usage(d_offsets); + bytes += MemKK::memory_usage(d_func_inds); bytes += MemKK::memory_usage(d_mus); bytes += MemKK::memory_usage(d_ns); bytes += MemKK::memory_usage(d_ls); bytes += MemKK::memory_usage(d_ms_combs); - bytes += MemKK::memory_usage(d_ctildes); +// bytes += MemKK::memory_usage(d_ctildes); + bytes += MemKK::memory_usage(d_gen_cgs); + bytes += MemKK::memory_usage(d_coeffs); bytes += MemKK::memory_usage(alm); bytes += MemKK::memory_usage(blm); bytes += MemKK::memory_usage(cl); diff --git a/src/KOKKOS/pair_pace_extrapolation_kokkos.h b/src/KOKKOS/pair_pace_extrapolation_kokkos.h index 482d068725..568d12b90c 100644 --- a/src/KOKKOS/pair_pace_extrapolation_kokkos.h +++ b/src/KOKKOS/pair_pace_extrapolation_kokkos.h @@ -23,7 +23,7 @@ PairStyle(pace/extrapolation/kk/host,PairPACEExtrapolationKokkos); #ifndef LMP_PAIR_PACE_EXTRAPOLATION_KOKKOS_H #define LMP_PAIR_PACE_EXTRAPOLATION_KOKKOS_H -#include "pair_pace.h" +#include "pair_pace_extrapolation.h" #include "ace-evaluator/ace_radial.h" #include "kokkos_type.h" #include "pair_kokkos.h" @@ -31,7 +31,7 @@ PairStyle(pace/extrapolation/kk/host,PairPACEExtrapolationKokkos); namespace LAMMPS_NS { template -class PairPACEExtrapolationKokkos : public PairPACE { +class PairPACEExtrapolationKokkos : public PairPACEExtrapolation { public: struct TagPairPACEComputeNeigh{}; struct TagPairPACEComputeRadial{}; @@ -95,7 +95,7 @@ class PairPACEExtrapolationKokkos : public PairPACE { void operator() (TagPairPACEComputeForce,const int& ii, EV_FLOAT&) const; protected: - int inum, maxneigh, chunk_size, chunk_offset, idx_rho_max; + int inum, maxneigh, chunk_size, chunk_offset, idx_ms_combs_max; int host_flag; int eflag, vflag; @@ -274,15 +274,17 @@ class PairPACEExtrapolationKokkos : public PairPACE { t_ace_2d d_mexp; // tilde - t_ace_1i d_idx_rho_count; + t_ace_1i d_idx_ms_combs_count; t_ace_2i d_rank; t_ace_2i d_num_ms_combs; - t_ace_2i d_offsets; + t_ace_2i d_func_inds; t_ace_3i d_mus; t_ace_3i d_ns; t_ace_3i d_ls; t_ace_3i d_ms_combs; - t_ace_3d d_ctildes; +// t_ace_3d d_ctildes; + t_ace_2d d_gen_cgs; + t_ace_3d d_coeffs; t_ace_3d3 f_ij; diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index ec185e75df..2c5e5fafe9 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -98,6 +98,8 @@ PairPACEExtrapolation::PairPACEExtrapolation(LAMMPS *lmp) : Pair(lmp) scale = nullptr; flag_compute_extrapolation_grade = 0; extrapolation_grade_gamma = nullptr; + + chunksize = 4096; } /* ---------------------------------------------------------------------- @@ -133,7 +135,7 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) double **x = atom->x; double **f = atom->f; - tagint *tag = atom->tag; +// tagint *tag = atom->tag; int *type = atom->type; // number of atoms in cell int nlocal = atom->nlocal; @@ -141,7 +143,7 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) int newton_pair = force->newton_pair; // number of atoms including ghost atoms - int nall = nlocal + atom->nghost; +// int nall = nlocal + atom->nghost; // inum: length of the neighborlists list inum = list->inum; @@ -283,7 +285,20 @@ void PairPACEExtrapolation::allocate() void PairPACEExtrapolation::settings(int narg, char **arg) { - if (narg > 0) error->all(FLERR, "Pair style pace/extrapolation supports no keywords"); +// if (narg > 2) error->all(FLERR, "Pair style pace/extrapolation supports no keywords"); + if (narg > 2) utils::missing_cmd_args(FLERR, "pair_style pace/extrapolation", error); + // ACE potentials are parameterized in metal units + if (strcmp("metal", update->unit_style) != 0) + error->all(FLERR, "ACE potentials require 'metal' units"); + + int iarg = 0; + while (iarg < narg) { + if (strcmp(arg[iarg], "chunksize") == 0) { + chunksize = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); + iarg += 2; + } else + error->all(FLERR, "Unknown pair_style pace keyword: {}", arg[iarg]); + } if (comm->me == 0) utils::logmesg(lmp, "ACE/AL version: {}.{}.{}\n", VERSION_YEAR, VERSION_MONTH, VERSION_DAY); @@ -343,7 +358,6 @@ void PairPACEExtrapolation::coeff(int narg, char **arg) aceimpl->rec_ace->element_type_mapping.init(atom->ntypes + 1); aceimpl->rec_ace->element_type_mapping.fill(-1); //-1 means atom not included into potential - FILE *species_type_file = nullptr; const int n = atom->ntypes; element_names.resize(n); diff --git a/src/ML-PACE/pair_pace_extrapolation.h b/src/ML-PACE/pair_pace_extrapolation.h index c5d9da23db..6f7eeb279e 100644 --- a/src/ML-PACE/pair_pace_extrapolation.h +++ b/src/ML-PACE/pair_pace_extrapolation.h @@ -49,13 +49,15 @@ class PairPACEExtrapolation : public Pair { struct ACEALImpl *aceimpl; int nmax; - void allocate(); + virtual void allocate(); std::vector element_names; // list of elements (used by dump pace/extrapolation) double *extrapolation_grade_gamma; //per-atom gamma value int flag_compute_extrapolation_grade; double **scale; + + int chunksize; }; } // namespace LAMMPS_NS From 014b892e3b13fd3e160d17fe5f7135052a810b49 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Mon, 2 Jan 2023 23:34:24 +0100 Subject: [PATCH 38/47] WIP: - add TagPairPACEComputeGamma kernel - add d_total_basis_size - add gamma_flag, d_ASI, projections and gamma --- src/KOKKOS/pair_pace_extrapolation_kokkos.cpp | 109 ++++++++++++++---- src/KOKKOS/pair_pace_extrapolation_kokkos.h | 12 +- 2 files changed, 100 insertions(+), 21 deletions(-) diff --git a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp index 006cf5e609..c5ca97d036 100644 --- a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp +++ b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp @@ -13,7 +13,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing author: Stan Moore (SNL) + Contributing author: Yury Lysogorskiy (ICAMS) ------------------------------------------------------------------------- */ #include "pair_pace_extrapolation_kokkos.h" @@ -29,9 +29,9 @@ #include "neighbor_kokkos.h" #include "neigh_request.h" -#include "ace-evaluator/ace_c_basis.h" -#include "ace-evaluator/ace_evaluator.h" -#include "ace-evaluator/ace_recursive.h" +//#include "ace-evaluator/ace_c_basis.h" +//#include "ace-evaluator/ace_evaluator.h" +//#include "ace-evaluator/ace_recursive.h" #include "ace-evaluator/ace_version.h" #include "ace-evaluator/ace_radial.h" @@ -42,21 +42,16 @@ namespace LAMMPS_NS { struct ACEALImpl { - ACEALImpl() : basis_set(nullptr), ace(nullptr), ctilde_basis_set(nullptr), rec_ace(nullptr) {} + ACEALImpl() : basis_set(nullptr), ace(nullptr) {} ~ACEALImpl() { delete basis_set; delete ace; - - delete ctilde_basis_set; - delete rec_ace; } ACEBBasisSet *basis_set; ACEBEvaluator *ace; - ACECTildeBasisSet *ctilde_basis_set; - ACERecursiveEvaluator *rec_ace; }; } // namespace LAMMPS_NS @@ -132,7 +127,12 @@ void PairPACEExtrapolationKokkos::grow(int natom, int maxneigh) // hard-core repulsion MemKK::realloc_kokkos(rho_core, "pace:rho_core", natom); MemKK::realloc_kokkos(dF_drho_core, "pace:dF_drho_core", natom); + MemKK::realloc_kokkos(dB_flatten, "pace:dB_flatten", natom, idx_ms_combs_max, basis_set->rankmax); + + //B-projections + MemKK::realloc_kokkos(projections, "pace:projections", natom, total_num_functions_max); // per-atom B-projections + MemKK::realloc_kokkos(gamma, "pace:gamma", natom); // per-atom gamma } if (((int)ylm.extent(0) < natom) || ((int)ylm.extent(1) < maxneigh)) { @@ -271,14 +271,17 @@ template void PairPACEExtrapolationKokkos::copy_tilde() { auto basis_set = aceimpl->basis_set; + auto b_evaluator = aceimpl->ace; // flatten loops, get per-element count and max idx_ms_combs_max = 0; - int total_basis_size_max = 0; + total_num_functions_max = 0; MemKK::realloc_kokkos(d_idx_ms_combs_count, "pace:idx_ms_combs_count", nelements); + MemKK::realloc_kokkos(d_total_basis_size, "pace:total_basis_size", nelements); auto h_idx_ms_combs_count = Kokkos::create_mirror_view(d_idx_ms_combs_count); + auto h_total_basis_size = Kokkos::create_mirror_view(d_total_basis_size); for (int mu = 0; mu < nelements; mu++) { int idx_ms_combs = 0; @@ -301,21 +304,25 @@ void PairPACEExtrapolationKokkos::copy_tilde() } h_idx_ms_combs_count(mu) = idx_ms_combs; idx_ms_combs_max = MAX(idx_ms_combs_max, idx_ms_combs); - total_basis_size_max = MAX(total_basis_size_max, total_basis_size_rank1 + total_basis_size); + total_num_functions_max = MAX(total_num_functions_max, total_basis_size_rank1 + total_basis_size); + h_total_basis_size(mu) = total_basis_size_rank1 + total_basis_size; } Kokkos::deep_copy(d_idx_ms_combs_count, h_idx_ms_combs_count); + Kokkos::deep_copy(d_total_basis_size, h_total_basis_size); - MemKK::realloc_kokkos(d_rank, "pace:rank", nelements, total_basis_size_max); - MemKK::realloc_kokkos(d_num_ms_combs, "pace:num_ms_combs", nelements, total_basis_size_max); + MemKK::realloc_kokkos(d_rank, "pace:rank", nelements, total_num_functions_max); + MemKK::realloc_kokkos(d_num_ms_combs, "pace:num_ms_combs", nelements, total_num_functions_max); MemKK::realloc_kokkos(d_func_inds, "pace:func_inds", nelements, idx_ms_combs_max); - MemKK::realloc_kokkos(d_mus, "pace:mus", nelements, total_basis_size_max, basis_set->rankmax); - MemKK::realloc_kokkos(d_ns, "pace:ns", nelements, total_basis_size_max, basis_set->rankmax); - MemKK::realloc_kokkos(d_ls, "pace:ls", nelements, total_basis_size_max, basis_set->rankmax); + MemKK::realloc_kokkos(d_mus, "pace:mus", nelements, total_num_functions_max, basis_set->rankmax); + MemKK::realloc_kokkos(d_ns, "pace:ns", nelements, total_num_functions_max, basis_set->rankmax); + MemKK::realloc_kokkos(d_ls, "pace:ls", nelements, total_num_functions_max, basis_set->rankmax); MemKK::realloc_kokkos(d_ms_combs, "pace:ms_combs", nelements, idx_ms_combs_max, basis_set->rankmax); - //MemKK::realloc_kokkos(d_ctildes, "pace:ctildes", nelements, idx_ms_combs_max, basis_set->ndensitymax); MemKK::realloc_kokkos(d_gen_cgs, "pace:gen_cgs", nelements, idx_ms_combs_max); - MemKK::realloc_kokkos(d_coeffs, "pace:coeffs", nelements, total_basis_size_max, basis_set->ndensitymax); + MemKK::realloc_kokkos(d_coeffs, "pace:coeffs", nelements, total_num_functions_max, basis_set->ndensitymax); + // active set inverted + MemKK::realloc_kokkos(d_ASI, "pace:ASI", nelements, total_num_functions_max, total_num_functions_max); + auto h_rank = Kokkos::create_mirror_view(d_rank); auto h_num_ms_combs = Kokkos::create_mirror_view(d_num_ms_combs); @@ -327,6 +334,8 @@ void PairPACEExtrapolationKokkos::copy_tilde() // auto h_ctildes = Kokkos::create_mirror_view(d_ctildes); auto h_gen_cgs = Kokkos::create_mirror_view(d_gen_cgs); auto h_coeffs = Kokkos::create_mirror_view(d_coeffs); +// asi + auto h_ASI = Kokkos::create_mirror_view(d_ASI); // copy values on host @@ -390,6 +399,14 @@ void PairPACEExtrapolationKokkos::copy_tilde() idx_ms_comb++; } } + + // ASI + const auto &A_as_inv = b_evaluator->A_active_set_inv.at(mu); + for(int i = 0; i < total_basis_size_rank1 + total_basis_size; i++) + for(int j = 0; j < total_basis_size_rank1 + total_basis_size; j++){ + h_ASI(mu,i,j)=A_as_inv(i,j); + } + } Kokkos::deep_copy(d_rank, h_rank); @@ -402,6 +419,7 @@ void PairPACEExtrapolationKokkos::copy_tilde() // Kokkos::deep_copy(d_ctildes, h_ctildes); Kokkos::deep_copy(d_gen_cgs, h_gen_cgs); Kokkos::deep_copy(d_coeffs, h_coeffs); + Kokkos::deep_copy(d_ASI, h_ASI); } /* ---------------------------------------------------------------------- @@ -591,6 +609,7 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in chunk_size = MIN(chunksize,inum); // "chunksize" variable is set by user chunk_offset = 0; + gamma_flag = 1; grow(chunk_size, maxneigh); @@ -604,6 +623,9 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in Kokkos::deep_copy(A_rank1, 0.0); Kokkos::deep_copy(rhos, 0.0); + Kokkos::deep_copy(projections, 0.0); + Kokkos::deep_copy(gamma, 0.0); + EV_FLOAT ev_tmp; if (chunk_size > inum - chunk_offset) @@ -665,6 +687,12 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in Kokkos::parallel_for("ComputeFS",policy_fs,*this); } + //ComputeGamma + if (gamma_flag) { + typename Kokkos::RangePolicy policy_gamma(0,chunk_size); + Kokkos::parallel_for("ComputeGamma",policy_gamma,*this); + } + //ComputeWeights { typename Kokkos::RangePolicy policy_weights(0, chunk_size * idx_ms_combs_max); @@ -952,6 +980,12 @@ void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeRho, //for rank=1 (r=0) only 1 ms-combination exists (ms_ind=0), so index of func.ctildes is 0..ndensity-1 Kokkos::atomic_add(&rhos(ii, p), d_coeffs(mu_i, func_ind, p) * d_gen_cgs(mu_i, idx_ms_comb) * A_cur); } + + + //gamma_i + if(gamma_flag) + Kokkos::atomic_add(&projections(ii, func_ind), d_gen_cgs(mu_i, idx_ms_comb) * A_cur); + } else { // rank > 1 // loop over {ms} combinations in sum @@ -987,6 +1021,9 @@ void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeRho, // real-part only multiplication Kokkos::atomic_add(&rhos(ii, p), B.real_part_product(d_coeffs(mu_i, func_ind, p) * d_gen_cgs(mu_i, idx_ms_comb))); } + //gamma_i + if(gamma_flag) + Kokkos::atomic_add(&projections(ii, func_ind), B.real_part_product(d_gen_cgs(mu_i, idx_ms_comb))); } } @@ -1024,6 +1061,35 @@ void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeFS, } } + +/* ---------------------------------------------------------------------- */ + + +template +KOKKOS_INLINE_FUNCTION +void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeGamma, const int& ii) const +{ + const int i = d_ilist[ii + chunk_offset]; + const int mu_i = d_map(type(i)); + const int basis_size = d_total_basis_size(mu_i); + + + double gamma_max = 0; + for (int j = 0; j gamma_max) + gamma_max = abs(current_gamma); + } + + // tally energy contribution + gamma(ii) = gamma_max; + +} /* ---------------------------------------------------------------------- */ template @@ -1714,13 +1780,16 @@ double PairPACEExtrapolationKokkos::memory_usage() bytes += MemKK::memory_usage(d_ns); bytes += MemKK::memory_usage(d_ls); bytes += MemKK::memory_usage(d_ms_combs); -// bytes += MemKK::memory_usage(d_ctildes); bytes += MemKK::memory_usage(d_gen_cgs); bytes += MemKK::memory_usage(d_coeffs); bytes += MemKK::memory_usage(alm); bytes += MemKK::memory_usage(blm); bytes += MemKK::memory_usage(cl); bytes += MemKK::memory_usage(dl); + bytes += MemKK::memory_usage(d_total_basis_size); + bytes += MemKK::memory_usage(d_ASI); + bytes += MemKK::memory_usage(projections); + bytes += MemKK::memory_usage(gamma); if (k_splines_gk.h_view.data()) { for (int i = 0; i < nelements; i++) { diff --git a/src/KOKKOS/pair_pace_extrapolation_kokkos.h b/src/KOKKOS/pair_pace_extrapolation_kokkos.h index 568d12b90c..a5b4f8abc7 100644 --- a/src/KOKKOS/pair_pace_extrapolation_kokkos.h +++ b/src/KOKKOS/pair_pace_extrapolation_kokkos.h @@ -40,6 +40,7 @@ class PairPACEExtrapolationKokkos : public PairPACEExtrapolation { struct TagPairPACEConjugateAi{}; struct TagPairPACEComputeRho{}; struct TagPairPACEComputeFS{}; + struct TagPairPACEComputeGamma{}; struct TagPairPACEComputeWeights{}; struct TagPairPACEComputeDerivative{}; @@ -80,6 +81,9 @@ class PairPACEExtrapolationKokkos : public PairPACEExtrapolation { KOKKOS_INLINE_FUNCTION void operator() (TagPairPACEComputeFS,const int& ii) const; + KOKKOS_INLINE_FUNCTION + void operator() (TagPairPACEComputeGamma, const int& ii) const; + KOKKOS_INLINE_FUNCTION void operator() (TagPairPACEComputeWeights,const int& iter) const; @@ -95,8 +99,9 @@ class PairPACEExtrapolationKokkos : public PairPACEExtrapolation { void operator() (TagPairPACEComputeForce,const int& ii, EV_FLOAT&) const; protected: - int inum, maxneigh, chunk_size, chunk_offset, idx_ms_combs_max; + int inum, maxneigh, chunk_size, chunk_offset, idx_ms_combs_max, total_num_functions_max; int host_flag; + int gamma_flag; int eflag, vflag; @@ -236,6 +241,10 @@ class PairPACEExtrapolationKokkos : public PairPACEExtrapolation { t_ace_3d d_values; t_ace_3d d_derivatives; + // inverted active set + t_ace_3d d_ASI; + t_ace_2d projections; + t_ace_1d gamma; // Spherical Harmonics void pre_compute_harmonics(int); @@ -275,6 +284,7 @@ class PairPACEExtrapolationKokkos : public PairPACEExtrapolation { // tilde t_ace_1i d_idx_ms_combs_count; + t_ace_1i d_total_basis_size; t_ace_2i d_rank; t_ace_2i d_num_ms_combs; t_ace_2i d_func_inds; From 1f36bc49ab234151b95525d3e7c502af845782a5 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Tue, 3 Jan 2023 14:08:31 +0100 Subject: [PATCH 39/47] - add extract and extract_peratom methods - rename device gamma array to d_gamma - make host h_gamma array - copy from h_gamma to host extrapolation_grade_gamma array for each chunk - transpose two last dimensions of d_ASI (small improvement of performance) - manage grows of extrapolation_grade_gamma --- src/KOKKOS/pair_pace_extrapolation_kokkos.cpp | 91 +++++++++++++++---- src/KOKKOS/pair_pace_extrapolation_kokkos.h | 14 ++- 2 files changed, 82 insertions(+), 23 deletions(-) diff --git a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp index c5ca97d036..cbaf92d800 100644 --- a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp +++ b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp @@ -29,9 +29,6 @@ #include "neighbor_kokkos.h" #include "neigh_request.h" -//#include "ace-evaluator/ace_c_basis.h" -//#include "ace-evaluator/ace_evaluator.h" -//#include "ace-evaluator/ace_recursive.h" #include "ace-evaluator/ace_version.h" #include "ace-evaluator/ace_radial.h" @@ -132,7 +129,7 @@ void PairPACEExtrapolationKokkos::grow(int natom, int maxneigh) //B-projections MemKK::realloc_kokkos(projections, "pace:projections", natom, total_num_functions_max); // per-atom B-projections - MemKK::realloc_kokkos(gamma, "pace:gamma", natom); // per-atom gamma + MemKK::realloc_kokkos(d_gamma, "pace:gamma", natom); // per-atom gamma } if (((int)ylm.extent(0) < natom) || ((int)ylm.extent(1) < maxneigh)) { @@ -321,7 +318,9 @@ void PairPACEExtrapolationKokkos::copy_tilde() MemKK::realloc_kokkos(d_gen_cgs, "pace:gen_cgs", nelements, idx_ms_combs_max); MemKK::realloc_kokkos(d_coeffs, "pace:coeffs", nelements, total_num_functions_max, basis_set->ndensitymax); // active set inverted - MemKK::realloc_kokkos(d_ASI, "pace:ASI", nelements, total_num_functions_max, total_num_functions_max); + t_ace_3d d_ASI_temp; + MemKK::realloc_kokkos(d_ASI_temp, "pace:ASI_temp", nelements, total_num_functions_max, total_num_functions_max); + auto h_rank = Kokkos::create_mirror_view(d_rank); @@ -331,11 +330,10 @@ void PairPACEExtrapolationKokkos::copy_tilde() auto h_ns = Kokkos::create_mirror_view(d_ns); auto h_ls = Kokkos::create_mirror_view(d_ls); auto h_ms_combs = Kokkos::create_mirror_view(d_ms_combs); -// auto h_ctildes = Kokkos::create_mirror_view(d_ctildes); auto h_gen_cgs = Kokkos::create_mirror_view(d_gen_cgs); auto h_coeffs = Kokkos::create_mirror_view(d_coeffs); // asi - auto h_ASI = Kokkos::create_mirror_view(d_ASI); + auto h_ASI = Kokkos::create_mirror_view(d_ASI_temp); // copy values on host @@ -404,7 +402,7 @@ void PairPACEExtrapolationKokkos::copy_tilde() const auto &A_as_inv = b_evaluator->A_active_set_inv.at(mu); for(int i = 0; i < total_basis_size_rank1 + total_basis_size; i++) for(int j = 0; j < total_basis_size_rank1 + total_basis_size; j++){ - h_ASI(mu,i,j)=A_as_inv(i,j); + h_ASI(mu,i,j)=A_as_inv(j,i); // transpose back for better performance on GPU } } @@ -416,10 +414,10 @@ void PairPACEExtrapolationKokkos::copy_tilde() Kokkos::deep_copy(d_ns, h_ns); Kokkos::deep_copy(d_ls, h_ls); Kokkos::deep_copy(d_ms_combs, h_ms_combs); -// Kokkos::deep_copy(d_ctildes, h_ctildes); Kokkos::deep_copy(d_gen_cgs, h_gen_cgs); Kokkos::deep_copy(d_coeffs, h_coeffs); - Kokkos::deep_copy(d_ASI, h_ASI); + Kokkos::deep_copy(d_ASI_temp, h_ASI); + d_ASI = d_ASI_temp; // copy from temopary array to const array } /* ---------------------------------------------------------------------- @@ -573,6 +571,15 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in memoryKK->create_kokkos(k_vatom,vatom,maxvatom,"pair:vatom"); d_vatom = k_vatom.view(); } + + if (gamma_flag && atom->nlocal > nmax) { + memory->destroy(extrapolation_grade_gamma); + nmax = atom->nlocal; + memory->create(extrapolation_grade_gamma, nmax, "pace/atom:gamma"); + //zeroify array + memset(extrapolation_grade_gamma, 0, nmax * sizeof(*extrapolation_grade_gamma)); + } + copymode = 1; if (!force->newton_pair) error->all(FLERR,"PairPACEExtrapolationKokkos requires 'newton on'"); @@ -609,7 +616,7 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in chunk_size = MIN(chunksize,inum); // "chunksize" variable is set by user chunk_offset = 0; - gamma_flag = 1; + grow(chunk_size, maxneigh); @@ -624,7 +631,7 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in Kokkos::deep_copy(rhos, 0.0); Kokkos::deep_copy(projections, 0.0); - Kokkos::deep_copy(gamma, 0.0); + Kokkos::deep_copy(d_gamma, 0.0); EV_FLOAT ev_tmp; @@ -729,8 +736,15 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in } } ev += ev_tmp; - chunk_offset += chunk_size; + //if gamma_flag - copy current d_gamma to extrapolation_grade_gamma + if(gamma_flag){ + h_gamma = Kokkos::create_mirror_view(d_gamma); + Kokkos:deep_copy(h_gamma, d_gamma); + memcpy(extrapolation_grade_gamma+chunk_offset, (void *) h_gamma.data(), sizeof(double)*chunk_size); + } + + chunk_offset += chunk_size; } // end while if (need_dup) @@ -1075,19 +1089,21 @@ void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeGamm double gamma_max = 0; - for (int j = 0; j gamma_max) - gamma_max = abs(current_gamma); + current_gamma = fabs(current_gamma); + if (current_gamma > gamma_max) + gamma_max = current_gamma; } // tally energy contribution - gamma(ii) = gamma_max; + d_gamma(ii) = gamma_max; } /* ---------------------------------------------------------------------- */ @@ -1789,7 +1805,7 @@ double PairPACEExtrapolationKokkos::memory_usage() bytes += MemKK::memory_usage(d_total_basis_size); bytes += MemKK::memory_usage(d_ASI); bytes += MemKK::memory_usage(projections); - bytes += MemKK::memory_usage(gamma); + bytes += MemKK::memory_usage(d_gamma); if (k_splines_gk.h_view.data()) { for (int i = 0; i < nelements; i++) { @@ -1812,3 +1828,38 @@ template class PairPACEExtrapolationKokkos; template class PairPACEExtrapolationKokkos; #endif } + +/* ---------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + extract method for extracting value of scale variable + ---------------------------------------------------------------------- */ +template +void *PairPACEExtrapolationKokkos::extract(const char *str, int &dim) +{ + //check if str=="gamma_flag" then compute extrapolation grades on this iteration + dim = 0; + if (strcmp(str, "gamma_flag") == 0) return (void *) &gamma_flag; + + dim = 2; + if (strcmp(str, "scale") == 0) return (void *) scale; + return nullptr; +} + +/* ---------------------------------------------------------------------- + peratom requests from FixPair + return ptr to requested data + also return ncol = # of quantites per atom + 0 = per-atom vector + 1 or more = # of columns in per-atom array + return NULL if str is not recognized +---------------------------------------------------------------------- */ +template +void *PairPACEExtrapolationKokkos::extract_peratom(const char *str, int &ncol) +{ + if (strcmp(str, "gamma") == 0) { + ncol = 0; + return (void *) extrapolation_grade_gamma; + } + + return nullptr; +} \ No newline at end of file diff --git a/src/KOKKOS/pair_pace_extrapolation_kokkos.h b/src/KOKKOS/pair_pace_extrapolation_kokkos.h index a5b4f8abc7..6983fcc338 100644 --- a/src/KOKKOS/pair_pace_extrapolation_kokkos.h +++ b/src/KOKKOS/pair_pace_extrapolation_kokkos.h @@ -98,6 +98,10 @@ class PairPACEExtrapolationKokkos : public PairPACEExtrapolation { KOKKOS_INLINE_FUNCTION void operator() (TagPairPACEComputeForce,const int& ii, EV_FLOAT&) const; + + void *extract(const char *str, int &dim); + void *extract_peratom(const char *str, int &ncol); + protected: int inum, maxneigh, chunk_size, chunk_offset, idx_ms_combs_max, total_num_functions_max; int host_flag; @@ -203,6 +207,7 @@ class PairPACEExtrapolationKokkos : public PairPACEExtrapolation { typedef Kokkos::View t_ace_2d; typedef Kokkos::View t_ace_2d3; typedef Kokkos::View t_ace_3d; + typedef Kokkos::View tc_ace_3d; typedef Kokkos::View t_ace_3d3; typedef Kokkos::View t_ace_3d4; typedef Kokkos::View t_ace_4d; @@ -213,6 +218,8 @@ class PairPACEExtrapolationKokkos : public PairPACEExtrapolation { typedef Kokkos::View t_ace_4c; typedef Kokkos::View t_ace_4c3; + typedef Kokkos::View::HostMirror th_ace_1d; + t_ace_3d A_rank1; t_ace_4c A; @@ -242,11 +249,12 @@ class PairPACEExtrapolationKokkos : public PairPACEExtrapolation { t_ace_3d d_derivatives; // inverted active set - t_ace_3d d_ASI; + tc_ace_3d d_ASI; t_ace_2d projections; - t_ace_1d gamma; - // Spherical Harmonics + t_ace_1d d_gamma; + th_ace_1d h_gamma; + // Spherical Harmonics void pre_compute_harmonics(int); KOKKOS_INLINE_FUNCTION From e033cebcdd8274299969f1e4e172c232db9ce7b8 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Tue, 3 Jan 2023 14:30:04 +0100 Subject: [PATCH 40/47] update lammps-user-pace version and checksum --- cmake/Modules/Packages/ML-PACE.cmake | 4 ++-- lib/pace/Install.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/Modules/Packages/ML-PACE.cmake b/cmake/Modules/Packages/ML-PACE.cmake index 0159f36c34..b64584e5a7 100644 --- a/cmake/Modules/Packages/ML-PACE.cmake +++ b/cmake/Modules/Packages/ML-PACE.cmake @@ -1,6 +1,6 @@ -set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2022.10.15.tar.gz" CACHE STRING "URL for PACE evaluator library sources") +set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2023.01.3.tar.gz" CACHE STRING "URL for PACE evaluator library sources") -set(PACELIB_MD5 "848ad6a6cc79fa82745927001fb1c9b5" CACHE STRING "MD5 checksum of PACE evaluator library tarball") +set(PACELIB_MD5 "f418d32b60e531063ac4285bf702b468" CACHE STRING "MD5 checksum of PACE evaluator library tarball") mark_as_advanced(PACELIB_URL) mark_as_advanced(PACELIB_MD5) diff --git a/lib/pace/Install.py b/lib/pace/Install.py index 9f132a9580..f7f50d4f6d 100644 --- a/lib/pace/Install.py +++ b/lib/pace/Install.py @@ -18,11 +18,11 @@ from install_helpers import fullpath, geturl, checkmd5sum # settings thisdir = fullpath('.') -version ='v.2022.10.15' +version ='v.2023.01.3' # known checksums for different PACE versions. used to validate the download. checksums = { \ - 'v.2022.10.15': '848ad6a6cc79fa82745927001fb1c9b5' + 'v.2023.01.3': 'f418d32b60e531063ac4285bf702b468' } parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wrapper script") From 4d50109731a83f8c1a69ba81f0173f72f26a1364 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Tue, 3 Jan 2023 14:43:46 +0100 Subject: [PATCH 41/47] add check that LINEAR ASI must be used --- src/KOKKOS/pair_pace_extrapolation_kokkos.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp index cbaf92d800..ba5ecafeac 100644 --- a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp +++ b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp @@ -429,7 +429,7 @@ void PairPACEExtrapolationKokkos::init_style() { if (host_flag) { if (lmp->kokkos->nthreads > 1) - error->all(FLERR,"Pair style pace/kk can currently only run on a single " + error->all(FLERR,"Pair style pace/extrapolation/kk can currently only run on a single " "CPU thread"); PairPACEExtrapolation::init_style(); @@ -497,6 +497,10 @@ void PairPACEExtrapolationKokkos::coeff(int narg, char **arg) { PairPACEExtrapolation::coeff(narg,arg); + auto b_evaluator = aceimpl->ace; + if (!b_evaluator->get_is_linear_extrapolation_grade()) { + error->all(FLERR,"Must use LINEAR ASI with pair pace/extrapolation/kk"); + } // Set up element lists auto h_map = Kokkos::create_mirror_view(d_map); From cfbc2d88944ffa03852e81f5176d11cde7622088 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Tue, 3 Jan 2023 14:48:25 +0100 Subject: [PATCH 42/47] update pair_pace.rst --- doc/src/pair_pace.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/src/pair_pace.rst b/doc/src/pair_pace.rst index 697a9965b6..01f7df63f6 100644 --- a/doc/src/pair_pace.rst +++ b/doc/src/pair_pace.rst @@ -1,6 +1,7 @@ .. index:: pair_style pace .. index:: pair_style pace/kk .. index:: pair_style pace/extrapolation +.. index:: pair_style pace/extrapolation/kk pair_style pace command ======================= @@ -127,6 +128,9 @@ but not more often than every 20 steps. On all other steps `pair_style pace recursive` will be used. +When using the pair style *pace/extrapolation* with the KOKKOS package on GPUs +product B-basis evaluator is always used and only *linear* ASI is supported. + ---------- See the :doc:`pair_coeff ` page for alternate ways @@ -186,4 +190,4 @@ recursive, chunksize = 4096, .. _Lysogorskiy2022: -**(Lysogorskiy2022)** Lysogorskiy, Bochkarev, Mrovec, Drautz, TBS (2022). +**(Lysogorskiy2022)** Lysogorskiy, Bochkarev, Mrovec, Drautz, arXiv:2212.08716 (2022). From 295d8a69035497ea0b575b6764c349cd82a9af5c Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Tue, 3 Jan 2023 15:58:34 +0100 Subject: [PATCH 43/47] fix_pair.cpp: respect lmp->suffix when looking for pair_style name match --- src/fix_pair.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 5e5ccbf810..bd389f6632 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -36,6 +36,10 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : if (nevery < 1) error->all(FLERR,"Illegal fix pair every value: {}", nevery); pairname = utils::strdup(arg[4]); + if(lmp->suffix) { + strcat(pairname,"/"); + strcat(pairname,lmp->suffix); + } pstyle = force->pair_match(pairname,1,0); if (pstyle == nullptr) error->all(FLERR,"Pair style {} for fix pair not found", pairname); From a3572b61d84d17c5efec076663c8607aa1325c13 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 3 Jan 2023 10:09:47 -0700 Subject: [PATCH 44/47] Small cleanup --- src/KOKKOS/Install.sh | 2 + src/KOKKOS/pair_pace_extrapolation_kokkos.cpp | 129 +++++++++--------- src/ML-PACE/pair_pace_extrapolation.cpp | 4 - 3 files changed, 64 insertions(+), 71 deletions(-) diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index a5bf6437fc..77a9932d90 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -320,6 +320,8 @@ action pair_multi_lucy_rx_kokkos.cpp pair_multi_lucy_rx.cpp action pair_multi_lucy_rx_kokkos.h pair_multi_lucy_rx.h action pair_pace_kokkos.cpp pair_pace.cpp action pair_pace_kokkos.h pair_pace.h +action pair_pace_extrapolation_kokkos.cpp pair_pace_extrapolation.cpp +action pair_pace_extrapolation_kokkos.h pair_pace_extrapolation.h action pair_reaxff_kokkos.cpp pair_reaxff.cpp action pair_reaxff_kokkos.h pair_reaxff.h action pair_snap_kokkos.cpp pair_snap.cpp diff --git a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp index ba5ecafeac..6369c7fba5 100644 --- a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp +++ b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp @@ -38,19 +38,18 @@ #include namespace LAMMPS_NS { - struct ACEALImpl { - ACEALImpl() : basis_set(nullptr), ace(nullptr) {} + struct ACEALImpl { + ACEALImpl() : basis_set(nullptr), ace(nullptr) {} - ~ACEALImpl() - { - delete basis_set; - delete ace; - } + ~ACEALImpl() { + delete basis_set; + delete ace; + } - ACEBBasisSet *basis_set; - ACEBEvaluator *ace; - }; -} // namespace LAMMPS_NS + ACEBBasisSet *basis_set; + ACEBEvaluator *ace; + }; +} // namespace LAMMPS_NS using namespace LAMMPS_NS; using namespace MathConst; @@ -187,7 +186,7 @@ void PairPACEExtrapolationKokkos::copy_pertype() h_rho_core_cutoff[n] = basis_set->map_embedding_specifications.at(n).rho_core_cutoff; h_drho_core_cutoff[n] = basis_set->map_embedding_specifications.at(n).drho_core_cutoff; - h_E0vals(n)= basis_set->E0vals(n); + h_E0vals(n) = basis_set->E0vals(n); h_ndensity(n) = basis_set->map_embedding_specifications.at(n).ndensity; @@ -321,8 +320,6 @@ void PairPACEExtrapolationKokkos::copy_tilde() t_ace_3d d_ASI_temp; MemKK::realloc_kokkos(d_ASI_temp, "pace:ASI_temp", nelements, total_num_functions_max, total_num_functions_max); - - auto h_rank = Kokkos::create_mirror_view(d_rank); auto h_num_ms_combs = Kokkos::create_mirror_view(d_num_ms_combs); auto h_func_inds = Kokkos::create_mirror_view(d_func_inds); @@ -332,7 +329,7 @@ void PairPACEExtrapolationKokkos::copy_tilde() auto h_ms_combs = Kokkos::create_mirror_view(d_ms_combs); auto h_gen_cgs = Kokkos::create_mirror_view(d_gen_cgs); auto h_coeffs = Kokkos::create_mirror_view(d_coeffs); -// asi + // asi auto h_ASI = Kokkos::create_mirror_view(d_ASI_temp); // copy values on host @@ -380,7 +377,7 @@ void PairPACEExtrapolationKokkos::copy_tilde() } for (int p = 0; p < ndensity; ++p) - h_coeffs(mu, func_ind_through, p) = func->coeff[p]; + h_coeffs(mu, func_ind_through, p) = func->coeff[p]; // loop over {ms} combinations in sum @@ -400,11 +397,10 @@ void PairPACEExtrapolationKokkos::copy_tilde() // ASI const auto &A_as_inv = b_evaluator->A_active_set_inv.at(mu); - for(int i = 0; i < total_basis_size_rank1 + total_basis_size; i++) - for(int j = 0; j < total_basis_size_rank1 + total_basis_size; j++){ - h_ASI(mu,i,j)=A_as_inv(j,i); // transpose back for better performance on GPU + for (int i = 0; i < total_basis_size_rank1 + total_basis_size; i++) + for (int j = 0; j < total_basis_size_rank1 + total_basis_size; j++){ + h_ASI(mu,i,j) = A_as_inv(j,i); // transpose back for better performance on GPU } - } Kokkos::deep_copy(d_rank, h_rank); @@ -565,6 +561,7 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in ev_init(eflag,vflag,0); // reallocate per-atom arrays if necessary + if (eflag_atom) { memoryKK->destroy_kokkos(k_eatom,eatom); memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); @@ -742,7 +739,7 @@ void PairPACEExtrapolationKokkos::compute(int eflag_in, int vflag_in ev += ev_tmp; //if gamma_flag - copy current d_gamma to extrapolation_grade_gamma - if(gamma_flag){ + if (gamma_flag){ h_gamma = Kokkos::create_mirror_view(d_gamma); Kokkos:deep_copy(h_gamma, d_gamma); memcpy(extrapolation_grade_gamma+chunk_offset, (void *) h_gamma.data(), sizeof(double)*chunk_size); @@ -1001,7 +998,7 @@ void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeRho, //gamma_i - if(gamma_flag) + if (gamma_flag) Kokkos::atomic_add(&projections(ii, func_ind), d_gen_cgs(mu_i, idx_ms_comb) * A_cur); } else { // rank > 1 @@ -1040,14 +1037,13 @@ void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeRho, Kokkos::atomic_add(&rhos(ii, p), B.real_part_product(d_coeffs(mu_i, func_ind, p) * d_gen_cgs(mu_i, idx_ms_comb))); } //gamma_i - if(gamma_flag) - Kokkos::atomic_add(&projections(ii, func_ind), B.real_part_product(d_gen_cgs(mu_i, idx_ms_comb))); + if (gamma_flag) + Kokkos::atomic_add(&projections(ii, func_ind), B.real_part_product(d_gen_cgs(mu_i, idx_ms_comb))); } } /* ---------------------------------------------------------------------- */ - template KOKKOS_INLINE_FUNCTION void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeFS, const int& ii) const @@ -1079,37 +1075,34 @@ void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeFS, } } - /* ---------------------------------------------------------------------- */ - template KOKKOS_INLINE_FUNCTION void PairPACEExtrapolationKokkos::operator() (TagPairPACEComputeGamma, const int& ii) const { - const int i = d_ilist[ii + chunk_offset]; - const int mu_i = d_map(type(i)); - const int basis_size = d_total_basis_size(mu_i); + const int i = d_ilist[ii + chunk_offset]; + const int mu_i = d_map(type(i)); + const int basis_size = d_total_basis_size(mu_i); + double gamma_max = 0; + double current_gamma; + for (int j = 0; j gamma_max) - gamma_max = current_gamma; - } - - // tally energy contribution - d_gamma(ii) = gamma_max; + current_gamma = fabs(current_gamma); + if (current_gamma > gamma_max) + gamma_max = current_gamma; + } + // tally energy contribution + d_gamma(ii) = gamma_max; } + /* ---------------------------------------------------------------------- */ template @@ -1824,29 +1817,20 @@ double PairPACEExtrapolationKokkos::memory_usage() return bytes; } -/* ---------------------------------------------------------------------- */ - -namespace LAMMPS_NS { -template class PairPACEExtrapolationKokkos; -#ifdef LMP_KOKKOS_GPU -template class PairPACEExtrapolationKokkos; -#endif -} - -/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- extract method for extracting value of scale variable ---------------------------------------------------------------------- */ + template void *PairPACEExtrapolationKokkos::extract(const char *str, int &dim) { - //check if str=="gamma_flag" then compute extrapolation grades on this iteration - dim = 0; - if (strcmp(str, "gamma_flag") == 0) return (void *) &gamma_flag; + //check if str=="gamma_flag" then compute extrapolation grades on this iteration + dim = 0; + if (strcmp(str, "gamma_flag") == 0) return (void *) &gamma_flag; - dim = 2; - if (strcmp(str, "scale") == 0) return (void *) scale; - return nullptr; + dim = 2; + if (strcmp(str, "scale") == 0) return (void *) scale; + return nullptr; } /* ---------------------------------------------------------------------- @@ -1857,13 +1841,24 @@ void *PairPACEExtrapolationKokkos::extract(const char *str, int &dim 1 or more = # of columns in per-atom array return NULL if str is not recognized ---------------------------------------------------------------------- */ + template void *PairPACEExtrapolationKokkos::extract_peratom(const char *str, int &ncol) { - if (strcmp(str, "gamma") == 0) { - ncol = 0; - return (void *) extrapolation_grade_gamma; - } + if (strcmp(str, "gamma") == 0) { + ncol = 0; + return (void *) extrapolation_grade_gamma; + } + + return nullptr; +} + +/* ---------------------------------------------------------------------- */ + +namespace LAMMPS_NS { +template class PairPACEExtrapolationKokkos; +#ifdef LMP_KOKKOS_GPU +template class PairPACEExtrapolationKokkos; +#endif +} - return nullptr; -} \ No newline at end of file diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 2c5e5fafe9..8a0116526a 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -135,16 +135,12 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) double **x = atom->x; double **f = atom->f; -// tagint *tag = atom->tag; int *type = atom->type; // number of atoms in cell int nlocal = atom->nlocal; int newton_pair = force->newton_pair; - // number of atoms including ghost atoms -// int nall = nlocal + atom->nghost; - // inum: length of the neighborlists list inum = list->inum; From bcb5285ef9fca4211295d45bd900448b4064ec01 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 3 Jan 2023 14:15:12 -0500 Subject: [PATCH 45/47] update / correct suffix handling in fix pair --- doc/src/fix_pair.rst | 9 +++++++-- src/fix_pair.cpp | 17 +++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/doc/src/fix_pair.rst b/doc/src/fix_pair.rst index abb44718cd..44c91f18ee 100644 --- a/doc/src/fix_pair.rst +++ b/doc/src/fix_pair.rst @@ -1,7 +1,7 @@ .. index:: fix pair fix pair command -======================= +================ Syntax """""" @@ -47,7 +47,12 @@ These are example use cases: The *N* argument determines how often the fix is invoked. The *pstyle* argument is the name of the pair style. It can be a -sub-style used in a :doc:`pair_style hybrid ` command. +sub-style used in a :doc:`pair_style hybrid ` command. If +there are multiple sub-styles using the same pair style, then *pstyle* +should be specified as "style:N", where *N* is the number of the +instance of the pair style you wish monitor (e.g., the first or second). +For example, *pstyle* could be specified as "pace/extrapolation" or +"amoeba" or "eam:1" or "eam:2". One or more *name/flag* pairs of arguments follow. Each *name* is a per-atom quantity which the pair style must recognize as an extraction diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index bd389f6632..db7b24dfea 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -36,11 +36,20 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : if (nevery < 1) error->all(FLERR,"Illegal fix pair every value: {}", nevery); pairname = utils::strdup(arg[4]); - if(lmp->suffix) { - strcat(pairname,"/"); - strcat(pairname,lmp->suffix); + char *cptr; + int nsub = 0; + if ((cptr = strchr(pairname,':'))) { + *cptr = '\0'; + nsub = utils::inumeric(FLERR,cptr+1,false,lmp); } - pstyle = force->pair_match(pairname,1,0); + + if (lmp->suffix_enable) { + if (lmp->suffix) + pstyle = force->pair_match(fmt::format("{}/{}",pairname,lmp->suffix),1,nsub); + if ((pstyle == nullptr) && lmp->suffix2) + pstyle = force->pair_match(fmt::format("{}/{}",pairname,lmp->suffix2),1,nsub); + } + if (pstyle == nullptr) pstyle = force->pair_match(pairname,1,nsub); if (pstyle == nullptr) error->all(FLERR,"Pair style {} for fix pair not found", pairname); nfield = (narg-5) / 2; From 87a8cfe299f3e194bc6b24d19660a0ed69cb9ca8 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Wed, 4 Jan 2023 12:46:50 +0100 Subject: [PATCH 46/47] - replace #include "ace-evaluator/ace_radial.h" in pair_pace_kokkos.h and pair_pace_extrapolation_kokkos.h with forward declaration "class SplineInterpolator;" - move SplineInterpolatorKokkos::operator=(const SplineInterpolator &spline) to .cpp files --- src/KOKKOS/pair_pace_extrapolation_kokkos.cpp | 18 ++++++++++++++++ src/KOKKOS/pair_pace_extrapolation_kokkos.h | 21 +++---------------- src/KOKKOS/pair_pace_kokkos.cpp | 18 ++++++++++++++++ src/KOKKOS/pair_pace_kokkos.h | 21 +++---------------- 4 files changed, 42 insertions(+), 36 deletions(-) diff --git a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp index 6369c7fba5..e6ae694cad 100644 --- a/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp +++ b/src/KOKKOS/pair_pace_extrapolation_kokkos.cpp @@ -1672,7 +1672,25 @@ void PairPACEExtrapolationKokkos::evaluate_splines(const int ii, con } /* ---------------------------------------------------------------------- */ +template +void PairPACEExtrapolationKokkos::SplineInterpolatorKokkos::operator=(const SplineInterpolator &spline) { + cutoff = spline.cutoff; + deltaSplineBins = spline.deltaSplineBins; + ntot = spline.ntot; + nlut = spline.nlut; + invrscalelookup = spline.invrscalelookup; + rscalelookup = spline.rscalelookup; + num_of_functions = spline.num_of_functions; + lookupTable = t_ace_3d4("lookupTable", ntot+1, num_of_functions); + auto h_lookupTable = Kokkos::create_mirror_view(lookupTable); + for (int i = 0; i < ntot+1; i++) + for (int j = 0; j < num_of_functions; j++) + for (int k = 0; k < 4; k++) + h_lookupTable(i, j, k) = spline.lookupTable(i, j, k); + Kokkos::deep_copy(lookupTable, h_lookupTable); +} +/* ---------------------------------------------------------------------- */ template KOKKOS_INLINE_FUNCTION void PairPACEExtrapolationKokkos::SplineInterpolatorKokkos::calcSplines(const int ii, const int jj, const double r, const t_ace_3d &d_values, const t_ace_3d &d_derivatives) const diff --git a/src/KOKKOS/pair_pace_extrapolation_kokkos.h b/src/KOKKOS/pair_pace_extrapolation_kokkos.h index 6983fcc338..a65841f8f6 100644 --- a/src/KOKKOS/pair_pace_extrapolation_kokkos.h +++ b/src/KOKKOS/pair_pace_extrapolation_kokkos.h @@ -24,10 +24,11 @@ PairStyle(pace/extrapolation/kk/host,PairPACEExtrapolationKokkos); #define LMP_PAIR_PACE_EXTRAPOLATION_KOKKOS_H #include "pair_pace_extrapolation.h" -#include "ace-evaluator/ace_radial.h" #include "kokkos_type.h" #include "pair_kokkos.h" +class SplineInterpolator; + namespace LAMMPS_NS { template @@ -313,23 +314,7 @@ class PairPACEExtrapolationKokkos : public PairPACEExtrapolation { t_ace_3d4 lookupTable; - void operator=(const SplineInterpolator &spline) { - cutoff = spline.cutoff; - deltaSplineBins = spline.deltaSplineBins; - ntot = spline.ntot; - nlut = spline.nlut; - invrscalelookup = spline.invrscalelookup; - rscalelookup = spline.rscalelookup; - num_of_functions = spline.num_of_functions; - - lookupTable = t_ace_3d4("lookupTable", ntot+1, num_of_functions); - auto h_lookupTable = Kokkos::create_mirror_view(lookupTable); - for (int i = 0; i < ntot+1; i++) - for (int j = 0; j < num_of_functions; j++) - for (int k = 0; k < 4; k++) - h_lookupTable(i, j, k) = spline.lookupTable(i, j, k); - Kokkos::deep_copy(lookupTable, h_lookupTable); - } + void operator=(const SplineInterpolator &spline); void deallocate() { lookupTable = t_ace_3d4(); diff --git a/src/KOKKOS/pair_pace_kokkos.cpp b/src/KOKKOS/pair_pace_kokkos.cpp index dd5b97fe32..6f1e3feaf8 100644 --- a/src/KOKKOS/pair_pace_kokkos.cpp +++ b/src/KOKKOS/pair_pace_kokkos.cpp @@ -1574,7 +1574,25 @@ void PairPACEKokkos::evaluate_splines(const int ii, const int jj, do } /* ---------------------------------------------------------------------- */ +template +void PairPACEKokkos::SplineInterpolatorKokkos::operator=(const SplineInterpolator &spline) { + cutoff = spline.cutoff; + deltaSplineBins = spline.deltaSplineBins; + ntot = spline.ntot; + nlut = spline.nlut; + invrscalelookup = spline.invrscalelookup; + rscalelookup = spline.rscalelookup; + num_of_functions = spline.num_of_functions; + lookupTable = t_ace_3d4("lookupTable", ntot+1, num_of_functions); + auto h_lookupTable = Kokkos::create_mirror_view(lookupTable); + for (int i = 0; i < ntot+1; i++) + for (int j = 0; j < num_of_functions; j++) + for (int k = 0; k < 4; k++) + h_lookupTable(i, j, k) = spline.lookupTable(i, j, k); + Kokkos::deep_copy(lookupTable, h_lookupTable); +} +/* ---------------------------------------------------------------------- */ template KOKKOS_INLINE_FUNCTION void PairPACEKokkos::SplineInterpolatorKokkos::calcSplines(const int ii, const int jj, const double r, const t_ace_3d &d_values, const t_ace_3d &d_derivatives) const diff --git a/src/KOKKOS/pair_pace_kokkos.h b/src/KOKKOS/pair_pace_kokkos.h index cc2a3cb674..39cfd100f8 100644 --- a/src/KOKKOS/pair_pace_kokkos.h +++ b/src/KOKKOS/pair_pace_kokkos.h @@ -24,10 +24,11 @@ PairStyle(pace/kk/host,PairPACEKokkos); #define LMP_PAIR_PACE_KOKKOS_H #include "pair_pace.h" -#include "ace-evaluator/ace_radial.h" #include "kokkos_type.h" #include "pair_kokkos.h" +class SplineInterpolator; + namespace LAMMPS_NS { template @@ -293,23 +294,7 @@ class PairPACEKokkos : public PairPACE { t_ace_3d4 lookupTable; - void operator=(const SplineInterpolator &spline) { - cutoff = spline.cutoff; - deltaSplineBins = spline.deltaSplineBins; - ntot = spline.ntot; - nlut = spline.nlut; - invrscalelookup = spline.invrscalelookup; - rscalelookup = spline.rscalelookup; - num_of_functions = spline.num_of_functions; - - lookupTable = t_ace_3d4("lookupTable", ntot+1, num_of_functions); - auto h_lookupTable = Kokkos::create_mirror_view(lookupTable); - for (int i = 0; i < ntot+1; i++) - for (int j = 0; j < num_of_functions; j++) - for (int k = 0; k < 4; k++) - h_lookupTable(i, j, k) = spline.lookupTable(i, j, k); - Kokkos::deep_copy(lookupTable, h_lookupTable); - } + void operator=(const SplineInterpolator &spline); void deallocate() { lookupTable = t_ace_3d4(); From 20b6355888d3b005601b62439270cd749dae24e9 Mon Sep 17 00:00:00 2001 From: Yury Lysogorskiy Date: Wed, 4 Jan 2023 15:00:03 +0100 Subject: [PATCH 47/47] refactor fix_pair.h/cpp: extract method "query_pstyle" and call it also in void FixPair::init() --- src/fix_pair.cpp | 40 +++++++++++++++++++++++++--------------- src/fix_pair.h | 2 ++ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index db7b24dfea..59f9dbda4a 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -21,6 +21,7 @@ #include "memory.h" #include "pair.h" #include "update.h" +#include "fmt/format.h" using namespace LAMMPS_NS; using namespace FixConst; @@ -36,20 +37,7 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : if (nevery < 1) error->all(FLERR,"Illegal fix pair every value: {}", nevery); pairname = utils::strdup(arg[4]); - char *cptr; - int nsub = 0; - if ((cptr = strchr(pairname,':'))) { - *cptr = '\0'; - nsub = utils::inumeric(FLERR,cptr+1,false,lmp); - } - - if (lmp->suffix_enable) { - if (lmp->suffix) - pstyle = force->pair_match(fmt::format("{}/{}",pairname,lmp->suffix),1,nsub); - if ((pstyle == nullptr) && lmp->suffix2) - pstyle = force->pair_match(fmt::format("{}/{}",pairname,lmp->suffix2),1,nsub); - } - if (pstyle == nullptr) pstyle = force->pair_match(pairname,1,nsub); + query_pstyle(lmp); if (pstyle == nullptr) error->all(FLERR,"Pair style {} for fix pair not found", pairname); nfield = (narg-5) / 2; @@ -143,6 +131,28 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : lasttime = -1; } +/* ---------------------------------------------------------------------- */ + +void FixPair::query_pstyle(LAMMPS *lmp) { + char *cptr=nullptr; + int nsub = 0; + if ((cptr = strchr(pairname, ':'))) { + *cptr = '\0'; + nsub = utils::inumeric(FLERR,cptr+1,false,lmp); + } + pstyle = nullptr; + if (lmp->suffix_enable) { + if (lmp->suffix) { + pstyle = force->pair_match(fmt::format("{}/{}", pairname, lmp->suffix), 1, nsub); + if (pstyle == nullptr && (lmp->suffix2)) { + pstyle = force->pair_match(fmt::format("{}/{}", pairname, lmp->suffix2), 1, nsub); + } + } + } + if (pstyle == nullptr) pstyle = force->pair_match(pairname, 1, nsub); +} + + /* ---------------------------------------------------------------------- */ FixPair::~FixPair() @@ -184,7 +194,7 @@ void FixPair::init() { // insure pair style still exists - pstyle = force->pair_match(pairname,1,0); + query_pstyle(lmp); if (pstyle == nullptr) error->all(FLERR,"Pair style {} for fix pair not found", pairname); } diff --git a/src/fix_pair.h b/src/fix_pair.h index 765b261ee5..57fbdf8ecb 100644 --- a/src/fix_pair.h +++ b/src/fix_pair.h @@ -56,6 +56,8 @@ class FixPair : public Fix { class Pair *pstyle; double *vector; double **array; + + void query_pstyle(LAMMPS *lmp); }; } // namespace LAMMPS_NS